@strapi/admin 5.47.1 → 5.48.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 (126) hide show
  1. package/dist/admin/admin/src/StrapiApp.js +8 -5
  2. package/dist/admin/admin/src/StrapiApp.js.map +1 -1
  3. package/dist/admin/admin/src/StrapiApp.mjs +9 -6
  4. package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
  5. package/dist/admin/admin/src/components/LeftMenu.js +1 -1
  6. package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
  7. package/dist/admin/admin/src/components/LeftMenu.mjs +1 -1
  8. package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
  9. package/dist/admin/admin/src/components/UpsellBanner.js +1 -1
  10. package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
  11. package/dist/admin/admin/src/components/UpsellBanner.mjs +1 -1
  12. package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
  13. package/dist/admin/admin/src/hooks/useMenu.js +40 -5
  14. package/dist/admin/admin/src/hooks/useMenu.js.map +1 -1
  15. package/dist/admin/admin/src/hooks/useMenu.mjs +40 -6
  16. package/dist/admin/admin/src/hooks/useMenu.mjs.map +1 -1
  17. package/dist/admin/admin/src/hooks/useSettingsMenu.js +61 -1
  18. package/dist/admin/admin/src/hooks/useSettingsMenu.js.map +1 -1
  19. package/dist/admin/admin/src/hooks/useSettingsMenu.mjs +61 -2
  20. package/dist/admin/admin/src/hooks/useSettingsMenu.mjs.map +1 -1
  21. package/dist/admin/admin/src/pages/Home/HomePage.js +6 -2
  22. package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
  23. package/dist/admin/admin/src/pages/Home/HomePage.mjs +6 -2
  24. package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
  25. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js +1 -1
  26. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js.map +1 -1
  27. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs +1 -1
  28. package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs.map +1 -1
  29. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +2 -0
  30. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  31. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +2 -0
  32. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  33. package/dist/admin/admin/src/translations/ar.json.js +1 -1
  34. package/dist/admin/admin/src/translations/ar.json.mjs +1 -1
  35. package/dist/admin/admin/src/translations/cs.json.js +1 -1
  36. package/dist/admin/admin/src/translations/cs.json.mjs +1 -1
  37. package/dist/admin/admin/src/translations/de.json.js +1 -1
  38. package/dist/admin/admin/src/translations/de.json.mjs +1 -1
  39. package/dist/admin/admin/src/translations/en.json.js +1 -1
  40. package/dist/admin/admin/src/translations/en.json.mjs +1 -1
  41. package/dist/admin/admin/src/translations/es.json.js +1 -1
  42. package/dist/admin/admin/src/translations/es.json.mjs +1 -1
  43. package/dist/admin/admin/src/translations/fi.json.js +1 -1
  44. package/dist/admin/admin/src/translations/fi.json.mjs +1 -1
  45. package/dist/admin/admin/src/translations/fr.json.js +1 -1
  46. package/dist/admin/admin/src/translations/fr.json.mjs +1 -1
  47. package/dist/admin/admin/src/translations/it.json.js +1 -1
  48. package/dist/admin/admin/src/translations/it.json.mjs +1 -1
  49. package/dist/admin/admin/src/translations/ko.json.js +1 -1
  50. package/dist/admin/admin/src/translations/ko.json.mjs +1 -1
  51. package/dist/admin/admin/src/translations/nl.json.js +1 -1
  52. package/dist/admin/admin/src/translations/nl.json.mjs +1 -1
  53. package/dist/admin/admin/src/translations/pl.json.js +1 -1
  54. package/dist/admin/admin/src/translations/pl.json.mjs +1 -1
  55. package/dist/admin/admin/src/translations/ru.json.js +1 -1
  56. package/dist/admin/admin/src/translations/ru.json.mjs +1 -1
  57. package/dist/admin/admin/src/translations/tr.json.js +1 -1
  58. package/dist/admin/admin/src/translations/tr.json.mjs +1 -1
  59. package/dist/admin/admin/src/translations/uk.json.js +1 -1
  60. package/dist/admin/admin/src/translations/uk.json.mjs +1 -1
  61. package/dist/admin/admin/src/translations/vi.json.js +1 -1
  62. package/dist/admin/admin/src/translations/vi.json.mjs +1 -1
  63. package/dist/admin/admin/src/translations/zh-Hans.json.js +1 -1
  64. package/dist/admin/admin/src/translations/zh-Hans.json.mjs +1 -1
  65. package/dist/admin/admin/src/utils/getFetchClient.js +1 -1
  66. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  67. package/dist/admin/admin/src/utils/getFetchClient.mjs +1 -1
  68. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  69. package/dist/admin/admin/src/utils/widgetVisibility.js +25 -0
  70. package/dist/admin/admin/src/utils/widgetVisibility.js.map +1 -0
  71. package/dist/admin/admin/src/utils/widgetVisibility.mjs +22 -0
  72. package/dist/admin/admin/src/utils/widgetVisibility.mjs.map +1 -0
  73. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js +6 -4
  74. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js.map +1 -1
  75. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs +6 -4
  76. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs.map +1 -1
  77. package/dist/admin/src/hooks/useMenu.d.ts +2 -1
  78. package/dist/admin/src/hooks/useSettingsMenu.d.ts +2 -1
  79. package/dist/admin/src/utils/widgetVisibility.d.ts +18 -0
  80. package/dist/ee/server/src/controllers/user.d.ts.map +1 -1
  81. package/dist/server/ee/server/src/controllers/user.js +7 -6
  82. package/dist/server/ee/server/src/controllers/user.js.map +1 -1
  83. package/dist/server/ee/server/src/controllers/user.mjs +7 -6
  84. package/dist/server/ee/server/src/controllers/user.mjs.map +1 -1
  85. package/dist/server/server/src/controllers/authenticated-user.js +25 -4
  86. package/dist/server/server/src/controllers/authenticated-user.js.map +1 -1
  87. package/dist/server/server/src/controllers/authenticated-user.mjs +25 -4
  88. package/dist/server/server/src/controllers/authenticated-user.mjs.map +1 -1
  89. package/dist/server/server/src/controllers/authentication.js +1 -16
  90. package/dist/server/server/src/controllers/authentication.js.map +1 -1
  91. package/dist/server/server/src/controllers/authentication.mjs +1 -16
  92. package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
  93. package/dist/server/server/src/controllers/user.js +6 -5
  94. package/dist/server/server/src/controllers/user.js.map +1 -1
  95. package/dist/server/server/src/controllers/user.mjs +6 -5
  96. package/dist/server/server/src/controllers/user.mjs.map +1 -1
  97. package/dist/server/server/src/routes/authentication.js +4 -1
  98. package/dist/server/server/src/routes/authentication.js.map +1 -1
  99. package/dist/server/server/src/routes/authentication.mjs +4 -1
  100. package/dist/server/server/src/routes/authentication.mjs.map +1 -1
  101. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js +20 -11
  102. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.js.map +1 -1
  103. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs +21 -12
  104. package/dist/server/server/src/services/permission/permissions-manager/permission-fields.mjs.map +1 -1
  105. package/dist/server/server/src/services/user.js +40 -3
  106. package/dist/server/server/src/services/user.js.map +1 -1
  107. package/dist/server/server/src/services/user.mjs +40 -3
  108. package/dist/server/server/src/services/user.mjs.map +1 -1
  109. package/dist/server/server/src/utils/normalize-email.js +24 -0
  110. package/dist/server/server/src/utils/normalize-email.js.map +1 -0
  111. package/dist/server/server/src/utils/normalize-email.mjs +22 -0
  112. package/dist/server/server/src/utils/normalize-email.mjs.map +1 -0
  113. package/dist/server/src/controllers/authenticated-user.d.ts.map +1 -1
  114. package/dist/server/src/controllers/authentication.d.ts.map +1 -1
  115. package/dist/server/src/controllers/user.d.ts.map +1 -1
  116. package/dist/server/src/index.d.ts +1 -0
  117. package/dist/server/src/index.d.ts.map +1 -1
  118. package/dist/server/src/routes/authentication.d.ts.map +1 -1
  119. package/dist/server/src/services/index.d.ts +1 -0
  120. package/dist/server/src/services/index.d.ts.map +1 -1
  121. package/dist/server/src/services/permission/permissions-manager/permission-fields.d.ts.map +1 -1
  122. package/dist/server/src/services/user.d.ts +1 -0
  123. package/dist/server/src/services/user.d.ts.map +1 -1
  124. package/dist/server/src/utils/normalize-email.d.ts +12 -0
  125. package/dist/server/src/utils/normalize-email.d.ts.map +1 -0
  126. package/package.json +12 -14
