@strapi/content-manager 0.0.0-experimental.e9303c99ae3c28b4b8421ab6971efae0748dd599 → 0.0.0-experimental.ea4dae06eba4c664d83b262ac7ba524f09357453

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 (194) hide show
  1. package/dist/admin/components/ConfigurationForm/Fields.js +300 -204
  2. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.mjs +304 -209
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/components/LeftMenu.js +34 -30
  6. package/dist/admin/components/LeftMenu.js.map +1 -1
  7. package/dist/admin/components/LeftMenu.mjs +36 -32
  8. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  9. package/dist/admin/history/components/VersionContent.js +24 -3
  10. package/dist/admin/history/components/VersionContent.js.map +1 -1
  11. package/dist/admin/history/components/VersionContent.mjs +25 -4
  12. package/dist/admin/history/components/VersionContent.mjs.map +1 -1
  13. package/dist/admin/history/components/VersionHeader.js +6 -0
  14. package/dist/admin/history/components/VersionHeader.js.map +1 -1
  15. package/dist/admin/history/components/VersionHeader.mjs +7 -1
  16. package/dist/admin/history/components/VersionHeader.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocumentActions.js +12 -4
  18. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  19. package/dist/admin/hooks/useDocumentActions.mjs +12 -4
  20. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  21. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  22. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -1
  23. package/dist/admin/index.js +1 -3
  24. package/dist/admin/index.js.map +1 -1
  25. package/dist/admin/pages/EditView/EditViewPage.js +92 -75
  26. package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
  27. package/dist/admin/pages/EditView/EditViewPage.mjs +93 -76
  28. package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
  29. package/dist/admin/pages/EditView/components/DocumentActions.js +263 -75
  30. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  31. package/dist/admin/pages/EditView/components/DocumentActions.mjs +266 -78
  32. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +12 -15
  34. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +12 -15
  36. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js +54 -14
  38. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs +55 -15
  40. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js +21 -35
  42. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs +21 -35
  44. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +12 -1
  46. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +13 -2
  48. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +15 -2
  50. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +16 -3
  52. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +18 -5
  54. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +20 -7
  56. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +128 -55
  58. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +128 -55
  60. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +120 -32
  62. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +124 -36
  64. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/UID.js +4 -2
  66. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +4 -2
  68. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js +1 -1
  70. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs +1 -1
  72. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  73. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js +86 -118
  74. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.js.map +1 -1
  75. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs +86 -118
  76. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/WysiwygNav.mjs.map +1 -1
  77. package/dist/admin/pages/EditView/components/FormLayout.js +47 -27
  78. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  79. package/dist/admin/pages/EditView/components/FormLayout.mjs +47 -27
  80. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  81. package/dist/admin/pages/EditView/utils/data.js +103 -0
  82. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  83. package/dist/admin/pages/EditView/utils/data.mjs +103 -1
  84. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  85. package/dist/admin/pages/ListView/ListViewPage.js +77 -0
  86. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  87. package/dist/admin/pages/ListView/ListViewPage.mjs +78 -1
  88. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  89. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js +2 -1
  90. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  91. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs +2 -1
  92. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  93. package/dist/admin/pages/ListView/components/Filters.js +1 -0
  94. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  95. package/dist/admin/pages/ListView/components/Filters.mjs +1 -0
  96. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  97. package/dist/admin/pages/ListView/components/TableActions.js +13 -3
  98. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  99. package/dist/admin/pages/ListView/components/TableActions.mjs +13 -3
  100. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  101. package/dist/admin/services/documents.js +2 -2
  102. package/dist/admin/services/documents.js.map +1 -1
  103. package/dist/admin/services/documents.mjs +2 -2
  104. package/dist/admin/services/documents.mjs.map +1 -1
  105. package/dist/admin/services/homepage.js +8 -4
  106. package/dist/admin/services/homepage.js.map +1 -1
  107. package/dist/admin/services/homepage.mjs +8 -4
  108. package/dist/admin/services/homepage.mjs.map +1 -1
  109. package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +6 -4
  110. package/dist/admin/src/hooks/useDocumentActions.d.ts +1 -0
  111. package/dist/admin/src/hooks/useDocumentContext.d.ts +1 -1
  112. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +26 -5
  113. package/dist/admin/src/pages/EditView/components/FormInputs/UID.d.ts +1 -0
  114. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +7 -8
  115. package/dist/admin/src/pages/EditView/utils/data.d.ts +19 -1
  116. package/dist/admin/src/services/documents.d.ts +7 -1
  117. package/dist/admin/src/utils/validation.d.ts +1 -0
  118. package/dist/admin/translations/en.json.js +3 -1
  119. package/dist/admin/translations/en.json.js.map +1 -1
  120. package/dist/admin/translations/en.json.mjs +3 -1
  121. package/dist/admin/translations/en.json.mjs.map +1 -1
  122. package/dist/admin/translations/fr.json.js +6 -1
  123. package/dist/admin/translations/fr.json.js.map +1 -1
  124. package/dist/admin/translations/fr.json.mjs +6 -1
  125. package/dist/admin/translations/fr.json.mjs.map +1 -1
  126. package/dist/admin/translations/ru.json.js +235 -226
  127. package/dist/admin/translations/ru.json.js.map +1 -1
  128. package/dist/admin/translations/ru.json.mjs +230 -226
  129. package/dist/admin/translations/ru.json.mjs.map +1 -1
  130. package/dist/admin/utils/validation.js +17 -6
  131. package/dist/admin/utils/validation.js.map +1 -1
  132. package/dist/admin/utils/validation.mjs +17 -6
  133. package/dist/admin/utils/validation.mjs.map +1 -1
  134. package/dist/server/controllers/content-types.js +11 -1
  135. package/dist/server/controllers/content-types.js.map +1 -1
  136. package/dist/server/controllers/content-types.mjs +11 -1
  137. package/dist/server/controllers/content-types.mjs.map +1 -1
  138. package/dist/server/controllers/relations.js +2 -2
  139. package/dist/server/controllers/relations.js.map +1 -1
  140. package/dist/server/controllers/relations.mjs +2 -2
  141. package/dist/server/controllers/relations.mjs.map +1 -1
  142. package/dist/server/controllers/validation/index.js +14 -2
  143. package/dist/server/controllers/validation/index.js.map +1 -1
  144. package/dist/server/controllers/validation/index.mjs +14 -2
  145. package/dist/server/controllers/validation/index.mjs.map +1 -1
  146. package/dist/server/history/services/lifecycles.js +3 -0
  147. package/dist/server/history/services/lifecycles.js.map +1 -1
  148. package/dist/server/history/services/lifecycles.mjs +3 -0
  149. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  150. package/dist/server/services/data-mapper.js +4 -1
  151. package/dist/server/services/data-mapper.js.map +1 -1
  152. package/dist/server/services/data-mapper.mjs +4 -1
  153. package/dist/server/services/data-mapper.mjs.map +1 -1
  154. package/dist/server/services/document-manager.js +8 -1
  155. package/dist/server/services/document-manager.js.map +1 -1
  156. package/dist/server/services/document-manager.mjs +8 -1
  157. package/dist/server/services/document-manager.mjs.map +1 -1
  158. package/dist/server/services/document-metadata.js +3 -1
  159. package/dist/server/services/document-metadata.js.map +1 -1
  160. package/dist/server/services/document-metadata.mjs +3 -1
  161. package/dist/server/services/document-metadata.mjs.map +1 -1
  162. package/dist/server/services/utils/configuration/attributes.js +1 -1
  163. package/dist/server/services/utils/configuration/attributes.js.map +1 -1
  164. package/dist/server/services/utils/configuration/attributes.mjs +1 -1
  165. package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
  166. package/dist/server/services/utils/configuration/layouts.js +1 -1
  167. package/dist/server/services/utils/configuration/layouts.js.map +1 -1
  168. package/dist/server/services/utils/configuration/layouts.mjs +1 -1
  169. package/dist/server/services/utils/configuration/layouts.mjs.map +1 -1
  170. package/dist/server/services/utils/configuration/metadatas.js +8 -0
  171. package/dist/server/services/utils/configuration/metadatas.js.map +1 -1
  172. package/dist/server/services/utils/configuration/metadatas.mjs +8 -0
  173. package/dist/server/services/utils/configuration/metadatas.mjs.map +1 -1
  174. package/dist/server/services/utils/populate.js +11 -0
  175. package/dist/server/services/utils/populate.js.map +1 -1
  176. package/dist/server/services/utils/populate.mjs +11 -0
  177. package/dist/server/services/utils/populate.mjs.map +1 -1
  178. package/dist/server/src/controllers/content-types.d.ts.map +1 -1
  179. package/dist/server/src/controllers/validation/index.d.ts +6 -1
  180. package/dist/server/src/controllers/validation/index.d.ts.map +1 -1
  181. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  182. package/dist/server/src/index.d.ts +1 -0
  183. package/dist/server/src/index.d.ts.map +1 -1
  184. package/dist/server/src/services/data-mapper.d.ts +1 -0
  185. package/dist/server/src/services/data-mapper.d.ts.map +1 -1
  186. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  187. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  188. package/dist/server/src/services/index.d.ts +1 -0
  189. package/dist/server/src/services/index.d.ts.map +1 -1
  190. package/dist/server/src/services/utils/configuration/metadatas.d.ts.map +1 -1
  191. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  192. package/dist/shared/contracts/collection-types.d.ts +0 -1
  193. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  194. package/package.json +11 -8
