@strapi/content-manager 0.0.0-next.8c98bb4ad3e89fc5a3f45b1925795444d17042d6 → 0.0.0-next.8d576f41729640e32a4a0cfcb258b6288e6631f6

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 (294) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +300 -204
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +304 -209
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/components/LeftMenu.js +34 -30
  6. package/dist/admin/components/LeftMenu.js.map +1 -1
  7. package/dist/admin/components/LeftMenu.mjs +36 -32
  8. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  9. package/dist/admin/components/Widgets.js +161 -0
  10. package/dist/admin/components/Widgets.js.map +1 -0
  11. package/dist/admin/components/Widgets.mjs +158 -0
  12. package/dist/admin/components/Widgets.mjs.map +1 -0
  13. package/dist/admin/content-manager.js.map +1 -1
  14. package/dist/admin/content-manager.mjs.map +1 -1
  15. package/dist/admin/history/components/VersionHeader.js +6 -0
  16. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  17. package/dist/admin/history/components/VersionHeader.mjs +7 -1
  18. package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
  19. package/dist/admin/history/pages/History.js +1 -9
  20. package/dist/admin/history/pages/History.js.map +1 -1
  21. package/dist/admin/history/pages/History.mjs +1 -9
  22. package/dist/admin/history/pages/History.mjs.map +1 -1
  23. package/dist/admin/hooks/useDocumentActions.js +20 -5
  24. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  25. package/dist/admin/hooks/useDocumentActions.mjs +20 -5
  26. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  27. package/dist/admin/hooks/useDocumentContext.js +57 -0
  28. package/dist/admin/hooks/useDocumentContext.js.map +1 -0
  29. package/dist/admin/hooks/useDocumentContext.mjs +36 -0
  30. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -0
  31. package/dist/admin/index.js +42 -5
  32. package/dist/admin/index.js.map +1 -1
  33. package/dist/admin/index.mjs +42 -3
  34. package/dist/admin/index.mjs.map +1 -1
  35. package/dist/admin/pages/EditView/EditViewPage.js +90 -91
  36. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  37. package/dist/admin/pages/EditView/EditViewPage.mjs +92 -93
  38. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/DocumentActions.js +256 -58
  40. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/DocumentActions.mjs +262 -64
  42. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +12 -15
  44. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +12 -15
  46. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +61 -26
  48. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +63 -28
  50. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +21 -35
  52. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +21 -35
  54. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +46 -95
  56. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +48 -78
  58. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +2 -2
  60. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +2 -2
  62. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +2 -2
  64. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +2 -2
  66. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +4 -2
  68. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +4 -2
  70. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +5 -16
  72. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +5 -16
  74. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +2 -3
  76. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +2 -3
  78. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +506 -345
  80. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  81. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +506 -347
  82. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +145 -87
  84. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +148 -90
  86. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/UID.js +11 -9
  88. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +11 -9
  90. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +1 -1
  92. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  93. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs +1 -1
  94. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  95. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +50 -97
  96. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  97. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +51 -79
  98. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormLayout.js +20 -24
  100. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormLayout.mjs +20 -24
  102. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  103. package/dist/admin/pages/EditView/components/InputRenderer.js +3 -10
  104. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  105. package/dist/admin/pages/EditView/components/InputRenderer.mjs +3 -10
  106. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  107. package/dist/admin/pages/ListView/ListViewPage.js +77 -0
  108. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  109. package/dist/admin/pages/ListView/ListViewPage.mjs +78 -1
  110. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  111. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +2 -1
  112. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  113. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +2 -1
  114. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  115. package/dist/admin/pages/ListView/components/Filters.js +1 -0
  116. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  117. package/dist/admin/pages/ListView/components/Filters.mjs +1 -0
  118. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  119. package/dist/admin/pages/ListView/components/TableActions.js +13 -3
  120. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  121. package/dist/admin/pages/ListView/components/TableActions.mjs +13 -3
  122. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  123. package/dist/admin/preview/components/PreviewHeader.js +3 -6
  124. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  125. package/dist/admin/preview/components/PreviewHeader.mjs +3 -6
  126. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  127. package/dist/admin/preview/pages/Preview.js +94 -102
  128. package/dist/admin/preview/pages/Preview.js.map +1 -1
  129. package/dist/admin/preview/pages/Preview.mjs +94 -102
  130. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  131. package/dist/admin/services/documents.js +2 -2
  132. package/dist/admin/services/documents.js.map +1 -1
  133. package/dist/admin/services/documents.mjs +2 -2
  134. package/dist/admin/services/documents.mjs.map +1 -1
  135. package/dist/admin/services/homepage.js +30 -0
  136. package/dist/admin/services/homepage.js.map +1 -0
  137. package/dist/admin/services/homepage.mjs +28 -0
  138. package/dist/admin/services/homepage.mjs.map +1 -0
  139. package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +6 -4
  140. package/dist/admin/src/components/Widgets.d.ts +3 -0
  141. package/dist/admin/src/content-manager.d.ts +0 -3
  142. package/dist/admin/src/features/DocumentRBAC.d.ts +1 -1
  143. package/dist/admin/src/history/pages/History.d.ts +1 -1
  144. package/dist/admin/src/hooks/useDocumentActions.d.ts +1 -0
  145. package/dist/admin/src/hooks/useDocumentContext.d.ts +30 -0
  146. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -2
  147. package/dist/admin/src/pages/EditView/components/FormInputs/ComponentContext.d.ts +1 -1
  148. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +1 -1
  149. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +73 -7
  150. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +1 -0
  151. package/dist/admin/src/pages/EditView/components/FormInputs/UID.d.ts +1 -0
  152. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +7 -8
  153. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +1 -1
  154. package/dist/admin/src/preview/pages/Preview.d.ts +2 -1
  155. package/dist/admin/src/services/documents.d.ts +7 -1
  156. package/dist/admin/src/services/homepage.d.ts +5 -0
  157. package/dist/admin/translations/en.json.js +3 -1
  158. package/dist/admin/translations/en.json.js.map +1 -1
  159. package/dist/admin/translations/en.json.mjs +3 -1
  160. package/dist/admin/translations/en.json.mjs.map +1 -1
  161. package/dist/admin/translations/ru.json.js +235 -226
  162. package/dist/admin/translations/ru.json.js.map +1 -1
  163. package/dist/admin/translations/ru.json.mjs +230 -226
  164. package/dist/admin/translations/ru.json.mjs.map +1 -1
  165. package/dist/admin/utils/validation.js +1 -1
  166. package/dist/admin/utils/validation.js.map +1 -1
  167. package/dist/admin/utils/validation.mjs +1 -1
  168. package/dist/admin/utils/validation.mjs.map +1 -1
  169. package/dist/server/controllers/content-types.js +11 -1
  170. package/dist/server/controllers/content-types.js.map +1 -1
  171. package/dist/server/controllers/content-types.mjs +11 -1
  172. package/dist/server/controllers/content-types.mjs.map +1 -1
  173. package/dist/server/controllers/index.js +3 -1
  174. package/dist/server/controllers/index.js.map +1 -1
  175. package/dist/server/controllers/index.mjs +3 -1
  176. package/dist/server/controllers/index.mjs.map +1 -1
  177. package/dist/server/controllers/validation/index.js +14 -2
  178. package/dist/server/controllers/validation/index.js.map +1 -1
  179. package/dist/server/controllers/validation/index.mjs +14 -2
  180. package/dist/server/controllers/validation/index.mjs.map +1 -1
  181. package/dist/server/history/services/lifecycles.js +3 -0
  182. package/dist/server/history/services/lifecycles.js.map +1 -1
  183. package/dist/server/history/services/lifecycles.mjs +3 -0
  184. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  185. package/dist/server/homepage/controllers/homepage.js +57 -0
  186. package/dist/server/homepage/controllers/homepage.js.map +1 -0
  187. package/dist/server/homepage/controllers/homepage.mjs +36 -0
  188. package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
  189. package/dist/server/homepage/controllers/index.js +10 -0
  190. package/dist/server/homepage/controllers/index.js.map +1 -0
  191. package/dist/server/homepage/controllers/index.mjs +8 -0
  192. package/dist/server/homepage/controllers/index.mjs.map +1 -0
  193. package/dist/server/homepage/index.js +14 -0
  194. package/dist/server/homepage/index.js.map +1 -0
  195. package/dist/server/homepage/index.mjs +12 -0
  196. package/dist/server/homepage/index.mjs.map +1 -0
  197. package/dist/server/homepage/routes/homepage.js +25 -0
  198. package/dist/server/homepage/routes/homepage.js.map +1 -0
  199. package/dist/server/homepage/routes/homepage.mjs +23 -0
  200. package/dist/server/homepage/routes/homepage.mjs.map +1 -0
  201. package/dist/server/homepage/routes/index.js +13 -0
  202. package/dist/server/homepage/routes/index.js.map +1 -0
  203. package/dist/server/homepage/routes/index.mjs +11 -0
  204. package/dist/server/homepage/routes/index.mjs.map +1 -0
  205. package/dist/server/homepage/services/homepage.js +157 -0
  206. package/dist/server/homepage/services/homepage.js.map +1 -0
  207. package/dist/server/homepage/services/homepage.mjs +155 -0
  208. package/dist/server/homepage/services/homepage.mjs.map +1 -0
  209. package/dist/server/homepage/services/index.js +10 -0
  210. package/dist/server/homepage/services/index.js.map +1 -0
  211. package/dist/server/homepage/services/index.mjs +8 -0
  212. package/dist/server/homepage/services/index.mjs.map +1 -0
  213. package/dist/server/preview/services/preview.js +0 -1
  214. package/dist/server/preview/services/preview.js.map +1 -1
  215. package/dist/server/preview/services/preview.mjs +0 -1
  216. package/dist/server/preview/services/preview.mjs.map +1 -1
  217. package/dist/server/routes/index.js +3 -1
  218. package/dist/server/routes/index.js.map +1 -1
  219. package/dist/server/routes/index.mjs +3 -1
  220. package/dist/server/routes/index.mjs.map +1 -1
  221. package/dist/server/services/data-mapper.js +4 -1
  222. package/dist/server/services/data-mapper.js.map +1 -1
  223. package/dist/server/services/data-mapper.mjs +4 -1
  224. package/dist/server/services/data-mapper.mjs.map +1 -1
  225. package/dist/server/services/document-manager.js +8 -1
  226. package/dist/server/services/document-manager.js.map +1 -1
  227. package/dist/server/services/document-manager.mjs +8 -1
  228. package/dist/server/services/document-manager.mjs.map +1 -1
  229. package/dist/server/services/document-metadata.js +2 -0
  230. package/dist/server/services/document-metadata.js.map +1 -1
  231. package/dist/server/services/document-metadata.mjs +2 -0
  232. package/dist/server/services/document-metadata.mjs.map +1 -1
  233. package/dist/server/services/index.js +3 -1
  234. package/dist/server/services/index.js.map +1 -1
  235. package/dist/server/services/index.mjs +3 -1
  236. package/dist/server/services/index.mjs.map +1 -1
  237. package/dist/server/services/utils/configuration/attributes.js +1 -1
  238. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  239. package/dist/server/services/utils/configuration/attributes.mjs +1 -1
  240. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  241. package/dist/server/services/utils/configuration/layouts.js +1 -1
  242. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  243. package/dist/server/services/utils/configuration/layouts.mjs +1 -1
  244. package/dist/server/services/utils/configuration/layouts.mjs.map +1 -1
  245. package/dist/server/services/utils/configuration/metadatas.js +8 -0
  246. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  247. package/dist/server/services/utils/configuration/metadatas.mjs +8 -0
  248. package/dist/server/services/utils/configuration/metadatas.mjs.map +1 -1
  249. package/dist/server/services/utils/populate.js +11 -0
  250. package/dist/server/services/utils/populate.js.map +1 -1
  251. package/dist/server/services/utils/populate.mjs +11 -0
  252. package/dist/server/services/utils/populate.mjs.map +1 -1
  253. package/dist/server/src/controllers/content-types.d.ts.map +1 -1
  254. package/dist/server/src/controllers/index.d.ts.map +1 -1
  255. package/dist/server/src/controllers/validation/index.d.ts +6 -1
  256. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  257. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  258. package/dist/server/src/homepage/controllers/homepage.d.ts +7 -0
  259. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
  260. package/dist/server/src/homepage/controllers/index.d.ts +2 -0
  261. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
  262. package/dist/server/src/homepage/index.d.ts +16 -0
  263. package/dist/server/src/homepage/index.d.ts.map +1 -0
  264. package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
  265. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
  266. package/dist/server/src/homepage/routes/index.d.ts +8 -0
  267. package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
  268. package/dist/server/src/homepage/services/homepage.d.ts +11 -0
  269. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
  270. package/dist/server/src/homepage/services/index.d.ts +9 -0
  271. package/dist/server/src/homepage/services/index.d.ts.map +1 -0
  272. package/dist/server/src/index.d.ts +8 -0
  273. package/dist/server/src/index.d.ts.map +1 -1
  274. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  275. package/dist/server/src/routes/index.d.ts +1 -0
  276. package/dist/server/src/routes/index.d.ts.map +1 -1
  277. package/dist/server/src/services/data-mapper.d.ts +1 -0
  278. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  279. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  280. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  281. package/dist/server/src/services/index.d.ts +7 -0
  282. package/dist/server/src/services/index.d.ts.map +1 -1
  283. package/dist/server/src/services/utils/configuration/metadatas.d.ts.map +1 -1
  284. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  285. package/dist/shared/contracts/collection-types.d.ts +0 -1
  286. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  287. package/dist/shared/contracts/homepage.d.ts +25 -0
  288. package/dist/shared/contracts/homepage.d.ts.map +1 -0
  289. package/package.json +12 -9
  290. package/dist/admin/features/DocumentContext.js +0 -71
  291. package/dist/admin/features/DocumentContext.js.map +0 -1
  292. package/dist/admin/features/DocumentContext.mjs +0 -49
  293. package/dist/admin/features/DocumentContext.mjs.map +0 -1
  294. package/dist/admin/src/features/DocumentContext.d.ts +0 -53
