@strapi/content-manager 0.0.0-next.0791cd2736057a8f66ee1682f02c46307a4d6e4a → 0.0.0-next.0fc44faf3ab6f94c481a4d426988705776878bb3

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 (156) hide show
  1. package/dist/admin/components/LeftMenu.js +34 -30
  2. package/dist/admin/components/LeftMenu.js.map +1 -1
  3. package/dist/admin/components/LeftMenu.mjs +36 -32
  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/hooks/useDocumentActions.js +5 -1
  10. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  11. package/dist/admin/hooks/useDocumentActions.mjs +5 -1
  12. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  13. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  14. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -1
  15. package/dist/admin/index.js +42 -5
  16. package/dist/admin/index.js.map +1 -1
  17. package/dist/admin/index.mjs +42 -3
  18. package/dist/admin/index.mjs.map +1 -1
  19. package/dist/admin/pages/EditView/components/DocumentActions.js +230 -28
  20. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  21. package/dist/admin/pages/EditView/components/DocumentActions.mjs +232 -30
  22. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +7 -12
  24. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +8 -13
  26. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +19 -33
  28. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +19 -33
  30. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +46 -95
  32. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +48 -78
  34. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +2 -0
  36. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +2 -0
  38. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +128 -55
  40. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +128 -55
  42. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +89 -50
  44. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +91 -52
  46. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js +50 -97
  48. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.js.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs +51 -79
  50. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.mjs.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormLayout.js +3 -3
  52. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormLayout.mjs +3 -3
  54. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  55. package/dist/admin/pages/ListView/ListViewPage.js +77 -0
  56. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  57. package/dist/admin/pages/ListView/ListViewPage.mjs +78 -1
  58. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  59. package/dist/admin/preview/components/PreviewHeader.js +1 -1
  60. package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
  61. package/dist/admin/preview/components/PreviewHeader.mjs +1 -1
  62. package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
  63. package/dist/admin/services/homepage.js +30 -0
  64. package/dist/admin/services/homepage.js.map +1 -0
  65. package/dist/admin/services/homepage.mjs +28 -0
  66. package/dist/admin/services/homepage.mjs.map +1 -0
  67. package/dist/admin/src/components/Widgets.d.ts +3 -0
  68. package/dist/admin/src/hooks/useDocumentContext.d.ts +1 -1
  69. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.d.ts +2 -2
  70. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +26 -5
  71. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +0 -1
  72. package/dist/admin/src/services/homepage.d.ts +5 -0
  73. package/dist/admin/translations/en.json.js +3 -1
  74. package/dist/admin/translations/en.json.js.map +1 -1
  75. package/dist/admin/translations/en.json.mjs +3 -1
  76. package/dist/admin/translations/en.json.mjs.map +1 -1
  77. package/dist/admin/translations/ru.json.js +235 -226
  78. package/dist/admin/translations/ru.json.js.map +1 -1
  79. package/dist/admin/translations/ru.json.mjs +230 -226
  80. package/dist/admin/translations/ru.json.mjs.map +1 -1
  81. package/dist/server/controllers/index.js +3 -1
  82. package/dist/server/controllers/index.js.map +1 -1
  83. package/dist/server/controllers/index.mjs +3 -1
  84. package/dist/server/controllers/index.mjs.map +1 -1
  85. package/dist/server/history/services/lifecycles.js +3 -0
  86. package/dist/server/history/services/lifecycles.js.map +1 -1
  87. package/dist/server/history/services/lifecycles.mjs +3 -0
  88. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  89. package/dist/server/homepage/controllers/homepage.js +57 -0
  90. package/dist/server/homepage/controllers/homepage.js.map +1 -0
  91. package/dist/server/homepage/controllers/homepage.mjs +36 -0
  92. package/dist/server/homepage/controllers/homepage.mjs.map +1 -0
  93. package/dist/server/homepage/controllers/index.js +10 -0
  94. package/dist/server/homepage/controllers/index.js.map +1 -0
  95. package/dist/server/homepage/controllers/index.mjs +8 -0
  96. package/dist/server/homepage/controllers/index.mjs.map +1 -0
  97. package/dist/server/homepage/index.js +14 -0
  98. package/dist/server/homepage/index.js.map +1 -0
  99. package/dist/server/homepage/index.mjs +12 -0
  100. package/dist/server/homepage/index.mjs.map +1 -0
  101. package/dist/server/homepage/routes/homepage.js +25 -0
  102. package/dist/server/homepage/routes/homepage.js.map +1 -0
  103. package/dist/server/homepage/routes/homepage.mjs +23 -0
  104. package/dist/server/homepage/routes/homepage.mjs.map +1 -0
  105. package/dist/server/homepage/routes/index.js +13 -0
  106. package/dist/server/homepage/routes/index.js.map +1 -0
  107. package/dist/server/homepage/routes/index.mjs +11 -0
  108. package/dist/server/homepage/routes/index.mjs.map +1 -0
  109. package/dist/server/homepage/services/homepage.js +157 -0
  110. package/dist/server/homepage/services/homepage.js.map +1 -0
  111. package/dist/server/homepage/services/homepage.mjs +155 -0
  112. package/dist/server/homepage/services/homepage.mjs.map +1 -0
  113. package/dist/server/homepage/services/index.js +10 -0
  114. package/dist/server/homepage/services/index.js.map +1 -0
  115. package/dist/server/homepage/services/index.mjs +8 -0
  116. package/dist/server/homepage/services/index.mjs.map +1 -0
  117. package/dist/server/preview/services/preview.js +0 -1
  118. package/dist/server/preview/services/preview.js.map +1 -1
  119. package/dist/server/preview/services/preview.mjs +0 -1
  120. package/dist/server/preview/services/preview.mjs.map +1 -1
  121. package/dist/server/routes/index.js +3 -1
  122. package/dist/server/routes/index.js.map +1 -1
  123. package/dist/server/routes/index.mjs +3 -1
  124. package/dist/server/routes/index.mjs.map +1 -1
  125. package/dist/server/services/index.js +3 -1
  126. package/dist/server/services/index.js.map +1 -1
  127. package/dist/server/services/index.mjs +3 -1
  128. package/dist/server/services/index.mjs.map +1 -1
  129. package/dist/server/src/controllers/index.d.ts.map +1 -1
  130. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  131. package/dist/server/src/homepage/controllers/homepage.d.ts +7 -0
  132. package/dist/server/src/homepage/controllers/homepage.d.ts.map +1 -0
  133. package/dist/server/src/homepage/controllers/index.d.ts +2 -0
  134. package/dist/server/src/homepage/controllers/index.d.ts.map +1 -0
  135. package/dist/server/src/homepage/index.d.ts +16 -0
  136. package/dist/server/src/homepage/index.d.ts.map +1 -0
  137. package/dist/server/src/homepage/routes/homepage.d.ts +4 -0
  138. package/dist/server/src/homepage/routes/homepage.d.ts.map +1 -0
  139. package/dist/server/src/homepage/routes/index.d.ts +8 -0
  140. package/dist/server/src/homepage/routes/index.d.ts.map +1 -0
  141. package/dist/server/src/homepage/services/homepage.d.ts +11 -0
  142. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -0
  143. package/dist/server/src/homepage/services/index.d.ts +9 -0
  144. package/dist/server/src/homepage/services/index.d.ts.map +1 -0
  145. package/dist/server/src/index.d.ts +8 -0
  146. package/dist/server/src/index.d.ts.map +1 -1
  147. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  148. package/dist/server/src/routes/index.d.ts +1 -0
  149. package/dist/server/src/routes/index.d.ts.map +1 -1
  150. package/dist/server/src/services/data-mapper.d.ts +1 -0
  151. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  152. package/dist/server/src/services/index.d.ts +7 -0
  153. package/dist/server/src/services/index.d.ts.map +1 -1
  154. package/dist/shared/contracts/homepage.d.ts +25 -0
  155. package/dist/shared/contracts/homepage.d.ts.map +1 -0
  156. package/package.json +7 -7
