diff --git a/src/state/pages/actions.js b/src/state/pages/actions.js index 7175c0d01..08d840aec 100644 --- a/src/state/pages/actions.js +++ b/src/state/pages/actions.js @@ -212,6 +212,13 @@ export const sendDeletePage = (page, successRedirect = true) => async (dispatch) const response = await deletePage(page); const json = await response.json(); if (response) { + dispatch(addToast({ + id: 'app.deleted', + values: { + type: 'page', + code: page.code, + }, + }, TOAST_SUCCESS)); dispatch(removePage(page)); if (page.tourProgress === APP_TOUR_CANCELLED) return; if ((page.tourProgress !== APP_TOUR_STARTED && successRedirect) || page.redirectToPageTree) { diff --git a/src/state/pages/reducer.js b/src/state/pages/reducer.js index fbb3aa851..a6896522c 100644 --- a/src/state/pages/reducer.js +++ b/src/state/pages/reducer.js @@ -123,7 +123,7 @@ const childrenMap = (state = {}, action = {}) => { case REMOVE_PAGE: { const { parentCode, code } = action.payload.page; const newState = { ...state }; - if (parentCode) { + if (parentCode && newState[parentCode]) { newState[parentCode] = newState[parentCode].filter(f => f !== code); } delete newState[code]; diff --git a/src/state/pages/selectors.js b/src/state/pages/selectors.js index 05cbb176a..f7022afcf 100644 --- a/src/state/pages/selectors.js +++ b/src/state/pages/selectors.js @@ -19,12 +19,12 @@ export const getDashboardPages = state => state.pages.dashboard; export const getIsVirtualRootOn = state => state.pages.virtualRoot; export const getSearchPages = createSelector( - [getSearchPagesRaw, getChildrenMap], - (pages, pageChildren) => { + [getSearchPagesRaw], + (pages) => { if (!pages) return pages; return pages.map(page => ({ ...page, - isEmpty: pageChildren[page.code] && page.children.length === 0, + isEmpty: page.children.length === 0, })); }, ); diff --git a/src/ui/pages/common/DeletePageModalContainer.js b/src/ui/pages/common/DeletePageModalContainer.js index 9ee6524a9..edcec95d3 100644 --- a/src/ui/pages/common/DeletePageModalContainer.js +++ b/src/ui/pages/common/DeletePageModalContainer.js @@ -7,7 +7,7 @@ import { getPagesMap } from 'state/pages/selectors'; export const mapStateToProps = state => ({ info: getInfo(state), - page: getPagesMap(state)[getInfo(state).code], + page: getInfo(state).page || getPagesMap(state)[getInfo(state).code], }); export const mapDispatchToProps = dispatch => ({ diff --git a/src/ui/pages/common/PageTree.js b/src/ui/pages/common/PageTree.js index 00383d348..635fc8295 100644 --- a/src/ui/pages/common/PageTree.js +++ b/src/ui/pages/common/PageTree.js @@ -191,6 +191,7 @@ class PageTree extends Component { locale={this.props.locale} domain={this.props.domain} myGroupIds={this.props.myGroupIds} + isSearchMode={!!this.props.searchPages} /> ); } diff --git a/src/ui/pages/common/PageTreeActionMenu.js b/src/ui/pages/common/PageTreeActionMenu.js index 4afb120d2..f4ed399bb 100644 --- a/src/ui/pages/common/PageTreeActionMenu.js +++ b/src/ui/pages/common/PageTreeActionMenu.js @@ -28,13 +28,13 @@ class PageTreeActionMenu extends Component { const { page, onClickAdd, onClickEdit, onClickConfigure, onClickDetails, onClickClone, onClickDelete, onClickPublish, onClickUnpublish, - onClickViewPublishedPage, onClickPreview, myGroupIds, + onClickViewPublishedPage, onClickPreview, myGroupIds, isSearchMode, } = this.props; const disableDueToLackOfGroupAccess = !myGroupIds.includes(page.ownerGroup); let disabled = false; - if (!page.isEmpty && page.status === PAGE_STATUS_PUBLISHED) { + if (!page.isEmpty && page.status === PAGE_STATUS_PUBLISHED && !isSearchMode) { disabled = true; } if (page.expanded) { @@ -42,7 +42,7 @@ class PageTreeActionMenu extends Component { } const disablePublishAction = (page.status === PAGE_STATUS_UNPUBLISHED && - page.parentStatus === PAGE_STATUS_UNPUBLISHED) + page.parentStatus === PAGE_STATUS_UNPUBLISHED && !isSearchMode) || disableDueToLackOfGroupAccess; const changePublishStatus = page.status === PAGE_STATUS_PUBLISHED ? ( @@ -176,6 +176,7 @@ PageTreeActionMenu.propTypes = { domain: PropTypes.string.isRequired, locale: PropTypes.string.isRequired, myGroupIds: PropTypes.arrayOf(PropTypes.string), + isSearchMode: PropTypes.bool, }; PageTreeActionMenu.defaultProps = { @@ -190,6 +191,7 @@ PageTreeActionMenu.defaultProps = { onClickViewPublishedPage: null, onClickPreview: null, myGroupIds: [], + isSearchMode: false, }; export default PageTreeActionMenu; diff --git a/src/ui/pages/common/PageTreeContainer.js b/src/ui/pages/common/PageTreeContainer.js index 1678dc028..9a5572bed 100644 --- a/src/ui/pages/common/PageTreeContainer.js +++ b/src/ui/pages/common/PageTreeContainer.js @@ -72,15 +72,15 @@ export const mapDispatchToProps = (dispatch, ownProps) => ({ }, onClickDelete: (page) => { dispatch(setVisibleModal(MODAL_ID)); - dispatch(setInfo({ type: 'page', code: page.code })); + dispatch(setInfo({ type: 'page', code: page.code, page })); }, onClickPublish: (page) => { dispatch(setVisibleModal(PUBLISH_MODAL_ID)); - dispatch(setInfo({ type: 'page', code: page.code })); + dispatch(setInfo({ type: 'page', code: page.code, page })); }, onClickUnPublish: (page) => { dispatch(setVisibleModal(UNPUBLISH_MODAL_ID)); - dispatch(setInfo({ type: 'page', code: page.code })); + dispatch(setInfo({ type: 'page', code: page.code, page })); }, onClickDetails: (page) => { dispatch(setSelectedPage(page)); diff --git a/src/ui/pages/common/PublishPageModalContainer.js b/src/ui/pages/common/PublishPageModalContainer.js index 0b23c7ce4..b239c0b34 100644 --- a/src/ui/pages/common/PublishPageModalContainer.js +++ b/src/ui/pages/common/PublishPageModalContainer.js @@ -8,7 +8,7 @@ import { getPagesMap } from 'state/pages/selectors'; export const mapStateToProps = state => ({ info: getInfo(state), - page: getPagesMap(state)[getInfo(state).code], + page: getInfo(state).page || getPagesMap(state)[getInfo(state).code], }); export const mapDispatchToProps = dispatch => ({ diff --git a/src/ui/pages/common/UnpublishPageModalContainer.js b/src/ui/pages/common/UnpublishPageModalContainer.js index 217687512..38fc7a78d 100644 --- a/src/ui/pages/common/UnpublishPageModalContainer.js +++ b/src/ui/pages/common/UnpublishPageModalContainer.js @@ -8,7 +8,7 @@ import { getPagesMap } from 'state/pages/selectors'; export const mapStateToProps = state => ({ info: getInfo(state), - page: getPagesMap(state)[getInfo(state).code], + page: getInfo(state).page || getPagesMap(state)[getInfo(state).code], }); export const mapDispatchToProps = dispatch => ({ diff --git a/src/ui/pages/list/PageListSearchTable.js b/src/ui/pages/list/PageListSearchTable.js index 7c06a9179..1af4208d9 100644 --- a/src/ui/pages/list/PageListSearchTable.js +++ b/src/ui/pages/list/PageListSearchTable.js @@ -4,6 +4,8 @@ import { Paginator, Spinner, Alert } from 'patternfly-react'; import { FormattedMessage, injectIntl, intlShape } from 'react-intl'; import { DataTable } from '@entando/datatable'; import DeletePageModalContainer from 'ui/pages/common/DeletePageModalContainer'; +import PublishPageModalContainer from 'ui/pages/common/PublishPageModalContainer'; +import UnpublishPageModalContainer from 'ui/pages/common/UnpublishPageModalContainer'; import paginatorMessages from 'ui/paginatorMessages'; class PageListSearchTable extends Component { @@ -125,6 +127,8 @@ class PageListSearchTable extends Component { {this.renderTable()} + + ); } diff --git a/test/state/pages/actions.test.js b/test/state/pages/actions.test.js index 66ac625bb..a172ed112 100644 --- a/test/state/pages/actions.test.js +++ b/test/state/pages/actions.test.js @@ -543,8 +543,9 @@ describe('state/pages/actions', () => { store.dispatch(sendDeletePage(DASHBOARD_PAYLOAD)).then(() => { expect(deletePage).toHaveBeenCalled(); const actions = store.getActions(); - expect(actions).toHaveLength(1); - expect(actions[0]).toHaveProperty('type', REMOVE_PAGE); + expect(actions).toHaveLength(2); + expect(actions[0]).toHaveProperty('type', ADD_TOAST); + expect(actions[1]).toHaveProperty('type', REMOVE_PAGE); expect(history.push).toHaveBeenCalledWith(ROUTE_PAGE_TREE); done(); }).catch(done.fail); diff --git a/test/ui/pages/common/PageTreeContainer.test.js b/test/ui/pages/common/PageTreeContainer.test.js index 59c57d0cf..1490249e9 100644 --- a/test/ui/pages/common/PageTreeContainer.test.js +++ b/test/ui/pages/common/PageTreeContainer.test.js @@ -119,7 +119,7 @@ describe('PageTreeContainer', () => { it('should dispatch an action if onClickDelete is called', () => { props.onClickDelete({ code: 'pagecode' }); expect(setVisibleModal).toHaveBeenCalledWith(MODAL_ID); - expect(setInfo).toHaveBeenCalledWith({ type: 'page', code: 'pagecode' }); + expect(setInfo).toHaveBeenCalledWith({ type: 'page', code: 'pagecode', page: { code: 'pagecode' } }); }); it('should dispatch an action if onClickClone is called', () => { @@ -130,13 +130,13 @@ describe('PageTreeContainer', () => { it('should dispatch an action if onClickPublish is called', () => { props.onClickPublish({ code: 'pagecode', status: 'publish' }); expect(setVisibleModal).toHaveBeenCalledWith(PUBLISH_MODAL_ID); - expect(setInfo).toHaveBeenCalledWith({ type: 'page', code: 'pagecode' }); + expect(setInfo).toHaveBeenCalledWith({ type: 'page', code: 'pagecode', page: { code: 'pagecode', status: 'publish' } }); }); it('should dispatch an action if onClickUnPublish is called', () => { props.onClickUnPublish({ code: 'pagecode', status: 'unpublish' }); expect(setVisibleModal).toHaveBeenCalledWith(UNPUBLISH_MODAL_ID); - expect(setInfo).toHaveBeenCalledWith({ type: 'page', code: 'pagecode' }); + expect(setInfo).toHaveBeenCalledWith({ type: 'page', code: 'pagecode', page: { code: 'pagecode', status: 'unpublish' } }); }); it('should dispatch an action if "onClickDetails" is called', () => {