@strapi/content-manager 5.49.0 → 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 (228) hide show
  1. package/dist/admin/layout.js +3 -1
  2. package/dist/admin/layout.js.map +1 -1
  3. package/dist/admin/layout.mjs +5 -3
  4. package/dist/admin/layout.mjs.map +1 -1
  5. package/dist/admin/pages/EditView/components/DocumentActions.js +161 -72
  6. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  7. package/dist/admin/pages/EditView/components/DocumentActions.mjs +161 -73
  8. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  9. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +6 -1
  10. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
  11. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +2 -1
  12. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
  13. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +6 -2
  14. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  15. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +3 -2
  16. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +6 -1
  18. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +6 -1
  20. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/utils/draftRelationCounts.js +117 -0
  22. package/dist/admin/pages/EditView/utils/draftRelationCounts.js.map +1 -0
  23. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs +109 -0
  24. package/dist/admin/pages/EditView/utils/draftRelationCounts.mjs.map +1 -0
  25. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +1 -1
  26. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  27. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +1 -1
  28. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  29. package/dist/admin/pages/ListView/components/TableCells/CellContent.js +2 -2
  30. package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
  31. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs +2 -2
  32. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs.map +1 -1
  33. package/dist/admin/pages/ListView/components/TableCells/Relations.js +1 -1
  34. package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
  35. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs +1 -1
  36. package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
  37. package/dist/admin/preview/pages/Preview.js +38 -11
  38. package/dist/admin/preview/pages/Preview.js.map +1 -1
  39. package/dist/admin/preview/pages/Preview.mjs +39 -12
  40. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  41. package/dist/admin/preview/utils/constants.js +9 -15
  42. package/dist/admin/preview/utils/constants.js.map +1 -1
  43. package/dist/admin/preview/utils/constants.mjs +10 -15
  44. package/dist/admin/preview/utils/constants.mjs.map +1 -1
  45. package/dist/admin/src/components/InjectionZone.d.ts +1 -2
  46. package/dist/admin/src/content-manager.d.ts +15 -15
  47. package/dist/admin/src/history/services/historyVersion.d.ts +2 -2
  48. package/dist/admin/src/hooks/useContentTypeSchema.d.ts +1 -1
  49. package/dist/admin/src/hooks/useDocument.d.ts +8 -9
  50. package/dist/admin/src/hooks/useDocumentLayout.d.ts +3 -3
  51. package/dist/admin/src/hooks/useDragAndDrop.d.ts +4 -4
  52. package/dist/admin/src/hooks/useKeyboardDragAndDrop.d.ts +1 -1
  53. package/dist/admin/src/hooks/usePersistentQueryParams.d.ts +0 -1
  54. package/dist/admin/src/modules/app.d.ts +5 -5
  55. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +1 -1
  56. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +12 -1
  57. package/dist/admin/src/pages/EditView/components/EditorToolbarObserver.d.ts +1 -1
  58. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.d.ts +1 -1
  59. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/conversions.d.ts +2 -2
  60. package/dist/admin/src/pages/EditView/components/FormInputs/ComponentContext.d.ts +1 -2
  61. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +4 -4
  62. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  63. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +19 -20
  64. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +12 -12
  65. package/dist/admin/src/pages/EditView/utils/draftRelationCounts.d.ts +26 -0
  66. package/dist/admin/src/pages/ListView/components/BulkActions/PublishAction.d.ts +1 -1
  67. package/dist/admin/src/pages/ListView/components/Filters.d.ts +1 -1
  68. package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +1 -1
  69. package/dist/admin/src/preview/utils/constants.d.ts +1 -7
  70. package/dist/admin/src/preview/utils/getSendMessage.d.ts +0 -1
  71. package/dist/admin/src/services/documents.d.ts +30 -70
  72. package/dist/admin/src/services/relations.d.ts +6 -20
  73. package/dist/admin/src/services/uid.d.ts +5 -5
  74. package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +4 -4
  75. package/dist/admin/src/utils/users.d.ts +1 -1
  76. package/dist/admin/src/utils/validation.d.ts +1 -1
  77. package/dist/admin/translations/en.json.js +5 -2
  78. package/dist/admin/translations/en.json.js.map +1 -1
  79. package/dist/admin/translations/en.json.mjs +5 -2
  80. package/dist/admin/translations/en.json.mjs.map +1 -1
  81. package/dist/admin/translations/ja.json.js +262 -87
  82. package/dist/admin/translations/ja.json.js.map +1 -1
  83. package/dist/admin/translations/ja.json.mjs +262 -87
  84. package/dist/admin/translations/ja.json.mjs.map +1 -1
  85. package/dist/server/controllers/collection-types.js +2 -2
  86. package/dist/server/controllers/collection-types.js.map +1 -1
  87. package/dist/server/controllers/collection-types.mjs +2 -2
  88. package/dist/server/controllers/collection-types.mjs.map +1 -1
  89. package/dist/server/controllers/single-types.js +2 -2
  90. package/dist/server/controllers/single-types.js.map +1 -1
  91. package/dist/server/controllers/single-types.mjs +2 -2
  92. package/dist/server/controllers/single-types.mjs.map +1 -1
  93. package/dist/server/preview/controllers/preview.js +9 -0
  94. package/dist/server/preview/controllers/preview.js.map +1 -1
  95. package/dist/server/preview/controllers/preview.mjs +9 -0
  96. package/dist/server/preview/controllers/preview.mjs.map +1 -1
  97. package/dist/server/preview/controllers/previewScript.js +1450 -0
  98. package/dist/server/preview/routes/preview.js +11 -0
  99. package/dist/server/preview/routes/preview.js.map +1 -1
  100. package/dist/server/preview/routes/preview.mjs +11 -0
  101. package/dist/server/preview/routes/preview.mjs.map +1 -1
  102. package/dist/server/services/document-manager.js +13 -19
  103. package/dist/server/services/document-manager.js.map +1 -1
  104. package/dist/server/services/document-manager.mjs +13 -19
  105. package/dist/server/services/document-manager.mjs.map +1 -1
  106. package/dist/server/services/utils/draft-relations.js +9 -0
  107. package/dist/server/services/utils/draft-relations.js.map +1 -0
  108. package/dist/server/services/utils/draft-relations.mjs +7 -0
  109. package/dist/server/services/utils/draft-relations.mjs.map +1 -0
  110. package/dist/server/services/utils/draft.js +118 -25
  111. package/dist/server/services/utils/draft.js.map +1 -1
  112. package/dist/server/services/utils/draft.mjs +118 -25
  113. package/dist/server/services/utils/draft.mjs.map +1 -1
  114. package/dist/server/services/utils/populate.js +15 -1
  115. package/dist/server/services/utils/populate.js.map +1 -1
  116. package/dist/server/services/utils/populate.mjs +15 -1
  117. package/dist/server/services/utils/populate.mjs.map +1 -1
  118. package/dist/server/src/controllers/index.d.ts +1 -1
  119. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  120. package/dist/server/src/controllers/utils/clone.d.ts.map +1 -1
  121. package/dist/server/src/controllers/utils/document-status.d.ts +1 -1
  122. package/dist/server/src/controllers/utils/document-status.d.ts.map +1 -1
  123. package/dist/server/src/controllers/utils/metadata.d.ts +5 -5
  124. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  125. package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
  126. package/dist/server/src/controllers/validation/index.d.ts +3 -3
  127. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  128. package/dist/server/src/controllers/validation/model-configuration.d.ts.map +1 -1
  129. package/dist/server/src/controllers/validation/relations.d.ts +2 -2
  130. package/dist/server/src/history/controllers/history-version.d.ts +1 -7
  131. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  132. package/dist/server/src/history/controllers/index.d.ts +2 -1
  133. package/dist/server/src/history/controllers/index.d.ts.map +1 -1
  134. package/dist/server/src/history/controllers/validation/history-version.d.ts +1 -1
  135. package/dist/server/src/history/services/history.d.ts +0 -2
  136. package/dist/server/src/history/services/history.d.ts.map +1 -1
  137. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  138. package/dist/server/src/history/services/utils.d.ts +3 -3
  139. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  140. package/dist/server/src/history/utils.d.ts +1 -18
  141. package/dist/server/src/history/utils.d.ts.map +1 -1
  142. package/dist/server/src/homepage/controllers/homepage.d.ts +0 -1
  143. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -1
  144. package/dist/server/src/homepage/controllers/index.d.ts +2 -1
  145. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -1
  146. package/dist/server/src/homepage/index.d.ts +4 -8
  147. package/dist/server/src/homepage/index.d.ts.map +1 -1
  148. package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
  149. package/dist/server/src/homepage/services/homepage.d.ts +3 -4
  150. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  151. package/dist/server/src/homepage/services/index.d.ts +4 -8
  152. package/dist/server/src/homepage/services/index.d.ts.map +1 -1
  153. package/dist/server/src/index.d.ts +79 -85
  154. package/dist/server/src/index.d.ts.map +1 -1
  155. package/dist/server/src/mcp/derive-content-type-mcp-tools.d.ts.map +1 -1
  156. package/dist/server/src/mcp/handlers/collection-handlers.d.ts.map +1 -1
  157. package/dist/server/src/mcp/handlers/single-type-handlers.d.ts.map +1 -1
  158. package/dist/server/src/mcp/permissions.d.ts +1 -1
  159. package/dist/server/src/mcp/permissions.d.ts.map +1 -1
  160. package/dist/server/src/mcp/register-content-manager-mcp-tools.d.ts.map +1 -1
  161. package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
  162. package/dist/server/src/mcp/schemas/blocks-schema.d.ts.map +1 -1
  163. package/dist/server/src/mcp/schemas/data-schema.d.ts.map +1 -1
  164. package/dist/server/src/mcp/schemas/filters-schema.d.ts.map +1 -1
  165. package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
  166. package/dist/server/src/mcp/schemas/sort-schema.d.ts.map +1 -1
  167. package/dist/server/src/mcp/utils.d.ts.map +1 -1
  168. package/dist/server/src/middlewares/routing.d.ts.map +1 -1
  169. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  170. package/dist/server/src/policies/index.d.ts.map +1 -1
  171. package/dist/server/src/preview/controllers/index.d.ts +2 -1
  172. package/dist/server/src/preview/controllers/index.d.ts.map +1 -1
  173. package/dist/server/src/preview/controllers/preview.d.ts +5 -0
  174. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -1
  175. package/dist/server/src/preview/controllers/validation/preview.d.ts +1 -2
  176. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  177. package/dist/server/src/preview/routes/preview.d.ts.map +1 -1
  178. package/dist/server/src/preview/services/index.d.ts +1 -1
  179. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  180. package/dist/server/src/preview/services/preview-config.d.ts +1 -1
  181. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  182. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  183. package/dist/server/src/preview/utils.d.ts +1 -16
  184. package/dist/server/src/preview/utils.d.ts.map +1 -1
  185. package/dist/server/src/services/components.d.ts +2 -2
  186. package/dist/server/src/services/components.d.ts.map +1 -1
  187. package/dist/server/src/services/configuration.d.ts.map +1 -1
  188. package/dist/server/src/services/content-types.d.ts.map +1 -1
  189. package/dist/server/src/services/data-mapper.d.ts +5 -5
  190. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  191. package/dist/server/src/services/document-manager.d.ts +14 -14
  192. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  193. package/dist/server/src/services/document-metadata.d.ts +6 -6
  194. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  195. package/dist/server/src/services/field-sizes.d.ts +2 -2
  196. package/dist/server/src/services/field-sizes.d.ts.map +1 -1
  197. package/dist/server/src/services/index.d.ts +78 -84
  198. package/dist/server/src/services/index.d.ts.map +1 -1
  199. package/dist/server/src/services/metrics.d.ts.map +1 -1
  200. package/dist/server/src/services/permission-checker.d.ts +12 -31
  201. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  202. package/dist/server/src/services/permission.d.ts.map +1 -1
  203. package/dist/server/src/services/populate-builder.d.ts +4 -4
  204. package/dist/server/src/services/populate-builder.d.ts.map +1 -1
  205. package/dist/server/src/services/uid.d.ts.map +1 -1
  206. package/dist/server/src/services/utils/configuration/attributes.d.ts.map +1 -1
  207. package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
  208. package/dist/server/src/services/utils/count.d.ts.map +1 -1
  209. package/dist/server/src/services/utils/draft-relations.d.ts +19 -0
  210. package/dist/server/src/services/utils/draft-relations.d.ts.map +1 -0
  211. package/dist/server/src/services/utils/draft.d.ts +8 -7
  212. package/dist/server/src/services/utils/draft.d.ts.map +1 -1
  213. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  214. package/dist/server/src/services/utils/store.d.ts.map +1 -1
  215. package/dist/server/src/utils/index.d.ts.map +1 -1
  216. package/dist/server/src/validation/policies/hasPermissions.d.ts +1 -1
  217. package/dist/server/src/validation/zod.d.ts +1 -1
  218. package/dist/server/src/validation/zod.d.ts.map +1 -1
  219. package/dist/shared/contracts/collection-types.d.ts +4 -1
  220. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  221. package/dist/shared/contracts/single-types.d.ts +4 -1
  222. package/dist/shared/contracts/single-types.d.ts.map +1 -1
  223. package/package.json +8 -8
  224. package/dist/admin/preview/utils/previewScript.js +0 -1068
  225. package/dist/admin/preview/utils/previewScript.js.map +0 -1
  226. package/dist/admin/preview/utils/previewScript.mjs +0 -1066
  227. package/dist/admin/preview/utils/previewScript.mjs.map +0 -1
  228. package/dist/admin/src/preview/utils/previewScript.d.ts +0 -32
