@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LicenseInfo.js","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.tsx"],"sourcesContent":["import {\n Divider,\n Flex,\n Status,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tooltip,\n Tr,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Check, ClockCounterClockwise, Cross, Information, WarningCircle } from '@strapi/icons';\nimport { useIntl, type MessageDescriptor } from 'react-intl';\n\nimport { PlanDetail } from '../../../../../../../../admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard';\nimport { useGetLicenseTrialTimeLeftQuery } from '../../../../../../../../admin/src/services/admin';\nimport { getLicensedPlan } from '../../../../../../../../shared/utils/get-project-type';\nimport { useLicenseLimits } from '../../../../../hooks/useLicenseLimits';\n\nimport { AdminSeatInfoEE } from './AdminSeatInfo';\nimport { AIUsage } from './AIUsage';\n\nimport type { GetLicenseLimitInformation } from '../../../../../../../../shared/contracts/admin';\n\n// Feature key -> display label. Labels themselves resolve through i18n; only the\n// mapping of known license feature keys lives here.\nconst FEATURE_LABELS: Record<string, MessageDescriptor> = {\n sso: { id: 'Settings.license.feature.sso', defaultMessage: 'Single Sign-On' },\n 'cms-advanced-preview': {\n id: 'Settings.license.feature.cms-advanced-preview',\n defaultMessage: 'Live Preview',\n },\n 'cms-content-releases': {\n id: 'Settings.license.feature.cms-content-releases',\n defaultMessage: 'Releases',\n },\n 'review-workflows': {\n id: 'Settings.license.feature.review-workflows',\n defaultMessage: 'Review Workflows',\n },\n 'cms-content-history': {\n id: 'Settings.license.feature.cms-content-history',\n defaultMessage: 'Content History',\n },\n 'audit-logs': { id: 'Settings.license.feature.audit-logs', defaultMessage: 'Audit Logs' },\n};\n\n// Entitlement limit key -> display label. Only used when a feature has more than one limit and\n// each value needs to be told apart; a single limit is rendered on its own, unlabelled.\nconst LIMIT_LABELS: Record<string, MessageDescriptor> = {\n numberOfWorkflows: {\n id: 'Settings.license.limit.numberOfWorkflows',\n defaultMessage: 'Workflows',\n },\n stagesPerWorkflow: {\n id: 'Settings.license.limit.stagesPerWorkflow',\n defaultMessage: 'Stages per workflow',\n },\n maximumReleases: { id: 'Settings.license.limit.maximumReleases', defaultMessage: 'Releases' },\n retentionDays: { id: 'Settings.license.limit.retentionDays', defaultMessage: 'Retention' },\n};\n\ntype License = NonNullable<GetLicenseLimitInformation.Response['data']>;\ntype PlanEntitlement = License['planEntitlements'][number];\ntype Limit = PlanEntitlement['limits'][number];\n\ntype StatusBadge = {\n variant: 'success' | 'danger' | 'warning' | 'alternative';\n label: MessageDescriptor;\n};\n\n/**\n * Shown instead of `Active` while a trial is running. Deliberately keyed on an active\n * licence: once a trial lapses the licence stops validating and `isTrial` goes false, so\n * \"In Trial\" would be claiming a subscription the instance no longer has.\n */\nconst TRIAL_BADGE: StatusBadge = {\n variant: 'alternative',\n label: { id: 'Settings.license.status.in-trial', defaultMessage: 'In Trial' },\n};\n\nconst STATUS_BADGE: Record<License['licenseStatus'], StatusBadge> = {\n active: {\n variant: 'success',\n label: { id: 'Settings.license.status.active', defaultMessage: 'Active' },\n },\n expired: {\n variant: 'danger',\n label: { id: 'Settings.license.status.expired', defaultMessage: 'Expired' },\n },\n unknown: {\n variant: 'warning',\n label: { id: 'Settings.license.status.unknown', defaultMessage: 'Unknown' },\n },\n // A license-gated component only mounts for EE instances, so `none` should never occur here\n // in practice. Fall back to the same treatment as `unknown` rather than rendering nothing.\n none: {\n variant: 'warning',\n label: { id: 'Settings.license.status.unknown', defaultMessage: 'Unknown' },\n },\n};\n\n/**\n * Absolute dates are rendered as `yyyy/mm/dd` rather than through `formatDate`, so the\n * value is unambiguous in every locale (a locale-ordered `03/04` could be either March 4th\n * or April 3rd). Relative values, like the last license check, stay relative per the design.\n */\nconst formatAbsoluteDate = (value: string | number): string => {\n const date = new Date(value);\n\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n\n // UTC, not the local calendar: license dates are UTC-midnight instants, which local getters\n // turn into the previous day anywhere west of UTC.\n const month = `${date.getUTCMonth() + 1}`.padStart(2, '0');\n const day = `${date.getUTCDate()}`.padStart(2, '0');\n\n return `${date.getUTCFullYear()}/${month}/${day}`;\n};\n\nconst LicenseInfoEE = () => {\n const { formatMessage, formatRelativeTime } = useIntl();\n const { license, isLoading, isError } = useLicenseLimits();\n const { data: trialTimeLeft } = useGetLicenseTrialTimeLeftQuery(undefined, {\n skip: !license?.isTrial,\n });\n\n if (isLoading) {\n return null;\n }\n\n if (isError || !license) {\n return null;\n }\n\n const {\n licenseMode,\n licenseStatus,\n renewalDate,\n subscriptionId,\n lastRegistrySyncAt,\n expireAt,\n isTrial,\n planEntitlements,\n usingCachedLicense,\n registrySyncError,\n registrySyncErrorKind,\n } = license;\n\n const licensedPlan = getLicensedPlan({\n licenseStatus,\n type: license.type,\n planPriceId: license.planPriceId,\n });\n const isGrowth = licensedPlan === 'Growth';\n\n // Retention is shown in days (the design lists \"30 days retention\" / \"90 days\n // retention\"); only sentinel-sized values collapse to years, so a licence with\n // e.g. 1500 days does not read as a meaningless number.\n const formatDays = (value: number): string => {\n if (value >= 365) {\n return formatMessage(\n {\n id: 'Settings.license.limit.years',\n defaultMessage: '~{years, plural, one {# year} other {# years}}',\n },\n { years: Math.round(value / 365) }\n );\n }\n return formatMessage(\n {\n id: 'Settings.license.limit.days',\n defaultMessage: '{days, plural, one {# day retention} other {# days retention}}',\n },\n { days: value }\n );\n };\n\n const formatLimitValue = (limit: Limit): string => {\n if (limit.value === null) {\n return formatMessage({ id: 'Settings.license.unlimited', defaultMessage: 'Unlimited' });\n }\n if (limit.unit === 'days') {\n return formatDays(limit.value);\n }\n return formatMessage(\n { id: 'Settings.license.limit.count', defaultMessage: '{value, number}' },\n { value: limit.value }\n );\n };\n\n // Shown relative (\"2 hours ago\") rather than as an absolute timestamp, matching how the rest of\n // the admin surfaces recency.\n const formatLastCheck = (timestamp: number | null): string => {\n if (typeof timestamp !== 'number') {\n return formatMessage({ id: 'Settings.license.checkin.never', defaultMessage: 'Not yet' });\n }\n const diffMs = timestamp - Date.now();\n // Minutes decide the unit: rounding hours first turned 31 minutes into \"1 hour ago\".\n const diffMinutes = Math.round(diffMs / (60 * 1000));\n if (Math.abs(diffMinutes) < 60) {\n return formatRelativeTime(diffMinutes, 'minute', { numeric: 'auto' });\n }\n return formatRelativeTime(Math.round(diffMs / (60 * 60 * 1000)), 'hour', { numeric: 'auto' });\n };\n\n const currentPlanValue = licenseMode === 'offline' ? `${licensedPlan} - offline` : licensedPlan;\n\n const dateLabel: MessageDescriptor = isTrial\n ? { id: 'Settings.license.trial-end-date', defaultMessage: 'trial end date' }\n : { id: 'Settings.license.renewal-date', defaultMessage: 'renewal date' };\n\n const rawDateValue = isTrial ? (trialTimeLeft?.trialEndsAt ?? null) : renewalDate;\n\n const formattedDate = rawDateValue ? formatAbsoluteDate(rawDateValue) : null;\n\n const statusBadge =\n licenseStatus === 'active' && isTrial ? TRIAL_BADGE : STATUS_BADGE[licenseStatus];\n\n /**\n * `unknown` covers two very different situations that used to render identically: we could\n * not reach the registry (the licence is probably fine, we are running on the cached copy),\n * or the registry answered and refused the licence. Only the second one needs the customer\n * to do something, so say which it is.\n */\n const registryNotice: MessageDescriptor | null = usingCachedLicense\n ? {\n id: 'Settings.license.registry.cached',\n defaultMessage:\n \"Couldn't reach the license registry. Showing the last license we retrieved.\",\n }\n : // An instance that has never reached the registry has nothing cached, so\n // `usingCachedLicense` is false even though the cause was an outage rather than a\n // refusal. Read the recorded kind instead of inferring the cause from the cache.\n registrySyncErrorKind === 'unreachable' && licenseStatus !== 'active'\n ? {\n id: 'Settings.license.registry.unreachable',\n defaultMessage: \"Couldn't reach the license registry.\",\n }\n : registrySyncError && licenseStatus !== 'active'\n ? {\n id: 'Settings.license.registry.rejected',\n defaultMessage: 'The license registry could not validate this license.',\n }\n : null;\n\n const checkinLine =\n licenseMode === 'offline'\n ? expireAt\n ? formatMessage(\n { id: 'Settings.license.valid-until', defaultMessage: 'License valid until {date}' },\n { date: formatAbsoluteDate(expireAt) }\n )\n : null\n : formatMessage(\n {\n id: 'Settings.license.last-check',\n defaultMessage: 'Last license validity check {relative}',\n },\n { relative: formatLastCheck(lastRegistrySyncAt) }\n );\n\n const renderLimitCell = (entitlement: PlanEntitlement) => {\n const { available, limits } = entitlement;\n\n if (limits.length === 0) {\n return available ? (\n <Check\n aria-label={formatMessage({ id: 'Settings.license.yes', defaultMessage: 'Yes' })}\n fill=\"success600\"\n />\n ) : (\n <Cross\n aria-label={formatMessage({ id: 'Settings.license.no', defaultMessage: 'No' })}\n fill=\"danger600\"\n />\n );\n }\n\n if (limits.length === 1) {\n return <Typography>{formatLimitValue(limits[0])}</Typography>;\n }\n\n return (\n <Flex direction=\"column\" alignItems=\"end\" gap={1}>\n {limits.map((limit) => (\n <Typography key={limit.key} variant=\"pi\">\n {LIMIT_LABELS[limit.key]\n ? `${formatMessage(LIMIT_LABELS[limit.key])}: ${formatLimitValue(limit)}`\n : formatLimitValue(limit)}\n </Typography>\n ))}\n </Flex>\n );\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n <Flex alignItems=\"flex-start\" gap={5} tag=\"dl\">\n <Flex direction=\"column\" alignItems=\"stretch\" gap={5} flex=\"1\">\n <PlanDetail\n label={{ id: 'Settings.application.plan.current', defaultMessage: 'current plan' }}\n value={currentPlanValue}\n />\n {!isGrowth && formattedDate && <PlanDetail label={dateLabel} value={formattedDate} />}\n {/* Not gated on Growth: Enterprise licences can carry a seat limit too. A licence\n without one (including an older licence the registry has not re-issued yet) has a\n null `permittedSeats`, and the component already renders nothing in that case. */}\n <AdminSeatInfoEE />\n {/* Any plan with AI, as before this moved onto the Plan card (AIUsage renders nothing\n without it). The `ai.enabled` gate is kept: without it an instance with AI\n disabled requests usage it cannot have. */}\n {window.strapi.ai?.enabled !== false && <AIUsage isTrial={isTrial} />}\n </Flex>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={5} flex=\"1\">\n <Flex direction=\"column\" alignItems=\"start\" gap={2}>\n <Flex gap={2} alignItems=\"center\" tag=\"dt\">\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: 'Settings.license.status',\n defaultMessage: 'license status',\n })}\n </Typography>\n <Tooltip\n label={formatMessage({\n id: 'Settings.license.status-tooltip',\n defaultMessage:\n 'Strapi checks the license status every 12 hours and on every build.',\n })}\n >\n <Information width=\"1.4rem\" height=\"1.4rem\" fill=\"neutral500\" />\n </Tooltip>\n </Flex>\n <Flex direction=\"column\" alignItems=\"start\" gap={2} tag=\"dd\">\n <Status size=\"S\" variant={statusBadge.variant}>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {formatMessage(statusBadge.label)}\n </Typography>\n </Status>\n {checkinLine && (\n <Flex gap={1} alignItems=\"center\">\n <ClockCounterClockwise width=\"1.2rem\" height=\"1.2rem\" fill=\"neutral500\" />\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {checkinLine}\n </Typography>\n </Flex>\n )}\n {registryNotice && (\n <Flex gap={1} alignItems=\"center\">\n <WarningCircle width=\"1.2rem\" height=\"1.2rem\" fill=\"warning600\" />\n <Typography variant=\"pi\" textColor=\"warning600\">\n {formatMessage(registryNotice)}\n </Typography>\n </Flex>\n )}\n </Flex>\n </Flex>\n {isGrowth && formattedDate && <PlanDetail label={dateLabel} value={formattedDate} />}\n {subscriptionId && (\n <PlanDetail\n label={{ id: 'Settings.license.subscription', defaultMessage: 'Subscription ID' }}\n value={subscriptionId}\n />\n )}\n </Flex>\n </Flex>\n\n {planEntitlements.length > 0 && (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Divider />\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: 'Settings.license.entitlements',\n defaultMessage: 'plan entitlements',\n })}\n </Typography>\n <Table colCount={2} rowCount={planEntitlements.length}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({ id: 'Settings.license.feature', defaultMessage: 'Feature' })}\n </Typography>\n </Th>\n <Th>\n <VisuallyHidden>\n {formatMessage({ id: 'Settings.license.limit', defaultMessage: 'Limit' })}\n </VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {planEntitlements.map((entitlement) => {\n const label = FEATURE_LABELS[entitlement.feature];\n\n return (\n <Tr key={entitlement.feature}>\n <Td>\n <Typography>{label ? formatMessage(label) : entitlement.feature}</Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"flex-end\">{renderLimitCell(entitlement)}</Flex>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport { LicenseInfoEE };\n"],"names":["FEATURE_LABELS","sso","id","defaultMessage","LIMIT_LABELS","numberOfWorkflows","stagesPerWorkflow","maximumReleases","retentionDays","TRIAL_BADGE","variant","label","STATUS_BADGE","active","expired","unknown","none","formatAbsoluteDate","value","date","Date","Number","isNaN","getTime","month","getUTCMonth","padStart","day","getUTCDate","getUTCFullYear","LicenseInfoEE","formatMessage","formatRelativeTime","useIntl","license","isLoading","isError","useLicenseLimits","data","trialTimeLeft","useGetLicenseTrialTimeLeftQuery","undefined","skip","isTrial","licenseMode","licenseStatus","renewalDate","subscriptionId","lastRegistrySyncAt","expireAt","planEntitlements","usingCachedLicense","registrySyncError","registrySyncErrorKind","licensedPlan","getLicensedPlan","type","planPriceId","isGrowth","formatDays","years","Math","round","days","formatLimitValue","limit","unit","formatLastCheck","timestamp","diffMs","now","diffMinutes","abs","numeric","currentPlanValue","dateLabel","rawDateValue","trialEndsAt","formattedDate","statusBadge","registryNotice","checkinLine","relative","renderLimitCell","entitlement","available","limits","length","_jsx","Check","aria-label","fill","Cross","Typography","Flex","direction","alignItems","gap","map","key","_jsxs","tag","flex","PlanDetail","AdminSeatInfoEE","window","strapi","ai","enabled","AIUsage","textColor","Tooltip","Information","width","height","Status","size","fontWeight","ClockCounterClockwise","WarningCircle","Divider","Table","colCount","rowCount","Thead","Tr","Th","VisuallyHidden","Tbody","feature","Td","justifyContent"],"mappings":"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"}
|
|
@@ -0,0 +1,471 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Flex, Typography, Tooltip, Status, Divider, Table, Thead, Tr, Th, VisuallyHidden, Tbody, Td } from '@strapi/design-system';
|
|
3
|
+
import { Information, ClockCounterClockwise, WarningCircle, Check, Cross } from '@strapi/icons';
|
|
4
|
+
import { useIntl } from 'react-intl';
|
|
5
|
+
import { PlanDetail } from '../../../../../../../../admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard.mjs';
|
|
6
|
+
import { useGetLicenseTrialTimeLeftQuery } from '../../../../../../../../admin/src/services/admin.mjs';
|
|
7
|
+
import { getLicensedPlan } from '../../../../../../../../shared/utils/get-project-type.mjs';
|
|
8
|
+
import { useLicenseLimits } from '../../../../../hooks/useLicenseLimits.mjs';
|
|
9
|
+
import { AdminSeatInfoEE } from './AdminSeatInfo.mjs';
|
|
10
|
+
import { AIUsage } from './AIUsage.mjs';
|
|
11
|
+
|
|
12
|
+
// Feature key -> display label. Labels themselves resolve through i18n; only the
|
|
13
|
+
// mapping of known license feature keys lives here.
|
|
14
|
+
const FEATURE_LABELS = {
|
|
15
|
+
sso: {
|
|
16
|
+
id: 'Settings.license.feature.sso',
|
|
17
|
+
defaultMessage: 'Single Sign-On'
|
|
18
|
+
},
|
|
19
|
+
'cms-advanced-preview': {
|
|
20
|
+
id: 'Settings.license.feature.cms-advanced-preview',
|
|
21
|
+
defaultMessage: 'Live Preview'
|
|
22
|
+
},
|
|
23
|
+
'cms-content-releases': {
|
|
24
|
+
id: 'Settings.license.feature.cms-content-releases',
|
|
25
|
+
defaultMessage: 'Releases'
|
|
26
|
+
},
|
|
27
|
+
'review-workflows': {
|
|
28
|
+
id: 'Settings.license.feature.review-workflows',
|
|
29
|
+
defaultMessage: 'Review Workflows'
|
|
30
|
+
},
|
|
31
|
+
'cms-content-history': {
|
|
32
|
+
id: 'Settings.license.feature.cms-content-history',
|
|
33
|
+
defaultMessage: 'Content History'
|
|
34
|
+
},
|
|
35
|
+
'audit-logs': {
|
|
36
|
+
id: 'Settings.license.feature.audit-logs',
|
|
37
|
+
defaultMessage: 'Audit Logs'
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
// Entitlement limit key -> display label. Only used when a feature has more than one limit and
|
|
41
|
+
// each value needs to be told apart; a single limit is rendered on its own, unlabelled.
|
|
42
|
+
const LIMIT_LABELS = {
|
|
43
|
+
numberOfWorkflows: {
|
|
44
|
+
id: 'Settings.license.limit.numberOfWorkflows',
|
|
45
|
+
defaultMessage: 'Workflows'
|
|
46
|
+
},
|
|
47
|
+
stagesPerWorkflow: {
|
|
48
|
+
id: 'Settings.license.limit.stagesPerWorkflow',
|
|
49
|
+
defaultMessage: 'Stages per workflow'
|
|
50
|
+
},
|
|
51
|
+
maximumReleases: {
|
|
52
|
+
id: 'Settings.license.limit.maximumReleases',
|
|
53
|
+
defaultMessage: 'Releases'
|
|
54
|
+
},
|
|
55
|
+
retentionDays: {
|
|
56
|
+
id: 'Settings.license.limit.retentionDays',
|
|
57
|
+
defaultMessage: 'Retention'
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Shown instead of `Active` while a trial is running. Deliberately keyed on an active
|
|
62
|
+
* licence: once a trial lapses the licence stops validating and `isTrial` goes false, so
|
|
63
|
+
* "In Trial" would be claiming a subscription the instance no longer has.
|
|
64
|
+
*/ const TRIAL_BADGE = {
|
|
65
|
+
variant: 'alternative',
|
|
66
|
+
label: {
|
|
67
|
+
id: 'Settings.license.status.in-trial',
|
|
68
|
+
defaultMessage: 'In Trial'
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
const STATUS_BADGE = {
|
|
72
|
+
active: {
|
|
73
|
+
variant: 'success',
|
|
74
|
+
label: {
|
|
75
|
+
id: 'Settings.license.status.active',
|
|
76
|
+
defaultMessage: 'Active'
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
expired: {
|
|
80
|
+
variant: 'danger',
|
|
81
|
+
label: {
|
|
82
|
+
id: 'Settings.license.status.expired',
|
|
83
|
+
defaultMessage: 'Expired'
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
unknown: {
|
|
87
|
+
variant: 'warning',
|
|
88
|
+
label: {
|
|
89
|
+
id: 'Settings.license.status.unknown',
|
|
90
|
+
defaultMessage: 'Unknown'
|
|
91
|
+
}
|
|
92
|
+
},
|
|
93
|
+
// A license-gated component only mounts for EE instances, so `none` should never occur here
|
|
94
|
+
// in practice. Fall back to the same treatment as `unknown` rather than rendering nothing.
|
|
95
|
+
none: {
|
|
96
|
+
variant: 'warning',
|
|
97
|
+
label: {
|
|
98
|
+
id: 'Settings.license.status.unknown',
|
|
99
|
+
defaultMessage: 'Unknown'
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
/**
|
|
104
|
+
* Absolute dates are rendered as `yyyy/mm/dd` rather than through `formatDate`, so the
|
|
105
|
+
* value is unambiguous in every locale (a locale-ordered `03/04` could be either March 4th
|
|
106
|
+
* or April 3rd). Relative values, like the last license check, stay relative per the design.
|
|
107
|
+
*/ const formatAbsoluteDate = (value)=>{
|
|
108
|
+
const date = new Date(value);
|
|
109
|
+
if (Number.isNaN(date.getTime())) {
|
|
110
|
+
return '';
|
|
111
|
+
}
|
|
112
|
+
// UTC, not the local calendar: license dates are UTC-midnight instants, which local getters
|
|
113
|
+
// turn into the previous day anywhere west of UTC.
|
|
114
|
+
const month = `${date.getUTCMonth() + 1}`.padStart(2, '0');
|
|
115
|
+
const day = `${date.getUTCDate()}`.padStart(2, '0');
|
|
116
|
+
return `${date.getUTCFullYear()}/${month}/${day}`;
|
|
117
|
+
};
|
|
118
|
+
const LicenseInfoEE = ()=>{
|
|
119
|
+
const { formatMessage, formatRelativeTime } = useIntl();
|
|
120
|
+
const { license, isLoading, isError } = useLicenseLimits();
|
|
121
|
+
const { data: trialTimeLeft } = useGetLicenseTrialTimeLeftQuery(undefined, {
|
|
122
|
+
skip: !license?.isTrial
|
|
123
|
+
});
|
|
124
|
+
if (isLoading) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
if (isError || !license) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
const { licenseMode, licenseStatus, renewalDate, subscriptionId, lastRegistrySyncAt, expireAt, isTrial, planEntitlements, usingCachedLicense, registrySyncError, registrySyncErrorKind } = license;
|
|
131
|
+
const licensedPlan = getLicensedPlan({
|
|
132
|
+
licenseStatus,
|
|
133
|
+
type: license.type,
|
|
134
|
+
planPriceId: license.planPriceId
|
|
135
|
+
});
|
|
136
|
+
const isGrowth = licensedPlan === 'Growth';
|
|
137
|
+
// Retention is shown in days (the design lists "30 days retention" / "90 days
|
|
138
|
+
// retention"); only sentinel-sized values collapse to years, so a licence with
|
|
139
|
+
// e.g. 1500 days does not read as a meaningless number.
|
|
140
|
+
const formatDays = (value)=>{
|
|
141
|
+
if (value >= 365) {
|
|
142
|
+
return formatMessage({
|
|
143
|
+
id: 'Settings.license.limit.years',
|
|
144
|
+
defaultMessage: '~{years, plural, one {# year} other {# years}}'
|
|
145
|
+
}, {
|
|
146
|
+
years: Math.round(value / 365)
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
return formatMessage({
|
|
150
|
+
id: 'Settings.license.limit.days',
|
|
151
|
+
defaultMessage: '{days, plural, one {# day retention} other {# days retention}}'
|
|
152
|
+
}, {
|
|
153
|
+
days: value
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
const formatLimitValue = (limit)=>{
|
|
157
|
+
if (limit.value === null) {
|
|
158
|
+
return formatMessage({
|
|
159
|
+
id: 'Settings.license.unlimited',
|
|
160
|
+
defaultMessage: 'Unlimited'
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
if (limit.unit === 'days') {
|
|
164
|
+
return formatDays(limit.value);
|
|
165
|
+
}
|
|
166
|
+
return formatMessage({
|
|
167
|
+
id: 'Settings.license.limit.count',
|
|
168
|
+
defaultMessage: '{value, number}'
|
|
169
|
+
}, {
|
|
170
|
+
value: limit.value
|
|
171
|
+
});
|
|
172
|
+
};
|
|
173
|
+
// Shown relative ("2 hours ago") rather than as an absolute timestamp, matching how the rest of
|
|
174
|
+
// the admin surfaces recency.
|
|
175
|
+
const formatLastCheck = (timestamp)=>{
|
|
176
|
+
if (typeof timestamp !== 'number') {
|
|
177
|
+
return formatMessage({
|
|
178
|
+
id: 'Settings.license.checkin.never',
|
|
179
|
+
defaultMessage: 'Not yet'
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
const diffMs = timestamp - Date.now();
|
|
183
|
+
// Minutes decide the unit: rounding hours first turned 31 minutes into "1 hour ago".
|
|
184
|
+
const diffMinutes = Math.round(diffMs / (60 * 1000));
|
|
185
|
+
if (Math.abs(diffMinutes) < 60) {
|
|
186
|
+
return formatRelativeTime(diffMinutes, 'minute', {
|
|
187
|
+
numeric: 'auto'
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
return formatRelativeTime(Math.round(diffMs / (60 * 60 * 1000)), 'hour', {
|
|
191
|
+
numeric: 'auto'
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
const currentPlanValue = licenseMode === 'offline' ? `${licensedPlan} - offline` : licensedPlan;
|
|
195
|
+
const dateLabel = isTrial ? {
|
|
196
|
+
id: 'Settings.license.trial-end-date',
|
|
197
|
+
defaultMessage: 'trial end date'
|
|
198
|
+
} : {
|
|
199
|
+
id: 'Settings.license.renewal-date',
|
|
200
|
+
defaultMessage: 'renewal date'
|
|
201
|
+
};
|
|
202
|
+
const rawDateValue = isTrial ? trialTimeLeft?.trialEndsAt ?? null : renewalDate;
|
|
203
|
+
const formattedDate = rawDateValue ? formatAbsoluteDate(rawDateValue) : null;
|
|
204
|
+
const statusBadge = licenseStatus === 'active' && isTrial ? TRIAL_BADGE : STATUS_BADGE[licenseStatus];
|
|
205
|
+
/**
|
|
206
|
+
* `unknown` covers two very different situations that used to render identically: we could
|
|
207
|
+
* not reach the registry (the licence is probably fine, we are running on the cached copy),
|
|
208
|
+
* or the registry answered and refused the licence. Only the second one needs the customer
|
|
209
|
+
* to do something, so say which it is.
|
|
210
|
+
*/ const registryNotice = usingCachedLicense ? {
|
|
211
|
+
id: 'Settings.license.registry.cached',
|
|
212
|
+
defaultMessage: "Couldn't reach the license registry. Showing the last license we retrieved."
|
|
213
|
+
} : // `usingCachedLicense` is false even though the cause was an outage rather than a
|
|
214
|
+
// refusal. Read the recorded kind instead of inferring the cause from the cache.
|
|
215
|
+
registrySyncErrorKind === 'unreachable' && licenseStatus !== 'active' ? {
|
|
216
|
+
id: 'Settings.license.registry.unreachable',
|
|
217
|
+
defaultMessage: "Couldn't reach the license registry."
|
|
218
|
+
} : registrySyncError && licenseStatus !== 'active' ? {
|
|
219
|
+
id: 'Settings.license.registry.rejected',
|
|
220
|
+
defaultMessage: 'The license registry could not validate this license.'
|
|
221
|
+
} : null;
|
|
222
|
+
const checkinLine = licenseMode === 'offline' ? expireAt ? formatMessage({
|
|
223
|
+
id: 'Settings.license.valid-until',
|
|
224
|
+
defaultMessage: 'License valid until {date}'
|
|
225
|
+
}, {
|
|
226
|
+
date: formatAbsoluteDate(expireAt)
|
|
227
|
+
}) : null : formatMessage({
|
|
228
|
+
id: 'Settings.license.last-check',
|
|
229
|
+
defaultMessage: 'Last license validity check {relative}'
|
|
230
|
+
}, {
|
|
231
|
+
relative: formatLastCheck(lastRegistrySyncAt)
|
|
232
|
+
});
|
|
233
|
+
const renderLimitCell = (entitlement)=>{
|
|
234
|
+
const { available, limits } = entitlement;
|
|
235
|
+
if (limits.length === 0) {
|
|
236
|
+
return available ? /*#__PURE__*/ jsx(Check, {
|
|
237
|
+
"aria-label": formatMessage({
|
|
238
|
+
id: 'Settings.license.yes',
|
|
239
|
+
defaultMessage: 'Yes'
|
|
240
|
+
}),
|
|
241
|
+
fill: "success600"
|
|
242
|
+
}) : /*#__PURE__*/ jsx(Cross, {
|
|
243
|
+
"aria-label": formatMessage({
|
|
244
|
+
id: 'Settings.license.no',
|
|
245
|
+
defaultMessage: 'No'
|
|
246
|
+
}),
|
|
247
|
+
fill: "danger600"
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
if (limits.length === 1) {
|
|
251
|
+
return /*#__PURE__*/ jsx(Typography, {
|
|
252
|
+
children: formatLimitValue(limits[0])
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
return /*#__PURE__*/ jsx(Flex, {
|
|
256
|
+
direction: "column",
|
|
257
|
+
alignItems: "end",
|
|
258
|
+
gap: 1,
|
|
259
|
+
children: limits.map((limit)=>/*#__PURE__*/ jsx(Typography, {
|
|
260
|
+
variant: "pi",
|
|
261
|
+
children: LIMIT_LABELS[limit.key] ? `${formatMessage(LIMIT_LABELS[limit.key])}: ${formatLimitValue(limit)}` : formatLimitValue(limit)
|
|
262
|
+
}, limit.key))
|
|
263
|
+
});
|
|
264
|
+
};
|
|
265
|
+
return /*#__PURE__*/ jsxs(Flex, {
|
|
266
|
+
direction: "column",
|
|
267
|
+
alignItems: "stretch",
|
|
268
|
+
gap: 6,
|
|
269
|
+
children: [
|
|
270
|
+
/*#__PURE__*/ jsxs(Flex, {
|
|
271
|
+
alignItems: "flex-start",
|
|
272
|
+
gap: 5,
|
|
273
|
+
tag: "dl",
|
|
274
|
+
children: [
|
|
275
|
+
/*#__PURE__*/ jsxs(Flex, {
|
|
276
|
+
direction: "column",
|
|
277
|
+
alignItems: "stretch",
|
|
278
|
+
gap: 5,
|
|
279
|
+
flex: "1",
|
|
280
|
+
children: [
|
|
281
|
+
/*#__PURE__*/ jsx(PlanDetail, {
|
|
282
|
+
label: {
|
|
283
|
+
id: 'Settings.application.plan.current',
|
|
284
|
+
defaultMessage: 'current plan'
|
|
285
|
+
},
|
|
286
|
+
value: currentPlanValue
|
|
287
|
+
}),
|
|
288
|
+
!isGrowth && formattedDate && /*#__PURE__*/ jsx(PlanDetail, {
|
|
289
|
+
label: dateLabel,
|
|
290
|
+
value: formattedDate
|
|
291
|
+
}),
|
|
292
|
+
/*#__PURE__*/ jsx(AdminSeatInfoEE, {}),
|
|
293
|
+
window.strapi.ai?.enabled !== false && /*#__PURE__*/ jsx(AIUsage, {
|
|
294
|
+
isTrial: isTrial
|
|
295
|
+
})
|
|
296
|
+
]
|
|
297
|
+
}),
|
|
298
|
+
/*#__PURE__*/ jsxs(Flex, {
|
|
299
|
+
direction: "column",
|
|
300
|
+
alignItems: "stretch",
|
|
301
|
+
gap: 5,
|
|
302
|
+
flex: "1",
|
|
303
|
+
children: [
|
|
304
|
+
/*#__PURE__*/ jsxs(Flex, {
|
|
305
|
+
direction: "column",
|
|
306
|
+
alignItems: "start",
|
|
307
|
+
gap: 2,
|
|
308
|
+
children: [
|
|
309
|
+
/*#__PURE__*/ jsxs(Flex, {
|
|
310
|
+
gap: 2,
|
|
311
|
+
alignItems: "center",
|
|
312
|
+
tag: "dt",
|
|
313
|
+
children: [
|
|
314
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
315
|
+
variant: "sigma",
|
|
316
|
+
textColor: "neutral600",
|
|
317
|
+
children: formatMessage({
|
|
318
|
+
id: 'Settings.license.status',
|
|
319
|
+
defaultMessage: 'license status'
|
|
320
|
+
})
|
|
321
|
+
}),
|
|
322
|
+
/*#__PURE__*/ jsx(Tooltip, {
|
|
323
|
+
label: formatMessage({
|
|
324
|
+
id: 'Settings.license.status-tooltip',
|
|
325
|
+
defaultMessage: 'Strapi checks the license status every 12 hours and on every build.'
|
|
326
|
+
}),
|
|
327
|
+
children: /*#__PURE__*/ jsx(Information, {
|
|
328
|
+
width: "1.4rem",
|
|
329
|
+
height: "1.4rem",
|
|
330
|
+
fill: "neutral500"
|
|
331
|
+
})
|
|
332
|
+
})
|
|
333
|
+
]
|
|
334
|
+
}),
|
|
335
|
+
/*#__PURE__*/ jsxs(Flex, {
|
|
336
|
+
direction: "column",
|
|
337
|
+
alignItems: "start",
|
|
338
|
+
gap: 2,
|
|
339
|
+
tag: "dd",
|
|
340
|
+
children: [
|
|
341
|
+
/*#__PURE__*/ jsx(Status, {
|
|
342
|
+
size: "S",
|
|
343
|
+
variant: statusBadge.variant,
|
|
344
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
345
|
+
variant: "omega",
|
|
346
|
+
fontWeight: "bold",
|
|
347
|
+
children: formatMessage(statusBadge.label)
|
|
348
|
+
})
|
|
349
|
+
}),
|
|
350
|
+
checkinLine && /*#__PURE__*/ jsxs(Flex, {
|
|
351
|
+
gap: 1,
|
|
352
|
+
alignItems: "center",
|
|
353
|
+
children: [
|
|
354
|
+
/*#__PURE__*/ jsx(ClockCounterClockwise, {
|
|
355
|
+
width: "1.2rem",
|
|
356
|
+
height: "1.2rem",
|
|
357
|
+
fill: "neutral500"
|
|
358
|
+
}),
|
|
359
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
360
|
+
variant: "pi",
|
|
361
|
+
textColor: "neutral500",
|
|
362
|
+
children: checkinLine
|
|
363
|
+
})
|
|
364
|
+
]
|
|
365
|
+
}),
|
|
366
|
+
registryNotice && /*#__PURE__*/ jsxs(Flex, {
|
|
367
|
+
gap: 1,
|
|
368
|
+
alignItems: "center",
|
|
369
|
+
children: [
|
|
370
|
+
/*#__PURE__*/ jsx(WarningCircle, {
|
|
371
|
+
width: "1.2rem",
|
|
372
|
+
height: "1.2rem",
|
|
373
|
+
fill: "warning600"
|
|
374
|
+
}),
|
|
375
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
376
|
+
variant: "pi",
|
|
377
|
+
textColor: "warning600",
|
|
378
|
+
children: formatMessage(registryNotice)
|
|
379
|
+
})
|
|
380
|
+
]
|
|
381
|
+
})
|
|
382
|
+
]
|
|
383
|
+
})
|
|
384
|
+
]
|
|
385
|
+
}),
|
|
386
|
+
isGrowth && formattedDate && /*#__PURE__*/ jsx(PlanDetail, {
|
|
387
|
+
label: dateLabel,
|
|
388
|
+
value: formattedDate
|
|
389
|
+
}),
|
|
390
|
+
subscriptionId && /*#__PURE__*/ jsx(PlanDetail, {
|
|
391
|
+
label: {
|
|
392
|
+
id: 'Settings.license.subscription',
|
|
393
|
+
defaultMessage: 'Subscription ID'
|
|
394
|
+
},
|
|
395
|
+
value: subscriptionId
|
|
396
|
+
})
|
|
397
|
+
]
|
|
398
|
+
})
|
|
399
|
+
]
|
|
400
|
+
}),
|
|
401
|
+
planEntitlements.length > 0 && /*#__PURE__*/ jsxs(Flex, {
|
|
402
|
+
direction: "column",
|
|
403
|
+
alignItems: "stretch",
|
|
404
|
+
gap: 4,
|
|
405
|
+
children: [
|
|
406
|
+
/*#__PURE__*/ jsx(Divider, {}),
|
|
407
|
+
/*#__PURE__*/ jsx(Typography, {
|
|
408
|
+
variant: "sigma",
|
|
409
|
+
textColor: "neutral600",
|
|
410
|
+
children: formatMessage({
|
|
411
|
+
id: 'Settings.license.entitlements',
|
|
412
|
+
defaultMessage: 'plan entitlements'
|
|
413
|
+
})
|
|
414
|
+
}),
|
|
415
|
+
/*#__PURE__*/ jsxs(Table, {
|
|
416
|
+
colCount: 2,
|
|
417
|
+
rowCount: planEntitlements.length,
|
|
418
|
+
children: [
|
|
419
|
+
/*#__PURE__*/ jsx(Thead, {
|
|
420
|
+
children: /*#__PURE__*/ jsxs(Tr, {
|
|
421
|
+
children: [
|
|
422
|
+
/*#__PURE__*/ jsx(Th, {
|
|
423
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
424
|
+
variant: "sigma",
|
|
425
|
+
children: formatMessage({
|
|
426
|
+
id: 'Settings.license.feature',
|
|
427
|
+
defaultMessage: 'Feature'
|
|
428
|
+
})
|
|
429
|
+
})
|
|
430
|
+
}),
|
|
431
|
+
/*#__PURE__*/ jsx(Th, {
|
|
432
|
+
children: /*#__PURE__*/ jsx(VisuallyHidden, {
|
|
433
|
+
children: formatMessage({
|
|
434
|
+
id: 'Settings.license.limit',
|
|
435
|
+
defaultMessage: 'Limit'
|
|
436
|
+
})
|
|
437
|
+
})
|
|
438
|
+
})
|
|
439
|
+
]
|
|
440
|
+
})
|
|
441
|
+
}),
|
|
442
|
+
/*#__PURE__*/ jsx(Tbody, {
|
|
443
|
+
children: planEntitlements.map((entitlement)=>{
|
|
444
|
+
const label = FEATURE_LABELS[entitlement.feature];
|
|
445
|
+
return /*#__PURE__*/ jsxs(Tr, {
|
|
446
|
+
children: [
|
|
447
|
+
/*#__PURE__*/ jsx(Td, {
|
|
448
|
+
children: /*#__PURE__*/ jsx(Typography, {
|
|
449
|
+
children: label ? formatMessage(label) : entitlement.feature
|
|
450
|
+
})
|
|
451
|
+
}),
|
|
452
|
+
/*#__PURE__*/ jsx(Td, {
|
|
453
|
+
children: /*#__PURE__*/ jsx(Flex, {
|
|
454
|
+
justifyContent: "flex-end",
|
|
455
|
+
children: renderLimitCell(entitlement)
|
|
456
|
+
})
|
|
457
|
+
})
|
|
458
|
+
]
|
|
459
|
+
}, entitlement.feature);
|
|
460
|
+
})
|
|
461
|
+
})
|
|
462
|
+
]
|
|
463
|
+
})
|
|
464
|
+
]
|
|
465
|
+
})
|
|
466
|
+
]
|
|
467
|
+
});
|
|
468
|
+
};
|
|
469
|
+
|
|
470
|
+
export { LicenseInfoEE };
|
|
471
|
+
//# sourceMappingURL=LicenseInfo.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LicenseInfo.mjs","sources":["../../../../../../../../../../ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/LicenseInfo.tsx"],"sourcesContent":["import {\n Divider,\n Flex,\n Status,\n Table,\n Tbody,\n Td,\n Th,\n Thead,\n Tooltip,\n Tr,\n Typography,\n VisuallyHidden,\n} from '@strapi/design-system';\nimport { Check, ClockCounterClockwise, Cross, Information, WarningCircle } from '@strapi/icons';\nimport { useIntl, type MessageDescriptor } from 'react-intl';\n\nimport { PlanDetail } from '../../../../../../../../admin/src/pages/Settings/pages/ApplicationInfo/components/PlanCard';\nimport { useGetLicenseTrialTimeLeftQuery } from '../../../../../../../../admin/src/services/admin';\nimport { getLicensedPlan } from '../../../../../../../../shared/utils/get-project-type';\nimport { useLicenseLimits } from '../../../../../hooks/useLicenseLimits';\n\nimport { AdminSeatInfoEE } from './AdminSeatInfo';\nimport { AIUsage } from './AIUsage';\n\nimport type { GetLicenseLimitInformation } from '../../../../../../../../shared/contracts/admin';\n\n// Feature key -> display label. Labels themselves resolve through i18n; only the\n// mapping of known license feature keys lives here.\nconst FEATURE_LABELS: Record<string, MessageDescriptor> = {\n sso: { id: 'Settings.license.feature.sso', defaultMessage: 'Single Sign-On' },\n 'cms-advanced-preview': {\n id: 'Settings.license.feature.cms-advanced-preview',\n defaultMessage: 'Live Preview',\n },\n 'cms-content-releases': {\n id: 'Settings.license.feature.cms-content-releases',\n defaultMessage: 'Releases',\n },\n 'review-workflows': {\n id: 'Settings.license.feature.review-workflows',\n defaultMessage: 'Review Workflows',\n },\n 'cms-content-history': {\n id: 'Settings.license.feature.cms-content-history',\n defaultMessage: 'Content History',\n },\n 'audit-logs': { id: 'Settings.license.feature.audit-logs', defaultMessage: 'Audit Logs' },\n};\n\n// Entitlement limit key -> display label. Only used when a feature has more than one limit and\n// each value needs to be told apart; a single limit is rendered on its own, unlabelled.\nconst LIMIT_LABELS: Record<string, MessageDescriptor> = {\n numberOfWorkflows: {\n id: 'Settings.license.limit.numberOfWorkflows',\n defaultMessage: 'Workflows',\n },\n stagesPerWorkflow: {\n id: 'Settings.license.limit.stagesPerWorkflow',\n defaultMessage: 'Stages per workflow',\n },\n maximumReleases: { id: 'Settings.license.limit.maximumReleases', defaultMessage: 'Releases' },\n retentionDays: { id: 'Settings.license.limit.retentionDays', defaultMessage: 'Retention' },\n};\n\ntype License = NonNullable<GetLicenseLimitInformation.Response['data']>;\ntype PlanEntitlement = License['planEntitlements'][number];\ntype Limit = PlanEntitlement['limits'][number];\n\ntype StatusBadge = {\n variant: 'success' | 'danger' | 'warning' | 'alternative';\n label: MessageDescriptor;\n};\n\n/**\n * Shown instead of `Active` while a trial is running. Deliberately keyed on an active\n * licence: once a trial lapses the licence stops validating and `isTrial` goes false, so\n * \"In Trial\" would be claiming a subscription the instance no longer has.\n */\nconst TRIAL_BADGE: StatusBadge = {\n variant: 'alternative',\n label: { id: 'Settings.license.status.in-trial', defaultMessage: 'In Trial' },\n};\n\nconst STATUS_BADGE: Record<License['licenseStatus'], StatusBadge> = {\n active: {\n variant: 'success',\n label: { id: 'Settings.license.status.active', defaultMessage: 'Active' },\n },\n expired: {\n variant: 'danger',\n label: { id: 'Settings.license.status.expired', defaultMessage: 'Expired' },\n },\n unknown: {\n variant: 'warning',\n label: { id: 'Settings.license.status.unknown', defaultMessage: 'Unknown' },\n },\n // A license-gated component only mounts for EE instances, so `none` should never occur here\n // in practice. Fall back to the same treatment as `unknown` rather than rendering nothing.\n none: {\n variant: 'warning',\n label: { id: 'Settings.license.status.unknown', defaultMessage: 'Unknown' },\n },\n};\n\n/**\n * Absolute dates are rendered as `yyyy/mm/dd` rather than through `formatDate`, so the\n * value is unambiguous in every locale (a locale-ordered `03/04` could be either March 4th\n * or April 3rd). Relative values, like the last license check, stay relative per the design.\n */\nconst formatAbsoluteDate = (value: string | number): string => {\n const date = new Date(value);\n\n if (Number.isNaN(date.getTime())) {\n return '';\n }\n\n // UTC, not the local calendar: license dates are UTC-midnight instants, which local getters\n // turn into the previous day anywhere west of UTC.\n const month = `${date.getUTCMonth() + 1}`.padStart(2, '0');\n const day = `${date.getUTCDate()}`.padStart(2, '0');\n\n return `${date.getUTCFullYear()}/${month}/${day}`;\n};\n\nconst LicenseInfoEE = () => {\n const { formatMessage, formatRelativeTime } = useIntl();\n const { license, isLoading, isError } = useLicenseLimits();\n const { data: trialTimeLeft } = useGetLicenseTrialTimeLeftQuery(undefined, {\n skip: !license?.isTrial,\n });\n\n if (isLoading) {\n return null;\n }\n\n if (isError || !license) {\n return null;\n }\n\n const {\n licenseMode,\n licenseStatus,\n renewalDate,\n subscriptionId,\n lastRegistrySyncAt,\n expireAt,\n isTrial,\n planEntitlements,\n usingCachedLicense,\n registrySyncError,\n registrySyncErrorKind,\n } = license;\n\n const licensedPlan = getLicensedPlan({\n licenseStatus,\n type: license.type,\n planPriceId: license.planPriceId,\n });\n const isGrowth = licensedPlan === 'Growth';\n\n // Retention is shown in days (the design lists \"30 days retention\" / \"90 days\n // retention\"); only sentinel-sized values collapse to years, so a licence with\n // e.g. 1500 days does not read as a meaningless number.\n const formatDays = (value: number): string => {\n if (value >= 365) {\n return formatMessage(\n {\n id: 'Settings.license.limit.years',\n defaultMessage: '~{years, plural, one {# year} other {# years}}',\n },\n { years: Math.round(value / 365) }\n );\n }\n return formatMessage(\n {\n id: 'Settings.license.limit.days',\n defaultMessage: '{days, plural, one {# day retention} other {# days retention}}',\n },\n { days: value }\n );\n };\n\n const formatLimitValue = (limit: Limit): string => {\n if (limit.value === null) {\n return formatMessage({ id: 'Settings.license.unlimited', defaultMessage: 'Unlimited' });\n }\n if (limit.unit === 'days') {\n return formatDays(limit.value);\n }\n return formatMessage(\n { id: 'Settings.license.limit.count', defaultMessage: '{value, number}' },\n { value: limit.value }\n );\n };\n\n // Shown relative (\"2 hours ago\") rather than as an absolute timestamp, matching how the rest of\n // the admin surfaces recency.\n const formatLastCheck = (timestamp: number | null): string => {\n if (typeof timestamp !== 'number') {\n return formatMessage({ id: 'Settings.license.checkin.never', defaultMessage: 'Not yet' });\n }\n const diffMs = timestamp - Date.now();\n // Minutes decide the unit: rounding hours first turned 31 minutes into \"1 hour ago\".\n const diffMinutes = Math.round(diffMs / (60 * 1000));\n if (Math.abs(diffMinutes) < 60) {\n return formatRelativeTime(diffMinutes, 'minute', { numeric: 'auto' });\n }\n return formatRelativeTime(Math.round(diffMs / (60 * 60 * 1000)), 'hour', { numeric: 'auto' });\n };\n\n const currentPlanValue = licenseMode === 'offline' ? `${licensedPlan} - offline` : licensedPlan;\n\n const dateLabel: MessageDescriptor = isTrial\n ? { id: 'Settings.license.trial-end-date', defaultMessage: 'trial end date' }\n : { id: 'Settings.license.renewal-date', defaultMessage: 'renewal date' };\n\n const rawDateValue = isTrial ? (trialTimeLeft?.trialEndsAt ?? null) : renewalDate;\n\n const formattedDate = rawDateValue ? formatAbsoluteDate(rawDateValue) : null;\n\n const statusBadge =\n licenseStatus === 'active' && isTrial ? TRIAL_BADGE : STATUS_BADGE[licenseStatus];\n\n /**\n * `unknown` covers two very different situations that used to render identically: we could\n * not reach the registry (the licence is probably fine, we are running on the cached copy),\n * or the registry answered and refused the licence. Only the second one needs the customer\n * to do something, so say which it is.\n */\n const registryNotice: MessageDescriptor | null = usingCachedLicense\n ? {\n id: 'Settings.license.registry.cached',\n defaultMessage:\n \"Couldn't reach the license registry. Showing the last license we retrieved.\",\n }\n : // An instance that has never reached the registry has nothing cached, so\n // `usingCachedLicense` is false even though the cause was an outage rather than a\n // refusal. Read the recorded kind instead of inferring the cause from the cache.\n registrySyncErrorKind === 'unreachable' && licenseStatus !== 'active'\n ? {\n id: 'Settings.license.registry.unreachable',\n defaultMessage: \"Couldn't reach the license registry.\",\n }\n : registrySyncError && licenseStatus !== 'active'\n ? {\n id: 'Settings.license.registry.rejected',\n defaultMessage: 'The license registry could not validate this license.',\n }\n : null;\n\n const checkinLine =\n licenseMode === 'offline'\n ? expireAt\n ? formatMessage(\n { id: 'Settings.license.valid-until', defaultMessage: 'License valid until {date}' },\n { date: formatAbsoluteDate(expireAt) }\n )\n : null\n : formatMessage(\n {\n id: 'Settings.license.last-check',\n defaultMessage: 'Last license validity check {relative}',\n },\n { relative: formatLastCheck(lastRegistrySyncAt) }\n );\n\n const renderLimitCell = (entitlement: PlanEntitlement) => {\n const { available, limits } = entitlement;\n\n if (limits.length === 0) {\n return available ? (\n <Check\n aria-label={formatMessage({ id: 'Settings.license.yes', defaultMessage: 'Yes' })}\n fill=\"success600\"\n />\n ) : (\n <Cross\n aria-label={formatMessage({ id: 'Settings.license.no', defaultMessage: 'No' })}\n fill=\"danger600\"\n />\n );\n }\n\n if (limits.length === 1) {\n return <Typography>{formatLimitValue(limits[0])}</Typography>;\n }\n\n return (\n <Flex direction=\"column\" alignItems=\"end\" gap={1}>\n {limits.map((limit) => (\n <Typography key={limit.key} variant=\"pi\">\n {LIMIT_LABELS[limit.key]\n ? `${formatMessage(LIMIT_LABELS[limit.key])}: ${formatLimitValue(limit)}`\n : formatLimitValue(limit)}\n </Typography>\n ))}\n </Flex>\n );\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n <Flex alignItems=\"flex-start\" gap={5} tag=\"dl\">\n <Flex direction=\"column\" alignItems=\"stretch\" gap={5} flex=\"1\">\n <PlanDetail\n label={{ id: 'Settings.application.plan.current', defaultMessage: 'current plan' }}\n value={currentPlanValue}\n />\n {!isGrowth && formattedDate && <PlanDetail label={dateLabel} value={formattedDate} />}\n {/* Not gated on Growth: Enterprise licences can carry a seat limit too. A licence\n without one (including an older licence the registry has not re-issued yet) has a\n null `permittedSeats`, and the component already renders nothing in that case. */}\n <AdminSeatInfoEE />\n {/* Any plan with AI, as before this moved onto the Plan card (AIUsage renders nothing\n without it). The `ai.enabled` gate is kept: without it an instance with AI\n disabled requests usage it cannot have. */}\n {window.strapi.ai?.enabled !== false && <AIUsage isTrial={isTrial} />}\n </Flex>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={5} flex=\"1\">\n <Flex direction=\"column\" alignItems=\"start\" gap={2}>\n <Flex gap={2} alignItems=\"center\" tag=\"dt\">\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: 'Settings.license.status',\n defaultMessage: 'license status',\n })}\n </Typography>\n <Tooltip\n label={formatMessage({\n id: 'Settings.license.status-tooltip',\n defaultMessage:\n 'Strapi checks the license status every 12 hours and on every build.',\n })}\n >\n <Information width=\"1.4rem\" height=\"1.4rem\" fill=\"neutral500\" />\n </Tooltip>\n </Flex>\n <Flex direction=\"column\" alignItems=\"start\" gap={2} tag=\"dd\">\n <Status size=\"S\" variant={statusBadge.variant}>\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {formatMessage(statusBadge.label)}\n </Typography>\n </Status>\n {checkinLine && (\n <Flex gap={1} alignItems=\"center\">\n <ClockCounterClockwise width=\"1.2rem\" height=\"1.2rem\" fill=\"neutral500\" />\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {checkinLine}\n </Typography>\n </Flex>\n )}\n {registryNotice && (\n <Flex gap={1} alignItems=\"center\">\n <WarningCircle width=\"1.2rem\" height=\"1.2rem\" fill=\"warning600\" />\n <Typography variant=\"pi\" textColor=\"warning600\">\n {formatMessage(registryNotice)}\n </Typography>\n </Flex>\n )}\n </Flex>\n </Flex>\n {isGrowth && formattedDate && <PlanDetail label={dateLabel} value={formattedDate} />}\n {subscriptionId && (\n <PlanDetail\n label={{ id: 'Settings.license.subscription', defaultMessage: 'Subscription ID' }}\n value={subscriptionId}\n />\n )}\n </Flex>\n </Flex>\n\n {planEntitlements.length > 0 && (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Divider />\n <Typography variant=\"sigma\" textColor=\"neutral600\">\n {formatMessage({\n id: 'Settings.license.entitlements',\n defaultMessage: 'plan entitlements',\n })}\n </Typography>\n <Table colCount={2} rowCount={planEntitlements.length}>\n <Thead>\n <Tr>\n <Th>\n <Typography variant=\"sigma\">\n {formatMessage({ id: 'Settings.license.feature', defaultMessage: 'Feature' })}\n </Typography>\n </Th>\n <Th>\n <VisuallyHidden>\n {formatMessage({ id: 'Settings.license.limit', defaultMessage: 'Limit' })}\n </VisuallyHidden>\n </Th>\n </Tr>\n </Thead>\n <Tbody>\n {planEntitlements.map((entitlement) => {\n const label = FEATURE_LABELS[entitlement.feature];\n\n return (\n <Tr key={entitlement.feature}>\n <Td>\n <Typography>{label ? formatMessage(label) : entitlement.feature}</Typography>\n </Td>\n <Td>\n <Flex justifyContent=\"flex-end\">{renderLimitCell(entitlement)}</Flex>\n </Td>\n </Tr>\n );\n })}\n </Tbody>\n </Table>\n </Flex>\n )}\n </Flex>\n );\n};\n\nexport { LicenseInfoEE };\n"],"names":["FEATURE_LABELS","sso","id","defaultMessage","LIMIT_LABELS","numberOfWorkflows","stagesPerWorkflow","maximumReleases","retentionDays","TRIAL_BADGE","variant","label","STATUS_BADGE","active","expired","unknown","none","formatAbsoluteDate","value","date","Date","Number","isNaN","getTime","month","getUTCMonth","padStart","day","getUTCDate","getUTCFullYear","LicenseInfoEE","formatMessage","formatRelativeTime","useIntl","license","isLoading","isError","useLicenseLimits","data","trialTimeLeft","useGetLicenseTrialTimeLeftQuery","undefined","skip","isTrial","licenseMode","licenseStatus","renewalDate","subscriptionId","lastRegistrySyncAt","expireAt","planEntitlements","usingCachedLicense","registrySyncError","registrySyncErrorKind","licensedPlan","getLicensedPlan","type","planPriceId","isGrowth","formatDays","years","Math","round","days","formatLimitValue","limit","unit","formatLastCheck","timestamp","diffMs","now","diffMinutes","abs","numeric","currentPlanValue","dateLabel","rawDateValue","trialEndsAt","formattedDate","statusBadge","registryNotice","checkinLine","relative","renderLimitCell","entitlement","available","limits","length","_jsx","Check","aria-label","fill","Cross","Typography","Flex","direction","alignItems","gap","map","key","_jsxs","tag","flex","PlanDetail","AdminSeatInfoEE","window","strapi","ai","enabled","AIUsage","textColor","Tooltip","Information","width","height","Status","size","fontWeight","ClockCounterClockwise","WarningCircle","Divider","Table","colCount","rowCount","Thead","Tr","Th","VisuallyHidden","Tbody","feature","Td","justifyContent"],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ const actionTypes = {
|
|
|
16
16
|
'user.update': 'Update user',
|
|
17
17
|
'user.delete': 'Delete user',
|
|
18
18
|
'admin.auth.success': 'Admin login',
|
|
19
|
+
'admin.auth.error': 'Failed admin login',
|
|
20
|
+
'admin.auth.autoRegistration': 'SSO auto-registration',
|
|
19
21
|
'admin.logout': 'Admin logout',
|
|
20
22
|
'content-type.create': 'Create content type',
|
|
21
23
|
'content-type.update': 'Update content type',
|