@strapi/admin 4.17.0 → 4.17.1

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.
Files changed (169) hide show
  1. package/dist/_chunks/{AdminSeatInfo-a10d232f.js → AdminSeatInfo-390d8989.js} +3 -3
  2. package/dist/_chunks/{AdminSeatInfo-a10d232f.js.map → AdminSeatInfo-390d8989.js.map} +1 -1
  3. package/dist/_chunks/{AdminSeatInfo-6e7bbb97.mjs → AdminSeatInfo-bb59ad1f.mjs} +3 -3
  4. package/dist/_chunks/{AdminSeatInfo-6e7bbb97.mjs.map → AdminSeatInfo-bb59ad1f.mjs.map} +1 -1
  5. package/dist/_chunks/{AuthenticatedApp-47219c52.js → AuthenticatedApp-b186733c.js} +21 -21
  6. package/dist/_chunks/{AuthenticatedApp-47219c52.js.map → AuthenticatedApp-b186733c.js.map} +1 -1
  7. package/dist/_chunks/{AuthenticatedApp-7d1fdf0c.mjs → AuthenticatedApp-b723bf94.mjs} +21 -21
  8. package/dist/_chunks/{AuthenticatedApp-7d1fdf0c.mjs.map → AuthenticatedApp-b723bf94.mjs.map} +1 -1
  9. package/dist/_chunks/{CreatePage-d2a061b5.js → CreatePage-16d53bda.js} +4 -4
  10. package/dist/_chunks/{CreatePage-d2a061b5.js.map → CreatePage-16d53bda.js.map} +1 -1
  11. package/dist/_chunks/{CreatePage-32977ee7.mjs → CreatePage-34ad9bdd.mjs} +4 -4
  12. package/dist/_chunks/{CreatePage-32977ee7.mjs.map → CreatePage-34ad9bdd.mjs.map} +1 -1
  13. package/dist/_chunks/{CreatePage-eeb81776.js → CreatePage-92f708fa.js} +4 -4
  14. package/dist/_chunks/{CreatePage-eeb81776.js.map → CreatePage-92f708fa.js.map} +1 -1
  15. package/dist/_chunks/{CreatePage-17c8a6e4.mjs → CreatePage-e5d16f0e.mjs} +4 -4
  16. package/dist/_chunks/{CreatePage-17c8a6e4.mjs.map → CreatePage-e5d16f0e.mjs.map} +1 -1
  17. package/dist/_chunks/{CreatePage-4ba4bd0d.mjs → CreatePage-f321dfbc.mjs} +4 -4
  18. package/dist/_chunks/{CreatePage-4ba4bd0d.mjs.map → CreatePage-f321dfbc.mjs.map} +1 -1
  19. package/dist/_chunks/{CreatePage-3c0b9dd5.js → CreatePage-f63362cf.js} +4 -4
  20. package/dist/_chunks/{CreatePage-3c0b9dd5.js.map → CreatePage-f63362cf.js.map} +1 -1
  21. package/dist/_chunks/{CreateView-5a0b0eca.js → CreateView-0da060c0.js} +4 -4
  22. package/dist/_chunks/{CreateView-5a0b0eca.js.map → CreateView-0da060c0.js.map} +1 -1
  23. package/dist/_chunks/{CreateView-fc328787.js → CreateView-69c834ba.js} +4 -4
  24. package/dist/_chunks/{CreateView-fc328787.js.map → CreateView-69c834ba.js.map} +1 -1
  25. package/dist/_chunks/{CreateView-8b6412c9.mjs → CreateView-a5345794.mjs} +4 -4
  26. package/dist/_chunks/{CreateView-8b6412c9.mjs.map → CreateView-a5345794.mjs.map} +1 -1
  27. package/dist/_chunks/{CreateView-2bc998f1.mjs → CreateView-df9f9bf0.mjs} +4 -4
  28. package/dist/_chunks/{CreateView-2bc998f1.mjs.map → CreateView-df9f9bf0.mjs.map} +1 -1
  29. package/dist/_chunks/{EditPage-0b1a48f7.js → EditPage-39a7cd2d.js} +5 -5
  30. package/dist/_chunks/{EditPage-0b1a48f7.js.map → EditPage-39a7cd2d.js.map} +1 -1
  31. package/dist/_chunks/{EditPage-89052393.js → EditPage-48cdd744.js} +4 -4
  32. package/dist/_chunks/{EditPage-89052393.js.map → EditPage-48cdd744.js.map} +1 -1
  33. package/dist/_chunks/{EditPage-efc987d7.js → EditPage-493ac83a.js} +5 -5
  34. package/dist/_chunks/{EditPage-efc987d7.js.map → EditPage-493ac83a.js.map} +1 -1
  35. package/dist/_chunks/{EditPage-6d3fe437.mjs → EditPage-a5a18e61.mjs} +4 -4
  36. package/dist/_chunks/{EditPage-6d3fe437.mjs.map → EditPage-a5a18e61.mjs.map} +1 -1
  37. package/dist/_chunks/{EditPage-2b051ea8.mjs → EditPage-a6578110.mjs} +5 -5
  38. package/dist/_chunks/{EditPage-2b051ea8.mjs.map → EditPage-a6578110.mjs.map} +1 -1
  39. package/dist/_chunks/{EditPage-7b9355e4.mjs → EditPage-e710a231.mjs} +4 -4
  40. package/dist/_chunks/{EditPage-7b9355e4.mjs.map → EditPage-e710a231.mjs.map} +1 -1
  41. package/dist/_chunks/{EditPage-faee9ac1.mjs → EditPage-f5caa375.mjs} +5 -5
  42. package/dist/_chunks/{EditPage-faee9ac1.mjs.map → EditPage-f5caa375.mjs.map} +1 -1
  43. package/dist/_chunks/{EditPage-de127112.js → EditPage-f75f04b9.js} +4 -4
  44. package/dist/_chunks/{EditPage-de127112.js.map → EditPage-f75f04b9.js.map} +1 -1
  45. package/dist/_chunks/{EditView-e480d09f.js → EditView-0c216c35.js} +3 -3
  46. package/dist/_chunks/{EditView-e480d09f.js.map → EditView-0c216c35.js.map} +1 -1
  47. package/dist/_chunks/{EditView-0e4d7c80.mjs → EditView-d3ccb532.mjs} +3 -3
  48. package/dist/_chunks/{EditView-0e4d7c80.mjs.map → EditView-d3ccb532.mjs.map} +1 -1
  49. package/dist/_chunks/{EditViewPage-ef0292a9.js → EditViewPage-57b6e71a.js} +3 -3
  50. package/dist/_chunks/{EditViewPage-ef0292a9.js.map → EditViewPage-57b6e71a.js.map} +1 -1
  51. package/dist/_chunks/{EditViewPage-3e638ea4.mjs → EditViewPage-77e95780.mjs} +3 -3
  52. package/dist/_chunks/{EditViewPage-3e638ea4.mjs.map → EditViewPage-77e95780.mjs.map} +1 -1
  53. package/dist/_chunks/{EventsTable-c8ea750e.js → EventsTable-8e2b0bd9.js} +4 -4
  54. package/dist/_chunks/{EventsTable-c8ea750e.js.map → EventsTable-8e2b0bd9.js.map} +1 -1
  55. package/dist/_chunks/{EventsTable-21c9c326.mjs → EventsTable-d472e89d.mjs} +4 -4
  56. package/dist/_chunks/{EventsTable-21c9c326.mjs.map → EventsTable-d472e89d.mjs.map} +1 -1
  57. package/dist/_chunks/{HomePage-28c2fc09.mjs → HomePage-22d90f51.mjs} +4 -4
  58. package/dist/_chunks/{HomePage-28c2fc09.mjs.map → HomePage-22d90f51.mjs.map} +1 -1
  59. package/dist/_chunks/{HomePage-ef17de6c.js → HomePage-7bd6070c.js} +4 -4
  60. package/dist/_chunks/{HomePage-ef17de6c.js.map → HomePage-7bd6070c.js.map} +1 -1
  61. package/dist/_chunks/{HomePage-d9e5bcf6.js → HomePage-bb29ced3.js} +4 -4
  62. package/dist/_chunks/{HomePage-d9e5bcf6.js.map → HomePage-bb29ced3.js.map} +1 -1
  63. package/dist/_chunks/{HomePage-bfeba10a.mjs → HomePage-e94a37b9.mjs} +4 -4
  64. package/dist/_chunks/{HomePage-bfeba10a.mjs.map → HomePage-e94a37b9.mjs.map} +1 -1
  65. package/dist/_chunks/{InformationBoxEE-bd1d2894.mjs → InformationBoxEE-302228b9.mjs} +2 -2
  66. package/dist/_chunks/{InformationBoxEE-bd1d2894.mjs.map → InformationBoxEE-302228b9.mjs.map} +1 -1
  67. package/dist/_chunks/{InformationBoxEE-2d2b6c4a.js → InformationBoxEE-7d383cec.js} +2 -2
  68. package/dist/_chunks/{InformationBoxEE-2d2b6c4a.js.map → InformationBoxEE-7d383cec.js.map} +1 -1
  69. package/dist/_chunks/{InstalledPluginsPage-39a094a5.js → InstalledPluginsPage-73eabc0b.js} +3 -3
  70. package/dist/_chunks/{InstalledPluginsPage-39a094a5.js.map → InstalledPluginsPage-73eabc0b.js.map} +1 -1
  71. package/dist/_chunks/{InstalledPluginsPage-8e9b0b64.mjs → InstalledPluginsPage-ff15831e.mjs} +3 -3
  72. package/dist/_chunks/{InstalledPluginsPage-8e9b0b64.mjs.map → InstalledPluginsPage-ff15831e.mjs.map} +1 -1
  73. package/dist/_chunks/{Layout-caf718bb.mjs → Layout-1dd77bbb.mjs} +2 -2
  74. package/dist/_chunks/{Layout-caf718bb.mjs.map → Layout-1dd77bbb.mjs.map} +1 -1
  75. package/dist/_chunks/{Layout-cc5413b2.js → Layout-ef2fc31f.js} +2 -2
  76. package/dist/_chunks/{Layout-cc5413b2.js.map → Layout-ef2fc31f.js.map} +1 -1
  77. package/dist/_chunks/{ListPage-cc823a6a.js → ListPage-10bf0ce5.js} +3 -3
  78. package/dist/_chunks/{ListPage-cc823a6a.js.map → ListPage-10bf0ce5.js.map} +1 -1
  79. package/dist/_chunks/{ListPage-5ed3e9d2.mjs → ListPage-1de5fb9e.mjs} +5 -5
  80. package/dist/_chunks/{ListPage-5ed3e9d2.mjs.map → ListPage-1de5fb9e.mjs.map} +1 -1
  81. package/dist/_chunks/{ListPage-db17e758.js → ListPage-354a539f.js} +5 -5
  82. package/dist/_chunks/{ListPage-db17e758.js.map → ListPage-354a539f.js.map} +1 -1
  83. package/dist/_chunks/{ListPage-800398cd.mjs → ListPage-57f5028e.mjs} +6 -6
  84. package/dist/_chunks/{ListPage-800398cd.mjs.map → ListPage-57f5028e.mjs.map} +1 -1
  85. package/dist/_chunks/{ListPage-338d8ca5.js → ListPage-7304822d.js} +6 -6
  86. package/dist/_chunks/{ListPage-338d8ca5.js.map → ListPage-7304822d.js.map} +1 -1
  87. package/dist/_chunks/{ListPage-f43782c4.mjs → ListPage-887f0f02.mjs} +3 -3
  88. package/dist/_chunks/{ListPage-f43782c4.mjs.map → ListPage-887f0f02.mjs.map} +1 -1
  89. package/dist/_chunks/{ListPage-05df9b86.mjs → ListPage-96026788.mjs} +3 -3
  90. package/dist/_chunks/{ListPage-05df9b86.mjs.map → ListPage-96026788.mjs.map} +1 -1
  91. package/dist/_chunks/{ListPage-17fb477a.js → ListPage-ac287db9.js} +3 -3
  92. package/dist/_chunks/{ListPage-17fb477a.js.map → ListPage-ac287db9.js.map} +1 -1
  93. package/dist/_chunks/{ListPage-5e5ad2aa.js → ListPage-ba1aec01.js} +3 -3
  94. package/dist/_chunks/{ListPage-5e5ad2aa.js.map → ListPage-ba1aec01.js.map} +1 -1
  95. package/dist/_chunks/{ListPage-7d5baee5.mjs → ListPage-c878fda8.mjs} +4 -4
  96. package/dist/_chunks/{ListPage-7d5baee5.mjs.map → ListPage-c878fda8.mjs.map} +1 -1
  97. package/dist/_chunks/{ListPage-de4b7131.mjs → ListPage-f256fcb7.mjs} +3 -3
  98. package/dist/_chunks/{ListPage-de4b7131.mjs.map → ListPage-f256fcb7.mjs.map} +1 -1
  99. package/dist/_chunks/{ListPage-56d94335.js → ListPage-f582ff65.js} +4 -4
  100. package/dist/_chunks/{ListPage-56d94335.js.map → ListPage-f582ff65.js.map} +1 -1
  101. package/dist/_chunks/{ListView-b91a8da7.mjs → ListView-1b370206.mjs} +3 -3
  102. package/dist/_chunks/{ListView-b91a8da7.mjs.map → ListView-1b370206.mjs.map} +1 -1
  103. package/dist/_chunks/{ListView-80855396.js → ListView-1fb891a4.js} +3 -3
  104. package/dist/_chunks/{ListView-80855396.js.map → ListView-1fb891a4.js.map} +1 -1
  105. package/dist/_chunks/{ListView-a33ebe77.js → ListView-96fe1016.js} +3 -3
  106. package/dist/_chunks/{ListView-a33ebe77.js.map → ListView-96fe1016.js.map} +1 -1
  107. package/dist/_chunks/{ListView-521e309f.mjs → ListView-bf4ccdba.mjs} +3 -3
  108. package/dist/_chunks/{ListView-521e309f.mjs.map → ListView-bf4ccdba.mjs.map} +1 -1
  109. package/dist/_chunks/{Login-906ebde5.js → Login-09040dec.js} +2 -2
  110. package/dist/_chunks/{Login-906ebde5.js.map → Login-09040dec.js.map} +1 -1
  111. package/dist/_chunks/{Login-4eb1fb78.mjs → Login-6670c9b9.mjs} +2 -2
  112. package/dist/_chunks/{Login-4eb1fb78.mjs.map → Login-6670c9b9.mjs.map} +1 -1
  113. package/dist/_chunks/{MagicLinkEE-03128309.mjs → MagicLinkEE-6d9ed1b1.mjs} +3 -3
  114. package/dist/_chunks/{MagicLinkEE-03128309.mjs.map → MagicLinkEE-6d9ed1b1.mjs.map} +1 -1
  115. package/dist/_chunks/{MagicLinkEE-ab36ee0f.js → MagicLinkEE-79ab8b22.js} +3 -3
  116. package/dist/_chunks/{MagicLinkEE-ab36ee0f.js.map → MagicLinkEE-79ab8b22.js.map} +1 -1
  117. package/dist/_chunks/{MarketplacePage-62e70483.mjs → MarketplacePage-54a925f9.mjs} +3 -3
  118. package/dist/_chunks/{MarketplacePage-62e70483.mjs.map → MarketplacePage-54a925f9.mjs.map} +1 -1
  119. package/dist/_chunks/{MarketplacePage-fe1f2c6e.js → MarketplacePage-ec91b073.js} +3 -3
  120. package/dist/_chunks/{MarketplacePage-fe1f2c6e.js.map → MarketplacePage-ec91b073.js.map} +1 -1
  121. package/dist/_chunks/{ProfilePage-5359ee40.mjs → ProfilePage-091a4db8.mjs} +3 -3
  122. package/dist/_chunks/{ProfilePage-5359ee40.mjs.map → ProfilePage-091a4db8.mjs.map} +1 -1
  123. package/dist/_chunks/{ProfilePage-5bf5e2ed.js → ProfilePage-a28fc7c8.js} +3 -3
  124. package/dist/_chunks/{ProfilePage-5bf5e2ed.js.map → ProfilePage-a28fc7c8.js.map} +1 -1
  125. package/dist/_chunks/{ReviewWorkflowsColumn-65518684.mjs → ReviewWorkflowsColumn-5a3ca279.mjs} +2 -2
  126. package/dist/_chunks/{ReviewWorkflowsColumn-65518684.mjs.map → ReviewWorkflowsColumn-5a3ca279.mjs.map} +1 -1
  127. package/dist/_chunks/{ReviewWorkflowsColumn-b36965fe.js → ReviewWorkflowsColumn-b2d53622.js} +2 -2
  128. package/dist/_chunks/{ReviewWorkflowsColumn-b36965fe.js.map → ReviewWorkflowsColumn-b2d53622.js.map} +1 -1
  129. package/dist/_chunks/{SelectRoles-e83f2dee.js → SelectRoles-b55e6376.js} +2 -2
  130. package/dist/_chunks/{SelectRoles-e83f2dee.js.map → SelectRoles-b55e6376.js.map} +1 -1
  131. package/dist/_chunks/{SelectRoles-3d810b00.mjs → SelectRoles-f0565968.mjs} +2 -2
  132. package/dist/_chunks/{SelectRoles-3d810b00.mjs.map → SelectRoles-f0565968.mjs.map} +1 -1
  133. package/dist/_chunks/{SettingsPage-571f777c.mjs → SettingsPage-7567e138.mjs} +20 -20
  134. package/dist/_chunks/{SettingsPage-571f777c.mjs.map → SettingsPage-7567e138.mjs.map} +1 -1
  135. package/dist/_chunks/{SettingsPage-a558ffda.js → SettingsPage-b5d5dd0b.js} +20 -20
  136. package/dist/_chunks/{SettingsPage-a558ffda.js.map → SettingsPage-b5d5dd0b.js.map} +1 -1
  137. package/dist/_chunks/{SingleSignOnPage-19f2e16f.mjs → SingleSignOnPage-4d1d2448.mjs} +3 -3
  138. package/dist/_chunks/{SingleSignOnPage-19f2e16f.mjs.map → SingleSignOnPage-4d1d2448.mjs.map} +1 -1
  139. package/dist/_chunks/{SingleSignOnPage-b63f4c0f.js → SingleSignOnPage-51dfde4b.js} +3 -3
  140. package/dist/_chunks/{SingleSignOnPage-b63f4c0f.js.map → SingleSignOnPage-51dfde4b.js.map} +1 -1
  141. package/dist/_chunks/{constants-b3c9cbbf.mjs → constants-2ccf2787.mjs} +2 -2
  142. package/dist/_chunks/{constants-b3c9cbbf.mjs.map → constants-2ccf2787.mjs.map} +1 -1
  143. package/dist/_chunks/{constants-5345058d.js → constants-54043280.js} +2 -2
  144. package/dist/_chunks/{constants-5345058d.js.map → constants-54043280.js.map} +1 -1
  145. package/dist/_chunks/{constants-73ebce66.js → constants-74ce2d53.js} +2 -2
  146. package/dist/_chunks/{constants-73ebce66.js.map → constants-74ce2d53.js.map} +1 -1
  147. package/dist/_chunks/{constants-71ebbb75.mjs → constants-81c376c5.mjs} +2 -2
  148. package/dist/_chunks/{constants-71ebbb75.mjs.map → constants-81c376c5.mjs.map} +1 -1
  149. package/dist/_chunks/{constants-d80f19f3.js → constants-a5b1e9d4.js} +6 -6
  150. package/dist/_chunks/{constants-d80f19f3.js.map → constants-a5b1e9d4.js.map} +1 -1
  151. package/dist/_chunks/{constants-7e57b453.mjs → constants-b156a1b6.mjs} +6 -6
  152. package/dist/_chunks/{constants-7e57b453.mjs.map → constants-b156a1b6.mjs.map} +1 -1
  153. package/dist/_chunks/{index-3f8cf4d5.js → index-3956d072.js} +36 -33
  154. package/dist/_chunks/index-3956d072.js.map +1 -0
  155. package/dist/_chunks/{index-95e8649d.mjs → index-3bbbb14c.mjs} +36 -33
  156. package/dist/_chunks/index-3bbbb14c.mjs.map +1 -0
  157. package/dist/_chunks/{useAdminRolePermissions-fccd0884.mjs → useAdminRolePermissions-9f9361e7.mjs} +2 -2
  158. package/dist/_chunks/{useAdminRolePermissions-fccd0884.mjs.map → useAdminRolePermissions-9f9361e7.mjs.map} +1 -1
  159. package/dist/_chunks/{useAdminRolePermissions-122fa43a.js → useAdminRolePermissions-c97323e2.js} +2 -2
  160. package/dist/_chunks/{useAdminRolePermissions-122fa43a.js.map → useAdminRolePermissions-c97323e2.js.map} +1 -1
  161. package/dist/_chunks/{validateWorkflow-8a63abd6.mjs → validateWorkflow-5208ca73.mjs} +2 -2
  162. package/dist/_chunks/{validateWorkflow-8a63abd6.mjs.map → validateWorkflow-5208ca73.mjs.map} +1 -1
  163. package/dist/_chunks/{validateWorkflow-1f89db67.js → validateWorkflow-f6947b4c.js} +2 -2
  164. package/dist/_chunks/{validateWorkflow-1f89db67.js.map → validateWorkflow-f6947b4c.js.map} +1 -1
  165. package/dist/admin/index.js +1 -1
  166. package/dist/admin/index.mjs +1 -1
  167. package/package.json +13 -13
  168. package/dist/_chunks/index-3f8cf4d5.js.map +0 -1
  169. package/dist/_chunks/index-95e8649d.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"SettingsPage-571f777c.mjs","sources":["../../admin/src/hooks/useSettingsMenu.ts","../../admin/src/pages/Settings/components/SettingsNav.tsx","../../admin/src/pages/Settings/constants.ts","../../admin/src/pages/Settings/pages/ApplicationInfo/utils/constants.ts","../../admin/src/pages/Settings/pages/ApplicationInfo/utils/files.ts","../../admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.tsx","../../admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.tsx","../../admin/src/pages/Settings/SettingsPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n hasPermissions,\n StrapiAppSetting,\n StrapiAppSettingLink as IStrapiAppSettingLink,\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';\nimport { PermissionMap } from '../types/permissions';\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: IStrapiAppSettingLink['permissions'];\n hasNotification?: boolean;\n}\n\ninterface StrapiAppSettingsLink extends IStrapiAppSettingLink {\n lockIcon?: never;\n hasNotification?: never;\n}\n\ninterface SettingsMenuSection extends Omit<StrapiAppSetting, 'links'> {\n links: Array<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n}\n\ninterface SettingsMenuLinkWithPermissionsAndDisplayed extends SettingsMenuLinkWithPermissions {\n isDisplayed: boolean;\n}\n\ninterface StrapiAppSettingLinkWithDisplayed extends StrapiAppSettingsLink {\n isDisplayed: boolean;\n}\n\ninterface SettingsMenuSectionWithDisplayedLinks extends Omit<SettingsMenuSection, 'links'> {\n links: Array<SettingsMenuLinkWithPermissionsAndDisplayed | StrapiAppSettingLinkWithDisplayed>;\n}\n\ntype SettingsMenu = SettingsMenuSectionWithDisplayedLinks[];\n\nconst useSettingsMenu = (): {\n isLoading: boolean;\n menu: SettingsMenu;\n} => {\n const [{ isLoading, menu }, setData] = React.useState<{\n isLoading: boolean;\n menu: SettingsMenu;\n }>({\n isLoading: true,\n menu: [],\n });\n const { 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 as keyof PermissionMap['settings']]?.main ?? [],\n } satisfies SettingsMenuLinkWithPermissions;\n },\n [permissions.settings]\n );\n\n React.useEffect(() => {\n const getData = async () => {\n interface MenuLinkPermission {\n hasPermission: boolean;\n sectionIndex: number;\n linkIndex: number;\n }\n\n const buildMenuPermissions = (sections: SettingsMenuSectionWithDisplayedLinks[]) =>\n Promise.all(\n sections.reduce<Promise<MenuLinkPermission>[]>((acc, section, sectionIndex) => {\n const linksWithPermissions = section.links.map(async (link, linkIndex) => ({\n hasPermission: await 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 { 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 { useIntl } from 'react-intl';\nimport { NavLink, useLocation } from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport { SettingsMenu } from '../../../hooks/useSettingsMenu';\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\ninterface SettingsNavProps {\n menu: SettingsMenu;\n}\n\nconst SettingsNav = ({ menu }: SettingsNavProps) => {\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: string) => () => {\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 // @ts-expect-error – this is an issue with the DS where as props are not inferred\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\nexport { SettingsNav };\nexport type { SettingsNavProps };\n","import { MenuItem } from '@strapi/helper-plugin';\n\nexport interface Route\n extends Pick<MenuItem, 'exact' | 'to'>,\n Required<Pick<MenuItem, 'Component'>> {}\n\nexport const ROUTES_CE: Route[] = [\n {\n async Component() {\n const { ProtectedListPage } = await import('./pages/Roles/ListPage');\n\n return ProtectedListPage;\n },\n to: '/settings/roles',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedCreatePage } = await import('./pages/Roles/CreatePage');\n\n return ProtectedCreatePage;\n },\n to: '/settings/roles/duplicate/:id',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedCreatePage } = await import('./pages/Roles/CreatePage');\n\n return ProtectedCreatePage;\n },\n to: '/settings/roles/new',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedEditPage } = await import('./pages/Roles/EditPage');\n\n return ProtectedEditPage;\n },\n to: '/settings/roles/:id',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedListPage } = await import('./pages/Users/ListPage');\n\n return ProtectedListPage;\n },\n to: '/settings/users',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedEditPage } = await import('./pages/Users/EditPage');\n\n return ProtectedEditPage;\n },\n to: '/settings/users/:id',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedCreatePage } = await import('./pages/Webhooks/CreatePage');\n\n return ProtectedCreatePage;\n },\n to: '/settings/webhooks/create',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedEditPage } = await import('./pages/Webhooks/EditPage');\n\n return ProtectedEditPage;\n },\n to: '/settings/webhooks/:id',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedListPage } = await import('./pages/Webhooks/ListPage');\n\n return ProtectedListPage;\n },\n to: '/settings/webhooks',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedListView } = await import('./pages/ApiTokens/ListView');\n\n return ProtectedListView;\n },\n to: '/settings/api-tokens',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedCreateView } = await import('./pages/ApiTokens/CreateView');\n\n return ProtectedCreateView;\n },\n to: '/settings/api-tokens/create',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedEditView } = await import('./pages/ApiTokens/EditView/EditViewPage');\n\n return ProtectedEditView;\n },\n to: '/settings/api-tokens/:id',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedCreateView } = await import('./pages/TransferTokens/CreateView');\n\n return ProtectedCreateView;\n },\n to: '/settings/transfer-tokens/create',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedListView } = await import('./pages/TransferTokens/ListView');\n\n return ProtectedListView;\n },\n to: '/settings/transfer-tokens',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedEditView } = await import('./pages/TransferTokens/EditView');\n\n return ProtectedEditView;\n },\n to: '/settings/transfer-tokens/:id',\n exact: true,\n },\n {\n async Component() {\n const { PurchaseAuditLogs } = await import('./pages/PurchaseAuditLogs');\n\n return PurchaseAuditLogs;\n },\n to: '/settings/purchase-audit-logs',\n exact: true,\n },\n {\n async Component() {\n const { PurchaseReviewWorkflows } = await import('./pages/PurchaseReviewWorkflows');\n\n return PurchaseReviewWorkflows;\n },\n to: '/settings/purchase-review-workflows',\n exact: true,\n },\n {\n async Component() {\n const { PurchaseSingleSignOn } = await import('./pages/PurchaseSingleSignOn');\n\n return PurchaseSingleSignOn;\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","import { ACCEPTED_FORMAT, DIMENSION, SIZE } from './constants';\n\nimport type { MessageDescriptor } from 'react-intl';\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\ninterface ImageDimensions {\n height: number;\n width: number;\n}\n\ninterface ImageAsset extends ImageDimensions {\n ext: string | undefined;\n size: number;\n name: string;\n url: string;\n rawFile: File;\n}\n\nconst parseFileMetadatas = async (file: File): Promise<ImageAsset> => {\n const isFormatAuthorized = ACCEPTED_FORMAT.includes(file.type);\n\n if (!isFormatAuthorized) {\n throw new ParsingFileError('File format', FILE_FORMAT_ERROR_MESSAGE);\n }\n\n const fileDimensions = await new Promise<ImageDimensions>((resolve) => {\n const reader = new FileReader();\n reader.onload = () => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.width, height: img.height });\n };\n img.src = reader.result as string;\n };\n reader.readAsDataURL(file);\n });\n\n const areDimensionsAuthorized =\n fileDimensions.width <= DIMENSION && fileDimensions.height <= DIMENSION;\n\n if (!areDimensionsAuthorized) {\n throw new ParsingFileError('File sizing', FILE_SIZING_ERROR_MESSAGE);\n }\n\n const asset = {\n ext: file.name.split('.').pop(),\n size: file.size / 1000,\n name: file.name,\n url: URL.createObjectURL(file),\n rawFile: file,\n width: fileDimensions.width,\n height: fileDimensions.height,\n };\n\n const isSizeAuthorized = asset.size <= SIZE;\n\n if (!isSizeAuthorized) {\n throw new ParsingFileError('File sizing', FILE_SIZING_ERROR_MESSAGE);\n }\n\n return asset;\n};\n\nclass ParsingFileError extends Error {\n displayMessage: MessageDescriptor;\n\n constructor(message: string, displayMessage: MessageDescriptor, options?: ErrorOptions) {\n super(message, options);\n this.displayMessage = displayMessage;\n }\n}\n\nexport { parseFileMetadatas, ParsingFileError };\nexport type { ImageAsset };\n","import * as React from 'react';\n\nimport { createContext } from '@radix-ui/react-context';\nimport {\n Box,\n Button,\n ButtonProps,\n Card,\n CardAsset,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n CarouselActions,\n CarouselInput,\n CarouselInputProps,\n CarouselSlide,\n Divider,\n Field,\n FieldError,\n FieldInput,\n Flex,\n Icon,\n IconButton,\n ModalFooter,\n ModalHeader,\n ModalLayout,\n Tab,\n TabGroup,\n TabPanel,\n TabPanels,\n Tabs,\n TextInput,\n TextInputProps,\n Typography,\n} from '@strapi/design-system';\nimport { pxToRem } from '@strapi/helper-plugin';\nimport { PicturePlus, Plus, Refresh } from '@strapi/icons';\nimport axios, { AxiosError } from 'axios';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { ConfigurationProviderProps } from '../../../../../features/Configuration';\nimport { ACCEPTED_FORMAT, DIMENSION, SIZE } from '../utils/constants';\nimport { ImageAsset, ParsingFileError, parseFileMetadatas } from '../utils/files';\n\n/* -------------------------------------------------------------------------------------------------\n * LogoInputContext\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LogoInputContextValue {\n localImage: ImageAsset | undefined;\n goToStep: (step: Step) => void;\n onClose: () => void;\n setLocalImage: (asset: ImageAsset | undefined) => void;\n}\n\nconst [LogoInputContextProvider, useLogoInputContext] =\n createContext<LogoInputContextValue>('LogoInput');\n\n/* -------------------------------------------------------------------------------------------------\n * LogoInput\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LogoInputProps\n extends Pick<PendingLogoDialogProps, 'onChangeLogo'>,\n Pick<CarouselInputProps, 'label' | 'hint'> {\n canUpdate: boolean;\n customLogo?: ConfigurationProviderProps['authLogo']['custom'];\n defaultLogo: string;\n}\n\ntype Step = 'pending' | 'upload' | undefined;\n\nconst LogoInput = ({\n canUpdate,\n customLogo,\n defaultLogo,\n hint,\n label,\n onChangeLogo,\n}: LogoInputProps) => {\n const [localImage, setLocalImage] = React.useState<ImageAsset | undefined>();\n const [currentStep, setCurrentStep] = React.useState<Step>();\n const { formatMessage } = useIntl();\n\n const handleClose = () => {\n setLocalImage(undefined);\n setCurrentStep(undefined);\n };\n\n return (\n <LogoInputContextProvider\n setLocalImage={setLocalImage}\n localImage={localImage}\n goToStep={setCurrentStep}\n onClose={handleClose}\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={() => setCurrentStep('upload')}\n label={formatMessage({\n id: 'Settings.application.customization.carousel.change-action',\n defaultMessage: 'Change logo',\n })}\n icon={<Plus />}\n />\n {customLogo?.url && (\n <IconButton\n disabled={!canUpdate}\n onClick={() => onChangeLogo(null)}\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 {currentStep ? (\n <ModalLayout labelledBy=\"modal\" onClose={handleClose}>\n <ModalHeader>\n <Typography fontWeight=\"bold\" as=\"h2\" id=\"modal\">\n {formatMessage(\n currentStep === 'upload'\n ? {\n id: 'Settings.application.customization.modal.upload',\n defaultMessage: 'Upload logo',\n }\n : {\n id: 'Settings.application.customization.modal.pending',\n defaultMessage: 'Pending logo',\n }\n )}\n </Typography>\n </ModalHeader>\n {currentStep === 'upload' ? (\n <AddLogoDialog />\n ) : (\n <PendingLogoDialog onChangeLogo={onChangeLogo} />\n )}\n </ModalLayout>\n ) : null}\n </LogoInputContextProvider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AddLogoDialog\n * -----------------------------------------------------------------------------------------------*/\n\nconst AddLogoDialog = () => {\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 <Divider />\n </Box>\n <TabPanels>\n <TabPanel>\n <ComputerForm />\n </TabPanel>\n <TabPanel>\n <URLForm />\n </TabPanel>\n </TabPanels>\n </TabGroup>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * URLForm\n * -----------------------------------------------------------------------------------------------*/\n\nconst URLForm = () => {\n const { formatMessage } = useIntl();\n const [logoUrl, setLogoUrl] = React.useState('');\n const [error, setError] = React.useState<string>();\n const { setLocalImage, goToStep, onClose } = useLogoInputContext('URLForm');\n\n const handleChange: TextInputProps['onChange'] = (e) => {\n setLogoUrl(e.target.value);\n };\n\n const handleSubmit: React.FormEventHandler<HTMLFormElement> = async (event) => {\n event.preventDefault();\n\n const data = new FormData(event.target as HTMLFormElement);\n\n const url = data.get('logo-url');\n\n if (!url) {\n return;\n }\n\n try {\n const res = await axios.get(url.toString(), { responseType: 'blob', timeout: 8000 });\n\n const file = new File([res.data], res.config.url ?? '', {\n type: res.headers['content-type'],\n });\n\n const asset = await parseFileMetadatas(file);\n\n setLocalImage(asset);\n goToStep('pending');\n } catch (err) {\n if (err instanceof AxiosError) {\n setError(\n formatMessage({\n id: 'Settings.application.customization.modal.upload.error-network',\n defaultMessage: 'Network error',\n })\n );\n } else if (err instanceof ParsingFileError) {\n setError(formatMessage(err.displayMessage, { size: SIZE, dimension: DIMENSION }));\n } else {\n throw err;\n }\n }\n };\n\n return (\n <form onSubmit={handleSubmit}>\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\n/* -------------------------------------------------------------------------------------------------\n * ComputerForm\n * -----------------------------------------------------------------------------------------------*/\n\nconst ComputerForm = () => {\n const { formatMessage } = useIntl();\n const [dragOver, setDragOver] = React.useState(false);\n const [fileError, setFileError] = React.useState<string>();\n const inputRef = React.useRef<HTMLInputElement>(null!);\n const id = React.useId();\n\n const { setLocalImage, goToStep, onClose } = useLogoInputContext('ComputerForm');\n\n const handleDragEnter = () => setDragOver(true);\n const handleDragLeave = () => setDragOver(false);\n\n const handleClick: ButtonProps['onClick'] = (e) => {\n e.preventDefault();\n inputRef.current.click();\n };\n\n const handleChange = async () => {\n handleDragLeave();\n\n if (!inputRef.current.files) {\n return;\n }\n\n const [file] = inputRef.current.files;\n\n try {\n const asset = await parseFileMetadatas(file);\n setLocalImage(asset);\n goToStep('pending');\n } catch (err) {\n if (err instanceof ParsingFileError) {\n setFileError(formatMessage(err.displayMessage, { size: SIZE, dimension: DIMENSION }));\n inputRef.current.focus();\n } else {\n throw err;\n }\n }\n };\n\n return (\n <>\n <form>\n <Box paddingLeft={8} paddingRight={8} paddingTop={6} paddingBottom={6}>\n <Field name={id} error={fileError}>\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={dragOver ? 'primary500' : fileError ? 'danger600' : 'neutral300'}\n borderStyle=\"dashed\"\n borderWidth=\"1px\"\n position=\"relative\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n >\n <Icon\n color=\"primary600\"\n width={pxToRem(60)}\n height={pxToRem(60)}\n as={PicturePlus}\n aria-hidden\n />\n <Box paddingTop={3} paddingBottom={5}>\n <Typography variant=\"delta\" as=\"label\" htmlFor={id}>\n {formatMessage({\n id: 'Settings.application.customization.modal.upload.drag-drop',\n defaultMessage: 'Drag and Drop here or',\n })}\n </Typography>\n </Box>\n <FileInput\n accept={ACCEPTED_FORMAT.join(', ')}\n type=\"file\"\n name=\"files\"\n tabIndex={-1}\n onChange={handleChange}\n ref={inputRef}\n id={id}\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 <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 </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\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\n/* -------------------------------------------------------------------------------------------------\n * PendingLogoDialog\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PendingLogoDialogProps {\n onChangeLogo: (file: ImageAsset | null) => void;\n}\n\nconst PendingLogoDialog = ({ onChangeLogo }: PendingLogoDialogProps) => {\n const { formatMessage } = useIntl();\n const { localImage, setLocalImage, goToStep, onClose } = useLogoInputContext('PendingLogoDialog');\n\n const handleGoBack = () => {\n setLocalImage(undefined);\n goToStep('upload');\n };\n\n const handleUpload = () => {\n if (localImage) {\n onChangeLogo(localImage);\n }\n onClose();\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)}>\n {localImage?.url ? <ImageCardAsset asset={localImage} /> : null}\n </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\n/* -------------------------------------------------------------------------------------------------\n * ImageCardAsset\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ImageCardAssetProps {\n asset: ImageAsset;\n}\n\nconst ImageCardAsset = ({ asset }: ImageCardAssetProps) => {\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\nexport { LogoInput };\nexport type { LogoInputProps };\n","import * as React from 'react';\n\nimport {\n Box,\n Button,\n ContentLayout,\n Flex,\n Grid,\n GridItem,\n HeaderLayout,\n Layout,\n Link,\n Main,\n Typography,\n} from '@strapi/design-system';\nimport {\n SettingsPageTitle,\n useAppInfo,\n useFocusWhenNavigate,\n useRBAC,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { Check, ExternalLink } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useSelector } from 'react-redux';\n\nimport { useConfiguration } from '../../../../features/Configuration';\nimport { useEnterprise } from '../../../../hooks/useEnterprise';\nimport { selectAdminPermissions } from '../../../../selectors';\n\nimport { LogoInput, LogoInputProps } from './components/LogoInput';\nimport { DIMENSION, SIZE } from './utils/constants';\n\nconst AdminSeatInfoCE = () => null;\n\n/* -------------------------------------------------------------------------------------------------\n * ApplicationInfoPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ApplicationInfoPage = () => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { logos: serverLogos, updateProjectSettings } = useConfiguration('ApplicationInfoPage');\n const [logos, setLogos] = React.useState({ menu: serverLogos.menu, auth: serverLogos.auth });\n const { settings } = useSelector(selectAdminPermissions);\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/ApplicationInfoPage/components/AdminSeatInfo'\n )\n ).AdminSeatInfoEE\n );\n\n const {\n allowedActions: { canRead, canUpdate },\n } = useRBAC(settings ? settings['project-settings'] : {});\n\n useFocusWhenNavigate();\n\n const handleSubmit: React.FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n updateProjectSettings({\n authLogo: logos.auth.custom ?? null,\n menuLogo: logos.menu.custom ?? null,\n });\n };\n\n const handleChangeLogo =\n (logo: 'menu' | 'auth'): LogoInputProps['onChangeLogo'] =>\n (newLogo) => {\n /**\n * If there's no newLogo value we can assume we're reseting.\n */\n if (newLogo === null) {\n trackUsage('didClickResetLogo', {\n logo,\n });\n }\n\n setLogos((prev) => ({\n ...prev,\n [logo]: {\n ...prev[logo],\n custom: newLogo,\n },\n }));\n };\n\n React.useEffect(() => {\n setLogos({\n menu: serverLogos.menu,\n auth: serverLogos.auth,\n });\n }, [serverLogos]);\n\n // block rendering until the EE component is fully loaded\n if (!AdminSeatInfo) {\n return null;\n }\n\n const isSaveDisabled =\n logos.auth.custom === serverLogos.auth.custom && logos.menu.custom === serverLogos.menu.custom;\n\n return (\n <Layout>\n <SettingsPageTitle\n name={formatMessage({\n id: 'Settings.application.header',\n defaultMessage: 'Application',\n })}\n />\n <Main>\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 disabled={isSaveDisabled} 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 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 href=\"https://strapi.io/pricing-self-hosted\" endIcon={<ExternalLink />}>\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 && (\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:\n '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={logos.menu.custom}\n defaultLogo={logos.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={handleChangeLogo('menu')}\n />\n </GridItem>\n <GridItem col={6} s={12}>\n <LogoInput\n canUpdate={canUpdate}\n customLogo={logos.auth.custom}\n defaultLogo={logos.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={handleChangeLogo('auth')}\n />\n </GridItem>\n </Grid>\n </Box>\n )}\n </Flex>\n </ContentLayout>\n </form>\n </Main>\n </Layout>\n );\n};\n\nexport { ApplicationInfoPage };\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, Route as IRoute } from './constants';\nimport { ApplicationInfoPage } from './pages/ApplicationInfo/ApplicationInfoPage';\n\nconst SettingsPage = () => {\n const { settingId } = useParams<{ settingId: string }>();\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(routes).map(({ to, Component, exact }) =>\n 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={ApplicationInfoPage} exact />\n {adminRoutes}\n {pluginsRoutes}\n </Switch>\n </Layout>\n );\n};\n\nexport const makeUniqueRoutes = (routes: IRoute[]) =>\n routes.filter(\n (route, index, refArray) => refArray.findIndex((obj) => obj.to === route.to) === index\n );\n\nexport { SettingsPage };\n"],"names":["ceLinks","sections","permission"],"mappings":"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"}