@@ -1,24 +1,60 @@
1
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, Button, VisuallyHidden, Dialog, Modal, Typography, Radio } from '@strapi/design-system';
4
+ import { Flex, Button, Menu, 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
- import { styled } from 'styled-components';
10
12
  import { PUBLISHED_AT_ATTRIBUTE_NAME } from '../../../constants/attributes.mjs';
11
13
  import { SINGLE_TYPES } from '../../../constants/collections.mjs';
12
14
  import { useDocumentRBAC } from '../../../features/DocumentRBAC.mjs';
13
- import { useDoc } from '../../../hooks/useDocument.mjs';
15
+ import { useDocument, useDoc } from '../../../hooks/useDocument.mjs';
14
16
  import { useDocumentActions } from '../../../hooks/useDocumentActions.mjs';
15
17
  import { useDocumentContext } from '../../../hooks/useDocumentContext.mjs';
16
18
  import { usePreviewContext } from '../../../preview/pages/Preview.mjs';
17
19
  import { LIST_PATH, CLONE_PATH } from '../../../router.mjs';
18
- import { useGetDraftRelationCountQuery as useLazyGetDraftRelationCountQuery } from '../../../services/documents.mjs';
20
+ import { useGetDraftRelationCountQuery as useLazyGetDraftRelationCountQuery, useUpdateDocumentMutation } from '../../../services/documents.mjs';
19
21
  import { isBaseQueryError, buildValidParams } from '../../../utils/api.mjs';
20
22
  import { getTranslation } from '../../../utils/translations.mjs';
23
+ import { handleInvisibleAttributes } from '../utils/data.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)=>{
@@ -117,11 +153,6 @@ const DocumentActionButton = (action)=>{
117
153
  ]
118
154
  });
