@strapi/admin 4.15.3-alpha.2 → 4.15.3
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/_chunks/{AuthenticatedApp-4045caae.js → AuthenticatedApp-05646cd4.js} +21 -23
- package/dist/_chunks/{AuthenticatedApp-4045caae.js.map → AuthenticatedApp-05646cd4.js.map} +1 -1
- package/dist/_chunks/{AuthenticatedApp-f24f321f.mjs → AuthenticatedApp-eb11e2e5.mjs} +21 -23
- package/dist/_chunks/{AuthenticatedApp-f24f321f.mjs.map → AuthenticatedApp-eb11e2e5.mjs.map} +1 -1
- package/dist/_chunks/{HomePage-b823c307.mjs → HomePage-533fa34b.mjs} +4 -4
- package/dist/_chunks/{HomePage-b823c307.mjs.map → HomePage-533fa34b.mjs.map} +1 -1
- package/dist/_chunks/{HomePage-b1c06062.js → HomePage-5a4509b0.js} +4 -4
- package/dist/_chunks/{HomePage-b1c06062.js.map → HomePage-5a4509b0.js.map} +1 -1
- package/dist/_chunks/{HomePage-33cab09d.js → HomePage-bc6d277c.js} +4 -4
- package/dist/_chunks/{HomePage-33cab09d.js.map → HomePage-bc6d277c.js.map} +1 -1
- package/dist/_chunks/{HomePage-04ec4032.mjs → HomePage-fc702a97.mjs} +4 -4
- package/dist/_chunks/{HomePage-04ec4032.mjs.map → HomePage-fc702a97.mjs.map} +1 -1
- package/dist/_chunks/{InstalledPluginsPage-fa047d30.mjs → InstalledPluginsPage-0d9773b3.mjs} +3 -3
- package/dist/_chunks/{InstalledPluginsPage-fa047d30.mjs.map → InstalledPluginsPage-0d9773b3.mjs.map} +1 -1
- package/dist/_chunks/{InstalledPluginsPage-9c637cc4.js → InstalledPluginsPage-65a93649.js} +3 -3
- package/dist/_chunks/{InstalledPluginsPage-9c637cc4.js.map → InstalledPluginsPage-65a93649.js.map} +1 -1
- package/dist/_chunks/{Login-b5fa7d29.js → Login-706279b2.js} +2 -2
- package/dist/_chunks/{Login-b5fa7d29.js.map → Login-706279b2.js.map} +1 -1
- package/dist/_chunks/{Login-2b9cf5b5.mjs → Login-ce24cb95.mjs} +2 -2
- package/dist/_chunks/{Login-2b9cf5b5.mjs.map → Login-ce24cb95.mjs.map} +1 -1
- package/dist/_chunks/{MarketplacePage-b369a20a.mjs → MarketplacePage-2ff62347.mjs} +3 -3
- package/dist/_chunks/{MarketplacePage-b369a20a.mjs.map → MarketplacePage-2ff62347.mjs.map} +1 -1
- package/dist/_chunks/{MarketplacePage-8fa435bb.js → MarketplacePage-e3360ae3.js} +3 -3
- package/dist/_chunks/{MarketplacePage-8fa435bb.js.map → MarketplacePage-e3360ae3.js.map} +1 -1
- package/dist/_chunks/{ProfilePage-b34e12b8.js → ProfilePage-60e913df.js} +3 -3
- package/dist/_chunks/{ProfilePage-b34e12b8.js.map → ProfilePage-60e913df.js.map} +1 -1
- package/dist/_chunks/{ProfilePage-8001a7f1.mjs → ProfilePage-8016a64e.mjs} +3 -3
- package/dist/_chunks/{ProfilePage-8001a7f1.mjs.map → ProfilePage-8016a64e.mjs.map} +1 -1
- package/dist/_chunks/{constants-31704c5f.mjs → constants-0628a3c5.mjs} +5 -5
- package/dist/_chunks/{constants-31704c5f.mjs.map → constants-0628a3c5.mjs.map} +1 -1
- package/dist/_chunks/{constants-8df3b52e.js → constants-2b87dbfc.js} +2 -2
- package/dist/_chunks/{constants-8df3b52e.js.map → constants-2b87dbfc.js.map} +1 -1
- package/dist/_chunks/{constants-b4d73802.js → constants-569aa6c6.js} +5 -5
- package/dist/_chunks/{constants-b4d73802.js.map → constants-569aa6c6.js.map} +1 -1
- package/dist/_chunks/{constants-c051e0d5.js → constants-a2c06f5e.js} +6 -6
- package/dist/_chunks/{constants-c051e0d5.js.map → constants-a2c06f5e.js.map} +1 -1
- package/dist/_chunks/{constants-8cd1cfee.mjs → constants-aca2d559.mjs} +3 -3
- package/dist/_chunks/{constants-8cd1cfee.mjs.map → constants-aca2d559.mjs.map} +1 -1
- package/dist/_chunks/{constants-fd27075d.mjs → constants-d33f0b30.mjs} +6 -6
- package/dist/_chunks/{constants-fd27075d.mjs.map → constants-d33f0b30.mjs.map} +1 -1
- package/dist/_chunks/{constants-c8a5b818.mjs → constants-e1bf93e3.mjs} +2 -2
- package/dist/_chunks/{constants-c8a5b818.mjs.map → constants-e1bf93e3.mjs.map} +1 -1
- package/dist/_chunks/{constants-fcdceeaa.js → constants-ec58fb05.js} +3 -3
- package/dist/_chunks/{constants-fcdceeaa.js.map → constants-ec58fb05.js.map} +1 -1
- package/dist/_chunks/{index-9df9ea46.js → index-000609b4.js} +3 -3
- package/dist/_chunks/{index-9df9ea46.js.map → index-000609b4.js.map} +1 -1
- package/dist/_chunks/{index-fe6abbd8.mjs → index-00d89da8.mjs} +5 -5
- package/dist/_chunks/{index-fe6abbd8.mjs.map → index-00d89da8.mjs.map} +1 -1
- package/dist/_chunks/{index-865b6d8c.mjs → index-059ea31a.mjs} +3 -3
- package/dist/_chunks/{index-865b6d8c.mjs.map → index-059ea31a.mjs.map} +1 -1
- package/dist/_chunks/{index-9805fcc7.js → index-09b56ad7.js} +5 -5
- package/dist/_chunks/{index-9805fcc7.js.map → index-09b56ad7.js.map} +1 -1
- package/dist/_chunks/{index-85709d8c.js → index-18d023fa.js} +4 -4
- package/dist/_chunks/{index-85709d8c.js.map → index-18d023fa.js.map} +1 -1
- package/dist/_chunks/{index-8327720a.mjs → index-20500452.mjs} +5 -5
- package/dist/_chunks/{index-8327720a.mjs.map → index-20500452.mjs.map} +1 -1
- package/dist/_chunks/{index-4c2ebc25.mjs → index-20eece58.mjs} +3 -3
- package/dist/_chunks/{index-4c2ebc25.mjs.map → index-20eece58.mjs.map} +1 -1
- package/dist/_chunks/{index-cb4cbdeb.js → index-2351c5c0.js} +2 -2
- package/dist/_chunks/{index-cb4cbdeb.js.map → index-2351c5c0.js.map} +1 -1
- package/dist/_chunks/{index-5b38e224.mjs → index-2351dcf1.mjs} +3 -3
- package/dist/_chunks/{index-5b38e224.mjs.map → index-2351dcf1.mjs.map} +1 -1
- package/dist/_chunks/{index-e678495b.js → index-25771344.js} +4 -4
- package/dist/_chunks/{index-e678495b.js.map → index-25771344.js.map} +1 -1
- package/dist/_chunks/{index-6ea05c8f.mjs → index-26de45af.mjs} +4 -4
- package/dist/_chunks/{index-6ea05c8f.mjs.map → index-26de45af.mjs.map} +1 -1
- package/dist/_chunks/{index-b218e597.mjs → index-273f323f.mjs} +6 -6
- package/dist/_chunks/{index-b218e597.mjs.map → index-273f323f.mjs.map} +1 -1
- package/dist/_chunks/{index-b3197a23.mjs → index-2b26ce47.mjs} +4 -4
- package/dist/_chunks/{index-b3197a23.mjs.map → index-2b26ce47.mjs.map} +1 -1
- package/dist/_chunks/{index-b13d90e7.js → index-44b02149.js} +3 -3
- package/dist/_chunks/{index-b13d90e7.js.map → index-44b02149.js.map} +1 -1
- package/dist/_chunks/{index-3ba088fb.js → index-473aed78.js} +3 -3
- package/dist/_chunks/{index-3ba088fb.js.map → index-473aed78.js.map} +1 -1
- package/dist/_chunks/{index-711f7298.mjs → index-4a663908.mjs} +2 -2
- package/dist/_chunks/{index-711f7298.mjs.map → index-4a663908.mjs.map} +1 -1
- package/dist/_chunks/{index-f2291a58.js → index-4f36fc29.js} +6 -6
- package/dist/_chunks/{index-f2291a58.js.map → index-4f36fc29.js.map} +1 -1
- package/dist/_chunks/{index-fbf4f310.js → index-520090d7.js} +8 -8
- package/dist/_chunks/{index-fbf4f310.js.map → index-520090d7.js.map} +1 -1
- package/dist/_chunks/{index-b5087350.js → index-564e2504.js} +5 -5
- package/dist/_chunks/{index-b5087350.js.map → index-564e2504.js.map} +1 -1
- package/dist/_chunks/{index-b101325c.js → index-5ae8ea79.js} +5 -5
- package/dist/_chunks/{index-b101325c.js.map → index-5ae8ea79.js.map} +1 -1
- package/dist/_chunks/{index-f5ca7d46.mjs → index-5d07cae8.mjs} +3 -3
- package/dist/_chunks/{index-f5ca7d46.mjs.map → index-5d07cae8.mjs.map} +1 -1
- package/dist/_chunks/{index-53830803.js → index-64304241.js} +5 -5
- package/dist/_chunks/{index-53830803.js.map → index-64304241.js.map} +1 -1
- package/dist/_chunks/{index-1d771689.mjs → index-65c65846.mjs} +3 -3
- package/dist/_chunks/{index-1d771689.mjs.map → index-65c65846.mjs.map} +1 -1
- package/dist/_chunks/{index-c0e40c84.mjs → index-6655a389.mjs} +5 -5
- package/dist/_chunks/{index-c0e40c84.mjs.map → index-6655a389.mjs.map} +1 -1
- package/dist/_chunks/{index-7ecebfb0.mjs → index-6b1786f2.mjs} +3 -3
- package/dist/_chunks/{index-7ecebfb0.mjs.map → index-6b1786f2.mjs.map} +1 -1
- package/dist/_chunks/{index-ffd394eb.js → index-6b6bd200.js} +4 -4
- package/dist/_chunks/{index-ffd394eb.js.map → index-6b6bd200.js.map} +1 -1
- package/dist/_chunks/{index-b65f2a5e.mjs → index-6ed43460.mjs} +5 -5
- package/dist/_chunks/{index-b65f2a5e.mjs.map → index-6ed43460.mjs.map} +1 -1
- package/dist/_chunks/{index-27ce57a1.js → index-70b9d544.js} +3 -3
- package/dist/_chunks/{index-27ce57a1.js.map → index-70b9d544.js.map} +1 -1
- package/dist/_chunks/{index-8609157c.js → index-7131721a.js} +5 -5
- package/dist/_chunks/{index-8609157c.js.map → index-7131721a.js.map} +1 -1
- package/dist/_chunks/{index-701729ff.js → index-72d5475c.js} +4 -4
- package/dist/_chunks/{index-701729ff.js.map → index-72d5475c.js.map} +1 -1
- package/dist/_chunks/{index-3f08a869.js → index-72e9c0c3.js} +3 -3
- package/dist/_chunks/{index-3f08a869.js.map → index-72e9c0c3.js.map} +1 -1
- package/dist/_chunks/{index-3eae1349.js → index-7368aadf.js} +4 -4
- package/dist/_chunks/{index-3eae1349.js.map → index-7368aadf.js.map} +1 -1
- package/dist/_chunks/{index-231d316d.js → index-78410805.js} +20 -20
- package/dist/_chunks/{index-231d316d.js.map → index-78410805.js.map} +1 -1
- package/dist/_chunks/{index-7368090c.mjs → index-7e4cb9fc.mjs} +4 -4
- package/dist/_chunks/{index-7368090c.mjs.map → index-7e4cb9fc.mjs.map} +1 -1
- package/dist/_chunks/{index-70fff1ea.js → index-8395d169.js} +3 -3
- package/dist/_chunks/{index-70fff1ea.js.map → index-8395d169.js.map} +1 -1
- package/dist/_chunks/{index-73f3b79b.mjs → index-83e8def4.mjs} +2 -2
- package/dist/_chunks/{index-73f3b79b.mjs.map → index-83e8def4.mjs.map} +1 -1
- package/dist/_chunks/{index-b781106d.mjs → index-850cc832.mjs} +5 -5
- package/dist/_chunks/{index-b781106d.mjs.map → index-850cc832.mjs.map} +1 -1
- package/dist/_chunks/{index-ea3d5e1d.mjs → index-8a728f87.mjs} +3 -3
- package/dist/_chunks/{index-ea3d5e1d.mjs.map → index-8a728f87.mjs.map} +1 -1
- package/dist/_chunks/{index-ca37bfb3.mjs → index-8fb9874b.mjs} +5 -5
- package/dist/_chunks/{index-ca37bfb3.mjs.map → index-8fb9874b.mjs.map} +1 -1
- package/dist/_chunks/{index-f8753ba6.mjs → index-90002ce7.mjs} +8 -8
- package/dist/_chunks/{index-f8753ba6.mjs.map → index-90002ce7.mjs.map} +1 -1
- package/dist/_chunks/{index-feefb2d2.mjs → index-915b9a62.mjs} +3 -3
- package/dist/_chunks/{index-feefb2d2.mjs.map → index-915b9a62.mjs.map} +1 -1
- package/dist/_chunks/{index-fe8836c5.mjs → index-93387e7b.mjs} +4 -4
- package/dist/_chunks/{index-fe8836c5.mjs.map → index-93387e7b.mjs.map} +1 -1
- package/dist/_chunks/{index-5215d60d.js → index-a758189f.js} +3 -3
- package/dist/_chunks/{index-5215d60d.js.map → index-a758189f.js.map} +1 -1
- package/dist/_chunks/{index-6fd665d2.js → index-a77344b4.js} +3 -3
- package/dist/_chunks/{index-6fd665d2.js.map → index-a77344b4.js.map} +1 -1
- package/dist/_chunks/{index-6cde3416.mjs → index-a83d65dd.mjs} +3 -3
- package/dist/_chunks/{index-6cde3416.mjs.map → index-a83d65dd.mjs.map} +1 -1
- package/dist/_chunks/{index-d1c2c8c4.mjs → index-b0044064.mjs} +3 -3
- package/dist/_chunks/{index-d1c2c8c4.mjs.map → index-b0044064.mjs.map} +1 -1
- package/dist/_chunks/{index-84367690.mjs → index-b5bb12cb.mjs} +3 -3
- package/dist/_chunks/{index-84367690.mjs.map → index-b5bb12cb.mjs.map} +1 -1
- package/dist/_chunks/{index-68f7d4f8.js → index-b8907601.js} +4 -4
- package/dist/_chunks/{index-68f7d4f8.js.map → index-b8907601.js.map} +1 -1
- package/dist/_chunks/{index-e2f7197e.mjs → index-bc9f3d19.mjs} +20 -20
- package/dist/_chunks/{index-e2f7197e.mjs.map → index-bc9f3d19.mjs.map} +1 -1
- package/dist/_chunks/{index-7fbdc60f.js → index-bf55bc04.js} +3 -3
- package/dist/_chunks/{index-7fbdc60f.js.map → index-bf55bc04.js.map} +1 -1
- package/dist/_chunks/{index-587ac367.js → index-c1979a73.js} +3 -3
- package/dist/_chunks/{index-587ac367.js.map → index-c1979a73.js.map} +1 -1
- package/dist/_chunks/{index-da70193f.js → index-c88d2f37.js} +2 -2
- package/dist/_chunks/{index-da70193f.js.map → index-c88d2f37.js.map} +1 -1
- package/dist/_chunks/{index-10472775.js → index-ca79b9cf.js} +3 -3
- package/dist/_chunks/{index-10472775.js.map → index-ca79b9cf.js.map} +1 -1
- package/dist/_chunks/{index-f32d3d61.mjs → index-d34cca62.mjs} +4 -4
- package/dist/_chunks/{index-f32d3d61.mjs.map → index-d34cca62.mjs.map} +1 -1
- package/dist/_chunks/{index-3837b503.mjs → index-d56b1699.mjs} +2 -2
- package/dist/_chunks/{index-3837b503.mjs.map → index-d56b1699.mjs.map} +1 -1
- package/dist/_chunks/{index-9841c472.mjs → index-d8518771.mjs} +3 -3
- package/dist/_chunks/{index-9841c472.mjs.map → index-d8518771.mjs.map} +1 -1
- package/dist/_chunks/{index-a09c5d95.mjs → index-d8d3daa2.mjs} +4 -4
- package/dist/_chunks/{index-a09c5d95.mjs.map → index-d8d3daa2.mjs.map} +1 -1
- package/dist/_chunks/{index-6aa0150d.mjs → index-de4061ae.mjs} +4 -4
- package/dist/_chunks/{index-6aa0150d.mjs.map → index-de4061ae.mjs.map} +1 -1
- package/dist/_chunks/{index-e9875b61.js → index-e9a0254d.js} +4 -4
- package/dist/_chunks/{index-e9875b61.js.map → index-e9a0254d.js.map} +1 -1
- package/dist/_chunks/{index-471ce13f.js → index-ecba7004.js} +5 -5
- package/dist/_chunks/{index-471ce13f.js.map → index-ecba7004.js.map} +1 -1
- package/dist/_chunks/{index-ae8d84d3.js → index-ee9ea8f5.js} +3 -3
- package/dist/_chunks/{index-ae8d84d3.js.map → index-ee9ea8f5.js.map} +1 -1
- package/dist/_chunks/{index-3c715269.mjs → index-f86af771.mjs} +3 -3
- package/dist/_chunks/{index-3c715269.mjs.map → index-f86af771.mjs.map} +1 -1
- package/dist/_chunks/{index-51abf431.js → index-f948123b.js} +3 -3
- package/dist/_chunks/{index-51abf431.js.map → index-f948123b.js.map} +1 -1
- package/dist/_chunks/{index-fffa8f97.js → index-fdd436a9.js} +2 -2
- package/dist/_chunks/{index-fffa8f97.js.map → index-fdd436a9.js.map} +1 -1
- package/dist/_chunks/{schema-b5882935.js → schema-0d632526.js} +2 -2
- package/dist/_chunks/{schema-b5882935.js.map → schema-0d632526.js.map} +1 -1
- package/dist/_chunks/{schema-65dcecf7.mjs → schema-4b1fa95e.mjs} +2 -2
- package/dist/_chunks/{schema-65dcecf7.mjs.map → schema-4b1fa95e.mjs.map} +1 -1
- package/dist/_chunks/{validateWorkflow-da8d22a8.js → validateWorkflow-a796c6f8.js} +3 -3
- package/dist/_chunks/{validateWorkflow-da8d22a8.js.map → validateWorkflow-a796c6f8.js.map} +1 -1
- package/dist/_chunks/{validateWorkflow-1ace6175.mjs → validateWorkflow-d72e91f0.mjs} +3 -3
- package/dist/_chunks/{validateWorkflow-1ace6175.mjs.map → validateWorkflow-d72e91f0.mjs.map} +1 -1
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/ee/LICENSE +1 -0
- package/package.json +12 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-e2f7197e.mjs","sources":["../../admin/src/hooks/useSettingsMenu.ts","../../admin/src/pages/SettingsPage/components/SettingsNav/index.js","../../admin/src/pages/SettingsPage/constants.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/constants.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/reducer.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/index.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/reducer.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/parseFileMetadatas.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromComputerForm.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/urlToFile.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromUrlForm.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/AddLogoDialog.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/ImageCardAsset.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/PendingLogoDialog.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/stepper.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/index.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/init.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/reducer.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/index.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/getFormData.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/index.js","../../admin/src/pages/SettingsPage/utils/makeUniqueRoutes.ts","../../admin/src/pages/SettingsPage/index.js"],"sourcesContent":["import * as React from 'react';\n\nimport {\n hasPermissions,\n StrapiAppSetting,\n StrapiAppSettingLink,\n useRBACProvider,\n useStrapiApp,\n useAppInfo,\n} from '@strapi/helper-plugin';\nimport sortBy from 'lodash/sortBy';\nimport { useSelector } from 'react-redux';\n\nimport { SETTINGS_LINKS_CE, SettingsMenuLink } from '../constants';\nimport { selectAdminPermissions } from '../selectors';\n\nimport { useEnterprise } from './useEnterprise';\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: StrapiAppSettingLink['permissions'];\n}\n\ninterface SettingsMenuSection extends Omit<StrapiAppSetting, 'links'> {\n links: Array<SettingsMenuLinkWithPermissions | StrapiAppSettingLink>;\n}\n\ninterface SettingsMenuLinkWithPermissionsAndDisplayed extends SettingsMenuLinkWithPermissions {\n isDisplayed: boolean;\n}\n\ninterface StrapiAppSettingLinkWithDisplayed extends StrapiAppSettingLink {\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 { allPermissions: userPermissions } = useRBACProvider();\n const { shouldUpdateStrapi } = useAppInfo();\n const { settings } = useStrapiApp();\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]?.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 hasPermissions(userPermissions, link.permissions),\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 }, [adminLinks, globalLinks, userPermissions, settings, shouldUpdateStrapi, addPermissions]);\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","import React from 'react';\n\nimport { Icon } from '@strapi/design-system';\nimport {\n SubNav,\n SubNavHeader,\n SubNavLink,\n SubNavSection,\n SubNavSections,\n} from '@strapi/design-system/v2';\nimport { useTracking } from '@strapi/helper-plugin';\nimport { Lock } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useLocation } from 'react-router-dom';\nimport styled from 'styled-components';\n\n/**\n * TODO: refactor the SubNav entirely, we shouldn't have\n * to do this hack to work a lock at the end. It's a bit hacky.\n */\n\nconst CustomIcon = styled(Icon)`\n right: 15px;\n position: absolute;\n`;\n\nconst SettingsNav = ({ menu }) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { pathname } = useLocation();\n\n const filteredMenu = menu.filter(\n (section) => !section.links.every((link) => link.isDisplayed === false)\n );\n\n const sections = filteredMenu.map((section) => {\n return {\n ...section,\n title: section.intlLabel,\n links: section.links.map((link) => {\n return {\n ...link,\n title: link.intlLabel,\n name: link.id,\n };\n }),\n };\n });\n\n const label = formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n });\n\n const handleClickOnLink = (destination = null) => {\n trackUsage('willNavigate', { from: pathname, to: destination });\n };\n\n return (\n <SubNav ariaLabel={label}>\n <SubNavHeader label={label} />\n <SubNavSections>\n {sections.map((section) => (\n <SubNavSection key={section.id} label={formatMessage(section.intlLabel)}>\n {section.links.map((link) => {\n return (\n <SubNavLink\n as={NavLink}\n withBullet={link.hasNotification}\n to={link.to}\n onClick={() => handleClickOnLink(link.to)}\n key={link.id}\n >\n {formatMessage(link.intlLabel)}\n {link?.lockIcon && (\n <CustomIcon width={`${15 / 16}rem`} height={`${15 / 16}rem`} as={Lock} />\n )}\n </SubNavLink>\n );\n })}\n </SubNavSection>\n ))}\n </SubNavSections>\n </SubNav>\n );\n};\n\nSettingsNav.propTypes = {\n menu: PropTypes.array.isRequired,\n};\n\nexport default SettingsNav;\n","export const ROUTES_CE = [\n {\n async Component() {\n const component = await import('./pages/Roles/ProtectedListPage');\n\n return component;\n },\n to: '/settings/roles',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Roles/CreatePage');\n\n return component;\n },\n to: '/settings/roles/duplicate/:id',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Roles/CreatePage');\n\n return component;\n },\n to: '/settings/roles/new',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Roles/ProtectedEditPage');\n\n return component;\n },\n to: '/settings/roles/:id',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Users/ProtectedListPage');\n\n return component;\n },\n to: '/settings/users',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Users/ProtectedEditPage');\n\n return component;\n },\n to: '/settings/users/:id',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Webhooks/ProtectedCreateView');\n\n return component;\n },\n to: '/settings/webhooks/create',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Webhooks/ProtectedEditView');\n\n return component;\n },\n to: '/settings/webhooks/:id',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Webhooks/ProtectedListView');\n\n return component;\n },\n to: '/settings/webhooks',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/ApiTokens/ProtectedListView');\n\n return component;\n },\n to: '/settings/api-tokens',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/ApiTokens/ProtectedCreateView');\n\n return component;\n },\n to: '/settings/api-tokens/create',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/ApiTokens/ProtectedEditView');\n\n return component;\n },\n to: '/settings/api-tokens/:id',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/TransferTokens/ProtectedCreateView');\n\n return component;\n },\n to: '/settings/transfer-tokens/create',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/TransferTokens/ProtectedListView');\n\n return component;\n },\n to: '/settings/transfer-tokens',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/TransferTokens/ProtectedEditView');\n\n return component;\n },\n to: '/settings/transfer-tokens/:id',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/AuditLogs/SalesPage');\n\n return component;\n },\n to: '/settings/purchase-audit-logs',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/ReviewWorkflows/SalesPage');\n\n return component;\n },\n to: '/settings/purchase-review-workflows',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/SingleSignOn/SalesPage');\n\n return component;\n },\n to: '/settings/purchase-single-sign-on',\n exact: true,\n },\n];\n","export const DIMENSION = 750;\nexport const SIZE = 100;\nexport const ACCEPTED_FORMAT = ['image/jpeg', 'image/png', 'image/svg+xml'];\n","/* eslint-disable consistent-return */\n/*\n *\n * LogoModalStepper reducer\n *\n */\n\nimport produce from 'immer';\n\nconst initialState = {\n localImage: undefined,\n};\n\nconst reducer = (state = initialState, action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'SET_LOCAL_IMAGE': {\n draftState.localImage = action.value;\n break;\n }\n default: {\n return draftState;\n }\n }\n });\n\nexport default reducer;\nexport { initialState };\n","import React, { useReducer } from 'react';\n\nimport { ModalHeader, ModalLayout, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport reducer, { initialState } from './reducer';\n\nconst LogoModalStepper = ({\n onChangeLogo,\n customLogo,\n goTo,\n Component,\n modalTitle,\n next,\n prev,\n currentStep,\n}) => {\n const [{ localImage }, dispatch] = useReducer(reducer, initialState);\n const { formatMessage } = useIntl();\n\n const setLocalImage = (asset) => {\n dispatch({\n type: 'SET_LOCAL_IMAGE',\n value: asset,\n });\n };\n\n const handleCloseModal = () => {\n goTo(null);\n };\n\n if (!currentStep) {\n return null;\n }\n\n return (\n <ModalLayout labelledBy=\"modal\" onClose={handleCloseModal}>\n <ModalHeader>\n <Typography fontWeight=\"bold\" as=\"h2\" id=\"modal\">\n {formatMessage(modalTitle)}\n </Typography>\n </ModalHeader>\n <Component\n setLocalImage={setLocalImage}\n goTo={goTo}\n next={next}\n prev={prev}\n onClose={handleCloseModal}\n asset={localImage || customLogo}\n onChangeLogo={onChangeLogo}\n />\n </ModalLayout>\n );\n};\n\nLogoModalStepper.defaultProps = {\n Component: undefined,\n currentStep: undefined,\n customLogo: undefined,\n modalTitle: undefined,\n next: null,\n prev: null,\n};\n\nLogoModalStepper.propTypes = {\n Component: PropTypes.elementType,\n currentStep: PropTypes.string,\n customLogo: PropTypes.shape({\n name: PropTypes.string,\n url: PropTypes.string,\n width: PropTypes.number,\n height: PropTypes.number,\n ext: PropTypes.string,\n }),\n goTo: PropTypes.func.isRequired,\n modalTitle: PropTypes.shape({\n id: PropTypes.string,\n defaultMessage: PropTypes.string,\n }),\n next: PropTypes.string,\n onChangeLogo: PropTypes.func.isRequired,\n prev: PropTypes.string,\n};\n\nexport default LogoModalStepper;\n","/* eslint-disable consistent-return */\n/*\n *\n * LogoInput reducer\n *\n */\n\nimport produce from 'immer';\n\nconst initialState = {\n currentStep: undefined,\n};\n\nconst reducer = (state = initialState, action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'GO_TO': {\n draftState.currentStep = action.to;\n break;\n }\n default: {\n return draftState;\n }\n }\n });\n\nexport default reducer;\nexport { initialState };\n","import { ACCEPTED_FORMAT, DIMENSION, SIZE } from './constants';\n\nconst FILE_FORMAT_ERROR_MESSAGE = {\n id: 'Settings.application.customization.modal.upload.error-format',\n defaultMessage: 'Wrong format uploaded (accepted formats only: jpeg, jpg, png, svg).',\n};\n\nconst FILE_SIZING_ERROR_MESSAGE = {\n id: 'Settings.application.customization.modal.upload.error-size',\n defaultMessage:\n 'The file uploaded is too large (max dimension: {dimension}x{dimension}, max file size: {size}KB)',\n};\n\nconst getFileDimensions = (file) => {\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = () => {\n const img = new Image();\n img.onload = function () {\n resolve({ width: img.width, height: img.height });\n };\n img.src = reader.result;\n };\n reader.readAsDataURL(file);\n });\n};\n\nconst rawFileToAsset = (rawFile, fileDimensions) => {\n return {\n ext: rawFile.name.split('.').pop(),\n size: rawFile.size / 1000,\n name: rawFile.name,\n url: URL.createObjectURL(rawFile),\n rawFile,\n width: fileDimensions.width,\n height: fileDimensions.height,\n };\n};\n\nexport const parseFileMetadatas = async (file) => {\n let error;\n\n const isFormatAuthorized = ACCEPTED_FORMAT.includes(file.type);\n\n if (!isFormatAuthorized) {\n error = new Error('File format');\n error.displayMessage = FILE_FORMAT_ERROR_MESSAGE;\n\n throw error;\n }\n\n const fileDimensions = await getFileDimensions(file);\n\n const areDimensionsAuthorized =\n fileDimensions.width <= DIMENSION && fileDimensions.height <= DIMENSION;\n\n if (!areDimensionsAuthorized) {\n error = new Error('File sizing');\n error.displayMessage = FILE_SIZING_ERROR_MESSAGE;\n\n throw error;\n }\n\n const asset = rawFileToAsset(file, fileDimensions);\n\n const isSizeAuthorized = asset.size <= SIZE;\n\n if (!isSizeAuthorized) {\n error = new Error('File sizing');\n error.displayMessage = FILE_SIZING_ERROR_MESSAGE;\n\n throw error;\n }\n\n return asset;\n};\n","import React, { useRef, useState } from 'react';\n\nimport {\n Box,\n Button,\n Field,\n FieldError,\n FieldInput,\n Flex,\n Icon,\n ModalFooter,\n Typography,\n} from '@strapi/design-system';\nimport { PicturePlus } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { ACCEPTED_FORMAT, DIMENSION, SIZE } from '../../utils/constants';\nimport { parseFileMetadatas } from '../../utils/parseFileMetadatas';\n\nconst FileInput = styled(FieldInput)`\n opacity: 0;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1;\n`;\n\nconst FromComputerForm = ({ setLocalImage, goTo, next, onClose }) => {\n const { formatMessage } = useIntl();\n const [dragOver, setDragOver] = useState(false);\n const [fileError, setFileError] = useState(undefined);\n const inputRef = useRef(null);\n\n const handleDragEnter = () => setDragOver(true);\n const handleDragLeave = () => setDragOver(false);\n\n const handleClick = (e) => {\n e.preventDefault();\n inputRef.current.click();\n };\n\n const handleChange = async () => {\n handleDragLeave();\n const file = inputRef.current.files[0];\n\n if (!file) {\n return;\n }\n\n try {\n const asset = await parseFileMetadatas(file);\n setLocalImage(asset);\n goTo(next);\n } catch (err) {\n if (err.displayMessage) {\n setFileError(formatMessage(err.displayMessage, { size: SIZE, dimension: DIMENSION }));\n inputRef.current.focus();\n } else {\n throw err;\n }\n }\n };\n\n const getBorderColor = () => {\n if (dragOver) {\n return 'primary500';\n }\n if (fileError) {\n return 'danger600';\n }\n\n return 'neutral300';\n };\n\n return (\n <>\n <form>\n <Box paddingLeft={8} paddingRight={8} paddingTop={6} paddingBottom={6}>\n <Field name=\"logo-upload\" error={fileError}>\n <label htmlFor=\"logo-upload\">\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Flex\n paddingTop={9}\n paddingBottom={7}\n hasRadius\n justifyContent=\"center\"\n direction=\"column\"\n background={dragOver ? 'primary100' : 'neutral100'}\n borderColor={getBorderColor()}\n borderStyle=\"dashed\"\n borderWidth=\"1px\"\n position=\"relative\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n >\n <Icon\n color=\"primary600\"\n width={`${60 / 16}rem`}\n height={`${60 / 16}rem`}\n as={PicturePlus}\n aria-hidden\n />\n\n <Box paddingTop={3} paddingBottom={5}>\n <Typography variant=\"delta\" as=\"span\">\n {formatMessage({\n id: 'Settings.application.customization.modal.upload.drag-drop',\n defaultMessage: 'Drag and Drop here or',\n })}\n </Typography>\n </Box>\n\n <FileInput\n accept={ACCEPTED_FORMAT}\n cursor=\"pointer\"\n as=\"input\"\n type=\"file\"\n name=\"files\"\n tabIndex={-1}\n zIndex={1}\n onChange={handleChange}\n ref={inputRef}\n id=\"logo-upload\"\n />\n\n <Button type=\"button\" onClick={handleClick}>\n {formatMessage({\n id: 'Settings.application.customization.modal.upload.cta.browse',\n defaultMessage: 'Browse files',\n })}\n </Button>\n\n <Box paddingTop={6}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: 'Settings.application.customization.modal.upload.file-validation',\n defaultMessage:\n 'Max dimension: {dimension}x{dimension}, Max size: {size}KB',\n },\n { size: SIZE, dimension: DIMENSION }\n )}\n </Typography>\n </Box>\n </Flex>\n <FieldError />\n </Flex>\n </label>\n </Field>\n </Box>\n </form>\n <ModalFooter\n startActions={\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({\n id: 'Settings.application.customization.modal.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n }\n />\n </>\n );\n};\n\nFromComputerForm.defaultProps = {\n next: null,\n};\n\nFromComputerForm.propTypes = {\n goTo: PropTypes.func.isRequired,\n next: PropTypes.string,\n onClose: PropTypes.func.isRequired,\n setLocalImage: PropTypes.func.isRequired,\n};\n\nexport default FromComputerForm;\n","import { getFetchClient } from '@strapi/helper-plugin';\n\nconst urlToFile = async (url) => {\n try {\n const { get } = getFetchClient();\n const res = await get(url, { responseType: 'blob', timeout: 8000 });\n const loadedFile = new File([res.data], res.config.url, {\n type: res.headers['content-type'],\n });\n\n return loadedFile;\n } catch (err) {\n err.displayMessage = {\n id: 'Settings.application.customization.modal.upload.error-network',\n defaultMessage: 'Network error',\n };\n\n throw err;\n }\n};\n\nexport default urlToFile;\n","import React, { useState } from 'react';\n\nimport { Box, Button, ModalFooter, TextInput } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { DIMENSION, SIZE } from '../../utils/constants';\nimport { parseFileMetadatas } from '../../utils/parseFileMetadatas';\nimport urlToFile from '../../utils/urlToFile';\n\nconst FromUrlForm = ({ goTo, next, onClose, setLocalImage }) => {\n const { formatMessage } = useIntl();\n const [logoUrl, setLogoUrl] = useState('');\n const [error, setError] = useState(null);\n\n const handleChange = (e) => {\n setLogoUrl(e.target.value);\n };\n\n const handleSubmit = async () => {\n try {\n const file = await urlToFile(logoUrl);\n const asset = await parseFileMetadatas(file);\n\n setLocalImage(asset);\n goTo(next);\n } catch (err) {\n if (err.displayMessage) {\n setError(formatMessage(err.displayMessage, { size: SIZE, dimension: DIMENSION }));\n } else {\n throw err;\n }\n }\n };\n\n return (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n handleSubmit();\n }}\n >\n <Box paddingLeft={8} paddingRight={8} paddingTop={6} paddingBottom={6}>\n <TextInput\n label={formatMessage({\n id: 'Settings.application.customization.modal.upload.from-url.input-label',\n defaultMessage: 'URL',\n })}\n error={error}\n onChange={handleChange}\n value={logoUrl}\n name=\"logo-url\"\n />\n </Box>\n <ModalFooter\n startActions={\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n }\n endActions={\n <Button type=\"submit\">\n {formatMessage({\n id: 'Settings.application.customization.modal.upload.next',\n defaultMessage: 'Next',\n })}\n </Button>\n }\n />\n </form>\n );\n};\n\nFromUrlForm.defaultProps = {\n next: null,\n};\n\nFromUrlForm.propTypes = {\n goTo: PropTypes.func.isRequired,\n next: PropTypes.string,\n onClose: PropTypes.func.isRequired,\n setLocalImage: PropTypes.func.isRequired,\n};\n\nexport default FromUrlForm;\n","import React from 'react';\n\nimport { Box, Divider, Tab, TabGroup, TabPanel, TabPanels, Tabs } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport FromComputerForm from './FromComputerForm';\nimport FromUrlForm from './FromUrlForm';\n\nconst AddLogoDialog = ({ setLocalImage, goTo, next, onClose }) => {\n const { formatMessage } = useIntl();\n\n return (\n <TabGroup\n label={formatMessage({\n id: 'Settings.application.customization.modal.tab.label',\n defaultMessage: 'How do you want to upload your assets?',\n })}\n variant=\"simple\"\n >\n <Box paddingLeft={8} paddingRight={8}>\n <Tabs>\n <Tab>\n {formatMessage({\n id: 'Settings.application.customization.modal.upload.from-computer',\n defaultMessage: 'From computer',\n })}\n </Tab>\n <Tab>\n {formatMessage({\n id: 'Settings.application.customization.modal.upload.from-url',\n defaultMessage: 'From url',\n })}\n </Tab>\n </Tabs>\n\n <Divider />\n </Box>\n <TabPanels>\n <TabPanel>\n <FromComputerForm\n onClose={onClose}\n setLocalImage={setLocalImage}\n goTo={goTo}\n next={next}\n />\n </TabPanel>\n <TabPanel>\n <FromUrlForm onClose={onClose} setLocalImage={setLocalImage} goTo={goTo} next={next} />\n </TabPanel>\n </TabPanels>\n </TabGroup>\n );\n};\n\nAddLogoDialog.defaultProps = {\n next: null,\n};\n\nAddLogoDialog.propTypes = {\n goTo: PropTypes.func.isRequired,\n next: PropTypes.string,\n onClose: PropTypes.func.isRequired,\n setLocalImage: PropTypes.func.isRequired,\n};\n\nexport default AddLogoDialog;\n","import React from 'react';\n\nimport {\n Card,\n CardAsset,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n} from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nconst ImageCardAsset = ({ asset }) => {\n const { formatMessage } = useIntl();\n\n return (\n <Card>\n <CardHeader>\n <CardAsset size=\"S\" src={asset.url} />\n </CardHeader>\n <CardBody>\n <CardContent>\n <CardTitle>{asset.name}</CardTitle>\n <CardSubtitle>\n {`${asset.ext.toUpperCase()} - ${asset.width}✕${asset.height}`}\n </CardSubtitle>\n </CardContent>\n <CardBadge>\n {formatMessage({\n id: 'Settings.application.customization.modal.pending.card-badge',\n defaultMessage: 'image',\n })}\n </CardBadge>\n </CardBody>\n </Card>\n );\n};\n\nImageCardAsset.propTypes = {\n asset: PropTypes.shape({\n name: PropTypes.string,\n url: PropTypes.string,\n width: PropTypes.number,\n height: PropTypes.number,\n ext: PropTypes.string,\n }).isRequired,\n};\n\nexport default ImageCardAsset;\n","import React from 'react';\n\nimport { Box, Button, Flex, ModalFooter, Typography } from '@strapi/design-system';\nimport { pxToRem } from '@strapi/helper-plugin';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport ImageCardAsset from './ImageCardAsset';\n\nconst PendingLogoDialog = ({ onClose, asset, prev, next, goTo, setLocalImage, onChangeLogo }) => {\n const { formatMessage } = useIntl();\n\n const handleGoBack = () => {\n setLocalImage(undefined);\n goTo(prev);\n };\n\n const handleUpload = () => {\n onChangeLogo(asset);\n goTo(next);\n };\n\n return (\n <>\n <Box paddingLeft={8} paddingRight={8} paddingTop={6} paddingBottom={6}>\n <Flex justifyContent=\"space-between\" paddingBottom={6}>\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {formatMessage({\n id: 'Settings.application.customization.modal.pending.title',\n defaultMessage: 'Logo ready to upload',\n })}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {formatMessage({\n id: 'Settings.application.customization.modal.pending.subtitle',\n defaultMessage: 'Manage the chosen logo before uploading it',\n })}\n </Typography>\n </Flex>\n <Button onClick={handleGoBack} variant=\"secondary\">\n {formatMessage({\n id: 'Settings.application.customization.modal.pending.choose-another',\n defaultMessage: 'Choose another logo',\n })}\n </Button>\n </Flex>\n <Box maxWidth={pxToRem(180)}>{asset.url ? <ImageCardAsset asset={asset} /> : null}</Box>\n </Box>\n <ModalFooter\n startActions={\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({\n id: 'Settings.application.customization.modal.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n }\n endActions={\n <Button onClick={handleUpload}>\n {formatMessage({\n id: 'Settings.application.customization.modal.pending.upload',\n defaultMessage: 'Upload logo',\n })}\n </Button>\n }\n />\n </>\n );\n};\n\nPendingLogoDialog.defaultProps = {\n next: null,\n prev: null,\n};\n\nPendingLogoDialog.propTypes = {\n goTo: PropTypes.func.isRequired,\n asset: PropTypes.shape({\n name: PropTypes.string,\n url: PropTypes.string,\n width: PropTypes.number,\n height: PropTypes.number,\n ext: PropTypes.string,\n }).isRequired,\n next: PropTypes.string,\n onClose: PropTypes.func.isRequired,\n onChangeLogo: PropTypes.func.isRequired,\n prev: PropTypes.string,\n setLocalImage: PropTypes.func.isRequired,\n};\n\nexport default PendingLogoDialog;\n","import AddLogoDialog from '../LogoModalStepper/AddLogoDialog';\nimport PendingLogoDialog from '../LogoModalStepper/PendingLogoDialog';\n\nconst stepper = {\n upload: {\n Component: AddLogoDialog,\n modalTitle: {\n id: 'Settings.application.customization.modal.upload',\n defaultMessage: 'Upload logo',\n },\n next: 'pending',\n prev: null,\n },\n pending: {\n Component: PendingLogoDialog,\n modalTitle: {\n id: 'Settings.application.customization.modal.pending',\n defaultMessage: 'Pending logo',\n },\n next: null,\n prev: 'upload',\n },\n};\n\nexport default stepper;\n","import React, { useReducer } from 'react';\n\nimport {\n Box,\n CarouselActions,\n CarouselInput,\n CarouselSlide,\n IconButton,\n} from '@strapi/design-system';\nimport { Plus, Refresh } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport LogoModalStepper from '../LogoModalStepper';\n\nimport reducer, { initialState } from './reducer';\nimport stepper from './stepper';\n\nconst LogoInput = ({\n canUpdate,\n customLogo,\n defaultLogo,\n hint,\n label,\n onChangeLogo,\n onResetLogo,\n}) => {\n const [{ currentStep }, dispatch] = useReducer(reducer, initialState);\n const { Component, next, prev, modalTitle } = stepper[currentStep] || {};\n const { formatMessage } = useIntl();\n\n const goTo = (to) => {\n dispatch({\n type: 'GO_TO',\n to,\n });\n };\n\n return (\n <>\n <CarouselInput\n label={label}\n selectedSlide={0}\n hint={hint}\n // Carousel is used here for a single media,\n // we don't need previous and next labels but these props are required\n previousLabel=\"\"\n nextLabel=\"\"\n onNext={() => {}}\n onPrevious={() => {}}\n secondaryLabel={customLogo?.name || 'logo.png'}\n actions={\n <CarouselActions>\n <IconButton\n disabled={!canUpdate}\n onClick={() => goTo(customLogo ? 'pending' : 'upload')}\n label={formatMessage({\n id: 'Settings.application.customization.carousel.change-action',\n defaultMessage: 'Change logo',\n })}\n icon={<Plus />}\n />\n {customLogo && (\n <IconButton\n disabled={!canUpdate}\n onClick={onResetLogo}\n label={formatMessage({\n id: 'Settings.application.customization.carousel.reset-action',\n defaultMessage: 'Reset logo',\n })}\n icon={<Refresh />}\n />\n )}\n </CarouselActions>\n }\n >\n <CarouselSlide\n label={formatMessage({\n id: 'Settings.application.customization.carousel-slide.label',\n defaultMessage: 'Logo slide',\n })}\n >\n <Box\n maxHeight=\"40%\"\n maxWidth=\"40%\"\n as=\"img\"\n src={customLogo?.url || defaultLogo}\n alt={formatMessage({\n id: 'Settings.application.customization.carousel.title',\n defaultMessage: 'Logo',\n })}\n />\n </CarouselSlide>\n </CarouselInput>\n <LogoModalStepper\n Component={Component}\n currentStep={currentStep}\n onChangeLogo={onChangeLogo}\n customLogo={customLogo}\n goTo={goTo}\n next={next}\n prev={prev}\n modalTitle={modalTitle}\n />\n </>\n );\n};\n\nLogoInput.defaultProps = {\n canUpdate: false,\n customLogo: null,\n hint: null,\n};\n\nLogoInput.propTypes = {\n canUpdate: PropTypes.bool,\n customLogo: PropTypes.shape({\n url: PropTypes.string,\n name: PropTypes.string,\n }),\n label: PropTypes.string.isRequired,\n hint: PropTypes.string,\n defaultLogo: PropTypes.string.isRequired,\n onChangeLogo: PropTypes.func.isRequired,\n onResetLogo: PropTypes.func.isRequired,\n};\n\nexport default LogoInput;\n","import merge from 'lodash/merge';\n\nconst init = (initialState, projectSettingsStored) => {\n const copyInitialState = merge(initialState, {\n menuLogo: {\n display: projectSettingsStored.menuLogo,\n },\n authLogo: {\n display: projectSettingsStored.authLogo,\n },\n });\n\n return copyInitialState;\n};\n\nexport default init;\n","/* eslint-disable consistent-return */\n/*\n *\n * ApplicationInfosPage Form reducer\n *\n */\n\nimport produce from 'immer';\n\nconst initialState = {\n menuLogo: {\n display: null,\n submit: {\n rawFile: null,\n isReset: false,\n },\n },\n authLogo: {\n display: null,\n submit: {\n rawFile: null,\n isReset: false,\n },\n },\n};\n\nconst reducer = (state = initialState, action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'SET_CUSTOM_MENU_LOGO': {\n draftState.menuLogo.display = action.value;\n draftState.menuLogo.submit.rawFile = action.value.rawFile;\n break;\n }\n case 'SET_CUSTOM_AUTH_LOGO': {\n draftState.authLogo.display = action.value;\n draftState.authLogo.submit.rawFile = action.value.rawFile;\n break;\n }\n case 'RESET_CUSTOM_MENU_LOGO': {\n draftState.menuLogo.display = null;\n draftState.menuLogo.submit = {\n rawFile: null,\n isReset: true,\n };\n break;\n }\n case 'RESET_CUSTOM_AUTH_LOGO': {\n draftState.authLogo.display = null;\n draftState.authLogo.submit = {\n rawFile: null,\n isReset: true,\n };\n break;\n }\n default: {\n return draftState;\n }\n }\n });\n\nexport default reducer;\nexport { initialState };\n","import React, { forwardRef, useImperativeHandle, useReducer } from 'react';\n\nimport { Box, Grid, GridItem, Typography } from '@strapi/design-system';\nimport { useTracking } from '@strapi/helper-plugin';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { useConfiguration } from '../../../../../../contexts/configuration';\nimport { DIMENSION, SIZE } from '../../utils/constants';\nimport LogoInput from '../LogoInput';\n\nimport init from './init';\nimport reducer, { initialState } from './reducer';\n\nconst CustomizationInfos = forwardRef(({ canUpdate, projectSettingsStored }, ref) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const {\n logos: { menu, auth },\n } = useConfiguration();\n const [{ menuLogo, authLogo }, dispatch] = useReducer(reducer, initialState, () =>\n init(initialState, projectSettingsStored)\n );\n\n const handleChangeMenuLogo = (asset) => {\n dispatch({\n type: 'SET_CUSTOM_MENU_LOGO',\n value: asset,\n });\n };\n\n const handleResetMenuLogo = () => {\n trackUsage('didClickResetLogo', {\n logo: 'menu',\n });\n\n dispatch({\n type: 'RESET_CUSTOM_MENU_LOGO',\n });\n };\n\n const handleChangeAuthLogo = (asset) => {\n dispatch({\n type: 'SET_CUSTOM_AUTH_LOGO',\n value: asset,\n });\n };\n\n const handleResetAuthLogo = () => {\n trackUsage('didClickResetLogo', {\n logo: 'auth',\n });\n\n dispatch({\n type: 'RESET_CUSTOM_AUTH_LOGO',\n });\n };\n\n useImperativeHandle(ref, () => ({\n getValues: () => ({ menuLogo: menuLogo.submit, authLogo: authLogo.submit }),\n }));\n\n return (\n <Box\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingRight={7}\n paddingLeft={7}\n >\n <Typography variant=\"delta\" as=\"h3\">\n {formatMessage({\n id: 'Settings.application.customization',\n defaultMessage: 'Customization',\n })}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: 'Settings.application.customization.size-details',\n defaultMessage: 'Max dimension: {dimension}×{dimension}, Max file size: {size}KB',\n },\n { dimension: DIMENSION, size: SIZE }\n )}\n </Typography>\n <Grid paddingTop={4} gap={4}>\n <GridItem col={6} s={12}>\n <LogoInput\n canUpdate={canUpdate}\n customLogo={menuLogo.display}\n defaultLogo={menu.default}\n hint={formatMessage({\n id: 'Settings.application.customization.menu-logo.carousel-hint',\n defaultMessage: 'Replace the logo in the main navigation',\n })}\n label={formatMessage({\n id: 'Settings.application.customization.carousel.menu-logo.title',\n defaultMessage: 'Menu logo',\n })}\n onChangeLogo={handleChangeMenuLogo}\n onResetLogo={handleResetMenuLogo}\n />\n </GridItem>\n <GridItem col={6} s={12}>\n <LogoInput\n canUpdate={canUpdate}\n customLogo={authLogo.display}\n defaultLogo={auth.default}\n hint={formatMessage({\n id: 'Settings.application.customization.auth-logo.carousel-hint',\n defaultMessage: 'Replace the logo in the authentication pages',\n })}\n label={formatMessage({\n id: 'Settings.application.customization.carousel.auth-logo.title',\n defaultMessage: 'Auth logo',\n })}\n onChangeLogo={handleChangeAuthLogo}\n onResetLogo={handleResetAuthLogo}\n />\n </GridItem>\n </Grid>\n </Box>\n );\n});\n\nCustomizationInfos.defaultProps = {\n canUpdate: false,\n projectSettingsStored: null,\n};\n\nCustomizationInfos.propTypes = {\n canUpdate: PropTypes.bool,\n projectSettingsStored: PropTypes.shape({\n menuLogo: PropTypes.shape({\n url: PropTypes.string,\n name: PropTypes.string,\n }),\n }),\n};\n\nexport default CustomizationInfos;\n","const getFormData = (data) => {\n const formData = new FormData();\n\n Object.entries(data).forEach(([key, value]) => {\n if (value && value.rawFile instanceof File) {\n formData.append(key, value.rawFile);\n }\n\n if (value && value.isReset) {\n formData.append(key, null);\n }\n });\n\n return formData;\n};\n\nexport default getFormData;\n","import * as React from 'react';\n\nimport {\n Button,\n ContentLayout,\n Flex,\n Grid,\n GridItem,\n HeaderLayout,\n Layout,\n Link,\n Loader,\n Main,\n Typography,\n} from '@strapi/design-system';\nimport {\n prefixFileUrlWithBackendUrl,\n SettingsPageTitle,\n useAPIErrorHandler,\n useAppInfo,\n useFetchClient,\n useFocusWhenNavigate,\n useNotification,\n useRBAC,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { Check, ExternalLink } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery } from 'react-query';\nimport { useSelector } from 'react-redux';\n\nimport { useConfiguration } from '../../../../contexts/configuration';\nimport { useEnterprise } from '../../../../hooks/useEnterprise';\nimport { selectAdminPermissions } from '../../../../selectors';\n\nimport CustomizationInfos from './components/CustomizationInfos';\nimport getFormData from './utils/getFormData';\n\nconst AdminSeatInfoCE = () => null;\n\nconst ApplicationInfosPage = () => {\n const inputsRef = React.useRef();\n const toggleNotification = useNotification();\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { get, post } = useFetchClient();\n const { updateProjectSettings } = useConfiguration();\n const permissions = useSelector(selectAdminPermissions);\n const { formatAPIError } = useAPIErrorHandler();\n\n const {\n communityEdition,\n latestStrapiReleaseTag,\n nodeVersion,\n shouldUpdateStrapi,\n strapiVersion,\n } = useAppInfo();\n\n const AdminSeatInfo = useEnterprise(\n AdminSeatInfoCE,\n async () =>\n (\n await import(\n '../../../../../../ee/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo'\n )\n ).AdminSeatInfoEE\n );\n\n const {\n allowedActions: { canRead, canUpdate },\n } = useRBAC(permissions.settings['project-settings']);\n\n useFocusWhenNavigate();\n\n const { data, isLoading } = useQuery(\n ['project-settings'],\n async () => {\n const { data } = await get('/admin/project-settings');\n\n return data;\n },\n {\n cacheTime: 0,\n enabled: canRead,\n select(data) {\n return {\n ...data,\n\n authLogo: data.authLogo\n ? {\n ...data.authLogo,\n url: prefixFileUrlWithBackendUrl(data.authLogo.url),\n }\n : data.authLogo,\n\n menuLogo: data.menuLogo\n ? {\n ...data.menuLogo,\n url: prefixFileUrlWithBackendUrl(data.menuLogo.url),\n }\n : data.menuLogo,\n };\n },\n }\n );\n\n const submitMutation = useMutation(\n (body) =>\n post('/admin/project-settings', body, {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n }),\n {\n onError(error) {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(error),\n });\n },\n\n async onSuccess(data) {\n const { menuLogo, authLogo } = data;\n\n updateProjectSettings({ menuLogo: menuLogo?.url, authLogo: authLogo?.url });\n\n if (menuLogo?.rawFile) {\n trackUsage('didChangeLogo', {\n logo: 'menu',\n });\n }\n\n if (authLogo?.rawFile) {\n trackUsage('didChangeLogo', {\n logo: 'auth',\n });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'app', defaultMessage: 'Saved' }),\n });\n },\n }\n );\n\n const handleSubmit = (e) => {\n e.preventDefault();\n\n submitMutation.mutate(getFormData(inputsRef.current.getValues()));\n };\n\n // block rendering until the EE component is fully loaded\n if (!AdminSeatInfo) {\n return null;\n }\n\n return (\n <Layout>\n {/* TODO: Add missing translation */}\n <SettingsPageTitle name=\"Application\" />\n <Main>\n {isLoading ? (\n <Loader>\n {formatMessage({\n id: 'Settings.application.isLoading',\n defaultMessage: 'Loading',\n })}\n </Loader>\n ) : (\n <form onSubmit={handleSubmit}>\n <HeaderLayout\n title={formatMessage({\n id: 'Settings.application.title',\n defaultMessage: 'Overview',\n })}\n subtitle={formatMessage({\n id: 'Settings.application.description',\n defaultMessage: 'Administration panel’s global information',\n })}\n primaryAction={\n canUpdate && (\n <Button type=\"submit\" startIcon={<Check />}>\n {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n </Button>\n )\n }\n />\n <ContentLayout>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingRight={7}\n paddingLeft={7}\n >\n <Typography variant=\"delta\" as=\"h3\">\n {formatMessage({\n id: 'global.details',\n defaultMessage: 'Details',\n })}\n </Typography>\n\n <Grid gap={5} as=\"dl\">\n <GridItem col={6} s={12}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" as=\"dt\">\n {formatMessage({\n id: 'Settings.application.strapiVersion',\n defaultMessage: 'strapi version',\n })}\n </Typography>\n <Flex gap={3} direction=\"column\" alignItems=\"start\" as=\"dd\">\n <Typography>v{strapiVersion}</Typography>\n {shouldUpdateStrapi && (\n <Link\n href={`https://github.com/strapi/strapi/releases/tag/${latestStrapiReleaseTag}`}\n isExternal\n endIcon={<ExternalLink />}\n >\n {formatMessage({\n id: 'Settings.application.link-upgrade',\n defaultMessage: 'Upgrade your admin panel',\n })}\n </Link>\n )}\n </Flex>\n </GridItem>\n <GridItem col={6} s={12}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" as=\"dt\">\n {formatMessage({\n id: 'Settings.application.edition-title',\n defaultMessage: 'current plan',\n })}\n </Typography>\n <Flex gap={3} direction=\"column\" alignItems=\"start\" as=\"dd\">\n <Typography>\n {formatMessage(\n {\n id: 'Settings.application.ee-or-ce',\n defaultMessage:\n '{communityEdition, select, true {Community Edition} other {Enterprise Edition}}',\n },\n { communityEdition }\n )}\n </Typography>\n <Link\n href=\"https://strapi.io/pricing-self-hosted\"\n isExternal\n endIcon={<ExternalLink />}\n >\n {formatMessage({\n id: 'Settings.application.link-pricing',\n defaultMessage: 'See all pricing plans',\n })}\n </Link>\n </Flex>\n </GridItem>\n\n <GridItem col={6} s={12}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" as=\"dt\">\n {formatMessage({\n id: 'Settings.application.node-version',\n defaultMessage: 'node version',\n })}\n </Typography>\n <Typography as=\"dd\">{nodeVersion}</Typography>\n </GridItem>\n <AdminSeatInfo />\n </Grid>\n </Flex>\n {canRead && data && (\n <CustomizationInfos\n canUpdate={canUpdate}\n ref={inputsRef}\n projectSettingsStored={data}\n />\n )}\n </Flex>\n </ContentLayout>\n </form>\n )}\n </Main>\n </Layout>\n );\n};\n\nexport default ApplicationInfosPage;\n","import { MenuItem } from '@strapi/helper-plugin';\n\ninterface UniqueRouteProps\n extends Pick<MenuItem, 'to' | 'exact'>,\n Required<Pick<MenuItem, 'Component'>> {\n key: string;\n}\n\nexport function makeUniqueRoutes(routes: UniqueRouteProps[]) {\n return routes.filter(\n (route, index, refArray) => refArray.findIndex((obj) => obj.key === route.key) === index\n );\n}\n","import * as React from 'react';\n\nimport { Layout } from '@strapi/design-system';\nimport { LoadingIndicatorPage, useStrapiApp } from '@strapi/helper-plugin';\nimport { Helmet } from 'react-helmet';\nimport { useIntl } from 'react-intl';\nimport { Redirect, Route, Switch, useParams } from 'react-router-dom';\n\nimport { useEnterprise } from '../../hooks/useEnterprise';\nimport { useSettingsMenu } from '../../hooks/useSettingsMenu';\nimport { createRoute } from '../../utils/createRoute';\n\nimport SettingsNav from './components/SettingsNav';\nimport { ROUTES_CE } from './constants';\nimport ApplicationInfosPage from './pages/ApplicationInfosPage';\n// TODO: inline utility once the file is converted to TypeScript\nimport { makeUniqueRoutes } from './utils/makeUniqueRoutes';\n\nexport function SettingsPage() {\n const { settingId } = useParams();\n const { settings } = useStrapiApp();\n const { formatMessage } = useIntl();\n const { isLoading, menu } = useSettingsMenu();\n const routes = useEnterprise(\n ROUTES_CE,\n async () => (await import('../../../../ee/admin/src/pages/SettingsPage/constants')).ROUTES_EE,\n {\n combine(ceRoutes, eeRoutes) {\n return [...ceRoutes, ...eeRoutes];\n },\n defaultValue: [],\n }\n );\n\n // Creates the admin routes\n const adminRoutes = React.useMemo(() => {\n return makeUniqueRoutes(\n routes.map(({ to, Component, exact }) => createRoute(Component, to, exact))\n );\n }, [routes]);\n\n const pluginsRoutes = Object.values(settings).flatMap((section) => {\n const { links } = section;\n\n return links.map((link) => createRoute(link.Component, link.to, link.exact || false));\n });\n\n // Since the useSettingsMenu hook can make API calls in order to check the links permissions\n // We need to add a loading state to prevent redirecting the user while permissions are being checked\n if (isLoading) {\n return <LoadingIndicatorPage />;\n }\n\n if (!settingId) {\n return <Redirect to=\"/settings/application-infos\" />;\n }\n\n return (\n <Layout sideNav={<SettingsNav menu={menu} />}>\n <Helmet\n title={formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n />\n\n <Switch>\n <Route path=\"/settings/application-infos\" component={ApplicationInfosPage} exact />\n {adminRoutes}\n {pluginsRoutes}\n </Switch>\n </Layout>\n );\n}\n"],"names":["ceLinks","sections","permission","initialState","reducer","data"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-bc9f3d19.mjs","sources":["../../admin/src/hooks/useSettingsMenu.ts","../../admin/src/pages/SettingsPage/components/SettingsNav/index.js","../../admin/src/pages/SettingsPage/constants.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/constants.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/reducer.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/index.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/reducer.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/parseFileMetadatas.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromComputerForm.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/urlToFile.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/FromUrlForm.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/AddLogoDialog.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/ImageCardAsset.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoModalStepper/PendingLogoDialog.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/stepper.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/LogoInput/index.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/init.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/reducer.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/index.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/utils/getFormData.js","../../admin/src/pages/SettingsPage/pages/ApplicationInfosPage/index.js","../../admin/src/pages/SettingsPage/utils/makeUniqueRoutes.ts","../../admin/src/pages/SettingsPage/index.js"],"sourcesContent":["import * as React from 'react';\n\nimport {\n hasPermissions,\n StrapiAppSetting,\n StrapiAppSettingLink,\n useRBACProvider,\n useStrapiApp,\n useAppInfo,\n} from '@strapi/helper-plugin';\nimport sortBy from 'lodash/sortBy';\nimport { useSelector } from 'react-redux';\n\nimport { SETTINGS_LINKS_CE, SettingsMenuLink } from '../constants';\nimport { selectAdminPermissions } from '../selectors';\n\nimport { useEnterprise } from './useEnterprise';\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: StrapiAppSettingLink['permissions'];\n}\n\ninterface SettingsMenuSection extends Omit<StrapiAppSetting, 'links'> {\n links: Array<SettingsMenuLinkWithPermissions | StrapiAppSettingLink>;\n}\n\ninterface SettingsMenuLinkWithPermissionsAndDisplayed extends SettingsMenuLinkWithPermissions {\n isDisplayed: boolean;\n}\n\ninterface StrapiAppSettingLinkWithDisplayed extends StrapiAppSettingLink {\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 { allPermissions: userPermissions } = useRBACProvider();\n const { shouldUpdateStrapi } = useAppInfo();\n const { settings } = useStrapiApp();\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]?.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 hasPermissions(userPermissions, link.permissions),\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 }, [adminLinks, globalLinks, userPermissions, settings, shouldUpdateStrapi, addPermissions]);\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","import React from 'react';\n\nimport { Icon } from '@strapi/design-system';\nimport {\n SubNav,\n SubNavHeader,\n SubNavLink,\n SubNavSection,\n SubNavSections,\n} from '@strapi/design-system/v2';\nimport { useTracking } from '@strapi/helper-plugin';\nimport { Lock } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useLocation } from 'react-router-dom';\nimport styled from 'styled-components';\n\n/**\n * TODO: refactor the SubNav entirely, we shouldn't have\n * to do this hack to work a lock at the end. It's a bit hacky.\n */\n\nconst CustomIcon = styled(Icon)`\n right: 15px;\n position: absolute;\n`;\n\nconst SettingsNav = ({ menu }) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { pathname } = useLocation();\n\n const filteredMenu = menu.filter(\n (section) => !section.links.every((link) => link.isDisplayed === false)\n );\n\n const sections = filteredMenu.map((section) => {\n return {\n ...section,\n title: section.intlLabel,\n links: section.links.map((link) => {\n return {\n ...link,\n title: link.intlLabel,\n name: link.id,\n };\n }),\n };\n });\n\n const label = formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n });\n\n const handleClickOnLink = (destination = null) => {\n trackUsage('willNavigate', { from: pathname, to: destination });\n };\n\n return (\n <SubNav ariaLabel={label}>\n <SubNavHeader label={label} />\n <SubNavSections>\n {sections.map((section) => (\n <SubNavSection key={section.id} label={formatMessage(section.intlLabel)}>\n {section.links.map((link) => {\n return (\n <SubNavLink\n as={NavLink}\n withBullet={link.hasNotification}\n to={link.to}\n onClick={() => handleClickOnLink(link.to)}\n key={link.id}\n >\n {formatMessage(link.intlLabel)}\n {link?.lockIcon && (\n <CustomIcon width={`${15 / 16}rem`} height={`${15 / 16}rem`} as={Lock} />\n )}\n </SubNavLink>\n );\n })}\n </SubNavSection>\n ))}\n </SubNavSections>\n </SubNav>\n );\n};\n\nSettingsNav.propTypes = {\n menu: PropTypes.array.isRequired,\n};\n\nexport default SettingsNav;\n","export const ROUTES_CE = [\n {\n async Component() {\n const component = await import('./pages/Roles/ProtectedListPage');\n\n return component;\n },\n to: '/settings/roles',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Roles/CreatePage');\n\n return component;\n },\n to: '/settings/roles/duplicate/:id',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Roles/CreatePage');\n\n return component;\n },\n to: '/settings/roles/new',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Roles/ProtectedEditPage');\n\n return component;\n },\n to: '/settings/roles/:id',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Users/ProtectedListPage');\n\n return component;\n },\n to: '/settings/users',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Users/ProtectedEditPage');\n\n return component;\n },\n to: '/settings/users/:id',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Webhooks/ProtectedCreateView');\n\n return component;\n },\n to: '/settings/webhooks/create',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Webhooks/ProtectedEditView');\n\n return component;\n },\n to: '/settings/webhooks/:id',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/Webhooks/ProtectedListView');\n\n return component;\n },\n to: '/settings/webhooks',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/ApiTokens/ProtectedListView');\n\n return component;\n },\n to: '/settings/api-tokens',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/ApiTokens/ProtectedCreateView');\n\n return component;\n },\n to: '/settings/api-tokens/create',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/ApiTokens/ProtectedEditView');\n\n return component;\n },\n to: '/settings/api-tokens/:id',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/TransferTokens/ProtectedCreateView');\n\n return component;\n },\n to: '/settings/transfer-tokens/create',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/TransferTokens/ProtectedListView');\n\n return component;\n },\n to: '/settings/transfer-tokens',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/TransferTokens/ProtectedEditView');\n\n return component;\n },\n to: '/settings/transfer-tokens/:id',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/AuditLogs/SalesPage');\n\n return component;\n },\n to: '/settings/purchase-audit-logs',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/ReviewWorkflows/SalesPage');\n\n return component;\n },\n to: '/settings/purchase-review-workflows',\n exact: true,\n },\n {\n async Component() {\n const component = await import('./pages/SingleSignOn/SalesPage');\n\n return component;\n },\n to: '/settings/purchase-single-sign-on',\n exact: true,\n },\n];\n","export const DIMENSION = 750;\nexport const SIZE = 100;\nexport const ACCEPTED_FORMAT = ['image/jpeg', 'image/png', 'image/svg+xml'];\n","/* eslint-disable consistent-return */\n/*\n *\n * LogoModalStepper reducer\n *\n */\n\nimport produce from 'immer';\n\nconst initialState = {\n localImage: undefined,\n};\n\nconst reducer = (state = initialState, action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'SET_LOCAL_IMAGE': {\n draftState.localImage = action.value;\n break;\n }\n default: {\n return draftState;\n }\n }\n });\n\nexport default reducer;\nexport { initialState };\n","import React, { useReducer } from 'react';\n\nimport { ModalHeader, ModalLayout, Typography } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport reducer, { initialState } from './reducer';\n\nconst LogoModalStepper = ({\n onChangeLogo,\n customLogo,\n goTo,\n Component,\n modalTitle,\n next,\n prev,\n currentStep,\n}) => {\n const [{ localImage }, dispatch] = useReducer(reducer, initialState);\n const { formatMessage } = useIntl();\n\n const setLocalImage = (asset) => {\n dispatch({\n type: 'SET_LOCAL_IMAGE',\n value: asset,\n });\n };\n\n const handleCloseModal = () => {\n goTo(null);\n };\n\n if (!currentStep) {\n return null;\n }\n\n return (\n <ModalLayout labelledBy=\"modal\" onClose={handleCloseModal}>\n <ModalHeader>\n <Typography fontWeight=\"bold\" as=\"h2\" id=\"modal\">\n {formatMessage(modalTitle)}\n </Typography>\n </ModalHeader>\n <Component\n setLocalImage={setLocalImage}\n goTo={goTo}\n next={next}\n prev={prev}\n onClose={handleCloseModal}\n asset={localImage || customLogo}\n onChangeLogo={onChangeLogo}\n />\n </ModalLayout>\n );\n};\n\nLogoModalStepper.defaultProps = {\n Component: undefined,\n currentStep: undefined,\n customLogo: undefined,\n modalTitle: undefined,\n next: null,\n prev: null,\n};\n\nLogoModalStepper.propTypes = {\n Component: PropTypes.elementType,\n currentStep: PropTypes.string,\n customLogo: PropTypes.shape({\n name: PropTypes.string,\n url: PropTypes.string,\n width: PropTypes.number,\n height: PropTypes.number,\n ext: PropTypes.string,\n }),\n goTo: PropTypes.func.isRequired,\n modalTitle: PropTypes.shape({\n id: PropTypes.string,\n defaultMessage: PropTypes.string,\n }),\n next: PropTypes.string,\n onChangeLogo: PropTypes.func.isRequired,\n prev: PropTypes.string,\n};\n\nexport default LogoModalStepper;\n","/* eslint-disable consistent-return */\n/*\n *\n * LogoInput reducer\n *\n */\n\nimport produce from 'immer';\n\nconst initialState = {\n currentStep: undefined,\n};\n\nconst reducer = (state = initialState, action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'GO_TO': {\n draftState.currentStep = action.to;\n break;\n }\n default: {\n return draftState;\n }\n }\n });\n\nexport default reducer;\nexport { initialState };\n","import { ACCEPTED_FORMAT, DIMENSION, SIZE } from './constants';\n\nconst FILE_FORMAT_ERROR_MESSAGE = {\n id: 'Settings.application.customization.modal.upload.error-format',\n defaultMessage: 'Wrong format uploaded (accepted formats only: jpeg, jpg, png, svg).',\n};\n\nconst FILE_SIZING_ERROR_MESSAGE = {\n id: 'Settings.application.customization.modal.upload.error-size',\n defaultMessage:\n 'The file uploaded is too large (max dimension: {dimension}x{dimension}, max file size: {size}KB)',\n};\n\nconst getFileDimensions = (file) => {\n return new Promise((resolve) => {\n const reader = new FileReader();\n reader.onload = () => {\n const img = new Image();\n img.onload = function () {\n resolve({ width: img.width, height: img.height });\n };\n img.src = reader.result;\n };\n reader.readAsDataURL(file);\n });\n};\n\nconst rawFileToAsset = (rawFile, fileDimensions) => {\n return {\n ext: rawFile.name.split('.').pop(),\n size: rawFile.size / 1000,\n name: rawFile.name,\n url: URL.createObjectURL(rawFile),\n rawFile,\n width: fileDimensions.width,\n height: fileDimensions.height,\n };\n};\n\nexport const parseFileMetadatas = async (file) => {\n let error;\n\n const isFormatAuthorized = ACCEPTED_FORMAT.includes(file.type);\n\n if (!isFormatAuthorized) {\n error = new Error('File format');\n error.displayMessage = FILE_FORMAT_ERROR_MESSAGE;\n\n throw error;\n }\n\n const fileDimensions = await getFileDimensions(file);\n\n const areDimensionsAuthorized =\n fileDimensions.width <= DIMENSION && fileDimensions.height <= DIMENSION;\n\n if (!areDimensionsAuthorized) {\n error = new Error('File sizing');\n error.displayMessage = FILE_SIZING_ERROR_MESSAGE;\n\n throw error;\n }\n\n const asset = rawFileToAsset(file, fileDimensions);\n\n const isSizeAuthorized = asset.size <= SIZE;\n\n if (!isSizeAuthorized) {\n error = new Error('File sizing');\n error.displayMessage = FILE_SIZING_ERROR_MESSAGE;\n\n throw error;\n }\n\n return asset;\n};\n","import React, { useRef, useState } from 'react';\n\nimport {\n Box,\n Button,\n Field,\n FieldError,\n FieldInput,\n Flex,\n Icon,\n ModalFooter,\n Typography,\n} from '@strapi/design-system';\nimport { PicturePlus } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { ACCEPTED_FORMAT, DIMENSION, SIZE } from '../../utils/constants';\nimport { parseFileMetadatas } from '../../utils/parseFileMetadatas';\n\nconst FileInput = styled(FieldInput)`\n opacity: 0;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 1;\n`;\n\nconst FromComputerForm = ({ setLocalImage, goTo, next, onClose }) => {\n const { formatMessage } = useIntl();\n const [dragOver, setDragOver] = useState(false);\n const [fileError, setFileError] = useState(undefined);\n const inputRef = useRef(null);\n\n const handleDragEnter = () => setDragOver(true);\n const handleDragLeave = () => setDragOver(false);\n\n const handleClick = (e) => {\n e.preventDefault();\n inputRef.current.click();\n };\n\n const handleChange = async () => {\n handleDragLeave();\n const file = inputRef.current.files[0];\n\n if (!file) {\n return;\n }\n\n try {\n const asset = await parseFileMetadatas(file);\n setLocalImage(asset);\n goTo(next);\n } catch (err) {\n if (err.displayMessage) {\n setFileError(formatMessage(err.displayMessage, { size: SIZE, dimension: DIMENSION }));\n inputRef.current.focus();\n } else {\n throw err;\n }\n }\n };\n\n const getBorderColor = () => {\n if (dragOver) {\n return 'primary500';\n }\n if (fileError) {\n return 'danger600';\n }\n\n return 'neutral300';\n };\n\n return (\n <>\n <form>\n <Box paddingLeft={8} paddingRight={8} paddingTop={6} paddingBottom={6}>\n <Field name=\"logo-upload\" error={fileError}>\n <label htmlFor=\"logo-upload\">\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n <Flex\n paddingTop={9}\n paddingBottom={7}\n hasRadius\n justifyContent=\"center\"\n direction=\"column\"\n background={dragOver ? 'primary100' : 'neutral100'}\n borderColor={getBorderColor()}\n borderStyle=\"dashed\"\n borderWidth=\"1px\"\n position=\"relative\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n >\n <Icon\n color=\"primary600\"\n width={`${60 / 16}rem`}\n height={`${60 / 16}rem`}\n as={PicturePlus}\n aria-hidden\n />\n\n <Box paddingTop={3} paddingBottom={5}>\n <Typography variant=\"delta\" as=\"span\">\n {formatMessage({\n id: 'Settings.application.customization.modal.upload.drag-drop',\n defaultMessage: 'Drag and Drop here or',\n })}\n </Typography>\n </Box>\n\n <FileInput\n accept={ACCEPTED_FORMAT}\n cursor=\"pointer\"\n as=\"input\"\n type=\"file\"\n name=\"files\"\n tabIndex={-1}\n zIndex={1}\n onChange={handleChange}\n ref={inputRef}\n id=\"logo-upload\"\n />\n\n <Button type=\"button\" onClick={handleClick}>\n {formatMessage({\n id: 'Settings.application.customization.modal.upload.cta.browse',\n defaultMessage: 'Browse files',\n })}\n </Button>\n\n <Box paddingTop={6}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: 'Settings.application.customization.modal.upload.file-validation',\n defaultMessage:\n 'Max dimension: {dimension}x{dimension}, Max size: {size}KB',\n },\n { size: SIZE, dimension: DIMENSION }\n )}\n </Typography>\n </Box>\n </Flex>\n <FieldError />\n </Flex>\n </label>\n </Field>\n </Box>\n </form>\n <ModalFooter\n startActions={\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({\n id: 'Settings.application.customization.modal.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n }\n />\n </>\n );\n};\n\nFromComputerForm.defaultProps = {\n next: null,\n};\n\nFromComputerForm.propTypes = {\n goTo: PropTypes.func.isRequired,\n next: PropTypes.string,\n onClose: PropTypes.func.isRequired,\n setLocalImage: PropTypes.func.isRequired,\n};\n\nexport default FromComputerForm;\n","import { getFetchClient } from '@strapi/helper-plugin';\n\nconst urlToFile = async (url) => {\n try {\n const { get } = getFetchClient();\n const res = await get(url, { responseType: 'blob', timeout: 8000 });\n const loadedFile = new File([res.data], res.config.url, {\n type: res.headers['content-type'],\n });\n\n return loadedFile;\n } catch (err) {\n err.displayMessage = {\n id: 'Settings.application.customization.modal.upload.error-network',\n defaultMessage: 'Network error',\n };\n\n throw err;\n }\n};\n\nexport default urlToFile;\n","import React, { useState } from 'react';\n\nimport { Box, Button, ModalFooter, TextInput } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { DIMENSION, SIZE } from '../../utils/constants';\nimport { parseFileMetadatas } from '../../utils/parseFileMetadatas';\nimport urlToFile from '../../utils/urlToFile';\n\nconst FromUrlForm = ({ goTo, next, onClose, setLocalImage }) => {\n const { formatMessage } = useIntl();\n const [logoUrl, setLogoUrl] = useState('');\n const [error, setError] = useState(null);\n\n const handleChange = (e) => {\n setLogoUrl(e.target.value);\n };\n\n const handleSubmit = async () => {\n try {\n const file = await urlToFile(logoUrl);\n const asset = await parseFileMetadatas(file);\n\n setLocalImage(asset);\n goTo(next);\n } catch (err) {\n if (err.displayMessage) {\n setError(formatMessage(err.displayMessage, { size: SIZE, dimension: DIMENSION }));\n } else {\n throw err;\n }\n }\n };\n\n return (\n <form\n onSubmit={(e) => {\n e.preventDefault();\n handleSubmit();\n }}\n >\n <Box paddingLeft={8} paddingRight={8} paddingTop={6} paddingBottom={6}>\n <TextInput\n label={formatMessage({\n id: 'Settings.application.customization.modal.upload.from-url.input-label',\n defaultMessage: 'URL',\n })}\n error={error}\n onChange={handleChange}\n value={logoUrl}\n name=\"logo-url\"\n />\n </Box>\n <ModalFooter\n startActions={\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({ id: 'app.components.Button.cancel', defaultMessage: 'Cancel' })}\n </Button>\n }\n endActions={\n <Button type=\"submit\">\n {formatMessage({\n id: 'Settings.application.customization.modal.upload.next',\n defaultMessage: 'Next',\n })}\n </Button>\n }\n />\n </form>\n );\n};\n\nFromUrlForm.defaultProps = {\n next: null,\n};\n\nFromUrlForm.propTypes = {\n goTo: PropTypes.func.isRequired,\n next: PropTypes.string,\n onClose: PropTypes.func.isRequired,\n setLocalImage: PropTypes.func.isRequired,\n};\n\nexport default FromUrlForm;\n","import React from 'react';\n\nimport { Box, Divider, Tab, TabGroup, TabPanel, TabPanels, Tabs } from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport FromComputerForm from './FromComputerForm';\nimport FromUrlForm from './FromUrlForm';\n\nconst AddLogoDialog = ({ setLocalImage, goTo, next, onClose }) => {\n const { formatMessage } = useIntl();\n\n return (\n <TabGroup\n label={formatMessage({\n id: 'Settings.application.customization.modal.tab.label',\n defaultMessage: 'How do you want to upload your assets?',\n })}\n variant=\"simple\"\n >\n <Box paddingLeft={8} paddingRight={8}>\n <Tabs>\n <Tab>\n {formatMessage({\n id: 'Settings.application.customization.modal.upload.from-computer',\n defaultMessage: 'From computer',\n })}\n </Tab>\n <Tab>\n {formatMessage({\n id: 'Settings.application.customization.modal.upload.from-url',\n defaultMessage: 'From url',\n })}\n </Tab>\n </Tabs>\n\n <Divider />\n </Box>\n <TabPanels>\n <TabPanel>\n <FromComputerForm\n onClose={onClose}\n setLocalImage={setLocalImage}\n goTo={goTo}\n next={next}\n />\n </TabPanel>\n <TabPanel>\n <FromUrlForm onClose={onClose} setLocalImage={setLocalImage} goTo={goTo} next={next} />\n </TabPanel>\n </TabPanels>\n </TabGroup>\n );\n};\n\nAddLogoDialog.defaultProps = {\n next: null,\n};\n\nAddLogoDialog.propTypes = {\n goTo: PropTypes.func.isRequired,\n next: PropTypes.string,\n onClose: PropTypes.func.isRequired,\n setLocalImage: PropTypes.func.isRequired,\n};\n\nexport default AddLogoDialog;\n","import React from 'react';\n\nimport {\n Card,\n CardAsset,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n} from '@strapi/design-system';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nconst ImageCardAsset = ({ asset }) => {\n const { formatMessage } = useIntl();\n\n return (\n <Card>\n <CardHeader>\n <CardAsset size=\"S\" src={asset.url} />\n </CardHeader>\n <CardBody>\n <CardContent>\n <CardTitle>{asset.name}</CardTitle>\n <CardSubtitle>\n {`${asset.ext.toUpperCase()} - ${asset.width}✕${asset.height}`}\n </CardSubtitle>\n </CardContent>\n <CardBadge>\n {formatMessage({\n id: 'Settings.application.customization.modal.pending.card-badge',\n defaultMessage: 'image',\n })}\n </CardBadge>\n </CardBody>\n </Card>\n );\n};\n\nImageCardAsset.propTypes = {\n asset: PropTypes.shape({\n name: PropTypes.string,\n url: PropTypes.string,\n width: PropTypes.number,\n height: PropTypes.number,\n ext: PropTypes.string,\n }).isRequired,\n};\n\nexport default ImageCardAsset;\n","import React from 'react';\n\nimport { Box, Button, Flex, ModalFooter, Typography } from '@strapi/design-system';\nimport { pxToRem } from '@strapi/helper-plugin';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport ImageCardAsset from './ImageCardAsset';\n\nconst PendingLogoDialog = ({ onClose, asset, prev, next, goTo, setLocalImage, onChangeLogo }) => {\n const { formatMessage } = useIntl();\n\n const handleGoBack = () => {\n setLocalImage(undefined);\n goTo(prev);\n };\n\n const handleUpload = () => {\n onChangeLogo(asset);\n goTo(next);\n };\n\n return (\n <>\n <Box paddingLeft={8} paddingRight={8} paddingTop={6} paddingBottom={6}>\n <Flex justifyContent=\"space-between\" paddingBottom={6}>\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\">\n {formatMessage({\n id: 'Settings.application.customization.modal.pending.title',\n defaultMessage: 'Logo ready to upload',\n })}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {formatMessage({\n id: 'Settings.application.customization.modal.pending.subtitle',\n defaultMessage: 'Manage the chosen logo before uploading it',\n })}\n </Typography>\n </Flex>\n <Button onClick={handleGoBack} variant=\"secondary\">\n {formatMessage({\n id: 'Settings.application.customization.modal.pending.choose-another',\n defaultMessage: 'Choose another logo',\n })}\n </Button>\n </Flex>\n <Box maxWidth={pxToRem(180)}>{asset.url ? <ImageCardAsset asset={asset} /> : null}</Box>\n </Box>\n <ModalFooter\n startActions={\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({\n id: 'Settings.application.customization.modal.cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n }\n endActions={\n <Button onClick={handleUpload}>\n {formatMessage({\n id: 'Settings.application.customization.modal.pending.upload',\n defaultMessage: 'Upload logo',\n })}\n </Button>\n }\n />\n </>\n );\n};\n\nPendingLogoDialog.defaultProps = {\n next: null,\n prev: null,\n};\n\nPendingLogoDialog.propTypes = {\n goTo: PropTypes.func.isRequired,\n asset: PropTypes.shape({\n name: PropTypes.string,\n url: PropTypes.string,\n width: PropTypes.number,\n height: PropTypes.number,\n ext: PropTypes.string,\n }).isRequired,\n next: PropTypes.string,\n onClose: PropTypes.func.isRequired,\n onChangeLogo: PropTypes.func.isRequired,\n prev: PropTypes.string,\n setLocalImage: PropTypes.func.isRequired,\n};\n\nexport default PendingLogoDialog;\n","import AddLogoDialog from '../LogoModalStepper/AddLogoDialog';\nimport PendingLogoDialog from '../LogoModalStepper/PendingLogoDialog';\n\nconst stepper = {\n upload: {\n Component: AddLogoDialog,\n modalTitle: {\n id: 'Settings.application.customization.modal.upload',\n defaultMessage: 'Upload logo',\n },\n next: 'pending',\n prev: null,\n },\n pending: {\n Component: PendingLogoDialog,\n modalTitle: {\n id: 'Settings.application.customization.modal.pending',\n defaultMessage: 'Pending logo',\n },\n next: null,\n prev: 'upload',\n },\n};\n\nexport default stepper;\n","import React, { useReducer } from 'react';\n\nimport {\n Box,\n CarouselActions,\n CarouselInput,\n CarouselSlide,\n IconButton,\n} from '@strapi/design-system';\nimport { Plus, Refresh } from '@strapi/icons';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport LogoModalStepper from '../LogoModalStepper';\n\nimport reducer, { initialState } from './reducer';\nimport stepper from './stepper';\n\nconst LogoInput = ({\n canUpdate,\n customLogo,\n defaultLogo,\n hint,\n label,\n onChangeLogo,\n onResetLogo,\n}) => {\n const [{ currentStep }, dispatch] = useReducer(reducer, initialState);\n const { Component, next, prev, modalTitle } = stepper[currentStep] || {};\n const { formatMessage } = useIntl();\n\n const goTo = (to) => {\n dispatch({\n type: 'GO_TO',\n to,\n });\n };\n\n return (\n <>\n <CarouselInput\n label={label}\n selectedSlide={0}\n hint={hint}\n // Carousel is used here for a single media,\n // we don't need previous and next labels but these props are required\n previousLabel=\"\"\n nextLabel=\"\"\n onNext={() => {}}\n onPrevious={() => {}}\n secondaryLabel={customLogo?.name || 'logo.png'}\n actions={\n <CarouselActions>\n <IconButton\n disabled={!canUpdate}\n onClick={() => goTo(customLogo ? 'pending' : 'upload')}\n label={formatMessage({\n id: 'Settings.application.customization.carousel.change-action',\n defaultMessage: 'Change logo',\n })}\n icon={<Plus />}\n />\n {customLogo && (\n <IconButton\n disabled={!canUpdate}\n onClick={onResetLogo}\n label={formatMessage({\n id: 'Settings.application.customization.carousel.reset-action',\n defaultMessage: 'Reset logo',\n })}\n icon={<Refresh />}\n />\n )}\n </CarouselActions>\n }\n >\n <CarouselSlide\n label={formatMessage({\n id: 'Settings.application.customization.carousel-slide.label',\n defaultMessage: 'Logo slide',\n })}\n >\n <Box\n maxHeight=\"40%\"\n maxWidth=\"40%\"\n as=\"img\"\n src={customLogo?.url || defaultLogo}\n alt={formatMessage({\n id: 'Settings.application.customization.carousel.title',\n defaultMessage: 'Logo',\n })}\n />\n </CarouselSlide>\n </CarouselInput>\n <LogoModalStepper\n Component={Component}\n currentStep={currentStep}\n onChangeLogo={onChangeLogo}\n customLogo={customLogo}\n goTo={goTo}\n next={next}\n prev={prev}\n modalTitle={modalTitle}\n />\n </>\n );\n};\n\nLogoInput.defaultProps = {\n canUpdate: false,\n customLogo: null,\n hint: null,\n};\n\nLogoInput.propTypes = {\n canUpdate: PropTypes.bool,\n customLogo: PropTypes.shape({\n url: PropTypes.string,\n name: PropTypes.string,\n }),\n label: PropTypes.string.isRequired,\n hint: PropTypes.string,\n defaultLogo: PropTypes.string.isRequired,\n onChangeLogo: PropTypes.func.isRequired,\n onResetLogo: PropTypes.func.isRequired,\n};\n\nexport default LogoInput;\n","import merge from 'lodash/merge';\n\nconst init = (initialState, projectSettingsStored) => {\n const copyInitialState = merge(initialState, {\n menuLogo: {\n display: projectSettingsStored.menuLogo,\n },\n authLogo: {\n display: projectSettingsStored.authLogo,\n },\n });\n\n return copyInitialState;\n};\n\nexport default init;\n","/* eslint-disable consistent-return */\n/*\n *\n * ApplicationInfosPage Form reducer\n *\n */\n\nimport produce from 'immer';\n\nconst initialState = {\n menuLogo: {\n display: null,\n submit: {\n rawFile: null,\n isReset: false,\n },\n },\n authLogo: {\n display: null,\n submit: {\n rawFile: null,\n isReset: false,\n },\n },\n};\n\nconst reducer = (state = initialState, action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'SET_CUSTOM_MENU_LOGO': {\n draftState.menuLogo.display = action.value;\n draftState.menuLogo.submit.rawFile = action.value.rawFile;\n break;\n }\n case 'SET_CUSTOM_AUTH_LOGO': {\n draftState.authLogo.display = action.value;\n draftState.authLogo.submit.rawFile = action.value.rawFile;\n break;\n }\n case 'RESET_CUSTOM_MENU_LOGO': {\n draftState.menuLogo.display = null;\n draftState.menuLogo.submit = {\n rawFile: null,\n isReset: true,\n };\n break;\n }\n case 'RESET_CUSTOM_AUTH_LOGO': {\n draftState.authLogo.display = null;\n draftState.authLogo.submit = {\n rawFile: null,\n isReset: true,\n };\n break;\n }\n default: {\n return draftState;\n }\n }\n });\n\nexport default reducer;\nexport { initialState };\n","import React, { forwardRef, useImperativeHandle, useReducer } from 'react';\n\nimport { Box, Grid, GridItem, Typography } from '@strapi/design-system';\nimport { useTracking } from '@strapi/helper-plugin';\nimport PropTypes from 'prop-types';\nimport { useIntl } from 'react-intl';\n\nimport { useConfiguration } from '../../../../../../contexts/configuration';\nimport { DIMENSION, SIZE } from '../../utils/constants';\nimport LogoInput from '../LogoInput';\n\nimport init from './init';\nimport reducer, { initialState } from './reducer';\n\nconst CustomizationInfos = forwardRef(({ canUpdate, projectSettingsStored }, ref) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const {\n logos: { menu, auth },\n } = useConfiguration();\n const [{ menuLogo, authLogo }, dispatch] = useReducer(reducer, initialState, () =>\n init(initialState, projectSettingsStored)\n );\n\n const handleChangeMenuLogo = (asset) => {\n dispatch({\n type: 'SET_CUSTOM_MENU_LOGO',\n value: asset,\n });\n };\n\n const handleResetMenuLogo = () => {\n trackUsage('didClickResetLogo', {\n logo: 'menu',\n });\n\n dispatch({\n type: 'RESET_CUSTOM_MENU_LOGO',\n });\n };\n\n const handleChangeAuthLogo = (asset) => {\n dispatch({\n type: 'SET_CUSTOM_AUTH_LOGO',\n value: asset,\n });\n };\n\n const handleResetAuthLogo = () => {\n trackUsage('didClickResetLogo', {\n logo: 'auth',\n });\n\n dispatch({\n type: 'RESET_CUSTOM_AUTH_LOGO',\n });\n };\n\n useImperativeHandle(ref, () => ({\n getValues: () => ({ menuLogo: menuLogo.submit, authLogo: authLogo.submit }),\n }));\n\n return (\n <Box\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingRight={7}\n paddingLeft={7}\n >\n <Typography variant=\"delta\" as=\"h3\">\n {formatMessage({\n id: 'Settings.application.customization',\n defaultMessage: 'Customization',\n })}\n </Typography>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: 'Settings.application.customization.size-details',\n defaultMessage: 'Max dimension: {dimension}×{dimension}, Max file size: {size}KB',\n },\n { dimension: DIMENSION, size: SIZE }\n )}\n </Typography>\n <Grid paddingTop={4} gap={4}>\n <GridItem col={6} s={12}>\n <LogoInput\n canUpdate={canUpdate}\n customLogo={menuLogo.display}\n defaultLogo={menu.default}\n hint={formatMessage({\n id: 'Settings.application.customization.menu-logo.carousel-hint',\n defaultMessage: 'Replace the logo in the main navigation',\n })}\n label={formatMessage({\n id: 'Settings.application.customization.carousel.menu-logo.title',\n defaultMessage: 'Menu logo',\n })}\n onChangeLogo={handleChangeMenuLogo}\n onResetLogo={handleResetMenuLogo}\n />\n </GridItem>\n <GridItem col={6} s={12}>\n <LogoInput\n canUpdate={canUpdate}\n customLogo={authLogo.display}\n defaultLogo={auth.default}\n hint={formatMessage({\n id: 'Settings.application.customization.auth-logo.carousel-hint',\n defaultMessage: 'Replace the logo in the authentication pages',\n })}\n label={formatMessage({\n id: 'Settings.application.customization.carousel.auth-logo.title',\n defaultMessage: 'Auth logo',\n })}\n onChangeLogo={handleChangeAuthLogo}\n onResetLogo={handleResetAuthLogo}\n />\n </GridItem>\n </Grid>\n </Box>\n );\n});\n\nCustomizationInfos.defaultProps = {\n canUpdate: false,\n projectSettingsStored: null,\n};\n\nCustomizationInfos.propTypes = {\n canUpdate: PropTypes.bool,\n projectSettingsStored: PropTypes.shape({\n menuLogo: PropTypes.shape({\n url: PropTypes.string,\n name: PropTypes.string,\n }),\n }),\n};\n\nexport default CustomizationInfos;\n","const getFormData = (data) => {\n const formData = new FormData();\n\n Object.entries(data).forEach(([key, value]) => {\n if (value && value.rawFile instanceof File) {\n formData.append(key, value.rawFile);\n }\n\n if (value && value.isReset) {\n formData.append(key, null);\n }\n });\n\n return formData;\n};\n\nexport default getFormData;\n","import * as React from 'react';\n\nimport {\n Button,\n ContentLayout,\n Flex,\n Grid,\n GridItem,\n HeaderLayout,\n Layout,\n Link,\n Loader,\n Main,\n Typography,\n} from '@strapi/design-system';\nimport {\n prefixFileUrlWithBackendUrl,\n SettingsPageTitle,\n useAPIErrorHandler,\n useAppInfo,\n useFetchClient,\n useFocusWhenNavigate,\n useNotification,\n useRBAC,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { Check, ExternalLink } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery } from 'react-query';\nimport { useSelector } from 'react-redux';\n\nimport { useConfiguration } from '../../../../contexts/configuration';\nimport { useEnterprise } from '../../../../hooks/useEnterprise';\nimport { selectAdminPermissions } from '../../../../selectors';\n\nimport CustomizationInfos from './components/CustomizationInfos';\nimport getFormData from './utils/getFormData';\n\nconst AdminSeatInfoCE = () => null;\n\nconst ApplicationInfosPage = () => {\n const inputsRef = React.useRef();\n const toggleNotification = useNotification();\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { get, post } = useFetchClient();\n const { updateProjectSettings } = useConfiguration();\n const permissions = useSelector(selectAdminPermissions);\n const { formatAPIError } = useAPIErrorHandler();\n\n const {\n communityEdition,\n latestStrapiReleaseTag,\n nodeVersion,\n shouldUpdateStrapi,\n strapiVersion,\n } = useAppInfo();\n\n const AdminSeatInfo = useEnterprise(\n AdminSeatInfoCE,\n async () =>\n (\n await import(\n '../../../../../../ee/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/AdminSeatInfo'\n )\n ).AdminSeatInfoEE\n );\n\n const {\n allowedActions: { canRead, canUpdate },\n } = useRBAC(permissions.settings['project-settings']);\n\n useFocusWhenNavigate();\n\n const { data, isLoading } = useQuery(\n ['project-settings'],\n async () => {\n const { data } = await get('/admin/project-settings');\n\n return data;\n },\n {\n cacheTime: 0,\n enabled: canRead,\n select(data) {\n return {\n ...data,\n\n authLogo: data.authLogo\n ? {\n ...data.authLogo,\n url: prefixFileUrlWithBackendUrl(data.authLogo.url),\n }\n : data.authLogo,\n\n menuLogo: data.menuLogo\n ? {\n ...data.menuLogo,\n url: prefixFileUrlWithBackendUrl(data.menuLogo.url),\n }\n : data.menuLogo,\n };\n },\n }\n );\n\n const submitMutation = useMutation(\n (body) =>\n post('/admin/project-settings', body, {\n headers: {\n 'Content-Type': 'multipart/form-data',\n },\n }),\n {\n onError(error) {\n toggleNotification({\n type: 'warning',\n message: formatAPIError(error),\n });\n },\n\n async onSuccess(data) {\n const { menuLogo, authLogo } = data;\n\n updateProjectSettings({ menuLogo: menuLogo?.url, authLogo: authLogo?.url });\n\n if (menuLogo?.rawFile) {\n trackUsage('didChangeLogo', {\n logo: 'menu',\n });\n }\n\n if (authLogo?.rawFile) {\n trackUsage('didChangeLogo', {\n logo: 'auth',\n });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'app', defaultMessage: 'Saved' }),\n });\n },\n }\n );\n\n const handleSubmit = (e) => {\n e.preventDefault();\n\n submitMutation.mutate(getFormData(inputsRef.current.getValues()));\n };\n\n // block rendering until the EE component is fully loaded\n if (!AdminSeatInfo) {\n return null;\n }\n\n return (\n <Layout>\n {/* TODO: Add missing translation */}\n <SettingsPageTitle name=\"Application\" />\n <Main>\n {isLoading ? (\n <Loader>\n {formatMessage({\n id: 'Settings.application.isLoading',\n defaultMessage: 'Loading',\n })}\n </Loader>\n ) : (\n <form onSubmit={handleSubmit}>\n <HeaderLayout\n title={formatMessage({\n id: 'Settings.application.title',\n defaultMessage: 'Overview',\n })}\n subtitle={formatMessage({\n id: 'Settings.application.description',\n defaultMessage: 'Administration panel’s global information',\n })}\n primaryAction={\n canUpdate && (\n <Button type=\"submit\" startIcon={<Check />}>\n {formatMessage({ id: 'global.save', defaultMessage: 'Save' })}\n </Button>\n )\n }\n />\n <ContentLayout>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n hasRadius\n background=\"neutral0\"\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingRight={7}\n paddingLeft={7}\n >\n <Typography variant=\"delta\" as=\"h3\">\n {formatMessage({\n id: 'global.details',\n defaultMessage: 'Details',\n })}\n </Typography>\n\n <Grid gap={5} as=\"dl\">\n <GridItem col={6} s={12}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" as=\"dt\">\n {formatMessage({\n id: 'Settings.application.strapiVersion',\n defaultMessage: 'strapi version',\n })}\n </Typography>\n <Flex gap={3} direction=\"column\" alignItems=\"start\" as=\"dd\">\n <Typography>v{strapiVersion}</Typography>\n {shouldUpdateStrapi && (\n <Link\n href={`https://github.com/strapi/strapi/releases/tag/${latestStrapiReleaseTag}`}\n isExternal\n endIcon={<ExternalLink />}\n >\n {formatMessage({\n id: 'Settings.application.link-upgrade',\n defaultMessage: 'Upgrade your admin panel',\n })}\n </Link>\n )}\n </Flex>\n </GridItem>\n <GridItem col={6} s={12}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" as=\"dt\">\n {formatMessage({\n id: 'Settings.application.edition-title',\n defaultMessage: 'current plan',\n })}\n </Typography>\n <Flex gap={3} direction=\"column\" alignItems=\"start\" as=\"dd\">\n <Typography>\n {formatMessage(\n {\n id: 'Settings.application.ee-or-ce',\n defaultMessage:\n '{communityEdition, select, true {Community Edition} other {Enterprise Edition}}',\n },\n { communityEdition }\n )}\n </Typography>\n <Link\n href=\"https://strapi.io/pricing-self-hosted\"\n isExternal\n endIcon={<ExternalLink />}\n >\n {formatMessage({\n id: 'Settings.application.link-pricing',\n defaultMessage: 'See all pricing plans',\n })}\n </Link>\n </Flex>\n </GridItem>\n\n <GridItem col={6} s={12}>\n <Typography variant=\"sigma\" textColor=\"neutral600\" as=\"dt\">\n {formatMessage({\n id: 'Settings.application.node-version',\n defaultMessage: 'node version',\n })}\n </Typography>\n <Typography as=\"dd\">{nodeVersion}</Typography>\n </GridItem>\n <AdminSeatInfo />\n </Grid>\n </Flex>\n {canRead && data && (\n <CustomizationInfos\n canUpdate={canUpdate}\n ref={inputsRef}\n projectSettingsStored={data}\n />\n )}\n </Flex>\n </ContentLayout>\n </form>\n )}\n </Main>\n </Layout>\n );\n};\n\nexport default ApplicationInfosPage;\n","import { MenuItem } from '@strapi/helper-plugin';\n\ninterface UniqueRouteProps\n extends Pick<MenuItem, 'to' | 'exact'>,\n Required<Pick<MenuItem, 'Component'>> {\n key: string;\n}\n\nexport function makeUniqueRoutes(routes: UniqueRouteProps[]) {\n return routes.filter(\n (route, index, refArray) => refArray.findIndex((obj) => obj.key === route.key) === index\n );\n}\n","import * as React from 'react';\n\nimport { Layout } from '@strapi/design-system';\nimport { LoadingIndicatorPage, useStrapiApp } from '@strapi/helper-plugin';\nimport { Helmet } from 'react-helmet';\nimport { useIntl } from 'react-intl';\nimport { Redirect, Route, Switch, useParams } from 'react-router-dom';\n\nimport { useEnterprise } from '../../hooks/useEnterprise';\nimport { useSettingsMenu } from '../../hooks/useSettingsMenu';\nimport { createRoute } from '../../utils/createRoute';\n\nimport SettingsNav from './components/SettingsNav';\nimport { ROUTES_CE } from './constants';\nimport ApplicationInfosPage from './pages/ApplicationInfosPage';\n// TODO: inline utility once the file is converted to TypeScript\nimport { makeUniqueRoutes } from './utils/makeUniqueRoutes';\n\nexport function SettingsPage() {\n const { settingId } = useParams();\n const { settings } = useStrapiApp();\n const { formatMessage } = useIntl();\n const { isLoading, menu } = useSettingsMenu();\n const routes = useEnterprise(\n ROUTES_CE,\n async () => (await import('../../../../ee/admin/src/pages/SettingsPage/constants')).ROUTES_EE,\n {\n combine(ceRoutes, eeRoutes) {\n return [...ceRoutes, ...eeRoutes];\n },\n defaultValue: [],\n }\n );\n\n // Creates the admin routes\n const adminRoutes = React.useMemo(() => {\n return makeUniqueRoutes(\n routes.map(({ to, Component, exact }) => createRoute(Component, to, exact))\n );\n }, [routes]);\n\n const pluginsRoutes = Object.values(settings).flatMap((section) => {\n const { links } = section;\n\n return links.map((link) => createRoute(link.Component, link.to, link.exact || false));\n });\n\n // Since the useSettingsMenu hook can make API calls in order to check the links permissions\n // We need to add a loading state to prevent redirecting the user while permissions are being checked\n if (isLoading) {\n return <LoadingIndicatorPage />;\n }\n\n if (!settingId) {\n return <Redirect to=\"/settings/application-infos\" />;\n }\n\n return (\n <Layout sideNav={<SettingsNav menu={menu} />}>\n <Helmet\n title={formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n />\n\n <Switch>\n <Route path=\"/settings/application-infos\" component={ApplicationInfosPage} exact />\n {adminRoutes}\n {pluginsRoutes}\n </Switch>\n </Layout>\n );\n}\n"],"names":["ceLinks","sections","permission","initialState","reducer","data"],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@ const isEqual = require("lodash/isEqual");
|
|
|
8
8
|
const reactIntl = require("react-intl");
|
|
9
9
|
const reactRedux = require("react-redux");
|
|
10
10
|
const useAdminRoles = require("./useAdminRoles-68d5d608.js");
|
|
11
|
-
const AuthenticatedApp = require("./AuthenticatedApp-
|
|
11
|
+
const AuthenticatedApp = require("./AuthenticatedApp-05646cd4.js");
|
|
12
12
|
const React = require("react");
|
|
13
13
|
const produce = require("immer");
|
|
14
14
|
const omit = require("lodash/omit");
|
|
@@ -19,7 +19,7 @@ const formatAPIErrors = require("./formatAPIErrors-b599cf27.js");
|
|
|
19
19
|
require("react-query");
|
|
20
20
|
require("semver/functions/lt");
|
|
21
21
|
require("semver/functions/valid");
|
|
22
|
-
require("./index-
|
|
22
|
+
require("./index-e9a0254d.js");
|
|
23
23
|
require("react-dom/client");
|
|
24
24
|
require("invariant");
|
|
25
25
|
require("lodash/isFunction");
|
|
@@ -415,4 +415,4 @@ const ProtectedSSO = () => {
|
|
|
415
415
|
};
|
|
416
416
|
exports.SingleSignOn = SingleSignOn;
|
|
417
417
|
exports.default = ProtectedSSO;
|
|
418
|
-
//# sourceMappingURL=index-
|
|
418
|
+
//# sourceMappingURL=index-bf55bc04.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index-7fbdc60f.js","sources":["../../ee/admin/src/pages/SettingsPage/pages/SingleSignOn/hooks/useSettingsForm.ts","../../ee/admin/src/pages/SettingsPage/pages/SingleSignOn/utils/schema.js","../../ee/admin/src/pages/SettingsPage/pages/SingleSignOn/index.js"],"sourcesContent":["import * as React from 'react';\n\nimport {\n getYupInnerErrors,\n useFetchClient,\n useNotification,\n useOverlayBlocker,\n} from '@strapi/helper-plugin';\nimport produce from 'immer';\nimport omit from 'lodash/omit';\nimport pick from 'lodash/pick';\nimport set from 'lodash/set';\nimport { ValidationError } from 'yup';\n\nimport { formatAPIErrors } from '../../../../../../../../admin/src/utils/formatAPIErrors';\n\ninterface GetDataSucceedAction {\n type: 'GET_DATA_SUCCEEDED';\n data: {\n [key: string]: unknown;\n };\n fieldsToPick: string[];\n}\n\ninterface OnCancelAction {\n type: 'ON_CANCEL';\n}\n\ninterface OnChangeAction {\n type: 'ON_CHANGE';\n keys: string;\n value: unknown;\n}\n\ninterface OnSubmitAction {\n type: 'ON_SUBMIT';\n}\n\ninterface OnSubmitSucceedAction {\n type: 'ON_SUBMIT_SUCCEEDED';\n data: {\n [key: string]: unknown;\n };\n}\n\ninterface SetErrorsAction {\n type: 'SET_ERRORS';\n errors: Record<string, unknown>;\n}\n\ninterface InitialState {\n fieldsToPick: string[];\n formErrors?: Record<string, unknown>;\n initialData: Record<string, unknown>;\n isLoading: boolean;\n modifiedData: Record<string, unknown>;\n showHeaderButtonLoader: boolean;\n showHeaderLoader: boolean;\n}\n\nconst initialState: InitialState = {\n fieldsToPick: [],\n formErrors: {},\n initialData: {},\n isLoading: true,\n modifiedData: {},\n showHeaderButtonLoader: false,\n showHeaderLoader: true,\n};\n\ntype Action =\n | GetDataSucceedAction\n | OnCancelAction\n | OnChangeAction\n | OnSubmitAction\n | OnSubmitSucceedAction\n | SetErrorsAction;\n\nconst reducer = (state: typeof initialState, action: Action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'GET_DATA_SUCCEEDED': {\n draftState.isLoading = false;\n draftState.showHeaderLoader = false;\n draftState.initialData = pick(action.data, state.fieldsToPick);\n draftState.modifiedData = pick(action.data, state.fieldsToPick);\n break;\n }\n case 'ON_CANCEL': {\n draftState.modifiedData = state.initialData;\n draftState.formErrors = {};\n break;\n }\n case 'ON_CHANGE': {\n if (action.keys.includes('username') && !action.value) {\n set(draftState.modifiedData, action.keys.split('.'), null);\n } else {\n set(draftState.modifiedData, action.keys.split('.'), action.value);\n }\n break;\n }\n case 'ON_SUBMIT': {\n draftState.showHeaderButtonLoader = true;\n break;\n }\n case 'ON_SUBMIT_SUCCEEDED': {\n draftState.initialData = pick(action.data, state.fieldsToPick);\n draftState.modifiedData = pick(action.data, state.fieldsToPick);\n draftState.showHeaderButtonLoader = false;\n break;\n }\n case 'SET_ERRORS': {\n draftState.formErrors = action.errors;\n draftState.showHeaderButtonLoader = false;\n break;\n }\n default:\n return draftState;\n }\n });\n\nconst checkFormValidity = async (data: Record<string, unknown>, schema: any) => {\n let errors = null;\n\n try {\n await schema.validate(data, { abortEarly: false });\n } catch (err) {\n if (err instanceof ValidationError) {\n errors = getYupInnerErrors(err);\n }\n }\n\n return errors;\n};\n\n/**\n * TODO: refactor this, it's confusing and hard to read.\n * It's also only used in `Settings/pages/SingleSignOn` so it can\n * probably be deleted and everything written there...\n */\nexport const useSettingsForm = (\n schema: Record<string, unknown>,\n cbSuccess: (data: any) => void,\n fieldsToPick: string[]\n) => {\n const [\n { formErrors, initialData, isLoading, modifiedData, showHeaderButtonLoader, showHeaderLoader },\n dispatch,\n ] = React.useReducer(reducer, { ...initialState, fieldsToPick });\n const toggleNotification = useNotification();\n const { lockApp, unlockApp } = useOverlayBlocker();\n\n const { get, put } = useFetchClient();\n\n React.useEffect(() => {\n const getData = async () => {\n try {\n const {\n data: { data },\n } = await get('/admin/providers/options');\n\n dispatch({\n type: 'GET_DATA_SUCCEEDED',\n data,\n fieldsToPick,\n });\n } catch (err) {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error' },\n });\n }\n };\n\n getData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleCancel = () => {\n dispatch({\n type: 'ON_CANCEL',\n });\n };\n\n const handleChange = ({\n target: { name, value },\n }: {\n target: { name: string; value?: unknown };\n }) => {\n dispatch({\n type: 'ON_CHANGE',\n keys: name,\n value,\n });\n };\n\n const setField = (fieldName: string, value: unknown) => {\n dispatch({\n type: 'ON_CHANGE',\n keys: fieldName,\n value,\n });\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n const errors = await checkFormValidity(modifiedData, schema);\n\n dispatch({\n type: 'SET_ERRORS',\n errors: errors || {},\n });\n\n if (!errors) {\n try {\n // @ts-expect-error - context assertation\n lockApp();\n\n dispatch({\n type: 'ON_SUBMIT',\n });\n const cleanedData = omit(modifiedData, ['confirmPassword', 'registrationToken']);\n\n if (cleanedData.roles) {\n // @ts-expect-error hooks needs refactoring anyways\n cleanedData.roles = cleanedData.roles.map((role) => role.id);\n }\n if (cleanedData.ssoLockedRoles) {\n // @ts-expect-error hooks needs refactoring anyways\n cleanedData.ssoLockedRoles = [...new Set(cleanedData.ssoLockedRoles)];\n }\n\n const {\n data: { data },\n } = await put('/admin/providers/options', cleanedData);\n\n cbSuccess(data);\n\n dispatch({\n type: 'ON_SUBMIT_SUCCEEDED',\n data,\n });\n\n toggleNotification({\n type: 'success',\n message: { id: 'notification.success.saved' },\n });\n } catch (err) {\n // @ts-expect-error hooks needs refactoring anyways\n const data = err?.response?.payload ?? { data: {} };\n\n if (!!data?.data && typeof data.data === 'string') {\n toggleNotification({\n type: 'warning',\n message: data.data,\n });\n } else {\n toggleNotification({\n type: 'warning',\n message: data.message,\n });\n }\n\n const apiErrors = formatAPIErrors(data);\n\n dispatch({\n type: 'SET_ERRORS',\n errors: apiErrors,\n });\n } finally {\n // @ts-expect-error - context assertation\n unlockApp();\n }\n }\n };\n\n return [\n { formErrors, initialData, isLoading, modifiedData, showHeaderButtonLoader, showHeaderLoader },\n dispatch,\n { handleCancel, handleChange, handleSubmit, setField },\n ] as const;\n};\n","import { translatedErrors } from '@strapi/helper-plugin';\nimport * as yup from 'yup';\n\nconst schema = yup.object().shape({\n autoRegister: yup.bool().required(translatedErrors.required),\n defaultRole: yup.mixed().when('autoRegister', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required) : initSchema.nullable();\n }),\n ssoLockedRoles: yup\n .array()\n .nullable()\n .of(\n yup.mixed().when('ssoLockedRoles', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required) : initSchema.nullable();\n })\n ),\n});\n\nexport default schema;\n","import * as React from 'react';\n\nimport {\n Button,\n ContentLayout,\n Flex,\n Grid,\n GridItem,\n HeaderLayout,\n Layout,\n Main,\n MultiSelect,\n MultiSelectOption,\n Option,\n Select,\n ToggleInput,\n Typography,\n} from '@strapi/design-system';\nimport {\n CheckPagePermissions,\n LoadingIndicatorPage,\n SettingsPageTitle,\n useFocusWhenNavigate,\n useRBAC,\n} from '@strapi/helper-plugin';\nimport { Check } from '@strapi/icons';\nimport isEqual from 'lodash/isEqual';\nimport { useIntl } from 'react-intl';\nimport { useSelector } from 'react-redux';\n\nimport { useAdminRoles } from '../../../../../../../admin/src/hooks/useAdminRoles';\nimport { selectAdminPermissions } from '../../../../../../../admin/src/selectors';\n\nimport { useSettingsForm } from './hooks/useSettingsForm';\nimport schema from './utils/schema';\n\nexport const SingleSignOn = () => {\n useFocusWhenNavigate();\n\n const { formatMessage } = useIntl();\n const permissions = useSelector(selectAdminPermissions);\n\n const {\n isLoading: isLoadingPermissions,\n allowedActions: { canUpdate, canReadRoles },\n } = useRBAC({\n ...permissions.settings.sso,\n readRoles: permissions.settings.roles.read,\n });\n\n const [\n { formErrors, initialData, isLoading: isLoadingForm, modifiedData, showHeaderButtonLoader },\n ,\n { handleChange, handleSubmit },\n ] = useSettingsForm(schema, () => {}, ['autoRegister', 'defaultRole', 'ssoLockedRoles']);\n\n const { roles, isLoading: isLoadingRoles } = useAdminRoles(undefined, {\n enabled: canReadRoles,\n });\n\n const isLoading = isLoadingPermissions || isLoadingRoles || isLoadingForm;\n // TODO: focus() first error field, but it looks like that requires refactoring from useSettingsForm to Formik\n\n return (\n <Layout>\n <SettingsPageTitle name=\"SSO\" />\n <Main tabIndex={-1}>\n <form onSubmit={handleSubmit}>\n <HeaderLayout\n primaryAction={\n <Button\n data-testid=\"save-button\"\n disabled={isEqual(initialData, modifiedData)}\n loading={showHeaderButtonLoader}\n startIcon={<Check />}\n type=\"submit\"\n size=\"L\"\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n }\n title={formatMessage({ id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' })}\n subtitle={formatMessage({\n id: 'Settings.sso.description',\n defaultMessage: 'Configure the settings for the Single Sign-On feature.',\n })}\n />\n <ContentLayout>\n {isLoading ? (\n <LoadingIndicatorPage />\n ) : (\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n background=\"neutral0\"\n padding={6}\n shadow=\"filterShadow\"\n hasRadius\n >\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid gap={4}>\n <GridItem col={6} m={6} s={12}>\n <ToggleInput\n aria-label=\"autoRegister\"\n data-testid=\"autoRegister\"\n disabled={!canUpdate}\n checked={modifiedData.autoRegister}\n hint={formatMessage({\n id: 'Settings.sso.form.registration.description',\n defaultMessage: 'Create new user on SSO login if no account exists',\n })}\n label={formatMessage({\n id: 'Settings.sso.form.registration.label',\n defaultMessage: 'Auto-registration',\n })}\n name=\"autoRegister\"\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'autoRegister', value: e.target.checked },\n });\n }}\n />\n </GridItem>\n <GridItem col={6} m={6} s={12}>\n <Select\n disabled={!canUpdate}\n hint={formatMessage({\n id: 'Settings.sso.form.defaultRole.description',\n defaultMessage:\n 'It will attach the new authenticated user to the selected role',\n })}\n error={\n formErrors.defaultRole\n ? formatMessage({\n id: formErrors.defaultRole.id,\n defaultMessage: formErrors.defaultRole.id,\n })\n : ''\n }\n label={formatMessage({\n id: 'Settings.sso.form.defaultRole.label',\n defaultMessage: 'Default role',\n })}\n name=\"defaultRole\"\n onChange={(value) => {\n handleChange({ target: { name: 'defaultRole', value } });\n }}\n placeholder={formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n })}\n value={modifiedData.defaultRole}\n >\n {roles.map(({ id, name }) => (\n <Option key={id} value={id.toString()}>\n {name}\n </Option>\n ))}\n </Select>\n </GridItem>\n <GridItem col={6} m={6} s={12}>\n <MultiSelect\n disabled={!canUpdate}\n hint={formatMessage({\n id: 'Settings.sso.form.localAuthenticationLock.description',\n defaultMessage:\n 'Select the roles for which you want to disable the local authentication',\n })}\n error={\n formErrors.ssoLockedRoles\n ? formatMessage({\n id: formErrors.ssoLockedRoles.id,\n defaultMessage: formErrors.ssoLockedRoles.id,\n })\n : ''\n }\n label={formatMessage({\n id: 'Settings.sso.form.localAuthenticationLock.label',\n defaultMessage: 'Local authentication lock-out',\n })}\n name=\"ssoLockedRoles\"\n onChange={(value) => {\n handleChange({ target: { name: 'ssoLockedRoles', value } });\n }}\n placeholder={formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n })}\n onClear={() => {\n handleChange({ target: { name: 'ssoLockedRoles' } });\n }}\n value={modifiedData.ssoLockedRoles || []}\n withTags\n >\n {roles.map(({ id, name }) => (\n <MultiSelectOption key={id} value={id.toString()}>\n {name}\n </MultiSelectOption>\n ))}\n </MultiSelect>\n </GridItem>\n </Grid>\n </Flex>\n )}\n </ContentLayout>\n </form>\n </Main>\n </Layout>\n );\n};\n\nconst ProtectedSSO = () => {\n const permissions = useSelector(selectAdminPermissions);\n\n return (\n <CheckPagePermissions permissions={permissions.settings.sso.main}>\n <SingleSignOn />\n </CheckPagePermissions>\n );\n};\n\nexport default ProtectedSSO;\n"],"names":["produce","pick","set","schema","ValidationError","getYupInnerErrors","React","useNotification","useOverlayBlocker","useFetchClient","omit","formatAPIErrors","yup","translatedErrors","useFocusWhenNavigate","useIntl","useSelector","selectAdminPermissions","useRBAC","useAdminRoles","Layout","jsx","SettingsPageTitle","Main","jsxs","HeaderLayout","Button","isEqual","Check","ContentLayout","LoadingIndicatorPage","Flex","Typography","Grid","GridItem","ToggleInput","Select","Option","MultiSelect","MultiSelectOption","CheckPagePermissions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index-bf55bc04.js","sources":["../../ee/admin/src/pages/SettingsPage/pages/SingleSignOn/hooks/useSettingsForm.ts","../../ee/admin/src/pages/SettingsPage/pages/SingleSignOn/utils/schema.js","../../ee/admin/src/pages/SettingsPage/pages/SingleSignOn/index.js"],"sourcesContent":["import * as React from 'react';\n\nimport {\n getYupInnerErrors,\n useFetchClient,\n useNotification,\n useOverlayBlocker,\n} from '@strapi/helper-plugin';\nimport produce from 'immer';\nimport omit from 'lodash/omit';\nimport pick from 'lodash/pick';\nimport set from 'lodash/set';\nimport { ValidationError } from 'yup';\n\nimport { formatAPIErrors } from '../../../../../../../../admin/src/utils/formatAPIErrors';\n\ninterface GetDataSucceedAction {\n type: 'GET_DATA_SUCCEEDED';\n data: {\n [key: string]: unknown;\n };\n fieldsToPick: string[];\n}\n\ninterface OnCancelAction {\n type: 'ON_CANCEL';\n}\n\ninterface OnChangeAction {\n type: 'ON_CHANGE';\n keys: string;\n value: unknown;\n}\n\ninterface OnSubmitAction {\n type: 'ON_SUBMIT';\n}\n\ninterface OnSubmitSucceedAction {\n type: 'ON_SUBMIT_SUCCEEDED';\n data: {\n [key: string]: unknown;\n };\n}\n\ninterface SetErrorsAction {\n type: 'SET_ERRORS';\n errors: Record<string, unknown>;\n}\n\ninterface InitialState {\n fieldsToPick: string[];\n formErrors?: Record<string, unknown>;\n initialData: Record<string, unknown>;\n isLoading: boolean;\n modifiedData: Record<string, unknown>;\n showHeaderButtonLoader: boolean;\n showHeaderLoader: boolean;\n}\n\nconst initialState: InitialState = {\n fieldsToPick: [],\n formErrors: {},\n initialData: {},\n isLoading: true,\n modifiedData: {},\n showHeaderButtonLoader: false,\n showHeaderLoader: true,\n};\n\ntype Action =\n | GetDataSucceedAction\n | OnCancelAction\n | OnChangeAction\n | OnSubmitAction\n | OnSubmitSucceedAction\n | SetErrorsAction;\n\nconst reducer = (state: typeof initialState, action: Action) =>\n produce(state, (draftState) => {\n switch (action.type) {\n case 'GET_DATA_SUCCEEDED': {\n draftState.isLoading = false;\n draftState.showHeaderLoader = false;\n draftState.initialData = pick(action.data, state.fieldsToPick);\n draftState.modifiedData = pick(action.data, state.fieldsToPick);\n break;\n }\n case 'ON_CANCEL': {\n draftState.modifiedData = state.initialData;\n draftState.formErrors = {};\n break;\n }\n case 'ON_CHANGE': {\n if (action.keys.includes('username') && !action.value) {\n set(draftState.modifiedData, action.keys.split('.'), null);\n } else {\n set(draftState.modifiedData, action.keys.split('.'), action.value);\n }\n break;\n }\n case 'ON_SUBMIT': {\n draftState.showHeaderButtonLoader = true;\n break;\n }\n case 'ON_SUBMIT_SUCCEEDED': {\n draftState.initialData = pick(action.data, state.fieldsToPick);\n draftState.modifiedData = pick(action.data, state.fieldsToPick);\n draftState.showHeaderButtonLoader = false;\n break;\n }\n case 'SET_ERRORS': {\n draftState.formErrors = action.errors;\n draftState.showHeaderButtonLoader = false;\n break;\n }\n default:\n return draftState;\n }\n });\n\nconst checkFormValidity = async (data: Record<string, unknown>, schema: any) => {\n let errors = null;\n\n try {\n await schema.validate(data, { abortEarly: false });\n } catch (err) {\n if (err instanceof ValidationError) {\n errors = getYupInnerErrors(err);\n }\n }\n\n return errors;\n};\n\n/**\n * TODO: refactor this, it's confusing and hard to read.\n * It's also only used in `Settings/pages/SingleSignOn` so it can\n * probably be deleted and everything written there...\n */\nexport const useSettingsForm = (\n schema: Record<string, unknown>,\n cbSuccess: (data: any) => void,\n fieldsToPick: string[]\n) => {\n const [\n { formErrors, initialData, isLoading, modifiedData, showHeaderButtonLoader, showHeaderLoader },\n dispatch,\n ] = React.useReducer(reducer, { ...initialState, fieldsToPick });\n const toggleNotification = useNotification();\n const { lockApp, unlockApp } = useOverlayBlocker();\n\n const { get, put } = useFetchClient();\n\n React.useEffect(() => {\n const getData = async () => {\n try {\n const {\n data: { data },\n } = await get('/admin/providers/options');\n\n dispatch({\n type: 'GET_DATA_SUCCEEDED',\n data,\n fieldsToPick,\n });\n } catch (err) {\n toggleNotification({\n type: 'warning',\n message: { id: 'notification.error' },\n });\n }\n };\n\n getData();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const handleCancel = () => {\n dispatch({\n type: 'ON_CANCEL',\n });\n };\n\n const handleChange = ({\n target: { name, value },\n }: {\n target: { name: string; value?: unknown };\n }) => {\n dispatch({\n type: 'ON_CHANGE',\n keys: name,\n value,\n });\n };\n\n const setField = (fieldName: string, value: unknown) => {\n dispatch({\n type: 'ON_CHANGE',\n keys: fieldName,\n value,\n });\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n\n const errors = await checkFormValidity(modifiedData, schema);\n\n dispatch({\n type: 'SET_ERRORS',\n errors: errors || {},\n });\n\n if (!errors) {\n try {\n // @ts-expect-error - context assertation\n lockApp();\n\n dispatch({\n type: 'ON_SUBMIT',\n });\n const cleanedData = omit(modifiedData, ['confirmPassword', 'registrationToken']);\n\n if (cleanedData.roles) {\n // @ts-expect-error hooks needs refactoring anyways\n cleanedData.roles = cleanedData.roles.map((role) => role.id);\n }\n if (cleanedData.ssoLockedRoles) {\n // @ts-expect-error hooks needs refactoring anyways\n cleanedData.ssoLockedRoles = [...new Set(cleanedData.ssoLockedRoles)];\n }\n\n const {\n data: { data },\n } = await put('/admin/providers/options', cleanedData);\n\n cbSuccess(data);\n\n dispatch({\n type: 'ON_SUBMIT_SUCCEEDED',\n data,\n });\n\n toggleNotification({\n type: 'success',\n message: { id: 'notification.success.saved' },\n });\n } catch (err) {\n // @ts-expect-error hooks needs refactoring anyways\n const data = err?.response?.payload ?? { data: {} };\n\n if (!!data?.data && typeof data.data === 'string') {\n toggleNotification({\n type: 'warning',\n message: data.data,\n });\n } else {\n toggleNotification({\n type: 'warning',\n message: data.message,\n });\n }\n\n const apiErrors = formatAPIErrors(data);\n\n dispatch({\n type: 'SET_ERRORS',\n errors: apiErrors,\n });\n } finally {\n // @ts-expect-error - context assertation\n unlockApp();\n }\n }\n };\n\n return [\n { formErrors, initialData, isLoading, modifiedData, showHeaderButtonLoader, showHeaderLoader },\n dispatch,\n { handleCancel, handleChange, handleSubmit, setField },\n ] as const;\n};\n","import { translatedErrors } from '@strapi/helper-plugin';\nimport * as yup from 'yup';\n\nconst schema = yup.object().shape({\n autoRegister: yup.bool().required(translatedErrors.required),\n defaultRole: yup.mixed().when('autoRegister', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required) : initSchema.nullable();\n }),\n ssoLockedRoles: yup\n .array()\n .nullable()\n .of(\n yup.mixed().when('ssoLockedRoles', (value, initSchema) => {\n return value ? initSchema.required(translatedErrors.required) : initSchema.nullable();\n })\n ),\n});\n\nexport default schema;\n","import * as React from 'react';\n\nimport {\n Button,\n ContentLayout,\n Flex,\n Grid,\n GridItem,\n HeaderLayout,\n Layout,\n Main,\n MultiSelect,\n MultiSelectOption,\n Option,\n Select,\n ToggleInput,\n Typography,\n} from '@strapi/design-system';\nimport {\n CheckPagePermissions,\n LoadingIndicatorPage,\n SettingsPageTitle,\n useFocusWhenNavigate,\n useRBAC,\n} from '@strapi/helper-plugin';\nimport { Check } from '@strapi/icons';\nimport isEqual from 'lodash/isEqual';\nimport { useIntl } from 'react-intl';\nimport { useSelector } from 'react-redux';\n\nimport { useAdminRoles } from '../../../../../../../admin/src/hooks/useAdminRoles';\nimport { selectAdminPermissions } from '../../../../../../../admin/src/selectors';\n\nimport { useSettingsForm } from './hooks/useSettingsForm';\nimport schema from './utils/schema';\n\nexport const SingleSignOn = () => {\n useFocusWhenNavigate();\n\n const { formatMessage } = useIntl();\n const permissions = useSelector(selectAdminPermissions);\n\n const {\n isLoading: isLoadingPermissions,\n allowedActions: { canUpdate, canReadRoles },\n } = useRBAC({\n ...permissions.settings.sso,\n readRoles: permissions.settings.roles.read,\n });\n\n const [\n { formErrors, initialData, isLoading: isLoadingForm, modifiedData, showHeaderButtonLoader },\n ,\n { handleChange, handleSubmit },\n ] = useSettingsForm(schema, () => {}, ['autoRegister', 'defaultRole', 'ssoLockedRoles']);\n\n const { roles, isLoading: isLoadingRoles } = useAdminRoles(undefined, {\n enabled: canReadRoles,\n });\n\n const isLoading = isLoadingPermissions || isLoadingRoles || isLoadingForm;\n // TODO: focus() first error field, but it looks like that requires refactoring from useSettingsForm to Formik\n\n return (\n <Layout>\n <SettingsPageTitle name=\"SSO\" />\n <Main tabIndex={-1}>\n <form onSubmit={handleSubmit}>\n <HeaderLayout\n primaryAction={\n <Button\n data-testid=\"save-button\"\n disabled={isEqual(initialData, modifiedData)}\n loading={showHeaderButtonLoader}\n startIcon={<Check />}\n type=\"submit\"\n size=\"L\"\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n }\n title={formatMessage({ id: 'Settings.sso.title', defaultMessage: 'Single Sign-On' })}\n subtitle={formatMessage({\n id: 'Settings.sso.description',\n defaultMessage: 'Configure the settings for the Single Sign-On feature.',\n })}\n />\n <ContentLayout>\n {isLoading ? (\n <LoadingIndicatorPage />\n ) : (\n <Flex\n direction=\"column\"\n alignItems=\"stretch\"\n gap={4}\n background=\"neutral0\"\n padding={6}\n shadow=\"filterShadow\"\n hasRadius\n >\n <Typography variant=\"delta\" as=\"h2\">\n {formatMessage({\n id: 'global.settings',\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid gap={4}>\n <GridItem col={6} m={6} s={12}>\n <ToggleInput\n aria-label=\"autoRegister\"\n data-testid=\"autoRegister\"\n disabled={!canUpdate}\n checked={modifiedData.autoRegister}\n hint={formatMessage({\n id: 'Settings.sso.form.registration.description',\n defaultMessage: 'Create new user on SSO login if no account exists',\n })}\n label={formatMessage({\n id: 'Settings.sso.form.registration.label',\n defaultMessage: 'Auto-registration',\n })}\n name=\"autoRegister\"\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'autoRegister', value: e.target.checked },\n });\n }}\n />\n </GridItem>\n <GridItem col={6} m={6} s={12}>\n <Select\n disabled={!canUpdate}\n hint={formatMessage({\n id: 'Settings.sso.form.defaultRole.description',\n defaultMessage:\n 'It will attach the new authenticated user to the selected role',\n })}\n error={\n formErrors.defaultRole\n ? formatMessage({\n id: formErrors.defaultRole.id,\n defaultMessage: formErrors.defaultRole.id,\n })\n : ''\n }\n label={formatMessage({\n id: 'Settings.sso.form.defaultRole.label',\n defaultMessage: 'Default role',\n })}\n name=\"defaultRole\"\n onChange={(value) => {\n handleChange({ target: { name: 'defaultRole', value } });\n }}\n placeholder={formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n })}\n value={modifiedData.defaultRole}\n >\n {roles.map(({ id, name }) => (\n <Option key={id} value={id.toString()}>\n {name}\n </Option>\n ))}\n </Select>\n </GridItem>\n <GridItem col={6} m={6} s={12}>\n <MultiSelect\n disabled={!canUpdate}\n hint={formatMessage({\n id: 'Settings.sso.form.localAuthenticationLock.description',\n defaultMessage:\n 'Select the roles for which you want to disable the local authentication',\n })}\n error={\n formErrors.ssoLockedRoles\n ? formatMessage({\n id: formErrors.ssoLockedRoles.id,\n defaultMessage: formErrors.ssoLockedRoles.id,\n })\n : ''\n }\n label={formatMessage({\n id: 'Settings.sso.form.localAuthenticationLock.label',\n defaultMessage: 'Local authentication lock-out',\n })}\n name=\"ssoLockedRoles\"\n onChange={(value) => {\n handleChange({ target: { name: 'ssoLockedRoles', value } });\n }}\n placeholder={formatMessage({\n id: 'components.InputSelect.option.placeholder',\n defaultMessage: 'Choose here',\n })}\n onClear={() => {\n handleChange({ target: { name: 'ssoLockedRoles' } });\n }}\n value={modifiedData.ssoLockedRoles || []}\n withTags\n >\n {roles.map(({ id, name }) => (\n <MultiSelectOption key={id} value={id.toString()}>\n {name}\n </MultiSelectOption>\n ))}\n </MultiSelect>\n </GridItem>\n </Grid>\n </Flex>\n )}\n </ContentLayout>\n </form>\n </Main>\n </Layout>\n );\n};\n\nconst ProtectedSSO = () => {\n const permissions = useSelector(selectAdminPermissions);\n\n return (\n <CheckPagePermissions permissions={permissions.settings.sso.main}>\n <SingleSignOn />\n </CheckPagePermissions>\n );\n};\n\nexport default ProtectedSSO;\n"],"names":["produce","pick","set","schema","ValidationError","getYupInnerErrors","React","useNotification","useOverlayBlocker","useFetchClient","omit","formatAPIErrors","yup","translatedErrors","useFocusWhenNavigate","useIntl","useSelector","selectAdminPermissions","useRBAC","useAdminRoles","Layout","jsx","SettingsPageTitle","Main","jsxs","HeaderLayout","Button","isEqual","Check","ContentLayout","LoadingIndicatorPage","Flex","Typography","Grid","GridItem","ToggleInput","Select","Option","MultiSelect","MultiSelectOption","CheckPagePermissions"],"mappings":"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"}
|