@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.
- package/dist/admin/admin/src/components/FormInputs/Boolean.js +3 -2
- package/dist/admin/admin/src/components/FormInputs/Boolean.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Boolean.mjs +3 -2
- package/dist/admin/admin/src/components/FormInputs/Boolean.mjs.map +1 -1
- package/dist/admin/admin/src/constants.js +14 -0
- package/dist/admin/admin/src/constants.js.map +1 -1
- package/dist/admin/admin/src/constants.mjs +14 -0
- package/dist/admin/admin/src/constants.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js +6 -12
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs +6 -12
- package/dist/admin/admin/src/pages/Auth/components/ResetPassword.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +10 -2
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +10 -2
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +6 -56
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +6 -56
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js +217 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs +195 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js +185 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs +162 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js +342 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.js.map +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs +320 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.mjs.map +1 -0
- package/dist/admin/admin/src/services/admin.js +11 -1
- package/dist/admin/admin/src/services/admin.js.map +1 -1
- package/dist/admin/admin/src/services/admin.mjs +11 -2
- package/dist/admin/admin/src/services/admin.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +71 -4
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +71 -4
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.js +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.js.map +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.mjs +1 -1
- package/dist/admin/admin/src/utils/browserStrapi.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +24 -0
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs +24 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js +52 -22
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs +53 -23
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js +16 -29
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs +18 -31
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js +473 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.js.map +1 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs +471 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.mjs.map +1 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js +2 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs +2 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.mjs.map +1 -1
- package/dist/admin/index.js +1 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/shared/utils/get-project-type.js +49 -0
- package/dist/admin/shared/utils/get-project-type.js.map +1 -0
- package/dist/admin/shared/utils/get-project-type.mjs +46 -0
- package/dist/admin/shared/utils/get-project-type.mjs.map +1 -0
- package/dist/admin/src/constants.d.ts +10 -0
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/DiagnosticSnapshotModal.d.ts +12 -0
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.d.ts +14 -0
- package/dist/admin/src/pages/Settings/pages/ApplicationInfo/components/SupportCard.d.ts +2 -0
- package/dist/admin/src/services/admin.d.ts +2 -2
- package/dist/admin/src/types/permissions.d.ts +1 -0
- package/dist/admin/src/utils/getFetchClient.d.ts +25 -0
- package/dist/ee/admin/src/hooks/useLicenseLimits.d.ts +29 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AIUsage.d.ts +6 -1
- package/dist/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.d.ts +2 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getActionTypesDefaultMessages.d.ts +2 -0
- package/dist/ee/server/src/audit-logs/entitlements.d.ts +8 -0
- package/dist/ee/server/src/audit-logs/entitlements.d.ts.map +1 -0
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts +16 -0
- package/dist/ee/server/src/audit-logs/services/lifecycles.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/admin.d.ts +36 -10
- package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/index.d.ts +36 -10
- package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
- package/dist/ee/server/src/index.d.ts +36 -10
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/server/ee/server/src/audit-logs/entitlements.js +25 -0
- package/dist/server/ee/server/src/audit-logs/entitlements.js.map +1 -0
- package/dist/server/ee/server/src/audit-logs/entitlements.mjs +23 -0
- package/dist/server/ee/server/src/audit-logs/entitlements.mjs.map +1 -0
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.js +20 -8
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.js.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs +19 -9
- package/dist/server/ee/server/src/audit-logs/services/lifecycles.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.js +76 -3
- package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.mjs +76 -3
- package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +28 -10
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs +28 -10
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs.map +1 -1
- package/dist/server/ee/server/src/index.js +2 -0
- package/dist/server/ee/server/src/index.js.map +1 -1
- package/dist/server/ee/server/src/index.mjs +2 -0
- package/dist/server/ee/server/src/index.mjs.map +1 -1
- package/dist/server/server/src/audit-logs/auth.js +72 -0
- package/dist/server/server/src/audit-logs/auth.js.map +1 -0
- package/dist/server/server/src/audit-logs/auth.mjs +67 -0
- package/dist/server/server/src/audit-logs/auth.mjs.map +1 -0
- package/dist/server/server/src/config/admin-actions.js +7 -0
- package/dist/server/server/src/config/admin-actions.js.map +1 -1
- package/dist/server/server/src/config/admin-actions.mjs +7 -0
- package/dist/server/server/src/config/admin-actions.mjs.map +1 -1
- package/dist/server/server/src/controllers/admin.js +6 -0
- package/dist/server/server/src/controllers/admin.js.map +1 -1
- package/dist/server/server/src/controllers/admin.mjs +6 -0
- package/dist/server/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/server/src/controllers/authentication.js +34 -8
- package/dist/server/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/server/src/controllers/authentication.mjs +34 -8
- package/dist/server/server/src/controllers/authentication.mjs.map +1 -1
- package/dist/server/server/src/register.js +4 -0
- package/dist/server/server/src/register.js.map +1 -1
- package/dist/server/server/src/register.mjs +4 -0
- package/dist/server/server/src/register.mjs.map +1 -1
- package/dist/server/server/src/routes/admin.js +18 -0
- package/dist/server/server/src/routes/admin.js.map +1 -1
- package/dist/server/server/src/routes/admin.mjs +18 -0
- package/dist/server/server/src/routes/admin.mjs.map +1 -1
- package/dist/server/server/src/services/auth.js +4 -2
- package/dist/server/server/src/services/auth.js.map +1 -1
- package/dist/server/server/src/services/auth.mjs +4 -3
- package/dist/server/server/src/services/auth.mjs.map +1 -1
- package/dist/server/server/src/services/debug-dump.js +173 -0
- package/dist/server/server/src/services/debug-dump.js.map +1 -0
- package/dist/server/server/src/services/debug-dump.mjs +166 -0
- package/dist/server/server/src/services/debug-dump.mjs.map +1 -0
- package/dist/server/server/src/services/index.js +3 -1
- package/dist/server/server/src/services/index.js.map +1 -1
- package/dist/server/server/src/services/index.mjs +3 -1
- package/dist/server/server/src/services/index.mjs.map +1 -1
- package/dist/server/server/src/utils/debug-dump/redact.js +197 -0
- package/dist/server/server/src/utils/debug-dump/redact.js.map +1 -0
- package/dist/server/server/src/utils/debug-dump/redact.mjs +194 -0
- package/dist/server/server/src/utils/debug-dump/redact.mjs.map +1 -0
- package/dist/server/shared/utils/get-project-type.js +49 -0
- package/dist/server/shared/utils/get-project-type.js.map +1 -0
- package/dist/server/shared/utils/get-project-type.mjs +46 -0
- package/dist/server/shared/utils/get-project-type.mjs.map +1 -0
- package/dist/server/src/audit-logs/auth.d.ts +72 -0
- package/dist/server/src/audit-logs/auth.d.ts.map +1 -0
- package/dist/server/src/config/admin-actions.d.ts.map +1 -1
- package/dist/server/src/controllers/admin.d.ts +3 -0
- package/dist/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/server/src/controllers/authentication.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +3 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +8 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/services/auth.d.ts +6 -0
- package/dist/server/src/services/auth.d.ts.map +1 -1
- package/dist/server/src/services/debug-dump.d.ts +9 -0
- package/dist/server/src/services/debug-dump.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +5 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/utils/debug-dump/redact.d.ts +8 -0
- package/dist/server/src/utils/debug-dump/redact.d.ts.map +1 -0
- package/dist/shared/contracts/admin.d.ts +106 -0
- package/dist/shared/contracts/admin.d.ts.map +1 -1
- package/dist/shared/utils/__tests__/get-project-type.test.d.ts +1 -0
- package/dist/shared/utils/__tests__/get-project-type.test.d.ts.map +1 -0
- package/dist/shared/utils/get-project-type.d.ts +37 -0
- package/dist/shared/utils/get-project-type.d.ts.map +1 -0
- package/package.json +8 -8
- package/dist/admin/admin/src/utils/getProjectType.js +0 -22
- package/dist/admin/admin/src/utils/getProjectType.js.map +0 -1
- package/dist/admin/admin/src/utils/getProjectType.mjs +0 -20
- package/dist/admin/admin/src/utils/getProjectType.mjs.map +0 -1
- 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
|
|
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 {
|
|
3
|
-
import { WarningCircle
|
|
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 {
|
|
28
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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: "
|
|
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:
|
|
64
|
+
textColor: isOverLimit ? 'danger500' : undefined,
|
|
60
65
|
children: chunks
|
|
61
66
|
})
|
|
62
67
|
})
|
|
63
68
|
})
|
|
64
69
|
}),
|
|
65
|
-
|
|
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
|
|
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
|