119
155
  };
120
- const MenuItem = styled(Menu.Item)`
121
- &:hover {
122
- background: ${({ theme, isVariantDanger, isDisabled })=>isVariantDanger && !isDisabled ? theme.colors.danger100 : 'neutral'};
123
- }
124
- `;
125
156
  const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })=>{
126
157
  const [isOpen, setIsOpen] = React.useState(false);
127
158
  const [dialogId, setDialogId] = React.useState(null);
@@ -183,27 +214,19 @@ const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })
183
214
  popoverPlacement: "bottom-end",
184
215
  children: [
185
216
  actions.map((action)=>{
186
- return /*#__PURE__*/ jsx(MenuItem, {
217
+ return /*#__PURE__*/ jsx(Menu.Item, {
187
218
  disabled: action.disabled,
188
219
  /* @ts-expect-error – TODO: this is an error in the DS where it is most likely a synthetic event, not regular. */ onSelect: handleClick(action),
189
220
  display: "block",
190
- isVariantDanger: action.variant === 'danger',
191
- isDisabled: action.disabled,
221
+ variant: action.variant === 'danger' ? action.variant : 'default',
222
+ startIcon: action.icon,
192
223
  children: /*#__PURE__*/ jsx(Flex, {
193
224
  justifyContent: "space-between",
194
225
  gap: 4,
195
- children: /*#__PURE__*/ jsxs(Flex, {
196
- color: !action.disabled ? convertActionVariantToColor(action.variant) : 'inherit',
226
+ children: /*#__PURE__*/ jsx(Flex, {
197
227
  gap: 2,
198
228
  tag: "span",
199
- children: [
200
- /*#__PURE__*/ jsx(Flex, {
201
- tag: "span",
202
- color: !action.disabled ? convertActionVariantToIconColor(action.variant) : 'inherit',
203
- children: action.icon
204
- }),
205
- action.label
206
- ]
229
+ children: action.label
207
230
  })
208
231
  })
209
232
  }, action.id);
@@ -231,30 +254,6 @@ const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })
231
254
  ]
232
255
  });
233
256
  };
234
- const convertActionVariantToColor = (variant = 'secondary')=>{
235
- switch(variant){
236
- case 'danger':
237
- return 'danger600';
238
- case 'secondary':
239
- return undefined;
240
- case 'success':
241
- return 'success600';
242
- default:
243
- return 'primary600';
244
- }
245
- };
246
- const convertActionVariantToIconColor = (variant = 'secondary')=>{
247
- switch(variant){
248
- case 'danger':
249
- return 'danger600';
250
- case 'secondary':
251
- return 'neutral500';
252
- case 'success':
253
- return 'success600';
254
- default:
255
- return 'primary600';
256
- }
257
- };
258
257
  const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, content, isOpen, variant = 'secondary', loading })=>{
259
258
  const { formatMessage } = useIntl();
260
259
  const handleClose = async ()=>{
@@ -360,7 +359,10 @@ const transformData = (data)=>{
360
359
  const isCloning = useMatch(CLONE_PATH) !== null;
361
360
  const { id } = useParams();
362
361
  const { formatMessage } = useIntl();
363
- const canPublish = useDocumentRBAC('PublishAction', ({ canPublish })=>canPublish);
362
+ const { canPublish, canReadFields } = useDocumentRBAC('PublishAction', ({ canPublish, canReadFields })=>({
363
+ canPublish,
364
+ canReadFields
365
+ }));
364
366
  const { publish, isLoading } = useDocumentActions();
365
367
  const onPreview = usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
366
368
  const [countDraftRelations, { isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }] = useLazyGetDraftRelationCountQuery();
@@ -374,7 +376,18 @@ const transformData = (data)=>{
374
376
  const setErrors = useForm('PublishAction', (state)=>state.setErrors);
375
377
  const formValues = useForm('PublishAction', ({ values })=>values);
376
378
  const resetForm = useForm('PublishAction', ({ resetForm })=>resetForm);
379
+ const { currentDocument: { components } } = useDocumentContext('PublishAction');
380
+ // need to discriminate if the publish is coming from a relation modal or in the edit view
381
+ const relationContext = useRelationModal('PublishAction', ()=>true, false);
382
+ const fromRelationModal = relationContext != undefined;
383
+ const dispatch = useRelationModal('PublishAction', (state)=>state.dispatch);
384
+ const fieldToConnect = useRelationModal('PublishAction', (state)=>state.state.fieldToConnect, false);
385
+ const fieldToConnectUID = useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
386
+ const documentHistory = useRelationModal('PublishAction', (state)=>state.state.documentHistory, false);
387
+ const rootDocumentMeta = useRelationModal('PublishAction', (state)=>state.rootDocumentMeta);
377
388
  const { currentDocumentMeta } = useDocumentContext('PublishAction');
389
+ const [updateDocumentMutation] = useUpdateDocumentMutation();
390
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
378
391
  const idToPublish = currentDocumentMeta.documentId || id;
379
392
  React.useEffect(()=>{
380
393
  if (isErrorDraftRelations) {
@@ -458,6 +471,16 @@ const transformData = (data)=>{
458
471
  model,
459
472
  currentDocumentMeta.params
460
473
  ]);
474
+ const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
475
+ const parentDocumentData = useDocument({
476
+ documentId: parentDocumentMetaToUpdate?.documentId,
477
+ model: parentDocumentMetaToUpdate?.model,
478
+ collectionType: parentDocumentMetaToUpdate?.collectionType,
479
+ params: parentDocumentMetaToUpdate?.params
480
+ }, {
481
+ skip: !parentDocumentMetaToUpdate
482
+ });
483
+ const { getInitialFormValues } = useDoc();
461
484
  const isDocumentPublished = (document?.[PUBLISHED_AT_ATTRIBUTE_NAME] || meta?.availableStatus.some((doc)=>doc[PUBLISHED_AT_ATTRIBUTE_NAME] !== null)) && document?.status !== 'modified';
462
485
  if (!schema?.options?.draftAndPublish) {
463
486
  return null;
@@ -469,21 +492,39 @@ const transformData = (data)=>{
469
492
  status: 'published'
470
493
  });
471
494
  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
- })
495
+ const hasUnreadableRequiredField = Object.keys(schema.attributes).some((fieldName)=>{
496
+ const attribute = schema.attributes[fieldName];
497
+ return attribute?.required && !(canReadFields ?? []).includes(fieldName);
478
498
  });
499
+ if (hasUnreadableRequiredField) {
500
+ toggleNotification({
501
+ type: 'danger',
502
+ message: formatMessage({
503
+ id: 'content-manager.validation.error.unreadable-required-field',
504
+ defaultMessage: 'Your current permissions prevent access to certain required fields. Please request access from an administrator to proceed.'
505
+ })
506
+ });
507
+ } else {
508
+ toggleNotification({
509
+ type: 'danger',
510
+ message: formatMessage({
511
+ id: 'content-manager.validation.error',
512
+ defaultMessage: 'There are validation errors in your document. Please fix them before saving.'
513
+ })
514
+ });
515
+ }
479
516
  return;
480
517
  }
518
+ const { data } = handleInvisibleAttributes(transformData(formValues), {
519
+ schema,
520
+ components
521
+ });
481
522
  const res = await publish({
482
523
  collectionType,
483
524
  model,
484
525
  documentId,
485
526
  params: currentDocumentMeta.params
486
- }, transformData(formValues));
527
+ }, data);
487
528
  // Reset form if successful
488
529
  if ('data' in res) {
489
530
  resetForm();
@@ -491,11 +532,59 @@ const transformData = (data)=>{
491
532
  if ('data' in res && collectionType !== SINGLE_TYPES) {
492
533
  /**
493
534
  * TODO: refactor the router so we can just do `../${res.data.documentId}` instead of this.
494
- */ if (idToPublish === 'create') {
535
+ */ if (idToPublish === 'create' && !fromRelationModal) {
495
536
  navigate({
496
537
  pathname: `../${collectionType}/${model}/${res.data.documentId}`,
497
538
  search: rawQuery
498
539
  });
540
+ } else if (fromRelationModal) {
541
+ const newRelation = {
542
+ documentId: res.data.documentId,
543
+ collectionType,
544
+ model,
545
+ params: currentDocumentMeta.params
546
+ };
547
+ /*
548
+ * Update, if needed, the parent relation with the newly published document.
549
+ * Check if in history we have the parent relation otherwise use the
550
+ * rootDocument
551
+ */ if (fieldToConnect && documentHistory && (parentDocumentMetaToUpdate.documentId || parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES)) {
552
+ const parentDataToUpdate = parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES ? getInitialFormValues() : parentDocumentData.getInitialFormValues();
553
+ const metaDocumentToUpdate = documentHistory.at(-2) ?? rootDocumentMeta;
554
+ const dataToUpdate = connectRelationToParent(parentDataToUpdate, fieldToConnect, res.data, fieldToConnectUID);
555
+ try {
556
+ const updateRes = await updateDocumentMutation({
557
+ collectionType: metaDocumentToUpdate.collectionType,
558
+ model: metaDocumentToUpdate.model,
559
+ documentId: metaDocumentToUpdate.collectionType !== SINGLE_TYPES ? metaDocumentToUpdate.documentId : undefined,
560
+ params: metaDocumentToUpdate.params,
561
+ data: dataToUpdate
562
+ });
563
+ if ('error' in updateRes) {
564
+ toggleNotification({
565
+ type: 'danger',
566
+ message: formatAPIError(updateRes.error)
567
+ });
568
+ return;
569
+ }
570
+ } catch (err) {
571
+ toggleNotification({
572
+ type: 'danger',
573
+ message: formatMessage({
574
+ id: 'notification.error',
575
+ defaultMessage: 'An error occurred'
576
+ })
577
+ });
578
+ throw err;
579
+ }
580
+ }
581
+ dispatch({
582
+ type: 'GO_TO_CREATED_RELATION',
583
+ payload: {
584
+ document: newRelation,
585
+ shouldBypassConfirmation: true
586
+ }
587
+ });
499
588
  }
500
589
  } else if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
501
590
  setErrors(formatValidationErrors(res.error));
@@ -569,16 +658,40 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
569
658
  const isCloning = cloneMatch !== null;
570
659
  const { formatMessage } = useIntl();
571
660
  const { create, update, clone, isLoading } = useDocumentActions();
661
+ const { currentDocument: { components } } = useDocumentContext('UpdateAction');
572
662
  const [{ rawQuery }] = useQueryParams();
573
663
  const onPreview = usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
664
+ const { getInitialFormValues } = useDoc();
574
665
  const isSubmitting = useForm('UpdateAction', ({ isSubmitting })=>isSubmitting);
575
666
  const modified = useForm('UpdateAction', ({ modified })=>modified);
576
667
  const setSubmitting = useForm('UpdateAction', ({ setSubmitting })=>setSubmitting);
668
+ const initialValues = useForm('UpdateAction', ({ initialValues })=>initialValues);
577
669
  const document = useForm('UpdateAction', ({ values })=>values);
578
670
  const validate = useForm('UpdateAction', (state)=>state.validate);
579
671
  const setErrors = useForm('UpdateAction', (state)=>state.setErrors);
580
- const resetForm = useForm('PublishAction', ({ resetForm })=>resetForm);
672
+ const resetForm = useForm('UpdateAction', ({ resetForm })=>resetForm);
673
+ const dispatch = useRelationModal('UpdateAction', (state)=>state.dispatch);
674
+ // need to discriminate if the update is coming from a relation modal or in the edit view
675
+ const relationContext = useRelationModal('UpdateAction', ()=>true, false);
676
+ const relationalModalSchema = useRelationModal('UpdateAction', (state)=>state.currentDocument.schema, false);
677
+ const fieldToConnect = useRelationModal('UpdateAction', (state)=>state.state.fieldToConnect, false);
678
+ const fieldToConnectUID = useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
679
+ const documentHistory = useRelationModal('UpdateAction', (state)=>state.state.documentHistory, false);
680
+ const rootDocumentMeta = useRelationModal('UpdateAction', (state)=>state.rootDocumentMeta);
681
+ const fromRelationModal = relationContext != undefined;
581
682
  const { currentDocumentMeta } = useDocumentContext('UpdateAction');
683
+ const [updateDocumentMutation] = useUpdateDocumentMutation();
684
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
685
+ const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
686
+ const parentDocumentData = useDocument({
687
+ documentId: parentDocumentMetaToUpdate?.documentId,
688
+ model: parentDocumentMetaToUpdate?.model,
689
+ collectionType: parentDocumentMetaToUpdate?.collectionType,
690
+ params: parentDocumentMetaToUpdate?.params
691
+ }, {
692
+ skip: !parentDocumentMetaToUpdate
693
+ });
694
+ const { schema } = useDoc();
582
695
  const handleUpdate = React.useCallback(async ()=>{
583
696
  setSubmitting(true);
584
697
  try {
@@ -615,30 +728,91 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
615
728
  setErrors(formatValidationErrors(res.error));
616
729
  }
617
730
  } else if (documentId || collectionType === SINGLE_TYPES) {
731
+ const { data } = handleInvisibleAttributes(transformData(document), {
732
+ schema: fromRelationModal ? relationalModalSchema : schema,
733
+ initialValues,
734
+ components
735
+ });
618
736
  const res = await update({
619
737
  collectionType,
620
738
  model,
621
739
  documentId,
622
740
  params: currentDocumentMeta.params
623
- }, transformData(document));
741
+ }, data);
624
742
  if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
625
743
  setErrors(formatValidationErrors(res.error));
626
744
  } else {
627
745
  resetForm();
628
746
  }
629
747
  } else {
748
+ const { data } = handleInvisibleAttributes(transformData(document), {
749
+ schema: fromRelationModal ? relationalModalSchema : schema,
750
+ initialValues,
751
+ components
752
+ });
630
753
  const res = await create({
631
754
  model,
632
755
  params: currentDocumentMeta.params
633
- }, transformData(document));
756
+ }, data);
634
757
  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
- });
758
+ if (fromRelationModal) {
759
+ const createdRelation = {
760
+ documentId: res.data.documentId,
761
+ collectionType,
762
+ model,
763
+ params: currentDocumentMeta.params
764
+ };
765
+ /*
766
+ * Update, if needed, the parent relation with the newly published document.
767
+ * Check if in history we have the parent relation otherwise use the
768
+ * rootDocument
769
+ */ if (fieldToConnect && documentHistory && (parentDocumentMetaToUpdate.documentId || parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES)) {
770
+ const parentDataToUpdate = parentDocumentMetaToUpdate.collectionType === SINGLE_TYPES ? getInitialFormValues() : parentDocumentData.getInitialFormValues();
771
+ const dataToUpdate = connectRelationToParent(parentDataToUpdate, fieldToConnect, res.data, fieldToConnectUID);
772
+ try {
773
+ const updateRes = await updateDocumentMutation({
774
+ collectionType: parentDocumentMetaToUpdate.collectionType,
775
+ model: parentDocumentMetaToUpdate.model,
776
+ documentId: parentDocumentMetaToUpdate.collectionType !== SINGLE_TYPES ? parentDocumentMetaToUpdate.documentId : undefined,
777
+ params: parentDocumentMetaToUpdate.params,
778
+ data: {
779
+ ...dataToUpdate
780
+ }
781
+ });
782
+ if ('error' in updateRes) {
783
+ toggleNotification({
784
+ type: 'danger',
785
+ message: formatAPIError(updateRes.error)
786
+ });
787
+ return;
788
+ }
789
+ } catch (err) {
790
+ toggleNotification({
791
+ type: 'danger',
792
+ message: formatMessage({
793
+ id: 'notification.error',
794
+ defaultMessage: 'An error occurred'
795
+ })
796
+ });
797
+ throw err;
798
+ }
799
+ }
800
+ dispatch({
801
+ type: 'GO_TO_CREATED_RELATION',
802
+ payload: {
803
+ document: createdRelation,
804
+ shouldBypassConfirmation: true
805
+ }
806
+ });
807
+ } else {
808
+ navigate({
809
+ pathname: `../${res.data.documentId}`,
810
+ search: rawQuery
811
+ }, {
812
+ replace: true,
813
+ relative: 'path'
814
+ });
815
+ }
642
816
  } else if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
