@strapi/admin 5.48.0 → 5.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin/src/StrapiApp.js +41 -25
- package/dist/admin/admin/src/StrapiApp.js.map +1 -1
- package/dist/admin/admin/src/StrapiApp.mjs +15 -7
- package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
- package/dist/admin/admin/src/components/ConfirmDialog.js +3 -2
- package/dist/admin/admin/src/components/ConfirmDialog.js.map +1 -1
- package/dist/admin/admin/src/components/Context.js +4 -3
- package/dist/admin/admin/src/components/Context.js.map +1 -1
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.js +8 -4
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.js.map +1 -1
- package/dist/admin/admin/src/components/Filters.js +3 -2
- package/dist/admin/admin/src/components/Filters.js.map +1 -1
- package/dist/admin/admin/src/components/Form.js +9 -5
- package/dist/admin/admin/src/components/Form.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.js +3 -2
- package/dist/admin/admin/src/components/FormInputs/Date.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Json.js +3 -2
- package/dist/admin/admin/src/components/FormInputs/Json.js.map +1 -1
- package/dist/admin/admin/src/components/GapDropZone.js +3 -2
- package/dist/admin/admin/src/components/GapDropZone.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Context.js +3 -2
- package/dist/admin/admin/src/components/GuidedTour/Context.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js +3 -2
- package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Tours.js +9 -3
- package/dist/admin/admin/src/components/GuidedTour/Tours.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Tours.mjs +6 -1
- package/dist/admin/admin/src/components/GuidedTour/Tours.mjs.map +1 -1
- package/dist/admin/admin/src/components/LanguageProvider.js +5 -1
- package/dist/admin/admin/src/components/LanguageProvider.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.js +3 -2
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.js.map +1 -1
- package/dist/admin/admin/src/components/LeftMenu.js +4 -3
- package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
- package/dist/admin/admin/src/components/LeftMenu.mjs +1 -1
- package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
- package/dist/admin/admin/src/components/NpsSurvey.js +4 -3
- package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.js +3 -2
- package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
- package/dist/admin/admin/src/components/Pagination.js +3 -2
- package/dist/admin/admin/src/components/Pagination.js.map +1 -1
- package/dist/admin/admin/src/components/PluginsInitializer.js +3 -2
- package/dist/admin/admin/src/components/PluginsInitializer.js.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.js +3 -2
- package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
- package/dist/admin/admin/src/components/ResizeIndicator.js +3 -2
- package/dist/admin/admin/src/components/ResizeIndicator.js.map +1 -1
- package/dist/admin/admin/src/components/SearchInput.js +3 -2
- package/dist/admin/admin/src/components/SearchInput.js.map +1 -1
- package/dist/admin/admin/src/components/Table.js +3 -2
- package/dist/admin/admin/src/components/Table.js.map +1 -1
- package/dist/admin/admin/src/components/Theme.js +3 -2
- package/dist/admin/admin/src/components/Theme.js.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.js +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.mjs +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.js +9 -5
- package/dist/admin/admin/src/components/WidgetRoot.js.map +1 -1
- package/dist/admin/admin/src/core/apis/CustomFields.js +14 -10
- package/dist/admin/admin/src/core/apis/CustomFields.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.js +8 -4
- package/dist/admin/admin/src/core/apis/Widgets.js.map +1 -1
- package/dist/admin/admin/src/core/apis/router.js +20 -16
- package/dist/admin/admin/src/core/apis/router.js.map +1 -1
- package/dist/admin/admin/src/core/apis/router.mjs.map +1 -1
- package/dist/admin/admin/src/features/Auth.js +78 -6
- package/dist/admin/admin/src/features/Auth.js.map +1 -1
- package/dist/admin/admin/src/features/Auth.mjs +77 -6
- package/dist/admin/admin/src/features/Auth.mjs.map +1 -1
- package/dist/admin/admin/src/features/BackButton.js +3 -2
- package/dist/admin/admin/src/features/BackButton.js.map +1 -1
- package/dist/admin/admin/src/features/Configuration.js +3 -2
- package/dist/admin/admin/src/features/Configuration.js.map +1 -1
- package/dist/admin/admin/src/features/Notifications.js +3 -2
- package/dist/admin/admin/src/features/Notifications.js.map +1 -1
- package/dist/admin/admin/src/features/Tracking.js +7 -3
- package/dist/admin/admin/src/features/Tracking.js.map +1 -1
- package/dist/admin/admin/src/features/Widgets.js +3 -2
- package/dist/admin/admin/src/features/Widgets.js.map +1 -1
- package/dist/admin/admin/src/hooks/useAPIErrorHandler.js +3 -2
- package/dist/admin/admin/src/hooks/useAPIErrorHandler.js.map +1 -1
- package/dist/admin/admin/src/hooks/useAdminRoles.js +3 -2
- package/dist/admin/admin/src/hooks/useAdminRoles.js.map +1 -1
- package/dist/admin/admin/src/hooks/useControllableState.js +3 -2
- package/dist/admin/admin/src/hooks/useControllableState.js.map +1 -1
- package/dist/admin/admin/src/hooks/useDebounce.js +3 -2
- package/dist/admin/admin/src/hooks/useDebounce.js.map +1 -1
- package/dist/admin/admin/src/hooks/useDeviceType.js +3 -2
- package/dist/admin/admin/src/hooks/useDeviceType.js.map +1 -1
- package/dist/admin/admin/src/hooks/useElementOnScreen.js +3 -2
- package/dist/admin/admin/src/hooks/useElementOnScreen.js.map +1 -1
- package/dist/admin/admin/src/hooks/useEnterprise.js +3 -2
- package/dist/admin/admin/src/hooks/useEnterprise.js.map +1 -1
- package/dist/admin/admin/src/hooks/useFetchClient.js +3 -2
- package/dist/admin/admin/src/hooks/useFetchClient.js.map +1 -1
- package/dist/admin/admin/src/hooks/useForceUpdate.js +3 -2
- package/dist/admin/admin/src/hooks/useForceUpdate.js.map +1 -1
- package/dist/admin/admin/src/hooks/useIdleSessionLogout.js +85 -15
- package/dist/admin/admin/src/hooks/useIdleSessionLogout.js.map +1 -1
- package/dist/admin/admin/src/hooks/useIdleSessionLogout.mjs +82 -14
- package/dist/admin/admin/src/hooks/useIdleSessionLogout.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useIsMounted.js +3 -2
- package/dist/admin/admin/src/hooks/useIsMounted.js.map +1 -1
- package/dist/admin/admin/src/hooks/useMediaQuery.js +3 -2
- package/dist/admin/admin/src/hooks/useMediaQuery.js.map +1 -1
- package/dist/admin/admin/src/hooks/useMenu.js +47 -8
- package/dist/admin/admin/src/hooks/useMenu.js.map +1 -1
- package/dist/admin/admin/src/hooks/useMenu.mjs +40 -6
- package/dist/admin/admin/src/hooks/useMenu.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useOnce.js +3 -2
- package/dist/admin/admin/src/hooks/useOnce.js.map +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.js +7 -3
- package/dist/admin/admin/src/hooks/useRBAC.js.map +1 -1
- package/dist/admin/admin/src/hooks/useSettingsMenu.js +68 -4
- package/dist/admin/admin/src/hooks/useSettingsMenu.js.map +1 -1
- package/dist/admin/admin/src/hooks/useSettingsMenu.mjs +61 -2
- package/dist/admin/admin/src/hooks/useSettingsMenu.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useThrottledCallback.js +5 -1
- package/dist/admin/admin/src/hooks/useThrottledCallback.js.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +11 -5
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/ForgotPassword.js +3 -2
- package/dist/admin/admin/src/pages/Auth/components/ForgotPassword.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.js +8 -4
- package/dist/admin/admin/src/pages/Auth/components/Login.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Oops.js +3 -2
- package/dist/admin/admin/src/pages/Auth/components/Oops.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.js +9 -5
- package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js +4 -3
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.js +9 -4
- package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.mjs +6 -2
- package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js +8 -4
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js +8 -4
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js +7 -3
- package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js.map +1 -1
- package/dist/admin/admin/src/pages/ProfilePage.js +8 -4
- package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +3 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +3 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.js +3 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/constants.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/utils/getDateOfExpiration.js +3 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/utils/getDateOfExpiration.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/EditView/components/AdminPermissions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/AdminTokens/ListView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js +7 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js +5 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.js +6 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +5 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +2 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js +7 -3
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +10 -6
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js +13 -7
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +15 -9
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js +9 -5
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js +33 -25
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js +10 -6
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/difference.js +9 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/difference.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.js +8 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/layouts.js +6 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/layouts.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateConditionsToFalse.js +8 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/updateConditionsToFalse.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js +9 -5
- package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/CreateActionCE.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/CreateActionCE.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/utils/validation.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Users/utils/validation.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js +3 -2
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js.map +1 -1
- package/dist/admin/admin/src/pages/UseCasePage.js +3 -2
- package/dist/admin/admin/src/pages/UseCasePage.js.map +1 -1
- package/dist/admin/admin/src/translations/ar.json.js +1 -1
- package/dist/admin/admin/src/translations/ar.json.mjs +1 -1
- package/dist/admin/admin/src/translations/cs.json.js +1 -1
- package/dist/admin/admin/src/translations/cs.json.mjs +1 -1
- package/dist/admin/admin/src/translations/de.json.js +1 -1
- package/dist/admin/admin/src/translations/de.json.mjs +1 -1
- package/dist/admin/admin/src/translations/en.json.js +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +1 -1
- package/dist/admin/admin/src/translations/es.json.js +1 -1
- package/dist/admin/admin/src/translations/es.json.mjs +1 -1
- package/dist/admin/admin/src/translations/fi.json.js +1 -1
- package/dist/admin/admin/src/translations/fi.json.mjs +1 -1
- package/dist/admin/admin/src/translations/fr.json.js +1 -1
- package/dist/admin/admin/src/translations/fr.json.mjs +1 -1
- package/dist/admin/admin/src/translations/it.json.js +1 -1
- package/dist/admin/admin/src/translations/it.json.mjs +1 -1
- package/dist/admin/admin/src/translations/ko.json.js +1 -1
- package/dist/admin/admin/src/translations/ko.json.mjs +1 -1
- package/dist/admin/admin/src/translations/nl.json.js +1 -1
- package/dist/admin/admin/src/translations/nl.json.mjs +1 -1
- package/dist/admin/admin/src/translations/pl.json.js +1 -1
- package/dist/admin/admin/src/translations/pl.json.mjs +1 -1
- package/dist/admin/admin/src/translations/ru.json.js +1 -1
- package/dist/admin/admin/src/translations/ru.json.mjs +1 -1
- package/dist/admin/admin/src/translations/tr.json.js +1 -1
- package/dist/admin/admin/src/translations/tr.json.mjs +1 -1
- package/dist/admin/admin/src/translations/uk.json.js +1 -1
- package/dist/admin/admin/src/translations/uk.json.mjs +1 -1
- package/dist/admin/admin/src/translations/vi.json.js +1 -1
- package/dist/admin/admin/src/translations/vi.json.mjs +1 -1
- package/dist/admin/admin/src/translations/zh-Hans.json.js +1 -1
- package/dist/admin/admin/src/translations/zh-Hans.json.mjs +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +7 -2
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/locales.js +3 -2
- package/dist/admin/admin/src/utils/locales.js.map +1 -1
- package/dist/admin/admin/src/utils/objects.js +9 -4
- package/dist/admin/admin/src/utils/objects.js.map +1 -1
- package/dist/admin/admin/src/utils/rulesEngine.js +5 -1
- package/dist/admin/admin/src/utils/rulesEngine.js.map +1 -1
- package/dist/admin/admin/src/utils/urls.js +5 -1
- package/dist/admin/admin/src/utils/urls.js.map +1 -1
- package/dist/admin/admin/src/utils/widgetVisibility.js +25 -0
- package/dist/admin/admin/src/utils/widgetVisibility.js.map +1 -0
- package/dist/admin/admin/src/utils/widgetVisibility.mjs +22 -0
- package/dist/admin/admin/src/utils/widgetVisibility.mjs.map +1 -0
- package/dist/admin/admin/tests/utils.js +3 -2
- package/dist/admin/admin/tests/utils.js.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js +7 -3
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useLicenseLimits.js +3 -2
- package/dist/admin/ee/admin/src/hooks/useLicenseLimits.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthResponse.js +3 -2
- package/dist/admin/ee/admin/src/pages/AuthResponse.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js +6 -4
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs +6 -4
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.js +3 -2
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useAuditLogsData.js +3 -2
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useAuditLogsData.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useFormatTimeStamp.js +5 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useFormatTimeStamp.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +3 -2
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.js +7 -3
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/CreateActionEE.js.map +1 -1
- package/dist/admin/src/StrapiApp.d.ts +7 -1
- package/dist/admin/src/core/apis/router.d.ts +1 -2
- package/dist/admin/src/hooks/useIdleSessionLogout.d.ts +66 -12
- package/dist/admin/src/hooks/useMenu.d.ts +2 -1
- package/dist/admin/src/hooks/useSettingsMenu.d.ts +2 -1
- package/dist/admin/src/utils/widgetVisibility.d.ts +18 -0
- package/dist/ee/server/src/controllers/user.d.ts.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +5 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication.js +5 -1
- package/dist/server/ee/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/ee/server/src/controllers/user.js +12 -7
- package/dist/server/ee/server/src/controllers/user.js.map +1 -1
- package/dist/server/ee/server/src/controllers/user.mjs +7 -6
- package/dist/server/ee/server/src/controllers/user.mjs.map +1 -1
- package/dist/server/ee/server/src/services/auth.js +5 -1
- package/dist/server/ee/server/src/services/auth.js.map +1 -1
- package/dist/server/ee/server/src/services/user.js +8 -4
- package/dist/server/ee/server/src/services/user.js.map +1 -1
- package/dist/server/index.js +6 -2
- package/dist/server/index.js.map +1 -1
- package/dist/server/server/src/ai/services/ai.js +10 -4
- package/dist/server/server/src/ai/services/ai.js.map +1 -1
- package/dist/server/server/src/controllers/admin.js +9 -4
- package/dist/server/server/src/controllers/admin.js.map +1 -1
- package/dist/server/server/src/controllers/authenticated-user.js +25 -4
- package/dist/server/server/src/controllers/authenticated-user.js.map +1 -1
- package/dist/server/server/src/controllers/authenticated-user.mjs +25 -4
- package/dist/server/server/src/controllers/authenticated-user.mjs.map +1 -1
- package/dist/server/server/src/controllers/authentication.js +8 -18
- package/dist/server/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/server/src/controllers/authentication.mjs +1 -16
- package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
- package/dist/server/server/src/controllers/user.js +9 -7
- package/dist/server/server/src/controllers/user.js.map +1 -1
- package/dist/server/server/src/controllers/user.mjs +6 -5
- package/dist/server/server/src/controllers/user.mjs.map +1 -1
- package/dist/server/server/src/controllers/webhooks.js +7 -2
- package/dist/server/server/src/controllers/webhooks.js.map +1 -1
- package/dist/server/server/src/middlewares/rateLimit.js +7 -2
- package/dist/server/server/src/middlewares/rateLimit.js.map +1 -1
- package/dist/server/server/src/policies/hasPermissions.js +7 -3
- package/dist/server/server/src/policies/hasPermissions.js.map +1 -1
- package/dist/server/server/src/routes/authentication.js +4 -1
- package/dist/server/server/src/routes/authentication.js.map +1 -1
- package/dist/server/server/src/routes/authentication.mjs +4 -1
- package/dist/server/server/src/routes/authentication.mjs.map +1 -1
- package/dist/server/server/src/routes/serve-admin-panel.js +8 -3
- package/dist/server/server/src/routes/serve-admin-panel.js.map +1 -1
- package/dist/server/server/src/services/api-token.js +7 -3
- package/dist/server/server/src/services/api-token.js.map +1 -1
- package/dist/server/server/src/services/auth.js +8 -3
- package/dist/server/server/src/services/auth.js.map +1 -1
- package/dist/server/server/src/services/content-type.js +6 -2
- package/dist/server/server/src/services/content-type.js.map +1 -1
- package/dist/server/server/src/services/encryption.js +8 -4
- package/dist/server/server/src/services/encryption.js.map +1 -1
- package/dist/server/server/src/services/passport.js +6 -2
- package/dist/server/server/src/services/passport.js.map +1 -1
- package/dist/server/server/src/services/permission/engine.js +5 -1
- package/dist/server/server/src/services/permission/engine.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/index.js +5 -1
- package/dist/server/server/src/services/permission/permissions-manager/index.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js +20 -11
- package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs +21 -12
- package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/query-builders.js +14 -10
- package/dist/server/server/src/services/permission/permissions-manager/query-builders.js.map +1 -1
- package/dist/server/server/src/services/permission/queries.js +5 -1
- package/dist/server/server/src/services/permission/queries.js.map +1 -1
- package/dist/server/server/src/services/project-settings.js +6 -2
- package/dist/server/server/src/services/project-settings.js.map +1 -1
- package/dist/server/server/src/services/role.js +8 -4
- package/dist/server/server/src/services/role.js.map +1 -1
- package/dist/server/server/src/services/token.js +7 -2
- package/dist/server/server/src/services/token.js.map +1 -1
- package/dist/server/server/src/services/transfer/permission.js +5 -1
- package/dist/server/server/src/services/transfer/permission.js.map +1 -1
- package/dist/server/server/src/services/transfer/token.js +10 -5
- package/dist/server/server/src/services/transfer/token.js.map +1 -1
- package/dist/server/server/src/services/user.js +50 -9
- package/dist/server/server/src/services/user.js.map +1 -1
- package/dist/server/server/src/services/user.mjs +40 -3
- package/dist/server/server/src/services/user.mjs.map +1 -1
- package/dist/server/server/src/utils/normalize-email.js +24 -0
- package/dist/server/server/src/utils/normalize-email.js.map +1 -0
- package/dist/server/server/src/utils/normalize-email.mjs +22 -0
- package/dist/server/server/src/utils/normalize-email.mjs.map +1 -0
- package/dist/server/server/src/validation/common-functions/check-fields-are-correctly-nested.js +5 -1
- package/dist/server/server/src/validation/common-functions/check-fields-are-correctly-nested.js.map +1 -1
- package/dist/server/server/src/validation/common-functions/check-fields-dont-have-duplicates.js +6 -2
- package/dist/server/server/src/validation/common-functions/check-fields-dont-have-duplicates.js.map +1 -1
- package/dist/server/server/src/validation/common-validators.js +6 -2
- package/dist/server/server/src/validation/common-validators.js.map +1 -1
- package/dist/server/server/src/validation/policies/hasPermissions.js +6 -2
- package/dist/server/server/src/validation/policies/hasPermissions.js.map +1 -1
- package/dist/server/shared/utils/session-auth.js +5 -1
- package/dist/server/shared/utils/session-auth.js.map +1 -1
- package/dist/server/src/controllers/authenticated-user.d.ts.map +1 -1
- package/dist/server/src/controllers/authentication.d.ts.map +1 -1
- package/dist/server/src/controllers/user.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +1 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/routes/authentication.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +1 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts.map +1 -1
- package/dist/server/src/services/user.d.ts +1 -0
- package/dist/server/src/services/user.d.ts.map +1 -1
- package/dist/server/src/utils/normalize-email.d.ts +12 -0
- package/dist/server/src/utils/normalize-email.d.ts.map +1 -0
- package/package.json +11 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMenu.js","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n target?: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean) => {\n const checkUserHasPermissions = useAuth('useMenu', (state) => state.checkUserHasPermissions);\n const menu = useStrapiApp('useMenu', (state) => state.menu);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: 'https://market.strapi.io',\n target: '_blank',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: authorizedPluginSectionLinks,\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionRawLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionRawLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinksPermissions = await Promise.all(\n pluginsSectionRawLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginsSectionRawLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nexport { useMenu };\n"],"names":["useMenu","shouldUpdateStrapi","checkUserHasPermissions","useAuth","state","menu","useStrapiApp","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","React","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","target","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinksPermissions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useMenu.js","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n target?: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean) => {\n const checkUserHasPermissions = useAuth('useMenu', (state) => state.checkUserHasPermissions);\n const rawMenu = useStrapiApp('useMenu', (state) => state.menu);\n const menu = React.useMemo(() => normalizeMenuLinks(rawMenu), [rawMenu]);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: 'https://market.strapi.io',\n target: '_blank',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: authorizedPluginSectionLinks,\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinks = normalizeMenuLinks(generalSectionRawLinks);\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinks = normalizeMenuLinks(pluginsSectionRawLinks);\n const pluginSectionLinksPermissions = await Promise.all(\n pluginSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginSectionLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nconst normalizeMenuLinks = (links: unknown): MenuItem[] => {\n if (!Array.isArray(links)) {\n return [];\n }\n\n const isValidIcon = (icon: unknown) => {\n if (typeof icon === 'string' || typeof icon === 'function' || React.isValidElement(icon)) {\n return true;\n }\n\n if (!icon || typeof icon !== 'object') {\n return false;\n }\n\n const reactType = (icon as { $$typeof?: symbol }).$$typeof;\n\n return (\n reactType === Symbol.for('react.forward_ref') ||\n reactType === Symbol.for('react.memo') ||\n reactType === Symbol.for('react.lazy')\n );\n };\n\n return links.reduce<MenuItem[]>((acc, link) => {\n if (!link || typeof link !== 'object') {\n return acc;\n }\n\n const candidate = link as Partial<MenuItem>;\n\n if (\n typeof candidate.to !== 'string' ||\n !isValidIcon(candidate.icon) ||\n typeof candidate.intlLabel?.id !== 'string' ||\n typeof candidate.intlLabel.defaultMessage !== 'string'\n ) {\n return acc;\n }\n\n acc.push({\n ...candidate,\n permissions: Array.isArray(candidate.permissions) ? candidate.permissions : [],\n } as MenuItem);\n\n return acc;\n }, []);\n};\n\nexport { useMenu, normalizeMenuLinks };\n"],"names":["useMenu","shouldUpdateStrapi","checkUserHasPermissions","useAuth","state","rawMenu","useStrapiApp","menu","React","useMemo","normalizeMenuLinks","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","target","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinks","pluginSectionLinksPermissions","links","Array","isArray","isValidIcon","isValidElement","reactType","$$typeof","Symbol","for","reduce","acc","link","candidate","push"],"mappings":"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"}
|
|
@@ -7,7 +7,10 @@ import { useStrapiApp } from '../features/StrapiApp.mjs';
|
|
|
7
7
|
|
|
8
8
|
const useMenu = (shouldUpdateStrapi)=>{
|
|
9
9
|
const checkUserHasPermissions = useAuth('useMenu', (state)=>state.checkUserHasPermissions);
|
|
10
|
-
const
|
|
10
|
+
const rawMenu = useStrapiApp('useMenu', (state)=>state.menu);
|
|
11
|
+
const menu = React.useMemo(()=>normalizeMenuLinks(rawMenu), [
|
|
12
|
+
rawMenu
|
|
13
|
+
]);
|
|
11
14
|
const permissions = useTypedSelector((state)=>state.admin_app.permissions);
|
|
12
15
|
const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState({
|
|
13
16
|
generalSectionLinks: [
|
|
@@ -94,8 +97,9 @@ const useMenu = (shouldUpdateStrapi)=>{
|
|
|
94
97
|
/* -------------------------------------------------------------------------------------------------
|
|
95
98
|
* Utils
|
|
96
99
|
* -----------------------------------------------------------------------------------------------*/ const getGeneralLinks = async (generalSectionRawLinks, shouldUpdateStrapi = false, checkUserHasPermissions)=>{
|
|
97
|
-
const
|
|
98
|
-
const
|
|
100
|
+
const generalSectionLinks = normalizeMenuLinks(generalSectionRawLinks);
|
|
101
|
+
const generalSectionLinksPermissions = await Promise.all(generalSectionLinks.map(({ permissions })=>checkUserHasPermissions(permissions)));
|
|
102
|
+
const authorizedGeneralSectionLinks = generalSectionLinks.filter((_, index)=>generalSectionLinksPermissions[index].length > 0);
|
|
99
103
|
const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex((obj)=>obj.to === '/settings');
|
|
100
104
|
if (settingsLinkIndex === -1) {
|
|
101
105
|
return [];
|
|
@@ -105,10 +109,40 @@ const useMenu = (shouldUpdateStrapi)=>{
|
|
|
105
109
|
return authorizedGeneralLinksClone;
|
|
106
110
|
};
|
|
107
111
|
const getPluginSectionLinks = async (pluginsSectionRawLinks, checkUserHasPermissions)=>{
|
|
108
|
-
const
|
|
109
|
-
const
|
|
112
|
+
const pluginSectionLinks = normalizeMenuLinks(pluginsSectionRawLinks);
|
|
113
|
+
const pluginSectionLinksPermissions = await Promise.all(pluginSectionLinks.map(({ permissions })=>checkUserHasPermissions(permissions)));
|
|
114
|
+
const authorizedPluginSectionLinks = pluginSectionLinks.filter((_, index)=>pluginSectionLinksPermissions[index].length > 0);
|
|
110
115
|
return authorizedPluginSectionLinks;
|
|
111
116
|
};
|
|
117
|
+
const normalizeMenuLinks = (links)=>{
|
|
118
|
+
if (!Array.isArray(links)) {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
const isValidIcon = (icon)=>{
|
|
122
|
+
if (typeof icon === 'string' || typeof icon === 'function' || React.isValidElement(icon)) {
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
if (!icon || typeof icon !== 'object') {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
const reactType = icon.$$typeof;
|
|
129
|
+
return reactType === Symbol.for('react.forward_ref') || reactType === Symbol.for('react.memo') || reactType === Symbol.for('react.lazy');
|
|
130
|
+
};
|
|
131
|
+
return links.reduce((acc, link)=>{
|
|
132
|
+
if (!link || typeof link !== 'object') {
|
|
133
|
+
return acc;
|
|
134
|
+
}
|
|
135
|
+
const candidate = link;
|
|
136
|
+
if (typeof candidate.to !== 'string' || !isValidIcon(candidate.icon) || typeof candidate.intlLabel?.id !== 'string' || typeof candidate.intlLabel.defaultMessage !== 'string') {
|
|
137
|
+
return acc;
|
|
138
|
+
}
|
|
139
|
+
acc.push({
|
|
140
|
+
...candidate,
|
|
141
|
+
permissions: Array.isArray(candidate.permissions) ? candidate.permissions : []
|
|
142
|
+
});
|
|
143
|
+
return acc;
|
|
144
|
+
}, []);
|
|
145
|
+
};
|
|
112
146
|
|
|
113
|
-
export { useMenu };
|
|
147
|
+
export { normalizeMenuLinks, useMenu };
|
|
114
148
|
//# sourceMappingURL=useMenu.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMenu.mjs","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n target?: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean) => {\n const checkUserHasPermissions = useAuth('useMenu', (state) => state.checkUserHasPermissions);\n const menu = useStrapiApp('useMenu', (state) => state.menu);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: 'https://market.strapi.io',\n target: '_blank',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: authorizedPluginSectionLinks,\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionRawLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionRawLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinksPermissions = await Promise.all(\n pluginsSectionRawLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginsSectionRawLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nexport { useMenu };\n"],"names":["useMenu","shouldUpdateStrapi","checkUserHasPermissions","useAuth","state","menu","useStrapiApp","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","React","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","target","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinksPermissions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useMenu.mjs","sources":["../../../../../admin/src/hooks/useMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { Cog, ShoppingCart, House } from '@strapi/icons';\nimport cloneDeep from 'lodash/cloneDeep';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { useAuth, AuthContextValue } from '../features/Auth';\nimport { StrapiAppContextValue, useStrapiApp } from '../features/StrapiApp';\n\n/* -------------------------------------------------------------------------------------------------\n * useMenu\n * -----------------------------------------------------------------------------------------------*/\n\nexport type MenuItem = Omit<StrapiAppContextValue['menu'][number], 'Component'> & {\n navigationLink?: string;\n};\nexport type MobileMenuItem = {\n to: string;\n target?: string;\n link?: string;\n};\n\nexport interface Menu {\n generalSectionLinks: MenuItem[];\n pluginsSectionLinks: MenuItem[];\n topMobileNavigation: MobileMenuItem[];\n burgerMobileNavigation: MobileMenuItem[];\n isLoading: boolean;\n}\n\nconst useMenu = (shouldUpdateStrapi: boolean) => {\n const checkUserHasPermissions = useAuth('useMenu', (state) => state.checkUserHasPermissions);\n const rawMenu = useStrapiApp('useMenu', (state) => state.menu);\n const menu = React.useMemo(() => normalizeMenuLinks(rawMenu), [rawMenu]);\n const permissions = useTypedSelector((state) => state.admin_app.permissions);\n const [menuWithUserPermissions, setMenuWithUserPermissions] = React.useState<Menu>({\n generalSectionLinks: [\n {\n icon: House,\n intlLabel: {\n id: 'global.home',\n defaultMessage: 'Home',\n },\n to: '/',\n permissions: [],\n position: 0,\n },\n {\n icon: ShoppingCart,\n intlLabel: {\n id: 'global.marketplace',\n defaultMessage: 'Marketplace',\n },\n to: 'https://market.strapi.io',\n target: '_blank',\n permissions: permissions.marketplace?.main ?? [],\n position: 7,\n },\n {\n icon: Cog,\n intlLabel: {\n id: 'global.settings',\n defaultMessage: 'Settings',\n },\n to: '/settings',\n // Permissions of this link are retrieved in the init phase\n // using the settings menu\n permissions: [],\n notificationsCount: 0,\n position: 9,\n },\n ],\n pluginsSectionLinks: [],\n topMobileNavigation: [\n {\n to: '/',\n },\n {\n to: 'content-manager',\n },\n {\n to: 'plugins/content-releases',\n },\n {\n to: 'plugins/upload',\n },\n ],\n burgerMobileNavigation: [\n {\n to: '/settings',\n },\n ],\n isLoading: true,\n });\n const generalSectionLinksRef = React.useRef(menuWithUserPermissions.generalSectionLinks);\n\n React.useEffect(() => {\n async function applyMenuPermissions() {\n const authorizedPluginSectionLinks = await getPluginSectionLinks(\n menu,\n checkUserHasPermissions\n );\n\n const authorizedGeneralSectionLinks = await getGeneralLinks(\n generalSectionLinksRef.current,\n shouldUpdateStrapi,\n checkUserHasPermissions\n );\n\n setMenuWithUserPermissions((state) => ({\n ...state,\n generalSectionLinks: authorizedGeneralSectionLinks,\n pluginsSectionLinks: authorizedPluginSectionLinks,\n isLoading: false,\n }));\n }\n\n applyMenuPermissions();\n }, [\n setMenuWithUserPermissions,\n generalSectionLinksRef,\n menu,\n permissions,\n shouldUpdateStrapi,\n checkUserHasPermissions,\n ]);\n\n return menuWithUserPermissions;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Utils\n * -----------------------------------------------------------------------------------------------*/\n\nconst getGeneralLinks = async (\n generalSectionRawLinks: MenuItem[],\n shouldUpdateStrapi: boolean = false,\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const generalSectionLinks = normalizeMenuLinks(generalSectionRawLinks);\n const generalSectionLinksPermissions = await Promise.all(\n generalSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedGeneralSectionLinks = generalSectionLinks.filter(\n (_, index) => generalSectionLinksPermissions[index].length > 0\n );\n\n const settingsLinkIndex = authorizedGeneralSectionLinks.findIndex(\n (obj) => obj.to === '/settings'\n );\n\n if (settingsLinkIndex === -1) {\n return [];\n }\n\n const authorizedGeneralLinksClone = cloneDeep(authorizedGeneralSectionLinks);\n\n authorizedGeneralLinksClone[settingsLinkIndex].notificationsCount = shouldUpdateStrapi ? 1 : 0;\n\n return authorizedGeneralLinksClone;\n};\n\nconst getPluginSectionLinks = async (\n pluginsSectionRawLinks: MenuItem[],\n checkUserHasPermissions: AuthContextValue['checkUserHasPermissions']\n) => {\n const pluginSectionLinks = normalizeMenuLinks(pluginsSectionRawLinks);\n const pluginSectionLinksPermissions = await Promise.all(\n pluginSectionLinks.map(({ permissions }) => checkUserHasPermissions(permissions))\n );\n\n const authorizedPluginSectionLinks = pluginSectionLinks.filter(\n (_, index) => pluginSectionLinksPermissions[index].length > 0\n );\n\n return authorizedPluginSectionLinks;\n};\n\nconst normalizeMenuLinks = (links: unknown): MenuItem[] => {\n if (!Array.isArray(links)) {\n return [];\n }\n\n const isValidIcon = (icon: unknown) => {\n if (typeof icon === 'string' || typeof icon === 'function' || React.isValidElement(icon)) {\n return true;\n }\n\n if (!icon || typeof icon !== 'object') {\n return false;\n }\n\n const reactType = (icon as { $$typeof?: symbol }).$$typeof;\n\n return (\n reactType === Symbol.for('react.forward_ref') ||\n reactType === Symbol.for('react.memo') ||\n reactType === Symbol.for('react.lazy')\n );\n };\n\n return links.reduce<MenuItem[]>((acc, link) => {\n if (!link || typeof link !== 'object') {\n return acc;\n }\n\n const candidate = link as Partial<MenuItem>;\n\n if (\n typeof candidate.to !== 'string' ||\n !isValidIcon(candidate.icon) ||\n typeof candidate.intlLabel?.id !== 'string' ||\n typeof candidate.intlLabel.defaultMessage !== 'string'\n ) {\n return acc;\n }\n\n acc.push({\n ...candidate,\n permissions: Array.isArray(candidate.permissions) ? candidate.permissions : [],\n } as MenuItem);\n\n return acc;\n }, []);\n};\n\nexport { useMenu, normalizeMenuLinks };\n"],"names":["useMenu","shouldUpdateStrapi","checkUserHasPermissions","useAuth","state","rawMenu","useStrapiApp","menu","React","useMemo","normalizeMenuLinks","permissions","useTypedSelector","admin_app","menuWithUserPermissions","setMenuWithUserPermissions","useState","generalSectionLinks","icon","House","intlLabel","id","defaultMessage","to","position","ShoppingCart","target","marketplace","main","Cog","notificationsCount","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isLoading","generalSectionLinksRef","useRef","useEffect","applyMenuPermissions","authorizedPluginSectionLinks","getPluginSectionLinks","authorizedGeneralSectionLinks","getGeneralLinks","current","generalSectionRawLinks","generalSectionLinksPermissions","Promise","all","map","filter","_","index","length","settingsLinkIndex","findIndex","obj","authorizedGeneralLinksClone","cloneDeep","pluginsSectionRawLinks","pluginSectionLinks","pluginSectionLinksPermissions","links","Array","isArray","isValidIcon","isValidElement","reactType","$$typeof","Symbol","for","reduce","acc","link","candidate","push"],"mappings":";;;;;;;AA8BA,MAAMA,UAAU,CAACC,kBAAAA,GAAAA;AACf,IAAA,MAAMC,0BAA0BC,OAAAA,CAAQ,SAAA,EAAW,CAACC,KAAAA,GAAUA,MAAMF,uBAAuB,CAAA;AAC3F,IAAA,MAAMG,UAAUC,YAAAA,CAAa,SAAA,EAAW,CAACF,KAAAA,GAAUA,MAAMG,IAAI,CAAA;AAC7D,IAAA,MAAMA,OAAOC,KAAAA,CAAMC,OAAO,CAAC,IAAMC,mBAAmBL,OAAAA,CAAAA,EAAU;AAACA,QAAAA;AAAQ,KAAA,CAAA;AACvE,IAAA,MAAMM,cAAcC,gBAAAA,CAAiB,CAACR,QAAUA,KAAAA,CAAMS,SAAS,CAACF,WAAW,CAAA;AAC3E,IAAA,MAAM,CAACG,uBAAAA,EAAyBC,0BAAAA,CAA2B,GAAGP,KAAAA,CAAMQ,QAAQ,CAAO;QACjFC,mBAAAA,EAAqB;AACnB,YAAA;gBACEC,IAAAA,EAAMC,KAAAA;gBACNC,SAAAA,EAAW;oBACTC,EAAAA,EAAI,aAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;gBACAC,EAAAA,EAAI,GAAA;AACJZ,gBAAAA,WAAAA,EAAa,EAAE;gBACfa,QAAAA,EAAU;AACZ,aAAA;AACA,YAAA;gBACEN,IAAAA,EAAMO,YAAAA;gBACNL,SAAAA,EAAW;oBACTC,EAAAA,EAAI,oBAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;gBACAC,EAAAA,EAAI,0BAAA;gBACJG,MAAAA,EAAQ,QAAA;AACRf,gBAAAA,WAAAA,EAAaA,WAAAA,CAAYgB,WAAW,EAAEC,IAAAA,IAAQ,EAAE;gBAChDJ,QAAAA,EAAU;AACZ,aAAA;AACA,YAAA;gBACEN,IAAAA,EAAMW,GAAAA;gBACNT,SAAAA,EAAW;oBACTC,EAAAA,EAAI,iBAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;gBACAC,EAAAA,EAAI,WAAA;;;AAGJZ,gBAAAA,WAAAA,EAAa,EAAE;gBACfmB,kBAAAA,EAAoB,CAAA;gBACpBN,QAAAA,EAAU;AACZ;AACD,SAAA;AACDO,QAAAA,mBAAAA,EAAqB,EAAE;QACvBC,mBAAAA,EAAqB;AACnB,YAAA;gBACET,EAAAA,EAAI;AACN,aAAA;AACA,YAAA;gBACEA,EAAAA,EAAI;AACN,aAAA;AACA,YAAA;gBACEA,EAAAA,EAAI;AACN,aAAA;AACA,YAAA;gBACEA,EAAAA,EAAI;AACN;AACD,SAAA;QACDU,sBAAAA,EAAwB;AACtB,YAAA;gBACEV,EAAAA,EAAI;AACN;AACD,SAAA;QACDW,SAAAA,EAAW;AACb,KAAA,CAAA;AACA,IAAA,MAAMC,sBAAAA,GAAyB3B,KAAAA,CAAM4B,MAAM,CAACtB,wBAAwBG,mBAAmB,CAAA;AAEvFT,IAAAA,KAAAA,CAAM6B,SAAS,CAAC,IAAA;QACd,eAAeC,oBAAAA,GAAAA;YACb,MAAMC,4BAAAA,GAA+B,MAAMC,qBAAAA,CACzCjC,IAAAA,EACAL,uBAAAA,CAAAA;AAGF,YAAA,MAAMuC,gCAAgC,MAAMC,eAAAA,CAC1CP,sBAAAA,CAAuBQ,OAAO,EAC9B1C,kBAAAA,EACAC,uBAAAA,CAAAA;YAGFa,0BAAAA,CAA2B,CAACX,SAAW;AACrC,oBAAA,GAAGA,KAAK;oBACRa,mBAAAA,EAAqBwB,6BAAAA;oBACrBV,mBAAAA,EAAqBQ,4BAAAA;oBACrBL,SAAAA,EAAW;iBACb,CAAA,CAAA;AACF,QAAA;AAEAI,QAAAA,oBAAAA,EAAAA;IACF,CAAA,EAAG;AACDvB,QAAAA,0BAAAA;AACAoB,QAAAA,sBAAAA;AACA5B,QAAAA,IAAAA;AACAI,QAAAA,WAAAA;AACAV,QAAAA,kBAAAA;AACAC,QAAAA;AACD,KAAA,CAAA;IAED,OAAOY,uBAAAA;AACT;AAEA;;AAEkG,qGAElG,MAAM4B,eAAAA,GAAkB,OACtBE,sBAAAA,EACA3C,kBAAAA,GAA8B,KAAK,EACnCC,uBAAAA,GAAAA;AAEA,IAAA,MAAMe,sBAAsBP,kBAAAA,CAAmBkC,sBAAAA,CAAAA;AAC/C,IAAA,MAAMC,8BAAAA,GAAiC,MAAMC,OAAAA,CAAQC,GAAG,CACtD9B,mBAAAA,CAAoB+B,GAAG,CAAC,CAAC,EAAErC,WAAW,EAAE,GAAKT,uBAAAA,CAAwBS,WAAAA,CAAAA,CAAAA,CAAAA;AAGvE,IAAA,MAAM8B,6BAAAA,GAAgCxB,mBAAAA,CAAoBgC,MAAM,CAC9D,CAACC,CAAAA,EAAGC,KAAAA,GAAUN,8BAA8B,CAACM,KAAAA,CAAM,CAACC,MAAM,GAAG,CAAA,CAAA;IAG/D,MAAMC,iBAAAA,GAAoBZ,8BAA8Ba,SAAS,CAC/D,CAACC,GAAAA,GAAQA,GAAAA,CAAIhC,EAAE,KAAK,WAAA,CAAA;IAGtB,IAAI8B,iBAAAA,KAAsB,EAAC,EAAG;AAC5B,QAAA,OAAO,EAAE;AACX,IAAA;AAEA,IAAA,MAAMG,8BAA8BC,SAAAA,CAAUhB,6BAAAA,CAAAA;AAE9Ce,IAAAA,2BAA2B,CAACH,iBAAAA,CAAkB,CAACvB,kBAAkB,GAAG7B,qBAAqB,CAAA,GAAI,CAAA;IAE7F,OAAOuD,2BAAAA;AACT,CAAA;AAEA,MAAMhB,qBAAAA,GAAwB,OAC5BkB,sBAAAA,EACAxD,uBAAAA,GAAAA;AAEA,IAAA,MAAMyD,qBAAqBjD,kBAAAA,CAAmBgD,sBAAAA,CAAAA;AAC9C,IAAA,MAAME,6BAAAA,GAAgC,MAAMd,OAAAA,CAAQC,GAAG,CACrDY,kBAAAA,CAAmBX,GAAG,CAAC,CAAC,EAAErC,WAAW,EAAE,GAAKT,uBAAAA,CAAwBS,WAAAA,CAAAA,CAAAA,CAAAA;AAGtE,IAAA,MAAM4B,4BAAAA,GAA+BoB,kBAAAA,CAAmBV,MAAM,CAC5D,CAACC,CAAAA,EAAGC,KAAAA,GAAUS,6BAA6B,CAACT,KAAAA,CAAM,CAACC,MAAM,GAAG,CAAA,CAAA;IAG9D,OAAOb,4BAAAA;AACT,CAAA;AAEA,MAAM7B,qBAAqB,CAACmD,KAAAA,GAAAA;AAC1B,IAAA,IAAI,CAACC,KAAAA,CAAMC,OAAO,CAACF,KAAAA,CAAAA,EAAQ;AACzB,QAAA,OAAO,EAAE;AACX,IAAA;AAEA,IAAA,MAAMG,cAAc,CAAC9C,IAAAA,GAAAA;QACnB,IAAI,OAAOA,SAAS,QAAA,IAAY,OAAOA,SAAS,UAAA,IAAcV,KAAAA,CAAMyD,cAAc,CAAC/C,IAAAA,CAAAA,EAAO;YACxF,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,IAAI,CAACA,IAAAA,IAAQ,OAAOA,IAAAA,KAAS,QAAA,EAAU;YACrC,OAAO,KAAA;AACT,QAAA;QAEA,MAAMgD,SAAAA,GAAY,IAAChD,CAA+BiD,QAAQ;AAE1D,QAAA,OACED,SAAAA,KAAcE,MAAAA,CAAOC,GAAG,CAAC,mBAAA,CAAA,IACzBH,SAAAA,KAAcE,MAAAA,CAAOC,GAAG,CAAC,YAAA,CAAA,IACzBH,SAAAA,KAAcE,MAAAA,CAAOC,GAAG,CAAC,YAAA,CAAA;AAE7B,IAAA,CAAA;AAEA,IAAA,OAAOR,KAAAA,CAAMS,MAAM,CAAa,CAACC,GAAAA,EAAKC,IAAAA,GAAAA;AACpC,QAAA,IAAI,CAACA,IAAAA,IAAQ,OAAOA,IAAAA,KAAS,QAAA,EAAU;YACrC,OAAOD,GAAAA;AACT,QAAA;AAEA,QAAA,MAAME,SAAAA,GAAYD,IAAAA;QAElB,IACE,OAAOC,UAAUlD,EAAE,KAAK,YACxB,CAACyC,WAAAA,CAAYS,SAAAA,CAAUvD,IAAI,CAAA,IAC3B,OAAOuD,UAAUrD,SAAS,EAAEC,OAAO,QAAA,IACnC,OAAOoD,UAAUrD,SAAS,CAACE,cAAc,KAAK,QAAA,EAC9C;YACA,OAAOiD,GAAAA;AACT,QAAA;AAEAA,QAAAA,GAAAA,CAAIG,IAAI,CAAC;AACP,YAAA,GAAGD,SAAS;YACZ9D,WAAAA,EAAamD,KAAAA,CAAMC,OAAO,CAACU,SAAAA,CAAU9D,WAAW,CAAA,GAAI8D,SAAAA,CAAU9D,WAAW,GAAG;AAC9E,SAAA,CAAA;QAEA,OAAO4D,GAAAA;AACT,IAAA,CAAA,EAAG,EAAE,CAAA;AACP;;;;"}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
var React = require('react');
|
|
4
4
|
|
|
5
|
-
function
|
|
5
|
+
function _interopNamespace(e) {
|
|
6
|
+
if (e && e.__esModule) return e;
|
|
6
7
|
var n = Object.create(null);
|
|
7
8
|
if (e) {
|
|
8
9
|
Object.keys(e).forEach(function (k) {
|
|
@@ -19,7 +20,7 @@ function _interopNamespaceDefault(e) {
|
|
|
19
20
|
return Object.freeze(n);
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
var React__namespace = /*#__PURE__*/
|
|
23
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
23
24
|
|
|
24
25
|
const useOnce = (effect)=>React__namespace.useEffect(effect, emptyDeps);
|
|
25
26
|
const emptyDeps = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useOnce.js","sources":["../../../../../admin/src/hooks/useOnce.ts"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport * as React from 'react';\n\nexport const useOnce = (effect: React.EffectCallback) => React.useEffect(effect, emptyDeps);\n\nconst emptyDeps: React.DependencyList = [];\n"],"names":["useOnce","effect","React","useEffect","emptyDeps"],"mappings":"
|
|
1
|
+
{"version":3,"file":"useOnce.js","sources":["../../../../../admin/src/hooks/useOnce.ts"],"sourcesContent":["/* eslint-disable react-hooks/exhaustive-deps */\nimport * as React from 'react';\n\nexport const useOnce = (effect: React.EffectCallback) => React.useEffect(effect, emptyDeps);\n\nconst emptyDeps: React.DependencyList = [];\n"],"names":["useOnce","effect","React","useEffect","emptyDeps"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGO,MAAMA,UAAU,CAACC,MAAAA,GAAiCC,iBAAMC,SAAS,CAACF,QAAQG,SAAAA;AAEjF,MAAMA,YAAkC,EAAE;;;;"}
|
|
@@ -7,7 +7,10 @@ var once = require('../utils/once.js');
|
|
|
7
7
|
var strings = require('../utils/strings.js');
|
|
8
8
|
var usePrev = require('./usePrev.js');
|
|
9
9
|
|
|
10
|
-
function
|
|
10
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
|
+
|
|
12
|
+
function _interopNamespace(e) {
|
|
13
|
+
if (e && e.__esModule) return e;
|
|
11
14
|
var n = Object.create(null);
|
|
12
15
|
if (e) {
|
|
13
16
|
Object.keys(e).forEach(function (k) {
|
|
@@ -24,7 +27,8 @@ function _interopNamespaceDefault(e) {
|
|
|
24
27
|
return Object.freeze(n);
|
|
25
28
|
}
|
|
26
29
|
|
|
27
|
-
var React__namespace = /*#__PURE__*/
|
|
30
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
31
|
+
var isEqual__default = /*#__PURE__*/_interopDefault(isEqual);
|
|
28
32
|
|
|
29
33
|
/**
|
|
30
34
|
* @public
|
|
@@ -90,7 +94,7 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
|
90
94
|
const permssionsChecked = usePrev.usePrev(actualPermissionsToCheck);
|
|
91
95
|
const contextChecked = usePrev.usePrev(rawQueryContext);
|
|
92
96
|
React__namespace.useEffect(()=>{
|
|
93
|
-
if (!
|
|
97
|
+
if (!isEqual__default.default(permssionsChecked, actualPermissionsToCheck) || // TODO: also run this when the query context changes
|
|
94
98
|
contextChecked !== rawQueryContext) {
|
|
95
99
|
setIsLoading(true);
|
|
96
100
|
setData(undefined);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useRBAC.js","sources":["../../../../../admin/src/hooks/useRBAC.ts"],"sourcesContent":["import * as React from 'react';\n\nimport isEqual from 'lodash/isEqual';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { once } from '../utils/once';\nimport { capitalise } from '../utils/strings';\n\nimport { usePrev } from './usePrev';\n\ntype AllowedActions = Record<string, boolean>;\n\n/**\n * @public\n * @description This hooks takes an object or array of permissions (the latter preferred) and\n * runs through them to match against the current user's permissions as well as the RBAC middleware\n * system checking any conditions that may be present. It returns the filtered permissions as the complete\n * object from the API and a set of actions that can be performed. An action is derived from the last part\n * of the permission action e.g. `admin::roles.create` would be `canCreate`. If there's a hyphen in the action\n * this is removed and capitalised e.g `admin::roles.create-draft` would be `canCreateDraft`.\n * @example\n * ```tsx\n * import { Page, useRBAC } from '@strapi/strapi/admin'\n *\n * const MyProtectedPage = () => {\n * const { allowedActions, isLoading, error, permissions } = useRBAC([{ action: 'admin::roles.create' }])\n *\n * if(isLoading) {\n * return <Page.Loading />\n * }\n *\n * if(error){\n * return <Page.Error />\n * }\n *\n * if(!allowedActions.canCreate) {\n * return null\n * }\n *\n * return <MyPage permissions={permissions} />\n * }\n * ```\n */\nconst useRBAC = (\n permissionsToCheck: Record<string, Permission[]> | Permission[] = [],\n passedPermissions?: Permission[],\n rawQueryContext?: string\n): {\n allowedActions: AllowedActions;\n isLoading: boolean;\n error?: unknown;\n permissions: Permission[];\n} => {\n const isLoadingAuth = useAuth('useRBAC', (state) => state.isLoading);\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>();\n const [data, setData] = React.useState<Record<string, boolean>>();\n\n const warnOnce = React.useMemo(() => once(console.warn), []);\n\n const actualPermissionsToCheck: Permission[] = React.useMemo(() => {\n if (Array.isArray(permissionsToCheck)) {\n return permissionsToCheck;\n } else {\n warnOnce(\n 'useRBAC: The first argument should be an array of permissions, not an object. This will be deprecated in the future.'\n );\n\n return Object.values(permissionsToCheck).flat();\n }\n }, [permissionsToCheck, warnOnce]);\n\n /**\n * This is the default value we return until the queryResults[i].data\n * are all resolved with data. This preserves the original behaviour.\n */\n const defaultAllowedActions = React.useMemo(() => {\n return actualPermissionsToCheck.reduce<Record<string, boolean>>((acc, permission) => {\n return {\n ...acc,\n [getActionName(permission)]: false,\n };\n }, {});\n }, [actualPermissionsToCheck]);\n\n const checkUserHasPermissions = useAuth('useRBAC', (state) => state.checkUserHasPermissions);\n\n const permssionsChecked = usePrev(actualPermissionsToCheck);\n const contextChecked = usePrev(rawQueryContext);\n\n React.useEffect(() => {\n if (\n !isEqual(permssionsChecked, actualPermissionsToCheck) ||\n // TODO: also run this when the query context changes\n contextChecked !== rawQueryContext\n ) {\n setIsLoading(true);\n setData(undefined);\n setError(undefined);\n\n checkUserHasPermissions(actualPermissionsToCheck, passedPermissions, rawQueryContext)\n .then((res) => {\n if (res) {\n setData(\n res.reduce<Record<string, boolean>>((acc, permission) => {\n return {\n ...acc,\n [getActionName(permission)]: true,\n };\n }, {})\n );\n }\n })\n .catch((err) => {\n setError(err);\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n }, [\n actualPermissionsToCheck,\n checkUserHasPermissions,\n passedPermissions,\n permissionsToCheck,\n permssionsChecked,\n contextChecked,\n rawQueryContext,\n ]);\n\n /**\n * This hook originally would not return allowedActions\n * until all the checks were complete.\n */\n const allowedActions = Object.entries({\n ...defaultAllowedActions,\n ...data,\n }).reduce((acc, [name, allowed]) => {\n acc[`can${capitalise(name)}`] = allowed;\n\n return acc;\n }, {} as AllowedActions);\n\n return {\n allowedActions,\n permissions: actualPermissionsToCheck,\n isLoading: isLoading || isLoadingAuth,\n error,\n };\n};\n\nconst getActionName = (permission: Permission): string => {\n const [action = ''] = permission.action.split('.').slice(-1);\n return action.split('-').map(capitalise).join('');\n};\n\nexport { useRBAC };\nexport type { AllowedActions };\n"],"names":["useRBAC","permissionsToCheck","passedPermissions","rawQueryContext","isLoadingAuth","useAuth","state","isLoading","setIsLoading","React","useState","error","setError","data","setData","warnOnce","useMemo","once","console","warn","actualPermissionsToCheck","Array","isArray","Object","values","flat","defaultAllowedActions","reduce","acc","permission","getActionName","checkUserHasPermissions","permssionsChecked","usePrev","contextChecked","useEffect","isEqual","undefined","then","res","catch","err","finally","allowedActions","entries","name","allowed","capitalise","permissions","action","split","slice","map","join"],"mappings":"
|
|
1
|
+
{"version":3,"file":"useRBAC.js","sources":["../../../../../admin/src/hooks/useRBAC.ts"],"sourcesContent":["import * as React from 'react';\n\nimport isEqual from 'lodash/isEqual';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { once } from '../utils/once';\nimport { capitalise } from '../utils/strings';\n\nimport { usePrev } from './usePrev';\n\ntype AllowedActions = Record<string, boolean>;\n\n/**\n * @public\n * @description This hooks takes an object or array of permissions (the latter preferred) and\n * runs through them to match against the current user's permissions as well as the RBAC middleware\n * system checking any conditions that may be present. It returns the filtered permissions as the complete\n * object from the API and a set of actions that can be performed. An action is derived from the last part\n * of the permission action e.g. `admin::roles.create` would be `canCreate`. If there's a hyphen in the action\n * this is removed and capitalised e.g `admin::roles.create-draft` would be `canCreateDraft`.\n * @example\n * ```tsx\n * import { Page, useRBAC } from '@strapi/strapi/admin'\n *\n * const MyProtectedPage = () => {\n * const { allowedActions, isLoading, error, permissions } = useRBAC([{ action: 'admin::roles.create' }])\n *\n * if(isLoading) {\n * return <Page.Loading />\n * }\n *\n * if(error){\n * return <Page.Error />\n * }\n *\n * if(!allowedActions.canCreate) {\n * return null\n * }\n *\n * return <MyPage permissions={permissions} />\n * }\n * ```\n */\nconst useRBAC = (\n permissionsToCheck: Record<string, Permission[]> | Permission[] = [],\n passedPermissions?: Permission[],\n rawQueryContext?: string\n): {\n allowedActions: AllowedActions;\n isLoading: boolean;\n error?: unknown;\n permissions: Permission[];\n} => {\n const isLoadingAuth = useAuth('useRBAC', (state) => state.isLoading);\n const [isLoading, setIsLoading] = React.useState(true);\n const [error, setError] = React.useState<unknown>();\n const [data, setData] = React.useState<Record<string, boolean>>();\n\n const warnOnce = React.useMemo(() => once(console.warn), []);\n\n const actualPermissionsToCheck: Permission[] = React.useMemo(() => {\n if (Array.isArray(permissionsToCheck)) {\n return permissionsToCheck;\n } else {\n warnOnce(\n 'useRBAC: The first argument should be an array of permissions, not an object. This will be deprecated in the future.'\n );\n\n return Object.values(permissionsToCheck).flat();\n }\n }, [permissionsToCheck, warnOnce]);\n\n /**\n * This is the default value we return until the queryResults[i].data\n * are all resolved with data. This preserves the original behaviour.\n */\n const defaultAllowedActions = React.useMemo(() => {\n return actualPermissionsToCheck.reduce<Record<string, boolean>>((acc, permission) => {\n return {\n ...acc,\n [getActionName(permission)]: false,\n };\n }, {});\n }, [actualPermissionsToCheck]);\n\n const checkUserHasPermissions = useAuth('useRBAC', (state) => state.checkUserHasPermissions);\n\n const permssionsChecked = usePrev(actualPermissionsToCheck);\n const contextChecked = usePrev(rawQueryContext);\n\n React.useEffect(() => {\n if (\n !isEqual(permssionsChecked, actualPermissionsToCheck) ||\n // TODO: also run this when the query context changes\n contextChecked !== rawQueryContext\n ) {\n setIsLoading(true);\n setData(undefined);\n setError(undefined);\n\n checkUserHasPermissions(actualPermissionsToCheck, passedPermissions, rawQueryContext)\n .then((res) => {\n if (res) {\n setData(\n res.reduce<Record<string, boolean>>((acc, permission) => {\n return {\n ...acc,\n [getActionName(permission)]: true,\n };\n }, {})\n );\n }\n })\n .catch((err) => {\n setError(err);\n })\n .finally(() => {\n setIsLoading(false);\n });\n }\n }, [\n actualPermissionsToCheck,\n checkUserHasPermissions,\n passedPermissions,\n permissionsToCheck,\n permssionsChecked,\n contextChecked,\n rawQueryContext,\n ]);\n\n /**\n * This hook originally would not return allowedActions\n * until all the checks were complete.\n */\n const allowedActions = Object.entries({\n ...defaultAllowedActions,\n ...data,\n }).reduce((acc, [name, allowed]) => {\n acc[`can${capitalise(name)}`] = allowed;\n\n return acc;\n }, {} as AllowedActions);\n\n return {\n allowedActions,\n permissions: actualPermissionsToCheck,\n isLoading: isLoading || isLoadingAuth,\n error,\n };\n};\n\nconst getActionName = (permission: Permission): string => {\n const [action = ''] = permission.action.split('.').slice(-1);\n return action.split('-').map(capitalise).join('');\n};\n\nexport { useRBAC };\nexport type { AllowedActions };\n"],"names":["useRBAC","permissionsToCheck","passedPermissions","rawQueryContext","isLoadingAuth","useAuth","state","isLoading","setIsLoading","React","useState","error","setError","data","setData","warnOnce","useMemo","once","console","warn","actualPermissionsToCheck","Array","isArray","Object","values","flat","defaultAllowedActions","reduce","acc","permission","getActionName","checkUserHasPermissions","permssionsChecked","usePrev","contextChecked","useEffect","isEqual","undefined","then","res","catch","err","finally","allowedActions","entries","name","allowed","capitalise","permissions","action","split","slice","map","join"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BC,UACKA,OAAAA,GAAU,CACdC,kBAAAA,GAAkE,EAAE,EACpEC,iBAAAA,EACAC,eAAAA,GAAAA;AAOA,IAAA,MAAMC,gBAAgBC,YAAAA,CAAQ,SAAA,EAAW,CAACC,KAAAA,GAAUA,MAAMC,SAAS,CAAA;AACnE,IAAA,MAAM,CAACA,SAAAA,EAAWC,YAAAA,CAAa,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,IAAA,CAAA;AACjD,IAAA,MAAM,CAACC,KAAAA,EAAOC,QAAAA,CAAS,GAAGH,iBAAMC,QAAQ,EAAA;AACxC,IAAA,MAAM,CAACG,IAAAA,EAAMC,OAAAA,CAAQ,GAAGL,iBAAMC,QAAQ,EAAA;IAEtC,MAAMK,QAAAA,GAAWN,iBAAMO,OAAO,CAAC,IAAMC,SAAAA,CAAKC,OAAAA,CAAQC,IAAI,CAAA,EAAG,EAAE,CAAA;IAE3D,MAAMC,wBAAAA,GAAyCX,gBAAAA,CAAMO,OAAO,CAAC,IAAA;QAC3D,IAAIK,KAAAA,CAAMC,OAAO,CAACrB,kBAAAA,CAAAA,EAAqB;YACrC,OAAOA,kBAAAA;QACT,CAAA,MAAO;YACLc,QAAAA,CACE,sHAAA,CAAA;AAGF,YAAA,OAAOQ,MAAAA,CAAOC,MAAM,CAACvB,kBAAAA,CAAAA,CAAoBwB,IAAI,EAAA;AAC/C,QAAA;IACF,CAAA,EAAG;AAACxB,QAAAA,kBAAAA;AAAoBc,QAAAA;AAAS,KAAA,CAAA;AAEjC;;;AAGC,MACD,MAAMW,qBAAAA,GAAwBjB,gBAAAA,CAAMO,OAAO,CAAC,IAAA;AAC1C,QAAA,OAAOI,wBAAAA,CAAyBO,MAAM,CAA0B,CAACC,GAAAA,EAAKC,UAAAA,GAAAA;YACpE,OAAO;AACL,gBAAA,GAAGD,GAAG;gBACN,CAACE,aAAAA,CAAcD,cAAc;AAC/B,aAAA;AACF,QAAA,CAAA,EAAG,EAAC,CAAA;IACN,CAAA,EAAG;AAACT,QAAAA;AAAyB,KAAA,CAAA;AAE7B,IAAA,MAAMW,0BAA0B1B,YAAAA,CAAQ,SAAA,EAAW,CAACC,KAAAA,GAAUA,MAAMyB,uBAAuB,CAAA;AAE3F,IAAA,MAAMC,oBAAoBC,eAAAA,CAAQb,wBAAAA,CAAAA;AAClC,IAAA,MAAMc,iBAAiBD,eAAAA,CAAQ9B,eAAAA,CAAAA;AAE/BM,IAAAA,gBAAAA,CAAM0B,SAAS,CAAC,IAAA;AACd,QAAA,IACE,CAACC,wBAAAA,CAAQJ,iBAAAA,EAAmBZ,wBAAAA,CAAAA;AAE5Bc,QAAAA,cAAAA,KAAmB/B,eAAAA,EACnB;YACAK,YAAAA,CAAa,IAAA,CAAA;YACbM,OAAAA,CAAQuB,SAAAA,CAAAA;YACRzB,QAAAA,CAASyB,SAAAA,CAAAA;AAETN,YAAAA,uBAAAA,CAAwBX,wBAAAA,EAA0BlB,iBAAAA,EAAmBC,eAAAA,CAAAA,CAClEmC,IAAI,CAAC,CAACC,GAAAA,GAAAA;AACL,gBAAA,IAAIA,GAAAA,EAAK;AACPzB,oBAAAA,OAAAA,CACEyB,GAAAA,CAAIZ,MAAM,CAA0B,CAACC,GAAAA,EAAKC,UAAAA,GAAAA;wBACxC,OAAO;AACL,4BAAA,GAAGD,GAAG;4BACN,CAACE,aAAAA,CAAcD,cAAc;AAC/B,yBAAA;AACF,oBAAA,CAAA,EAAG,EAAC,CAAA,CAAA;AAER,gBAAA;YACF,CAAA,CAAA,CACCW,KAAK,CAAC,CAACC,GAAAA,GAAAA;gBACN7B,QAAAA,CAAS6B,GAAAA,CAAAA;AACX,YAAA,CAAA,CAAA,CACCC,OAAO,CAAC,IAAA;gBACPlC,YAAAA,CAAa,KAAA,CAAA;AACf,YAAA,CAAA,CAAA;AACJ,QAAA;IACF,CAAA,EAAG;AACDY,QAAAA,wBAAAA;AACAW,QAAAA,uBAAAA;AACA7B,QAAAA,iBAAAA;AACAD,QAAAA,kBAAAA;AACA+B,QAAAA,iBAAAA;AACAE,QAAAA,cAAAA;AACA/B,QAAAA;AACD,KAAA,CAAA;AAED;;;AAGC,MACD,MAAMwC,cAAAA,GAAiBpB,MAAAA,CAAOqB,OAAO,CAAC;AACpC,QAAA,GAAGlB,qBAAqB;AACxB,QAAA,GAAGb;AACL,KAAA,CAAA,CAAGc,MAAM,CAAC,CAACC,GAAAA,EAAK,CAACiB,MAAMC,OAAAA,CAAQ,GAAA;AAC7BlB,QAAAA,GAAG,CAAC,CAAC,GAAG,EAAEmB,kBAAAA,CAAWF,IAAAA,CAAAA,CAAAA,CAAO,CAAC,GAAGC,OAAAA;QAEhC,OAAOlB,GAAAA;AACT,IAAA,CAAA,EAAG,EAAC,CAAA;IAEJ,OAAO;AACLe,QAAAA,cAAAA;QACAK,WAAAA,EAAa5B,wBAAAA;AACbb,QAAAA,SAAAA,EAAWA,SAAAA,IAAaH,aAAAA;AACxBO,QAAAA;AACF,KAAA;AACF;AAEA,MAAMmB,gBAAgB,CAACD,UAAAA,GAAAA;AACrB,IAAA,MAAM,CAACoB,MAAAA,GAAS,EAAE,CAAC,GAAGpB,UAAAA,CAAWoB,MAAM,CAACC,KAAK,CAAC,GAAA,CAAA,CAAKC,KAAK,CAAC,EAAC,CAAA;IAC1D,OAAOF,MAAAA,CAAOC,KAAK,CAAC,GAAA,CAAA,CAAKE,GAAG,CAACL,kBAAAA,CAAAA,CAAYM,IAAI,CAAC,EAAA,CAAA;AAChD,CAAA;;;;"}
|
|
@@ -10,7 +10,10 @@ var StrapiApp = require('../features/StrapiApp.js');
|
|
|
10
10
|
var selectors = require('../selectors.js');
|
|
11
11
|
var useEnterprise = require('./useEnterprise.js');
|
|
12
12
|
|
|
13
|
-
function
|
|
13
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
14
|
+
|
|
15
|
+
function _interopNamespace(e) {
|
|
16
|
+
if (e && e.__esModule) return e;
|
|
14
17
|
var n = Object.create(null);
|
|
15
18
|
if (e) {
|
|
16
19
|
Object.keys(e).forEach(function (k) {
|
|
@@ -27,7 +30,8 @@ function _interopNamespaceDefault(e) {
|
|
|
27
30
|
return Object.freeze(n);
|
|
28
31
|
}
|
|
29
32
|
|
|
30
|
-
var React__namespace = /*#__PURE__*/
|
|
33
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
34
|
+
var sortBy__default = /*#__PURE__*/_interopDefault(sortBy);
|
|
31
35
|
|
|
32
36
|
const formatLinks = (menu)=>menu.map((menuSection)=>{
|
|
33
37
|
const formattedLinks = menuSection.links.map((link)=>({
|
|
@@ -46,7 +50,10 @@ const useSettingsMenu = ()=>{
|
|
|
46
50
|
});
|
|
47
51
|
const checkUserHasPermission = Auth.useAuth('useSettingsMenu', (state)=>state.checkUserHasPermissions);
|
|
48
52
|
const shouldUpdateStrapi = AppInfo.useAppInfo('useSettingsMenu', (state)=>state.shouldUpdateStrapi);
|
|
49
|
-
const
|
|
53
|
+
const rawSettings = StrapiApp.useStrapiApp('useSettingsMenu', (state)=>state.settings);
|
|
54
|
+
const settings = React__namespace.useMemo(()=>normalizeSettings(rawSettings), [
|
|
55
|
+
rawSettings
|
|
56
|
+
]);
|
|
50
57
|
const permissions = reactRedux.useSelector(selectors.selectAdminPermissions);
|
|
51
58
|
/**
|
|
52
59
|
* memoize the return value of this function to avoid re-computing it on every render
|
|
@@ -116,7 +123,7 @@ const useSettingsMenu = ()=>{
|
|
|
116
123
|
const sections = formatLinks([
|
|
117
124
|
{
|
|
118
125
|
...global,
|
|
119
|
-
links:
|
|
126
|
+
links: sortBy__default.default([
|
|
120
127
|
...global.links,
|
|
121
128
|
...globalLinks.map(addPermissions)
|
|
122
129
|
], (link)=>link.id).map((link)=>({
|
|
@@ -151,6 +158,63 @@ const useSettingsMenu = ()=>{
|
|
|
151
158
|
}))
|
|
152
159
|
};
|
|
153
160
|
};
|
|
161
|
+
const normalizeSettingsLink = (link)=>{
|
|
162
|
+
if (!link || typeof link !== 'object') {
|
|
163
|
+
return null;
|
|
164
|
+
}
|
|
165
|
+
const candidate = link;
|
|
166
|
+
if (!candidate.id || typeof candidate.to !== 'string' || !candidate.intlLabel?.id || !candidate.intlLabel.defaultMessage) {
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
return {
|
|
170
|
+
...candidate,
|
|
171
|
+
permissions: Array.isArray(candidate.permissions) ? candidate.permissions : []
|
|
172
|
+
};
|
|
173
|
+
};
|
|
174
|
+
const normalizeSettingsSection = (section)=>{
|
|
175
|
+
if (!section || typeof section !== 'object') {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
const candidate = section;
|
|
179
|
+
if (!candidate.id || !candidate.intlLabel?.id || !candidate.intlLabel.defaultMessage) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
id: candidate.id,
|
|
184
|
+
intlLabel: candidate.intlLabel,
|
|
185
|
+
links: Array.isArray(candidate.links) ? candidate.links.map(normalizeSettingsLink).filter(isSettingsLink) : []
|
|
186
|
+
};
|
|
187
|
+
};
|
|
188
|
+
const isSettingsLink = (link)=>{
|
|
189
|
+
return link !== null;
|
|
190
|
+
};
|
|
191
|
+
const normalizeSettings = (settings)=>{
|
|
192
|
+
const defaultGlobal = {
|
|
193
|
+
id: 'global',
|
|
194
|
+
intlLabel: {
|
|
195
|
+
id: 'Settings.global',
|
|
196
|
+
defaultMessage: 'Global Settings'
|
|
197
|
+
},
|
|
198
|
+
links: []
|
|
199
|
+
};
|
|
200
|
+
if (!settings || typeof settings !== 'object') {
|
|
201
|
+
return {
|
|
202
|
+
global: defaultGlobal
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
const normalizedSections = Object.entries(settings).reduce((acc, [key, section])=>{
|
|
206
|
+
const normalizedSection = normalizeSettingsSection(section);
|
|
207
|
+
if (normalizedSection) {
|
|
208
|
+
acc[key] = normalizedSection;
|
|
209
|
+
}
|
|
210
|
+
return acc;
|
|
211
|
+
}, {});
|
|
212
|
+
return {
|
|
213
|
+
...normalizedSections,
|
|
214
|
+
global: normalizedSections.global ?? defaultGlobal
|
|
215
|
+
};
|
|
216
|
+
};
|
|
154
217
|
|
|
218
|
+
exports.normalizeSettings = normalizeSettings;
|
|
155
219
|
exports.useSettingsMenu = useSettingsMenu;
|
|
156
220
|
//# sourceMappingURL=useSettingsMenu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSettingsMenu.js","sources":["../../../../../admin/src/hooks/useSettingsMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport sortBy from 'lodash/sortBy';\nimport { useSelector } from 'react-redux';\n\nimport { SETTINGS_LINKS_CE, SettingsMenuLink } from '../constants';\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { selectAdminPermissions } from '../selectors';\nimport { PermissionMap } from '../types/permissions';\n\nimport { useEnterprise } from './useEnterprise';\n\nimport type {\n StrapiAppSetting,\n StrapiAppSettingLink as IStrapiAppSettingLink,\n} from '../core/apis/router';\n\nconst formatLinks = (menu: SettingsMenuSection[]): SettingsMenuSectionWithDisplayedLinks[] =>\n menu.map((menuSection) => {\n const formattedLinks = menuSection.links.map((link) => ({\n ...link,\n isDisplayed: false,\n }));\n\n return { ...menuSection, links: formattedLinks };\n });\n\ninterface SettingsMenuLinkWithPermissions extends SettingsMenuLink {\n permissions: IStrapiAppSettingLink['permissions'];\n hasNotification?: boolean;\n}\n\ninterface StrapiAppSettingsLink extends IStrapiAppSettingLink {\n licenseOnly?: never;\n hasNotification?: never;\n}\n\ninterface SettingsMenuSection extends Omit<StrapiAppSetting, 'links'> {\n links: Array<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n}\n\ninterface SettingsMenuLinkWithPermissionsAndDisplayed extends SettingsMenuLinkWithPermissions {\n isDisplayed: boolean;\n}\n\ninterface StrapiAppSettingLinkWithDisplayed extends StrapiAppSettingsLink {\n isDisplayed: boolean;\n}\n\ninterface SettingsMenuSectionWithDisplayedLinks extends Omit<SettingsMenuSection, 'links'> {\n links: Array<SettingsMenuLinkWithPermissionsAndDisplayed | StrapiAppSettingLinkWithDisplayed>;\n}\n\ntype SettingsMenu = SettingsMenuSectionWithDisplayedLinks[];\n\nconst useSettingsMenu = (): {\n isLoading: boolean;\n menu: SettingsMenu;\n} => {\n const [{ isLoading, menu }, setData] = React.useState<{\n isLoading: boolean;\n menu: SettingsMenu;\n }>({\n isLoading: true,\n menu: [],\n });\n const checkUserHasPermission = useAuth(\n 'useSettingsMenu',\n (state) => state.checkUserHasPermissions\n );\n const shouldUpdateStrapi = useAppInfo('useSettingsMenu', (state) => state.shouldUpdateStrapi);\n const settings = useStrapiApp('useSettingsMenu', (state) => state.settings);\n const permissions = useSelector(selectAdminPermissions);\n\n /**\n * memoize the return value of this function to avoid re-computing it on every render\n * because it's used in an effect it ends up re-running recursively.\n */\n const ceLinks = React.useMemo(() => SETTINGS_LINKS_CE(), []);\n\n const { admin: adminLinks, global: globalLinks } = useEnterprise(\n ceLinks,\n async () => (await import('../../../ee/admin/src/constants')).SETTINGS_LINKS_EE(),\n {\n combine(ceLinks, eeLinks) {\n return {\n admin: [...eeLinks.admin, ...ceLinks.admin],\n global: [...ceLinks.global, ...eeLinks.global],\n };\n },\n defaultValue: {\n admin: [],\n global: [],\n },\n }\n );\n\n const addPermissions = React.useCallback(\n (link: SettingsMenuLink) => {\n if (!link.id) {\n throw new Error('The settings menu item must have an id attribute.');\n }\n\n return {\n ...link,\n permissions: permissions.settings?.[link.id as keyof PermissionMap['settings']]?.main ?? [],\n } satisfies SettingsMenuLinkWithPermissions;\n },\n [permissions.settings]\n );\n\n React.useEffect(() => {\n const getData = async () => {\n interface MenuLinkPermission {\n hasPermission: boolean;\n sectionIndex: number;\n linkIndex: number;\n }\n\n const buildMenuPermissions = (sections: SettingsMenuSectionWithDisplayedLinks[]) =>\n Promise.all(\n sections.reduce<Promise<MenuLinkPermission>[]>((acc, section, sectionIndex) => {\n const linksWithPermissions = section.links.map(async (link, linkIndex) => ({\n hasPermission: (await checkUserHasPermission(link.permissions)).length > 0,\n sectionIndex,\n linkIndex,\n }));\n\n return [...acc, ...linksWithPermissions];\n }, [])\n );\n\n const menuPermissions = await buildMenuPermissions(sections);\n\n setData((prev) => {\n return {\n ...prev,\n isLoading: false,\n menu: sections.map((section, sectionIndex) => ({\n ...section,\n links: section.links.map((link, linkIndex) => {\n const permission = menuPermissions.find(\n (permission) =>\n permission.sectionIndex === sectionIndex && permission.linkIndex === linkIndex\n );\n\n return {\n ...link,\n isDisplayed: Boolean(permission?.hasPermission),\n };\n }),\n })),\n };\n });\n };\n\n const { global, ...otherSections } = settings;\n const sections = formatLinks([\n {\n ...global,\n links: sortBy([...global.links, ...globalLinks.map(addPermissions)], (link) => link.id).map(\n (link) => ({\n ...link,\n hasNotification: link.id === '000-application-infos' && shouldUpdateStrapi,\n })\n ),\n },\n {\n id: 'permissions',\n intlLabel: { id: 'Settings.permissions', defaultMessage: 'Administration Panel' },\n links: adminLinks.map(addPermissions),\n },\n ...Object.values(otherSections),\n ]);\n\n getData();\n }, [\n adminLinks,\n globalLinks,\n settings,\n shouldUpdateStrapi,\n addPermissions,\n checkUserHasPermission,\n ]);\n\n return {\n isLoading,\n menu: menu.map((menuItem) => ({\n ...menuItem,\n links: menuItem.links.filter((link) => link.isDisplayed),\n })),\n };\n};\n\nexport { useSettingsMenu };\nexport type { SettingsMenu };\n"],"names":["formatLinks","menu","map","menuSection","formattedLinks","links","link","isDisplayed","useSettingsMenu","isLoading","setData","React","useState","checkUserHasPermission","useAuth","state","checkUserHasPermissions","shouldUpdateStrapi","useAppInfo","settings","useStrapiApp","permissions","useSelector","selectAdminPermissions","ceLinks","useMemo","SETTINGS_LINKS_CE","admin","adminLinks","global","globalLinks","useEnterprise","SETTINGS_LINKS_EE","combine","eeLinks","defaultValue","addPermissions","useCallback","id","Error","main","useEffect","getData","buildMenuPermissions","sections","Promise","all","reduce","acc","section","sectionIndex","linksWithPermissions","linkIndex","hasPermission","length","menuPermissions","prev","permission","find","Boolean","otherSections","sortBy","hasNotification","intlLabel","defaultMessage","Object","values","menuItem","filter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useSettingsMenu.js","sources":["../../../../../admin/src/hooks/useSettingsMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport sortBy from 'lodash/sortBy';\nimport { useSelector } from 'react-redux';\n\nimport { SETTINGS_LINKS_CE, SettingsMenuLink } from '../constants';\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { selectAdminPermissions } from '../selectors';\nimport { PermissionMap } from '../types/permissions';\n\nimport { useEnterprise } from './useEnterprise';\n\nimport type {\n StrapiAppSetting,\n StrapiAppSettingLink as IStrapiAppSettingLink,\n} from '../core/apis/router';\n\nconst formatLinks = (menu: SettingsMenuSection[]): SettingsMenuSectionWithDisplayedLinks[] =>\n menu.map((menuSection) => {\n const formattedLinks = menuSection.links.map((link) => ({\n ...link,\n isDisplayed: false,\n }));\n\n return { ...menuSection, links: formattedLinks };\n });\n\ninterface SettingsMenuLinkWithPermissions extends SettingsMenuLink {\n permissions: IStrapiAppSettingLink['permissions'];\n hasNotification?: boolean;\n}\n\ninterface StrapiAppSettingsLink extends IStrapiAppSettingLink {\n licenseOnly?: never;\n hasNotification?: never;\n}\n\ninterface SettingsMenuSection extends Omit<StrapiAppSetting, 'links'> {\n links: Array<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n}\n\ninterface SettingsMenuLinkWithPermissionsAndDisplayed extends SettingsMenuLinkWithPermissions {\n isDisplayed: boolean;\n}\n\ninterface StrapiAppSettingLinkWithDisplayed extends StrapiAppSettingsLink {\n isDisplayed: boolean;\n}\n\ninterface SettingsMenuSectionWithDisplayedLinks extends Omit<SettingsMenuSection, 'links'> {\n links: Array<SettingsMenuLinkWithPermissionsAndDisplayed | StrapiAppSettingLinkWithDisplayed>;\n}\n\ntype SettingsMenu = SettingsMenuSectionWithDisplayedLinks[];\n\nconst useSettingsMenu = (): {\n isLoading: boolean;\n menu: SettingsMenu;\n} => {\n const [{ isLoading, menu }, setData] = React.useState<{\n isLoading: boolean;\n menu: SettingsMenu;\n }>({\n isLoading: true,\n menu: [],\n });\n const checkUserHasPermission = useAuth(\n 'useSettingsMenu',\n (state) => state.checkUserHasPermissions\n );\n const shouldUpdateStrapi = useAppInfo('useSettingsMenu', (state) => state.shouldUpdateStrapi);\n const rawSettings = useStrapiApp('useSettingsMenu', (state) => state.settings);\n const settings = React.useMemo(() => normalizeSettings(rawSettings), [rawSettings]);\n const permissions = useSelector(selectAdminPermissions);\n\n /**\n * memoize the return value of this function to avoid re-computing it on every render\n * because it's used in an effect it ends up re-running recursively.\n */\n const ceLinks = React.useMemo(() => SETTINGS_LINKS_CE(), []);\n\n const { admin: adminLinks, global: globalLinks } = useEnterprise(\n ceLinks,\n async () => (await import('../../../ee/admin/src/constants')).SETTINGS_LINKS_EE(),\n {\n combine(ceLinks, eeLinks) {\n return {\n admin: [...eeLinks.admin, ...ceLinks.admin],\n global: [...ceLinks.global, ...eeLinks.global],\n };\n },\n defaultValue: {\n admin: [],\n global: [],\n },\n }\n );\n\n const addPermissions = React.useCallback(\n (link: SettingsMenuLink) => {\n if (!link.id) {\n throw new Error('The settings menu item must have an id attribute.');\n }\n\n return {\n ...link,\n permissions: permissions.settings?.[link.id as keyof PermissionMap['settings']]?.main ?? [],\n } satisfies SettingsMenuLinkWithPermissions;\n },\n [permissions.settings]\n );\n\n React.useEffect(() => {\n const getData = async () => {\n interface MenuLinkPermission {\n hasPermission: boolean;\n sectionIndex: number;\n linkIndex: number;\n }\n\n const buildMenuPermissions = (sections: SettingsMenuSectionWithDisplayedLinks[]) =>\n Promise.all(\n sections.reduce<Promise<MenuLinkPermission>[]>((acc, section, sectionIndex) => {\n const linksWithPermissions = section.links.map(async (link, linkIndex) => ({\n hasPermission: (await checkUserHasPermission(link.permissions)).length > 0,\n sectionIndex,\n linkIndex,\n }));\n\n return [...acc, ...linksWithPermissions];\n }, [])\n );\n\n const menuPermissions = await buildMenuPermissions(sections);\n\n setData((prev) => {\n return {\n ...prev,\n isLoading: false,\n menu: sections.map((section, sectionIndex) => ({\n ...section,\n links: section.links.map((link, linkIndex) => {\n const permission = menuPermissions.find(\n (permission) =>\n permission.sectionIndex === sectionIndex && permission.linkIndex === linkIndex\n );\n\n return {\n ...link,\n isDisplayed: Boolean(permission?.hasPermission),\n };\n }),\n })),\n };\n });\n };\n\n const { global, ...otherSections } = settings;\n const sections = formatLinks([\n {\n ...global,\n links: sortBy([...global.links, ...globalLinks.map(addPermissions)], (link) => link.id).map(\n (link) => ({\n ...link,\n hasNotification: link.id === '000-application-infos' && shouldUpdateStrapi,\n })\n ),\n },\n {\n id: 'permissions',\n intlLabel: { id: 'Settings.permissions', defaultMessage: 'Administration Panel' },\n links: adminLinks.map(addPermissions),\n },\n ...Object.values(otherSections),\n ]);\n\n getData();\n }, [\n adminLinks,\n globalLinks,\n settings,\n shouldUpdateStrapi,\n addPermissions,\n checkUserHasPermission,\n ]);\n\n return {\n isLoading,\n menu: menu.map((menuItem) => ({\n ...menuItem,\n links: menuItem.links.filter((link) => link.isDisplayed),\n })),\n };\n};\n\nconst normalizeSettingsLink = (\n link: unknown\n): (SettingsMenuLinkWithPermissions | StrapiAppSettingsLink) | null => {\n if (!link || typeof link !== 'object') {\n return null;\n }\n\n const candidate = link as Partial<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n\n if (\n !candidate.id ||\n typeof candidate.to !== 'string' ||\n !candidate.intlLabel?.id ||\n !candidate.intlLabel.defaultMessage\n ) {\n return null;\n }\n\n return {\n ...candidate,\n permissions: Array.isArray(candidate.permissions) ? candidate.permissions : [],\n } as SettingsMenuLinkWithPermissions | StrapiAppSettingsLink;\n};\n\nconst normalizeSettingsSection = (section: unknown): SettingsMenuSection | null => {\n if (!section || typeof section !== 'object') {\n return null;\n }\n\n const candidate = section as Partial<SettingsMenuSection>;\n\n if (!candidate.id || !candidate.intlLabel?.id || !candidate.intlLabel.defaultMessage) {\n return null;\n }\n\n return {\n id: candidate.id,\n intlLabel: candidate.intlLabel,\n links: Array.isArray(candidate.links)\n ? candidate.links.map(normalizeSettingsLink).filter(isSettingsLink)\n : [],\n };\n};\n\nconst isSettingsLink = (\n link: ReturnType<typeof normalizeSettingsLink>\n): link is SettingsMenuLinkWithPermissions | StrapiAppSettingsLink => {\n return link !== null;\n};\n\nconst normalizeSettings = (settings: unknown): Record<string, SettingsMenuSection> => {\n const defaultGlobal: SettingsMenuSection = {\n id: 'global',\n intlLabel: {\n id: 'Settings.global',\n defaultMessage: 'Global Settings',\n },\n links: [],\n };\n\n if (!settings || typeof settings !== 'object') {\n return {\n global: defaultGlobal,\n };\n }\n\n const normalizedSections = Object.entries(settings).reduce<Record<string, SettingsMenuSection>>(\n (acc, [key, section]) => {\n const normalizedSection = normalizeSettingsSection(section);\n\n if (normalizedSection) {\n acc[key] = normalizedSection;\n }\n\n return acc;\n },\n {}\n );\n\n return {\n ...normalizedSections,\n global: normalizedSections.global ?? defaultGlobal,\n };\n};\n\nexport { useSettingsMenu, normalizeSettings };\nexport type { SettingsMenu };\n"],"names":["formatLinks","menu","map","menuSection","formattedLinks","links","link","isDisplayed","useSettingsMenu","isLoading","setData","React","useState","checkUserHasPermission","useAuth","state","checkUserHasPermissions","shouldUpdateStrapi","useAppInfo","rawSettings","useStrapiApp","settings","useMemo","normalizeSettings","permissions","useSelector","selectAdminPermissions","ceLinks","SETTINGS_LINKS_CE","admin","adminLinks","global","globalLinks","useEnterprise","SETTINGS_LINKS_EE","combine","eeLinks","defaultValue","addPermissions","useCallback","id","Error","main","useEffect","getData","buildMenuPermissions","sections","Promise","all","reduce","acc","section","sectionIndex","linksWithPermissions","linkIndex","hasPermission","length","menuPermissions","prev","permission","find","Boolean","otherSections","sortBy","hasNotification","intlLabel","defaultMessage","Object","values","menuItem","filter","normalizeSettingsLink","candidate","to","Array","isArray","normalizeSettingsSection","isSettingsLink","defaultGlobal","normalizedSections","entries","key","normalizedSection"],"mappings":"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"}
|
|
@@ -25,7 +25,10 @@ const useSettingsMenu = ()=>{
|
|
|
25
25
|
});
|
|
26
26
|
const checkUserHasPermission = useAuth('useSettingsMenu', (state)=>state.checkUserHasPermissions);
|
|
27
27
|
const shouldUpdateStrapi = useAppInfo('useSettingsMenu', (state)=>state.shouldUpdateStrapi);
|
|
28
|
-
const
|
|
28
|
+
const rawSettings = useStrapiApp('useSettingsMenu', (state)=>state.settings);
|
|
29
|
+
const settings = React.useMemo(()=>normalizeSettings(rawSettings), [
|
|
30
|
+
rawSettings
|
|
31
|
+
]);
|
|
29
32
|
const permissions = useSelector(selectAdminPermissions);
|
|
30
33
|
/**
|
|
31
34
|
* memoize the return value of this function to avoid re-computing it on every render
|
|
@@ -130,6 +133,62 @@ const useSettingsMenu = ()=>{
|
|
|
130
133
|
}))
|
|
131
134
|
};
|
|
132
135
|
};
|
|
136
|
+
const normalizeSettingsLink = (link)=>{
|
|
137
|
+
if (!link || typeof link !== 'object') {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
const candidate = link;
|
|
141
|
+
if (!candidate.id || typeof candidate.to !== 'string' || !candidate.intlLabel?.id || !candidate.intlLabel.defaultMessage) {
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
return {
|
|
145
|
+
...candidate,
|
|
146
|
+
permissions: Array.isArray(candidate.permissions) ? candidate.permissions : []
|
|
147
|
+
};
|
|
148
|
+
};
|
|
149
|
+
const normalizeSettingsSection = (section)=>{
|
|
150
|
+
if (!section || typeof section !== 'object') {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
const candidate = section;
|
|
154
|
+
if (!candidate.id || !candidate.intlLabel?.id || !candidate.intlLabel.defaultMessage) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
id: candidate.id,
|
|
159
|
+
intlLabel: candidate.intlLabel,
|
|
160
|
+
links: Array.isArray(candidate.links) ? candidate.links.map(normalizeSettingsLink).filter(isSettingsLink) : []
|
|
161
|
+
};
|
|
162
|
+
};
|
|
163
|
+
const isSettingsLink = (link)=>{
|
|
164
|
+
return link !== null;
|
|
165
|
+
};
|
|
166
|
+
const normalizeSettings = (settings)=>{
|
|
167
|
+
const defaultGlobal = {
|
|
168
|
+
id: 'global',
|
|
169
|
+
intlLabel: {
|
|
170
|
+
id: 'Settings.global',
|
|
171
|
+
defaultMessage: 'Global Settings'
|
|
172
|
+
},
|
|
173
|
+
links: []
|
|
174
|
+
};
|
|
175
|
+
if (!settings || typeof settings !== 'object') {
|
|
176
|
+
return {
|
|
177
|
+
global: defaultGlobal
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
const normalizedSections = Object.entries(settings).reduce((acc, [key, section])=>{
|
|
181
|
+
const normalizedSection = normalizeSettingsSection(section);
|
|
182
|
+
if (normalizedSection) {
|
|
183
|
+
acc[key] = normalizedSection;
|
|
184
|
+
}
|
|
185
|
+
return acc;
|
|
186
|
+
}, {});
|
|
187
|
+
return {
|
|
188
|
+
...normalizedSections,
|
|
189
|
+
global: normalizedSections.global ?? defaultGlobal
|
|
190
|
+
};
|
|
191
|
+
};
|
|
133
192
|
|
|
134
|
-
export { useSettingsMenu };
|
|
193
|
+
export { normalizeSettings, useSettingsMenu };
|
|
135
194
|
//# sourceMappingURL=useSettingsMenu.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSettingsMenu.mjs","sources":["../../../../../admin/src/hooks/useSettingsMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport sortBy from 'lodash/sortBy';\nimport { useSelector } from 'react-redux';\n\nimport { SETTINGS_LINKS_CE, SettingsMenuLink } from '../constants';\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { selectAdminPermissions } from '../selectors';\nimport { PermissionMap } from '../types/permissions';\n\nimport { useEnterprise } from './useEnterprise';\n\nimport type {\n StrapiAppSetting,\n StrapiAppSettingLink as IStrapiAppSettingLink,\n} from '../core/apis/router';\n\nconst formatLinks = (menu: SettingsMenuSection[]): SettingsMenuSectionWithDisplayedLinks[] =>\n menu.map((menuSection) => {\n const formattedLinks = menuSection.links.map((link) => ({\n ...link,\n isDisplayed: false,\n }));\n\n return { ...menuSection, links: formattedLinks };\n });\n\ninterface SettingsMenuLinkWithPermissions extends SettingsMenuLink {\n permissions: IStrapiAppSettingLink['permissions'];\n hasNotification?: boolean;\n}\n\ninterface StrapiAppSettingsLink extends IStrapiAppSettingLink {\n licenseOnly?: never;\n hasNotification?: never;\n}\n\ninterface SettingsMenuSection extends Omit<StrapiAppSetting, 'links'> {\n links: Array<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n}\n\ninterface SettingsMenuLinkWithPermissionsAndDisplayed extends SettingsMenuLinkWithPermissions {\n isDisplayed: boolean;\n}\n\ninterface StrapiAppSettingLinkWithDisplayed extends StrapiAppSettingsLink {\n isDisplayed: boolean;\n}\n\ninterface SettingsMenuSectionWithDisplayedLinks extends Omit<SettingsMenuSection, 'links'> {\n links: Array<SettingsMenuLinkWithPermissionsAndDisplayed | StrapiAppSettingLinkWithDisplayed>;\n}\n\ntype SettingsMenu = SettingsMenuSectionWithDisplayedLinks[];\n\nconst useSettingsMenu = (): {\n isLoading: boolean;\n menu: SettingsMenu;\n} => {\n const [{ isLoading, menu }, setData] = React.useState<{\n isLoading: boolean;\n menu: SettingsMenu;\n }>({\n isLoading: true,\n menu: [],\n });\n const checkUserHasPermission = useAuth(\n 'useSettingsMenu',\n (state) => state.checkUserHasPermissions\n );\n const shouldUpdateStrapi = useAppInfo('useSettingsMenu', (state) => state.shouldUpdateStrapi);\n const settings = useStrapiApp('useSettingsMenu', (state) => state.settings);\n const permissions = useSelector(selectAdminPermissions);\n\n /**\n * memoize the return value of this function to avoid re-computing it on every render\n * because it's used in an effect it ends up re-running recursively.\n */\n const ceLinks = React.useMemo(() => SETTINGS_LINKS_CE(), []);\n\n const { admin: adminLinks, global: globalLinks } = useEnterprise(\n ceLinks,\n async () => (await import('../../../ee/admin/src/constants')).SETTINGS_LINKS_EE(),\n {\n combine(ceLinks, eeLinks) {\n return {\n admin: [...eeLinks.admin, ...ceLinks.admin],\n global: [...ceLinks.global, ...eeLinks.global],\n };\n },\n defaultValue: {\n admin: [],\n global: [],\n },\n }\n );\n\n const addPermissions = React.useCallback(\n (link: SettingsMenuLink) => {\n if (!link.id) {\n throw new Error('The settings menu item must have an id attribute.');\n }\n\n return {\n ...link,\n permissions: permissions.settings?.[link.id as keyof PermissionMap['settings']]?.main ?? [],\n } satisfies SettingsMenuLinkWithPermissions;\n },\n [permissions.settings]\n );\n\n React.useEffect(() => {\n const getData = async () => {\n interface MenuLinkPermission {\n hasPermission: boolean;\n sectionIndex: number;\n linkIndex: number;\n }\n\n const buildMenuPermissions = (sections: SettingsMenuSectionWithDisplayedLinks[]) =>\n Promise.all(\n sections.reduce<Promise<MenuLinkPermission>[]>((acc, section, sectionIndex) => {\n const linksWithPermissions = section.links.map(async (link, linkIndex) => ({\n hasPermission: (await checkUserHasPermission(link.permissions)).length > 0,\n sectionIndex,\n linkIndex,\n }));\n\n return [...acc, ...linksWithPermissions];\n }, [])\n );\n\n const menuPermissions = await buildMenuPermissions(sections);\n\n setData((prev) => {\n return {\n ...prev,\n isLoading: false,\n menu: sections.map((section, sectionIndex) => ({\n ...section,\n links: section.links.map((link, linkIndex) => {\n const permission = menuPermissions.find(\n (permission) =>\n permission.sectionIndex === sectionIndex && permission.linkIndex === linkIndex\n );\n\n return {\n ...link,\n isDisplayed: Boolean(permission?.hasPermission),\n };\n }),\n })),\n };\n });\n };\n\n const { global, ...otherSections } = settings;\n const sections = formatLinks([\n {\n ...global,\n links: sortBy([...global.links, ...globalLinks.map(addPermissions)], (link) => link.id).map(\n (link) => ({\n ...link,\n hasNotification: link.id === '000-application-infos' && shouldUpdateStrapi,\n })\n ),\n },\n {\n id: 'permissions',\n intlLabel: { id: 'Settings.permissions', defaultMessage: 'Administration Panel' },\n links: adminLinks.map(addPermissions),\n },\n ...Object.values(otherSections),\n ]);\n\n getData();\n }, [\n adminLinks,\n globalLinks,\n settings,\n shouldUpdateStrapi,\n addPermissions,\n checkUserHasPermission,\n ]);\n\n return {\n isLoading,\n menu: menu.map((menuItem) => ({\n ...menuItem,\n links: menuItem.links.filter((link) => link.isDisplayed),\n })),\n };\n};\n\nexport { useSettingsMenu };\nexport type { SettingsMenu };\n"],"names":["formatLinks","menu","map","menuSection","formattedLinks","links","link","isDisplayed","useSettingsMenu","isLoading","setData","React","useState","checkUserHasPermission","useAuth","state","checkUserHasPermissions","shouldUpdateStrapi","useAppInfo","settings","useStrapiApp","permissions","useSelector","selectAdminPermissions","ceLinks","useMemo","SETTINGS_LINKS_CE","admin","adminLinks","global","globalLinks","useEnterprise","SETTINGS_LINKS_EE","combine","eeLinks","defaultValue","addPermissions","useCallback","id","Error","main","useEffect","getData","buildMenuPermissions","sections","Promise","all","reduce","acc","section","sectionIndex","linksWithPermissions","linkIndex","hasPermission","length","menuPermissions","prev","permission","find","Boolean","otherSections","sortBy","hasNotification","intlLabel","defaultMessage","Object","values","menuItem","filter"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useSettingsMenu.mjs","sources":["../../../../../admin/src/hooks/useSettingsMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport sortBy from 'lodash/sortBy';\nimport { useSelector } from 'react-redux';\n\nimport { SETTINGS_LINKS_CE, SettingsMenuLink } from '../constants';\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { selectAdminPermissions } from '../selectors';\nimport { PermissionMap } from '../types/permissions';\n\nimport { useEnterprise } from './useEnterprise';\n\nimport type {\n StrapiAppSetting,\n StrapiAppSettingLink as IStrapiAppSettingLink,\n} from '../core/apis/router';\n\nconst formatLinks = (menu: SettingsMenuSection[]): SettingsMenuSectionWithDisplayedLinks[] =>\n menu.map((menuSection) => {\n const formattedLinks = menuSection.links.map((link) => ({\n ...link,\n isDisplayed: false,\n }));\n\n return { ...menuSection, links: formattedLinks };\n });\n\ninterface SettingsMenuLinkWithPermissions extends SettingsMenuLink {\n permissions: IStrapiAppSettingLink['permissions'];\n hasNotification?: boolean;\n}\n\ninterface StrapiAppSettingsLink extends IStrapiAppSettingLink {\n licenseOnly?: never;\n hasNotification?: never;\n}\n\ninterface SettingsMenuSection extends Omit<StrapiAppSetting, 'links'> {\n links: Array<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n}\n\ninterface SettingsMenuLinkWithPermissionsAndDisplayed extends SettingsMenuLinkWithPermissions {\n isDisplayed: boolean;\n}\n\ninterface StrapiAppSettingLinkWithDisplayed extends StrapiAppSettingsLink {\n isDisplayed: boolean;\n}\n\ninterface SettingsMenuSectionWithDisplayedLinks extends Omit<SettingsMenuSection, 'links'> {\n links: Array<SettingsMenuLinkWithPermissionsAndDisplayed | StrapiAppSettingLinkWithDisplayed>;\n}\n\ntype SettingsMenu = SettingsMenuSectionWithDisplayedLinks[];\n\nconst useSettingsMenu = (): {\n isLoading: boolean;\n menu: SettingsMenu;\n} => {\n const [{ isLoading, menu }, setData] = React.useState<{\n isLoading: boolean;\n menu: SettingsMenu;\n }>({\n isLoading: true,\n menu: [],\n });\n const checkUserHasPermission = useAuth(\n 'useSettingsMenu',\n (state) => state.checkUserHasPermissions\n );\n const shouldUpdateStrapi = useAppInfo('useSettingsMenu', (state) => state.shouldUpdateStrapi);\n const rawSettings = useStrapiApp('useSettingsMenu', (state) => state.settings);\n const settings = React.useMemo(() => normalizeSettings(rawSettings), [rawSettings]);\n const permissions = useSelector(selectAdminPermissions);\n\n /**\n * memoize the return value of this function to avoid re-computing it on every render\n * because it's used in an effect it ends up re-running recursively.\n */\n const ceLinks = React.useMemo(() => SETTINGS_LINKS_CE(), []);\n\n const { admin: adminLinks, global: globalLinks } = useEnterprise(\n ceLinks,\n async () => (await import('../../../ee/admin/src/constants')).SETTINGS_LINKS_EE(),\n {\n combine(ceLinks, eeLinks) {\n return {\n admin: [...eeLinks.admin, ...ceLinks.admin],\n global: [...ceLinks.global, ...eeLinks.global],\n };\n },\n defaultValue: {\n admin: [],\n global: [],\n },\n }\n );\n\n const addPermissions = React.useCallback(\n (link: SettingsMenuLink) => {\n if (!link.id) {\n throw new Error('The settings menu item must have an id attribute.');\n }\n\n return {\n ...link,\n permissions: permissions.settings?.[link.id as keyof PermissionMap['settings']]?.main ?? [],\n } satisfies SettingsMenuLinkWithPermissions;\n },\n [permissions.settings]\n );\n\n React.useEffect(() => {\n const getData = async () => {\n interface MenuLinkPermission {\n hasPermission: boolean;\n sectionIndex: number;\n linkIndex: number;\n }\n\n const buildMenuPermissions = (sections: SettingsMenuSectionWithDisplayedLinks[]) =>\n Promise.all(\n sections.reduce<Promise<MenuLinkPermission>[]>((acc, section, sectionIndex) => {\n const linksWithPermissions = section.links.map(async (link, linkIndex) => ({\n hasPermission: (await checkUserHasPermission(link.permissions)).length > 0,\n sectionIndex,\n linkIndex,\n }));\n\n return [...acc, ...linksWithPermissions];\n }, [])\n );\n\n const menuPermissions = await buildMenuPermissions(sections);\n\n setData((prev) => {\n return {\n ...prev,\n isLoading: false,\n menu: sections.map((section, sectionIndex) => ({\n ...section,\n links: section.links.map((link, linkIndex) => {\n const permission = menuPermissions.find(\n (permission) =>\n permission.sectionIndex === sectionIndex && permission.linkIndex === linkIndex\n );\n\n return {\n ...link,\n isDisplayed: Boolean(permission?.hasPermission),\n };\n }),\n })),\n };\n });\n };\n\n const { global, ...otherSections } = settings;\n const sections = formatLinks([\n {\n ...global,\n links: sortBy([...global.links, ...globalLinks.map(addPermissions)], (link) => link.id).map(\n (link) => ({\n ...link,\n hasNotification: link.id === '000-application-infos' && shouldUpdateStrapi,\n })\n ),\n },\n {\n id: 'permissions',\n intlLabel: { id: 'Settings.permissions', defaultMessage: 'Administration Panel' },\n links: adminLinks.map(addPermissions),\n },\n ...Object.values(otherSections),\n ]);\n\n getData();\n }, [\n adminLinks,\n globalLinks,\n settings,\n shouldUpdateStrapi,\n addPermissions,\n checkUserHasPermission,\n ]);\n\n return {\n isLoading,\n menu: menu.map((menuItem) => ({\n ...menuItem,\n links: menuItem.links.filter((link) => link.isDisplayed),\n })),\n };\n};\n\nconst normalizeSettingsLink = (\n link: unknown\n): (SettingsMenuLinkWithPermissions | StrapiAppSettingsLink) | null => {\n if (!link || typeof link !== 'object') {\n return null;\n }\n\n const candidate = link as Partial<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n\n if (\n !candidate.id ||\n typeof candidate.to !== 'string' ||\n !candidate.intlLabel?.id ||\n !candidate.intlLabel.defaultMessage\n ) {\n return null;\n }\n\n return {\n ...candidate,\n permissions: Array.isArray(candidate.permissions) ? candidate.permissions : [],\n } as SettingsMenuLinkWithPermissions | StrapiAppSettingsLink;\n};\n\nconst normalizeSettingsSection = (section: unknown): SettingsMenuSection | null => {\n if (!section || typeof section !== 'object') {\n return null;\n }\n\n const candidate = section as Partial<SettingsMenuSection>;\n\n if (!candidate.id || !candidate.intlLabel?.id || !candidate.intlLabel.defaultMessage) {\n return null;\n }\n\n return {\n id: candidate.id,\n intlLabel: candidate.intlLabel,\n links: Array.isArray(candidate.links)\n ? candidate.links.map(normalizeSettingsLink).filter(isSettingsLink)\n : [],\n };\n};\n\nconst isSettingsLink = (\n link: ReturnType<typeof normalizeSettingsLink>\n): link is SettingsMenuLinkWithPermissions | StrapiAppSettingsLink => {\n return link !== null;\n};\n\nconst normalizeSettings = (settings: unknown): Record<string, SettingsMenuSection> => {\n const defaultGlobal: SettingsMenuSection = {\n id: 'global',\n intlLabel: {\n id: 'Settings.global',\n defaultMessage: 'Global Settings',\n },\n links: [],\n };\n\n if (!settings || typeof settings !== 'object') {\n return {\n global: defaultGlobal,\n };\n }\n\n const normalizedSections = Object.entries(settings).reduce<Record<string, SettingsMenuSection>>(\n (acc, [key, section]) => {\n const normalizedSection = normalizeSettingsSection(section);\n\n if (normalizedSection) {\n acc[key] = normalizedSection;\n }\n\n return acc;\n },\n {}\n );\n\n return {\n ...normalizedSections,\n global: normalizedSections.global ?? defaultGlobal,\n };\n};\n\nexport { useSettingsMenu, normalizeSettings };\nexport type { SettingsMenu };\n"],"names":["formatLinks","menu","map","menuSection","formattedLinks","links","link","isDisplayed","useSettingsMenu","isLoading","setData","React","useState","checkUserHasPermission","useAuth","state","checkUserHasPermissions","shouldUpdateStrapi","useAppInfo","rawSettings","useStrapiApp","settings","useMemo","normalizeSettings","permissions","useSelector","selectAdminPermissions","ceLinks","SETTINGS_LINKS_CE","admin","adminLinks","global","globalLinks","useEnterprise","SETTINGS_LINKS_EE","combine","eeLinks","defaultValue","addPermissions","useCallback","id","Error","main","useEffect","getData","buildMenuPermissions","sections","Promise","all","reduce","acc","section","sectionIndex","linksWithPermissions","linkIndex","hasPermission","length","menuPermissions","prev","permission","find","Boolean","otherSections","sortBy","hasNotification","intlLabel","defaultMessage","Object","values","menuItem","filter","normalizeSettingsLink","candidate","to","Array","isArray","normalizeSettingsSection","isSettingsLink","defaultGlobal","normalizedSections","entries","key","normalizedSection"],"mappings":"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"}
|