@@ -1 +1 @@
1
- {"version":3,"file":"useSettingsMenu.js","sources":["../../../../../admin/src/hooks/useSettingsMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport sortBy from 'lodash/sortBy';\nimport { useSelector } from 'react-redux';\n\nimport { SETTINGS_LINKS_CE, SettingsMenuLink } from '../constants';\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { selectAdminPermissions } from '../selectors';\nimport { PermissionMap } from '../types/permissions';\n\nimport { useEnterprise } from './useEnterprise';\n\nimport type {\n StrapiAppSetting,\n StrapiAppSettingLink as IStrapiAppSettingLink,\n} from '../core/apis/router';\n\nconst formatLinks = (menu: SettingsMenuSection[]): SettingsMenuSectionWithDisplayedLinks[] =>\n menu.map((menuSection) => {\n const formattedLinks = menuSection.links.map((link) => ({\n ...link,\n isDisplayed: false,\n }));\n\n return { ...menuSection, links: formattedLinks };\n });\n\ninterface SettingsMenuLinkWithPermissions extends SettingsMenuLink {\n permissions: IStrapiAppSettingLink['permissions'];\n hasNotification?: boolean;\n}\n\ninterface StrapiAppSettingsLink extends IStrapiAppSettingLink {\n licenseOnly?: never;\n hasNotification?: never;\n}\n\ninterface SettingsMenuSection extends Omit<StrapiAppSetting, 'links'> {\n links: Array<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n}\n\ninterface SettingsMenuLinkWithPermissionsAndDisplayed extends SettingsMenuLinkWithPermissions {\n isDisplayed: boolean;\n}\n\ninterface StrapiAppSettingLinkWithDisplayed extends StrapiAppSettingsLink {\n isDisplayed: boolean;\n}\n\ninterface SettingsMenuSectionWithDisplayedLinks extends Omit<SettingsMenuSection, 'links'> {\n links: Array<SettingsMenuLinkWithPermissionsAndDisplayed | StrapiAppSettingLinkWithDisplayed>;\n}\n\ntype SettingsMenu = SettingsMenuSectionWithDisplayedLinks[];\n\nconst useSettingsMenu = (): {\n isLoading: boolean;\n menu: SettingsMenu;\n} => {\n const [{ isLoading, menu }, setData] = React.useState<{\n isLoading: boolean;\n menu: SettingsMenu;\n }>({\n isLoading: true,\n menu: [],\n });\n const checkUserHasPermission = useAuth(\n 'useSettingsMenu',\n (state) => state.checkUserHasPermissions\n );\n const shouldUpdateStrapi = useAppInfo('useSettingsMenu', (state) => state.shouldUpdateStrapi);\n const settings = useStrapiApp('useSettingsMenu', (state) => state.settings);\n const permissions = useSelector(selectAdminPermissions);\n\n /**\n * memoize the return value of this function to avoid re-computing it on every render\n * because it's used in an effect it ends up re-running recursively.\n */\n const ceLinks = React.useMemo(() => SETTINGS_LINKS_CE(), []);\n\n const { admin: adminLinks, global: globalLinks } = useEnterprise(\n ceLinks,\n async () => (await import('../../../ee/admin/src/constants')).SETTINGS_LINKS_EE(),\n {\n combine(ceLinks, eeLinks) {\n return {\n admin: [...eeLinks.admin, ...ceLinks.admin],\n global: [...ceLinks.global, ...eeLinks.global],\n };\n },\n defaultValue: {\n admin: [],\n global: [],\n },\n }\n );\n\n const addPermissions = React.useCallback(\n (link: SettingsMenuLink) => {\n if (!link.id) {\n throw new Error('The settings menu item must have an id attribute.');\n }\n\n return {\n ...link,\n permissions: permissions.settings?.[link.id as keyof PermissionMap['settings']]?.main ?? [],\n } satisfies SettingsMenuLinkWithPermissions;\n },\n [permissions.settings]\n );\n\n React.useEffect(() => {\n const getData = async () => {\n interface MenuLinkPermission {\n hasPermission: boolean;\n sectionIndex: number;\n linkIndex: number;\n }\n\n const buildMenuPermissions = (sections: SettingsMenuSectionWithDisplayedLinks[]) =>\n Promise.all(\n sections.reduce<Promise<MenuLinkPermission>[]>((acc, section, sectionIndex) => {\n const linksWithPermissions = section.links.map(async (link, linkIndex) => ({\n hasPermission: (await checkUserHasPermission(link.permissions)).length > 0,\n sectionIndex,\n linkIndex,\n }));\n\n return [...acc, ...linksWithPermissions];\n }, [])\n );\n\n const menuPermissions = await buildMenuPermissions(sections);\n\n setData((prev) => {\n return {\n ...prev,\n isLoading: false,\n menu: sections.map((section, sectionIndex) => ({\n ...section,\n links: section.links.map((link, linkIndex) => {\n const permission = menuPermissions.find(\n (permission) =>\n permission.sectionIndex === sectionIndex && permission.linkIndex === linkIndex\n );\n\n return {\n ...link,\n isDisplayed: Boolean(permission?.hasPermission),\n };\n }),\n })),\n };\n });\n };\n\n const { global, ...otherSections } = settings;\n const sections = formatLinks([\n {\n ...global,\n links: sortBy([...global.links, ...globalLinks.map(addPermissions)], (link) => link.id).map(\n (link) => ({\n ...link,\n hasNotification: link.id === '000-application-infos' && shouldUpdateStrapi,\n })\n ),\n },\n {\n id: 'permissions',\n intlLabel: { id: 'Settings.permissions', defaultMessage: 'Administration Panel' },\n links: adminLinks.map(addPermissions),\n },\n ...Object.values(otherSections),\n ]);\n\n getData();\n }, [\n adminLinks,\n globalLinks,\n settings,\n shouldUpdateStrapi,\n addPermissions,\n checkUserHasPermission,\n ]);\n\n return {\n isLoading,\n menu: menu.map((menuItem) => ({\n ...menuItem,\n links: menuItem.links.filter((link) => link.isDisplayed),\n })),\n };\n};\n\nexport { useSettingsMenu };\nexport type { SettingsMenu };\n"],"names":["formatLinks","menu","map","menuSection","formattedLinks","links","link","isDisplayed","useSettingsMenu","isLoading","setData","React","useState","checkUserHasPermission","useAuth","state","checkUserHasPermissions","shouldUpdateStrapi","useAppInfo","settings","useStrapiApp","permissions","useSelector","selectAdminPermissions","ceLinks","useMemo","SETTINGS_LINKS_CE","admin","adminLinks","global","globalLinks","useEnterprise","SETTINGS_LINKS_EE","combine","eeLinks","defaultValue","addPermissions","useCallback","id","Error","main","useEffect","getData","buildMenuPermissions","sections","Promise","all","reduce","acc","section","sectionIndex","linksWithPermissions","linkIndex","hasPermission","length","menuPermissions","prev","permission","find","Boolean","otherSections","sortBy","hasNotification","intlLabel","defaultMessage","Object","values","menuItem","filter"],"mappings":"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"}
1
+ {"version":3,"file":"useSettingsMenu.js","sources":["../../../../../admin/src/hooks/useSettingsMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport sortBy from 'lodash/sortBy';\nimport { useSelector } from 'react-redux';\n\nimport { SETTINGS_LINKS_CE, SettingsMenuLink } from '../constants';\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { selectAdminPermissions } from '../selectors';\nimport { PermissionMap } from '../types/permissions';\n\nimport { useEnterprise } from './useEnterprise';\n\nimport type {\n StrapiAppSetting,\n StrapiAppSettingLink as IStrapiAppSettingLink,\n} from '../core/apis/router';\n\nconst formatLinks = (menu: SettingsMenuSection[]): SettingsMenuSectionWithDisplayedLinks[] =>\n menu.map((menuSection) => {\n const formattedLinks = menuSection.links.map((link) => ({\n ...link,\n isDisplayed: false,\n }));\n\n return { ...menuSection, links: formattedLinks };\n });\n\ninterface SettingsMenuLinkWithPermissions extends SettingsMenuLink {\n permissions: IStrapiAppSettingLink['permissions'];\n hasNotification?: boolean;\n}\n\ninterface StrapiAppSettingsLink extends IStrapiAppSettingLink {\n licenseOnly?: never;\n hasNotification?: never;\n}\n\ninterface SettingsMenuSection extends Omit<StrapiAppSetting, 'links'> {\n links: Array<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n}\n\ninterface SettingsMenuLinkWithPermissionsAndDisplayed extends SettingsMenuLinkWithPermissions {\n isDisplayed: boolean;\n}\n\ninterface StrapiAppSettingLinkWithDisplayed extends StrapiAppSettingsLink {\n isDisplayed: boolean;\n}\n\ninterface SettingsMenuSectionWithDisplayedLinks extends Omit<SettingsMenuSection, 'links'> {\n links: Array<SettingsMenuLinkWithPermissionsAndDisplayed | StrapiAppSettingLinkWithDisplayed>;\n}\n\ntype SettingsMenu = SettingsMenuSectionWithDisplayedLinks[];\n\nconst useSettingsMenu = (): {\n isLoading: boolean;\n menu: SettingsMenu;\n} => {\n const [{ isLoading, menu }, setData] = React.useState<{\n isLoading: boolean;\n menu: SettingsMenu;\n }>({\n isLoading: true,\n menu: [],\n });\n const checkUserHasPermission = useAuth(\n 'useSettingsMenu',\n (state) => state.checkUserHasPermissions\n );\n const shouldUpdateStrapi = useAppInfo('useSettingsMenu', (state) => state.shouldUpdateStrapi);\n const rawSettings = useStrapiApp('useSettingsMenu', (state) => state.settings);\n const settings = React.useMemo(() => normalizeSettings(rawSettings), [rawSettings]);\n const permissions = useSelector(selectAdminPermissions);\n\n /**\n * memoize the return value of this function to avoid re-computing it on every render\n * because it's used in an effect it ends up re-running recursively.\n */\n const ceLinks = React.useMemo(() => SETTINGS_LINKS_CE(), []);\n\n const { admin: adminLinks, global: globalLinks } = useEnterprise(\n ceLinks,\n async () => (await import('../../../ee/admin/src/constants')).SETTINGS_LINKS_EE(),\n {\n combine(ceLinks, eeLinks) {\n return {\n admin: [...eeLinks.admin, ...ceLinks.admin],\n global: [...ceLinks.global, ...eeLinks.global],\n };\n },\n defaultValue: {\n admin: [],\n global: [],\n },\n }\n );\n\n const addPermissions = React.useCallback(\n (link: SettingsMenuLink) => {\n if (!link.id) {\n throw new Error('The settings menu item must have an id attribute.');\n }\n\n return {\n ...link,\n permissions: permissions.settings?.[link.id as keyof PermissionMap['settings']]?.main ?? [],\n } satisfies SettingsMenuLinkWithPermissions;\n },\n [permissions.settings]\n );\n\n React.useEffect(() => {\n const getData = async () => {\n interface MenuLinkPermission {\n hasPermission: boolean;\n sectionIndex: number;\n linkIndex: number;\n }\n\n const buildMenuPermissions = (sections: SettingsMenuSectionWithDisplayedLinks[]) =>\n Promise.all(\n sections.reduce<Promise<MenuLinkPermission>[]>((acc, section, sectionIndex) => {\n const linksWithPermissions = section.links.map(async (link, linkIndex) => ({\n hasPermission: (await checkUserHasPermission(link.permissions)).length > 0,\n sectionIndex,\n linkIndex,\n }));\n\n return [...acc, ...linksWithPermissions];\n }, [])\n );\n\n const menuPermissions = await buildMenuPermissions(sections);\n\n setData((prev) => {\n return {\n ...prev,\n isLoading: false,\n menu: sections.map((section, sectionIndex) => ({\n ...section,\n links: section.links.map((link, linkIndex) => {\n const permission = menuPermissions.find(\n (permission) =>\n permission.sectionIndex === sectionIndex && permission.linkIndex === linkIndex\n );\n\n return {\n ...link,\n isDisplayed: Boolean(permission?.hasPermission),\n };\n }),\n })),\n };\n });\n };\n\n const { global, ...otherSections } = settings;\n const sections = formatLinks([\n {\n ...global,\n links: sortBy([...global.links, ...globalLinks.map(addPermissions)], (link) => link.id).map(\n (link) => ({\n ...link,\n hasNotification: link.id === '000-application-infos' && shouldUpdateStrapi,\n })\n ),\n },\n {\n id: 'permissions',\n intlLabel: { id: 'Settings.permissions', defaultMessage: 'Administration Panel' },\n links: adminLinks.map(addPermissions),\n },\n ...Object.values(otherSections),\n ]);\n\n getData();\n }, [\n adminLinks,\n globalLinks,\n settings,\n shouldUpdateStrapi,\n addPermissions,\n checkUserHasPermission,\n ]);\n\n return {\n isLoading,\n menu: menu.map((menuItem) => ({\n ...menuItem,\n links: menuItem.links.filter((link) => link.isDisplayed),\n })),\n };\n};\n\nconst normalizeSettingsLink = (\n link: unknown\n): (SettingsMenuLinkWithPermissions | StrapiAppSettingsLink) | null => {\n if (!link || typeof link !== 'object') {\n return null;\n }\n\n const candidate = link as Partial<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n\n if (\n !candidate.id ||\n typeof candidate.to !== 'string' ||\n !candidate.intlLabel?.id ||\n !candidate.intlLabel.defaultMessage\n ) {\n return null;\n }\n\n return {\n ...candidate,\n permissions: Array.isArray(candidate.permissions) ? candidate.permissions : [],\n } as SettingsMenuLinkWithPermissions | StrapiAppSettingsLink;\n};\n\nconst normalizeSettingsSection = (section: unknown): SettingsMenuSection | null => {\n if (!section || typeof section !== 'object') {\n return null;\n }\n\n const candidate = section as Partial<SettingsMenuSection>;\n\n if (!candidate.id || !candidate.intlLabel?.id || !candidate.intlLabel.defaultMessage) {\n return null;\n }\n\n return {\n id: candidate.id,\n intlLabel: candidate.intlLabel,\n links: Array.isArray(candidate.links)\n ? candidate.links.map(normalizeSettingsLink).filter(isSettingsLink)\n : [],\n };\n};\n\nconst isSettingsLink = (\n link: ReturnType<typeof normalizeSettingsLink>\n): link is SettingsMenuLinkWithPermissions | StrapiAppSettingsLink => {\n return link !== null;\n};\n\nconst normalizeSettings = (settings: unknown): Record<string, SettingsMenuSection> => {\n const defaultGlobal: SettingsMenuSection = {\n id: 'global',\n intlLabel: {\n id: 'Settings.global',\n defaultMessage: 'Global Settings',\n },\n links: [],\n };\n\n if (!settings || typeof settings !== 'object') {\n return {\n global: defaultGlobal,\n };\n }\n\n const normalizedSections = Object.entries(settings).reduce<Record<string, SettingsMenuSection>>(\n (acc, [key, section]) => {\n const normalizedSection = normalizeSettingsSection(section);\n\n if (normalizedSection) {\n acc[key] = normalizedSection;\n }\n\n return acc;\n },\n {}\n );\n\n return {\n ...normalizedSections,\n global: normalizedSections.global ?? defaultGlobal,\n };\n};\n\nexport { useSettingsMenu, normalizeSettings };\nexport type { SettingsMenu };\n"],"names":["formatLinks","menu","map","menuSection","formattedLinks","links","link","isDisplayed","useSettingsMenu","isLoading","setData","React","useState","checkUserHasPermission","useAuth","state","checkUserHasPermissions","shouldUpdateStrapi","useAppInfo","rawSettings","useStrapiApp","settings","useMemo","normalizeSettings","permissions","useSelector","selectAdminPermissions","ceLinks","SETTINGS_LINKS_CE","admin","adminLinks","global","globalLinks","useEnterprise","SETTINGS_LINKS_EE","combine","eeLinks","defaultValue","addPermissions","useCallback","id","Error","main","useEffect","getData","buildMenuPermissions","sections","Promise","all","reduce","acc","section","sectionIndex","linksWithPermissions","linkIndex","hasPermission","length","menuPermissions","prev","permission","find","Boolean","otherSections","sortBy","hasNotification","intlLabel","defaultMessage","Object","values","menuItem","filter","normalizeSettingsLink","candidate","to","Array","isArray","normalizeSettingsSection","isSettingsLink","defaultGlobal","normalizedSections","entries","key","normalizedSection"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmBA,MAAMA,cAAc,CAACC,IAAAA,GACnBA,IAAAA,CAAKC,GAAG,CAAC,CAACC,WAAAA,GAAAA;QACR,MAAMC,cAAAA,GAAiBD,YAAYE,KAAK,CAACH,GAAG,CAAC,CAACI,QAAU;AACtD,gBAAA,GAAGA,IAAI;gBACPC,WAAAA,EAAa;aACf,CAAA,CAAA;QAEA,OAAO;AAAE,YAAA,GAAGJ,WAAW;YAAEE,KAAAA,EAAOD;AAAe,SAAA;AACjD,IAAA,CAAA,CAAA;AA8BF,MAAMI,eAAAA,GAAkB,IAAA;IAItB,MAAM,CAAC,EAAEC,SAAS,EAAER,IAAI,EAAE,EAAES,OAAAA,CAAQ,GAAGC,gBAAAA,CAAMC,QAAQ,CAGlD;QACDH,SAAAA,EAAW,IAAA;AACXR,QAAAA,IAAAA,EAAM;AACR,KAAA,CAAA;AACA,IAAA,MAAMY,yBAAyBC,YAAAA,CAC7B,iBAAA,EACA,CAACC,KAAAA,GAAUA,MAAMC,uBAAuB,CAAA;AAE1C,IAAA,MAAMC,qBAAqBC,kBAAAA,CAAW,iBAAA,EAAmB,CAACH,KAAAA,GAAUA,MAAME,kBAAkB,CAAA;AAC5F,IAAA,MAAME,cAAcC,sBAAAA,CAAa,iBAAA,EAAmB,CAACL,KAAAA,GAAUA,MAAMM,QAAQ,CAAA;AAC7E,IAAA,MAAMA,WAAWV,gBAAAA,CAAMW,OAAO,CAAC,IAAMC,kBAAkBJ,WAAAA,CAAAA,EAAc;AAACA,QAAAA;AAAY,KAAA,CAAA;AAClF,IAAA,MAAMK,cAAcC,sBAAAA,CAAYC,gCAAAA,CAAAA;AAEhC;;;AAGC,MACD,MAAMC,OAAAA,GAAUhB,gBAAAA,CAAMW,OAAO,CAAC,IAAMM,+BAAqB,EAAE,CAAA;AAE3D,IAAA,MAAM,EAAEC,KAAAA,EAAOC,UAAU,EAAEC,MAAAA,EAAQC,WAAW,EAAE,GAAGC,2BAAAA,CACjDN,SACA,UAAa,CAAA,MAAM,oDAAO,oCAAA,KAAiC,EAAGO,iBAAiB,EAAA,EAC/E;QACEC,OAAAA,CAAAA,CAAQR,OAAO,EAAES,OAAO,EAAA;YACtB,OAAO;gBACLP,KAAAA,EAAO;AAAIO,oBAAAA,GAAAA,OAAAA,CAAQP,KAAK;AAAKF,oBAAAA,GAAAA,OAAAA,CAAQE;AAAM,iBAAA;gBAC3CE,MAAAA,EAAQ;AAAIJ,oBAAAA,GAAAA,OAAAA,CAAQI,MAAM;AAAKK,oBAAAA,GAAAA,OAAAA,CAAQL;AAAO;AAChD,aAAA;AACF,QAAA,CAAA;QACAM,YAAAA,EAAc;AACZR,YAAAA,KAAAA,EAAO,EAAE;AACTE,YAAAA,MAAAA,EAAQ;AACV;AACF,KAAA,CAAA;AAGF,IAAA,MAAMO,cAAAA,GAAiB3B,gBAAAA,CAAM4B,WAAW,CACtC,CAACjC,IAAAA,GAAAA;QACC,IAAI,CAACA,IAAAA,CAAKkC,EAAE,EAAE;AACZ,YAAA,MAAM,IAAIC,KAAAA,CAAM,mDAAA,CAAA;AAClB,QAAA;QAEA,OAAO;AACL,YAAA,GAAGnC,IAAI;YACPkB,WAAAA,EAAaA,WAAAA,CAAYH,QAAQ,GAAGf,KAAKkC,EAAE,CAAoC,EAAEE,IAAAA,IAAQ;AAC3F,SAAA;IACF,CAAA,EACA;AAAClB,QAAAA,WAAAA,CAAYH;AAAS,KAAA,CAAA;AAGxBV,IAAAA,gBAAAA,CAAMgC,SAAS,CAAC,IAAA;AACd,QAAA,MAAMC,OAAAA,GAAU,UAAA;YAOd,MAAMC,oBAAAA,GAAuB,CAACC,QAAAA,GAC5BC,OAAAA,CAAQC,GAAG,CACTF,QAAAA,CAASG,MAAM,CAAgC,CAACC,GAAAA,EAAKC,OAAAA,EAASC,YAAAA,GAAAA;oBAC5D,MAAMC,oBAAAA,GAAuBF,QAAQ9C,KAAK,CAACH,GAAG,CAAC,OAAOI,IAAAA,EAAMgD,SAAAA,IAAe;4BACzEC,aAAAA,EAAgB,CAAA,MAAM1C,sBAAAA,CAAuBP,KAAKkB,WAAW,CAAA,EAAGgC,MAAM,GAAG,CAAA;AACzEJ,4BAAAA,YAAAA;AACAE,4BAAAA;yBACF,CAAA,CAAA;oBAEA,OAAO;AAAIJ,wBAAAA,GAAAA,GAAAA;AAAQG,wBAAAA,GAAAA;AAAqB,qBAAA;AAC1C,gBAAA,CAAA,EAAG,EAAE,CAAA,CAAA;YAGT,MAAMI,eAAAA,GAAkB,MAAMZ,oBAAAA,CAAqBC,QAAAA,CAAAA;AAEnDpC,YAAAA,OAAAA,CAAQ,CAACgD,IAAAA,GAAAA;gBACP,OAAO;AACL,oBAAA,GAAGA,IAAI;oBACPjD,SAAAA,EAAW,KAAA;AACXR,oBAAAA,IAAAA,EAAM6C,SAAS5C,GAAG,CAAC,CAACiD,OAAAA,EAASC,gBAAkB;AAC7C,4BAAA,GAAGD,OAAO;AACV9C,4BAAAA,KAAAA,EAAO8C,QAAQ9C,KAAK,CAACH,GAAG,CAAC,CAACI,IAAAA,EAAMgD,SAAAA,GAAAA;AAC9B,gCAAA,MAAMK,UAAAA,GAAaF,eAAAA,CAAgBG,IAAI,CACrC,CAACD,UAAAA,GACCA,UAAAA,CAAWP,YAAY,KAAKA,YAAAA,IAAgBO,UAAAA,CAAWL,SAAS,KAAKA,SAAAA,CAAAA;gCAGzE,OAAO;AACL,oCAAA,GAAGhD,IAAI;AACPC,oCAAAA,WAAAA,EAAasD,QAAQF,UAAAA,EAAYJ,aAAAA;AACnC,iCAAA;AACF,4BAAA,CAAA;yBACF,CAAA;AACF,iBAAA;AACF,YAAA,CAAA,CAAA;AACF,QAAA,CAAA;AAEA,QAAA,MAAM,EAAExB,MAAM,EAAE,GAAG+B,eAAe,GAAGzC,QAAAA;AACrC,QAAA,MAAMyB,WAAW9C,WAAAA,CAAY;AAC3B,YAAA;AACE,gBAAA,GAAG+B,MAAM;AACT1B,gBAAAA,KAAAA,EAAO0D,MAAAA,CAAO;AAAIhC,oBAAAA,GAAAA,MAAAA,CAAO1B,KAAK;AAAK2B,oBAAAA,GAAAA,WAAAA,CAAY9B,GAAG,CAACoC,cAAAA;iBAAgB,EAAE,CAAChC,OAASA,IAAAA,CAAKkC,EAAE,EAAEtC,GAAG,CACzF,CAACI,IAAAA,IAAU;AACT,wBAAA,GAAGA,IAAI;wBACP0D,eAAAA,EAAiB1D,IAAAA,CAAKkC,EAAE,KAAK,uBAAA,IAA2BvB;qBAC1D,CAAA;AAEJ,aAAA;AACA,YAAA;gBACEuB,EAAAA,EAAI,aAAA;gBACJyB,SAAAA,EAAW;oBAAEzB,EAAAA,EAAI,sBAAA;oBAAwB0B,cAAAA,EAAgB;AAAuB,iBAAA;gBAChF7D,KAAAA,EAAOyB,UAAAA,CAAW5B,GAAG,CAACoC,cAAAA;AACxB,aAAA;AACG6B,YAAAA,GAAAA,MAAAA,CAAOC,MAAM,CAACN,aAAAA;AAClB,SAAA,CAAA;AAEDlB,QAAAA,OAAAA,EAAAA;IACF,CAAA,EAAG;AACDd,QAAAA,UAAAA;AACAE,QAAAA,WAAAA;AACAX,QAAAA,QAAAA;AACAJ,QAAAA,kBAAAA;AACAqB,QAAAA,cAAAA;AACAzB,QAAAA;AACD,KAAA,CAAA;IAED,OAAO;AACLJ,QAAAA,SAAAA;AACAR,QAAAA,IAAAA,EAAMA,IAAAA,CAAKC,GAAG,CAAC,CAACmE,YAAc;AAC5B,gBAAA,GAAGA,QAAQ;gBACXhE,KAAAA,EAAOgE,QAAAA,CAAShE,KAAK,CAACiE,MAAM,CAAC,CAAChE,IAAAA,GAASA,KAAKC,WAAW;aACzD,CAAA;AACF,KAAA;AACF;AAEA,MAAMgE,wBAAwB,CAC5BjE,IAAAA,GAAAA;AAEA,IAAA,IAAI,CAACA,IAAAA,IAAQ,OAAOA,IAAAA,KAAS,QAAA,EAAU;QACrC,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMkE,SAAAA,GAAYlE,IAAAA;AAElB,IAAA,IACE,CAACkE,SAAAA,CAAUhC,EAAE,IACb,OAAOgC,SAAAA,CAAUC,EAAE,KAAK,QAAA,IACxB,CAACD,SAAAA,CAAUP,SAAS,EAAEzB,EAAAA,IACtB,CAACgC,UAAUP,SAAS,CAACC,cAAc,EACnC;QACA,OAAO,IAAA;AACT,IAAA;IAEA,OAAO;AACL,QAAA,GAAGM,SAAS;QACZhD,WAAAA,EAAakD,KAAAA,CAAMC,OAAO,CAACH,SAAAA,CAAUhD,WAAW,CAAA,GAAIgD,SAAAA,CAAUhD,WAAW,GAAG;AAC9E,KAAA;AACF,CAAA;AAEA,MAAMoD,2BAA2B,CAACzB,OAAAA,GAAAA;AAChC,IAAA,IAAI,CAACA,OAAAA,IAAW,OAAOA,OAAAA,KAAY,QAAA,EAAU;QAC3C,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMqB,SAAAA,GAAYrB,OAAAA;AAElB,IAAA,IAAI,CAACqB,SAAAA,CAAUhC,EAAE,IAAI,CAACgC,SAAAA,CAAUP,SAAS,EAAEzB,EAAAA,IAAM,CAACgC,SAAAA,CAAUP,SAAS,CAACC,cAAc,EAAE;QACpF,OAAO,IAAA;AACT,IAAA;IAEA,OAAO;AACL1B,QAAAA,EAAAA,EAAIgC,UAAUhC,EAAE;AAChByB,QAAAA,SAAAA,EAAWO,UAAUP,SAAS;AAC9B5D,QAAAA,KAAAA,EAAOqE,KAAAA,CAAMC,OAAO,CAACH,SAAAA,CAAUnE,KAAK,CAAA,GAChCmE,SAAAA,CAAUnE,KAAK,CAACH,GAAG,CAACqE,qBAAAA,CAAAA,CAAuBD,MAAM,CAACO,kBAClD;AACN,KAAA;AACF,CAAA;AAEA,MAAMA,iBAAiB,CACrBvE,IAAAA,GAAAA;AAEA,IAAA,OAAOA,IAAAA,KAAS,IAAA;AAClB,CAAA;AAEA,MAAMiB,oBAAoB,CAACF,QAAAA,GAAAA;AACzB,IAAA,MAAMyD,aAAAA,GAAqC;QACzCtC,EAAAA,EAAI,QAAA;QACJyB,SAAAA,EAAW;YACTzB,EAAAA,EAAI,iBAAA;YACJ0B,cAAAA,EAAgB;AAClB,SAAA;AACA7D,QAAAA,KAAAA,EAAO;AACT,KAAA;AAEA,IAAA,IAAI,CAACgB,QAAAA,IAAY,OAAOA,QAAAA,KAAa,QAAA,EAAU;QAC7C,OAAO;YACLU,MAAAA,EAAQ+C;AACV,SAAA;AACF,IAAA;IAEA,MAAMC,kBAAAA,GAAqBZ,MAAAA,CAAOa,OAAO,CAAC3D,QAAAA,CAAAA,CAAU4B,MAAM,CACxD,CAACC,GAAAA,EAAK,CAAC+B,GAAAA,EAAK9B,OAAAA,CAAQ,GAAA;AAClB,QAAA,MAAM+B,oBAAoBN,wBAAAA,CAAyBzB,OAAAA,CAAAA;AAEnD,QAAA,IAAI+B,iBAAAA,EAAmB;YACrBhC,GAAG,CAAC+B,IAAI,GAAGC,iBAAAA;AACb,QAAA;QAEA,OAAOhC,GAAAA;AACT,IAAA,CAAA,EACA,EAAC,CAAA;IAGH,OAAO;AACL,QAAA,GAAG6B,kBAAkB;QACrBhD,MAAAA,EAAQgD,kBAAAA,CAAmBhD,MAAM,IAAI+C;AACvC,KAAA;AACF;;;;;"}
@@ -25,7 +25,10 @@ const useSettingsMenu = ()=>{
25
25
  });
26
26
  const checkUserHasPermission = useAuth('useSettingsMenu', (state)=>state.checkUserHasPermissions);
27
27
  const shouldUpdateStrapi = useAppInfo('useSettingsMenu', (state)=>state.shouldUpdateStrapi);
28
- const settings = useStrapiApp('useSettingsMenu', (state)=>state.settings);
28
+ const rawSettings = useStrapiApp('useSettingsMenu', (state)=>state.settings);
29
+ const settings = React.useMemo(()=>normalizeSettings(rawSettings), [
30
+ rawSettings
31
+ ]);
29
32
  const permissions = useSelector(selectAdminPermissions);
30
33
  /**
31
34
  * memoize the return value of this function to avoid re-computing it on every render
@@ -130,6 +133,62 @@ const useSettingsMenu = ()=>{
130
133
  }))
131
134
  };
132
135
  };
136
+ const normalizeSettingsLink = (link)=>{
137
+ if (!link || typeof link !== 'object') {
138
+ return null;
139
+ }
140
+ const candidate = link;
141
+ if (!candidate.id || typeof candidate.to !== 'string' || !candidate.intlLabel?.id || !candidate.intlLabel.defaultMessage) {
142
+ return null;
143
+ }
144
+ return {
145
+ ...candidate,
146
+ permissions: Array.isArray(candidate.permissions) ? candidate.permissions : []
147
+ };
148
+ };
149
+ const normalizeSettingsSection = (section)=>{
150
+ if (!section || typeof section !== 'object') {
151
+ return null;
152
+ }
153
+ const candidate = section;
154
+ if (!candidate.id || !candidate.intlLabel?.id || !candidate.intlLabel.defaultMessage) {
155
+ return null;
156
+ }
157
+ return {
158
+ id: candidate.id,
159
+ intlLabel: candidate.intlLabel,
160
+ links: Array.isArray(candidate.links) ? candidate.links.map(normalizeSettingsLink).filter(isSettingsLink) : []
161
+ };
162
+ };
163
+ const isSettingsLink = (link)=>{
164
+ return link !== null;
165
+ };
166
+ const normalizeSettings = (settings)=>{
167
+ const defaultGlobal = {
168
+ id: 'global',
169
+ intlLabel: {
170
+ id: 'Settings.global',
171
+ defaultMessage: 'Global Settings'
172
+ },
173
+ links: []
174
+ };
175
+ if (!settings || typeof settings !== 'object') {
176
+ return {
177
+ global: defaultGlobal
178
+ };
179
+ }
180
+ const normalizedSections = Object.entries(settings).reduce((acc, [key, section])=>{
181
+ const normalizedSection = normalizeSettingsSection(section);
182
+ if (normalizedSection) {
183
+ acc[key] = normalizedSection;
184
+ }
185
+ return acc;
186
+ }, {});
187
+ return {
188
+ ...normalizedSections,
189
+ global: normalizedSections.global ?? defaultGlobal
190
+ };
191
+ };
133
192
 
134
- export { useSettingsMenu };
193
+ export { normalizeSettings, useSettingsMenu };
135
194
  //# sourceMappingURL=useSettingsMenu.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSettingsMenu.mjs","sources":["../../../../../admin/src/hooks/useSettingsMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport sortBy from 'lodash/sortBy';\nimport { useSelector } from 'react-redux';\n\nimport { SETTINGS_LINKS_CE, SettingsMenuLink } from '../constants';\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { selectAdminPermissions } from '../selectors';\nimport { PermissionMap } from '../types/permissions';\n\nimport { useEnterprise } from './useEnterprise';\n\nimport type {\n StrapiAppSetting,\n StrapiAppSettingLink as IStrapiAppSettingLink,\n} from '../core/apis/router';\n\nconst formatLinks = (menu: SettingsMenuSection[]): SettingsMenuSectionWithDisplayedLinks[] =>\n menu.map((menuSection) => {\n const formattedLinks = menuSection.links.map((link) => ({\n ...link,\n isDisplayed: false,\n }));\n\n return { ...menuSection, links: formattedLinks };\n });\n\ninterface SettingsMenuLinkWithPermissions extends SettingsMenuLink {\n permissions: IStrapiAppSettingLink['permissions'];\n hasNotification?: boolean;\n}\n\ninterface StrapiAppSettingsLink extends IStrapiAppSettingLink {\n licenseOnly?: never;\n hasNotification?: never;\n}\n\ninterface SettingsMenuSection extends Omit<StrapiAppSetting, 'links'> {\n links: Array<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n}\n\ninterface SettingsMenuLinkWithPermissionsAndDisplayed extends SettingsMenuLinkWithPermissions {\n isDisplayed: boolean;\n}\n\ninterface StrapiAppSettingLinkWithDisplayed extends StrapiAppSettingsLink {\n isDisplayed: boolean;\n}\n\ninterface SettingsMenuSectionWithDisplayedLinks extends Omit<SettingsMenuSection, 'links'> {\n links: Array<SettingsMenuLinkWithPermissionsAndDisplayed | StrapiAppSettingLinkWithDisplayed>;\n}\n\ntype SettingsMenu = SettingsMenuSectionWithDisplayedLinks[];\n\nconst useSettingsMenu = (): {\n isLoading: boolean;\n menu: SettingsMenu;\n} => {\n const [{ isLoading, menu }, setData] = React.useState<{\n isLoading: boolean;\n menu: SettingsMenu;\n }>({\n isLoading: true,\n menu: [],\n });\n const checkUserHasPermission = useAuth(\n 'useSettingsMenu',\n (state) => state.checkUserHasPermissions\n );\n const shouldUpdateStrapi = useAppInfo('useSettingsMenu', (state) => state.shouldUpdateStrapi);\n const settings = useStrapiApp('useSettingsMenu', (state) => state.settings);\n const permissions = useSelector(selectAdminPermissions);\n\n /**\n * memoize the return value of this function to avoid re-computing it on every render\n * because it's used in an effect it ends up re-running recursively.\n */\n const ceLinks = React.useMemo(() => SETTINGS_LINKS_CE(), []);\n\n const { admin: adminLinks, global: globalLinks } = useEnterprise(\n ceLinks,\n async () => (await import('../../../ee/admin/src/constants')).SETTINGS_LINKS_EE(),\n {\n combine(ceLinks, eeLinks) {\n return {\n admin: [...eeLinks.admin, ...ceLinks.admin],\n global: [...ceLinks.global, ...eeLinks.global],\n };\n },\n defaultValue: {\n admin: [],\n global: [],\n },\n }\n );\n\n const addPermissions = React.useCallback(\n (link: SettingsMenuLink) => {\n if (!link.id) {\n throw new Error('The settings menu item must have an id attribute.');\n }\n\n return {\n ...link,\n permissions: permissions.settings?.[link.id as keyof PermissionMap['settings']]?.main ?? [],\n } satisfies SettingsMenuLinkWithPermissions;\n },\n [permissions.settings]\n );\n\n React.useEffect(() => {\n const getData = async () => {\n interface MenuLinkPermission {\n hasPermission: boolean;\n sectionIndex: number;\n linkIndex: number;\n }\n\n const buildMenuPermissions = (sections: SettingsMenuSectionWithDisplayedLinks[]) =>\n Promise.all(\n sections.reduce<Promise<MenuLinkPermission>[]>((acc, section, sectionIndex) => {\n const linksWithPermissions = section.links.map(async (link, linkIndex) => ({\n hasPermission: (await checkUserHasPermission(link.permissions)).length > 0,\n sectionIndex,\n linkIndex,\n }));\n\n return [...acc, ...linksWithPermissions];\n }, [])\n );\n\n const menuPermissions = await buildMenuPermissions(sections);\n\n setData((prev) => {\n return {\n ...prev,\n isLoading: false,\n menu: sections.map((section, sectionIndex) => ({\n ...section,\n links: section.links.map((link, linkIndex) => {\n const permission = menuPermissions.find(\n (permission) =>\n permission.sectionIndex === sectionIndex && permission.linkIndex === linkIndex\n );\n\n return {\n ...link,\n isDisplayed: Boolean(permission?.hasPermission),\n };\n }),\n })),\n };\n });\n };\n\n const { global, ...otherSections } = settings;\n const sections = formatLinks([\n {\n ...global,\n links: sortBy([...global.links, ...globalLinks.map(addPermissions)], (link) => link.id).map(\n (link) => ({\n ...link,\n hasNotification: link.id === '000-application-infos' && shouldUpdateStrapi,\n })\n ),\n },\n {\n id: 'permissions',\n intlLabel: { id: 'Settings.permissions', defaultMessage: 'Administration Panel' },\n links: adminLinks.map(addPermissions),\n },\n ...Object.values(otherSections),\n ]);\n\n getData();\n }, [\n adminLinks,\n globalLinks,\n settings,\n shouldUpdateStrapi,\n addPermissions,\n checkUserHasPermission,\n ]);\n\n return {\n isLoading,\n menu: menu.map((menuItem) => ({\n ...menuItem,\n links: menuItem.links.filter((link) => link.isDisplayed),\n })),\n };\n};\n\nexport { useSettingsMenu };\nexport type { SettingsMenu };\n"],"names":["formatLinks","menu","map","menuSection","formattedLinks","links","link","isDisplayed","useSettingsMenu","isLoading","setData","React","useState","checkUserHasPermission","useAuth","state","checkUserHasPermissions","shouldUpdateStrapi","useAppInfo","settings","useStrapiApp","permissions","useSelector","selectAdminPermissions","ceLinks","useMemo","SETTINGS_LINKS_CE","admin","adminLinks","global","globalLinks","useEnterprise","SETTINGS_LINKS_EE","combine","eeLinks","defaultValue","addPermissions","useCallback","id","Error","main","useEffect","getData","buildMenuPermissions","sections","Promise","all","reduce","acc","section","sectionIndex","linksWithPermissions","linkIndex","hasPermission","length","menuPermissions","prev","permission","find","Boolean","otherSections","sortBy","hasNotification","intlLabel","defaultMessage","Object","values","menuItem","filter"],"mappings":"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"}
