@strapi/content-manager 0.0.0-experimental.8bf99b7c43ed372264c198d347a2ada9dfed174d → 0.0.0-experimental.8c28a74d1219c09f4ee67402fd3a26f182c4990a

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 (195) hide show
  1. package/dist/admin/components/LeftMenu.js +30 -34
  2. package/dist/admin/components/LeftMenu.js.map +1 -1
  3. package/dist/admin/components/LeftMenu.mjs +32 -36
  4. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  5. package/dist/admin/components/Widgets.js +161 -0
  6. package/dist/admin/components/Widgets.js.map +1 -0
  7. package/dist/admin/components/Widgets.mjs +158 -0
  8. package/dist/admin/components/Widgets.mjs.map +1 -0
  9. package/dist/admin/content-manager.js.map +1 -1
  10. package/dist/admin/content-manager.mjs.map +1 -1
  11. package/dist/admin/history/pages/History.js +1 -9
  12. package/dist/admin/history/pages/History.js.map +1 -1
  13. package/dist/admin/history/pages/History.mjs +1 -9
  14. package/dist/admin/history/pages/History.mjs.map +1 -1
  15. package/dist/admin/hooks/useDocumentActions.js +13 -2
  16. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  17. package/dist/admin/hooks/useDocumentActions.mjs +13 -2
  18. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  19. package/dist/admin/hooks/useDocumentContext.js +57 -0
  20. package/dist/admin/hooks/useDocumentContext.js.map +1 -0
  21. package/dist/admin/hooks/useDocumentContext.mjs +36 -0
  22. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -0
  23. package/dist/admin/index.js +42 -5
  24. package/dist/admin/index.js.map +1 -1
  25. package/dist/admin/index.mjs +42 -3
  26. package/dist/admin/index.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/EditViewPage.js +85 -93
  28. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  29. package/dist/admin/pages/EditView/EditViewPage.mjs +86 -94
  30. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  31. package/dist/admin/pages/EditView/components/DocumentActions.js +232 -51
  32. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  33. package/dist/admin/pages/EditView/components/DocumentActions.mjs +238 -57
  34. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +7 -12
  36. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +8 -13
  38. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +46 -95
  40. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +48 -78
  42. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +2 -2
  44. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +2 -2
  46. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +2 -2
  48. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +2 -2
  50. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +4 -2
  52. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +4 -2
  54. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +5 -16
  56. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +5 -16
  58. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +2 -3
  60. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +2 -3
  62. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +495 -345
  64. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +495 -347
  66. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +143 -86
  68. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +146 -89
  70. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/UID.js +7 -7
  72. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +7 -7
  74. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +50 -97
  76. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +51 -79
  78. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  79. package/dist/admin/pages/EditView/components/InputRenderer.js +3 -10
  80. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  81. package/dist/admin/pages/EditView/components/InputRenderer.mjs +3 -10
  82. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  83. package/dist/admin/pages/ListView/ListViewPage.js +0 -77
  84. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  85. package/dist/admin/pages/ListView/ListViewPage.mjs +1 -78
  86. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  87. package/dist/admin/preview/components/PreviewHeader.js +3 -6
  88. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  89. package/dist/admin/preview/components/PreviewHeader.mjs +3 -6
  90. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  91. package/dist/admin/preview/pages/Preview.js +94 -102
  92. package/dist/admin/preview/pages/Preview.js.map +1 -1
  93. package/dist/admin/preview/pages/Preview.mjs +94 -102
  94. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  95. package/dist/admin/services/homepage.js +30 -0
  96. package/dist/admin/services/homepage.js.map +1 -0
  97. package/dist/admin/services/homepage.mjs +28 -0
  98. package/dist/admin/services/homepage.mjs.map +1 -0
  99. package/dist/admin/src/components/Widgets.d.ts +3 -0
  100. package/dist/admin/src/content-manager.d.ts +0 -3
  101. package/dist/admin/src/features/DocumentRBAC.d.ts +1 -1
  102. package/dist/admin/src/history/pages/History.d.ts +1 -1
  103. package/dist/admin/src/hooks/useDocumentContext.d.ts +30 -0
  104. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -2
  105. package/dist/admin/src/pages/EditView/components/FormInputs/ComponentContext.d.ts +1 -1
  106. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +1 -1
  107. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +73 -7
  108. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +1 -0
  109. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +1 -1
  110. package/dist/admin/src/preview/pages/Preview.d.ts +2 -1
  111. package/dist/admin/src/services/homepage.d.ts +5 -0
  112. package/dist/admin/translations/en.json.js +2 -1
  113. package/dist/admin/translations/en.json.js.map +1 -1
  114. package/dist/admin/translations/en.json.mjs +2 -1
  115. package/dist/admin/translations/en.json.mjs.map +1 -1
  116. package/dist/admin/translations/ru.json.js +235 -226
  117. package/dist/admin/translations/ru.json.js.map +1 -1
  118. package/dist/admin/translations/ru.json.mjs +230 -226
  119. package/dist/admin/translations/ru.json.mjs.map +1 -1
  120. package/dist/server/controllers/index.js +3 -1
  121. package/dist/server/controllers/index.js.map +1 -1
  122. package/dist/server/controllers/index.mjs +3 -1
  123. package/dist/server/controllers/index.mjs.map +1 -1
  124. package/dist/server/homepage/controllers/homepage.js +57 -0
  125. package/dist/server/homepage/controllers/homepage.js.map +1 -0
  126. package/dist/server/homepage/controllers/homepage.mjs +36 -0
  127. package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
  128. package/dist/server/homepage/controllers/index.js +10 -0
  129. package/dist/server/homepage/controllers/index.js.map +1 -0
  130. package/dist/server/homepage/controllers/index.mjs +8 -0
  131. package/dist/server/homepage/controllers/index.mjs.map +1 -0
  132. package/dist/server/homepage/index.js +14 -0
  133. package/dist/server/homepage/index.js.map +1 -0
  134. package/dist/server/homepage/index.mjs +12 -0
  135. package/dist/server/homepage/index.mjs.map +1 -0
  136. package/dist/server/homepage/routes/homepage.js +25 -0
  137. package/dist/server/homepage/routes/homepage.js.map +1 -0
  138. package/dist/server/homepage/routes/homepage.mjs +23 -0
  139. package/dist/server/homepage/routes/homepage.mjs.map +1 -0
  140. package/dist/server/homepage/routes/index.js +13 -0
  141. package/dist/server/homepage/routes/index.js.map +1 -0
  142. package/dist/server/homepage/routes/index.mjs +11 -0
  143. package/dist/server/homepage/routes/index.mjs.map +1 -0
  144. package/dist/server/homepage/services/homepage.js +157 -0
  145. package/dist/server/homepage/services/homepage.js.map +1 -0
  146. package/dist/server/homepage/services/homepage.mjs +155 -0
  147. package/dist/server/homepage/services/homepage.mjs.map +1 -0
  148. package/dist/server/homepage/services/index.js +10 -0
  149. package/dist/server/homepage/services/index.js.map +1 -0
  150. package/dist/server/homepage/services/index.mjs +8 -0
  151. package/dist/server/homepage/services/index.mjs.map +1 -0
  152. package/dist/server/preview/services/preview.js +0 -1
  153. package/dist/server/preview/services/preview.js.map +1 -1
  154. package/dist/server/preview/services/preview.mjs +0 -1
  155. package/dist/server/preview/services/preview.mjs.map +1 -1
  156. package/dist/server/routes/index.js +3 -1
  157. package/dist/server/routes/index.js.map +1 -1
  158. package/dist/server/routes/index.mjs +3 -1
  159. package/dist/server/routes/index.mjs.map +1 -1
  160. package/dist/server/services/index.js +3 -1
  161. package/dist/server/services/index.js.map +1 -1
  162. package/dist/server/services/index.mjs +3 -1
  163. package/dist/server/services/index.mjs.map +1 -1
  164. package/dist/server/src/controllers/index.d.ts.map +1 -1
  165. package/dist/server/src/homepage/controllers/homepage.d.ts +7 -0
  166. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
  167. package/dist/server/src/homepage/controllers/index.d.ts +2 -0
  168. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
  169. package/dist/server/src/homepage/index.d.ts +16 -0
  170. package/dist/server/src/homepage/index.d.ts.map +1 -0
  171. package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
  172. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
  173. package/dist/server/src/homepage/routes/index.d.ts +8 -0
  174. package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
  175. package/dist/server/src/homepage/services/homepage.d.ts +11 -0
  176. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
  177. package/dist/server/src/homepage/services/index.d.ts +9 -0
  178. package/dist/server/src/homepage/services/index.d.ts.map +1 -0
  179. package/dist/server/src/index.d.ts +7 -1
  180. package/dist/server/src/index.d.ts.map +1 -1
  181. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  182. package/dist/server/src/routes/index.d.ts +1 -0
  183. package/dist/server/src/routes/index.d.ts.map +1 -1
  184. package/dist/server/src/services/data-mapper.d.ts +0 -1
  185. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  186. package/dist/server/src/services/index.d.ts +6 -1
  187. package/dist/server/src/services/index.d.ts.map +1 -1
  188. package/dist/shared/contracts/homepage.d.ts +25 -0
  189. package/dist/shared/contracts/homepage.d.ts.map +1 -0
  190. package/package.json +8 -8
  191. package/dist/admin/features/DocumentContext.js +0 -71
  192. package/dist/admin/features/DocumentContext.js.map +0 -1
  193. package/dist/admin/features/DocumentContext.mjs +0 -49
  194. package/dist/admin/features/DocumentContext.mjs.map +0 -1
  195. package/dist/admin/src/features/DocumentContext.d.ts +0 -53
