@strapi/admin 4.15.0-alpha.0 → 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 (472) hide show
  1. package/.eslintrc.js +4 -1
  2. package/admin/.eslintrc.js +28 -0
  3. package/admin/custom.d.ts +28 -0
  4. package/admin/src/StrapiApp.js +27 -28
  5. package/admin/src/components/AuthenticatedApp.tsx +187 -0
  6. package/admin/src/components/ConfigurationProvider.tsx +68 -0
  7. package/admin/src/components/{DragLayer/DragLayer.js → DragLayer.tsx} +18 -10
  8. package/admin/src/components/GuidedTour/Homepage.tsx +111 -0
  9. package/admin/src/components/GuidedTour/Modal.tsx +303 -0
  10. package/admin/src/components/GuidedTour/Ornaments.tsx +74 -0
  11. package/admin/src/components/GuidedTour/Provider.tsx +253 -0
  12. package/admin/src/components/GuidedTour/{layout.js → constants.ts} +13 -3
  13. package/admin/src/components/LanguageProvider.tsx +130 -0
  14. package/admin/src/components/{LeftMenu/index.js → LeftMenu.tsx} +23 -18
  15. package/admin/src/components/{NpsSurvey/index.js → NpsSurvey.tsx} +68 -21
  16. package/admin/src/components/PluginsInitializer.tsx +124 -0
  17. package/admin/src/components/PrivateRoute.tsx +42 -0
  18. package/admin/src/components/Providers.tsx +125 -0
  19. package/admin/src/components/RBACProvider.tsx +124 -0
  20. package/admin/src/components/Theme.tsx +41 -0
  21. package/admin/src/components/ThemeToggleProvider.tsx +64 -0
  22. package/admin/src/components/{UnauthenticatedLogo/index.js → UnauthenticatedLogo.tsx} +3 -5
  23. package/admin/src/components/{LocalesProvider/__mocks__/useLocalesProvider.js → __mocks__/LanguageProvider.ts} +3 -1
  24. package/admin/src/{constants.js → constants.ts} +48 -0
  25. package/admin/src/content-manager/components/BlocksEditor/BlocksInput/index.js +68 -9
  26. package/admin/src/content-manager/components/BlocksEditor/Toolbar/index.js +433 -202
  27. package/admin/src/content-manager/components/BlocksEditor/hooks/useBlocksStore.js +463 -135
  28. package/admin/src/content-manager/components/BlocksEditor/hooks/useModifiersStore.js +23 -6
  29. package/admin/src/content-manager/components/BlocksEditor/index.js +97 -20
  30. package/admin/src/content-manager/components/BlocksEditor/plugins/index.js +4 -0
  31. package/admin/src/content-manager/components/BlocksEditor/plugins/withLinks.js +61 -0
  32. package/admin/src/content-manager/components/BlocksEditor/plugins/withStrapiSchema.js +33 -0
  33. package/admin/src/content-manager/components/BlocksEditor/utils/links.js +90 -0
  34. package/admin/src/content-manager/components/InputUID/index.js +1 -1
  35. package/admin/src/content-manager/hooks/useAllowedAttributes.js +9 -1
  36. package/admin/src/content-manager/pages/App/selectors.js +1 -1
  37. package/admin/src/content-manager/pages/App/useContentManagerInitData.js +3 -1
  38. package/admin/src/content-manager/pages/EditSettingsView/index.js +1 -0
  39. package/admin/src/content-manager/pages/EditSettingsView/utils/createPossibleMainFieldsForModelsAndComponents.js +1 -0
  40. package/admin/src/content-manager/pages/EditView/selectors.js +1 -1
  41. package/admin/src/content-manager/pages/EditViewLayoutManager/index.js +3 -1
  42. package/admin/src/content-manager/pages/ListSettingsView/constants.js +1 -0
  43. package/admin/src/content-manager/pages/ListView/components/Body/index.js +53 -56
  44. package/admin/src/content-manager/pages/ListView/components/BulkActionButtons/SelectedEntriesModal/index.js +5 -3
  45. package/admin/src/content-manager/pages/ListView/components/TableRows/index.js +1 -1
  46. package/admin/src/content-manager/pages/ListView/index.js +35 -51
  47. package/admin/src/content-manager/pages/ListView/selectors.js +1 -1
  48. package/admin/src/content-manager/utils/checkIfAttributeIsDisplayable.js +1 -1
  49. package/admin/src/content-manager/utils/schema.js +2 -2
  50. package/admin/src/contexts/admin.ts +19 -0
  51. package/admin/src/contexts/apiTokenPermissions.tsx +64 -0
  52. package/admin/src/contexts/configuration.ts +25 -0
  53. package/admin/src/contexts/themeToggle.ts +18 -0
  54. package/admin/src/core/store/configure.ts +91 -0
  55. package/admin/src/core/store/hooks.ts +15 -0
  56. package/admin/src/hooks/{useConfigurations/__mocks__/index.js → __mocks__/useConfigurations.ts} +4 -2
  57. package/admin/src/hooks/index.js +0 -8
  58. package/admin/src/hooks/{useAdminRoles/index.js → useAdminRoles.ts} +26 -10
  59. package/admin/src/hooks/useAdminUsers.ts +64 -0
  60. package/admin/src/hooks/useConfiguration.ts +5 -0
  61. package/admin/src/hooks/{useContentTypes/useContentTypes.js → useContentTypes.ts} +39 -16
  62. package/admin/src/hooks/useDebounce.ts +17 -0
  63. package/admin/src/hooks/{useEnterprise/useEnterprise.js → useEnterprise.ts} +15 -5
  64. package/admin/src/hooks/useLicenseLimitNotification.ts +3 -0
  65. package/admin/src/hooks/useMenu.ts +153 -0
  66. package/admin/src/hooks/useSettingsForm/index.js +14 -2
  67. package/admin/src/hooks/useSettingsMenu/constants.js +39 -0
  68. package/admin/src/hooks/useThemeToggle.ts +9 -0
  69. package/admin/src/index.js +7 -6
  70. package/admin/src/layouts/{AppLayout/index.js → AppLayout.tsx} +7 -10
  71. package/admin/src/layouts/UnauthenticatedLayout.tsx +77 -0
  72. package/admin/src/pages/Admin/index.js +15 -8
  73. package/admin/src/pages/App/index.js +13 -8
  74. package/admin/src/pages/App/selectors.js +1 -1
  75. package/admin/src/pages/AuthPage/components/ForgotPassword/index.js +3 -2
  76. package/admin/src/pages/AuthPage/components/ForgotPasswordSuccess/index.js +3 -2
  77. package/admin/src/pages/AuthPage/components/Login/BaseLogin.js +1 -1
  78. package/admin/src/pages/AuthPage/components/Login/index.js +1 -1
  79. package/admin/src/pages/AuthPage/components/Oops/index.js +3 -2
  80. package/admin/src/pages/AuthPage/components/Register/index.js +30 -35
  81. package/admin/src/pages/AuthPage/components/ResetPassword/index.js +3 -2
  82. package/admin/src/pages/AuthPage/index.js +4 -5
  83. package/admin/src/pages/HomePage/index.js +6 -3
  84. package/admin/src/pages/{InternalErrorPage/index.js → InternalErrorPage.tsx} +10 -6
  85. package/admin/src/pages/MarketplacePage/components/NpmPackageCard/index.js +0 -2
  86. package/admin/src/pages/MarketplacePage/hooks/__mocks__/useNavigatorOnline.ts +1 -0
  87. package/admin/src/{hooks/useNavigatorOnLine/index.js → pages/MarketplacePage/hooks/useNavigatorOnline.ts} +4 -6
  88. package/admin/src/pages/MarketplacePage/index.js +3 -3
  89. package/admin/src/pages/{NotFoundPage/index.js → NotFoundPage.tsx} +9 -7
  90. package/admin/src/pages/ProfilePage/components/Preferences/index.js +23 -9
  91. package/admin/src/pages/ProfilePage/index.js +4 -4
  92. package/admin/src/pages/SettingsPage/components/SettingsNav/index.js +20 -0
  93. package/admin/src/pages/SettingsPage/components/Tokens/Regenerate/index.js +1 -1
  94. package/admin/src/pages/SettingsPage/components/Tokens/Table/index.js +119 -87
  95. package/admin/src/pages/SettingsPage/constants.js +33 -0
  96. package/admin/src/{hooks/useRegenerate/index.js → pages/SettingsPage/hooks/useRegenerate.ts} +13 -7
  97. package/admin/src/pages/SettingsPage/index.js +2 -2
  98. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/ActionBoundRoutes/index.js +1 -1
  99. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/CollapsableContentType/index.js +1 -1
  100. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Permissions/index.js +1 -1
  101. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js +1 -1
  102. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/index.js +2 -2
  103. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/components/CustomizationInfos/index.js +2 -2
  104. package/admin/src/pages/SettingsPage/pages/ApplicationInfosPage/index.js +2 -2
  105. package/admin/src/pages/SettingsPage/pages/AuditLogs/SalesPage.js +50 -0
  106. package/admin/src/pages/SettingsPage/pages/ReviewWorkflows/SalesPage.js +53 -0
  107. package/admin/src/pages/SettingsPage/pages/Roles/CreatePage/index.js +1 -1
  108. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ConditionsModal/index.js +1 -1
  109. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/Collapse/index.js +1 -1
  110. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/ActionRow/index.js +1 -1
  111. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/ContentTypeCollapse/CollapsePropertyMatrix/SubActionRow/index.js +1 -1
  112. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/GlobalActions/index.js +1 -1
  113. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PermissionsDataManagerProvider/index.js +1 -1
  114. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/components/PluginsAndSettings/SubCategory/index.js +1 -1
  115. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/hooks/usePermissionsDataManager.ts +28 -0
  116. package/admin/src/pages/SettingsPage/pages/Roles/EditPage/index.js +1 -1
  117. package/admin/src/{hooks/useAdminRolePermissions/index.js → pages/SettingsPage/pages/Roles/hooks/useAdminRolePermissions.ts} +13 -6
  118. package/admin/src/pages/SettingsPage/pages/SingleSignOn/SalesPage.js +53 -0
  119. package/admin/src/pages/SettingsPage/pages/TransferTokens/EditView/index.js +1 -1
  120. package/admin/src/pages/SettingsPage/pages/TransferTokens/ListView/index.js +3 -5
  121. package/admin/src/pages/SettingsPage/pages/Users/EditPage/index.js +2 -1
  122. package/admin/src/pages/SettingsPage/pages/Users/ListPage/DynamicTable/TableRows/index.js +1 -1
  123. package/admin/src/pages/{UseCasePage/index.js → UseCasePage.tsx} +10 -12
  124. package/admin/src/shared/hooks/index.js +0 -1
  125. package/admin/src/shared/hooks/useInjectionZone/index.js +2 -2
  126. package/admin/src/translations/en.json +13 -0
  127. package/admin/src/types/adminAPI.ts +29 -0
  128. package/admin/src/utils/createRoute.tsx +54 -0
  129. package/admin/src/utils/formatAPIErrors.ts +18 -0
  130. package/admin/src/utils/getFullName.ts +3 -0
  131. package/admin/src/utils/{uniqueAdminHash.js → hashAdminUserEmail.ts} +6 -3
  132. package/admin/src/utils/makeUniqueRoutes.ts +11 -0
  133. package/admin/tsconfig.build.json +4 -0
  134. package/admin/tsconfig.json +11 -0
  135. package/build/0cd5f8915b265d5b1856.png +0 -0
  136. package/build/1049.ecc10c97.chunk.js +1 -0
  137. package/build/1217.96155682.chunk.js +35 -0
  138. package/build/1227.947ceaf9.chunk.js +1 -0
  139. package/build/1306.2699df52.chunk.js +79 -0
  140. package/build/135.ad267b59.chunk.js +1 -0
  141. package/build/1386.eabd8a1e.chunk.js +7 -0
  142. package/build/1727.b49f0713.chunk.js +1 -0
  143. package/build/1835.eaa696ba.chunk.js +1 -0
  144. package/build/19eb2dfcf2603eb55733.png +0 -0
  145. package/build/2325.d705b39a.chunk.js +1 -0
  146. package/build/2379.7ce8e110.chunk.js +1 -0
  147. package/build/2395.acb961a8.chunk.js +26 -0
  148. package/build/2421.79e5b3d0.chunk.js +1 -0
  149. package/build/267.073a3bcb.chunk.js +1 -0
  150. package/build/27d16aefee06412db90a.png +0 -0
  151. package/build/2801.4711ea5a.chunk.js +1 -0
  152. package/build/2878.145ebf7c.chunk.js +1 -0
  153. package/build/2950.216f2e89.chunk.js +1 -0
  154. package/build/2953.284a63c0.chunk.js +1 -0
  155. package/build/3019.fde2e1be.chunk.js +181 -0
  156. package/build/3100.2ba4df95.chunk.js +1 -0
  157. package/build/311.cb0884bb.chunk.js +1 -0
  158. package/build/3460.8644e608.chunk.js +146 -0
  159. package/build/3483.db8c1520.chunk.js +1 -0
  160. package/build/3911.488fbde3.chunk.js +95 -0
  161. package/build/4174.49cedb6a.chunk.js +1 -0
  162. package/build/4429.7f044dc7.chunk.js +1 -0
  163. package/build/4555.c883d697.chunk.js +1 -0
  164. package/build/4663.b906cc10.chunk.js +1 -0
  165. package/build/4732.149f5f8f.chunk.js +1 -0
  166. package/build/4916.480053a6.chunk.js +1 -0
  167. package/build/4996.d285c30b.chunk.js +1 -0
  168. package/build/502.f536f78b.chunk.js +1 -0
  169. package/build/570.2f3b4c56.chunk.js +1 -0
  170. package/build/5858.493b31ec.chunk.js +1 -0
  171. package/build/6158.c3c13c20.chunk.js +1 -0
  172. package/build/6345.334e7678.chunk.js +1 -0
  173. package/build/6453.4160b5b7.chunk.js +1 -0
  174. package/build/7030.b98dcedf.chunk.js +1 -0
  175. package/build/70674f63fc3904c20de0.svg +7 -0
  176. package/build/7448.6fd14dd3.chunk.js +1 -0
  177. package/build/7464.579564ac.chunk.js +1 -0
  178. package/build/7735.9e7c9fdd.chunk.js +10 -0
  179. package/build/78.dcc6df5c.chunk.js +1 -0
  180. package/build/7811.fdbe09af.chunk.js +103 -0
  181. package/build/782.7243b183.chunk.js +1 -0
  182. package/build/7849.2a500ed8.chunk.js +1 -0
  183. package/build/7897.63ba0a00.chunk.js +6 -0
  184. package/build/7e9af4fb7e723fcebf1f.svg +48 -0
  185. package/build/8162.7d1100a0.chunk.js +1 -0
  186. package/build/8276.9abe4679.chunk.js +26 -0
  187. package/build/8773.ee67141c.chunk.js +48 -0
  188. package/build/8980.f0045cc1.chunk.js +1 -0
  189. package/build/9077.2cc01ac8.chunk.js +105 -0
  190. package/build/9153.42c1428a.chunk.js +1 -0
  191. package/build/918.54414509.chunk.js +1 -0
  192. package/build/9218.b2d367f8.chunk.js +1 -0
  193. package/build/9285.5f174057.chunk.js +1 -0
  194. package/build/9547.62987774.chunk.js +1 -0
  195. package/build/9754.b4e73779.chunk.js +1 -0
  196. package/build/9d5d788027e86620c234.svg +5 -0
  197. package/build/Admin-authenticatedApp.059dc48f.chunk.js +79 -0
  198. package/build/Admin_InternalErrorPage.06eeef20.chunk.js +1 -0
  199. package/build/Admin_homePage.56b9eb3f.chunk.js +81 -0
  200. package/build/Admin_marketplace.d693a435.chunk.js +44 -0
  201. package/build/Admin_pluginsPage.ae2c872a.chunk.js +6 -0
  202. package/build/Admin_profilePage.89099d5b.chunk.js +13 -0
  203. package/build/Admin_settingsPage.88c45586.chunk.js +12 -0
  204. package/build/Upload_ConfigureTheView.44f28145.chunk.js +1 -0
  205. package/build/admin-app.990e112f.chunk.js +69 -0
  206. package/build/admin-edit-roles-page.4e1eb4a9.chunk.js +267 -0
  207. package/build/admin-edit-users.5b91404e.chunk.js +10 -0
  208. package/build/admin-roles-list.89dd94fe.chunk.js +22 -0
  209. package/build/admin-users.7be4fc5f.chunk.js +11 -0
  210. package/build/api-tokens-create-page.571920e5.chunk.js +1 -0
  211. package/build/api-tokens-edit-page.cbdc81b1.chunk.js +1 -0
  212. package/build/api-tokens-list-page.de0c49e8.chunk.js +16 -0
  213. package/build/ar-json.74e40bc7.chunk.js +1 -0
  214. package/build/audit-logs-sales-page.2955db88.chunk.js +1 -0
  215. package/build/audit-logs-settings-page.b0cb5164.chunk.js +1 -0
  216. package/build/bb3108f7fd1e6179bde1.svg +1 -0
  217. package/build/bb4d0d527bdfb161bc5a.svg +1 -0
  218. package/build/ca-json.fc6001d3.chunk.js +1 -0
  219. package/build/content-manager.de7ae330.chunk.js +1241 -0
  220. package/build/content-type-builder-list-view.6c8d3213.chunk.js +211 -0
  221. package/build/content-type-builder-translation-ar-json.3e808e2f.chunk.js +1 -0
  222. package/build/content-type-builder-translation-cs-json.1ef9e106.chunk.js +1 -0
  223. package/build/content-type-builder-translation-de-json.63fcff7b.chunk.js +1 -0
  224. package/build/content-type-builder-translation-dk-json.fd626b67.chunk.js +1 -0
  225. package/build/content-type-builder-translation-en-json.74d80f18.chunk.js +1 -0
  226. package/build/content-type-builder-translation-es-json.a4a361a9.chunk.js +1 -0
  227. package/build/content-type-builder-translation-fr-json.499c3a46.chunk.js +1 -0
  228. package/build/content-type-builder-translation-id-json.65255f93.chunk.js +1 -0
  229. package/build/content-type-builder-translation-it-json.e268ab74.chunk.js +1 -0
  230. package/build/content-type-builder-translation-ja-json.9be0d5b2.chunk.js +1 -0
  231. package/build/content-type-builder-translation-ko-json.04cb309d.chunk.js +1 -0
  232. package/build/content-type-builder-translation-ms-json.f6b743b9.chunk.js +1 -0
  233. package/build/content-type-builder-translation-nl-json.997fe8cc.chunk.js +1 -0
  234. package/build/content-type-builder-translation-pl-json.634f638b.chunk.js +1 -0
  235. package/build/content-type-builder-translation-pt-BR-json.6a95dc71.chunk.js +1 -0
  236. package/build/content-type-builder-translation-pt-json.ddb44f8c.chunk.js +1 -0
  237. package/build/content-type-builder-translation-ru-json.3af65503.chunk.js +1 -0
  238. package/build/content-type-builder-translation-sk-json.c6078082.chunk.js +1 -0
  239. package/build/content-type-builder-translation-sv-json.a6df2462.chunk.js +1 -0
  240. package/build/content-type-builder-translation-th-json.122277cc.chunk.js +1 -0
  241. package/build/content-type-builder-translation-tr-json.41f44f77.chunk.js +1 -0
  242. package/build/content-type-builder-translation-uk-json.e1315acd.chunk.js +1 -0
  243. package/build/content-type-builder-translation-zh-Hans-json.6ff57db6.chunk.js +1 -0
  244. package/build/content-type-builder-translation-zh-json.3532b962.chunk.js +1 -0
  245. package/build/content-type-builder.0bc97051.chunk.js +136 -0
  246. package/build/cs-json.4b44411c.chunk.js +1 -0
  247. package/build/de-json.e72545cf.chunk.js +1 -0
  248. package/build/dk-json.e77140ef.chunk.js +1 -0
  249. package/build/email-settings-page.07712efc.chunk.js +11 -0
  250. package/build/en-json.5b907f67.chunk.js +1 -0
  251. package/build/es-json.b1f2284b.chunk.js +1 -0
  252. package/build/eu-json.63d0a898.chunk.js +1 -0
  253. package/build/fr-json.33c6428b.chunk.js +1 -0
  254. package/build/gu-json.7efe8cc2.chunk.js +1 -0
  255. package/build/he-json.3cf0b48a.chunk.js +1 -0
  256. package/build/hi-json.0d633692.chunk.js +1 -0
  257. package/build/highlight.js.28a1547e.chunk.js +85 -0
  258. package/build/hu-json.c74b6a1e.chunk.js +1 -0
  259. package/build/i18n-settings-page.5c34f012.chunk.js +9 -0
  260. package/build/i18n-translation-de-json.362384a6.chunk.js +1 -0
  261. package/build/i18n-translation-dk-json.89401417.chunk.js +1 -0
  262. package/build/i18n-translation-en-json.1ec7becf.chunk.js +1 -0
  263. package/build/i18n-translation-es-json.87b494d1.chunk.js +1 -0
  264. package/build/i18n-translation-fr-json.57ddc77e.chunk.js +1 -0
  265. package/build/i18n-translation-ko-json.ef4f9471.chunk.js +1 -0
  266. package/build/i18n-translation-pl-json.dfac513d.chunk.js +1 -0
  267. package/build/i18n-translation-ru-json.a3dbc125.chunk.js +1 -0
  268. package/build/i18n-translation-tr-json.3bfc812f.chunk.js +1 -0
  269. package/build/i18n-translation-zh-Hans-json.757ce62d.chunk.js +1 -0
  270. package/build/i18n-translation-zh-json.bef2dc07.chunk.js +1 -0
  271. package/build/id-json.41e07c46.chunk.js +1 -0
  272. package/build/index.html +1 -0
  273. package/build/it-json.bfe27ed8.chunk.js +1 -0
  274. package/build/ja-json.e1959a1c.chunk.js +1 -0
  275. package/build/ko-json.ce5d6d94.chunk.js +1 -0
  276. package/build/main.f84563f1.js +2665 -0
  277. package/build/ml-json.940d7ace.chunk.js +1 -0
  278. package/build/ms-json.0eddffd9.chunk.js +1 -0
  279. package/build/nl-json.fe38f0fb.chunk.js +1 -0
  280. package/build/no-json.19a2dbfa.chunk.js +1 -0
  281. package/build/pl-json.d55e8e78.chunk.js +1 -0
  282. package/build/pt-BR-json.ae0a0d2e.chunk.js +1 -0
  283. package/build/pt-json.ee554a41.chunk.js +1 -0
  284. package/build/review-workflows-sales-page.f46a8f00.chunk.js +1 -0
  285. package/build/review-workflows-settings-create-view.d0544fb0.chunk.js +1 -0
  286. package/build/review-workflows-settings-edit-view.aabf49ef.chunk.js +1 -0
  287. package/build/review-workflows-settings-list-view.8b0525ab.chunk.js +56 -0
  288. package/build/ru-json.1c976644.chunk.js +1 -0
  289. package/build/runtime~main.270fd45f.js +2 -0
  290. package/build/sa-json.2c03ef4e.chunk.js +1 -0
  291. package/build/sk-json.b41847e8.chunk.js +1 -0
  292. package/build/sso-sales-page.ef22e469.chunk.js +1 -0
  293. package/build/sso-settings-page.21e16ae4.chunk.js +1 -0
  294. package/build/sv-json.568cb7ae.chunk.js +1 -0
  295. package/build/th-json.5f659396.chunk.js +1 -0
  296. package/build/tr-json.c9f22432.chunk.js +1 -0
  297. package/build/transfer-tokens-create-page.3366204d.chunk.js +1 -0
  298. package/build/transfer-tokens-edit-page.15cf0f73.chunk.js +1 -0
  299. package/build/transfer-tokens-list-page.0bc0e682.chunk.js +16 -0
  300. package/build/uk-json.b7e38370.chunk.js +1 -0
  301. package/build/upload-settings.1319dca0.chunk.js +14 -0
  302. package/build/upload-translation-ca-json.57954414.chunk.js +1 -0
  303. package/build/upload-translation-de-json.420c943b.chunk.js +1 -0
  304. package/build/upload-translation-dk-json.bbb2fa05.chunk.js +1 -0
  305. package/build/upload-translation-en-json.8b7573ce.chunk.js +1 -0
  306. package/build/upload-translation-es-json.ba2eb03a.chunk.js +1 -0
  307. package/build/upload-translation-fr-json.baab9911.chunk.js +1 -0
  308. package/build/upload-translation-he-json.0a830937.chunk.js +1 -0
  309. package/build/upload-translation-it-json.e87d7966.chunk.js +1 -0
  310. package/build/upload-translation-ja-json.44b88e7a.chunk.js +1 -0
  311. package/build/upload-translation-ko-json.a52eab64.chunk.js +1 -0
  312. package/build/upload-translation-ms-json.74f6d746.chunk.js +1 -0
  313. package/build/upload-translation-pl-json.426f31c9.chunk.js +1 -0
  314. package/build/upload-translation-pt-BR-json.d1704f0b.chunk.js +1 -0
  315. package/build/upload-translation-pt-json.6b937fdf.chunk.js +1 -0
  316. package/build/upload-translation-ru-json.675f6b93.chunk.js +1 -0
  317. package/build/upload-translation-sk-json.483a18f6.chunk.js +1 -0
  318. package/build/upload-translation-th-json.98d35574.chunk.js +1 -0
  319. package/build/upload-translation-tr-json.74117e5c.chunk.js +1 -0
  320. package/build/upload-translation-uk-json.9950466a.chunk.js +1 -0
  321. package/build/upload-translation-zh-Hans-json.db163b6b.chunk.js +1 -0
  322. package/build/upload-translation-zh-json.e1dd6eb2.chunk.js +1 -0
  323. package/build/upload.1ced11be.chunk.js +58 -0
  324. package/build/users-advanced-settings-page.8e657084.chunk.js +9 -0
  325. package/build/users-email-settings-page.e57745e5.chunk.js +9 -0
  326. package/build/users-permissions-translation-ar-json.7d87d54d.chunk.js +1 -0
  327. package/build/users-permissions-translation-cs-json.7e23424a.chunk.js +1 -0
  328. package/build/users-permissions-translation-de-json.a6fb670f.chunk.js +1 -0
  329. package/build/users-permissions-translation-dk-json.60e50f48.chunk.js +1 -0
  330. package/build/users-permissions-translation-en-json.4b302272.chunk.js +1 -0
  331. package/build/users-permissions-translation-es-json.35007573.chunk.js +1 -0
  332. package/build/users-permissions-translation-fr-json.7e55bbbb.chunk.js +1 -0
  333. package/build/users-permissions-translation-id-json.a5a0fb59.chunk.js +1 -0
  334. package/build/users-permissions-translation-it-json.0705465d.chunk.js +1 -0
  335. package/build/users-permissions-translation-ja-json.891fe76e.chunk.js +1 -0
  336. package/build/users-permissions-translation-ko-json.357d7a33.chunk.js +1 -0
  337. package/build/users-permissions-translation-ms-json.c83f87c4.chunk.js +1 -0
  338. package/build/users-permissions-translation-nl-json.c9f92a3c.chunk.js +1 -0
  339. package/build/users-permissions-translation-pl-json.0a7287d1.chunk.js +1 -0
  340. package/build/users-permissions-translation-pt-BR-json.1b6d2920.chunk.js +1 -0
  341. package/build/users-permissions-translation-pt-json.a7eda429.chunk.js +1 -0
  342. package/build/users-permissions-translation-ru-json.8e883c67.chunk.js +1 -0
  343. package/build/users-permissions-translation-sk-json.7f37180f.chunk.js +1 -0
  344. package/build/users-permissions-translation-sv-json.17187818.chunk.js +1 -0
  345. package/build/users-permissions-translation-th-json.1e9c0247.chunk.js +1 -0
  346. package/build/users-permissions-translation-tr-json.2bd7ff98.chunk.js +1 -0
  347. package/build/users-permissions-translation-uk-json.6a0a1572.chunk.js +1 -0
  348. package/build/users-permissions-translation-vi-json.6722a8a2.chunk.js +1 -0
  349. package/build/users-permissions-translation-zh-Hans-json.8d82c809.chunk.js +1 -0
  350. package/build/users-permissions-translation-zh-json.7978eaa6.chunk.js +1 -0
  351. package/build/users-providers-settings-page.55796d13.chunk.js +14 -0
  352. package/build/users-roles-settings-page.57079245.chunk.js +55 -0
  353. package/build/vi-json.ee4c5537.chunk.js +1 -0
  354. package/build/webhook-edit-page.3a28b2e7.chunk.js +33 -0
  355. package/build/webhook-list-page.ee80767b.chunk.js +63 -0
  356. package/build/zh-Hans-json.97efd015.chunk.js +1 -0
  357. package/build/zh-json.bfc2e036.chunk.js +1 -0
  358. package/ee/admin/hooks/{useLicenseLimitNotification.js → useLicenseLimitNotification.ts} +4 -4
  359. package/ee/admin/pages/AuthPage/components/Login/index.js +1 -1
  360. package/ee/admin/pages/AuthPage/components/Providers/index.js +3 -2
  361. package/ee/admin/pages/SettingsPage/pages/ReviewWorkflows/selectors.js +1 -1
  362. package/ee/admin/pages/SettingsPage/pages/Users/ListPage/index.js +1 -3
  363. package/ee/server/bootstrap.js +1 -1
  364. package/ee/server/controllers/admin.js +1 -1
  365. package/ee/server/controllers/user.js +1 -1
  366. package/ee/server/destroy.js +1 -1
  367. package/ee/server/register.js +1 -1
  368. package/ee/server/routes/utils.js +1 -1
  369. package/ee/server/services/audit-logs.js +1 -1
  370. package/ee/server/services/passport/sso.js +1 -1
  371. package/ee/server/services/passport.js +1 -1
  372. package/ee/server/services/seat-enforcement.js +1 -1
  373. package/ee/server/utils/sso-lock.js +1 -1
  374. package/ee/server/validation/role.js +1 -1
  375. package/ee/server/validation/user.js +1 -1
  376. package/jest.config.front.js +4 -0
  377. package/package.json +28 -22
  378. package/scripts/build.js +6 -2
  379. package/server/controllers/admin.js +4 -3
  380. package/shared/entities.ts +33 -0
  381. package/shared/permissions.ts +52 -0
  382. package/shared/schema.ts +9 -0
  383. package/webpack.config.js +1 -0
  384. package/admin/src/components/AuthenticatedApp/index.js +0 -120
  385. package/admin/src/components/AuthenticatedApp/utils/api.js +0 -85
  386. package/admin/src/components/AuthenticatedApp/utils/checkLatestStrapiVersion.js +0 -11
  387. package/admin/src/components/ConfigurationsProvider/index.js +0 -66
  388. package/admin/src/components/ConfigurationsProvider/reducer.js +0 -29
  389. package/admin/src/components/DragLayer/index.js +0 -1
  390. package/admin/src/components/GlobalStyle/index.js +0 -9
  391. package/admin/src/components/GuidedTour/Homepage/components/Step.js +0 -61
  392. package/admin/src/components/GuidedTour/Homepage/components/Stepper.js +0 -61
  393. package/admin/src/components/GuidedTour/Homepage/index.js +0 -71
  394. package/admin/src/components/GuidedTour/Modal/components/Content.js +0 -66
  395. package/admin/src/components/GuidedTour/Modal/components/Modal.js +0 -72
  396. package/admin/src/components/GuidedTour/Modal/components/StepNumberWithPadding.js +0 -26
  397. package/admin/src/components/GuidedTour/Modal/components/Stepper.js +0 -118
  398. package/admin/src/components/GuidedTour/Modal/index.js +0 -94
  399. package/admin/src/components/GuidedTour/Modal/reducer.js +0 -29
  400. package/admin/src/components/GuidedTour/Stepper/StepLine.js +0 -29
  401. package/admin/src/components/GuidedTour/Stepper/StepNumber.js +0 -71
  402. package/admin/src/components/GuidedTour/constants.js +0 -3
  403. package/admin/src/components/GuidedTour/index.js +0 -102
  404. package/admin/src/components/GuidedTour/init.js +0 -37
  405. package/admin/src/components/GuidedTour/reducer.js +0 -50
  406. package/admin/src/components/GuidedTour/utils/arePreviousSectionsDone.js +0 -13
  407. package/admin/src/components/GuidedTour/utils/arePreviousStepsDone.js +0 -12
  408. package/admin/src/components/GuidedTour/utils/isGuidedTourCompleted.js +0 -6
  409. package/admin/src/components/GuidedTour/utils/persistStateToLocaleStorage.js +0 -34
  410. package/admin/src/components/LanguageProvider/index.js +0 -54
  411. package/admin/src/components/LanguageProvider/init.js +0 -13
  412. package/admin/src/components/LanguageProvider/reducer.js +0 -30
  413. package/admin/src/components/LanguageProvider/utils/localStorageKey.js +0 -3
  414. package/admin/src/components/LocalesProvider/context.js +0 -5
  415. package/admin/src/components/LocalesProvider/index.js +0 -21
  416. package/admin/src/components/LocalesProvider/useLocalesProvider.js +0 -11
  417. package/admin/src/components/NpsSurvey/hooks/useNpsSurveySettings.js +0 -17
  418. package/admin/src/components/PluginsInitializer/index.js +0 -68
  419. package/admin/src/components/PluginsInitializer/init.js +0 -11
  420. package/admin/src/components/PluginsInitializer/reducer.js +0 -22
  421. package/admin/src/components/PrivateRoute/index.js +0 -46
  422. package/admin/src/components/Providers/index.js +0 -156
  423. package/admin/src/components/RBACProvider/actions.js +0 -10
  424. package/admin/src/components/RBACProvider/constants.js +0 -2
  425. package/admin/src/components/RBACProvider/index.js +0 -39
  426. package/admin/src/components/RBACProvider/reducer.js +0 -51
  427. package/admin/src/components/Theme/index.js +0 -26
  428. package/admin/src/components/ThemeToggleProvider/index.js +0 -79
  429. package/admin/src/contexts/Admin/index.js +0 -5
  430. package/admin/src/contexts/ApiTokenPermissions/index.js +0 -25
  431. package/admin/src/contexts/Configurations/index.js +0 -5
  432. package/admin/src/contexts/MarketPlace/index.js +0 -18
  433. package/admin/src/contexts/PermisssionsDataManagerContext/index.js +0 -5
  434. package/admin/src/contexts/ThemeToggle/index.js +0 -5
  435. package/admin/src/contexts/index.js +0 -4
  436. package/admin/src/core/store/configureStore.js +0 -47
  437. package/admin/src/exposedHooks.js +0 -27
  438. package/admin/src/hooks/useAdminRoles/__mocks__/index.js +0 -5
  439. package/admin/src/hooks/useAdminUsers/index.js +0 -1
  440. package/admin/src/hooks/useAdminUsers/useAdminUsers.js +0 -47
  441. package/admin/src/hooks/useConfigurations/index.js +0 -11
  442. package/admin/src/hooks/useContentTypes/index.js +0 -1
  443. package/admin/src/hooks/useDebounce/index.js +0 -19
  444. package/admin/src/hooks/useEnterprise/index.js +0 -1
  445. package/admin/src/hooks/useLicenseLimitNotification/index.js +0 -5
  446. package/admin/src/hooks/useMenu/index.js +0 -86
  447. package/admin/src/hooks/useMenu/utils/checkPermissions.js +0 -13
  448. package/admin/src/hooks/useMenu/utils/getGeneralLinks.js +0 -31
  449. package/admin/src/hooks/useMenu/utils/getPluginSectionLinks.js +0 -17
  450. package/admin/src/hooks/usePermissionsDataManager/index.js +0 -7
  451. package/admin/src/hooks/useReleaseNotification/index.js +0 -31
  452. package/admin/src/hooks/useReleaseNotification/utils/api.js +0 -20
  453. package/admin/src/hooks/useReleaseNotification/utils/checkLatestStrapiVersion.js +0 -11
  454. package/admin/src/hooks/useThemeToggle/index.js +0 -11
  455. package/admin/src/injectionZones.js +0 -25
  456. package/admin/src/layouts/UnauthenticatedLayout/LocaleToggle/index.js +0 -29
  457. package/admin/src/layouts/UnauthenticatedLayout/index.js +0 -55
  458. package/admin/src/reducers.js +0 -23
  459. package/admin/src/shared/hooks/useAdminProvider/index.js +0 -11
  460. package/admin/src/tsconfig.json +0 -10
  461. package/admin/src/utils/checkFormValidity.js +0 -15
  462. package/admin/src/utils/createRoute.js +0 -47
  463. package/admin/src/utils/formatAPIErrors.js +0 -17
  464. package/admin/src/utils/getAttributesToDisplay.js +0 -19
  465. package/admin/src/utils/getExistingActions.js +0 -32
  466. package/admin/src/utils/getFullName.js +0 -9
  467. package/admin/src/utils/index.js +0 -9
  468. package/admin/src/utils/makeUniqueRoutes.js +0 -6
  469. package/admin/src/utils/sortLinks.js +0 -5
  470. /package/admin/src/hooks/{useAdminUsers/__mocks__/index.js → __mocks__/useAdminUsers.ts} +0 -0
  471. /package/admin/src/hooks/{useContentTypes/__mocks__/index.js → __mocks__/useContentTypes.ts} +0 -0
  472. /package/admin/src/{hooks/useAdminRolePermissions/__mocks__/index.js → pages/SettingsPage/pages/Roles/hooks/__mocks__/useAdminRolePermissions.ts} +0 -0