1
+ {"version":3,"file":"useSettingsMenu.mjs","sources":["../../../../../admin/src/hooks/useSettingsMenu.ts"],"sourcesContent":["import * as React from 'react';\n\nimport sortBy from 'lodash/sortBy';\nimport { useSelector } from 'react-redux';\n\nimport { SETTINGS_LINKS_CE, SettingsMenuLink } from '../constants';\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useStrapiApp } from '../features/StrapiApp';\nimport { selectAdminPermissions } from '../selectors';\nimport { PermissionMap } from '../types/permissions';\n\nimport { useEnterprise } from './useEnterprise';\n\nimport type {\n StrapiAppSetting,\n StrapiAppSettingLink as IStrapiAppSettingLink,\n} from '../core/apis/router';\n\nconst formatLinks = (menu: SettingsMenuSection[]): SettingsMenuSectionWithDisplayedLinks[] =>\n menu.map((menuSection) => {\n const formattedLinks = menuSection.links.map((link) => ({\n ...link,\n isDisplayed: false,\n }));\n\n return { ...menuSection, links: formattedLinks };\n });\n\ninterface SettingsMenuLinkWithPermissions extends SettingsMenuLink {\n permissions: IStrapiAppSettingLink['permissions'];\n hasNotification?: boolean;\n}\n\ninterface StrapiAppSettingsLink extends IStrapiAppSettingLink {\n licenseOnly?: never;\n hasNotification?: never;\n}\n\ninterface SettingsMenuSection extends Omit<StrapiAppSetting, 'links'> {\n links: Array<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n}\n\ninterface SettingsMenuLinkWithPermissionsAndDisplayed extends SettingsMenuLinkWithPermissions {\n isDisplayed: boolean;\n}\n\ninterface StrapiAppSettingLinkWithDisplayed extends StrapiAppSettingsLink {\n isDisplayed: boolean;\n}\n\ninterface SettingsMenuSectionWithDisplayedLinks extends Omit<SettingsMenuSection, 'links'> {\n links: Array<SettingsMenuLinkWithPermissionsAndDisplayed | StrapiAppSettingLinkWithDisplayed>;\n}\n\ntype SettingsMenu = SettingsMenuSectionWithDisplayedLinks[];\n\nconst useSettingsMenu = (): {\n isLoading: boolean;\n menu: SettingsMenu;\n} => {\n const [{ isLoading, menu }, setData] = React.useState<{\n isLoading: boolean;\n menu: SettingsMenu;\n }>({\n isLoading: true,\n menu: [],\n });\n const checkUserHasPermission = useAuth(\n 'useSettingsMenu',\n (state) => state.checkUserHasPermissions\n );\n const shouldUpdateStrapi = useAppInfo('useSettingsMenu', (state) => state.shouldUpdateStrapi);\n const rawSettings = useStrapiApp('useSettingsMenu', (state) => state.settings);\n const settings = React.useMemo(() => normalizeSettings(rawSettings), [rawSettings]);\n const permissions = useSelector(selectAdminPermissions);\n\n /**\n * memoize the return value of this function to avoid re-computing it on every render\n * because it's used in an effect it ends up re-running recursively.\n */\n const ceLinks = React.useMemo(() => SETTINGS_LINKS_CE(), []);\n\n const { admin: adminLinks, global: globalLinks } = useEnterprise(\n ceLinks,\n async () => (await import('../../../ee/admin/src/constants')).SETTINGS_LINKS_EE(),\n {\n combine(ceLinks, eeLinks) {\n return {\n admin: [...eeLinks.admin, ...ceLinks.admin],\n global: [...ceLinks.global, ...eeLinks.global],\n };\n },\n defaultValue: {\n admin: [],\n global: [],\n },\n }\n );\n\n const addPermissions = React.useCallback(\n (link: SettingsMenuLink) => {\n if (!link.id) {\n throw new Error('The settings menu item must have an id attribute.');\n }\n\n return {\n ...link,\n permissions: permissions.settings?.[link.id as keyof PermissionMap['settings']]?.main ?? [],\n } satisfies SettingsMenuLinkWithPermissions;\n },\n [permissions.settings]\n );\n\n React.useEffect(() => {\n const getData = async () => {\n interface MenuLinkPermission {\n hasPermission: boolean;\n sectionIndex: number;\n linkIndex: number;\n }\n\n const buildMenuPermissions = (sections: SettingsMenuSectionWithDisplayedLinks[]) =>\n Promise.all(\n sections.reduce<Promise<MenuLinkPermission>[]>((acc, section, sectionIndex) => {\n const linksWithPermissions = section.links.map(async (link, linkIndex) => ({\n hasPermission: (await checkUserHasPermission(link.permissions)).length > 0,\n sectionIndex,\n linkIndex,\n }));\n\n return [...acc, ...linksWithPermissions];\n }, [])\n );\n\n const menuPermissions = await buildMenuPermissions(sections);\n\n setData((prev) => {\n return {\n ...prev,\n isLoading: false,\n menu: sections.map((section, sectionIndex) => ({\n ...section,\n links: section.links.map((link, linkIndex) => {\n const permission = menuPermissions.find(\n (permission) =>\n permission.sectionIndex === sectionIndex && permission.linkIndex === linkIndex\n );\n\n return {\n ...link,\n isDisplayed: Boolean(permission?.hasPermission),\n };\n }),\n })),\n };\n });\n };\n\n const { global, ...otherSections } = settings;\n const sections = formatLinks([\n {\n ...global,\n links: sortBy([...global.links, ...globalLinks.map(addPermissions)], (link) => link.id).map(\n (link) => ({\n ...link,\n hasNotification: link.id === '000-application-infos' && shouldUpdateStrapi,\n })\n ),\n },\n {\n id: 'permissions',\n intlLabel: { id: 'Settings.permissions', defaultMessage: 'Administration Panel' },\n links: adminLinks.map(addPermissions),\n },\n ...Object.values(otherSections),\n ]);\n\n getData();\n }, [\n adminLinks,\n globalLinks,\n settings,\n shouldUpdateStrapi,\n addPermissions,\n checkUserHasPermission,\n ]);\n\n return {\n isLoading,\n menu: menu.map((menuItem) => ({\n ...menuItem,\n links: menuItem.links.filter((link) => link.isDisplayed),\n })),\n };\n};\n\nconst normalizeSettingsLink = (\n link: unknown\n): (SettingsMenuLinkWithPermissions | StrapiAppSettingsLink) | null => {\n if (!link || typeof link !== 'object') {\n return null;\n }\n\n const candidate = link as Partial<SettingsMenuLinkWithPermissions | StrapiAppSettingsLink>;\n\n if (\n !candidate.id ||\n typeof candidate.to !== 'string' ||\n !candidate.intlLabel?.id ||\n !candidate.intlLabel.defaultMessage\n ) {\n return null;\n }\n\n return {\n ...candidate,\n permissions: Array.isArray(candidate.permissions) ? candidate.permissions : [],\n } as SettingsMenuLinkWithPermissions | StrapiAppSettingsLink;\n};\n\nconst normalizeSettingsSection = (section: unknown): SettingsMenuSection | null => {\n if (!section || typeof section !== 'object') {\n return null;\n }\n\n const candidate = section as Partial<SettingsMenuSection>;\n\n if (!candidate.id || !candidate.intlLabel?.id || !candidate.intlLabel.defaultMessage) {\n return null;\n }\n\n return {\n id: candidate.id,\n intlLabel: candidate.intlLabel,\n links: Array.isArray(candidate.links)\n ? candidate.links.map(normalizeSettingsLink).filter(isSettingsLink)\n : [],\n };\n};\n\nconst isSettingsLink = (\n link: ReturnType<typeof normalizeSettingsLink>\n): link is SettingsMenuLinkWithPermissions | StrapiAppSettingsLink => {\n return link !== null;\n};\n\nconst normalizeSettings = (settings: unknown): Record<string, SettingsMenuSection> => {\n const defaultGlobal: SettingsMenuSection = {\n id: 'global',\n intlLabel: {\n id: 'Settings.global',\n defaultMessage: 'Global Settings',\n },\n links: [],\n };\n\n if (!settings || typeof settings !== 'object') {\n return {\n global: defaultGlobal,\n };\n }\n\n const normalizedSections = Object.entries(settings).reduce<Record<string, SettingsMenuSection>>(\n (acc, [key, section]) => {\n const normalizedSection = normalizeSettingsSection(section);\n\n if (normalizedSection) {\n acc[key] = normalizedSection;\n }\n\n return acc;\n },\n {}\n );\n\n return {\n ...normalizedSections,\n global: normalizedSections.global ?? defaultGlobal,\n };\n};\n\nexport { useSettingsMenu, normalizeSettings };\nexport type { SettingsMenu };\n"],"names":["formatLinks","menu","map","menuSection","formattedLinks","links","link","isDisplayed","useSettingsMenu","isLoading","setData","React","useState","checkUserHasPermission","useAuth","state","checkUserHasPermissions","shouldUpdateStrapi","useAppInfo","rawSettings","useStrapiApp","settings","useMemo","normalizeSettings","permissions","useSelector","selectAdminPermissions","ceLinks","SETTINGS_LINKS_CE","admin","adminLinks","global","globalLinks","useEnterprise","SETTINGS_LINKS_EE","combine","eeLinks","defaultValue","addPermissions","useCallback","id","Error","main","useEffect","getData","buildMenuPermissions","sections","Promise","all","reduce","acc","section","sectionIndex","linksWithPermissions","linkIndex","hasPermission","length","menuPermissions","prev","permission","find","Boolean","otherSections","sortBy","hasNotification","intlLabel","defaultMessage","Object","values","menuItem","filter","normalizeSettingsLink","candidate","to","Array","isArray","normalizeSettingsSection","isSettingsLink","defaultGlobal","normalizedSections","entries","key","normalizedSection"],"mappings":"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"}
@@ -17,11 +17,13 @@ var WidgetRoot = require('../../components/WidgetRoot.js');
17
17
  require('../../services/admin.js');
