@strapi/admin 5.57.0 → 5.58.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/admin/admin/src/components/FormInputs/Boolean.js +3 -2
  2. package/dist/admin/admin/src/components/FormInputs/Boolean.js.map +1 -1
  3. package/dist/admin/admin/src/components/FormInputs/Boolean.mjs +3 -2
  4. package/dist/admin/admin/src/components/FormInputs/Boolean.mjs.map +1 -1
  5. package/dist/admin/admin/src/constants.js +14 -0
  6. package/dist/admin/admin/src/constants.js.map +1 -1
  7. package/dist/admin/admin/src/constants.mjs +14 -0
  8. package/dist/admin/admin/src/constants.mjs.map +1 -1
  9. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js +6 -12
  10. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js.map +1 -1
  11. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs +6 -12
  12. package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs.map +1 -1
  13. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +10 -2
  14. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
  15. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +10 -2
  16. package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
  17. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +6 -56
  18. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
  19. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +6 -56
  20. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
  21. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js +217 -0
  22. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js.map +1 -0
  23. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs +195 -0
  24. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs.map +1 -0
  25. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js +185 -0
  26. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js.map +1 -0
  27. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs +162 -0
  28. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs.map +1 -0
  29. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js +342 -0
  30. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js.map +1 -0
  31. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs +320 -0
  32. package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs.map +1 -0
  33. package/dist/admin/admin/src/services/admin.js +11 -1
  34. package/dist/admin/admin/src/services/admin.js.map +1 -1
  35. package/dist/admin/admin/src/services/admin.mjs +11 -2
  36. package/dist/admin/admin/src/services/admin.mjs.map +1 -1
  37. package/dist/admin/admin/src/translations/en.json.js +71 -4
  38. package/dist/admin/admin/src/translations/en.json.js.map +1 -1
  39. package/dist/admin/admin/src/translations/en.json.mjs +71 -4
  40. package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
  41. package/dist/admin/admin/src/utils/browserStrapi.js +1 -1
  42. package/dist/admin/admin/src/utils/browserStrapi.js.map +1 -1
  43. package/dist/admin/admin/src/utils/browserStrapi.mjs +1 -1
  44. package/dist/admin/admin/src/utils/browserStrapi.mjs.map +1 -1
  45. package/dist/admin/admin/src/utils/getFetchClient.js +24 -0
  46. package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
  47. package/dist/admin/admin/src/utils/getFetchClient.mjs +24 -1
  48. package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
  49. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +52 -22
  50. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
  51. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +53 -23
  52. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
  53. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js +16 -29
  54. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js.map +1 -1
  55. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs +18 -31
  56. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs.map +1 -1
  57. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js +473 -0
  58. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js.map +1 -0
  59. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs +471 -0
  60. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs.map +1 -0
  61. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +2 -0
  62. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
  63. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +2 -0
  64. package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
  65. package/dist/admin/index.js +1 -0
  66. package/dist/admin/index.js.map +1 -1
  67. package/dist/admin/index.mjs +1 -1
  68. package/dist/admin/shared/utils/get-project-type.js +49 -0
  69. package/dist/admin/shared/utils/get-project-type.js.map +1 -0
  70. package/dist/admin/shared/utils/get-project-type.mjs +46 -0
  71. package/dist/admin/shared/utils/get-project-type.mjs.map +1 -0
  72. package/dist/admin/src/constants.d.ts +10 -0
  73. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.d.ts +1 -1
  74. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.d.ts +12 -0
  75. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.d.ts +14 -0
  76. package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.d.ts +2 -0
  77. package/dist/admin/src/services/admin.d.ts +2 -2
  78. package/dist/admin/src/types/permissions.d.ts +1 -0
  79. package/dist/admin/src/utils/getFetchClient.d.ts +25 -0
  80. package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +29 -0
  81. package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.d.ts +6 -1
  82. package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.d.ts +2 -0
  83. package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +2 -0
  84. package/dist/ee/server/src/audit-logs/entitlements.d.ts +8 -0
  85. package/dist/ee/server/src/audit-logs/entitlements.d.ts.map +1 -0
  86. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +16 -0
  87. package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
  88. package/dist/ee/server/src/controllers/admin.d.ts +36 -10
  89. package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
  90. package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -1
  91. package/dist/ee/server/src/controllers/index.d.ts +36 -10
  92. package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
  93. package/dist/ee/server/src/index.d.ts +36 -10
  94. package/dist/ee/server/src/index.d.ts.map +1 -1
  95. package/dist/server/ee/server/src/audit-logs/entitlements.js +25 -0
  96. package/dist/server/ee/server/src/audit-logs/entitlements.js.map +1 -0
  97. package/dist/server/ee/server/src/audit-logs/entitlements.mjs +23 -0
  98. package/dist/server/ee/server/src/audit-logs/entitlements.mjs.map +1 -0
  99. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +20 -8
  100. package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
  101. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +19 -9
  102. package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
  103. package/dist/server/ee/server/src/controllers/admin.js +76 -3
  104. package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
  105. package/dist/server/ee/server/src/controllers/admin.mjs +76 -3
  106. package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
  107. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +28 -10
  108. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
  109. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs +28 -10
  110. package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs.map +1 -1
  111. package/dist/server/ee/server/src/index.js +2 -0
  112. package/dist/server/ee/server/src/index.js.map +1 -1
  113. package/dist/server/ee/server/src/index.mjs +2 -0
  114. package/dist/server/ee/server/src/index.mjs.map +1 -1
  115. package/dist/server/server/src/audit-logs/auth.js +72 -0
  116. package/dist/server/server/src/audit-logs/auth.js.map +1 -0
  117. package/dist/server/server/src/audit-logs/auth.mjs +67 -0
  118. package/dist/server/server/src/audit-logs/auth.mjs.map +1 -0
  119. package/dist/server/server/src/config/admin-actions.js +7 -0
  120. package/dist/server/server/src/config/admin-actions.js.map +1 -1
  121. package/dist/server/server/src/config/admin-actions.mjs +7 -0
  122. package/dist/server/server/src/config/admin-actions.mjs.map +1 -1
  123. package/dist/server/server/src/controllers/admin.js +6 -0
  124. package/dist/server/server/src/controllers/admin.js.map +1 -1
  125. package/dist/server/server/src/controllers/admin.mjs +6 -0
  126. package/dist/server/server/src/controllers/admin.mjs.map +1 -1
  127. package/dist/server/server/src/controllers/authentication.js +34 -8
  128. package/dist/server/server/src/controllers/authentication.js.map +1 -1
  129. package/dist/server/server/src/controllers/authentication.mjs +34 -8
  130. package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
  131. package/dist/server/server/src/register.js +4 -0
  132. package/dist/server/server/src/register.js.map +1 -1
  133. package/dist/server/server/src/register.mjs +4 -0
  134. package/dist/server/server/src/register.mjs.map +1 -1
  135. package/dist/server/server/src/routes/admin.js +18 -0
  136. package/dist/server/server/src/routes/admin.js.map +1 -1
  137. package/dist/server/server/src/routes/admin.mjs +18 -0
  138. package/dist/server/server/src/routes/admin.mjs.map +1 -1
  139. package/dist/server/server/src/services/auth.js +4 -2
  140. package/dist/server/server/src/services/auth.js.map +1 -1
  141. package/dist/server/server/src/services/auth.mjs +4 -3
  142. package/dist/server/server/src/services/auth.mjs.map +1 -1
  143. package/dist/server/server/src/services/debug-dump.js +173 -0
  144. package/dist/server/server/src/services/debug-dump.js.map +1 -0
  145. package/dist/server/server/src/services/debug-dump.mjs +166 -0
  146. package/dist/server/server/src/services/debug-dump.mjs.map +1 -0
  147. package/dist/server/server/src/services/index.js +3 -1
  148. package/dist/server/server/src/services/index.js.map +1 -1
  149. package/dist/server/server/src/services/index.mjs +3 -1
  150. package/dist/server/server/src/services/index.mjs.map +1 -1
  151. package/dist/server/server/src/utils/debug-dump/redact.js +197 -0
  152. package/dist/server/server/src/utils/debug-dump/redact.js.map +1 -0
  153. package/dist/server/server/src/utils/debug-dump/redact.mjs +194 -0
  154. package/dist/server/server/src/utils/debug-dump/redact.mjs.map +1 -0
  155. package/dist/server/shared/utils/get-project-type.js +49 -0
  156. package/dist/server/shared/utils/get-project-type.js.map +1 -0
  157. package/dist/server/shared/utils/get-project-type.mjs +46 -0
  158. package/dist/server/shared/utils/get-project-type.mjs.map +1 -0
  159. package/dist/server/src/audit-logs/auth.d.ts +72 -0
  160. package/dist/server/src/audit-logs/auth.d.ts.map +1 -0
  161. package/dist/server/src/config/admin-actions.d.ts.map +1 -1
  162. package/dist/server/src/controllers/admin.d.ts +3 -0
  163. package/dist/server/src/controllers/admin.d.ts.map +1 -1
  164. package/dist/server/src/controllers/authentication.d.ts.map +1 -1
  165. package/dist/server/src/controllers/index.d.ts +3 -0
  166. package/dist/server/src/controllers/index.d.ts.map +1 -1
  167. package/dist/server/src/index.d.ts +8 -0
  168. package/dist/server/src/index.d.ts.map +1 -1
  169. package/dist/server/src/register.d.ts.map +1 -1
  170. package/dist/server/src/routes/admin.d.ts.map +1 -1
  171. package/dist/server/src/services/auth.d.ts +6 -0
  172. package/dist/server/src/services/auth.d.ts.map +1 -1
  173. package/dist/server/src/services/debug-dump.d.ts +9 -0
  174. package/dist/server/src/services/debug-dump.d.ts.map +1 -0
  175. package/dist/server/src/services/index.d.ts +5 -0
  176. package/dist/server/src/services/index.d.ts.map +1 -1
  177. package/dist/server/src/utils/debug-dump/redact.d.ts +8 -0
  178. package/dist/server/src/utils/debug-dump/redact.d.ts.map +1 -0
  179. package/dist/shared/contracts/admin.d.ts +106 -0
  180. package/dist/shared/contracts/admin.d.ts.map +1 -1
  181. package/dist/shared/utils/__tests__/get-project-type.test.d.ts +1 -0
  182. package/dist/shared/utils/__tests__/get-project-type.test.d.ts.map +1 -0
  183. package/dist/shared/utils/get-project-type.d.ts +37 -0
  184. package/dist/shared/utils/get-project-type.d.ts.map +1 -0
  185. package/package.json +8 -8
  186. package/dist/admin/admin/src/utils/getProjectType.js +0 -22
  187. package/dist/admin/admin/src/utils/getProjectType.js.map +0 -1
  188. package/dist/admin/admin/src/utils/getProjectType.mjs +0 -20
  189. package/dist/admin/admin/src/utils/getProjectType.mjs.map +0 -1
  190. package/dist/admin/src/utils/getProjectType.d.ts +0 -16
