@strapi/content-manager 5.48.1 → 5.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (458) hide show
  1. package/dist/admin/components/ActionsDrawer.js +3 -2
  2. package/dist/admin/components/ActionsDrawer.js.map +1 -1
  3. package/dist/admin/components/ComponentIcon.js +4 -3
  4. package/dist/admin/components/ComponentIcon.js.map +1 -1
  5. package/dist/admin/components/ConfigurationForm/EditFieldForm.js +3 -2
  6. package/dist/admin/components/ConfigurationForm/EditFieldForm.js.map +1 -1
  7. package/dist/admin/components/ConfigurationForm/Fields.js +3 -2
  8. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  9. package/dist/admin/components/ConfigurationForm/Form.js +7 -3
  10. package/dist/admin/components/ConfigurationForm/Form.js.map +1 -1
  11. package/dist/admin/components/LeftMenu.js +3 -2
  12. package/dist/admin/components/LeftMenu.js.map +1 -1
  13. package/dist/admin/components/RelativeTime.js +3 -2
  14. package/dist/admin/components/RelativeTime.js.map +1 -1
  15. package/dist/admin/components/Widgets.js +3 -2
  16. package/dist/admin/components/Widgets.js.map +1 -1
  17. package/dist/admin/features/DocumentRBAC.js +3 -2
  18. package/dist/admin/features/DocumentRBAC.js.map +1 -1
  19. package/dist/admin/history/components/VersionContent.js +7 -3
  20. package/dist/admin/history/components/VersionContent.js.map +1 -1
  21. package/dist/admin/history/components/VersionHeader.js +3 -2
  22. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  23. package/dist/admin/history/components/VersionInputRenderer.js +3 -2
  24. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  25. package/dist/admin/history/pages/History.js +3 -2
  26. package/dist/admin/history/pages/History.js.map +1 -1
  27. package/dist/admin/history/routes.js +3 -2
  28. package/dist/admin/history/routes.js.map +1 -1
  29. package/dist/admin/hooks/useContentTypeSchema.js +3 -2
  30. package/dist/admin/hooks/useContentTypeSchema.js.map +1 -1
  31. package/dist/admin/hooks/useDocument.js +3 -2
  32. package/dist/admin/hooks/useDocument.js.map +1 -1
  33. package/dist/admin/hooks/useDocumentActions.js +3 -2
  34. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  35. package/dist/admin/hooks/useDocumentContext.js +3 -2
  36. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  37. package/dist/admin/hooks/useDocumentLayout.js +3 -2
  38. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  39. package/dist/admin/hooks/useDragAndDrop.js +3 -2
  40. package/dist/admin/hooks/useDragAndDrop.js.map +1 -1
  41. package/dist/admin/hooks/useKeyboardDragAndDrop.js +3 -2
  42. package/dist/admin/hooks/useKeyboardDragAndDrop.js.map +1 -1
  43. package/dist/admin/hooks/useOnce.js +3 -2
  44. package/dist/admin/hooks/useOnce.js.map +1 -1
  45. package/dist/admin/hooks/usePersistentQueryParams.js +7 -2
  46. package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
  47. package/dist/admin/layout.js +3 -1
  48. package/dist/admin/layout.js.map +1 -1
  49. package/dist/admin/layout.mjs +5 -3
  50. package/dist/admin/layout.mjs.map +1 -1
  51. package/dist/admin/pages/ComponentConfigurationPage.js +3 -2
  52. package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
  53. package/dist/admin/pages/EditConfigurationPage.js +3 -2
  54. package/dist/admin/pages/EditConfigurationPage.js.map +1 -1
  55. package/dist/admin/pages/EditView/EditViewPage.js +3 -2
  56. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  57. package/dist/admin/pages/EditView/components/DocumentActions.js +238 -108
  58. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  59. package/dist/admin/pages/EditView/components/DocumentActions.mjs +225 -103
  60. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js +3 -2
  62. package/dist/admin/pages/EditView/components/EditorToolbarObserver.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +4 -3
  64. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js +3 -2
  66. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js +3 -2
  68. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Link.js.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +3 -2
  70. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +3 -2
  72. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js +3 -2
  74. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +4 -3
  76. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +3 -2
  78. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +3 -2
  80. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  81. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +3 -2
  82. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  83. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +6 -1
  84. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  85. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +2 -1
  86. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  87. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +9 -4
  88. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  89. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +3 -2
  90. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  91. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +13 -4
  92. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  93. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +6 -1
  94. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  95. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +3 -2
  96. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  97. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +7 -3
  98. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  99. package/dist/admin/pages/EditView/components/FormInputs/UID.js +3 -2
  100. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  101. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +8 -4
  102. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  103. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js +3 -2
  104. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js.map +1 -1
  105. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js +3 -2
  106. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -1
  107. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js +5 -1
  108. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/continueList.js.map +1 -1
  109. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js +15 -2
  110. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/mdRenderer.js.map +1 -1
  111. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js +5 -1
  112. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js.map +1 -1
  113. package/dist/admin/pages/EditView/components/FormLayout.js +3 -2
  114. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  115. package/dist/admin/pages/EditView/components/Header.js +3 -2
  116. package/dist/admin/pages/EditView/components/Header.js.map +1 -1
  117. package/dist/admin/pages/EditView/components/InputRenderer.js +3 -2
  118. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  119. package/dist/admin/pages/EditView/components/Panels.js +3 -2
  120. package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
  121. package/dist/admin/pages/EditView/utils/data.js +5 -1
  122. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  123. package/dist/admin/pages/EditView/utils/draftRelationCounts.js +117 -0
  124. package/dist/admin/pages/EditView/utils/draftRelationCounts.js.map +1 -0
  125. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs +109 -0
  126. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs.map +1 -0
  127. package/dist/admin/pages/EditView/utils/keyboardShortcuts.js +35 -0
  128. package/dist/admin/pages/EditView/utils/keyboardShortcuts.js.map +1 -0
  129. package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs +33 -0
  130. package/dist/admin/pages/EditView/utils/keyboardShortcuts.mjs.map +1 -0
  131. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +3 -2
  132. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  133. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +3 -2
  134. package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
  135. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +3 -2
  136. package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
  137. package/dist/admin/pages/ListConfiguration/components/Settings.js +3 -2
  138. package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
  139. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +3 -2
  140. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
  141. package/dist/admin/pages/ListView/ListViewPage.js +3 -2
  142. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  143. package/dist/admin/pages/ListView/components/BulkActions/Actions.js +3 -2
  144. package/dist/admin/pages/ListView/components/BulkActions/Actions.js.map +1 -1
  145. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +4 -3
  146. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  147. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +1 -1
  148. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  149. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +3 -2
  150. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  151. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  152. package/dist/admin/pages/ListView/components/Filters.js +3 -2
  153. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  154. package/dist/admin/pages/ListView/components/TableActions.js +3 -2
  155. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  156. package/dist/admin/pages/ListView/components/TableCells/CellContent.js +9 -5
  157. package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
  158. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs +2 -2
  159. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs.map +1 -1
  160. package/dist/admin/pages/ListView/components/TableCells/CellValue.js +7 -2
  161. package/dist/admin/pages/ListView/components/TableCells/CellValue.js.map +1 -1
  162. package/dist/admin/pages/ListView/components/TableCells/Relations.js +4 -3
  163. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
  164. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs +1 -1
  165. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
  166. package/dist/admin/preview/components/InputPopover.js +3 -2
  167. package/dist/admin/preview/components/InputPopover.js.map +1 -1
  168. package/dist/admin/preview/hooks/usePreviewInputManager.js +3 -2
  169. package/dist/admin/preview/hooks/usePreviewInputManager.js.map +1 -1
  170. package/dist/admin/preview/pages/Preview.js +41 -13
  171. package/dist/admin/preview/pages/Preview.js.map +1 -1
  172. package/dist/admin/preview/pages/Preview.mjs +39 -12
  173. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  174. package/dist/admin/preview/routes.js +3 -2
  175. package/dist/admin/preview/routes.js.map +1 -1
  176. package/dist/admin/preview/utils/constants.js +9 -15
  177. package/dist/admin/preview/utils/constants.js.map +1 -1
  178. package/dist/admin/preview/utils/constants.mjs +10 -15
  179. package/dist/admin/preview/utils/constants.mjs.map +1 -1
  180. package/dist/admin/src/components/InjectionZone.d.ts +1 -2
  181. package/dist/admin/src/content-manager.d.ts +15 -15
  182. package/dist/admin/src/history/services/historyVersion.d.ts +2 -2
  183. package/dist/admin/src/hooks/useContentTypeSchema.d.ts +1 -1
  184. package/dist/admin/src/hooks/useDocument.d.ts +8 -9
  185. package/dist/admin/src/hooks/useDocumentLayout.d.ts +3 -3
  186. package/dist/admin/src/hooks/useDragAndDrop.d.ts +4 -4
  187. package/dist/admin/src/hooks/useKeyboardDragAndDrop.d.ts +1 -1
  188. package/dist/admin/src/hooks/usePersistentQueryParams.d.ts +0 -1
  189. package/dist/admin/src/modules/app.d.ts +5 -5
  190. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +1 -1
  191. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +12 -1
  192. package/dist/admin/src/pages/EditView/components/EditorToolbarObserver.d.ts +1 -1
  193. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +1 -1
  194. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.d.ts +2 -2
  195. package/dist/admin/src/pages/EditView/components/FormInputs/ComponentContext.d.ts +1 -2
  196. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +4 -4
  197. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  198. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +19 -20
  199. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +12 -12
  200. package/dist/admin/src/pages/EditView/utils/draftRelationCounts.d.ts +26 -0
  201. package/dist/admin/src/pages/EditView/utils/keyboardShortcuts.d.ts +18 -0
  202. package/dist/admin/src/pages/ListView/components/BulkActions/PublishAction.d.ts +1 -1
  203. package/dist/admin/src/pages/ListView/components/Filters.d.ts +1 -1
  204. package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +1 -1
  205. package/dist/admin/src/preview/utils/constants.d.ts +1 -7
  206. package/dist/admin/src/preview/utils/getSendMessage.d.ts +0 -1
  207. package/dist/admin/src/services/documents.d.ts +30 -70
  208. package/dist/admin/src/services/relations.d.ts +6 -20
  209. package/dist/admin/src/services/uid.d.ts +5 -5
  210. package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +4 -4
  211. package/dist/admin/src/utils/users.d.ts +1 -1
  212. package/dist/admin/src/utils/validation.d.ts +1 -1
  213. package/dist/admin/translations/cs.json.js +2 -1
  214. package/dist/admin/translations/cs.json.js.map +1 -1
  215. package/dist/admin/translations/cs.json.mjs +2 -1
  216. package/dist/admin/translations/cs.json.mjs.map +1 -1
  217. package/dist/admin/translations/de.json.js +2 -1
  218. package/dist/admin/translations/de.json.js.map +1 -1
  219. package/dist/admin/translations/de.json.mjs +2 -1
  220. package/dist/admin/translations/de.json.mjs.map +1 -1
  221. package/dist/admin/translations/en.json.js +7 -3
  222. package/dist/admin/translations/en.json.js.map +1 -1
  223. package/dist/admin/translations/en.json.mjs +7 -3
  224. package/dist/admin/translations/en.json.mjs.map +1 -1
  225. package/dist/admin/translations/es.json.js +2 -1
  226. package/dist/admin/translations/es.json.js.map +1 -1
  227. package/dist/admin/translations/es.json.mjs +2 -1
  228. package/dist/admin/translations/es.json.mjs.map +1 -1
  229. package/dist/admin/translations/fr.json.js +2 -1
  230. package/dist/admin/translations/fr.json.js.map +1 -1
  231. package/dist/admin/translations/fr.json.mjs +2 -1
  232. package/dist/admin/translations/fr.json.mjs.map +1 -1
  233. package/dist/admin/translations/ja.json.js +262 -87
  234. package/dist/admin/translations/ja.json.js.map +1 -1
  235. package/dist/admin/translations/ja.json.mjs +262 -87
  236. package/dist/admin/translations/ja.json.mjs.map +1 -1
  237. package/dist/admin/translations/nl.json.js +2 -1
  238. package/dist/admin/translations/nl.json.js.map +1 -1
  239. package/dist/admin/translations/nl.json.mjs +2 -1
  240. package/dist/admin/translations/nl.json.mjs.map +1 -1
  241. package/dist/admin/translations/pl.json.js +2 -1
  242. package/dist/admin/translations/pl.json.js.map +1 -1
  243. package/dist/admin/translations/pl.json.mjs +2 -1
  244. package/dist/admin/translations/pl.json.mjs.map +1 -1
  245. package/dist/admin/translations/sk.json.js +2 -1
  246. package/dist/admin/translations/sk.json.js.map +1 -1
  247. package/dist/admin/translations/sk.json.mjs +2 -1
  248. package/dist/admin/translations/sk.json.mjs.map +1 -1
  249. package/dist/admin/utils/objects.js +9 -4
  250. package/dist/admin/utils/objects.js.map +1 -1
  251. package/dist/admin/utils/validation.js +7 -3
  252. package/dist/admin/utils/validation.js.map +1 -1
  253. package/dist/server/controllers/collection-types.js +2 -2
  254. package/dist/server/controllers/collection-types.js.map +1 -1
  255. package/dist/server/controllers/collection-types.mjs +2 -2
  256. package/dist/server/controllers/collection-types.mjs.map +1 -1
  257. package/dist/server/controllers/single-types.js +2 -2
  258. package/dist/server/controllers/single-types.js.map +1 -1
  259. package/dist/server/controllers/single-types.mjs +2 -2
  260. package/dist/server/controllers/single-types.mjs.map +1 -1
  261. package/dist/server/controllers/utils/clone.js +5 -1
  262. package/dist/server/controllers/utils/clone.js.map +1 -1
  263. package/dist/server/controllers/utils/clone.mjs.map +1 -1
  264. package/dist/server/controllers/validation/index.js +6 -2
  265. package/dist/server/controllers/validation/index.js.map +1 -1
  266. package/dist/server/homepage/services/homepage.js +6 -1
  267. package/dist/server/homepage/services/homepage.js.map +1 -1
  268. package/dist/server/homepage/services/homepage.mjs +6 -1
  269. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  270. package/dist/server/mcp/handlers/collection-handlers.js +15 -18
  271. package/dist/server/mcp/handlers/collection-handlers.js.map +1 -1
  272. package/dist/server/mcp/handlers/collection-handlers.mjs +16 -19
  273. package/dist/server/mcp/handlers/collection-handlers.mjs.map +1 -1
  274. package/dist/server/mcp/handlers/single-type-handlers.js +12 -12
  275. package/dist/server/mcp/handlers/single-type-handlers.js.map +1 -1
  276. package/dist/server/mcp/handlers/single-type-handlers.mjs +13 -13
  277. package/dist/server/mcp/handlers/single-type-handlers.mjs.map +1 -1
  278. package/dist/server/mcp/register-content-manager-mcp-tools.js +4 -1
  279. package/dist/server/mcp/register-content-manager-mcp-tools.js.map +1 -1
  280. package/dist/server/mcp/register-content-manager-mcp-tools.mjs +4 -1
  281. package/dist/server/mcp/register-content-manager-mcp-tools.mjs.map +1 -1
  282. package/dist/server/mcp/sanitizers/shape-relations.js +108 -0
  283. package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -0
  284. package/dist/server/mcp/sanitizers/shape-relations.mjs +103 -0
  285. package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -0
  286. package/dist/server/mcp/schemas/data-schema.js +0 -3
  287. package/dist/server/mcp/schemas/data-schema.js.map +1 -1
  288. package/dist/server/mcp/schemas/data-schema.mjs +0 -3
  289. package/dist/server/mcp/schemas/data-schema.mjs.map +1 -1
  290. package/dist/server/mcp/schemas/output-schemas.js +30 -4
  291. package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
  292. package/dist/server/mcp/schemas/output-schemas.mjs +30 -4
  293. package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
  294. package/dist/server/mcp/utils.js +30 -3
  295. package/dist/server/mcp/utils.js.map +1 -1
  296. package/dist/server/mcp/utils.mjs +30 -4
  297. package/dist/server/mcp/utils.mjs.map +1 -1
  298. package/dist/server/middlewares/routing.js +5 -1
  299. package/dist/server/middlewares/routing.js.map +1 -1
  300. package/dist/server/preview/controllers/preview.js +9 -0
  301. package/dist/server/preview/controllers/preview.js.map +1 -1
  302. package/dist/server/preview/controllers/preview.mjs +9 -0
  303. package/dist/server/preview/controllers/preview.mjs.map +1 -1
  304. package/dist/server/preview/controllers/previewScript.js +1450 -0
  305. package/dist/server/preview/routes/preview.js +11 -0
  306. package/dist/server/preview/routes/preview.js.map +1 -1
  307. package/dist/server/preview/routes/preview.mjs +11 -0
  308. package/dist/server/preview/routes/preview.mjs.map +1 -1
  309. package/dist/server/services/document-manager.js +13 -19
  310. package/dist/server/services/document-manager.js.map +1 -1
  311. package/dist/server/services/document-manager.mjs +13 -19
  312. package/dist/server/services/document-manager.mjs.map +1 -1
  313. package/dist/server/services/populate-builder.js.map +1 -1
  314. package/dist/server/services/populate-builder.mjs.map +1 -1
  315. package/dist/server/services/uid.js +9 -4
  316. package/dist/server/services/uid.js.map +1 -1
  317. package/dist/server/services/utils/configuration/attributes.js +14 -10
  318. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  319. package/dist/server/services/utils/configuration/layouts.js +8 -4
  320. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  321. package/dist/server/services/utils/configuration/metadatas.js +19 -15
  322. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  323. package/dist/server/services/utils/configuration/settings.js +5 -1
  324. package/dist/server/services/utils/configuration/settings.js.map +1 -1
  325. package/dist/server/services/utils/draft-relations.js +9 -0
  326. package/dist/server/services/utils/draft-relations.js.map +1 -0
  327. package/dist/server/services/utils/draft-relations.mjs +7 -0
  328. package/dist/server/services/utils/draft-relations.mjs.map +1 -0
  329. package/dist/server/services/utils/draft.js +123 -26
  330. package/dist/server/services/utils/draft.js.map +1 -1
  331. package/dist/server/services/utils/draft.mjs +118 -25
  332. package/dist/server/services/utils/draft.mjs.map +1 -1
  333. package/dist/server/services/utils/populate.js +23 -5
  334. package/dist/server/services/utils/populate.js.map +1 -1
  335. package/dist/server/services/utils/populate.mjs +15 -1
  336. package/dist/server/services/utils/populate.mjs.map +1 -1
  337. package/dist/server/services/utils/store.js +9 -5
  338. package/dist/server/services/utils/store.js.map +1 -1
  339. package/dist/server/src/controllers/index.d.ts +1 -1
  340. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  341. package/dist/server/src/controllers/utils/clone.d.ts +1 -1
  342. package/dist/server/src/controllers/utils/clone.d.ts.map +1 -1
  343. package/dist/server/src/controllers/utils/document-status.d.ts +1 -1
  344. package/dist/server/src/controllers/utils/document-status.d.ts.map +1 -1
  345. package/dist/server/src/controllers/utils/metadata.d.ts +5 -5
  346. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  347. package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
  348. package/dist/server/src/controllers/validation/index.d.ts +3 -3
  349. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  350. package/dist/server/src/controllers/validation/model-configuration.d.ts.map +1 -1
  351. package/dist/server/src/controllers/validation/relations.d.ts +2 -2
  352. package/dist/server/src/history/controllers/history-version.d.ts +1 -7
  353. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  354. package/dist/server/src/history/controllers/index.d.ts +2 -1
  355. package/dist/server/src/history/controllers/index.d.ts.map +1 -1
  356. package/dist/server/src/history/controllers/validation/history-version.d.ts +1 -1
  357. package/dist/server/src/history/services/history.d.ts +0 -2
  358. package/dist/server/src/history/services/history.d.ts.map +1 -1
  359. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  360. package/dist/server/src/history/services/utils.d.ts +3 -3
  361. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  362. package/dist/server/src/history/utils.d.ts +1 -18
  363. package/dist/server/src/history/utils.d.ts.map +1 -1
  364. package/dist/server/src/homepage/controllers/homepage.d.ts +0 -1
  365. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -1
  366. package/dist/server/src/homepage/controllers/index.d.ts +2 -1
  367. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -1
  368. package/dist/server/src/homepage/index.d.ts +4 -8
  369. package/dist/server/src/homepage/index.d.ts.map +1 -1
  370. package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
  371. package/dist/server/src/homepage/services/homepage.d.ts +3 -4
  372. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  373. package/dist/server/src/homepage/services/index.d.ts +4 -8
  374. package/dist/server/src/homepage/services/index.d.ts.map +1 -1
  375. package/dist/server/src/index.d.ts +82 -86
  376. package/dist/server/src/index.d.ts.map +1 -1
  377. package/dist/server/src/mcp/derive-content-type-mcp-tools.d.ts.map +1 -1
  378. package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -1
  379. package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -1
  380. package/dist/server/src/mcp/permissions.d.ts +1 -1
  381. package/dist/server/src/mcp/permissions.d.ts.map +1 -1
  382. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts +2 -1
  383. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
  384. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts +38 -0
  385. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -0
  386. package/dist/server/src/mcp/schemas/blocks-schema.d.ts.map +1 -1
  387. package/dist/server/src/mcp/schemas/data-schema.d.ts +0 -3
  388. package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -1
  389. package/dist/server/src/mcp/schemas/filters-schema.d.ts.map +1 -1
  390. package/dist/server/src/mcp/schemas/output-schemas.d.ts +2 -2
  391. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  392. package/dist/server/src/mcp/schemas/sort-schema.d.ts.map +1 -1
  393. package/dist/server/src/mcp/types.d.ts +2 -2
  394. package/dist/server/src/mcp/types.d.ts.map +1 -1
  395. package/dist/server/src/mcp/utils.d.ts +19 -1
  396. package/dist/server/src/mcp/utils.d.ts.map +1 -1
  397. package/dist/server/src/middlewares/routing.d.ts.map +1 -1
  398. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  399. package/dist/server/src/policies/index.d.ts.map +1 -1
  400. package/dist/server/src/preview/controllers/index.d.ts +2 -1
  401. package/dist/server/src/preview/controllers/index.d.ts.map +1 -1
  402. package/dist/server/src/preview/controllers/preview.d.ts +5 -0
  403. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -1
  404. package/dist/server/src/preview/controllers/validation/preview.d.ts +1 -2
  405. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  406. package/dist/server/src/preview/routes/preview.d.ts.map +1 -1
  407. package/dist/server/src/preview/services/index.d.ts +1 -1
  408. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  409. package/dist/server/src/preview/services/preview-config.d.ts +1 -1
  410. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  411. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  412. package/dist/server/src/preview/utils.d.ts +1 -16
  413. package/dist/server/src/preview/utils.d.ts.map +1 -1
  414. package/dist/server/src/services/components.d.ts +2 -2
  415. package/dist/server/src/services/components.d.ts.map +1 -1
  416. package/dist/server/src/services/configuration.d.ts.map +1 -1
  417. package/dist/server/src/services/content-types.d.ts.map +1 -1
  418. package/dist/server/src/services/data-mapper.d.ts +5 -5
  419. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  420. package/dist/server/src/services/document-manager.d.ts +14 -14
  421. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  422. package/dist/server/src/services/document-metadata.d.ts +6 -6
  423. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  424. package/dist/server/src/services/field-sizes.d.ts +2 -2
  425. package/dist/server/src/services/field-sizes.d.ts.map +1 -1
  426. package/dist/server/src/services/index.d.ts +81 -85
  427. package/dist/server/src/services/index.d.ts.map +1 -1
  428. package/dist/server/src/services/metrics.d.ts.map +1 -1
  429. package/dist/server/src/services/permission-checker.d.ts +12 -31
  430. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  431. package/dist/server/src/services/permission.d.ts.map +1 -1
  432. package/dist/server/src/services/populate-builder.d.ts +7 -5
  433. package/dist/server/src/services/populate-builder.d.ts.map +1 -1
  434. package/dist/server/src/services/uid.d.ts.map +1 -1
  435. package/dist/server/src/services/utils/configuration/attributes.d.ts.map +1 -1
  436. package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
  437. package/dist/server/src/services/utils/count.d.ts.map +1 -1
  438. package/dist/server/src/services/utils/draft-relations.d.ts +19 -0
  439. package/dist/server/src/services/utils/draft-relations.d.ts.map +1 -0
  440. package/dist/server/src/services/utils/draft.d.ts +8 -7
  441. package/dist/server/src/services/utils/draft.d.ts.map +1 -1
  442. package/dist/server/src/services/utils/populate.d.ts +3 -1
  443. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  444. package/dist/server/src/services/utils/store.d.ts.map +1 -1
  445. package/dist/server/src/utils/index.d.ts.map +1 -1
  446. package/dist/server/src/validation/policies/hasPermissions.d.ts +1 -1
  447. package/dist/server/src/validation/zod.d.ts +1 -1
  448. package/dist/server/src/validation/zod.d.ts.map +1 -1
  449. package/dist/shared/contracts/collection-types.d.ts +4 -1
  450. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  451. package/dist/shared/contracts/single-types.d.ts +4 -1
  452. package/dist/shared/contracts/single-types.d.ts.map +1 -1
  453. package/package.json +10 -10
  454. package/dist/admin/preview/utils/previewScript.js +0 -1068
  455. package/dist/admin/preview/utils/previewScript.js.map +0 -1
  456. package/dist/admin/preview/utils/previewScript.mjs +0 -1066
  457. package/dist/admin/preview/utils/previewScript.mjs.map +0 -1
  458. package/dist/admin/src/preview/utils/previewScript.d.ts +0 -32
