@strapi/admin 4.14.3 → 4.14.4

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 (544) hide show
  1. package/.eslintrc.js +4 -1
  2. package/admin/.eslintrc.js +16 -0
  3. package/admin/custom.d.ts +8 -0
  4. package/admin/src/components/AuthenticatedApp/index.js +3 -7
  5. package/admin/src/components/AuthenticatedApp/utils/api.js +1 -39
  6. package/admin/src/components/AuthenticatedApp/utils/checkLatestStrapiVersion.ts +13 -0
  7. package/admin/src/{hooks/useReleaseNotification/utils/api.js → components/AuthenticatedApp/utils/fetchStrapiLatestRelease.ts} +2 -3
  8. package/admin/src/components/{DragLayer/DragLayer.js → DragLayer.tsx} +18 -10
  9. package/admin/src/components/PrivateRoute.tsx +42 -0
  10. package/admin/src/components/Providers/index.js +2 -2
  11. package/admin/src/components/Theme.tsx +39 -0
  12. package/admin/src/components/ThemeToggleProvider.tsx +50 -0
  13. package/admin/src/components/{UnauthenticatedLogo/index.js → UnauthenticatedLogo.tsx} +2 -4
  14. package/admin/src/content-manager/components/BlocksEditor/BlocksInput/index.js +22 -3
  15. package/admin/src/content-manager/components/BlocksEditor/Toolbar/index.js +263 -134
  16. package/admin/src/content-manager/components/BlocksEditor/hooks/useBlocksStore.js +362 -95
  17. package/admin/src/content-manager/components/BlocksEditor/hooks/useModifiersStore.js +15 -0
  18. package/admin/src/content-manager/components/BlocksEditor/index.js +99 -9
  19. package/admin/src/content-manager/components/BlocksEditor/plugins/index.js +4 -0
  20. package/admin/src/content-manager/components/BlocksEditor/plugins/withLinks.js +61 -0
  21. package/admin/src/content-manager/components/BlocksEditor/plugins/withStrapiSchema.js +33 -0
  22. package/admin/src/content-manager/components/BlocksEditor/utils/links.js +90 -0
  23. package/admin/src/content-manager/components/InputUID/index.js +1 -1
  24. package/admin/src/content-manager/hooks/useAllowedAttributes.js +9 -1
  25. package/admin/src/content-manager/pages/EditSettingsView/index.js +1 -0
  26. package/admin/src/content-manager/pages/EditSettingsView/utils/createPossibleMainFieldsForModelsAndComponents.js +1 -0
  27. package/admin/src/content-manager/pages/ListSettingsView/constants.js +1 -0
  28. package/admin/src/content-manager/pages/ListView/index.js +2 -1
  29. package/admin/src/content-manager/utils/checkIfAttributeIsDisplayable.js +1 -1
  30. package/admin/src/content-manager/utils/schema.js +2 -2
  31. package/admin/src/contexts/configuration.ts +15 -0
  32. package/admin/src/contexts/index.js +1 -2
  33. package/admin/src/contexts/themeToggle.ts +16 -0
  34. package/admin/src/hooks/{useConfigurations/__mocks__/index.js → __mocks__/useConfigurations.ts} +4 -2
  35. package/admin/src/hooks/index.js +1 -5
  36. package/admin/src/hooks/useConfigurations.ts +5 -0
  37. package/admin/src/hooks/useDebounce.ts +17 -0
  38. package/admin/src/hooks/useLicenseLimitNotification.ts +3 -0
  39. package/admin/src/hooks/useThemeToggle.ts +9 -0
  40. package/admin/src/pages/App/index.js +1 -1
  41. package/admin/src/pages/AuthPage/components/ForgotPassword/index.js +1 -1
  42. package/admin/src/pages/AuthPage/components/ForgotPasswordSuccess/index.js +1 -1
  43. package/admin/src/pages/AuthPage/components/Login/BaseLogin.js +1 -1
  44. package/admin/src/pages/AuthPage/components/Oops/index.js +1 -1
  45. package/admin/src/pages/AuthPage/components/Register/index.js +1 -1
  46. package/admin/src/pages/AuthPage/components/ResetPassword/index.js +1 -1
  47. package/admin/src/pages/MarketplacePage/components/NpmPackageCard/index.js +0 -2
  48. package/admin/src/pages/MarketplacePage/hooks/__mocks__/useNavigatorOnline.ts +1 -0
  49. package/admin/src/{hooks/useNavigatorOnLine/index.js → pages/MarketplacePage/hooks/useNavigatorOnline.ts} +4 -6
  50. package/admin/src/pages/MarketplacePage/index.js +3 -3
  51. package/admin/src/pages/ProfilePage/index.js +1 -1
  52. package/admin/src/pages/SettingsPage/components/Tokens/Regenerate/index.js +1 -1
  53. package/admin/src/{hooks/useRegenerate/index.js → pages/SettingsPage/hooks/useRegenerate.ts} +13 -7
  54. package/admin/src/pages/SettingsPage/pages/ApiTokens/EditView/components/Regenerate/index.js +1 -1
  55. package/admin/src/pages/UseCasePage/index.js +1 -1
  56. package/admin/src/translations/en.json +8 -0
  57. package/admin/tsconfig.json +5 -0
  58. package/build/1049.f7aed23d.chunk.js +1 -0
  59. package/build/{1227.969e24e6.chunk.js → 1227.f9c74718.chunk.js} +1 -1
  60. package/build/{1386.db9a2795.chunk.js → 1386.6b8819c6.chunk.js} +2 -2
  61. package/build/2224.8af54440.chunk.js +138 -0
  62. package/build/2225.d1bcf7e3.chunk.js +79 -0
  63. package/build/2379.f0baf826.chunk.js +1 -0
  64. package/build/{2395.f6ac2863.chunk.js → 2395.aca6ce66.chunk.js} +1 -1
  65. package/build/2421.a478ba24.chunk.js +105 -0
  66. package/build/2801.c49f88a1.chunk.js +1 -0
  67. package/build/{3483.f6b2439f.chunk.js → 3483.5df8e010.chunk.js} +1 -1
  68. package/build/3911.d4fada48.chunk.js +95 -0
  69. package/build/412.72afdf0c.chunk.js +689 -0
  70. package/build/{4174.3e13fb26.chunk.js → 4174.df9aa09a.chunk.js} +1 -1
  71. package/build/502.8666bbef.chunk.js +25 -0
  72. package/build/570.2f3b4c56.chunk.js +1 -0
  73. package/build/5702.5b433d50.chunk.js +1 -0
  74. package/build/6186.c33ce082.chunk.js +116 -0
  75. package/build/7464.43a4527c.chunk.js +1 -0
  76. package/build/7818.d2196a53.chunk.js +29 -0
  77. package/build/7897.5c03247b.chunk.js +25 -0
  78. package/build/{8276.951e198e.chunk.js → 8276.d4426fd8.chunk.js} +3 -3
  79. package/build/8690.33243bba.chunk.js +38 -0
  80. package/build/{9832.65ed5a44.chunk.js → 8743.31c921b1.chunk.js} +139 -123
  81. package/build/9218.8bc01ab9.chunk.js +1 -0
  82. package/build/Admin-authenticatedApp.27545a1b.chunk.js +112 -0
  83. package/build/{Admin_InternalErrorPage.b3163562.chunk.js → Admin_InternalErrorPage.b66ee9c1.chunk.js} +1 -1
  84. package/build/Admin_homePage.a6281dd6.chunk.js +124 -0
  85. package/build/Admin_marketplace.31b962b8.chunk.js +44 -0
  86. package/build/{Admin_pluginsPage.b9fa2947.chunk.js → Admin_pluginsPage.9217101d.chunk.js} +1 -1
  87. package/build/{Admin_profilePage.a4d41380.chunk.js → Admin_profilePage.680123d9.chunk.js} +2 -2
  88. package/build/{Admin_settingsPage.6dc2af9f.chunk.js → Admin_settingsPage.33378310.chunk.js} +1 -1
  89. package/build/{Upload_ConfigureTheView.cc7ca628.chunk.js → Upload_ConfigureTheView.b40eea4d.chunk.js} +1 -1
  90. package/build/admin-app.e8c52c37.chunk.js +36 -0
  91. package/build/admin-edit-roles-page.fcf056bf.chunk.js +275 -0
  92. package/build/{admin-edit-users.9b42cc9e.chunk.js → admin-edit-users.89efe3c4.chunk.js} +2 -2
  93. package/build/{admin-roles-list.cf964578.chunk.js → admin-roles-list.8b77704a.chunk.js} +3 -3
  94. package/build/admin-users.e3f1be14.chunk.js +19 -0
  95. package/build/{api-tokens-create-page.2f25ddf6.chunk.js → api-tokens-create-page.0dd63e91.chunk.js} +1 -1
  96. package/build/{api-tokens-edit-page.45faac16.chunk.js → api-tokens-edit-page.78d877f8.chunk.js} +1 -1
  97. package/build/{api-tokens-list-page.5baabf1a.chunk.js → api-tokens-list-page.ae13346c.chunk.js} +2 -2
  98. package/build/audit-logs-settings-page.e9c92a75.chunk.js +9 -0
  99. package/build/content-manager.5849dbe3.chunk.js +1226 -0
  100. package/build/{content-type-builder-list-view.aa8a5d1a.chunk.js → content-type-builder-list-view.3fffae65.chunk.js} +1 -1
  101. package/build/{content-type-builder-translation-en-json.b9e5cacd.chunk.js → content-type-builder-translation-en-json.43f9d7bc.chunk.js} +1 -1
  102. package/build/{content-type-builder.885f2cad.chunk.js → content-type-builder.98c71164.chunk.js} +14 -14
  103. package/build/{email-settings-page.6bd7b280.chunk.js → email-settings-page.ecfec9b3.chunk.js} +1 -1
  104. package/build/{en-json.a3973ff5.chunk.js → en-json.bd611a8e.chunk.js} +1 -1
  105. package/build/{i18n-settings-page.6c0157e7.chunk.js → i18n-settings-page.a9708926.chunk.js} +1 -1
  106. package/build/index.html +1 -1
  107. package/build/main.3abb6f34.js +3278 -0
  108. package/build/{review-workflows-settings-create-view.ae369a88.chunk.js → review-workflows-settings-create-view.b7b0c6c5.chunk.js} +1 -1
  109. package/build/{review-workflows-settings-edit-view.9a61c69f.chunk.js → review-workflows-settings-edit-view.c331b3fe.chunk.js} +1 -1
  110. package/build/review-workflows-settings-list-view.70218dc1.chunk.js +75 -0
  111. package/build/{runtime~main.377a22d0.js → runtime~main.450561b1.js} +1 -1
  112. package/build/{sso-settings-page.a29e6c38.chunk.js → sso-settings-page.1a9e7f8f.chunk.js} +1 -1
  113. package/build/{transfer-tokens-create-page.6e1b8cee.chunk.js → transfer-tokens-create-page.e7f541d3.chunk.js} +1 -1
  114. package/build/{transfer-tokens-edit-page.10bb22e2.chunk.js → transfer-tokens-edit-page.bd1276c2.chunk.js} +1 -1
  115. package/build/{transfer-tokens-list-page.0306652c.chunk.js → transfer-tokens-list-page.5de6bb9f.chunk.js} +2 -2
  116. package/build/upload-settings.97ef4c92.chunk.js +14 -0
  117. package/build/{upload.19e14c8e.chunk.js → upload.f08715a1.chunk.js} +1 -1
  118. package/build/{users-advanced-settings-page.ed69812f.chunk.js → users-advanced-settings-page.36a3c363.chunk.js} +1 -1
  119. package/build/users-email-settings-page.47b47962.chunk.js +149 -0
  120. package/build/users-providers-settings-page.1e0c8376.chunk.js +154 -0
  121. package/build/{users-roles-settings-page.afab5a0d.chunk.js → users-roles-settings-page.d5a8e8a1.chunk.js} +4 -4
  122. package/build/{webhook-edit-page.4c037da4.chunk.js → webhook-edit-page.87456194.chunk.js} +3 -3
  123. package/build/{webhook-list-page.56c82f4a.chunk.js → webhook-list-page.c88a382b.chunk.js} +3 -3
  124. package/ee/admin/hooks/{useLicenseLimitNotification.js → useLicenseLimitNotification.ts} +4 -4
  125. package/ee/admin/pages/AuthPage/components/Providers/index.js +1 -1
  126. package/ee/admin/pages/SettingsPage/pages/Users/ListPage/index.js +1 -3
  127. package/package.json +12 -11
  128. package/scripts/build.js +6 -2
  129. package/webpack.config.js +1 -0
  130. package/admin/src/components/AuthenticatedApp/utils/checkLatestStrapiVersion.js +0 -11
  131. package/admin/src/components/DragLayer/index.js +0 -1
  132. package/admin/src/components/GlobalStyle/index.js +0 -9
  133. package/admin/src/components/PrivateRoute/index.js +0 -46
  134. package/admin/src/components/Theme/index.js +0 -26
  135. package/admin/src/components/ThemeToggleProvider/index.js +0 -79
  136. package/admin/src/contexts/Configurations/index.js +0 -5
  137. package/admin/src/contexts/ThemeToggle/index.js +0 -5
  138. package/admin/src/hooks/useConfigurations/index.js +0 -11
  139. package/admin/src/hooks/useDebounce/index.js +0 -19
  140. package/admin/src/hooks/useLicenseLimitNotification/index.js +0 -5
  141. package/admin/src/hooks/useReleaseNotification/index.js +0 -31
  142. package/admin/src/hooks/useReleaseNotification/utils/checkLatestStrapiVersion.js +0 -11
  143. package/admin/src/hooks/useThemeToggle/index.js +0 -11
  144. package/admin/src/tsconfig.json +0 -10
  145. package/build/1049.acb0e730.chunk.js +0 -1
  146. package/build/2225.78fb9b89.chunk.js +0 -79
  147. package/build/2379.906334f0.chunk.js +0 -1
  148. package/build/2614.3e088d3e.chunk.js +0 -35
  149. package/build/2659.cb94f1e7.chunk.js +0 -105
  150. package/build/2801.2afb4757.chunk.js +0 -1
  151. package/build/2950.216f2e89.chunk.js +0 -1
  152. package/build/3021.33ad47fb.chunk.js +0 -103
  153. package/build/3911.488fbde3.chunk.js +0 -95
  154. package/build/4546.1203ac95.chunk.js +0 -1
  155. package/build/502.9918bff7.chunk.js +0 -1
  156. package/build/5158.c85f841a.chunk.js +0 -1
  157. package/build/6266.e8990811.chunk.js +0 -146
  158. package/build/7464.0280cf59.chunk.js +0 -1
  159. package/build/7897.4a39de37.chunk.js +0 -6
  160. package/build/Admin-authenticatedApp.a16cdc37.chunk.js +0 -112
  161. package/build/Admin_homePage.6cb51f18.chunk.js +0 -81
  162. package/build/Admin_marketplace.3eb5e132.chunk.js +0 -55
  163. package/build/admin-app.98cdf43a.chunk.js +0 -36
  164. package/build/admin-edit-roles-page.418bb1c5.chunk.js +0 -267
  165. package/build/admin-users.8385dd73.chunk.js +0 -11
  166. package/build/audit-logs-settings-page.91489670.chunk.js +0 -1
  167. package/build/content-manager.e1e49cc9.chunk.js +0 -1199
  168. package/build/main.105dcf23.js +0 -2665
  169. package/build/review-workflows-settings-list-view.067e0c35.chunk.js +0 -56
  170. package/build/upload-settings.0af6edc5.chunk.js +0 -14
  171. package/build/users-email-settings-page.131a00fb.chunk.js +0 -9
  172. package/build/users-providers-settings-page.b3dca41d.chunk.js +0 -14
  173. package/dist/server/admin/server/src/bootstrap.d.ts +0 -2
  174. package/dist/server/admin/server/src/controllers/admin.d.ts +0 -42
  175. package/dist/server/admin/server/src/controllers/api-token.d.ts +0 -10
  176. package/dist/server/admin/server/src/controllers/authenticated-user.d.ts +0 -6
  177. package/dist/server/admin/server/src/controllers/authentication.d.ts +0 -12
  178. package/dist/server/admin/server/src/controllers/permission.d.ts +0 -13
  179. package/dist/server/admin/server/src/controllers/role.d.ts +0 -43
  180. package/dist/server/admin/server/src/controllers/transfer/token.d.ts +0 -9
  181. package/dist/server/admin/server/src/controllers/user.d.ts +0 -13
  182. package/dist/server/admin/server/src/destroy.d.ts +0 -2
  183. package/dist/server/admin/server/src/domain/condition/index.d.ts +0 -56
  184. package/dist/server/admin/server/src/domain/condition/index.js +0 -53
  185. package/dist/server/admin/server/src/domain/condition/index.js.map +0 -1
  186. package/dist/server/admin/server/src/domain/condition/provider.d.ts +0 -30
  187. package/dist/server/admin/server/src/domain/condition/provider.js +0 -37
  188. package/dist/server/admin/server/src/domain/condition/provider.js.map +0 -1
  189. package/dist/server/admin/server/src/index.d.ts +0 -10
  190. package/dist/server/admin/server/src/middlewares/data-transfer.d.ts +0 -2
  191. package/dist/server/admin/server/src/services/action.d.ts +0 -9
  192. package/dist/server/admin/server/src/services/auth.d.ts +0 -42
  193. package/dist/server/admin/server/src/services/condition.d.ts +0 -2
  194. package/dist/server/admin/server/src/services/content-type.d.ts +0 -51
  195. package/dist/server/admin/server/src/services/index.d.ts +0 -61
  196. package/dist/server/admin/server/src/services/metrics.d.ts +0 -7
  197. package/dist/server/admin/server/src/services/permission/engine.d.ts +0 -15
  198. package/dist/server/admin/server/src/services/permission/queries.d.ts +0 -44
  199. package/dist/server/admin/server/src/services/permission.d.ts +0 -67
  200. package/dist/server/admin/server/src/services/role.d.ts +0 -116
  201. package/dist/server/admin/server/src/services/transfer/token.d.ts +0 -103
  202. package/dist/server/admin/server/src/services/transfer/utils.d.ts +0 -19
  203. package/dist/server/admin/server/src/services/user.d.ts +0 -96
  204. package/dist/server/admin/server/src/strategies/admin.d.ts +0 -25
  205. package/dist/server/admin/server/src/strategies/api-token.d.ts +0 -60
  206. package/dist/server/admin/server/src/strategies/data-transfer.d.ts +0 -50
  207. package/dist/server/admin/server/src/validation/common-validators.d.ts +0 -59
  208. package/dist/server/admin/server/src/validation/permission.d.ts +0 -9
  209. package/dist/server/bootstrap.d.ts +0 -2
  210. package/dist/server/bootstrap.js +0 -84
  211. package/dist/server/bootstrap.js.map +0 -1
  212. package/dist/server/config/admin-actions.d.ts +0 -33
  213. package/dist/server/config/admin-actions.js +0 -219
  214. package/dist/server/config/admin-actions.js.map +0 -1
  215. package/dist/server/config/admin-conditions.d.ts +0 -46
  216. package/dist/server/config/admin-conditions.js +0 -29
  217. package/dist/server/config/admin-conditions.js.map +0 -1
  218. package/dist/server/config/email-templates/forgot-password.d.ts +0 -6
  219. package/dist/server/config/email-templates/forgot-password.js +0 -19
  220. package/dist/server/config/email-templates/forgot-password.js.map +0 -1
  221. package/dist/server/config/index.d.ts +0 -17
  222. package/dist/server/config/index.js +0 -14
  223. package/dist/server/config/index.js.map +0 -1
  224. package/dist/server/config/settings.d.ts +0 -7
  225. package/dist/server/config/settings.js +0 -11
  226. package/dist/server/config/settings.js.map +0 -1
  227. package/dist/server/content-types/Permission.d.ts +0 -62
  228. package/dist/server/content-types/Permission.js +0 -64
  229. package/dist/server/content-types/Permission.js.map +0 -1
  230. package/dist/server/content-types/Role.d.ts +0 -57
  231. package/dist/server/content-types/Role.js +0 -59
  232. package/dist/server/content-types/Role.js.map +0 -1
  233. package/dist/server/content-types/User.d.ts +0 -106
  234. package/dist/server/content-types/User.js +0 -109
  235. package/dist/server/content-types/User.js.map +0 -1
  236. package/dist/server/content-types/api-token-permission.d.ts +0 -35
  237. package/dist/server/content-types/api-token-permission.js +0 -37
  238. package/dist/server/content-types/api-token-permission.js.map +0 -1
  239. package/dist/server/content-types/api-token.d.ts +0 -73
  240. package/dist/server/content-types/api-token.js +0 -79
  241. package/dist/server/content-types/api-token.js.map +0 -1
  242. package/dist/server/content-types/index.d.ts +0 -437
  243. package/dist/server/content-types/index.js +0 -22
  244. package/dist/server/content-types/index.js.map +0 -1
  245. package/dist/server/content-types/transfer-token-permission.d.ts +0 -35
  246. package/dist/server/content-types/transfer-token-permission.js +0 -37
  247. package/dist/server/content-types/transfer-token-permission.js.map +0 -1
  248. package/dist/server/content-types/transfer-token.d.ts +0 -65
  249. package/dist/server/content-types/transfer-token.js +0 -67
  250. package/dist/server/content-types/transfer-token.js.map +0 -1
  251. package/dist/server/controllers/admin.d.ts +0 -42
  252. package/dist/server/controllers/admin.js +0 -131
  253. package/dist/server/controllers/admin.js.map +0 -1
  254. package/dist/server/controllers/api-token.d.ts +0 -10
  255. package/dist/server/controllers/api-token.js +0 -106
  256. package/dist/server/controllers/api-token.js.map +0 -1
  257. package/dist/server/controllers/authenticated-user.d.ts +0 -6
  258. package/dist/server/controllers/authenticated-user.js +0 -41
  259. package/dist/server/controllers/authenticated-user.js.map +0 -1
  260. package/dist/server/controllers/authentication.d.ts +0 -12
  261. package/dist/server/controllers/authentication.js +0 -130
  262. package/dist/server/controllers/authentication.js.map +0 -1
  263. package/dist/server/controllers/content-api.d.ts +0 -5
  264. package/dist/server/controllers/content-api.js +0 -13
  265. package/dist/server/controllers/content-api.js.map +0 -1
  266. package/dist/server/controllers/formatters/conditions.d.ts +0 -3
  267. package/dist/server/controllers/formatters/conditions.js +0 -9
  268. package/dist/server/controllers/formatters/conditions.js.map +0 -1
  269. package/dist/server/controllers/formatters/format-actions-by-sections.d.ts +0 -7
  270. package/dist/server/controllers/formatters/format-actions-by-sections.js +0 -36
  271. package/dist/server/controllers/formatters/format-actions-by-sections.js.map +0 -1
  272. package/dist/server/controllers/formatters/index.d.ts +0 -2
  273. package/dist/server/controllers/formatters/index.js +0 -11
  274. package/dist/server/controllers/formatters/index.js.map +0 -1
  275. package/dist/server/controllers/index.d.ts +0 -68
  276. package/dist/server/controllers/index.js +0 -51
  277. package/dist/server/controllers/index.js.map +0 -1
  278. package/dist/server/controllers/permission.d.ts +0 -13
  279. package/dist/server/controllers/permission.js +0 -38
  280. package/dist/server/controllers/permission.js.map +0 -1
  281. package/dist/server/controllers/role.d.ts +0 -43
  282. package/dist/server/controllers/role.js +0 -148
  283. package/dist/server/controllers/role.js.map +0 -1
  284. package/dist/server/controllers/transfer/index.d.ts +0 -4
  285. package/dist/server/controllers/transfer/index.js +0 -14
  286. package/dist/server/controllers/transfer/index.js.map +0 -1
  287. package/dist/server/controllers/transfer/runner.d.ts +0 -6
  288. package/dist/server/controllers/transfer/runner.js +0 -25
  289. package/dist/server/controllers/transfer/runner.js.map +0 -1
  290. package/dist/server/controllers/transfer/token.d.ts +0 -9
  291. package/dist/server/controllers/transfer/token.js +0 -100
  292. package/dist/server/controllers/transfer/token.js.map +0 -1
  293. package/dist/server/controllers/user.d.ts +0 -13
  294. package/dist/server/controllers/user.js +0 -105
  295. package/dist/server/controllers/user.js.map +0 -1
  296. package/dist/server/controllers/webhooks.d.ts +0 -10
  297. package/dist/server/controllers/webhooks.js +0 -100
  298. package/dist/server/controllers/webhooks.js.map +0 -1
  299. package/dist/server/destroy.d.ts +0 -2
  300. package/dist/server/destroy.js +0 -9
  301. package/dist/server/destroy.js.map +0 -1
  302. package/dist/server/domain/action/index.d.ts +0 -33
  303. package/dist/server/domain/action/index.js +0 -98
  304. package/dist/server/domain/action/index.js.map +0 -1
  305. package/dist/server/domain/action/provider.d.ts +0 -38
  306. package/dist/server/domain/action/provider.js +0 -66
  307. package/dist/server/domain/action/provider.js.map +0 -1
  308. package/dist/server/domain/condition/index.d.ts +0 -53
  309. package/dist/server/domain/condition/index.js +0 -56
  310. package/dist/server/domain/condition/index.js.map +0 -1
  311. package/dist/server/domain/condition/provider.d.ts +0 -30
  312. package/dist/server/domain/condition/provider.js +0 -37
  313. package/dist/server/domain/condition/provider.js.map +0 -1
  314. package/dist/server/domain/permission/index.d.ts +0 -77
  315. package/dist/server/domain/permission/index.js +0 -119
  316. package/dist/server/domain/permission/index.js.map +0 -1
  317. package/dist/server/domain/user.d.ts +0 -32
  318. package/dist/server/domain/user.js +0 -28
  319. package/dist/server/domain/user.js.map +0 -1
  320. package/dist/server/index.d.ts +0 -10
  321. package/dist/server/index.js +0 -27
  322. package/dist/server/index.js.map +0 -1
  323. package/dist/server/middlewares/data-transfer.d.ts +0 -2
  324. package/dist/server/middlewares/data-transfer.js +0 -21
  325. package/dist/server/middlewares/data-transfer.js.map +0 -1
  326. package/dist/server/middlewares/index.d.ts +0 -9
  327. package/dist/server/middlewares/index.js +0 -17
  328. package/dist/server/middlewares/index.js.map +0 -1
  329. package/dist/server/middlewares/rateLimit.d.ts +0 -5
  330. package/dist/server/middlewares/rateLimit.js +0 -42
  331. package/dist/server/middlewares/rateLimit.js.map +0 -1
  332. package/dist/server/policies/hasPermissions.d.ts +0 -6
  333. package/dist/server/policies/hasPermissions.js +0 -38
  334. package/dist/server/policies/hasPermissions.js.map +0 -1
  335. package/dist/server/policies/index.d.ts +0 -14
  336. package/dist/server/policies/index.js +0 -10
  337. package/dist/server/policies/index.js.map +0 -1
  338. package/dist/server/policies/isAuthenticatedAdmin.d.ts +0 -2
  339. package/dist/server/policies/isAuthenticatedAdmin.js +0 -6
  340. package/dist/server/policies/isAuthenticatedAdmin.js.map +0 -1
  341. package/dist/server/policies/isTelemetryEnabled.d.ts +0 -10
  342. package/dist/server/policies/isTelemetryEnabled.js +0 -18
  343. package/dist/server/policies/isTelemetryEnabled.js.map +0 -1
  344. package/dist/server/register.d.ts +0 -2
  345. package/dist/server/register.js +0 -18
  346. package/dist/server/register.js.map +0 -1
  347. package/dist/server/routes/admin.d.ts +0 -23
  348. package/dist/server/routes/admin.js +0 -72
  349. package/dist/server/routes/admin.js.map +0 -1
  350. package/dist/server/routes/api-tokens.d.ts +0 -14
  351. package/dist/server/routes/api-tokens.js +0 -71
  352. package/dist/server/routes/api-tokens.js.map +0 -1
  353. package/dist/server/routes/authentication.d.ts +0 -29
  354. package/dist/server/routes/authentication.js +0 -58
  355. package/dist/server/routes/authentication.js.map +0 -1
  356. package/dist/server/routes/content-api.d.ts +0 -9
  357. package/dist/server/routes/content-api.js +0 -21
  358. package/dist/server/routes/content-api.js.map +0 -1
  359. package/dist/server/routes/index.d.ts +0 -66
  360. package/dist/server/routes/index.js +0 -32
  361. package/dist/server/routes/index.js.map +0 -1
  362. package/dist/server/routes/permissions.d.ts +0 -9
  363. package/dist/server/routes/permissions.js +0 -21
  364. package/dist/server/routes/permissions.js.map +0 -1
  365. package/dist/server/routes/roles.d.ts +0 -14
  366. package/dist/server/routes/roles.js +0 -108
  367. package/dist/server/routes/roles.js.map +0 -1
  368. package/dist/server/routes/serve-admin-panel.d.ts +0 -5
  369. package/dist/server/routes/serve-admin-panel.js +0 -65
  370. package/dist/server/routes/serve-admin-panel.js.map +0 -1
  371. package/dist/server/routes/transfer.d.ts +0 -55
  372. package/dist/server/routes/transfer.js +0 -105
  373. package/dist/server/routes/transfer.js.map +0 -1
  374. package/dist/server/routes/users.d.ts +0 -14
  375. package/dist/server/routes/users.js +0 -89
  376. package/dist/server/routes/users.js.map +0 -1
  377. package/dist/server/routes/webhooks.d.ts +0 -14
  378. package/dist/server/routes/webhooks.js +0 -82
  379. package/dist/server/routes/webhooks.js.map +0 -1
  380. package/dist/server/services/action.d.ts +0 -9
  381. package/dist/server/services/action.js +0 -29
  382. package/dist/server/services/action.js.map +0 -1
  383. package/dist/server/services/api-token.d.ts +0 -102
  384. package/dist/server/services/api-token.js +0 -378
  385. package/dist/server/services/api-token.js.map +0 -1
  386. package/dist/server/services/auth.d.ts +0 -42
  387. package/dist/server/services/auth.js +0 -98
  388. package/dist/server/services/auth.js.map +0 -1
  389. package/dist/server/services/condition.d.ts +0 -2
  390. package/dist/server/services/condition.js +0 -11
  391. package/dist/server/services/condition.js.map +0 -1
  392. package/dist/server/services/constants.d.ts +0 -33
  393. package/dist/server/services/constants.js +0 -37
  394. package/dist/server/services/constants.js.map +0 -1
  395. package/dist/server/services/content-type.d.ts +0 -51
  396. package/dist/server/services/content-type.js +0 -158
  397. package/dist/server/services/content-type.js.map +0 -1
  398. package/dist/server/services/index.d.ts +0 -61
  399. package/dist/server/services/index.js +0 -57
  400. package/dist/server/services/index.js.map +0 -1
  401. package/dist/server/services/metrics.d.ts +0 -7
  402. package/dist/server/services/metrics.js +0 -37
  403. package/dist/server/services/metrics.js.map +0 -1
  404. package/dist/server/services/passport/local-strategy.d.ts +0 -3
  405. package/dist/server/services/passport/local-strategy.js +0 -28
  406. package/dist/server/services/passport/local-strategy.js.map +0 -1
  407. package/dist/server/services/passport.d.ts +0 -7
  408. package/dist/server/services/passport.js +0 -40
  409. package/dist/server/services/passport.js.map +0 -1
  410. package/dist/server/services/permission/engine.d.ts +0 -15
  411. package/dist/server/services/permission/engine.js +0 -67
  412. package/dist/server/services/permission/engine.js.map +0 -1
  413. package/dist/server/services/permission/permissions-manager/index.d.ts +0 -16
  414. package/dist/server/services/permission/permissions-manager/index.js +0 -48
  415. package/dist/server/services/permission/permissions-manager/index.js.map +0 -1
  416. package/dist/server/services/permission/permissions-manager/query-builders.d.ts +0 -3
  417. package/dist/server/services/permission/permissions-manager/query-builders.js +0 -66
  418. package/dist/server/services/permission/permissions-manager/query-builders.js.map +0 -1
  419. package/dist/server/services/permission/permissions-manager/sanitize.d.ts +0 -6
  420. package/dist/server/services/permission/permissions-manager/sanitize.js +0 -184
  421. package/dist/server/services/permission/permissions-manager/sanitize.js.map +0 -1
  422. package/dist/server/services/permission/permissions-manager/validate.d.ts +0 -5
  423. package/dist/server/services/permission/permissions-manager/validate.js +0 -134
  424. package/dist/server/services/permission/permissions-manager/validate.js.map +0 -1
  425. package/dist/server/services/permission/queries.d.ts +0 -44
  426. package/dist/server/services/permission/queries.js +0 -159
  427. package/dist/server/services/permission/queries.js.map +0 -1
  428. package/dist/server/services/permission/sections-builder/builder.d.ts +0 -39
  429. package/dist/server/services/permission/sections-builder/builder.js +0 -75
  430. package/dist/server/services/permission/sections-builder/builder.js.map +0 -1
  431. package/dist/server/services/permission/sections-builder/handlers.d.ts +0 -44
  432. package/dist/server/services/permission/sections-builder/handlers.js +0 -124
  433. package/dist/server/services/permission/sections-builder/handlers.js.map +0 -1
  434. package/dist/server/services/permission/sections-builder/index.d.ts +0 -8
  435. package/dist/server/services/permission/sections-builder/index.js +0 -39
  436. package/dist/server/services/permission/sections-builder/index.js.map +0 -1
  437. package/dist/server/services/permission/sections-builder/section.d.ts +0 -38
  438. package/dist/server/services/permission/sections-builder/section.js +0 -56
  439. package/dist/server/services/permission/sections-builder/section.js.map +0 -1
  440. package/dist/server/services/permission/sections-builder/utils.d.ts +0 -12
  441. package/dist/server/services/permission/sections-builder/utils.js +0 -23
  442. package/dist/server/services/permission/sections-builder/utils.js.map +0 -1
  443. package/dist/server/services/permission.d.ts +0 -67
  444. package/dist/server/services/permission.js +0 -33
  445. package/dist/server/services/permission.js.map +0 -1
  446. package/dist/server/services/project-settings.d.ts +0 -5
  447. package/dist/server/services/project-settings.js +0 -139
  448. package/dist/server/services/project-settings.js.map +0 -1
  449. package/dist/server/services/role.d.ts +0 -116
  450. package/dist/server/services/role.js +0 -382
  451. package/dist/server/services/role.js.map +0 -1
  452. package/dist/server/services/token.d.ts +0 -35
  453. package/dist/server/services/token.js +0 -58
  454. package/dist/server/services/token.js.map +0 -1
  455. package/dist/server/services/transfer/index.d.ts +0 -4
  456. package/dist/server/services/transfer/index.js +0 -33
  457. package/dist/server/services/transfer/index.js.map +0 -1
  458. package/dist/server/services/transfer/permission.d.ts +0 -6
  459. package/dist/server/services/transfer/permission.js +0 -20
  460. package/dist/server/services/transfer/permission.js.map +0 -1
  461. package/dist/server/services/transfer/token.d.ts +0 -84
  462. package/dist/server/services/transfer/token.js +0 -273
  463. package/dist/server/services/transfer/token.js.map +0 -1
  464. package/dist/server/services/transfer/utils.d.ts +0 -13
  465. package/dist/server/services/transfer/utils.js +0 -29
  466. package/dist/server/services/transfer/utils.js.map +0 -1
  467. package/dist/server/services/user.d.ts +0 -96
  468. package/dist/server/services/user.js +0 -311
  469. package/dist/server/services/user.js.map +0 -1
  470. package/dist/server/strategies/admin.d.ts +0 -25
  471. package/dist/server/strategies/admin.js +0 -44
  472. package/dist/server/strategies/admin.js.map +0 -1
  473. package/dist/server/strategies/api-token.d.ts +0 -60
  474. package/dist/server/strategies/api-token.js +0 -121
  475. package/dist/server/strategies/api-token.js.map +0 -1
  476. package/dist/server/strategies/data-transfer.d.ts +0 -66
  477. package/dist/server/strategies/data-transfer.js +0 -94
  478. package/dist/server/strategies/data-transfer.js.map +0 -1
  479. package/dist/server/strategies/index.d.ts +0 -17
  480. package/dist/server/strategies/index.js +0 -27
  481. package/dist/server/strategies/index.js.map +0 -1
  482. package/dist/server/types/src/types/utils/object.d.ts +0 -58
  483. package/dist/server/types/src/types/utils/object.js +0 -3
  484. package/dist/server/types/src/types/utils/object.js.map +0 -1
  485. package/dist/server/utils/index.d.ts +0 -1
  486. package/dist/server/utils/index.js +0 -9
  487. package/dist/server/utils/index.js.map +0 -1
  488. package/dist/server/utils/types.d.ts +0 -14
  489. package/dist/server/utils/types.js +0 -3
  490. package/dist/server/utils/types.js.map +0 -1
  491. package/dist/server/validation/action-provider.d.ts +0 -5
  492. package/dist/server/validation/action-provider.js +0 -58
  493. package/dist/server/validation/action-provider.js.map +0 -1
  494. package/dist/server/validation/api-tokens.d.ts +0 -7
  495. package/dist/server/validation/api-tokens.js +0 -36
  496. package/dist/server/validation/api-tokens.js.map +0 -1
  497. package/dist/server/validation/authentication/forgot-password.d.ts +0 -2
  498. package/dist/server/validation/authentication/forgot-password.js +0 -16
  499. package/dist/server/validation/authentication/forgot-password.js.map +0 -1
  500. package/dist/server/validation/authentication/index.d.ts +0 -5
  501. package/dist/server/validation/authentication/index.js +0 -17
  502. package/dist/server/validation/authentication/index.js.map +0 -1
  503. package/dist/server/validation/authentication/register.d.ts +0 -9
  504. package/dist/server/validation/authentication/register.js +0 -49
  505. package/dist/server/validation/authentication/register.js.map +0 -1
  506. package/dist/server/validation/authentication/renew-token.d.ts +0 -2
  507. package/dist/server/validation/authentication/renew-token.js +0 -6
  508. package/dist/server/validation/authentication/renew-token.js.map +0 -1
  509. package/dist/server/validation/authentication/reset-password.d.ts +0 -2
  510. package/dist/server/validation/authentication/reset-password.js +0 -17
  511. package/dist/server/validation/authentication/reset-password.js.map +0 -1
  512. package/dist/server/validation/common-functions/check-fields-are-correctly-nested.d.ts +0 -2
  513. package/dist/server/validation/common-functions/check-fields-are-correctly-nested.js +0 -26
  514. package/dist/server/validation/common-functions/check-fields-are-correctly-nested.js.map +0 -1
  515. package/dist/server/validation/common-functions/check-fields-dont-have-duplicates.d.ts +0 -2
  516. package/dist/server/validation/common-functions/check-fields-dont-have-duplicates.js +0 -18
  517. package/dist/server/validation/common-functions/check-fields-dont-have-duplicates.js.map +0 -1
  518. package/dist/server/validation/common-functions/index.d.ts +0 -3
  519. package/dist/server/validation/common-functions/index.js +0 -11
  520. package/dist/server/validation/common-functions/index.js.map +0 -1
  521. package/dist/server/validation/common-validators.d.ts +0 -59
  522. package/dist/server/validation/common-validators.js +0 -162
  523. package/dist/server/validation/common-validators.js.map +0 -1
  524. package/dist/server/validation/permission.d.ts +0 -9
  525. package/dist/server/validation/permission.js +0 -46
  526. package/dist/server/validation/permission.js.map +0 -1
  527. package/dist/server/validation/policies/hasPermissions.d.ts +0 -5
  528. package/dist/server/validation/policies/hasPermissions.js +0 -29
  529. package/dist/server/validation/policies/hasPermissions.js.map +0 -1
  530. package/dist/server/validation/project-settings.d.ts +0 -9
  531. package/dist/server/validation/project-settings.js +0 -44
  532. package/dist/server/validation/project-settings.js.map +0 -1
  533. package/dist/server/validation/role.d.ts +0 -11
  534. package/dist/server/validation/role.js +0 -62
  535. package/dist/server/validation/role.js.map +0 -1
  536. package/dist/server/validation/transfer/index.d.ts +0 -1
  537. package/dist/server/validation/transfer/index.js +0 -9
  538. package/dist/server/validation/transfer/index.js.map +0 -1
  539. package/dist/server/validation/transfer/token.d.ts +0 -7
  540. package/dist/server/validation/transfer/token.js +0 -46
  541. package/dist/server/validation/transfer/token.js.map +0 -1
  542. package/dist/server/validation/user.d.ts +0 -117
  543. package/dist/server/validation/user.js +0 -69
  544. package/dist/server/validation/user.js.map +0 -1