@@ -1 +1 @@
1
- {"version":3,"file":"AdminSeatInfo.js","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Flex, Tooltip, Typography, Link, Grid } from '@strapi/design-system';\nimport { ExternalLink, WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useSelector } from 'react-redux';\n\nimport { useRBAC } from '../../../../../../../../admin/src/hooks/useRBAC';\nimport { selectAdminPermissions } from '../../../../../../../../admin/src/selectors';\nimport { useLicenseLimits } from '../../../../../hooks/useLicenseLimits';\n\nconst BILLING_SELF_HOSTED_URL = 'mailto:sales@strapi.io';\nconst MANAGE_SUBSCRIPTION_URL = 'https://billing.strapi.io';\n\nexport const AdminSeatInfoEE = () => {\n const { formatMessage } = useIntl();\n const { settings } = useSelector(selectAdminPermissions);\n const {\n isLoading: isRBACLoading,\n allowedActions: { canRead, canCreate, canUpdate, canDelete },\n } = useRBAC(settings?.users ?? {});\n const {\n license,\n isError,\n isLoading: isLicenseLoading,\n } = useLicenseLimits({\n // TODO: this creates a waterfall which we should avoid to render earlier, but for that\n // we will have to move away from data-fetching hooks to query functions.\n // Short-term we could at least implement a loader, for the user to have visual feedback\n // in case the requests take a while\n enabled: !isRBACLoading && canRead && canCreate && canUpdate && canDelete,\n });\n\n const isLoading = isRBACLoading || isLicenseLoading;\n\n if (isError || isLoading || !license) {\n return null;\n }\n\n const { licenseLimitStatus, enforcementUserCount, permittedSeats, type } = license;\n\n if (!permittedSeats) {\n return null;\n }\n\n return (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: 'Settings.application.admin-seats',\n defaultMessage: 'Admin seats',\n })}\n </Typography>\n <Flex gap={2}>\n <Flex>\n <Typography tag=\"p\">\n {formatMessage(\n {\n id: 'Settings.application.ee.admin-seats.count',\n defaultMessage: '<text>{enforcementUserCount}</text>/{permittedSeats}',\n },\n {\n permittedSeats,\n enforcementUserCount,\n text: (chunks: ReactNode) => (\n <Typography\n fontWeight=\"semiBold\"\n textColor={enforcementUserCount > permittedSeats ? 'danger500' : undefined}\n >\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n {licenseLimitStatus === 'OVER_LIMIT' && (\n <Tooltip\n label={formatMessage({\n id: 'Settings.application.ee.admin-seats.at-limit-tooltip',\n defaultMessage: 'At limit: add seats to invite more users',\n })}\n >\n <WarningCircle width=\"1.4rem\" height=\"1.4rem\" fill=\"danger500\" />\n </Tooltip>\n )}\n </Flex>\n {type === 'gold' ? (\n <Link href={BILLING_SELF_HOSTED_URL} endIcon={<ExternalLink />} target=\"_blank\">\n {formatMessage({\n id: 'Settings.application.ee.admin-seats.support',\n defaultMessage: 'Contact sales',\n })}\n </Link>\n ) : (\n <Link href={MANAGE_SUBSCRIPTION_URL} isExternal endIcon={<ExternalLink />} target=\"_blank\">\n {formatMessage({\n id: 'Settings.application.ee.admin-seats.add-seats',\n defaultMessage: 'Manage subscription',\n })}\n </Link>\n )}\n </Grid.Item>\n );\n};\n"],"names":["BILLING_SELF_HOSTED_URL","MANAGE_SUBSCRIPTION_URL","AdminSeatInfoEE","formatMessage","useIntl","settings","useSelector","selectAdminPermissions","isLoading","isRBACLoading","allowedActions","canRead","canCreate","canUpdate","canDelete","useRBAC","users","license","isError","isLicenseLoading","useLicenseLimits","enabled","licenseLimitStatus","enforcementUserCount","permittedSeats","type","_jsxs","Grid","Item","col","xs","direction","alignItems","_jsx","Typography","variant","textColor","id","defaultMessage","Flex","gap","tag","text","chunks","fontWeight","undefined","Tooltip","label","WarningCircle","width","height","fill","Link","href","endIcon","ExternalLink","target","isExternal"],"mappings":"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"}
1
+ {"version":3,"file":"AdminSeatInfo.js","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Flex, Tooltip, Typography } from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useSelector } from 'react-redux';\n\nimport { useRBAC } from '../../../../../../../../admin/src/hooks/useRBAC';\nimport { selectAdminPermissions } from '../../../../../../../../admin/src/selectors';\nimport { useLicenseLimits } from '../../../../../hooks/useLicenseLimits';\n\nexport const AdminSeatInfoEE = () => {\n const { formatMessage } = useIntl();\n const { settings } = useSelector(selectAdminPermissions);\n const {\n isLoading: isRBACLoading,\n allowedActions: { canRead, canCreate, canUpdate, canDelete },\n } = useRBAC(settings?.users ?? {});\n const {\n license,\n isError,\n isLoading: isLicenseLoading,\n } = useLicenseLimits({\n // TODO: this creates a waterfall which we should avoid to render earlier, but for that\n // we will have to move away from data-fetching hooks to query functions.\n // Short-term we could at least implement a loader, for the user to have visual feedback\n // in case the requests take a while\n enabled: !isRBACLoading && canRead && canCreate && canUpdate && canDelete,\n });\n\n const isLoading = isRBACLoading || isLicenseLoading;\n\n if (isError || isLoading || !license) {\n return null;\n }\n\n const { enforcementUserCount, permittedSeats, seats } = license;\n\n // `permittedSeats` is the live enforcement limit and is wiped once the licence stops being\n // usable, so fall back to the retained `seats` to keep showing the count on an expired\n // licence. Enforcement itself (`licenseLimitStatus`, `shouldStopCreate`) still runs off\n // `permittedSeats` server-side and is untouched by this.\n const seatLimit = permittedSeats ?? seats;\n\n if (!seatLimit) {\n return null;\n }\n\n // The red count and the warning follow the same displayed limit. Server-side\n // `licenseLimitStatus` tracks only the live limit, so it is empty once the licence expires.\n const isOverLimit = enforcementUserCount > seatLimit;\n\n return (\n <Flex direction=\"column\" alignItems=\"start\" gap={2}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: 'Settings.application.admin-seats',\n defaultMessage: 'Admin seats',\n })}\n </Typography>\n <Flex gap={2}>\n <Flex>\n <Typography tag=\"p\">\n {formatMessage(\n {\n id: 'Settings.application.ee.admin-seats.count',\n defaultMessage: '<text>{enforcementUserCount}</text>/{permittedSeats}',\n },\n {\n permittedSeats: seatLimit,\n enforcementUserCount,\n text: (chunks: ReactNode) => (\n <Typography\n fontWeight=\"semiBold\"\n textColor={isOverLimit ? 'danger500' : undefined}\n >\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n {isOverLimit && (\n <Tooltip\n label={formatMessage({\n id: 'Settings.application.ee.admin-seats.at-limit-tooltip',\n defaultMessage: 'At limit: add seats to invite more users',\n })}\n >\n <WarningCircle width=\"1.4rem\" height=\"1.4rem\" fill=\"danger500\" />\n </Tooltip>\n )}\n </Flex>\n </Flex>\n );\n};\n"],"names":["AdminSeatInfoEE","formatMessage","useIntl","settings","useSelector","selectAdminPermissions","isLoading","isRBACLoading","allowedActions","canRead","canCreate","canUpdate","canDelete","useRBAC","users","license","isError","isLicenseLoading","useLicenseLimits","enabled","enforcementUserCount","permittedSeats","seats","seatLimit","isOverLimit","_jsxs","Flex","direction","alignItems","gap","_jsx","Typography","variant","textColor","id","defaultMessage","tag","text","chunks","fontWeight","undefined","Tooltip","label","WarningCircle","width","height","fill"],"mappings":";;;;;;;;;;;MAWaA,eAAAA,GAAkB,IAAA;IAC7B,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAM,EAAEC,QAAQ,EAAE,GAAGC,sBAAAA,CAAYC,gCAAAA,CAAAA;AACjC,IAAA,MAAM,EACJC,SAAAA,EAAWC,aAAa,EACxBC,cAAAA,EAAgB,EAAEC,OAAO,EAAEC,SAAS,EAAEC,SAAS,EAAEC,SAAS,EAAE,EAC7D,GAAGC,eAAAA,CAAQV,QAAAA,EAAUW,SAAS,EAAC,CAAA;IAChC,MAAM,EACJC,OAAO,EACPC,OAAO,EACPV,SAAAA,EAAWW,gBAAgB,EAC5B,GAAGC,iCAAAA,CAAiB;;;;;AAKnBC,QAAAA,OAAAA,EAAS,CAACZ,aAAAA,IAAiBE,OAAAA,IAAWC,SAAAA,IAAaC,SAAAA,IAAaC;AAClE,KAAA,CAAA;AAEA,IAAA,MAAMN,YAAYC,aAAAA,IAAiBU,gBAAAA;IAEnC,IAAID,OAAAA,IAAWV,SAAAA,IAAa,CAACS,OAAAA,EAAS;QACpC,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAM,EAAEK,oBAAoB,EAAEC,cAAc,EAAEC,KAAK,EAAE,GAAGP,OAAAA;;;;;AAMxD,IAAA,MAAMQ,YAAYF,cAAAA,IAAkBC,KAAAA;AAEpC,IAAA,IAAI,CAACC,SAAAA,EAAW;QACd,OAAO,IAAA;AACT,IAAA;;;AAIA,IAAA,MAAMC,cAAcJ,oBAAAA,GAAuBG,SAAAA;AAE3C,IAAA,qBACEE,eAAA,CAACC,iBAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,UAAAA,EAAW,OAAA;QAAQC,GAAAA,EAAK,CAAA;;0BAC/CC,cAAA,CAACC,uBAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,OAAA;gBAAQC,SAAAA,EAAU,YAAA;0BACnChC,aAAAA,CAAc;oBACbiC,EAAAA,EAAI,kCAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;;0BAEFV,eAAA,CAACC,iBAAAA,EAAAA;gBAAKG,GAAAA,EAAK,CAAA;;kCACTC,cAAA,CAACJ,iBAAAA,EAAAA;AACC,wBAAA,QAAA,gBAAAI,cAAA,CAACC,uBAAAA,EAAAA;4BAAWK,GAAAA,EAAI,GAAA;sCACbnC,aAAAA,CACC;gCACEiC,EAAAA,EAAI,2CAAA;gCACJC,cAAAA,EAAgB;6BAClB,EACA;gCACEd,cAAAA,EAAgBE,SAAAA;AAChBH,gCAAAA,oBAAAA;gCACAiB,IAAAA,EAAM,CAACC,uBACLR,cAAA,CAACC,uBAAAA,EAAAA;wCACCQ,UAAAA,EAAW,UAAA;AACXN,wCAAAA,SAAAA,EAAWT,cAAc,WAAA,GAAcgB,SAAAA;AAEtCF,wCAAAA,QAAAA,EAAAA;;AAGP,6BAAA;;;AAILd,oBAAAA,WAAAA,kBACCM,cAAA,CAACW,oBAAAA,EAAAA;AACCC,wBAAAA,KAAAA,EAAOzC,aAAAA,CAAc;4BACnBiC,EAAAA,EAAI,sDAAA;4BACJC,cAAAA,EAAgB;AAClB,yBAAA,CAAA;AAEA,wBAAA,QAAA,gBAAAL,cAAA,CAACa,mBAAAA,EAAAA;4BAAcC,KAAAA,EAAM,QAAA;4BAASC,MAAAA,EAAO,QAAA;4BAASC,IAAAA,EAAK;;;;;;;AAM/D;;;;"}
@@ -1,14 +1,12 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { Grid, Typography, Flex, Tooltip, Link } from '@strapi/design-system';
3
- import { WarningCircle, ExternalLink } from '@strapi/icons';
2
+ import { Flex, Typography, Tooltip } from '@strapi/design-system';
3
+ import { WarningCircle } from '@strapi/icons';
4
4
  import { useIntl } from 'react-intl';