@@ -1,292 +1,456 @@
1
1
  import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
- import { createContext, Form, ConfirmDialog, useStrapiApp, useRBAC, DescriptionComponentRenderer } from '@strapi/admin/strapi-admin';
4
- import { Modal, TextButton, Tooltip, Flex, IconButton, Typography, Button, Dialog, Loader, EmptyStateLayout, Box } from '@strapi/design-system';
3
+ import { createContext, useQueryParams, Form, useForm, ConfirmDialog, useStrapiApp, useRBAC, DescriptionComponentRenderer } from '@strapi/admin/strapi-admin';
4
+ import { Modal, TextButton, Flex, IconButton, Typography, Dialog, Loader, EmptyStateLayout, Box } from '@strapi/design-system';
5
5
  import { ArrowLeft, ArrowsOut, WarningCircle } from '@strapi/icons';
6
6
  import { useIntl } from 'react-intl';
7
7
  import { useNavigate, useLocation } from 'react-router-dom';
8
8
  import { styled } from 'styled-components';
9
9
  import { COLLECTION_TYPES, SINGLE_TYPES } from '../../../../../constants/collections.mjs';
10
10
  import { PERMISSIONS } from '../../../../../constants/plugin.mjs';
11
- import { useDocumentContext } from '../../../../../features/DocumentContext.mjs';
12
- import { DocumentRBAC } from '../../../../../features/DocumentRBAC.mjs';
13
- import { useDocumentLayout } from '../../../../../hooks/useDocumentLayout.mjs';
11
+ import { buildValidParams } from '../../../../../utils/api.mjs';
12
+ import { DocumentStatus } from '../../DocumentStatus.mjs';
13
+ import { useDoc, useDocument } from '../../../../../hooks/useDocument.mjs';
14
+ import '../../../../../preview/pages/Preview.mjs';
14
15
  import { useLazyGetDocumentQuery } from '../../../../../services/documents.mjs';