@@ -1,23 +1,60 @@
1
- import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import { useNotification, useAPIErrorHandler, useQueryParams, useForm } from '@strapi/admin/strapi-admin';
4
- import { Menu, Flex, Typography, Radio, Button, VisuallyHidden, Dialog, Modal } from '@strapi/design-system';
5
- import { Cross, WarningCircle, More } from '@strapi/icons';
4
+ import { Menu, Flex, Button, VisuallyHidden, Dialog, Modal, Typography, Radio } from '@strapi/design-system';
5
+ import { More, Cross, WarningCircle } from '@strapi/icons';
6
6
  import mapValues from 'lodash/fp/mapValues';
7
+ import get from 'lodash/get';
8
+ import merge from 'lodash/merge';
9
+ import set from 'lodash/set';
7
10
  import { useIntl } from 'react-intl';
8
11
  import { useNavigate, useMatch, useParams } from 'react-router-dom';
9
12
  import { styled } from 'styled-components';
10
13
  import { PUBLISHED_AT_ATTRIBUTE_NAME } from '../../../constants/attributes.mjs';
11
14
  import { SINGLE_TYPES } from '../../../constants/collections.mjs';
12
- import { useDocumentContext } from '../../../features/DocumentContext.mjs';
13
15
  import { useDocumentRBAC } from '../../../features/DocumentRBAC.mjs';