5
5
  import { useSelector } from 'react-redux';
6
6
  import { useRBAC } from '../../../../../../../../admin/src/hooks/useRBAC.mjs';
7
7
  import { selectAdminPermissions } from '../../../../../../../../admin/src/selectors.mjs';
8
8
  import { useLicenseLimits } from '../../../../../hooks/useLicenseLimits.mjs';
9
9
 
10
- const BILLING_SELF_HOSTED_URL = 'mailto:sales@strapi.io';
11
- const MANAGE_SUBSCRIPTION_URL = 'https://billing.strapi.io';
12
10
  const AdminSeatInfoEE = ()=>{
13
11
  const { formatMessage } = useIntl();
14
12
  const { settings } = useSelector(selectAdminPermissions);
@@ -24,15 +22,22 @@ const AdminSeatInfoEE = ()=>{
24
22
  if (isError || isLoading || !license) {
25
23
  return null;
26
24
  }
27
- const { licenseLimitStatus, enforcementUserCount, permittedSeats, type } = license;
28
- if (!permittedSeats) {
25
+ const { enforcementUserCount, permittedSeats, seats } = license;
26
+ // `permittedSeats` is the live enforcement limit and is wiped once the licence stops being
27
+ // usable, so fall back to the retained `seats` to keep showing the count on an expired
28
+ // licence. Enforcement itself (`licenseLimitStatus`, `shouldStopCreate`) still runs off
29
+ // `permittedSeats` server-side and is untouched by this.
30
+ const seatLimit = permittedSeats ?? seats;
31
+ if (!seatLimit) {
29
32
  return null;
30
33
  }
31
- return /*#__PURE__*/ jsxs(Grid.Item, {
32
- col: 6,
33
- xs: 12,
34
+ // The red count and the warning follow the same displayed limit. Server-side
35
+ // `licenseLimitStatus` tracks only the live limit, so it is empty once the licence expires.
36
+ const isOverLimit = enforcementUserCount > seatLimit;
37
+ return /*#__PURE__*/ jsxs(Flex, {
34
38
  direction: "column",
35
- alignItems: "stretch",
39
+ alignItems: "start",
40
+ gap: 2,
36
41
  children: [
37
42
  /*#__PURE__*/ jsx(Typography, {
38
43
  variant: "sigma",
@@ -52,17 +57,17 @@ const AdminSeatInfoEE = ()=>{
52
57
  id: 'Settings.application.ee.admin-seats.count',
53
58
  defaultMessage: '<text>{enforcementUserCount}</text>/{permittedSeats}'
54
59
  }, {
55
- permittedSeats,
60
+ permittedSeats: seatLimit,
56
61
  enforcementUserCount,
57
62
  text: (chunks)=>/*#__PURE__*/ jsx(Typography, {
58
63
  fontWeight: "semiBold",
59
- textColor: enforcementUserCount > permittedSeats ? 'danger500' : undefined,
64
+ textColor: isOverLimit ? 'danger500' : undefined,
60
65
  children: chunks
61
66
  })
62
67
  })
63
68
  })
64
69
  }),
65
- licenseLimitStatus === 'OVER_LIMIT' && /*#__PURE__*/ jsx(Tooltip, {
70
+ isOverLimit && /*#__PURE__*/ jsx(Tooltip, {
66
71
  label: formatMessage({
67
72
  id: 'Settings.application.ee.admin-seats.at-limit-tooltip',
68
73
  defaultMessage: 'At limit: add seats to invite more users'
@@ -74,24 +79,6 @@ const AdminSeatInfoEE = ()=>{
74
79
  })
75
80
  })
76
81
  ]
77
- }),
78
- type === 'gold' ? /*#__PURE__*/ jsx(Link, {
79
- href: BILLING_SELF_HOSTED_URL,
80
- endIcon: /*#__PURE__*/ jsx(ExternalLink, {}),
81
- target: "_blank",
82
- children: formatMessage({
83
- id: 'Settings.application.ee.admin-seats.support',
84
- defaultMessage: 'Contact sales'
85
- })
86
- }) : /*#__PURE__*/ jsx(Link, {
87
- href: MANAGE_SUBSCRIPTION_URL,
88
- isExternal: true,
89
- endIcon: /*#__PURE__*/ jsx(ExternalLink, {}),
90
- target: "_blank",
91
- children: formatMessage({
92
- id: 'Settings.application.ee.admin-seats.add-seats',
93
- defaultMessage: 'Manage subscription'
94
- })
95
82
  })
96
83
  ]
97
84
  });
@@ -1 +1 @@
1
- {"version":3,"file":"AdminSeatInfo.mjs","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Flex, Tooltip, Typography, Link, Grid } from '@strapi/design-system';\nimport { ExternalLink, WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useSelector } from 'react-redux';\n\nimport { useRBAC } from '../../../../../../../../admin/src/hooks/useRBAC';\nimport { selectAdminPermissions } from '../../../../../../../../admin/src/selectors';\nimport { useLicenseLimits } from '../../../../../hooks/useLicenseLimits';\n\nconst BILLING_SELF_HOSTED_URL = 'mailto:sales@strapi.io';\nconst MANAGE_SUBSCRIPTION_URL = 'https://billing.strapi.io';\n\nexport const AdminSeatInfoEE = () => {\n const { formatMessage } = useIntl();\n const { settings } = useSelector(selectAdminPermissions);\n const {\n isLoading: isRBACLoading,\n allowedActions: { canRead, canCreate, canUpdate, canDelete },\n } = useRBAC(settings?.users ?? {});\n const {\n license,\n isError,\n isLoading: isLicenseLoading,\n } = useLicenseLimits({\n // TODO: this creates a waterfall which we should avoid to render earlier, but for that\n // we will have to move away from data-fetching hooks to query functions.\n // Short-term we could at least implement a loader, for the user to have visual feedback\n // in case the requests take a while\n enabled: !isRBACLoading && canRead && canCreate && canUpdate && canDelete,\n });\n\n const isLoading = isRBACLoading || isLicenseLoading;\n\n if (isError || isLoading || !license) {\n return null;\n }\n\n const { licenseLimitStatus, enforcementUserCount, permittedSeats, type } = license;\n\n if (!permittedSeats) {\n return null;\n }\n\n return (\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: 'Settings.application.admin-seats',\n defaultMessage: 'Admin seats',\n })}\n </Typography>\n <Flex gap={2}>\n <Flex>\n <Typography tag=\"p\">\n {formatMessage(\n {\n id: 'Settings.application.ee.admin-seats.count',\n defaultMessage: '<text>{enforcementUserCount}</text>/{permittedSeats}',\n },\n {\n permittedSeats,\n enforcementUserCount,\n text: (chunks: ReactNode) => (\n <Typography\n fontWeight=\"semiBold\"\n textColor={enforcementUserCount > permittedSeats ? 'danger500' : undefined}\n >\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n {licenseLimitStatus === 'OVER_LIMIT' && (\n <Tooltip\n label={formatMessage({\n id: 'Settings.application.ee.admin-seats.at-limit-tooltip',\n defaultMessage: 'At limit: add seats to invite more users',\n })}\n >\n <WarningCircle width=\"1.4rem\" height=\"1.4rem\" fill=\"danger500\" />\n </Tooltip>\n )}\n </Flex>\n {type === 'gold' ? (\n <Link href={BILLING_SELF_HOSTED_URL} endIcon={<ExternalLink />} target=\"_blank\">\n {formatMessage({\n id: 'Settings.application.ee.admin-seats.support',\n defaultMessage: 'Contact sales',\n })}\n </Link>\n ) : (\n <Link href={MANAGE_SUBSCRIPTION_URL} isExternal endIcon={<ExternalLink />} target=\"_blank\">\n {formatMessage({\n id: 'Settings.application.ee.admin-seats.add-seats',\n defaultMessage: 'Manage subscription',\n })}\n </Link>\n )}\n </Grid.Item>\n );\n};\n"],"names":["BILLING_SELF_HOSTED_URL","MANAGE_SUBSCRIPTION_URL","AdminSeatInfoEE","formatMessage","useIntl","settings","useSelector","selectAdminPermissions","isLoading","isRBACLoading","allowedActions","canRead","canCreate","canUpdate","canDelete","useRBAC","users","license","isError","isLicenseLoading","useLicenseLimits","enabled","licenseLimitStatus","enforcementUserCount","permittedSeats","type","_jsxs","Grid","Item","col","xs","direction","alignItems","_jsx","Typography","variant","textColor","id","defaultMessage","Flex","gap","tag","text","chunks","fontWeight","undefined","Tooltip","label","WarningCircle","width","height","fill","Link","href","endIcon","ExternalLink","target","isExternal"],"mappings":"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"}
1
+ {"version":3,"file":"AdminSeatInfo.mjs","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\n\nimport { Flex, Tooltip, Typography } from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useSelector } from 'react-redux';\n\nimport { useRBAC } from '../../../../../../../../admin/src/hooks/useRBAC';\nimport { selectAdminPermissions } from '../../../../../../../../admin/src/selectors';\nimport { useLicenseLimits } from '../../../../../hooks/useLicenseLimits';\n\nexport const AdminSeatInfoEE = () => {\n const { formatMessage } = useIntl();\n const { settings } = useSelector(selectAdminPermissions);\n const {\n isLoading: isRBACLoading,\n allowedActions: { canRead, canCreate, canUpdate, canDelete },\n } = useRBAC(settings?.users ?? {});\n const {\n license,\n isError,\n isLoading: isLicenseLoading,\n } = useLicenseLimits({\n // TODO: this creates a waterfall which we should avoid to render earlier, but for that\n // we will have to move away from data-fetching hooks to query functions.\n // Short-term we could at least implement a loader, for the user to have visual feedback\n // in case the requests take a while\n enabled: !isRBACLoading && canRead && canCreate && canUpdate && canDelete,\n });\n\n const isLoading = isRBACLoading || isLicenseLoading;\n\n if (isError || isLoading || !license) {\n return null;\n }\n\n const { enforcementUserCount, permittedSeats, seats } = license;\n\n // `permittedSeats` is the live enforcement limit and is wiped once the licence stops being\n // usable, so fall back to the retained `seats` to keep showing the count on an expired\n // licence. Enforcement itself (`licenseLimitStatus`, `shouldStopCreate`) still runs off\n // `permittedSeats` server-side and is untouched by this.\n const seatLimit = permittedSeats ?? seats;\n\n if (!seatLimit) {\n return null;\n }\n\n // The red count and the warning follow the same displayed limit. Server-side\n // `licenseLimitStatus` tracks only the live limit, so it is empty once the licence expires.\n const isOverLimit = enforcementUserCount > seatLimit;\n\n return (\n <Flex direction=\"column\" alignItems=\"start\" gap={2}>\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: 'Settings.application.admin-seats',\n defaultMessage: 'Admin seats',\n })}\n </Typography>\n <Flex gap={2}>\n <Flex>\n <Typography tag=\"p\">\n {formatMessage(\n {\n id: 'Settings.application.ee.admin-seats.count',\n defaultMessage: '<text>{enforcementUserCount}</text>/{permittedSeats}',\n },\n {\n permittedSeats: seatLimit,\n enforcementUserCount,\n text: (chunks: ReactNode) => (\n <Typography\n fontWeight=\"semiBold\"\n textColor={isOverLimit ? 'danger500' : undefined}\n >\n {chunks}\n </Typography>\n ),\n }\n )}\n </Typography>\n </Flex>\n {isOverLimit && (\n <Tooltip\n label={formatMessage({\n id: 'Settings.application.ee.admin-seats.at-limit-tooltip',\n defaultMessage: 'At limit: add seats to invite more users',\n })}\n >\n <WarningCircle width=\"1.4rem\" height=\"1.4rem\" fill=\"danger500\" />\n </Tooltip>\n )}\n </Flex>\n </Flex>\n );\n};\n"],"names":["AdminSeatInfoEE","formatMessage","useIntl","settings","useSelector","selectAdminPermissions","isLoading","isRBACLoading","allowedActions","canRead","canCreate","canUpdate","canDelete","useRBAC","users","license","isError","isLicenseLoading","useLicenseLimits","enabled","enforcementUserCount","permittedSeats","seats","seatLimit","isOverLimit","_jsxs","Flex","direction","alignItems","gap","_jsx","Typography","variant","textColor","id","defaultMessage","tag","text","chunks","fontWeight","undefined","Tooltip","label","WarningCircle","width","height","fill"],"mappings":";;;;;;;;;MAWaA,eAAAA,GAAkB,IAAA;IAC7B,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM,EAAEC,QAAQ,EAAE,GAAGC,WAAAA,CAAYC,sBAAAA,CAAAA;AACjC,IAAA,MAAM,EACJC,SAAAA,EAAWC,aAAa,EACxBC,cAAAA,EAAgB,EAAEC,OAAO,EAAEC,SAAS,EAAEC,SAAS,EAAEC,SAAS,EAAE,EAC7D,GAAGC,OAAAA,CAAQV,QAAAA,EAAUW,SAAS,EAAC,CAAA;IAChC,MAAM,EACJC,OAAO,EACPC,OAAO,EACPV,SAAAA,EAAWW,gBAAgB,EAC5B,GAAGC,gBAAAA,CAAiB;;;;;AAKnBC,QAAAA,OAAAA,EAAS,CAACZ,aAAAA,IAAiBE,OAAAA,IAAWC,SAAAA,IAAaC,SAAAA,IAAaC;AAClE,KAAA,CAAA;AAEA,IAAA,MAAMN,YAAYC,aAAAA,IAAiBU,gBAAAA;IAEnC,IAAID,OAAAA,IAAWV,SAAAA,IAAa,CAACS,OAAAA,EAAS;QACpC,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAM,EAAEK,oBAAoB,EAAEC,cAAc,EAAEC,KAAK,EAAE,GAAGP,OAAAA;;;;;AAMxD,IAAA,MAAMQ,YAAYF,cAAAA,IAAkBC,KAAAA;AAEpC,IAAA,IAAI,CAACC,SAAAA,EAAW;QACd,OAAO,IAAA;AACT,IAAA;;;AAIA,IAAA,MAAMC,cAAcJ,oBAAAA,GAAuBG,SAAAA;AAE3C,IAAA,qBACEE,IAAA,CAACC,IAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,UAAAA,EAAW,OAAA;QAAQC,GAAAA,EAAK,CAAA;;0BAC/CC,GAAA,CAACC,UAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,OAAA;gBAAQC,SAAAA,EAAU,YAAA;0BACnChC,aAAAA,CAAc;oBACbiC,EAAAA,EAAI,kCAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA;;0BAEFV,IAAA,CAACC,IAAAA,EAAAA;gBAAKG,GAAAA,EAAK,CAAA;;kCACTC,GAAA,CAACJ,IAAAA,EAAAA;AACC,wBAAA,QAAA,gBAAAI,GAAA,CAACC,UAAAA,EAAAA;4BAAWK,GAAAA,EAAI,GAAA;sCACbnC,aAAAA,CACC;gCACEiC,EAAAA,EAAI,2CAAA;gCACJC,cAAAA,EAAgB;6BAClB,EACA;gCACEd,cAAAA,EAAgBE,SAAAA;AAChBH,gCAAAA,oBAAAA;gCACAiB,IAAAA,EAAM,CAACC,uBACLR,GAAA,CAACC,UAAAA,EAAAA;wCACCQ,UAAAA,EAAW,UAAA;AACXN,wCAAAA,SAAAA,EAAWT,cAAc,WAAA,GAAcgB,SAAAA;AAEtCF,wCAAAA,QAAAA,EAAAA;;AAGP,6BAAA;;;AAILd,oBAAAA,WAAAA,kBACCM,GAAA,CAACW,OAAAA,EAAAA;AACCC,wBAAAA,KAAAA,EAAOzC,aAAAA,CAAc;4BACnBiC,EAAAA,EAAI,sDAAA;4BACJC,cAAAA,EAAgB;AAClB,yBAAA,CAAA;AAEA,wBAAA,QAAA,gBAAAL,GAAA,CAACa,aAAAA,EAAAA;4BAAcC,KAAAA,EAAM,QAAA;4BAASC,MAAAA,EAAO,QAAA;4BAASC,IAAAA,EAAK;;;;;;;AAM/D;;;;"}
@@ -0,0 +1,473 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var designSystem = require('@strapi/design-system');
5
+ var icons = require('@strapi/icons');
6
+ var reactIntl = require('react-intl');
7
+ var PlanCard = require('../../../../../../../../admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js');
8
+ var admin = require('../../../../../../../../admin/src/services/admin.js');
9
+ var getProjectType = require('../../../../../../../../shared/utils/get-project-type.js');
10
+ var useLicenseLimits = require('../../../../../hooks/useLicenseLimits.js');
11
+ var AdminSeatInfo = require('./AdminSeatInfo.js');
12
+ var AIUsage = require('./AIUsage.js');
13
+
14
+ // Feature key -> display label. Labels themselves resolve through i18n; only the
15
+ // mapping of known license feature keys lives here.
16
+ const FEATURE_LABELS = {
17
+ sso: {
18
+ id: 'Settings.license.feature.sso',
19
+ defaultMessage: 'Single Sign-On'
20
+ },
21
+ 'cms-advanced-preview': {
22
+ id: 'Settings.license.feature.cms-advanced-preview',
23
+ defaultMessage: 'Live Preview'
24
+ },
25
+ 'cms-content-releases': {
26
+ id: 'Settings.license.feature.cms-content-releases',
27
+ defaultMessage: 'Releases'
28
+ },
29
+ 'review-workflows': {
30
+ id: 'Settings.license.feature.review-workflows',
31
+ defaultMessage: 'Review Workflows'
32
+ },
33
+ 'cms-content-history': {
34
+ id: 'Settings.license.feature.cms-content-history',
35
+ defaultMessage: 'Content History'
36
+ },
37
+ 'audit-logs': {
38
+ id: 'Settings.license.feature.audit-logs',
39
+ defaultMessage: 'Audit Logs'
40
+ }
41
+ };
42
+ // Entitlement limit key -> display label. Only used when a feature has more than one limit and
43
+ // each value needs to be told apart; a single limit is rendered on its own, unlabelled.
44
+ const LIMIT_LABELS = {
45
+ numberOfWorkflows: {
46
+ id: 'Settings.license.limit.numberOfWorkflows',
47
+ defaultMessage: 'Workflows'
48
+ },
49
+ stagesPerWorkflow: {
50
+ id: 'Settings.license.limit.stagesPerWorkflow',
51
+ defaultMessage: 'Stages per workflow'
52
+ },
53
+ maximumReleases: {
54
+ id: 'Settings.license.limit.maximumReleases',
55
+ defaultMessage: 'Releases'
56
+ },
57
+ retentionDays: {
58
+ id: 'Settings.license.limit.retentionDays',
59
+ defaultMessage: 'Retention'
60
+ }
61
+ };
62
+ /**
63
+ * Shown instead of `Active` while a trial is running. Deliberately keyed on an active
64
+ * licence: once a trial lapses the licence stops validating and `isTrial` goes false, so
65
+ * "In Trial" would be claiming a subscription the instance no longer has.
66
+ */ const TRIAL_BADGE = {
67
+ variant: 'alternative',
68
+ label: {
69
+ id: 'Settings.license.status.in-trial',
70
+ defaultMessage: 'In Trial'
71
+ }
72
+ };
73
+ const STATUS_BADGE = {
74
+ active: {
75
+ variant: 'success',
76
+ label: {
77
+ id: 'Settings.license.status.active',
78
+ defaultMessage: 'Active'
79
+ }
80
+ },
81
+ expired: {
82
+ variant: 'danger',
83
+ label: {
84
+ id: 'Settings.license.status.expired',
85
+ defaultMessage: 'Expired'
86
+ }
87
+ },
88
+ unknown: {
89
+ variant: 'warning',
90
+ label: {
91
+ id: 'Settings.license.status.unknown',
92
+ defaultMessage: 'Unknown'
93
+ }
94
+ },
95
+ // A license-gated component only mounts for EE instances, so `none` should never occur here
96
+ // in practice. Fall back to the same treatment as `unknown` rather than rendering nothing.
97
+ none: {
98
+ variant: 'warning',
99
+ label: {
100
+ id: 'Settings.license.status.unknown',
101
+ defaultMessage: 'Unknown'
102
+ }
103
+ }
104
+ };
105
+ /**
106
+ * Absolute dates are rendered as `yyyy/mm/dd` rather than through `formatDate`, so the
107
+ * value is unambiguous in every locale (a locale-ordered `03/04` could be either March 4th
108
+ * or April 3rd). Relative values, like the last license check, stay relative per the design.
109
+ */ const formatAbsoluteDate = (value)=>{
110
+ const date = new Date(value);
111
+ if (Number.isNaN(date.getTime())) {
112
+ return '';
113
+ }
114
+ // UTC, not the local calendar: license dates are UTC-midnight instants, which local getters
115
+ // turn into the previous day anywhere west of UTC.
116
+ const month = `${date.getUTCMonth() + 1}`.padStart(2, '0');
117
+ const day = `${date.getUTCDate()}`.padStart(2, '0');
118
+ return `${date.getUTCFullYear()}/${month}/${day}`;
119
+ };
120
+ const LicenseInfoEE = ()=>{
121
+ const { formatMessage, formatRelativeTime } = reactIntl.useIntl();
122
+ const { license, isLoading, isError } = useLicenseLimits.useLicenseLimits();
123
+ const { data: trialTimeLeft } = admin.useGetLicenseTrialTimeLeftQuery(undefined, {
124
+ skip: !license?.isTrial
125
+ });
126
+ if (isLoading) {
127
+ return null;
128
+ }
129
+ if (isError || !license) {
130
+ return null;
131
+ }
132
+ const { licenseMode, licenseStatus, renewalDate, subscriptionId, lastRegistrySyncAt, expireAt, isTrial, planEntitlements, usingCachedLicense, registrySyncError, registrySyncErrorKind } = license;
133
+ const licensedPlan = getProjectType.getLicensedPlan({
134
+ licenseStatus,
135
+ type: license.type,
136
+ planPriceId: license.planPriceId
137
+ });
138
+ const isGrowth = licensedPlan === 'Growth';
139
+ // Retention is shown in days (the design lists "30 days retention" / "90 days
140
+ // retention"); only sentinel-sized values collapse to years, so a licence with
141
+ // e.g. 1500 days does not read as a meaningless number.
142
+ const formatDays = (value)=>{
143
+ if (value >= 365) {
144
+ return formatMessage({
145
+ id: 'Settings.license.limit.years',
146
+ defaultMessage: '~{years, plural, one {# year} other {# years}}'
147
+ }, {
148
+ years: Math.round(value / 365)
149
+ });
150
+ }
151
+ return formatMessage({
152
+ id: 'Settings.license.limit.days',
153
+ defaultMessage: '{days, plural, one {# day retention} other {# days retention}}'
154
+ }, {
155
+ days: value
156
+ });
157
+ };
158
+ const formatLimitValue = (limit)=>{
159
+ if (limit.value === null) {
160
+ return formatMessage({
161
+ id: 'Settings.license.unlimited',
162
+ defaultMessage: 'Unlimited'
163
+ });
164
+ }
165
+ if (limit.unit === 'days') {
166
+ return formatDays(limit.value);
167
+ }
168
+ return formatMessage({
169
+ id: 'Settings.license.limit.count',
170
+ defaultMessage: '{value, number}'
171
+ }, {
172
+ value: limit.value
173
+ });
174
+ };
175
+ // Shown relative ("2 hours ago") rather than as an absolute timestamp, matching how the rest of
176
+ // the admin surfaces recency.
177
+ const formatLastCheck = (timestamp)=>{
178
+ if (typeof timestamp !== 'number') {
179
+ return formatMessage({
180
+ id: 'Settings.license.checkin.never',
181
+ defaultMessage: 'Not yet'
182
+ });
183
+ }
184
+ const diffMs = timestamp - Date.now();
185
+ // Minutes decide the unit: rounding hours first turned 31 minutes into "1 hour ago".
186
+ const diffMinutes = Math.round(diffMs / (60 * 1000));
187
+ if (Math.abs(diffMinutes) < 60) {
188
+ return formatRelativeTime(diffMinutes, 'minute', {
189
+ numeric: 'auto'
190
+ });
191
+ }
192
+ return formatRelativeTime(Math.round(diffMs / (60 * 60 * 1000)), 'hour', {
193
+ numeric: 'auto'
194
+ });
195
+ };
196
+ const currentPlanValue = licenseMode === 'offline' ? `${licensedPlan} - offline` : licensedPlan;
197
+ const dateLabel = isTrial ? {
198
+ id: 'Settings.license.trial-end-date',
199
+ defaultMessage: 'trial end date'
200
+ } : {
201
+ id: 'Settings.license.renewal-date',
202
+ defaultMessage: 'renewal date'
203
+ };
204
+ const rawDateValue = isTrial ? trialTimeLeft?.trialEndsAt ?? null : renewalDate;
205
+ const formattedDate = rawDateValue ? formatAbsoluteDate(rawDateValue) : null;
206
+ const statusBadge = licenseStatus === 'active' && isTrial ? TRIAL_BADGE : STATUS_BADGE[licenseStatus];
207
+ /**
208
+ * `unknown` covers two very different situations that used to render identically: we could
209
+ * not reach the registry (the licence is probably fine, we are running on the cached copy),
210
+ * or the registry answered and refused the licence. Only the second one needs the customer
211
+ * to do something, so say which it is.
212
+ */ const registryNotice = usingCachedLicense ? {
213
+ id: 'Settings.license.registry.cached',
214
+ defaultMessage: "Couldn't reach the license registry. Showing the last license we retrieved."
215
+ } : // `usingCachedLicense` is false even though the cause was an outage rather than a
216
+ // refusal. Read the recorded kind instead of inferring the cause from the cache.
217
+ registrySyncErrorKind === 'unreachable' && licenseStatus !== 'active' ? {
218
+ id: 'Settings.license.registry.unreachable',
219
+ defaultMessage: "Couldn't reach the license registry."
220
+ } : registrySyncError && licenseStatus !== 'active' ? {
221
+ id: 'Settings.license.registry.rejected',
222
+ defaultMessage: 'The license registry could not validate this license.'
223
+ } : null;
224
+ const checkinLine = licenseMode === 'offline' ? expireAt ? formatMessage({
225
+ id: 'Settings.license.valid-until',
226
+ defaultMessage: 'License valid until {date}'
227
+ }, {
228
+ date: formatAbsoluteDate(expireAt)
229
+ }) : null : formatMessage({
230
+ id: 'Settings.license.last-check',
231
+ defaultMessage: 'Last license validity check {relative}'
232
+ }, {
233
+ relative: formatLastCheck(lastRegistrySyncAt)
234
+ });
235
+ const renderLimitCell = (entitlement)=>{
236
+ const { available, limits } = entitlement;
237
+ if (limits.length === 0) {
238
+ return available ? /*#__PURE__*/ jsxRuntime.jsx(icons.Check, {
239
+ "aria-label": formatMessage({
240
+ id: 'Settings.license.yes',
241
+ defaultMessage: 'Yes'
242
+ }),
243
+ fill: "success600"
244
+ }) : /*#__PURE__*/ jsxRuntime.jsx(icons.Cross, {
245
+ "aria-label": formatMessage({
246
+ id: 'Settings.license.no',
247
+ defaultMessage: 'No'
248
+ }),
249
+ fill: "danger600"
250
+ });
251
+ }
252
+ if (limits.length === 1) {
253
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
254
+ children: formatLimitValue(limits[0])
255
+ });
256
+ }
257
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
258
+ direction: "column",
259
+ alignItems: "end",
260
+ gap: 1,
261
+ children: limits.map((limit)=>/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
262
+ variant: "pi",
263
+ children: LIMIT_LABELS[limit.key] ? `${formatMessage(LIMIT_LABELS[limit.key])}: ${formatLimitValue(limit)}` : formatLimitValue(limit)
264
+ }, limit.key))
265
+ });
266
+ };
267
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
268
+ direction: "column",
269
+ alignItems: "stretch",
270
+ gap: 6,
271
+ children: [
272
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
273
+ alignItems: "flex-start",
274
+ gap: 5,
275
+ tag: "dl",
276
+ children: [
277
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
278
+ direction: "column",
279
+ alignItems: "stretch",
280
+ gap: 5,
281
+ flex: "1",
282
+ children: [
283
+ /*#__PURE__*/ jsxRuntime.jsx(PlanCard.PlanDetail, {
284
+ label: {
285
+ id: 'Settings.application.plan.current',
286
+ defaultMessage: 'current plan'
287
+ },
288
+ value: currentPlanValue
289
+ }),
290
+ !isGrowth && formattedDate && /*#__PURE__*/ jsxRuntime.jsx(PlanCard.PlanDetail, {
291
+ label: dateLabel,
292
+ value: formattedDate
293
+ }),
294
+ /*#__PURE__*/ jsxRuntime.jsx(AdminSeatInfo.AdminSeatInfoEE, {}),
295
+ window.strapi.ai?.enabled !== false && /*#__PURE__*/ jsxRuntime.jsx(AIUsage.AIUsage, {
296
+ isTrial: isTrial
297
+ })
298
+ ]
299
+ }),
300
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
301
+ direction: "column",
302
+ alignItems: "stretch",
303
+ gap: 5,
304
+ flex: "1",
305
+ children: [
306
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
307
+ direction: "column",
308
+ alignItems: "start",
309
+ gap: 2,
310
+ children: [
311
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
312
+ gap: 2,
313
+ alignItems: "center",
314
+ tag: "dt",
315
+ children: [
316
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
317
+ variant: "sigma",
318
+ textColor: "neutral600",
319
+ children: formatMessage({
320
+ id: 'Settings.license.status',
321
+ defaultMessage: 'license status'
322
+ })
323
+ }),
324
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Tooltip, {
325
+ label: formatMessage({
326
+ id: 'Settings.license.status-tooltip',
327
+ defaultMessage: 'Strapi checks the license status every 12 hours and on every build.'
328
+ }),
329
+ children: /*#__PURE__*/ jsxRuntime.jsx(icons.Information, {
330
+ width: "1.4rem",
331
+ height: "1.4rem",
332
+ fill: "neutral500"
333
+ })
334
+ })
335
+ ]
336
+ }),
337
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
338
+ direction: "column",
339
+ alignItems: "start",
340
+ gap: 2,
341
+ tag: "dd",
342
+ children: [
343
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Status, {
344
+ size: "S",
345
+ variant: statusBadge.variant,
346
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
347
+ variant: "omega",
348
+ fontWeight: "bold",
349
+ children: formatMessage(statusBadge.label)
350
+ })
351
+ }),
352
+ checkinLine && /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
353
+ gap: 1,
354
+ alignItems: "center",
355
+ children: [
356
+ /*#__PURE__*/ jsxRuntime.jsx(icons.ClockCounterClockwise, {
357
+ width: "1.2rem",
358
+ height: "1.2rem",
359
+ fill: "neutral500"
360
+ }),
361
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
362
+ variant: "pi",
363
+ textColor: "neutral500",
364
+ children: checkinLine
365
+ })
366
+ ]
367
+ }),
368
+ registryNotice && /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
369
+ gap: 1,
370
+ alignItems: "center",
371
+ children: [
372
+ /*#__PURE__*/ jsxRuntime.jsx(icons.WarningCircle, {
373
+ width: "1.2rem",
374
+ height: "1.2rem",
375
+ fill: "warning600"
376
+ }),
377
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
378
+ variant: "pi",
379
+ textColor: "warning600",
380
+ children: formatMessage(registryNotice)
381
+ })
382
+ ]
383
+ })
384
+ ]
385
+ })
386
+ ]
387
+ }),
388
+ isGrowth && formattedDate && /*#__PURE__*/ jsxRuntime.jsx(PlanCard.PlanDetail, {
389
+ label: dateLabel,
390
+ value: formattedDate
391
+ }),
392
+ subscriptionId && /*#__PURE__*/ jsxRuntime.jsx(PlanCard.PlanDetail, {
393
+ label: {
394
+ id: 'Settings.license.subscription',
395
+ defaultMessage: 'Subscription ID'
396
+ },
397
+ value: subscriptionId
398
+ })
399
+ ]
400
+ })
401
+ ]
402
+ }),
403
+ planEntitlements.length > 0 && /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
404
+ direction: "column",
405
+ alignItems: "stretch",
406
+ gap: 4,
407
+ children: [
408
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Divider, {}),
409
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
410
+ variant: "sigma",
411
+ textColor: "neutral600",
412
+ children: formatMessage({
413
+ id: 'Settings.license.entitlements',
414
+ defaultMessage: 'plan entitlements'
415
+ })
416
+ }),
417
+ /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Table, {
418
+ colCount: 2,
419
+ rowCount: planEntitlements.length,
420
+ children: [
421
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Thead, {
422
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Tr, {
423
+ children: [
424
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Th, {
425
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
426
+ variant: "sigma",
427
+ children: formatMessage({
428
+ id: 'Settings.license.feature',
429
+ defaultMessage: 'Feature'
430
+ })
431
+ })
432
+ }),
433
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Th, {
434
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.VisuallyHidden, {
435
+ children: formatMessage({
436
+ id: 'Settings.license.limit',
437
+ defaultMessage: 'Limit'
438
+ })
439
+ })
440
+ })
441
+ ]
442
+ })
443
+ }),
444
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Tbody, {
445
+ children: planEntitlements.map((entitlement)=>{
446
+ const label = FEATURE_LABELS[entitlement.feature];
447
+ return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Tr, {
448
+ children: [
449
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Td, {
450
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
451
+ children: label ? formatMessage(label) : entitlement.feature
452
+ })
453
+ }),
454
+ /*#__PURE__*/ jsxRuntime.jsx(designSystem.Td, {
455
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
456
+ justifyContent: "flex-end",
457
+ children: renderLimitCell(entitlement)
458
+ })
459
+ })
460
+ ]
461
+ }, entitlement.feature);
462
+ })
463
+ })
464
+ ]
465
+ })
466
+ ]
467
+ })
468
+ ]
469
+ });
470
+ };
471
+
472
+ exports.LicenseInfoEE = LicenseInfoEE;
473
+ //# sourceMappingURL=LicenseInfo.js.map