@@ -4,21 +4,57 @@ import { useNotification, useAPIErrorHandler, useQueryParams, useForm } from '@s
4
4
  import { Menu, Flex, Button, VisuallyHidden, Dialog, Modal, Typography, Radio } from '@strapi/design-system';
5
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
15
  import { useDocumentRBAC } from '../../../features/DocumentRBAC.mjs';
13
- import { useDoc } from '../../../hooks/useDocument.mjs';
16
+ import { useDocument, useDoc } from '../../../hooks/useDocument.mjs';
14
17
  import { useDocumentActions } from '../../../hooks/useDocumentActions.mjs';
15
18
  import { useDocumentContext } from '../../../hooks/useDocumentContext.mjs';
16
19
  import { usePreviewContext } from '../../../preview/pages/Preview.mjs';
17
20
  import { LIST_PATH, CLONE_PATH } from '../../../router.mjs';
18
- import { useGetDraftRelationCountQuery as useLazyGetDraftRelationCountQuery } from '../../../services/documents.mjs';
21
+ import { useGetDraftRelationCountQuery as useLazyGetDraftRelationCountQuery, useUpdateDocumentMutation } from '../../../services/documents.mjs';
19
22
  import { isBaseQueryError, buildValidParams } from '../../../utils/api.mjs';
