diff --git a/packages/core/admin/admin/src/pages/SettingsPage/index.js b/packages/core/admin/admin/src/pages/SettingsPage/index.js index abbf2f6793..76cfd9e8d2 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/index.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/index.js @@ -45,7 +45,7 @@ function SettingsPage() { ); }, []); - const pluginsRoutes = useMemo(() => createSectionsRoutes(settings), [settings]); + const pluginsRoutes = createSectionsRoutes(settings); // Only display accessible sections const filteredMenu = useMemo(() => getSectionsToDisplay(menu), [menu]); diff --git a/packages/core/admin/admin/src/pages/SettingsPage/utils/defaultRoutes.js b/packages/core/admin/admin/src/pages/SettingsPage/utils/defaultRoutes.js index 0c370f781c..452fc02597 100644 --- a/packages/core/admin/admin/src/pages/SettingsPage/utils/defaultRoutes.js +++ b/packages/core/admin/admin/src/pages/SettingsPage/utils/defaultRoutes.js @@ -1,55 +1,99 @@ import RolesCreatePage from 'ee_else_ce/pages/Roles/CreatePage'; import ProtectedRolesListPage from 'ee_else_ce/pages/Roles/ProtectedListPage'; -import UsersEditPage from '../../Users/ProtectedEditPage'; -import UsersListPage from '../../Users/ProtectedListPage'; -import RolesEditPage from '../../Roles/ProtectedEditPage'; -import WebhooksCreateView from '../../Webhooks/ProtectedCreateView'; -import WebhooksEditView from '../../Webhooks/ProtectedEditView'; -import WebhooksListView from '../../Webhooks/ProtectedListView'; const defaultRoutes = [ { - Component: ProtectedRolesListPage, + Component: () => { + return { default: ProtectedRolesListPage }; + }, + to: '/settings/roles', exact: true, }, { - Component: RolesCreatePage, + Component: () => { + return { default: RolesCreatePage }; + }, to: '/settings/roles/duplicate/:id', exact: true, }, { - Component: RolesCreatePage, + // Component: RolesCreatePage, + Component: () => { + return { default: RolesCreatePage }; + }, to: '/settings/roles/new', exact: true, }, { - Component: RolesEditPage, + // Component: RolesEditPage, + Component: async () => { + const component = await import( + /* webpackChunkName: "admin-edit-roles-page" */ '../../Roles/ProtectedEditPage' + ); + + return component; + }, to: '/settings/roles/:id', exact: true, }, { - Component: UsersListPage, + // Component: UsersListPage, + Component: async () => { + const component = await import( + /* webpackChunkName: "admin-users" */ '../../Users/ProtectedListPage' + ); + + return component; + }, to: '/settings/users', exact: true, }, { - Component: UsersEditPage, + // Component: UsersEditPage, + Component: async () => { + const component = await import( + /* webpackChunkName: "admin-edit-users" */ '../../Users/ProtectedEditPage' + ); + + return component; + }, to: '/settings/users/:id', exact: true, }, { - Component: WebhooksCreateView, + // Component: WebhooksCreateView, + Component: async () => { + const component = await import( + /* webpackChunkName: "webhook-edit-page" */ '../../Webhooks/ProtectedCreateView' + ); + + return component; + }, to: '/settings/webhooks/create', exact: true, }, { - Component: WebhooksEditView, + // Component: WebhooksEditView, + Component: async () => { + const component = await import( + /* webpackChunkName: "webhook-edit-page" */ '../../Webhooks/ProtectedEditView' + ); + + return component; + }, to: '/settings/webhooks/:id', exact: true, }, { - Component: WebhooksListView, + // Component: WebhooksListView, + Component: async () => { + const component = await import( + /* webpackChunkName: "webhook-list-page" */ '../../Webhooks/ProtectedListView' + ); + + return component; + }, to: '/settings/webhooks', exact: true, }, diff --git a/packages/core/admin/admin/src/utils/createRoute.js b/packages/core/admin/admin/src/utils/createRoute.js index 841a9dc902..f440e28068 100644 --- a/packages/core/admin/admin/src/utils/createRoute.js +++ b/packages/core/admin/admin/src/utils/createRoute.js @@ -1,8 +1,46 @@ -import React from 'react'; +import React, { useEffect, useState } from 'react'; +import PropTypes from 'prop-types'; import { Route } from 'react-router-dom'; +import { LoadingIndicatorPage } from '@strapi/helper-plugin'; + +const LazyCompo = ({ loadComponent }) => { + const [C, setCompo] = useState(null); + + useEffect(() => { + const loadCompo = async () => { + try { + const loadedCompo = await loadComponent(); + + setCompo(() => loadedCompo.default); + } catch (err) { + console.log(err); + } + }; + + loadCompo(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + if (C) { + return ; + } + + return ; +}; const createRoute = (Component, to, exact) => { - return ; + return ( + } + key={to} + path={to} + exact={exact || false} + /> + ); +}; + +LazyCompo.propTypes = { + loadComponent: PropTypes.func.isRequired, }; export default createRoute; diff --git a/packages/core/admin/ee/admin/pages/SettingsPage/utils/customRoutes.js b/packages/core/admin/ee/admin/pages/SettingsPage/utils/customRoutes.js index 10ebd519a4..5863ba166c 100644 --- a/packages/core/admin/ee/admin/pages/SettingsPage/utils/customRoutes.js +++ b/packages/core/admin/ee/admin/pages/SettingsPage/utils/customRoutes.js @@ -1,9 +1,12 @@ -import SingleSignOn from '../SingleSignOn'; - const ssoRoutes = strapi.features.isEnabled(strapi.features.SSO) ? [ { - Component: SingleSignOn, + // Component: SingleSignOn, + Component: async () => { + const component = await import(/* webpackChunkName: "sso" */ '../SingleSignOn'); + + return component; + }, to: '/settings/single-sign-on', exact: true, }, diff --git a/packages/core/email/admin/src/index.js b/packages/core/email/admin/src/index.js index 2126c2eed1..6d45b04939 100644 --- a/packages/core/email/admin/src/index.js +++ b/packages/core/email/admin/src/index.js @@ -5,14 +5,12 @@ // Also the strapi-generate-plugins/files/admin/src/index.js needs to be updated // IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED -import React from 'react'; -import { CheckPagePermissions, prefixPluginTranslations } from '@strapi/helper-plugin'; +import { prefixPluginTranslations } from '@strapi/helper-plugin'; import pluginPkg from '../../package.json'; import pluginId from './pluginId'; import pluginLogo from './assets/images/logo.svg'; import pluginPermissions from './permissions'; import getTrad from './utils/getTrad'; -import SettingsPage from './pages/Settings'; const pluginDescription = pluginPkg.strapi.description || pluginPkg.description; const icon = pluginPkg.strapi.icon; @@ -34,11 +32,18 @@ export default { }, id: 'settings', to: `/settings/${pluginId}`, - Component: () => ( - - - - ), + Component: async () => { + const component = await import( + /* webpackChunkName: "email-settings" */ './pages/Settings' + ); + + return component; + }, + // Component: () => ( + // + // + // + // ), permissions: pluginPermissions.settings, }, diff --git a/packages/core/email/admin/src/pages/Settings/index.js b/packages/core/email/admin/src/pages/Settings/index.js index baedd23eae..d6d59214b8 100644 --- a/packages/core/email/admin/src/pages/Settings/index.js +++ b/packages/core/email/admin/src/pages/Settings/index.js @@ -20,6 +20,12 @@ import { AlignedButton, Text } from './components'; import schema from '../../utils/schema'; import pluginPermissions from '../../permissions'; +const ProtectedSettingsPage = () => ( + + + +); + const SettingsPage = () => { const toggleNotification = useNotification(); const { formatMessage } = useIntl(); @@ -205,4 +211,4 @@ const SettingsPage = () => { ); }; -export default SettingsPage; +export default ProtectedSettingsPage; diff --git a/packages/core/upload/admin/src/index.js b/packages/core/upload/admin/src/index.js index a48cba5720..f784d02912 100644 --- a/packages/core/upload/admin/src/index.js +++ b/packages/core/upload/admin/src/index.js @@ -4,15 +4,13 @@ // Here's the file: strapi/docs/3.0.0-beta.x/guides/registering-a-field-in-admin.md // Also the strapi-generate-plugins/files/admin/src/index.js needs to be updated // IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED -import React from 'react'; -import { CheckPagePermissions, prefixPluginTranslations } from '@strapi/helper-plugin'; +import { prefixPluginTranslations } from '@strapi/helper-plugin'; import pluginPkg from '../../package.json'; import pluginLogo from './assets/images/logo.svg'; import pluginPermissions from './permissions'; import Initializer from './components/Initializer'; import InputMedia from './components/InputMedia'; import InputModalStepper from './components/InputModalStepper'; -import SettingsPage from './pages/SettingsPage'; import reducers from './reducers'; import pluginId from './pluginId'; import { getTrad } from './utils'; @@ -61,11 +59,13 @@ export default { defaultMessage: 'Media Library', }, to: '/settings/media-library', - Component: () => ( - - - - ), + Component: async () => { + const component = await import( + /* webpackChunkName: "upload-settings" */ './pages/SettingsPage' + ); + + return component; + }, permissions: pluginPermissions.settings, }); }, diff --git a/packages/core/upload/admin/src/pages/SettingsPage/index.js b/packages/core/upload/admin/src/pages/SettingsPage/index.js index 542a9a7b87..18ee77a6e2 100644 --- a/packages/core/upload/admin/src/pages/SettingsPage/index.js +++ b/packages/core/upload/admin/src/pages/SettingsPage/index.js @@ -4,13 +4,24 @@ import { Helmet } from 'react-helmet'; import { Text } from '@buffetjs/core'; import { isEqual } from 'lodash'; import { useIntl } from 'react-intl'; -import { LoadingIndicatorPage, useNotification, request } from '@strapi/helper-plugin'; - +import { + CheckPagePermissions, + LoadingIndicatorPage, + useNotification, + request, +} from '@strapi/helper-plugin'; import { getRequestUrl, getTrad } from '../../utils'; import SectionTitleWrapper from './SectionTitleWrapper'; import Wrapper from './Wrapper'; import init from './init'; import reducer, { initialState } from './reducer'; +import pluginPermissions from '../../permissions'; + +const ProtectedSettingsPage = () => ( + + + +); const SettingsPage = () => { const { formatMessage } = useIntl(); @@ -202,4 +213,4 @@ const SettingsPage = () => { ); }; -export default SettingsPage; +export default ProtectedSettingsPage; diff --git a/packages/plugins/documentation/admin/src/index.js b/packages/plugins/documentation/admin/src/index.js index b0c61fa15d..772a8916c1 100644 --- a/packages/plugins/documentation/admin/src/index.js +++ b/packages/plugins/documentation/admin/src/index.js @@ -9,7 +9,6 @@ import pluginPkg from '../../package.json'; import pluginPermissions from './permissions'; import pluginId from './pluginId'; import pluginLogo from './assets/images/logo.svg'; -import App from './pages/App'; const pluginDescription = pluginPkg.strapi.description || pluginPkg.description; const icon = pluginPkg.strapi.icon; @@ -25,7 +24,11 @@ export default { defaultMessage: 'Documentation', }, permissions: pluginPermissions.main, - Component: App, + Component: async () => { + const component = await import(/* webpackChunkName: "documentation" */ './pages/App'); + + return component; + }, }); app.registerPlugin({ diff --git a/packages/plugins/i18n/admin/src/index.js b/packages/plugins/i18n/admin/src/index.js index 016e9b211f..29e133de81 100644 --- a/packages/plugins/i18n/admin/src/index.js +++ b/packages/plugins/i18n/admin/src/index.js @@ -6,7 +6,6 @@ import pluginLogo from './assets/images/logo.svg'; import CheckboxConfirmation from './components/CheckboxConfirmation'; import CMEditViewInjectedComponents from './components/CMEditViewInjectedComponents'; import Initializer from './components/Initializer'; -import SettingsPage from './pages/SettingsPage'; import LocalePicker from './components/LocalePicker'; import middlewares from './middlewares'; import pluginPermissions from './permissions'; @@ -64,7 +63,14 @@ export default { }, id: 'internationalization', to: '/settings/internationalization', - Component: SettingsPage, + + Component: async () => { + const component = await import( + /* webpackChunkName: "i18n-settings" */ './pages/SettingsPage' + ); + + return component; + }, permissions: pluginPermissions.accessMain, }); diff --git a/packages/plugins/users-permissions/admin/src/index.js b/packages/plugins/users-permissions/admin/src/index.js index bfc8783470..6e7f92db50 100644 --- a/packages/plugins/users-permissions/admin/src/index.js +++ b/packages/plugins/users-permissions/admin/src/index.js @@ -4,16 +4,11 @@ // Here's the file: strapi/docs/3.0.0-beta.x/guides/registering-a-field-in-admin.md // Also the strapi-generate-plugins/files/admin/src/index.js needs to be updated // IF THE DOC IS NOT UPDATED THE PULL REQUEST WILL NOT BE MERGED -import React from 'react'; -import { CheckPagePermissions, prefixPluginTranslations } from '@strapi/helper-plugin'; +import { prefixPluginTranslations } from '@strapi/helper-plugin'; import pluginPkg from '../../package.json'; import pluginLogo from './assets/images/logo.svg'; import pluginPermissions from './permissions'; import pluginId from './pluginId'; -import RolesPage from './pages/Roles'; -import ProvidersPage from './pages/Providers'; -import EmailTemplatesPage from './pages/EmailTemplates'; -import AdvancedSettingsPage from './pages/AdvancedSettings'; import getTrad from './utils/getTrad'; const pluginDescription = pluginPkg.strapi.description || pluginPkg.description; @@ -39,11 +34,11 @@ export default { }, id: 'roles', to: `/settings/${pluginId}/roles`, - Component: () => ( - - - - ), + Component: async () => { + const component = await import(/* webpackChunkName: "users-roles" */ './pages/Roles'); + + return component; + }, permissions: pluginPermissions.accessRoles, }, { @@ -53,11 +48,13 @@ export default { }, id: 'providers', to: `/settings/${pluginId}/providers`, - Component: () => ( - - - - ), + Component: async () => { + const component = await import( + /* webpackChunkName: "users-providers" */ './pages/Providers' + ); + + return component; + }, permissions: pluginPermissions.readProviders, }, { @@ -67,11 +64,13 @@ export default { }, id: 'email-templates', to: `/settings/${pluginId}/email-templates`, - Component: () => ( - - - - ), + Component: async () => { + const component = await import( + /* webpackChunkName: "users-email" */ './pages/EmailTemplates' + ); + + return component; + }, permissions: pluginPermissions.readEmailTemplates, }, { @@ -81,11 +80,13 @@ export default { }, id: 'advanced-settings', to: `/settings/${pluginId}/advanced-settings`, - Component: () => ( - - - - ), + Component: async () => { + const component = await import( + /* webpackChunkName: "users-advanced-settings" */ './pages/AdvancedSettings' + ); + + return component; + }, permissions: pluginPermissions.readAdvancedSettings, }, ] diff --git a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/index.js b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/index.js index 2d10d7496b..b7de9a765d 100644 --- a/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/AdvancedSettings/index.js @@ -11,6 +11,7 @@ import { request, useNotification, useOverlayBlocker, + CheckPagePermissions, } from '@strapi/helper-plugin'; import pluginPermissions from '../../permissions'; import { getTrad, getRequestURL } from '../../utils'; @@ -18,6 +19,12 @@ import ListBaselineAlignment from '../../components/ListBaselineAlignment'; import form from './utils/form'; import reducer, { initialState } from './reducer'; +const Protected = () => ( + + + +); + const AdvancedSettingsPage = () => { const { formatMessage } = useIntl(); const toggleNotification = useNotification(); @@ -212,4 +219,4 @@ const AdvancedSettingsPage = () => { ); }; -export default AdvancedSettingsPage; +export default Protected; diff --git a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/index.js b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/index.js index 8fb474b8cb..6aed9b4df0 100644 --- a/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/EmailTemplates/index.js @@ -11,6 +11,7 @@ import { getYupInnerErrors, useNotification, useOverlayBlocker, + CheckPagePermissions, } from '@strapi/helper-plugin'; import { Row } from 'reactstrap'; import pluginPermissions from '../../permissions'; @@ -22,6 +23,12 @@ import { getRequestURL, getTrad } from '../../utils'; import forms from './utils/forms'; import schema from './utils/schema'; +const Protected = () => ( + + + +); + const EmailTemplatesPage = () => { const { formatMessage } = useIntl(); const { trackUsage } = useTracking(); @@ -232,4 +239,4 @@ const EmailTemplatesPage = () => { ); }; -export default EmailTemplatesPage; +export default Protected; diff --git a/packages/plugins/users-permissions/admin/src/pages/Providers/index.js b/packages/plugins/users-permissions/admin/src/pages/Providers/index.js index dd1d3f39d9..80ececb67c 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Providers/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Providers/index.js @@ -11,6 +11,7 @@ import { request, useNotification, useOverlayBlocker, + CheckPagePermissions, } from '@strapi/helper-plugin'; import { get, upperFirst, has } from 'lodash'; import { Row } from 'reactstrap'; @@ -23,6 +24,12 @@ import ModalForm from '../../components/ModalForm'; import createProvidersArray from './utils/createProvidersArray'; import forms from './utils/forms'; +const ProtectedProvidersPage = () => ( + + + +); + const ProvidersPage = () => { const { formatMessage } = useIntl(); const { trackUsage } = useTracking(); @@ -279,4 +286,4 @@ const ProvidersPage = () => { ); }; -export default ProvidersPage; +export default ProtectedProvidersPage; diff --git a/packages/plugins/users-permissions/admin/src/pages/Roles/index.js b/packages/plugins/users-permissions/admin/src/pages/Roles/index.js index 91bd1ddf70..9087ee2b7b 100644 --- a/packages/plugins/users-permissions/admin/src/pages/Roles/index.js +++ b/packages/plugins/users-permissions/admin/src/pages/Roles/index.js @@ -1,20 +1,26 @@ import React from 'react'; import { Switch, Route } from 'react-router-dom'; -import { NotFound } from '@strapi/helper-plugin'; +import { CheckPagePermissions, NotFound } from '@strapi/helper-plugin'; import pluginId from '../../pluginId'; - +import pluginPermissions from '../../permissions'; import ProtectedRolesListPage from './ProtectedListPage'; import ProtectedRolesEditPage from './ProtectedEditPage'; import ProtectedRolesCreatePage from './ProtectedCreatePage'; const Roles = () => { return ( - - - - - - + + + + + + + + ); };