14
- import { useDoc } from '../../../hooks/useDocument.mjs';
16
+ import { useDocument, useDoc } from '../../../hooks/useDocument.mjs';
15
17
  import { useDocumentActions } from '../../../hooks/useDocumentActions.mjs';
18
+ import { useDocumentContext } from '../../../hooks/useDocumentContext.mjs';
19
+ import { usePreviewContext } from '../../../preview/pages/Preview.mjs';
16
20
  import { LIST_PATH, CLONE_PATH } from '../../../router.mjs';
17
- import { useGetDraftRelationCountQuery as useLazyGetDraftRelationCountQuery } from '../../../services/documents.mjs';
18
- import { buildValidParams, isBaseQueryError } from '../../../utils/api.mjs';
21
+ import { useGetDraftRelationCountQuery as useLazyGetDraftRelationCountQuery, useUpdateDocumentMutation } from '../../../services/documents.mjs';
22
+ import { isBaseQueryError, buildValidParams } from '../../../utils/api.mjs';
19
23
  import { getTranslation } from '../../../utils/translations.mjs';
24
+ import { useRelationModal } from './FormInputs/Relations/RelationModal.mjs';
20
25
 
26
+ const connectRelationToParent = (parentDataToUpdate, fieldToConnect, data, fieldToConnectUID)=>{
27
+ /*
28
+ * Check if the fieldToConnect is already present in the parentDataToUpdate.
29
+ * This happens in particular when in the parentDocument you have created
30
+ * a new component without saving.
31
+ */ const isFieldPresent = !!get(parentDataToUpdate, fieldToConnect);
32
+ const fieldToConnectPath = isFieldPresent ? fieldToConnect : fieldToConnect.split('.').slice(0, -1).join('.');
33
+ const fieldToConnectValue = isFieldPresent ? {
34
+ connect: [
35
+ {
36
+ id: data.documentId,
37
+ documentId: data.documentId,
38
+ locale: data.locale
39
+ }
40
+ ]
41
+ } : {
42
+ [fieldToConnect.split('.').pop()]: {
43
+ connect: [
44
+ {
45
+ id: data.documentId,
46
+ documentId: data.documentId,
47
+ locale: data.locale
48
+ }
49
+ ],
50
+ disconnect: []
51
+ },
52
+ // In case the object was not present you need to pass the componentUID of the parent document
53
+ __component: fieldToConnectUID
54
+ };
55
+ const objectToConnect = set({}, fieldToConnectPath, fieldToConnectValue);
56
+ return merge(parentDataToUpdate, objectToConnect);
57
+ };
21
58
  const DocumentActions = ({ actions })=>{
22
59
  const { formatMessage } = useIntl();
23
60
  const [primaryAction, secondaryAction, ...restActions] = actions.filter((action)=>{
@@ -350,8 +387,8 @@ const transformData = (data)=>{
350
387
  };
351
388
  /* -------------------------------------------------------------------------------------------------
352
389
  * DocumentActionComponents
353
- * -----------------------------------------------------------------------------------------------*/ const PublishAction = ({ activeTab, documentId, model, collectionType, meta, document, onPreview, fromPreview = false, fromRelationModal = false })=>{
354
- const schema = useDocumentContext('PublishAction', (state)=>state.document.schema);
390
+ * -----------------------------------------------------------------------------------------------*/ const PublishAction = ({ activeTab, documentId, model, collectionType, meta, document })=>{
391
+ const { currentDocument: { schema } } = useDocumentContext('PublishAction');
355
392
  const navigate = useNavigate();
356
393
  const { toggleNotification } = useNotification();
357
394
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
@@ -360,22 +397,31 @@ const transformData = (data)=>{
360
397
  const { id } = useParams();
361
398
  const { formatMessage } = useIntl();
362
399
  const canPublish = useDocumentRBAC('PublishAction', ({ canPublish })=>canPublish);
363
- const { publish, isLoading } = useDocumentActions(fromPreview, fromRelationModal);
400
+ const { publish, isLoading } = useDocumentActions();
401
+ const onPreview = usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
364
402
  const [countDraftRelations, { isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }] = useLazyGetDraftRelationCountQuery();
365
403
  const [localCountOfDraftRelations, setLocalCountOfDraftRelations] = React.useState(0);
366
404
  const [serverCountOfDraftRelations, setServerCountOfDraftRelations] = React.useState(0);
367
- const [{ query, rawQuery }] = useQueryParams();
368
- const params = React.useMemo(()=>buildValidParams(query), [
369
- query
370
- ]);
405
+ const [{ rawQuery }] = useQueryParams();
371
406
  const modified = useForm('PublishAction', ({ modified })=>modified);
372
407
  const setSubmitting = useForm('PublishAction', ({ setSubmitting })=>setSubmitting);
373
408
  const isSubmitting = useForm('PublishAction', ({ isSubmitting })=>isSubmitting);
374
409
  const validate = useForm('PublishAction', (state)=>state.validate);
375
410
  const setErrors = useForm('PublishAction', (state)=>state.setErrors);
376
411
  const formValues = useForm('PublishAction', ({ values })=>values);
377
- const rootDocumentMeta = useDocumentContext('PublishAction', (state)=>state.rootDocumentMeta);
378
- const currentDocumentMeta = useDocumentContext('PublishAction', (state)=>state.meta);
412
+ const resetForm = useForm('PublishAction', ({ resetForm })=>resetForm);
413
+ // need to discriminate if the publish is coming from a relation modal or in the edit view
414
+ const relationContext = useRelationModal('PublishAction', ()=>true, false);
415
+ const fromRelationModal = relationContext != undefined;
416
+ const dispatch = useRelationModal('PublishAction', (state)=>state.dispatch);
417
+ const fieldToConnect = useRelationModal('PublishAction', (state)=>state.state.fieldToConnect, false);
418
+ const fieldToConnectUID = useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
419
+ const documentHistory = useRelationModal('PublishAction', (state)=>state.state.documentHistory, false);
420
+ const rootDocumentMeta = useRelationModal('PublishAction', (state)=>state.rootDocumentMeta);
421
+ const { currentDocumentMeta } = useDocumentContext('PublishAction');
422
+ const [updateDocumentMutation] = useUpdateDocumentMutation();
423
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
424
+ const idToPublish = currentDocumentMeta.documentId || id;
379
425
  React.useEffect(()=>{
380
426
  if (isErrorDraftRelations) {
381
427
  toggleNotification({
@@ -439,7 +485,7 @@ const transformData = (data)=>{
439
485
  collectionType,
440
486
  model,
441
487
  documentId,
442
- params
488
+ params: currentDocumentMeta.params
443
489
  });
444
490
  if (error) {
445
491
  throw error;
@@ -456,8 +502,18 @@ const transformData = (data)=>{
456
502
  countDraftRelations,
457
503
  collectionType,
458
504
  model,
459
- params
505
+ currentDocumentMeta.params
460
506
  ]);
507
+ const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
508
+ const parentDocumentData = useDocument({
509
+ documentId: parentDocumentMetaToUpdate?.documentId,
510
+ model: parentDocumentMetaToUpdate?.model,
511
+ collectionType: parentDocumentMetaToUpdate?.collectionType,
512
+ params: parentDocumentMetaToUpdate?.params
513
+ }, {
514
+ skip: !parentDocumentMetaToUpdate
515
+ });
516
+ const { getInitialFormValues } = useDoc();
461
517
  const isDocumentPublished = (document?.[PUBLISHED_AT_ATTRIBUTE_NAME] || meta?.availableStatus.some((doc)=>doc[PUBLISHED_AT_ATTRIBUTE_NAME] !== null)) && document?.status !== 'modified';
462
518
  if (!schema?.options?.draftAndPublish) {
463
519
  return null;
@@ -478,21 +534,72 @@ const transformData = (data)=>{
478
534
  });
479
535
  return;
480
536
  }
481
- const isPublishingRelation = rootDocumentMeta.documentId !== currentDocumentMeta.documentId;
482
537
  const res = await publish({
483
538
  collectionType,
484
539
  model,
485
540
  documentId,
486
- params: isPublishingRelation ? currentDocumentMeta.params : params
541
+ params: currentDocumentMeta.params
487
542
  }, transformData(formValues));
543
+ // Reset form if successful
544
+ if ('data' in res) {
545
+ resetForm();
546
+ }
488
547
  if ('data' in res && collectionType !== SINGLE_TYPES) {
489
548
  /**
490
549
  * TODO: refactor the router so we can just do `../${res.data.documentId}` instead of this.
491
- */ if (id === 'create') {
550
+ */ if (idToPublish === 'create' && !fromRelationModal) {
492
551
  navigate({
493
552
  pathname: `../${collectionType}/${model}/${res.data.documentId}`,
494
553
  search: rawQuery
495
554
  });
555
+ } else if (fromRelationModal) {
556
+ const newRelation = {
557
+ documentId: res.data.documentId,
558
+ collectionType,
559
+ model,
560
+ params: currentDocumentMeta.params
561
+ };
562
+ /*
563
+ * Update, if needed, the parent relation with the newly published document.
564
+ * Check if in history we have the parent relation otherwise use the
565
+ * rootDocument
566
+ */ if (fieldToConnect && documentHistory && (parentDocumentMetaToUpdate.documentId || parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES)) {
567
+ const parentDataToUpdate = parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES ? getInitialFormValues() : parentDocumentData.getInitialFormValues();
568
+ const metaDocumentToUpdate = documentHistory.at(-2) ?? rootDocumentMeta;
569
+ const dataToUpdate = connectRelationToParent(parentDataToUpdate, fieldToConnect, res.data, fieldToConnectUID);
570
+ try {
571
+ const updateRes = await updateDocumentMutation({
572
+ collectionType: metaDocumentToUpdate.collectionType,
573
+ model: metaDocumentToUpdate.model,
574
+ documentId: metaDocumentToUpdate.collectionType !== SINGLE_TYPES ? metaDocumentToUpdate.documentId : undefined,
575
+ params: metaDocumentToUpdate.params,
576
+ data: dataToUpdate
577
+ });
578
+ if ('error' in updateRes) {
579
+ toggleNotification({
580
+ type: 'danger',
581
+ message: formatAPIError(updateRes.error)
582
+ });
583
+ return;
584
+ }
585
+ } catch (err) {
586
+ toggleNotification({
587
+ type: 'danger',
588
+ message: formatMessage({
589
+ id: 'notification.error',
590
+ defaultMessage: 'An error occurred'
591
+ })
592
+ });
593
+ throw err;
594
+ }
595
+ }
596
+ dispatch({
597
+ type: 'GO_TO_CREATED_RELATION',
598
+ payload: {
599
+ document: newRelation,
600
+ shouldBypassConfirmation: true
601
+ }
602
+ });
496
603
  }
497
604
  } else if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
498
605
  setErrors(formatValidationErrors(res.error));
@@ -558,27 +665,44 @@ PublishAction.position = [
558
665
  'preview',
559
666
  'relation-modal'
560
667
  ];
561
- const UpdateAction = ({ activeTab, documentId, model, collectionType, onPreview, fromPreview = false, fromRelationModal = false })=>{
668
+ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
562
669
  const navigate = useNavigate();
563
670
  const { toggleNotification } = useNotification();
564
671
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
565
672
  const cloneMatch = useMatch(CLONE_PATH);
566
673
  const isCloning = cloneMatch !== null;
567
674
  const { formatMessage } = useIntl();
568
- const { create, update, clone, isLoading } = useDocumentActions(fromPreview, fromRelationModal);
569
- const [{ query, rawQuery }] = useQueryParams();
570
- const params = React.useMemo(()=>buildValidParams(query), [
571
- query
572
- ]);
675
+ const { create, update, clone, isLoading } = useDocumentActions();
676
+ const [{ rawQuery }] = useQueryParams();
677
+ const onPreview = usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
678
+ const { getInitialFormValues } = useDoc();
573
679
  const isSubmitting = useForm('UpdateAction', ({ isSubmitting })=>isSubmitting);
574
680
  const modified = useForm('UpdateAction', ({ modified })=>modified);
575
681
  const setSubmitting = useForm('UpdateAction', ({ setSubmitting })=>setSubmitting);
576
682
  const document = useForm('UpdateAction', ({ values })=>values);
577
683
  const validate = useForm('UpdateAction', (state)=>state.validate);
578
684
  const setErrors = useForm('UpdateAction', (state)=>state.setErrors);
579
- const resetForm = useForm('PublishAction', ({ resetForm })=>resetForm);
580
- const rootDocumentMeta = useDocumentContext('UpdateAction', (state)=>state.rootDocumentMeta);
581
- const currentDocumentMeta = useDocumentContext('UpdateAction', (state)=>state.meta);
685
+ const resetForm = useForm('UpdateAction', ({ resetForm })=>resetForm);
686
+ const dispatch = useRelationModal('UpdateAction', (state)=>state.dispatch);
687
+ // need to discriminate if the update is coming from a relation modal or in the edit view
688
+ const relationContext = useRelationModal('UpdateAction', ()=>true, false);
689
+ const fieldToConnect = useRelationModal('UpdateAction', (state)=>state.state.fieldToConnect, false);
690
+ const fieldToConnectUID = useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
691
+ const documentHistory = useRelationModal('UpdateAction', (state)=>state.state.documentHistory, false);
692
+ const rootDocumentMeta = useRelationModal('UpdateAction', (state)=>state.rootDocumentMeta);
693
+ const fromRelationModal = relationContext != undefined;
694
+ const { currentDocumentMeta } = useDocumentContext('UpdateAction');
695
+ const [updateDocumentMutation] = useUpdateDocumentMutation();
696
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
697
+ const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
698
+ const parentDocumentData = useDocument({
699
+ documentId: parentDocumentMetaToUpdate?.documentId,
700
+ model: parentDocumentMetaToUpdate?.model,
701
+ collectionType: parentDocumentMetaToUpdate?.collectionType,
702
+ params: parentDocumentMetaToUpdate?.params
703
+ }, {
704
+ skip: !parentDocumentMetaToUpdate
705
+ });
582
706
  const handleUpdate = React.useCallback(async ()=>{
583
707
  setSubmitting(true);
584
708
  try {
@@ -602,7 +726,7 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType, onPreview,
602
726
  const res = await clone({
603
727
  model,
604
728
  documentId: cloneMatch.params.origin,
605
- params
729
+ params: currentDocumentMeta.params
606
730
  }, transformData(document));
607
731
  if ('data' in res) {
608
732
  navigate({
@@ -615,12 +739,11 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType, onPreview,
615
739
  setErrors(formatValidationErrors(res.error));
616
740
  }
617
741
  } else if (documentId || collectionType === SINGLE_TYPES) {
618
- const isEditingRelation = rootDocumentMeta.documentId !== currentDocumentMeta.documentId;
619
742
  const res = await update({
620
743
  collectionType,
621
744
  model,
622
745
  documentId,
623
- params: isEditingRelation ? currentDocumentMeta.params : params
746
+ params: currentDocumentMeta.params
624
747
  }, transformData(document));
625
748
  if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
626
749
  setErrors(formatValidationErrors(res.error));
@@ -630,16 +753,67 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType, onPreview,
630
753
  } else {
631
754
  const res = await create({
632
755
  model,
633
- params
756
+ params: currentDocumentMeta.params
634
757
  }, transformData(document));
635
758
  if ('data' in res && collectionType !== SINGLE_TYPES) {
636
- navigate({
637
- pathname: `../${res.data.documentId}`,
638
- search: rawQuery
639
- }, {
640
- replace: true,
641
- relative: 'path'
642
- });
759
+ if (fromRelationModal) {
760
+ const createdRelation = {
761
+ documentId: res.data.documentId,
762
+ collectionType,
763
+ model,
764
+ params: currentDocumentMeta.params
765
+ };
766
+ /*
767
+ * Update, if needed, the parent relation with the newly published document.
768
+ * Check if in history we have the parent relation otherwise use the
769
+ * rootDocument
770
+ */ if (fieldToConnect && documentHistory && (parentDocumentMetaToUpdate.documentId || parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES)) {
771
+ const parentDataToUpdate = parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES ? getInitialFormValues() : parentDocumentData.getInitialFormValues();
772
+ const dataToUpdate = connectRelationToParent(parentDataToUpdate, fieldToConnect, res.data, fieldToConnectUID);
773
+ try {
774
+ const updateRes = await updateDocumentMutation({
775
+ collectionType: parentDocumentMetaToUpdate.collectionType,
776
+ model: parentDocumentMetaToUpdate.model,
777
+ documentId: parentDocumentMetaToUpdate.collectionType !== SINGLE_TYPES ? parentDocumentMetaToUpdate.documentId : undefined,
778
+ params: parentDocumentMetaToUpdate.params,
779
+ data: {
780
+ ...dataToUpdate
781
+ }
782
+ });
783
+ if ('error' in updateRes) {
784
+ toggleNotification({
785
+ type: 'danger',
786
+ message: formatAPIError(updateRes.error)
787
+ });
788
+ return;
789
+ }
790
+ } catch (err) {
791
+ toggleNotification({
792
+ type: 'danger',
793
+ message: formatMessage({
794
+ id: 'notification.error',
795
+ defaultMessage: 'An error occurred'
796
+ })
797
+ });
798
+ throw err;
799
+ }
800
+ }
801
+ dispatch({
802
+ type: 'GO_TO_CREATED_RELATION',
803
+ payload: {
804
+ document: createdRelation,
805
+ shouldBypassConfirmation: true
806
+ }
807
+ });
808
+ } else {
809
+ navigate({
810
+ pathname: `../${res.data.documentId}`,
811
+ search: rawQuery
812
+ }, {
813
+ replace: true,
814
+ relative: 'path'
815
+ });
816
+ }
643
817
  } else if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
644
818
  setErrors(formatValidationErrors(res.error));
645
819
  }
@@ -651,30 +825,37 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType, onPreview,
651
825
  }
652
826
  }
653
827
  }, [
828
+ setSubmitting,
829
+ modified,
830
+ validate,
831
+ isCloning,
832
+ documentId,
833
+ collectionType,
834
+ toggleNotification,
835
+ formatMessage,
654
836
  clone,
837
+ model,
655
838
  cloneMatch?.params.origin,
656
- collectionType,
657
- create,
658
- currentDocumentMeta.documentId,
659
839
  currentDocumentMeta.params,
660
840
  document,
661
- documentId,
662
- formatMessage,
663
- formatValidationErrors,
664
- isCloning,
665
- model,
666
- modified,
667
841
  navigate,
668
- onPreview,
669
- params,
670
842
  rawQuery,
671
- resetForm,
672
- rootDocumentMeta.documentId,
673
843
  setErrors,
674
- setSubmitting,
675
- toggleNotification,
844
+ formatValidationErrors,
676
845
  update,
677
- validate
846
+ resetForm,
847
+ create,
848
+ fromRelationModal,
849
+ fieldToConnect,
850
+ documentHistory,
851
+ parentDocumentMetaToUpdate,
852
+ dispatch,
853
+ getInitialFormValues,
854
+ parentDocumentData,
855
+ fieldToConnectUID,
856
+ updateDocumentMutation,
857
+ formatAPIError,
858
+ onPreview
678
859
  ]);
679
860
  // Auto-save on CMD+S or CMD+Enter on macOS, and CTRL+S or CTRL+Enter on Windows/Linux
680
861
  React.useEffect(()=>{