@strapi/admin 5.26.0 → 5.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/admin/src/components/DragLayer.js +67 -0
- package/dist/admin/admin/src/components/DragLayer.js.map +1 -0
- package/dist/admin/admin/src/components/DragLayer.mjs +64 -0
- package/dist/admin/admin/src/components/DragLayer.mjs.map +1 -0
- package/dist/admin/admin/src/components/ErrorElement.js +10 -3
- package/dist/admin/admin/src/components/ErrorElement.js.map +1 -1
- package/dist/admin/admin/src/components/ErrorElement.mjs +10 -3
- package/dist/admin/admin/src/components/ErrorElement.mjs.map +1 -1
- package/dist/admin/admin/src/components/GapDropZone.js +292 -0
- package/dist/admin/admin/src/components/GapDropZone.js.map +1 -0
- package/dist/admin/admin/src/components/GapDropZone.mjs +268 -0
- package/dist/admin/admin/src/components/GapDropZone.mjs.map +1 -0
- package/dist/admin/admin/src/components/GuidedTour/Context.js +15 -0
- package/dist/admin/admin/src/components/GuidedTour/Context.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Context.mjs +15 -0
- package/dist/admin/admin/src/components/GuidedTour/Context.mjs.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/GuidedTourProvider.js +15 -0
- package/dist/admin/admin/src/components/GuidedTour/GuidedTourProvider.js.map +1 -0
- package/dist/admin/admin/src/components/GuidedTour/GuidedTourProvider.mjs +13 -0
- package/dist/admin/admin/src/components/GuidedTour/GuidedTourProvider.mjs.map +1 -0
- package/dist/admin/admin/src/components/GuidedTour/Overview.js +2 -1
- package/dist/admin/admin/src/components/GuidedTour/Overview.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Overview.mjs +2 -1
- package/dist/admin/admin/src/components/GuidedTour/Overview.mjs.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js +2 -2
- package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs +2 -2
- package/dist/admin/admin/src/components/GuidedTour/Steps/ContentTypeBuilderSteps.mjs.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Tours.js +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Tours.js.map +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Tours.mjs +1 -1
- package/dist/admin/admin/src/components/GuidedTour/Tours.mjs.map +1 -1
- package/dist/admin/admin/src/components/Layouts/ActionLayout.js +3 -2
- package/dist/admin/admin/src/components/Layouts/ActionLayout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/ActionLayout.mjs +3 -2
- package/dist/admin/admin/src/components/Layouts/ActionLayout.mjs.map +1 -1
- package/dist/admin/admin/src/components/Layouts/ContentLayout.js +3 -2
- package/dist/admin/admin/src/components/Layouts/ContentLayout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/ContentLayout.mjs +3 -2
- package/dist/admin/admin/src/components/Layouts/ContentLayout.mjs.map +1 -1
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.js +65 -32
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs +66 -33
- package/dist/admin/admin/src/components/Layouts/HeaderLayout.mjs.map +1 -1
- package/dist/admin/admin/src/components/Layouts/Layout.js +29 -6
- package/dist/admin/admin/src/components/Layouts/Layout.js.map +1 -1
- package/dist/admin/admin/src/components/Layouts/Layout.mjs +30 -7
- package/dist/admin/admin/src/components/Layouts/Layout.mjs.map +1 -1
- package/dist/admin/admin/src/components/LeftMenu.js +147 -92
- package/dist/admin/admin/src/components/LeftMenu.js.map +1 -1
- package/dist/admin/admin/src/components/LeftMenu.mjs +131 -95
- package/dist/admin/admin/src/components/LeftMenu.mjs.map +1 -1
- package/dist/admin/admin/src/components/MainNav/MainNav.js +20 -6
- package/dist/admin/admin/src/components/MainNav/MainNav.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/MainNav.mjs +20 -6
- package/dist/admin/admin/src/components/MainNav/MainNav.mjs.map +1 -1
- package/dist/admin/admin/src/components/MainNav/MainNavLinks.js +157 -0
- package/dist/admin/admin/src/components/MainNav/MainNavLinks.js.map +1 -0
- package/dist/admin/admin/src/components/MainNav/MainNavLinks.mjs +154 -0
- package/dist/admin/admin/src/components/MainNav/MainNavLinks.mjs.map +1 -0
- package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js +65 -0
- package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.js.map +1 -0
- package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.mjs +63 -0
- package/dist/admin/admin/src/components/MainNav/NavBurgerMenu.mjs.map +1 -0
- package/dist/admin/admin/src/components/MainNav/NavLink.js +2 -1
- package/dist/admin/admin/src/components/MainNav/NavLink.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavLink.mjs +2 -1
- package/dist/admin/admin/src/components/MainNav/NavLink.mjs.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavUser.js +39 -22
- package/dist/admin/admin/src/components/MainNav/NavUser.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/NavUser.mjs +39 -22
- package/dist/admin/admin/src/components/MainNav/NavUser.mjs.map +1 -1
- package/dist/admin/admin/src/components/MainNav/TrialCountdown.js +8 -1
- package/dist/admin/admin/src/components/MainNav/TrialCountdown.js.map +1 -1
- package/dist/admin/admin/src/components/MainNav/TrialCountdown.mjs +9 -2
- package/dist/admin/admin/src/components/MainNav/TrialCountdown.mjs.map +1 -1
- package/dist/admin/admin/src/components/NpsSurvey.js +159 -119
- package/dist/admin/admin/src/components/NpsSurvey.js.map +1 -1
- package/dist/admin/admin/src/components/NpsSurvey.mjs +160 -120
- package/dist/admin/admin/src/components/NpsSurvey.mjs.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.js +1 -1
- package/dist/admin/admin/src/components/PageHelpers.js.map +1 -1
- package/dist/admin/admin/src/components/PageHelpers.mjs +1 -1
- package/dist/admin/admin/src/components/PageHelpers.mjs.map +1 -1
- package/dist/admin/admin/src/components/Providers.js +2 -4
- package/dist/admin/admin/src/components/Providers.js.map +1 -1
- package/dist/admin/admin/src/components/Providers.mjs +2 -4
- package/dist/admin/admin/src/components/Providers.mjs.map +1 -1
- package/dist/admin/admin/src/components/ResizeIndicator.js +353 -0
- package/dist/admin/admin/src/components/ResizeIndicator.js.map +1 -0
- package/dist/admin/admin/src/components/ResizeIndicator.mjs +332 -0
- package/dist/admin/admin/src/components/ResizeIndicator.mjs.map +1 -0
- package/dist/admin/admin/src/components/SubNav.js +98 -33
- package/dist/admin/admin/src/components/SubNav.js.map +1 -1
- package/dist/admin/admin/src/components/SubNav.mjs +99 -34
- package/dist/admin/admin/src/components/SubNav.mjs.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.js +3 -2
- package/dist/admin/admin/src/components/UpsellBanner.js.map +1 -1
- package/dist/admin/admin/src/components/UpsellBanner.mjs +3 -2
- package/dist/admin/admin/src/components/UpsellBanner.mjs.map +1 -1
- package/dist/admin/admin/src/components/WidgetRoot.js +216 -0
- package/dist/admin/admin/src/components/WidgetRoot.js.map +1 -0
- package/dist/admin/admin/src/components/WidgetRoot.mjs +195 -0
- package/dist/admin/admin/src/components/WidgetRoot.mjs.map +1 -0
- package/dist/admin/admin/src/constants/theme.js +12 -0
- package/dist/admin/admin/src/constants/theme.js.map +1 -0
- package/dist/admin/admin/src/constants/theme.mjs +9 -0
- package/dist/admin/admin/src/constants/theme.mjs.map +1 -0
- package/dist/admin/admin/src/features/Notifications.js +14 -7
- package/dist/admin/admin/src/features/Notifications.js.map +1 -1
- package/dist/admin/admin/src/features/Notifications.mjs +15 -8
- package/dist/admin/admin/src/features/Notifications.mjs.map +1 -1
- package/dist/admin/admin/src/features/Tracking.js +5 -1
- package/dist/admin/admin/src/features/Tracking.js.map +1 -1
- package/dist/admin/admin/src/features/Tracking.mjs +5 -1
- package/dist/admin/admin/src/features/Tracking.mjs.map +1 -1
- package/dist/admin/admin/src/features/Widgets.js +276 -0
- package/dist/admin/admin/src/features/Widgets.js.map +1 -0
- package/dist/admin/admin/src/features/Widgets.mjs +255 -0
- package/dist/admin/admin/src/features/Widgets.mjs.map +1 -0
- package/dist/admin/admin/src/hooks/useAPIErrorHandler.js +1 -1
- package/dist/admin/admin/src/hooks/useAPIErrorHandler.js.map +1 -1
- package/dist/admin/admin/src/hooks/useAPIErrorHandler.mjs +1 -1
- package/dist/admin/admin/src/hooks/useAPIErrorHandler.mjs.map +1 -1
- package/dist/admin/admin/src/hooks/useDeviceType.js +43 -0
- package/dist/admin/admin/src/hooks/useDeviceType.js.map +1 -0
- package/dist/admin/admin/src/hooks/useDeviceType.mjs +22 -0
- package/dist/admin/admin/src/hooks/useDeviceType.mjs.map +1 -0
- package/dist/admin/admin/src/hooks/useMediaQuery.js +70 -0
- package/dist/admin/admin/src/hooks/useMediaQuery.js.map +1 -0
- package/dist/admin/admin/src/hooks/useMediaQuery.mjs +46 -0
- package/dist/admin/admin/src/hooks/useMediaQuery.mjs.map +1 -0
- package/dist/admin/admin/src/hooks/useMenu.js +19 -0
- package/dist/admin/admin/src/hooks/useMenu.js.map +1 -1
- package/dist/admin/admin/src/hooks/useMenu.mjs +19 -0
- package/dist/admin/admin/src/hooks/useMenu.mjs.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js +15 -2
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.js.map +1 -1
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs +15 -2
- package/dist/admin/admin/src/layouts/AuthenticatedLayout.mjs.map +1 -1
- package/dist/admin/admin/src/layouts/UnauthenticatedLayout.js +11 -7
- package/dist/admin/admin/src/layouts/UnauthenticatedLayout.js.map +1 -1
- package/dist/admin/admin/src/layouts/UnauthenticatedLayout.mjs +11 -7
- package/dist/admin/admin/src/layouts/UnauthenticatedLayout.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.js +3 -0
- package/dist/admin/admin/src/pages/Auth/components/Login.js.map +1 -1
- package/dist/admin/admin/src/pages/Auth/components/Login.mjs +3 -0
- package/dist/admin/admin/src/pages/Auth/components/Login.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.js +200 -130
- package/dist/admin/admin/src/pages/Home/HomePage.js.map +1 -1
- package/dist/admin/admin/src/pages/Home/HomePage.mjs +202 -132
- package/dist/admin/admin/src/pages/Home/HomePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js +189 -0
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.js.map +1 -0
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.mjs +168 -0
- package/dist/admin/admin/src/pages/Home/components/AddWidgetModal.mjs.map +1 -0
- package/dist/admin/admin/src/pages/ProfilePage.js +54 -51
- package/dist/admin/admin/src/pages/ProfilePage.js.map +1 -1
- package/dist/admin/admin/src/pages/ProfilePage.mjs +55 -52
- package/dist/admin/admin/src/pages/ProfilePage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/Layout.js +42 -6
- package/dist/admin/admin/src/pages/Settings/Layout.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/Layout.mjs +43 -7
- package/dist/admin/admin/src/pages/Settings/Layout.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js +44 -32
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs +45 -33
- package/dist/admin/admin/src/pages/Settings/components/SettingsNav.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/ApplicationInfo/ApplicationInfoPage.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.mjs +2 -2
- package/dist/admin/admin/src/pages/Settings/pages/InstalledPlugins.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/PurchaseAuditLogs.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/PurchaseAuditLogs.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/PurchaseAuditLogs.mjs +5 -4
- package/dist/admin/admin/src/pages/Settings/pages/PurchaseAuditLogs.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/PurchaseContentHistory.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/PurchaseContentHistory.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/PurchaseContentHistory.mjs +5 -4
- package/dist/admin/admin/src/pages/Settings/pages/PurchaseContentHistory.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/PurchaseSingleSignOn.js +4 -3
- package/dist/admin/admin/src/pages/Settings/pages/PurchaseSingleSignOn.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/PurchaseSingleSignOn.mjs +5 -4
- package/dist/admin/admin/src/pages/Settings/pages/PurchaseSingleSignOn.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js +36 -32
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs +36 -32
- package/dist/admin/admin/src/pages/Settings/pages/Roles/components/ContentTypeCollapses.mjs.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.js.map +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs +1 -1
- package/dist/admin/admin/src/pages/Settings/pages/Webhooks/ListPage.mjs.map +1 -1
- package/dist/admin/admin/src/services/api.js +2 -1
- package/dist/admin/admin/src/services/api.js.map +1 -1
- package/dist/admin/admin/src/services/api.mjs +2 -1
- package/dist/admin/admin/src/services/api.mjs.map +1 -1
- package/dist/admin/admin/src/services/auth.js +13 -2
- package/dist/admin/admin/src/services/auth.js.map +1 -1
- package/dist/admin/admin/src/services/auth.mjs +12 -3
- package/dist/admin/admin/src/services/auth.mjs.map +1 -1
- package/dist/admin/admin/src/services/homepage.js +11 -4
- package/dist/admin/admin/src/services/homepage.js.map +1 -1
- package/dist/admin/admin/src/services/homepage.mjs +11 -4
- package/dist/admin/admin/src/services/homepage.mjs.map +1 -1
- package/dist/admin/admin/src/translations/en.json.js +7 -1
- package/dist/admin/admin/src/translations/en.json.js.map +1 -1
- package/dist/admin/admin/src/translations/en.json.mjs +7 -1
- package/dist/admin/admin/src/translations/en.json.mjs.map +1 -1
- package/dist/admin/admin/src/translations/uk.json.js +9 -9
- package/dist/admin/admin/src/translations/uk.json.mjs +9 -9
- package/dist/admin/admin/src/utils/resizeHandlers.js +109 -0
- package/dist/admin/admin/src/utils/resizeHandlers.js.map +1 -0
- package/dist/admin/admin/src/utils/resizeHandlers.mjs +100 -0
- package/dist/admin/admin/src/utils/resizeHandlers.mjs.map +1 -0
- package/dist/admin/admin/src/utils/widgetLayout.js +293 -0
- package/dist/admin/admin/src/utils/widgetLayout.js.map +1 -0
- package/dist/admin/admin/src/utils/widgetLayout.mjs +273 -0
- package/dist/admin/admin/src/utils/widgetLayout.mjs.map +1 -0
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.js +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 +1 -1
- package/dist/admin/ee/admin/src/pages/SettingsPage/pages/SingleSignOnPage.mjs.map +1 -1
- package/dist/admin/ee/admin/src/services/ai.js +5 -2
- package/dist/admin/ee/admin/src/services/ai.js.map +1 -1
- package/dist/admin/ee/admin/src/services/ai.mjs +5 -2
- package/dist/admin/ee/admin/src/services/ai.mjs.map +1 -1
- package/dist/admin/index.js +11 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +4 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/components/DragLayer.d.ts +8 -4
- package/dist/admin/src/components/GapDropZone.d.ts +36 -0
- package/dist/admin/src/components/GuidedTour/Context.d.ts +4 -0
- package/dist/admin/src/components/GuidedTour/GuidedTourProvider.d.ts +6 -0
- package/dist/admin/src/components/LeftMenu.d.ts +2 -2
- package/dist/admin/src/components/MainNav/MainNavLinks.d.ts +11 -0
- package/dist/admin/src/components/MainNav/NavBurgerMenu.d.ts +9 -0
- package/dist/admin/src/components/MainNav/NavUser.d.ts +5 -4
- package/dist/admin/src/components/ResizeIndicator.d.ts +12 -0
- package/dist/admin/src/components/SubNav.d.ts +18 -5
- package/dist/admin/src/components/WidgetRoot.d.ts +14 -0
- package/dist/admin/src/constants/theme.d.ts +7 -0
- package/dist/admin/src/core/store/configure.d.ts +2 -2
- package/dist/admin/src/core/store/hooks.d.ts +2 -2
- package/dist/admin/src/features/Tracking.d.ts +1 -1
- package/dist/admin/src/features/Widgets.d.ts +29 -0
- package/dist/admin/src/hooks/useAdminRoles.d.ts +1 -1
- package/dist/admin/src/hooks/useDeviceType.d.ts +6 -0
- package/dist/admin/src/hooks/useMediaQuery.d.ts +21 -0
- package/dist/admin/src/hooks/useMenu.d.ts +9 -1
- package/dist/admin/src/index.d.ts +4 -0
- package/dist/admin/src/pages/Home/HomePage.d.ts +4 -5
- package/dist/admin/src/pages/Home/components/AddWidgetModal.d.ts +10 -0
- package/dist/admin/src/pages/Settings/components/SettingsNav.d.ts +3 -6
- package/dist/admin/src/pages/Settings/pages/Webhooks/hooks/useWebhooks.d.ts +4 -4
- package/dist/admin/src/selectors.d.ts +2 -2
- package/dist/admin/src/services/admin.d.ts +6 -6
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/apiTokens.d.ts +1 -1
- package/dist/admin/src/services/auth.d.ts +21 -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 +2 -2
- package/dist/admin/src/utils/resizeHandlers.d.ts +58 -0
- package/dist/admin/src/utils/widgetLayout.d.ts +78 -0
- package/dist/admin/tests/utils.d.ts +1 -1
- package/dist/ee/admin/src/services/ai.d.ts +2 -2
- package/dist/ee/admin/src/services/auditLogs.d.ts +1 -1
- package/dist/ee/server/src/controllers/authentication-utils/middlewares.d.ts.map +1 -1
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.js +4 -2
- 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 +4 -2
- package/dist/server/ee/server/src/controllers/authentication-utils/middlewares.mjs.map +1 -1
- package/dist/server/server/src/bootstrap.js +5 -0
- package/dist/server/server/src/bootstrap.js.map +1 -1
- package/dist/server/server/src/bootstrap.mjs +5 -0
- package/dist/server/server/src/bootstrap.mjs.map +1 -1
- package/dist/server/server/src/controllers/authenticated-user.js +15 -0
- package/dist/server/server/src/controllers/authenticated-user.js.map +1 -1
- package/dist/server/server/src/controllers/authenticated-user.mjs +15 -0
- package/dist/server/server/src/controllers/authenticated-user.mjs.map +1 -1
- package/dist/server/server/src/routes/users.js +10 -0
- package/dist/server/server/src/routes/users.js.map +1 -1
- package/dist/server/server/src/routes/users.mjs +10 -0
- package/dist/server/server/src/routes/users.mjs.map +1 -1
- package/dist/server/server/src/services/user.js +113 -1
- package/dist/server/server/src/services/user.js.map +1 -1
- package/dist/server/server/src/services/user.mjs +113 -1
- package/dist/server/server/src/services/user.mjs.map +1 -1
- package/dist/server/shared/utils/session-auth.js +4 -2
- package/dist/server/shared/utils/session-auth.js.map +1 -1
- package/dist/server/shared/utils/session-auth.mjs +4 -2
- package/dist/server/shared/utils/session-auth.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/authenticated-user.d.ts +1 -0
- package/dist/server/src/controllers/authenticated-user.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +1 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +5 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/routes/users.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +4 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/user.d.ts +4 -0
- package/dist/server/src/services/user.d.ts.map +1 -1
- package/dist/shared/contracts/homepage.d.ts +8 -4
- package/dist/shared/contracts/homepage.d.ts.map +1 -1
- package/dist/shared/contracts/users.d.ts +16 -0
- package/dist/shared/contracts/users.d.ts.map +1 -1
- package/dist/shared/utils/session-auth.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GapDropZone.js","sources":["../../../../../admin/src/components/GapDropZone.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box } from '@strapi/design-system';\n// TODO: use @dnd-kit/core instead\nimport { useDrop } from 'react-dnd';\nimport { styled } from 'styled-components';\n\nimport {\n calculateWidgetRows,\n type WidgetRow,\n getWidgetElement,\n getWidgetGridContainer,\n} from '../utils/widgetLayout';\n\nimport type { WidgetWithUID } from '../core/apis/Widgets';\n\nexport const DROP_ZONE_SIZE = 20;\n\nexport interface GapDropZonePosition {\n insertIndex: number;\n position: { left: number; top: number; height: number; width: number };\n isVisible: boolean;\n type: 'vertical' | 'horizontal';\n isHorizontalDrop?: boolean;\n targetRowIndex?: number;\n}\n\ninterface GapDropZoneManagerProps {\n filteredWidgets: WidgetWithUID[];\n columnWidths: Record<string, number>;\n draggedWidgetId?: string;\n moveWidget: (id: string, to: number, targetRowIndex?: number, isHorizontalDrop?: boolean) => void;\n}\n\nconst getRowInfo = (row: WidgetRow) => {\n const firstWidgetElement = getWidgetElement(row.widgets[0].uid);\n const lastWidgetElement = getWidgetElement(row.widgets[row.widgets.length - 1].uid);\n const containerElement = getWidgetGridContainer();\n\n if (!firstWidgetElement || !lastWidgetElement || !containerElement) {\n return null;\n }\n\n const firstRect = firstWidgetElement.getBoundingClientRect();\n const lastRect = lastWidgetElement.getBoundingClientRect();\n const containerRect = containerElement.getBoundingClientRect();\n\n return {\n firstWidgetElement,\n lastWidgetElement,\n containerElement,\n firstRect,\n lastRect,\n containerRect,\n rowHeight: Math.max(firstRect.height, lastRect.height),\n rowTop: firstRect.top - containerRect.top,\n };\n};\n\nexport const addVerticalDropZones = (\n row: WidgetRow,\n rowInfo: ReturnType<typeof getRowInfo>,\n rowIndex: number\n): GapDropZonePosition[] => {\n if (!rowInfo) return [];\n\n const { containerRect, rowTop, rowHeight } = rowInfo;\n const widgetCount = row.widgets.length;\n\n // Get widget positions relative to container\n const widgetPositions = row.widgets\n .map((widget) => {\n const element = getWidgetElement(widget.uid);\n if (!element) return null;\n\n const rect = element.getBoundingClientRect();\n return {\n left: rect.left - containerRect.left,\n width: rect.width,\n };\n })\n .filter((pos): pos is NonNullable<typeof pos> => pos !== null);\n\n if (widgetPositions.length !== widgetCount) return [];\n\n const gapDropZones: GapDropZonePosition[] = [];\n\n // Always add drop zone before the first widget\n gapDropZones.push({\n insertIndex: row.startIndex,\n position: {\n left: widgetPositions[0].left - DROP_ZONE_SIZE,\n top: rowTop,\n height: rowHeight,\n width: DROP_ZONE_SIZE,\n },\n isVisible: true,\n type: 'vertical',\n targetRowIndex: rowIndex,\n });\n\n // Add drop zones between widgets\n widgetPositions.slice(0, -1).forEach((currentWidget, i) => {\n gapDropZones.push({\n insertIndex: row.startIndex + i + 1,\n position: {\n left: currentWidget.left + currentWidget.width,\n top: rowTop,\n height: rowHeight,\n width: DROP_ZONE_SIZE,\n },\n isVisible: true,\n type: 'vertical',\n targetRowIndex: rowIndex,\n });\n });\n\n // Always add drop zone after the last widget\n const lastWidget = widgetPositions[widgetCount - 1];\n gapDropZones.push({\n insertIndex: row.endIndex + 1,\n position: {\n left: lastWidget.left + lastWidget.width,\n top: rowTop,\n height: rowHeight,\n width: DROP_ZONE_SIZE,\n },\n isVisible: true,\n type: 'vertical',\n targetRowIndex: rowIndex,\n });\n\n return gapDropZones;\n};\n\nexport const addHorizontalDropZones = (\n row: WidgetRow,\n rowIndex: number,\n rowInfo: ReturnType<typeof getRowInfo>,\n widgetRows: WidgetRow[],\n filteredWidgets: WidgetWithUID[]\n): GapDropZonePosition[] => {\n if (!rowInfo) return [];\n\n // Don't show horizontal drop zones if there's only one row with one widget\n if (widgetRows.length === 1 && row.widgets.length === 1) return [];\n\n const { containerRect } = rowInfo;\n const containerWidth = containerRect.width;\n const horizontalDropZoneHeight = DROP_ZONE_SIZE;\n\n const gapDropZones: GapDropZonePosition[] = [];\n\n // Add horizontal drop zone above the first row\n if (rowIndex === 0) {\n const firstRowRect = rowInfo.firstRect;\n const firstRowTop = firstRowRect.top - containerRect.top;\n\n gapDropZones.push({\n insertIndex: 0,\n position: {\n left: 0,\n top: firstRowTop - horizontalDropZoneHeight,\n height: horizontalDropZoneHeight,\n width: containerWidth,\n },\n isVisible: true,\n type: 'horizontal',\n isHorizontalDrop: true,\n });\n }\n\n // Add horizontal drop zone below the current row (between rows or after last row)\n if (rowIndex < widgetRows.length - 1) {\n // Between rows: position above the next row\n const nextRow = widgetRows[rowIndex + 1];\n const nextRowFirstWidgetElement = getWidgetElement(nextRow.widgets[0].uid);\n\n if (nextRowFirstWidgetElement) {\n const nextRowRect = nextRowFirstWidgetElement.getBoundingClientRect();\n const nextRowTop = nextRowRect.top - containerRect.top;\n\n gapDropZones.push({\n insertIndex: row.endIndex + 1,\n position: {\n left: 0,\n top: nextRowTop - horizontalDropZoneHeight,\n height: horizontalDropZoneHeight,\n width: containerWidth,\n },\n isVisible: true,\n type: 'horizontal',\n isHorizontalDrop: true,\n });\n }\n } else {\n // After the last row: position below the current row\n const lastRowRect = rowInfo.lastRect;\n const lastRowBottom = lastRowRect.bottom - containerRect.top;\n\n gapDropZones.push({\n insertIndex: filteredWidgets.length,\n position: {\n left: 0,\n top: lastRowBottom,\n height: horizontalDropZoneHeight,\n width: containerWidth,\n },\n isVisible: true,\n type: 'horizontal',\n isHorizontalDrop: true,\n });\n }\n\n return gapDropZones;\n};\n\nexport const GapDropZoneManager = ({\n filteredWidgets,\n columnWidths,\n draggedWidgetId,\n moveWidget,\n}: GapDropZoneManagerProps) => {\n const [positions, setPositions] = React.useState<GapDropZonePosition[]>([]);\n\n // Calculate widget rows\n const widgetRows = React.useMemo(() => {\n return calculateWidgetRows(filteredWidgets, columnWidths);\n }, [filteredWidgets, columnWidths]);\n\n // Main function to calculate GapDropZone positions\n const calculateGapDropZonePositions = React.useCallback(() => {\n const gapDropZones: GapDropZonePosition[] = [];\n\n // Find which row the dragged widget is from\n const draggedWidgetRow = draggedWidgetId\n ? widgetRows.find((row) => row.widgets.some((widget) => widget.uid === draggedWidgetId))\n : null;\n\n widgetRows.forEach((row, rowIndex) => {\n const rowInfo = getRowInfo(row);\n if (!rowInfo) return;\n\n const widgetCount = row.widgets.length;\n\n // Determine if we should show vertical drop zones for this row\n const isDraggingFromThisRow = draggedWidgetRow && draggedWidgetRow === row;\n const isDraggingFromAnotherRow = draggedWidgetRow && draggedWidgetRow !== row;\n const canAcceptMoreWidgets = widgetCount < 3;\n\n const shouldShowVerticalDropZones =\n isDraggingFromThisRow || (isDraggingFromAnotherRow && canAcceptMoreWidgets);\n\n // Add vertical drop zones based on widget count\n if (shouldShowVerticalDropZones) {\n const verticalDropZones = addVerticalDropZones(row, rowInfo, rowIndex);\n gapDropZones.push(...verticalDropZones);\n }\n\n // Add horizontal drop zones\n const horizontalDropZones = addHorizontalDropZones(\n row,\n rowIndex,\n rowInfo,\n widgetRows,\n filteredWidgets\n );\n gapDropZones.push(...horizontalDropZones);\n });\n\n return gapDropZones;\n }, [widgetRows, draggedWidgetId, filteredWidgets]);\n\n React.useLayoutEffect(() => {\n const updatePositions = () => {\n const newPositions = calculateGapDropZonePositions();\n setPositions(newPositions);\n };\n\n updatePositions();\n\n // Update positions on container resize using ResizeObserver\n const containerElement = getWidgetGridContainer();\n if (!containerElement) return;\n\n const resizeObserver = new ResizeObserver(() => {\n updatePositions();\n });\n\n resizeObserver.observe(containerElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [calculateGapDropZonePositions]);\n\n return positions.map((gapDropZone) => (\n <GapDropZone\n key={`gap-drop-zone-${gapDropZone.type}-${gapDropZone.insertIndex}-${gapDropZone.targetRowIndex ?? 'no-row'}`}\n insertIndex={gapDropZone.insertIndex}\n position={gapDropZone.position}\n isVisible={gapDropZone.isVisible}\n type={gapDropZone.type}\n moveWidget={moveWidget}\n targetRowIndex={gapDropZone.targetRowIndex}\n />\n ));\n};\n\ninterface GapDropZoneProps {\n insertIndex: number;\n position: { left: number; top: number; height: number; width: number };\n isVisible: boolean;\n type: 'vertical' | 'horizontal';\n moveWidget: (id: string, to: number, targetRowIndex?: number, isHorizontalDrop?: boolean) => void;\n targetRowIndex?: number;\n}\n\nconst GapDropZoneContainer = styled(Box)<{\n $isOver: boolean;\n}>`\n background-color: ${({ $isOver, theme }) =>\n $isOver ? `${theme.colors.primary100}` : 'transparent'};\n border: ${({ $isOver, theme }) =>\n $isOver ? `2px solid ${theme.colors.primary500}` : '2px solid transparent'};\n opacity: ${({ $isOver }) => ($isOver ? 1 : 0.6)};\n transition: all 0.2s ease-in-out;\n cursor: pointer;\n border-radius: ${({ theme }) => theme.borderRadius};\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 0;\n bottom: 0;\n width: ${DROP_ZONE_SIZE}px;\n z-index: 1;\n`;\n\nconst GapDropZone = ({\n insertIndex,\n position,\n isVisible,\n type,\n moveWidget,\n targetRowIndex,\n}: GapDropZoneProps) => {\n const isHorizontalDrop = type === 'horizontal';\n\n const [{ isOver }, drop] = useDrop(\n () => ({\n accept: 'widget',\n drop: (item: { id: string }) => {\n moveWidget(item.id, insertIndex, targetRowIndex, isHorizontalDrop);\n },\n collect: (monitor) => ({\n isOver: monitor.isOver(),\n }),\n }),\n [insertIndex, isHorizontalDrop, moveWidget, targetRowIndex]\n );\n\n if (!isVisible) {\n return null;\n }\n\n return (\n <GapDropZoneContainer\n ref={drop}\n $isOver={isOver}\n style={{\n transform: `translate(${position.left}px, ${position.top}px)`,\n height: `${position.height}px`,\n width: `${position.width}px`,\n }}\n />\n );\n};\n"],"names":["DROP_ZONE_SIZE","getRowInfo","row","firstWidgetElement","getWidgetElement","widgets","uid","lastWidgetElement","length","containerElement","getWidgetGridContainer","firstRect","getBoundingClientRect","lastRect","containerRect","rowHeight","Math","max","height","rowTop","top","addVerticalDropZones","rowInfo","rowIndex","widgetCount","widgetPositions","map","widget","element","rect","left","width","filter","pos","gapDropZones","push","insertIndex","startIndex","position","isVisible","type","targetRowIndex","slice","forEach","currentWidget","i","lastWidget","endIndex","addHorizontalDropZones","widgetRows","filteredWidgets","containerWidth","horizontalDropZoneHeight","firstRowRect","firstRowTop","isHorizontalDrop","nextRow","nextRowFirstWidgetElement","nextRowRect","nextRowTop","lastRowRect","lastRowBottom","bottom","GapDropZoneManager","columnWidths","draggedWidgetId","moveWidget","positions","setPositions","React","useState","useMemo","calculateWidgetRows","calculateGapDropZonePositions","useCallback","draggedWidgetRow","find","some","isDraggingFromThisRow","isDraggingFromAnotherRow","canAcceptMoreWidgets","shouldShowVerticalDropZones","verticalDropZones","horizontalDropZones","useLayoutEffect","updatePositions","newPositions","resizeObserver","ResizeObserver","observe","disconnect","gapDropZone","_jsx","GapDropZone","GapDropZoneContainer","styled","Box","$isOver","theme","colors","primary100","primary500","borderRadius","isOver","drop","useDrop","accept","item","id","collect","monitor","ref","style","transform"],"mappings":"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"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { Box } from '@strapi/design-system';
|
|
4
|
+
import { useDrop } from 'react-dnd';
|
|
5
|
+
import { styled } from 'styled-components';
|
|
6
|
+
import { calculateWidgetRows, getWidgetGridContainer, getWidgetElement } from '../utils/widgetLayout.mjs';
|
|
7
|
+
|
|
8
|
+
const DROP_ZONE_SIZE = 20;
|
|
9
|
+
const getRowInfo = (row)=>{
|
|
10
|
+
const firstWidgetElement = getWidgetElement(row.widgets[0].uid);
|
|
11
|
+
const lastWidgetElement = getWidgetElement(row.widgets[row.widgets.length - 1].uid);
|
|
12
|
+
const containerElement = getWidgetGridContainer();
|
|
13
|
+
if (!firstWidgetElement || !lastWidgetElement || !containerElement) {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
const firstRect = firstWidgetElement.getBoundingClientRect();
|
|
17
|
+
const lastRect = lastWidgetElement.getBoundingClientRect();
|
|
18
|
+
const containerRect = containerElement.getBoundingClientRect();
|
|
19
|
+
return {
|
|
20
|
+
firstWidgetElement,
|
|
21
|
+
lastWidgetElement,
|
|
22
|
+
containerElement,
|
|
23
|
+
firstRect,
|
|
24
|
+
lastRect,
|
|
25
|
+
containerRect,
|
|
26
|
+
rowHeight: Math.max(firstRect.height, lastRect.height),
|
|
27
|
+
rowTop: firstRect.top - containerRect.top
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
const addVerticalDropZones = (row, rowInfo, rowIndex)=>{
|
|
31
|
+
if (!rowInfo) return [];
|
|
32
|
+
const { containerRect, rowTop, rowHeight } = rowInfo;
|
|
33
|
+
const widgetCount = row.widgets.length;
|
|
34
|
+
// Get widget positions relative to container
|
|
35
|
+
const widgetPositions = row.widgets.map((widget)=>{
|
|
36
|
+
const element = getWidgetElement(widget.uid);
|
|
37
|
+
if (!element) return null;
|
|
38
|
+
const rect = element.getBoundingClientRect();
|
|
39
|
+
return {
|
|
40
|
+
left: rect.left - containerRect.left,
|
|
41
|
+
width: rect.width
|
|
42
|
+
};
|
|
43
|
+
}).filter((pos)=>pos !== null);
|
|
44
|
+
if (widgetPositions.length !== widgetCount) return [];
|
|
45
|
+
const gapDropZones = [];
|
|
46
|
+
// Always add drop zone before the first widget
|
|
47
|
+
gapDropZones.push({
|
|
48
|
+
insertIndex: row.startIndex,
|
|
49
|
+
position: {
|
|
50
|
+
left: widgetPositions[0].left - DROP_ZONE_SIZE,
|
|
51
|
+
top: rowTop,
|
|
52
|
+
height: rowHeight,
|
|
53
|
+
width: DROP_ZONE_SIZE
|
|
54
|
+
},
|
|
55
|
+
isVisible: true,
|
|
56
|
+
type: 'vertical',
|
|
57
|
+
targetRowIndex: rowIndex
|
|
58
|
+
});
|
|
59
|
+
// Add drop zones between widgets
|
|
60
|
+
widgetPositions.slice(0, -1).forEach((currentWidget, i)=>{
|
|
61
|
+
gapDropZones.push({
|
|
62
|
+
insertIndex: row.startIndex + i + 1,
|
|
63
|
+
position: {
|
|
64
|
+
left: currentWidget.left + currentWidget.width,
|
|
65
|
+
top: rowTop,
|
|
66
|
+
height: rowHeight,
|
|
67
|
+
width: DROP_ZONE_SIZE
|
|
68
|
+
},
|
|
69
|
+
isVisible: true,
|
|
70
|
+
type: 'vertical',
|
|
71
|
+
targetRowIndex: rowIndex
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
// Always add drop zone after the last widget
|
|
75
|
+
const lastWidget = widgetPositions[widgetCount - 1];
|
|
76
|
+
gapDropZones.push({
|
|
77
|
+
insertIndex: row.endIndex + 1,
|
|
78
|
+
position: {
|
|
79
|
+
left: lastWidget.left + lastWidget.width,
|
|
80
|
+
top: rowTop,
|
|
81
|
+
height: rowHeight,
|
|
82
|
+
width: DROP_ZONE_SIZE
|
|
83
|
+
},
|
|
84
|
+
isVisible: true,
|
|
85
|
+
type: 'vertical',
|
|
86
|
+
targetRowIndex: rowIndex
|
|
87
|
+
});
|
|
88
|
+
return gapDropZones;
|
|
89
|
+
};
|
|
90
|
+
const addHorizontalDropZones = (row, rowIndex, rowInfo, widgetRows, filteredWidgets)=>{
|
|
91
|
+
if (!rowInfo) return [];
|
|
92
|
+
// Don't show horizontal drop zones if there's only one row with one widget
|
|
93
|
+
if (widgetRows.length === 1 && row.widgets.length === 1) return [];
|
|
94
|
+
const { containerRect } = rowInfo;
|
|
95
|
+
const containerWidth = containerRect.width;
|
|
96
|
+
const horizontalDropZoneHeight = DROP_ZONE_SIZE;
|
|
97
|
+
const gapDropZones = [];
|
|
98
|
+
// Add horizontal drop zone above the first row
|
|
99
|
+
if (rowIndex === 0) {
|
|
100
|
+
const firstRowRect = rowInfo.firstRect;
|
|
101
|
+
const firstRowTop = firstRowRect.top - containerRect.top;
|
|
102
|
+
gapDropZones.push({
|
|
103
|
+
insertIndex: 0,
|
|
104
|
+
position: {
|
|
105
|
+
left: 0,
|
|
106
|
+
top: firstRowTop - horizontalDropZoneHeight,
|
|
107
|
+
height: horizontalDropZoneHeight,
|
|
108
|
+
width: containerWidth
|
|
109
|
+
},
|
|
110
|
+
isVisible: true,
|
|
111
|
+
type: 'horizontal',
|
|
112
|
+
isHorizontalDrop: true
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
// Add horizontal drop zone below the current row (between rows or after last row)
|
|
116
|
+
if (rowIndex < widgetRows.length - 1) {
|
|
117
|
+
// Between rows: position above the next row
|
|
118
|
+
const nextRow = widgetRows[rowIndex + 1];
|
|
119
|
+
const nextRowFirstWidgetElement = getWidgetElement(nextRow.widgets[0].uid);
|
|
120
|
+
if (nextRowFirstWidgetElement) {
|
|
121
|
+
const nextRowRect = nextRowFirstWidgetElement.getBoundingClientRect();
|
|
122
|
+
const nextRowTop = nextRowRect.top - containerRect.top;
|
|
123
|
+
gapDropZones.push({
|
|
124
|
+
insertIndex: row.endIndex + 1,
|
|
125
|
+
position: {
|
|
126
|
+
left: 0,
|
|
127
|
+
top: nextRowTop - horizontalDropZoneHeight,
|
|
128
|
+
height: horizontalDropZoneHeight,
|
|
129
|
+
width: containerWidth
|
|
130
|
+
},
|
|
131
|
+
isVisible: true,
|
|
132
|
+
type: 'horizontal',
|
|
133
|
+
isHorizontalDrop: true
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
} else {
|
|
137
|
+
// After the last row: position below the current row
|
|
138
|
+
const lastRowRect = rowInfo.lastRect;
|
|
139
|
+
const lastRowBottom = lastRowRect.bottom - containerRect.top;
|
|
140
|
+
gapDropZones.push({
|
|
141
|
+
insertIndex: filteredWidgets.length,
|
|
142
|
+
position: {
|
|
143
|
+
left: 0,
|
|
144
|
+
top: lastRowBottom,
|
|
145
|
+
height: horizontalDropZoneHeight,
|
|
146
|
+
width: containerWidth
|
|
147
|
+
},
|
|
148
|
+
isVisible: true,
|
|
149
|
+
type: 'horizontal',
|
|
150
|
+
isHorizontalDrop: true
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return gapDropZones;
|
|
154
|
+
};
|
|
155
|
+
const GapDropZoneManager = ({ filteredWidgets, columnWidths, draggedWidgetId, moveWidget })=>{
|
|
156
|
+
const [positions, setPositions] = React.useState([]);
|
|
157
|
+
// Calculate widget rows
|
|
158
|
+
const widgetRows = React.useMemo(()=>{
|
|
159
|
+
return calculateWidgetRows(filteredWidgets, columnWidths);
|
|
160
|
+
}, [
|
|
161
|
+
filteredWidgets,
|
|
162
|
+
columnWidths
|
|
163
|
+
]);
|
|
164
|
+
// Main function to calculate GapDropZone positions
|
|
165
|
+
const calculateGapDropZonePositions = React.useCallback(()=>{
|
|
166
|
+
const gapDropZones = [];
|
|
167
|
+
// Find which row the dragged widget is from
|
|
168
|
+
const draggedWidgetRow = draggedWidgetId ? widgetRows.find((row)=>row.widgets.some((widget)=>widget.uid === draggedWidgetId)) : null;
|
|
169
|
+
widgetRows.forEach((row, rowIndex)=>{
|
|
170
|
+
const rowInfo = getRowInfo(row);
|
|
171
|
+
if (!rowInfo) return;
|
|
172
|
+
const widgetCount = row.widgets.length;
|
|
173
|
+
// Determine if we should show vertical drop zones for this row
|
|
174
|
+
const isDraggingFromThisRow = draggedWidgetRow && draggedWidgetRow === row;
|
|
175
|
+
const isDraggingFromAnotherRow = draggedWidgetRow && draggedWidgetRow !== row;
|
|
176
|
+
const canAcceptMoreWidgets = widgetCount < 3;
|
|
177
|
+
const shouldShowVerticalDropZones = isDraggingFromThisRow || isDraggingFromAnotherRow && canAcceptMoreWidgets;
|
|
178
|
+
// Add vertical drop zones based on widget count
|
|
179
|
+
if (shouldShowVerticalDropZones) {
|
|
180
|
+
const verticalDropZones = addVerticalDropZones(row, rowInfo, rowIndex);
|
|
181
|
+
gapDropZones.push(...verticalDropZones);
|
|
182
|
+
}
|
|
183
|
+
// Add horizontal drop zones
|
|
184
|
+
const horizontalDropZones = addHorizontalDropZones(row, rowIndex, rowInfo, widgetRows, filteredWidgets);
|
|
185
|
+
gapDropZones.push(...horizontalDropZones);
|
|
186
|
+
});
|
|
187
|
+
return gapDropZones;
|
|
188
|
+
}, [
|
|
189
|
+
widgetRows,
|
|
190
|
+
draggedWidgetId,
|
|
191
|
+
filteredWidgets
|
|
192
|
+
]);
|
|
193
|
+
React.useLayoutEffect(()=>{
|
|
194
|
+
const updatePositions = ()=>{
|
|
195
|
+
const newPositions = calculateGapDropZonePositions();
|
|
196
|
+
setPositions(newPositions);
|
|
197
|
+
};
|
|
198
|
+
updatePositions();
|
|
199
|
+
// Update positions on container resize using ResizeObserver
|
|
200
|
+
const containerElement = getWidgetGridContainer();
|
|
201
|
+
if (!containerElement) return;
|
|
202
|
+
const resizeObserver = new ResizeObserver(()=>{
|
|
203
|
+
updatePositions();
|
|
204
|
+
});
|
|
205
|
+
resizeObserver.observe(containerElement);
|
|
206
|
+
return ()=>{
|
|
207
|
+
resizeObserver.disconnect();
|
|
208
|
+
};
|
|
209
|
+
}, [
|
|
210
|
+
calculateGapDropZonePositions
|
|
211
|
+
]);
|
|
212
|
+
return positions.map((gapDropZone)=>/*#__PURE__*/ jsx(GapDropZone, {
|
|
213
|
+
insertIndex: gapDropZone.insertIndex,
|
|
214
|
+
position: gapDropZone.position,
|
|
215
|
+
isVisible: gapDropZone.isVisible,
|
|
216
|
+
type: gapDropZone.type,
|
|
217
|
+
moveWidget: moveWidget,
|
|
218
|
+
targetRowIndex: gapDropZone.targetRowIndex
|
|
219
|
+
}, `gap-drop-zone-${gapDropZone.type}-${gapDropZone.insertIndex}-${gapDropZone.targetRowIndex ?? 'no-row'}`));
|
|
220
|
+
};
|
|
221
|
+
const GapDropZoneContainer = styled(Box)`
|
|
222
|
+
background-color: ${({ $isOver, theme })=>$isOver ? `${theme.colors.primary100}` : 'transparent'};
|
|
223
|
+
border: ${({ $isOver, theme })=>$isOver ? `2px solid ${theme.colors.primary500}` : '2px solid transparent'};
|
|
224
|
+
opacity: ${({ $isOver })=>$isOver ? 1 : 0.6};
|
|
225
|
+
transition: all 0.2s ease-in-out;
|
|
226
|
+
cursor: pointer;
|
|
227
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
228
|
+
display: flex;
|
|
229
|
+
align-items: center;
|
|
230
|
+
justify-content: center;
|
|
231
|
+
position: absolute;
|
|
232
|
+
top: 0;
|
|
233
|
+
bottom: 0;
|
|
234
|
+
width: ${DROP_ZONE_SIZE}px;
|
|
235
|
+
z-index: 1;
|
|
236
|
+
`;
|
|
237
|
+
const GapDropZone = ({ insertIndex, position, isVisible, type, moveWidget, targetRowIndex })=>{
|
|
238
|
+
const isHorizontalDrop = type === 'horizontal';
|
|
239
|
+
const [{ isOver }, drop] = useDrop(()=>({
|
|
240
|
+
accept: 'widget',
|
|
241
|
+
drop: (item)=>{
|
|
242
|
+
moveWidget(item.id, insertIndex, targetRowIndex, isHorizontalDrop);
|
|
243
|
+
},
|
|
244
|
+
collect: (monitor)=>({
|
|
245
|
+
isOver: monitor.isOver()
|
|
246
|
+
})
|
|
247
|
+
}), [
|
|
248
|
+
insertIndex,
|
|
249
|
+
isHorizontalDrop,
|
|
250
|
+
moveWidget,
|
|
251
|
+
targetRowIndex
|
|
252
|
+
]);
|
|
253
|
+
if (!isVisible) {
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
return /*#__PURE__*/ jsx(GapDropZoneContainer, {
|
|
257
|
+
ref: drop,
|
|
258
|
+
$isOver: isOver,
|
|
259
|
+
style: {
|
|
260
|
+
transform: `translate(${position.left}px, ${position.top}px)`,
|
|
261
|
+
height: `${position.height}px`,
|
|
262
|
+
width: `${position.width}px`
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
export { DROP_ZONE_SIZE, GapDropZoneManager, addHorizontalDropZones, addVerticalDropZones };
|
|
268
|
+
//# sourceMappingURL=GapDropZone.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GapDropZone.mjs","sources":["../../../../../admin/src/components/GapDropZone.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box } from '@strapi/design-system';\n// TODO: use @dnd-kit/core instead\nimport { useDrop } from 'react-dnd';\nimport { styled } from 'styled-components';\n\nimport {\n calculateWidgetRows,\n type WidgetRow,\n getWidgetElement,\n getWidgetGridContainer,\n} from '../utils/widgetLayout';\n\nimport type { WidgetWithUID } from '../core/apis/Widgets';\n\nexport const DROP_ZONE_SIZE = 20;\n\nexport interface GapDropZonePosition {\n insertIndex: number;\n position: { left: number; top: number; height: number; width: number };\n isVisible: boolean;\n type: 'vertical' | 'horizontal';\n isHorizontalDrop?: boolean;\n targetRowIndex?: number;\n}\n\ninterface GapDropZoneManagerProps {\n filteredWidgets: WidgetWithUID[];\n columnWidths: Record<string, number>;\n draggedWidgetId?: string;\n moveWidget: (id: string, to: number, targetRowIndex?: number, isHorizontalDrop?: boolean) => void;\n}\n\nconst getRowInfo = (row: WidgetRow) => {\n const firstWidgetElement = getWidgetElement(row.widgets[0].uid);\n const lastWidgetElement = getWidgetElement(row.widgets[row.widgets.length - 1].uid);\n const containerElement = getWidgetGridContainer();\n\n if (!firstWidgetElement || !lastWidgetElement || !containerElement) {\n return null;\n }\n\n const firstRect = firstWidgetElement.getBoundingClientRect();\n const lastRect = lastWidgetElement.getBoundingClientRect();\n const containerRect = containerElement.getBoundingClientRect();\n\n return {\n firstWidgetElement,\n lastWidgetElement,\n containerElement,\n firstRect,\n lastRect,\n containerRect,\n rowHeight: Math.max(firstRect.height, lastRect.height),\n rowTop: firstRect.top - containerRect.top,\n };\n};\n\nexport const addVerticalDropZones = (\n row: WidgetRow,\n rowInfo: ReturnType<typeof getRowInfo>,\n rowIndex: number\n): GapDropZonePosition[] => {\n if (!rowInfo) return [];\n\n const { containerRect, rowTop, rowHeight } = rowInfo;\n const widgetCount = row.widgets.length;\n\n // Get widget positions relative to container\n const widgetPositions = row.widgets\n .map((widget) => {\n const element = getWidgetElement(widget.uid);\n if (!element) return null;\n\n const rect = element.getBoundingClientRect();\n return {\n left: rect.left - containerRect.left,\n width: rect.width,\n };\n })\n .filter((pos): pos is NonNullable<typeof pos> => pos !== null);\n\n if (widgetPositions.length !== widgetCount) return [];\n\n const gapDropZones: GapDropZonePosition[] = [];\n\n // Always add drop zone before the first widget\n gapDropZones.push({\n insertIndex: row.startIndex,\n position: {\n left: widgetPositions[0].left - DROP_ZONE_SIZE,\n top: rowTop,\n height: rowHeight,\n width: DROP_ZONE_SIZE,\n },\n isVisible: true,\n type: 'vertical',\n targetRowIndex: rowIndex,\n });\n\n // Add drop zones between widgets\n widgetPositions.slice(0, -1).forEach((currentWidget, i) => {\n gapDropZones.push({\n insertIndex: row.startIndex + i + 1,\n position: {\n left: currentWidget.left + currentWidget.width,\n top: rowTop,\n height: rowHeight,\n width: DROP_ZONE_SIZE,\n },\n isVisible: true,\n type: 'vertical',\n targetRowIndex: rowIndex,\n });\n });\n\n // Always add drop zone after the last widget\n const lastWidget = widgetPositions[widgetCount - 1];\n gapDropZones.push({\n insertIndex: row.endIndex + 1,\n position: {\n left: lastWidget.left + lastWidget.width,\n top: rowTop,\n height: rowHeight,\n width: DROP_ZONE_SIZE,\n },\n isVisible: true,\n type: 'vertical',\n targetRowIndex: rowIndex,\n });\n\n return gapDropZones;\n};\n\nexport const addHorizontalDropZones = (\n row: WidgetRow,\n rowIndex: number,\n rowInfo: ReturnType<typeof getRowInfo>,\n widgetRows: WidgetRow[],\n filteredWidgets: WidgetWithUID[]\n): GapDropZonePosition[] => {\n if (!rowInfo) return [];\n\n // Don't show horizontal drop zones if there's only one row with one widget\n if (widgetRows.length === 1 && row.widgets.length === 1) return [];\n\n const { containerRect } = rowInfo;\n const containerWidth = containerRect.width;\n const horizontalDropZoneHeight = DROP_ZONE_SIZE;\n\n const gapDropZones: GapDropZonePosition[] = [];\n\n // Add horizontal drop zone above the first row\n if (rowIndex === 0) {\n const firstRowRect = rowInfo.firstRect;\n const firstRowTop = firstRowRect.top - containerRect.top;\n\n gapDropZones.push({\n insertIndex: 0,\n position: {\n left: 0,\n top: firstRowTop - horizontalDropZoneHeight,\n height: horizontalDropZoneHeight,\n width: containerWidth,\n },\n isVisible: true,\n type: 'horizontal',\n isHorizontalDrop: true,\n });\n }\n\n // Add horizontal drop zone below the current row (between rows or after last row)\n if (rowIndex < widgetRows.length - 1) {\n // Between rows: position above the next row\n const nextRow = widgetRows[rowIndex + 1];\n const nextRowFirstWidgetElement = getWidgetElement(nextRow.widgets[0].uid);\n\n if (nextRowFirstWidgetElement) {\n const nextRowRect = nextRowFirstWidgetElement.getBoundingClientRect();\n const nextRowTop = nextRowRect.top - containerRect.top;\n\n gapDropZones.push({\n insertIndex: row.endIndex + 1,\n position: {\n left: 0,\n top: nextRowTop - horizontalDropZoneHeight,\n height: horizontalDropZoneHeight,\n width: containerWidth,\n },\n isVisible: true,\n type: 'horizontal',\n isHorizontalDrop: true,\n });\n }\n } else {\n // After the last row: position below the current row\n const lastRowRect = rowInfo.lastRect;\n const lastRowBottom = lastRowRect.bottom - containerRect.top;\n\n gapDropZones.push({\n insertIndex: filteredWidgets.length,\n position: {\n left: 0,\n top: lastRowBottom,\n height: horizontalDropZoneHeight,\n width: containerWidth,\n },\n isVisible: true,\n type: 'horizontal',\n isHorizontalDrop: true,\n });\n }\n\n return gapDropZones;\n};\n\nexport const GapDropZoneManager = ({\n filteredWidgets,\n columnWidths,\n draggedWidgetId,\n moveWidget,\n}: GapDropZoneManagerProps) => {\n const [positions, setPositions] = React.useState<GapDropZonePosition[]>([]);\n\n // Calculate widget rows\n const widgetRows = React.useMemo(() => {\n return calculateWidgetRows(filteredWidgets, columnWidths);\n }, [filteredWidgets, columnWidths]);\n\n // Main function to calculate GapDropZone positions\n const calculateGapDropZonePositions = React.useCallback(() => {\n const gapDropZones: GapDropZonePosition[] = [];\n\n // Find which row the dragged widget is from\n const draggedWidgetRow = draggedWidgetId\n ? widgetRows.find((row) => row.widgets.some((widget) => widget.uid === draggedWidgetId))\n : null;\n\n widgetRows.forEach((row, rowIndex) => {\n const rowInfo = getRowInfo(row);\n if (!rowInfo) return;\n\n const widgetCount = row.widgets.length;\n\n // Determine if we should show vertical drop zones for this row\n const isDraggingFromThisRow = draggedWidgetRow && draggedWidgetRow === row;\n const isDraggingFromAnotherRow = draggedWidgetRow && draggedWidgetRow !== row;\n const canAcceptMoreWidgets = widgetCount < 3;\n\n const shouldShowVerticalDropZones =\n isDraggingFromThisRow || (isDraggingFromAnotherRow && canAcceptMoreWidgets);\n\n // Add vertical drop zones based on widget count\n if (shouldShowVerticalDropZones) {\n const verticalDropZones = addVerticalDropZones(row, rowInfo, rowIndex);\n gapDropZones.push(...verticalDropZones);\n }\n\n // Add horizontal drop zones\n const horizontalDropZones = addHorizontalDropZones(\n row,\n rowIndex,\n rowInfo,\n widgetRows,\n filteredWidgets\n );\n gapDropZones.push(...horizontalDropZones);\n });\n\n return gapDropZones;\n }, [widgetRows, draggedWidgetId, filteredWidgets]);\n\n React.useLayoutEffect(() => {\n const updatePositions = () => {\n const newPositions = calculateGapDropZonePositions();\n setPositions(newPositions);\n };\n\n updatePositions();\n\n // Update positions on container resize using ResizeObserver\n const containerElement = getWidgetGridContainer();\n if (!containerElement) return;\n\n const resizeObserver = new ResizeObserver(() => {\n updatePositions();\n });\n\n resizeObserver.observe(containerElement);\n\n return () => {\n resizeObserver.disconnect();\n };\n }, [calculateGapDropZonePositions]);\n\n return positions.map((gapDropZone) => (\n <GapDropZone\n key={`gap-drop-zone-${gapDropZone.type}-${gapDropZone.insertIndex}-${gapDropZone.targetRowIndex ?? 'no-row'}`}\n insertIndex={gapDropZone.insertIndex}\n position={gapDropZone.position}\n isVisible={gapDropZone.isVisible}\n type={gapDropZone.type}\n moveWidget={moveWidget}\n targetRowIndex={gapDropZone.targetRowIndex}\n />\n ));\n};\n\ninterface GapDropZoneProps {\n insertIndex: number;\n position: { left: number; top: number; height: number; width: number };\n isVisible: boolean;\n type: 'vertical' | 'horizontal';\n moveWidget: (id: string, to: number, targetRowIndex?: number, isHorizontalDrop?: boolean) => void;\n targetRowIndex?: number;\n}\n\nconst GapDropZoneContainer = styled(Box)<{\n $isOver: boolean;\n}>`\n background-color: ${({ $isOver, theme }) =>\n $isOver ? `${theme.colors.primary100}` : 'transparent'};\n border: ${({ $isOver, theme }) =>\n $isOver ? `2px solid ${theme.colors.primary500}` : '2px solid transparent'};\n opacity: ${({ $isOver }) => ($isOver ? 1 : 0.6)};\n transition: all 0.2s ease-in-out;\n cursor: pointer;\n border-radius: ${({ theme }) => theme.borderRadius};\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 0;\n bottom: 0;\n width: ${DROP_ZONE_SIZE}px;\n z-index: 1;\n`;\n\nconst GapDropZone = ({\n insertIndex,\n position,\n isVisible,\n type,\n moveWidget,\n targetRowIndex,\n}: GapDropZoneProps) => {\n const isHorizontalDrop = type === 'horizontal';\n\n const [{ isOver }, drop] = useDrop(\n () => ({\n accept: 'widget',\n drop: (item: { id: string }) => {\n moveWidget(item.id, insertIndex, targetRowIndex, isHorizontalDrop);\n },\n collect: (monitor) => ({\n isOver: monitor.isOver(),\n }),\n }),\n [insertIndex, isHorizontalDrop, moveWidget, targetRowIndex]\n );\n\n if (!isVisible) {\n return null;\n }\n\n return (\n <GapDropZoneContainer\n ref={drop}\n $isOver={isOver}\n style={{\n transform: `translate(${position.left}px, ${position.top}px)`,\n height: `${position.height}px`,\n width: `${position.width}px`,\n }}\n />\n );\n};\n"],"names":["DROP_ZONE_SIZE","getRowInfo","row","firstWidgetElement","getWidgetElement","widgets","uid","lastWidgetElement","length","containerElement","getWidgetGridContainer","firstRect","getBoundingClientRect","lastRect","containerRect","rowHeight","Math","max","height","rowTop","top","addVerticalDropZones","rowInfo","rowIndex","widgetCount","widgetPositions","map","widget","element","rect","left","width","filter","pos","gapDropZones","push","insertIndex","startIndex","position","isVisible","type","targetRowIndex","slice","forEach","currentWidget","i","lastWidget","endIndex","addHorizontalDropZones","widgetRows","filteredWidgets","containerWidth","horizontalDropZoneHeight","firstRowRect","firstRowTop","isHorizontalDrop","nextRow","nextRowFirstWidgetElement","nextRowRect","nextRowTop","lastRowRect","lastRowBottom","bottom","GapDropZoneManager","columnWidths","draggedWidgetId","moveWidget","positions","setPositions","React","useState","useMemo","calculateWidgetRows","calculateGapDropZonePositions","useCallback","draggedWidgetRow","find","some","isDraggingFromThisRow","isDraggingFromAnotherRow","canAcceptMoreWidgets","shouldShowVerticalDropZones","verticalDropZones","horizontalDropZones","useLayoutEffect","updatePositions","newPositions","resizeObserver","ResizeObserver","observe","disconnect","gapDropZone","_jsx","GapDropZone","GapDropZoneContainer","styled","Box","$isOver","theme","colors","primary100","primary500","borderRadius","isOver","drop","useDrop","accept","item","id","collect","monitor","ref","style","transform"],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ var jsxRuntime = require('react/jsx-runtime');
|
|
|
4
4
|
var React = require('react');
|
|
5
5
|
var immer = require('immer');
|
|
6
6
|
var Tracking = require('../../features/Tracking.js');
|
|
7
|
+
var useMediaQuery = require('../../hooks/useMediaQuery.js');
|
|
7
8
|
var usePersistentState = require('../../hooks/usePersistentState.js');
|
|
8
9
|
var Context = require('../Context.js');
|
|
9
10
|
var Tours = require('./Tours.js');
|
|
@@ -75,6 +76,9 @@ function reducer(state, action) {
|
|
|
75
76
|
if (action.type === 'skip_all_tours') {
|
|
76
77
|
draft.enabled = false;
|
|
77
78
|
}
|
|
79
|
+
if (action.type === 'set_hidden') {
|
|
80
|
+
draft.hidden = action.payload;
|
|
81
|
+
}
|
|
78
82
|
if (action.type === 'reset_all_tours') {
|
|
79
83
|
draft.enabled = true;
|
|
80
84
|
draft.tours = getInitialTourState(Tours.tours);
|
|
@@ -96,14 +100,25 @@ function reducer(state, action) {
|
|
|
96
100
|
}
|
|
97
101
|
const STORAGE_KEY = 'STRAPI_GUIDED_TOUR';
|
|
98
102
|
const GuidedTourContext = ({ children, enabled = true })=>{
|
|
103
|
+
const isDesktop = useMediaQuery.useIsDesktop();
|
|
99
104
|
const { trackUsage } = Tracking.useTracking();
|
|
100
105
|
const [storedTours, setStoredTours] = usePersistentState.usePersistentState(STORAGE_KEY, {
|
|
101
106
|
tours: getInitialTourState(Tours.tours),
|
|
102
107
|
enabled,
|
|
108
|
+
hidden: !isDesktop,
|
|
103
109
|
completedActions: []
|
|
104
110
|
});
|
|
105
111
|
const migratedTourState = migrations.migrateTours(storedTours);
|
|
106
112
|
const [state, dispatch] = React__namespace.useReducer(reducer, migratedTourState);
|
|
113
|
+
// Watch for changes to enabled prop to update state
|
|
114
|
+
React__namespace.useEffect(()=>{
|
|
115
|
+
dispatch({
|
|
116
|
+
type: 'set_hidden',
|
|
117
|
+
payload: !isDesktop
|
|
118
|
+
});
|
|
119
|
+
}, [
|
|
120
|
+
isDesktop
|
|
121
|
+
]);
|
|
107
122
|
// Sync local storage
|
|
108
123
|
React__namespace.useEffect(()=>{
|
|
109
124
|
setStoredTours(state);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Context.js","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { useTracking } from '../../features/Tracking';\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\nimport { migrateTours } from './utils/migrations';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\n/**\n * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS\n * (ie didCreateContentTypeSchema | didCreateContent etc...)\n */\ntype ValueOf<T> = T[keyof T];\ntype NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;\nexport type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'previous_step';\n payload: ValidTourName;\n }\n | {\n type: 'go_to_step';\n payload: {\n tourName: ValidTourName;\n step: number;\n };\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n }\n | {\n type: 'set_completed_actions';\n payload: CompletedActions;\n }\n | {\n type: 'remove_completed_action';\n payload: ValueOf<CompletedActions>;\n }\n | {\n type: 'set_tour_type';\n payload: {\n tourName: ValidTourName;\n tourType: 'ContentTypeBuilderAI' | 'ContentTypeBuilderNoAI';\n };\n };\n\ntype TourState = Record<\n ValidTourName,\n { currentStep: number; isCompleted: boolean; tourType?: string }\n>;\ntype State = {\n tours: TourState;\n enabled: boolean;\n completedActions: CompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n isCompleted: false,\n tourType: undefined,\n };\n\n return acc;\n }, {} as TourState);\n};\n\nconst getCompletedTours = (tours: TourState): ValidTourName[] => {\n return Object.keys(tours).filter(\n (tourName) => tours[tourName as ValidTourName].isCompleted\n ) as ValidTourName[];\n};\n\nconst areAllToursCompleted = (tours: TourState) => Object.values(tours).every((t) => t.isCompleted);\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n const tourLength = guidedTours[action.payload]._meta.totalStepCount;\n\n const nextStep = currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep >= tourLength;\n }\n\n if (action.type === 'previous_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n\n if (currentStep <= 0) return;\n\n const previousStep = currentStep - 1;\n draft.tours[action.payload].currentStep = previousStep;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'remove_completed_action') {\n draft.completedActions = draft.completedActions.filter(\n (completedAction) => completedAction !== action.payload\n );\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n\n if (action.type === 'go_to_step') {\n draft.tours[action.payload.tourName].currentStep = action.payload.step;\n }\n\n if (action.type === 'set_tour_type') {\n const { tourName, tourType } = action.payload;\n const currentTour = draft.tours[tourName];\n\n // If tour type changes and tour is not completed, reset to step 0\n if (currentTour.tourType && currentTour.tourType !== tourType && !currentTour.isCompleted) {\n currentTour.currentStep = 0;\n }\n\n currentTour.tourType = tourType;\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const { trackUsage } = useTracking();\n const [storedTours, setStoredTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n completedActions: [],\n });\n const migratedTourState = migrateTours(storedTours);\n const [state, dispatch] = React.useReducer(reducer, migratedTourState);\n\n // Sync local storage\n React.useEffect(() => {\n setStoredTours(state);\n }, [state, setStoredTours]);\n\n // Derive all completed tours from state\n const currentAllCompletedState = areAllToursCompleted(state.tours);\n // Store completed state in ref to survive a re-render,\n // when current state changes this will persist and be used for comparison\n const previousAllCompletedStateRef = React.useRef(currentAllCompletedState);\n React.useEffect(() => {\n const previousAllCompletedState = previousAllCompletedStateRef.current;\n // When the previous state was not complete but the current state is now complete, fire the event\n if (!previousAllCompletedState && currentAllCompletedState) {\n trackUsage('didCompleteGuidedTour', { name: 'all' });\n }\n\n // When the current state has all tours completed so will the previous state, the tracking event won't fire again\n previousAllCompletedStateRef.current = currentAllCompletedState;\n }, [currentAllCompletedState, trackUsage]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer, getCompletedTours };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","currentStep","isCompleted","tourType","undefined","getCompletedTours","filter","areAllToursCompleted","values","every","t","reducer","state","action","produce","draft","type","payload","tourLength","guidedTours","_meta","totalStepCount","nextStep","previousStep","completedActions","Set","completedAction","enabled","step","currentTour","STORAGE_KEY","GuidedTourContext","children","trackUsage","useTracking","storedTours","setStoredTours","usePersistentState","migratedTourState","migrateTours","dispatch","React","useReducer","useEffect","currentAllCompletedState","previousAllCompletedStateRef","useRef","previousAllCompletedState","current","name","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Context.js","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { useTracking } from '../../features/Tracking';\nimport { useIsDesktop } from '../../hooks/useMediaQuery';\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\nimport { migrateTours } from './utils/migrations';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\n/**\n * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS\n * (ie didCreateContentTypeSchema | didCreateContent etc...)\n */\ntype ValueOf<T> = T[keyof T];\ntype NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;\nexport type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'previous_step';\n payload: ValidTourName;\n }\n | {\n type: 'go_to_step';\n payload: {\n tourName: ValidTourName;\n step: number;\n };\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n }\n | {\n type: 'set_completed_actions';\n payload: CompletedActions;\n }\n | {\n type: 'remove_completed_action';\n payload: ValueOf<CompletedActions>;\n }\n | {\n type: 'set_tour_type';\n payload: {\n tourName: ValidTourName;\n tourType: 'ContentTypeBuilderAI' | 'ContentTypeBuilderNoAI';\n };\n }\n | {\n type: 'set_hidden';\n payload: boolean;\n };\n\ntype TourState = Record<\n ValidTourName,\n { currentStep: number; isCompleted: boolean; tourType?: string }\n>;\ntype State = {\n tours: TourState;\n enabled: boolean;\n hidden?: boolean;\n completedActions: CompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n isCompleted: false,\n tourType: undefined,\n };\n\n return acc;\n }, {} as TourState);\n};\n\nconst getCompletedTours = (tours: TourState): ValidTourName[] => {\n return Object.keys(tours).filter(\n (tourName) => tours[tourName as ValidTourName].isCompleted\n ) as ValidTourName[];\n};\n\nconst areAllToursCompleted = (tours: TourState) => Object.values(tours).every((t) => t.isCompleted);\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n const tourLength = guidedTours[action.payload]._meta.totalStepCount;\n\n const nextStep = currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep >= tourLength;\n }\n\n if (action.type === 'previous_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n\n if (currentStep <= 0) return;\n\n const previousStep = currentStep - 1;\n draft.tours[action.payload].currentStep = previousStep;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'remove_completed_action') {\n draft.completedActions = draft.completedActions.filter(\n (completedAction) => completedAction !== action.payload\n );\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'set_hidden') {\n draft.hidden = action.payload;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n\n if (action.type === 'go_to_step') {\n draft.tours[action.payload.tourName].currentStep = action.payload.step;\n }\n\n if (action.type === 'set_tour_type') {\n const { tourName, tourType } = action.payload;\n const currentTour = draft.tours[tourName];\n\n // If tour type changes and tour is not completed, reset to step 0\n if (currentTour.tourType && currentTour.tourType !== tourType && !currentTour.isCompleted) {\n currentTour.currentStep = 0;\n }\n\n currentTour.tourType = tourType;\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const isDesktop = useIsDesktop();\n const { trackUsage } = useTracking();\n const [storedTours, setStoredTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n hidden: !isDesktop,\n completedActions: [],\n });\n const migratedTourState = migrateTours(storedTours);\n const [state, dispatch] = React.useReducer(reducer, migratedTourState);\n\n // Watch for changes to enabled prop to update state\n React.useEffect(() => {\n dispatch({ type: 'set_hidden', payload: !isDesktop });\n }, [isDesktop]);\n\n // Sync local storage\n React.useEffect(() => {\n setStoredTours(state);\n }, [state, setStoredTours]);\n\n // Derive all completed tours from state\n const currentAllCompletedState = areAllToursCompleted(state.tours);\n // Store completed state in ref to survive a re-render,\n // when current state changes this will persist and be used for comparison\n const previousAllCompletedStateRef = React.useRef(currentAllCompletedState);\n React.useEffect(() => {\n const previousAllCompletedState = previousAllCompletedStateRef.current;\n // When the previous state was not complete but the current state is now complete, fire the event\n if (!previousAllCompletedState && currentAllCompletedState) {\n trackUsage('didCompleteGuidedTour', { name: 'all' });\n }\n\n // When the current state has all tours completed so will the previous state, the tracking event won't fire again\n previousAllCompletedStateRef.current = currentAllCompletedState;\n }, [currentAllCompletedState, trackUsage]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer, getCompletedTours };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","currentStep","isCompleted","tourType","undefined","getCompletedTours","filter","areAllToursCompleted","values","every","t","reducer","state","action","produce","draft","type","payload","tourLength","guidedTours","_meta","totalStepCount","nextStep","previousStep","completedActions","Set","completedAction","enabled","hidden","step","currentTour","STORAGE_KEY","GuidedTourContext","children","isDesktop","useIsDesktop","trackUsage","useTracking","storedTours","setStoredTours","usePersistentState","migratedTourState","migrateTours","dispatch","React","useReducer","useEffect","currentAllCompletedState","previousAllCompletedStateRef","useRef","previousAllCompletedState","current","name","_jsx"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { produce } from 'immer';
|
|
4
4
|
import { useTracking } from '../../features/Tracking.mjs';
|
|
5
|
+
import { useIsDesktop } from '../../hooks/useMediaQuery.mjs';
|
|
5
6
|
import { usePersistentState } from '../../hooks/usePersistentState.mjs';
|
|
6
7
|
import { createContext } from '../Context.mjs';
|
|
7
8
|
import { tours } from './Tours.mjs';
|
|
@@ -54,6 +55,9 @@ function reducer(state, action) {
|
|
|
54
55
|
if (action.type === 'skip_all_tours') {
|
|
55
56
|
draft.enabled = false;
|
|
56
57
|
}
|
|
58
|
+
if (action.type === 'set_hidden') {
|
|
59
|
+
draft.hidden = action.payload;
|
|
60
|
+
}
|
|
57
61
|
if (action.type === 'reset_all_tours') {
|
|
58
62
|
draft.enabled = true;
|
|
59
63
|
draft.tours = getInitialTourState(tours);
|
|
@@ -75,14 +79,25 @@ function reducer(state, action) {
|
|
|
75
79
|
}
|
|
76
80
|
const STORAGE_KEY = 'STRAPI_GUIDED_TOUR';
|
|
77
81
|
const GuidedTourContext = ({ children, enabled = true })=>{
|
|
82
|
+
const isDesktop = useIsDesktop();
|
|
78
83
|
const { trackUsage } = useTracking();
|
|
79
84
|
const [storedTours, setStoredTours] = usePersistentState(STORAGE_KEY, {
|
|
80
85
|
tours: getInitialTourState(tours),
|
|
81
86
|
enabled,
|
|
87
|
+
hidden: !isDesktop,
|
|
82
88
|
completedActions: []
|
|
83
89
|
});
|
|
84
90
|
const migratedTourState = migrateTours(storedTours);
|
|
85
91
|
const [state, dispatch] = React.useReducer(reducer, migratedTourState);
|
|
92
|
+
// Watch for changes to enabled prop to update state
|
|
93
|
+
React.useEffect(()=>{
|
|
94
|
+
dispatch({
|
|
95
|
+
type: 'set_hidden',
|
|
96
|
+
payload: !isDesktop
|
|
97
|
+
});
|
|
98
|
+
}, [
|
|
99
|
+
isDesktop
|
|
100
|
+
]);
|
|
86
101
|
// Sync local storage
|
|
87
102
|
React.useEffect(()=>{
|
|
88
103
|
setStoredTours(state);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Context.mjs","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { useTracking } from '../../features/Tracking';\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\nimport { migrateTours } from './utils/migrations';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\n/**\n * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS\n * (ie didCreateContentTypeSchema | didCreateContent etc...)\n */\ntype ValueOf<T> = T[keyof T];\ntype NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;\nexport type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'previous_step';\n payload: ValidTourName;\n }\n | {\n type: 'go_to_step';\n payload: {\n tourName: ValidTourName;\n step: number;\n };\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n }\n | {\n type: 'set_completed_actions';\n payload: CompletedActions;\n }\n | {\n type: 'remove_completed_action';\n payload: ValueOf<CompletedActions>;\n }\n | {\n type: 'set_tour_type';\n payload: {\n tourName: ValidTourName;\n tourType: 'ContentTypeBuilderAI' | 'ContentTypeBuilderNoAI';\n };\n };\n\ntype TourState = Record<\n ValidTourName,\n { currentStep: number; isCompleted: boolean; tourType?: string }\n>;\ntype State = {\n tours: TourState;\n enabled: boolean;\n completedActions: CompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n isCompleted: false,\n tourType: undefined,\n };\n\n return acc;\n }, {} as TourState);\n};\n\nconst getCompletedTours = (tours: TourState): ValidTourName[] => {\n return Object.keys(tours).filter(\n (tourName) => tours[tourName as ValidTourName].isCompleted\n ) as ValidTourName[];\n};\n\nconst areAllToursCompleted = (tours: TourState) => Object.values(tours).every((t) => t.isCompleted);\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n const tourLength = guidedTours[action.payload]._meta.totalStepCount;\n\n const nextStep = currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep >= tourLength;\n }\n\n if (action.type === 'previous_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n\n if (currentStep <= 0) return;\n\n const previousStep = currentStep - 1;\n draft.tours[action.payload].currentStep = previousStep;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'remove_completed_action') {\n draft.completedActions = draft.completedActions.filter(\n (completedAction) => completedAction !== action.payload\n );\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n\n if (action.type === 'go_to_step') {\n draft.tours[action.payload.tourName].currentStep = action.payload.step;\n }\n\n if (action.type === 'set_tour_type') {\n const { tourName, tourType } = action.payload;\n const currentTour = draft.tours[tourName];\n\n // If tour type changes and tour is not completed, reset to step 0\n if (currentTour.tourType && currentTour.tourType !== tourType && !currentTour.isCompleted) {\n currentTour.currentStep = 0;\n }\n\n currentTour.tourType = tourType;\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const { trackUsage } = useTracking();\n const [storedTours, setStoredTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n completedActions: [],\n });\n const migratedTourState = migrateTours(storedTours);\n const [state, dispatch] = React.useReducer(reducer, migratedTourState);\n\n // Sync local storage\n React.useEffect(() => {\n setStoredTours(state);\n }, [state, setStoredTours]);\n\n // Derive all completed tours from state\n const currentAllCompletedState = areAllToursCompleted(state.tours);\n // Store completed state in ref to survive a re-render,\n // when current state changes this will persist and be used for comparison\n const previousAllCompletedStateRef = React.useRef(currentAllCompletedState);\n React.useEffect(() => {\n const previousAllCompletedState = previousAllCompletedStateRef.current;\n // When the previous state was not complete but the current state is now complete, fire the event\n if (!previousAllCompletedState && currentAllCompletedState) {\n trackUsage('didCompleteGuidedTour', { name: 'all' });\n }\n\n // When the current state has all tours completed so will the previous state, the tracking event won't fire again\n previousAllCompletedStateRef.current = currentAllCompletedState;\n }, [currentAllCompletedState, trackUsage]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer, getCompletedTours };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","currentStep","isCompleted","tourType","undefined","getCompletedTours","filter","areAllToursCompleted","values","every","t","reducer","state","action","produce","draft","type","payload","tourLength","guidedTours","_meta","totalStepCount","nextStep","previousStep","completedActions","Set","completedAction","enabled","step","currentTour","STORAGE_KEY","GuidedTourContext","children","trackUsage","useTracking","storedTours","setStoredTours","usePersistentState","migratedTourState","migrateTours","dispatch","React","useReducer","useEffect","currentAllCompletedState","previousAllCompletedStateRef","useRef","previousAllCompletedState","current","name","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Context.mjs","sources":["../../../../../../admin/src/components/GuidedTour/Context.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { produce } from 'immer';\n\nimport { useTracking } from '../../features/Tracking';\nimport { useIsDesktop } from '../../hooks/useMediaQuery';\nimport { usePersistentState } from '../../hooks/usePersistentState';\nimport { createContext } from '../Context';\n\nimport { type Tours, tours as guidedTours } from './Tours';\nimport { GUIDED_TOUR_REQUIRED_ACTIONS } from './utils/constants';\nimport { migrateTours } from './utils/migrations';\n\n/* -------------------------------------------------------------------------------------------------\n * GuidedTourProvider\n * -----------------------------------------------------------------------------------------------*/\n\ntype ValidTourName = keyof Tours;\n\n/**\n * Derive the union of all string literal values from GUIDED_TOUR_REQUIRED_ACTIONS\n * (ie didCreateContentTypeSchema | didCreateContent etc...)\n */\ntype ValueOf<T> = T[keyof T];\ntype NonEmptyValueOf<T> = T extends Record<string, never> ? never : ValueOf<T>;\nexport type CompletedActions = NonEmptyValueOf<ValueOf<typeof GUIDED_TOUR_REQUIRED_ACTIONS>>[];\n\ntype Action =\n | {\n type: 'next_step';\n payload: ValidTourName;\n }\n | {\n type: 'previous_step';\n payload: ValidTourName;\n }\n | {\n type: 'go_to_step';\n payload: {\n tourName: ValidTourName;\n step: number;\n };\n }\n | {\n type: 'skip_tour';\n payload: ValidTourName;\n }\n | {\n type: 'skip_all_tours';\n }\n | {\n type: 'reset_all_tours';\n }\n | {\n type: 'set_completed_actions';\n payload: CompletedActions;\n }\n | {\n type: 'remove_completed_action';\n payload: ValueOf<CompletedActions>;\n }\n | {\n type: 'set_tour_type';\n payload: {\n tourName: ValidTourName;\n tourType: 'ContentTypeBuilderAI' | 'ContentTypeBuilderNoAI';\n };\n }\n | {\n type: 'set_hidden';\n payload: boolean;\n };\n\ntype TourState = Record<\n ValidTourName,\n { currentStep: number; isCompleted: boolean; tourType?: string }\n>;\ntype State = {\n tours: TourState;\n enabled: boolean;\n hidden?: boolean;\n completedActions: CompletedActions;\n};\n\nconst [GuidedTourProviderImpl, useGuidedTour] = createContext<{\n state: State;\n dispatch: React.Dispatch<Action>;\n}>('GuidedTour');\n\nconst getInitialTourState = (tours: Tours) => {\n return Object.keys(tours).reduce((acc, tourName) => {\n acc[tourName as ValidTourName] = {\n currentStep: 0,\n isCompleted: false,\n tourType: undefined,\n };\n\n return acc;\n }, {} as TourState);\n};\n\nconst getCompletedTours = (tours: TourState): ValidTourName[] => {\n return Object.keys(tours).filter(\n (tourName) => tours[tourName as ValidTourName].isCompleted\n ) as ValidTourName[];\n};\n\nconst areAllToursCompleted = (tours: TourState) => Object.values(tours).every((t) => t.isCompleted);\n\nfunction reducer(state: State, action: Action): State {\n return produce(state, (draft) => {\n if (action.type === 'next_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n const tourLength = guidedTours[action.payload]._meta.totalStepCount;\n\n const nextStep = currentStep + 1;\n draft.tours[action.payload].currentStep = nextStep;\n draft.tours[action.payload].isCompleted = nextStep >= tourLength;\n }\n\n if (action.type === 'previous_step') {\n const currentStep = draft.tours[action.payload].currentStep;\n\n if (currentStep <= 0) return;\n\n const previousStep = currentStep - 1;\n draft.tours[action.payload].currentStep = previousStep;\n }\n\n if (action.type === 'skip_tour') {\n draft.tours[action.payload].isCompleted = true;\n }\n\n if (action.type === 'set_completed_actions') {\n draft.completedActions = [...new Set([...draft.completedActions, ...action.payload])];\n }\n\n if (action.type === 'remove_completed_action') {\n draft.completedActions = draft.completedActions.filter(\n (completedAction) => completedAction !== action.payload\n );\n }\n\n if (action.type === 'skip_all_tours') {\n draft.enabled = false;\n }\n\n if (action.type === 'set_hidden') {\n draft.hidden = action.payload;\n }\n\n if (action.type === 'reset_all_tours') {\n draft.enabled = true;\n draft.tours = getInitialTourState(guidedTours);\n draft.completedActions = [];\n }\n\n if (action.type === 'go_to_step') {\n draft.tours[action.payload.tourName].currentStep = action.payload.step;\n }\n\n if (action.type === 'set_tour_type') {\n const { tourName, tourType } = action.payload;\n const currentTour = draft.tours[tourName];\n\n // If tour type changes and tour is not completed, reset to step 0\n if (currentTour.tourType && currentTour.tourType !== tourType && !currentTour.isCompleted) {\n currentTour.currentStep = 0;\n }\n\n currentTour.tourType = tourType;\n }\n });\n}\n\nconst STORAGE_KEY = 'STRAPI_GUIDED_TOUR';\nconst GuidedTourContext = ({\n children,\n enabled = true,\n}: {\n children: React.ReactNode;\n enabled?: boolean;\n}) => {\n const isDesktop = useIsDesktop();\n const { trackUsage } = useTracking();\n const [storedTours, setStoredTours] = usePersistentState<State>(STORAGE_KEY, {\n tours: getInitialTourState(guidedTours),\n enabled,\n hidden: !isDesktop,\n completedActions: [],\n });\n const migratedTourState = migrateTours(storedTours);\n const [state, dispatch] = React.useReducer(reducer, migratedTourState);\n\n // Watch for changes to enabled prop to update state\n React.useEffect(() => {\n dispatch({ type: 'set_hidden', payload: !isDesktop });\n }, [isDesktop]);\n\n // Sync local storage\n React.useEffect(() => {\n setStoredTours(state);\n }, [state, setStoredTours]);\n\n // Derive all completed tours from state\n const currentAllCompletedState = areAllToursCompleted(state.tours);\n // Store completed state in ref to survive a re-render,\n // when current state changes this will persist and be used for comparison\n const previousAllCompletedStateRef = React.useRef(currentAllCompletedState);\n React.useEffect(() => {\n const previousAllCompletedState = previousAllCompletedStateRef.current;\n // When the previous state was not complete but the current state is now complete, fire the event\n if (!previousAllCompletedState && currentAllCompletedState) {\n trackUsage('didCompleteGuidedTour', { name: 'all' });\n }\n\n // When the current state has all tours completed so will the previous state, the tracking event won't fire again\n previousAllCompletedStateRef.current = currentAllCompletedState;\n }, [currentAllCompletedState, trackUsage]);\n\n return (\n <GuidedTourProviderImpl state={state} dispatch={dispatch}>\n {children}\n </GuidedTourProviderImpl>\n );\n};\n\nexport type { Action, State, ValidTourName };\nexport { GuidedTourContext, useGuidedTour, reducer, getCompletedTours };\n"],"names":["GuidedTourProviderImpl","useGuidedTour","createContext","getInitialTourState","tours","Object","keys","reduce","acc","tourName","currentStep","isCompleted","tourType","undefined","getCompletedTours","filter","areAllToursCompleted","values","every","t","reducer","state","action","produce","draft","type","payload","tourLength","guidedTours","_meta","totalStepCount","nextStep","previousStep","completedActions","Set","completedAction","enabled","hidden","step","currentTour","STORAGE_KEY","GuidedTourContext","children","isDesktop","useIsDesktop","trackUsage","useTracking","storedTours","setStoredTours","usePersistentState","migratedTourState","migrateTours","dispatch","React","useReducer","useEffect","currentAllCompletedState","previousAllCompletedStateRef","useRef","previousAllCompletedState","current","name","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var Context = require('./Context.js');
|
|
5
|
+
|
|
6
|
+
const GuidedTourProvider = ({ children })=>{
|
|
7
|
+
const isGuidedTourEnabled = process.env.NODE_ENV !== 'test';
|
|
8
|
+
return /*#__PURE__*/ jsxRuntime.jsx(Context.GuidedTourContext, {
|
|
9
|
+
enabled: isGuidedTourEnabled,
|
|
10
|
+
children: children
|
|
11
|
+
});
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
exports.GuidedTourProvider = GuidedTourProvider;
|
|
15
|
+
//# sourceMappingURL=GuidedTourProvider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GuidedTourProvider.js","sources":["../../../../../../admin/src/components/GuidedTour/GuidedTourProvider.tsx"],"sourcesContent":["import { GuidedTourContext } from './Context';\n\ninterface GuidedTourProviderProps {\n children: React.ReactNode;\n}\n\nexport const GuidedTourProvider = ({ children }: GuidedTourProviderProps) => {\n const isGuidedTourEnabled = process.env.NODE_ENV !== 'test';\n\n return <GuidedTourContext enabled={isGuidedTourEnabled}>{children}</GuidedTourContext>;\n};\n"],"names":["GuidedTourProvider","children","isGuidedTourEnabled","process","env","NODE_ENV","_jsx","GuidedTourContext","enabled"],"mappings":";;;;;AAMaA,MAAAA,kBAAAA,GAAqB,CAAC,EAAEC,QAAQ,EAA2B,GAAA;AACtE,IAAA,MAAMC,mBAAsBC,GAAAA,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,MAAA;AAErD,IAAA,qBAAOC,cAACC,CAAAA,yBAAAA,EAAAA;QAAkBC,OAASN,EAAAA,mBAAAA;AAAsBD,QAAAA,QAAAA,EAAAA;;AAC3D;;;;"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { GuidedTourContext } from './Context.mjs';
|
|
3
|
+
|
|
4
|
+
const GuidedTourProvider = ({ children })=>{
|
|
5
|
+
const isGuidedTourEnabled = process.env.NODE_ENV !== 'test';
|
|
6
|
+
return /*#__PURE__*/ jsx(GuidedTourContext, {
|
|
7
|
+
enabled: isGuidedTourEnabled,
|
|
8
|
+
children: children
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { GuidedTourProvider };
|
|
13
|
+
//# sourceMappingURL=GuidedTourProvider.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GuidedTourProvider.mjs","sources":["../../../../../../admin/src/components/GuidedTour/GuidedTourProvider.tsx"],"sourcesContent":["import { GuidedTourContext } from './Context';\n\ninterface GuidedTourProviderProps {\n children: React.ReactNode;\n}\n\nexport const GuidedTourProvider = ({ children }: GuidedTourProviderProps) => {\n const isGuidedTourEnabled = process.env.NODE_ENV !== 'test';\n\n return <GuidedTourContext enabled={isGuidedTourEnabled}>{children}</GuidedTourContext>;\n};\n"],"names":["GuidedTourProvider","children","isGuidedTourEnabled","process","env","NODE_ENV","_jsx","GuidedTourContext","enabled"],"mappings":";;;AAMaA,MAAAA,kBAAAA,GAAqB,CAAC,EAAEC,QAAQ,EAA2B,GAAA;AACtE,IAAA,MAAMC,mBAAsBC,GAAAA,OAAAA,CAAQC,GAAG,CAACC,QAAQ,KAAK,MAAA;AAErD,IAAA,qBAAOC,GAACC,CAAAA,iBAAAA,EAAAA;QAAkBC,OAASN,EAAAA,mBAAAA;AAAsBD,QAAAA,QAAAA,EAAAA;;AAC3D;;;;"}
|