@strapi/admin 5.29.0 → 5.30.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/ContentBox.js.map +1 -1
- package/dist/admin/admin/src/components/ContentBox.mjs.map +1 -1
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.js.map +1 -1
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.mjs.map +1 -1
- package/dist/admin/admin/src/components/Filters.js +1 -1
- package/dist/admin/admin/src/components/Filters.js.map +1 -1
- package/dist/admin/admin/src/components/Filters.mjs +1 -1
- package/dist/admin/admin/src/components/Filters.mjs.map +1 -1
- package/dist/admin/admin/src/components/Form.js +8 -3
- package/dist/admin/admin/src/components/Form.js.map +1 -1
- package/dist/admin/admin/src/components/Form.mjs +8 -3
- package/dist/admin/admin/src/components/Form.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Number.js +1 -1
- package/dist/admin/admin/src/components/FormInputs/Number.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Number.mjs +1 -1
- package/dist/admin/admin/src/components/FormInputs/Number.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Renderer.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Renderer.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/String.js +2 -1
- package/dist/admin/admin/src/components/FormInputs/String.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/String.mjs +2 -1
- package/dist/admin/admin/src/components/FormInputs/String.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Time.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Time.mjs.map +1 -1
- package/dist/admin/admin/src/components/GapDropZone.js.map +1 -1
- package/dist/admin/admin/src/components/GapDropZone.mjs.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Overview.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Overview.mjs.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/Step.mjs.map +1 -1
- package/dist/admin/admin/src/components/Layouts/GridLayout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/GridLayout.mjs.map +1 -1
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.js +8 -4
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs +8 -4
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs.map +1 -1
- package/dist/admin/admin/src/components/NpsSurvey.js +5 -3
- package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
- package/dist/admin/admin/src/components/NpsSurvey.mjs +5 -3
- package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.mjs.map +1 -1
- package/dist/admin/admin/src/components/PrivateRoute.js.map +1 -1
- package/dist/admin/admin/src/components/PrivateRoute.mjs.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.js.map +1 -1
- package/dist/admin/admin/src/components/RelativeTime.mjs.map +1 -1
- package/dist/admin/admin/src/components/ResizeIndicator.js.map +1 -1
- package/dist/admin/admin/src/components/ResizeIndicator.mjs.map +1 -1
- package/dist/admin/admin/src/components/Table.js +1 -1
- package/dist/admin/admin/src/components/Table.js.map +1 -1
- package/dist/admin/admin/src/components/Table.mjs +1 -1
- package/dist/admin/admin/src/components/Table.mjs.map +1 -1
- package/dist/admin/admin/src/components/Theme.js +34 -1
- package/dist/admin/admin/src/components/Theme.js.map +1 -1
- package/dist/admin/admin/src/components/Theme.mjs +34 -1
- package/dist/admin/admin/src/components/Theme.mjs.map +1 -1
- package/dist/admin/admin/src/components/Widgets.js.map +1 -1
- package/dist/admin/admin/src/components/Widgets.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/CustomFields.js.map +1 -1
- package/dist/admin/admin/src/core/apis/CustomFields.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/Plugin.js +0 -1
- package/dist/admin/admin/src/core/apis/Plugin.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Plugin.mjs +0 -1
- package/dist/admin/admin/src/core/apis/Plugin.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/rbac.js.map +1 -1
- package/dist/admin/admin/src/core/apis/rbac.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/router.js.map +1 -1
- package/dist/admin/admin/src/core/apis/router.mjs.map +1 -1
- package/dist/admin/admin/src/features/BackButton.js.map +1 -1
- package/dist/admin/admin/src/features/BackButton.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/features/Widgets.js.map +1 -1
- package/dist/admin/admin/src/features/Widgets.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/usePersistentState.js.map +1 -1
- package/dist/admin/admin/src/hooks/usePersistentState.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.js.map +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.js +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.mjs +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.js +2 -2
- package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.mjs +2 -2
- package/dist/admin/admin/src/pages/Marketplace/MarketplacePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.js.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/components/NpmPackageCard.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.js.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/components/NpmPackagesFilters.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.js.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/components/PageHeader.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.js.map +1 -1
- package/dist/admin/admin/src/pages/Marketplace/hooks/useMarketplaceData.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js +8 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs +9 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/LifeSpanInput.mjs.map +1 -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.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenName.js +1 -0
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenName.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenName.mjs +1 -0
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenName.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/EditViewPage.mjs.map +1 -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.map +1 -1
- 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.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js +2 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs +2 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/ListView.mjs.map +1 -1
- 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.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js +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 +1 -0
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/utils/files.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/utils/files.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +10 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs +10 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js +9 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs +9 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/EditPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/ListPage.mjs.map +1 -1
- 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.map +1 -1
- 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.map +1 -1
- 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.map +1 -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.map +1 -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.map +1 -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.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/RoleForm.js +2 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/RoleForm.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/RoleForm.mjs +2 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/RoleForm.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/forms.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/permissions.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/permissions.mjs.map +1 -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.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js +2 -0
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.mjs +2 -0
- package/dist/admin/admin/src/pages/Settings/pages/TransferTokens/ListView.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/EditPage.js +9 -2
- 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 +9 -2
- 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 +3 -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 +3 -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/MagicLinkCE.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/MagicLinkCE.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/SelectRoles.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/SelectRoles.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/EditPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js +1 -1
- 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 +1 -1
- 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 +9 -2
- 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 +9 -2
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/WebhookForm.mjs.map +1 -1
- package/dist/admin/admin/src/pages/UseCasePage.js +1 -0
- package/dist/admin/admin/src/pages/UseCasePage.js.map +1 -1
- package/dist/admin/admin/src/pages/UseCasePage.mjs +1 -0
- package/dist/admin/admin/src/pages/UseCasePage.mjs.map +1 -1
- package/dist/admin/admin/src/services/api.js +2 -1
- package/dist/admin/admin/src/services/api.js.map +1 -1
- package/dist/admin/admin/src/services/api.mjs +2 -1
- package/dist/admin/admin/src/services/api.mjs.map +1 -1
- package/dist/admin/admin/src/services/apiTokens.js.map +1 -1
- package/dist/admin/admin/src/services/apiTokens.mjs.map +1 -1
- package/dist/admin/admin/src/services/transferTokens.js.map +1 -1
- package/dist/admin/admin/src/services/transferTokens.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/services/webhooks.js.map +1 -1
- package/dist/admin/admin/src/services/webhooks.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +4 -0
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +4 -0
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/utils/cookies.js.map +1 -1
- package/dist/admin/admin/src/utils/cookies.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getPrefixedId.js.map +1 -1
- package/dist/admin/admin/src/utils/getPrefixedId.mjs.map +1 -1
- package/dist/admin/admin/src/utils/rulesEngine.js.map +1 -1
- package/dist/admin/admin/src/utils/rulesEngine.mjs.map +1 -1
- package/dist/admin/admin/src/utils/urls.js.map +1 -1
- package/dist/admin/admin/src/utils/urls.mjs.map +1 -1
- package/dist/admin/admin/src/utils/users.js.map +1 -1
- package/dist/admin/admin/src/utils/users.mjs.map +1 -1
- package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.js.map +1 -1
- package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.mjs.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthPage/components/SSOProviders.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthPage/components/SSOProviders.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthResponse.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthResponse.mjs.map +1 -1
- 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.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js +3 -3
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs +3 -3
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/ListPage.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useFormatTimeStamp.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useFormatTimeStamp.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/getDisplayedFilters.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/MagicLinkEE.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/Users/components/MagicLinkEE.mjs.map +1 -1
- package/dist/admin/ee/admin/src/services/ai.js +14 -1
- package/dist/admin/ee/admin/src/services/ai.js.map +1 -1
- package/dist/admin/ee/admin/src/services/ai.mjs +14 -2
- package/dist/admin/ee/admin/src/services/ai.mjs.map +1 -1
- package/dist/admin/ee/admin/src/services/auditLogs.js.map +1 -1
- package/dist/admin/ee/admin/src/services/auditLogs.mjs.map +1 -1
- package/dist/admin/ee.js +1 -0
- package/dist/admin/ee.js.map +1 -1
- package/dist/admin/ee.mjs +1 -1
- package/dist/admin/src/components/Form.d.ts +1 -1
- package/dist/admin/src/core/store/configure.d.ts +2 -2
- package/dist/admin/src/core/store/hooks.d.ts +2 -2
- package/dist/admin/src/ee.d.ts +1 -1
- package/dist/admin/src/hooks/useAdminRoles.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +4 -4
- package/dist/admin/src/selectors.d.ts +2 -2
- package/dist/admin/src/services/admin.d.ts +6 -6
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/apiTokens.d.ts +1 -1
- package/dist/admin/src/services/auth.d.ts +13 -13
- package/dist/admin/src/services/contentApi.d.ts +1 -1
- package/dist/admin/src/services/contentManager.d.ts +1 -1
- package/dist/admin/src/services/homepage.d.ts +3 -3
- package/dist/admin/src/services/transferTokens.d.ts +1 -1
- package/dist/admin/src/services/users.d.ts +8 -8
- package/dist/admin/src/services/webhooks.d.ts +2 -2
- package/dist/admin/tests/utils.d.ts +1 -1
- package/dist/ee/admin/src/services/ai.d.ts +6 -3
- package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
- package/dist/ee/server/src/ai/containers/ai.d.ts +11 -0
- package/dist/ee/server/src/ai/containers/ai.d.ts.map +1 -0
- package/dist/ee/server/src/ai/controllers/ai.d.ts +1 -0
- package/dist/ee/server/src/ai/controllers/ai.d.ts.map +1 -1
- package/dist/ee/server/src/ai/routes/ai.d.ts.map +1 -1
- package/dist/ee/server/src/index.d.ts +1 -0
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/server/ee/server/src/ai/containers/ai.js +18 -0
- package/dist/server/ee/server/src/ai/containers/ai.js.map +1 -0
- package/dist/server/ee/server/src/ai/containers/ai.mjs +16 -0
- package/dist/server/ee/server/src/ai/containers/ai.mjs.map +1 -0
- package/dist/server/ee/server/src/ai/controllers/ai.js +6 -0
- package/dist/server/ee/server/src/ai/controllers/ai.js.map +1 -1
- package/dist/server/ee/server/src/ai/controllers/ai.mjs +6 -0
- package/dist/server/ee/server/src/ai/controllers/ai.mjs.map +1 -1
- package/dist/server/ee/server/src/ai/routes/ai.js +11 -0
- package/dist/server/ee/server/src/ai/routes/ai.js.map +1 -1
- package/dist/server/ee/server/src/ai/routes/ai.mjs +11 -0
- package/dist/server/ee/server/src/ai/routes/ai.mjs.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/audit-logs.js.map +1 -1
- package/dist/server/ee/server/src/audit-logs/services/audit-logs.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/constants.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/constants.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/utils.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/utils.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/user.js.map +1 -1
- package/dist/server/ee/server/src/controllers/user.mjs.map +1 -1
- package/dist/server/ee/server/src/index.js +7 -0
- package/dist/server/ee/server/src/index.js.map +1 -1
- package/dist/server/ee/server/src/index.mjs +7 -0
- package/dist/server/ee/server/src/index.mjs.map +1 -1
- package/dist/server/ee/server/src/services/auth.js.map +1 -1
- package/dist/server/ee/server/src/services/auth.mjs.map +1 -1
- package/dist/server/ee/server/src/services/passport/sso.js.map +1 -1
- package/dist/server/ee/server/src/services/passport/sso.mjs.map +1 -1
- package/dist/server/ee/server/src/utils/index.js.map +1 -1
- package/dist/server/ee/server/src/utils/index.mjs.map +1 -1
- package/dist/server/server/src/controllers/transfer/index.js.map +1 -1
- package/dist/server/server/src/controllers/transfer/index.mjs.map +1 -1
- package/dist/server/server/src/controllers/user.js +10 -0
- package/dist/server/server/src/controllers/user.js.map +1 -1
- package/dist/server/server/src/controllers/user.mjs +10 -0
- package/dist/server/server/src/controllers/user.mjs.map +1 -1
- package/dist/server/server/src/domain/action/index.js.map +1 -1
- package/dist/server/server/src/domain/action/index.mjs.map +1 -1
- package/dist/server/server/src/domain/condition/index.js.map +1 -1
- package/dist/server/server/src/domain/condition/index.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/middlewares/rateLimit.js.map +1 -1
- package/dist/server/server/src/middlewares/rateLimit.mjs.map +1 -1
- package/dist/server/server/src/routes/serve-admin-panel.js.map +1 -1
- package/dist/server/server/src/routes/serve-admin-panel.mjs.map +1 -1
- package/dist/server/server/src/services/api-token.js.map +1 -1
- package/dist/server/server/src/services/api-token.mjs.map +1 -1
- package/dist/server/server/src/services/auth.js.map +1 -1
- package/dist/server/server/src/services/auth.mjs.map +1 -1
- package/dist/server/server/src/services/content-type.js.map +1 -1
- package/dist/server/server/src/services/content-type.mjs.map +1 -1
- package/dist/server/server/src/services/encryption.js.map +1 -1
- package/dist/server/server/src/services/encryption.mjs.map +1 -1
- package/dist/server/server/src/services/homepage.js.map +1 -1
- package/dist/server/server/src/services/homepage.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/sanitize.mjs.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/validate.js.map +1 -1
- package/dist/server/server/src/services/permission/permissions-manager/validate.mjs.map +1 -1
- package/dist/server/server/src/services/role.js.map +1 -1
- package/dist/server/server/src/services/role.mjs.map +1 -1
- package/dist/server/server/src/services/transfer/token.js.map +1 -1
- package/dist/server/server/src/services/transfer/token.mjs.map +1 -1
- package/dist/server/server/src/services/user.js +30 -0
- package/dist/server/server/src/services/user.js.map +1 -1
- package/dist/server/server/src/services/user.mjs +30 -0
- package/dist/server/server/src/services/user.mjs.map +1 -1
- package/dist/server/server/src/utils/index.js.map +1 -1
- package/dist/server/server/src/utils/index.mjs.map +1 -1
- package/dist/server/server/src/validation/action-provider.js.map +1 -1
- package/dist/server/server/src/validation/action-provider.mjs.map +1 -1
- package/dist/server/server/src/validation/common-functions/check-fields-are-correctly-nested.js.map +1 -1
- package/dist/server/server/src/validation/common-functions/check-fields-are-correctly-nested.mjs.map +1 -1
- package/dist/server/server/src/validation/common-validators.js.map +1 -1
- package/dist/server/server/src/validation/common-validators.mjs.map +1 -1
- package/dist/server/src/controllers/user.d.ts.map +1 -1
- package/dist/server/src/services/user.d.ts.map +1 -1
- package/dist/shared/contracts/ai.d.ts +16 -0
- package/dist/shared/contracts/ai.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Theme.js","sources":["../../../../../admin/src/components/Theme.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { DesignSystemProvider } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { type DefaultTheme, createGlobalStyle } from 'styled-components';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { setAvailableThemes } from '../reducer';\n\ninterface ThemeProps {\n children: React.ReactNode;\n themes: {\n dark: DefaultTheme;\n light: DefaultTheme;\n };\n}\n\nconst Theme = ({ children, themes }: ThemeProps) => {\n const { currentTheme } = useTypedSelector((state) => state.admin_app.theme);\n const [systemTheme, setSystemTheme] = React.useState<'light' | 'dark'>();\n const { locale } = useIntl();\n const dispatch = useDispatch();\n\n // Listen to changes in the system theme\n React.useEffect(() => {\n const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(themeWatcher.matches ? 'dark' : 'light');\n\n const listener = (event: MediaQueryListEvent) => {\n setSystemTheme(event.matches ? 'dark' : 'light');\n };\n themeWatcher.addEventListener('change', listener);\n\n // Remove listener on cleanup\n return () => {\n themeWatcher.removeEventListener('change', listener);\n };\n }, []);\n\n React.useEffect(() => {\n dispatch(setAvailableThemes(Object.keys(themes)));\n }, [dispatch, themes]);\n\n const computedThemeName = currentTheme === 'system' ? systemTheme : currentTheme;\n\n return (\n <DesignSystemProvider\n locale={locale}\n /**\n * TODO: could we make this neater i.e. by setting up the context to throw\n * if it can't find it, that way the type is always fully defined and we're\n * not checking it all the time...\n */\n theme={themes?.[computedThemeName || 'light']}\n >\n {children}\n <GlobalStyle />\n </DesignSystemProvider>\n );\n};\n\nconst GlobalStyle = createGlobalStyle
|
|
1
|
+
{"version":3,"file":"Theme.js","sources":["../../../../../admin/src/components/Theme.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { DesignSystemProvider } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { type DefaultTheme, createGlobalStyle } from 'styled-components';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { setAvailableThemes } from '../reducer';\n\ninterface ThemeProps {\n children: React.ReactNode;\n themes: {\n dark: DefaultTheme;\n light: DefaultTheme;\n };\n}\n\nconst Theme = ({ children, themes }: ThemeProps) => {\n const { currentTheme } = useTypedSelector((state) => state.admin_app.theme);\n const [systemTheme, setSystemTheme] = React.useState<'light' | 'dark'>();\n const { locale } = useIntl();\n const dispatch = useDispatch();\n const isIos =\n ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(\n navigator.platform\n ) ||\n (navigator.userAgent.includes('Mac') && 'ontouchend' in document);\n\n // Listen to changes in the system theme\n React.useEffect(() => {\n const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(themeWatcher.matches ? 'dark' : 'light');\n\n const listener = (event: MediaQueryListEvent) => {\n setSystemTheme(event.matches ? 'dark' : 'light');\n };\n themeWatcher.addEventListener('change', listener);\n\n // Remove listener on cleanup\n return () => {\n themeWatcher.removeEventListener('change', listener);\n };\n }, []);\n\n React.useEffect(() => {\n dispatch(setAvailableThemes(Object.keys(themes)));\n }, [dispatch, themes]);\n\n const computedThemeName = currentTheme === 'system' ? systemTheme : currentTheme;\n\n return (\n <DesignSystemProvider\n locale={locale}\n /**\n * TODO: could we make this neater i.e. by setting up the context to throw\n * if it can't find it, that way the type is always fully defined and we're\n * not checking it all the time...\n */\n theme={themes?.[computedThemeName || 'light']}\n >\n {children}\n <GlobalStyle $shouldOverrideInputFontSize={isIos} />\n </DesignSystemProvider>\n );\n};\n\nconst GlobalStyle = createGlobalStyle<{ $shouldOverrideInputFontSize: boolean }>`\n body {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n\n // Temporary fix override to fix iOS zoom due to the 14px input font size\n ${({ $shouldOverrideInputFontSize }) =>\n $shouldOverrideInputFontSize\n ? `\n input[type=\"color\"],\n input[type=\"date\"],\n input[type=\"datetime\"],\n input[type=\"datetime-local\"],\n input[type=\"email\"],\n input[type=\"month\"],\n input[type=\"number\"],\n input[type=\"password\"],\n input[type=\"search\"],\n input[type=\"tel\"],\n input[type=\"text\"],\n input[type=\"time\"],\n input[type=\"url\"],\n input[type=\"week\"],\n select:focus,\n textarea {\n font-size: 16px !important;\n line-height: 2.4rem !important;\n }\n `\n : undefined}\n`;\n\nexport { Theme };\nexport type { ThemeProps };\n"],"names":["Theme","children","themes","currentTheme","useTypedSelector","state","admin_app","theme","systemTheme","setSystemTheme","React","useState","locale","useIntl","dispatch","useDispatch","isIos","includes","navigator","platform","userAgent","document","useEffect","themeWatcher","window","matchMedia","matches","listener","event","addEventListener","removeEventListener","setAvailableThemes","Object","keys","computedThemeName","_jsxs","DesignSystemProvider","_jsx","GlobalStyle","$shouldOverrideInputFontSize","createGlobalStyle","colors","neutral100","undefined"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAMA,QAAQ,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAc,GAAA;IAC7C,MAAM,EAAEC,YAAY,EAAE,GAAGC,sBAAAA,CAAiB,CAACC,KAAUA,GAAAA,KAAAA,CAAMC,SAAS,CAACC,KAAK,CAAA;AAC1E,IAAA,MAAM,CAACC,WAAAA,EAAaC,cAAe,CAAA,GAAGC,iBAAMC,QAAQ,EAAA;IACpD,MAAM,EAAEC,MAAM,EAAE,GAAGC,iBAAAA,EAAAA;AACnB,IAAA,MAAMC,QAAWC,GAAAA,sBAAAA,EAAAA;AACjB,IAAA,MAAMC,KACJ,GAAA;AAAC,QAAA,gBAAA;AAAkB,QAAA,kBAAA;AAAoB,QAAA,gBAAA;AAAkB,QAAA,MAAA;AAAQ,QAAA,QAAA;AAAU,QAAA;KAAO,CAACC,QAAQ,CACzFC,SAAAA,CAAUC,QAAQ,CAAA,IAEnBD,SAAUE,CAAAA,SAAS,CAACH,QAAQ,CAAC,KAAA,CAAA,IAAU,YAAgBI,IAAAA,QAAAA;;AAG1DX,IAAAA,gBAAAA,CAAMY,SAAS,CAAC,IAAA;QACd,MAAMC,YAAAA,GAAeC,MAAOC,CAAAA,UAAU,CAAC,8BAAA,CAAA;QACvChB,cAAec,CAAAA,YAAAA,CAAaG,OAAO,GAAG,MAAS,GAAA,OAAA,CAAA;AAE/C,QAAA,MAAMC,WAAW,CAACC,KAAAA,GAAAA;YAChBnB,cAAemB,CAAAA,KAAAA,CAAMF,OAAO,GAAG,MAAS,GAAA,OAAA,CAAA;AAC1C,SAAA;QACAH,YAAaM,CAAAA,gBAAgB,CAAC,QAAUF,EAAAA,QAAAA,CAAAA;;QAGxC,OAAO,IAAA;YACLJ,YAAaO,CAAAA,mBAAmB,CAAC,QAAUH,EAAAA,QAAAA,CAAAA;AAC7C,SAAA;AACF,KAAA,EAAG,EAAE,CAAA;AAELjB,IAAAA,gBAAAA,CAAMY,SAAS,CAAC,IAAA;QACdR,QAASiB,CAAAA,0BAAAA,CAAmBC,MAAOC,CAAAA,IAAI,CAAC/B,MAAAA,CAAAA,CAAAA,CAAAA;KACvC,EAAA;AAACY,QAAAA,QAAAA;AAAUZ,QAAAA;AAAO,KAAA,CAAA;IAErB,MAAMgC,iBAAAA,GAAoB/B,YAAiB,KAAA,QAAA,GAAWK,WAAcL,GAAAA,YAAAA;AAEpE,IAAA,qBACEgC,eAACC,CAAAA,iCAAAA,EAAAA;QACCxB,MAAQA,EAAAA,MAAAA;AACR;;;;AAIC,UACDL,KAAOL,EAAAA,MAAAA,GAASgC,iBAAAA,IAAqB,OAAQ,CAAA;;AAE5CjC,YAAAA,QAAAA;0BACDoC,cAACC,CAAAA,WAAAA,EAAAA;gBAAYC,4BAA8BvB,EAAAA;;;;AAGjD;AAEA,MAAMsB,WAAAA,GAAcE,wBAA4D;;gBAEhE,EAAE,CAAC,EAAEjC,KAAK,EAAE,GAAKA,KAAMkC,CAAAA,MAAM,CAACC,UAAU,CAAC;;;;AAIvD,EAAA,EAAE,CAAC,EAAEH,4BAA4B,EAAE,GACjCA,+BACI;;;;;;;;;;;;;;;;;;;;AAoBN,EAAA,CAAC,GACKI,SAAU;AAClB,CAAC;;;;"}
|
|
@@ -12,6 +12,14 @@ const Theme = ({ children, themes })=>{
|
|
|
12
12
|
const [systemTheme, setSystemTheme] = React.useState();
|
|
13
13
|
const { locale } = useIntl();
|
|
14
14
|
const dispatch = useDispatch();
|
|
15
|
+
const isIos = [
|
|
16
|
+
'iPad Simulator',
|
|
17
|
+
'iPhone Simulator',
|
|
18
|
+
'iPod Simulator',
|
|
19
|
+
'iPad',
|
|
20
|
+
'iPhone',
|
|
21
|
+
'iPod'
|
|
22
|
+
].includes(navigator.platform) || navigator.userAgent.includes('Mac') && 'ontouchend' in document;
|
|
15
23
|
// Listen to changes in the system theme
|
|
16
24
|
React.useEffect(()=>{
|
|
17
25
|
const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');
|
|
@@ -41,7 +49,9 @@ const Theme = ({ children, themes })=>{
|
|
|
41
49
|
*/ theme: themes?.[computedThemeName || 'light'],
|
|
42
50
|
children: [
|
|
43
51
|
children,
|
|
44
|
-
/*#__PURE__*/ jsx(GlobalStyle, {
|
|
52
|
+
/*#__PURE__*/ jsx(GlobalStyle, {
|
|
53
|
+
$shouldOverrideInputFontSize: isIos
|
|
54
|
+
})
|
|
45
55
|
]
|
|
46
56
|
});
|
|
47
57
|
};
|
|
@@ -49,6 +59,29 @@ const GlobalStyle = createGlobalStyle`
|
|
|
49
59
|
body {
|
|
50
60
|
background: ${({ theme })=>theme.colors.neutral100};
|
|
51
61
|
}
|
|
62
|
+
|
|
63
|
+
// Temporary fix override to fix iOS zoom due to the 14px input font size
|
|
64
|
+
${({ $shouldOverrideInputFontSize })=>$shouldOverrideInputFontSize ? `
|
|
65
|
+
input[type="color"],
|
|
66
|
+
input[type="date"],
|
|
67
|
+
input[type="datetime"],
|
|
68
|
+
input[type="datetime-local"],
|
|
69
|
+
input[type="email"],
|
|
70
|
+
input[type="month"],
|
|
71
|
+
input[type="number"],
|
|
72
|
+
input[type="password"],
|
|
73
|
+
input[type="search"],
|
|
74
|
+
input[type="tel"],
|
|
75
|
+
input[type="text"],
|
|
76
|
+
input[type="time"],
|
|
77
|
+
input[type="url"],
|
|
78
|
+
input[type="week"],
|
|
79
|
+
select:focus,
|
|
80
|
+
textarea {
|
|
81
|
+
font-size: 16px !important;
|
|
82
|
+
line-height: 2.4rem !important;
|
|
83
|
+
}
|
|
84
|
+
` : undefined}
|
|
52
85
|
`;
|
|
53
86
|
|
|
54
87
|
export { Theme };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Theme.mjs","sources":["../../../../../admin/src/components/Theme.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { DesignSystemProvider } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { type DefaultTheme, createGlobalStyle } from 'styled-components';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { setAvailableThemes } from '../reducer';\n\ninterface ThemeProps {\n children: React.ReactNode;\n themes: {\n dark: DefaultTheme;\n light: DefaultTheme;\n };\n}\n\nconst Theme = ({ children, themes }: ThemeProps) => {\n const { currentTheme } = useTypedSelector((state) => state.admin_app.theme);\n const [systemTheme, setSystemTheme] = React.useState<'light' | 'dark'>();\n const { locale } = useIntl();\n const dispatch = useDispatch();\n\n // Listen to changes in the system theme\n React.useEffect(() => {\n const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(themeWatcher.matches ? 'dark' : 'light');\n\n const listener = (event: MediaQueryListEvent) => {\n setSystemTheme(event.matches ? 'dark' : 'light');\n };\n themeWatcher.addEventListener('change', listener);\n\n // Remove listener on cleanup\n return () => {\n themeWatcher.removeEventListener('change', listener);\n };\n }, []);\n\n React.useEffect(() => {\n dispatch(setAvailableThemes(Object.keys(themes)));\n }, [dispatch, themes]);\n\n const computedThemeName = currentTheme === 'system' ? systemTheme : currentTheme;\n\n return (\n <DesignSystemProvider\n locale={locale}\n /**\n * TODO: could we make this neater i.e. by setting up the context to throw\n * if it can't find it, that way the type is always fully defined and we're\n * not checking it all the time...\n */\n theme={themes?.[computedThemeName || 'light']}\n >\n {children}\n <GlobalStyle />\n </DesignSystemProvider>\n );\n};\n\nconst GlobalStyle = createGlobalStyle
|
|
1
|
+
{"version":3,"file":"Theme.mjs","sources":["../../../../../admin/src/components/Theme.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { DesignSystemProvider } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useDispatch } from 'react-redux';\nimport { type DefaultTheme, createGlobalStyle } from 'styled-components';\n\nimport { useTypedSelector } from '../core/store/hooks';\nimport { setAvailableThemes } from '../reducer';\n\ninterface ThemeProps {\n children: React.ReactNode;\n themes: {\n dark: DefaultTheme;\n light: DefaultTheme;\n };\n}\n\nconst Theme = ({ children, themes }: ThemeProps) => {\n const { currentTheme } = useTypedSelector((state) => state.admin_app.theme);\n const [systemTheme, setSystemTheme] = React.useState<'light' | 'dark'>();\n const { locale } = useIntl();\n const dispatch = useDispatch();\n const isIos =\n ['iPad Simulator', 'iPhone Simulator', 'iPod Simulator', 'iPad', 'iPhone', 'iPod'].includes(\n navigator.platform\n ) ||\n (navigator.userAgent.includes('Mac') && 'ontouchend' in document);\n\n // Listen to changes in the system theme\n React.useEffect(() => {\n const themeWatcher = window.matchMedia('(prefers-color-scheme: dark)');\n setSystemTheme(themeWatcher.matches ? 'dark' : 'light');\n\n const listener = (event: MediaQueryListEvent) => {\n setSystemTheme(event.matches ? 'dark' : 'light');\n };\n themeWatcher.addEventListener('change', listener);\n\n // Remove listener on cleanup\n return () => {\n themeWatcher.removeEventListener('change', listener);\n };\n }, []);\n\n React.useEffect(() => {\n dispatch(setAvailableThemes(Object.keys(themes)));\n }, [dispatch, themes]);\n\n const computedThemeName = currentTheme === 'system' ? systemTheme : currentTheme;\n\n return (\n <DesignSystemProvider\n locale={locale}\n /**\n * TODO: could we make this neater i.e. by setting up the context to throw\n * if it can't find it, that way the type is always fully defined and we're\n * not checking it all the time...\n */\n theme={themes?.[computedThemeName || 'light']}\n >\n {children}\n <GlobalStyle $shouldOverrideInputFontSize={isIos} />\n </DesignSystemProvider>\n );\n};\n\nconst GlobalStyle = createGlobalStyle<{ $shouldOverrideInputFontSize: boolean }>`\n body {\n background: ${({ theme }) => theme.colors.neutral100};\n }\n\n // Temporary fix override to fix iOS zoom due to the 14px input font size\n ${({ $shouldOverrideInputFontSize }) =>\n $shouldOverrideInputFontSize\n ? `\n input[type=\"color\"],\n input[type=\"date\"],\n input[type=\"datetime\"],\n input[type=\"datetime-local\"],\n input[type=\"email\"],\n input[type=\"month\"],\n input[type=\"number\"],\n input[type=\"password\"],\n input[type=\"search\"],\n input[type=\"tel\"],\n input[type=\"text\"],\n input[type=\"time\"],\n input[type=\"url\"],\n input[type=\"week\"],\n select:focus,\n textarea {\n font-size: 16px !important;\n line-height: 2.4rem !important;\n }\n `\n : undefined}\n`;\n\nexport { Theme };\nexport type { ThemeProps };\n"],"names":["Theme","children","themes","currentTheme","useTypedSelector","state","admin_app","theme","systemTheme","setSystemTheme","React","useState","locale","useIntl","dispatch","useDispatch","isIos","includes","navigator","platform","userAgent","document","useEffect","themeWatcher","window","matchMedia","matches","listener","event","addEventListener","removeEventListener","setAvailableThemes","Object","keys","computedThemeName","_jsxs","DesignSystemProvider","_jsx","GlobalStyle","$shouldOverrideInputFontSize","createGlobalStyle","colors","neutral100","undefined"],"mappings":";;;;;;;;;AAkBA,MAAMA,QAAQ,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAc,GAAA;IAC7C,MAAM,EAAEC,YAAY,EAAE,GAAGC,gBAAAA,CAAiB,CAACC,KAAUA,GAAAA,KAAAA,CAAMC,SAAS,CAACC,KAAK,CAAA;AAC1E,IAAA,MAAM,CAACC,WAAAA,EAAaC,cAAe,CAAA,GAAGC,MAAMC,QAAQ,EAAA;IACpD,MAAM,EAAEC,MAAM,EAAE,GAAGC,OAAAA,EAAAA;AACnB,IAAA,MAAMC,QAAWC,GAAAA,WAAAA,EAAAA;AACjB,IAAA,MAAMC,KACJ,GAAA;AAAC,QAAA,gBAAA;AAAkB,QAAA,kBAAA;AAAoB,QAAA,gBAAA;AAAkB,QAAA,MAAA;AAAQ,QAAA,QAAA;AAAU,QAAA;KAAO,CAACC,QAAQ,CACzFC,SAAAA,CAAUC,QAAQ,CAAA,IAEnBD,SAAUE,CAAAA,SAAS,CAACH,QAAQ,CAAC,KAAA,CAAA,IAAU,YAAgBI,IAAAA,QAAAA;;AAG1DX,IAAAA,KAAAA,CAAMY,SAAS,CAAC,IAAA;QACd,MAAMC,YAAAA,GAAeC,MAAOC,CAAAA,UAAU,CAAC,8BAAA,CAAA;QACvChB,cAAec,CAAAA,YAAAA,CAAaG,OAAO,GAAG,MAAS,GAAA,OAAA,CAAA;AAE/C,QAAA,MAAMC,WAAW,CAACC,KAAAA,GAAAA;YAChBnB,cAAemB,CAAAA,KAAAA,CAAMF,OAAO,GAAG,MAAS,GAAA,OAAA,CAAA;AAC1C,SAAA;QACAH,YAAaM,CAAAA,gBAAgB,CAAC,QAAUF,EAAAA,QAAAA,CAAAA;;QAGxC,OAAO,IAAA;YACLJ,YAAaO,CAAAA,mBAAmB,CAAC,QAAUH,EAAAA,QAAAA,CAAAA;AAC7C,SAAA;AACF,KAAA,EAAG,EAAE,CAAA;AAELjB,IAAAA,KAAAA,CAAMY,SAAS,CAAC,IAAA;QACdR,QAASiB,CAAAA,kBAAAA,CAAmBC,MAAOC,CAAAA,IAAI,CAAC/B,MAAAA,CAAAA,CAAAA,CAAAA;KACvC,EAAA;AAACY,QAAAA,QAAAA;AAAUZ,QAAAA;AAAO,KAAA,CAAA;IAErB,MAAMgC,iBAAAA,GAAoB/B,YAAiB,KAAA,QAAA,GAAWK,WAAcL,GAAAA,YAAAA;AAEpE,IAAA,qBACEgC,IAACC,CAAAA,oBAAAA,EAAAA;QACCxB,MAAQA,EAAAA,MAAAA;AACR;;;;AAIC,UACDL,KAAOL,EAAAA,MAAAA,GAASgC,iBAAAA,IAAqB,OAAQ,CAAA;;AAE5CjC,YAAAA,QAAAA;0BACDoC,GAACC,CAAAA,WAAAA,EAAAA;gBAAYC,4BAA8BvB,EAAAA;;;;AAGjD;AAEA,MAAMsB,WAAAA,GAAcE,iBAA4D;;gBAEhE,EAAE,CAAC,EAAEjC,KAAK,EAAE,GAAKA,KAAMkC,CAAAA,MAAM,CAACC,UAAU,CAAC;;;;AAIvD,EAAA,EAAE,CAAC,EAAEH,4BAA4B,EAAE,GACjCA,+BACI;;;;;;;;;;;;;;;;;;;;AAoBN,EAAA,CAAC,GACKI,SAAU;AAClB,CAAC;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Widgets.js","sources":["../../../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import { useAuth, useTracking } from '@strapi/admin/strapi-admin';\nimport { Avatar, Badge, Box, Flex, Typography } from '@strapi/design-system';\nimport { Earth, Images, User, Key, Files, Layout, Graph, Webhooks } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useGetCountDocumentsQuery, useGetKeyStatisticsQuery } from '../services/homepage';\nimport { getDisplayName, getInitials } from '../utils/users';\n\nimport { Widget } from './WidgetHelpers';\n\n/* -------------------------------------------------------------------------------------------------\n * ProfileWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DisplayNameTypography = styled(Typography)`\n font-size: 2.4rem;\n`;\n\nconst ProfileWidget = () => {\n const user = useAuth('User', (state) => state.user);\n const userDisplayName = getDisplayName(user);\n const initials = getInitials(user);\n\n return (\n <Flex direction=\"column\" gap={3} height=\"100%\" justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials} />\n {userDisplayName && (\n <DisplayNameTypography fontWeight=\"bold\" textTransform=\"none\" textAlign=\"center\">\n {userDisplayName}\n </DisplayNameTypography>\n )}\n {user?.email && (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {user?.email}\n </Typography>\n )}\n {user?.roles?.length && (\n <Flex marginTop={2} gap={1} wrap=\"wrap\">\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </Flex>\n )}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Key Statistics\n * -----------------------------------------------------------------------------------------------*/\nconst Grid = styled(Box)`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst GridCell = styled(Box)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral200};\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n &:nth-child(2n) {\n border-right: none;\n }\n &:nth-last-child(-n + 2) {\n border-bottom: none;\n }\n`;\n\nconst formatNumber = ({ locale, number }: { locale: string; number: number }) => {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(number);\n};\n\nconst LinkCell = styled(Link)`\n text-decoration: none;\n padding: ${({ theme }) => theme.spaces[3]};\n`;\n\nconst KeyStatisticsWidget = () => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n const { data: countDocuments, isLoading: isLoadingCountDocuments } = useGetCountDocumentsQuery();\n const { data: countKeyStatistics, isLoading: isLoadingKeyStatistics } =\n useGetKeyStatisticsQuery();\n\n if (isLoadingKeyStatistics || isLoadingCountDocuments) {\n return <Widget.Loading />;\n }\n\n if (!countKeyStatistics || !countDocuments) {\n return <Widget.Error />;\n }\n\n const keyStatisticsList = {\n entries: {\n label: {\n id: 'widget.key-statistics.list.entries',\n defaultMessage: 'Entries',\n },\n icon: {\n component: <Files />,\n background: 'primary100',\n color: 'primary600',\n },\n link: '/content-manager',\n },\n assets: {\n label: {\n id: 'widget.key-statistics.list.assets',\n defaultMessage: 'Assets',\n },\n icon: {\n component: <Images />,\n background: 'warning100',\n color: 'warning600',\n },\n link: '/plugins/upload',\n },\n contentTypes: {\n label: {\n id: 'widget.key-statistics.list.contentTypes',\n defaultMessage: 'Content-Types',\n },\n icon: {\n component: <Layout />,\n background: 'secondary100',\n color: 'secondary600',\n },\n link: '/plugins/content-type-builder',\n },\n components: {\n label: {\n id: 'widget.key-statistics.list.components',\n defaultMessage: 'Components',\n },\n icon: {\n component: <Graph />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/plugins/content-type-builder',\n },\n locales: {\n label: {\n id: 'widget.key-statistics.list.locales',\n defaultMessage: 'Locales',\n },\n icon: {\n component: <Earth />,\n background: 'success100',\n color: 'success600',\n },\n link: '/settings/internationalization',\n },\n admins: {\n label: {\n id: 'widget.key-statistics.list.admins',\n defaultMessage: 'Admins',\n },\n icon: {\n component: <User />,\n background: 'danger100',\n color: 'danger600',\n },\n link: '/settings/users?pageSize=10&page=1&sort=firstname',\n },\n webhooks: {\n label: {\n id: 'widget.key-statistics.list.webhooks',\n defaultMessage: 'Webhooks',\n },\n icon: {\n component: <Webhooks />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/settings/webhooks',\n },\n apiTokens: {\n label: {\n id: 'widget.key-statistics.list.apiTokens',\n defaultMessage: 'API Tokens',\n },\n icon: {\n component: <Key />,\n background: 'neutral100',\n color: 'neutral600',\n },\n link: '/settings/api-tokens?sort=name:ASC',\n },\n };\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const totalCountEntries = draft + published + modified;\n\n return (\n <Grid>\n {Object.entries(keyStatisticsList).map(([key, item]) => {\n const value = countKeyStatistics?.[key as keyof typeof countKeyStatistics];\n return (\n value !== null && (\n <GridCell\n as={LinkCell}\n to={item.link}\n key={`key-statistics-${key}`}\n data-testid={`stat-${key}`}\n onClick={() => trackUsage('didOpenKeyStatisticsWidgetLink', { itemKey: key })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Flex\n padding={2}\n borderRadius={1}\n background={item.icon.background}\n color={item.icon.color}\n >\n {item.icon.component}\n </Flex>\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral500\">\n {formatMessage(item.label)}\n </Typography>\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatNumber({\n locale,\n number: key === 'entries' ? totalCountEntries : value,\n })}\n </Typography>\n </Flex>\n </Flex>\n </GridCell>\n )\n );\n })}\n </Grid>\n );\n};\n\nexport { ProfileWidget, KeyStatisticsWidget };\n"],"names":["DisplayNameTypography","styled","Typography","ProfileWidget","user","useAuth","state","userDisplayName","getDisplayName","initials","getInitials","_jsxs","Flex","direction","gap","height","justifyContent","_jsx","Avatar","Item","delayMs","fallback","fontWeight","textTransform","textAlign","email","variant","textColor","roles","length","marginTop","wrap","map","role","Badge","name","id","Grid","Box","theme","colors","neutral200","borderRadius","GridCell","formatNumber","locale","number","Intl","NumberFormat","notation","maximumFractionDigits","format","LinkCell","Link","spaces","KeyStatisticsWidget","trackUsage","useTracking","formatMessage","useIntl","data","countDocuments","isLoading","isLoadingCountDocuments","useGetCountDocumentsQuery","countKeyStatistics","isLoadingKeyStatistics","useGetKeyStatisticsQuery","Widget","Loading","Error","keyStatisticsList","entries","label","defaultMessage","icon","component","Files","background","color","link","assets","Images","contentTypes","Layout","components","Graph","locales","Earth","admins","User","webhooks","Webhooks","apiTokens","Key","draft","published","modified","totalCountEntries","Object","key","item","value","as","to","data-testid","onClick","itemKey","alignItems","padding"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Widgets.js","sources":["../../../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import { useAuth, useTracking } from '@strapi/admin/strapi-admin';\nimport { Avatar, Badge, Box, Flex, Typography } from '@strapi/design-system';\nimport { Earth, Images, User, Key, Files, Layout, Graph, Webhooks } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useGetCountDocumentsQuery, useGetKeyStatisticsQuery } from '../services/homepage';\nimport { getDisplayName, getInitials } from '../utils/users';\n\nimport { Widget } from './WidgetHelpers';\n\n/* -------------------------------------------------------------------------------------------------\n * ProfileWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DisplayNameTypography = styled(Typography)`\n font-size: 2.4rem;\n`;\n\nconst ProfileWidget = () => {\n const user = useAuth('User', (state) => state.user);\n const userDisplayName = getDisplayName(user);\n const initials = getInitials(user);\n\n return (\n <Flex direction=\"column\" gap={3} height=\"100%\" justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials} />\n {userDisplayName && (\n <DisplayNameTypography fontWeight=\"bold\" textTransform=\"none\" textAlign=\"center\">\n {userDisplayName}\n </DisplayNameTypography>\n )}\n {user?.email && (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {user?.email}\n </Typography>\n )}\n {user?.roles?.length && (\n <Flex marginTop={2} gap={1} wrap=\"wrap\">\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </Flex>\n )}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Key Statistics\n * -----------------------------------------------------------------------------------------------*/\nconst Grid = styled(Box)`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst GridCell = styled(Box)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral200};\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n &:nth-child(2n) {\n border-right: none;\n }\n &:nth-last-child(-n + 2) {\n border-bottom: none;\n }\n`;\n\nconst formatNumber = ({ locale, number }: { locale: string; number: number }) => {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(number);\n};\n\nconst LinkCell = styled(Link)`\n text-decoration: none;\n padding: ${({ theme }) => theme.spaces[3]};\n`;\n\nconst KeyStatisticsWidget = () => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n const { data: countDocuments, isLoading: isLoadingCountDocuments } = useGetCountDocumentsQuery();\n const { data: countKeyStatistics, isLoading: isLoadingKeyStatistics } =\n useGetKeyStatisticsQuery();\n\n if (isLoadingKeyStatistics || isLoadingCountDocuments) {\n return <Widget.Loading />;\n }\n\n if (!countKeyStatistics || !countDocuments) {\n return <Widget.Error />;\n }\n\n const keyStatisticsList = {\n entries: {\n label: {\n id: 'widget.key-statistics.list.entries',\n defaultMessage: 'Entries',\n },\n icon: {\n component: <Files />,\n background: 'primary100',\n color: 'primary600',\n },\n link: '/content-manager',\n },\n assets: {\n label: {\n id: 'widget.key-statistics.list.assets',\n defaultMessage: 'Assets',\n },\n icon: {\n component: <Images />,\n background: 'warning100',\n color: 'warning600',\n },\n link: '/plugins/upload',\n },\n contentTypes: {\n label: {\n id: 'widget.key-statistics.list.contentTypes',\n defaultMessage: 'Content-Types',\n },\n icon: {\n component: <Layout />,\n background: 'secondary100',\n color: 'secondary600',\n },\n link: '/plugins/content-type-builder',\n },\n components: {\n label: {\n id: 'widget.key-statistics.list.components',\n defaultMessage: 'Components',\n },\n icon: {\n component: <Graph />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/plugins/content-type-builder',\n },\n locales: {\n label: {\n id: 'widget.key-statistics.list.locales',\n defaultMessage: 'Locales',\n },\n icon: {\n component: <Earth />,\n background: 'success100',\n color: 'success600',\n },\n link: '/settings/internationalization',\n },\n admins: {\n label: {\n id: 'widget.key-statistics.list.admins',\n defaultMessage: 'Admins',\n },\n icon: {\n component: <User />,\n background: 'danger100',\n color: 'danger600',\n },\n link: '/settings/users?pageSize=10&page=1&sort=firstname',\n },\n webhooks: {\n label: {\n id: 'widget.key-statistics.list.webhooks',\n defaultMessage: 'Webhooks',\n },\n icon: {\n component: <Webhooks />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/settings/webhooks',\n },\n apiTokens: {\n label: {\n id: 'widget.key-statistics.list.apiTokens',\n defaultMessage: 'API Tokens',\n },\n icon: {\n component: <Key />,\n background: 'neutral100',\n color: 'neutral600',\n },\n link: '/settings/api-tokens?sort=name:ASC',\n },\n };\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const totalCountEntries = draft + published + modified;\n\n return (\n <Grid>\n {Object.entries(keyStatisticsList).map(([key, item]) => {\n const value = countKeyStatistics?.[key as keyof typeof countKeyStatistics];\n return (\n value !== null && (\n <GridCell\n as={LinkCell}\n to={item.link}\n key={`key-statistics-${key}`}\n data-testid={`stat-${key}`}\n onClick={() => trackUsage('didOpenKeyStatisticsWidgetLink', { itemKey: key })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Flex\n padding={2}\n borderRadius={1}\n background={item.icon.background}\n color={item.icon.color}\n >\n {item.icon.component}\n </Flex>\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral500\">\n {formatMessage(item.label)}\n </Typography>\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatNumber({\n locale,\n number: key === 'entries' ? totalCountEntries : value,\n })}\n </Typography>\n </Flex>\n </Flex>\n </GridCell>\n )\n );\n })}\n </Grid>\n );\n};\n\nexport { ProfileWidget, KeyStatisticsWidget };\n"],"names":["DisplayNameTypography","styled","Typography","ProfileWidget","user","useAuth","state","userDisplayName","getDisplayName","initials","getInitials","_jsxs","Flex","direction","gap","height","justifyContent","_jsx","Avatar","Item","delayMs","fallback","fontWeight","textTransform","textAlign","email","variant","textColor","roles","length","marginTop","wrap","map","role","Badge","name","id","Grid","Box","theme","colors","neutral200","borderRadius","GridCell","formatNumber","locale","number","Intl","NumberFormat","notation","maximumFractionDigits","format","LinkCell","Link","spaces","KeyStatisticsWidget","trackUsage","useTracking","formatMessage","useIntl","data","countDocuments","isLoading","isLoadingCountDocuments","useGetCountDocumentsQuery","countKeyStatistics","isLoadingKeyStatistics","useGetKeyStatisticsQuery","Widget","Loading","Error","keyStatisticsList","entries","label","defaultMessage","icon","component","Files","background","color","link","assets","Images","contentTypes","Layout","components","Graph","locales","Earth","admins","User","webhooks","Webhooks","apiTokens","Key","draft","published","modified","totalCountEntries","Object","key","item","value","as","to","data-testid","onClick","itemKey","alignItems","padding"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Widgets.mjs","sources":["../../../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import { useAuth, useTracking } from '@strapi/admin/strapi-admin';\nimport { Avatar, Badge, Box, Flex, Typography } from '@strapi/design-system';\nimport { Earth, Images, User, Key, Files, Layout, Graph, Webhooks } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useGetCountDocumentsQuery, useGetKeyStatisticsQuery } from '../services/homepage';\nimport { getDisplayName, getInitials } from '../utils/users';\n\nimport { Widget } from './WidgetHelpers';\n\n/* -------------------------------------------------------------------------------------------------\n * ProfileWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DisplayNameTypography = styled(Typography)`\n font-size: 2.4rem;\n`;\n\nconst ProfileWidget = () => {\n const user = useAuth('User', (state) => state.user);\n const userDisplayName = getDisplayName(user);\n const initials = getInitials(user);\n\n return (\n <Flex direction=\"column\" gap={3} height=\"100%\" justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials} />\n {userDisplayName && (\n <DisplayNameTypography fontWeight=\"bold\" textTransform=\"none\" textAlign=\"center\">\n {userDisplayName}\n </DisplayNameTypography>\n )}\n {user?.email && (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {user?.email}\n </Typography>\n )}\n {user?.roles?.length && (\n <Flex marginTop={2} gap={1} wrap=\"wrap\">\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </Flex>\n )}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Key Statistics\n * -----------------------------------------------------------------------------------------------*/\nconst Grid = styled(Box)`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst GridCell = styled(Box)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral200};\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n &:nth-child(2n) {\n border-right: none;\n }\n &:nth-last-child(-n + 2) {\n border-bottom: none;\n }\n`;\n\nconst formatNumber = ({ locale, number }: { locale: string; number: number }) => {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(number);\n};\n\nconst LinkCell = styled(Link)`\n text-decoration: none;\n padding: ${({ theme }) => theme.spaces[3]};\n`;\n\nconst KeyStatisticsWidget = () => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n const { data: countDocuments, isLoading: isLoadingCountDocuments } = useGetCountDocumentsQuery();\n const { data: countKeyStatistics, isLoading: isLoadingKeyStatistics } =\n useGetKeyStatisticsQuery();\n\n if (isLoadingKeyStatistics || isLoadingCountDocuments) {\n return <Widget.Loading />;\n }\n\n if (!countKeyStatistics || !countDocuments) {\n return <Widget.Error />;\n }\n\n const keyStatisticsList = {\n entries: {\n label: {\n id: 'widget.key-statistics.list.entries',\n defaultMessage: 'Entries',\n },\n icon: {\n component: <Files />,\n background: 'primary100',\n color: 'primary600',\n },\n link: '/content-manager',\n },\n assets: {\n label: {\n id: 'widget.key-statistics.list.assets',\n defaultMessage: 'Assets',\n },\n icon: {\n component: <Images />,\n background: 'warning100',\n color: 'warning600',\n },\n link: '/plugins/upload',\n },\n contentTypes: {\n label: {\n id: 'widget.key-statistics.list.contentTypes',\n defaultMessage: 'Content-Types',\n },\n icon: {\n component: <Layout />,\n background: 'secondary100',\n color: 'secondary600',\n },\n link: '/plugins/content-type-builder',\n },\n components: {\n label: {\n id: 'widget.key-statistics.list.components',\n defaultMessage: 'Components',\n },\n icon: {\n component: <Graph />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/plugins/content-type-builder',\n },\n locales: {\n label: {\n id: 'widget.key-statistics.list.locales',\n defaultMessage: 'Locales',\n },\n icon: {\n component: <Earth />,\n background: 'success100',\n color: 'success600',\n },\n link: '/settings/internationalization',\n },\n admins: {\n label: {\n id: 'widget.key-statistics.list.admins',\n defaultMessage: 'Admins',\n },\n icon: {\n component: <User />,\n background: 'danger100',\n color: 'danger600',\n },\n link: '/settings/users?pageSize=10&page=1&sort=firstname',\n },\n webhooks: {\n label: {\n id: 'widget.key-statistics.list.webhooks',\n defaultMessage: 'Webhooks',\n },\n icon: {\n component: <Webhooks />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/settings/webhooks',\n },\n apiTokens: {\n label: {\n id: 'widget.key-statistics.list.apiTokens',\n defaultMessage: 'API Tokens',\n },\n icon: {\n component: <Key />,\n background: 'neutral100',\n color: 'neutral600',\n },\n link: '/settings/api-tokens?sort=name:ASC',\n },\n };\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const totalCountEntries = draft + published + modified;\n\n return (\n <Grid>\n {Object.entries(keyStatisticsList).map(([key, item]) => {\n const value = countKeyStatistics?.[key as keyof typeof countKeyStatistics];\n return (\n value !== null && (\n <GridCell\n as={LinkCell}\n to={item.link}\n key={`key-statistics-${key}`}\n data-testid={`stat-${key}`}\n onClick={() => trackUsage('didOpenKeyStatisticsWidgetLink', { itemKey: key })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Flex\n padding={2}\n borderRadius={1}\n background={item.icon.background}\n color={item.icon.color}\n >\n {item.icon.component}\n </Flex>\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral500\">\n {formatMessage(item.label)}\n </Typography>\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatNumber({\n locale,\n number: key === 'entries' ? totalCountEntries : value,\n })}\n </Typography>\n </Flex>\n </Flex>\n </GridCell>\n )\n );\n })}\n </Grid>\n );\n};\n\nexport { ProfileWidget, KeyStatisticsWidget };\n"],"names":["DisplayNameTypography","styled","Typography","ProfileWidget","user","useAuth","state","userDisplayName","getDisplayName","initials","getInitials","_jsxs","Flex","direction","gap","height","justifyContent","_jsx","Avatar","Item","delayMs","fallback","fontWeight","textTransform","textAlign","email","variant","textColor","roles","length","marginTop","wrap","map","role","Badge","name","id","Grid","Box","theme","colors","neutral200","borderRadius","GridCell","formatNumber","locale","number","Intl","NumberFormat","notation","maximumFractionDigits","format","LinkCell","Link","spaces","KeyStatisticsWidget","trackUsage","useTracking","formatMessage","useIntl","data","countDocuments","isLoading","isLoadingCountDocuments","useGetCountDocumentsQuery","countKeyStatistics","isLoadingKeyStatistics","useGetKeyStatisticsQuery","Widget","Loading","Error","keyStatisticsList","entries","label","defaultMessage","icon","component","Files","background","color","link","assets","Images","contentTypes","Layout","components","Graph","locales","Earth","admins","User","webhooks","Webhooks","apiTokens","Key","draft","published","modified","totalCountEntries","Object","key","item","value","as","to","data-testid","onClick","itemKey","alignItems","padding"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Widgets.mjs","sources":["../../../../../admin/src/components/Widgets.tsx"],"sourcesContent":["import { useAuth, useTracking } from '@strapi/admin/strapi-admin';\nimport { Avatar, Badge, Box, Flex, Typography } from '@strapi/design-system';\nimport { Earth, Images, User, Key, Files, Layout, Graph, Webhooks } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { Link } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useGetCountDocumentsQuery, useGetKeyStatisticsQuery } from '../services/homepage';\nimport { getDisplayName, getInitials } from '../utils/users';\n\nimport { Widget } from './WidgetHelpers';\n\n/* -------------------------------------------------------------------------------------------------\n * ProfileWidget\n * -----------------------------------------------------------------------------------------------*/\n\nconst DisplayNameTypography = styled(Typography)`\n font-size: 2.4rem;\n`;\n\nconst ProfileWidget = () => {\n const user = useAuth('User', (state) => state.user);\n const userDisplayName = getDisplayName(user);\n const initials = getInitials(user);\n\n return (\n <Flex direction=\"column\" gap={3} height=\"100%\" justifyContent=\"center\">\n <Avatar.Item delayMs={0} fallback={initials} />\n {userDisplayName && (\n <DisplayNameTypography fontWeight=\"bold\" textTransform=\"none\" textAlign=\"center\">\n {userDisplayName}\n </DisplayNameTypography>\n )}\n {user?.email && (\n <Typography variant=\"omega\" textColor=\"neutral600\">\n {user?.email}\n </Typography>\n )}\n {user?.roles?.length && (\n <Flex marginTop={2} gap={1} wrap=\"wrap\">\n {user?.roles?.map((role) => <Badge key={role.id}>{role.name}</Badge>)}\n </Flex>\n )}\n </Flex>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Key Statistics\n * -----------------------------------------------------------------------------------------------*/\nconst Grid = styled(Box)`\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 0;\n border: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-radius: ${({ theme }) => theme.borderRadius};\n overflow: hidden;\n`;\n\nconst GridCell = styled(Box)`\n border-bottom: 1px solid ${({ theme }) => theme.colors.neutral200};\n border-right: 1px solid ${({ theme }) => theme.colors.neutral200};\n display: flex;\n flex-direction: row;\n align-items: flex-start;\n\n &:nth-child(2n) {\n border-right: none;\n }\n &:nth-last-child(-n + 2) {\n border-bottom: none;\n }\n`;\n\nconst formatNumber = ({ locale, number }: { locale: string; number: number }) => {\n return new Intl.NumberFormat(locale, {\n notation: 'compact',\n maximumFractionDigits: 1,\n }).format(number);\n};\n\nconst LinkCell = styled(Link)`\n text-decoration: none;\n padding: ${({ theme }) => theme.spaces[3]};\n`;\n\nconst KeyStatisticsWidget = () => {\n const { trackUsage } = useTracking();\n const { formatMessage, locale } = useIntl();\n const { data: countDocuments, isLoading: isLoadingCountDocuments } = useGetCountDocumentsQuery();\n const { data: countKeyStatistics, isLoading: isLoadingKeyStatistics } =\n useGetKeyStatisticsQuery();\n\n if (isLoadingKeyStatistics || isLoadingCountDocuments) {\n return <Widget.Loading />;\n }\n\n if (!countKeyStatistics || !countDocuments) {\n return <Widget.Error />;\n }\n\n const keyStatisticsList = {\n entries: {\n label: {\n id: 'widget.key-statistics.list.entries',\n defaultMessage: 'Entries',\n },\n icon: {\n component: <Files />,\n background: 'primary100',\n color: 'primary600',\n },\n link: '/content-manager',\n },\n assets: {\n label: {\n id: 'widget.key-statistics.list.assets',\n defaultMessage: 'Assets',\n },\n icon: {\n component: <Images />,\n background: 'warning100',\n color: 'warning600',\n },\n link: '/plugins/upload',\n },\n contentTypes: {\n label: {\n id: 'widget.key-statistics.list.contentTypes',\n defaultMessage: 'Content-Types',\n },\n icon: {\n component: <Layout />,\n background: 'secondary100',\n color: 'secondary600',\n },\n link: '/plugins/content-type-builder',\n },\n components: {\n label: {\n id: 'widget.key-statistics.list.components',\n defaultMessage: 'Components',\n },\n icon: {\n component: <Graph />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/plugins/content-type-builder',\n },\n locales: {\n label: {\n id: 'widget.key-statistics.list.locales',\n defaultMessage: 'Locales',\n },\n icon: {\n component: <Earth />,\n background: 'success100',\n color: 'success600',\n },\n link: '/settings/internationalization',\n },\n admins: {\n label: {\n id: 'widget.key-statistics.list.admins',\n defaultMessage: 'Admins',\n },\n icon: {\n component: <User />,\n background: 'danger100',\n color: 'danger600',\n },\n link: '/settings/users?pageSize=10&page=1&sort=firstname',\n },\n webhooks: {\n label: {\n id: 'widget.key-statistics.list.webhooks',\n defaultMessage: 'Webhooks',\n },\n icon: {\n component: <Webhooks />,\n background: 'alternative100',\n color: 'alternative600',\n },\n link: '/settings/webhooks',\n },\n apiTokens: {\n label: {\n id: 'widget.key-statistics.list.apiTokens',\n defaultMessage: 'API Tokens',\n },\n icon: {\n component: <Key />,\n background: 'neutral100',\n color: 'neutral600',\n },\n link: '/settings/api-tokens?sort=name:ASC',\n },\n };\n\n const { draft, published, modified } = countDocuments ?? {\n draft: 0,\n published: 0,\n modified: 0,\n };\n\n const totalCountEntries = draft + published + modified;\n\n return (\n <Grid>\n {Object.entries(keyStatisticsList).map(([key, item]) => {\n const value = countKeyStatistics?.[key as keyof typeof countKeyStatistics];\n return (\n value !== null && (\n <GridCell\n as={LinkCell}\n to={item.link}\n key={`key-statistics-${key}`}\n data-testid={`stat-${key}`}\n onClick={() => trackUsage('didOpenKeyStatisticsWidgetLink', { itemKey: key })}\n >\n <Flex alignItems=\"center\" gap={2}>\n <Flex\n padding={2}\n borderRadius={1}\n background={item.icon.background}\n color={item.icon.color}\n >\n {item.icon.component}\n </Flex>\n <Flex direction=\"column\" alignItems=\"flex-start\">\n <Typography variant=\"pi\" fontWeight=\"bold\" textColor=\"neutral500\">\n {formatMessage(item.label)}\n </Typography>\n <Typography variant=\"omega\" fontWeight=\"bold\" textColor=\"neutral800\">\n {formatNumber({\n locale,\n number: key === 'entries' ? totalCountEntries : value,\n })}\n </Typography>\n </Flex>\n </Flex>\n </GridCell>\n )\n );\n })}\n </Grid>\n );\n};\n\nexport { ProfileWidget, KeyStatisticsWidget };\n"],"names":["DisplayNameTypography","styled","Typography","ProfileWidget","user","useAuth","state","userDisplayName","getDisplayName","initials","getInitials","_jsxs","Flex","direction","gap","height","justifyContent","_jsx","Avatar","Item","delayMs","fallback","fontWeight","textTransform","textAlign","email","variant","textColor","roles","length","marginTop","wrap","map","role","Badge","name","id","Grid","Box","theme","colors","neutral200","borderRadius","GridCell","formatNumber","locale","number","Intl","NumberFormat","notation","maximumFractionDigits","format","LinkCell","Link","spaces","KeyStatisticsWidget","trackUsage","useTracking","formatMessage","useIntl","data","countDocuments","isLoading","isLoadingCountDocuments","useGetCountDocumentsQuery","countKeyStatistics","isLoadingKeyStatistics","useGetKeyStatisticsQuery","Widget","Loading","Error","keyStatisticsList","entries","label","defaultMessage","icon","component","Files","background","color","link","assets","Images","contentTypes","Layout","components","Graph","locales","Earth","admins","User","webhooks","Webhooks","apiTokens","Key","draft","published","modified","totalCountEntries","Object","key","item","value","as","to","data-testid","onClick","itemKey","alignItems","padding"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFields.js","sources":["../../../../../../admin/src/core/apis/CustomFields.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { ComponentType } from 'react';\n\nimport { Internal, Utils } from '@strapi/types';\nimport invariant from 'invariant';\n\nimport type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { AnySchema } from 'yup';\n\ntype CustomFieldUID = Utils.String.Suffix<\n | Internal.Namespace.WithSeparator<Internal.Namespace.Plugin>\n | Internal.Namespace.WithSeparator<Internal.Namespace.Global>,\n string\n>;\n\ntype CustomFieldOptionInput =\n | 'text'\n | 'checkbox'\n | 'checkbox-with-number-field'\n | 'select-default-boolean'\n | 'date'\n | 'select'\n | 'number'\n | 'boolean-radio-group'\n | 'select-date'\n | 'text-area-enum'\n | 'select-number'\n | 'radio-group';\n\ntype CustomFieldOptionName =\n | 'min'\n | 'minLength'\n | 'max'\n | 'maxLength'\n | 'required'\n | 'regex'\n | 'enum'\n | 'unique'\n | 'private'\n | 'default';\n\ninterface CustomFieldOption {\n intlLabel: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n description: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n name: CustomFieldOptionName;\n type: CustomFieldOptionInput;\n defaultValue?: string | number | boolean | Date;\n}\n\ninterface CustomFieldOptionSection {\n sectionTitle:\n | (MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n })\n | null;\n items: CustomFieldOption[];\n}\n\ninterface CustomFieldOptions {\n base?: (CustomFieldOptionSection | CustomFieldOption)[];\n advanced?: (CustomFieldOptionSection | CustomFieldOption)[];\n validator?: () => Record<string, AnySchema>;\n}\n\ninterface CustomField {\n name: string;\n pluginId?: string;\n type: (typeof ALLOWED_TYPES)[number];\n intlLabel: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n intlDescription: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n icon?: ComponentType;\n components: {\n Input: () => Promise<{ default?: ComponentType }>;\n };\n options?: CustomFieldOptions;\n}\n\nconst ALLOWED_TYPES = [\n 'biginteger',\n 'boolean',\n 'date',\n 'datetime',\n 'decimal',\n 'email',\n 'enumeration',\n 'float',\n 'integer',\n 'json',\n 'password',\n 'richtext',\n 'string',\n 'text',\n 'time',\n 'uid',\n] as const;\n\nconst ALLOWED_ROOT_LEVEL_OPTIONS = [\n 'min',\n 'minLength',\n 'max',\n 'maxLength',\n 'required',\n 'regex',\n 'enum',\n 'unique',\n 'private',\n 'default',\n] as const;\n\nclass CustomFields {\n customFields: Record<string, CustomField>;\n\n constructor() {\n this.customFields = {};\n }\n\n register = (customFields: CustomField | CustomField[]) => {\n if (Array.isArray(customFields)) {\n // If several custom fields are passed, register them one by one\n customFields.forEach((customField) => {\n this.register(customField);\n });\n } else {\n // Handle individual custom field\n const { name, pluginId, type, intlLabel, intlDescription, components, options } =\n customFields;\n\n // Ensure required attributes are provided\n invariant(name, 'A name must be provided');\n invariant(type, 'A type must be provided');\n invariant(intlLabel, 'An intlLabel must be provided');\n invariant(intlDescription, 'An intlDescription must be provided');\n invariant(components, 'A components object must be provided');\n invariant(components.Input, 'An Input component must be provided');\n\n // Ensure the type is valid\n invariant(\n ALLOWED_TYPES.includes(type),\n `Custom field type: '${type}' is not a valid Strapi type or it can't be used with a Custom Field`\n );\n\n // Ensure name has no special characters\n const isValidObjectKey = /^(?![0-9])[a-zA-Z0-9$_-]+$/g;\n invariant(\n isValidObjectKey.test(name),\n `Custom field name: '${name}' is not a valid object key`\n );\n\n // Ensure options have valid name paths\n const allFormOptions = [...(options?.base || []), ...(options?.advanced || [])];\n\n if (allFormOptions.length) {\n const optionPathValidations = allFormOptions.reduce(optionsValidationReducer, []);\n\n optionPathValidations.forEach(({ isValidOptionPath, errorMessage }) => {\n invariant(isValidOptionPath, errorMessage);\n });\n }\n\n // When no plugin is specified, default to the global namespace\n const uid: CustomFieldUID = pluginId ? `plugin::${pluginId}.${name}` : `global::${name}`;\n\n // Ensure the uid is unique\n const uidAlreadyUsed = Object.prototype.hasOwnProperty.call(this.customFields, uid);\n invariant(!uidAlreadyUsed, `Custom field: '${uid}' has already been registered`);\n\n this.customFields[uid] = customFields;\n }\n };\n\n getAll = () => {\n return this.customFields;\n };\n\n get = (uid: string): CustomField | undefined => {\n return this.customFields[uid];\n };\n}\n\ninterface OptionValidation {\n isValidOptionPath: boolean;\n errorMessage: string;\n}\n\nconst optionsValidationReducer = (\n acc: OptionValidation[],\n option: CustomFieldOptionSection | CustomFieldOption\n): OptionValidation[] => {\n if ('items' in option) {\n return option.items.reduce(optionsValidationReducer, acc);\n }\n\n if (!option.name) {\n acc.push({\n isValidOptionPath: false,\n errorMessage: \"The 'name' property is required on an options object\",\n });\n } else {\n acc.push({\n isValidOptionPath:\n option.name.startsWith('options') || ALLOWED_ROOT_LEVEL_OPTIONS.includes(option.name),\n errorMessage: `'${option.name}' must be prefixed with 'options.'`,\n });\n }\n\n return acc;\n};\n\nexport { type CustomField, CustomFields };\n"],"names":["ALLOWED_TYPES","ALLOWED_ROOT_LEVEL_OPTIONS","CustomFields","
|
|
1
|
+
{"version":3,"file":"CustomFields.js","sources":["../../../../../../admin/src/core/apis/CustomFields.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { ComponentType } from 'react';\n\nimport { Internal, Utils } from '@strapi/types';\nimport invariant from 'invariant';\n\nimport type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { AnySchema } from 'yup';\n\ntype CustomFieldUID = Utils.String.Suffix<\n | Internal.Namespace.WithSeparator<Internal.Namespace.Plugin>\n | Internal.Namespace.WithSeparator<Internal.Namespace.Global>,\n string\n>;\n\ntype CustomFieldOptionInput =\n | 'text'\n | 'checkbox'\n | 'checkbox-with-number-field'\n | 'select-default-boolean'\n | 'date'\n | 'select'\n | 'number'\n | 'boolean-radio-group'\n | 'select-date'\n | 'text-area-enum'\n | 'select-number'\n | 'radio-group';\n\ntype CustomFieldOptionName =\n | 'min'\n | 'minLength'\n | 'max'\n | 'maxLength'\n | 'required'\n | 'regex'\n | 'enum'\n | 'unique'\n | 'private'\n | 'default';\n\ninterface CustomFieldOption {\n intlLabel: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n description: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n name: CustomFieldOptionName;\n type: CustomFieldOptionInput;\n defaultValue?: string | number | boolean | Date;\n}\n\ninterface CustomFieldOptionSection {\n sectionTitle:\n | (MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n })\n | null;\n items: CustomFieldOption[];\n}\n\ninterface CustomFieldOptions {\n base?: (CustomFieldOptionSection | CustomFieldOption)[];\n advanced?: (CustomFieldOptionSection | CustomFieldOption)[];\n validator?: () => Record<string, AnySchema>;\n}\n\ninterface CustomField {\n name: string;\n pluginId?: string;\n type: (typeof ALLOWED_TYPES)[number];\n intlLabel: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n intlDescription: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n icon?: ComponentType;\n components: {\n Input: () => Promise<{ default?: ComponentType }>;\n };\n options?: CustomFieldOptions;\n}\n\nconst ALLOWED_TYPES = [\n 'biginteger',\n 'boolean',\n 'date',\n 'datetime',\n 'decimal',\n 'email',\n 'enumeration',\n 'float',\n 'integer',\n 'json',\n 'password',\n 'richtext',\n 'string',\n 'text',\n 'time',\n 'uid',\n] as const;\n\nconst ALLOWED_ROOT_LEVEL_OPTIONS = [\n 'min',\n 'minLength',\n 'max',\n 'maxLength',\n 'required',\n 'regex',\n 'enum',\n 'unique',\n 'private',\n 'default',\n] as const;\n\nclass CustomFields {\n customFields: Record<string, CustomField>;\n\n constructor() {\n this.customFields = {};\n }\n\n register = (customFields: CustomField | CustomField[]) => {\n if (Array.isArray(customFields)) {\n // If several custom fields are passed, register them one by one\n customFields.forEach((customField) => {\n this.register(customField);\n });\n } else {\n // Handle individual custom field\n const { name, pluginId, type, intlLabel, intlDescription, components, options } =\n customFields;\n\n // Ensure required attributes are provided\n invariant(name, 'A name must be provided');\n invariant(type, 'A type must be provided');\n invariant(intlLabel, 'An intlLabel must be provided');\n invariant(intlDescription, 'An intlDescription must be provided');\n invariant(components, 'A components object must be provided');\n invariant(components.Input, 'An Input component must be provided');\n\n // Ensure the type is valid\n invariant(\n ALLOWED_TYPES.includes(type),\n `Custom field type: '${type}' is not a valid Strapi type or it can't be used with a Custom Field`\n );\n\n // Ensure name has no special characters\n const isValidObjectKey = /^(?![0-9])[a-zA-Z0-9$_-]+$/g;\n invariant(\n isValidObjectKey.test(name),\n `Custom field name: '${name}' is not a valid object key`\n );\n\n // Ensure options have valid name paths\n const allFormOptions = [...(options?.base || []), ...(options?.advanced || [])];\n\n if (allFormOptions.length) {\n const optionPathValidations = allFormOptions.reduce(optionsValidationReducer, []);\n\n optionPathValidations.forEach(({ isValidOptionPath, errorMessage }) => {\n invariant(isValidOptionPath, errorMessage);\n });\n }\n\n // When no plugin is specified, default to the global namespace\n const uid: CustomFieldUID = pluginId ? `plugin::${pluginId}.${name}` : `global::${name}`;\n\n // Ensure the uid is unique\n const uidAlreadyUsed = Object.prototype.hasOwnProperty.call(this.customFields, uid);\n invariant(!uidAlreadyUsed, `Custom field: '${uid}' has already been registered`);\n\n this.customFields[uid] = customFields;\n }\n };\n\n getAll = () => {\n return this.customFields;\n };\n\n get = (uid: string): CustomField | undefined => {\n return this.customFields[uid];\n };\n}\n\ninterface OptionValidation {\n isValidOptionPath: boolean;\n errorMessage: string;\n}\n\nconst optionsValidationReducer = (\n acc: OptionValidation[],\n option: CustomFieldOptionSection | CustomFieldOption\n): OptionValidation[] => {\n if ('items' in option) {\n return option.items.reduce(optionsValidationReducer, acc);\n }\n\n if (!option.name) {\n acc.push({\n isValidOptionPath: false,\n errorMessage: \"The 'name' property is required on an options object\",\n });\n } else {\n acc.push({\n isValidOptionPath:\n option.name.startsWith('options') || ALLOWED_ROOT_LEVEL_OPTIONS.includes(option.name),\n errorMessage: `'${option.name}' must be prefixed with 'options.'`,\n });\n }\n\n return acc;\n};\n\nexport { type CustomField, CustomFields };\n"],"names":["ALLOWED_TYPES","ALLOWED_ROOT_LEVEL_OPTIONS","CustomFields","register","customFields","Array","isArray","forEach","customField","name","pluginId","type","intlLabel","intlDescription","components","options","invariant","Input","includes","isValidObjectKey","test","allFormOptions","base","advanced","length","optionPathValidations","reduce","optionsValidationReducer","isValidOptionPath","errorMessage","uid","uidAlreadyUsed","Object","prototype","hasOwnProperty","call","getAll","get","acc","option","items","push","startsWith"],"mappings":";;;;AAqFA,MAAMA,aAAgB,GAAA;AACpB,IAAA,YAAA;AACA,IAAA,SAAA;AACA,IAAA,MAAA;AACA,IAAA,UAAA;AACA,IAAA,SAAA;AACA,IAAA,OAAA;AACA,IAAA,aAAA;AACA,IAAA,OAAA;AACA,IAAA,SAAA;AACA,IAAA,MAAA;AACA,IAAA,UAAA;AACA,IAAA,UAAA;AACA,IAAA,QAAA;AACA,IAAA,MAAA;AACA,IAAA,MAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,0BAA6B,GAAA;AACjC,IAAA,KAAA;AACA,IAAA,WAAA;AACA,IAAA,KAAA;AACA,IAAA,WAAA;AACA,IAAA,UAAA;AACA,IAAA,OAAA;AACA,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,SAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,YAAAA,CAAAA;IAGJ,WAAc,EAAA;AAIdC,QAAAA,IAAAA,CAAAA,QAAAA,GAAW,CAACC,YAAAA,GAAAA;YACV,IAAIC,KAAAA,CAAMC,OAAO,CAACF,YAAe,CAAA,EAAA;;gBAE/BA,YAAaG,CAAAA,OAAO,CAAC,CAACC,WAAAA,GAAAA;oBACpB,IAAI,CAACL,QAAQ,CAACK,WAAAA,CAAAA;AAChB,iBAAA,CAAA;aACK,MAAA;;AAEL,gBAAA,MAAM,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,SAAS,EAAEC,eAAe,EAAEC,UAAU,EAAEC,OAAO,EAAE,GAC7EX,YAAAA;;AAGFY,gBAAAA,SAAAA,CAAUP,IAAM,EAAA,yBAAA,CAAA;AAChBO,gBAAAA,SAAAA,CAAUL,IAAM,EAAA,yBAAA,CAAA;AAChBK,gBAAAA,SAAAA,CAAUJ,SAAW,EAAA,+BAAA,CAAA;AACrBI,gBAAAA,SAAAA,CAAUH,eAAiB,EAAA,qCAAA,CAAA;AAC3BG,gBAAAA,SAAAA,CAAUF,UAAY,EAAA,sCAAA,CAAA;gBACtBE,SAAUF,CAAAA,UAAAA,CAAWG,KAAK,EAAE,qCAAA,CAAA;;gBAG5BD,SACEhB,CAAAA,aAAAA,CAAckB,QAAQ,CAACP,IAAAA,CAAAA,EACvB,CAAC,oBAAoB,EAAEA,IAAK,CAAA,oEAAoE,CAAC,CAAA;;AAInG,gBAAA,MAAMQ,gBAAmB,GAAA,6BAAA;gBACzBH,SACEG,CAAAA,gBAAAA,CAAiBC,IAAI,CAACX,IAAAA,CAAAA,EACtB,CAAC,oBAAoB,EAAEA,IAAK,CAAA,2BAA2B,CAAC,CAAA;;AAI1D,gBAAA,MAAMY,cAAiB,GAAA;AAAKN,oBAAAA,GAAAA,OAAAA,EAASO,QAAQ,EAAE;AAAOP,oBAAAA,GAAAA,OAAAA,EAASQ,YAAY;AAAI,iBAAA;gBAE/E,IAAIF,cAAAA,CAAeG,MAAM,EAAE;AACzB,oBAAA,MAAMC,qBAAwBJ,GAAAA,cAAAA,CAAeK,MAAM,CAACC,0BAA0B,EAAE,CAAA;AAEhFF,oBAAAA,qBAAAA,CAAsBlB,OAAO,CAAC,CAAC,EAAEqB,iBAAiB,EAAEC,YAAY,EAAE,GAAA;AAChEb,wBAAAA,SAAAA,CAAUY,iBAAmBC,EAAAA,YAAAA,CAAAA;AAC/B,qBAAA,CAAA;AACF;;AAGA,gBAAA,MAAMC,GAAsBpB,GAAAA,QAAAA,GAAW,CAAC,QAAQ,EAAEA,QAAAA,CAAS,CAAC,EAAED,IAAM,CAAA,CAAA,GAAG,CAAC,QAAQ,EAAEA,IAAM,CAAA,CAAA;;gBAGxF,MAAMsB,cAAAA,GAAiBC,MAAOC,CAAAA,SAAS,CAACC,cAAc,CAACC,IAAI,CAAC,IAAI,CAAC/B,YAAY,EAAE0B,GAAAA,CAAAA;AAC/Ed,gBAAAA,SAAAA,CAAU,CAACe,cAAgB,EAAA,CAAC,eAAe,EAAED,GAAAA,CAAI,6BAA6B,CAAC,CAAA;AAE/E,gBAAA,IAAI,CAAC1B,YAAY,CAAC0B,GAAAA,CAAI,GAAG1B,YAAAA;AAC3B;AACF,SAAA;aAEAgC,MAAS,GAAA,IAAA;YACP,OAAO,IAAI,CAAChC,YAAY;AAC1B,SAAA;AAEAiC,QAAAA,IAAAA,CAAAA,GAAAA,GAAM,CAACP,GAAAA,GAAAA;AACL,YAAA,OAAO,IAAI,CAAC1B,YAAY,CAAC0B,GAAI,CAAA;AAC/B,SAAA;QA/DE,IAAI,CAAC1B,YAAY,GAAG,EAAC;AACvB;AA+DF;AAOA,MAAMuB,wBAAAA,GAA2B,CAC/BW,GACAC,EAAAA,MAAAA,GAAAA;AAEA,IAAA,IAAI,WAAWA,MAAQ,EAAA;AACrB,QAAA,OAAOA,MAAOC,CAAAA,KAAK,CAACd,MAAM,CAACC,wBAA0BW,EAAAA,GAAAA,CAAAA;AACvD;IAEA,IAAI,CAACC,MAAO9B,CAAAA,IAAI,EAAE;AAChB6B,QAAAA,GAAAA,CAAIG,IAAI,CAAC;YACPb,iBAAmB,EAAA,KAAA;YACnBC,YAAc,EAAA;AAChB,SAAA,CAAA;KACK,MAAA;AACLS,QAAAA,GAAAA,CAAIG,IAAI,CAAC;YACPb,iBACEW,EAAAA,MAAAA,CAAO9B,IAAI,CAACiC,UAAU,CAAC,cAAczC,0BAA2BiB,CAAAA,QAAQ,CAACqB,MAAAA,CAAO9B,IAAI,CAAA;AACtFoB,YAAAA,YAAAA,EAAc,CAAC,CAAC,EAAEU,OAAO9B,IAAI,CAAC,kCAAkC;AAClE,SAAA,CAAA;AACF;IAEA,OAAO6B,GAAAA;AACT,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFields.mjs","sources":["../../../../../../admin/src/core/apis/CustomFields.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { ComponentType } from 'react';\n\nimport { Internal, Utils } from '@strapi/types';\nimport invariant from 'invariant';\n\nimport type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { AnySchema } from 'yup';\n\ntype CustomFieldUID = Utils.String.Suffix<\n | Internal.Namespace.WithSeparator<Internal.Namespace.Plugin>\n | Internal.Namespace.WithSeparator<Internal.Namespace.Global>,\n string\n>;\n\ntype CustomFieldOptionInput =\n | 'text'\n | 'checkbox'\n | 'checkbox-with-number-field'\n | 'select-default-boolean'\n | 'date'\n | 'select'\n | 'number'\n | 'boolean-radio-group'\n | 'select-date'\n | 'text-area-enum'\n | 'select-number'\n | 'radio-group';\n\ntype CustomFieldOptionName =\n | 'min'\n | 'minLength'\n | 'max'\n | 'maxLength'\n | 'required'\n | 'regex'\n | 'enum'\n | 'unique'\n | 'private'\n | 'default';\n\ninterface CustomFieldOption {\n intlLabel: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n description: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n name: CustomFieldOptionName;\n type: CustomFieldOptionInput;\n defaultValue?: string | number | boolean | Date;\n}\n\ninterface CustomFieldOptionSection {\n sectionTitle:\n | (MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n })\n | null;\n items: CustomFieldOption[];\n}\n\ninterface CustomFieldOptions {\n base?: (CustomFieldOptionSection | CustomFieldOption)[];\n advanced?: (CustomFieldOptionSection | CustomFieldOption)[];\n validator?: () => Record<string, AnySchema>;\n}\n\ninterface CustomField {\n name: string;\n pluginId?: string;\n type: (typeof ALLOWED_TYPES)[number];\n intlLabel: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n intlDescription: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n icon?: ComponentType;\n components: {\n Input: () => Promise<{ default?: ComponentType }>;\n };\n options?: CustomFieldOptions;\n}\n\nconst ALLOWED_TYPES = [\n 'biginteger',\n 'boolean',\n 'date',\n 'datetime',\n 'decimal',\n 'email',\n 'enumeration',\n 'float',\n 'integer',\n 'json',\n 'password',\n 'richtext',\n 'string',\n 'text',\n 'time',\n 'uid',\n] as const;\n\nconst ALLOWED_ROOT_LEVEL_OPTIONS = [\n 'min',\n 'minLength',\n 'max',\n 'maxLength',\n 'required',\n 'regex',\n 'enum',\n 'unique',\n 'private',\n 'default',\n] as const;\n\nclass CustomFields {\n customFields: Record<string, CustomField>;\n\n constructor() {\n this.customFields = {};\n }\n\n register = (customFields: CustomField | CustomField[]) => {\n if (Array.isArray(customFields)) {\n // If several custom fields are passed, register them one by one\n customFields.forEach((customField) => {\n this.register(customField);\n });\n } else {\n // Handle individual custom field\n const { name, pluginId, type, intlLabel, intlDescription, components, options } =\n customFields;\n\n // Ensure required attributes are provided\n invariant(name, 'A name must be provided');\n invariant(type, 'A type must be provided');\n invariant(intlLabel, 'An intlLabel must be provided');\n invariant(intlDescription, 'An intlDescription must be provided');\n invariant(components, 'A components object must be provided');\n invariant(components.Input, 'An Input component must be provided');\n\n // Ensure the type is valid\n invariant(\n ALLOWED_TYPES.includes(type),\n `Custom field type: '${type}' is not a valid Strapi type or it can't be used with a Custom Field`\n );\n\n // Ensure name has no special characters\n const isValidObjectKey = /^(?![0-9])[a-zA-Z0-9$_-]+$/g;\n invariant(\n isValidObjectKey.test(name),\n `Custom field name: '${name}' is not a valid object key`\n );\n\n // Ensure options have valid name paths\n const allFormOptions = [...(options?.base || []), ...(options?.advanced || [])];\n\n if (allFormOptions.length) {\n const optionPathValidations = allFormOptions.reduce(optionsValidationReducer, []);\n\n optionPathValidations.forEach(({ isValidOptionPath, errorMessage }) => {\n invariant(isValidOptionPath, errorMessage);\n });\n }\n\n // When no plugin is specified, default to the global namespace\n const uid: CustomFieldUID = pluginId ? `plugin::${pluginId}.${name}` : `global::${name}`;\n\n // Ensure the uid is unique\n const uidAlreadyUsed = Object.prototype.hasOwnProperty.call(this.customFields, uid);\n invariant(!uidAlreadyUsed, `Custom field: '${uid}' has already been registered`);\n\n this.customFields[uid] = customFields;\n }\n };\n\n getAll = () => {\n return this.customFields;\n };\n\n get = (uid: string): CustomField | undefined => {\n return this.customFields[uid];\n };\n}\n\ninterface OptionValidation {\n isValidOptionPath: boolean;\n errorMessage: string;\n}\n\nconst optionsValidationReducer = (\n acc: OptionValidation[],\n option: CustomFieldOptionSection | CustomFieldOption\n): OptionValidation[] => {\n if ('items' in option) {\n return option.items.reduce(optionsValidationReducer, acc);\n }\n\n if (!option.name) {\n acc.push({\n isValidOptionPath: false,\n errorMessage: \"The 'name' property is required on an options object\",\n });\n } else {\n acc.push({\n isValidOptionPath:\n option.name.startsWith('options') || ALLOWED_ROOT_LEVEL_OPTIONS.includes(option.name),\n errorMessage: `'${option.name}' must be prefixed with 'options.'`,\n });\n }\n\n return acc;\n};\n\nexport { type CustomField, CustomFields };\n"],"names":["ALLOWED_TYPES","ALLOWED_ROOT_LEVEL_OPTIONS","CustomFields","
|
|
1
|
+
{"version":3,"file":"CustomFields.mjs","sources":["../../../../../../admin/src/core/apis/CustomFields.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport { ComponentType } from 'react';\n\nimport { Internal, Utils } from '@strapi/types';\nimport invariant from 'invariant';\n\nimport type { MessageDescriptor, PrimitiveType } from 'react-intl';\nimport type { AnySchema } from 'yup';\n\ntype CustomFieldUID = Utils.String.Suffix<\n | Internal.Namespace.WithSeparator<Internal.Namespace.Plugin>\n | Internal.Namespace.WithSeparator<Internal.Namespace.Global>,\n string\n>;\n\ntype CustomFieldOptionInput =\n | 'text'\n | 'checkbox'\n | 'checkbox-with-number-field'\n | 'select-default-boolean'\n | 'date'\n | 'select'\n | 'number'\n | 'boolean-radio-group'\n | 'select-date'\n | 'text-area-enum'\n | 'select-number'\n | 'radio-group';\n\ntype CustomFieldOptionName =\n | 'min'\n | 'minLength'\n | 'max'\n | 'maxLength'\n | 'required'\n | 'regex'\n | 'enum'\n | 'unique'\n | 'private'\n | 'default';\n\ninterface CustomFieldOption {\n intlLabel: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n description: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n name: CustomFieldOptionName;\n type: CustomFieldOptionInput;\n defaultValue?: string | number | boolean | Date;\n}\n\ninterface CustomFieldOptionSection {\n sectionTitle:\n | (MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n })\n | null;\n items: CustomFieldOption[];\n}\n\ninterface CustomFieldOptions {\n base?: (CustomFieldOptionSection | CustomFieldOption)[];\n advanced?: (CustomFieldOptionSection | CustomFieldOption)[];\n validator?: () => Record<string, AnySchema>;\n}\n\ninterface CustomField {\n name: string;\n pluginId?: string;\n type: (typeof ALLOWED_TYPES)[number];\n intlLabel: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n intlDescription: MessageDescriptor & {\n values?: Record<string, PrimitiveType>;\n };\n icon?: ComponentType;\n components: {\n Input: () => Promise<{ default?: ComponentType }>;\n };\n options?: CustomFieldOptions;\n}\n\nconst ALLOWED_TYPES = [\n 'biginteger',\n 'boolean',\n 'date',\n 'datetime',\n 'decimal',\n 'email',\n 'enumeration',\n 'float',\n 'integer',\n 'json',\n 'password',\n 'richtext',\n 'string',\n 'text',\n 'time',\n 'uid',\n] as const;\n\nconst ALLOWED_ROOT_LEVEL_OPTIONS = [\n 'min',\n 'minLength',\n 'max',\n 'maxLength',\n 'required',\n 'regex',\n 'enum',\n 'unique',\n 'private',\n 'default',\n] as const;\n\nclass CustomFields {\n customFields: Record<string, CustomField>;\n\n constructor() {\n this.customFields = {};\n }\n\n register = (customFields: CustomField | CustomField[]) => {\n if (Array.isArray(customFields)) {\n // If several custom fields are passed, register them one by one\n customFields.forEach((customField) => {\n this.register(customField);\n });\n } else {\n // Handle individual custom field\n const { name, pluginId, type, intlLabel, intlDescription, components, options } =\n customFields;\n\n // Ensure required attributes are provided\n invariant(name, 'A name must be provided');\n invariant(type, 'A type must be provided');\n invariant(intlLabel, 'An intlLabel must be provided');\n invariant(intlDescription, 'An intlDescription must be provided');\n invariant(components, 'A components object must be provided');\n invariant(components.Input, 'An Input component must be provided');\n\n // Ensure the type is valid\n invariant(\n ALLOWED_TYPES.includes(type),\n `Custom field type: '${type}' is not a valid Strapi type or it can't be used with a Custom Field`\n );\n\n // Ensure name has no special characters\n const isValidObjectKey = /^(?![0-9])[a-zA-Z0-9$_-]+$/g;\n invariant(\n isValidObjectKey.test(name),\n `Custom field name: '${name}' is not a valid object key`\n );\n\n // Ensure options have valid name paths\n const allFormOptions = [...(options?.base || []), ...(options?.advanced || [])];\n\n if (allFormOptions.length) {\n const optionPathValidations = allFormOptions.reduce(optionsValidationReducer, []);\n\n optionPathValidations.forEach(({ isValidOptionPath, errorMessage }) => {\n invariant(isValidOptionPath, errorMessage);\n });\n }\n\n // When no plugin is specified, default to the global namespace\n const uid: CustomFieldUID = pluginId ? `plugin::${pluginId}.${name}` : `global::${name}`;\n\n // Ensure the uid is unique\n const uidAlreadyUsed = Object.prototype.hasOwnProperty.call(this.customFields, uid);\n invariant(!uidAlreadyUsed, `Custom field: '${uid}' has already been registered`);\n\n this.customFields[uid] = customFields;\n }\n };\n\n getAll = () => {\n return this.customFields;\n };\n\n get = (uid: string): CustomField | undefined => {\n return this.customFields[uid];\n };\n}\n\ninterface OptionValidation {\n isValidOptionPath: boolean;\n errorMessage: string;\n}\n\nconst optionsValidationReducer = (\n acc: OptionValidation[],\n option: CustomFieldOptionSection | CustomFieldOption\n): OptionValidation[] => {\n if ('items' in option) {\n return option.items.reduce(optionsValidationReducer, acc);\n }\n\n if (!option.name) {\n acc.push({\n isValidOptionPath: false,\n errorMessage: \"The 'name' property is required on an options object\",\n });\n } else {\n acc.push({\n isValidOptionPath:\n option.name.startsWith('options') || ALLOWED_ROOT_LEVEL_OPTIONS.includes(option.name),\n errorMessage: `'${option.name}' must be prefixed with 'options.'`,\n });\n }\n\n return acc;\n};\n\nexport { type CustomField, CustomFields };\n"],"names":["ALLOWED_TYPES","ALLOWED_ROOT_LEVEL_OPTIONS","CustomFields","register","customFields","Array","isArray","forEach","customField","name","pluginId","type","intlLabel","intlDescription","components","options","invariant","Input","includes","isValidObjectKey","test","allFormOptions","base","advanced","length","optionPathValidations","reduce","optionsValidationReducer","isValidOptionPath","errorMessage","uid","uidAlreadyUsed","Object","prototype","hasOwnProperty","call","getAll","get","acc","option","items","push","startsWith"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Plugin.js","sources":["../../../../../../admin/src/core/apis/Plugin.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { immerable } from 'immer';\n\nexport interface PluginConfig\n extends Partial<Pick<Plugin, 'apis' | 'initializer' | 'injectionZones' | 'isReady'>> {\n name: string;\n id: string;\n}\n\nexport class Plugin {\n [immerable] = true;\n\n apis: Record<string, unknown>;\n initializer: React.ComponentType<{ setPlugin(pluginId: string): void }> | null;\n injectionZones: Record<\n string,\n Record<string, Array<{ name: string; Component: React.ComponentType }>>\n >;\n isReady: boolean;\n name: string;\n pluginId: PluginConfig['id'];\n\n constructor(pluginConf: PluginConfig) {\n this.apis = pluginConf.apis || {};\n this.initializer = pluginConf.initializer || null;\n this.injectionZones = pluginConf.injectionZones || {};\n this.isReady = pluginConf.isReady !== undefined ? pluginConf.isReady : true;\n this.name = pluginConf.name;\n this.pluginId = pluginConf.id;\n }\n\n getInjectedComponents(containerName: string, blockName: string) {\n try {\n return this.injectionZones[containerName][blockName] || [];\n } catch (err) {\n console.error('Cannot get injected component', err);\n\n return [];\n }\n }\n\n injectComponent(\n containerName: string,\n blockName: string,\n component: { name: string; Component: React.ComponentType }\n ) {\n try {\n this.injectionZones[containerName][blockName].push(component);\n } catch (err) {\n console.error('Cannot inject component', err);\n }\n }\n}\n"],"names":["Plugin","getInjectedComponents","containerName","blockName","injectionZones","err","console","error","injectComponent","component","push","
|
|
1
|
+
{"version":3,"file":"Plugin.js","sources":["../../../../../../admin/src/core/apis/Plugin.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { immerable } from 'immer';\n\nexport interface PluginConfig\n extends Partial<Pick<Plugin, 'apis' | 'initializer' | 'injectionZones' | 'isReady'>> {\n name: string;\n id: string;\n}\n\nexport class Plugin {\n [immerable] = true;\n\n apis: Record<string, unknown>;\n initializer: React.ComponentType<{ setPlugin(pluginId: string): void }> | null;\n injectionZones: Record<\n string,\n Record<string, Array<{ name: string; Component: React.ComponentType }>>\n >;\n isReady: boolean;\n name: string;\n pluginId: PluginConfig['id'];\n\n constructor(pluginConf: PluginConfig) {\n this.apis = pluginConf.apis || {};\n this.initializer = pluginConf.initializer || null;\n this.injectionZones = pluginConf.injectionZones || {};\n this.isReady = pluginConf.isReady !== undefined ? pluginConf.isReady : true;\n this.name = pluginConf.name;\n this.pluginId = pluginConf.id;\n }\n\n getInjectedComponents(containerName: string, blockName: string) {\n try {\n return this.injectionZones[containerName][blockName] || [];\n } catch (err) {\n console.error('Cannot get injected component', err);\n\n return [];\n }\n }\n\n injectComponent(\n containerName: string,\n blockName: string,\n component: { name: string; Component: React.ComponentType }\n ) {\n try {\n this.injectionZones[containerName][blockName].push(component);\n } catch (err) {\n console.error('Cannot inject component', err);\n }\n }\n}\n"],"names":["Plugin","getInjectedComponents","containerName","blockName","injectionZones","err","console","error","injectComponent","component","push","pluginConf","immerable","apis","initializer","isReady","undefined","name","pluginId","id"],"mappings":";;;;AAWO,MAAMA,MAAAA,CAAAA;IAsBXC,qBAAsBC,CAAAA,aAAqB,EAAEC,SAAiB,EAAE;QAC9D,IAAI;YACF,OAAO,IAAI,CAACC,cAAc,CAACF,cAAc,CAACC,SAAAA,CAAU,IAAI,EAAE;AAC5D,SAAA,CAAE,OAAOE,GAAK,EAAA;YACZC,OAAQC,CAAAA,KAAK,CAAC,+BAAiCF,EAAAA,GAAAA,CAAAA;AAE/C,YAAA,OAAO,EAAE;AACX;AACF;AAEAG,IAAAA,eAAAA,CACEN,aAAqB,EACrBC,SAAiB,EACjBM,SAA2D,EAC3D;QACA,IAAI;YACF,IAAI,CAACL,cAAc,CAACF,aAAAA,CAAc,CAACC,SAAU,CAAA,CAACO,IAAI,CAACD,SAAAA,CAAAA;AACrD,SAAA,CAAE,OAAOJ,GAAK,EAAA;YACZC,OAAQC,CAAAA,KAAK,CAAC,yBAA2BF,EAAAA,GAAAA,CAAAA;AAC3C;AACF;AA7BA,IAAA,WAAA,CAAYM,UAAwB,CAAE;AAZtC,QAAA,IAAA,CAACC,gBAAU,GAAG,IAAA;AAaZ,QAAA,IAAI,CAACC,IAAI,GAAGF,UAAWE,CAAAA,IAAI,IAAI,EAAC;AAChC,QAAA,IAAI,CAACC,WAAW,GAAGH,UAAAA,CAAWG,WAAW,IAAI,IAAA;AAC7C,QAAA,IAAI,CAACV,cAAc,GAAGO,UAAWP,CAAAA,cAAc,IAAI,EAAC;QACpD,IAAI,CAACW,OAAO,GAAGJ,UAAAA,CAAWI,OAAO,KAAKC,SAAAA,GAAYL,UAAWI,CAAAA,OAAO,GAAG,IAAA;AACvE,QAAA,IAAI,CAACE,IAAI,GAAGN,UAAAA,CAAWM,IAAI;AAC3B,QAAA,IAAI,CAACC,QAAQ,GAAGP,UAAAA,CAAWQ,EAAE;AAC/B;AAuBF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Plugin.mjs","sources":["../../../../../../admin/src/core/apis/Plugin.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { immerable } from 'immer';\n\nexport interface PluginConfig\n extends Partial<Pick<Plugin, 'apis' | 'initializer' | 'injectionZones' | 'isReady'>> {\n name: string;\n id: string;\n}\n\nexport class Plugin {\n [immerable] = true;\n\n apis: Record<string, unknown>;\n initializer: React.ComponentType<{ setPlugin(pluginId: string): void }> | null;\n injectionZones: Record<\n string,\n Record<string, Array<{ name: string; Component: React.ComponentType }>>\n >;\n isReady: boolean;\n name: string;\n pluginId: PluginConfig['id'];\n\n constructor(pluginConf: PluginConfig) {\n this.apis = pluginConf.apis || {};\n this.initializer = pluginConf.initializer || null;\n this.injectionZones = pluginConf.injectionZones || {};\n this.isReady = pluginConf.isReady !== undefined ? pluginConf.isReady : true;\n this.name = pluginConf.name;\n this.pluginId = pluginConf.id;\n }\n\n getInjectedComponents(containerName: string, blockName: string) {\n try {\n return this.injectionZones[containerName][blockName] || [];\n } catch (err) {\n console.error('Cannot get injected component', err);\n\n return [];\n }\n }\n\n injectComponent(\n containerName: string,\n blockName: string,\n component: { name: string; Component: React.ComponentType }\n ) {\n try {\n this.injectionZones[containerName][blockName].push(component);\n } catch (err) {\n console.error('Cannot inject component', err);\n }\n }\n}\n"],"names":["Plugin","getInjectedComponents","containerName","blockName","injectionZones","err","console","error","injectComponent","component","push","
|
|
1
|
+
{"version":3,"file":"Plugin.mjs","sources":["../../../../../../admin/src/core/apis/Plugin.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\nimport * as React from 'react';\n\nimport { immerable } from 'immer';\n\nexport interface PluginConfig\n extends Partial<Pick<Plugin, 'apis' | 'initializer' | 'injectionZones' | 'isReady'>> {\n name: string;\n id: string;\n}\n\nexport class Plugin {\n [immerable] = true;\n\n apis: Record<string, unknown>;\n initializer: React.ComponentType<{ setPlugin(pluginId: string): void }> | null;\n injectionZones: Record<\n string,\n Record<string, Array<{ name: string; Component: React.ComponentType }>>\n >;\n isReady: boolean;\n name: string;\n pluginId: PluginConfig['id'];\n\n constructor(pluginConf: PluginConfig) {\n this.apis = pluginConf.apis || {};\n this.initializer = pluginConf.initializer || null;\n this.injectionZones = pluginConf.injectionZones || {};\n this.isReady = pluginConf.isReady !== undefined ? pluginConf.isReady : true;\n this.name = pluginConf.name;\n this.pluginId = pluginConf.id;\n }\n\n getInjectedComponents(containerName: string, blockName: string) {\n try {\n return this.injectionZones[containerName][blockName] || [];\n } catch (err) {\n console.error('Cannot get injected component', err);\n\n return [];\n }\n }\n\n injectComponent(\n containerName: string,\n blockName: string,\n component: { name: string; Component: React.ComponentType }\n ) {\n try {\n this.injectionZones[containerName][blockName].push(component);\n } catch (err) {\n console.error('Cannot inject component', err);\n }\n }\n}\n"],"names":["Plugin","getInjectedComponents","containerName","blockName","injectionZones","err","console","error","injectComponent","component","push","pluginConf","immerable","apis","initializer","isReady","undefined","name","pluginId","id"],"mappings":";;AAWO,MAAMA,MAAAA,CAAAA;IAsBXC,qBAAsBC,CAAAA,aAAqB,EAAEC,SAAiB,EAAE;QAC9D,IAAI;YACF,OAAO,IAAI,CAACC,cAAc,CAACF,cAAc,CAACC,SAAAA,CAAU,IAAI,EAAE;AAC5D,SAAA,CAAE,OAAOE,GAAK,EAAA;YACZC,OAAQC,CAAAA,KAAK,CAAC,+BAAiCF,EAAAA,GAAAA,CAAAA;AAE/C,YAAA,OAAO,EAAE;AACX;AACF;AAEAG,IAAAA,eAAAA,CACEN,aAAqB,EACrBC,SAAiB,EACjBM,SAA2D,EAC3D;QACA,IAAI;YACF,IAAI,CAACL,cAAc,CAACF,aAAAA,CAAc,CAACC,SAAU,CAAA,CAACO,IAAI,CAACD,SAAAA,CAAAA;AACrD,SAAA,CAAE,OAAOJ,GAAK,EAAA;YACZC,OAAQC,CAAAA,KAAK,CAAC,yBAA2BF,EAAAA,GAAAA,CAAAA;AAC3C;AACF;AA7BA,IAAA,WAAA,CAAYM,UAAwB,CAAE;AAZtC,QAAA,IAAA,CAACC,UAAU,GAAG,IAAA;AAaZ,QAAA,IAAI,CAACC,IAAI,GAAGF,UAAWE,CAAAA,IAAI,IAAI,EAAC;AAChC,QAAA,IAAI,CAACC,WAAW,GAAGH,UAAAA,CAAWG,WAAW,IAAI,IAAA;AAC7C,QAAA,IAAI,CAACV,cAAc,GAAGO,UAAWP,CAAAA,cAAc,IAAI,EAAC;QACpD,IAAI,CAACW,OAAO,GAAGJ,UAAAA,CAAWI,OAAO,KAAKC,SAAAA,GAAYL,UAAWI,CAAAA,OAAO,GAAG,IAAA;AACvE,QAAA,IAAI,CAACE,IAAI,GAAGN,UAAAA,CAAWM,IAAI;AAC3B,QAAA,IAAI,CAACC,QAAQ,GAAGP,UAAAA,CAAWQ,EAAE;AAC/B;AAuBF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Widgets.js","sources":["../../../../../../admin/src/core/apis/Widgets.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\n\nimport invariant from 'invariant';\nimport { To } from 'react-router-dom';\n\nimport { Permission } from '../../../../shared/contracts/shared';\n\nimport type { Internal, Utils } from '@strapi/types';\nimport type { MessageDescriptor } from 'react-intl';\n\ntype WidgetUID = Utils.String.Suffix<\n | Internal.Namespace.WithSeparator<Internal.Namespace.Plugin>\n | Internal.Namespace.WithSeparator<Internal.Namespace.Global>,\n string\n>;\n\ntype WidgetArgs = {\n icon?: typeof import('@strapi/icons').PuzzlePiece;\n title: MessageDescriptor;\n link?: {\n label: MessageDescriptor;\n href: To;\n };\n component: () => Promise<React.ComponentType>;\n pluginId?: string;\n id: string;\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>;\n roles?: string[];\n};\n\ntype WidgetWithUID = Omit<WidgetArgs, 'id' | 'pluginId'> & { uid: WidgetUID };\n\ntype DescriptionReducer = (prev: WidgetArgs[]) => WidgetArgs[];\n\nclass Widgets {\n widgets: WidgetArgs[];\n\n constructor() {\n this.widgets = [];\n }\n\n private generateUid = (widget: WidgetArgs): WidgetUID => {\n return widget.pluginId ? `plugin::${widget.pluginId}.${widget.id}` : `global::${widget.id}`;\n };\n\n private checkWidgets = (widgets: WidgetArgs[]): void => {\n widgets.forEach((widget) => {\n invariant(widget.id, 'An id must be provided');\n invariant(widget.component, 'A component must be provided');\n invariant(widget.title, 'A title must be provided');\n invariant(widget.icon, 'An icon must be provided');\n });\n };\n\n register(widgets: WidgetArgs | WidgetArgs[] | DescriptionReducer) {\n if (Array.isArray(widgets)) {\n this.checkWidgets(widgets);\n this.widgets = [...this.widgets, ...widgets];\n } else if (typeof widgets === 'function') {\n const newWidgets = widgets(this.widgets);\n this.checkWidgets(newWidgets);\n this.widgets = newWidgets;\n } else if (typeof widgets === 'object') {\n this.checkWidgets([widgets]);\n this.widgets.push(widgets);\n } else {\n throw new Error('Expected widgets to be an array or a reducer function');\n }\n }\n\n getAll = (): WidgetWithUID[] => {\n return this.widgets.map((widget) => {\n const { id, pluginId, ...widgetBase } = widget;\n return {\n ...widgetBase,\n uid: this.generateUid(widget),\n };\n });\n };\n}\n\nexport { Widgets };\nexport type { WidgetArgs, WidgetWithUID };\n"],"names":["Widgets","register","widgets","Array","isArray","checkWidgets","newWidgets","push","Error","
|
|
1
|
+
{"version":3,"file":"Widgets.js","sources":["../../../../../../admin/src/core/apis/Widgets.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\n\nimport invariant from 'invariant';\nimport { To } from 'react-router-dom';\n\nimport { Permission } from '../../../../shared/contracts/shared';\n\nimport type { Internal, Utils } from '@strapi/types';\nimport type { MessageDescriptor } from 'react-intl';\n\ntype WidgetUID = Utils.String.Suffix<\n | Internal.Namespace.WithSeparator<Internal.Namespace.Plugin>\n | Internal.Namespace.WithSeparator<Internal.Namespace.Global>,\n string\n>;\n\ntype WidgetArgs = {\n icon?: typeof import('@strapi/icons').PuzzlePiece;\n title: MessageDescriptor;\n link?: {\n label: MessageDescriptor;\n href: To;\n };\n component: () => Promise<React.ComponentType>;\n pluginId?: string;\n id: string;\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>;\n roles?: string[];\n};\n\ntype WidgetWithUID = Omit<WidgetArgs, 'id' | 'pluginId'> & { uid: WidgetUID };\n\ntype DescriptionReducer = (prev: WidgetArgs[]) => WidgetArgs[];\n\nclass Widgets {\n widgets: WidgetArgs[];\n\n constructor() {\n this.widgets = [];\n }\n\n private generateUid = (widget: WidgetArgs): WidgetUID => {\n return widget.pluginId ? `plugin::${widget.pluginId}.${widget.id}` : `global::${widget.id}`;\n };\n\n private checkWidgets = (widgets: WidgetArgs[]): void => {\n widgets.forEach((widget) => {\n invariant(widget.id, 'An id must be provided');\n invariant(widget.component, 'A component must be provided');\n invariant(widget.title, 'A title must be provided');\n invariant(widget.icon, 'An icon must be provided');\n });\n };\n\n register(widgets: WidgetArgs | WidgetArgs[] | DescriptionReducer) {\n if (Array.isArray(widgets)) {\n this.checkWidgets(widgets);\n this.widgets = [...this.widgets, ...widgets];\n } else if (typeof widgets === 'function') {\n const newWidgets = widgets(this.widgets);\n this.checkWidgets(newWidgets);\n this.widgets = newWidgets;\n } else if (typeof widgets === 'object') {\n this.checkWidgets([widgets]);\n this.widgets.push(widgets);\n } else {\n throw new Error('Expected widgets to be an array or a reducer function');\n }\n }\n\n getAll = (): WidgetWithUID[] => {\n return this.widgets.map((widget) => {\n const { id, pluginId, ...widgetBase } = widget;\n return {\n ...widgetBase,\n uid: this.generateUid(widget),\n };\n });\n };\n}\n\nexport { Widgets };\nexport type { WidgetArgs, WidgetWithUID };\n"],"names":["Widgets","register","widgets","Array","isArray","checkWidgets","newWidgets","push","Error","generateUid","widget","pluginId","id","forEach","invariant","component","title","icon","getAll","map","widgetBase","uid"],"mappings":";;;;AAkCA,MAAMA,OAAAA,CAAAA;AAoBJC,IAAAA,QAAAA,CAASC,OAAuD,EAAE;QAChE,IAAIC,KAAAA,CAAMC,OAAO,CAACF,OAAU,CAAA,EAAA;YAC1B,IAAI,CAACG,YAAY,CAACH,OAAAA,CAAAA;YAClB,IAAI,CAACA,OAAO,GAAG;AAAI,gBAAA,GAAA,IAAI,CAACA,OAAO;AAAKA,gBAAAA,GAAAA;AAAQ,aAAA;SACvC,MAAA,IAAI,OAAOA,OAAAA,KAAY,UAAY,EAAA;AACxC,YAAA,MAAMI,UAAaJ,GAAAA,OAAAA,CAAQ,IAAI,CAACA,OAAO,CAAA;YACvC,IAAI,CAACG,YAAY,CAACC,UAAAA,CAAAA;YAClB,IAAI,CAACJ,OAAO,GAAGI,UAAAA;SACV,MAAA,IAAI,OAAOJ,OAAAA,KAAY,QAAU,EAAA;YACtC,IAAI,CAACG,YAAY,CAAC;AAACH,gBAAAA;AAAQ,aAAA,CAAA;AAC3B,YAAA,IAAI,CAACA,OAAO,CAACK,IAAI,CAACL,OAAAA,CAAAA;SACb,MAAA;AACL,YAAA,MAAM,IAAIM,KAAM,CAAA,uDAAA,CAAA;AAClB;AACF;IA/BA,WAAc,EAAA;AAINC,QAAAA,IAAAA,CAAAA,WAAAA,GAAc,CAACC,MAAAA,GAAAA;YACrB,OAAOA,MAAAA,CAAOC,QAAQ,GAAG,CAAC,QAAQ,EAAED,MAAAA,CAAOC,QAAQ,CAAC,CAAC,EAAED,MAAOE,CAAAA,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAEF,MAAAA,CAAOE,EAAE,CAAE,CAAA;AAC7F,SAAA;AAEQP,QAAAA,IAAAA,CAAAA,YAAAA,GAAe,CAACH,OAAAA,GAAAA;YACtBA,OAAQW,CAAAA,OAAO,CAAC,CAACH,MAAAA,GAAAA;gBACfI,SAAUJ,CAAAA,MAAAA,CAAOE,EAAE,EAAE,wBAAA,CAAA;gBACrBE,SAAUJ,CAAAA,MAAAA,CAAOK,SAAS,EAAE,8BAAA,CAAA;gBAC5BD,SAAUJ,CAAAA,MAAAA,CAAOM,KAAK,EAAE,0BAAA,CAAA;gBACxBF,SAAUJ,CAAAA,MAAAA,CAAOO,IAAI,EAAE,0BAAA,CAAA;AACzB,aAAA,CAAA;AACF,SAAA;aAkBAC,MAAS,GAAA,IAAA;AACP,YAAA,OAAO,IAAI,CAAChB,OAAO,CAACiB,GAAG,CAAC,CAACT,MAAAA,GAAAA;AACvB,gBAAA,MAAM,EAAEE,EAAE,EAAED,QAAQ,EAAE,GAAGS,YAAY,GAAGV,MAAAA;gBACxC,OAAO;AACL,oBAAA,GAAGU,UAAU;oBACbC,GAAK,EAAA,IAAI,CAACZ,WAAW,CAACC,MAAAA;AACxB,iBAAA;AACF,aAAA,CAAA;AACF,SAAA;QAxCE,IAAI,CAACR,OAAO,GAAG,EAAE;AACnB;AAwCF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Widgets.mjs","sources":["../../../../../../admin/src/core/apis/Widgets.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\n\nimport invariant from 'invariant';\nimport { To } from 'react-router-dom';\n\nimport { Permission } from '../../../../shared/contracts/shared';\n\nimport type { Internal, Utils } from '@strapi/types';\nimport type { MessageDescriptor } from 'react-intl';\n\ntype WidgetUID = Utils.String.Suffix<\n | Internal.Namespace.WithSeparator<Internal.Namespace.Plugin>\n | Internal.Namespace.WithSeparator<Internal.Namespace.Global>,\n string\n>;\n\ntype WidgetArgs = {\n icon?: typeof import('@strapi/icons').PuzzlePiece;\n title: MessageDescriptor;\n link?: {\n label: MessageDescriptor;\n href: To;\n };\n component: () => Promise<React.ComponentType>;\n pluginId?: string;\n id: string;\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>;\n roles?: string[];\n};\n\ntype WidgetWithUID = Omit<WidgetArgs, 'id' | 'pluginId'> & { uid: WidgetUID };\n\ntype DescriptionReducer = (prev: WidgetArgs[]) => WidgetArgs[];\n\nclass Widgets {\n widgets: WidgetArgs[];\n\n constructor() {\n this.widgets = [];\n }\n\n private generateUid = (widget: WidgetArgs): WidgetUID => {\n return widget.pluginId ? `plugin::${widget.pluginId}.${widget.id}` : `global::${widget.id}`;\n };\n\n private checkWidgets = (widgets: WidgetArgs[]): void => {\n widgets.forEach((widget) => {\n invariant(widget.id, 'An id must be provided');\n invariant(widget.component, 'A component must be provided');\n invariant(widget.title, 'A title must be provided');\n invariant(widget.icon, 'An icon must be provided');\n });\n };\n\n register(widgets: WidgetArgs | WidgetArgs[] | DescriptionReducer) {\n if (Array.isArray(widgets)) {\n this.checkWidgets(widgets);\n this.widgets = [...this.widgets, ...widgets];\n } else if (typeof widgets === 'function') {\n const newWidgets = widgets(this.widgets);\n this.checkWidgets(newWidgets);\n this.widgets = newWidgets;\n } else if (typeof widgets === 'object') {\n this.checkWidgets([widgets]);\n this.widgets.push(widgets);\n } else {\n throw new Error('Expected widgets to be an array or a reducer function');\n }\n }\n\n getAll = (): WidgetWithUID[] => {\n return this.widgets.map((widget) => {\n const { id, pluginId, ...widgetBase } = widget;\n return {\n ...widgetBase,\n uid: this.generateUid(widget),\n };\n });\n };\n}\n\nexport { Widgets };\nexport type { WidgetArgs, WidgetWithUID };\n"],"names":["Widgets","register","widgets","Array","isArray","checkWidgets","newWidgets","push","Error","
|
|
1
|
+
{"version":3,"file":"Widgets.mjs","sources":["../../../../../../admin/src/core/apis/Widgets.ts"],"sourcesContent":["/* eslint-disable check-file/filename-naming-convention */\n\nimport invariant from 'invariant';\nimport { To } from 'react-router-dom';\n\nimport { Permission } from '../../../../shared/contracts/shared';\n\nimport type { Internal, Utils } from '@strapi/types';\nimport type { MessageDescriptor } from 'react-intl';\n\ntype WidgetUID = Utils.String.Suffix<\n | Internal.Namespace.WithSeparator<Internal.Namespace.Plugin>\n | Internal.Namespace.WithSeparator<Internal.Namespace.Global>,\n string\n>;\n\ntype WidgetArgs = {\n icon?: typeof import('@strapi/icons').PuzzlePiece;\n title: MessageDescriptor;\n link?: {\n label: MessageDescriptor;\n href: To;\n };\n component: () => Promise<React.ComponentType>;\n pluginId?: string;\n id: string;\n permissions?: Array<Pick<Permission, 'action'> & Partial<Omit<Permission, 'action'>>>;\n roles?: string[];\n};\n\ntype WidgetWithUID = Omit<WidgetArgs, 'id' | 'pluginId'> & { uid: WidgetUID };\n\ntype DescriptionReducer = (prev: WidgetArgs[]) => WidgetArgs[];\n\nclass Widgets {\n widgets: WidgetArgs[];\n\n constructor() {\n this.widgets = [];\n }\n\n private generateUid = (widget: WidgetArgs): WidgetUID => {\n return widget.pluginId ? `plugin::${widget.pluginId}.${widget.id}` : `global::${widget.id}`;\n };\n\n private checkWidgets = (widgets: WidgetArgs[]): void => {\n widgets.forEach((widget) => {\n invariant(widget.id, 'An id must be provided');\n invariant(widget.component, 'A component must be provided');\n invariant(widget.title, 'A title must be provided');\n invariant(widget.icon, 'An icon must be provided');\n });\n };\n\n register(widgets: WidgetArgs | WidgetArgs[] | DescriptionReducer) {\n if (Array.isArray(widgets)) {\n this.checkWidgets(widgets);\n this.widgets = [...this.widgets, ...widgets];\n } else if (typeof widgets === 'function') {\n const newWidgets = widgets(this.widgets);\n this.checkWidgets(newWidgets);\n this.widgets = newWidgets;\n } else if (typeof widgets === 'object') {\n this.checkWidgets([widgets]);\n this.widgets.push(widgets);\n } else {\n throw new Error('Expected widgets to be an array or a reducer function');\n }\n }\n\n getAll = (): WidgetWithUID[] => {\n return this.widgets.map((widget) => {\n const { id, pluginId, ...widgetBase } = widget;\n return {\n ...widgetBase,\n uid: this.generateUid(widget),\n };\n });\n };\n}\n\nexport { Widgets };\nexport type { WidgetArgs, WidgetWithUID };\n"],"names":["Widgets","register","widgets","Array","isArray","checkWidgets","newWidgets","push","Error","generateUid","widget","pluginId","id","forEach","invariant","component","title","icon","getAll","map","widgetBase","uid"],"mappings":";;AAkCA,MAAMA,OAAAA,CAAAA;AAoBJC,IAAAA,QAAAA,CAASC,OAAuD,EAAE;QAChE,IAAIC,KAAAA,CAAMC,OAAO,CAACF,OAAU,CAAA,EAAA;YAC1B,IAAI,CAACG,YAAY,CAACH,OAAAA,CAAAA;YAClB,IAAI,CAACA,OAAO,GAAG;AAAI,gBAAA,GAAA,IAAI,CAACA,OAAO;AAAKA,gBAAAA,GAAAA;AAAQ,aAAA;SACvC,MAAA,IAAI,OAAOA,OAAAA,KAAY,UAAY,EAAA;AACxC,YAAA,MAAMI,UAAaJ,GAAAA,OAAAA,CAAQ,IAAI,CAACA,OAAO,CAAA;YACvC,IAAI,CAACG,YAAY,CAACC,UAAAA,CAAAA;YAClB,IAAI,CAACJ,OAAO,GAAGI,UAAAA;SACV,MAAA,IAAI,OAAOJ,OAAAA,KAAY,QAAU,EAAA;YACtC,IAAI,CAACG,YAAY,CAAC;AAACH,gBAAAA;AAAQ,aAAA,CAAA;AAC3B,YAAA,IAAI,CAACA,OAAO,CAACK,IAAI,CAACL,OAAAA,CAAAA;SACb,MAAA;AACL,YAAA,MAAM,IAAIM,KAAM,CAAA,uDAAA,CAAA;AAClB;AACF;IA/BA,WAAc,EAAA;AAINC,QAAAA,IAAAA,CAAAA,WAAAA,GAAc,CAACC,MAAAA,GAAAA;YACrB,OAAOA,MAAAA,CAAOC,QAAQ,GAAG,CAAC,QAAQ,EAAED,MAAAA,CAAOC,QAAQ,CAAC,CAAC,EAAED,MAAOE,CAAAA,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAEF,MAAAA,CAAOE,EAAE,CAAE,CAAA;AAC7F,SAAA;AAEQP,QAAAA,IAAAA,CAAAA,YAAAA,GAAe,CAACH,OAAAA,GAAAA;YACtBA,OAAQW,CAAAA,OAAO,CAAC,CAACH,MAAAA,GAAAA;gBACfI,SAAUJ,CAAAA,MAAAA,CAAOE,EAAE,EAAE,wBAAA,CAAA;gBACrBE,SAAUJ,CAAAA,MAAAA,CAAOK,SAAS,EAAE,8BAAA,CAAA;gBAC5BD,SAAUJ,CAAAA,MAAAA,CAAOM,KAAK,EAAE,0BAAA,CAAA;gBACxBF,SAAUJ,CAAAA,MAAAA,CAAOO,IAAI,EAAE,0BAAA,CAAA;AACzB,aAAA,CAAA;AACF,SAAA;aAkBAC,MAAS,GAAA,IAAA;AACP,YAAA,OAAO,IAAI,CAAChB,OAAO,CAACiB,GAAG,CAAC,CAACT,MAAAA,GAAAA;AACvB,gBAAA,MAAM,EAAEE,EAAE,EAAED,QAAQ,EAAE,GAAGS,YAAY,GAAGV,MAAAA;gBACxC,OAAO;AACL,oBAAA,GAAGU,UAAU;oBACbC,GAAK,EAAA,IAAI,CAACZ,WAAW,CAACC,MAAAA;AACxB,iBAAA;AACF,aAAA,CAAA;AACF,SAAA;QAxCE,IAAI,CAACR,OAAO,GAAG,EAAE;AACnB;AAwCF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbac.js","sources":["../../../../../../admin/src/core/apis/rbac.ts"],"sourcesContent":["import { Location } from 'react-router-dom';\n\nimport type { Permission, User } from '../../features/Auth';\n\ninterface RBACContext extends Pick<Location, 'pathname' | 'search'> {\n /**\n * The current user.\n */\n user?: User;\n /**\n * The permissions of the current user.\n */\n permissions: Permission[];\n}\n\ninterface RBACMiddleware {\n (\n ctx: RBACContext\n ): (\n next: (permissions: Permission[]) => Promise<Permission[]> | Permission[]\n ) => (permissions: Permission[]) => Promise<Permission[]> | Permission[];\n}\n\nclass RBAC {\n private middlewares: RBACMiddleware[] = [];\n\n constructor() {}\n\n use(middleware: RBACMiddleware[]): void;\n use(middleware: RBACMiddleware): void;\n use(middleware: RBACMiddleware | RBACMiddleware[]): void {\n if (Array.isArray(middleware)) {\n this.middlewares.push(...middleware);\n } else {\n this.middlewares.push(middleware);\n }\n }\n\n run = async (ctx: RBACContext, permissions: Permission[]): Promise<Permission[]> => {\n let index = 0;\n\n const middlewaresToRun = this.middlewares.map((middleware) => middleware(ctx));\n\n const next = async (permissions: Permission[]) => {\n if (index < this.middlewares.length) {\n return middlewaresToRun[index++](next)(permissions);\n }\n\n return permissions;\n };\n\n return next(permissions);\n };\n}\n\nexport { RBAC };\nexport type { RBACMiddleware, RBACContext };\n"],"names":["RBAC","use","middleware","Array","isArray","middlewares","push","
|
|
1
|
+
{"version":3,"file":"rbac.js","sources":["../../../../../../admin/src/core/apis/rbac.ts"],"sourcesContent":["import { Location } from 'react-router-dom';\n\nimport type { Permission, User } from '../../features/Auth';\n\ninterface RBACContext extends Pick<Location, 'pathname' | 'search'> {\n /**\n * The current user.\n */\n user?: User;\n /**\n * The permissions of the current user.\n */\n permissions: Permission[];\n}\n\ninterface RBACMiddleware {\n (\n ctx: RBACContext\n ): (\n next: (permissions: Permission[]) => Promise<Permission[]> | Permission[]\n ) => (permissions: Permission[]) => Promise<Permission[]> | Permission[];\n}\n\nclass RBAC {\n private middlewares: RBACMiddleware[] = [];\n\n constructor() {}\n\n use(middleware: RBACMiddleware[]): void;\n use(middleware: RBACMiddleware): void;\n use(middleware: RBACMiddleware | RBACMiddleware[]): void {\n if (Array.isArray(middleware)) {\n this.middlewares.push(...middleware);\n } else {\n this.middlewares.push(middleware);\n }\n }\n\n run = async (ctx: RBACContext, permissions: Permission[]): Promise<Permission[]> => {\n let index = 0;\n\n const middlewaresToRun = this.middlewares.map((middleware) => middleware(ctx));\n\n const next = async (permissions: Permission[]) => {\n if (index < this.middlewares.length) {\n return middlewaresToRun[index++](next)(permissions);\n }\n\n return permissions;\n };\n\n return next(permissions);\n };\n}\n\nexport { RBAC };\nexport type { RBACMiddleware, RBACContext };\n"],"names":["RBAC","use","middleware","Array","isArray","middlewares","push","run","ctx","permissions","index","middlewaresToRun","map","next","length"],"mappings":";;AAuBA,MAAMA,IAAAA,CAAAA;AAOJC,IAAAA,GAAAA,CAAIC,UAA6C,EAAQ;QACvD,IAAIC,KAAAA,CAAMC,OAAO,CAACF,UAAa,CAAA,EAAA;AAC7B,YAAA,IAAI,CAACG,WAAW,CAACC,IAAI,CAAIJ,GAAAA,UAAAA,CAAAA;SACpB,MAAA;AACL,YAAA,IAAI,CAACG,WAAW,CAACC,IAAI,CAACJ,UAAAA,CAAAA;AACxB;AACF;IAVA,WAAc,EAAA;AAFNG,QAAAA,IAAAA,CAAAA,WAAAA,GAAgC,EAAE;AAc1CE,QAAAA,IAAAA,CAAAA,GAAAA,GAAM,OAAOC,GAAkBC,EAAAA,WAAAA,GAAAA;AAC7B,YAAA,IAAIC,KAAQ,GAAA,CAAA;YAEZ,MAAMC,gBAAAA,GAAmB,IAAI,CAACN,WAAW,CAACO,GAAG,CAAC,CAACV,UAAAA,GAAeA,UAAWM,CAAAA,GAAAA,CAAAA,CAAAA;AAEzE,YAAA,MAAMK,OAAO,OAAOJ,WAAAA,GAAAA;AAClB,gBAAA,IAAIC,QAAQ,IAAI,CAACL,WAAW,CAACS,MAAM,EAAE;AACnC,oBAAA,OAAOH,gBAAgB,CAACD,KAAQ,EAAA,CAAA,CAACG,IAAMJ,CAAAA,CAAAA,WAAAA,CAAAA;AACzC;gBAEA,OAAOA,WAAAA;AACT,aAAA;AAEA,YAAA,OAAOI,IAAKJ,CAAAA,WAAAA,CAAAA;AACd,SAAA;AA1Be;AA2BjB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rbac.mjs","sources":["../../../../../../admin/src/core/apis/rbac.ts"],"sourcesContent":["import { Location } from 'react-router-dom';\n\nimport type { Permission, User } from '../../features/Auth';\n\ninterface RBACContext extends Pick<Location, 'pathname' | 'search'> {\n /**\n * The current user.\n */\n user?: User;\n /**\n * The permissions of the current user.\n */\n permissions: Permission[];\n}\n\ninterface RBACMiddleware {\n (\n ctx: RBACContext\n ): (\n next: (permissions: Permission[]) => Promise<Permission[]> | Permission[]\n ) => (permissions: Permission[]) => Promise<Permission[]> | Permission[];\n}\n\nclass RBAC {\n private middlewares: RBACMiddleware[] = [];\n\n constructor() {}\n\n use(middleware: RBACMiddleware[]): void;\n use(middleware: RBACMiddleware): void;\n use(middleware: RBACMiddleware | RBACMiddleware[]): void {\n if (Array.isArray(middleware)) {\n this.middlewares.push(...middleware);\n } else {\n this.middlewares.push(middleware);\n }\n }\n\n run = async (ctx: RBACContext, permissions: Permission[]): Promise<Permission[]> => {\n let index = 0;\n\n const middlewaresToRun = this.middlewares.map((middleware) => middleware(ctx));\n\n const next = async (permissions: Permission[]) => {\n if (index < this.middlewares.length) {\n return middlewaresToRun[index++](next)(permissions);\n }\n\n return permissions;\n };\n\n return next(permissions);\n };\n}\n\nexport { RBAC };\nexport type { RBACMiddleware, RBACContext };\n"],"names":["RBAC","use","middleware","Array","isArray","middlewares","push","
|
|
1
|
+
{"version":3,"file":"rbac.mjs","sources":["../../../../../../admin/src/core/apis/rbac.ts"],"sourcesContent":["import { Location } from 'react-router-dom';\n\nimport type { Permission, User } from '../../features/Auth';\n\ninterface RBACContext extends Pick<Location, 'pathname' | 'search'> {\n /**\n * The current user.\n */\n user?: User;\n /**\n * The permissions of the current user.\n */\n permissions: Permission[];\n}\n\ninterface RBACMiddleware {\n (\n ctx: RBACContext\n ): (\n next: (permissions: Permission[]) => Promise<Permission[]> | Permission[]\n ) => (permissions: Permission[]) => Promise<Permission[]> | Permission[];\n}\n\nclass RBAC {\n private middlewares: RBACMiddleware[] = [];\n\n constructor() {}\n\n use(middleware: RBACMiddleware[]): void;\n use(middleware: RBACMiddleware): void;\n use(middleware: RBACMiddleware | RBACMiddleware[]): void {\n if (Array.isArray(middleware)) {\n this.middlewares.push(...middleware);\n } else {\n this.middlewares.push(middleware);\n }\n }\n\n run = async (ctx: RBACContext, permissions: Permission[]): Promise<Permission[]> => {\n let index = 0;\n\n const middlewaresToRun = this.middlewares.map((middleware) => middleware(ctx));\n\n const next = async (permissions: Permission[]) => {\n if (index < this.middlewares.length) {\n return middlewaresToRun[index++](next)(permissions);\n }\n\n return permissions;\n };\n\n return next(permissions);\n };\n}\n\nexport { RBAC };\nexport type { RBACMiddleware, RBACContext };\n"],"names":["RBAC","use","middleware","Array","isArray","middlewares","push","run","ctx","permissions","index","middlewaresToRun","map","next","length"],"mappings":"AAuBA,MAAMA,IAAAA,CAAAA;AAOJC,IAAAA,GAAAA,CAAIC,UAA6C,EAAQ;QACvD,IAAIC,KAAAA,CAAMC,OAAO,CAACF,UAAa,CAAA,EAAA;AAC7B,YAAA,IAAI,CAACG,WAAW,CAACC,IAAI,CAAIJ,GAAAA,UAAAA,CAAAA;SACpB,MAAA;AACL,YAAA,IAAI,CAACG,WAAW,CAACC,IAAI,CAACJ,UAAAA,CAAAA;AACxB;AACF;IAVA,WAAc,EAAA;AAFNG,QAAAA,IAAAA,CAAAA,WAAAA,GAAgC,EAAE;AAc1CE,QAAAA,IAAAA,CAAAA,GAAAA,GAAM,OAAOC,GAAkBC,EAAAA,WAAAA,GAAAA;AAC7B,YAAA,IAAIC,KAAQ,GAAA,CAAA;YAEZ,MAAMC,gBAAAA,GAAmB,IAAI,CAACN,WAAW,CAACO,GAAG,CAAC,CAACV,UAAAA,GAAeA,UAAWM,CAAAA,GAAAA,CAAAA,CAAAA;AAEzE,YAAA,MAAMK,OAAO,OAAOJ,WAAAA,GAAAA;AAClB,gBAAA,IAAIC,QAAQ,IAAI,CAACL,WAAW,CAACS,MAAM,EAAE;AACnC,oBAAA,OAAOH,gBAAgB,CAACD,KAAQ,EAAA,CAAA,CAACG,IAAMJ,CAAAA,CAAAA,WAAAA,CAAAA;AACzC;gBAEA,OAAOA,WAAAA;AACT,aAAA;AAEA,YAAA,OAAOI,IAAKJ,CAAAA,WAAAA,CAAAA;AACd,SAAA;AA1Be;AA2BjB;;;;"}
|