18
18
  var useEnterprise = require('../../hooks/useEnterprise.js');
19
19
  require('../../../../ee/admin/src/services/ai.js');
20
+ var AppInfo = require('../../features/AppInfo.js');
20
21
  var Auth = require('../../features/Auth.js');
21
22
  var StrapiApp = require('../../features/StrapiApp.js');
22
23
  var Widgets = require('../../features/Widgets.js');
23
24
  var homepage = require('../../services/homepage.js');
24
25
  var widgetLayout = require('../../utils/widgetLayout.js');
26
+ var widgetVisibility = require('../../utils/widgetVisibility.js');
25
27
  var AddWidgetModal = require('./components/AddWidgetModal.js');
26
28
  var FreeTrialEndedModal = require('./components/FreeTrialEndedModal.js');
27
29
  var FreeTrialWelcomeModal = require('./components/FreeTrialWelcomeModal.js');
@@ -92,8 +94,10 @@ const DragPreviewWrapper = styled.styled.div`
92
94
  const user = Auth.useAuth('HomePageCE', (state)=>state.user);
93
95
  const displayName = user?.firstname ?? user?.username ?? user?.email;
94
96
  const getAllWidgets = StrapiApp.useStrapiApp('UnstableHomepageCe', (state)=>state.widgets.getAll);
95
- const allWidgets = React__namespace.useMemo(()=>getAllWidgets(), [
96
- getAllWidgets
97
+ const currentEnvironment = AppInfo.useAppInfo('HomePageCE', (state)=>state.currentEnvironment);
98
+ const allWidgets = React__namespace.useMemo(()=>widgetVisibility.hideDeployNowWidgetInProduction(getAllWidgets(), currentEnvironment), [
99
+ getAllWidgets,
100
+ currentEnvironment
97
101
  ]);
98
102
  const checkUserHasPermissions = Auth.useAuth('WidgetRoot', (state)=>state.checkUserHasPermissions);
99
103
  const { data: homepageLayout, isLoading: _isLoadingLayout } = homepage.useGetHomepageLayoutQuery();
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage.js","sources":["../../../../../../admin/src/pages/Home/HomePage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Grid, Main } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { DragLayer, isWidgetDragItem } from '../../components/DragLayer';\nimport { GapDropZoneManager } from '../../components/GapDropZone';\nimport { GuidedTourHomepageOverview } from '../../components/GuidedTour/Overview';\nimport { Layouts } from '../../components/Layouts/Layout';\nimport { Page } from '../../components/PageHelpers';\nimport { WidgetResizeHandle } from '../../components/ResizeIndicator';\nimport { Widget } from '../../components/WidgetHelpers';\nimport { WidgetRoot } from '../../components/WidgetRoot';\nimport { useEnterprise } from '../../ee';\nimport { useAuth } from '../../features/Auth';\nimport { useStrapiApp } from '../../features/StrapiApp';\nimport { useWidgets } from '../../features/Widgets';\nimport {\n useGetCountDocumentsQuery,\n useGetHomepageLayoutQuery,\n useGetKeyStatisticsQuery,\n} from '../../services/homepage';\nimport {\n getWidgetElement,\n WIDGET_DATA_ATTRIBUTES,\n applyHomepageLayout,\n createDefaultWidgetWidths,\n isLastWidgetInRow,\n canResizeBetweenWidgets,\n getWidgetWidth,\n} from '../../utils/widgetLayout';\n\nimport { AddWidgetModal } from './components/AddWidgetModal';\nimport { FreeTrialEndedModal } from './components/FreeTrialEndedModal';\nimport { FreeTrialWelcomeModal } from './components/FreeTrialWelcomeModal';\n\nimport type { WidgetWithUID } from '../../core/apis/Widgets';\n\ntype WidgetPermissionStatus = 'allowed' | 'denied' | 'loading';\n\nconst getWidgetPermissionsCacheKey = (permissions: NonNullable<WidgetWithUID['permissions']>) => {\n return permissions\n .map((permission) =>\n JSON.stringify({\n action: permission.action,\n subject: permission.subject,\n conditions: permission.conditions ?? [],\n properties: permission.properties ?? {},\n })\n )\n .sort()\n .join('|');\n};\n\n// Styled wrapper for the drag preview\nconst DragPreviewWrapper = styled.div<{ $maxWidth: string }>`\n max-width: ${(props) => props.$maxWidth};\n overflow: hidden;\n opacity: 0.9;\n border: 2px solid ${({ theme }) => theme.colors.primary500};\n border-radius: ${({ theme }) => theme.borderRadius};\n pointer-events: none;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * UnstableHomePageCe\n * -----------------------------------------------------------------------------------------------*/\n\nexport const WidgetComponent = ({\n component,\n columnWidth,\n}: {\n component: () => Promise<React.ComponentType>;\n columnWidth: number;\n}) => {\n const [loadedComponent, setLoadedComponent] = React.useState<React.ComponentType<{\n columnWidth?: number;\n }> | null>(null);\n\n React.useEffect(() => {\n const loadComponent = async () => {\n const resolvedComponent = await component();\n\n setLoadedComponent(() => resolvedComponent);\n };\n\n loadComponent();\n }, [component]);\n\n const Component = loadedComponent;\n\n if (!Component) {\n return <Widget.Loading />;\n }\n\n return <Component {...({ columnWidth } as Record<string, unknown>)} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HomePageCE\n * -----------------------------------------------------------------------------------------------*/\n\nconst HomePageCE = () => {\n const { formatMessage } = useIntl();\n const user = useAuth('HomePageCE', (state) => state.user);\n const displayName = user?.firstname ?? user?.username ?? user?.email;\n const getAllWidgets = useStrapiApp('UnstableHomepageCe', (state) => state.widgets.getAll);\n const allWidgets = React.useMemo(() => getAllWidgets(), [getAllWidgets]);\n const checkUserHasPermissions = useAuth('WidgetRoot', (state) => state.checkUserHasPermissions);\n const { data: homepageLayout, isLoading: _isLoadingLayout } = useGetHomepageLayoutQuery();\n // Prefetch expensive widget data as soon as the homepage route is active.\n useGetCountDocumentsQuery();\n useGetKeyStatisticsQuery();\n const [filteredWidgets, setFilteredWidgets] = React.useState<WidgetWithUID[]>([]);\n const [widgetPermissionStatus, setWidgetPermissionStatus] = React.useState<\n Record<string, WidgetPermissionStatus>\n >(() =>\n allWidgets.reduce<Record<string, WidgetPermissionStatus>>((acc, widget) => {\n acc[widget.uid] =\n !widget.permissions || widget.permissions.length === 0 ? 'allowed' : 'loading';\n return acc;\n }, {})\n );\n const [isAddWidgetModalOpen, setIsAddWidgetModalOpen] = React.useState(false);\n\n // Use custom hook for widget management\n const {\n findWidget,\n deleteWidget,\n addWidget,\n moveWidget,\n columnWidths,\n setColumnWidths,\n handleWidgetResize,\n saveLayout,\n isDraggingWidget,\n draggedWidgetId,\n handleDragStart,\n handleDragEnd,\n } = useWidgets({\n filteredWidgets,\n setFilteredWidgets,\n });\n\n React.useEffect(() => {\n const initialPermissionStatus = allWidgets.reduce<Record<string, WidgetPermissionStatus>>(\n (acc, widget) => {\n acc[widget.uid] =\n !widget.permissions || widget.permissions.length === 0 ? 'allowed' : 'loading';\n return acc;\n },\n {}\n );\n\n setWidgetPermissionStatus(initialPermissionStatus);\n\n const widgetsWithPermissions = allWidgets.filter(\n (widget) => widget.permissions && widget.permissions.length > 0\n );\n\n if (widgetsWithPermissions.length === 0) {\n return;\n }\n\n const groupedPermissions = widgetsWithPermissions.reduce<\n Map<string, { permissions: NonNullable<WidgetWithUID['permissions']>; uids: string[] }>\n >((acc, widget) => {\n const permissions = widget.permissions ?? [];\n const key = getWidgetPermissionsCacheKey(permissions);\n const existingGroup = acc.get(key);\n\n if (existingGroup) {\n existingGroup.uids.push(widget.uid);\n } else {\n acc.set(key, { permissions, uids: [widget.uid] });\n }\n\n return acc;\n }, new Map());\n\n let isMounted = true;\n\n const checkWidgetsPermissions = async () => {\n try {\n const permissionResults = await Promise.all(\n Array.from(groupedPermissions.values()).map(async ({ permissions, uids }) => {\n const matchingPermissions = await checkUserHasPermissions(permissions);\n const status: WidgetPermissionStatus =\n matchingPermissions.length >= permissions.length ? 'allowed' : 'denied';\n\n return { uids, status };\n })\n );\n\n if (!isMounted) return;\n\n setWidgetPermissionStatus((prev) => {\n const next = { ...prev };\n\n permissionResults.forEach(({ uids, status }) => {\n uids.forEach((uid) => {\n next[uid] = status;\n });\n });\n\n return next;\n });\n } catch {\n if (!isMounted) return;\n\n // Keep the UI responsive even when permission checks fail.\n setWidgetPermissionStatus((prev) => {\n const next = { ...prev };\n widgetsWithPermissions.forEach((widget) => {\n next[widget.uid] = 'denied';\n });\n return next;\n });\n }\n };\n\n checkWidgetsPermissions();\n\n return () => {\n isMounted = false;\n };\n }, [allWidgets, checkUserHasPermissions]);\n\n const allAvailableWidgets = React.useMemo(() => {\n return allWidgets.filter((widget) => widgetPermissionStatus[widget.uid] === 'allowed');\n }, [allWidgets, widgetPermissionStatus]);\n\n const renderableWidgets = React.useMemo(() => {\n return allWidgets.filter((widget) => widgetPermissionStatus[widget.uid] !== 'denied');\n }, [allWidgets, widgetPermissionStatus]);\n\n React.useEffect(() => {\n // If user has customized the homepage layout, apply it\n if (homepageLayout && homepageLayout.widgets) {\n const { filteredWidgets, widths: homepageWidths } = applyHomepageLayout(\n renderableWidgets,\n homepageLayout\n );\n\n setFilteredWidgets(filteredWidgets);\n setColumnWidths(homepageWidths);\n } else {\n // Set default layout when no custom layout exists\n setFilteredWidgets(renderableWidgets);\n setColumnWidths(createDefaultWidgetWidths(renderableWidgets));\n }\n }, [homepageLayout, renderableWidgets, setColumnWidths]);\n\n const widgetLayout = React.useMemo(() => {\n return filteredWidgets.map((widget, index) => {\n const rightWidgetId = filteredWidgets[index + 1]?.uid;\n const widgetWidth = getWidgetWidth(columnWidths, widget.uid);\n const rightWidgetWidth = getWidgetWidth(columnWidths, rightWidgetId);\n\n return {\n widget,\n index,\n isLastInRow: isLastWidgetInRow(index, filteredWidgets, columnWidths),\n rightWidgetId,\n widgetWidth,\n rightWidgetWidth,\n canResize:\n rightWidgetId &&\n canResizeBetweenWidgets(widget.uid, rightWidgetId, columnWidths, filteredWidgets),\n };\n });\n }, [filteredWidgets, columnWidths]);\n\n return (\n <Layouts.Root>\n <Main>\n <Page.Title>\n {formatMessage({ id: 'HomePage.head.title', defaultMessage: 'Homepage' })}\n </Page.Title>\n <Layouts.Header\n title={formatMessage(\n { id: 'HomePage.header.title', defaultMessage: 'Hello {name}' },\n { name: displayName }\n )}\n subtitle={formatMessage({\n id: 'HomePage.header.subtitle',\n defaultMessage: 'Welcome to your administration panel',\n })}\n primaryAction={\n <Button\n variant=\"tertiary\"\n size=\"S\"\n startIcon={<Plus />}\n onClick={() => setIsAddWidgetModalOpen(true)}\n fullWidth\n >\n {formatMessage({\n id: 'HomePage.addWidget.button',\n defaultMessage: 'Add Widget',\n })}\n </Button>\n }\n />\n <FreeTrialWelcomeModal />\n <FreeTrialEndedModal />\n <AddWidgetModal\n isOpen={isAddWidgetModalOpen}\n onClose={() => setIsAddWidgetModalOpen(false)}\n onAddWidget={addWidget}\n currentWidgets={filteredWidgets}\n availableWidgets={allAvailableWidgets}\n />\n <Layouts.Content>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={8} paddingBottom={10}>\n <GuidedTourHomepageOverview />\n <Box position=\"relative\" {...{ [WIDGET_DATA_ATTRIBUTES.GRID_CONTAINER]: true }}>\n <Grid.Root gap={5}>\n {widgetLayout.map(\n ({\n widget,\n isLastInRow,\n rightWidgetId,\n widgetWidth,\n rightWidgetWidth,\n canResize,\n }) => (\n <React.Fragment key={widget.uid}>\n <Grid.Item col={widgetWidth} xs={12}>\n <WidgetRoot\n uid={widget.uid}\n title={widget.title}\n icon={widget.icon}\n link={widget.link}\n findWidget={findWidget}\n deleteWidget={deleteWidget}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n component={widget.component}\n >\n {widgetPermissionStatus[widget.uid] === 'loading' ? (\n <Widget.Loading />\n ) : (\n <WidgetComponent\n component={widget.component}\n columnWidth={widgetWidth}\n />\n )}\n </WidgetRoot>\n </Grid.Item>\n\n {!isLastInRow && canResize && rightWidgetId && (\n <WidgetResizeHandle\n key={`resize-${widget.uid}`}\n leftWidgetId={widget.uid}\n rightWidgetId={rightWidgetId}\n leftWidgetWidth={widgetWidth}\n rightWidgetWidth={rightWidgetWidth}\n onResize={handleWidgetResize}\n saveLayout={saveLayout}\n filteredWidgets={filteredWidgets}\n />\n )}\n </React.Fragment>\n )\n )}\n </Grid.Root>\n\n {isDraggingWidget && (\n <GapDropZoneManager\n filteredWidgets={filteredWidgets}\n columnWidths={columnWidths}\n draggedWidgetId={draggedWidgetId}\n moveWidget={moveWidget}\n />\n )}\n </Box>\n </Flex>\n </Layouts.Content>\n\n {/* Add the DragLayer to handle custom drag previews */}\n <DragLayer\n renderItem={({ type: _type, item }) => {\n if (!isWidgetDragItem(item)) {\n return null;\n }\n\n const widgetElement = getWidgetElement(item.id);\n const maxWidth = `${widgetElement?.clientWidth}px`;\n\n return (\n <DragPreviewWrapper $maxWidth={maxWidth}>\n <WidgetRoot\n uid={item.id as WidgetWithUID['uid']}\n title={item.title || { id: `${item.id}`, defaultMessage: item.id }}\n icon={item.icon}\n link={item.link}\n >\n <WidgetComponent component={item.component} columnWidth={4} />\n </WidgetRoot>\n </DragPreviewWrapper>\n );\n }}\n />\n </Main>\n </Layouts.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HomePage\n * -----------------------------------------------------------------------------------------------*/\n\nconst HomePage = () => {\n const Page = useEnterprise(\n HomePageCE,\n // eslint-disable-next-line import/no-cycle\n async () => (await import('../../../../ee/admin/src/pages/HomePage')).HomePageEE\n );\n\n // block rendering until the EE component is fully loaded\n if (!Page) {\n return null;\n }\n\n return <Page />;\n};\n\nexport { HomePage, HomePageCE };\n"],"names":["getWidgetPermissionsCacheKey","permissions","map","permission","JSON","stringify","action","subject","conditions","properties","sort","join","DragPreviewWrapper","styled","div","props","$maxWidth","theme","colors","primary500","borderRadius","WidgetComponent","component","columnWidth","loadedComponent","setLoadedComponent","React","useState","useEffect","loadComponent","resolvedComponent","Component","_jsx","Widget","Loading","HomePageCE","formatMessage","useIntl","user","useAuth","state","displayName","firstname","username","email","getAllWidgets","useStrapiApp","widgets","getAll","allWidgets","useMemo","checkUserHasPermissions","data","homepageLayout","isLoading","_isLoadingLayout","useGetHomepageLayoutQuery","useGetCountDocumentsQuery","useGetKeyStatisticsQuery","filteredWidgets","setFilteredWidgets","widgetPermissionStatus","setWidgetPermissionStatus","reduce","acc","widget","uid","length","isAddWidgetModalOpen","setIsAddWidgetModalOpen","findWidget","deleteWidget","addWidget","moveWidget","columnWidths","setColumnWidths","handleWidgetResize","saveLayout","isDraggingWidget","draggedWidgetId","handleDragStart","handleDragEnd","useWidgets","initialPermissionStatus","widgetsWithPermissions","filter","groupedPermissions","key","existingGroup","get","uids","push","set","Map","isMounted","checkWidgetsPermissions","permissionResults","Promise","all","Array","from","values","matchingPermissions","status","prev","next","forEach","allAvailableWidgets","renderableWidgets","widths","homepageWidths","applyHomepageLayout","createDefaultWidgetWidths","widgetLayout","index","rightWidgetId","widgetWidth","getWidgetWidth","rightWidgetWidth","isLastInRow","isLastWidgetInRow","canResize","canResizeBetweenWidgets","Layouts","Root","_jsxs","Main","Page","Title","id","defaultMessage","Header","title","name","subtitle","primaryAction","Button","variant","size","startIcon","Plus","onClick","fullWidth","FreeTrialWelcomeModal","FreeTrialEndedModal","AddWidgetModal","isOpen","onClose","onAddWidget","currentWidgets","availableWidgets","Content","Flex","direction","alignItems","gap","paddingBottom","GuidedTourHomepageOverview","Box","position","WIDGET_DATA_ATTRIBUTES","GRID_CONTAINER","Grid","Fragment","Item","col","xs","WidgetRoot","icon","link","onDragStart","onDragEnd","WidgetResizeHandle","leftWidgetId","leftWidgetWidth","onResize","GapDropZoneManager","DragLayer","renderItem","type","_type","item","isWidgetDragItem","widgetElement","getWidgetElement","maxWidth","clientWidth","HomePage","useEnterprise","HomePageEE"],"mappings":"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"}
1
+ {"version":3,"file":"HomePage.js","sources":["../../../../../../admin/src/pages/Home/HomePage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Grid, Main } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { DragLayer, isWidgetDragItem } from '../../components/DragLayer';\nimport { GapDropZoneManager } from '../../components/GapDropZone';\nimport { GuidedTourHomepageOverview } from '../../components/GuidedTour/Overview';\nimport { Layouts } from '../../components/Layouts/Layout';\nimport { Page } from '../../components/PageHelpers';\nimport { WidgetResizeHandle } from '../../components/ResizeIndicator';\nimport { Widget } from '../../components/WidgetHelpers';\nimport { WidgetRoot } from '../../components/WidgetRoot';\nimport { useEnterprise } from '../../ee';\nimport { useAppInfo } from '../../features/AppInfo';\nimport { useAuth } from '../../features/Auth';\nimport { useStrapiApp } from '../../features/StrapiApp';\nimport { useWidgets } from '../../features/Widgets';\nimport {\n useGetCountDocumentsQuery,\n useGetHomepageLayoutQuery,\n useGetKeyStatisticsQuery,\n} from '../../services/homepage';\nimport {\n getWidgetElement,\n WIDGET_DATA_ATTRIBUTES,\n applyHomepageLayout,\n createDefaultWidgetWidths,\n isLastWidgetInRow,\n canResizeBetweenWidgets,\n getWidgetWidth,\n} from '../../utils/widgetLayout';\nimport { hideDeployNowWidgetInProduction } from '../../utils/widgetVisibility';\n\nimport { AddWidgetModal } from './components/AddWidgetModal';\nimport { FreeTrialEndedModal } from './components/FreeTrialEndedModal';\nimport { FreeTrialWelcomeModal } from './components/FreeTrialWelcomeModal';\n\nimport type { WidgetWithUID } from '../../core/apis/Widgets';\n\ntype WidgetPermissionStatus = 'allowed' | 'denied' | 'loading';\n\nconst getWidgetPermissionsCacheKey = (permissions: NonNullable<WidgetWithUID['permissions']>) => {\n return permissions\n .map((permission) =>\n JSON.stringify({\n action: permission.action,\n subject: permission.subject,\n conditions: permission.conditions ?? [],\n properties: permission.properties ?? {},\n })\n )\n .sort()\n .join('|');\n};\n\n// Styled wrapper for the drag preview\nconst DragPreviewWrapper = styled.div<{ $maxWidth: string }>`\n max-width: ${(props) => props.$maxWidth};\n overflow: hidden;\n opacity: 0.9;\n border: 2px solid ${({ theme }) => theme.colors.primary500};\n border-radius: ${({ theme }) => theme.borderRadius};\n pointer-events: none;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * UnstableHomePageCe\n * -----------------------------------------------------------------------------------------------*/\n\nexport const WidgetComponent = ({\n component,\n columnWidth,\n}: {\n component: () => Promise<React.ComponentType>;\n columnWidth: number;\n}) => {\n const [loadedComponent, setLoadedComponent] = React.useState<React.ComponentType<{\n columnWidth?: number;\n }> | null>(null);\n\n React.useEffect(() => {\n const loadComponent = async () => {\n const resolvedComponent = await component();\n\n setLoadedComponent(() => resolvedComponent);\n };\n\n loadComponent();\n }, [component]);\n\n const Component = loadedComponent;\n\n if (!Component) {\n return <Widget.Loading />;\n }\n\n return <Component {...({ columnWidth } as Record<string, unknown>)} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HomePageCE\n * -----------------------------------------------------------------------------------------------*/\n\nconst HomePageCE = () => {\n const { formatMessage } = useIntl();\n const user = useAuth('HomePageCE', (state) => state.user);\n const displayName = user?.firstname ?? user?.username ?? user?.email;\n const getAllWidgets = useStrapiApp('UnstableHomepageCe', (state) => state.widgets.getAll);\n const currentEnvironment = useAppInfo('HomePageCE', (state) => state.currentEnvironment);\n const allWidgets = React.useMemo(\n () => hideDeployNowWidgetInProduction(getAllWidgets(), currentEnvironment),\n [getAllWidgets, currentEnvironment]\n );\n const checkUserHasPermissions = useAuth('WidgetRoot', (state) => state.checkUserHasPermissions);\n const { data: homepageLayout, isLoading: _isLoadingLayout } = useGetHomepageLayoutQuery();\n // Prefetch expensive widget data as soon as the homepage route is active.\n useGetCountDocumentsQuery();\n useGetKeyStatisticsQuery();\n const [filteredWidgets, setFilteredWidgets] = React.useState<WidgetWithUID[]>([]);\n const [widgetPermissionStatus, setWidgetPermissionStatus] = React.useState<\n Record<string, WidgetPermissionStatus>\n >(() =>\n allWidgets.reduce<Record<string, WidgetPermissionStatus>>((acc, widget) => {\n acc[widget.uid] =\n !widget.permissions || widget.permissions.length === 0 ? 'allowed' : 'loading';\n return acc;\n }, {})\n );\n const [isAddWidgetModalOpen, setIsAddWidgetModalOpen] = React.useState(false);\n\n // Use custom hook for widget management\n const {\n findWidget,\n deleteWidget,\n addWidget,\n moveWidget,\n columnWidths,\n setColumnWidths,\n handleWidgetResize,\n saveLayout,\n isDraggingWidget,\n draggedWidgetId,\n handleDragStart,\n handleDragEnd,\n } = useWidgets({\n filteredWidgets,\n setFilteredWidgets,\n });\n\n React.useEffect(() => {\n const initialPermissionStatus = allWidgets.reduce<Record<string, WidgetPermissionStatus>>(\n (acc, widget) => {\n acc[widget.uid] =\n !widget.permissions || widget.permissions.length === 0 ? 'allowed' : 'loading';\n return acc;\n },\n {}\n );\n\n setWidgetPermissionStatus(initialPermissionStatus);\n\n const widgetsWithPermissions = allWidgets.filter(\n (widget) => widget.permissions && widget.permissions.length > 0\n );\n\n if (widgetsWithPermissions.length === 0) {\n return;\n }\n\n const groupedPermissions = widgetsWithPermissions.reduce<\n Map<string, { permissions: NonNullable<WidgetWithUID['permissions']>; uids: string[] }>\n >((acc, widget) => {\n const permissions = widget.permissions ?? [];\n const key = getWidgetPermissionsCacheKey(permissions);\n const existingGroup = acc.get(key);\n\n if (existingGroup) {\n existingGroup.uids.push(widget.uid);\n } else {\n acc.set(key, { permissions, uids: [widget.uid] });\n }\n\n return acc;\n }, new Map());\n\n let isMounted = true;\n\n const checkWidgetsPermissions = async () => {\n try {\n const permissionResults = await Promise.all(\n Array.from(groupedPermissions.values()).map(async ({ permissions, uids }) => {\n const matchingPermissions = await checkUserHasPermissions(permissions);\n const status: WidgetPermissionStatus =\n matchingPermissions.length >= permissions.length ? 'allowed' : 'denied';\n\n return { uids, status };\n })\n );\n\n if (!isMounted) return;\n\n setWidgetPermissionStatus((prev) => {\n const next = { ...prev };\n\n permissionResults.forEach(({ uids, status }) => {\n uids.forEach((uid) => {\n next[uid] = status;\n });\n });\n\n return next;\n });\n } catch {\n if (!isMounted) return;\n\n // Keep the UI responsive even when permission checks fail.\n setWidgetPermissionStatus((prev) => {\n const next = { ...prev };\n widgetsWithPermissions.forEach((widget) => {\n next[widget.uid] = 'denied';\n });\n return next;\n });\n }\n };\n\n checkWidgetsPermissions();\n\n return () => {\n isMounted = false;\n };\n }, [allWidgets, checkUserHasPermissions]);\n\n const allAvailableWidgets = React.useMemo(() => {\n return allWidgets.filter((widget) => widgetPermissionStatus[widget.uid] === 'allowed');\n }, [allWidgets, widgetPermissionStatus]);\n\n const renderableWidgets = React.useMemo(() => {\n return allWidgets.filter((widget) => widgetPermissionStatus[widget.uid] !== 'denied');\n }, [allWidgets, widgetPermissionStatus]);\n\n React.useEffect(() => {\n // If user has customized the homepage layout, apply it\n if (homepageLayout && homepageLayout.widgets) {\n const { filteredWidgets, widths: homepageWidths } = applyHomepageLayout(\n renderableWidgets,\n homepageLayout\n );\n\n setFilteredWidgets(filteredWidgets);\n setColumnWidths(homepageWidths);\n } else {\n // Set default layout when no custom layout exists\n setFilteredWidgets(renderableWidgets);\n setColumnWidths(createDefaultWidgetWidths(renderableWidgets));\n }\n }, [homepageLayout, renderableWidgets, setColumnWidths]);\n\n const widgetLayout = React.useMemo(() => {\n return filteredWidgets.map((widget, index) => {\n const rightWidgetId = filteredWidgets[index + 1]?.uid;\n const widgetWidth = getWidgetWidth(columnWidths, widget.uid);\n const rightWidgetWidth = getWidgetWidth(columnWidths, rightWidgetId);\n\n return {\n widget,\n index,\n isLastInRow: isLastWidgetInRow(index, filteredWidgets, columnWidths),\n rightWidgetId,\n widgetWidth,\n rightWidgetWidth,\n canResize:\n rightWidgetId &&\n canResizeBetweenWidgets(widget.uid, rightWidgetId, columnWidths, filteredWidgets),\n };\n });\n }, [filteredWidgets, columnWidths]);\n\n return (\n <Layouts.Root>\n <Main>\n <Page.Title>\n {formatMessage({ id: 'HomePage.head.title', defaultMessage: 'Homepage' })}\n </Page.Title>\n <Layouts.Header\n title={formatMessage(\n { id: 'HomePage.header.title', defaultMessage: 'Hello {name}' },\n { name: displayName }\n )}\n subtitle={formatMessage({\n id: 'HomePage.header.subtitle',\n defaultMessage: 'Welcome to your administration panel',\n })}\n primaryAction={\n <Button\n variant=\"tertiary\"\n size=\"S\"\n startIcon={<Plus />}\n onClick={() => setIsAddWidgetModalOpen(true)}\n fullWidth\n >\n {formatMessage({\n id: 'HomePage.addWidget.button',\n defaultMessage: 'Add Widget',\n })}\n </Button>\n }\n />\n <FreeTrialWelcomeModal />\n <FreeTrialEndedModal />\n <AddWidgetModal\n isOpen={isAddWidgetModalOpen}\n onClose={() => setIsAddWidgetModalOpen(false)}\n onAddWidget={addWidget}\n currentWidgets={filteredWidgets}\n availableWidgets={allAvailableWidgets}\n />\n <Layouts.Content>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={8} paddingBottom={10}>\n <GuidedTourHomepageOverview />\n <Box position=\"relative\" {...{ [WIDGET_DATA_ATTRIBUTES.GRID_CONTAINER]: true }}>\n <Grid.Root gap={5}>\n {widgetLayout.map(\n ({\n widget,\n isLastInRow,\n rightWidgetId,\n widgetWidth,\n rightWidgetWidth,\n canResize,\n }) => (\n <React.Fragment key={widget.uid}>\n <Grid.Item col={widgetWidth} xs={12}>\n <WidgetRoot\n uid={widget.uid}\n title={widget.title}\n icon={widget.icon}\n link={widget.link}\n findWidget={findWidget}\n deleteWidget={deleteWidget}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n component={widget.component}\n >\n {widgetPermissionStatus[widget.uid] === 'loading' ? (\n <Widget.Loading />\n ) : (\n <WidgetComponent\n component={widget.component}\n columnWidth={widgetWidth}\n />\n )}\n </WidgetRoot>\n </Grid.Item>\n\n {!isLastInRow && canResize && rightWidgetId && (\n <WidgetResizeHandle\n key={`resize-${widget.uid}`}\n leftWidgetId={widget.uid}\n rightWidgetId={rightWidgetId}\n leftWidgetWidth={widgetWidth}\n rightWidgetWidth={rightWidgetWidth}\n onResize={handleWidgetResize}\n saveLayout={saveLayout}\n filteredWidgets={filteredWidgets}\n />\n )}\n </React.Fragment>\n )\n )}\n </Grid.Root>\n\n {isDraggingWidget && (\n <GapDropZoneManager\n filteredWidgets={filteredWidgets}\n columnWidths={columnWidths}\n draggedWidgetId={draggedWidgetId}\n moveWidget={moveWidget}\n />\n )}\n </Box>\n </Flex>\n </Layouts.Content>\n\n {/* Add the DragLayer to handle custom drag previews */}\n <DragLayer\n renderItem={({ type: _type, item }) => {\n if (!isWidgetDragItem(item)) {\n return null;\n }\n\n const widgetElement = getWidgetElement(item.id);\n const maxWidth = `${widgetElement?.clientWidth}px`;\n\n return (\n <DragPreviewWrapper $maxWidth={maxWidth}>\n <WidgetRoot\n uid={item.id as WidgetWithUID['uid']}\n title={item.title || { id: `${item.id}`, defaultMessage: item.id }}\n icon={item.icon}\n link={item.link}\n >\n <WidgetComponent component={item.component} columnWidth={4} />\n </WidgetRoot>\n </DragPreviewWrapper>\n );\n }}\n />\n </Main>\n </Layouts.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HomePage\n * -----------------------------------------------------------------------------------------------*/\n\nconst HomePage = () => {\n const Page = useEnterprise(\n HomePageCE,\n // eslint-disable-next-line import/no-cycle\n async () => (await import('../../../../ee/admin/src/pages/HomePage')).HomePageEE\n );\n\n // block rendering until the EE component is fully loaded\n if (!Page) {\n return null;\n }\n\n return <Page />;\n};\n\nexport { HomePage, HomePageCE };\n"],"names":["getWidgetPermissionsCacheKey","permissions","map","permission","JSON","stringify","action","subject","conditions","properties","sort","join","DragPreviewWrapper","styled","div","props","$maxWidth","theme","colors","primary500","borderRadius","WidgetComponent","component","columnWidth","loadedComponent","setLoadedComponent","React","useState","useEffect","loadComponent","resolvedComponent","Component","_jsx","Widget","Loading","HomePageCE","formatMessage","useIntl","user","useAuth","state","displayName","firstname","username","email","getAllWidgets","useStrapiApp","widgets","getAll","currentEnvironment","useAppInfo","allWidgets","useMemo","hideDeployNowWidgetInProduction","checkUserHasPermissions","data","homepageLayout","isLoading","_isLoadingLayout","useGetHomepageLayoutQuery","useGetCountDocumentsQuery","useGetKeyStatisticsQuery","filteredWidgets","setFilteredWidgets","widgetPermissionStatus","setWidgetPermissionStatus","reduce","acc","widget","uid","length","isAddWidgetModalOpen","setIsAddWidgetModalOpen","findWidget","deleteWidget","addWidget","moveWidget","columnWidths","setColumnWidths","handleWidgetResize","saveLayout","isDraggingWidget","draggedWidgetId","handleDragStart","handleDragEnd","useWidgets","initialPermissionStatus","widgetsWithPermissions","filter","groupedPermissions","key","existingGroup","get","uids","push","set","Map","isMounted","checkWidgetsPermissions","permissionResults","Promise","all","Array","from","values","matchingPermissions","status","prev","next","forEach","allAvailableWidgets","renderableWidgets","widths","homepageWidths","applyHomepageLayout","createDefaultWidgetWidths","widgetLayout","index","rightWidgetId","widgetWidth","getWidgetWidth","rightWidgetWidth","isLastInRow","isLastWidgetInRow","canResize","canResizeBetweenWidgets","Layouts","Root","_jsxs","Main","Page","Title","id","defaultMessage","Header","title","name","subtitle","primaryAction","Button","variant","size","startIcon","Plus","onClick","fullWidth","FreeTrialWelcomeModal","FreeTrialEndedModal","AddWidgetModal","isOpen","onClose","onAddWidget","currentWidgets","availableWidgets","Content","Flex","direction","alignItems","gap","paddingBottom","GuidedTourHomepageOverview","Box","position","WIDGET_DATA_ATTRIBUTES","GRID_CONTAINER","Grid","Fragment","Item","col","xs","WidgetRoot","icon","link","onDragStart","onDragEnd","WidgetResizeHandle","leftWidgetId","leftWidgetWidth","onResize","GapDropZoneManager","DragLayer","renderItem","type","_type","item","isWidgetDragItem","widgetElement","getWidgetElement","maxWidth","clientWidth","HomePage","useEnterprise","HomePageEE"],"mappings":"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"}
@@ -15,11 +15,13 @@ import { WidgetRoot } from '../../components/WidgetRoot.mjs';
15
15
  import '../../services/admin.mjs';
16
16
  import { useEnterprise } from '../../hooks/useEnterprise.mjs';
17
17
  import '../../../../ee/admin/src/services/ai.mjs';
18
+ import { useAppInfo } from '../../features/AppInfo.mjs';
18
19
  import { useAuth } from '../../features/Auth.mjs';
19
20
  import { useStrapiApp } from '../../features/StrapiApp.mjs';
20
21
  import { useWidgets } from '../../features/Widgets.mjs';
21
22
  import { useGetHomepageLayoutQuery, useGetCountDocumentsQuery, useGetKeyStatisticsQuery } from '../../services/homepage.mjs';
22
23
  import { applyHomepageLayout, createDefaultWidgetWidths, getWidgetWidth, canResizeBetweenWidgets, isLastWidgetInRow, WIDGET_DATA_ATTRIBUTES, getWidgetElement } from '../../utils/widgetLayout.mjs';
24
+ import { hideDeployNowWidgetInProduction } from '../../utils/widgetVisibility.mjs';
23
25
  import { AddWidgetModal } from './components/AddWidgetModal.mjs';
24
26
  import { FreeTrialEndedModal } from './components/FreeTrialEndedModal.mjs';
25
27
  import { FreeTrialWelcomeModal } from './components/FreeTrialWelcomeModal.mjs';
@@ -71,8 +73,10 @@ const DragPreviewWrapper = styled.div`
71
73
  const user = useAuth('HomePageCE', (state)=>state.user);
72
74
  const displayName = user?.firstname ?? user?.username ?? user?.email;
73
75
  const getAllWidgets = useStrapiApp('UnstableHomepageCe', (state)=>state.widgets.getAll);
74
- const allWidgets = React.useMemo(()=>getAllWidgets(), [
75
- getAllWidgets
76
+ const currentEnvironment = useAppInfo('HomePageCE', (state)=>state.currentEnvironment);
77
+ const allWidgets = React.useMemo(()=>hideDeployNowWidgetInProduction(getAllWidgets(), currentEnvironment), [
78
+ getAllWidgets,
79
+ currentEnvironment
76
80
  ]);
77
81
  const checkUserHasPermissions = useAuth('WidgetRoot', (state)=>state.checkUserHasPermissions);
78
82
  const { data: homepageLayout, isLoading: _isLoadingLayout } = useGetHomepageLayoutQuery();
@@ -1 +1 @@
1
- {"version":3,"file":"HomePage.mjs","sources":["../../../../../../admin/src/pages/Home/HomePage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Grid, Main } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { DragLayer, isWidgetDragItem } from '../../components/DragLayer';\nimport { GapDropZoneManager } from '../../components/GapDropZone';\nimport { GuidedTourHomepageOverview } from '../../components/GuidedTour/Overview';\nimport { Layouts } from '../../components/Layouts/Layout';\nimport { Page } from '../../components/PageHelpers';\nimport { WidgetResizeHandle } from '../../components/ResizeIndicator';\nimport { Widget } from '../../components/WidgetHelpers';\nimport { WidgetRoot } from '../../components/WidgetRoot';\nimport { useEnterprise } from '../../ee';\nimport { useAuth } from '../../features/Auth';\nimport { useStrapiApp } from '../../features/StrapiApp';\nimport { useWidgets } from '../../features/Widgets';\nimport {\n useGetCountDocumentsQuery,\n useGetHomepageLayoutQuery,\n useGetKeyStatisticsQuery,\n} from '../../services/homepage';\nimport {\n getWidgetElement,\n WIDGET_DATA_ATTRIBUTES,\n applyHomepageLayout,\n createDefaultWidgetWidths,\n isLastWidgetInRow,\n canResizeBetweenWidgets,\n getWidgetWidth,\n} from '../../utils/widgetLayout';\n\nimport { AddWidgetModal } from './components/AddWidgetModal';\nimport { FreeTrialEndedModal } from './components/FreeTrialEndedModal';\nimport { FreeTrialWelcomeModal } from './components/FreeTrialWelcomeModal';\n\nimport type { WidgetWithUID } from '../../core/apis/Widgets';\n\ntype WidgetPermissionStatus = 'allowed' | 'denied' | 'loading';\n\nconst getWidgetPermissionsCacheKey = (permissions: NonNullable<WidgetWithUID['permissions']>) => {\n return permissions\n .map((permission) =>\n JSON.stringify({\n action: permission.action,\n subject: permission.subject,\n conditions: permission.conditions ?? [],\n properties: permission.properties ?? {},\n })\n )\n .sort()\n .join('|');\n};\n\n// Styled wrapper for the drag preview\nconst DragPreviewWrapper = styled.div<{ $maxWidth: string }>`\n max-width: ${(props) => props.$maxWidth};\n overflow: hidden;\n opacity: 0.9;\n border: 2px solid ${({ theme }) => theme.colors.primary500};\n border-radius: ${({ theme }) => theme.borderRadius};\n pointer-events: none;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * UnstableHomePageCe\n * -----------------------------------------------------------------------------------------------*/\n\nexport const WidgetComponent = ({\n component,\n columnWidth,\n}: {\n component: () => Promise<React.ComponentType>;\n columnWidth: number;\n}) => {\n const [loadedComponent, setLoadedComponent] = React.useState<React.ComponentType<{\n columnWidth?: number;\n }> | null>(null);\n\n React.useEffect(() => {\n const loadComponent = async () => {\n const resolvedComponent = await component();\n\n setLoadedComponent(() => resolvedComponent);\n };\n\n loadComponent();\n }, [component]);\n\n const Component = loadedComponent;\n\n if (!Component) {\n return <Widget.Loading />;\n }\n\n return <Component {...({ columnWidth } as Record<string, unknown>)} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HomePageCE\n * -----------------------------------------------------------------------------------------------*/\n\nconst HomePageCE = () => {\n const { formatMessage } = useIntl();\n const user = useAuth('HomePageCE', (state) => state.user);\n const displayName = user?.firstname ?? user?.username ?? user?.email;\n const getAllWidgets = useStrapiApp('UnstableHomepageCe', (state) => state.widgets.getAll);\n const allWidgets = React.useMemo(() => getAllWidgets(), [getAllWidgets]);\n const checkUserHasPermissions = useAuth('WidgetRoot', (state) => state.checkUserHasPermissions);\n const { data: homepageLayout, isLoading: _isLoadingLayout } = useGetHomepageLayoutQuery();\n // Prefetch expensive widget data as soon as the homepage route is active.\n useGetCountDocumentsQuery();\n useGetKeyStatisticsQuery();\n const [filteredWidgets, setFilteredWidgets] = React.useState<WidgetWithUID[]>([]);\n const [widgetPermissionStatus, setWidgetPermissionStatus] = React.useState<\n Record<string, WidgetPermissionStatus>\n >(() =>\n allWidgets.reduce<Record<string, WidgetPermissionStatus>>((acc, widget) => {\n acc[widget.uid] =\n !widget.permissions || widget.permissions.length === 0 ? 'allowed' : 'loading';\n return acc;\n }, {})\n );\n const [isAddWidgetModalOpen, setIsAddWidgetModalOpen] = React.useState(false);\n\n // Use custom hook for widget management\n const {\n findWidget,\n deleteWidget,\n addWidget,\n moveWidget,\n columnWidths,\n setColumnWidths,\n handleWidgetResize,\n saveLayout,\n isDraggingWidget,\n draggedWidgetId,\n handleDragStart,\n handleDragEnd,\n } = useWidgets({\n filteredWidgets,\n setFilteredWidgets,\n });\n\n React.useEffect(() => {\n const initialPermissionStatus = allWidgets.reduce<Record<string, WidgetPermissionStatus>>(\n (acc, widget) => {\n acc[widget.uid] =\n !widget.permissions || widget.permissions.length === 0 ? 'allowed' : 'loading';\n return acc;\n },\n {}\n );\n\n setWidgetPermissionStatus(initialPermissionStatus);\n\n const widgetsWithPermissions = allWidgets.filter(\n (widget) => widget.permissions && widget.permissions.length > 0\n );\n\n if (widgetsWithPermissions.length === 0) {\n return;\n }\n\n const groupedPermissions = widgetsWithPermissions.reduce<\n Map<string, { permissions: NonNullable<WidgetWithUID['permissions']>; uids: string[] }>\n >((acc, widget) => {\n const permissions = widget.permissions ?? [];\n const key = getWidgetPermissionsCacheKey(permissions);\n const existingGroup = acc.get(key);\n\n if (existingGroup) {\n existingGroup.uids.push(widget.uid);\n } else {\n acc.set(key, { permissions, uids: [widget.uid] });\n }\n\n return acc;\n }, new Map());\n\n let isMounted = true;\n\n const checkWidgetsPermissions = async () => {\n try {\n const permissionResults = await Promise.all(\n Array.from(groupedPermissions.values()).map(async ({ permissions, uids }) => {\n const matchingPermissions = await checkUserHasPermissions(permissions);\n const status: WidgetPermissionStatus =\n matchingPermissions.length >= permissions.length ? 'allowed' : 'denied';\n\n return { uids, status };\n })\n );\n\n if (!isMounted) return;\n\n setWidgetPermissionStatus((prev) => {\n const next = { ...prev };\n\n permissionResults.forEach(({ uids, status }) => {\n uids.forEach((uid) => {\n next[uid] = status;\n });\n });\n\n return next;\n });\n } catch {\n if (!isMounted) return;\n\n // Keep the UI responsive even when permission checks fail.\n setWidgetPermissionStatus((prev) => {\n const next = { ...prev };\n widgetsWithPermissions.forEach((widget) => {\n next[widget.uid] = 'denied';\n });\n return next;\n });\n }\n };\n\n checkWidgetsPermissions();\n\n return () => {\n isMounted = false;\n };\n }, [allWidgets, checkUserHasPermissions]);\n\n const allAvailableWidgets = React.useMemo(() => {\n return allWidgets.filter((widget) => widgetPermissionStatus[widget.uid] === 'allowed');\n }, [allWidgets, widgetPermissionStatus]);\n\n const renderableWidgets = React.useMemo(() => {\n return allWidgets.filter((widget) => widgetPermissionStatus[widget.uid] !== 'denied');\n }, [allWidgets, widgetPermissionStatus]);\n\n React.useEffect(() => {\n // If user has customized the homepage layout, apply it\n if (homepageLayout && homepageLayout.widgets) {\n const { filteredWidgets, widths: homepageWidths } = applyHomepageLayout(\n renderableWidgets,\n homepageLayout\n );\n\n setFilteredWidgets(filteredWidgets);\n setColumnWidths(homepageWidths);\n } else {\n // Set default layout when no custom layout exists\n setFilteredWidgets(renderableWidgets);\n setColumnWidths(createDefaultWidgetWidths(renderableWidgets));\n }\n }, [homepageLayout, renderableWidgets, setColumnWidths]);\n\n const widgetLayout = React.useMemo(() => {\n return filteredWidgets.map((widget, index) => {\n const rightWidgetId = filteredWidgets[index + 1]?.uid;\n const widgetWidth = getWidgetWidth(columnWidths, widget.uid);\n const rightWidgetWidth = getWidgetWidth(columnWidths, rightWidgetId);\n\n return {\n widget,\n index,\n isLastInRow: isLastWidgetInRow(index, filteredWidgets, columnWidths),\n rightWidgetId,\n widgetWidth,\n rightWidgetWidth,\n canResize:\n rightWidgetId &&\n canResizeBetweenWidgets(widget.uid, rightWidgetId, columnWidths, filteredWidgets),\n };\n });\n }, [filteredWidgets, columnWidths]);\n\n return (\n <Layouts.Root>\n <Main>\n <Page.Title>\n {formatMessage({ id: 'HomePage.head.title', defaultMessage: 'Homepage' })}\n </Page.Title>\n <Layouts.Header\n title={formatMessage(\n { id: 'HomePage.header.title', defaultMessage: 'Hello {name}' },\n { name: displayName }\n )}\n subtitle={formatMessage({\n id: 'HomePage.header.subtitle',\n defaultMessage: 'Welcome to your administration panel',\n })}\n primaryAction={\n <Button\n variant=\"tertiary\"\n size=\"S\"\n startIcon={<Plus />}\n onClick={() => setIsAddWidgetModalOpen(true)}\n fullWidth\n >\n {formatMessage({\n id: 'HomePage.addWidget.button',\n defaultMessage: 'Add Widget',\n })}\n </Button>\n }\n />\n <FreeTrialWelcomeModal />\n <FreeTrialEndedModal />\n <AddWidgetModal\n isOpen={isAddWidgetModalOpen}\n onClose={() => setIsAddWidgetModalOpen(false)}\n onAddWidget={addWidget}\n currentWidgets={filteredWidgets}\n availableWidgets={allAvailableWidgets}\n />\n <Layouts.Content>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={8} paddingBottom={10}>\n <GuidedTourHomepageOverview />\n <Box position=\"relative\" {...{ [WIDGET_DATA_ATTRIBUTES.GRID_CONTAINER]: true }}>\n <Grid.Root gap={5}>\n {widgetLayout.map(\n ({\n widget,\n isLastInRow,\n rightWidgetId,\n widgetWidth,\n rightWidgetWidth,\n canResize,\n }) => (\n <React.Fragment key={widget.uid}>\n <Grid.Item col={widgetWidth} xs={12}>\n <WidgetRoot\n uid={widget.uid}\n title={widget.title}\n icon={widget.icon}\n link={widget.link}\n findWidget={findWidget}\n deleteWidget={deleteWidget}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n component={widget.component}\n >\n {widgetPermissionStatus[widget.uid] === 'loading' ? (\n <Widget.Loading />\n ) : (\n <WidgetComponent\n component={widget.component}\n columnWidth={widgetWidth}\n />\n )}\n </WidgetRoot>\n </Grid.Item>\n\n {!isLastInRow && canResize && rightWidgetId && (\n <WidgetResizeHandle\n key={`resize-${widget.uid}`}\n leftWidgetId={widget.uid}\n rightWidgetId={rightWidgetId}\n leftWidgetWidth={widgetWidth}\n rightWidgetWidth={rightWidgetWidth}\n onResize={handleWidgetResize}\n saveLayout={saveLayout}\n filteredWidgets={filteredWidgets}\n />\n )}\n </React.Fragment>\n )\n )}\n </Grid.Root>\n\n {isDraggingWidget && (\n <GapDropZoneManager\n filteredWidgets={filteredWidgets}\n columnWidths={columnWidths}\n draggedWidgetId={draggedWidgetId}\n moveWidget={moveWidget}\n />\n )}\n </Box>\n </Flex>\n </Layouts.Content>\n\n {/* Add the DragLayer to handle custom drag previews */}\n <DragLayer\n renderItem={({ type: _type, item }) => {\n if (!isWidgetDragItem(item)) {\n return null;\n }\n\n const widgetElement = getWidgetElement(item.id);\n const maxWidth = `${widgetElement?.clientWidth}px`;\n\n return (\n <DragPreviewWrapper $maxWidth={maxWidth}>\n <WidgetRoot\n uid={item.id as WidgetWithUID['uid']}\n title={item.title || { id: `${item.id}`, defaultMessage: item.id }}\n icon={item.icon}\n link={item.link}\n >\n <WidgetComponent component={item.component} columnWidth={4} />\n </WidgetRoot>\n </DragPreviewWrapper>\n );\n }}\n />\n </Main>\n </Layouts.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HomePage\n * -----------------------------------------------------------------------------------------------*/\n\nconst HomePage = () => {\n const Page = useEnterprise(\n HomePageCE,\n // eslint-disable-next-line import/no-cycle\n async () => (await import('../../../../ee/admin/src/pages/HomePage')).HomePageEE\n );\n\n // block rendering until the EE component is fully loaded\n if (!Page) {\n return null;\n }\n\n return <Page />;\n};\n\nexport { HomePage, HomePageCE };\n"],"names":["getWidgetPermissionsCacheKey","permissions","map","permission","JSON","stringify","action","subject","conditions","properties","sort","join","DragPreviewWrapper","styled","div","props","$maxWidth","theme","colors","primary500","borderRadius","WidgetComponent","component","columnWidth","loadedComponent","setLoadedComponent","React","useState","useEffect","loadComponent","resolvedComponent","Component","_jsx","Widget","Loading","HomePageCE","formatMessage","useIntl","user","useAuth","state","displayName","firstname","username","email","getAllWidgets","useStrapiApp","widgets","getAll","allWidgets","useMemo","checkUserHasPermissions","data","homepageLayout","isLoading","_isLoadingLayout","useGetHomepageLayoutQuery","useGetCountDocumentsQuery","useGetKeyStatisticsQuery","filteredWidgets","setFilteredWidgets","widgetPermissionStatus","setWidgetPermissionStatus","reduce","acc","widget","uid","length","isAddWidgetModalOpen","setIsAddWidgetModalOpen","findWidget","deleteWidget","addWidget","moveWidget","columnWidths","setColumnWidths","handleWidgetResize","saveLayout","isDraggingWidget","draggedWidgetId","handleDragStart","handleDragEnd","useWidgets","initialPermissionStatus","widgetsWithPermissions","filter","groupedPermissions","key","existingGroup","get","uids","push","set","Map","isMounted","checkWidgetsPermissions","permissionResults","Promise","all","Array","from","values","matchingPermissions","status","prev","next","forEach","allAvailableWidgets","renderableWidgets","widths","homepageWidths","applyHomepageLayout","createDefaultWidgetWidths","widgetLayout","index","rightWidgetId","widgetWidth","getWidgetWidth","rightWidgetWidth","isLastInRow","isLastWidgetInRow","canResize","canResizeBetweenWidgets","Layouts","Root","_jsxs","Main","Page","Title","id","defaultMessage","Header","title","name","subtitle","primaryAction","Button","variant","size","startIcon","Plus","onClick","fullWidth","FreeTrialWelcomeModal","FreeTrialEndedModal","AddWidgetModal","isOpen","onClose","onAddWidget","currentWidgets","availableWidgets","Content","Flex","direction","alignItems","gap","paddingBottom","GuidedTourHomepageOverview","Box","position","WIDGET_DATA_ATTRIBUTES","GRID_CONTAINER","Grid","Fragment","Item","col","xs","WidgetRoot","icon","link","onDragStart","onDragEnd","WidgetResizeHandle","leftWidgetId","leftWidgetWidth","onResize","GapDropZoneManager","DragLayer","renderItem","type","_type","item","isWidgetDragItem","widgetElement","getWidgetElement","maxWidth","clientWidth","HomePage","useEnterprise","HomePageEE"],"mappings":"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"}
1
+ {"version":3,"file":"HomePage.mjs","sources":["../../../../../../admin/src/pages/Home/HomePage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Button, Flex, Grid, Main } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { DragLayer, isWidgetDragItem } from '../../components/DragLayer';\nimport { GapDropZoneManager } from '../../components/GapDropZone';\nimport { GuidedTourHomepageOverview } from '../../components/GuidedTour/Overview';\nimport { Layouts } from '../../components/Layouts/Layout';\nimport { Page } from '../../components/PageHelpers';\nimport { WidgetResizeHandle } from '../../components/ResizeIndicator';\nimport { Widget } from '../../components/WidgetHelpers';\nimport { WidgetRoot } from '../../components/WidgetRoot';\nimport { useEnterprise } from '../../ee';\nimport { useAppInfo } from '../../features/AppInfo';\nimport { useAuth } from '../../features/Auth';\nimport { useStrapiApp } from '../../features/StrapiApp';\nimport { useWidgets } from '../../features/Widgets';\nimport {\n useGetCountDocumentsQuery,\n useGetHomepageLayoutQuery,\n useGetKeyStatisticsQuery,\n} from '../../services/homepage';\nimport {\n getWidgetElement,\n WIDGET_DATA_ATTRIBUTES,\n applyHomepageLayout,\n createDefaultWidgetWidths,\n isLastWidgetInRow,\n canResizeBetweenWidgets,\n getWidgetWidth,\n} from '../../utils/widgetLayout';\nimport { hideDeployNowWidgetInProduction } from '../../utils/widgetVisibility';\n\nimport { AddWidgetModal } from './components/AddWidgetModal';\nimport { FreeTrialEndedModal } from './components/FreeTrialEndedModal';\nimport { FreeTrialWelcomeModal } from './components/FreeTrialWelcomeModal';\n\nimport type { WidgetWithUID } from '../../core/apis/Widgets';\n\ntype WidgetPermissionStatus = 'allowed' | 'denied' | 'loading';\n\nconst getWidgetPermissionsCacheKey = (permissions: NonNullable<WidgetWithUID['permissions']>) => {\n return permissions\n .map((permission) =>\n JSON.stringify({\n action: permission.action,\n subject: permission.subject,\n conditions: permission.conditions ?? [],\n properties: permission.properties ?? {},\n })\n )\n .sort()\n .join('|');\n};\n\n// Styled wrapper for the drag preview\nconst DragPreviewWrapper = styled.div<{ $maxWidth: string }>`\n max-width: ${(props) => props.$maxWidth};\n overflow: hidden;\n opacity: 0.9;\n border: 2px solid ${({ theme }) => theme.colors.primary500};\n border-radius: ${({ theme }) => theme.borderRadius};\n pointer-events: none;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * UnstableHomePageCe\n * -----------------------------------------------------------------------------------------------*/\n\nexport const WidgetComponent = ({\n component,\n columnWidth,\n}: {\n component: () => Promise<React.ComponentType>;\n columnWidth: number;\n}) => {\n const [loadedComponent, setLoadedComponent] = React.useState<React.ComponentType<{\n columnWidth?: number;\n }> | null>(null);\n\n React.useEffect(() => {\n const loadComponent = async () => {\n const resolvedComponent = await component();\n\n setLoadedComponent(() => resolvedComponent);\n };\n\n loadComponent();\n }, [component]);\n\n const Component = loadedComponent;\n\n if (!Component) {\n return <Widget.Loading />;\n }\n\n return <Component {...({ columnWidth } as Record<string, unknown>)} />;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HomePageCE\n * -----------------------------------------------------------------------------------------------*/\n\nconst HomePageCE = () => {\n const { formatMessage } = useIntl();\n const user = useAuth('HomePageCE', (state) => state.user);\n const displayName = user?.firstname ?? user?.username ?? user?.email;\n const getAllWidgets = useStrapiApp('UnstableHomepageCe', (state) => state.widgets.getAll);\n const currentEnvironment = useAppInfo('HomePageCE', (state) => state.currentEnvironment);\n const allWidgets = React.useMemo(\n () => hideDeployNowWidgetInProduction(getAllWidgets(), currentEnvironment),\n [getAllWidgets, currentEnvironment]\n );\n const checkUserHasPermissions = useAuth('WidgetRoot', (state) => state.checkUserHasPermissions);\n const { data: homepageLayout, isLoading: _isLoadingLayout } = useGetHomepageLayoutQuery();\n // Prefetch expensive widget data as soon as the homepage route is active.\n useGetCountDocumentsQuery();\n useGetKeyStatisticsQuery();\n const [filteredWidgets, setFilteredWidgets] = React.useState<WidgetWithUID[]>([]);\n const [widgetPermissionStatus, setWidgetPermissionStatus] = React.useState<\n Record<string, WidgetPermissionStatus>\n >(() =>\n allWidgets.reduce<Record<string, WidgetPermissionStatus>>((acc, widget) => {\n acc[widget.uid] =\n !widget.permissions || widget.permissions.length === 0 ? 'allowed' : 'loading';\n return acc;\n }, {})\n );\n const [isAddWidgetModalOpen, setIsAddWidgetModalOpen] = React.useState(false);\n\n // Use custom hook for widget management\n const {\n findWidget,\n deleteWidget,\n addWidget,\n moveWidget,\n columnWidths,\n setColumnWidths,\n handleWidgetResize,\n saveLayout,\n isDraggingWidget,\n draggedWidgetId,\n handleDragStart,\n handleDragEnd,\n } = useWidgets({\n filteredWidgets,\n setFilteredWidgets,\n });\n\n React.useEffect(() => {\n const initialPermissionStatus = allWidgets.reduce<Record<string, WidgetPermissionStatus>>(\n (acc, widget) => {\n acc[widget.uid] =\n !widget.permissions || widget.permissions.length === 0 ? 'allowed' : 'loading';\n return acc;\n },\n {}\n );\n\n setWidgetPermissionStatus(initialPermissionStatus);\n\n const widgetsWithPermissions = allWidgets.filter(\n (widget) => widget.permissions && widget.permissions.length > 0\n );\n\n if (widgetsWithPermissions.length === 0) {\n return;\n }\n\n const groupedPermissions = widgetsWithPermissions.reduce<\n Map<string, { permissions: NonNullable<WidgetWithUID['permissions']>; uids: string[] }>\n >((acc, widget) => {\n const permissions = widget.permissions ?? [];\n const key = getWidgetPermissionsCacheKey(permissions);\n const existingGroup = acc.get(key);\n\n if (existingGroup) {\n existingGroup.uids.push(widget.uid);\n } else {\n acc.set(key, { permissions, uids: [widget.uid] });\n }\n\n return acc;\n }, new Map());\n\n let isMounted = true;\n\n const checkWidgetsPermissions = async () => {\n try {\n const permissionResults = await Promise.all(\n Array.from(groupedPermissions.values()).map(async ({ permissions, uids }) => {\n const matchingPermissions = await checkUserHasPermissions(permissions);\n const status: WidgetPermissionStatus =\n matchingPermissions.length >= permissions.length ? 'allowed' : 'denied';\n\n return { uids, status };\n })\n );\n\n if (!isMounted) return;\n\n setWidgetPermissionStatus((prev) => {\n const next = { ...prev };\n\n permissionResults.forEach(({ uids, status }) => {\n uids.forEach((uid) => {\n next[uid] = status;\n });\n });\n\n return next;\n });\n } catch {\n if (!isMounted) return;\n\n // Keep the UI responsive even when permission checks fail.\n setWidgetPermissionStatus((prev) => {\n const next = { ...prev };\n widgetsWithPermissions.forEach((widget) => {\n next[widget.uid] = 'denied';\n });\n return next;\n });\n }\n };\n\n checkWidgetsPermissions();\n\n return () => {\n isMounted = false;\n };\n }, [allWidgets, checkUserHasPermissions]);\n\n const allAvailableWidgets = React.useMemo(() => {\n return allWidgets.filter((widget) => widgetPermissionStatus[widget.uid] === 'allowed');\n }, [allWidgets, widgetPermissionStatus]);\n\n const renderableWidgets = React.useMemo(() => {\n return allWidgets.filter((widget) => widgetPermissionStatus[widget.uid] !== 'denied');\n }, [allWidgets, widgetPermissionStatus]);\n\n React.useEffect(() => {\n // If user has customized the homepage layout, apply it\n if (homepageLayout && homepageLayout.widgets) {\n const { filteredWidgets, widths: homepageWidths } = applyHomepageLayout(\n renderableWidgets,\n homepageLayout\n );\n\n setFilteredWidgets(filteredWidgets);\n setColumnWidths(homepageWidths);\n } else {\n // Set default layout when no custom layout exists\n setFilteredWidgets(renderableWidgets);\n setColumnWidths(createDefaultWidgetWidths(renderableWidgets));\n }\n }, [homepageLayout, renderableWidgets, setColumnWidths]);\n\n const widgetLayout = React.useMemo(() => {\n return filteredWidgets.map((widget, index) => {\n const rightWidgetId = filteredWidgets[index + 1]?.uid;\n const widgetWidth = getWidgetWidth(columnWidths, widget.uid);\n const rightWidgetWidth = getWidgetWidth(columnWidths, rightWidgetId);\n\n return {\n widget,\n index,\n isLastInRow: isLastWidgetInRow(index, filteredWidgets, columnWidths),\n rightWidgetId,\n widgetWidth,\n rightWidgetWidth,\n canResize:\n rightWidgetId &&\n canResizeBetweenWidgets(widget.uid, rightWidgetId, columnWidths, filteredWidgets),\n };\n });\n }, [filteredWidgets, columnWidths]);\n\n return (\n <Layouts.Root>\n <Main>\n <Page.Title>\n {formatMessage({ id: 'HomePage.head.title', defaultMessage: 'Homepage' })}\n </Page.Title>\n <Layouts.Header\n title={formatMessage(\n { id: 'HomePage.header.title', defaultMessage: 'Hello {name}' },\n { name: displayName }\n )}\n subtitle={formatMessage({\n id: 'HomePage.header.subtitle',\n defaultMessage: 'Welcome to your administration panel',\n })}\n primaryAction={\n <Button\n variant=\"tertiary\"\n size=\"S\"\n startIcon={<Plus />}\n onClick={() => setIsAddWidgetModalOpen(true)}\n fullWidth\n >\n {formatMessage({\n id: 'HomePage.addWidget.button',\n defaultMessage: 'Add Widget',\n })}\n </Button>\n }\n />\n <FreeTrialWelcomeModal />\n <FreeTrialEndedModal />\n <AddWidgetModal\n isOpen={isAddWidgetModalOpen}\n onClose={() => setIsAddWidgetModalOpen(false)}\n onAddWidget={addWidget}\n currentWidgets={filteredWidgets}\n availableWidgets={allAvailableWidgets}\n />\n <Layouts.Content>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={8} paddingBottom={10}>\n <GuidedTourHomepageOverview />\n <Box position=\"relative\" {...{ [WIDGET_DATA_ATTRIBUTES.GRID_CONTAINER]: true }}>\n <Grid.Root gap={5}>\n {widgetLayout.map(\n ({\n widget,\n isLastInRow,\n rightWidgetId,\n widgetWidth,\n rightWidgetWidth,\n canResize,\n }) => (\n <React.Fragment key={widget.uid}>\n <Grid.Item col={widgetWidth} xs={12}>\n <WidgetRoot\n uid={widget.uid}\n title={widget.title}\n icon={widget.icon}\n link={widget.link}\n findWidget={findWidget}\n deleteWidget={deleteWidget}\n onDragStart={handleDragStart}\n onDragEnd={handleDragEnd}\n component={widget.component}\n >\n {widgetPermissionStatus[widget.uid] === 'loading' ? (\n <Widget.Loading />\n ) : (\n <WidgetComponent\n component={widget.component}\n columnWidth={widgetWidth}\n />\n )}\n </WidgetRoot>\n </Grid.Item>\n\n {!isLastInRow && canResize && rightWidgetId && (\n <WidgetResizeHandle\n key={`resize-${widget.uid}`}\n leftWidgetId={widget.uid}\n rightWidgetId={rightWidgetId}\n leftWidgetWidth={widgetWidth}\n rightWidgetWidth={rightWidgetWidth}\n onResize={handleWidgetResize}\n saveLayout={saveLayout}\n filteredWidgets={filteredWidgets}\n />\n )}\n </React.Fragment>\n )\n )}\n </Grid.Root>\n\n {isDraggingWidget && (\n <GapDropZoneManager\n filteredWidgets={filteredWidgets}\n columnWidths={columnWidths}\n draggedWidgetId={draggedWidgetId}\n moveWidget={moveWidget}\n />\n )}\n </Box>\n </Flex>\n </Layouts.Content>\n\n {/* Add the DragLayer to handle custom drag previews */}\n <DragLayer\n renderItem={({ type: _type, item }) => {\n if (!isWidgetDragItem(item)) {\n return null;\n }\n\n const widgetElement = getWidgetElement(item.id);\n const maxWidth = `${widgetElement?.clientWidth}px`;\n\n return (\n <DragPreviewWrapper $maxWidth={maxWidth}>\n <WidgetRoot\n uid={item.id as WidgetWithUID['uid']}\n title={item.title || { id: `${item.id}`, defaultMessage: item.id }}\n icon={item.icon}\n link={item.link}\n >\n <WidgetComponent component={item.component} columnWidth={4} />\n </WidgetRoot>\n </DragPreviewWrapper>\n );\n }}\n />\n </Main>\n </Layouts.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * HomePage\n * -----------------------------------------------------------------------------------------------*/\n\nconst HomePage = () => {\n const Page = useEnterprise(\n HomePageCE,\n // eslint-disable-next-line import/no-cycle\n async () => (await import('../../../../ee/admin/src/pages/HomePage')).HomePageEE\n );\n\n // block rendering until the EE component is fully loaded\n if (!Page) {\n return null;\n }\n\n return <Page />;\n};\n\nexport { HomePage, HomePageCE };\n"],"names":["getWidgetPermissionsCacheKey","permissions","map","permission","JSON","stringify","action","subject","conditions","properties","sort","join","DragPreviewWrapper","styled","div","props","$maxWidth","theme","colors","primary500","borderRadius","WidgetComponent","component","columnWidth","loadedComponent","setLoadedComponent","React","useState","useEffect","loadComponent","resolvedComponent","Component","_jsx","Widget","Loading","HomePageCE","formatMessage","useIntl","user","useAuth","state","displayName","firstname","username","email","getAllWidgets","useStrapiApp","widgets","getAll","currentEnvironment","useAppInfo","allWidgets","useMemo","hideDeployNowWidgetInProduction","checkUserHasPermissions","data","homepageLayout","isLoading","_isLoadingLayout","useGetHomepageLayoutQuery","useGetCountDocumentsQuery","useGetKeyStatisticsQuery","filteredWidgets","setFilteredWidgets","widgetPermissionStatus","setWidgetPermissionStatus","reduce","acc","widget","uid","length","isAddWidgetModalOpen","setIsAddWidgetModalOpen","findWidget","deleteWidget","addWidget","moveWidget","columnWidths","setColumnWidths","handleWidgetResize","saveLayout","isDraggingWidget","draggedWidgetId","handleDragStart","handleDragEnd","useWidgets","initialPermissionStatus","widgetsWithPermissions","filter","groupedPermissions","key","existingGroup","get","uids","push","set","Map","isMounted","checkWidgetsPermissions","permissionResults","Promise","all","Array","from","values","matchingPermissions","status","prev","next","forEach","allAvailableWidgets","renderableWidgets","widths","homepageWidths","applyHomepageLayout","createDefaultWidgetWidths","widgetLayout","index","rightWidgetId","widgetWidth","getWidgetWidth","rightWidgetWidth","isLastInRow","isLastWidgetInRow","canResize","canResizeBetweenWidgets","Layouts","Root","_jsxs","Main","Page","Title","id","defaultMessage","Header","title","name","subtitle","primaryAction","Button","variant","size","startIcon","Plus","onClick","fullWidth","FreeTrialWelcomeModal","FreeTrialEndedModal","AddWidgetModal","isOpen","onClose","onAddWidget","currentWidgets","availableWidgets","Content","Flex","direction","alignItems","gap","paddingBottom","GuidedTourHomepageOverview","Box","position","WIDGET_DATA_ATTRIBUTES","GRID_CONTAINER","Grid","Fragment","Item","col","xs","WidgetRoot","icon","link","onDragStart","onDragEnd","WidgetResizeHandle","leftWidgetId","leftWidgetWidth","onResize","GapDropZoneManager","DragLayer","renderItem","type","_type","item","isWidgetDragItem","widgetElement","getWidgetElement","maxWidth","clientWidth","HomePage","useEnterprise","HomePageEE"],"mappings":"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"}
@@ -152,7 +152,7 @@ const FreeTrialEndedModal = ()=>{
152
152
  gap: 2,
153
153
  children: [
154
154
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.LinkButton, {
155
- href: "https://strapi.chargebeeportal.com/",
155
+ href: "https://billing.strapi.io/",
156
156
  target: "_blank",
157
157
  children: formatMessage({
158
158
  id: 'app.components.FreeTrialEndedModal.button.upgrade',