16
+ import { useDocumentLayout } from '../../../../../hooks/useDocumentLayout.mjs';
17
+ import { DocumentRBAC } from '../../../../../features/DocumentRBAC.mjs';
15
18
  import { createYupSchema } from '../../../../../utils/validation.mjs';
16
19
  import { DocumentActionButton } from '../../DocumentActions.mjs';
17
- import { DocumentStatus } from '../../DocumentStatus.mjs';
18
20
  import { FormLayout } from '../../FormLayout.mjs';
21
+ import { ComponentProvider } from '../ComponentContext.mjs';
19
22
 
20
23
  function getCollectionType(url) {
21
24
  const regex = new RegExp(`(${COLLECTION_TYPES}|${SINGLE_TYPES})`);
22
25
  const match = url.match(regex);
23
26
  return match ? match[1] : undefined;
24
27
  }
25
- const CustomModalContent = styled(Modal.Content)`
28
+ const StyledModalContent = styled(Modal.Content)`
26
29
  width: 90%;
27
30
  max-width: 100%;
28
31
  height: 90%;
29
32
  max-height: 100%;
30
33
  `;
31
- const [RelationModalProvider, useRelationModal] = createContext('RelationModal', {
32
- parentModified: false,
33
- depth: 0
34
- });
35
- const RelationModalForm = ({ relation, triggerButtonLabel })=>{
34
+ const getFullPageUrl = (currentDocumentMeta)=>{
35
+ const isSingleType = currentDocumentMeta.collectionType === SINGLE_TYPES;
36
+ const queryParams = currentDocumentMeta.params?.locale ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}` : '';
37
+ return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}${isSingleType ? '' : '/' + currentDocumentMeta.documentId}${queryParams}`;
38
+ };
39
+ function reducer(state, action) {
40
+ switch(action.type){
41
+ case 'GO_TO_RELATION':
42
+ if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {
43
+ return {
44
+ ...state,
45
+ confirmDialogIntent: action.payload.document,
46
+ fieldToConnect: action.payload.fieldToConnect,
47
+ fieldToConnectUID: action.payload.fieldToConnectUID
48
+ };
49
+ }
50
+ const lastItemDocumentHistory = state.documentHistory.at(-1);
51
+ const hasToResetDocumentHistory = lastItemDocumentHistory && !lastItemDocumentHistory.documentId;
52
+ return {
53
+ ...state,
54
+ // Reset document history if the last item has documentId undefined
55
+ documentHistory: hasToResetDocumentHistory ? [
56
+ action.payload.document
57
+ ] : [
58
+ ...state.documentHistory,
59
+ action.payload.document
60
+ ],
61
+ confirmDialogIntent: null,
62
+ isModalOpen: true,
63
+ fieldToConnect: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnect,
64
+ fieldToConnectUID: hasToResetDocumentHistory ? undefined : action.payload.fieldToConnectUID
65
+ };
66
+ case 'GO_BACK':
67
+ if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {
68
+ return {
69
+ ...state,
70
+ confirmDialogIntent: 'back'
71
+ };
72
+ }
73
+ return {
74
+ ...state,
75
+ documentHistory: state.documentHistory.slice(0, -1),
76
+ confirmDialogIntent: null
77
+ };
78
+ case 'GO_FULL_PAGE':
79
+ if (state.hasUnsavedChanges) {
80
+ return {
81
+ ...state,
82
+ confirmDialogIntent: 'navigate'
83
+ };
84
+ }
85
+ return {
86
+ ...state,
87
+ documentHistory: [],
88
+ hasUnsavedChanges: false,
89
+ isModalOpen: false,
90
+ confirmDialogIntent: null
91
+ };
92
+ case 'GO_TO_CREATED_RELATION':
93
+ return {
94
+ ...state,
95
+ // Reset document history if the last item has documentId undefined
96
+ documentHistory: state.documentHistory ? [
97
+ ...state.documentHistory.slice(0, -1),
98
+ action.payload.document
99
+ ] : [
100
+ action.payload.document
101
+ ],
102
+ confirmDialogIntent: null,
103
+ isModalOpen: true,
104
+ fieldToConnect: undefined,
105
+ fieldToConnectUID: undefined
106
+ };
107
+ case 'CANCEL_CONFIRM_DIALOG':
108
+ return {
109
+ ...state,
110
+ confirmDialogIntent: null
111
+ };
112
+ case 'CLOSE_MODAL':
113
+ if (state.hasUnsavedChanges && !action.payload.shouldBypassConfirmation) {
114
+ return {
115
+ ...state,
116
+ confirmDialogIntent: 'close'
117
+ };
118
+ }
119
+ return {
120
+ ...state,
121
+ documentHistory: [],
122
+ confirmDialogIntent: null,
123
+ hasUnsavedChanges: false,
124
+ isModalOpen: false
125
+ };
126
+ case 'SET_HAS_UNSAVED_CHANGES':
127
+ return {
128
+ ...state,
129
+ hasUnsavedChanges: action.payload.hasUnsavedChanges
130
+ };
131
+ default:
132
+ return state;
133
+ }
134
+ }
135
+ const [RelationModalProvider, useRelationModal] = createContext('RelationModal');
136
+ function isRenderProp(children) {
137
+ return typeof children === 'function';
138
+ }
139
+ const RootRelationRenderer = (props)=>{
140
+ const { children } = props;
141
+ const [state, dispatch] = React.useReducer(reducer, {
142
+ documentHistory: [],
143
+ confirmDialogIntent: null,
144
+ isModalOpen: false,
145
+ hasUnsavedChanges: false,
146
+ fieldToConnect: undefined
147
+ });
148
+ const rootDocument = useDoc();
149
+ const [{ query }] = useQueryParams();
150
+ const params = React.useMemo(()=>buildValidParams(query ?? {}), [
151
+ query
152
+ ]);
153
+ const rootDocumentMeta = {
154
+ documentId: rootDocument.document?.documentId || '',
155
+ model: rootDocument.model,
156
+ collectionType: rootDocument.collectionType,
157
+ params
158
+ };
159
+ const currentDocumentMeta = state.documentHistory.at(-1) ?? rootDocumentMeta;
160
+ const currentDocument = useDocument(currentDocumentMeta);
161
+ // TODO: check if we can remove the single type check
162
+ const isSingleType = currentDocumentMeta.collectionType === SINGLE_TYPES;
163
+ const isCreating = !currentDocumentMeta.documentId && !isSingleType;
164
+ /**
165
+ * There is no parent relation, so the relation modal doesn't exist. Create it and set up all the
166
+ * pieces that will be used by potential child relations: the context, header, form, and footer.
167
+ */ return /*#__PURE__*/ jsx(RelationModalProvider, {
168
+ state: state,
169
+ dispatch: dispatch,
170
+ rootDocumentMeta: rootDocumentMeta,
171
+ currentDocumentMeta: currentDocumentMeta,
172
+ currentDocument: currentDocument,
173
+ isCreating: isCreating,
174
+ children: /*#__PURE__*/ jsx(RelationModal, {
175
+ children: isRenderProp(children) ? children({
176
+ dispatch
177
+ }) : props.relation && /*#__PURE__*/ jsx(RelationModalTrigger, {
178
+ relation: props.relation,
179
+ children: children
180
+ })
181
+ })
182
+ });
183
+ };
184
+ const NestedRelationRenderer = (props)=>{
185
+ const { children } = props;
186
+ const dispatch = useRelationModal('NestedRelation', (state)=>state.dispatch);
187
+ return isRenderProp(children) ? children({
188
+ dispatch
189
+ }) : props.relation && /*#__PURE__*/ jsx(RelationModalTrigger, {
190
+ relation: props.relation,
191
+ children: children
192
+ }); /* This is the trigger that will be rendered in the parent relation */
193
+ };
194
+ /**
195
+ * Component responsible for rendering its children wrapped in a modal, form and context if needed
196
+ */ const RelationModalRenderer = (props)=>{
197
+ // We're in a nested relation if the relation modal context is not undefined
198
+ const isNested = useRelationModal('RelationContextWrapper', (state)=>state != undefined, false);
199
+ return isNested ? /*#__PURE__*/ jsx(NestedRelationRenderer, {
200
+ ...props
201
+ }) : /*#__PURE__*/ jsx(RootRelationRenderer, {
202
+ ...props
203
+ });
204
+ };
205
+ /* -------------------------------------------------------------------------------------------------
206
+ * RelationModal
207
+ * -----------------------------------------------------------------------------------------------*/ const generateCreateUrl = (currentDocumentMeta)=>{
208
+ return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}/create${currentDocumentMeta.params?.locale ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}` : ''}`;
209
+ };
210
+ const RelationModal = ({ children })=>{
211
+ const { formatMessage } = useIntl();
212
+ const navigate = useNavigate();
213
+ const state = useRelationModal('RelationModalForm', (state)=>state.state);
214
+ const dispatch = useRelationModal('RelationModalForm', (state)=>state.dispatch);
215
+ const currentDocumentMeta = useRelationModal('RelationModalForm', (state)=>state.currentDocumentMeta);
216
+ const currentDocument = useRelationModal('RelationModalForm', (state)=>state.currentDocument);
217
+ const isCreating = useRelationModal('RelationModalForm', (state)=>state.isCreating);
218
+ /*
219
+ * We must wrap the modal window with Component Provider with reset values
220
+ * to avoid inheriting id and uid from the root document and having weird
221
+ * behaviors with simple relationships..
222
+ */ return /*#__PURE__*/ jsx(ComponentProvider, {
223
+ id: undefined,
224
+ level: -1,
225
+ uid: undefined,
226
+ type: undefined,
227
+ children: /*#__PURE__*/ jsxs(Modal.Root, {
228
+ open: state.isModalOpen,
229
+ onOpenChange: (open)=>{
230
+ if (!open) {
231
+ dispatch({
232
+ type: 'CLOSE_MODAL',
233
+ payload: {
234
+ shouldBypassConfirmation: false
235
+ }
236
+ });
237
+ }
238
+ },
239
+ children: [
240
+ children,
241
+ /*#__PURE__*/ jsxs(StyledModalContent, {
242
+ children: [
243
+ /*#__PURE__*/ jsx(Modal.Header, {
244
+ gap: 2,
245
+ children: /*#__PURE__*/ jsxs(Flex, {
246
+ justifyContent: "space-between",
247
+ alignItems: "center",
248
+ width: "100%",
249
+ children: [
250
+ /*#__PURE__*/ jsxs(Flex, {
251
+ gap: 2,
252
+ children: [
253
+ /*#__PURE__*/ jsx(IconButton, {
254
+ withTooltip: false,
255
+ label: formatMessage({
256
+ id: 'global.back',
257
+ defaultMessage: 'Back'
258
+ }),
259
+ variant: "ghost",
260
+ disabled: state.documentHistory.length < 2,
261
+ onClick: ()=>{
262
+ dispatch({
263
+ type: 'GO_BACK',
264
+ payload: {
265
+ shouldBypassConfirmation: false
266
+ }
267
+ });
268
+ },
269
+ marginRight: 1,
270
+ children: /*#__PURE__*/ jsx(ArrowLeft, {})
271
+ }),
272
+ /*#__PURE__*/ jsx(Typography, {
273
+ tag: "span",
274
+ fontWeight: 600,
275
+ children: isCreating ? formatMessage({
276
+ id: 'content-manager.relation.create',
277
+ defaultMessage: 'Create a relation'
278
+ }) : formatMessage({
279
+ id: 'content-manager.components.RelationInputModal.modal-title',
280
+ defaultMessage: 'Edit a relation'
281
+ })
282
+ })
283
+ ]
284
+ }),
285
+ /*#__PURE__*/ jsx(IconButton, {
286
+ onClick: ()=>{
287
+ dispatch({
288
+ type: 'GO_FULL_PAGE'
289
+ });
290
+ if (!state.hasUnsavedChanges) {
291
+ if (isCreating) {
292
+ navigate(generateCreateUrl(currentDocumentMeta));
293
+ } else {
294
+ navigate(getFullPageUrl(currentDocumentMeta));
295
+ }
296
+ }
297
+ },
298
+ variant: "tertiary",
299
+ label: formatMessage({
300
+ id: 'content-manager.components.RelationInputModal.button-fullpage',
301
+ defaultMessage: 'Go to entry'
302
+ }),
303
+ children: /*#__PURE__*/ jsx(ArrowsOut, {})
304
+ })
305
+ ]
306
+ })
307
+ }),
308
+ /*#__PURE__*/ jsx(Modal.Body, {
309
+ children: /*#__PURE__*/ jsx(Form, {
310
+ method: isCreating ? 'POST' : 'PUT',
311
+ initialValues: currentDocument.getInitialFormValues(isCreating),
312
+ validate: (values, options)=>{
313
+ const yupSchema = createYupSchema(currentDocument.schema?.attributes, currentDocument.components, {
314
+ status: currentDocument.document?.status,
315
+ ...options
316
+ });
317
+ return yupSchema.validate(values, {
318
+ abortEarly: false
319
+ });
320
+ },
321
+ children: /*#__PURE__*/ jsx(RelationModalBody, {})
322
+ })
323
+ })
324
+ ]
325
+ })
326
+ ]
327
+ })
328
+ });
329
+ };
330
+ /**
331
+ * All the main content (not header and footer) of the relation modal, plus the confirmation dialog.
332
+ * Will be wrapped in a Modal.Body by the RelationModal component.
333
+ * Cannot be moved directly inside RelationModal because it needs access to the context via hooks.
334
+ */ const RelationModalBody = ()=>{
36
335
  const navigate = useNavigate();
37
336
  const { pathname, search } = useLocation();
38
337
  const { formatMessage } = useIntl();
39
338
  const [triggerRefetchDocument] = useLazyGetDocumentQuery();
40
- const currentDocument = useDocumentContext('RelationModalForm', (state)=>state.document);
41
- const rootDocumentMeta = useDocumentContext('RelationModalForm', (state)=>state.rootDocumentMeta);
42
- const currentDocumentMeta = useDocumentContext('RelationModalForm', (state)=>state.meta);
43
- const changeDocument = useDocumentContext('RelationModalForm', (state)=>state.changeDocument);
44
- const documentHistory = useDocumentContext('RelationModalForm', (state)=>state.documentHistory);
45
- const setDocumentHistory = useDocumentContext('RelationModalForm', (state)=>state.setDocumentHistory);
46
- const [isConfirmationOpen, setIsConfirmationOpen] = React.useState(false);
47
- const [actionPosition, setActionPosition] = React.useState('cancel');
48
- const [isModalOpen, setIsModalOpen] = React.useState(false);
49
- // NOTE: Not sure about this relation modal context, maybe we should move this to DocumentContext?
50
- // Get parent modal context if it exists
51
- const parentContext = useRelationModal('RelationModalForm', (state)=>state);
52
- // Get depth of nested modals
53
- const depth = parentContext ? parentContext.depth + 1 : 0;
54
- // Check if this is a nested modal
55
- const isNested = depth > 0;
56
- const addDocumentToHistory = (document)=>setDocumentHistory((prev)=>[
57
- ...prev,
58
- document
59
- ]);
60
- const getPreviousDocument = ()=>{
61
- if (documentHistory.length === 0) return undefined;
62
- const lastDocument = documentHistory[documentHistory.length - 1];
63
- return lastDocument;
64
- };
65
- const removeLastDocumentFromHistory = ()=>{
66
- setDocumentHistory((prev)=>[
67
- ...prev
68
- ].slice(0, prev.length - 1));
69
- };
70
- const handleToggleModal = ()=>{
71
- if (isModalOpen) {
72
- setIsModalOpen(false);
73
- const document = {
74
- collectionType: rootDocumentMeta.collectionType,
75
- model: rootDocumentMeta.model,
76
- documentId: rootDocumentMeta.documentId
77
- };
78
- // Change back to the root document
79
- changeDocument(document);
80
- // Reset the document history
81
- setDocumentHistory([]);
82
- // Reset action position
83
- setActionPosition('cancel');
84
- // Read from cache or refetch root document
85
- triggerRefetchDocument(document, // Favor the cache
339
+ const state = useRelationModal('RelationModalForm', (state)=>state.state);
340
+ const dispatch = useRelationModal('RelationModalForm', (state)=>state.dispatch);
341
+ const rootDocumentMeta = useRelationModal('RelationModalForm', (state)=>state.rootDocumentMeta);
342
+ const currentDocumentMeta = useRelationModal('RelationModalForm', (state)=>state.currentDocumentMeta);
343
+ const isCreating = useRelationModal('RelationModalForm', (state)=>state.isCreating);
344
+ /**
345
+ * One-way sync the modified state from the form to the modal state.
346
+ * It is needed because we need to consume state from the form context in order to lift it up
347
+ * into the modal context. It is not possible otherwise because the modal needs the form state,
348
+ * but it must be a parent of the form.
349
+ */ const modified = useForm('FormWatcher', (state)=>state.modified);
350
+ const isSubmitting = useForm('FormWatcher', (state)=>state.isSubmitting);
351
+ const hasUnsavedChanges = modified && !isSubmitting;
352
+ React.useEffect(()=>{
353
+ dispatch({
354
+ type: 'SET_HAS_UNSAVED_CHANGES',
355
+ payload: {
356
+ hasUnsavedChanges
357
+ }
358
+ });
359
+ }, [
360
+ hasUnsavedChanges,
361
+ dispatch
362
+ ]);
363
+ const handleCloseModal = (shouldBypassConfirmation)=>{
364
+ dispatch({
365
+ type: 'CLOSE_MODAL',
366
+ payload: {
367
+ shouldBypassConfirmation
368
+ }
369
+ });
370
+ {
371
+ // TODO: check if we can avoid this by relying on RTK invalidatesTags.
372
+ // If so we can delete this function and dispatch the events directly
373
+ triggerRefetchDocument(// TODO check if params should be removed (as they were before)
374
+ rootDocumentMeta, // Favor the cache
86
375
  true);
87
- } else {
88
- changeDocument(relation);
89
- setIsModalOpen(true);
90
376
  }
91
377
  };
92
- const getFullPageLink = ()=>{
93
- const isSingleType = currentDocumentMeta.collectionType === SINGLE_TYPES;
94
- const queryParams = currentDocumentMeta.params?.locale ? `?plugins[i18n][locale]=${currentDocumentMeta.params.locale}` : '';
95
- return `/content-manager/${currentDocumentMeta.collectionType}/${currentDocumentMeta.model}${isSingleType ? '' : '/' + currentDocumentMeta.documentId}${queryParams}`;
96
- };
97
378
  const handleRedirection = ()=>{
98
379
  const editViewUrl = `${pathname}${search}`;
99
- const isRootDocumentUrl = editViewUrl.includes(getFullPageLink());
380
+ const fullPageUrl = getFullPageUrl(currentDocumentMeta);
381
+ const isRootDocumentUrl = editViewUrl.includes(fullPageUrl);
100
382
  if (isRootDocumentUrl) {
101
- handleToggleModal();
383
+ handleCloseModal(true);
102
384
  } else {
103
- navigate(getFullPageLink());
385
+ if (isCreating) {
386
+ navigate(generateCreateUrl(currentDocumentMeta));
387
+ } else {
388
+ navigate(fullPageUrl);
389
+ }
104
390
  }
105
391
  };
106
392
  const handleConfirm = ()=>{
107
- if (actionPosition === 'navigate') {
108
- handleRedirection();
109
- } else if (actionPosition === 'back') {
110
- const previousRelation = getPreviousDocument();
111
- if (previousRelation) {
112
- removeLastDocumentFromHistory();
113
- changeDocument(previousRelation);
114
- }
115
- } else {
116
- // Add current relation to history before opening a new one in case we are opening a new one
117
- if (currentDocumentMeta && Object.keys(currentDocumentMeta).length > 0) {
118
- addDocumentToHistory(currentDocumentMeta);
119
- }
120
- handleToggleModal();
393
+ if (state.confirmDialogIntent === null) {
394
+ return;
121
395
  }
122
- };
123
- return /*#__PURE__*/ jsx(Form, {
124
- method: "PUT",
125
- initialValues: currentDocument.getInitialFormValues(),
126
- validate: (values, options)=>{
127
- const yupSchema = createYupSchema(currentDocument.schema?.attributes, currentDocument.components, {
128
- status: currentDocument.document?.status,
129
- ...options
396
+ if (state.confirmDialogIntent === 'navigate') {
397
+ handleRedirection();
398
+ } else if (state.confirmDialogIntent === 'back') {
399
+ dispatch({
400
+ type: 'GO_BACK',
401
+ payload: {
402
+ shouldBypassConfirmation: true
403
+ }
130
404
  });
131
- return yupSchema.validate(values, {
132
- abortEarly: false
405
+ } else if (state.confirmDialogIntent === 'close') {
406
+ handleCloseModal(true);
407
+ } else if ('documentId' in state.confirmDialogIntent) {
408
+ dispatch({
409
+ type: 'GO_TO_RELATION',
410
+ payload: {
411
+ document: state.confirmDialogIntent,
412
+ shouldBypassConfirmation: true
413
+ }
133
414
  });
134
- },
135
- children: ({ modified, isSubmitting, resetForm })=>{
136
- // We don't count the root document, so history starts after 1
137
- const hasHistory = documentHistory.length > 1;
138
- return /*#__PURE__*/ jsxs(RelationModalProvider, {
139
- parentModified: modified,
140
- depth: depth,
141
- children: [
142
- /*#__PURE__*/ jsxs(Modal.Root, {
143
- open: isModalOpen,
144
- onOpenChange: ()=>{
145
- if (isModalOpen) {
146
- if (modified && !isSubmitting) {
147
- setIsConfirmationOpen(true);
148
- } else {
149
- handleToggleModal();
150
- }
151
- }
152
- },
153
- children: [
154
- /*#__PURE__*/ jsx(Modal.Trigger, {
155
- children: /*#__PURE__*/ jsx(Tooltip, {
156
- description: triggerButtonLabel,
157
- children: /*#__PURE__*/ jsx(CustomTextButton, {
158
- onClick: ()=>{
159
- // Check if parent modal has unsaved changes
160
- if (isNested && parentContext.parentModified) {
161
- setIsConfirmationOpen(true);
162
- // Return early to avoid opening the modal
163
- return;
164
- } else {
165
- if (modified && !isSubmitting) {
166
- setIsConfirmationOpen(true);
167
- } else {
168
- // Add current relation to history before opening a new one
169
- if (currentDocumentMeta && Object.keys(currentDocumentMeta).length > 0) {
170
- addDocumentToHistory(currentDocumentMeta);
171
- }
172
- handleToggleModal();
173
- }
174
- if (!isModalOpen) {
175
- setIsModalOpen(true);
176
- }
177
- }
178
- },
179
- width: "100%",
180
- children: triggerButtonLabel
181
- })
182
- })
183
- }),
184
- /*#__PURE__*/ jsxs(CustomModalContent, {
185
- children: [
186
- /*#__PURE__*/ jsx(Modal.Header, {
187
- gap: 2,
188
- children: /*#__PURE__*/ jsx(Flex, {
189
- justifyContent: "space-between",
190
- alignItems: "center",
191
- width: "100%",
192
- children: /*#__PURE__*/ jsxs(Flex, {
193
- gap: 2,
194
- children: [
195
- /*#__PURE__*/ jsx(IconButton, {
196
- withTooltip: false,
197
- label: "Back",
198
- variant: "ghost",
199
- disabled: !hasHistory,
200
- onClick: ()=>{
201
- setActionPosition('back');
202
- if (modified && !isSubmitting) {
203
- setIsConfirmationOpen(true);
204
- } else {
205
- const previousRelation = getPreviousDocument();
206
- if (previousRelation) {
207
- removeLastDocumentFromHistory();
208
- changeDocument(previousRelation);
209
- }
210
- }
211
- },
212
- marginRight: 1,
213
- children: /*#__PURE__*/ jsx(ArrowLeft, {})
214
- }),
215
- /*#__PURE__*/ jsx(Typography, {
216
- tag: "span",
217
- fontWeight: 600,
218
- children: formatMessage({
219
- id: 'content-manager.components.RelationInputModal.modal-title',
220
- defaultMessage: 'Edit a relation'
221
- })
222
- })
223
- ]
224
- })
225
- })
226
- }),
227
- /*#__PURE__*/ jsx(RelationModalBody, {
228
- children: /*#__PURE__*/ jsx(IconButton, {
229
- onClick: ()=>{
230
- setActionPosition('navigate');
231
- if (modified && !isSubmitting) {
232
- setIsConfirmationOpen(true);
233
- } else {
234
- navigate(getFullPageLink());
235
- }
236
- },
237
- variant: "tertiary",
238
- label: formatMessage({
239
- id: 'content-manager.components.RelationInputModal.button-fullpage',
240
- defaultMessage: 'Go to entry'
241
- }),
242
- children: /*#__PURE__*/ jsx(ArrowsOut, {})
243
- })
244
- }),
245
- /*#__PURE__*/ jsx(Modal.Footer, {
246
- children: /*#__PURE__*/ jsx(Button, {
247
- onClick: ()=>{
248
- if (modified && !isSubmitting) {
249
- setIsConfirmationOpen(true);
250
- } else {
251
- handleToggleModal();
252
- }
253
- },
254
- variant: "tertiary",
255
- children: formatMessage({
256
- id: 'app.components.Button.cancel',
257
- defaultMessage: 'Cancel'
258
- })
259
- })
260
- })
261
- ]
262
- })
263
- ]
264
- }),
265
- /*#__PURE__*/ jsx(Dialog.Root, {
266
- open: isConfirmationOpen,
267
- onOpenChange: setIsConfirmationOpen,
268
- children: /*#__PURE__*/ jsx(ConfirmDialog, {
269
- onConfirm: ()=>{
270
- handleConfirm();
271
- setIsConfirmationOpen(false);
272
- resetForm();
273
- },
274
- onCancel: ()=>{
275
- setIsConfirmationOpen(false);
276
- },
277
- variant: "danger",
278
- children: formatMessage({
279
- id: 'content-manager.components.RelationInputModal.confirmation-message',
280
- defaultMessage: 'Some changes were not saved. Are you sure you want to close this relation? All changes that were not saved will be lost.'
281
- })
282
- })
415
+ }
416
+ };
417
+ return /*#__PURE__*/ jsxs(Fragment, {
418
+ children: [
419
+ /*#__PURE__*/ jsx(RelationModalForm, {}),
420
+ /*#__PURE__*/ jsx(Dialog.Root, {
421
+ open: state.confirmDialogIntent != null,
422
+ children: /*#__PURE__*/ jsx(ConfirmDialog, {
423
+ onConfirm: ()=>handleConfirm(),
424
+ onCancel: ()=>dispatch({
425
+ type: 'CANCEL_CONFIRM_DIALOG'
426
+ }),
427
+ variant: "danger",
428
+ children: formatMessage({
429
+ id: 'content-manager.components.RelationInputModal.confirmation-message',
430
+ defaultMessage: 'Some changes were not saved. Are you sure you want to close this relation? All changes that were not saved will be lost.'
283
431
  })
284
- ]
432
+ })
433
+ })
434
+ ]
435
+ });
436
+ };
437
+ const RelationModalTrigger = ({ children, relation })=>{
438
+ const dispatch = useRelationModal('ModalTrigger', (state)=>state.dispatch);
439
+ return /*#__PURE__*/ jsx(StyledTextButton, {
440
+ onClick: ()=>{
441
+ dispatch({
442
+ type: 'GO_TO_RELATION',
443
+ payload: {
444
+ document: relation,
445
+ shouldBypassConfirmation: false
446
+ }
285
447
  });
286
- }
448
+ },
449
+ children: children
287
450
  });
288
451
  };
289
- const CustomTextButton = styled(TextButton)`
452
+ const StyledTextButton = styled(TextButton)`
453
+ max-width: 100%;
290
454
  & > span {
291
455
  font-size: ${({ theme })=>theme.fontSizes[2]};
292
456
  width: inherit;
@@ -295,20 +459,23 @@ const CustomTextButton = styled(TextButton)`
295
459
  text-overflow: ellipsis;
