@strapi/admin 5.57.0 → 5.59.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/StrapiApp.js.map +1 -1
- package/dist/admin/admin/src/StrapiApp.mjs.map +1 -1
- package/dist/admin/admin/src/components/ConfirmDialog.js +10 -9
- package/dist/admin/admin/src/components/ConfirmDialog.js.map +1 -1
- package/dist/admin/admin/src/components/ConfirmDialog.mjs +10 -9
- package/dist/admin/admin/src/components/ConfirmDialog.mjs.map +1 -1
- package/dist/admin/admin/src/components/Filters.js +57 -12
- package/dist/admin/admin/src/components/Filters.js.map +1 -1
- package/dist/admin/admin/src/components/Filters.mjs +57 -12
- package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
- package/dist/admin/admin/src/components/Form.js +3 -1
- package/dist/admin/admin/src/components/Form.js.map +1 -1
- package/dist/admin/admin/src/components/Form.mjs +3 -1
- package/dist/admin/admin/src/components/Form.mjs.map +1 -1
- 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/components/FormInputs/Enumeration.js +2 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +2 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
- package/dist/admin/admin/src/components/LeftMenu.js +5 -1
- package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
- package/dist/admin/admin/src/components/LeftMenu.mjs +5 -1
- package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.js +2 -1
- package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.mjs +2 -1
- package/dist/admin/admin/src/components/PageHelpers.mjs.map +1 -1
- package/dist/admin/admin/src/components/Pagination.js +7 -6
- package/dist/admin/admin/src/components/Pagination.js.map +1 -1
- package/dist/admin/admin/src/components/Pagination.mjs +7 -6
- package/dist/admin/admin/src/components/Pagination.mjs.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.js +2 -1
- package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.mjs +2 -1
- package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
- package/dist/admin/admin/src/components/SubNav.js +6 -12
- package/dist/admin/admin/src/components/SubNav.js.map +1 -1
- package/dist/admin/admin/src/components/SubNav.mjs +7 -13
- package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
- package/dist/admin/admin/src/components/Table.js +3 -1
- package/dist/admin/admin/src/components/Table.js.map +1 -1
- package/dist/admin/admin/src/components/Table.mjs +3 -1
- package/dist/admin/admin/src/components/Table.mjs.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.js.map +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.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/core/apis/Plugin.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Plugin.mjs.map +1 -1
- package/dist/admin/admin/src/features/Auth.js +2 -1
- package/dist/admin/admin/src/features/Auth.js.map +1 -1
- package/dist/admin/admin/src/features/Auth.mjs +2 -1
- package/dist/admin/admin/src/features/Auth.mjs.map +1 -1
- package/dist/admin/admin/src/features/StrapiApp.js.map +1 -1
- package/dist/admin/admin/src/features/StrapiApp.mjs.map +1 -1
- package/dist/admin/admin/src/features/Tracking.js.map +1 -1
- package/dist/admin/admin/src/features/Tracking.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/Home/components/FreeTrialEndedModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs.map +1 -1
- package/dist/admin/admin/src/pages/ProfilePage.js +2 -2
- package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
- package/dist/admin/admin/src/pages/ProfilePage.mjs +2 -2
- package/dist/admin/admin/src/pages/ProfilePage.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/components/Tokens/FormApiTokenContainer.js +4 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.mjs +4 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormApiTokenContainer.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +3 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs +3 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.js +2 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.mjs +2 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenTypeSelect.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js +6 -5
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.mjs +6 -5
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js +2 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.mjs +2 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.js +4 -4
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.mjs +4 -4
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/utils/transformPermissionsData.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +7 -58
- 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 +7 -58
- 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/LogoInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.mjs.map +1 -1
- 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/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +9 -4
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs +9 -4
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js +15 -9
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs +15 -9
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsModal.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +5 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs +5 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js +2 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs +2 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/GlobalActions.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js +2 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs +2 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/Permissions.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js +2 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs +2 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/hooks/usePermissionsDataManager.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js +3 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs +3 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/EditView.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/NewUserForm.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js +4 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.mjs +4 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js +18 -3
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.mjs +18 -3
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs.map +1 -1
- package/dist/admin/admin/src/router.js.map +1 -1
- package/dist/admin/admin/src/router.mjs.map +1 -1
- 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/services/users.js.map +1 -1
- package/dist/admin/admin/src/services/users.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/translations/eu.json.js +1 -1
- package/dist/admin/admin/src/translations/eu.json.mjs +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/cookies.js +7 -6
- package/dist/admin/admin/src/utils/cookies.js.map +1 -1
- package/dist/admin/admin/src/utils/cookies.mjs +7 -6
- package/dist/admin/admin/src/utils/cookies.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/admin/tests/utils.js +2 -1
- package/dist/admin/admin/tests/utils.js.map +1 -1
- package/dist/admin/admin/tests/utils.mjs +2 -1
- package/dist/admin/admin/tests/utils.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/auth-cookie-path.js +13 -10
- package/dist/admin/shared/utils/auth-cookie-path.js.map +1 -1
- package/dist/admin/shared/utils/auth-cookie-path.mjs +13 -10
- package/dist/admin/shared/utils/auth-cookie-path.mjs.map +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/components/Filters.d.ts +1 -1
- package/dist/admin/src/components/Form.d.ts +1 -1
- package/dist/admin/src/constants.d.ts +10 -0
- package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.d.ts +1 -1
- 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/cookies.d.ts +7 -6
- 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/ee/server/src/services/seat-enforcement.d.ts.map +1 -1
- package/dist/ee/server/src/validation/role.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/audit-logs/utils/csv.js +3 -3
- package/dist/server/ee/server/src/audit-logs/utils/csv.js.map +1 -1
- package/dist/server/ee/server/src/audit-logs/utils/csv.mjs +3 -3
- package/dist/server/ee/server/src/audit-logs/utils/csv.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/ee/server/src/services/seat-enforcement.js.map +1 -1
- package/dist/server/ee/server/src/services/seat-enforcement.mjs.map +1 -1
- package/dist/server/ee/server/src/validation/role.js +4 -2
- package/dist/server/ee/server/src/validation/role.js.map +1 -1
- package/dist/server/ee/server/src/validation/role.mjs +4 -2
- package/dist/server/ee/server/src/validation/role.mjs.map +1 -1
- package/dist/server/server/src/ai/services/ai.js.map +1 -1
- package/dist/server/server/src/ai/services/ai.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 +17 -12
- package/dist/server/server/src/controllers/admin.js.map +1 -1
- package/dist/server/server/src/controllers/admin.mjs +17 -12
- 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/domain/permission/index.js.map +1 -1
- package/dist/server/server/src/domain/permission/index.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/api-token.js +4 -8
- package/dist/server/server/src/services/api-token.js.map +1 -1
- package/dist/server/server/src/services/api-token.mjs +4 -8
- package/dist/server/server/src/services/api-token.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/constants.js +4 -0
- package/dist/server/server/src/services/constants.js.map +1 -1
- package/dist/server/server/src/services/constants.mjs +4 -0
- package/dist/server/server/src/services/constants.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/services/permission/rename-fields.js.map +1 -1
- package/dist/server/server/src/services/permission/rename-fields.mjs.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/handlers.js.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/handlers.mjs.map +1 -1
- package/dist/server/server/src/services/role.js +8 -5
- package/dist/server/server/src/services/role.js.map +1 -1
- package/dist/server/server/src/services/role.mjs +8 -5
- package/dist/server/server/src/services/role.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/server/src/validation/admin-tokens.js +4 -4
- package/dist/server/server/src/validation/admin-tokens.js.map +1 -1
- package/dist/server/server/src/validation/admin-tokens.mjs +4 -4
- package/dist/server/server/src/validation/admin-tokens.mjs.map +1 -1
- package/dist/server/server/src/validation/api-tokens.js +4 -4
- package/dist/server/server/src/validation/api-tokens.js.map +1 -1
- package/dist/server/server/src/validation/api-tokens.mjs +4 -4
- package/dist/server/server/src/validation/api-tokens.mjs.map +1 -1
- package/dist/server/server/src/validation/role.js +6 -4
- package/dist/server/server/src/validation/role.js.map +1 -1
- package/dist/server/server/src/validation/role.mjs +6 -4
- package/dist/server/server/src/validation/role.mjs.map +1 -1
- package/dist/server/server/src/validation/transfer/token.js +4 -4
- package/dist/server/server/src/validation/transfer/token.js.map +1 -1
- package/dist/server/server/src/validation/transfer/token.mjs +4 -4
- package/dist/server/server/src/validation/transfer/token.mjs.map +1 -1
- package/dist/server/shared/utils/auth-cookie-path.js +13 -10
- package/dist/server/shared/utils/auth-cookie-path.js.map +1 -1
- package/dist/server/shared/utils/auth-cookie-path.mjs +13 -10
- package/dist/server/shared/utils/auth-cookie-path.mjs.map +1 -1
- 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/shared/utils/session-auth.js +70 -3
- package/dist/server/shared/utils/session-auth.js.map +1 -1
- package/dist/server/shared/utils/session-auth.mjs +70 -4
- package/dist/server/shared/utils/session-auth.mjs.map +1 -1
- package/dist/server/src/ai/services/ai.d.ts.map +1 -1
- 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/domain/permission/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/constants.d.ts +2 -0
- package/dist/server/src/services/constants.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/services/permission/rename-fields.d.ts.map +1 -1
- package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -1
- package/dist/server/src/services/role.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/server/src/validation/role.d.ts.map +1 -1
- package/dist/shared/contracts/admin.d.ts +106 -0
- package/dist/shared/contracts/admin.d.ts.map +1 -1
- package/dist/shared/contracts/transfer.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/auth-cookie-path.d.ts +13 -10
- package/dist/shared/utils/auth-cookie-path.d.ts.map +1 -1
- package/dist/shared/utils/get-project-type.d.ts +37 -0
- package/dist/shared/utils/get-project-type.d.ts.map +1 -0
- package/dist/shared/utils/session-auth.d.ts +16 -0
- package/dist/shared/utils/session-auth.d.ts.map +1 -1
- 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":"LeftMenu.mjs","sources":["../../../../../admin/src/components/LeftMenu.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Divider, Flex, FlexComponent, IconButton, useCollator } from '@strapi/design-system';\nimport { Cross, List } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useTracking } from '../features/Tracking';\nimport { useIsDesktop } from '../hooks/useMediaQuery';\nimport { Menu, MenuItem, MobileMenuItem } from '../hooks/useMenu';\n\nimport { MainNav } from './MainNav/MainNav';\nimport { MainNavIcons } from './MainNav/MainNavLinks';\nimport { NavBrand } from './MainNav/NavBrand';\nimport { NavBurgerMenu } from './MainNav/NavBurgerMenu';\nimport { NavUser } from './MainNav/NavUser';\nimport { TrialCountdown } from './MainNav/TrialCountdown';\n\nconst sortLinks = (links: MenuItem[]) => {\n return links.sort((a, b) => {\n // if no position is defined, we put the link in the position of the external plugins, before the plugins list\n const positionA = a.position ?? 6;\n const positionB = b.position ?? 6;\n\n if (positionA < positionB) {\n return -1;\n } else {\n return 1;\n }\n });\n};\n\nconst NavListWrapper = styled<FlexComponent<'ul'>>(Flex)`\n width: 100%;\n overflow-y: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n`;\n\ninterface LeftMenuProps\n extends Pick<\n Menu,\n 'generalSectionLinks' | 'pluginsSectionLinks' | 'topMobileNavigation' | 'burgerMobileNavigation'\n > {}\n\nconst MenuDetails = styled(Flex)`\n flex: 1;\n flex-direction: row;\n justify-content: space-between;\n overflow-x: auto;\n\n ${({ theme }) => theme.breakpoints.large} {\n flex-direction: column;\n overflow-y: auto;\n overflow-x: hidden;\n }\n`;\n\nconst LeftMenu = ({\n generalSectionLinks = [],\n pluginsSectionLinks = [],\n topMobileNavigation = [],\n burgerMobileNavigation = [],\n}: LeftMenuProps) => {\n const [isBurgerMenuShown, setIsBurgerMenuShown] = React.useState(false);\n const { trackUsage } = useTracking();\n const { pathname } = useLocation();\n const { formatMessage, locale } = useIntl();\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n const isDesktop = useIsDesktop();\n\n const handleClickOnLink = (destination: string) => {\n trackUsage('willNavigate', { from: pathname, to: destination });\n };\n\n // Close burger menu when route changes\n React.useEffect(() => {\n setIsBurgerMenuShown(false);\n }, [pathname]);\n\n const listLinksAlphabeticallySorted = [...pluginsSectionLinks, ...generalSectionLinks].sort(\n (a, b) => formatter.compare(formatMessage(a.intlLabel), formatMessage(b.intlLabel))\n );\n const listLinks = sortLinks(listLinksAlphabeticallySorted);\n\n /**\n * Return filtered mobile navigation links (used for both top and burger menu)\n */\n const mapMobileNavigationLinks = (mobileNavLinks: MobileMenuItem[]): MenuItem[] =>\n mobileNavLinks.reduce<MenuItem[]>((acc, mobileLink) => {\n const linkFound = listLinks.find((link) => link.to === mobileLink.to);\n if (linkFound) {\n acc.push(mobileLink.link ? { ...linkFound, navigationLink: mobileLink.link } : linkFound);\n }\n return acc;\n }, []);\n\n /**\n * Mobile top navigation\n */\n const topMobileNavigationLinks = mapMobileNavigationLinks(topMobileNavigation);\n\n /**\n * Mobile burger menu\n */\n const excludedPluginsFromBurgerMenu = [\n 'content-manager',\n 'content-type-builder',\n 'upload',\n 'content-releases',\n ];\n const burgerMenuPluginsLinks = pluginsSectionLinks.filter(\n (plugin) => !excludedPluginsFromBurgerMenu.some((link) => plugin.to.includes(link))\n );\n const burgerMobileNavigationLinks = [\n ...burgerMenuPluginsLinks,\n ...mapMobileNavigationLinks(burgerMobileNavigation),\n ];\n\n return (\n <>\n <MainNav>\n <NavBrand />\n\n {isDesktop && <Divider />}\n\n <MenuDetails>\n <NavListWrapper\n tag=\"ul\"\n gap={3}\n direction={{\n initial: 'row',\n large: 'column',\n }}\n alignItems=\"center\"\n justifyContent={{\n initial: 'center',\n large: 'flex-start',\n }}\n flex={1}\n paddingLeft={{\n initial: 3,\n large: 0,\n }}\n paddingRight={{\n initial: 3,\n large: 0,\n }}\n paddingTop={3}\n paddingBottom={3}\n >\n <MainNavIcons\n listLinks={listLinks}\n mobileLinks={topMobileNavigationLinks}\n handleClickOnLink={handleClickOnLink}\n />\n </NavListWrapper>\n <TrialCountdown />\n <Box\n display={{\n initial: 'none',\n large: 'flex',\n }}\n borderStyle=\"solid\"\n borderWidth={{\n initial: 0,\n large: '1px 0 0 0',\n }}\n borderColor=\"neutral150\"\n padding={3}\n >\n <NavUser />\n </Box>\n </MenuDetails>\n\n <Box\n padding={3}\n display={{\n initial: 'flex',\n large: 'none',\n }}\n >\n <IconButton\n onClick={() => setIsBurgerMenuShown((prev) => !prev)}\n style={{ border: 'none' }}\n label=\"Menu\"\n type=\"button\"\n aria-expanded={isBurgerMenuShown}\n aria-controls=\"burger-menu\"\n >\n {!isBurgerMenuShown ? <List fill=\"neutral1000\" /> : <Cross fill=\"neutral1000\" />}\n </IconButton>\n </Box>\n </MainNav>\n <NavBurgerMenu\n isShown={isBurgerMenuShown}\n listLinks={burgerMobileNavigationLinks}\n handleClickOnLink={handleClickOnLink}\n onClose={() => setIsBurgerMenuShown(false)}\n />\n </>\n );\n};\n\nexport { LeftMenu };\n"],"names":["sortLinks","links","sort","a","b","positionA","position","positionB","NavListWrapper","styled","Flex","MenuDetails","theme","breakpoints","large","LeftMenu","generalSectionLinks","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isBurgerMenuShown","setIsBurgerMenuShown","React","useState","trackUsage","useTracking","pathname","useLocation","formatMessage","locale","useIntl","formatter","useCollator","sensitivity","isDesktop","useIsDesktop","handleClickOnLink","destination","from","to","useEffect","listLinksAlphabeticallySorted","compare","intlLabel","listLinks","mapMobileNavigationLinks","mobileNavLinks","reduce","acc","mobileLink","linkFound","find","link","push","navigationLink","topMobileNavigationLinks","excludedPluginsFromBurgerMenu","burgerMenuPluginsLinks","filter","plugin","some","includes","burgerMobileNavigationLinks","_jsxs","_Fragment","MainNav","_jsx","NavBrand","Divider","tag","gap","direction","initial","alignItems","justifyContent","flex","paddingLeft","paddingRight","paddingTop","paddingBottom","MainNavIcons","mobileLinks","TrialCountdown","Box","display","borderStyle","borderWidth","borderColor","padding","NavUser","IconButton","onClick","prev","style","border","label","type","aria-expanded","aria-controls","List","fill","Cross","NavBurgerMenu","isShown","onClose"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LeftMenu.mjs","sources":["../../../../../admin/src/components/LeftMenu.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, Divider, Flex, FlexComponent, IconButton, useCollator } from '@strapi/design-system';\nimport { Cross, List } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { useLocation } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useTracking } from '../features/Tracking';\nimport { useIsDesktop } from '../hooks/useMediaQuery';\nimport { Menu, MenuItem, MobileMenuItem } from '../hooks/useMenu';\n\nimport { MainNav } from './MainNav/MainNav';\nimport { MainNavIcons } from './MainNav/MainNavLinks';\nimport { NavBrand } from './MainNav/NavBrand';\nimport { NavBurgerMenu } from './MainNav/NavBurgerMenu';\nimport { NavUser } from './MainNav/NavUser';\nimport { TrialCountdown } from './MainNav/TrialCountdown';\n\nconst EMPTY_GENERAL_SECTION_LINKS: NonNullable<LeftMenuProps['generalSectionLinks']> = [];\nconst EMPTY_PLUGINS_SECTION_LINKS: NonNullable<LeftMenuProps['pluginsSectionLinks']> = [];\nconst EMPTY_TOP_MOBILE_NAVIGATION: NonNullable<LeftMenuProps['topMobileNavigation']> = [];\nconst EMPTY_BURGER_MOBILE_NAVIGATION: NonNullable<LeftMenuProps['burgerMobileNavigation']> = [];\n\nconst sortLinks = (links: MenuItem[]) => {\n return links.sort((a, b) => {\n // if no position is defined, we put the link in the position of the external plugins, before the plugins list\n const positionA = a.position ?? 6;\n const positionB = b.position ?? 6;\n\n if (positionA < positionB) {\n return -1;\n } else {\n return 1;\n }\n });\n};\n\nconst NavListWrapper = styled<FlexComponent<'ul'>>(Flex)`\n width: 100%;\n overflow-y: auto;\n scrollbar-width: none;\n -ms-overflow-style: none;\n\n &::-webkit-scrollbar {\n display: none;\n }\n`;\n\ninterface LeftMenuProps extends Pick<\n Menu,\n 'generalSectionLinks' | 'pluginsSectionLinks' | 'topMobileNavigation' | 'burgerMobileNavigation'\n> {}\n\nconst MenuDetails = styled(Flex)`\n flex: 1;\n flex-direction: row;\n justify-content: space-between;\n overflow-x: auto;\n\n ${({ theme }) => theme.breakpoints.large} {\n flex-direction: column;\n overflow-y: auto;\n overflow-x: hidden;\n }\n`;\n\nconst LeftMenu = ({\n generalSectionLinks = EMPTY_GENERAL_SECTION_LINKS,\n pluginsSectionLinks = EMPTY_PLUGINS_SECTION_LINKS,\n topMobileNavigation = EMPTY_TOP_MOBILE_NAVIGATION,\n burgerMobileNavigation = EMPTY_BURGER_MOBILE_NAVIGATION,\n}: LeftMenuProps) => {\n const [isBurgerMenuShown, setIsBurgerMenuShown] = React.useState(false);\n const { trackUsage } = useTracking();\n const { pathname } = useLocation();\n const { formatMessage, locale } = useIntl();\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n const isDesktop = useIsDesktop();\n\n const handleClickOnLink = (destination: string) => {\n trackUsage('willNavigate', { from: pathname, to: destination });\n };\n\n // Close burger menu when route changes\n React.useEffect(() => {\n setIsBurgerMenuShown(false);\n }, [pathname]);\n\n const listLinksAlphabeticallySorted = [...pluginsSectionLinks, ...generalSectionLinks].sort(\n (a, b) => formatter.compare(formatMessage(a.intlLabel), formatMessage(b.intlLabel))\n );\n const listLinks = sortLinks(listLinksAlphabeticallySorted);\n\n /**\n * Return filtered mobile navigation links (used for both top and burger menu)\n */\n const mapMobileNavigationLinks = (mobileNavLinks: MobileMenuItem[]): MenuItem[] =>\n mobileNavLinks.reduce<MenuItem[]>((acc, mobileLink) => {\n const linkFound = listLinks.find((link) => link.to === mobileLink.to);\n if (linkFound) {\n acc.push(mobileLink.link ? { ...linkFound, navigationLink: mobileLink.link } : linkFound);\n }\n return acc;\n }, []);\n\n /**\n * Mobile top navigation\n */\n const topMobileNavigationLinks = mapMobileNavigationLinks(topMobileNavigation);\n\n /**\n * Mobile burger menu\n */\n const excludedPluginsFromBurgerMenu = [\n 'content-manager',\n 'content-type-builder',\n 'upload',\n 'content-releases',\n ];\n const burgerMenuPluginsLinks = pluginsSectionLinks.filter(\n (plugin) => !excludedPluginsFromBurgerMenu.some((link) => plugin.to.includes(link))\n );\n const burgerMobileNavigationLinks = [\n ...burgerMenuPluginsLinks,\n ...mapMobileNavigationLinks(burgerMobileNavigation),\n ];\n\n return (\n <>\n <MainNav>\n <NavBrand />\n\n {isDesktop && <Divider />}\n\n <MenuDetails>\n <NavListWrapper\n tag=\"ul\"\n gap={3}\n direction={{\n initial: 'row',\n large: 'column',\n }}\n alignItems=\"center\"\n justifyContent={{\n initial: 'center',\n large: 'flex-start',\n }}\n flex={1}\n paddingLeft={{\n initial: 3,\n large: 0,\n }}\n paddingRight={{\n initial: 3,\n large: 0,\n }}\n paddingTop={3}\n paddingBottom={3}\n >\n <MainNavIcons\n listLinks={listLinks}\n mobileLinks={topMobileNavigationLinks}\n handleClickOnLink={handleClickOnLink}\n />\n </NavListWrapper>\n <TrialCountdown />\n <Box\n display={{\n initial: 'none',\n large: 'flex',\n }}\n borderStyle=\"solid\"\n borderWidth={{\n initial: 0,\n large: '1px 0 0 0',\n }}\n borderColor=\"neutral150\"\n padding={3}\n >\n <NavUser />\n </Box>\n </MenuDetails>\n\n <Box\n padding={3}\n display={{\n initial: 'flex',\n large: 'none',\n }}\n >\n <IconButton\n onClick={() => setIsBurgerMenuShown((prev) => !prev)}\n style={{ border: 'none' }}\n label=\"Menu\"\n type=\"button\"\n aria-expanded={isBurgerMenuShown}\n aria-controls=\"burger-menu\"\n >\n {!isBurgerMenuShown ? <List fill=\"neutral1000\" /> : <Cross fill=\"neutral1000\" />}\n </IconButton>\n </Box>\n </MainNav>\n <NavBurgerMenu\n isShown={isBurgerMenuShown}\n listLinks={burgerMobileNavigationLinks}\n handleClickOnLink={handleClickOnLink}\n onClose={() => setIsBurgerMenuShown(false)}\n />\n </>\n );\n};\n\nexport { LeftMenu };\n"],"names":["EMPTY_GENERAL_SECTION_LINKS","EMPTY_PLUGINS_SECTION_LINKS","EMPTY_TOP_MOBILE_NAVIGATION","EMPTY_BURGER_MOBILE_NAVIGATION","sortLinks","links","sort","a","b","positionA","position","positionB","NavListWrapper","styled","Flex","MenuDetails","theme","breakpoints","large","LeftMenu","generalSectionLinks","pluginsSectionLinks","topMobileNavigation","burgerMobileNavigation","isBurgerMenuShown","setIsBurgerMenuShown","React","useState","trackUsage","useTracking","pathname","useLocation","formatMessage","locale","useIntl","formatter","useCollator","sensitivity","isDesktop","useIsDesktop","handleClickOnLink","destination","from","to","useEffect","listLinksAlphabeticallySorted","compare","intlLabel","listLinks","mapMobileNavigationLinks","mobileNavLinks","reduce","acc","mobileLink","linkFound","find","link","push","navigationLink","topMobileNavigationLinks","excludedPluginsFromBurgerMenu","burgerMenuPluginsLinks","filter","plugin","some","includes","burgerMobileNavigationLinks","_jsxs","_Fragment","MainNav","_jsx","NavBrand","Divider","tag","gap","direction","initial","alignItems","justifyContent","flex","paddingLeft","paddingRight","paddingTop","paddingBottom","MainNavIcons","mobileLinks","TrialCountdown","Box","display","borderStyle","borderWidth","borderColor","padding","NavUser","IconButton","onClick","prev","style","border","label","type","aria-expanded","aria-controls","List","fill","Cross","NavBurgerMenu","isShown","onClose"],"mappings":"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"}
|
|
@@ -31,6 +31,7 @@ function _interopNamespace(e) {
|
|
|
31
31
|
|
|
32
32
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
33
33
|
|
|
34
|
+
const EMPTY_PERMISSIONS = [];
|
|
34
35
|
const PageMain = ({ children, ...restProps })=>{
|
|
35
36
|
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Main, {
|
|
36
37
|
...restProps,
|
|
@@ -152,7 +153,7 @@ const PageMain = ({ children, ...restProps })=>{
|
|
|
152
153
|
* you pass to it and render the children if any of the user's matching permissions grants access. If none do,
|
|
153
154
|
* it renders the NoPermissions component. Whilst these checks happen it will render the loading component
|
|
154
155
|
* and should the check fail it will render the error component with a notification.
|
|
155
|
-
*/ const Protect = ({ permissions =
|
|
156
|
+
*/ const Protect = ({ permissions = EMPTY_PERMISSIONS, children })=>{
|
|
156
157
|
const userPermissions = Auth.useAuth('Protect', (state)=>state.permissions);
|
|
157
158
|
const { toggleNotification } = Notifications.useNotification();
|
|
158
159
|
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler.useAPIErrorHandler();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageHelpers.js","sources":["../../../../../admin/src/components/PageHelpers.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n EmptyStateLayout,\n type EmptyStateLayoutProps,\n Flex,\n Loader,\n Main,\n MainProps,\n} from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { EmptyPermissions, EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useCheckPermissionsQuery } from '../services/auth';\n\n/* -------------------------------------------------------------------------------------------------\n * Main\n * -----------------------------------------------------------------------------------------------*/\ninterface PageMainProps extends MainProps {\n children: React.ReactNode;\n}\n\nconst PageMain = ({ children, ...restProps }: PageMainProps) => {\n return <Main {...restProps}>{children}</Main>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Loading\n * -----------------------------------------------------------------------------------------------*/\ninterface LoadingProps {\n /**\n * @default 'Loading content.'\n */\n children?: React.ReactNode;\n}\n\n/**\n * @public\n * @description A loading component that should be rendered as the page\n * whilst you load the content for the aforementioned page.\n */\nconst Loading = ({ children = 'Loading content.' }: LoadingProps) => {\n return (\n <PageMain height=\"100dvh\" aria-busy={true}>\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Loader>{children}</Loader>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Error\n * -----------------------------------------------------------------------------------------------*/\ninterface ErrorProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * TODO: should we start passing our errors here so they're persisted on the screen?\n * This could follow something similar to how the global app error works...?\n */\n\n/**\n * @public\n * @description An error component that should be rendered as the page\n * when an error occurs.\n */\nconst Error = (props: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<WarningCircle width=\"16rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Whoops! Something went wrong. Please, try again.',\n })}\n {...props}\n />\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoPermissions\n * -----------------------------------------------------------------------------------------------*/\ninterface NoPermissionsProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when the user does not have the permissions to access the content.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoPermissions = (props: NoPermissionsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyPermissions width=\"16rem\" />}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-permissions',\n defaultMessage: \"You don't have the permissions to access that content\",\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoData\n * -----------------------------------------------------------------------------------------------*/\ninterface NoDataProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when there is no data available to display.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoData = (props: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\" background=\"neutral100\">\n <Flex alignItems=\"center\" height=\"100%\" width=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n action={props.action}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Protect\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProtectProps {\n /**\n * The children to render if the user has the required permissions.\n * If providing a function, it will be called with an object containing\n * the permissions the user has based on the array you passed to the component.\n */\n children: React.ReactNode | ((args: { permissions: Permission[] }) => React.ReactNode);\n /**\n * The permissions the user needs to have to access the content.\n */\n permissions?: Array<Omit<Partial<Permission>, 'action'> & Pick<Permission, 'action'>>;\n}\n\n/**\n * @public\n * @description A wrapper component that should be used to protect a page. It will check the permissions\n * you pass to it and render the children if any of the user's matching permissions grants access. If none do,\n * it renders the NoPermissions component. Whilst these checks happen it will render the loading component\n * and should the check fail it will render the error component with a notification.\n */\nconst Protect = ({ permissions = [], children }: ProtectProps) => {\n const userPermissions = useAuth('Protect', (state) => state.permissions);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const matchingPermissions = (userPermissions || []).filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const hasConditions = (permission: Permission) =>\n Array.isArray(permission.conditions) && permission.conditions.length > 0;\n\n const shouldCheckConditions = matchingPermissions.some(hasConditions);\n\n const { isLoading, error, data } = useCheckPermissionsQuery(\n {\n permissions: matchingPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n },\n {\n skip: !shouldCheckConditions,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (isLoading) {\n return <Loading />;\n }\n\n if (error) {\n return <Error />;\n }\n\n const { data: permissionsData } = data || {};\n\n const hasUnconditionedPermission = matchingPermissions.some(\n (permission) => !hasConditions(permission)\n );\n\n const canAccess =\n hasUnconditionedPermission || (permissionsData ?? []).some((perm) => perm === true);\n\n if (!canAccess) {\n return <NoPermissions />;\n }\n\n return (\n <>\n {typeof children === 'function' ? children({ permissions: matchingPermissions }) : children}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Title\n * -----------------------------------------------------------------------------------------------*/\nexport interface TitleProps {\n children: string;\n}\n\n/**\n * @public\n * @description This component takes the children (must be a string) and sets\n * it as the title of the html.\n */\nconst Title = ({ children: title }: TitleProps) => {\n React.useEffect(() => {\n document.title = `${title} | Strapi`;\n }, [title]);\n\n return null;\n};\n\nconst Page = {\n Error,\n Loading,\n NoPermissions,\n Protect,\n NoData,\n Main: PageMain,\n Title,\n};\n\nexport { Page };\nexport type { ErrorProps, LoadingProps, NoPermissionsProps, PageMainProps as MainProps };\n"],"names":["PageMain","children","restProps","_jsx","Main","Loading","height","aria-busy","Flex","alignItems","justifyContent","Loader","Error","props","formatMessage","useIntl","EmptyStateLayout","icon","WarningCircle","width","content","id","defaultMessage","NoPermissions","Box","minWidth","EmptyPermissions","NoData","background","EmptyDocuments","action","Protect","permissions","userPermissions","useAuth","state","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","matchingPermissions","filter","permission","findIndex","perm","subject","hasConditions","Array","isArray","conditions","length","shouldCheckConditions","some","isLoading","error","data","useCheckPermissionsQuery","map","skip","React","useEffect","type","message","permissionsData","hasUnconditionedPermission","canAccess","_Fragment","Title","title","document","Page"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PageHelpers.js","sources":["../../../../../admin/src/components/PageHelpers.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n EmptyStateLayout,\n type EmptyStateLayoutProps,\n Flex,\n Loader,\n Main,\n MainProps,\n} from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { EmptyPermissions, EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useCheckPermissionsQuery } from '../services/auth';\n\nconst EMPTY_PERMISSIONS: NonNullable<ProtectProps['permissions']> = [];\n\n/* -------------------------------------------------------------------------------------------------\n * Main\n * -----------------------------------------------------------------------------------------------*/\ninterface PageMainProps extends MainProps {\n children: React.ReactNode;\n}\n\nconst PageMain = ({ children, ...restProps }: PageMainProps) => {\n return <Main {...restProps}>{children}</Main>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Loading\n * -----------------------------------------------------------------------------------------------*/\ninterface LoadingProps {\n /**\n * @default 'Loading content.'\n */\n children?: React.ReactNode;\n}\n\n/**\n * @public\n * @description A loading component that should be rendered as the page\n * whilst you load the content for the aforementioned page.\n */\nconst Loading = ({ children = 'Loading content.' }: LoadingProps) => {\n return (\n <PageMain height=\"100dvh\" aria-busy={true}>\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Loader>{children}</Loader>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Error\n * -----------------------------------------------------------------------------------------------*/\ninterface ErrorProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * TODO: should we start passing our errors here so they're persisted on the screen?\n * This could follow something similar to how the global app error works...?\n */\n\n/**\n * @public\n * @description An error component that should be rendered as the page\n * when an error occurs.\n */\nconst Error = (props: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<WarningCircle width=\"16rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Whoops! Something went wrong. Please, try again.',\n })}\n {...props}\n />\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoPermissions\n * -----------------------------------------------------------------------------------------------*/\ninterface NoPermissionsProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when the user does not have the permissions to access the content.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoPermissions = (props: NoPermissionsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyPermissions width=\"16rem\" />}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-permissions',\n defaultMessage: \"You don't have the permissions to access that content\",\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoData\n * -----------------------------------------------------------------------------------------------*/\ninterface NoDataProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when there is no data available to display.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoData = (props: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\" background=\"neutral100\">\n <Flex alignItems=\"center\" height=\"100%\" width=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n action={props.action}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Protect\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProtectProps {\n /**\n * The children to render if the user has the required permissions.\n * If providing a function, it will be called with an object containing\n * the permissions the user has based on the array you passed to the component.\n */\n children: React.ReactNode | ((args: { permissions: Permission[] }) => React.ReactNode);\n /**\n * The permissions the user needs to have to access the content.\n */\n permissions?: Array<Omit<Partial<Permission>, 'action'> & Pick<Permission, 'action'>>;\n}\n\n/**\n * @public\n * @description A wrapper component that should be used to protect a page. It will check the permissions\n * you pass to it and render the children if any of the user's matching permissions grants access. If none do,\n * it renders the NoPermissions component. Whilst these checks happen it will render the loading component\n * and should the check fail it will render the error component with a notification.\n */\nconst Protect = ({ permissions = EMPTY_PERMISSIONS, children }: ProtectProps) => {\n const userPermissions = useAuth('Protect', (state) => state.permissions);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const matchingPermissions = (userPermissions || []).filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const hasConditions = (permission: Permission) =>\n Array.isArray(permission.conditions) && permission.conditions.length > 0;\n\n const shouldCheckConditions = matchingPermissions.some(hasConditions);\n\n const { isLoading, error, data } = useCheckPermissionsQuery(\n {\n permissions: matchingPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n },\n {\n skip: !shouldCheckConditions,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (isLoading) {\n return <Loading />;\n }\n\n if (error) {\n return <Error />;\n }\n\n const { data: permissionsData } = data || {};\n\n const hasUnconditionedPermission = matchingPermissions.some(\n (permission) => !hasConditions(permission)\n );\n\n const canAccess =\n hasUnconditionedPermission || (permissionsData ?? []).some((perm) => perm === true);\n\n if (!canAccess) {\n return <NoPermissions />;\n }\n\n return (\n <>\n {typeof children === 'function' ? children({ permissions: matchingPermissions }) : children}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Title\n * -----------------------------------------------------------------------------------------------*/\nexport interface TitleProps {\n children: string;\n}\n\n/**\n * @public\n * @description This component takes the children (must be a string) and sets\n * it as the title of the html.\n */\nconst Title = ({ children: title }: TitleProps) => {\n React.useEffect(() => {\n document.title = `${title} | Strapi`;\n }, [title]);\n\n return null;\n};\n\nconst Page = {\n Error,\n Loading,\n NoPermissions,\n Protect,\n NoData,\n Main: PageMain,\n Title,\n};\n\nexport { Page };\nexport type { ErrorProps, LoadingProps, NoPermissionsProps, PageMainProps as MainProps };\n"],"names":["EMPTY_PERMISSIONS","PageMain","children","restProps","_jsx","Main","Loading","height","aria-busy","Flex","alignItems","justifyContent","Loader","Error","props","formatMessage","useIntl","EmptyStateLayout","icon","WarningCircle","width","content","id","defaultMessage","NoPermissions","Box","minWidth","EmptyPermissions","NoData","background","EmptyDocuments","action","Protect","permissions","userPermissions","useAuth","state","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","matchingPermissions","filter","permission","findIndex","perm","subject","hasConditions","Array","isArray","conditions","length","shouldCheckConditions","some","isLoading","error","data","useCheckPermissionsQuery","map","skip","React","useEffect","type","message","permissionsData","hasUnconditionedPermission","canAccess","_Fragment","Title","title","document","Page"],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { useNotification } from '../features/Notifications.mjs';
|
|
|
9
9
|
import { useAPIErrorHandler } from '../hooks/useAPIErrorHandler.mjs';
|
|
10
10
|
import { useCheckPermissionsQuery } from '../services/auth.mjs';
|
|
11
11
|
|
|
12
|
+
const EMPTY_PERMISSIONS = [];
|
|
12
13
|
const PageMain = ({ children, ...restProps })=>{
|
|
13
14
|
return /*#__PURE__*/ jsx(Main, {
|
|
14
15
|
...restProps,
|
|
@@ -130,7 +131,7 @@ const PageMain = ({ children, ...restProps })=>{
|
|
|
130
131
|
* you pass to it and render the children if any of the user's matching permissions grants access. If none do,
|
|
131
132
|
* it renders the NoPermissions component. Whilst these checks happen it will render the loading component
|
|
132
133
|
* and should the check fail it will render the error component with a notification.
|
|
133
|
-
*/ const Protect = ({ permissions =
|
|
134
|
+
*/ const Protect = ({ permissions = EMPTY_PERMISSIONS, children })=>{
|
|
134
135
|
const userPermissions = useAuth('Protect', (state)=>state.permissions);
|
|
135
136
|
const { toggleNotification } = useNotification();
|
|
136
137
|
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageHelpers.mjs","sources":["../../../../../admin/src/components/PageHelpers.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n EmptyStateLayout,\n type EmptyStateLayoutProps,\n Flex,\n Loader,\n Main,\n MainProps,\n} from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { EmptyPermissions, EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useCheckPermissionsQuery } from '../services/auth';\n\n/* -------------------------------------------------------------------------------------------------\n * Main\n * -----------------------------------------------------------------------------------------------*/\ninterface PageMainProps extends MainProps {\n children: React.ReactNode;\n}\n\nconst PageMain = ({ children, ...restProps }: PageMainProps) => {\n return <Main {...restProps}>{children}</Main>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Loading\n * -----------------------------------------------------------------------------------------------*/\ninterface LoadingProps {\n /**\n * @default 'Loading content.'\n */\n children?: React.ReactNode;\n}\n\n/**\n * @public\n * @description A loading component that should be rendered as the page\n * whilst you load the content for the aforementioned page.\n */\nconst Loading = ({ children = 'Loading content.' }: LoadingProps) => {\n return (\n <PageMain height=\"100dvh\" aria-busy={true}>\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Loader>{children}</Loader>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Error\n * -----------------------------------------------------------------------------------------------*/\ninterface ErrorProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * TODO: should we start passing our errors here so they're persisted on the screen?\n * This could follow something similar to how the global app error works...?\n */\n\n/**\n * @public\n * @description An error component that should be rendered as the page\n * when an error occurs.\n */\nconst Error = (props: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<WarningCircle width=\"16rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Whoops! Something went wrong. Please, try again.',\n })}\n {...props}\n />\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoPermissions\n * -----------------------------------------------------------------------------------------------*/\ninterface NoPermissionsProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when the user does not have the permissions to access the content.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoPermissions = (props: NoPermissionsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyPermissions width=\"16rem\" />}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-permissions',\n defaultMessage: \"You don't have the permissions to access that content\",\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoData\n * -----------------------------------------------------------------------------------------------*/\ninterface NoDataProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when there is no data available to display.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoData = (props: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\" background=\"neutral100\">\n <Flex alignItems=\"center\" height=\"100%\" width=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n action={props.action}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Protect\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProtectProps {\n /**\n * The children to render if the user has the required permissions.\n * If providing a function, it will be called with an object containing\n * the permissions the user has based on the array you passed to the component.\n */\n children: React.ReactNode | ((args: { permissions: Permission[] }) => React.ReactNode);\n /**\n * The permissions the user needs to have to access the content.\n */\n permissions?: Array<Omit<Partial<Permission>, 'action'> & Pick<Permission, 'action'>>;\n}\n\n/**\n * @public\n * @description A wrapper component that should be used to protect a page. It will check the permissions\n * you pass to it and render the children if any of the user's matching permissions grants access. If none do,\n * it renders the NoPermissions component. Whilst these checks happen it will render the loading component\n * and should the check fail it will render the error component with a notification.\n */\nconst Protect = ({ permissions = [], children }: ProtectProps) => {\n const userPermissions = useAuth('Protect', (state) => state.permissions);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const matchingPermissions = (userPermissions || []).filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const hasConditions = (permission: Permission) =>\n Array.isArray(permission.conditions) && permission.conditions.length > 0;\n\n const shouldCheckConditions = matchingPermissions.some(hasConditions);\n\n const { isLoading, error, data } = useCheckPermissionsQuery(\n {\n permissions: matchingPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n },\n {\n skip: !shouldCheckConditions,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (isLoading) {\n return <Loading />;\n }\n\n if (error) {\n return <Error />;\n }\n\n const { data: permissionsData } = data || {};\n\n const hasUnconditionedPermission = matchingPermissions.some(\n (permission) => !hasConditions(permission)\n );\n\n const canAccess =\n hasUnconditionedPermission || (permissionsData ?? []).some((perm) => perm === true);\n\n if (!canAccess) {\n return <NoPermissions />;\n }\n\n return (\n <>\n {typeof children === 'function' ? children({ permissions: matchingPermissions }) : children}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Title\n * -----------------------------------------------------------------------------------------------*/\nexport interface TitleProps {\n children: string;\n}\n\n/**\n * @public\n * @description This component takes the children (must be a string) and sets\n * it as the title of the html.\n */\nconst Title = ({ children: title }: TitleProps) => {\n React.useEffect(() => {\n document.title = `${title} | Strapi`;\n }, [title]);\n\n return null;\n};\n\nconst Page = {\n Error,\n Loading,\n NoPermissions,\n Protect,\n NoData,\n Main: PageMain,\n Title,\n};\n\nexport { Page };\nexport type { ErrorProps, LoadingProps, NoPermissionsProps, PageMainProps as MainProps };\n"],"names":["PageMain","children","restProps","_jsx","Main","Loading","height","aria-busy","Flex","alignItems","justifyContent","Loader","Error","props","formatMessage","useIntl","EmptyStateLayout","icon","WarningCircle","width","content","id","defaultMessage","NoPermissions","Box","minWidth","EmptyPermissions","NoData","background","EmptyDocuments","action","Protect","permissions","userPermissions","useAuth","state","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","matchingPermissions","filter","permission","findIndex","perm","subject","hasConditions","Array","isArray","conditions","length","shouldCheckConditions","some","isLoading","error","data","useCheckPermissionsQuery","map","skip","React","useEffect","type","message","permissionsData","hasUnconditionedPermission","canAccess","_Fragment","Title","title","document","Page"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PageHelpers.mjs","sources":["../../../../../admin/src/components/PageHelpers.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n EmptyStateLayout,\n type EmptyStateLayoutProps,\n Flex,\n Loader,\n Main,\n MainProps,\n} from '@strapi/design-system';\nimport { WarningCircle } from '@strapi/icons';\nimport { EmptyPermissions, EmptyDocuments } from '@strapi/icons/symbols';\nimport { useIntl } from 'react-intl';\n\nimport { useAuth, Permission } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useAPIErrorHandler } from '../hooks/useAPIErrorHandler';\nimport { useCheckPermissionsQuery } from '../services/auth';\n\nconst EMPTY_PERMISSIONS: NonNullable<ProtectProps['permissions']> = [];\n\n/* -------------------------------------------------------------------------------------------------\n * Main\n * -----------------------------------------------------------------------------------------------*/\ninterface PageMainProps extends MainProps {\n children: React.ReactNode;\n}\n\nconst PageMain = ({ children, ...restProps }: PageMainProps) => {\n return <Main {...restProps}>{children}</Main>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Loading\n * -----------------------------------------------------------------------------------------------*/\ninterface LoadingProps {\n /**\n * @default 'Loading content.'\n */\n children?: React.ReactNode;\n}\n\n/**\n * @public\n * @description A loading component that should be rendered as the page\n * whilst you load the content for the aforementioned page.\n */\nconst Loading = ({ children = 'Loading content.' }: LoadingProps) => {\n return (\n <PageMain height=\"100dvh\" aria-busy={true}>\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Loader>{children}</Loader>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Error\n * -----------------------------------------------------------------------------------------------*/\ninterface ErrorProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * TODO: should we start passing our errors here so they're persisted on the screen?\n * This could follow something similar to how the global app error works...?\n */\n\n/**\n * @public\n * @description An error component that should be rendered as the page\n * when an error occurs.\n */\nconst Error = (props: ErrorProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <EmptyStateLayout\n icon={<WarningCircle width=\"16rem\" />}\n content={formatMessage({\n id: 'anErrorOccurred',\n defaultMessage: 'Whoops! Something went wrong. Please, try again.',\n })}\n {...props}\n />\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoPermissions\n * -----------------------------------------------------------------------------------------------*/\ninterface NoPermissionsProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when the user does not have the permissions to access the content.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoPermissions = (props: NoPermissionsProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\">\n <Flex alignItems=\"center\" height=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyPermissions width=\"16rem\" />}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-permissions',\n defaultMessage: \"You don't have the permissions to access that content\",\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * NoData\n * -----------------------------------------------------------------------------------------------*/\ninterface NoDataProps extends Partial<EmptyStateLayoutProps> {}\n\n/**\n * @public\n * @description A component that should be rendered as the page\n * when there is no data available to display.\n * This component does not check any permissions, it's up to you to decide\n * when it should be rendered.\n */\nconst NoData = (props: NoDataProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <PageMain height=\"100%\" background=\"neutral100\">\n <Flex alignItems=\"center\" height=\"100%\" width=\"100%\" justifyContent=\"center\">\n <Box minWidth=\"50%\">\n <EmptyStateLayout\n icon={<EmptyDocuments width=\"16rem\" />}\n action={props.action}\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n {...props}\n />\n </Box>\n </Flex>\n </PageMain>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Protect\n * -----------------------------------------------------------------------------------------------*/\nexport interface ProtectProps {\n /**\n * The children to render if the user has the required permissions.\n * If providing a function, it will be called with an object containing\n * the permissions the user has based on the array you passed to the component.\n */\n children: React.ReactNode | ((args: { permissions: Permission[] }) => React.ReactNode);\n /**\n * The permissions the user needs to have to access the content.\n */\n permissions?: Array<Omit<Partial<Permission>, 'action'> & Pick<Permission, 'action'>>;\n}\n\n/**\n * @public\n * @description A wrapper component that should be used to protect a page. It will check the permissions\n * you pass to it and render the children if any of the user's matching permissions grants access. If none do,\n * it renders the NoPermissions component. Whilst these checks happen it will render the loading component\n * and should the check fail it will render the error component with a notification.\n */\nconst Protect = ({ permissions = EMPTY_PERMISSIONS, children }: ProtectProps) => {\n const userPermissions = useAuth('Protect', (state) => state.permissions);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const matchingPermissions = (userPermissions || []).filter(\n (permission) =>\n permissions.findIndex(\n (perm) => perm.action === permission.action && perm.subject === permission.subject\n ) >= 0\n );\n\n const hasConditions = (permission: Permission) =>\n Array.isArray(permission.conditions) && permission.conditions.length > 0;\n\n const shouldCheckConditions = matchingPermissions.some(hasConditions);\n\n const { isLoading, error, data } = useCheckPermissionsQuery(\n {\n permissions: matchingPermissions.map((perm) => ({\n action: perm.action,\n subject: perm.subject,\n })),\n },\n {\n skip: !shouldCheckConditions,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n if (isLoading) {\n return <Loading />;\n }\n\n if (error) {\n return <Error />;\n }\n\n const { data: permissionsData } = data || {};\n\n const hasUnconditionedPermission = matchingPermissions.some(\n (permission) => !hasConditions(permission)\n );\n\n const canAccess =\n hasUnconditionedPermission || (permissionsData ?? []).some((perm) => perm === true);\n\n if (!canAccess) {\n return <NoPermissions />;\n }\n\n return (\n <>\n {typeof children === 'function' ? children({ permissions: matchingPermissions }) : children}\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Title\n * -----------------------------------------------------------------------------------------------*/\nexport interface TitleProps {\n children: string;\n}\n\n/**\n * @public\n * @description This component takes the children (must be a string) and sets\n * it as the title of the html.\n */\nconst Title = ({ children: title }: TitleProps) => {\n React.useEffect(() => {\n document.title = `${title} | Strapi`;\n }, [title]);\n\n return null;\n};\n\nconst Page = {\n Error,\n Loading,\n NoPermissions,\n Protect,\n NoData,\n Main: PageMain,\n Title,\n};\n\nexport { Page };\nexport type { ErrorProps, LoadingProps, NoPermissionsProps, PageMainProps as MainProps };\n"],"names":["EMPTY_PERMISSIONS","PageMain","children","restProps","_jsx","Main","Loading","height","aria-busy","Flex","alignItems","justifyContent","Loader","Error","props","formatMessage","useIntl","EmptyStateLayout","icon","WarningCircle","width","content","id","defaultMessage","NoPermissions","Box","minWidth","EmptyPermissions","NoData","background","EmptyDocuments","action","Protect","permissions","userPermissions","useAuth","state","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","matchingPermissions","filter","permission","findIndex","perm","subject","hasConditions","Array","isArray","conditions","length","shouldCheckConditions","some","isLoading","error","data","useCheckPermissionsQuery","map","skip","React","useEffect","type","message","permissionsData","hasUnconditionedPermission","canAccess","_Fragment","Title","title","document","Page"],"mappings":"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"}
|
|
@@ -29,6 +29,12 @@ function _interopNamespace(e) {
|
|
|
29
29
|
|
|
30
30
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
31
31
|
|
|
32
|
+
const DEFAULT_OPTIONS = [
|
|
33
|
+
'10',
|
|
34
|
+
'20',
|
|
35
|
+
'50',
|
|
36
|
+
'100'
|
|
37
|
+
];
|
|
32
38
|
const [PaginationProvider, usePagination] = Context.createContext('Pagination');
|
|
33
39
|
/**
|
|
34
40
|
* @description The root component for the composable pagination component.
|
|
@@ -82,12 +88,7 @@ const [PaginationProvider, usePagination] = Context.createContext('Pagination');
|
|
|
82
88
|
* @description The page size component is responsible for rendering the select input that allows
|
|
83
89
|
* the user to change the number of items displayed per page.
|
|
84
90
|
* If the total number of items is less than the minimum option, this component will not render.
|
|
85
|
-
*/ const PageSize = ({ options =
|
|
86
|
-
'10',
|
|
87
|
-
'20',
|
|
88
|
-
'50',
|
|
89
|
-
'100'
|
|
90
|
-
] })=>{
|
|
91
|
+
*/ const PageSize = ({ options = DEFAULT_OPTIONS })=>{
|
|
91
92
|
const { formatMessage } = reactIntl.useIntl();
|
|
92
93
|
const pageSize = usePagination('PageSize', (state)=>state.pageSize);
|
|
93
94
|
const totalCount = usePagination('PageSize', (state)=>state.total);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.js","sources":["../../../../../admin/src/components/Pagination.tsx"],"sourcesContent":["/* eslint-disable import/export */\nimport * as React from 'react';\n\nimport {\n Flex,\n SingleSelectOption,\n SingleSelect,\n Typography,\n Dots,\n NextLink,\n PageLink,\n Pagination as PaginationImpl,\n PreviousLink,\n} from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { useQueryParams, withEncodedUserParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\n\nimport type { Pagination as PaginationApi } from '../../../shared/contracts/shared';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\ninterface PaginationContextValue {\n /**\n * @description the complete query object, this could include query params\n * injected by other plugins, if you're navigating to a different page you\n * should ensure these are still passed.\n */\n currentQuery?: object;\n pageCount: string;\n pageSize: string;\n page: string;\n setPageSize: (pageSize: string) => void;\n total: NonNullable<RootProps['total']>;\n}\n\nconst [PaginationProvider, usePagination] = createContext<PaginationContextValue>('Pagination');\n\ninterface RootProps {\n children: React.ReactNode;\n /**\n * @default 0\n * @description the total number of pages\n * that exist in the dataset.\n */\n pageCount?: PaginationApi['pageCount'];\n /**\n * @default 1\n * @description the initial page number.\n */\n defaultPage?: PaginationApi['page'];\n /**\n * @default 10\n * @description the initial number of items to display\n */\n defaultPageSize?: PaginationApi['pageSize'];\n /**\n * @description a callback that is called when the page size changes.\n */\n onPageSizeChange?: (pageSize: string) => void;\n /**\n * @default 0\n * @description the total number of items in the dataset.\n */\n total?: PaginationApi['total'];\n}\n\n/**\n * @description The root component for the composable pagination component.\n * It's advised to spread the entire pagination option object into this component.\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n * return (\n * <Pagination.Root {...response.pagination}>\n * <Pagination.PageSize />\n * <Pagination.Links />\n * </Pagination.Root>\n * );\n * };\n * ```\n */\nconst Root = React.forwardRef<HTMLDivElement, RootProps>(\n (\n { children, defaultPageSize = 10, pageCount = 0, defaultPage = 1, onPageSizeChange, total = 0 },\n forwardedRef\n ) => {\n const [{ query }, setQuery] = useQueryParams<\n Pick<PaginationContextValue, 'page' | 'pageSize'> & { filters?: unknown; _q?: unknown }\n >({\n pageSize: defaultPageSize.toString(),\n page: defaultPage.toString(),\n });\n\n const setPageSize = (pageSize: string) => {\n setQuery(withEncodedUserParams(query, { pageSize, page: '1' }));\n\n if (onPageSizeChange) {\n onPageSizeChange(pageSize);\n }\n };\n\n return (\n <Flex\n ref={forwardedRef}\n paddingTop={4}\n paddingBottom={4}\n alignItems=\"flex-end\"\n justifyContent=\"space-between\"\n >\n <PaginationProvider\n currentQuery={query}\n page={query.page}\n pageSize={query.pageSize}\n pageCount={pageCount.toString()}\n setPageSize={setPageSize}\n total={total}\n >\n {children}\n </PaginationProvider>\n </Flex>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * PageSize\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description The page size component is responsible for rendering the select input that allows\n * the user to change the number of items displayed per page.\n * If the total number of items is less than the minimum option, this component will not render.\n */\nconst PageSize = ({ options = ['10', '20', '50', '100'] }: Pagination.PageSizeProps) => {\n const { formatMessage } = useIntl();\n\n const pageSize = usePagination('PageSize', (state) => state.pageSize);\n const totalCount = usePagination('PageSize', (state) => state.total);\n const setPageSize = usePagination('PageSize', (state) => state.setPageSize);\n\n const handleChange = (value: string) => {\n setPageSize(value);\n };\n\n const minimumOption = parseInt(options[0], 10);\n\n if (minimumOption >= totalCount) {\n return null;\n }\n\n return (\n <Flex gap={2}>\n <SingleSelect\n size=\"S\"\n aria-label={formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n // @ts-expect-error from the DS V2 this won't be needed because we're only returning strings.\n onChange={handleChange}\n value={pageSize}\n >\n {options.map((option) => (\n <SingleSelectOption key={option} value={option}>\n {option}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Typography textColor=\"neutral600\" tag=\"span\">\n {formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Links\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * The component works as follows\n * `1` , 2, 3, ... 10\n * 1, `2`, 3, ... 10\n * 1, 2, `3`, 4, ... 10\n * 1, 2, 3, `4`, 5, ... 10\n * 1, ..,4, `5`, 6, ... 10\n *\n * 1, ...., 8, 9, `10`\n * 1, ...., 8, `9`, 10\n * 1, ...., 7, `8`, 9, 10\n * 1, ... 6, `7`, 8, 9, 10\n */\n\n/**\n * @description The links component is responsible for rendering the pagination links.\n * If the total number of pages is less than or equal to 1, this component will not render.\n */\nconst Links = ({ boundaryCount = 1, siblingCount = 1 }: Pagination.LinksProps) => {\n const { formatMessage } = useIntl();\n\n const query = usePagination('Links', (state) => state.currentQuery);\n const currentPage = usePagination('Links', (state) => state.page);\n const totalPages = usePagination('Links', (state) => state.pageCount);\n\n const pageCount = parseInt(totalPages, 10);\n const activePage = parseInt(currentPage, 10);\n\n const range = (start: number, end: number) => {\n const length = end - start + 1;\n\n return Array.from({ length }, (_, i) => start + i);\n };\n\n const startPages = range(1, Math.min(boundaryCount, pageCount));\n const endPages = range(Math.max(pageCount - boundaryCount + 1, boundaryCount + 1), pageCount);\n\n const siblingsStart = Math.max(\n Math.min(\n // Natural start\n activePage - siblingCount,\n // Lower boundary when page is high\n pageCount - boundaryCount - siblingCount * 2 - 1\n ),\n // Greater than startPages\n boundaryCount + 2\n );\n\n const siblingsEnd = Math.min(\n Math.max(\n // Natural end\n activePage + siblingCount,\n // Upper boundary when page is low\n boundaryCount + siblingCount * 2 + 2\n ),\n // Less than endPages\n endPages.length > 0 ? endPages[0] - 2 : pageCount - 1\n );\n\n const items = [\n ...startPages,\n\n // Start ellipsis\n // eslint-disable-next-line no-nested-ternary\n ...(siblingsStart > boundaryCount + 2\n ? ['start-ellipsis']\n : boundaryCount + 1 < pageCount - boundaryCount\n ? [boundaryCount + 1]\n : []),\n\n // Sibling pages\n ...range(siblingsStart, siblingsEnd),\n\n // End ellipsis\n // eslint-disable-next-line no-nested-ternary\n ...(siblingsEnd < pageCount - boundaryCount - 1\n ? ['end-ellipsis']\n : pageCount - boundaryCount > boundaryCount\n ? [pageCount - boundaryCount]\n : []),\n\n ...endPages,\n ];\n\n if (pageCount <= 1) {\n return null;\n }\n\n return (\n <PaginationImpl activePage={activePage} pageCount={pageCount}>\n <PreviousLink tag={Link} to={{ search: stringify({ ...query, page: activePage - 1 }) }}>\n {formatMessage({\n id: 'components.pagination.go-to-previous',\n defaultMessage: 'Go to previous page',\n })}\n </PreviousLink>\n {items.map((item) => {\n if (typeof item === 'number') {\n return (\n <PageLink\n tag={Link}\n key={item}\n number={item}\n to={{ search: stringify({ ...query, page: item }) }}\n >\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: item }\n )}\n </PageLink>\n );\n }\n\n return <Dots key={item} />;\n })}\n\n <NextLink tag={Link} to={{ search: stringify({ ...query, page: activePage + 1 }) }}>\n {formatMessage({\n id: 'components.pagination.go-to-next',\n defaultMessage: 'Go to next page',\n })}\n </NextLink>\n </PaginationImpl>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Pagination = {\n Root,\n Links,\n PageSize,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Pagination {\n export interface Props extends RootProps {}\n\n export interface PageSizeProps {\n options?: string[];\n }\n\n export interface LinksProps {\n /**\n * @default 1\n * @description Number of always visible pages at the beginning and end.\n */\n boundaryCount?: number;\n /**\n * @default 1\n * @description Number of always visible pages before and after the current page.\n */\n siblingCount?: number;\n }\n}\n\nexport { Pagination };\n"],"names":["PaginationProvider","usePagination","createContext","Root","React","forwardRef","children","defaultPageSize","pageCount","defaultPage","onPageSizeChange","total","forwardedRef","query","setQuery","useQueryParams","pageSize","toString","page","setPageSize","withEncodedUserParams","_jsx","Flex","ref","paddingTop","paddingBottom","alignItems","justifyContent","currentQuery","PageSize","options","formatMessage","useIntl","state","totalCount","handleChange","value","minimumOption","parseInt","_jsxs","gap","SingleSelect","size","aria-label","id","defaultMessage","onChange","map","option","SingleSelectOption","Typography","textColor","tag","Links","boundaryCount","siblingCount","currentPage","totalPages","activePage","range","start","end","length","Array","from","_","i","startPages","Math","min","endPages","max","siblingsStart","siblingsEnd","items","PaginationImpl","PreviousLink","Link","to","search","stringify","item","PageLink","number","Dots","NextLink","Pagination"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Pagination.js","sources":["../../../../../admin/src/components/Pagination.tsx"],"sourcesContent":["/* eslint-disable import/export */\nimport * as React from 'react';\n\nimport {\n Flex,\n SingleSelectOption,\n SingleSelect,\n Typography,\n Dots,\n NextLink,\n PageLink,\n Pagination as PaginationImpl,\n PreviousLink,\n} from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { useQueryParams, withEncodedUserParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\n\nimport type { Pagination as PaginationApi } from '../../../shared/contracts/shared';\n\nconst DEFAULT_OPTIONS: NonNullable<Pagination.PageSizeProps['options']> = ['10', '20', '50', '100'];\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\ninterface PaginationContextValue {\n /**\n * @description the complete query object, this could include query params\n * injected by other plugins, if you're navigating to a different page you\n * should ensure these are still passed.\n */\n currentQuery?: object;\n pageCount: string;\n pageSize: string;\n page: string;\n setPageSize: (pageSize: string) => void;\n total: NonNullable<RootProps['total']>;\n}\n\nconst [PaginationProvider, usePagination] = createContext<PaginationContextValue>('Pagination');\n\ninterface RootProps {\n children: React.ReactNode;\n /**\n * @default 0\n * @description the total number of pages\n * that exist in the dataset.\n */\n pageCount?: PaginationApi['pageCount'];\n /**\n * @default 1\n * @description the initial page number.\n */\n defaultPage?: PaginationApi['page'];\n /**\n * @default 10\n * @description the initial number of items to display\n */\n defaultPageSize?: PaginationApi['pageSize'];\n /**\n * @description a callback that is called when the page size changes.\n */\n onPageSizeChange?: (pageSize: string) => void;\n /**\n * @default 0\n * @description the total number of items in the dataset.\n */\n total?: PaginationApi['total'];\n}\n\n/**\n * @description The root component for the composable pagination component.\n * It's advised to spread the entire pagination option object into this component.\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n * return (\n * <Pagination.Root {...response.pagination}>\n * <Pagination.PageSize />\n * <Pagination.Links />\n * </Pagination.Root>\n * );\n * };\n * ```\n */\nconst Root = React.forwardRef<HTMLDivElement, RootProps>(\n (\n { children, defaultPageSize = 10, pageCount = 0, defaultPage = 1, onPageSizeChange, total = 0 },\n forwardedRef\n ) => {\n const [{ query }, setQuery] = useQueryParams<\n Pick<PaginationContextValue, 'page' | 'pageSize'> & { filters?: unknown; _q?: unknown }\n >({\n pageSize: defaultPageSize.toString(),\n page: defaultPage.toString(),\n });\n\n const setPageSize = (pageSize: string) => {\n setQuery(withEncodedUserParams(query, { pageSize, page: '1' }));\n\n if (onPageSizeChange) {\n onPageSizeChange(pageSize);\n }\n };\n\n return (\n <Flex\n ref={forwardedRef}\n paddingTop={4}\n paddingBottom={4}\n alignItems=\"flex-end\"\n justifyContent=\"space-between\"\n >\n <PaginationProvider\n currentQuery={query}\n page={query.page}\n pageSize={query.pageSize}\n pageCount={pageCount.toString()}\n setPageSize={setPageSize}\n total={total}\n >\n {children}\n </PaginationProvider>\n </Flex>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * PageSize\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description The page size component is responsible for rendering the select input that allows\n * the user to change the number of items displayed per page.\n * If the total number of items is less than the minimum option, this component will not render.\n */\nconst PageSize = ({ options = DEFAULT_OPTIONS }: Pagination.PageSizeProps) => {\n const { formatMessage } = useIntl();\n\n const pageSize = usePagination('PageSize', (state) => state.pageSize);\n const totalCount = usePagination('PageSize', (state) => state.total);\n const setPageSize = usePagination('PageSize', (state) => state.setPageSize);\n\n const handleChange = (value: string) => {\n setPageSize(value);\n };\n\n const minimumOption = parseInt(options[0], 10);\n\n if (minimumOption >= totalCount) {\n return null;\n }\n\n return (\n <Flex gap={2}>\n <SingleSelect\n size=\"S\"\n aria-label={formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n // @ts-expect-error from the DS V2 this won't be needed because we're only returning strings.\n onChange={handleChange}\n value={pageSize}\n >\n {options.map((option) => (\n <SingleSelectOption key={option} value={option}>\n {option}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Typography textColor=\"neutral600\" tag=\"span\">\n {formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Links\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * The component works as follows\n * `1` , 2, 3, ... 10\n * 1, `2`, 3, ... 10\n * 1, 2, `3`, 4, ... 10\n * 1, 2, 3, `4`, 5, ... 10\n * 1, ..,4, `5`, 6, ... 10\n *\n * 1, ...., 8, 9, `10`\n * 1, ...., 8, `9`, 10\n * 1, ...., 7, `8`, 9, 10\n * 1, ... 6, `7`, 8, 9, 10\n */\n\n/**\n * @description The links component is responsible for rendering the pagination links.\n * If the total number of pages is less than or equal to 1, this component will not render.\n */\nconst Links = ({ boundaryCount = 1, siblingCount = 1 }: Pagination.LinksProps) => {\n const { formatMessage } = useIntl();\n\n const query = usePagination('Links', (state) => state.currentQuery);\n const currentPage = usePagination('Links', (state) => state.page);\n const totalPages = usePagination('Links', (state) => state.pageCount);\n\n const pageCount = parseInt(totalPages, 10);\n const activePage = parseInt(currentPage, 10);\n\n const range = (start: number, end: number) => {\n const length = end - start + 1;\n\n return Array.from({ length }, (_, i) => start + i);\n };\n\n const startPages = range(1, Math.min(boundaryCount, pageCount));\n const endPages = range(Math.max(pageCount - boundaryCount + 1, boundaryCount + 1), pageCount);\n\n const siblingsStart = Math.max(\n Math.min(\n // Natural start\n activePage - siblingCount,\n // Lower boundary when page is high\n pageCount - boundaryCount - siblingCount * 2 - 1\n ),\n // Greater than startPages\n boundaryCount + 2\n );\n\n const siblingsEnd = Math.min(\n Math.max(\n // Natural end\n activePage + siblingCount,\n // Upper boundary when page is low\n boundaryCount + siblingCount * 2 + 2\n ),\n // Less than endPages\n endPages.length > 0 ? endPages[0] - 2 : pageCount - 1\n );\n\n const items = [\n ...startPages,\n\n // Start ellipsis\n // eslint-disable-next-line no-nested-ternary\n ...(siblingsStart > boundaryCount + 2\n ? ['start-ellipsis']\n : boundaryCount + 1 < pageCount - boundaryCount\n ? [boundaryCount + 1]\n : []),\n\n // Sibling pages\n ...range(siblingsStart, siblingsEnd),\n\n // End ellipsis\n // eslint-disable-next-line no-nested-ternary\n ...(siblingsEnd < pageCount - boundaryCount - 1\n ? ['end-ellipsis']\n : pageCount - boundaryCount > boundaryCount\n ? [pageCount - boundaryCount]\n : []),\n\n ...endPages,\n ];\n\n if (pageCount <= 1) {\n return null;\n }\n\n return (\n <PaginationImpl activePage={activePage} pageCount={pageCount}>\n <PreviousLink tag={Link} to={{ search: stringify({ ...query, page: activePage - 1 }) }}>\n {formatMessage({\n id: 'components.pagination.go-to-previous',\n defaultMessage: 'Go to previous page',\n })}\n </PreviousLink>\n {items.map((item) => {\n if (typeof item === 'number') {\n return (\n <PageLink\n tag={Link}\n key={item}\n number={item}\n to={{ search: stringify({ ...query, page: item }) }}\n >\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: item }\n )}\n </PageLink>\n );\n }\n\n return <Dots key={item} />;\n })}\n\n <NextLink tag={Link} to={{ search: stringify({ ...query, page: activePage + 1 }) }}>\n {formatMessage({\n id: 'components.pagination.go-to-next',\n defaultMessage: 'Go to next page',\n })}\n </NextLink>\n </PaginationImpl>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Pagination = {\n Root,\n Links,\n PageSize,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Pagination {\n export interface Props extends RootProps {}\n\n export interface PageSizeProps {\n options?: string[];\n }\n\n export interface LinksProps {\n /**\n * @default 1\n * @description Number of always visible pages at the beginning and end.\n */\n boundaryCount?: number;\n /**\n * @default 1\n * @description Number of always visible pages before and after the current page.\n */\n siblingCount?: number;\n }\n}\n\nexport { Pagination };\n"],"names":["DEFAULT_OPTIONS","PaginationProvider","usePagination","createContext","Root","React","forwardRef","children","defaultPageSize","pageCount","defaultPage","onPageSizeChange","total","forwardedRef","query","setQuery","useQueryParams","pageSize","toString","page","setPageSize","withEncodedUserParams","_jsx","Flex","ref","paddingTop","paddingBottom","alignItems","justifyContent","currentQuery","PageSize","options","formatMessage","useIntl","state","totalCount","handleChange","value","minimumOption","parseInt","_jsxs","gap","SingleSelect","size","aria-label","id","defaultMessage","onChange","map","option","SingleSelectOption","Typography","textColor","tag","Links","boundaryCount","siblingCount","currentPage","totalPages","activePage","range","start","end","length","Array","from","_","i","startPages","Math","min","endPages","max","siblingsStart","siblingsEnd","items","PaginationImpl","PreviousLink","Link","to","search","stringify","item","PageLink","number","Dots","NextLink","Pagination"],"mappings":"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"}
|
|
@@ -7,6 +7,12 @@ import { Link } from 'react-router-dom';
|
|
|
7
7
|
import { useQueryParams, withEncodedUserParams } from '../hooks/useQueryParams.mjs';
|
|
8
8
|
import { createContext } from './Context.mjs';
|
|
9
9
|
|
|
10
|
+
const DEFAULT_OPTIONS = [
|
|
11
|
+
'10',
|
|
12
|
+
'20',
|
|
13
|
+
'50',
|
|
14
|
+
'100'
|
|
15
|
+
];
|
|
10
16
|
const [PaginationProvider, usePagination] = createContext('Pagination');
|
|
11
17
|
/**
|
|
12
18
|
* @description The root component for the composable pagination component.
|
|
@@ -60,12 +66,7 @@ const [PaginationProvider, usePagination] = createContext('Pagination');
|
|
|
60
66
|
* @description The page size component is responsible for rendering the select input that allows
|
|
61
67
|
* the user to change the number of items displayed per page.
|
|
62
68
|
* If the total number of items is less than the minimum option, this component will not render.
|
|
63
|
-
*/ const PageSize = ({ options =
|
|
64
|
-
'10',
|
|
65
|
-
'20',
|
|
66
|
-
'50',
|
|
67
|
-
'100'
|
|
68
|
-
] })=>{
|
|
69
|
+
*/ const PageSize = ({ options = DEFAULT_OPTIONS })=>{
|
|
69
70
|
const { formatMessage } = useIntl();
|
|
70
71
|
const pageSize = usePagination('PageSize', (state)=>state.pageSize);
|
|
71
72
|
const totalCount = usePagination('PageSize', (state)=>state.total);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Pagination.mjs","sources":["../../../../../admin/src/components/Pagination.tsx"],"sourcesContent":["/* eslint-disable import/export */\nimport * as React from 'react';\n\nimport {\n Flex,\n SingleSelectOption,\n SingleSelect,\n Typography,\n Dots,\n NextLink,\n PageLink,\n Pagination as PaginationImpl,\n PreviousLink,\n} from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { useQueryParams, withEncodedUserParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\n\nimport type { Pagination as PaginationApi } from '../../../shared/contracts/shared';\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\ninterface PaginationContextValue {\n /**\n * @description the complete query object, this could include query params\n * injected by other plugins, if you're navigating to a different page you\n * should ensure these are still passed.\n */\n currentQuery?: object;\n pageCount: string;\n pageSize: string;\n page: string;\n setPageSize: (pageSize: string) => void;\n total: NonNullable<RootProps['total']>;\n}\n\nconst [PaginationProvider, usePagination] = createContext<PaginationContextValue>('Pagination');\n\ninterface RootProps {\n children: React.ReactNode;\n /**\n * @default 0\n * @description the total number of pages\n * that exist in the dataset.\n */\n pageCount?: PaginationApi['pageCount'];\n /**\n * @default 1\n * @description the initial page number.\n */\n defaultPage?: PaginationApi['page'];\n /**\n * @default 10\n * @description the initial number of items to display\n */\n defaultPageSize?: PaginationApi['pageSize'];\n /**\n * @description a callback that is called when the page size changes.\n */\n onPageSizeChange?: (pageSize: string) => void;\n /**\n * @default 0\n * @description the total number of items in the dataset.\n */\n total?: PaginationApi['total'];\n}\n\n/**\n * @description The root component for the composable pagination component.\n * It's advised to spread the entire pagination option object into this component.\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n * return (\n * <Pagination.Root {...response.pagination}>\n * <Pagination.PageSize />\n * <Pagination.Links />\n * </Pagination.Root>\n * );\n * };\n * ```\n */\nconst Root = React.forwardRef<HTMLDivElement, RootProps>(\n (\n { children, defaultPageSize = 10, pageCount = 0, defaultPage = 1, onPageSizeChange, total = 0 },\n forwardedRef\n ) => {\n const [{ query }, setQuery] = useQueryParams<\n Pick<PaginationContextValue, 'page' | 'pageSize'> & { filters?: unknown; _q?: unknown }\n >({\n pageSize: defaultPageSize.toString(),\n page: defaultPage.toString(),\n });\n\n const setPageSize = (pageSize: string) => {\n setQuery(withEncodedUserParams(query, { pageSize, page: '1' }));\n\n if (onPageSizeChange) {\n onPageSizeChange(pageSize);\n }\n };\n\n return (\n <Flex\n ref={forwardedRef}\n paddingTop={4}\n paddingBottom={4}\n alignItems=\"flex-end\"\n justifyContent=\"space-between\"\n >\n <PaginationProvider\n currentQuery={query}\n page={query.page}\n pageSize={query.pageSize}\n pageCount={pageCount.toString()}\n setPageSize={setPageSize}\n total={total}\n >\n {children}\n </PaginationProvider>\n </Flex>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * PageSize\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description The page size component is responsible for rendering the select input that allows\n * the user to change the number of items displayed per page.\n * If the total number of items is less than the minimum option, this component will not render.\n */\nconst PageSize = ({ options = ['10', '20', '50', '100'] }: Pagination.PageSizeProps) => {\n const { formatMessage } = useIntl();\n\n const pageSize = usePagination('PageSize', (state) => state.pageSize);\n const totalCount = usePagination('PageSize', (state) => state.total);\n const setPageSize = usePagination('PageSize', (state) => state.setPageSize);\n\n const handleChange = (value: string) => {\n setPageSize(value);\n };\n\n const minimumOption = parseInt(options[0], 10);\n\n if (minimumOption >= totalCount) {\n return null;\n }\n\n return (\n <Flex gap={2}>\n <SingleSelect\n size=\"S\"\n aria-label={formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n // @ts-expect-error from the DS V2 this won't be needed because we're only returning strings.\n onChange={handleChange}\n value={pageSize}\n >\n {options.map((option) => (\n <SingleSelectOption key={option} value={option}>\n {option}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Typography textColor=\"neutral600\" tag=\"span\">\n {formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Links\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * The component works as follows\n * `1` , 2, 3, ... 10\n * 1, `2`, 3, ... 10\n * 1, 2, `3`, 4, ... 10\n * 1, 2, 3, `4`, 5, ... 10\n * 1, ..,4, `5`, 6, ... 10\n *\n * 1, ...., 8, 9, `10`\n * 1, ...., 8, `9`, 10\n * 1, ...., 7, `8`, 9, 10\n * 1, ... 6, `7`, 8, 9, 10\n */\n\n/**\n * @description The links component is responsible for rendering the pagination links.\n * If the total number of pages is less than or equal to 1, this component will not render.\n */\nconst Links = ({ boundaryCount = 1, siblingCount = 1 }: Pagination.LinksProps) => {\n const { formatMessage } = useIntl();\n\n const query = usePagination('Links', (state) => state.currentQuery);\n const currentPage = usePagination('Links', (state) => state.page);\n const totalPages = usePagination('Links', (state) => state.pageCount);\n\n const pageCount = parseInt(totalPages, 10);\n const activePage = parseInt(currentPage, 10);\n\n const range = (start: number, end: number) => {\n const length = end - start + 1;\n\n return Array.from({ length }, (_, i) => start + i);\n };\n\n const startPages = range(1, Math.min(boundaryCount, pageCount));\n const endPages = range(Math.max(pageCount - boundaryCount + 1, boundaryCount + 1), pageCount);\n\n const siblingsStart = Math.max(\n Math.min(\n // Natural start\n activePage - siblingCount,\n // Lower boundary when page is high\n pageCount - boundaryCount - siblingCount * 2 - 1\n ),\n // Greater than startPages\n boundaryCount + 2\n );\n\n const siblingsEnd = Math.min(\n Math.max(\n // Natural end\n activePage + siblingCount,\n // Upper boundary when page is low\n boundaryCount + siblingCount * 2 + 2\n ),\n // Less than endPages\n endPages.length > 0 ? endPages[0] - 2 : pageCount - 1\n );\n\n const items = [\n ...startPages,\n\n // Start ellipsis\n // eslint-disable-next-line no-nested-ternary\n ...(siblingsStart > boundaryCount + 2\n ? ['start-ellipsis']\n : boundaryCount + 1 < pageCount - boundaryCount\n ? [boundaryCount + 1]\n : []),\n\n // Sibling pages\n ...range(siblingsStart, siblingsEnd),\n\n // End ellipsis\n // eslint-disable-next-line no-nested-ternary\n ...(siblingsEnd < pageCount - boundaryCount - 1\n ? ['end-ellipsis']\n : pageCount - boundaryCount > boundaryCount\n ? [pageCount - boundaryCount]\n : []),\n\n ...endPages,\n ];\n\n if (pageCount <= 1) {\n return null;\n }\n\n return (\n <PaginationImpl activePage={activePage} pageCount={pageCount}>\n <PreviousLink tag={Link} to={{ search: stringify({ ...query, page: activePage - 1 }) }}>\n {formatMessage({\n id: 'components.pagination.go-to-previous',\n defaultMessage: 'Go to previous page',\n })}\n </PreviousLink>\n {items.map((item) => {\n if (typeof item === 'number') {\n return (\n <PageLink\n tag={Link}\n key={item}\n number={item}\n to={{ search: stringify({ ...query, page: item }) }}\n >\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: item }\n )}\n </PageLink>\n );\n }\n\n return <Dots key={item} />;\n })}\n\n <NextLink tag={Link} to={{ search: stringify({ ...query, page: activePage + 1 }) }}>\n {formatMessage({\n id: 'components.pagination.go-to-next',\n defaultMessage: 'Go to next page',\n })}\n </NextLink>\n </PaginationImpl>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Pagination = {\n Root,\n Links,\n PageSize,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Pagination {\n export interface Props extends RootProps {}\n\n export interface PageSizeProps {\n options?: string[];\n }\n\n export interface LinksProps {\n /**\n * @default 1\n * @description Number of always visible pages at the beginning and end.\n */\n boundaryCount?: number;\n /**\n * @default 1\n * @description Number of always visible pages before and after the current page.\n */\n siblingCount?: number;\n }\n}\n\nexport { Pagination };\n"],"names":["PaginationProvider","usePagination","createContext","Root","React","forwardRef","children","defaultPageSize","pageCount","defaultPage","onPageSizeChange","total","forwardedRef","query","setQuery","useQueryParams","pageSize","toString","page","setPageSize","withEncodedUserParams","_jsx","Flex","ref","paddingTop","paddingBottom","alignItems","justifyContent","currentQuery","PageSize","options","formatMessage","useIntl","state","totalCount","handleChange","value","minimumOption","parseInt","_jsxs","gap","SingleSelect","size","aria-label","id","defaultMessage","onChange","map","option","SingleSelectOption","Typography","textColor","tag","Links","boundaryCount","siblingCount","currentPage","totalPages","activePage","range","start","end","length","Array","from","_","i","startPages","Math","min","endPages","max","siblingsStart","siblingsEnd","items","PaginationImpl","PreviousLink","Link","to","search","stringify","item","PageLink","number","Dots","NextLink","Pagination"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Pagination.mjs","sources":["../../../../../admin/src/components/Pagination.tsx"],"sourcesContent":["/* eslint-disable import/export */\nimport * as React from 'react';\n\nimport {\n Flex,\n SingleSelectOption,\n SingleSelect,\n Typography,\n Dots,\n NextLink,\n PageLink,\n Pagination as PaginationImpl,\n PreviousLink,\n} from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\n\nimport { useQueryParams, withEncodedUserParams } from '../hooks/useQueryParams';\n\nimport { createContext } from './Context';\n\nimport type { Pagination as PaginationApi } from '../../../shared/contracts/shared';\n\nconst DEFAULT_OPTIONS: NonNullable<Pagination.PageSizeProps['options']> = ['10', '20', '50', '100'];\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\ninterface PaginationContextValue {\n /**\n * @description the complete query object, this could include query params\n * injected by other plugins, if you're navigating to a different page you\n * should ensure these are still passed.\n */\n currentQuery?: object;\n pageCount: string;\n pageSize: string;\n page: string;\n setPageSize: (pageSize: string) => void;\n total: NonNullable<RootProps['total']>;\n}\n\nconst [PaginationProvider, usePagination] = createContext<PaginationContextValue>('Pagination');\n\ninterface RootProps {\n children: React.ReactNode;\n /**\n * @default 0\n * @description the total number of pages\n * that exist in the dataset.\n */\n pageCount?: PaginationApi['pageCount'];\n /**\n * @default 1\n * @description the initial page number.\n */\n defaultPage?: PaginationApi['page'];\n /**\n * @default 10\n * @description the initial number of items to display\n */\n defaultPageSize?: PaginationApi['pageSize'];\n /**\n * @description a callback that is called when the page size changes.\n */\n onPageSizeChange?: (pageSize: string) => void;\n /**\n * @default 0\n * @description the total number of items in the dataset.\n */\n total?: PaginationApi['total'];\n}\n\n/**\n * @description The root component for the composable pagination component.\n * It's advised to spread the entire pagination option object into this component.\n *\n * @example\n * ```tsx\n * const MyComponent = () => {\n * return (\n * <Pagination.Root {...response.pagination}>\n * <Pagination.PageSize />\n * <Pagination.Links />\n * </Pagination.Root>\n * );\n * };\n * ```\n */\nconst Root = React.forwardRef<HTMLDivElement, RootProps>(\n (\n { children, defaultPageSize = 10, pageCount = 0, defaultPage = 1, onPageSizeChange, total = 0 },\n forwardedRef\n ) => {\n const [{ query }, setQuery] = useQueryParams<\n Pick<PaginationContextValue, 'page' | 'pageSize'> & { filters?: unknown; _q?: unknown }\n >({\n pageSize: defaultPageSize.toString(),\n page: defaultPage.toString(),\n });\n\n const setPageSize = (pageSize: string) => {\n setQuery(withEncodedUserParams(query, { pageSize, page: '1' }));\n\n if (onPageSizeChange) {\n onPageSizeChange(pageSize);\n }\n };\n\n return (\n <Flex\n ref={forwardedRef}\n paddingTop={4}\n paddingBottom={4}\n alignItems=\"flex-end\"\n justifyContent=\"space-between\"\n >\n <PaginationProvider\n currentQuery={query}\n page={query.page}\n pageSize={query.pageSize}\n pageCount={pageCount.toString()}\n setPageSize={setPageSize}\n total={total}\n >\n {children}\n </PaginationProvider>\n </Flex>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * PageSize\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description The page size component is responsible for rendering the select input that allows\n * the user to change the number of items displayed per page.\n * If the total number of items is less than the minimum option, this component will not render.\n */\nconst PageSize = ({ options = DEFAULT_OPTIONS }: Pagination.PageSizeProps) => {\n const { formatMessage } = useIntl();\n\n const pageSize = usePagination('PageSize', (state) => state.pageSize);\n const totalCount = usePagination('PageSize', (state) => state.total);\n const setPageSize = usePagination('PageSize', (state) => state.setPageSize);\n\n const handleChange = (value: string) => {\n setPageSize(value);\n };\n\n const minimumOption = parseInt(options[0], 10);\n\n if (minimumOption >= totalCount) {\n return null;\n }\n\n return (\n <Flex gap={2}>\n <SingleSelect\n size=\"S\"\n aria-label={formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n // @ts-expect-error from the DS V2 this won't be needed because we're only returning strings.\n onChange={handleChange}\n value={pageSize}\n >\n {options.map((option) => (\n <SingleSelectOption key={option} value={option}>\n {option}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Typography textColor=\"neutral600\" tag=\"span\">\n {formatMessage({\n id: 'components.PageFooter.select',\n defaultMessage: 'Entries per page',\n })}\n </Typography>\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Links\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * The component works as follows\n * `1` , 2, 3, ... 10\n * 1, `2`, 3, ... 10\n * 1, 2, `3`, 4, ... 10\n * 1, 2, 3, `4`, 5, ... 10\n * 1, ..,4, `5`, 6, ... 10\n *\n * 1, ...., 8, 9, `10`\n * 1, ...., 8, `9`, 10\n * 1, ...., 7, `8`, 9, 10\n * 1, ... 6, `7`, 8, 9, 10\n */\n\n/**\n * @description The links component is responsible for rendering the pagination links.\n * If the total number of pages is less than or equal to 1, this component will not render.\n */\nconst Links = ({ boundaryCount = 1, siblingCount = 1 }: Pagination.LinksProps) => {\n const { formatMessage } = useIntl();\n\n const query = usePagination('Links', (state) => state.currentQuery);\n const currentPage = usePagination('Links', (state) => state.page);\n const totalPages = usePagination('Links', (state) => state.pageCount);\n\n const pageCount = parseInt(totalPages, 10);\n const activePage = parseInt(currentPage, 10);\n\n const range = (start: number, end: number) => {\n const length = end - start + 1;\n\n return Array.from({ length }, (_, i) => start + i);\n };\n\n const startPages = range(1, Math.min(boundaryCount, pageCount));\n const endPages = range(Math.max(pageCount - boundaryCount + 1, boundaryCount + 1), pageCount);\n\n const siblingsStart = Math.max(\n Math.min(\n // Natural start\n activePage - siblingCount,\n // Lower boundary when page is high\n pageCount - boundaryCount - siblingCount * 2 - 1\n ),\n // Greater than startPages\n boundaryCount + 2\n );\n\n const siblingsEnd = Math.min(\n Math.max(\n // Natural end\n activePage + siblingCount,\n // Upper boundary when page is low\n boundaryCount + siblingCount * 2 + 2\n ),\n // Less than endPages\n endPages.length > 0 ? endPages[0] - 2 : pageCount - 1\n );\n\n const items = [\n ...startPages,\n\n // Start ellipsis\n // eslint-disable-next-line no-nested-ternary\n ...(siblingsStart > boundaryCount + 2\n ? ['start-ellipsis']\n : boundaryCount + 1 < pageCount - boundaryCount\n ? [boundaryCount + 1]\n : []),\n\n // Sibling pages\n ...range(siblingsStart, siblingsEnd),\n\n // End ellipsis\n // eslint-disable-next-line no-nested-ternary\n ...(siblingsEnd < pageCount - boundaryCount - 1\n ? ['end-ellipsis']\n : pageCount - boundaryCount > boundaryCount\n ? [pageCount - boundaryCount]\n : []),\n\n ...endPages,\n ];\n\n if (pageCount <= 1) {\n return null;\n }\n\n return (\n <PaginationImpl activePage={activePage} pageCount={pageCount}>\n <PreviousLink tag={Link} to={{ search: stringify({ ...query, page: activePage - 1 }) }}>\n {formatMessage({\n id: 'components.pagination.go-to-previous',\n defaultMessage: 'Go to previous page',\n })}\n </PreviousLink>\n {items.map((item) => {\n if (typeof item === 'number') {\n return (\n <PageLink\n tag={Link}\n key={item}\n number={item}\n to={{ search: stringify({ ...query, page: item }) }}\n >\n {formatMessage(\n { id: 'components.pagination.go-to', defaultMessage: 'Go to page {page}' },\n { page: item }\n )}\n </PageLink>\n );\n }\n\n return <Dots key={item} />;\n })}\n\n <NextLink tag={Link} to={{ search: stringify({ ...query, page: activePage + 1 }) }}>\n {formatMessage({\n id: 'components.pagination.go-to-next',\n defaultMessage: 'Go to next page',\n })}\n </NextLink>\n </PaginationImpl>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EXPORTS\n * -----------------------------------------------------------------------------------------------*/\n\nconst Pagination = {\n Root,\n Links,\n PageSize,\n};\n\n// eslint-disable-next-line @typescript-eslint/no-namespace\nnamespace Pagination {\n export interface Props extends RootProps {}\n\n export interface PageSizeProps {\n options?: string[];\n }\n\n export interface LinksProps {\n /**\n * @default 1\n * @description Number of always visible pages at the beginning and end.\n */\n boundaryCount?: number;\n /**\n * @default 1\n * @description Number of always visible pages before and after the current page.\n */\n siblingCount?: number;\n }\n}\n\nexport { Pagination };\n"],"names":["DEFAULT_OPTIONS","PaginationProvider","usePagination","createContext","Root","React","forwardRef","children","defaultPageSize","pageCount","defaultPage","onPageSizeChange","total","forwardedRef","query","setQuery","useQueryParams","pageSize","toString","page","setPageSize","withEncodedUserParams","_jsx","Flex","ref","paddingTop","paddingBottom","alignItems","justifyContent","currentQuery","PageSize","options","formatMessage","useIntl","state","totalCount","handleChange","value","minimumOption","parseInt","_jsxs","gap","SingleSelect","size","aria-label","id","defaultMessage","onChange","map","option","SingleSelectOption","Typography","textColor","tag","Links","boundaryCount","siblingCount","currentPage","totalPages","activePage","range","start","end","length","Array","from","_","i","startPages","Math","min","endPages","max","siblingsStart","siblingsEnd","items","PaginationImpl","PreviousLink","Link","to","search","stringify","item","PageLink","number","Dots","NextLink","Pagination"],"mappings":"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"}
|
|
@@ -25,6 +25,7 @@ function _interopNamespace(e) {
|
|
|
25
25
|
|
|
26
26
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
27
27
|
|
|
28
|
+
const EMPTY_CUSTOM_INTERVALS = [];
|
|
28
29
|
const intervals = [
|
|
29
30
|
'years',
|
|
30
31
|
'months',
|
|
@@ -46,7 +47,7 @@ const intervals = [
|
|
|
46
47
|
* { unit: 'hours', threshold: 1, text: 'last hour' },
|
|
47
48
|
* ]}
|
|
48
49
|
* ```
|
|
49
|
-
*/ const RelativeTime = /*#__PURE__*/ React__namespace.forwardRef(({ timestamp, customIntervals =
|
|
50
|
+
*/ const RelativeTime = /*#__PURE__*/ React__namespace.forwardRef(({ timestamp, customIntervals = EMPTY_CUSTOM_INTERVALS, ...restProps }, forwardedRef)=>{
|
|
50
51
|
const { formatRelativeTime, formatDate, formatTime } = reactIntl.useIntl();
|
|
51
52
|
// Invalid Date: intervalToDuration throws RangeError (see #27382).
|
|
52
53
|
if (!dateFns.isValid(timestamp)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RelativeTime.js","sources":["../../../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast, isValid } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals =
|
|
1
|
+
{"version":3,"file":"RelativeTime.js","sources":["../../../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast, isValid } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst EMPTY_CUSTOM_INTERVALS: NonNullable<RelativeTimeProps['customIntervals']> = [];\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = EMPTY_CUSTOM_INTERVALS, ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n // Invalid Date: intervalToDuration throws RangeError (see #27382).\n if (!isValid(timestamp)) {\n return (\n <time ref={forwardedRef} role=\"time\" {...restProps}>\n -\n </time>\n );\n }\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit =\n intervals.find((intervalUnit) => {\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\n }) ?? 'seconds';\n\n const value = interval[unit] ?? 0;\n const relativeTime = isPast(timestamp) ? -value : value;\n\n // Display custom text if interval is less than the threshold\n const customInterval = customIntervals.find(\n (custom) => interval[custom.unit] < custom.threshold\n );\n\n const displayText = customInterval\n ? customInterval.text\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\n\n return (\n <time\n ref={forwardedRef}\n dateTime={timestamp.toISOString()}\n role=\"time\"\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\n {...restProps}\n >\n {displayText}\n </time>\n );\n }\n);\n\nexport { RelativeTime };\nexport type { CustomInterval, RelativeTimeProps };\n"],"names":["EMPTY_CUSTOM_INTERVALS","intervals","RelativeTime","React","forwardRef","timestamp","customIntervals","restProps","forwardedRef","formatRelativeTime","formatDate","formatTime","useIntl","isValid","_jsx","time","ref","role","interval","intervalToDuration","start","end","Date","now","unit","find","intervalUnit","Object","keys","includes","value","relativeTime","isPast","customInterval","custom","threshold","displayText","text","numeric","dateTime","toISOString","title"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,MAAMA,yBAA4E,EAAE;AAEpF,MAAMC,SAAAA,GAAmC;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAanG;;;;;;;;;;;;;AAaC,IACD,MAAMC,YAAAA,iBAAeC,gBAAAA,CAAMC,UAAU,CACnC,CAAC,EAAEC,SAAS,EAAEC,eAAAA,GAAkBN,sBAAsB,EAAE,GAAGO,WAAW,EAAEC,YAAAA,GAAAA;AACtE,IAAA,MAAM,EAAEC,kBAAkB,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGC,iBAAAA,EAAAA;;IAGvD,IAAI,CAACC,gBAAQR,SAAAA,CAAAA,EAAY;AACvB,QAAA,qBACES,cAAA,CAACC,MAAAA,EAAAA;YAAKC,GAAAA,EAAKR,YAAAA;YAAcS,IAAAA,EAAK,MAAA;AAAQ,YAAA,GAAGV,SAAS;AAAE,YAAA,QAAA,EAAA;;AAIxD,IAAA;AAEA;;QAGA,MAAMW,WAAWC,0BAAAA,CAAmB;QAClCC,KAAAA,EAAOf,SAAAA;AACPgB,QAAAA,GAAAA,EAAKC,KAAKC,GAAG;AAEf,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GACJvB,SAAAA,CAAUwB,IAAI,CAAC,CAACC,YAAAA,GAAAA;QACd,OAAOR,QAAQ,CAACQ,YAAAA,CAAa,GAAG,CAAA,IAAKC,OAAOC,IAAI,CAACV,QAAAA,CAAAA,CAAUW,QAAQ,CAACH,YAAAA,CAAAA;IACtE,CAAA,CAAA,IAAM,SAAA;AAER,IAAA,MAAMI,KAAAA,GAAQZ,QAAQ,CAACM,IAAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAMO,YAAAA,GAAeC,cAAAA,CAAO3B,SAAAA,CAAAA,GAAa,CAACyB,KAAAA,GAAQA,KAAAA;;AAGlD,IAAA,MAAMG,cAAAA,GAAiB3B,eAAAA,CAAgBmB,IAAI,CACzC,CAACS,MAAAA,GAAWhB,QAAQ,CAACgB,MAAAA,CAAOV,IAAI,CAAC,GAAGU,OAAOC,SAAS,CAAA;AAGtD,IAAA,MAAMC,cAAcH,cAAAA,GAChBA,cAAAA,CAAeI,IAAI,GACnB5B,kBAAAA,CAAmBsB,cAAcP,IAAAA,EAAM;QAAEc,OAAAA,EAAS;AAAO,KAAA,CAAA;AAE7D,IAAA,qBACExB,cAAA,CAACC,MAAAA,EAAAA;QACCC,GAAAA,EAAKR,YAAAA;AACL+B,QAAAA,QAAAA,EAAUlC,UAAUmC,WAAW,EAAA;QAC/BvB,IAAAA,EAAK,MAAA;AACLwB,QAAAA,KAAAA,EAAO,GAAG/B,UAAAA,CAAWL,SAAAA,CAAAA,CAAW,CAAC,EAAEM,WAAWN,SAAAA,CAAAA,CAAAA,CAAY;AACzD,QAAA,GAAGE,SAAS;AAEZ6B,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;;;;"}
|
|
@@ -3,6 +3,7 @@ import * as React from 'react';
|
|
|
3
3
|
import { isValid, intervalToDuration, isPast } from 'date-fns';
|
|
4
4
|
import { useIntl } from 'react-intl';
|
|
5
5
|
|
|
6
|
+
const EMPTY_CUSTOM_INTERVALS = [];
|
|
6
7
|
const intervals = [
|
|
7
8
|
'years',
|
|
8
9
|
'months',
|
|
@@ -24,7 +25,7 @@ const intervals = [
|
|
|
24
25
|
* { unit: 'hours', threshold: 1, text: 'last hour' },
|
|
25
26
|
* ]}
|
|
26
27
|
* ```
|
|
27
|
-
*/ const RelativeTime = /*#__PURE__*/ React.forwardRef(({ timestamp, customIntervals =
|
|
28
|
+
*/ const RelativeTime = /*#__PURE__*/ React.forwardRef(({ timestamp, customIntervals = EMPTY_CUSTOM_INTERVALS, ...restProps }, forwardedRef)=>{
|
|
28
29
|
const { formatRelativeTime, formatDate, formatTime } = useIntl();
|
|
29
30
|
// Invalid Date: intervalToDuration throws RangeError (see #27382).
|
|
30
31
|
if (!isValid(timestamp)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RelativeTime.mjs","sources":["../../../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast, isValid } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals =
|
|
1
|
+
{"version":3,"file":"RelativeTime.mjs","sources":["../../../../../admin/src/components/RelativeTime.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Duration, intervalToDuration, isPast, isValid } from 'date-fns';\nimport { useIntl } from 'react-intl';\n\nconst EMPTY_CUSTOM_INTERVALS: NonNullable<RelativeTimeProps['customIntervals']> = [];\n\nconst intervals: Array<keyof Duration> = ['years', 'months', 'days', 'hours', 'minutes', 'seconds'];\n\ninterface CustomInterval {\n unit: keyof Duration;\n text: string;\n threshold: number;\n}\n\ninterface RelativeTimeProps extends React.ComponentPropsWithoutRef<'time'> {\n timestamp: Date;\n customIntervals?: CustomInterval[];\n}\n\n/**\n * Displays the relative time between a given timestamp and the current time.\n * You can display a custom message for given time intervals by passing an array of custom intervals.\n *\n * @example\n * ```jsx\n * <caption>Display \"last hour\" if the timestamp is less than an hour ago</caption>\n * <RelativeTime\n * timestamp={new Date('2021-01-01')}\n * customIntervals={[\n * { unit: 'hours', threshold: 1, text: 'last hour' },\n * ]}\n * ```\n */\nconst RelativeTime = React.forwardRef<HTMLTimeElement, RelativeTimeProps>(\n ({ timestamp, customIntervals = EMPTY_CUSTOM_INTERVALS, ...restProps }, forwardedRef) => {\n const { formatRelativeTime, formatDate, formatTime } = useIntl();\n\n // Invalid Date: intervalToDuration throws RangeError (see #27382).\n if (!isValid(timestamp)) {\n return (\n <time ref={forwardedRef} role=\"time\" {...restProps}>\n -\n </time>\n );\n }\n\n /**\n * TODO: make this auto-update, like a clock.\n */\n const interval = intervalToDuration({\n start: timestamp,\n end: Date.now(),\n // see https://github.com/date-fns/date-fns/issues/2891 – No idea why it's all partial it returns it every time.\n }) as Required<Duration>;\n\n const unit =\n intervals.find((intervalUnit) => {\n return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);\n }) ?? 'seconds';\n\n const value = interval[unit] ?? 0;\n const relativeTime = isPast(timestamp) ? -value : value;\n\n // Display custom text if interval is less than the threshold\n const customInterval = customIntervals.find(\n (custom) => interval[custom.unit] < custom.threshold\n );\n\n const displayText = customInterval\n ? customInterval.text\n : formatRelativeTime(relativeTime, unit, { numeric: 'auto' });\n\n return (\n <time\n ref={forwardedRef}\n dateTime={timestamp.toISOString()}\n role=\"time\"\n title={`${formatDate(timestamp)} ${formatTime(timestamp)}`}\n {...restProps}\n >\n {displayText}\n </time>\n );\n }\n);\n\nexport { RelativeTime };\nexport type { CustomInterval, RelativeTimeProps };\n"],"names":["EMPTY_CUSTOM_INTERVALS","intervals","RelativeTime","React","forwardRef","timestamp","customIntervals","restProps","forwardedRef","formatRelativeTime","formatDate","formatTime","useIntl","isValid","_jsx","time","ref","role","interval","intervalToDuration","start","end","Date","now","unit","find","intervalUnit","Object","keys","includes","value","relativeTime","isPast","customInterval","custom","threshold","displayText","text","numeric","dateTime","toISOString","title"],"mappings":";;;;;AAKA,MAAMA,yBAA4E,EAAE;AAEpF,MAAMC,SAAAA,GAAmC;AAAC,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,SAAA;AAAW,IAAA;AAAU,CAAA;AAanG;;;;;;;;;;;;;AAaC,IACD,MAAMC,YAAAA,iBAAeC,KAAAA,CAAMC,UAAU,CACnC,CAAC,EAAEC,SAAS,EAAEC,eAAAA,GAAkBN,sBAAsB,EAAE,GAAGO,WAAW,EAAEC,YAAAA,GAAAA;AACtE,IAAA,MAAM,EAAEC,kBAAkB,EAAEC,UAAU,EAAEC,UAAU,EAAE,GAAGC,OAAAA,EAAAA;;IAGvD,IAAI,CAACC,QAAQR,SAAAA,CAAAA,EAAY;AACvB,QAAA,qBACES,GAAA,CAACC,MAAAA,EAAAA;YAAKC,GAAAA,EAAKR,YAAAA;YAAcS,IAAAA,EAAK,MAAA;AAAQ,YAAA,GAAGV,SAAS;AAAE,YAAA,QAAA,EAAA;;AAIxD,IAAA;AAEA;;QAGA,MAAMW,WAAWC,kBAAAA,CAAmB;QAClCC,KAAAA,EAAOf,SAAAA;AACPgB,QAAAA,GAAAA,EAAKC,KAAKC,GAAG;AAEf,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAAA,GACJvB,SAAAA,CAAUwB,IAAI,CAAC,CAACC,YAAAA,GAAAA;QACd,OAAOR,QAAQ,CAACQ,YAAAA,CAAa,GAAG,CAAA,IAAKC,OAAOC,IAAI,CAACV,QAAAA,CAAAA,CAAUW,QAAQ,CAACH,YAAAA,CAAAA;IACtE,CAAA,CAAA,IAAM,SAAA;AAER,IAAA,MAAMI,KAAAA,GAAQZ,QAAQ,CAACM,IAAAA,CAAK,IAAI,CAAA;AAChC,IAAA,MAAMO,YAAAA,GAAeC,MAAAA,CAAO3B,SAAAA,CAAAA,GAAa,CAACyB,KAAAA,GAAQA,KAAAA;;AAGlD,IAAA,MAAMG,cAAAA,GAAiB3B,eAAAA,CAAgBmB,IAAI,CACzC,CAACS,MAAAA,GAAWhB,QAAQ,CAACgB,MAAAA,CAAOV,IAAI,CAAC,GAAGU,OAAOC,SAAS,CAAA;AAGtD,IAAA,MAAMC,cAAcH,cAAAA,GAChBA,cAAAA,CAAeI,IAAI,GACnB5B,kBAAAA,CAAmBsB,cAAcP,IAAAA,EAAM;QAAEc,OAAAA,EAAS;AAAO,KAAA,CAAA;AAE7D,IAAA,qBACExB,GAAA,CAACC,MAAAA,EAAAA;QACCC,GAAAA,EAAKR,YAAAA;AACL+B,QAAAA,QAAAA,EAAUlC,UAAUmC,WAAW,EAAA;QAC/BvB,IAAAA,EAAK,MAAA;AACLwB,QAAAA,KAAAA,EAAO,GAAG/B,UAAAA,CAAWL,SAAAA,CAAAA,CAAW,CAAC,EAAEM,WAAWN,SAAAA,CAAAA,CAAAA,CAAY;AACzD,QAAA,GAAGE,SAAS;AAEZ6B,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;;;;"}
|