Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ LABEL name="Entando App Builder" \
maintainer="dev@entando.com" \
vendor="Entando Inc." \
version="v${VERSION}" \
release="7.3.0" \
release="7.5.0" \
summary="Entando App Builder" \
description="The Entando App Builder is the front end environment to interact with the micro frontends, the WCMS, and other Entando components"

Expand Down
22 changes: 11 additions & 11 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@entando/app-builder",
"version": "7.3.0",
"version": "7.5.0",
"author": "Entando",
"homepage": "https://github.com/entando/app-builder",
"license": "MIT",
Expand Down
13 changes: 10 additions & 3 deletions src/api/pages.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,13 @@ export const getPage = (pageCode, status = PAGE_STATUS_DRAFT) => makeRequest({
),
});

export const getRootPage = () => makeRequest({
uri: '/api/pages/utils/root',
method: METHODS.GET,
mockResponse: HOMEPAGE_PAYLOAD,
useAuthentication: true,
});

export const getPageSEO = pageCode => makeRequest({
uri: `/api/plugins/seo/pages/${pageCode}`,
method: METHODS.GET,
Expand Down Expand Up @@ -82,7 +89,7 @@ export const getPageChildren = pageCode => makeRequest({
});

export const getViewPages = () => makeRequest({
uri: '/api/pages/viewpages',
uri: '/api/pages/utils/viewpages',
method: METHODS.GET,
mockResponse: VIEWPAGES_PAYLOAD,
contentType: 'application/json',
Expand Down Expand Up @@ -175,7 +182,7 @@ export const putPageStatus = (pageCode, status) => makeRequest({
});

export const getFreePages = () => makeRequest({
uri: '/api/pages/search/group/free',
uri: '/api/pages/utils/search/group/free',
method: METHODS.GET,
mockResponse: FREE_PAGES_PAYLOAD,
useAuthentication: true,
Expand All @@ -199,7 +206,7 @@ export const putPageSettings = pageSettings => makeRequest({
export const getSearchPages = (page = { page: 1, pageSize: 10 }, params = '') =>
makeRequest(
{
uri: `/api/pages/search${params}`,
uri: `/api/pages/utils/search${params}`,
method: METHODS.GET,
useAuthentication: true,
mockResponse: SEARCH_PAGES,
Expand Down
2 changes: 2 additions & 0 deletions src/app-init/apiManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
clearLoggedUserPermissions,
} from 'state/permissions/actions';
import { clearAppTourProgress } from 'state/app-tour/actions';
import { setLoading } from 'state/loading/actions';
import { addToast, TOAST_WARNING } from '@entando/messages';
import { defineMessages, injectIntl, intlShape } from 'react-intl';
import { history, ROUTE_DASHBOARD, ROUTE_HOME } from 'app-init/router';
Expand Down Expand Up @@ -40,6 +41,7 @@ const ApiManager = ({
auth.setToRefreshToken(false);
} else {
const { redirectUri, pathname } = opts;
store.dispatch(setLoading('rootPage', false));
store.dispatch(fetchPermissions())
.then(() => store.dispatch(fetchLoggedUserPermissions()));
if (redirectUri) {
Expand Down
58 changes: 41 additions & 17 deletions src/state/pages/actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { addToast, addErrors, TOAST_SUCCESS, TOAST_ERROR } from '@entando/messag
import { setPage } from 'state/pagination/actions';
import {
getPage, getPageChildren, setPagePosition, postPage, deletePage, getFreePages,
getPageSettings, putPage, putPageStatus, getViewPages, getSearchPages,
getPageSettings, putPage, putPageStatus, getViewPages, getSearchPages, getRootPage,
putPageSettings, patchPage, getPageSEO, postPageSEO, putPageSEO, postClonePage,
} from 'api/pages';
import {
Expand All @@ -13,6 +13,7 @@ import {
getChildrenMap,
getSelectedPage,
getAllPageTreeLoadedStatus,
getRootPageCode,
} from 'state/pages/selectors';
import { makeGetSelectedPageConfig } from 'state/page-config/selectors';
import { setPublishedPageConfig } from 'state/page-config/actions';
Expand All @@ -21,13 +22,14 @@ import {
MOVE_PAGE, SET_FREE_PAGES, SET_SELECTED_PAGE, REMOVE_PAGE, UPDATE_PAGE, SEARCH_PAGES,
CLEAR_SEARCH, SET_REFERENCES_SELECTED_PAGE, CLEAR_TREE, BATCH_TOGGLE_EXPANDED, COLLAPSE_ALL,
SET_DASHBOARD_PAGES,
SET_VIRTUAL_ROOT,
SET_VIRTUAL_ROOT, SET_ROOT_PAGE,
} from 'state/pages/types';
import { HOMEPAGE_CODE, PAGE_STATUS_DRAFT, PAGE_STATUS_PUBLISHED, PAGE_STATUS_UNPUBLISHED, SEO_ENABLED } from 'state/pages/const';
import { PAGE_STATUS_DRAFT, PAGE_STATUS_PUBLISHED, PAGE_STATUS_UNPUBLISHED, SEO_ENABLED } from 'state/pages/const';
import { history, ROUTE_PAGE_TREE, ROUTE_PAGE_CLONE, ROUTE_PAGE_ADD } from 'app-init/router';
import { generateJsonPatch } from 'helpers/jsonPatch';
import getSearchParam from 'helpers/getSearchParam';
import { toggleLoading } from 'state/loading/actions';
import { toggleLoading, setLoading } from 'state/loading/actions';
import { getLoading } from 'state/loading/selectors';
import { getDefaultLanguage } from 'state/languages/selectors';

import { APP_TOUR_CANCELLED, APP_TOUR_STARTED, APP_TOUR_HOMEPAGE_CODEREF } from 'state/app-tour/const';
Expand Down Expand Up @@ -176,6 +178,11 @@ export const setVirtualRoot = virtualRoot => ({
payload: virtualRoot,
});

export const setRootPage = rootPageCode => ({
type: SET_ROOT_PAGE,
payload: rootPageCode,
});

const wrapApiCall = apiFunc => (...args) => async (dispatch) => {
const response = await apiFunc(...args);
const json = await response.json();
Expand All @@ -198,6 +205,21 @@ export const fetchIfPageExists = pageCode => new Promise((resolve) => {
getPage(pageCode).then(response => resolve(response.ok)).catch(() => resolve(false));
});

export const fetchRootPage = () => async (dispatch, getState) => {
if (getLoading(getState()).rootPage) return;
dispatch(setLoading('rootPage', true));
try {
const response = await getRootPage();
const json = await response.json();
if (response.ok) {
dispatch(setRootPage(json.payload.code));
}
} catch (e) {
dispatch(setLoading('rootPage', false));
// falls back to 'homepage' default in reducer
}
};


export const fetchViewPages = () => dispatch => new Promise((resolve) => {
getViewPages().then((response) => {
Expand Down Expand Up @@ -240,8 +262,9 @@ export const sendDeletePage = (page, successRedirect = true) => async (dispatch)
}
};

export const fetchPageTree = pageCode => async (dispatch) => {
if (pageCode === HOMEPAGE_CODE) {
export const fetchPageTree = pageCode => async (dispatch, getState) => {
const rootPageCode = getRootPageCode(getState());
if (pageCode === rootPageCode) {
const responses = await Promise.all([
fetchPage(pageCode)(dispatch),
fetchPageChildren(pageCode)(dispatch),
Expand All @@ -256,29 +279,30 @@ export const fetchPageTree = pageCode => async (dispatch) => {
};


export const handleExpandPage = (pageCode = HOMEPAGE_CODE, alwaysExpand) => (
export const handleExpandPage = (pageCode, alwaysExpand) => (
(dispatch, getState) => {
const state = getState();
const pageStatus = getStatusMap(state)[pageCode];
const effectivePageCode = pageCode || getRootPageCode(state);
const pageStatus = getStatusMap(state)[effectivePageCode];
const toExpand = (!pageStatus || !pageStatus.expanded);
const toLoad = (toExpand && (!pageStatus || pageStatus.expanded === undefined));
if (toLoad) {
dispatch(setPageLoading(pageCode));
return fetchPageTree(pageCode)(dispatch)
dispatch(setPageLoading(effectivePageCode));
return fetchPageTree(effectivePageCode)(dispatch, getState)
.then((pages) => {
dispatch(addPages(pages));
dispatch(setPageExpanded(pageCode, true));
dispatch(setPageLoaded(pageCode));
dispatch(setPageExpanded(effectivePageCode, true));
dispatch(setPageLoaded(effectivePageCode));
if (
pageCode === APP_TOUR_HOMEPAGE_CODEREF &&
effectivePageCode === APP_TOUR_HOMEPAGE_CODEREF &&
getAppTourProgress(state) !== APP_TOUR_CANCELLED
) {
dispatch(setExistingPages(pages));
}
}).catch(() => {});
}
dispatch(setPageExpanded(
pageCode,
effectivePageCode,
alwaysExpand !== undefined ? alwaysExpand : toExpand,
));
return noopPromise();
Expand Down Expand Up @@ -320,7 +344,7 @@ const movePage = (pageCode, siblingCode, moveAbove) => (dispatch, getState) => {
const siblingPage = getPagesMap(state)[siblingCode];
const page = getPagesMap(state)[pageCode];
const oldParentCode = page.parentCode;
const newParentCode = siblingPage.parentCode || HOMEPAGE_CODE;
const newParentCode = siblingPage.parentCode || getRootPageCode(state);
const newSiblingChildren = getChildrenMap(state)[newParentCode]
.filter(code => code !== pageCode);
const newSiblingIndex = newSiblingChildren.indexOf(siblingCode);
Expand Down Expand Up @@ -564,8 +588,8 @@ export const fetchPageForm = pageCode => (dispatch, getState) => fetchPageInfo(p
})
.catch(() => {});

export const loadSelectedPage = pageCode => dispatch =>
fetchPage(pageCode || getSearchParam('parentCode') || HOMEPAGE_CODE)(dispatch)
export const loadSelectedPage = pageCode => (dispatch, getState) =>
fetchPage(pageCode || getSearchParam('parentCode') || getRootPageCode(getState()))(dispatch)
.then((response) => {
dispatch(setSelectedPage(response.payload));
return response.payload;
Expand Down
10 changes: 10 additions & 0 deletions src/state/pages/reducer.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import {
COLLAPSE_ALL,
SET_DASHBOARD_PAGES,
SET_VIRTUAL_ROOT,
SET_ROOT_PAGE,
} from 'state/pages/types';

// creates a map from an array
Expand Down Expand Up @@ -294,6 +295,14 @@ export const virtualRoot = (state = false, action = {}) => {
}
};

export const rootPage = (state = 'homepage', action = {}) => {
switch (action.type) {
case SET_ROOT_PAGE:
return action.payload;
default: return state;
}
};

export default combineReducers({
map: reducer,
childrenMap,
Expand All @@ -305,4 +314,5 @@ export default combineReducers({
search,
dashboard,
virtualRoot,
rootPage,
});
Loading
Loading