1
+ {"version":3,"file":"SettingsPage-7567e138.mjs","sources":["../../admin/src/hooks/useSettingsMenu.ts","../../admin/src/pages/Settings/components/SettingsNav.tsx","../../admin/src/pages/Settings/constants.ts","../../admin/src/pages/Settings/pages/ApplicationInfo/utils/constants.ts","../../admin/src/pages/Settings/pages/ApplicationInfo/utils/files.ts","../../admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.tsx","../../admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.tsx","../../admin/src/pages/Settings/SettingsPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n hasPermissions,\n StrapiAppSetting,\n StrapiAppSettingLink as IStrapiAppSettingLink,\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';\nimport { PermissionMap } from '../types/permissions';\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: IStrapiAppSettingLink['permissions'];\n hasNotification?: boolean;\n}\n\ninterface StrapiAppSettingsLink extends IStrapiAppSettingLink {\n lockIcon?: never;\n hasNotification?: never;\n}\n\ninterface SettingsMenuSection extends Omit<StrapiAppSetting, 'links'> {\n links: Array<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n}\n\ninterface SettingsMenuLinkWithPermissionsAndDisplayed extends SettingsMenuLinkWithPermissions {\n isDisplayed: boolean;\n}\n\ninterface StrapiAppSettingLinkWithDisplayed extends StrapiAppSettingsLink {\n isDisplayed: boolean;\n}\n\ninterface SettingsMenuSectionWithDisplayedLinks extends Omit<SettingsMenuSection, 'links'> {\n links: Array<SettingsMenuLinkWithPermissionsAndDisplayed | StrapiAppSettingLinkWithDisplayed>;\n}\n\ntype SettingsMenu = SettingsMenuSectionWithDisplayedLinks[];\n\nconst useSettingsMenu = (): {\n isLoading: boolean;\n menu: SettingsMenu;\n} => {\n const [{ isLoading, menu }, setData] = React.useState<{\n isLoading: boolean;\n menu: SettingsMenu;\n }>({\n isLoading: true,\n menu: [],\n });\n const { 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 as keyof PermissionMap['settings']]?.main ?? [],\n } satisfies SettingsMenuLinkWithPermissions;\n },\n [permissions.settings]\n );\n\n React.useEffect(() => {\n const getData = async () => {\n interface MenuLinkPermission {\n hasPermission: boolean;\n sectionIndex: number;\n linkIndex: number;\n }\n\n const buildMenuPermissions = (sections: SettingsMenuSectionWithDisplayedLinks[]) =>\n Promise.all(\n sections.reduce<Promise<MenuLinkPermission>[]>((acc, section, sectionIndex) => {\n const linksWithPermissions = section.links.map(async (link, linkIndex) => ({\n hasPermission: await 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 { 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 { useIntl } from 'react-intl';\nimport { NavLink, useLocation } from 'react-router-dom';\nimport styled from 'styled-components';\n\nimport { SettingsMenu } from '../../../hooks/useSettingsMenu';\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\ninterface SettingsNavProps {\n menu: SettingsMenu;\n}\n\nconst SettingsNav = ({ menu }: SettingsNavProps) => {\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: string) => () => {\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 // @ts-expect-error – this is an issue with the DS where as props are not inferred\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\nexport { SettingsNav };\nexport type { SettingsNavProps };\n","import { MenuItem } from '@strapi/helper-plugin';\n\nexport interface Route\n extends Pick<MenuItem, 'exact' | 'to'>,\n Required<Pick<MenuItem, 'Component'>> {}\n\nexport const ROUTES_CE: Route[] = [\n {\n async Component() {\n const { ProtectedListPage } = await import('./pages/Roles/ListPage');\n\n return ProtectedListPage;\n },\n to: '/settings/roles',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedCreatePage } = await import('./pages/Roles/CreatePage');\n\n return ProtectedCreatePage;\n },\n to: '/settings/roles/duplicate/:id',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedCreatePage } = await import('./pages/Roles/CreatePage');\n\n return ProtectedCreatePage;\n },\n to: '/settings/roles/new',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedEditPage } = await import('./pages/Roles/EditPage');\n\n return ProtectedEditPage;\n },\n to: '/settings/roles/:id',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedListPage } = await import('./pages/Users/ListPage');\n\n return ProtectedListPage;\n },\n to: '/settings/users',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedEditPage } = await import('./pages/Users/EditPage');\n\n return ProtectedEditPage;\n },\n to: '/settings/users/:id',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedCreatePage } = await import('./pages/Webhooks/CreatePage');\n\n return ProtectedCreatePage;\n },\n to: '/settings/webhooks/create',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedEditPage } = await import('./pages/Webhooks/EditPage');\n\n return ProtectedEditPage;\n },\n to: '/settings/webhooks/:id',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedListPage } = await import('./pages/Webhooks/ListPage');\n\n return ProtectedListPage;\n },\n to: '/settings/webhooks',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedListView } = await import('./pages/ApiTokens/ListView');\n\n return ProtectedListView;\n },\n to: '/settings/api-tokens',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedCreateView } = await import('./pages/ApiTokens/CreateView');\n\n return ProtectedCreateView;\n },\n to: '/settings/api-tokens/create',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedEditView } = await import('./pages/ApiTokens/EditView/EditViewPage');\n\n return ProtectedEditView;\n },\n to: '/settings/api-tokens/:id',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedCreateView } = await import('./pages/TransferTokens/CreateView');\n\n return ProtectedCreateView;\n },\n to: '/settings/transfer-tokens/create',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedListView } = await import('./pages/TransferTokens/ListView');\n\n return ProtectedListView;\n },\n to: '/settings/transfer-tokens',\n exact: true,\n },\n {\n async Component() {\n const { ProtectedEditView } = await import('./pages/TransferTokens/EditView');\n\n return ProtectedEditView;\n },\n to: '/settings/transfer-tokens/:id',\n exact: true,\n },\n {\n async Component() {\n const { PurchaseAuditLogs } = await import('./pages/PurchaseAuditLogs');\n\n return PurchaseAuditLogs;\n },\n to: '/settings/purchase-audit-logs',\n exact: true,\n },\n {\n async Component() {\n const { PurchaseReviewWorkflows } = await import('./pages/PurchaseReviewWorkflows');\n\n return PurchaseReviewWorkflows;\n },\n to: '/settings/purchase-review-workflows',\n exact: true,\n },\n {\n async Component() {\n const { PurchaseSingleSignOn } = await import('./pages/PurchaseSingleSignOn');\n\n return PurchaseSingleSignOn;\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","import { ACCEPTED_FORMAT, DIMENSION, SIZE } from './constants';\n\nimport type { MessageDescriptor } from 'react-intl';\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\ninterface ImageDimensions {\n height: number;\n width: number;\n}\n\ninterface ImageAsset extends ImageDimensions {\n ext: string | undefined;\n size: number;\n name: string;\n url: string;\n rawFile: File;\n}\n\nconst parseFileMetadatas = async (file: File): Promise<ImageAsset> => {\n const isFormatAuthorized = ACCEPTED_FORMAT.includes(file.type);\n\n if (!isFormatAuthorized) {\n throw new ParsingFileError('File format', FILE_FORMAT_ERROR_MESSAGE);\n }\n\n const fileDimensions = await new Promise<ImageDimensions>((resolve) => {\n const reader = new FileReader();\n reader.onload = () => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.width, height: img.height });\n };\n img.src = reader.result as string;\n };\n reader.readAsDataURL(file);\n });\n\n const areDimensionsAuthorized =\n fileDimensions.width <= DIMENSION && fileDimensions.height <= DIMENSION;\n\n if (!areDimensionsAuthorized) {\n throw new ParsingFileError('File sizing', FILE_SIZING_ERROR_MESSAGE);\n }\n\n const asset = {\n ext: file.name.split('.').pop(),\n size: file.size / 1000,\n name: file.name,\n url: URL.createObjectURL(file),\n rawFile: file,\n width: fileDimensions.width,\n height: fileDimensions.height,\n };\n\n const isSizeAuthorized = asset.size <= SIZE;\n\n if (!isSizeAuthorized) {\n throw new ParsingFileError('File sizing', FILE_SIZING_ERROR_MESSAGE);\n }\n\n return asset;\n};\n\nclass ParsingFileError extends Error {\n displayMessage: MessageDescriptor;\n\n constructor(message: string, displayMessage: MessageDescriptor, options?: ErrorOptions) {\n super(message, options);\n this.displayMessage = displayMessage;\n }\n}\n\nexport { parseFileMetadatas, ParsingFileError };\nexport type { ImageAsset };\n","import * as React from 'react';\n\nimport { createContext } from '@radix-ui/react-context';\nimport {\n Box,\n Button,\n ButtonProps,\n Card,\n CardAsset,\n CardBadge,\n CardBody,\n CardContent,\n CardHeader,\n CardSubtitle,\n CardTitle,\n CarouselActions,\n CarouselInput,\n CarouselInputProps,\n CarouselSlide,\n Divider,\n Field,\n FieldError,\n FieldInput,\n Flex,\n Icon,\n IconButton,\n ModalFooter,\n ModalHeader,\n ModalLayout,\n Tab,\n TabGroup,\n TabPanel,\n TabPanels,\n Tabs,\n TextInput,\n TextInputProps,\n Typography,\n} from '@strapi/design-system';\nimport { pxToRem } from '@strapi/helper-plugin';\nimport { PicturePlus, Plus, Refresh } from '@strapi/icons';\nimport axios, { AxiosError } from 'axios';\nimport { useIntl } from 'react-intl';\nimport styled from 'styled-components';\n\nimport { ConfigurationProviderProps } from '../../../../../features/Configuration';\nimport { ACCEPTED_FORMAT, DIMENSION, SIZE } from '../utils/constants';\nimport { ImageAsset, ParsingFileError, parseFileMetadatas } from '../utils/files';\n\n/* -------------------------------------------------------------------------------------------------\n * LogoInputContext\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LogoInputContextValue {\n localImage: ImageAsset | undefined;\n goToStep: (step: Step) => void;\n onClose: () => void;\n setLocalImage: (asset: ImageAsset | undefined) => void;\n}\n\nconst [LogoInputContextProvider, useLogoInputContext] =\n createContext<LogoInputContextValue>('LogoInput');\n\n/* -------------------------------------------------------------------------------------------------\n * LogoInput\n * -----------------------------------------------------------------------------------------------*/\n\ninterface LogoInputProps\n extends Pick<PendingLogoDialogProps, 'onChangeLogo'>,\n Pick<CarouselInputProps, 'label' | 'hint'> {\n canUpdate: boolean;\n customLogo?: ConfigurationProviderProps['authLogo']['custom'];\n defaultLogo: string;\n}\n\ntype Step = 'pending' | 'upload' | undefined;\n\nconst LogoInput = ({\n canUpdate,\n customLogo,\n defaultLogo,\n hint,\n label,\n onChangeLogo,\n}: LogoInputProps) => {\n const [localImage, setLocalImage] = React.useState<ImageAsset | undefined>();\n const [currentStep, setCurrentStep] = React.useState<Step>();\n const { formatMessage } = useIntl();\n\n const handleClose = () => {\n setLocalImage(undefined);\n setCurrentStep(undefined);\n };\n\n return (\n <LogoInputContextProvider\n setLocalImage={setLocalImage}\n localImage={localImage}\n goToStep={setCurrentStep}\n onClose={handleClose}\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={() => setCurrentStep('upload')}\n label={formatMessage({\n id: 'Settings.application.customization.carousel.change-action',\n defaultMessage: 'Change logo',\n })}\n icon={<Plus />}\n />\n {customLogo?.url && (\n <IconButton\n disabled={!canUpdate}\n onClick={() => onChangeLogo(null)}\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 {currentStep ? (\n <ModalLayout labelledBy=\"modal\" onClose={handleClose}>\n <ModalHeader>\n <Typography fontWeight=\"bold\" as=\"h2\" id=\"modal\">\n {formatMessage(\n currentStep === 'upload'\n ? {\n id: 'Settings.application.customization.modal.upload',\n defaultMessage: 'Upload logo',\n }\n : {\n id: 'Settings.application.customization.modal.pending',\n defaultMessage: 'Pending logo',\n }\n )}\n </Typography>\n </ModalHeader>\n {currentStep === 'upload' ? (\n <AddLogoDialog />\n ) : (\n <PendingLogoDialog onChangeLogo={onChangeLogo} />\n )}\n </ModalLayout>\n ) : null}\n </LogoInputContextProvider>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AddLogoDialog\n * -----------------------------------------------------------------------------------------------*/\n\nconst AddLogoDialog = () => {\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 <Divider />\n </Box>\n <TabPanels>\n <TabPanel>\n <ComputerForm />\n </TabPanel>\n <TabPanel>\n <URLForm />\n </TabPanel>\n </TabPanels>\n </TabGroup>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * URLForm\n * -----------------------------------------------------------------------------------------------*/\n\nconst URLForm = () => {\n const { formatMessage } = useIntl();\n const [logoUrl, setLogoUrl] = React.useState('');\n const [error, setError] = React.useState<string>();\n const { setLocalImage, goToStep, onClose } = useLogoInputContext('URLForm');\n\n const handleChange: TextInputProps['onChange'] = (e) => {\n setLogoUrl(e.target.value);\n };\n\n const handleSubmit: React.FormEventHandler<HTMLFormElement> = async (event) => {\n event.preventDefault();\n\n const data = new FormData(event.target as HTMLFormElement);\n\n const url = data.get('logo-url');\n\n if (!url) {\n return;\n }\n\n try {\n const res = await axios.get(url.toString(), { responseType: 'blob', timeout: 8000 });\n\n const file = new File([res.data], res.config.url ?? '', {\n type: res.headers['content-type'],\n });\n\n const asset = await parseFileMetadatas(file);\n\n setLocalImage(asset);\n goToStep('pending');\n } catch (err) {\n if (err instanceof AxiosError) {\n setError(\n formatMessage({\n id: 'Settings.application.customization.modal.upload.error-network',\n defaultMessage: 'Network error',\n })\n );\n } else if (err instanceof ParsingFileError) {\n setError(formatMessage(err.displayMessage, { size: SIZE, dimension: DIMENSION }));\n } else {\n throw err;\n }\n }\n };\n\n return (\n <form onSubmit={handleSubmit}>\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\n/* -------------------------------------------------------------------------------------------------\n * ComputerForm\n * -----------------------------------------------------------------------------------------------*/\n\nconst ComputerForm = () => {\n const { formatMessage } = useIntl();\n const [dragOver, setDragOver] = React.useState(false);\n const [fileError, setFileError] = React.useState<string>();\n const inputRef = React.useRef<HTMLInputElement>(null!);\n const id = React.useId();\n\n const { setLocalImage, goToStep, onClose } = useLogoInputContext('ComputerForm');\n\n const handleDragEnter = () => setDragOver(true);\n const handleDragLeave = () => setDragOver(false);\n\n const handleClick: ButtonProps['onClick'] = (e) => {\n e.preventDefault();\n inputRef.current.click();\n };\n\n const handleChange = async () => {\n handleDragLeave();\n\n if (!inputRef.current.files) {\n return;\n }\n\n const [file] = inputRef.current.files;\n\n try {\n const asset = await parseFileMetadatas(file);\n setLocalImage(asset);\n goToStep('pending');\n } catch (err) {\n if (err instanceof ParsingFileError) {\n setFileError(formatMessage(err.displayMessage, { size: SIZE, dimension: DIMENSION }));\n inputRef.current.focus();\n } else {\n throw err;\n }\n }\n };\n\n return (\n <>\n <form>\n <Box paddingLeft={8} paddingRight={8} paddingTop={6} paddingBottom={6}>\n <Field name={id} error={fileError}>\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={dragOver ? 'primary500' : fileError ? 'danger600' : 'neutral300'}\n borderStyle=\"dashed\"\n borderWidth=\"1px\"\n position=\"relative\"\n onDragEnter={handleDragEnter}\n onDragLeave={handleDragLeave}\n >\n <Icon\n color=\"primary600\"\n width={pxToRem(60)}\n height={pxToRem(60)}\n as={PicturePlus}\n aria-hidden\n />\n <Box paddingTop={3} paddingBottom={5}>\n <Typography variant=\"delta\" as=\"label\" htmlFor={id}>\n {formatMessage({\n id: 'Settings.application.customization.modal.upload.drag-drop',\n defaultMessage: 'Drag and Drop here or',\n })}\n </Typography>\n </Box>\n <FileInput\n accept={ACCEPTED_FORMAT.join(', ')}\n type=\"file\"\n name=\"files\"\n tabIndex={-1}\n onChange={handleChange}\n ref={inputRef}\n id={id}\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 <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 </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\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\n/* -------------------------------------------------------------------------------------------------\n * PendingLogoDialog\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PendingLogoDialogProps {\n onChangeLogo: (file: ImageAsset | null) => void;\n}\n\nconst PendingLogoDialog = ({ onChangeLogo }: PendingLogoDialogProps) => {\n const { formatMessage } = useIntl();\n const { localImage, setLocalImage, goToStep, onClose } = useLogoInputContext('PendingLogoDialog');\n\n const handleGoBack = () => {\n setLocalImage(undefined);\n goToStep('upload');\n };\n\n const handleUpload = () => {\n if (localImage) {\n onChangeLogo(localImage);\n }\n onClose();\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)}>\n {localImage?.url ? <ImageCardAsset asset={localImage} /> : null}\n </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\n/* -------------------------------------------------------------------------------------------------\n * ImageCardAsset\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ImageCardAssetProps {\n asset: ImageAsset;\n}\n\nconst ImageCardAsset = ({ asset }: ImageCardAssetProps) => {\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\nexport { LogoInput };\nexport type { LogoInputProps };\n","import * as React from 'react';\n\nimport {\n Box,\n Button,\n ContentLayout,\n Flex,\n Grid,\n GridItem,\n HeaderLayout,\n Layout,\n Link,\n Main,\n Typography,\n} from '@strapi/design-system';\nimport {\n SettingsPageTitle,\n useAppInfo,\n useFocusWhenNavigate,\n useRBAC,\n useTracking,\n} from '@strapi/helper-plugin';\nimport { Check, ExternalLink } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useSelector } from 'react-redux';\n\nimport { useConfiguration } from '../../../../features/Configuration';\nimport { useEnterprise } from '../../../../hooks/useEnterprise';\nimport { selectAdminPermissions } from '../../../../selectors';\n\nimport { LogoInput, LogoInputProps } from './components/LogoInput';\nimport { DIMENSION, SIZE } from './utils/constants';\n\nconst AdminSeatInfoCE = () => null;\n\n/* -------------------------------------------------------------------------------------------------\n * ApplicationInfoPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ApplicationInfoPage = () => {\n const { trackUsage } = useTracking();\n const { formatMessage } = useIntl();\n const { logos: serverLogos, updateProjectSettings } = useConfiguration('ApplicationInfoPage');\n const [logos, setLogos] = React.useState({ menu: serverLogos.menu, auth: serverLogos.auth });\n const { settings } = useSelector(selectAdminPermissions);\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/ApplicationInfoPage/components/AdminSeatInfo'\n )\n ).AdminSeatInfoEE\n );\n\n const {\n allowedActions: { canRead, canUpdate },\n } = useRBAC(settings ? settings['project-settings'] : {});\n\n useFocusWhenNavigate();\n\n const handleSubmit: React.FormEventHandler<HTMLFormElement> = (e) => {\n e.preventDefault();\n\n updateProjectSettings({\n authLogo: logos.auth.custom ?? null,\n menuLogo: logos.menu.custom ?? null,\n });\n };\n\n const handleChangeLogo =\n (logo: 'menu' | 'auth'): LogoInputProps['onChangeLogo'] =>\n (newLogo) => {\n /**\n * If there's no newLogo value we can assume we're reseting.\n */\n if (newLogo === null) {\n trackUsage('didClickResetLogo', {\n logo,\n });\n }\n\n setLogos((prev) => ({\n ...prev,\n [logo]: {\n ...prev[logo],\n custom: newLogo,\n },\n }));\n };\n\n React.useEffect(() => {\n setLogos({\n menu: serverLogos.menu,\n auth: serverLogos.auth,\n });\n }, [serverLogos]);\n\n // block rendering until the EE component is fully loaded\n if (!AdminSeatInfo) {\n return null;\n }\n\n const isSaveDisabled =\n logos.auth.custom === serverLogos.auth.custom && logos.menu.custom === serverLogos.menu.custom;\n\n return (\n <Layout>\n <SettingsPageTitle\n name={formatMessage({\n id: 'Settings.application.header',\n defaultMessage: 'Application',\n })}\n />\n <Main>\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 disabled={isSaveDisabled} 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 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 href=\"https://strapi.io/pricing-self-hosted\" endIcon={<ExternalLink />}>\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 && (\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:\n '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={logos.menu.custom}\n defaultLogo={logos.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={handleChangeLogo('menu')}\n />\n </GridItem>\n <GridItem col={6} s={12}>\n <LogoInput\n canUpdate={canUpdate}\n customLogo={logos.auth.custom}\n defaultLogo={logos.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={handleChangeLogo('auth')}\n />\n </GridItem>\n </Grid>\n </Box>\n )}\n </Flex>\n </ContentLayout>\n </form>\n </Main>\n </Layout>\n );\n};\n\nexport { ApplicationInfoPage };\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, Route as IRoute } from './constants';\nimport { ApplicationInfoPage } from './pages/ApplicationInfo/ApplicationInfoPage';\n\nconst SettingsPage = () => {\n const { settingId } = useParams<{ settingId: string }>();\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(routes).map(({ to, Component, exact }) =>\n 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={ApplicationInfoPage} exact />\n {adminRoutes}\n {pluginsRoutes}\n </Switch>\n </Layout>\n );\n};\n\nexport const makeUniqueRoutes = (routes: IRoute[]) =>\n routes.filter(\n (route, index, refArray) => refArray.findIndex((obj) => obj.to === route.to) === index\n );\n\nexport { SettingsPage };\n"],"names":["ceLinks","sections","permission"],"mappings":"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"}
@@ -7,10 +7,10 @@ const helperPlugin = require("@strapi/helper-plugin");
7
7
  const reactHelmet = require("react-helmet");