@@ -21,9 +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';
24
25
  import { getEditViewShortcut } from '../utils/keyboardShortcuts.mjs';
25
26
  import { useRelationModal } from './FormInputs/Relations/RelationModal.mjs';
26
27
 
28
+ const publishConfirmDialogOpeners = new Map();
29
+ const openPublishConfirmDialog = (scope)=>{
30
+ publishConfirmDialogOpeners.get(scope)?.();
31
+ };
27
32
  const connectRelationToParent = (parentDataToUpdate, fieldToConnect, data, fieldToConnectUID)=>{
28
33
  /*
29
34
  * Check if the fieldToConnect is already present in the parentDataToUpdate.
@@ -151,6 +156,24 @@ const DocumentActions = ({ actions })=>{
151
156
  const DocumentActionButton = ({ buttonType = 'button', ...action })=>{
152
157
  const [dialogId, setDialogId] = React.useState(null);
153
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
+ ]);
154
177
  const handleClick = (action)=>async (e)=>{
155
178
  const { onClick = ()=>false, dialog, id } = action;
156
179
  const muteDialog = await onClick(e);
@@ -301,7 +324,7 @@ const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })
301
324
  ]
302
325
  });
303
326
  };
304
- 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 })=>{
305
328
  const { formatMessage } = useIntl();
306
329
  const handleClose = async ()=>{
307
330
  if (onCancel) {
@@ -315,6 +338,28 @@ const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, cont
315
338
  }
316
339
  onClose();
317
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;
318
363
  return /*#__PURE__*/ jsx(Dialog.Root, {
319
364
  open: isOpen,
320
365
  onOpenChange: handleClose,
@@ -324,7 +369,7 @@ const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, cont
324
369
  children: title
325
370
  }),
326
371
  /*#__PURE__*/ jsx(Dialog.Body, {
327
- children: content
372
+ children: dialogBody
328
373
  }),
329
374
  /*#__PURE__*/ jsxs(Dialog.Footer, {
330
375
  children: [
@@ -343,7 +388,7 @@ const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, cont
343
388
  variant: variant,
344
389
  fullWidth: true,
345
390
  loading: loading,
346
- children: formatMessage({
391
+ children: confirmLabel ?? formatMessage({
347
392
  id: 'app.components.Button.confirm',
348
393
  defaultMessage: 'Confirm'
349
394
  })
@@ -411,10 +456,11 @@ const transformData = (data)=>{
411
456
  canReadFields
412
457
  }));
413
458
  const { publish, isLoading } = useDocumentActions();
414
- const onPreview = usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
415
- const [countDraftRelations, { isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }] = useLazyGetDraftRelationCountQuery();
416
- const [localCountOfDraftRelations, setLocalCountOfDraftRelations] = React.useState(0);
417
- 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);
418
464
  const [{ rawQuery }] = useQueryParams();
419
465
  const modified = useForm('PublishAction', ({ modified })=>modified);
420
466
  const setSubmitting = useForm('PublishAction', ({ setSubmitting })=>setSubmitting);
@@ -428,6 +474,8 @@ const transformData = (data)=>{
428
474
  // need to discriminate if the publish is coming from a relation modal or in the edit view
429
475
  const relationContext = useRelationModal('PublishAction', ()=>true, false);
430
476
  const fromRelationModal = relationContext != undefined;
477
+ const isRelationModalOpen = useRelationModal('PublishAction', (state)=>state.state.isModalOpen, false);
478
+ const publishConfirmScope = fromRelationModal ? 'relation-modal' : onPreview ? 'preview' : 'panel';
431
479
  const dispatch = useRelationModal('PublishAction', (state)=>state.dispatch);
432
480
  const fieldToConnect = useRelationModal('PublishAction', (state)=>state.state.fieldToConnect, false);
433
481
  const fieldToConnectUID = useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
@@ -454,49 +502,19 @@ const transformData = (data)=>{
454
502
  formatMessage
455
503
  ]);
456
504
  React.useEffect(()=>{
457
- const localDraftRelations = new Set();
458
- /**
459
- * Extracts draft relations from the provided data object.
460
- * It checks for a connect array of relations.
461
- * If a relation has a status of 'draft', its id is added to the localDraftRelations set.
462
- */ const extractDraftRelations = (data)=>{
463
- const relations = data.connect || [];
464
- relations.forEach((relation)=>{
465
- if (relation.status === 'draft') {
466
- localDraftRelations.add(relation.id);
467
- }
468
- });
469
- };
470
- /**
471
- * Recursively traverses the provided data object to extract draft relations from arrays within 'connect' keys.
472
- * If the data is an object, it looks for 'connect' keys to pass their array values to extractDraftRelations.
473
- * It recursively calls itself for any non-null objects it contains.
474
- */ const traverseAndExtract = (data)=>{
475
- Object.entries(data).forEach(([key, value])=>{
476
- if (key === 'connect' && Array.isArray(value)) {
477
- extractDraftRelations({
478
- connect: value
479
- });
480
- } else if (typeof value === 'object' && value !== null) {
481
- traverseAndExtract(value);
482
- }
483
- });
484
- };
485
- if (!documentId || modified) {
486
- traverseAndExtract(formValues);
487
- setLocalCountOfDraftRelations(localDraftRelations.size);
488
- }
505
+ setLocalDraftRelationCounts(countLocalDraftRelations(formValues, schema, components, model));
489
506
  }, [
490
- documentId,
491
- modified,
507
+ components,
492
508
  formValues,
493
- setLocalCountOfDraftRelations
509
+ model,
510
+ schema
494
511
  ]);
495
- React.useEffect(()=>{
496
- if (!document || !document.documentId || isListView) {
512
+ const fetchDraftRelationsCount = React.useCallback(async ()=>{
513
+ if (!document?.documentId || isListView) {
497
514
  return;
498
515
  }
499
- const fetchDraftRelationsCount = async ()=>{
516
+ setIsFetchingDraftRelations(true);
517
+ try {
500
518
  const { data, error } = await countDraftRelations({
501
519
  collectionType,
502
520
  model,
@@ -507,18 +525,36 @@ const transformData = (data)=>{
507
525
  throw error;
508
526
  }
509
527
  if (data) {
510
- setServerCountOfDraftRelations(data.data);
528
+ setServerDraftRelationCounts(normalizeDraftRelationCounts(data));
511
529
  }
512
- };
513
- fetchDraftRelationsCount();
530
+ } finally{
531
+ setIsFetchingDraftRelations(false);
532
+ }
514
533
  }, [
515
- isListView,
516
- document,
517
- documentId,
518
- countDraftRelations,
519
534
  collectionType,
520
- model,
521
- 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
522
558
  ]);
523
559
  const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
524
560
  const parentDocumentData = useDocument({
@@ -660,11 +696,18 @@ const transformData = (data)=>{
660
696
  }
661
697
  }
662
698
  };
663
- const totalDraftRelations = localCountOfDraftRelations + serverCountOfDraftRelations;
664
- // TODO skipping this for now as there is a bug with the draft relation count that will be worked on separately
665
- // see RFC "Count draft relations" in Notion
666
- const enableDraftRelationsCount = false;
667
- const hasDraftRelations = enableDraftRelationsCount;
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);
668
711
  /**
669
712
  * Disabled when:
670
713
  * - currently if you're cloning a document we don't support publish & clone at the same time.
@@ -673,7 +716,7 @@ const transformData = (data)=>{
673
716
  * - the document is already published & not modified
674
717
  * - the document is being created & not modified
675
718
  * - the user doesn't have the permission to publish
676
- */ const isDisabled = isCloning || isSubmitting || isLoadingDraftRelations || activeTab === 'published' || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish;
719
+ */ const isDisabled = isCloning || isSubmitting || isFetchingDraftRelations || activeTab === 'published' || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish;
677
720
  // Publish on CMD+Shift+Enter (macOS) / CTRL+Shift+Enter (Windows/Linux).
678
721
  // Saving a draft (CMD/CTRL+Enter) is handled by the UpdateAction.
679
722
  React.useEffect(()=>{
@@ -685,18 +728,29 @@ const transformData = (data)=>{
685
728
  return;
686
729
  }
687
730
  e.preventDefault();
688
- if (!isDisabled && !hasDraftRelations) {
689
- performPublish();
731
+ if (!fromRelationModal && isRelationModalOpen) {
732
+ return;
733
+ }
734
+ if (isDisabled) {
735
+ return;
690
736
  }
737
+ if (getDraftRelationsPublishState(getFreshDraftRelationCounts()).hasDraftRelations) {
738
+ openPublishConfirmDialog(publishConfirmScope);
739
+ return;
740
+ }
741
+ performPublish();
691
742
  };
692
743
  window.addEventListener('keydown', handleKeyDown);
693
744
  return ()=>{
694
745
  window.removeEventListener('keydown', handleKeyDown);
695
746
  };
696
747
  }, [
697
- hasDraftRelations,
748
+ fromRelationModal,
749
+ getFreshDraftRelationCounts,
698
750
  isDisabled,
751
+ isRelationModalOpen,
699
752
  performPublish,
753
+ publishConfirmScope,
700
754
  schema?.options?.draftAndPublish
701
755
  ]);
702
756
  if (!schema?.options?.draftAndPublish) {
@@ -711,26 +765,60 @@ const transformData = (data)=>{
711
765
  'relation-modal'
712
766
  ],
713
767
  disabled: isDisabled,
768
+ publishConfirmScope: supportsDraftRelationWarning ? publishConfirmScope : undefined,
714
769
  label: formatMessage({
715
770
  id: 'app.utils.publish',
716
771
  defaultMessage: 'Publish'
717
772
  }),
718
773
  onClick: async ()=>{
774
+ if (getDraftRelationsPublishState(getFreshDraftRelationCounts()).hasDraftRelations) {
775
+ // Let DocumentActionButton open the confirmation dialog.
776
+ return;
777
+ }
719
778
  await performPublish();
779
+ // Skip the registered dialog when publishing directly.
780
+ return true;
720
781
  },
721
- dialog: hasDraftRelations ? {
782
+ dialog: supportsDraftRelationWarning ? {
722
783
  type: 'dialog',
723
- variant: 'danger',
724
- footer: null,
784
+ variant: dialogVariant,
785
+ bodyIcon,
725
786
  title: formatMessage({
726
- id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.title`),
787
+ id: getTranslation('popUpWarning.warning.has-draft-relations.title'),
727
788
  defaultMessage: 'Confirmation'
728
789
  }),
729
- content: formatMessage({
730
- id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.message`),
731
- defaultMessage: 'This entry is related to {count, plural, one {# draft entry} other {# draft entries}}. Publishing it could leave broken links in your app.'
732
- }, {
733
- 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'
734
822
  }),
735
823
  onConfirm: async ()=>{
736
824
  await performPublish();
@@ -1204,5 +1292,5 @@ const DEFAULT_ACTIONS = [
1204
1292
  DiscardAction
1205
1293
  ];
1206
1294
 
1207
- export { DEFAULT_ACTIONS, DocumentActionButton, DocumentActions, DocumentActionsMenu };
1295
+ export { DEFAULT_ACTIONS, DocumentActionButton, DocumentActions, DocumentActionsMenu, openPublishConfirmDialog };
1208
1296
  //# sourceMappingURL=DocumentActions.mjs.map