296
460
  }
297
461
  `;
298
- const RelationModalBody = ({ children })=>{
462
+ /**
463
+ * The mini edit view for a relation that is displayed inside a modal.
464
+ * It's complete with its header, document actions and form layout.
465
+ */ const RelationModalForm = ()=>{
299
466
  const { formatMessage } = useIntl();
300
- const documentMeta = useDocumentContext('RelationModalBody', (state)=>state.meta);
301
- const documentResponse = useDocumentContext('RelationModalBody', (state)=>state.document);
302
- const onPreview = useDocumentContext('RelationModalBody', (state)=>state.onPreview);
303
- const documentLayoutResponse = useDocumentLayout(documentMeta.model);
304
- const plugins = useStrapiApp('RelationModalBody', (state)=>state.plugins);
305
- const initialValues = documentResponse.getInitialFormValues();
467
+ const currentDocumentMeta = useRelationModal('RelationModalForm', (state)=>state.currentDocumentMeta);
468
+ const isCreating = useRelationModal('RelationModalForm', (state)=>state.isCreating);
469
+ const currentDocument = useRelationModal('RelationModalForm', (state)=>state.currentDocument);
470
+ const documentLayoutResponse = useDocumentLayout(currentDocumentMeta.model);
471
+ const plugins = useStrapiApp('RelationModalForm', (state)=>state.plugins);
472
+ const initialValues = isCreating ? currentDocument.getInitialFormValues(isCreating) : currentDocument.getInitialFormValues();
306
473
  const { permissions = [], isLoading: isLoadingPermissions, error } = useRBAC(PERMISSIONS.map((action)=>({
307
474
  action,
308
- subject: documentMeta.model
475
+ subject: currentDocumentMeta.model
309
476
  })));
310
- const isLoading = isLoadingPermissions || documentLayoutResponse.isLoading || documentResponse.isLoading;
311
- if (isLoading && !documentResponse.document?.documentId) {
477
+ const isLoading = isLoadingPermissions || documentLayoutResponse.isLoading || currentDocument.isLoading;
478
+ if (isLoading && !currentDocument.document?.documentId) {
312
479
  return /*#__PURE__*/ jsx(Loader, {
313
480
  small: true,
314
481
  children: formatMessage({
@@ -317,7 +484,7 @@ const RelationModalBody = ({ children })=>{
317
484
  })
318
485
  });
319
486
  }
320
- if (error || !documentMeta.model || documentLayoutResponse.error || !documentResponse.document || !documentResponse.meta || !documentResponse.schema || !initialValues) {
487
+ if (error || !currentDocumentMeta.model || documentLayoutResponse.error || !isCreating && !currentDocument.document || !isCreating && !currentDocument.meta || !currentDocument.schema || !initialValues) {
321
488
  return /*#__PURE__*/ jsx(Flex, {
322
489
  alignItems: "center",
323
490
  height: "100%",
@@ -333,106 +500,98 @@ const RelationModalBody = ({ children })=>{
333
500
  })
334
501
  });
335
502
  }
336
- const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);
337
- const hasDraftAndPublished = documentResponse.schema?.options?.draftAndPublish ?? false;
503
+ const documentTitle = currentDocument.getTitle(documentLayoutResponse.edit.settings.mainField);
504
+ const hasDraftAndPublished = currentDocument.schema?.options?.draftAndPublish ?? false;
338
505
  const props = {
339
506
  activeTab: 'draft',
340
- collectionType: documentMeta.collectionType,
341
- model: documentMeta.model,
342
- documentId: documentMeta.documentId,
343
- document: documentResponse.document,
344
- meta: documentResponse.meta,
345
- onPreview,
346
- fromRelationModal: true,
347
- fromPreview: onPreview !== undefined
507
+ collectionType: currentDocumentMeta.collectionType,
508
+ model: currentDocumentMeta.model,
509
+ documentId: currentDocumentMeta.documentId,
510
+ document: currentDocument.document,
511
+ meta: currentDocument.meta
348
512
  };
349
- return /*#__PURE__*/ jsx(Modal.Body, {
350
- children: /*#__PURE__*/ jsxs(DocumentRBAC, {
351
- permissions: permissions,
352
- model: documentMeta.model,
353
- children: [
354
- /*#__PURE__*/ jsxs(Flex, {
355
- alignItems: "flex-start",
356
- direction: "column",
357
- gap: 2,
358
- children: [
359
- /*#__PURE__*/ jsxs(Flex, {
360
- width: "100%",
361
- justifyContent: "space-between",
362
- gap: 2,
363
- children: [
364
- /*#__PURE__*/ jsx(Typography, {
365
- tag: "h2",
366
- variant: "alpha",
367
- children: documentTitle
368
- }),
369
- /*#__PURE__*/ jsxs(Flex, {
370
- gap: 2,
371
- children: [
372
- children,
373
- /*#__PURE__*/ jsx(DescriptionComponentRenderer, {
374
- props: props,
375
- descriptions: plugins['content-manager'].apis.getDocumentActions('relation-modal'),
376
- children: (actions)=>{
377
- const filteredActions = actions.filter((action)=>{
378
- return [
379
- action.position
380
- ].flat().includes('relation-modal');
381
- });
382
- const [primaryAction, secondaryAction] = filteredActions;
383
- if (!primaryAction && !secondaryAction) return null;
384
- // Both actions are available when draft and publish enabled
385
- if (primaryAction && secondaryAction) {
386
- return /*#__PURE__*/ jsxs(Fragment, {
387
- children: [
388
- /*#__PURE__*/ jsx(DocumentActionButton, {
389
- ...secondaryAction,
390
- variant: secondaryAction.variant || 'secondary'
391
- }),
392
- /*#__PURE__*/ jsx(DocumentActionButton, {
393
- ...primaryAction,
394
- variant: primaryAction.variant || 'default'
395
- })
396
- ]
397
- });
398
- }
399
- // Otherwise we just have the save action
400
- return /*#__PURE__*/ jsx(DocumentActionButton, {
401
- ...primaryAction,
402
- variant: primaryAction.variant || 'secondary'
403
- });
404
- }
405
- })
406
- ]
513
+ return /*#__PURE__*/ jsxs(DocumentRBAC, {
514
+ permissions: permissions,
515
+ model: currentDocumentMeta.model,
516
+ children: [
517
+ /*#__PURE__*/ jsxs(Flex, {
518
+ alignItems: "flex-start",
519
+ direction: "column",
520
+ gap: 2,
521
+ children: [
522
+ /*#__PURE__*/ jsxs(Flex, {
523
+ width: "100%",
524
+ justifyContent: "space-between",
525
+ gap: 2,
526
+ children: [
527
+ /*#__PURE__*/ jsx(Typography, {
528
+ tag: "h2",
529
+ variant: "alpha",
530
+ children: documentTitle
531
+ }),
532
+ /*#__PURE__*/ jsx(Flex, {
533
+ gap: 2,
534
+ children: /*#__PURE__*/ jsx(DescriptionComponentRenderer, {
535
+ props: props,
536
+ descriptions: plugins['content-manager'].apis.getDocumentActions('relation-modal'),
537
+ children: (actions)=>{
538
+ const filteredActions = actions.filter((action)=>{
539
+ return [
540
+ action.position
541
+ ].flat().includes('relation-modal');
542
+ });
543
+ const [primaryAction, secondaryAction] = filteredActions;
544
+ if (!primaryAction && !secondaryAction) return null;
545
+ // Both actions are available when draft and publish enabled
546
+ if (primaryAction && secondaryAction) {
547
+ return /*#__PURE__*/ jsxs(Fragment, {
548
+ children: [
549
+ /*#__PURE__*/ jsx(DocumentActionButton, {
550
+ ...secondaryAction,
551
+ variant: secondaryAction.variant || 'secondary'
552
+ }),
553
+ /*#__PURE__*/ jsx(DocumentActionButton, {
554
+ ...primaryAction,
555
+ variant: primaryAction.variant || 'default'
556
+ })
557
+ ]
558
+ });
559
+ }
560
+ // Otherwise we just have the save action
561
+ return /*#__PURE__*/ jsx(DocumentActionButton, {
562
+ ...primaryAction,
563
+ variant: primaryAction.variant || 'secondary'
564
+ });
565
+ }
407
566
  })
408
- ]
409
- }),
410
- hasDraftAndPublished ? /*#__PURE__*/ jsx(Box, {
411
- children: /*#__PURE__*/ jsx(DocumentStatus, {
412
- status: documentResponse.document?.status
413
567
  })
414
- }) : null
415
- ]
416
- }),
417
- /*#__PURE__*/ jsx(Flex, {
418
- flex: 1,
419
- overflow: "auto",
420
- alignItems: "stretch",
421
- paddingTop: 7,
422
- children: /*#__PURE__*/ jsx(Box, {
423
- overflow: "auto",
424
- flex: 1,
425
- children: /*#__PURE__*/ jsx(FormLayout, {
426
- layout: documentLayoutResponse.edit.layout,
427
- document: documentResponse,
428
- hasBackground: false
568
+ ]
569
+ }),
570
+ hasDraftAndPublished ? /*#__PURE__*/ jsx(Box, {
571
+ children: /*#__PURE__*/ jsx(DocumentStatus, {
572
+ status: currentDocument.document?.status
429
573
  })
574
+ }) : null
575
+ ]
576
+ }),
577
+ /*#__PURE__*/ jsx(Flex, {
578
+ flex: 1,
579
+ overflow: "auto",
580
+ alignItems: "stretch",
581
+ paddingTop: 7,
582
+ children: /*#__PURE__*/ jsx(Box, {
583
+ overflow: "auto",
584
+ flex: 1,
585
+ children: /*#__PURE__*/ jsx(FormLayout, {
586
+ layout: documentLayoutResponse.edit.layout,
587
+ document: currentDocument,
588
+ hasBackground: false
430
589
  })
431
590
  })
432
- ]
433
- })
591
+ })
592
+ ]
434
593
  });
435
594
  };
436
595
 
437
- export { RelationModalForm, getCollectionType };
596
+ export { RelationModalRenderer, getCollectionType, reducer, useRelationModal };
438
597
  //# sourceMappingURL=RelationModal.mjs.map