8
8
  const reactIntl = require("react-intl");
9
9
  const reactRouterDom = require("react-router-dom");
10
- const index = require("./index-3f8cf4d5.js");
10
+ const index = require("./index-3956d072.js");
11
11
  const sortBy = require("lodash/sortBy");
12
12
  const reactRedux = require("react-redux");
13
- const AuthenticatedApp = require("./AuthenticatedApp-47219c52.js");
13
+ const AuthenticatedApp = require("./AuthenticatedApp-b186733c.js");
14
14
  const v2 = require("@strapi/design-system/v2");
15
15
  const Icons = require("@strapi/icons");
16
16
  const styled = require("styled-components");
@@ -254,7 +254,7 @@ const SettingsNav = ({ menu }) => {
254
254
  const ROUTES_CE = [
255
255
  {
256
256
  async Component() {
257
- const { ProtectedListPage } = await Promise.resolve().then(() => require("./ListPage-5e5ad2aa.js"));
257
+ const { ProtectedListPage } = await Promise.resolve().then(() => require("./ListPage-ba1aec01.js"));
258
258
  return ProtectedListPage;
259
259
  },
260
260
  to: "/settings/roles",
@@ -262,7 +262,7 @@ const ROUTES_CE = [
262
262
  },
263
263
  {
264
264
  async Component() {
265
- const { ProtectedCreatePage } = await Promise.resolve().then(() => require("./CreatePage-eeb81776.js"));
265
+ const { ProtectedCreatePage } = await Promise.resolve().then(() => require("./CreatePage-92f708fa.js"));
266
266
  return ProtectedCreatePage;
267
267
  },
268
268
  to: "/settings/roles/duplicate/:id",
@@ -270,7 +270,7 @@ const ROUTES_CE = [
270
270
  },
271
271
  {
272
272
  async Component() {
273
- const { ProtectedCreatePage } = await Promise.resolve().then(() => require("./CreatePage-eeb81776.js"));
273
+ const { ProtectedCreatePage } = await Promise.resolve().then(() => require("./CreatePage-92f708fa.js"));
274
274
  return ProtectedCreatePage;
275
275
  },
276
276
  to: "/settings/roles/new",
@@ -278,7 +278,7 @@ const ROUTES_CE = [
278
278
  },
279
279
  {
280
280
  async Component() {
281
- const { ProtectedEditPage } = await Promise.resolve().then(() => require("./EditPage-de127112.js"));
281
+ const { ProtectedEditPage } = await Promise.resolve().then(() => require("./EditPage-f75f04b9.js"));
282
282
  return ProtectedEditPage;
283
283
  },
284
284
  to: "/settings/roles/:id",
@@ -286,7 +286,7 @@ const ROUTES_CE = [
286
286
  },
287
287
  {
288
288
  async Component() {
289
- const { ProtectedListPage } = await Promise.resolve().then(() => require("./ListPage-338d8ca5.js"));
289
+ const { ProtectedListPage } = await Promise.resolve().then(() => require("./ListPage-7304822d.js"));
290
290
  return ProtectedListPage;
291
291
  },
292
292
  to: "/settings/users",
@@ -294,7 +294,7 @@ const ROUTES_CE = [
294
294
  },
295
295
  {
296
296
  async Component() {
297
- const { ProtectedEditPage } = await Promise.resolve().then(() => require("./EditPage-0b1a48f7.js"));
297
+ const { ProtectedEditPage } = await Promise.resolve().then(() => require("./EditPage-39a7cd2d.js"));
298
298
  return ProtectedEditPage;
299
299
  },
300
300
  to: "/settings/users/:id",
@@ -302,7 +302,7 @@ const ROUTES_CE = [
302
302
  },
303
303
  {
304
304
  async Component() {
305
- const { ProtectedCreatePage } = await Promise.resolve().then(() => require("./CreatePage-d2a061b5.js"));
305
+ const { ProtectedCreatePage } = await Promise.resolve().then(() => require("./CreatePage-16d53bda.js"));
306
306
  return ProtectedCreatePage;
307
307
  },
308
308
  to: "/settings/webhooks/create",
@@ -310,7 +310,7 @@ const ROUTES_CE = [
310
310
  },
311
311
  {
312
312
  async Component() {
313
- const { ProtectedEditPage } = await Promise.resolve().then(() => require("./EditPage-89052393.js")).then((n) => n.EditPage$1);
313
+ const { ProtectedEditPage } = await Promise.resolve().then(() => require("./EditPage-48cdd744.js")).then((n) => n.EditPage$1);
314
314
  return ProtectedEditPage;
315
315
  },
316
316
  to: "/settings/webhooks/:id",
@@ -318,7 +318,7 @@ const ROUTES_CE = [
318
318
  },
319
319
  {
320
320
  async Component() {
321
- const { ProtectedListPage } = await Promise.resolve().then(() => require("./ListPage-17fb477a.js"));
321
+ const { ProtectedListPage } = await Promise.resolve().then(() => require("./ListPage-ac287db9.js"));
322
322
  return ProtectedListPage;
323
323
  },
324
324
  to: "/settings/webhooks",
@@ -326,7 +326,7 @@ const ROUTES_CE = [
326
326
  },
327
327
  {
328
328
  async Component() {
329
- const { ProtectedListView } = await Promise.resolve().then(() => require("./ListView-a33ebe77.js"));
329
+ const { ProtectedListView } = await Promise.resolve().then(() => require("./ListView-96fe1016.js"));
330
330
  return ProtectedListView;
331
331
  },
332
332
  to: "/settings/api-tokens",
@@ -334,7 +334,7 @@ const ROUTES_CE = [
334
334
  },
335
335
  {
336
336
  async Component() {
337
- const { ProtectedCreateView } = await Promise.resolve().then(() => require("./CreateView-5a0b0eca.js"));
337
+ const { ProtectedCreateView } = await Promise.resolve().then(() => require("./CreateView-0da060c0.js"));
338
338
  return ProtectedCreateView;
339
339
  },
340
340
  to: "/settings/api-tokens/create",
@@ -342,7 +342,7 @@ const ROUTES_CE = [
342
342
  },
343
343
  {
344
344
  async Component() {
345
- const { ProtectedEditView } = await Promise.resolve().then(() => require("./EditViewPage-ef0292a9.js"));
345
+ const { ProtectedEditView } = await Promise.resolve().then(() => require("./EditViewPage-57b6e71a.js"));
346
346
  return ProtectedEditView;
347
347
  },
348
348
  to: "/settings/api-tokens/:id",
@@ -350,7 +350,7 @@ const ROUTES_CE = [
350
350
  },
351
351
  {
352
352
  async Component() {
353
- const { ProtectedCreateView } = await Promise.resolve().then(() => require("./CreateView-fc328787.js"));
353
+ const { ProtectedCreateView } = await Promise.resolve().then(() => require("./CreateView-69c834ba.js"));
354
354
  return ProtectedCreateView;
355
355
  },
356
356
  to: "/settings/transfer-tokens/create",
@@ -358,7 +358,7 @@ const ROUTES_CE = [
358
358
  },
359
359
  {
360
360
  async Component() {
361
- const { ProtectedListView } = await Promise.resolve().then(() => require("./ListView-80855396.js"));
361
+ const { ProtectedListView } = await Promise.resolve().then(() => require("./ListView-1fb891a4.js"));
362
362
  return ProtectedListView;
363
363
  },
364
364
  to: "/settings/transfer-tokens",
@@ -366,7 +366,7 @@ const ROUTES_CE = [
366
366
  },
367
367
  {
368
368
  async Component() {
369
- const { ProtectedEditView } = await Promise.resolve().then(() => require("./EditView-e480d09f.js"));
369
+ const { ProtectedEditView } = await Promise.resolve().then(() => require("./EditView-0c216c35.js"));
370
370
  return ProtectedEditView;
371
371
  },
372
372
  to: "/settings/transfer-tokens/:id",
@@ -841,7 +841,7 @@ const ApplicationInfoPage = () => {
841
841
  } = helperPlugin.useAppInfo();
842
842
  const AdminSeatInfo = index.useEnterprise(
843
843
  AdminSeatInfoCE,
844
- async () => (await Promise.resolve().then(() => require("./AdminSeatInfo-a10d232f.js"))).AdminSeatInfoEE
844
+ async () => (await Promise.resolve().then(() => require("./AdminSeatInfo-390d8989.js"))).AdminSeatInfoEE
845
845
  );
846
846
  const {
847
847
  allowedActions: { canRead, canUpdate }
@@ -1049,7 +1049,7 @@ const SettingsPage = () => {
1049
1049
  const { isLoading, menu } = useSettingsMenu();
1050
1050
  const routes = index.useEnterprise(
1051
1051
  ROUTES_CE,
1052
- async () => (await Promise.resolve().then(() => require("./constants-d80f19f3.js"))).ROUTES_EE,
1052
+ async () => (await Promise.resolve().then(() => require("./constants-a5b1e9d4.js"))).ROUTES_EE,
1053
1053
  {
1054
1054
  combine(ceRoutes, eeRoutes) {
1055
1055
  return [...ceRoutes, ...eeRoutes];
@@ -1094,4 +1094,4 @@ const makeUniqueRoutes = (routes) => routes.filter(
1094
1094
  );
1095
1095
  exports.SettingsPage = SettingsPage;
1096
1096
  exports.makeUniqueRoutes = makeUniqueRoutes;
1097
- //# sourceMappingURL=SettingsPage-a558ffda.js.map
1097
+ //# sourceMappingURL=SettingsPage-b5d5dd0b.js.map