@@ -21,8 +21,14 @@ import { useGetDraftRelationCountQuery as useLazyGetDraftRelationCountQuery, use
21
21
  import { buildValidParams, isBaseQueryError } from '../../../utils/api.mjs';
22
22
  import { getTranslation } from '../../../utils/translations.mjs';
23
23
  import { handleInvisibleAttributes } from '../utils/data.mjs';
24
+ import { EMPTY_DRAFT_RELATION_COUNTS, countLocalDraftRelations, normalizeDraftRelationCounts, resolveDraftRelationCounts, getDraftRelationsPublishState } from '../utils/draftRelationCounts.mjs';
25
+ import { getEditViewShortcut } from '../utils/keyboardShortcuts.mjs';
24
26
  import { useRelationModal } from './FormInputs/Relations/RelationModal.mjs';
25
27
 
28
+ const publishConfirmDialogOpeners = new Map();
29
+ const openPublishConfirmDialog = (scope)=>{
30
+ publishConfirmDialogOpeners.get(scope)?.();
31
+ };
26
32
  const connectRelationToParent = (parentDataToUpdate, fieldToConnect, data, fieldToConnectUID)=>{
27
33
  /*
28
34
  * Check if the fieldToConnect is already present in the parentDataToUpdate.
@@ -71,18 +77,23 @@ const DocumentActions = ({ actions })=>{
71
77
  return null;
72
78
  }
73
79
  const addHintTooltip = (action, children)=>{
74
- return !action.disabled ? /*#__PURE__*/ jsx(Tooltip, {
75
- label: formatMessage({
76
- id: 'content-manager.containers.EditView.saveHint',
77
- defaultMessage: 'Ctrl / Cmd + Enter to {action}'
78
- }, {
79
- action: action.label
80
- }),
80
+ if (action.disabled) {
81
+ return children;
82
+ }
83
+ const hint = action.type === 'publish' ? formatMessage({
84
+ id: 'content-manager.containers.EditView.publishHint',
85
+ defaultMessage: 'Ctrl / Cmd + Shift + Enter to publish'
86
+ }) : formatMessage({
87
+ id: 'content-manager.containers.EditView.saveHint',
88
+ defaultMessage: 'Ctrl / Cmd + Enter to save'
89
+ });
90
+ return /*#__PURE__*/ jsx(Tooltip, {
91
+ label: hint,
81
92
  children: /*#__PURE__*/ jsx(Flex, {
82
93
  width: "100%",
83
94
  children: children
84
95
  })
85
- }) : children;
96
+ });
86
97
  };
87
98
  const primaryActionContent = /*#__PURE__*/ jsxs(Fragment, {
88
99
  children: [
@@ -129,15 +140,15 @@ const DocumentActions = ({ actions })=>{
129
140
  alignItems: "stretch",
130
141
  direction: "column",
131
142
  children: secondaryAction.type === 'publish' ? /*#__PURE__*/ jsx(tours.contentManager.Publish, {
132
- children: /*#__PURE__*/ jsx(DocumentActionButton, {
143
+ children: addHintTooltip(secondaryAction, /*#__PURE__*/ jsx(DocumentActionButton, {
133
144
  ...secondaryAction,
134
145
  variant: secondaryAction.variant || 'secondary'
135
- })
136
- }) : /*#__PURE__*/ jsx(DocumentActionButton, {
146
+ }))
147
+ }) : addHintTooltip(secondaryAction, /*#__PURE__*/ jsx(DocumentActionButton, {
137
148
  ...secondaryAction,
138
149
  variant: secondaryAction.variant || 'secondary',
139
150
  buttonType: "submit"
140
- })
151
+ }))
141
152
  }) : null
142
153
  ]