643
817
  setErrors(formatValidationErrors(res.error));
644
818
  }
@@ -650,27 +824,41 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
650
824
  }
651
825
  }
652
826
  }, [
827
+ setSubmitting,
828
+ modified,
829
+ validate,
830
+ isCloning,
831
+ documentId,
832
+ collectionType,
833
+ toggleNotification,
834
+ formatMessage,
653
835
  clone,
836
+ model,
654
837
  cloneMatch?.params.origin,
655
- collectionType,
656
- create,
657
838
  currentDocumentMeta.params,
658
839
  document,
659
- documentId,
660
- formatMessage,
661
- formatValidationErrors,
662
- isCloning,
663
- model,
664
- modified,
665
840
  navigate,
666
841
  rawQuery,
667
- resetForm,
668
842
  setErrors,
669
- setSubmitting,
670
- toggleNotification,
843
+ formatValidationErrors,
671
844
  update,
672
- validate,
673
- onPreview
845
+ resetForm,
846
+ create,
847
+ fromRelationModal,
848
+ fieldToConnect,
849
+ documentHistory,
850
+ parentDocumentMetaToUpdate,
851
+ dispatch,
852
+ getInitialFormValues,
853
+ parentDocumentData,
854
+ fieldToConnectUID,
855
+ updateDocumentMutation,
856
+ formatAPIError,
857
+ onPreview,
858
+ initialValues,
859
+ schema,
860
+ components,
861
+ relationalModalSchema
674
862
  ]);
675
863
  // Auto-save on CMD+S or CMD+Enter on macOS, and CTRL+S or CTRL+Enter on Windows/Linux
676
864
  React.useEffect(()=>{