@strapi/admin 4.14.5 → 4.15.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.
Files changed (226) hide show
  1. package/admin/src/StrapiApp.js +13 -12
  2. package/admin/src/components/AuthenticatedApp.tsx +187 -0
  3. package/admin/src/components/ConfigurationProvider.tsx +2 -1
  4. package/admin/src/components/GuidedTour/Homepage.tsx +111 -0
  5. package/admin/src/components/GuidedTour/Modal.tsx +303 -0
  6. package/admin/src/components/GuidedTour/Ornaments.tsx +74 -0
  7. package/admin/src/components/GuidedTour/Provider.tsx +253 -0
  8. package/admin/src/components/GuidedTour/{layout.js → constants.ts} +13 -3
  9. package/admin/src/components/LanguageProvider.tsx +1 -0
  10. package/admin/src/components/Providers.tsx +125 -0
  11. package/admin/src/components/RBACProvider.tsx +124 -0
  12. package/admin/src/components/Theme.tsx +4 -2
  13. package/admin/src/components/ThemeToggleProvider.tsx +23 -9
  14. package/admin/src/components/__mocks__/{LanguageProvider.js → LanguageProvider.ts} +2 -0
  15. package/admin/src/{constants.js → constants.ts} +48 -0
  16. package/admin/src/content-manager/components/BlocksEditor/Toolbar/index.js +75 -51
  17. package/admin/src/content-manager/components/BlocksEditor/hooks/useBlocksStore.js +72 -14
  18. package/admin/src/content-manager/pages/App/selectors.js +1 -1
  19. package/admin/src/content-manager/pages/App/useContentManagerInitData.js +3 -1
  20. package/admin/src/content-manager/pages/EditView/selectors.js +1 -1
  21. package/admin/src/content-manager/pages/EditViewLayoutManager/index.js +3 -1
  22. package/admin/src/content-manager/pages/ListView/components/Body/index.js +53 -56
  23. package/admin/src/content-manager/pages/ListView/components/BulkActionButtons/SelectedEntriesModal/index.js +5 -3
  24. package/admin/src/content-manager/pages/ListView/components/TableRows/index.js +1 -1
  25. package/admin/src/content-manager/pages/ListView/index.js +33 -50
  26. package/admin/src/content-manager/pages/ListView/selectors.js +1 -1
  27. package/admin/src/contexts/admin.ts +1 -0
  28. package/admin/src/contexts/apiTokenPermissions.tsx +64 -0
  29. package/admin/src/contexts/themeToggle.ts +3 -1
  30. package/admin/src/core/store/configure.ts +91 -0
  31. package/admin/src/core/store/hooks.ts +15 -0
  32. package/admin/src/hooks/index.js +0 -1
  33. package/admin/src/hooks/{useContentTypes/useContentTypes.js → useContentTypes.ts} +39 -16
  34. package/admin/src/hooks/useSettingsForm/index.js +14 -2
  35. package/admin/src/hooks/useSettingsMenu/constants.js +39 -0
  36. package/admin/src/index.js +2 -4
  37. package/admin/src/layouts/{AppLayout/index.js → AppLayout.tsx} +7 -10
  38. package/admin/src/layouts/UnauthenticatedLayout.tsx +77 -0
  39. package/admin/src/pages/Admin/index.js +11 -5
  40. package/admin/src/pages/App/index.js +7 -4
  41. package/admin/src/pages/App/selectors.js +1 -1
  42. package/admin/src/pages/AuthPage/components/ForgotPassword/index.js +2 -1
  43. package/admin/src/pages/AuthPage/components/ForgotPasswordSuccess/index.js +2 -1
  44. package/admin/src/pages/AuthPage/components/Login/index.js +1 -1
  45. package/admin/src/pages/AuthPage/components/Oops/index.js +2 -1
  46. package/admin/src/pages/AuthPage/components/Register/index.js +1 -1
  47. package/admin/src/pages/AuthPage/components/ResetPassword/index.js +2 -1
  48. package/admin/src/pages/AuthPage/index.js +2 -3
  49. package/admin/src/pages/HomePage/index.js +6 -3
  50. package/admin/src/pages/{InternalErrorPage/index.js → InternalErrorPage.tsx} +10 -6
  51. package/admin/src/pages/{NotFoundPage/index.js → NotFoundPage.tsx} +9 -7
  52. package/admin/src/pages/ProfilePage/components/Preferences/index.js +23 -9
  53. package/admin/src/pages/ProfilePage/index.js +1 -1
  54. package/admin/src/pages/SettingsPage/components/SettingsNav/index.js +20 -0
  55. package/admin/src/pages/SettingsPage/constants.js +33 -0
  56. package/admin/src/pages/SettingsPage/index.js +2 -2
  57. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ActionBoundRoutes/index.js +1 -1
  58. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js +1 -1
  59. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Permissions/index.js +1 -1
  60. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js +2 -2
  61. package/admin/src/pages/SettingsPage/pages/AuditLogs/SalesPage.js +50 -0
  62. package/admin/src/pages/SettingsPage/pages/ReviewWorkflows/SalesPage.js +53 -0
  63. package/admin/src/pages/SettingsPage/pages/SingleSignOn/SalesPage.js +53 -0
  64. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/index.js +1 -1
  65. package/admin/src/pages/SettingsPage/pages/Users/EditPage/index.js +2 -1
  66. package/admin/src/pages/SettingsPage/pages/Users/ListPage/DynamicTable/TableRows/index.js +1 -1
  67. package/admin/src/pages/{UseCasePage/index.js → UseCasePage.tsx} +10 -12
  68. package/admin/src/translations/en.json +5 -0
  69. package/admin/src/utils/createRoute.tsx +54 -0
  70. package/admin/src/utils/formatAPIErrors.ts +18 -0
  71. package/admin/src/utils/getFullName.ts +3 -0
  72. package/admin/src/utils/{uniqueAdminHash.js → hashAdminUserEmail.ts} +6 -3
  73. package/admin/src/utils/makeUniqueRoutes.ts +11 -0
  74. package/build/{1049.9236e785.chunk.js → 1049.ecc10c97.chunk.js} +1 -1
  75. package/build/1217.96155682.chunk.js +35 -0
  76. package/build/{1227.e0f7447b.chunk.js → 1227.947ceaf9.chunk.js} +1 -1
  77. package/build/1306.2699df52.chunk.js +79 -0
  78. package/build/{1386.07f2bbb3.chunk.js → 1386.eabd8a1e.chunk.js} +1 -1
  79. package/build/{2379.b0bc4013.chunk.js → 2379.7ce8e110.chunk.js} +1 -1
  80. package/build/{2395.d37b1025.chunk.js → 2395.acb961a8.chunk.js} +3 -3
  81. package/build/{2801.12522720.chunk.js → 2801.4711ea5a.chunk.js} +1 -1
  82. package/build/{3019.0d74d080.chunk.js → 3019.fde2e1be.chunk.js} +2 -2
  83. package/build/3460.8644e608.chunk.js +146 -0
  84. package/build/{3483.8f1b25f8.chunk.js → 3483.db8c1520.chunk.js} +1 -1
  85. package/build/{4174.2c4f958e.chunk.js → 4174.49cedb6a.chunk.js} +1 -1
  86. package/build/4732.149f5f8f.chunk.js +1 -0
  87. package/build/{502.b845473a.chunk.js → 502.f536f78b.chunk.js} +1 -1
  88. package/build/{7464.91341b4f.chunk.js → 7464.579564ac.chunk.js} +1 -1
  89. package/build/7811.fdbe09af.chunk.js +103 -0
  90. package/build/{7897.dffa5ad5.chunk.js → 7897.63ba0a00.chunk.js} +1 -1
  91. package/build/{8276.e9698944.chunk.js → 8276.9abe4679.chunk.js} +3 -3
  92. package/build/8773.ee67141c.chunk.js +48 -0
  93. package/build/9077.2cc01ac8.chunk.js +105 -0
  94. package/build/{9218.306ad178.chunk.js → 9218.b2d367f8.chunk.js} +1 -1
  95. package/build/Admin-authenticatedApp.059dc48f.chunk.js +79 -0
  96. package/build/Admin_InternalErrorPage.06eeef20.chunk.js +1 -0
  97. package/build/Admin_homePage.56b9eb3f.chunk.js +81 -0
  98. package/build/{Admin_marketplace.0db78604.chunk.js → Admin_marketplace.d693a435.chunk.js} +1 -1
  99. package/build/{Admin_pluginsPage.1083f7f0.chunk.js → Admin_pluginsPage.ae2c872a.chunk.js} +1 -1
  100. package/build/Admin_profilePage.89099d5b.chunk.js +13 -0
  101. package/build/Admin_settingsPage.88c45586.chunk.js +12 -0
  102. package/build/{Upload_ConfigureTheView.3cfeb108.chunk.js → Upload_ConfigureTheView.44f28145.chunk.js} +1 -1
  103. package/build/admin-app.990e112f.chunk.js +69 -0
  104. package/build/{admin-edit-roles-page.556fac52.chunk.js → admin-edit-roles-page.4e1eb4a9.chunk.js} +3 -3
  105. package/build/admin-edit-users.5b91404e.chunk.js +10 -0
  106. package/build/{admin-roles-list.15918328.chunk.js → admin-roles-list.89dd94fe.chunk.js} +1 -1
  107. package/build/{admin-users.74fddc87.chunk.js → admin-users.7be4fc5f.chunk.js} +2 -2
  108. package/build/{api-tokens-create-page.c08ae118.chunk.js → api-tokens-create-page.571920e5.chunk.js} +1 -1
  109. package/build/{api-tokens-edit-page.ce18efdc.chunk.js → api-tokens-edit-page.cbdc81b1.chunk.js} +1 -1
  110. package/build/{api-tokens-list-page.783b7569.chunk.js → api-tokens-list-page.de0c49e8.chunk.js} +2 -2
  111. package/build/audit-logs-sales-page.2955db88.chunk.js +1 -0
  112. package/build/{audit-logs-settings-page.12aeea8c.chunk.js → audit-logs-settings-page.b0cb5164.chunk.js} +1 -1
  113. package/build/content-manager.de7ae330.chunk.js +1241 -0
  114. package/build/{content-type-builder-list-view.38ed3935.chunk.js → content-type-builder-list-view.6c8d3213.chunk.js} +1 -1
  115. package/build/{content-type-builder-translation-en-json.43f9d7bc.chunk.js → content-type-builder-translation-en-json.74d80f18.chunk.js} +1 -1
  116. package/build/{content-type-builder.758a9d23.chunk.js → content-type-builder.0bc97051.chunk.js} +13 -23
  117. package/build/{email-settings-page.e08a587e.chunk.js → email-settings-page.07712efc.chunk.js} +1 -1
  118. package/build/en-json.5b907f67.chunk.js +1 -0
  119. package/build/{i18n-settings-page.3186e3e9.chunk.js → i18n-settings-page.5c34f012.chunk.js} +1 -1
  120. package/build/index.html +1 -1
  121. package/build/main.f84563f1.js +2665 -0
  122. package/build/review-workflows-sales-page.f46a8f00.chunk.js +1 -0
  123. package/build/{review-workflows-settings-create-view.5cdc4d64.chunk.js → review-workflows-settings-create-view.d0544fb0.chunk.js} +1 -1
  124. package/build/{review-workflows-settings-edit-view.53bf7865.chunk.js → review-workflows-settings-edit-view.aabf49ef.chunk.js} +1 -1
  125. package/build/review-workflows-settings-list-view.8b0525ab.chunk.js +56 -0
  126. package/build/runtime~main.270fd45f.js +2 -0
  127. package/build/sso-sales-page.ef22e469.chunk.js +1 -0
  128. package/build/sso-settings-page.21e16ae4.chunk.js +1 -0
  129. package/build/{transfer-tokens-create-page.2662d519.chunk.js → transfer-tokens-create-page.3366204d.chunk.js} +1 -1
  130. package/build/{transfer-tokens-edit-page.f64d8d8c.chunk.js → transfer-tokens-edit-page.15cf0f73.chunk.js} +1 -1
  131. package/build/{transfer-tokens-list-page.e6fd5f87.chunk.js → transfer-tokens-list-page.0bc0e682.chunk.js} +2 -2
  132. package/build/{upload-settings.450a1de0.chunk.js → upload-settings.1319dca0.chunk.js} +1 -1
  133. package/build/{upload.0d53e7a3.chunk.js → upload.1ced11be.chunk.js} +1 -1
  134. package/build/{users-advanced-settings-page.4a1f1f6d.chunk.js → users-advanced-settings-page.8e657084.chunk.js} +1 -1
  135. package/build/{users-email-settings-page.ea81fe82.chunk.js → users-email-settings-page.e57745e5.chunk.js} +1 -1
  136. package/build/{users-providers-settings-page.10280cdb.chunk.js → users-providers-settings-page.55796d13.chunk.js} +1 -1
  137. package/build/{users-roles-settings-page.4a7158be.chunk.js → users-roles-settings-page.57079245.chunk.js} +1 -1
  138. package/build/webhook-edit-page.3a28b2e7.chunk.js +33 -0
  139. package/build/{webhook-list-page.f57285ca.chunk.js → webhook-list-page.ee80767b.chunk.js} +1 -1
  140. package/ee/admin/pages/AuthPage/components/Login/index.js +1 -1
  141. package/ee/admin/pages/AuthPage/components/Providers/index.js +2 -1
  142. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/selectors.js +1 -1
  143. package/ee/server/bootstrap.js +1 -1
  144. package/ee/server/controllers/admin.js +1 -1
  145. package/ee/server/controllers/user.js +1 -1
  146. package/ee/server/destroy.js +1 -1
  147. package/ee/server/register.js +1 -1
  148. package/ee/server/routes/utils.js +1 -1
  149. package/ee/server/services/audit-logs.js +1 -1
  150. package/ee/server/services/passport/sso.js +1 -1
  151. package/ee/server/services/passport.js +1 -1
  152. package/ee/server/services/seat-enforcement.js +1 -1
  153. package/ee/server/utils/sso-lock.js +1 -1
  154. package/ee/server/validation/role.js +1 -1
  155. package/ee/server/validation/user.js +1 -1
  156. package/package.json +15 -16
  157. package/server/controllers/admin.js +1 -1
  158. package/shared/entities.ts +1 -1
  159. package/shared/permissions.ts +35 -35
  160. package/shared/schema.ts +9 -0
  161. package/admin/src/components/AuthenticatedApp/index.js +0 -116
  162. package/admin/src/components/AuthenticatedApp/utils/api.js +0 -47
  163. package/admin/src/components/AuthenticatedApp/utils/checkLatestStrapiVersion.ts +0 -13
  164. package/admin/src/components/AuthenticatedApp/utils/fetchStrapiLatestRelease.ts +0 -19
  165. package/admin/src/components/GuidedTour/Homepage/components/Step.js +0 -61
  166. package/admin/src/components/GuidedTour/Homepage/components/Stepper.js +0 -61
  167. package/admin/src/components/GuidedTour/Homepage/index.js +0 -71
  168. package/admin/src/components/GuidedTour/Modal/components/Content.js +0 -66
  169. package/admin/src/components/GuidedTour/Modal/components/Modal.js +0 -72
  170. package/admin/src/components/GuidedTour/Modal/components/StepNumberWithPadding.js +0 -26
  171. package/admin/src/components/GuidedTour/Modal/components/Stepper.js +0 -118
  172. package/admin/src/components/GuidedTour/Modal/index.js +0 -94
  173. package/admin/src/components/GuidedTour/Modal/reducer.js +0 -29
  174. package/admin/src/components/GuidedTour/Stepper/StepLine.js +0 -29
  175. package/admin/src/components/GuidedTour/Stepper/StepNumber.js +0 -71
  176. package/admin/src/components/GuidedTour/constants.js +0 -3
  177. package/admin/src/components/GuidedTour/index.js +0 -102
  178. package/admin/src/components/GuidedTour/init.js +0 -37
  179. package/admin/src/components/GuidedTour/reducer.js +0 -50
  180. package/admin/src/components/GuidedTour/utils/arePreviousSectionsDone.js +0 -13
  181. package/admin/src/components/GuidedTour/utils/arePreviousStepsDone.js +0 -12
  182. package/admin/src/components/GuidedTour/utils/isGuidedTourCompleted.js +0 -6
  183. package/admin/src/components/GuidedTour/utils/persistStateToLocaleStorage.js +0 -34
  184. package/admin/src/components/Providers/index.js +0 -156
  185. package/admin/src/components/RBACProvider/actions.js +0 -10
  186. package/admin/src/components/RBACProvider/constants.js +0 -2
  187. package/admin/src/components/RBACProvider/index.js +0 -39
  188. package/admin/src/components/RBACProvider/reducer.js +0 -51
  189. package/admin/src/contexts/ApiTokenPermissions/index.js +0 -25
  190. package/admin/src/core/store/configureStore.js +0 -47
  191. package/admin/src/exposedHooks.js +0 -27
  192. package/admin/src/hooks/useContentTypes/index.js +0 -1
  193. package/admin/src/injectionZones.js +0 -25
  194. package/admin/src/layouts/UnauthenticatedLayout/LocaleToggle/index.js +0 -29
  195. package/admin/src/layouts/UnauthenticatedLayout/index.js +0 -55
  196. package/admin/src/reducers.js +0 -23
  197. package/admin/src/utils/checkFormValidity.js +0 -15
  198. package/admin/src/utils/createRoute.js +0 -50
  199. package/admin/src/utils/formatAPIErrors.js +0 -17
  200. package/admin/src/utils/getAttributesToDisplay.js +0 -19
  201. package/admin/src/utils/getExistingActions.js +0 -32
  202. package/admin/src/utils/getFullName.js +0 -9
  203. package/admin/src/utils/index.js +0 -9
  204. package/admin/src/utils/makeUniqueRoutes.js +0 -6
  205. package/admin/src/utils/sortLinks.js +0 -5
  206. package/build/1222.fe92c653.chunk.js +0 -35
  207. package/build/2225.a2147b8f.chunk.js +0 -79
  208. package/build/3021.33ad47fb.chunk.js +0 -103
  209. package/build/6373.1a21d665.chunk.js +0 -105
  210. package/build/8894.5ca4852a.chunk.js +0 -26
  211. package/build/9302.550cf5b7.chunk.js +0 -146
  212. package/build/Admin-authenticatedApp.e897fccb.chunk.js +0 -79
  213. package/build/Admin_InternalErrorPage.e2431a95.chunk.js +0 -1
  214. package/build/Admin_homePage.71ef8d06.chunk.js +0 -81
  215. package/build/Admin_profilePage.61704b7d.chunk.js +0 -13
  216. package/build/Admin_settingsPage.39cb9fca.chunk.js +0 -111
  217. package/build/admin-app.06f5e70a.chunk.js +0 -69
  218. package/build/admin-edit-users.64fd1318.chunk.js +0 -10
  219. package/build/content-manager.2e3f660b.chunk.js +0 -1220
  220. package/build/en-json.bd611a8e.chunk.js +0 -1
  221. package/build/main.00ea6f5a.js +0 -2665
  222. package/build/review-workflows-settings-list-view.b4a8aefb.chunk.js +0 -56
  223. package/build/runtime~main.e3bf3980.js +0 -2
  224. package/build/sso-settings-page.6a35d473.chunk.js +0 -1
  225. package/build/webhook-edit-page.65ac30ee.chunk.js +0 -33
  226. /package/admin/src/hooks/{useContentTypes/__mocks__/index.js → __mocks__/useContentTypes.ts} +0 -0