143
154
  });
@@ -145,6 +156,24 @@ const DocumentActions = ({ actions })=>{
145
156
  const DocumentActionButton = ({ buttonType = 'button', ...action })=>{
146
157
  const [dialogId, setDialogId] = React.useState(null);
147
158
  const { toggleNotification } = useNotification();
159
+ React.useEffect(()=>{
160
+ const scope = action.publishConfirmScope;
161
+ if (action.type !== 'publish' || !action.dialog || !scope) {
162
+ return;
163
+ }
164
+ const open = ()=>setDialogId(action.id);
165
+ publishConfirmDialogOpeners.set(scope, open);
166
+ return ()=>{
167
+ if (publishConfirmDialogOpeners.get(scope) === open) {
168
+ publishConfirmDialogOpeners.delete(scope);
169
+ }
170
+ };
171
+ }, [
172
+ action.type,
173
+ action.dialog,
174
+ action.id,
175
+ action.publishConfirmScope
176
+ ]);
148
177
  const handleClick = (action)=>async (e)=>{
149
178
  const { onClick = ()=>false, dialog, id } = action;
150
179
  const muteDialog = await onClick(e);
@@ -295,7 +324,7 @@ const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })
295
324
  ]
296
325
  });
297
326
  };
298
- const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, content, isOpen, variant = 'secondary', loading })=>{
327
+ const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, content, bodyIcon, confirmLabel, isOpen, variant = 'secondary', loading })=>{
299
328
  const { formatMessage } = useIntl();
300
329
  const handleClose = async ()=>{
301
330
  if (onCancel) {
@@ -309,6 +338,28 @@ const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, cont
309
338
  }
310
339
  onClose();
311
340
  };
341
+ const dialogBody = bodyIcon ? /*#__PURE__*/ jsxs(Flex, {
342
+ direction: "column",
343
+ alignItems: "stretch",
344
+ gap: 2,
345
+ children: [
346
+ /*#__PURE__*/ jsx(Flex, {
347
+ justifyContent: "center",
348
+ children: /*#__PURE__*/ jsx(WarningCircle, {
349
+ width: "24px",
350
+ height: "24px",
351
+ fill: bodyIcon === 'danger' ? 'danger600' : 'primary600'
352
+ })
353
+ }),
354
+ /*#__PURE__*/ jsx(Typography, {
355
+ id: "confirm-description",
356
+ tag: "p",
357
+ variant: "omega",
358
+ textAlign: "center",
359
+ children: content
360
+ })
361
+ ]
362
+ }) : content;
312
363
  return /*#__PURE__*/ jsx(Dialog.Root, {
313
364
  open: isOpen,
314
365
  onOpenChange: handleClose,
@@ -318,7 +369,7 @@ const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, cont
318
369
  children: title
319
370
  }),
320
371
  /*#__PURE__*/ jsx(Dialog.Body, {
321
- children: content
372
+ children: dialogBody
322
373
  }),
323
374
  /*#__PURE__*/ jsxs(Dialog.Footer, {
324
375
  children: [
@@ -337,7 +388,7 @@ const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, cont
337
388
  variant: variant,
338
389
  fullWidth: true,
339
390
  loading: loading,
340
- children: formatMessage({
391
+ children: confirmLabel ?? formatMessage({
341
392
  id: 'app.components.Button.confirm',
342
393
  defaultMessage: 'Confirm'
343
394
  })
@@ -405,10 +456,11 @@ const transformData = (data)=>{
405
456
  canReadFields
406
457
  }));
407
458
  const { publish, isLoading } = useDocumentActions();
408
- const onPreview = usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
409
- const [countDraftRelations, { isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }] = useLazyGetDraftRelationCountQuery();
410
- const [localCountOfDraftRelations, setLocalCountOfDraftRelations] = React.useState(0);
411
- const [serverCountOfDraftRelations, setServerCountOfDraftRelations] = React.useState(0);
459
+ const onPreview = usePreviewContext('PublishAction', (state)=>state.onPreview, false);
460
+ const [countDraftRelations, { isError: isErrorDraftRelations }] = useLazyGetDraftRelationCountQuery();
461
+ const [localDraftRelationCounts, setLocalDraftRelationCounts] = React.useState(EMPTY_DRAFT_RELATION_COUNTS);
462
+ const [serverDraftRelationCounts, setServerDraftRelationCounts] = React.useState(EMPTY_DRAFT_RELATION_COUNTS);
463
+ const [isFetchingDraftRelations, setIsFetchingDraftRelations] = React.useState(false);
412
464
  const [{ rawQuery }] = useQueryParams();
413
465
  const modified = useForm('PublishAction', ({ modified })=>modified);
414
466
  const setSubmitting = useForm('PublishAction', ({ setSubmitting })=>setSubmitting);
@@ -422,6 +474,8 @@ const transformData = (data)=>{
422
474
  // need to discriminate if the publish is coming from a relation modal or in the edit view
423
475
  const relationContext = useRelationModal('PublishAction', ()=>true, false);
424
476
  const fromRelationModal = relationContext != undefined;
477
+ const isRelationModalOpen = useRelationModal('PublishAction', (state)=>state.state.isModalOpen, false);
478
+ const publishConfirmScope = fromRelationModal ? 'relation-modal' : onPreview ? 'preview' : 'panel';
425
479
  const dispatch = useRelationModal('PublishAction', (state)=>state.dispatch);
426
480
  const fieldToConnect = useRelationModal('PublishAction', (state)=>state.state.fieldToConnect, false);
427
481
  const fieldToConnectUID = useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
@@ -448,49 +502,19 @@ const transformData = (data)=>{
448
502
  formatMessage
449
503
  ]);
450
504
  React.useEffect(()=>{
451
- const localDraftRelations = new Set();
452
- /**
453
- * Extracts draft relations from the provided data object.
454
- * It checks for a connect array of relations.
455
- * If a relation has a status of 'draft', its id is added to the localDraftRelations set.
456
- */ const extractDraftRelations = (data)=>{
457
- const relations = data.connect || [];
458
- relations.forEach((relation)=>{
459
- if (relation.status === 'draft') {
460
- localDraftRelations.add(relation.id);
461
- }
462
- });
463
- };
464
- /**
465
- * Recursively traverses the provided data object to extract draft relations from arrays within 'connect' keys.
466
- * If the data is an object, it looks for 'connect' keys to pass their array values to extractDraftRelations.
467
- * It recursively calls itself for any non-null objects it contains.
468
- */ const traverseAndExtract = (data)=>{
469
- Object.entries(data).forEach(([key, value])=>{
470
- if (key === 'connect' && Array.isArray(value)) {
471
- extractDraftRelations({
472
- connect: value
473
- });
474
- } else if (typeof value === 'object' && value !== null) {
475
- traverseAndExtract(value);
476
- }
477
- });
478
- };
479
- if (!documentId || modified) {
480
- traverseAndExtract(formValues);
481
- setLocalCountOfDraftRelations(localDraftRelations.size);
482
- }
505
+ setLocalDraftRelationCounts(countLocalDraftRelations(formValues, schema, components, model));
483
506
  }, [
484
- documentId,
485
- modified,
507
+ components,
486
508
  formValues,
487
- setLocalCountOfDraftRelations
509
+ model,
510
+ schema
488
511
  ]);
489
- React.useEffect(()=>{
490
- if (!document || !document.documentId || isListView) {
512
+ const fetchDraftRelationsCount = React.useCallback(async ()=>{
513
+ if (!document?.documentId || isListView) {
491
514
  return;
492
515
  }
493
- const fetchDraftRelationsCount = async ()=>{
516
+ setIsFetchingDraftRelations(true);
517
+ try {
494
518
  const { data, error } = await countDraftRelations({
495
519
  collectionType,
496
520
  model,
@@ -501,18 +525,36 @@ const transformData = (data)=>{
501
525
  throw error;
502
526
  }
503
527
  if (data) {
504
- setServerCountOfDraftRelations(data.data);
528
+ setServerDraftRelationCounts(normalizeDraftRelationCounts(data));
505
529
  }
506
- };
507
- fetchDraftRelationsCount();
530
+ } finally{
531
+ setIsFetchingDraftRelations(false);
532
+ }
508
533
  }, [
509
- isListView,
510
- document,
511
- documentId,
512
- countDraftRelations,
513
534
  collectionType,
514
- model,
515
- currentDocumentMeta.params
535
+ countDraftRelations,
536
+ currentDocumentMeta.params,
537
+ document?.documentId,
538
+ documentId,
539
+ isListView,
540
+ model
541
+ ]);
542
+ React.useEffect(()=>{
543
+ fetchDraftRelationsCount();
544
+ }, [
545
+ fetchDraftRelationsCount,
546
+ document?.updatedAt
547
+ ]);
548
+ React.useEffect(()=>{
549
+ const handleWindowFocus = ()=>{
550
+ fetchDraftRelationsCount();
551
+ };
552
+ window.addEventListener('focus', handleWindowFocus);
553
+ return ()=>{
554
+ window.removeEventListener('focus', handleWindowFocus);
555
+ };
556
+ }, [
557
+ fetchDraftRelationsCount
516
558
  ]);
517
559
  const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
518
560
  const parentDocumentData = useDocument({
@@ -654,31 +696,61 @@ const transformData = (data)=>{
654
696
  }
655
697
  }
656
698
  };
657
- const totalDraftRelations = localCountOfDraftRelations + serverCountOfDraftRelations;
658
- // TODO skipping this for now as there is a bug with the draft relation count that will be worked on separately
659
- // see RFC "Count draft relations" in Notion
660
- const enableDraftRelationsCount = false;
661
- const hasDraftRelations = enableDraftRelationsCount;
662
- // Auto-publish on CMD+Enter on macOS, and CTRL+Enter on Windows/Linux
699
+ const getFreshDraftRelationCounts = React.useCallback(()=>resolveDraftRelationCounts(documentId, modified, countLocalDraftRelations(getValues(), schema, components, model), serverDraftRelationCounts), [
700
+ components,
701
+ documentId,
702
+ getValues,
703
+ model,
704
+ modified,
705
+ schema,
706
+ serverDraftRelationCounts
707
+ ]);
708
+ const draftRelationCounts = resolveDraftRelationCounts(documentId, modified, localDraftRelationCounts, serverDraftRelationCounts);
709
+ const { hasUnpublishedRelations, hasDraftM2mLinks, dialogVariant, bodyIcon, confirmLabel } = getDraftRelationsPublishState(draftRelationCounts);
710
+ const supportsDraftRelationWarning = Boolean(schema?.options?.draftAndPublish);
711
+ /**
712
+ * Disabled when:
713
+ * - currently if you're cloning a document we don't support publish & clone at the same time.
714
+ * - the form is submitting
715
+ * - the active tab is the published tab
716
+ * - the document is already published & not modified
717
+ * - the document is being created & not modified
718
+ * - the user doesn't have the permission to publish
719
+ */ const isDisabled = isCloning || isSubmitting || isFetchingDraftRelations || activeTab === 'published' || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish;
720
+ // Publish on CMD+Shift+Enter (macOS) / CTRL+Shift+Enter (Windows/Linux).
721
+ // Saving a draft (CMD/CTRL+Enter) is handled by the UpdateAction.
663
722
  React.useEffect(()=>{
664
723
  if (!schema?.options?.draftAndPublish) {
665
724
  return;
666
725
  }
667
726
  const handleKeyDown = (e)=>{
668
- if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {
669
- e.preventDefault();
670
- {
671
- performPublish();
672
- }
727
+ if (getEditViewShortcut(e) !== 'publish') {
728
+ return;
729
+ }
730
+ e.preventDefault();
731
+ if (!fromRelationModal && isRelationModalOpen) {
732
+ return;
733
+ }
734
+ if (isDisabled) {
735
+ return;
673
736
  }
737
+ if (getDraftRelationsPublishState(getFreshDraftRelationCounts()).hasDraftRelations) {
738
+ openPublishConfirmDialog(publishConfirmScope);
739
+ return;
740
+ }
741
+ performPublish();
674
742
  };
675
743
  window.addEventListener('keydown', handleKeyDown);
676
744
  return ()=>{
677
745
  window.removeEventListener('keydown', handleKeyDown);
678
746
  };
679
747
  }, [
680
- hasDraftRelations,
748
+ fromRelationModal,
749
+ getFreshDraftRelationCounts,
750
+ isDisabled,
751
+ isRelationModalOpen,
681
752
  performPublish,
753
+ publishConfirmScope,
682
754
  schema?.options?.draftAndPublish
683
755
  ]);
684
756
  if (!schema?.options?.draftAndPublish) {
@@ -692,35 +764,61 @@ const transformData = (data)=>{
692
764
  'preview',
693
765
  'relation-modal'
694
766
  ],
695
- /**
696
- * Disabled when:
697
- * - currently if you're cloning a document we don't support publish & clone at the same time.
698
- * - the form is submitting
699
- * - the active tab is the published tab
700
- * - the document is already published & not modified
701
- * - the document is being created & not modified
702
- * - the user doesn't have the permission to publish
703
- */ disabled: isCloning || isSubmitting || isLoadingDraftRelations || activeTab === 'published' || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish,
767
+ disabled: isDisabled,
768
+ publishConfirmScope: supportsDraftRelationWarning ? publishConfirmScope : undefined,
704
769
  label: formatMessage({
705
770
  id: 'app.utils.publish',
706
771
  defaultMessage: 'Publish'
707
772
  }),
708
773
  onClick: async ()=>{
774
+ if (getDraftRelationsPublishState(getFreshDraftRelationCounts()).hasDraftRelations) {
775
+ // Let DocumentActionButton open the confirmation dialog.
776
+ return;
777
+ }
709
778
  await performPublish();
779
+ // Skip the registered dialog when publishing directly.
780
+ return true;
710
781
  },
711
- dialog: hasDraftRelations ? {
782
+ dialog: supportsDraftRelationWarning ? {
712
783
  type: 'dialog',
713
- variant: 'danger',
714
- footer: null,
784
+ variant: dialogVariant,
785
+ bodyIcon,
715
786
  title: formatMessage({
716
- id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.title`),
787
+ id: getTranslation('popUpWarning.warning.has-draft-relations.title'),
717
788
  defaultMessage: 'Confirmation'
718
789
  }),
719
- content: formatMessage({
720
- id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.message`),
721
- defaultMessage: 'This entry is related to {count, plural, one {# draft entry} other {# draft entries}}. Publishing it could leave broken links in your app.'
722
- }, {
723
- count: totalDraftRelations
790
+ content: /*#__PURE__*/ jsxs(Fragment, {
791
+ children: [
792
+ hasUnpublishedRelations ? formatMessage({
793
+ id: getTranslation('popUpWarning.warning.has-draft-relations.message'),
794
+ defaultMessage: 'This entry is related to {count, plural, one {# draft entry} other {# draft entries}}. {count, plural, one {That relation will not be included in the published version.} other {Those relations will not be included in the published version.}}'
795
+ }, {
796
+ count: draftRelationCounts.unpublishedRelations
797
+ }) : formatMessage({
798
+ id: getTranslation('popUpWarning.warning.has-draft-m2m-relations.message'),
799
+ defaultMessage: '{count, plural, one {# linked entry is still in draft. It will appear on the live site once that entry is published.} other {# linked entries are still in draft. They will appear on the live site once those entries are published.}}'
800
+ }, {
801
+ count: draftRelationCounts.draftM2mLinks
802
+ }),
803
+ hasUnpublishedRelations && hasDraftM2mLinks ? ` ${formatMessage({
804
+ id: getTranslation('popUpWarning.warning.has-draft-m2m-relations.additional'),
805
+ defaultMessage: '{count, plural, one {# many-to-many link points} other {# many-to-many links point}} to draft entries that will become visible once published.'
806
+ }, {
807
+ count: draftRelationCounts.draftM2mLinks
808
+ })}` : null,
809
+ ' ',
810
+ formatMessage({
811
+ id: getTranslation('popUpWarning.warning.publish-question'),
812
+ defaultMessage: 'Do you still want to publish?'
813
+ })
814
+ ]
815
+ }),
816
+ confirmLabel: confirmLabel === 'publish' ? formatMessage({
817
+ id: 'app.utils.publish',
818
+ defaultMessage: 'Publish'
819
+ }) : formatMessage({
820
+ id: getTranslation('popUpwarning.warning.has-draft-relations.button-confirm'),
821
+ defaultMessage: 'Publish without relations'
724
822
  }),
725
823
  onConfirm: async ()=>{
726
824
  await performPublish();
@@ -779,6 +877,12 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
779
877
  const { schema } = useDoc();
780
878
  const suitableSchema = fromRelationModal ? relationalModalSchema : schema;
781
879
  const hasDraftAndPublished = suitableSchema?.options?.draftAndPublish ?? false;
880
+ /**
881
+ * Disabled when:
882
+ * - the form is submitting
883
+ * - the document is not modified & we're not cloning (you can save a clone entity straight away)
884
+ * - the active tab is the published tab
885
+ */ const isDisabled = isSubmitting || !modified && !isCloning || activeTab === 'published';
782
886
  const handleUpdate = async ()=>{
783
887
  setSubmitting(true);
784
888
  try {
@@ -928,14 +1032,32 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
928
1032
  }
929
1033
  }
930
1034
  };
1035
+ // Save a draft on CMD+Enter (macOS) / CTRL+Enter (Windows/Linux), with CMD/CTRL+S as an alias.
1036
+ // Publishing (CMD/CTRL+Shift+Enter) is handled by the PublishAction.
1037
+ // `handleUpdate` is recreated on every render, so we read the latest version (and the latest
1038
+ // disabled state) through refs and register the listener only once.
1039
+ const handleUpdateRef = React.useRef(handleUpdate);
1040
+ handleUpdateRef.current = handleUpdate;
1041
+ const isDisabledRef = React.useRef(isDisabled);
1042
+ isDisabledRef.current = isDisabled;
1043
+ React.useEffect(()=>{
1044
+ const handleKeyDown = (e)=>{
1045
+ if (getEditViewShortcut(e) !== 'save') {
1046
+ return;
1047
+ }
1048
+ e.preventDefault();
1049
+ if (!isDisabledRef.current) {
1050
+ handleUpdateRef.current();
1051
+ }
1052
+ };
1053
+ window.addEventListener('keydown', handleKeyDown);
1054
+ return ()=>{
1055
+ window.removeEventListener('keydown', handleKeyDown);
1056
+ };
1057
+ }, []);
931
1058
  return {
932
1059
  loading: isLoading,
933
- /**
934
- * Disabled when:
935
- * - the form is submitting
936
- * - the document is not modified & we're not cloning (you can save a clone entity straight away)
937
- * - the active tab is the published tab
938
- */ disabled: isSubmitting || !modified && !isCloning || activeTab === 'published',
1060
+ disabled: isDisabled,
939
1061
  label: formatMessage({
940
1062
  id: 'global.save',
941
1063
  defaultMessage: 'Save'
@@ -1170,5 +1292,5 @@ const DEFAULT_ACTIONS = [
1170
1292
  DiscardAction
1171
1293
  ];
1172
1294
 
1173
- export { DEFAULT_ACTIONS, DocumentActionButton, DocumentActions, DocumentActionsMenu };
1295
+ export { DEFAULT_ACTIONS, DocumentActionButton, DocumentActions, DocumentActionsMenu, openPublishConfirmDialog };
1174
1296
  //# sourceMappingURL=DocumentActions.mjs.map