@@ -1,6 +1,17 @@
1
1
  import * as React from 'react';
2
2
 
3
- import { Box, Typography, BaseLink } from '@strapi/design-system';
3
+ import {
4
+ Box,
5
+ Typography,
6
+ BaseLink,
7
+ Popover,
8
+ IconButton,
9
+ Field,
10
+ FieldLabel,
11
+ FieldInput,
12
+ Flex,
13
+ Button,
14
+ } from '@strapi/design-system';
4
15
  import {
5
16
  Code,
6
17
  Quote,
@@ -12,11 +23,20 @@ import {
12
23
  HeadingFour,
13
24
  HeadingFive,
14
25
  HeadingSix,
26
+ Trash,
27
+ Pencil,
28
+ BulletList,
29
+ NumberList,
15
30
  } from '@strapi/icons';
16
31
  import PropTypes from 'prop-types';
17
- import { Editor, Path, Transforms } from 'slate';
32
+ import { useIntl } from 'react-intl';
33
+ import { Editor, Path, Transforms, Range } from 'slate';
34
+ import { useSlate, ReactEditor } from 'slate-react';
18
35
  import styled, { css } from 'styled-components';
19
36
 
37
+ import { composeRefs } from '../../../utils';
38
+ import { editLink, removeLink } from '../utils/links';
39
+
20
40
  const H1 = styled(Typography).attrs({ as: 'h1' })`
21
41
  font-size: ${42 / 16}rem;
22
42
  line-height: ${({ theme }) => theme.lineHeights[1]};
@@ -76,23 +96,24 @@ Heading.propTypes = {
76
96
 
77
97
  const CodeBlock = styled.pre.attrs({ role: 'code' })`
78
98
  border-radius: ${({ theme }) => theme.borderRadius};
79
- background-color: #32324d; // since the color is same between the themes
99
+ background-color: ${({ theme }) => theme.colors.neutral100};
80
100
  max-width: 100%;
81
101
  overflow: auto;
82
- padding: ${({ theme }) => theme.spaces[2]};
102
+ padding: ${({ theme }) => `${theme.spaces[3]} ${theme.spaces[4]}`};
103
+ flex-shrink: 0;
83
104
  & > code {
84
- color: #839496; // TODO: to confirm with design and get theme color
105
+ font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,
106
+ monospace;
107
+ color: ${({ theme }) => theme.colors.neutral800};
85
108
  overflow: auto;
86
109
  max-width: 100%;
87
- padding: ${({ theme }) => theme.spaces[2]};
88
110
  }
89
111
  `;
90
112
 
91
113
  const Blockquote = styled.blockquote.attrs({ role: 'blockquote' })`
92
- margin: ${({ theme }) => `${theme.spaces[6]} 0`};
114
+ margin: ${({ theme }) => `${theme.spaces[4]} 0`};
93
115
  font-weight: ${({ theme }) => theme.fontWeights.regular};
94
116
  border-left: ${({ theme }) => `${theme.spaces[1]} solid ${theme.colors.neutral150}`};
95
- font-style: italic;
96
117
  padding: ${({ theme }) => theme.spaces[2]} ${({ theme }) => theme.spaces[5]};
97
118
  `;
98
119
 
@@ -134,35 +155,42 @@ List.propTypes = {
134
155
  }).isRequired,
135
156
  };
136
157
 
137
- const Img = styled.img`
138
- max-width: 100%;
139
- `;
140
-
141
- const Image = ({ attributes, children, element }) => {
142
- if (!element.image) return null;
143
- const { url, alternativeText, width, height } = element.image;
158
+ /**
159
+ * @param {import('slate').Editor} editor
160
+ * @param {Path} currentListPath
161
+ */
162
+ const replaceListWithEmptyBlock = (editor, currentListPath) => {
163
+ // Delete the empty list
164
+ Transforms.removeNodes(editor, { at: currentListPath });
144
165
 
145
- return (
146
- <Box {...attributes}>
147
- {children}
148
- <Box contentEditable={false}>
149
- <Img src={url} alt={alternativeText} width={width} height={height} />
150
- </Box>
151
- </Box>
152
- );
166
+ if (currentListPath[0] === 0) {
167
+ // If the list was the only (or first) block element then insert empty paragraph as editor needs default value
168
+ Transforms.insertNodes(
169
+ editor,
170
+ {
171
+ type: 'paragraph',
172
+ children: [{ type: 'text', text: '' }],
173
+ },
174
+ { at: currentListPath }
175
+ );
176
+ Transforms.select(editor, currentListPath);
177
+ }
153
178
  };
154
179
 
155
- Image.propTypes = {
156
- attributes: PropTypes.object.isRequired,
157
- children: PropTypes.node.isRequired,
158
- element: PropTypes.shape({
159
- image: PropTypes.shape({
160
- url: PropTypes.string.isRequired,
161
- alternativeText: PropTypes.string,
162
- width: PropTypes.number,
163
- height: PropTypes.number,
164
- }),
165
- }).isRequired,
180
+ /**
181
+ * Common handler for the backspace event on ordered and unordered lists
182
+ * @param {import('slate').Editor} editor
183
+ * @param {Event} event
184
+ */
185
+ const handleBackspaceKeyOnList = (editor, event) => {
186
+ const [currentListItem, currentListItemPath] = Editor.parent(editor, editor.selection.anchor);
187
+ const [currentList, currentListPath] = Editor.parent(editor, currentListItemPath);
188
+ const isListEmpty = currentList.children.length === 1 && currentListItem.children[0].text === '';
189
+
190
+ if (isListEmpty) {
191
+ event.preventDefault();
192
+ replaceListWithEmptyBlock(editor, currentListPath);
193
+ }
166
194
  };
167
195
 
168
196
  /**
@@ -170,18 +198,21 @@ Image.propTypes = {
170
198
  * @param {import('slate').Editor} editor
171
199
  */
172
200
  const handleEnterKeyOnList = (editor) => {
173
- // Check if the selected list item is empty
174
201
  const [currentListItem, currentListItemPath] = Editor.above(editor, {
175
202
  matchNode: (node) => node.type === 'list-item',
176
203
  });
177
- const isEmptyListItem =
204
+ const [currentList, currentListPath] = Editor.parent(editor, currentListItemPath);
205
+ const isListEmpty = currentList.children.length === 1 && currentListItem.children[0].text === '';
206
+ const isListItemEmpty =
178
207
  currentListItem.children.length === 1 && currentListItem.children[0].text === '';
179
208
 
180
- if (isEmptyListItem) {
209
+ if (isListEmpty) {
210
+ replaceListWithEmptyBlock(editor, currentListPath);
211
+ } else if (isListItemEmpty) {
181
212
  // Delete the empty list item
182
213
  Transforms.removeNodes(editor, { at: currentListItemPath });
183
214
 
184
- // And create a new paragraph below the parent list
215
+ // Create a new paragraph below the parent list
185
216
  const listNodeEntry = Editor.above(editor, { match: (n) => n.type === 'list' });
186
217
  const createdParagraphPath = Path.next(listNodeEntry[1]);
187
218
  Transforms.insertNodes(
@@ -193,7 +224,7 @@ const handleEnterKeyOnList = (editor) => {
193
224
  { at: createdParagraphPath }
194
225
  );
195
226
 
196
- // Move selection to the newly created paragraph
227
+ // Move the selection to the newly created paragraph
197
228
  Transforms.select(editor, createdParagraphPath);
198
229
  } else {
199
230
  // Otherwise just create a new list item by splitting the current one
@@ -201,6 +232,193 @@ const handleEnterKeyOnList = (editor) => {
201
232
  }
202
233
  };
203
234
 
235
+ // The max-height is decided with the design team, the 56px is the height of the toolbar
236
+ const Img = styled.img`
237
+ max-height: calc(512px - 56px);
238
+ max-width: 100%;
239
+ object-fit: contain;
240
+ `;
241
+
242
+ // Added a background color to the image wrapper to make it easier to recognize the image block
243
+ const Image = ({ attributes, children, element }) => {
244
+ if (!element.image) return null;
245
+ const { url, alternativeText, width, height } = element.image;
246
+
247
+ return (
248
+ <Box {...attributes}>
249
+ {children}
250
+ <Flex background="neutral100" contentEditable={false} justifyContent="center">
251
+ <Img src={url} alt={alternativeText} width={width} height={height} />
252
+ </Flex>
253
+ </Box>
254
+ );
255
+ };
256
+
257
+ Image.propTypes = {
258
+ attributes: PropTypes.object.isRequired,
259
+ children: PropTypes.node.isRequired,
260
+ element: PropTypes.shape({
261
+ image: PropTypes.shape({
262
+ url: PropTypes.string.isRequired,
263
+ alternativeText: PropTypes.string,
264
+ width: PropTypes.number,
265
+ height: PropTypes.number,
266
+ }),
267
+ }).isRequired,
268
+ };
269
+
270
+ const Link = React.forwardRef(({ element, children, ...attributes }, forwardedRef) => {
271
+ const { formatMessage } = useIntl();
272
+ const editor = useSlate();
273
+ const path = ReactEditor.findPath(editor, element);
274
+ const [popoverOpen, setPopoverOpen] = React.useState(
275
+ editor.lastInsertedLinkPath ? Path.equals(path, editor.lastInsertedLinkPath) : false
276
+ );
277
+ const [isEditing, setIsEditing] = React.useState(element.url === '');
278
+ const linkRef = React.useRef(null);
279
+ const elementText = element.children.map((child) => child.text).join('');
280
+ const [linkText, setLinkText] = React.useState(elementText);
281
+ const [linkUrl, setLinkUrl] = React.useState(element.url);
282
+
283
+ const handleOpenEditPopover = (e) => {
284
+ e.preventDefault();
285
+ setPopoverOpen(true);
286
+ };
287
+
288
+ const handleSave = (e) => {
289
+ e.stopPropagation();
290
+
291
+ // If the selection is collapsed, we select the parent node because we want all the link to be replaced
292
+ if (Range.isCollapsed(editor.selection)) {
293
+ const [, parentPath] = Editor.parent(editor, editor.selection.focus?.path);
294
+ Transforms.select(editor, parentPath);
295
+ }
296
+
297
+ editLink(editor, { url: linkUrl, text: linkText });
298
+ setIsEditing(false);
299
+ };
300
+
301
+ const handleCancel = () => {
302
+ setIsEditing(false);
303
+
304
+ if (element.url === '') {
305
+ removeLink(editor);
306
+ }
307
+ };
308
+
309
+ const handleDismiss = () => {
310
+ setPopoverOpen(false);
311
+
312
+ if (element.url === '') {
313
+ removeLink(editor);
314
+ }
315
+
316
+ ReactEditor.focus(editor);
317
+ };
318
+
319
+ const composedRefs = composeRefs(linkRef, forwardedRef);
320
+
321
+ return (
322
+ <>
323
+ <BaseLink
324
+ {...attributes}
325
+ ref={composedRefs}
326
+ href={element.url}
327
+ onClick={handleOpenEditPopover}
328
+ color="primary600"
329
+ >
330
+ {children}
331
+ </BaseLink>
332
+ {popoverOpen && (
333
+ <Popover source={linkRef} onDismiss={handleDismiss} padding={4} contentEditable={false}>
334
+ {isEditing ? (
335
+ <Flex as="form" onSubmit={handleSave} direction="column" gap={4}>
336
+ <Field width="300px">
337
+ <FieldLabel>
338
+ {formatMessage({
339
+ id: 'components.Blocks.popover.text',
340
+ defaultMessage: 'Text',
341
+ })}
342
+ </FieldLabel>
343
+ <FieldInput
344
+ name="text"
345
+ placeholder={formatMessage({
346
+ id: 'components.Blocks.popover.text.placeholder',
347
+ defaultMessage: 'Enter link text',
348
+ })}
349
+ value={linkText}
350
+ onChange={(e) => setLinkText(e.target.value)}
351
+ />
352
+ </Field>
353
+ <Field width="300px">
354
+ <FieldLabel>
355
+ {formatMessage({
356
+ id: 'components.Blocks.popover.link',
357
+ defaultMessage: 'Link',
358
+ })}
359
+ </FieldLabel>
360
+ <FieldInput
361
+ name="url"
362
+ placeholder="https://strapi.io"
363
+ value={linkUrl}
364
+ onChange={(e) => setLinkUrl(e.target.value)}
365
+ />
366
+ </Field>
367
+ <Flex justifyContent="end" width="100%" gap={2}>
368
+ <Button variant="tertiary" onClick={handleCancel}>
369
+ {formatMessage({
370
+ id: 'components.Blocks.popover.cancel',
371
+ defaultMessage: 'Cancel',
372
+ })}
373
+ </Button>
374
+ <Button type="submit" disabled={!linkText || !linkUrl}>
375
+ {formatMessage({
376
+ id: 'components.Blocks.popover.save',
377
+ defaultMessage: 'Save',
378
+ })}
379
+ </Button>
380
+ </Flex>
381
+ </Flex>
382
+ ) : (
383
+ <Flex direction="column" gap={4} alignItems="start" width="400px">
384
+ <Typography>{elementText}</Typography>
385
+ <BaseLink href={element.url} target="_blank" color="primary600">
386
+ {element.url}
387
+ </BaseLink>
388
+ <Flex justifyContent="end" width="100%" gap={2}>
389
+ <IconButton
390
+ icon={<Trash />}
391
+ size="L"
392
+ variant="danger"
393
+ onClick={() => removeLink(editor)}
394
+ label={formatMessage({
395
+ id: 'components.Blocks.popover.delete',
396
+ defaultMessage: 'Delete',
397
+ })}
398
+ />
399
+ <IconButton
400
+ icon={<Pencil />}
401
+ size="L"
402
+ onClick={() => setIsEditing(true)}
403
+ label={formatMessage({
404
+ id: 'components.Blocks.popover.edit',
405
+ defaultMessage: 'Edit',
406
+ })}
407
+ />
408
+ </Flex>
409
+ </Flex>
410
+ )}
411
+ </Popover>
412
+ )}
413
+ </>
414
+ );
415
+ });
416
+
417
+ Link.propTypes = {
418
+ element: PropTypes.object.isRequired,
419
+ children: PropTypes.node.isRequired,
420
+ };
421
+
204
422
  /**
205
423
  * Manages a store of all the available blocks.
206
424
  *
@@ -213,6 +431,7 @@ const handleEnterKeyOnList = (editor) => {
213
431
  * matchNode: (node: Object) => boolean,
214
432
  * isInBlocksSelector: true,
215
433
  * handleEnterKey: (editor: import('slate').Editor) => void,
434
+ * handleBackspaceKey?:(editor: import('slate').Editor, event: Event) => void,
216
435
  * }
217
436
  * }} an object containing rendering functions and metadata for different blocks, indexed by name.
218
437
  */
@@ -235,6 +454,8 @@ export function useBlocksStore() {
235
454
  matchNode: (node) => node.type === 'paragraph',
236
455
  isInBlocksSelector: true,
237
456
  handleEnterKey(editor) {
457
+ // We need to keep track of the initial position of the cursor
458
+ const anchorPathInitialPosition = editor.selection.anchor.path;
238
459
  /**
239
460
  * Split the nodes where the cursor is. This will create a new paragraph with the content
240
461
  * after the cursor, while retaining all the children, modifiers etc.
@@ -254,12 +475,23 @@ export function useBlocksStore() {
254
475
  * Select the parent of the selection because we want the full block, not the leaf.
255
476
  * And copy its children to make sure we keep the modifiers.
256
477
  */
257
- const [createdNode] = Editor.parent(editor, editor.selection.anchor.path);
478
+ const [fragmentedNode] = Editor.parent(editor, editor.selection.anchor.path);
258
479
  Transforms.removeNodes(editor, editor.selection);
259
- Transforms.insertNodes(editor, {
260
- type: 'paragraph',
261
- children: createdNode.children,
262
- });
480
+
481
+ // Check if after the current position there is another node
482
+ const hasNextNode = editor.children.length - anchorPathInitialPosition[0] > 1;
483
+
484
+ // Insert the new node at the right position. The next line after the editor selection if present or otherwise at the end of the editor.
485
+ Transforms.insertNodes(
486
+ editor,
487
+ {
488
+ type: 'paragraph',
489
+ children: fragmentedNode.children,
490
+ },
491
+ {
492
+ at: hasNextNode ? [anchorPathInitialPosition[0] + 1] : [editor.children.length],
493
+ }
494
+ );
263
495
 
264
496
  /**
265
497
  * The new selection will by default be at the end of the created node.
@@ -267,7 +499,7 @@ export function useBlocksStore() {
267
499
  * Use slice(0, -1) to go 1 level higher in the tree,
268
500
  * so we go to the start of the node and not the start of the leaf.
269
501
  */
270
- Transforms.select(editor, editor.start(editor.selection.anchor.path.slice(0, -1)));
502
+ Transforms.select(editor, editor.start([anchorPathInitialPosition[0] + 1]));
271
503
  },
272
504
  },
273
505
  'heading-one': {
@@ -354,73 +586,37 @@ export function useBlocksStore() {
354
586
  matchNode: (node) => node.type === 'heading' && node.level === 6,
355
587
  isInBlocksSelector: true,
356
588
  },
357
- link: {
358
- renderElement: (props) => (
359
- <BaseLink href={props.element.url} {...props.attributes}>
360
- {props.children}
361
- </BaseLink>
362
- ),
363
- value: {
364
- type: 'link',
365
- },
366
- matchNode: (node) => node.type === 'link',
367
- isInBlocksSelector: false,
368
- },
369
- code: {
370
- renderElement: (props) => (
371
- <CodeBlock {...props.attributes}>
372
- <code>{props.children}</code>
373
- </CodeBlock>
374
- ),
375
- icon: Code,
376
- label: {
377
- id: 'components.Blocks.blocks.code',
378
- defaultMessage: 'Code',
379
- },
380
- value: {
381
- type: 'code',
382
- },
383
- matchNode: (node) => node.type === 'code',
384
- isInBlocksSelector: true,
385
- handleEnterKey(editor) {
386
- // Insert a new line within the block
387
- Transforms.insertText(editor, '\n');
388
- },
389
- },
390
- quote: {
391
- renderElement: (props) => <Blockquote {...props.attributes}>{props.children}</Blockquote>,
392
- icon: Quote,
393
- label: {
394
- id: 'components.Blocks.blocks.quote',
395
- defaultMessage: 'Quote',
396
- },
397
- value: {
398
- type: 'quote',
399
- },
400
- matchNode: (node) => node.type === 'quote',
401
- isInBlocksSelector: true,
402
- },
403
589
  'list-ordered': {
404
590
  renderElement: (props) => <List {...props} />,
591
+ label: {
592
+ id: 'components.Blocks.blocks.orderedList',
593
+ defaultMessage: 'Numbered list',
594
+ },
405
595
  value: {
406
596
  type: 'list',
407
597
  format: 'ordered',
408
598
  },
599
+ icon: NumberList,
409
600
  matchNode: (node) => node.type === 'list' && node.format === 'ordered',
410
- // TODO add icon and label and set isInBlocksEditor to true
411
- isInBlocksSelector: false,
601
+ isInBlocksSelector: true,
412
602
  handleEnterKey: handleEnterKeyOnList,
603
+ handleBackspaceKey: handleBackspaceKeyOnList,
413
604
  },
414
605
  'list-unordered': {
415
606
  renderElement: (props) => <List {...props} />,
607
+ label: {
608
+ id: 'components.Blocks.blocks.unorderedList',
609
+ defaultMessage: 'Bulleted list',
610
+ },
416
611
  value: {
417
612
  type: 'list',
418
613
  format: 'unordered',
419
614
  },
615
+ icon: BulletList,
420
616
  matchNode: (node) => node.type === 'list' && node.format === 'unordered',
421
- // TODO add icon and label and set isInBlocksEditor to true
422
- isInBlocksSelector: false,
617
+ isInBlocksSelector: true,
423
618
  handleEnterKey: handleEnterKeyOnList,
619
+ handleBackspaceKey: handleBackspaceKeyOnList,
424
620
  },
425
621
  'list-item': {
426
622
  renderElement: (props) => (
@@ -434,6 +630,18 @@ export function useBlocksStore() {
434
630
  matchNode: (node) => node.type === 'list-item',
435
631
  isInBlocksSelector: false,
436
632
  },
633
+ link: {
634
+ renderElement: (props) => (
635
+ <Link element={props.element} {...props.attributes}>
636
+ {props.children}
637
+ </Link>
638
+ ),
639
+ value: {
640
+ type: 'link',
641
+ },
642
+ matchNode: (node) => node.type === 'link',
643
+ isInBlocksSelector: false,
644
+ },
437
645
  image: {
438
646
  renderElement: (props) => <Image {...props} />,
439
647
  icon: Picture,
@@ -447,5 +655,64 @@ export function useBlocksStore() {
447
655
  matchNode: (node) => node.type === 'image',
448
656
  isInBlocksSelector: true,
449
657
  },
658
+ quote: {
659
+ renderElement: (props) => <Blockquote {...props.attributes}>{props.children}</Blockquote>,
660
+ icon: Quote,
661
+ label: {
662
+ id: 'components.Blocks.blocks.quote',
663
+ defaultMessage: 'Quote',
664
+ },
665
+ value: {
666
+ type: 'quote',
667
+ },
668
+ matchNode: (node) => node.type === 'quote',
669
+ isInBlocksSelector: true,
670
+ handleEnterKey(editor) {
671
+ /**
672
+ * To determine if we should break out of the quote node, check 2 things:
673
+ * 1. If the cursor is at the end of the quote node
674
+ * 2. If the last line of the quote node is empty
675
+ */
676
+ const [quoteNode, quoteNodePath] = Editor.above(editor, {
677
+ match: (n) => n.type === 'quote',
678
+ });
679
+ const isNodeEnd = Editor.isEnd(editor, editor.selection.anchor, quoteNodePath);
680
+ const isEmptyLine = quoteNode.children.at(-1).text.endsWith('\n');
681
+
682
+ if (isNodeEnd && isEmptyLine) {
683
+ // Remove the last line break
684
+ Transforms.delete(editor, { distance: 1, unit: 'character', reverse: true });
685
+ // Break out of the quote node new paragraph
686
+ Transforms.insertNodes(editor, {
687
+ type: 'paragraph',
688
+ children: [{ type: 'text', text: '' }],
689
+ });
690
+ } else {
691
+ // Otherwise insert a new line within the quote node
692
+ Transforms.insertText(editor, '\n');
693
+ }
694
+ },
695
+ },
696
+ code: {
697
+ renderElement: (props) => (
698
+ <CodeBlock {...props.attributes}>
699
+ <code>{props.children}</code>
700
+ </CodeBlock>
701
+ ),
702
+ icon: Code,
703
+ label: {
704
+ id: 'components.Blocks.blocks.code',
705
+ defaultMessage: 'Code',
706
+ },
707
+ value: {
708
+ type: 'code',
709
+ },
710
+ matchNode: (node) => node.type === 'code',
711
+ isInBlocksSelector: true,
712
+ handleEnterKey(editor) {
713
+ // Insert a new line within the block
714
+ Transforms.insertText(editor, '\n');
715
+ },
716
+ },
450
717
  };
451
718
  }
@@ -8,19 +8,23 @@ import styled from 'styled-components';
8
8
 
9
9
  const BoldText = styled(Typography).attrs({ fontWeight: 'bold' })`
10
10
  font-size: inherit;
11
+ color: inherit;
11
12
  `;
12
13
 
13
14
  const ItalicText = styled(Typography)`
14
15
  font-style: italic;
15
16
  font-size: inherit;
17
+ color: inherit;
16
18
  `;
17
19
 
18
20
  const UnderlineText = styled(Typography).attrs({ textDecoration: 'underline' })`
19
21
  font-size: inherit;
22
+ color: inherit;
20
23
  `;
21
24
 
22
25
  const StrikeThroughText = styled(Typography).attrs({ textDecoration: 'line-through' })`
23
26
  font-size: inherit;
27
+ color: inherit;
24
28
  `;
25
29
 
26
30
  const InlineCode = styled.code`
@@ -29,6 +33,7 @@ const InlineCode = styled.code`
29
33
  padding: ${({ theme }) => `0 ${theme.spaces[2]}`};
30
34
  font-family: 'SF Mono', SFMono-Regular, ui-monospace, 'DejaVu Sans Mono', Menlo, Consolas,
31
35
  monospace;
36
+ color: inherit;
32
37
  `;
33
38
 
34
39
  /**
@@ -48,12 +53,22 @@ export function useModifiersStore() {
48
53
  const editor = useSlate();
49
54
  const modifiers = Editor.marks(editor);
50
55
 
56
+ /**
57
+ * The default handler for checking if a modifier is active
58
+ *
59
+ * @param {string} name - The name of the modifier to check
60
+ */
51
61
  const baseCheckIsActive = (name) => {
52
62
  if (!modifiers) return false;
53
63
 
54
64
  return Boolean(modifiers[name]);
55
65
  };
56
66
 
67
+ /**
68
+ * The default handler for toggling a modifier
69
+ *
70
+ * @param {string} name - The name of the modifier to toggle
71
+ */
57
72
  const baseHandleToggle = (name) => {
58
73
  if (modifiers[name]) {
59
74
  Editor.removeMark(editor, name);