@@ -1,61 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Box, Flex, Typography } from '@strapi/design-system';
4
- import { pxToRem } from '@strapi/helper-plugin';
5
- import PropTypes from 'prop-types';
6
- import { useIntl } from 'react-intl';
7
-
8
- import { IS_ACTIVE, IS_DONE, IS_NOT_DONE } from '../../constants';
9
- import StepLine from '../../Stepper/StepLine';
10
- import StepNumber from '../../Stepper/StepNumber';
11
-
12
- const StepHomepage = ({ type, title, number, content, hasLine }) => {
13
- const { formatMessage } = useIntl();
14
-
15
- return (
16
- <Box>
17
- <Flex>
18
- <Box minWidth={pxToRem(30)} marginRight={5}>
19
- <StepNumber type={type} number={number} />
20
- </Box>
21
- <Typography variant="delta" as="h3">
22
- {formatMessage(title)}
23
- </Typography>
24
- </Flex>
25
- <Flex alignItems="flex-start">
26
- <Flex
27
- justifyContent="center"
28
- minWidth={pxToRem(30)}
29
- marginBottom={3}
30
- marginTop={3}
31
- marginRight={5}
32
- >
33
- {hasLine && (
34
- <StepLine type={type} minHeight={type === IS_ACTIVE ? pxToRem(85) : pxToRem(65)} />
35
- )}
36
- </Flex>
37
- <Box marginTop={2}>{type === IS_ACTIVE && content}</Box>
38
- </Flex>
39
- </Box>
40
- );
41
- };
42
-
43
- StepHomepage.defaultProps = {
44
- content: undefined,
45
- number: undefined,
46
- type: IS_NOT_DONE,
47
- hasLine: true,
48
- };
49
-
50
- StepHomepage.propTypes = {
51
- content: PropTypes.node,
52
- number: PropTypes.number,
53
- title: PropTypes.shape({
54
- id: PropTypes.string,
55
- defaultMessage: PropTypes.string,
56
- }).isRequired,
57
- type: PropTypes.oneOf([IS_ACTIVE, IS_DONE, IS_NOT_DONE]),
58
- hasLine: PropTypes.bool,
59
- };
60
-
61
- export default StepHomepage;
@@ -1,61 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Box } from '@strapi/design-system';
4
- import PropTypes from 'prop-types';
5
-
6
- import { IS_ACTIVE, IS_DONE, IS_NOT_DONE } from '../../constants';
7
-
8
- import StepHomepage from './Step';
9
-
10
- const getType = (activeSectionIndex, index) => {
11
- if (activeSectionIndex === -1) {
12
- return IS_DONE;
13
- }
14
- if (index < activeSectionIndex) {
15
- return IS_DONE;
16
- }
17
- if (index > activeSectionIndex) {
18
- return IS_NOT_DONE;
19
- }
20
-
21
- return IS_ACTIVE;
22
- };
23
-
24
- const StepperHomepage = ({ sections, currentSectionKey }) => {
25
- const activeSectionIndex = sections.findIndex((section) => section.key === currentSectionKey);
26
-
27
- return (
28
- <Box>
29
- {sections.map((section, index) => (
30
- <StepHomepage
31
- key={section.key}
32
- title={section.title}
33
- content={section.content}
34
- number={index + 1}
35
- type={getType(activeSectionIndex, index)}
36
- hasLine={index !== sections.length - 1}
37
- />
38
- ))}
39
- </Box>
40
- );
41
- };
42
-
43
- StepperHomepage.defaultProps = {
44
- currentSectionKey: undefined,
45
- };
46
-
47
- StepperHomepage.propTypes = {
48
- sections: PropTypes.arrayOf(
49
- PropTypes.shape({
50
- key: PropTypes.string.isRequired,
51
- title: PropTypes.shape({
52
- id: PropTypes.string,
53
- defaultMessage: PropTypes.string,
54
- }).isRequired,
55
- content: PropTypes.node,
56
- })
57
- ).isRequired,
58
- currentSectionKey: PropTypes.string,
59
- };
60
-
61
- export default StepperHomepage;
@@ -1,71 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Box, Button, Flex, Typography } from '@strapi/design-system';
4
- import { LinkButton, useGuidedTour, useTracking } from '@strapi/helper-plugin';
5
- import { ArrowRight } from '@strapi/icons';
6
- import { useIntl } from 'react-intl';
7
-
8
- import layout from '../layout';
9
-
10
- import StepperHomepage from './components/Stepper';
11
-
12
- const GuidedTourHomepage = () => {
13
- const { guidedTourState, setSkipped } = useGuidedTour();
14
- const { formatMessage } = useIntl();
15
- const { trackUsage } = useTracking();
16
-
17
- const sections = Object.entries(layout).map(([key, val]) => ({
18
- key,
19
- title: val.home.title,
20
- content: (
21
- <LinkButton
22
- onClick={() => trackUsage(val.home.trackingEvent)}
23
- to={val.home.cta.target}
24
- endIcon={<ArrowRight />}
25
- >
26
- {formatMessage(val.home.cta.title)}
27
- </LinkButton>
28
- ),
29
- }));
30
-
31
- const enrichedSections = sections.map((section) => ({
32
- isDone: Object.entries(guidedTourState[section.key]).every(([, value]) => value),
33
- ...section,
34
- }));
35
-
36
- const activeSection = enrichedSections.find((section) => !section.isDone)?.key;
37
-
38
- const handleSkip = () => {
39
- setSkipped(true);
40
- trackUsage('didSkipGuidedtour');
41
- };
42
-
43
- return (
44
- <Box
45
- hasRadius
46
- shadow="tableShadow"
47
- paddingTop={7}
48
- paddingRight={4}
49
- paddingLeft={7}
50
- paddingBottom={4}
51
- background="neutral0"
52
- >
53
- <Flex direction="column" alignItems="stretch" gap={6}>
54
- <Typography variant="beta" as="h2">
55
- {formatMessage({
56
- id: 'app.components.GuidedTour.title',
57
- defaultMessage: '3 steps to get started',
58
- })}
59
- </Typography>
60
- <StepperHomepage sections={sections} currentSectionKey={activeSection} />
61
- </Flex>
62
- <Flex justifyContent="flex-end">
63
- <Button variant="tertiary" onClick={handleSkip}>
64
- {formatMessage({ id: 'app.components.GuidedTour.skip', defaultMessage: 'Skip the tour' })}
65
- </Button>
66
- </Flex>
67
- </Box>
68
- );
69
- };
70
-
71
- export default GuidedTourHomepage;
@@ -1,66 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Box, Flex, Typography } from '@strapi/design-system';
4
- import PropTypes from 'prop-types';
5
- import { useIntl } from 'react-intl';
6
- import styled from 'styled-components';
7
-
8
- const LiStyled = styled.li`
9
- list-style: disc;
10
- &::marker {
11
- color: ${({ theme }) => theme.colors.neutral800};
12
- }
13
- `;
14
-
15
- const Content = ({ id, defaultMessage }) => {
16
- const { formatMessage } = useIntl();
17
-
18
- return (
19
- <Flex direction="column" alignItems="stretch" gap={4} paddingBottom={6}>
20
- {formatMessage(
21
- { id, defaultMessage },
22
- {
23
- documentationLink: DocumentationLink,
24
- b: Bold,
25
- p: Paragraph,
26
- light: Light,
27
- ul: List,
28
- li: ListItem,
29
- }
30
- )}
31
- </Flex>
32
- );
33
- };
34
-
35
- const DocumentationLink = (children) => (
36
- <Typography
37
- as="a"
38
- textColor="primary600"
39
- target="_blank"
40
- rel="noopener noreferrer"
41
- href="https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#api-parameters"
42
- >
43
- {children}
44
- </Typography>
45
- );
46
-
47
- const Bold = (children) => <Typography fontWeight="semiBold">{children}</Typography>;
48
-
49
- const Paragraph = (children) => <Typography>{children}</Typography>;
50
-
51
- const Light = (children) => <Typography textColor="neutral600">{children}</Typography>;
52
-
53
- const List = (children) => (
54
- <Box paddingLeft={6}>
55
- <ul>{children}</ul>
56
- </Box>
57
- );
58
-
59
- const ListItem = (children) => <LiStyled>{children}</LiStyled>;
60
-
61
- Content.propTypes = {
62
- id: PropTypes.string.isRequired,
63
- defaultMessage: PropTypes.string.isRequired,
64
- };
65
-
66
- export default Content;
@@ -1,72 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Box, Button, Flex, FocusTrap, IconButton, Portal } from '@strapi/design-system';
4
- import { pxToRem } from '@strapi/helper-plugin';
5
- import { Cross } from '@strapi/icons';
6
- import PropTypes from 'prop-types';
7
- import { useIntl } from 'react-intl';
8
- import styled from 'styled-components';
9
-
10
- const ModalWrapper = styled(Flex)`
11
- position: fixed;
12
- z-index: 4;
13
- inset: 0;
14
- /* this is theme.colors.neutral800 with opacity */
15
- background: ${({ theme }) => `${theme.colors.neutral800}1F`};
16
- `;
17
-
18
- const Modal = ({ onClose, onSkip, children, hideSkip }) => {
19
- const { formatMessage } = useIntl();
20
-
21
- return (
22
- <Portal>
23
- <ModalWrapper onClick={onClose} padding={8} justifyContent="center">
24
- <FocusTrap onEscape={onClose}>
25
- <Flex
26
- direction="column"
27
- alignItems="stretch"
28
- background="neutral0"
29
- width={pxToRem(660)}
30
- shadow="popupShadow"
31
- hasRadius
32
- padding={4}
33
- gap={8}
34
- role="dialog"
35
- aria-modal
36
- onClick={(e) => e.stopPropagation()}
37
- >
38
- <Flex justifyContent="flex-end">
39
- <IconButton
40
- onClick={onClose}
41
- aria-label={formatMessage({ id: 'app.utils.close-label', defaultMessage: 'Close' })}
42
- icon={<Cross />}
43
- />
44
- </Flex>
45
- <Box paddingLeft={7} paddingRight={7} paddingBottom={hideSkip ? 8 : 0}>
46
- {children}
47
- </Box>
48
- {!hideSkip && (
49
- <Flex justifyContent="flex-end">
50
- <Button variant="tertiary" onClick={onSkip}>
51
- {formatMessage({
52
- id: 'app.components.GuidedTour.skip',
53
- defaultMessage: 'Skip the tour',
54
- })}
55
- </Button>
56
- </Flex>
57
- )}
58
- </Flex>
59
- </FocusTrap>
60
- </ModalWrapper>
61
- </Portal>
62
- );
63
- };
64
-
65
- Modal.propTypes = {
66
- children: PropTypes.node.isRequired,
67
- onClose: PropTypes.func.isRequired,
68
- onSkip: PropTypes.func.isRequired,
69
- hideSkip: PropTypes.bool.isRequired,
70
- };
71
-
72
- export default Modal;
@@ -1,26 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Box } from '@strapi/design-system';
4
- import PropTypes from 'prop-types';
5
-
6
- import StepNumber from '../../Stepper/StepNumber';
7
-
8
- const StepNumberWithPadding = ({ number, last, type }) => (
9
- <Box paddingTop={3} paddingBottom={last ? 0 : 3}>
10
- <StepNumber number={number} type={type} />
11
- </Box>
12
- );
13
-
14
- StepNumberWithPadding.defaultProps = {
15
- number: undefined,
16
- last: false,
17
- type: '',
18
- };
19
-
20
- StepNumberWithPadding.propTypes = {
21
- number: PropTypes.number,
22
- last: PropTypes.bool,
23
- type: PropTypes.string,
24
- };
25
-
26
- export default StepNumberWithPadding;
@@ -1,118 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Box, Button, Flex, Typography } from '@strapi/design-system';
4
- import { LinkButton, pxToRem } from '@strapi/helper-plugin';
5
- import { ArrowRight } from '@strapi/icons';
6
- import PropTypes from 'prop-types';
7
- import { useIntl } from 'react-intl';
8
-
9
- import { IS_ACTIVE, IS_DONE } from '../../constants';
10
- import StepLine from '../../Stepper/StepLine';
11
-
12
- import Content from './Content';
13
- import StepNumberWithPadding from './StepNumberWithPadding';
14
-
15
- const StepperModal = ({
16
- title,
17
- content,
18
- cta,
19
- onCtaClick,
20
- sectionIndex,
21
- stepIndex,
22
- hasSectionAfter,
23
- }) => {
24
- const { formatMessage } = useIntl();
25
-
26
- const hasSectionBefore = sectionIndex > 0;
27
- const hasStepsBefore = stepIndex > 0;
28
- const nextSectionIndex = sectionIndex + 1;
29
-
30
- return (
31
- <>
32
- <Flex alignItems="stretch">
33
- <Flex marginRight={8} justifyContent="center" minWidth={pxToRem(30)}>
34
- {hasSectionBefore && <StepLine type={IS_DONE} minHeight={pxToRem(24)} />}
35
- </Flex>
36
- <Typography variant="sigma" textColor="primary600">
37
- {formatMessage({
38
- id: 'app.components.GuidedTour.title',
39
- defaultMessage: '3 steps to get started',
40
- })}
41
- </Typography>
42
- </Flex>
43
- <Flex>
44
- <Flex marginRight={8} minWidth={pxToRem(30)}>
45
- <StepNumberWithPadding
46
- number={sectionIndex + 1}
47
- type={hasStepsBefore ? IS_DONE : IS_ACTIVE}
48
- />
49
- </Flex>
50
- <Typography variant="alpha" fontWeight="bold" textColor="neutral800" as="h3" id="title">
51
- {formatMessage(title)}
52
- </Typography>
53
- </Flex>
54
- <Flex alignItems="stretch">
55
- <Flex marginRight={8} direction="column" justifyContent="center" minWidth={pxToRem(30)}>
56
- {hasSectionAfter && (
57
- <>
58
- <StepLine type={IS_DONE} />
59
- {hasStepsBefore && (
60
- <StepNumberWithPadding number={nextSectionIndex + 1} type={IS_ACTIVE} last />
61
- )}
62
- </>
63
- )}
64
- </Flex>
65
- <Box>
66
- <Content {...content} />
67
- {cta &&
68
- (cta.target ? (
69
- <LinkButton endIcon={<ArrowRight />} onClick={onCtaClick} to={cta.target}>
70
- {formatMessage(cta.title)}
71
- </LinkButton>
72
- ) : (
73
- <Button endIcon={<ArrowRight />} onClick={onCtaClick}>
74
- {formatMessage(cta.title)}
75
- </Button>
76
- ))}
77
- </Box>
78
- </Flex>
79
- {hasStepsBefore && hasSectionAfter && (
80
- <Box paddingTop={3}>
81
- <Flex marginRight={8} justifyContent="center" width={pxToRem(30)}>
82
- <StepLine type={IS_DONE} minHeight={pxToRem(24)} />
83
- </Flex>
84
- </Box>
85
- )}
86
- </>
87
- );
88
- };
89
-
90
- StepperModal.defaultProps = {
91
- currentStep: null,
92
- cta: undefined,
93
- };
94
-
95
- StepperModal.propTypes = {
96
- sectionIndex: PropTypes.number.isRequired,
97
- stepIndex: PropTypes.number.isRequired,
98
- hasSectionAfter: PropTypes.bool.isRequired,
99
- content: PropTypes.shape({
100
- id: PropTypes.string.isRequired,
101
- defaultMessage: PropTypes.string.isRequired,
102
- }).isRequired,
103
- cta: PropTypes.shape({
104
- target: PropTypes.string,
105
- title: PropTypes.shape({
106
- id: PropTypes.string.isRequired,
107
- defaultMessage: PropTypes.string.isRequired,
108
- }),
109
- }),
110
- currentStep: PropTypes.string,
111
- onCtaClick: PropTypes.func.isRequired,
112
- title: PropTypes.shape({
113
- id: PropTypes.string.isRequired,
114
- defaultMessage: PropTypes.string.isRequired,
115
- }).isRequired,
116
- };
117
-
118
- export default StepperModal;
@@ -1,94 +0,0 @@
1
- import React, { useEffect, useReducer, useState } from 'react';
2
-
3
- import { useGuidedTour, useTracking } from '@strapi/helper-plugin';
4
- import at from 'lodash/at';
5
-
6
- import layout from '../layout';
7
-
8
- import Modal from './components/Modal';
9
- import StepperModal from './components/Stepper';
10
- import reducer, { initialState } from './reducer';
11
-
12
- const GuidedTourModal = () => {
13
- const {
14
- currentStep,
15
- guidedTourState,
16
- setCurrentStep,
17
- setStepState,
18
- isGuidedTourVisible,
19
- setSkipped,
20
- } = useGuidedTour();
21
- const [isVisible, setIsVisible] = useState(currentStep);
22
- const [{ stepContent, sectionIndex, stepIndex, hasSectionAfter, hasStepAfter }, dispatch] =
23
- useReducer(reducer, initialState);
24
- const { trackUsage } = useTracking();
25
-
26
- useEffect(() => {
27
- if (!currentStep) {
28
- setIsVisible(false);
29
-
30
- return;
31
- }
32
-
33
- const [isStepDone] = at(guidedTourState, currentStep);
34
-
35
- setIsVisible(!isStepDone && isGuidedTourVisible);
36
- }, [currentStep, guidedTourState, isGuidedTourVisible]);
37
-
38
- useEffect(() => {
39
- if (currentStep) {
40
- const [content] = at(layout, currentStep);
41
- const sectionKeys = Object.keys(guidedTourState);
42
- const [sectionName, stepName] = currentStep.split('.');
43
- const newSectionIndex = sectionKeys.indexOf(sectionName);
44
- const newStepIndex = Object.keys(guidedTourState[sectionName]).indexOf(stepName);
45
- const newHasSectionAfter = newSectionIndex < sectionKeys.length - 1;
46
- const newHasStepAfter = newStepIndex < Object.keys(guidedTourState[sectionName]).length - 1;
47
-
48
- dispatch({
49
- type: 'UPDATE_MODAL',
50
- content,
51
- newSectionIndex,
52
- newStepIndex,
53
- newHasSectionAfter,
54
- newHasStepAfter,
55
- });
56
- }
57
- }, [currentStep, guidedTourState]);
58
-
59
- const handleCtaClick = () => {
60
- setStepState(currentStep, true);
61
- trackUsage(stepContent.trackingEvent);
62
-
63
- setCurrentStep(null);
64
- };
65
-
66
- const handleSkip = () => {
67
- setSkipped(true);
68
- setCurrentStep(null);
69
- trackUsage('didSkipGuidedtour');
70
- };
71
-
72
- if (isVisible && stepContent) {
73
- return (
74
- <Modal
75
- hideSkip={!hasStepAfter && !hasSectionAfter}
76
- onSkip={handleSkip}
77
- onClose={handleCtaClick}
78
- >
79
- <StepperModal
80
- {...stepContent}
81
- onCtaClick={handleCtaClick}
82
- currentStep={currentStep}
83
- sectionIndex={sectionIndex}
84
- stepIndex={stepIndex}
85
- hasSectionAfter={hasSectionAfter}
86
- />
87
- </Modal>
88
- );
89
- }
90
-
91
- return null;
92
- };
93
-
94
- export default GuidedTourModal;
@@ -1,29 +0,0 @@
1
- /* eslint-disable consistent-return */
2
- import produce from 'immer';
3
-
4
- export const initialState = {
5
- stepContent: null,
6
- sectionIndex: null,
7
- stepIndex: null,
8
- hasSectionAfter: false,
9
- hasStepAfter: false,
10
- };
11
-
12
- const reducer = (state = initialState, action) =>
13
- produce(state, (draftState) => {
14
- switch (action.type) {
15
- case 'UPDATE_MODAL': {
16
- draftState.stepContent = action.content;
17
- draftState.sectionIndex = action.newSectionIndex;
18
- draftState.stepIndex = action.newStepIndex;
19
- draftState.hasSectionAfter = action.newHasSectionAfter;
20
- draftState.hasStepAfter = action.newHasStepAfter;
21
- break;
22
- }
23
- default: {
24
- return draftState;
25
- }
26
- }
27
- });
28
-
29
- export default reducer;
@@ -1,29 +0,0 @@
1
- import React from 'react';
2
-
3
- import { Box } from '@strapi/design-system';
4
- import { pxToRem } from '@strapi/helper-plugin';
5
- import PropTypes from 'prop-types';
6
-
7
- import { IS_ACTIVE, IS_DONE, IS_NOT_DONE } from '../constants';
8
-
9
- const StepLine = ({ type, ...props }) => {
10
- return (
11
- <Box
12
- width={pxToRem(2)}
13
- height="100%"
14
- background={type === IS_NOT_DONE ? 'neutral300' : 'primary500'}
15
- hasRadius
16
- {...props}
17
- />
18
- );
19
- };
20
-
21
- StepLine.defaultProps = {
22
- type: IS_NOT_DONE,
23
- };
24
-
25
- StepLine.propTypes = {
26
- type: PropTypes.oneOf([IS_ACTIVE, IS_DONE, IS_NOT_DONE]),
27
- };
28
-
29
- export default StepLine;