@@ -0,0 +1,303 @@
1
+ import * as React from 'react';
2
+
3
+ import {
4
+ Box,
5
+ Button,
6
+ Flex,
7
+ FocusTrap,
8
+ IconButton,
9
+ Portal,
10
+ Typography,
11
+ } from '@strapi/design-system';
12
+ import { LinkButton } from '@strapi/design-system/v2';
13
+ import { GuidedTourContextValue, pxToRem, useGuidedTour, useTracking } from '@strapi/helper-plugin';
14
+ import { ArrowRight, Cross } from '@strapi/icons';
15
+ import get from 'lodash/get';
16
+ import { MessageDescriptor, useIntl } from 'react-intl';
17
+ import { NavLink } from 'react-router-dom';
18
+ import styled from 'styled-components';
19
+
20
+ import { LAYOUT_DATA, STATES } from './constants';
21
+ import { Number, VerticalDivider } from './Ornaments';
22
+
23
+ /* -------------------------------------------------------------------------------------------------
24
+ * GuidedTourModal
25
+ * -----------------------------------------------------------------------------------------------*/
26
+
27
+ const GuidedTourModal = () => {
28
+ const {
29
+ currentStep,
30
+ guidedTourState,
31
+ setCurrentStep,
32
+ setStepState,
33
+ isGuidedTourVisible,
34
+ setSkipped,
35
+ } = useGuidedTour();
36
+ const { formatMessage } = useIntl();
37
+ const { trackUsage } = useTracking();
38
+
39
+ if (!currentStep || !isGuidedTourVisible) {
40
+ return null;
41
+ }
42
+
43
+ const stepData = get(LAYOUT_DATA, currentStep);
44
+ const sectionKeys = Object.keys(guidedTourState);
45
+ const [sectionName, stepName] = currentStep.split('.') as [
46
+ keyof GuidedTourContextValue['guidedTourState'],
47
+ string
48
+ ];
49
+ const sectionIndex = sectionKeys.indexOf(sectionName);
50
+ const stepIndex = Object.keys(guidedTourState[sectionName]).indexOf(stepName);
51
+ const hasSectionAfter = sectionIndex < sectionKeys.length - 1;
52
+ const hasStepAfter = stepIndex < Object.keys(guidedTourState[sectionName]).length - 1;
53
+
54
+ const handleCtaClick = () => {
55
+ setStepState(currentStep, true);
56
+ trackUsage(stepData.trackingEvent);
57
+
58
+ setCurrentStep(null);
59
+ };
60
+
61
+ const handleSkip = () => {
62
+ setSkipped(true);
63
+ setCurrentStep(null);
64
+ trackUsage('didSkipGuidedtour');
65
+ };
66
+
67
+ return (
68
+ <Portal>
69
+ <ModalWrapper onClick={handleCtaClick} padding={8} justifyContent="center">
70
+ <FocusTrap onEscape={handleCtaClick}>
71
+ <Flex
72
+ direction="column"
73
+ alignItems="stretch"
74
+ background="neutral0"
75
+ width={pxToRem(660)}
76
+ shadow="popupShadow"
77
+ hasRadius
78
+ padding={4}
79
+ gap={8}
80
+ role="dialog"
81
+ aria-modal
82
+ onClick={(e) => e.stopPropagation()}
83
+ >
84
+ <Flex justifyContent="flex-end">
85
+ <IconButton
86
+ onClick={handleCtaClick}
87
+ aria-label={formatMessage({
88
+ id: 'app.utils.close-label',
89
+ defaultMessage: 'Close',
90
+ })}
91
+ >
92
+ <Cross />
93
+ </IconButton>
94
+ </Flex>
95
+ <Box
96
+ paddingLeft={7}
97
+ paddingRight={7}
98
+ paddingBottom={!hasStepAfter && !hasSectionAfter ? 8 : 0}
99
+ >
100
+ <GuidedTourStepper
101
+ title={stepData.title}
102
+ cta={'cta' in stepData ? stepData.cta : undefined}
103
+ onCtaClick={handleCtaClick}
104
+ sectionIndex={sectionIndex}
105
+ stepIndex={stepIndex}
106
+ hasSectionAfter={hasSectionAfter}
107
+ >
108
+ <GuidedTourContent {...stepData.content} />
109
+ </GuidedTourStepper>
110
+ </Box>
111
+ {!(!hasStepAfter && !hasSectionAfter) && (
112
+ <Flex justifyContent="flex-end">
113
+ <Button variant="tertiary" onClick={handleSkip}>
114
+ {formatMessage({
115
+ id: 'app.components.GuidedTour.skip',
116
+ defaultMessage: 'Skip the tour',
117
+ })}
118
+ </Button>
119
+ </Flex>
120
+ )}
121
+ </Flex>
122
+ </FocusTrap>
123
+ </ModalWrapper>
124
+ </Portal>
125
+ );
126
+ };
127
+
128
+ const ModalWrapper = styled(Flex)`
129
+ position: fixed;
130
+ z-index: 4;
131
+ inset: 0;
132
+ /* this is theme.colors.neutral800 with opacity */
133
+ background: ${({ theme }) => `${theme.colors.neutral800}1F`};
134
+ `;
135
+
136
+ /* -------------------------------------------------------------------------------------------------
137
+ * GuidedTourStepper
138
+ * -----------------------------------------------------------------------------------------------*/
139
+
140
+ interface GuidedTourStepperProps {
141
+ title: MessageDescriptor;
142
+ children: React.ReactNode;
143
+ cta?: {
144
+ title: MessageDescriptor;
145
+ target?: string;
146
+ };
147
+ onCtaClick: () => void;
148
+ sectionIndex: number;
149
+ stepIndex: number;
150
+ hasSectionAfter: boolean;
151
+ }
152
+
153
+ const GuidedTourStepper = ({
154
+ title,
155
+ children,
156
+ cta,
157
+ onCtaClick,
158
+ sectionIndex,
159
+ stepIndex,
160
+ hasSectionAfter,
161
+ }: GuidedTourStepperProps) => {
162
+ const { formatMessage } = useIntl();
163
+
164
+ const hasSectionBefore = sectionIndex > 0;
165
+ const hasStepsBefore = stepIndex > 0;
166
+ const nextSectionIndex = sectionIndex + 1;
167
+
168
+ return (
169
+ <>
170
+ <Flex alignItems="stretch">
171
+ <Flex marginRight={8} justifyContent="center" minWidth={pxToRem(30)}>
172
+ {hasSectionBefore && <VerticalDivider state={STATES.IS_DONE} minHeight={pxToRem(24)} />}
173
+ </Flex>
174
+ <Typography variant="sigma" textColor="primary600">
175
+ {formatMessage({
176
+ id: 'app.components.GuidedTour.title',
177
+ defaultMessage: '3 steps to get started',
178
+ })}
179
+ </Typography>
180
+ </Flex>
181
+ <Flex>
182
+ <Flex marginRight={8} minWidth={pxToRem(30)}>
183
+ <Number
184
+ state={hasStepsBefore ? STATES.IS_DONE : STATES.IS_ACTIVE}
185
+ paddingTop={3}
186
+ paddingBottom={3}
187
+ >
188
+ {sectionIndex + 1}
189
+ </Number>
190
+ </Flex>
191
+ <Typography variant="alpha" fontWeight="bold" textColor="neutral800" as="h3" id="title">
192
+ {formatMessage(title)}
193
+ </Typography>
194
+ </Flex>
195
+ <Flex alignItems="stretch">
196
+ <Flex marginRight={8} direction="column" justifyContent="center" minWidth={pxToRem(30)}>
197
+ {hasSectionAfter && (
198
+ <>
199
+ <VerticalDivider state={STATES.IS_DONE} />
200
+ {hasStepsBefore && (
201
+ <Number state={STATES.IS_ACTIVE} paddingTop={3}>
202
+ {nextSectionIndex + 1}
203
+ </Number>
204
+ )}
205
+ </>
206
+ )}
207
+ </Flex>
208
+ <Box>
209
+ {children}
210
+ {cta &&
211
+ (cta.target ? (
212
+ <LinkButton
213
+ as={NavLink}
214
+ endIcon={<ArrowRight />}
215
+ onClick={onCtaClick}
216
+ // @ts-expect-error - types are not inferred correctly through the as prop.
217
+ to={cta.target}
218
+ >
219
+ {formatMessage(cta.title)}
220
+ </LinkButton>
221
+ ) : (
222
+ <Button endIcon={<ArrowRight />} onClick={onCtaClick}>
223
+ {formatMessage(cta.title)}
224
+ </Button>
225
+ ))}
226
+ </Box>
227
+ </Flex>
228
+ {hasStepsBefore && hasSectionAfter && (
229
+ <Box paddingTop={3}>
230
+ <Flex marginRight={8} justifyContent="center" width={pxToRem(30)}>
231
+ <VerticalDivider state={STATES.IS_DONE} minHeight={pxToRem(24)} />
232
+ </Flex>
233
+ </Box>
234
+ )}
235
+ </>
236
+ );
237
+ };
238
+
239
+ /* -------------------------------------------------------------------------------------------------
240
+ * GuidedTourContent
241
+ * -----------------------------------------------------------------------------------------------*/
242
+
243
+ interface GuidedTourContentProps
244
+ extends Required<Pick<MessageDescriptor, 'defaultMessage' | 'id'>> {}
245
+
246
+ const GuidedTourContent = ({ id, defaultMessage }: GuidedTourContentProps) => {
247
+ const { formatMessage } = useIntl();
248
+
249
+ return (
250
+ <Flex direction="column" alignItems="stretch" gap={4} paddingBottom={6}>
251
+ {formatMessage(
252
+ { id, defaultMessage },
253
+ {
254
+ documentationLink: DocumentationLink,
255
+ b: Bold,
256
+ p: Paragraph,
257
+ light: Light,
258
+ ul: List,
259
+ li: ListItem,
260
+ }
261
+ )}
262
+ </Flex>
263
+ );
264
+ };
265
+
266
+ const DocumentationLink = (children: React.ReactNode) => (
267
+ <Typography
268
+ as="a"
269
+ textColor="primary600"
270
+ target="_blank"
271
+ rel="noopener noreferrer"
272
+ href="https://docs.strapi.io/developer-docs/latest/developer-resources/database-apis-reference/rest-api.html#api-parameters"
273
+ >
274
+ {children}
275
+ </Typography>
276
+ );
277
+
278
+ const Bold = (children: React.ReactNode) => (
279
+ <Typography fontWeight="semiBold">{children}</Typography>
280
+ );
281
+
282
+ const Paragraph = (children: React.ReactNode) => <Typography>{children}</Typography>;
283
+
284
+ const Light = (children: React.ReactNode) => (
285
+ <Typography textColor="neutral600">{children}</Typography>
286
+ );
287
+
288
+ const List = (children: React.ReactNode) => (
289
+ <Box paddingLeft={6}>
290
+ <ul>{children}</ul>
291
+ </Box>
292
+ );
293
+
294
+ const LiStyled = styled.li`
295
+ list-style: disc;
296
+ &::marker {
297
+ color: ${({ theme }) => theme.colors.neutral800};
298
+ }
299
+ `;
300
+
301
+ const ListItem = (children: React.ReactNode) => <LiStyled>{children}</LiStyled>;
302
+
303
+ export { GuidedTourModal };
@@ -0,0 +1,74 @@
1
+ import { Box, BoxProps, Flex, FlexProps, Typography } from '@strapi/design-system';
2
+ import { pxToRem } from '@strapi/helper-plugin';
3
+ import { Check } from '@strapi/icons';
4
+
5
+ import { STATES, States } from './constants';
6
+
7
+ /* -------------------------------------------------------------------------------------------------
8
+ * Number
9
+ * -----------------------------------------------------------------------------------------------*/
10
+
11
+ interface NumberProps extends FlexProps {
12
+ children: number;
13
+ state: States;
14
+ }
15
+
16
+ const Number = ({ children, state, ...props }: NumberProps) => {
17
+ return state === STATES.IS_DONE || state === STATES.IS_ACTIVE ? (
18
+ <Flex
19
+ background="primary600"
20
+ padding={2}
21
+ borderRadius="50%"
22
+ width={pxToRem(30)}
23
+ height={pxToRem(30)}
24
+ justifyContent="center"
25
+ {...props}
26
+ >
27
+ {state === STATES.IS_DONE ? (
28
+ <Check aria-hidden width={pxToRem(16)} color="neutral0" />
29
+ ) : (
30
+ <Typography fontWeight="semiBold" textColor="neutral0">
31
+ {children}
32
+ </Typography>
33
+ )}
34
+ </Flex>
35
+ ) : (
36
+ <Flex
37
+ borderColor="neutral500"
38
+ borderWidth="1px"
39
+ borderStyle="solid"
40
+ padding={2}
41
+ borderRadius="50%"
42
+ width={pxToRem(30)}
43
+ height={pxToRem(30)}
44
+ justifyContent="center"
45
+ {...props}
46
+ >
47
+ <Typography fontWeight="semiBold" textColor="neutral600">
48
+ {children}
49
+ </Typography>
50
+ </Flex>
51
+ );
52
+ };
53
+
54
+ /* -------------------------------------------------------------------------------------------------
55
+ * VerticalDivider
56
+ * -----------------------------------------------------------------------------------------------*/
57
+
58
+ interface VerticalDividerProps extends BoxProps {
59
+ state: States;
60
+ }
61
+
62
+ const VerticalDivider = ({ state, ...props }: VerticalDividerProps) => (
63
+ <Box
64
+ width={pxToRem(2)}
65
+ height="100%"
66
+ background={state === STATES.IS_NOT_DONE ? 'neutral300' : 'primary500'}
67
+ hasRadius
68
+ minHeight={state === STATES.IS_ACTIVE ? pxToRem(85) : pxToRem(65)}
69
+ {...props}
70
+ />
71
+ );
72
+
73
+ export { Number, VerticalDivider };
74
+ export type { NumberProps, VerticalDividerProps };
@@ -0,0 +1,253 @@
1
+ import * as React from 'react';
2
+
3
+ import {
4
+ GuidedTourContextValue,
5
+ GuidedTourProvider as GuidedTourProviderComponent,
6
+ GuidedTourSectionKey,
7
+ GuidedTourStep,
8
+ GuidedTourStepKey,
9
+ auth,
10
+ } from '@strapi/helper-plugin';
11
+ import produce from 'immer';
12
+ import get from 'lodash/get';
13
+ import set from 'lodash/set';
14
+
15
+ /* -------------------------------------------------------------------------------------------------
16
+ * GuidedTourProvider
17
+ * -----------------------------------------------------------------------------------------------*/
18
+
19
+ interface GuidedTourProviderProps {
20
+ children: React.ReactNode;
21
+ }
22
+
23
+ const GuidedTourProvider = ({ children }: GuidedTourProviderProps) => {
24
+ const [{ currentStep, guidedTourState, isGuidedTourVisible, isSkipped }, dispatch] =
25
+ React.useReducer(reducer, initialState, initialiseState);
26
+
27
+ const setCurrentStep = (step: SetCurrentStepAction['step']) => {
28
+ // if step is null it is intentional, we need to dispatch it
29
+ if (step !== null) {
30
+ const isStepAlreadyDone = get(guidedTourState, step);
31
+ const [sectionName, stepName] = step.split('.') as [GuidedTourSectionKey, GuidedTourStepKey];
32
+ const sectionArray = Object.entries(guidedTourState[sectionName]);
33
+
34
+ const currentStepIndex = sectionArray.findIndex(([key]) => key === stepName);
35
+ const previousSteps = sectionArray.slice(0, currentStepIndex);
36
+
37
+ const isStepToShow = previousSteps.every(([, sectionValue]) => sectionValue);
38
+
39
+ if (isStepAlreadyDone || isSkipped || !isStepToShow) {
40
+ return null;
41
+ }
42
+ }
43
+
44
+ auth.set(null, 'GUIDED_TOUR_CURRENT_STEP', true);
45
+
46
+ return dispatch({
47
+ type: 'SET_CURRENT_STEP',
48
+ step,
49
+ });
50
+ };
51
+
52
+ const setGuidedTourVisibility = (value: SetGuidedTourVisibilityAction['value']) => {
53
+ dispatch({
54
+ type: 'SET_GUIDED_TOUR_VISIBILITY',
55
+ value,
56
+ });
57
+ };
58
+
59
+ const setStepState = (currentStep: GuidedTourStep, value: SetStepStateAction['value']) => {
60
+ addCompletedStep(currentStep);
61
+
62
+ dispatch({
63
+ type: 'SET_STEP_STATE',
64
+ currentStep,
65
+ value,
66
+ });
67
+ };
68
+
69
+ const startSection = (sectionName: GuidedTourSectionKey) => {
70
+ const sectionSteps = guidedTourState[sectionName];
71
+
72
+ if (sectionSteps) {
73
+ const guidedTourArray = Object.entries(guidedTourState);
74
+
75
+ // Find current section position in the guidedTourArray
76
+ // Get only previous sections based on current section position
77
+ const currentSectionIndex = guidedTourArray.findIndex(([key]) => key === sectionName);
78
+ const previousSections = guidedTourArray.slice(0, currentSectionIndex);
79
+
80
+ // Check if every steps from previous section are done
81
+ const isSectionToShow = previousSections.every(([, sectionValue]) =>
82
+ Object.values(sectionValue).every(Boolean)
83
+ );
84
+
85
+ const [firstStep] = Object.keys(sectionSteps) as [GuidedTourStepKey];
86
+ const isFirstStepDone = sectionSteps[firstStep];
87
+
88
+ if (isSectionToShow && !currentStep && !isFirstStepDone) {
89
+ setCurrentStep(`${sectionName}.${firstStep}`);
90
+ }
91
+ }
92
+ };
93
+
94
+ const setSkipped = (value: SetSkippedAction['value']) => {
95
+ auth.set(value, 'GUIDED_TOUR_SKIPPED', true);
96
+
97
+ dispatch({
98
+ type: 'SET_SKIPPED',
99
+ value,
100
+ });
101
+ };
102
+
103
+ return (
104
+ <GuidedTourProviderComponent
105
+ guidedTourState={guidedTourState}
106
+ currentStep={currentStep}
107
+ setCurrentStep={setCurrentStep}
108
+ setGuidedTourVisibility={setGuidedTourVisibility}
109
+ setSkipped={setSkipped}
110
+ setStepState={setStepState}
111
+ startSection={startSection}
112
+ isGuidedTourVisible={isGuidedTourVisible}
113
+ isSkipped={isSkipped}
114
+ >
115
+ {children}
116
+ </GuidedTourProviderComponent>
117
+ );
118
+ };
119
+
120
+ type State = Pick<
121
+ GuidedTourContextValue,
122
+ 'guidedTourState' | 'currentStep' | 'isGuidedTourVisible' | 'isSkipped'
123
+ >;
124
+
125
+ const initialState = {
126
+ currentStep: null,
127
+ guidedTourState: {
128
+ contentTypeBuilder: {
129
+ create: false,
130
+ success: false,
131
+ },
132
+ contentManager: {
133
+ create: false,
134
+ success: false,
135
+ },
136
+ apiTokens: {
137
+ create: false,
138
+ success: false,
139
+ },
140
+ },
141
+ isGuidedTourVisible: false,
142
+ isSkipped: false,
143
+ } satisfies State;
144
+
145
+ interface SetCurrentStepAction {
146
+ type: 'SET_CURRENT_STEP';
147
+ step: GuidedTourStep | null;
148
+ }
149
+
150
+ interface SetStepStateAction {
151
+ type: 'SET_STEP_STATE';
152
+ currentStep: GuidedTourStep;
153
+ value: boolean;
154
+ }
155
+
156
+ interface SetSkippedAction {
157
+ type: 'SET_SKIPPED';
158
+ value: boolean;
159
+ }
160
+
161
+ interface SetGuidedTourVisibilityAction {
162
+ type: 'SET_GUIDED_TOUR_VISIBILITY';
163
+ value: boolean;
164
+ }
165
+
166
+ type Action =
167
+ | SetCurrentStepAction
168
+ | SetStepStateAction
169
+ | SetSkippedAction
170
+ | SetGuidedTourVisibilityAction;
171
+
172
+ const reducer: React.Reducer<State, Action> = (state: State = initialState, action: Action) =>
173
+ produce(state, (draftState) => {
174
+ switch (action.type) {
175
+ case 'SET_CURRENT_STEP': {
176
+ draftState.currentStep = action.step;
177
+ break;
178
+ }
179
+ case 'SET_STEP_STATE': {
180
+ const [section, step] = action.currentStep.split('.') as [
181
+ GuidedTourSectionKey,
182
+ GuidedTourStepKey
183
+ ];
184
+ draftState.guidedTourState[section][step] = action.value;
185
+ break;
186
+ }
187
+ case 'SET_SKIPPED': {
188
+ draftState.isSkipped = action.value;
189
+ break;
190
+ }
191
+ case 'SET_GUIDED_TOUR_VISIBILITY': {
192
+ draftState.isGuidedTourVisible = action.value;
193
+ break;
194
+ }
195
+ default: {
196
+ return draftState;
197
+ }
198
+ }
199
+ });
200
+
201
+ const initialiseState = (initialState: State) => {
202
+ const copyInitialState = { ...initialState };
203
+ const guidedTourLocaleStorage = auth.get('GUIDED_TOUR_COMPLETED_STEPS');
204
+ const currentStepLocaleStorage = auth.get('GUIDED_TOUR_CURRENT_STEP');
205
+ const skippedLocaleStorage = auth.get('GUIDED_TOUR_SKIPPED');
206
+
207
+ if (Array.isArray(guidedTourLocaleStorage)) {
208
+ guidedTourLocaleStorage.forEach((step) => {
209
+ const [sectionName, stepName] = step.split('.');
210
+ set(copyInitialState, ['guidedTourState', sectionName, stepName], true);
211
+ });
212
+ }
213
+
214
+ // if current step when initializing mark it as done
215
+ if (currentStepLocaleStorage) {
216
+ const [sectionName, stepName] = currentStepLocaleStorage.split('.') as [
217
+ GuidedTourSectionKey,
218
+ GuidedTourStepKey
219
+ ];
220
+ set(copyInitialState, ['guidedTourState', sectionName, stepName], true);
221
+
222
+ addCompletedStep(currentStepLocaleStorage as GuidedTourStep);
223
+
224
+ auth.set(null, 'GUIDED_TOUR_CURRENT_STEP', true);
225
+ }
226
+
227
+ if (skippedLocaleStorage !== null) {
228
+ set(copyInitialState, 'isSkipped', skippedLocaleStorage);
229
+ }
230
+
231
+ return copyInitialState;
232
+ };
233
+
234
+ /**
235
+ * @description Add a completed step to the local storage if it does not already exist.
236
+ */
237
+ const addCompletedStep = (completedStep: GuidedTourStep) => {
238
+ const currentSteps = auth.get('GUIDED_TOUR_COMPLETED_STEPS') ?? [];
239
+
240
+ if (!Array.isArray(currentSteps)) {
241
+ return;
242
+ }
243
+
244
+ const isAlreadyStored = currentSteps.includes(completedStep);
245
+
246
+ if (isAlreadyStored) {
247
+ return;
248
+ }
249
+
250
+ auth.set([...currentSteps, completedStep], 'GUIDED_TOUR_COMPLETED_STEPS', true);
251
+ };
252
+
253
+ export { GuidedTourProvider };
@@ -1,4 +1,4 @@
1
- const layout = {
1
+ const LAYOUT_DATA = {
2
2
  contentTypeBuilder: {
3
3
  home: {
4
4
  title: {
@@ -157,6 +157,16 @@ const layout = {
157
157
  trackingEvent: 'didGenerateGuidedTourApiTokens',
158
158
  },
159
159
  },
160
- };
160
+ } as const;
161
161
 
162
- export default layout;
162
+ const STATES = {
163
+ IS_DONE: 'IS_DONE',
164
+ IS_ACTIVE: 'IS_ACTIVE',
165
+ IS_NOT_DONE: 'IS_NOT_DONE',
166
+ } as const;
167
+
168
+ type LayoutData = typeof LAYOUT_DATA;
169
+ type States = keyof typeof STATES;
170
+
171
+ export { LAYOUT_DATA, STATES };
172
+ export type { LayoutData, States };