20
23
  import { getTranslation } from '../../../utils/translations.mjs';
24
+ import { useRelationModal } from './FormInputs/Relations/RelationModal.mjs';
21
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
+ };
22
58
  const DocumentActions = ({ actions })=>{
23
59
  const { formatMessage } = useIntl();
24
60
  const [primaryAction, secondaryAction, ...restActions] = actions.filter((action)=>{
@@ -360,7 +396,10 @@ const transformData = (data)=>{
360
396
  const isCloning = useMatch(CLONE_PATH) !== null;
361
397
  const { id } = useParams();
362
398
  const { formatMessage } = useIntl();
363
- const canPublish = useDocumentRBAC('PublishAction', ({ canPublish })=>canPublish);
399
+ const { canPublish, canReadFields } = useDocumentRBAC('PublishAction', ({ canPublish, canReadFields })=>({
400
+ canPublish,
401
+ canReadFields
402
+ }));
364
403
  const { publish, isLoading } = useDocumentActions();
365
404
  const onPreview = usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
366
405
  const [countDraftRelations, { isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }] = useLazyGetDraftRelationCountQuery();
@@ -374,7 +413,17 @@ const transformData = (data)=>{
374
413
  const setErrors = useForm('PublishAction', (state)=>state.setErrors);
375
414
  const formValues = useForm('PublishAction', ({ values })=>values);
376
415
  const resetForm = useForm('PublishAction', ({ resetForm })=>resetForm);
416
+ // need to discriminate if the publish is coming from a relation modal or in the edit view
417
+ const relationContext = useRelationModal('PublishAction', ()=>true, false);
418
+ const fromRelationModal = relationContext != undefined;
419
+ const dispatch = useRelationModal('PublishAction', (state)=>state.dispatch);
420
+ const fieldToConnect = useRelationModal('PublishAction', (state)=>state.state.fieldToConnect, false);
421
+ const fieldToConnectUID = useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
422
+ const documentHistory = useRelationModal('PublishAction', (state)=>state.state.documentHistory, false);
423
+ const rootDocumentMeta = useRelationModal('PublishAction', (state)=>state.rootDocumentMeta);
377
424
  const { currentDocumentMeta } = useDocumentContext('PublishAction');
425
+ const [updateDocumentMutation] = useUpdateDocumentMutation();
426
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
378
427
  const idToPublish = currentDocumentMeta.documentId || id;
379
428
  React.useEffect(()=>{
380
429
  if (isErrorDraftRelations) {
@@ -458,6 +507,16 @@ const transformData = (data)=>{
458
507
  model,
459
508
  currentDocumentMeta.params
460
509
  ]);
510
+ const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
511
+ const parentDocumentData = useDocument({
512
+ documentId: parentDocumentMetaToUpdate?.documentId,
513
+ model: parentDocumentMetaToUpdate?.model,
514
+ collectionType: parentDocumentMetaToUpdate?.collectionType,
515
+ params: parentDocumentMetaToUpdate?.params
516
+ }, {
517
+ skip: !parentDocumentMetaToUpdate
518
+ });
519
+ const { getInitialFormValues } = useDoc();
461
520
  const isDocumentPublished = (document?.[PUBLISHED_AT_ATTRIBUTE_NAME] || meta?.availableStatus.some((doc)=>doc[PUBLISHED_AT_ATTRIBUTE_NAME] !== null)) && document?.status !== 'modified';
462
521
  if (!schema?.options?.draftAndPublish) {
463
522
  return null;
@@ -469,13 +528,27 @@ const transformData = (data)=>{
469
528
  status: 'published'
470
529
  });
471
530
  if (errors) {
472
- toggleNotification({
473
- type: 'danger',
474
- message: formatMessage({
475
- id: 'content-manager.validation.error',
476
- defaultMessage: 'There are validation errors in your document. Please fix them before saving.'
477
- })
531
+ const hasUnreadableRequiredField = Object.keys(schema.attributes).some((fieldName)=>{
532
+ const attribute = schema.attributes[fieldName];
533
+ return attribute?.required && !(canReadFields ?? []).includes(fieldName);
478
534
  });
535
+ if (hasUnreadableRequiredField) {
536
+ toggleNotification({
537
+ type: 'danger',
538
+ message: formatMessage({
539
+ id: 'content-manager.validation.error.unreadable-required-field',
540
+ defaultMessage: 'Your current permissions prevent access to certain required fields. Please request access from an administrator to proceed.'
541
+ })
542
+ });
543
+ } else {
544
+ toggleNotification({
545
+ type: 'danger',
546
+ message: formatMessage({
547
+ id: 'content-manager.validation.error',
548
+ defaultMessage: 'There are validation errors in your document. Please fix them before saving.'
549
+ })
550
+ });
551
+ }
479
552
  return;
480
553
  }
481
554
  const res = await publish({
@@ -491,11 +564,59 @@ const transformData = (data)=>{
491
564
  if ('data' in res && collectionType !== SINGLE_TYPES) {
492
565
  /**
493
566
  * TODO: refactor the router so we can just do `../${res.data.documentId}` instead of this.
494
- */ if (idToPublish === 'create') {
567
+ */ if (idToPublish === 'create' && !fromRelationModal) {
495
568
  navigate({
496
569
  pathname: `../${collectionType}/${model}/${res.data.documentId}`,
497
570
  search: rawQuery
498
571
  });
572
+ } else if (fromRelationModal) {
573
+ const newRelation = {
574
+ documentId: res.data.documentId,
575
+ collectionType,
576
+ model,
577
+ params: currentDocumentMeta.params
578
+ };
579
+ /*
580
+ * Update, if needed, the parent relation with the newly published document.
581
+ * Check if in history we have the parent relation otherwise use the
582
+ * rootDocument
583
+ */ if (fieldToConnect && documentHistory && (parentDocumentMetaToUpdate.documentId || parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES)) {
584
+ const parentDataToUpdate = parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES ? getInitialFormValues() : parentDocumentData.getInitialFormValues();
585
+ const metaDocumentToUpdate = documentHistory.at(-2) ?? rootDocumentMeta;
586
+ const dataToUpdate = connectRelationToParent(parentDataToUpdate, fieldToConnect, res.data, fieldToConnectUID);
587
+ try {
588
+ const updateRes = await updateDocumentMutation({
589
+ collectionType: metaDocumentToUpdate.collectionType,
590
+ model: metaDocumentToUpdate.model,
591
+ documentId: metaDocumentToUpdate.collectionType !== SINGLE_TYPES ? metaDocumentToUpdate.documentId : undefined,
592
+ params: metaDocumentToUpdate.params,
593
+ data: dataToUpdate
594
+ });
595
+ if ('error' in updateRes) {
596
+ toggleNotification({
597
+ type: 'danger',
598
+ message: formatAPIError(updateRes.error)
599
+ });
600
+ return;
601
+ }
602
+ } catch (err) {
603
+ toggleNotification({
604
+ type: 'danger',
605
+ message: formatMessage({
606
+ id: 'notification.error',
607
+ defaultMessage: 'An error occurred'
608
+ })
609
+ });
610
+ throw err;
611
+ }
612
+ }
613
+ dispatch({
614
+ type: 'GO_TO_CREATED_RELATION',
615
+ payload: {
616
+ document: newRelation,
617
+ shouldBypassConfirmation: true
618
+ }
619
+ });
499
620
  }
500
621
  } else if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
501
622
  setErrors(formatValidationErrors(res.error));
@@ -571,14 +692,34 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
571
692
  const { create, update, clone, isLoading } = useDocumentActions();
572
693
  const [{ rawQuery }] = useQueryParams();
573
694
  const onPreview = usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
695
+ const { getInitialFormValues } = useDoc();
574
696
  const isSubmitting = useForm('UpdateAction', ({ isSubmitting })=>isSubmitting);
575
697
  const modified = useForm('UpdateAction', ({ modified })=>modified);
576
698
  const setSubmitting = useForm('UpdateAction', ({ setSubmitting })=>setSubmitting);
577
699
  const document = useForm('UpdateAction', ({ values })=>values);
578
700
  const validate = useForm('UpdateAction', (state)=>state.validate);
579
701
  const setErrors = useForm('UpdateAction', (state)=>state.setErrors);
580
- const resetForm = useForm('PublishAction', ({ resetForm })=>resetForm);
702
+ const resetForm = useForm('UpdateAction', ({ resetForm })=>resetForm);
703
+ const dispatch = useRelationModal('UpdateAction', (state)=>state.dispatch);
704
+ // need to discriminate if the update is coming from a relation modal or in the edit view
705
+ const relationContext = useRelationModal('UpdateAction', ()=>true, false);
706
+ const fieldToConnect = useRelationModal('UpdateAction', (state)=>state.state.fieldToConnect, false);
707
+ const fieldToConnectUID = useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
708
+ const documentHistory = useRelationModal('UpdateAction', (state)=>state.state.documentHistory, false);
709
+ const rootDocumentMeta = useRelationModal('UpdateAction', (state)=>state.rootDocumentMeta);
710
+ const fromRelationModal = relationContext != undefined;
581
711
  const { currentDocumentMeta } = useDocumentContext('UpdateAction');
712
+ const [updateDocumentMutation] = useUpdateDocumentMutation();
713
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
714
+ const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
715
+ const parentDocumentData = useDocument({
716
+ documentId: parentDocumentMetaToUpdate?.documentId,
717
+ model: parentDocumentMetaToUpdate?.model,
718
+ collectionType: parentDocumentMetaToUpdate?.collectionType,
719
+ params: parentDocumentMetaToUpdate?.params
720
+ }, {
721
+ skip: !parentDocumentMetaToUpdate
722
+ });
582
723
  const handleUpdate = React.useCallback(async ()=>{
583
724
  setSubmitting(true);
584
725
  try {
@@ -632,13 +773,64 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
632
773
  params: currentDocumentMeta.params
633
774
  }, transformData(document));
634
775
  if ('data' in res && collectionType !== SINGLE_TYPES) {
635
- navigate({
636
- pathname: `../${res.data.documentId}`,
637
- search: rawQuery
638
- }, {
639
- replace: true,
640
- relative: 'path'
641
- });
776
+ if (fromRelationModal) {
777
+ const createdRelation = {
778
+ documentId: res.data.documentId,
779
+ collectionType,
780
+ model,
781
+ params: currentDocumentMeta.params
782
+ };
783
+ /*
784
+ * Update, if needed, the parent relation with the newly published document.
785
+ * Check if in history we have the parent relation otherwise use the
786
+ * rootDocument
787
+ */ if (fieldToConnect && documentHistory && (parentDocumentMetaToUpdate.documentId || parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES)) {
788
+ const parentDataToUpdate = parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES ? getInitialFormValues() : parentDocumentData.getInitialFormValues();
789
+ const dataToUpdate = connectRelationToParent(parentDataToUpdate, fieldToConnect, res.data, fieldToConnectUID);
790
+ try {
791
+ const updateRes = await updateDocumentMutation({
792
+ collectionType: parentDocumentMetaToUpdate.collectionType,
793
+ model: parentDocumentMetaToUpdate.model,
794
+ documentId: parentDocumentMetaToUpdate.collectionType !== SINGLE_TYPES ? parentDocumentMetaToUpdate.documentId : undefined,
795
+ params: parentDocumentMetaToUpdate.params,
796
+ data: {
797
+ ...dataToUpdate
798
+ }
799
+ });
800
+ if ('error' in updateRes) {
801
+ toggleNotification({
802
+ type: 'danger',
803
+ message: formatAPIError(updateRes.error)
804
+ });
805
+ return;
806
+ }
807
+ } catch (err) {
808
+ toggleNotification({
809
+ type: 'danger',
810
+ message: formatMessage({
811
+ id: 'notification.error',
812
+ defaultMessage: 'An error occurred'
813
+ })
814
+ });
815
+ throw err;
816
+ }
817
+ }
818
+ dispatch({
819
+ type: 'GO_TO_CREATED_RELATION',
820
+ payload: {
821
+ document: createdRelation,
822
+ shouldBypassConfirmation: true
823
+ }
824
+ });
825
+ } else {
826
+ navigate({
827
+ pathname: `../${res.data.documentId}`,
828
+ search: rawQuery
829
+ }, {
830
+ replace: true,
831
+ relative: 'path'
832
+ });
833
+ }
642
834
  } else if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
643
835
  setErrors(formatValidationErrors(res.error));
644
836
  }
@@ -650,26 +842,36 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
650
842
  }
651
843
  }
652
844
  }, [
845
+ setSubmitting,
846
+ modified,
847
+ validate,
848
+ isCloning,
849
+ documentId,
850
+ collectionType,
851
+ toggleNotification,
852
+ formatMessage,
653
853
  clone,
854
+ model,
654
855
  cloneMatch?.params.origin,
655
- collectionType,
656
- create,
657
856
  currentDocumentMeta.params,
658
857
  document,
659
- documentId,
660
- formatMessage,
661
- formatValidationErrors,
662
- isCloning,
663
- model,
664
- modified,
665
858
  navigate,
666
859
  rawQuery,
667
- resetForm,
668
860
  setErrors,
669
- setSubmitting,
670
- toggleNotification,
861
+ formatValidationErrors,
671
862
  update,
672
- validate,
863
+ resetForm,
864
+ create,
865
+ fromRelationModal,
866
+ fieldToConnect,
867
+ documentHistory,
868
+ parentDocumentMetaToUpdate,
869
+ dispatch,
870
+ getInitialFormValues,
871
+ parentDocumentData,
872
+ fieldToConnectUID,
873
+ updateDocumentMutation,
874
+ formatAPIError,
673
875
  onPreview
674
876
  ]);
675
877
  // Auto-save on CMD+S or CMD+Enter on macOS, and CTRL+S or CTRL+Enter on Windows/Linux