@strapi/admin 5.50.0 → 5.50.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin/src/components/ConfirmDialog.js +2 -2
- package/dist/admin/admin/src/components/ConfirmDialog.js.map +1 -1
- package/dist/admin/admin/src/components/ContentBox.js +3 -3
- package/dist/admin/admin/src/components/ContentBox.js.map +1 -1
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.js +8 -8
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.js.map +1 -1
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.mjs +8 -8
- package/dist/admin/admin/src/components/DescriptionComponentRenderer.mjs.map +1 -1
- package/dist/admin/admin/src/components/ErrorElement.js +4 -4
- package/dist/admin/admin/src/components/ErrorElement.js.map +1 -1
- package/dist/admin/admin/src/components/Form.js +41 -27
- package/dist/admin/admin/src/components/Form.js.map +1 -1
- package/dist/admin/admin/src/components/Form.mjs +41 -27
- package/dist/admin/admin/src/components/Form.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.js +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.mjs +1 -1
- package/dist/admin/admin/src/components/FormInputs/Date.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Email.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Email.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js +4 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs +4 -1
- package/dist/admin/admin/src/components/FormInputs/Enumeration.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Json.js +2 -1
- package/dist/admin/admin/src/components/FormInputs/Json.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Json.mjs +2 -1
- package/dist/admin/admin/src/components/FormInputs/Json.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Password.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Password.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Renderer.js +18 -26
- package/dist/admin/admin/src/components/FormInputs/Renderer.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Renderer.mjs +20 -28
- package/dist/admin/admin/src/components/FormInputs/Renderer.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/String.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/String.mjs.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Textarea.js.map +1 -1
- package/dist/admin/admin/src/components/FormInputs/Textarea.mjs.map +1 -1
- package/dist/admin/admin/src/components/GapDropZone.js +2 -2
- package/dist/admin/admin/src/components/GapDropZone.js.map +1 -1
- package/dist/admin/admin/src/components/GradientBadge.js +3 -3
- package/dist/admin/admin/src/components/GradientBadge.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Overview.js +8 -8
- package/dist/admin/admin/src/components/GuidedTour/Overview.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/Step.js +4 -4
- 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/GuidedTour/Tours.js +2 -2
- package/dist/admin/admin/src/components/GuidedTour/Tours.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/ActionLayout.js +2 -2
- package/dist/admin/admin/src/components/Layouts/ActionLayout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/GridLayout.js +2 -2
- package/dist/admin/admin/src/components/Layouts/GridLayout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/Layout.js +4 -4
- package/dist/admin/admin/src/components/Layouts/Layout.js.map +1 -1
- package/dist/admin/admin/src/components/LeftMenu.js +3 -3
- package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/MainNav.js +2 -2
- package/dist/admin/admin/src/components/MainNav/MainNav.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/MainNavLinks.js +4 -4
- package/dist/admin/admin/src/components/MainNav/MainNavLinks.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavBrand.js +2 -2
- package/dist/admin/admin/src/components/MainNav/NavBrand.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js +3 -3
- package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavLink.js +8 -8
- package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavUser.js +7 -7
- package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/TrialCountdown.js +3 -3
- package/dist/admin/admin/src/components/MainNav/TrialCountdown.js.map +1 -1
- package/dist/admin/admin/src/components/NpsSurvey.js +2 -2
- package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
- package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
- package/dist/admin/admin/src/components/ResizeIndicator.js +6 -6
- package/dist/admin/admin/src/components/ResizeIndicator.js.map +1 -1
- package/dist/admin/admin/src/components/SubNav.js +11 -9
- package/dist/admin/admin/src/components/SubNav.js.map +1 -1
- package/dist/admin/admin/src/components/SubNav.mjs +4 -2
- package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
- package/dist/admin/admin/src/components/Table.js +9 -5
- package/dist/admin/admin/src/components/Table.js.map +1 -1
- package/dist/admin/admin/src/components/Table.mjs +6 -2
- package/dist/admin/admin/src/components/Table.mjs.map +1 -1
- package/dist/admin/admin/src/components/Theme.js +2 -2
- package/dist/admin/admin/src/components/Theme.js.map +1 -1
- package/dist/admin/admin/src/components/UnauthenticatedLogo.js +2 -2
- package/dist/admin/admin/src/components/UnauthenticatedLogo.js.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.js +3 -3
- package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.js +4 -7
- package/dist/admin/admin/src/components/WidgetRoot.js.map +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.mjs +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.mjs.map +1 -1
- package/dist/admin/admin/src/components/Widgets.js +5 -5
- package/dist/admin/admin/src/components/Widgets.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Plugin.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Plugin.mjs.map +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.js +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.js.map +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.mjs +1 -1
- package/dist/admin/admin/src/core/apis/Widgets.mjs.map +1 -1
- package/dist/admin/admin/src/core/store/configure.js.map +1 -1
- package/dist/admin/admin/src/core/store/configure.mjs.map +1 -1
- package/dist/admin/admin/src/core/utils/createHook.js.map +1 -1
- package/dist/admin/admin/src/core/utils/createHook.mjs.map +1 -1
- package/dist/admin/admin/src/features/Tracking.js +3 -1
- package/dist/admin/admin/src/features/Tracking.js.map +1 -1
- package/dist/admin/admin/src/features/Tracking.mjs +3 -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/useMediaQuery.js +4 -4
- package/dist/admin/admin/src/hooks/useMediaQuery.js.map +1 -1
- package/dist/admin/admin/src/hooks/useMenu.js +6 -4
- package/dist/admin/admin/src/hooks/useMenu.js.map +1 -1
- package/dist/admin/admin/src/hooks/useMenu.mjs +6 -4
- package/dist/admin/admin/src/hooks/useMenu.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useQueryParams.js.map +1 -1
- package/dist/admin/admin/src/hooks/useQueryParams.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.js +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.js.map +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.mjs +1 -1
- package/dist/admin/admin/src/hooks/useRBAC.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useThrottledCallback.js.map +1 -1
- package/dist/admin/admin/src/hooks/useThrottledCallback.mjs.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
- package/dist/admin/admin/src/layouts/UnauthenticatedLayout.js +3 -3
- package/dist/admin/admin/src/layouts/UnauthenticatedLayout.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.js +17 -9
- package/dist/admin/admin/src/pages/Auth/components/Register.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Register.mjs +15 -7
- package/dist/admin/admin/src/pages/Auth/components/Register.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.js +2 -2
- package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js +3 -6
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.mjs +1 -1
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js +4 -8
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialEndedModal.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js +4 -8
- package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.mjs +1 -1
- package/dist/admin/admin/src/pages/Home/components/FreeTrialWelcomeModal.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +2 -2
- 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 +2 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/FormHead.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js +2 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/Table.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js +2 -2
- package/dist/admin/admin/src/pages/Settings/components/Tokens/TokenBox.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/BoundRoute.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/components/CollapsableContentType.js +4 -4
- 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/reducer.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +3 -11
- 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 +3 -11
- 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 +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/components/LogoInput.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/CreatePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.js +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapseLabel.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/CollapsePropertyMatrix.js +10 -10
- 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/ConditionsButton.js +3 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ConditionsButton.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +5 -5
- 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/HiddenAction.js +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/HiddenAction.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js +3 -3
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/PluginsAndSettings.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createArrayOfValues.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/utils/createArrayOfValues.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/ListPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/SelectRoles.js +3 -3
- package/dist/admin/admin/src/pages/Settings/pages/Users/components/SelectRoles.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/Events.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/components/HeadersInput.js +2 -2
- 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.map +1 -1
- package/dist/admin/admin/src/reducer.js +3 -3
- package/dist/admin/admin/src/reducer.js.map +1 -1
- package/dist/admin/admin/src/reducer.mjs +4 -4
- package/dist/admin/admin/src/reducer.mjs.map +1 -1
- package/dist/admin/admin/src/render.js +6 -2
- package/dist/admin/admin/src/render.js.map +1 -1
- package/dist/admin/admin/src/render.mjs +6 -2
- package/dist/admin/admin/src/render.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +1 -2
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +1 -2
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/ja.json.js +693 -687
- package/dist/admin/admin/src/translations/ja.json.js.map +1 -1
- package/dist/admin/admin/src/translations/ja.json.mjs +693 -687
- package/dist/admin/admin/src/translations/ja.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/ko.json.js +157 -1
- package/dist/admin/admin/src/translations/ko.json.js.map +1 -1
- package/dist/admin/admin/src/translations/ko.json.mjs +157 -1
- package/dist/admin/admin/src/translations/ko.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/pl.json.js +22 -0
- package/dist/admin/admin/src/translations/pl.json.js.map +1 -1
- package/dist/admin/admin/src/translations/pl.json.mjs +22 -0
- package/dist/admin/admin/src/translations/pl.json.mjs.map +1 -1
- package/dist/admin/admin/src/utils/arrays.js.map +1 -1
- package/dist/admin/admin/src/utils/arrays.mjs.map +1 -1
- package/dist/admin/admin/src/utils/baseQuery.js +1 -1
- package/dist/admin/admin/src/utils/baseQuery.js.map +1 -1
- package/dist/admin/admin/src/utils/baseQuery.mjs +1 -1
- package/dist/admin/admin/src/utils/baseQuery.mjs.map +1 -1
- package/dist/admin/admin/src/utils/cookies.js +7 -0
- package/dist/admin/admin/src/utils/cookies.js.map +1 -1
- package/dist/admin/admin/src/utils/cookies.mjs +7 -1
- package/dist/admin/admin/src/utils/cookies.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.js +2 -2
- package/dist/admin/admin/src/utils/getFetchClient.js.map +1 -1
- package/dist/admin/admin/src/utils/getFetchClient.mjs +3 -3
- package/dist/admin/admin/src/utils/getFetchClient.mjs.map +1 -1
- package/dist/admin/admin/src/utils/getProjectType.js +22 -0
- package/dist/admin/admin/src/utils/getProjectType.js.map +1 -0
- package/dist/admin/admin/src/utils/getProjectType.mjs +20 -0
- package/dist/admin/admin/src/utils/getProjectType.mjs.map +1 -0
- package/dist/admin/admin/src/utils/objects.js +43 -11
- package/dist/admin/admin/src/utils/objects.js.map +1 -1
- package/dist/admin/admin/src/utils/objects.mjs +43 -11
- package/dist/admin/admin/src/utils/objects.mjs.map +1 -1
- package/dist/admin/admin/src/utils/once.js.map +1 -1
- package/dist/admin/admin/src/utils/once.mjs.map +1 -1
- package/dist/admin/admin/src/utils/rulesEngine.js +2 -1
- package/dist/admin/admin/src/utils/rulesEngine.js.map +1 -1
- package/dist/admin/admin/src/utils/rulesEngine.mjs +2 -1
- package/dist/admin/admin/src/utils/rulesEngine.mjs.map +1 -1
- package/dist/admin/admin/src/utils/shims.js.map +1 -1
- package/dist/admin/admin/src/utils/shims.mjs.map +1 -1
- package/dist/admin/admin/src/utils/widgetVisibility.js +16 -1
- package/dist/admin/admin/src/utils/widgetVisibility.js.map +1 -1
- package/dist/admin/admin/src/utils/widgetVisibility.mjs +14 -2
- package/dist/admin/admin/src/utils/widgetVisibility.mjs.map +1 -1
- package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.js +2 -2
- package/dist/admin/ee/admin/src/components/AuditLogs/Widgets.js.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js +2 -2
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.js.map +1 -1
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.mjs +2 -2
- package/dist/admin/ee/admin/src/hooks/useLicenseLimitNotification.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthPage/components/Login.js +2 -2
- package/dist/admin/ee/admin/src/pages/AuthPage/components/Login.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthPage/components/Providers.js +2 -2
- package/dist/admin/ee/admin/src/pages/AuthPage/components/Providers.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthPage/components/SSOProviders.js +3 -3
- package/dist/admin/ee/admin/src/pages/AuthPage/components/SSOProviders.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthResponse.js +1 -1
- package/dist/admin/ee/admin/src/pages/AuthResponse.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/AuthResponse.mjs +2 -2
- 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 +3 -3
- 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/AdminSeatInfo.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/ApplicationInfoPage/components/AdminSeatInfo.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ComboboxFilter.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/ComboboxFilter.mjs.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/AuditLogs/components/Modal.js +2 -2
- 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/SingleSignOnPage.js.map +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
- package/dist/admin/shared/utils/auth-cookie-name.js +31 -0
- package/dist/admin/shared/utils/auth-cookie-name.js.map +1 -0
- package/dist/admin/shared/utils/auth-cookie-name.mjs +28 -0
- package/dist/admin/shared/utils/auth-cookie-name.mjs.map +1 -0
- package/dist/admin/src/StrapiApp.d.ts +2 -2
- package/dist/admin/src/components/DescriptionComponentRenderer.d.ts +2 -1
- package/dist/admin/src/components/Form.d.ts +14 -12
- package/dist/admin/src/components/FormInputs/Renderer.d.ts +1 -1
- package/dist/admin/src/components/GuidedTour/Steps/Step.d.ts +1 -1
- package/dist/admin/src/components/SubNav.d.ts +1 -1
- package/dist/admin/src/components/Table.d.ts +3 -2
- package/dist/admin/src/core/apis/Plugin.d.ts +1 -1
- package/dist/admin/src/core/utils/createHook.d.ts +6 -6
- package/dist/admin/src/hooks/useAdminRoles.d.ts +1 -1
- package/dist/admin/src/hooks/useMenu.d.ts +1 -1
- package/dist/admin/src/hooks/useQueryParams.d.ts +2 -1
- package/dist/admin/src/hooks/useThrottledCallback.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/ApiTokens/EditView/reducer.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Roles/utils/createArrayOfValues.d.ts +1 -1
- package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +5 -5
- 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 +2 -2
- package/dist/admin/src/services/auth.d.ts +12 -12
- 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 +3 -3
- package/dist/admin/src/utils/arrays.d.ts +1 -1
- package/dist/admin/src/utils/baseQuery.d.ts +1 -1
- package/dist/admin/src/utils/cookies.d.ts +5 -0
- package/dist/admin/src/utils/getFetchClient.d.ts +7 -7
- package/dist/admin/src/utils/getProjectType.d.ts +16 -0
- package/dist/admin/src/utils/objects.d.ts +6 -4
- package/dist/admin/src/utils/once.d.ts +1 -1
- package/dist/admin/src/utils/widgetVisibility.d.ts +11 -0
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/hooks/useAuditLogsData.d.ts +1 -1
- package/dist/ee/admin/src/pages/SettingsPage/pages/AuditLogs/utils/tableHeaders.d.ts +2 -1
- package/dist/ee/admin/src/services/ai.d.ts +3 -3
- package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
- package/dist/ee/server/src/audit-logs/routes/audit-logs.d.ts +1 -1
- package/dist/ee/server/src/controllers/admin.d.ts +2 -0
- package/dist/ee/server/src/controllers/admin.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -1
- package/dist/ee/server/src/controllers/index.d.ts +2 -0
- package/dist/ee/server/src/controllers/index.d.ts.map +1 -1
- package/dist/ee/server/src/index.d.ts +2 -0
- package/dist/ee/server/src/index.d.ts.map +1 -1
- package/dist/ee/server/src/routes/index.d.ts +2 -2
- package/dist/ee/server/src/routes/sso.d.ts +2 -2
- package/dist/ee/server/src/services/index.d.ts +2 -2
- package/dist/server/ee/server/src/controllers/admin.js +1 -0
- package/dist/server/ee/server/src/controllers/admin.js.map +1 -1
- package/dist/server/ee/server/src/controllers/admin.mjs +1 -0
- package/dist/server/ee/server/src/controllers/admin.mjs.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs +2 -2
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/handlers.js +9 -2
- package/dist/server/server/src/services/permission/sections-builder/handlers.js.map +1 -1
- package/dist/server/server/src/services/permission/sections-builder/handlers.mjs +9 -2
- package/dist/server/server/src/services/permission/sections-builder/handlers.mjs.map +1 -1
- package/dist/server/server/src/services/role.js +5 -1
- package/dist/server/server/src/services/role.js.map +1 -1
- package/dist/server/server/src/services/role.mjs +5 -1
- package/dist/server/server/src/services/role.mjs.map +1 -1
- package/dist/server/server/src/validation/common-validators.js +19 -11
- package/dist/server/server/src/validation/common-validators.js.map +1 -1
- package/dist/server/server/src/validation/common-validators.mjs +19 -11
- package/dist/server/server/src/validation/common-validators.mjs.map +1 -1
- package/dist/server/server/src/validation/permission.js +1 -1
- package/dist/server/server/src/validation/permission.js.map +1 -1
- package/dist/server/server/src/validation/permission.mjs +1 -1
- package/dist/server/server/src/validation/permission.mjs.map +1 -1
- package/dist/server/server/src/validation/role.js +2 -2
- package/dist/server/server/src/validation/role.js.map +1 -1
- package/dist/server/server/src/validation/role.mjs +2 -2
- package/dist/server/server/src/validation/role.mjs.map +1 -1
- package/dist/server/shared/utils/auth-cookie-name.js +31 -0
- package/dist/server/shared/utils/auth-cookie-name.js.map +1 -0
- package/dist/server/shared/utils/auth-cookie-name.mjs +28 -0
- package/dist/server/shared/utils/auth-cookie-name.mjs.map +1 -0
- package/dist/server/shared/utils/session-auth.js +6 -0
- package/dist/server/shared/utils/session-auth.js.map +1 -1
- package/dist/server/shared/utils/session-auth.mjs +6 -1
- package/dist/server/shared/utils/session-auth.mjs.map +1 -1
- package/dist/server/src/controllers/admin.d.ts +3 -3
- package/dist/server/src/controllers/index.d.ts +3 -3
- package/dist/server/src/domain/user.d.ts +1 -1
- package/dist/server/src/index.d.ts +19 -19
- package/dist/server/src/middlewares/index.d.ts +1 -1
- package/dist/server/src/services/index.d.ts +13 -13
- package/dist/server/src/services/permission/sections-builder/handlers.d.ts.map +1 -1
- package/dist/server/src/services/role.d.ts.map +1 -1
- package/dist/server/src/validation/common-validators.d.ts.map +1 -1
- package/dist/server/src/validation/role.d.ts.map +1 -1
- package/dist/shared/utils/__tests__/auth-cookie-name.test.d.ts +1 -0
- package/dist/shared/utils/__tests__/auth-cookie-name.test.d.ts.map +1 -0
- package/dist/shared/utils/__tests__/session-auth.test.d.ts +1 -0
- package/dist/shared/utils/__tests__/session-auth.test.d.ts.map +1 -0
- package/dist/shared/utils/auth-cookie-name.d.ts +14 -0
- package/dist/shared/utils/auth-cookie-name.d.ts.map +1 -0
- package/dist/shared/utils/session-auth.d.ts +1 -0
- package/dist/shared/utils/session-auth.d.ts.map +1 -1
- package/package.json +20 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NpsSurvey.js","sources":["../../../../../admin/src/components/NpsSurvey.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Flex,\n IconButton,\n Button,\n Typography,\n Textarea,\n Portal,\n Field,\n VisuallyHidden,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useIsMobile } from '../hooks/useMediaQuery';\nimport { usePersistentState } from '../hooks/usePersistentState';\n\nconst FieldWrapper = styled(Field.Root)`\n height: 3.2rem;\n width: 3.2rem;\n align-items: center;\n justify-content: center;\n\n > label,\n ~ input {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n > label {\n color: inherit;\n cursor: pointer;\n padding: ${({ theme }) => theme.spaces[2]};\n text-align: center;\n vertical-align: middle;\n }\n\n &:hover,\n &:focus-within {\n background-color: ${({ theme }) => theme.colors.neutral0};\n }\n\n &:active,\n &.selected {\n color: ${({ theme }) => theme.colors.primary700};\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-color: ${({ theme }) => theme.colors.primary700};\n }\n`;\n\nconst delays = {\n postResponse: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n postFirstDismissal: 14 * 24 * 60 * 60 * 1000, // 14 days in ms\n postSubsequentDismissal: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n display: 30 * 60 * 1000, // 30 minutes in ms\n};\n\nconst ratingArray = [...Array(11).keys()];\n\nconst checkIfShouldShowSurvey = (settings: NpsSurveySettings) => {\n const { enabled, lastResponseDate, firstDismissalDate, lastDismissalDate } = settings;\n\n // This function goes through all the cases where we'd want to not show the survey:\n // 1. If the survey is disabled by strapi, abort mission, don't bother checking the other settings.\n // 2. If the survey is disabled by user, abort mission, don't bother checking the other settings.\n // 3. If the user has already responded to the survey, check if enough time has passed since the last response.\n // 4. If the user has dismissed the survey twice or more before, check if enough time has passed since the last dismissal.\n // 5. If the user has only dismissed the survey once before, check if enough time has passed since the first dismissal.\n // If none of these cases check out, then we show the survey.\n // Note that submitting a response resets the dismissal counts.\n // Checks 4 and 5 should not be reversed, since the first dismissal will also exist if the user has dismissed the survey twice or more before.\n\n // For users who had created an account before the NPS feature was introduced,\n // we assume that they would have enabled the NPS feature if they had the chance.\n\n // Global strapi disable for NSP.\n if (window.strapi.flags.nps === false) {\n return false;\n }\n\n // User chose not to enable the NPS feature when signing up\n if (enabled === false) {\n return false;\n }\n\n // The user has already responded to the survey\n if (lastResponseDate) {\n const timeSinceLastResponse = Date.now() - new Date(lastResponseDate).getTime();\n\n if (timeSinceLastResponse >= delays.postResponse) {\n return true;\n }\n\n return false;\n }\n\n // The user has dismissed the survey twice or more before\n if (lastDismissalDate) {\n const timeSinceLastDismissal = Date.now() - new Date(lastDismissalDate).getTime();\n\n if (timeSinceLastDismissal >= delays.postSubsequentDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has only dismissed the survey once before\n if (firstDismissalDate) {\n const timeSinceFirstDismissal = Date.now() - new Date(firstDismissalDate).getTime();\n\n if (timeSinceFirstDismissal >= delays.postFirstDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has not interacted with the survey before\n return true;\n};\n\nconst NpsSurvey = () => {\n const isMobile = useIsMobile();\n const { formatMessage } = useIntl();\n const { npsSurveySettings, setNpsSurveySettings } = useNpsSurveySettings();\n const [isFeedbackResponse, setIsFeedbackResponse] = React.useState(false);\n const { toggleNotification } = useNotification();\n const currentEnvironment = useAppInfo('NpsSurvey', (state) => state.currentEnvironment);\n const strapiVersion = useAppInfo('NpsSurvey', (state) => state.strapiVersion);\n\n interface NpsSurveyMutationBody {\n email: string;\n rating: number | null;\n comment: string;\n environment?: string;\n version?: string;\n license: 'Enterprise' | 'Community';\n }\n\n // Only check on first render if the survey should be shown\n const [surveyIsShown, setSurveyIsShown] = React.useState(\n checkIfShouldShowSurvey(npsSurveySettings)\n );\n\n // Set a cooldown to show the survey when session begins\n const [displaySurvey, setDisplaySurvey] = React.useState(false);\n\n React.useEffect(() => {\n const displayTime = setTimeout(() => {\n setDisplaySurvey(true);\n }, delays.display);\n\n return () => {\n clearTimeout(displayTime);\n };\n }, []);\n\n const { user } = useAuth('NpsSurvey', (auth) => auth);\n\n if (!displaySurvey) {\n return null;\n }\n\n if (!surveyIsShown) {\n return null;\n }\n\n const handleSubmitResponse = async ({\n npsSurveyRating,\n npsSurveyFeedback,\n }: {\n npsSurveyRating: NpsSurveyMutationBody['rating'];\n npsSurveyFeedback: NpsSurveyMutationBody['comment'];\n }) => {\n try {\n const body = {\n email: typeof user === 'object' && user.email ? user.email : '',\n rating: npsSurveyRating,\n comment: npsSurveyFeedback,\n environment: currentEnvironment,\n version: strapiVersion ?? undefined,\n license: window.strapi.projectType,\n isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud',\n };\n const res = await fetch(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/submit-nps`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n }\n );\n\n if (!res.ok) {\n throw new Error('Failed to submit NPS survey');\n }\n\n setNpsSurveySettings((settings) => ({\n ...settings,\n lastResponseDate: new Date().toString(),\n firstDismissalDate: null,\n lastDismissalDate: null,\n }));\n setIsFeedbackResponse(true);\n // Thank you message displayed in the banner should disappear after few seconds.\n setTimeout(() => {\n setSurveyIsShown(false);\n }, 3000);\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const handleDismiss = () => {\n setNpsSurveySettings((settings) => {\n const nextSettings = {\n ...settings,\n lastResponseDate: null,\n };\n\n if (settings.firstDismissalDate) {\n // If the user dismisses the survey for the second time\n nextSettings.lastDismissalDate = new Date().toString();\n } else {\n // If the user dismisses the survey for the first time\n nextSettings.firstDismissalDate = new Date().toString();\n }\n\n return nextSettings;\n });\n\n setSurveyIsShown(false);\n };\n\n return (\n <Portal>\n <Formik\n initialValues={{ npsSurveyFeedback: '', npsSurveyRating: null }}\n onSubmit={handleSubmitResponse}\n validationSchema={yup.object({\n npsSurveyFeedback: yup.string(),\n npsSurveyRating: yup.number().required(),\n })}\n >\n {({ values, handleChange, setFieldValue, isSubmitting }) => (\n <Form name=\"npsSurveyForm\">\n <Box\n padding={4}\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex=\"200\"\n minWidth={{ initial: '100%', medium: '50%' }}\n >\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n wrap=\"wrap\"\n >\n {isFeedbackResponse ? (\n <Typography fontWeight=\"semiBold\">\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-response',\n defaultMessage: 'Thank you very much for your feedback!',\n })}\n </Typography>\n ) : (\n <Box tag=\"fieldset\" width=\"100%\" borderWidth={0}>\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={2}>\n <Box marginLeft=\"auto\" marginRight=\"auto\">\n <Typography fontWeight=\"semiBold\" tag=\"legend\">\n {formatMessage({\n id: 'app.components.NpsSurvey.banner-title',\n defaultMessage:\n 'How likely are you to recommend Strapi to a friend or colleague?',\n })}\n </Typography>\n </Box>\n <IconButton\n onClick={handleDismiss}\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.NpsSurvey.dismiss-survey-label',\n defaultMessage: 'Dismiss survey',\n })}\n type=\"button\"\n >\n <Cross />\n </IconButton>\n </Flex>\n {isMobile ? (\n <Box marginTop={2}>\n <SingleSelect\n placeholder={formatMessage({\n id: 'app.components.NpsSurvey.select-rating',\n defaultMessage: 'Select rating',\n })}\n onChange={(value) => {\n setFieldValue('npsSurveyRating', parseInt(value.toString(), 10));\n }}\n value={values.npsSurveyRating}\n >\n {ratingArray\n .sort((a, b) => b - a)\n .map((number) => {\n const suffixMessage =\n number === 0\n ? formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })\n : number === 10\n ? formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })\n : '';\n return (\n <SingleSelectOption key={number} value={number}>\n {number} {suffixMessage && `(${suffixMessage})`}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n ) : (\n <Flex gap={2} marginTop={2} marginBottom={2} justifyContent=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })}\n </Typography>\n {ratingArray.map((number) => {\n return (\n <FieldWrapper\n key={number}\n name=\"npsSurveyRating\"\n className={values.npsSurveyRating === number ? 'selected' : undefined} // \"selected\" class added when child radio button is checked\n hasRadius\n background=\"primary100\"\n borderColor=\"primary200\"\n color=\"primary600\"\n position=\"relative\"\n cursor=\"pointer\"\n >\n <Field.Label>\n <VisuallyHidden>\n <Field.Input\n type=\"radio\"\n checked={values.npsSurveyRating === number}\n onChange={(e) =>\n setFieldValue('npsSurveyRating', parseInt(e.target.value, 10))\n }\n value={number}\n />\n </VisuallyHidden>\n {number}\n </Field.Label>\n </FieldWrapper>\n );\n })}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })}\n </Typography>\n </Flex>\n )}\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\" alignItems=\"stretch\">\n <Box marginTop={2}>\n <Field.Label fontWeight=\"semiBold\" fontSize={2}>\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-question',\n defaultMessage: 'Do you have any suggestion for improvements?',\n })}\n </Field.Label>\n </Box>\n <Box marginTop={3} marginBottom={4} width=\"100%\">\n <Textarea\n id=\"npsSurveyFeedback\" // formik element attribute \"id\" should be same as the values key to work\n width=\"100%\"\n onChange={handleChange}\n value={values.npsSurveyFeedback}\n />\n </Box>\n <Box>\n <Button marginBottom={2} type=\"submit\" loading={isSubmitting}>\n {formatMessage({\n id: 'app.components.NpsSurvey.submit-feedback',\n defaultMessage: 'Submit Feedback',\n })}\n </Button>\n </Box>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Box>\n </Form>\n )}\n </Formik>\n </Portal>\n );\n};\n\ninterface NpsSurveySettings {\n enabled: boolean;\n lastResponseDate: string | null;\n firstDismissalDate: string | null;\n lastDismissalDate: string | null;\n}\n\n/**\n * We exported to make it available during admin user registration.\n * Because we only enable the NPS for users who subscribe to the newsletter when signing up\n */\nfunction useNpsSurveySettings() {\n const [npsSurveySettings, setNpsSurveySettings] = usePersistentState<NpsSurveySettings>(\n 'STRAPI_NPS_SURVEY_SETTINGS',\n {\n enabled: true,\n lastResponseDate: null,\n firstDismissalDate: null,\n lastDismissalDate: null,\n }\n );\n\n /**\n * TODO: should this just be an array so we can alias the `usePersistentState` hook?\n */\n return { npsSurveySettings, setNpsSurveySettings };\n}\n\nexport { NpsSurvey, useNpsSurveySettings };\n"],"names":["FieldWrapper","styled","Field","Root","theme","spaces","colors","neutral0","primary700","delays","postResponse","postFirstDismissal","postSubsequentDismissal","display","ratingArray","Array","keys","checkIfShouldShowSurvey","settings","enabled","lastResponseDate","firstDismissalDate","lastDismissalDate","window","strapi","flags","nps","timeSinceLastResponse","Date","now","getTime","timeSinceLastDismissal","timeSinceFirstDismissal","NpsSurvey","isMobile","useIsMobile","formatMessage","useIntl","npsSurveySettings","setNpsSurveySettings","useNpsSurveySettings","isFeedbackResponse","setIsFeedbackResponse","React","useState","toggleNotification","useNotification","currentEnvironment","useAppInfo","state","strapiVersion","surveyIsShown","setSurveyIsShown","displaySurvey","setDisplaySurvey","useEffect","displayTime","setTimeout","clearTimeout","user","useAuth","auth","handleSubmitResponse","npsSurveyRating","npsSurveyFeedback","body","email","rating","comment","environment","version","undefined","license","projectType","isHostedOnStrapiCloud","process","env","STRAPI_HOSTING","res","fetch","STRAPI_ANALYTICS_URL","method","headers","JSON","stringify","ok","Error","toString","err","type","message","id","defaultMessage","handleDismiss","nextSettings","_jsx","Portal","Formik","initialValues","onSubmit","validationSchema","yup","object","string","number","required","values","handleChange","setFieldValue","isSubmitting","Form","name","Box","padding","position","bottom","left","transform","zIndex","minWidth","initial","medium","Flex","hasRadius","direction","borderColor","background","shadow","wrap","Typography","fontWeight","_jsxs","tag","width","borderWidth","justifyContent","gap","marginLeft","marginRight","IconButton","onClick","withTooltip","label","Cross","marginTop","SingleSelect","placeholder","onChange","value","parseInt","sort","a","b","map","suffixMessage","SingleSelectOption","marginBottom","variant","textColor","className","color","cursor","Label","VisuallyHidden","Input","checked","e","target","alignItems","fontSize","Textarea","Button","loading","usePersistentState"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NpsSurvey.js","sources":["../../../../../admin/src/components/NpsSurvey.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Flex,\n IconButton,\n Button,\n Typography,\n Textarea,\n Portal,\n Field,\n VisuallyHidden,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useIsMobile } from '../hooks/useMediaQuery';\nimport { usePersistentState } from '../hooks/usePersistentState';\n\nconst FieldWrapper = styled(Field.Root)`\n height: 3.2rem;\n width: 3.2rem;\n align-items: center;\n justify-content: center;\n\n > label,\n ~ input {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n > label {\n color: inherit;\n cursor: pointer;\n padding: ${({ theme }) => theme.spaces[2]};\n text-align: center;\n vertical-align: middle;\n }\n\n &:hover,\n &:focus-within {\n background-color: ${({ theme }) => theme.colors.neutral0};\n }\n\n &:active,\n &.selected {\n color: ${({ theme }) => theme.colors.primary700};\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-color: ${({ theme }) => theme.colors.primary700};\n }\n`;\n\nconst delays = {\n postResponse: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n postFirstDismissal: 14 * 24 * 60 * 60 * 1000, // 14 days in ms\n postSubsequentDismissal: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n display: 30 * 60 * 1000, // 30 minutes in ms\n};\n\nconst ratingArray = [...Array(11).keys()];\n\nconst checkIfShouldShowSurvey = (settings: NpsSurveySettings) => {\n const { enabled, lastResponseDate, firstDismissalDate, lastDismissalDate } = settings;\n\n // This function goes through all the cases where we'd want to not show the survey:\n // 1. If the survey is disabled by strapi, abort mission, don't bother checking the other settings.\n // 2. If the survey is disabled by user, abort mission, don't bother checking the other settings.\n // 3. If the user has already responded to the survey, check if enough time has passed since the last response.\n // 4. If the user has dismissed the survey twice or more before, check if enough time has passed since the last dismissal.\n // 5. If the user has only dismissed the survey once before, check if enough time has passed since the first dismissal.\n // If none of these cases check out, then we show the survey.\n // Note that submitting a response resets the dismissal counts.\n // Checks 4 and 5 should not be reversed, since the first dismissal will also exist if the user has dismissed the survey twice or more before.\n\n // For users who had created an account before the NPS feature was introduced,\n // we assume that they would have enabled the NPS feature if they had the chance.\n\n // Global strapi disable for NSP.\n if (window.strapi.flags.nps === false) {\n return false;\n }\n\n // User chose not to enable the NPS feature when signing up\n if (enabled === false) {\n return false;\n }\n\n // The user has already responded to the survey\n if (lastResponseDate) {\n const timeSinceLastResponse = Date.now() - new Date(lastResponseDate).getTime();\n\n if (timeSinceLastResponse >= delays.postResponse) {\n return true;\n }\n\n return false;\n }\n\n // The user has dismissed the survey twice or more before\n if (lastDismissalDate) {\n const timeSinceLastDismissal = Date.now() - new Date(lastDismissalDate).getTime();\n\n if (timeSinceLastDismissal >= delays.postSubsequentDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has only dismissed the survey once before\n if (firstDismissalDate) {\n const timeSinceFirstDismissal = Date.now() - new Date(firstDismissalDate).getTime();\n\n if (timeSinceFirstDismissal >= delays.postFirstDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has not interacted with the survey before\n return true;\n};\n\nconst NpsSurvey = () => {\n const isMobile = useIsMobile();\n const { formatMessage } = useIntl();\n const { npsSurveySettings, setNpsSurveySettings } = useNpsSurveySettings();\n const [isFeedbackResponse, setIsFeedbackResponse] = React.useState(false);\n const { toggleNotification } = useNotification();\n const currentEnvironment = useAppInfo('NpsSurvey', (state) => state.currentEnvironment);\n const strapiVersion = useAppInfo('NpsSurvey', (state) => state.strapiVersion);\n\n interface NpsSurveyMutationBody {\n email: string;\n rating: number | null;\n comment: string;\n environment?: string;\n version?: string;\n license: 'Enterprise' | 'Growth' | 'Community';\n }\n\n // Only check on first render if the survey should be shown\n const [surveyIsShown, setSurveyIsShown] = React.useState(\n checkIfShouldShowSurvey(npsSurveySettings)\n );\n\n // Set a cooldown to show the survey when session begins\n const [displaySurvey, setDisplaySurvey] = React.useState(false);\n\n React.useEffect(() => {\n const displayTime = setTimeout(() => {\n setDisplaySurvey(true);\n }, delays.display);\n\n return () => {\n clearTimeout(displayTime);\n };\n }, []);\n\n const { user } = useAuth('NpsSurvey', (auth) => auth);\n\n if (!displaySurvey) {\n return null;\n }\n\n if (!surveyIsShown) {\n return null;\n }\n\n const handleSubmitResponse = async ({\n npsSurveyRating,\n npsSurveyFeedback,\n }: {\n npsSurveyRating: NpsSurveyMutationBody['rating'];\n npsSurveyFeedback: NpsSurveyMutationBody['comment'];\n }) => {\n try {\n const body = {\n email: typeof user === 'object' && user.email ? user.email : '',\n rating: npsSurveyRating,\n comment: npsSurveyFeedback,\n environment: currentEnvironment,\n version: strapiVersion ?? undefined,\n license: window.strapi.projectType,\n isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud',\n };\n const res = await fetch(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/submit-nps`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n }\n );\n\n if (!res.ok) {\n throw new Error('Failed to submit NPS survey');\n }\n\n setNpsSurveySettings((settings) => ({\n ...settings,\n lastResponseDate: new Date().toString(),\n firstDismissalDate: null,\n lastDismissalDate: null,\n }));\n setIsFeedbackResponse(true);\n // Thank you message displayed in the banner should disappear after few seconds.\n setTimeout(() => {\n setSurveyIsShown(false);\n }, 3000);\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const handleDismiss = () => {\n setNpsSurveySettings((settings) => {\n const nextSettings = {\n ...settings,\n lastResponseDate: null,\n };\n\n if (settings.firstDismissalDate) {\n // If the user dismisses the survey for the second time\n nextSettings.lastDismissalDate = new Date().toString();\n } else {\n // If the user dismisses the survey for the first time\n nextSettings.firstDismissalDate = new Date().toString();\n }\n\n return nextSettings;\n });\n\n setSurveyIsShown(false);\n };\n\n return (\n <Portal>\n <Formik\n initialValues={{ npsSurveyFeedback: '', npsSurveyRating: null }}\n onSubmit={handleSubmitResponse}\n validationSchema={yup.object({\n npsSurveyFeedback: yup.string(),\n npsSurveyRating: yup.number().required(),\n })}\n >\n {({ values, handleChange, setFieldValue, isSubmitting }) => (\n <Form name=\"npsSurveyForm\">\n <Box\n padding={4}\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex=\"200\"\n minWidth={{ initial: '100%', medium: '50%' }}\n >\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n wrap=\"wrap\"\n >\n {isFeedbackResponse ? (\n <Typography fontWeight=\"semiBold\">\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-response',\n defaultMessage: 'Thank you very much for your feedback!',\n })}\n </Typography>\n ) : (\n <Box tag=\"fieldset\" width=\"100%\" borderWidth={0}>\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={2}>\n <Box marginLeft=\"auto\" marginRight=\"auto\">\n <Typography fontWeight=\"semiBold\" tag=\"legend\">\n {formatMessage({\n id: 'app.components.NpsSurvey.banner-title',\n defaultMessage:\n 'How likely are you to recommend Strapi to a friend or colleague?',\n })}\n </Typography>\n </Box>\n <IconButton\n onClick={handleDismiss}\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.NpsSurvey.dismiss-survey-label',\n defaultMessage: 'Dismiss survey',\n })}\n type=\"button\"\n >\n <Cross />\n </IconButton>\n </Flex>\n {isMobile ? (\n <Box marginTop={2}>\n <SingleSelect\n placeholder={formatMessage({\n id: 'app.components.NpsSurvey.select-rating',\n defaultMessage: 'Select rating',\n })}\n onChange={(value) => {\n setFieldValue('npsSurveyRating', parseInt(value.toString(), 10));\n }}\n value={values.npsSurveyRating}\n >\n {ratingArray\n .sort((a, b) => b - a)\n .map((number) => {\n const suffixMessage =\n number === 0\n ? formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })\n : number === 10\n ? formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })\n : '';\n return (\n <SingleSelectOption key={number} value={number}>\n {number} {suffixMessage && `(${suffixMessage})`}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n ) : (\n <Flex gap={2} marginTop={2} marginBottom={2} justifyContent=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })}\n </Typography>\n {ratingArray.map((number) => {\n return (\n <FieldWrapper\n key={number}\n name=\"npsSurveyRating\"\n className={values.npsSurveyRating === number ? 'selected' : undefined} // \"selected\" class added when child radio button is checked\n hasRadius\n background=\"primary100\"\n borderColor=\"primary200\"\n color=\"primary600\"\n position=\"relative\"\n cursor=\"pointer\"\n >\n <Field.Label>\n <VisuallyHidden>\n <Field.Input\n type=\"radio\"\n checked={values.npsSurveyRating === number}\n onChange={(e) =>\n setFieldValue('npsSurveyRating', parseInt(e.target.value, 10))\n }\n value={number}\n />\n </VisuallyHidden>\n {number}\n </Field.Label>\n </FieldWrapper>\n );\n })}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })}\n </Typography>\n </Flex>\n )}\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\" alignItems=\"stretch\">\n <Box marginTop={2}>\n <Field.Label fontWeight=\"semiBold\" fontSize={2}>\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-question',\n defaultMessage: 'Do you have any suggestion for improvements?',\n })}\n </Field.Label>\n </Box>\n <Box marginTop={3} marginBottom={4} width=\"100%\">\n <Textarea\n id=\"npsSurveyFeedback\" // formik element attribute \"id\" should be same as the values key to work\n width=\"100%\"\n onChange={handleChange}\n value={values.npsSurveyFeedback}\n />\n </Box>\n <Box>\n <Button marginBottom={2} type=\"submit\" loading={isSubmitting}>\n {formatMessage({\n id: 'app.components.NpsSurvey.submit-feedback',\n defaultMessage: 'Submit Feedback',\n })}\n </Button>\n </Box>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Box>\n </Form>\n )}\n </Formik>\n </Portal>\n );\n};\n\ninterface NpsSurveySettings {\n enabled: boolean;\n lastResponseDate: string | null;\n firstDismissalDate: string | null;\n lastDismissalDate: string | null;\n}\n\n/**\n * We exported to make it available during admin user registration.\n * Because we only enable the NPS for users who subscribe to the newsletter when signing up\n */\nfunction useNpsSurveySettings() {\n const [npsSurveySettings, setNpsSurveySettings] = usePersistentState<NpsSurveySettings>(\n 'STRAPI_NPS_SURVEY_SETTINGS',\n {\n enabled: true,\n lastResponseDate: null,\n firstDismissalDate: null,\n lastDismissalDate: null,\n }\n );\n\n /**\n * TODO: should this just be an array so we can alias the `usePersistentState` hook?\n */\n return { npsSurveySettings, setNpsSurveySettings };\n}\n\nexport { NpsSurvey, useNpsSurveySettings };\n"],"names":["FieldWrapper","styled","Field","Root","theme","spaces","colors","neutral0","primary700","delays","postResponse","postFirstDismissal","postSubsequentDismissal","display","ratingArray","Array","keys","checkIfShouldShowSurvey","settings","enabled","lastResponseDate","firstDismissalDate","lastDismissalDate","window","strapi","flags","nps","timeSinceLastResponse","Date","now","getTime","timeSinceLastDismissal","timeSinceFirstDismissal","NpsSurvey","isMobile","useIsMobile","formatMessage","useIntl","npsSurveySettings","setNpsSurveySettings","useNpsSurveySettings","isFeedbackResponse","setIsFeedbackResponse","React","useState","toggleNotification","useNotification","currentEnvironment","useAppInfo","state","strapiVersion","surveyIsShown","setSurveyIsShown","displaySurvey","setDisplaySurvey","useEffect","displayTime","setTimeout","clearTimeout","user","useAuth","auth","handleSubmitResponse","npsSurveyRating","npsSurveyFeedback","body","email","rating","comment","environment","version","undefined","license","projectType","isHostedOnStrapiCloud","process","env","STRAPI_HOSTING","res","fetch","STRAPI_ANALYTICS_URL","method","headers","JSON","stringify","ok","Error","toString","err","type","message","id","defaultMessage","handleDismiss","nextSettings","_jsx","Portal","Formik","initialValues","onSubmit","validationSchema","yup","object","string","number","required","values","handleChange","setFieldValue","isSubmitting","Form","name","Box","padding","position","bottom","left","transform","zIndex","minWidth","initial","medium","Flex","hasRadius","direction","borderColor","background","shadow","wrap","Typography","fontWeight","_jsxs","tag","width","borderWidth","justifyContent","gap","marginLeft","marginRight","IconButton","onClick","withTooltip","label","Cross","marginTop","SingleSelect","placeholder","onChange","value","parseInt","sort","a","b","map","suffixMessage","SingleSelectOption","marginBottom","variant","textColor","className","color","cursor","Label","VisuallyHidden","Input","checked","e","target","alignItems","fontSize","Textarea","Button","loading","usePersistentState"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NpsSurvey.mjs","sources":["../../../../../admin/src/components/NpsSurvey.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Flex,\n IconButton,\n Button,\n Typography,\n Textarea,\n Portal,\n Field,\n VisuallyHidden,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useIsMobile } from '../hooks/useMediaQuery';\nimport { usePersistentState } from '../hooks/usePersistentState';\n\nconst FieldWrapper = styled(Field.Root)`\n height: 3.2rem;\n width: 3.2rem;\n align-items: center;\n justify-content: center;\n\n > label,\n ~ input {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n > label {\n color: inherit;\n cursor: pointer;\n padding: ${({ theme }) => theme.spaces[2]};\n text-align: center;\n vertical-align: middle;\n }\n\n &:hover,\n &:focus-within {\n background-color: ${({ theme }) => theme.colors.neutral0};\n }\n\n &:active,\n &.selected {\n color: ${({ theme }) => theme.colors.primary700};\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-color: ${({ theme }) => theme.colors.primary700};\n }\n`;\n\nconst delays = {\n postResponse: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n postFirstDismissal: 14 * 24 * 60 * 60 * 1000, // 14 days in ms\n postSubsequentDismissal: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n display: 30 * 60 * 1000, // 30 minutes in ms\n};\n\nconst ratingArray = [...Array(11).keys()];\n\nconst checkIfShouldShowSurvey = (settings: NpsSurveySettings) => {\n const { enabled, lastResponseDate, firstDismissalDate, lastDismissalDate } = settings;\n\n // This function goes through all the cases where we'd want to not show the survey:\n // 1. If the survey is disabled by strapi, abort mission, don't bother checking the other settings.\n // 2. If the survey is disabled by user, abort mission, don't bother checking the other settings.\n // 3. If the user has already responded to the survey, check if enough time has passed since the last response.\n // 4. If the user has dismissed the survey twice or more before, check if enough time has passed since the last dismissal.\n // 5. If the user has only dismissed the survey once before, check if enough time has passed since the first dismissal.\n // If none of these cases check out, then we show the survey.\n // Note that submitting a response resets the dismissal counts.\n // Checks 4 and 5 should not be reversed, since the first dismissal will also exist if the user has dismissed the survey twice or more before.\n\n // For users who had created an account before the NPS feature was introduced,\n // we assume that they would have enabled the NPS feature if they had the chance.\n\n // Global strapi disable for NSP.\n if (window.strapi.flags.nps === false) {\n return false;\n }\n\n // User chose not to enable the NPS feature when signing up\n if (enabled === false) {\n return false;\n }\n\n // The user has already responded to the survey\n if (lastResponseDate) {\n const timeSinceLastResponse = Date.now() - new Date(lastResponseDate).getTime();\n\n if (timeSinceLastResponse >= delays.postResponse) {\n return true;\n }\n\n return false;\n }\n\n // The user has dismissed the survey twice or more before\n if (lastDismissalDate) {\n const timeSinceLastDismissal = Date.now() - new Date(lastDismissalDate).getTime();\n\n if (timeSinceLastDismissal >= delays.postSubsequentDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has only dismissed the survey once before\n if (firstDismissalDate) {\n const timeSinceFirstDismissal = Date.now() - new Date(firstDismissalDate).getTime();\n\n if (timeSinceFirstDismissal >= delays.postFirstDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has not interacted with the survey before\n return true;\n};\n\nconst NpsSurvey = () => {\n const isMobile = useIsMobile();\n const { formatMessage } = useIntl();\n const { npsSurveySettings, setNpsSurveySettings } = useNpsSurveySettings();\n const [isFeedbackResponse, setIsFeedbackResponse] = React.useState(false);\n const { toggleNotification } = useNotification();\n const currentEnvironment = useAppInfo('NpsSurvey', (state) => state.currentEnvironment);\n const strapiVersion = useAppInfo('NpsSurvey', (state) => state.strapiVersion);\n\n interface NpsSurveyMutationBody {\n email: string;\n rating: number | null;\n comment: string;\n environment?: string;\n version?: string;\n license: 'Enterprise' | 'Community';\n }\n\n // Only check on first render if the survey should be shown\n const [surveyIsShown, setSurveyIsShown] = React.useState(\n checkIfShouldShowSurvey(npsSurveySettings)\n );\n\n // Set a cooldown to show the survey when session begins\n const [displaySurvey, setDisplaySurvey] = React.useState(false);\n\n React.useEffect(() => {\n const displayTime = setTimeout(() => {\n setDisplaySurvey(true);\n }, delays.display);\n\n return () => {\n clearTimeout(displayTime);\n };\n }, []);\n\n const { user } = useAuth('NpsSurvey', (auth) => auth);\n\n if (!displaySurvey) {\n return null;\n }\n\n if (!surveyIsShown) {\n return null;\n }\n\n const handleSubmitResponse = async ({\n npsSurveyRating,\n npsSurveyFeedback,\n }: {\n npsSurveyRating: NpsSurveyMutationBody['rating'];\n npsSurveyFeedback: NpsSurveyMutationBody['comment'];\n }) => {\n try {\n const body = {\n email: typeof user === 'object' && user.email ? user.email : '',\n rating: npsSurveyRating,\n comment: npsSurveyFeedback,\n environment: currentEnvironment,\n version: strapiVersion ?? undefined,\n license: window.strapi.projectType,\n isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud',\n };\n const res = await fetch(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/submit-nps`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n }\n );\n\n if (!res.ok) {\n throw new Error('Failed to submit NPS survey');\n }\n\n setNpsSurveySettings((settings) => ({\n ...settings,\n lastResponseDate: new Date().toString(),\n firstDismissalDate: null,\n lastDismissalDate: null,\n }));\n setIsFeedbackResponse(true);\n // Thank you message displayed in the banner should disappear after few seconds.\n setTimeout(() => {\n setSurveyIsShown(false);\n }, 3000);\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const handleDismiss = () => {\n setNpsSurveySettings((settings) => {\n const nextSettings = {\n ...settings,\n lastResponseDate: null,\n };\n\n if (settings.firstDismissalDate) {\n // If the user dismisses the survey for the second time\n nextSettings.lastDismissalDate = new Date().toString();\n } else {\n // If the user dismisses the survey for the first time\n nextSettings.firstDismissalDate = new Date().toString();\n }\n\n return nextSettings;\n });\n\n setSurveyIsShown(false);\n };\n\n return (\n <Portal>\n <Formik\n initialValues={{ npsSurveyFeedback: '', npsSurveyRating: null }}\n onSubmit={handleSubmitResponse}\n validationSchema={yup.object({\n npsSurveyFeedback: yup.string(),\n npsSurveyRating: yup.number().required(),\n })}\n >\n {({ values, handleChange, setFieldValue, isSubmitting }) => (\n <Form name=\"npsSurveyForm\">\n <Box\n padding={4}\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex=\"200\"\n minWidth={{ initial: '100%', medium: '50%' }}\n >\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n wrap=\"wrap\"\n >\n {isFeedbackResponse ? (\n <Typography fontWeight=\"semiBold\">\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-response',\n defaultMessage: 'Thank you very much for your feedback!',\n })}\n </Typography>\n ) : (\n <Box tag=\"fieldset\" width=\"100%\" borderWidth={0}>\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={2}>\n <Box marginLeft=\"auto\" marginRight=\"auto\">\n <Typography fontWeight=\"semiBold\" tag=\"legend\">\n {formatMessage({\n id: 'app.components.NpsSurvey.banner-title',\n defaultMessage:\n 'How likely are you to recommend Strapi to a friend or colleague?',\n })}\n </Typography>\n </Box>\n <IconButton\n onClick={handleDismiss}\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.NpsSurvey.dismiss-survey-label',\n defaultMessage: 'Dismiss survey',\n })}\n type=\"button\"\n >\n <Cross />\n </IconButton>\n </Flex>\n {isMobile ? (\n <Box marginTop={2}>\n <SingleSelect\n placeholder={formatMessage({\n id: 'app.components.NpsSurvey.select-rating',\n defaultMessage: 'Select rating',\n })}\n onChange={(value) => {\n setFieldValue('npsSurveyRating', parseInt(value.toString(), 10));\n }}\n value={values.npsSurveyRating}\n >\n {ratingArray\n .sort((a, b) => b - a)\n .map((number) => {\n const suffixMessage =\n number === 0\n ? formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })\n : number === 10\n ? formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })\n : '';\n return (\n <SingleSelectOption key={number} value={number}>\n {number} {suffixMessage && `(${suffixMessage})`}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n ) : (\n <Flex gap={2} marginTop={2} marginBottom={2} justifyContent=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })}\n </Typography>\n {ratingArray.map((number) => {\n return (\n <FieldWrapper\n key={number}\n name=\"npsSurveyRating\"\n className={values.npsSurveyRating === number ? 'selected' : undefined} // \"selected\" class added when child radio button is checked\n hasRadius\n background=\"primary100\"\n borderColor=\"primary200\"\n color=\"primary600\"\n position=\"relative\"\n cursor=\"pointer\"\n >\n <Field.Label>\n <VisuallyHidden>\n <Field.Input\n type=\"radio\"\n checked={values.npsSurveyRating === number}\n onChange={(e) =>\n setFieldValue('npsSurveyRating', parseInt(e.target.value, 10))\n }\n value={number}\n />\n </VisuallyHidden>\n {number}\n </Field.Label>\n </FieldWrapper>\n );\n })}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })}\n </Typography>\n </Flex>\n )}\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\" alignItems=\"stretch\">\n <Box marginTop={2}>\n <Field.Label fontWeight=\"semiBold\" fontSize={2}>\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-question',\n defaultMessage: 'Do you have any suggestion for improvements?',\n })}\n </Field.Label>\n </Box>\n <Box marginTop={3} marginBottom={4} width=\"100%\">\n <Textarea\n id=\"npsSurveyFeedback\" // formik element attribute \"id\" should be same as the values key to work\n width=\"100%\"\n onChange={handleChange}\n value={values.npsSurveyFeedback}\n />\n </Box>\n <Box>\n <Button marginBottom={2} type=\"submit\" loading={isSubmitting}>\n {formatMessage({\n id: 'app.components.NpsSurvey.submit-feedback',\n defaultMessage: 'Submit Feedback',\n })}\n </Button>\n </Box>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Box>\n </Form>\n )}\n </Formik>\n </Portal>\n );\n};\n\ninterface NpsSurveySettings {\n enabled: boolean;\n lastResponseDate: string | null;\n firstDismissalDate: string | null;\n lastDismissalDate: string | null;\n}\n\n/**\n * We exported to make it available during admin user registration.\n * Because we only enable the NPS for users who subscribe to the newsletter when signing up\n */\nfunction useNpsSurveySettings() {\n const [npsSurveySettings, setNpsSurveySettings] = usePersistentState<NpsSurveySettings>(\n 'STRAPI_NPS_SURVEY_SETTINGS',\n {\n enabled: true,\n lastResponseDate: null,\n firstDismissalDate: null,\n lastDismissalDate: null,\n }\n );\n\n /**\n * TODO: should this just be an array so we can alias the `usePersistentState` hook?\n */\n return { npsSurveySettings, setNpsSurveySettings };\n}\n\nexport { NpsSurvey, useNpsSurveySettings };\n"],"names":["FieldWrapper","styled","Field","Root","theme","spaces","colors","neutral0","primary700","delays","postResponse","postFirstDismissal","postSubsequentDismissal","display","ratingArray","Array","keys","checkIfShouldShowSurvey","settings","enabled","lastResponseDate","firstDismissalDate","lastDismissalDate","window","strapi","flags","nps","timeSinceLastResponse","Date","now","getTime","timeSinceLastDismissal","timeSinceFirstDismissal","NpsSurvey","isMobile","useIsMobile","formatMessage","useIntl","npsSurveySettings","setNpsSurveySettings","useNpsSurveySettings","isFeedbackResponse","setIsFeedbackResponse","React","useState","toggleNotification","useNotification","currentEnvironment","useAppInfo","state","strapiVersion","surveyIsShown","setSurveyIsShown","displaySurvey","setDisplaySurvey","useEffect","displayTime","setTimeout","clearTimeout","user","useAuth","auth","handleSubmitResponse","npsSurveyRating","npsSurveyFeedback","body","email","rating","comment","environment","version","undefined","license","projectType","isHostedOnStrapiCloud","process","env","STRAPI_HOSTING","res","fetch","STRAPI_ANALYTICS_URL","method","headers","JSON","stringify","ok","Error","toString","err","type","message","id","defaultMessage","handleDismiss","nextSettings","_jsx","Portal","Formik","initialValues","onSubmit","validationSchema","yup","object","string","number","required","values","handleChange","setFieldValue","isSubmitting","Form","name","Box","padding","position","bottom","left","transform","zIndex","minWidth","initial","medium","Flex","hasRadius","direction","borderColor","background","shadow","wrap","Typography","fontWeight","_jsxs","tag","width","borderWidth","justifyContent","gap","marginLeft","marginRight","IconButton","onClick","withTooltip","label","Cross","marginTop","SingleSelect","placeholder","onChange","value","parseInt","sort","a","b","map","suffixMessage","SingleSelectOption","marginBottom","variant","textColor","className","color","cursor","Label","VisuallyHidden","Input","checked","e","target","alignItems","fontSize","Textarea","Button","loading","usePersistentState"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NpsSurvey.mjs","sources":["../../../../../admin/src/components/NpsSurvey.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Box,\n Flex,\n IconButton,\n Button,\n Typography,\n Textarea,\n Portal,\n Field,\n VisuallyHidden,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { Cross } from '@strapi/icons';\nimport { Formik, Form } from 'formik';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\nimport * as yup from 'yup';\n\nimport { useAppInfo } from '../features/AppInfo';\nimport { useAuth } from '../features/Auth';\nimport { useNotification } from '../features/Notifications';\nimport { useIsMobile } from '../hooks/useMediaQuery';\nimport { usePersistentState } from '../hooks/usePersistentState';\n\nconst FieldWrapper = styled(Field.Root)`\n height: 3.2rem;\n width: 3.2rem;\n align-items: center;\n justify-content: center;\n\n > label,\n ~ input {\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n }\n\n > label {\n color: inherit;\n cursor: pointer;\n padding: ${({ theme }) => theme.spaces[2]};\n text-align: center;\n vertical-align: middle;\n }\n\n &:hover,\n &:focus-within {\n background-color: ${({ theme }) => theme.colors.neutral0};\n }\n\n &:active,\n &.selected {\n color: ${({ theme }) => theme.colors.primary700};\n background-color: ${({ theme }) => theme.colors.neutral0};\n border-color: ${({ theme }) => theme.colors.primary700};\n }\n`;\n\nconst delays = {\n postResponse: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n postFirstDismissal: 14 * 24 * 60 * 60 * 1000, // 14 days in ms\n postSubsequentDismissal: 90 * 24 * 60 * 60 * 1000, // 90 days in ms\n display: 30 * 60 * 1000, // 30 minutes in ms\n};\n\nconst ratingArray = [...Array(11).keys()];\n\nconst checkIfShouldShowSurvey = (settings: NpsSurveySettings) => {\n const { enabled, lastResponseDate, firstDismissalDate, lastDismissalDate } = settings;\n\n // This function goes through all the cases where we'd want to not show the survey:\n // 1. If the survey is disabled by strapi, abort mission, don't bother checking the other settings.\n // 2. If the survey is disabled by user, abort mission, don't bother checking the other settings.\n // 3. If the user has already responded to the survey, check if enough time has passed since the last response.\n // 4. If the user has dismissed the survey twice or more before, check if enough time has passed since the last dismissal.\n // 5. If the user has only dismissed the survey once before, check if enough time has passed since the first dismissal.\n // If none of these cases check out, then we show the survey.\n // Note that submitting a response resets the dismissal counts.\n // Checks 4 and 5 should not be reversed, since the first dismissal will also exist if the user has dismissed the survey twice or more before.\n\n // For users who had created an account before the NPS feature was introduced,\n // we assume that they would have enabled the NPS feature if they had the chance.\n\n // Global strapi disable for NSP.\n if (window.strapi.flags.nps === false) {\n return false;\n }\n\n // User chose not to enable the NPS feature when signing up\n if (enabled === false) {\n return false;\n }\n\n // The user has already responded to the survey\n if (lastResponseDate) {\n const timeSinceLastResponse = Date.now() - new Date(lastResponseDate).getTime();\n\n if (timeSinceLastResponse >= delays.postResponse) {\n return true;\n }\n\n return false;\n }\n\n // The user has dismissed the survey twice or more before\n if (lastDismissalDate) {\n const timeSinceLastDismissal = Date.now() - new Date(lastDismissalDate).getTime();\n\n if (timeSinceLastDismissal >= delays.postSubsequentDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has only dismissed the survey once before\n if (firstDismissalDate) {\n const timeSinceFirstDismissal = Date.now() - new Date(firstDismissalDate).getTime();\n\n if (timeSinceFirstDismissal >= delays.postFirstDismissal) {\n return true;\n }\n\n return false;\n }\n\n // The user has not interacted with the survey before\n return true;\n};\n\nconst NpsSurvey = () => {\n const isMobile = useIsMobile();\n const { formatMessage } = useIntl();\n const { npsSurveySettings, setNpsSurveySettings } = useNpsSurveySettings();\n const [isFeedbackResponse, setIsFeedbackResponse] = React.useState(false);\n const { toggleNotification } = useNotification();\n const currentEnvironment = useAppInfo('NpsSurvey', (state) => state.currentEnvironment);\n const strapiVersion = useAppInfo('NpsSurvey', (state) => state.strapiVersion);\n\n interface NpsSurveyMutationBody {\n email: string;\n rating: number | null;\n comment: string;\n environment?: string;\n version?: string;\n license: 'Enterprise' | 'Growth' | 'Community';\n }\n\n // Only check on first render if the survey should be shown\n const [surveyIsShown, setSurveyIsShown] = React.useState(\n checkIfShouldShowSurvey(npsSurveySettings)\n );\n\n // Set a cooldown to show the survey when session begins\n const [displaySurvey, setDisplaySurvey] = React.useState(false);\n\n React.useEffect(() => {\n const displayTime = setTimeout(() => {\n setDisplaySurvey(true);\n }, delays.display);\n\n return () => {\n clearTimeout(displayTime);\n };\n }, []);\n\n const { user } = useAuth('NpsSurvey', (auth) => auth);\n\n if (!displaySurvey) {\n return null;\n }\n\n if (!surveyIsShown) {\n return null;\n }\n\n const handleSubmitResponse = async ({\n npsSurveyRating,\n npsSurveyFeedback,\n }: {\n npsSurveyRating: NpsSurveyMutationBody['rating'];\n npsSurveyFeedback: NpsSurveyMutationBody['comment'];\n }) => {\n try {\n const body = {\n email: typeof user === 'object' && user.email ? user.email : '',\n rating: npsSurveyRating,\n comment: npsSurveyFeedback,\n environment: currentEnvironment,\n version: strapiVersion ?? undefined,\n license: window.strapi.projectType,\n isHostedOnStrapiCloud: process.env.STRAPI_HOSTING === 'strapi.cloud',\n };\n const res = await fetch(\n `${process.env.STRAPI_ANALYTICS_URL || 'https://analytics.strapi.io'}/submit-nps`,\n {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n }\n );\n\n if (!res.ok) {\n throw new Error('Failed to submit NPS survey');\n }\n\n setNpsSurveySettings((settings) => ({\n ...settings,\n lastResponseDate: new Date().toString(),\n firstDismissalDate: null,\n lastDismissalDate: null,\n }));\n setIsFeedbackResponse(true);\n // Thank you message displayed in the banner should disappear after few seconds.\n setTimeout(() => {\n setSurveyIsShown(false);\n }, 3000);\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const handleDismiss = () => {\n setNpsSurveySettings((settings) => {\n const nextSettings = {\n ...settings,\n lastResponseDate: null,\n };\n\n if (settings.firstDismissalDate) {\n // If the user dismisses the survey for the second time\n nextSettings.lastDismissalDate = new Date().toString();\n } else {\n // If the user dismisses the survey for the first time\n nextSettings.firstDismissalDate = new Date().toString();\n }\n\n return nextSettings;\n });\n\n setSurveyIsShown(false);\n };\n\n return (\n <Portal>\n <Formik\n initialValues={{ npsSurveyFeedback: '', npsSurveyRating: null }}\n onSubmit={handleSubmitResponse}\n validationSchema={yup.object({\n npsSurveyFeedback: yup.string(),\n npsSurveyRating: yup.number().required(),\n })}\n >\n {({ values, handleChange, setFieldValue, isSubmitting }) => (\n <Form name=\"npsSurveyForm\">\n <Box\n padding={4}\n position=\"fixed\"\n bottom={0}\n left=\"50%\"\n transform=\"translateX(-50%)\"\n zIndex=\"200\"\n minWidth={{ initial: '100%', medium: '50%' }}\n >\n <Flex\n hasRadius\n direction=\"column\"\n padding={4}\n borderColor=\"primary200\"\n background=\"neutral0\"\n shadow=\"popupShadow\"\n wrap=\"wrap\"\n >\n {isFeedbackResponse ? (\n <Typography fontWeight=\"semiBold\">\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-response',\n defaultMessage: 'Thank you very much for your feedback!',\n })}\n </Typography>\n ) : (\n <Box tag=\"fieldset\" width=\"100%\" borderWidth={0}>\n <Flex justifyContent=\"space-between\" width=\"100%\" gap={2}>\n <Box marginLeft=\"auto\" marginRight=\"auto\">\n <Typography fontWeight=\"semiBold\" tag=\"legend\">\n {formatMessage({\n id: 'app.components.NpsSurvey.banner-title',\n defaultMessage:\n 'How likely are you to recommend Strapi to a friend or colleague?',\n })}\n </Typography>\n </Box>\n <IconButton\n onClick={handleDismiss}\n withTooltip={false}\n label={formatMessage({\n id: 'app.components.NpsSurvey.dismiss-survey-label',\n defaultMessage: 'Dismiss survey',\n })}\n type=\"button\"\n >\n <Cross />\n </IconButton>\n </Flex>\n {isMobile ? (\n <Box marginTop={2}>\n <SingleSelect\n placeholder={formatMessage({\n id: 'app.components.NpsSurvey.select-rating',\n defaultMessage: 'Select rating',\n })}\n onChange={(value) => {\n setFieldValue('npsSurveyRating', parseInt(value.toString(), 10));\n }}\n value={values.npsSurveyRating}\n >\n {ratingArray\n .sort((a, b) => b - a)\n .map((number) => {\n const suffixMessage =\n number === 0\n ? formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })\n : number === 10\n ? formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })\n : '';\n return (\n <SingleSelectOption key={number} value={number}>\n {number} {suffixMessage && `(${suffixMessage})`}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n </Box>\n ) : (\n <Flex gap={2} marginTop={2} marginBottom={2} justifyContent=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.no-recommendation',\n defaultMessage: 'Not at all likely',\n })}\n </Typography>\n {ratingArray.map((number) => {\n return (\n <FieldWrapper\n key={number}\n name=\"npsSurveyRating\"\n className={values.npsSurveyRating === number ? 'selected' : undefined} // \"selected\" class added when child radio button is checked\n hasRadius\n background=\"primary100\"\n borderColor=\"primary200\"\n color=\"primary600\"\n position=\"relative\"\n cursor=\"pointer\"\n >\n <Field.Label>\n <VisuallyHidden>\n <Field.Input\n type=\"radio\"\n checked={values.npsSurveyRating === number}\n onChange={(e) =>\n setFieldValue('npsSurveyRating', parseInt(e.target.value, 10))\n }\n value={number}\n />\n </VisuallyHidden>\n {number}\n </Field.Label>\n </FieldWrapper>\n );\n })}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: 'app.components.NpsSurvey.happy-to-recommend',\n defaultMessage: 'Extremely likely',\n })}\n </Typography>\n </Flex>\n )}\n {values.npsSurveyRating !== null && (\n <Flex direction=\"column\" alignItems=\"stretch\">\n <Box marginTop={2}>\n <Field.Label fontWeight=\"semiBold\" fontSize={2}>\n {formatMessage({\n id: 'app.components.NpsSurvey.feedback-question',\n defaultMessage: 'Do you have any suggestion for improvements?',\n })}\n </Field.Label>\n </Box>\n <Box marginTop={3} marginBottom={4} width=\"100%\">\n <Textarea\n id=\"npsSurveyFeedback\" // formik element attribute \"id\" should be same as the values key to work\n width=\"100%\"\n onChange={handleChange}\n value={values.npsSurveyFeedback}\n />\n </Box>\n <Box>\n <Button marginBottom={2} type=\"submit\" loading={isSubmitting}>\n {formatMessage({\n id: 'app.components.NpsSurvey.submit-feedback',\n defaultMessage: 'Submit Feedback',\n })}\n </Button>\n </Box>\n </Flex>\n )}\n </Box>\n )}\n </Flex>\n </Box>\n </Form>\n )}\n </Formik>\n </Portal>\n );\n};\n\ninterface NpsSurveySettings {\n enabled: boolean;\n lastResponseDate: string | null;\n firstDismissalDate: string | null;\n lastDismissalDate: string | null;\n}\n\n/**\n * We exported to make it available during admin user registration.\n * Because we only enable the NPS for users who subscribe to the newsletter when signing up\n */\nfunction useNpsSurveySettings() {\n const [npsSurveySettings, setNpsSurveySettings] = usePersistentState<NpsSurveySettings>(\n 'STRAPI_NPS_SURVEY_SETTINGS',\n {\n enabled: true,\n lastResponseDate: null,\n firstDismissalDate: null,\n lastDismissalDate: null,\n }\n );\n\n /**\n * TODO: should this just be an array so we can alias the `usePersistentState` hook?\n */\n return { npsSurveySettings, setNpsSurveySettings };\n}\n\nexport { NpsSurvey, useNpsSurveySettings };\n"],"names":["FieldWrapper","styled","Field","Root","theme","spaces","colors","neutral0","primary700","delays","postResponse","postFirstDismissal","postSubsequentDismissal","display","ratingArray","Array","keys","checkIfShouldShowSurvey","settings","enabled","lastResponseDate","firstDismissalDate","lastDismissalDate","window","strapi","flags","nps","timeSinceLastResponse","Date","now","getTime","timeSinceLastDismissal","timeSinceFirstDismissal","NpsSurvey","isMobile","useIsMobile","formatMessage","useIntl","npsSurveySettings","setNpsSurveySettings","useNpsSurveySettings","isFeedbackResponse","setIsFeedbackResponse","React","useState","toggleNotification","useNotification","currentEnvironment","useAppInfo","state","strapiVersion","surveyIsShown","setSurveyIsShown","displaySurvey","setDisplaySurvey","useEffect","displayTime","setTimeout","clearTimeout","user","useAuth","auth","handleSubmitResponse","npsSurveyRating","npsSurveyFeedback","body","email","rating","comment","environment","version","undefined","license","projectType","isHostedOnStrapiCloud","process","env","STRAPI_HOSTING","res","fetch","STRAPI_ANALYTICS_URL","method","headers","JSON","stringify","ok","Error","toString","err","type","message","id","defaultMessage","handleDismiss","nextSettings","_jsx","Portal","Formik","initialValues","onSubmit","validationSchema","yup","object","string","number","required","values","handleChange","setFieldValue","isSubmitting","Form","name","Box","padding","position","bottom","left","transform","zIndex","minWidth","initial","medium","Flex","hasRadius","direction","borderColor","background","shadow","wrap","Typography","fontWeight","_jsxs","tag","width","borderWidth","justifyContent","gap","marginLeft","marginRight","IconButton","onClick","withTooltip","label","Cross","marginTop","SingleSelect","placeholder","onChange","value","parseInt","sort","a","b","map","suffixMessage","SingleSelectOption","marginBottom","variant","textColor","className","color","cursor","Label","VisuallyHidden","Input","checked","e","target","alignItems","fontSize","Textarea","Button","loading","usePersistentState"],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var designSystem = require('@strapi/design-system');
|
|
6
|
-
var
|
|
6
|
+
var styledComponents = require('styled-components');
|
|
7
7
|
var resizeHandlers = require('../utils/resizeHandlers.js');
|
|
8
8
|
var widgetLayout = require('../utils/widgetLayout.js');
|
|
9
9
|
|
|
@@ -28,7 +28,7 @@ function _interopNamespace(e) {
|
|
|
28
28
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
29
29
|
|
|
30
30
|
const INDICATOR_SIZE = 20;
|
|
31
|
-
const IndicatorContainer =
|
|
31
|
+
const IndicatorContainer = styledComponents.styled(designSystem.Box)`
|
|
32
32
|
position: absolute;
|
|
33
33
|
z-index: 1;
|
|
34
34
|
pointer-events: none;
|
|
@@ -40,13 +40,13 @@ const IndicatorContainer = styled.styled(designSystem.Box)`
|
|
|
40
40
|
align-items: center;
|
|
41
41
|
justify-content: center;
|
|
42
42
|
`;
|
|
43
|
-
const DotContainer =
|
|
43
|
+
const DotContainer = styledComponents.styled(designSystem.Box)`
|
|
44
44
|
position: absolute;
|
|
45
45
|
top: 50%;
|
|
46
46
|
left: ${({ $position })=>$position}%;
|
|
47
47
|
transform: translate(-50%, -50%);
|
|
48
48
|
`;
|
|
49
|
-
const Dot =
|
|
49
|
+
const Dot = styledComponents.styled(designSystem.Box)`
|
|
50
50
|
width: 6px;
|
|
51
51
|
height: 6px;
|
|
52
52
|
border-radius: 50%;
|
|
@@ -129,7 +129,7 @@ const ResizeIndicator = ({ isVisible, position, currentLeftWidth, currentRightWi
|
|
|
129
129
|
})
|
|
130
130
|
});
|
|
131
131
|
};
|
|
132
|
-
const ResizeHandleContainer =
|
|
132
|
+
const ResizeHandleContainer = styledComponents.styled(designSystem.Box)`
|
|
133
133
|
position: absolute;
|
|
134
134
|
top: 0;
|
|
135
135
|
bottom: 0;
|
|
@@ -143,7 +143,7 @@ const ResizeHandleContainer = styled.styled(designSystem.Box)`
|
|
|
143
143
|
cursor: col-resize;
|
|
144
144
|
background-color: ${({ $isDragging })=>$isDragging ? 'rgba(0, 0, 0, 0.1)' : 'transparent'};
|
|
145
145
|
`;
|
|
146
|
-
const ResizeHandleBar =
|
|
146
|
+
const ResizeHandleBar = styledComponents.styled(designSystem.Box)`
|
|
147
147
|
width: 2px;
|
|
148
148
|
height: 100%;
|
|
149
149
|
background-color: ${({ theme })=>theme.colors.primary500};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ResizeIndicator.js","sources":["../../../../../admin/src/components/ResizeIndicator.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport {\n isValidResize,\n calculateTargetWidths,\n shouldTriggerResize,\n calculateResizeHandlePosition,\n calculateRowBounds,\n} from '../utils/resizeHandlers';\nimport { getWidgetElement, getWidgetGridContainer } from '../utils/widgetLayout';\n\nimport type { WidgetWithUID } from '../core/apis/Widgets';\n\nconst INDICATOR_SIZE = 20;\n\ninterface ResizeIndicatorProps {\n isVisible: boolean;\n position: { left: number; top: number; height: number };\n currentLeftWidth: number;\n currentRightWidth: number;\n totalColumns?: number;\n rowPosition?: { left: number; top: number; width: number; height: number } | null;\n}\n\nconst IndicatorContainer = styled(Box)<{ $isVisible: boolean }>`\n position: absolute;\n z-index: 1;\n pointer-events: none;\n opacity: ${({ $isVisible }) => ($isVisible ? 1 : 0)};\n transition: opacity 0.2s ease-in-out;\n background: transparent;\n height: ${INDICATOR_SIZE}px;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst DotContainer = styled(Box)<{ $position: number }>`\n position: absolute;\n top: 50%;\n left: ${({ $position }) => $position}%;\n transform: translate(-50%, -50%);\n`;\n\nconst Dot = styled(Box)<{ $isActive: boolean; $isCurrent: boolean }>`\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: ${({ $isActive, $isCurrent, theme }) => {\n if ($isCurrent) return theme.colors.primary600;\n if ($isActive) return theme.colors.primary500;\n return theme.colors.neutral300;\n }};\n transition: all 0.2s ease-in-out;\n box-shadow: ${({ $isCurrent, theme }) =>\n $isCurrent ? `0 0 0 3px ${theme.colors.primary100}` : 'none'};\n transform: ${({ $isCurrent }) => ($isCurrent ? 'scale(1.2)' : 'scale(1)')};\n`;\n\nconst calculateGapAdjustment = (rowWidth: number, leftColumns: number): number => {\n const dotWidth = 6;\n const gapAdjustmentPixels = dotWidth / 2; // Half dot width to center on boundary\n const gapAdjustmentPercent = (gapAdjustmentPixels / rowWidth) * 100;\n\n // Different adjustments for different positions\n switch (leftColumns) {\n case 4:\n return -gapAdjustmentPercent; // Left dot\n case 8:\n return gapAdjustmentPercent; // Right dot\n default: // Center dot\n return 0;\n }\n};\n\nconst ResizeIndicator = ({\n isVisible,\n position,\n currentLeftWidth,\n currentRightWidth,\n totalColumns = 12,\n rowPosition,\n}: ResizeIndicatorProps) => {\n // Calculate available resize positions accounting for grid gaps\n const availablePositions = React.useMemo(() => {\n const rowWidth = rowPosition?.width || 800;\n\n return [4, 6, 8].map((left) => {\n const right = totalColumns - left;\n const basePosition = (left / totalColumns) * 100;\n const gapAdjustment = calculateGapAdjustment(rowWidth, left);\n const positionPercent = basePosition + gapAdjustment;\n\n return { left, right, positionPercent };\n });\n }, [totalColumns, rowPosition?.width]);\n\n // Find the current position index\n const currentPositionIndex = React.useMemo(() => {\n return availablePositions.findIndex(\n (pos) => pos.left === currentLeftWidth && pos.right === currentRightWidth\n );\n }, [availablePositions, currentLeftWidth, currentRightWidth]);\n\n if (!isVisible) {\n return null;\n }\n\n // Calculate positioning - indicator always spans the full row width\n const indicatorTop = rowPosition\n ? rowPosition.top - INDICATOR_SIZE\n : Math.max(10, position.top + position.height / 2 - 40);\n const isCurrent = (index: number) => index === currentPositionIndex;\n const isActive = (index: number) => Math.abs(index - currentPositionIndex) <= 1;\n\n return (\n <IndicatorContainer\n $isVisible={isVisible}\n style={{\n left: rowPosition ? `${rowPosition.left}px` : `${position.left + 10}px`,\n top: `${indicatorTop}px`,\n width: rowPosition ? `${rowPosition.width}px` : 'auto',\n }}\n >\n {availablePositions.map((pos, index) => {\n return (\n <DotContainer key={`${pos.left}-${pos.right}`} $position={pos.positionPercent}>\n <Dot $isActive={isActive(index)} $isCurrent={isCurrent(index)} />\n </DotContainer>\n );\n })}\n </IndicatorContainer>\n );\n};\nconst ResizeHandleContainer = styled(Box)<{ $isDragging?: boolean }>`\n position: absolute;\n top: 0;\n bottom: 0;\n width: ${INDICATOR_SIZE}px;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0.8;\n transition: opacity 0.2s ease-in-out;\n cursor: col-resize;\n background-color: ${({ $isDragging }) => ($isDragging ? 'rgba(0, 0, 0, 0.1)' : 'transparent')};\n`;\n\nconst ResizeHandleBar = styled(Box)<{ $isDragging?: boolean }>`\n width: 2px;\n height: 100%;\n background-color: ${({ theme }) => theme.colors.primary500};\n border-radius: 1px;\n opacity: 0;\n transition: opacity 0.2s ease-in-out;\n\n ${ResizeHandleContainer}:hover & {\n opacity: 0.8;\n }\n\n ${({ $isDragging }) => $isDragging && `opacity: 0.8;`}\n`;\n\ninterface WidgetResizeHandleProps {\n leftWidgetId: string;\n rightWidgetId: string;\n leftWidgetWidth: number;\n rightWidgetWidth: number;\n onResize: (\n leftWidgetId: string,\n rightWidgetId: string,\n newLeftWidth: number,\n newRightWidth: number\n ) => void;\n saveLayout: () => void;\n filteredWidgets?: WidgetWithUID[];\n}\n\nexport const WidgetResizeHandle = ({\n leftWidgetId,\n rightWidgetId,\n leftWidgetWidth,\n rightWidgetWidth,\n onResize,\n saveLayout,\n}: WidgetResizeHandleProps) => {\n const [state, setState] = React.useState({\n isDragging: false,\n startX: 0,\n startLeftWidth: 0,\n startRightWidth: 0,\n position: { left: 0, top: 0, height: 0 },\n lastResizeValues: { leftWidth: 0, rightWidth: 0 },\n currentResizeValues: { leftWidth: leftWidgetWidth, rightWidth: rightWidgetWidth },\n rowPosition: null as { left: number; top: number; width: number; height: number } | null,\n });\n\n const throttleRef = React.useRef<NodeJS.Timeout | null>(null);\n\n const handleResize = React.useCallback(\n (deltaColumns: number) => {\n // Only resize if there's significant movement (dead zone)\n if (Math.abs(deltaColumns) < 0.25) {\n return;\n }\n\n // Calculate target widths\n const { targetLeftWidth, targetRightWidth } = calculateTargetWidths(\n deltaColumns,\n state.startLeftWidth,\n state.startRightWidth\n );\n\n // Validate the resize\n if (!isValidResize(targetLeftWidth, targetRightWidth)) {\n return;\n }\n\n // Update current resize values for the indicator\n setState((prev) => ({\n ...prev,\n currentResizeValues: { leftWidth: targetLeftWidth, rightWidth: targetRightWidth },\n }));\n\n // Only trigger resize if values have changed\n if (shouldTriggerResize(targetLeftWidth, targetRightWidth, state.lastResizeValues)) {\n setState((prev) => ({\n ...prev,\n lastResizeValues: { leftWidth: targetLeftWidth, rightWidth: targetRightWidth },\n }));\n onResize(leftWidgetId, rightWidgetId, targetLeftWidth, targetRightWidth);\n }\n },\n [\n leftWidgetId,\n rightWidgetId,\n onResize,\n state.startLeftWidth,\n state.startRightWidth,\n state.lastResizeValues,\n ]\n );\n\n const handlePointerMove = React.useCallback(\n (e: PointerEvent) => {\n if (!state.isDragging) return;\n\n // Clear any existing throttle timeout\n if (throttleRef.current) {\n clearTimeout(throttleRef.current);\n }\n\n // Throttle the resize calls to prevent excessive updates\n throttleRef.current = setTimeout(() => {\n const deltaX = e.clientX - state.startX;\n const threshold = 120; // Pixels per column unit\n const deltaColumns = Math.round(deltaX / threshold);\n\n handleResize(deltaColumns);\n }, 0);\n },\n [state.isDragging, state.startX, handleResize]\n );\n\n // Handle pointer up to end drag\n const handlePointerUp = React.useCallback(() => {\n // Clear any pending throttle timeout\n if (throttleRef.current) {\n clearTimeout(throttleRef.current);\n throttleRef.current = null;\n }\n\n // Save the layout\n saveLayout();\n\n // Reset last resize values and stop dragging\n setState((prev) => ({\n ...prev,\n lastResizeValues: { leftWidth: 0, rightWidth: 0 },\n currentResizeValues: { leftWidth: leftWidgetWidth, rightWidth: rightWidgetWidth },\n isDragging: false,\n }));\n }, [leftWidgetWidth, rightWidgetWidth, saveLayout]);\n\n // Handle pointer down to start drag\n const handlePointerDown = React.useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n setState((prev) => ({\n ...prev,\n isDragging: true,\n startX: e.clientX,\n startLeftWidth: leftWidgetWidth,\n startRightWidth: rightWidgetWidth,\n }));\n },\n [leftWidgetWidth, rightWidgetWidth]\n );\n\n // Set up drag event listeners\n React.useEffect(() => {\n if (state.isDragging) {\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n\n return () => {\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n };\n }\n }, [state.isDragging, handlePointerMove, handlePointerUp]);\n\n // Set up resize observer for position updates - watching widgets and grid container\n React.useLayoutEffect(() => {\n const leftElement = getWidgetElement(leftWidgetId);\n const rightElement = getWidgetElement(rightWidgetId);\n const containerElement = getWidgetGridContainer();\n\n const updatePosition = () => {\n const position = calculateResizeHandlePosition(leftElement, rightElement, containerElement);\n const rowPosition = calculateRowBounds(leftElement, rightElement, containerElement);\n\n setState((prev) => ({\n ...prev,\n position,\n rowPosition,\n }));\n };\n\n // Create ResizeObserver to watch widgets and grid container\n const resizeObserver = new ResizeObserver(updatePosition);\n\n // Observe all relevant elements\n if (leftElement) resizeObserver.observe(leftElement);\n if (rightElement) resizeObserver.observe(rightElement);\n if (containerElement) resizeObserver.observe(containerElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [leftWidgetId, rightWidgetId]);\n\n // Cleanup throttle timeout on unmount\n React.useEffect(() => {\n return () => {\n if (throttleRef.current) {\n clearTimeout(throttleRef.current);\n }\n };\n }, []);\n\n return (\n <>\n <ResizeHandleContainer\n onPointerDown={handlePointerDown}\n style={{\n transform: `translate(${state.position.left}px, ${state.position.top}px)`,\n height: `${state.position.height}px`,\n }}\n >\n <ResizeHandleBar $isDragging={state.isDragging} />\n </ResizeHandleContainer>\n\n <ResizeIndicator\n isVisible={state.isDragging}\n position={state.position}\n currentLeftWidth={state.currentResizeValues.leftWidth}\n currentRightWidth={state.currentResizeValues.rightWidth}\n rowPosition={state.rowPosition}\n />\n </>\n );\n};\n"],"names":["INDICATOR_SIZE","IndicatorContainer","styled","Box","$isVisible","DotContainer","$position","Dot","$isActive","$isCurrent","theme","colors","primary600","primary500","neutral300","primary100","calculateGapAdjustment","rowWidth","leftColumns","dotWidth","gapAdjustmentPixels","gapAdjustmentPercent","ResizeIndicator","isVisible","position","currentLeftWidth","currentRightWidth","totalColumns","rowPosition","availablePositions","React","useMemo","width","map","left","right","basePosition","gapAdjustment","positionPercent","currentPositionIndex","findIndex","pos","indicatorTop","top","Math","max","height","isCurrent","index","isActive","abs","_jsx","style","ResizeHandleContainer","$isDragging","ResizeHandleBar","WidgetResizeHandle","leftWidgetId","rightWidgetId","leftWidgetWidth","rightWidgetWidth","onResize","saveLayout","state","setState","useState","isDragging","startX","startLeftWidth","startRightWidth","lastResizeValues","leftWidth","rightWidth","currentResizeValues","throttleRef","useRef","handleResize","useCallback","deltaColumns","targetLeftWidth","targetRightWidth","calculateTargetWidths","isValidResize","prev","shouldTriggerResize","handlePointerMove","e","current","clearTimeout","setTimeout","deltaX","clientX","threshold","round","handlePointerUp","handlePointerDown","preventDefault","stopPropagation","useEffect","document","addEventListener","removeEventListener","useLayoutEffect","leftElement","getWidgetElement","rightElement","containerElement","getWidgetGridContainer","updatePosition","calculateResizeHandlePosition","calculateRowBounds","resizeObserver","ResizeObserver","observe","disconnect","_jsxs","_Fragment","onPointerDown","transform"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ResizeIndicator.js","sources":["../../../../../admin/src/components/ResizeIndicator.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport {\n isValidResize,\n calculateTargetWidths,\n shouldTriggerResize,\n calculateResizeHandlePosition,\n calculateRowBounds,\n} from '../utils/resizeHandlers';\nimport { getWidgetElement, getWidgetGridContainer } from '../utils/widgetLayout';\n\nimport type { WidgetWithUID } from '../core/apis/Widgets';\n\nconst INDICATOR_SIZE = 20;\n\ninterface ResizeIndicatorProps {\n isVisible: boolean;\n position: { left: number; top: number; height: number };\n currentLeftWidth: number;\n currentRightWidth: number;\n totalColumns?: number;\n rowPosition?: { left: number; top: number; width: number; height: number } | null;\n}\n\nconst IndicatorContainer = styled(Box)<{ $isVisible: boolean }>`\n position: absolute;\n z-index: 1;\n pointer-events: none;\n opacity: ${({ $isVisible }) => ($isVisible ? 1 : 0)};\n transition: opacity 0.2s ease-in-out;\n background: transparent;\n height: ${INDICATOR_SIZE}px;\n display: flex;\n align-items: center;\n justify-content: center;\n`;\n\nconst DotContainer = styled(Box)<{ $position: number }>`\n position: absolute;\n top: 50%;\n left: ${({ $position }) => $position}%;\n transform: translate(-50%, -50%);\n`;\n\nconst Dot = styled(Box)<{ $isActive: boolean; $isCurrent: boolean }>`\n width: 6px;\n height: 6px;\n border-radius: 50%;\n background-color: ${({ $isActive, $isCurrent, theme }) => {\n if ($isCurrent) return theme.colors.primary600;\n if ($isActive) return theme.colors.primary500;\n return theme.colors.neutral300;\n }};\n transition: all 0.2s ease-in-out;\n box-shadow: ${({ $isCurrent, theme }) =>\n $isCurrent ? `0 0 0 3px ${theme.colors.primary100}` : 'none'};\n transform: ${({ $isCurrent }) => ($isCurrent ? 'scale(1.2)' : 'scale(1)')};\n`;\n\nconst calculateGapAdjustment = (rowWidth: number, leftColumns: number): number => {\n const dotWidth = 6;\n const gapAdjustmentPixels = dotWidth / 2; // Half dot width to center on boundary\n const gapAdjustmentPercent = (gapAdjustmentPixels / rowWidth) * 100;\n\n // Different adjustments for different positions\n switch (leftColumns) {\n case 4:\n return -gapAdjustmentPercent; // Left dot\n case 8:\n return gapAdjustmentPercent; // Right dot\n default: // Center dot\n return 0;\n }\n};\n\nconst ResizeIndicator = ({\n isVisible,\n position,\n currentLeftWidth,\n currentRightWidth,\n totalColumns = 12,\n rowPosition,\n}: ResizeIndicatorProps) => {\n // Calculate available resize positions accounting for grid gaps\n const availablePositions = React.useMemo(() => {\n const rowWidth = rowPosition?.width || 800;\n\n return [4, 6, 8].map((left) => {\n const right = totalColumns - left;\n const basePosition = (left / totalColumns) * 100;\n const gapAdjustment = calculateGapAdjustment(rowWidth, left);\n const positionPercent = basePosition + gapAdjustment;\n\n return { left, right, positionPercent };\n });\n }, [totalColumns, rowPosition?.width]);\n\n // Find the current position index\n const currentPositionIndex = React.useMemo(() => {\n return availablePositions.findIndex(\n (pos) => pos.left === currentLeftWidth && pos.right === currentRightWidth\n );\n }, [availablePositions, currentLeftWidth, currentRightWidth]);\n\n if (!isVisible) {\n return null;\n }\n\n // Calculate positioning - indicator always spans the full row width\n const indicatorTop = rowPosition\n ? rowPosition.top - INDICATOR_SIZE\n : Math.max(10, position.top + position.height / 2 - 40);\n const isCurrent = (index: number) => index === currentPositionIndex;\n const isActive = (index: number) => Math.abs(index - currentPositionIndex) <= 1;\n\n return (\n <IndicatorContainer\n $isVisible={isVisible}\n style={{\n left: rowPosition ? `${rowPosition.left}px` : `${position.left + 10}px`,\n top: `${indicatorTop}px`,\n width: rowPosition ? `${rowPosition.width}px` : 'auto',\n }}\n >\n {availablePositions.map((pos, index) => {\n return (\n <DotContainer key={`${pos.left}-${pos.right}`} $position={pos.positionPercent}>\n <Dot $isActive={isActive(index)} $isCurrent={isCurrent(index)} />\n </DotContainer>\n );\n })}\n </IndicatorContainer>\n );\n};\nconst ResizeHandleContainer = styled(Box)<{ $isDragging?: boolean }>`\n position: absolute;\n top: 0;\n bottom: 0;\n width: ${INDICATOR_SIZE}px;\n z-index: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n opacity: 0.8;\n transition: opacity 0.2s ease-in-out;\n cursor: col-resize;\n background-color: ${({ $isDragging }) => ($isDragging ? 'rgba(0, 0, 0, 0.1)' : 'transparent')};\n`;\n\nconst ResizeHandleBar = styled(Box)<{ $isDragging?: boolean }>`\n width: 2px;\n height: 100%;\n background-color: ${({ theme }) => theme.colors.primary500};\n border-radius: 1px;\n opacity: 0;\n transition: opacity 0.2s ease-in-out;\n\n ${ResizeHandleContainer}:hover & {\n opacity: 0.8;\n }\n\n ${({ $isDragging }) => $isDragging && `opacity: 0.8;`}\n`;\n\ninterface WidgetResizeHandleProps {\n leftWidgetId: string;\n rightWidgetId: string;\n leftWidgetWidth: number;\n rightWidgetWidth: number;\n onResize: (\n leftWidgetId: string,\n rightWidgetId: string,\n newLeftWidth: number,\n newRightWidth: number\n ) => void;\n saveLayout: () => void;\n filteredWidgets?: WidgetWithUID[];\n}\n\nexport const WidgetResizeHandle = ({\n leftWidgetId,\n rightWidgetId,\n leftWidgetWidth,\n rightWidgetWidth,\n onResize,\n saveLayout,\n}: WidgetResizeHandleProps) => {\n const [state, setState] = React.useState({\n isDragging: false,\n startX: 0,\n startLeftWidth: 0,\n startRightWidth: 0,\n position: { left: 0, top: 0, height: 0 },\n lastResizeValues: { leftWidth: 0, rightWidth: 0 },\n currentResizeValues: { leftWidth: leftWidgetWidth, rightWidth: rightWidgetWidth },\n rowPosition: null as { left: number; top: number; width: number; height: number } | null,\n });\n\n const throttleRef = React.useRef<NodeJS.Timeout | null>(null);\n\n const handleResize = React.useCallback(\n (deltaColumns: number) => {\n // Only resize if there's significant movement (dead zone)\n if (Math.abs(deltaColumns) < 0.25) {\n return;\n }\n\n // Calculate target widths\n const { targetLeftWidth, targetRightWidth } = calculateTargetWidths(\n deltaColumns,\n state.startLeftWidth,\n state.startRightWidth\n );\n\n // Validate the resize\n if (!isValidResize(targetLeftWidth, targetRightWidth)) {\n return;\n }\n\n // Update current resize values for the indicator\n setState((prev) => ({\n ...prev,\n currentResizeValues: { leftWidth: targetLeftWidth, rightWidth: targetRightWidth },\n }));\n\n // Only trigger resize if values have changed\n if (shouldTriggerResize(targetLeftWidth, targetRightWidth, state.lastResizeValues)) {\n setState((prev) => ({\n ...prev,\n lastResizeValues: { leftWidth: targetLeftWidth, rightWidth: targetRightWidth },\n }));\n onResize(leftWidgetId, rightWidgetId, targetLeftWidth, targetRightWidth);\n }\n },\n [\n leftWidgetId,\n rightWidgetId,\n onResize,\n state.startLeftWidth,\n state.startRightWidth,\n state.lastResizeValues,\n ]\n );\n\n const handlePointerMove = React.useCallback(\n (e: PointerEvent) => {\n if (!state.isDragging) return;\n\n // Clear any existing throttle timeout\n if (throttleRef.current) {\n clearTimeout(throttleRef.current);\n }\n\n // Throttle the resize calls to prevent excessive updates\n throttleRef.current = setTimeout(() => {\n const deltaX = e.clientX - state.startX;\n const threshold = 120; // Pixels per column unit\n const deltaColumns = Math.round(deltaX / threshold);\n\n handleResize(deltaColumns);\n }, 0);\n },\n [state.isDragging, state.startX, handleResize]\n );\n\n // Handle pointer up to end drag\n const handlePointerUp = React.useCallback(() => {\n // Clear any pending throttle timeout\n if (throttleRef.current) {\n clearTimeout(throttleRef.current);\n throttleRef.current = null;\n }\n\n // Save the layout\n saveLayout();\n\n // Reset last resize values and stop dragging\n setState((prev) => ({\n ...prev,\n lastResizeValues: { leftWidth: 0, rightWidth: 0 },\n currentResizeValues: { leftWidth: leftWidgetWidth, rightWidth: rightWidgetWidth },\n isDragging: false,\n }));\n }, [leftWidgetWidth, rightWidgetWidth, saveLayout]);\n\n // Handle pointer down to start drag\n const handlePointerDown = React.useCallback(\n (e: React.PointerEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n setState((prev) => ({\n ...prev,\n isDragging: true,\n startX: e.clientX,\n startLeftWidth: leftWidgetWidth,\n startRightWidth: rightWidgetWidth,\n }));\n },\n [leftWidgetWidth, rightWidgetWidth]\n );\n\n // Set up drag event listeners\n React.useEffect(() => {\n if (state.isDragging) {\n document.addEventListener('pointermove', handlePointerMove);\n document.addEventListener('pointerup', handlePointerUp);\n\n return () => {\n document.removeEventListener('pointermove', handlePointerMove);\n document.removeEventListener('pointerup', handlePointerUp);\n };\n }\n }, [state.isDragging, handlePointerMove, handlePointerUp]);\n\n // Set up resize observer for position updates - watching widgets and grid container\n React.useLayoutEffect(() => {\n const leftElement = getWidgetElement(leftWidgetId);\n const rightElement = getWidgetElement(rightWidgetId);\n const containerElement = getWidgetGridContainer();\n\n const updatePosition = () => {\n const position = calculateResizeHandlePosition(leftElement, rightElement, containerElement);\n const rowPosition = calculateRowBounds(leftElement, rightElement, containerElement);\n\n setState((prev) => ({\n ...prev,\n position,\n rowPosition,\n }));\n };\n\n // Create ResizeObserver to watch widgets and grid container\n const resizeObserver = new ResizeObserver(updatePosition);\n\n // Observe all relevant elements\n if (leftElement) resizeObserver.observe(leftElement);\n if (rightElement) resizeObserver.observe(rightElement);\n if (containerElement) resizeObserver.observe(containerElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [leftWidgetId, rightWidgetId]);\n\n // Cleanup throttle timeout on unmount\n React.useEffect(() => {\n return () => {\n if (throttleRef.current) {\n clearTimeout(throttleRef.current);\n }\n };\n }, []);\n\n return (\n <>\n <ResizeHandleContainer\n onPointerDown={handlePointerDown}\n style={{\n transform: `translate(${state.position.left}px, ${state.position.top}px)`,\n height: `${state.position.height}px`,\n }}\n >\n <ResizeHandleBar $isDragging={state.isDragging} />\n </ResizeHandleContainer>\n\n <ResizeIndicator\n isVisible={state.isDragging}\n position={state.position}\n currentLeftWidth={state.currentResizeValues.leftWidth}\n currentRightWidth={state.currentResizeValues.rightWidth}\n rowPosition={state.rowPosition}\n />\n </>\n );\n};\n"],"names":["INDICATOR_SIZE","IndicatorContainer","styled","Box","$isVisible","DotContainer","$position","Dot","$isActive","$isCurrent","theme","colors","primary600","primary500","neutral300","primary100","calculateGapAdjustment","rowWidth","leftColumns","dotWidth","gapAdjustmentPixels","gapAdjustmentPercent","ResizeIndicator","isVisible","position","currentLeftWidth","currentRightWidth","totalColumns","rowPosition","availablePositions","React","useMemo","width","map","left","right","basePosition","gapAdjustment","positionPercent","currentPositionIndex","findIndex","pos","indicatorTop","top","Math","max","height","isCurrent","index","isActive","abs","_jsx","style","ResizeHandleContainer","$isDragging","ResizeHandleBar","WidgetResizeHandle","leftWidgetId","rightWidgetId","leftWidgetWidth","rightWidgetWidth","onResize","saveLayout","state","setState","useState","isDragging","startX","startLeftWidth","startRightWidth","lastResizeValues","leftWidth","rightWidth","currentResizeValues","throttleRef","useRef","handleResize","useCallback","deltaColumns","targetLeftWidth","targetRightWidth","calculateTargetWidths","isValidResize","prev","shouldTriggerResize","handlePointerMove","e","current","clearTimeout","setTimeout","deltaX","clientX","threshold","round","handlePointerUp","handlePointerDown","preventDefault","stopPropagation","useEffect","document","addEventListener","removeEventListener","useLayoutEffect","leftElement","getWidgetElement","rightElement","containerElement","getWidgetGridContainer","updatePosition","calculateResizeHandlePosition","calculateRowBounds","resizeObserver","ResizeObserver","observe","disconnect","_jsxs","_Fragment","onPointerDown","transform"],"mappings":"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"}
|
|
@@ -5,14 +5,14 @@ var React = require('react');
|
|
|
5
5
|
var designSystem = require('@strapi/design-system');
|
|
6
6
|
var icons = require('@strapi/icons');
|
|
7
7
|
var reactRouterDom = require('react-router-dom');
|
|
8
|
-
var
|
|
8
|
+
var styledComponents = require('styled-components');
|
|
9
9
|
var theme = require('../constants/theme.js');
|
|
10
10
|
var Tours = require('./GuidedTour/Tours.js');
|
|
11
11
|
|
|
12
|
-
const MainSubNav =
|
|
12
|
+
const MainSubNav = styledComponents.styled(designSystem.SubNav)`
|
|
13
13
|
width: 100%;
|
|
14
14
|
height: 100%;
|
|
15
|
-
overflow: hidden;
|
|
15
|
+
overflow: ${({ $isFullPage })=>$isFullPage ? 'visible' : 'hidden'};
|
|
16
16
|
background-color: ${({ theme })=>theme.colors.neutral0};
|
|
17
17
|
display: flex;
|
|
18
18
|
flex-direction: column;
|
|
@@ -24,15 +24,17 @@ const MainSubNav = styled.styled(designSystem.SubNav)`
|
|
|
24
24
|
width: ${theme.WIDTH_SIDE_NAVIGATION};
|
|
25
25
|
position: sticky;
|
|
26
26
|
top: 0;
|
|
27
|
+
overflow: hidden;
|
|
27
28
|
border-right: 1px solid ${({ theme })=>theme.colors.neutral150};
|
|
28
29
|
overscroll-behavior: contain;
|
|
29
30
|
}
|
|
30
31
|
`;
|
|
31
|
-
const Main = ({ children, ...props })=>/*#__PURE__*/ jsxRuntime.jsx(MainSubNav, {
|
|
32
|
+
const Main = ({ children, isFullPage, ...props })=>/*#__PURE__*/ jsxRuntime.jsx(MainSubNav, {
|
|
33
|
+
$isFullPage: isFullPage,
|
|
32
34
|
...props,
|
|
33
35
|
children: children
|
|
34
36
|
});
|
|
35
|
-
const StyledLink =
|
|
37
|
+
const StyledLink = styledComponents.styled(reactRouterDom.NavLink)`
|
|
36
38
|
display: flex;
|
|
37
39
|
align-items: center;
|
|
38
40
|
justify-content: space-between;
|
|
@@ -120,7 +122,7 @@ const Link = (props)=>{
|
|
|
120
122
|
})
|
|
121
123
|
});
|
|
122
124
|
};
|
|
123
|
-
const StyledHeader =
|
|
125
|
+
const StyledHeader = styledComponents.styled(designSystem.Flex)`
|
|
124
126
|
flex: 0 0 ${theme.HEIGHT_TOP_NAVIGATION};
|
|
125
127
|
height: ${theme.HEIGHT_TOP_NAVIGATION};
|
|
126
128
|
|
|
@@ -281,7 +283,7 @@ const Section = ({ label, children, link, sectionId, badgeLabel })=>{
|
|
|
281
283
|
]
|
|
282
284
|
});
|
|
283
285
|
};
|
|
284
|
-
const SubSectionHeader =
|
|
286
|
+
const SubSectionHeader = styledComponents.styled.button`
|
|
285
287
|
cursor: pointer;
|
|
286
288
|
width: 100%;
|
|
287
289
|
border: none;
|
|
@@ -299,7 +301,7 @@ const SubSectionHeader = styled.styled.button`
|
|
|
299
301
|
background-color: ${({ theme })=>theme.colors.neutral100};
|
|
300
302
|
}
|
|
301
303
|
`;
|
|
302
|
-
const SubSectionLinkWrapper =
|
|
304
|
+
const SubSectionLinkWrapper = styledComponents.styled.li`
|
|
303
305
|
${StyledLink} > div {
|
|
304
306
|
padding-left: 36px;
|
|
305
307
|
}
|
|
@@ -369,7 +371,7 @@ const SubSection = ({ label, children })=>{
|
|
|
369
371
|
]
|
|
370
372
|
});
|
|
371
373
|
};
|
|
372
|
-
const PageWrapper =
|
|
374
|
+
const PageWrapper = styledComponents.styled(designSystem.Box)`
|
|
373
375
|
width: 100%;
|
|
374
376
|
|
|
375
377
|
${MainSubNav} {
|