@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
@@ -6,9 +6,11 @@ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
6
  var designSystem = require('@strapi/design-system');
7
7
  var Icons = require('@strapi/icons');
8
8
  var mapValues = require('lodash/fp/mapValues');
9
+ var get = require('lodash/get');
10
+ var merge = require('lodash/merge');
11
+ var set = require('lodash/set');
9
12
  var reactIntl = require('react-intl');
10
13
  var reactRouterDom = require('react-router-dom');
11
- var styledComponents = require('styled-components');
12
14
  var attributes = require('../../../constants/attributes.js');
13
15
  var collections = require('../../../constants/collections.js');
14
16
  var DocumentRBAC = require('../../../features/DocumentRBAC.js');
@@ -20,6 +22,8 @@ var router = require('../../../router.js');
20
22
  var documents = require('../../../services/documents.js');
21
23
  var api = require('../../../utils/api.js');
22
24
  var translations = require('../../../utils/translations.js');
25
+ var data = require('../utils/data.js');
26
+ var RelationModal = require('./FormInputs/Relations/RelationModal.js');
23
27
 
24
28
  function _interopNamespaceDefault(e) {
25
29
  var n = Object.create(null);
@@ -40,6 +44,38 @@ function _interopNamespaceDefault(e) {
40
44
 
41
45
  var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
42
46
 
47
+ const connectRelationToParent = (parentDataToUpdate, fieldToConnect, data, fieldToConnectUID)=>{
48
+ /*
49
+ * Check if the fieldToConnect is already present in the parentDataToUpdate.
50
+ * This happens in particular when in the parentDocument you have created
51
+ * a new component without saving.
52
+ */ const isFieldPresent = !!get(parentDataToUpdate, fieldToConnect);
53
+ const fieldToConnectPath = isFieldPresent ? fieldToConnect : fieldToConnect.split('.').slice(0, -1).join('.');
54
+ const fieldToConnectValue = isFieldPresent ? {
55
+ connect: [
56
+ {
57
+ id: data.documentId,
58
+ documentId: data.documentId,
59
+ locale: data.locale
60
+ }
61
+ ]
62
+ } : {
63
+ [fieldToConnect.split('.').pop()]: {
64
+ connect: [
65
+ {
66
+ id: data.documentId,
67
+ documentId: data.documentId,
68
+ locale: data.locale
69
+ }
70
+ ],
71
+ disconnect: []
72
+ },
73
+ // In case the object was not present you need to pass the componentUID of the parent document
74
+ __component: fieldToConnectUID
75
+ };
76
+ const objectToConnect = set({}, fieldToConnectPath, fieldToConnectValue);
77
+ return merge(parentDataToUpdate, objectToConnect);
78
+ };
43
79
  const DocumentActions = ({ actions })=>{
44
80
  const { formatMessage } = reactIntl.useIntl();
45
81
  const [primaryAction, secondaryAction, ...restActions] = actions.filter((action)=>{
@@ -138,11 +174,6 @@ const DocumentActionButton = (action)=>{
138
174
  ]
139
175
  });
140
176
  };
141
- const MenuItem = styledComponents.styled(designSystem.Menu.Item)`
142
- &:hover {
143
- background: ${({ theme, isVariantDanger, isDisabled })=>isVariantDanger && !isDisabled ? theme.colors.danger100 : 'neutral'};
144
- }
145
- `;
146
177
  const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })=>{
147
178
  const [isOpen, setIsOpen] = React__namespace.useState(false);
148
179
  const [dialogId, setDialogId] = React__namespace.useState(null);
@@ -204,27 +235,19 @@ const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })
204
235
  popoverPlacement: "bottom-end",
205
236
  children: [
206
237
  actions.map((action)=>{
207
- return /*#__PURE__*/ jsxRuntime.jsx(MenuItem, {
238
+ return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Menu.Item, {
208
239
  disabled: action.disabled,
209
240
  /* @ts-expect-error – TODO: this is an error in the DS where it is most likely a synthetic event, not regular. */ onSelect: handleClick(action),
210
241
  display: "block",
211
- isVariantDanger: action.variant === 'danger',
212
- isDisabled: action.disabled,
242
+ variant: action.variant === 'danger' ? action.variant : 'default',
243
+ startIcon: action.icon,
213
244
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
214
245
  justifyContent: "space-between",
215
246
  gap: 4,
216
- children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
217
- color: !action.disabled ? convertActionVariantToColor(action.variant) : 'inherit',
247
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
218
248
  gap: 2,
219
249
  tag: "span",
220
- children: [
221
- /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
222
- tag: "span",
223
- color: !action.disabled ? convertActionVariantToIconColor(action.variant) : 'inherit',
224
- children: action.icon
225
- }),
226
- action.label
227
- ]
250
+ children: action.label
228
251
  })
229
252
  })
230
253
  }, action.id);
@@ -252,30 +275,6 @@ const DocumentActionsMenu = ({ actions, children, label, variant = 'tertiary' })
252
275
  ]
253
276
  });
254
277
  };
255
- const convertActionVariantToColor = (variant = 'secondary')=>{
256
- switch(variant){
257
- case 'danger':
258
- return 'danger600';
259
- case 'secondary':
260
- return undefined;
261
- case 'success':
262
- return 'success600';
263
- default:
264
- return 'primary600';
265
- }
266
- };
267
- const convertActionVariantToIconColor = (variant = 'secondary')=>{
268
- switch(variant){
269
- case 'danger':
270
- return 'danger600';
271
- case 'secondary':
272
- return 'neutral500';
273
- case 'success':
274
- return 'success600';
275
- default:
276
- return 'primary600';
277
- }
278
- };
279
278
  const DocumentActionConfirmDialog = ({ onClose, onCancel, onConfirm, title, content, isOpen, variant = 'secondary', loading })=>{
280
279
  const { formatMessage } = reactIntl.useIntl();
281
280
  const handleClose = async ()=>{
@@ -381,7 +380,10 @@ const transformData = (data)=>{
381
380
  const isCloning = reactRouterDom.useMatch(router.CLONE_PATH) !== null;
382
381
  const { id } = reactRouterDom.useParams();
383
382
  const { formatMessage } = reactIntl.useIntl();
384
- const canPublish = DocumentRBAC.useDocumentRBAC('PublishAction', ({ canPublish })=>canPublish);
383
+ const { canPublish, canReadFields } = DocumentRBAC.useDocumentRBAC('PublishAction', ({ canPublish, canReadFields })=>({
384
+ canPublish,
385
+ canReadFields
386
+ }));
385
387
  const { publish, isLoading } = useDocumentActions.useDocumentActions();
386
388
  const onPreview = Preview.usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
387
389
  const [countDraftRelations, { isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }] = documents.useGetDraftRelationCountQuery();
@@ -395,7 +397,18 @@ const transformData = (data)=>{
395
397
  const setErrors = strapiAdmin.useForm('PublishAction', (state)=>state.setErrors);
396
398
  const formValues = strapiAdmin.useForm('PublishAction', ({ values })=>values);
397
399
  const resetForm = strapiAdmin.useForm('PublishAction', ({ resetForm })=>resetForm);
400
+ const { currentDocument: { components } } = useDocumentContext.useDocumentContext('PublishAction');
401
+ // need to discriminate if the publish is coming from a relation modal or in the edit view
402
+ const relationContext = RelationModal.useRelationModal('PublishAction', ()=>true, false);
403
+ const fromRelationModal = relationContext != undefined;
404
+ const dispatch = RelationModal.useRelationModal('PublishAction', (state)=>state.dispatch);
405
+ const fieldToConnect = RelationModal.useRelationModal('PublishAction', (state)=>state.state.fieldToConnect, false);
406
+ const fieldToConnectUID = RelationModal.useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
407
+ const documentHistory = RelationModal.useRelationModal('PublishAction', (state)=>state.state.documentHistory, false);
408
+ const rootDocumentMeta = RelationModal.useRelationModal('PublishAction', (state)=>state.rootDocumentMeta);
398
409
  const { currentDocumentMeta } = useDocumentContext.useDocumentContext('PublishAction');
410
+ const [updateDocumentMutation] = documents.useUpdateDocumentMutation();
411
+ const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
399
412
  const idToPublish = currentDocumentMeta.documentId || id;
400
413
  React__namespace.useEffect(()=>{
401
414
  if (isErrorDraftRelations) {
@@ -479,6 +492,16 @@ const transformData = (data)=>{
479
492
  model,
480
493
  currentDocumentMeta.params
481
494
  ]);
495
+ const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
496
+ const parentDocumentData = useDocument.useDocument({
497
+ documentId: parentDocumentMetaToUpdate?.documentId,
498
+ model: parentDocumentMetaToUpdate?.model,
499
+ collectionType: parentDocumentMetaToUpdate?.collectionType,
500
+ params: parentDocumentMetaToUpdate?.params
501
+ }, {
502
+ skip: !parentDocumentMetaToUpdate
503
+ });
504
+ const { getInitialFormValues } = useDocument.useDoc();
482
505
  const isDocumentPublished = (document?.[attributes.PUBLISHED_AT_ATTRIBUTE_NAME] || meta?.availableStatus.some((doc)=>doc[attributes.PUBLISHED_AT_ATTRIBUTE_NAME] !== null)) && document?.status !== 'modified';
483
506
  if (!schema?.options?.draftAndPublish) {
484
507
  return null;
@@ -490,21 +513,39 @@ const transformData = (data)=>{
490
513
  status: 'published'
491
514
  });
492
515
  if (errors) {
493
- toggleNotification({
494
- type: 'danger',
495
- message: formatMessage({
496
- id: 'content-manager.validation.error',
497
- defaultMessage: 'There are validation errors in your document. Please fix them before saving.'
498
- })
516
+ const hasUnreadableRequiredField = Object.keys(schema.attributes).some((fieldName)=>{
517
+ const attribute = schema.attributes[fieldName];
518
+ return attribute?.required && !(canReadFields ?? []).includes(fieldName);
499
519
  });
520
+ if (hasUnreadableRequiredField) {
521
+ toggleNotification({
522
+ type: 'danger',
523
+ message: formatMessage({
524
+ id: 'content-manager.validation.error.unreadable-required-field',
525
+ defaultMessage: 'Your current permissions prevent access to certain required fields. Please request access from an administrator to proceed.'
526
+ })
527
+ });
528
+ } else {
529
+ toggleNotification({
530
+ type: 'danger',
531
+ message: formatMessage({
532
+ id: 'content-manager.validation.error',
533
+ defaultMessage: 'There are validation errors in your document. Please fix them before saving.'
534
+ })
535
+ });
536
+ }
500
537
  return;
501
538
  }
539
+ const { data: data$1 } = data.handleInvisibleAttributes(transformData(formValues), {
540
+ schema,
541
+ components
542
+ });
502
543
  const res = await publish({
503
544
  collectionType,
504
545
  model,
505
546
  documentId,
506
547
  params: currentDocumentMeta.params
507
- }, transformData(formValues));
548
+ }, data$1);
508
549
  // Reset form if successful
509
550
  if ('data' in res) {
510
551
  resetForm();
@@ -512,11 +553,59 @@ const transformData = (data)=>{
512
553
  if ('data' in res && collectionType !== collections.SINGLE_TYPES) {
513
554
  /**
514
555
  * TODO: refactor the router so we can just do `../${res.data.documentId}` instead of this.
515
- */ if (idToPublish === 'create') {
556
+ */ if (idToPublish === 'create' && !fromRelationModal) {
516
557
  navigate({
517
558
  pathname: `../${collectionType}/${model}/${res.data.documentId}`,
518
559
  search: rawQuery
519
560
  });
561
+ } else if (fromRelationModal) {
562
+ const newRelation = {
563
+ documentId: res.data.documentId,
564
+ collectionType,
565
+ model,
566
+ params: currentDocumentMeta.params
567
+ };
568
+ /*
569
+ * Update, if needed, the parent relation with the newly published document.
570
+ * Check if in history we have the parent relation otherwise use the
571
+ * rootDocument
572
+ */ if (fieldToConnect && documentHistory && (parentDocumentMetaToUpdate.documentId || parentDocumentMetaToUpdate.collectionType === collections.SINGLE_TYPES)) {
573
+ const parentDataToUpdate = parentDocumentMetaToUpdate.collectionType === collections.SINGLE_TYPES ? getInitialFormValues() : parentDocumentData.getInitialFormValues();
574
+ const metaDocumentToUpdate = documentHistory.at(-2) ?? rootDocumentMeta;
575
+ const dataToUpdate = connectRelationToParent(parentDataToUpdate, fieldToConnect, res.data, fieldToConnectUID);
576
+ try {
577
+ const updateRes = await updateDocumentMutation({
578
+ collectionType: metaDocumentToUpdate.collectionType,
579
+ model: metaDocumentToUpdate.model,
580
+ documentId: metaDocumentToUpdate.collectionType !== collections.SINGLE_TYPES ? metaDocumentToUpdate.documentId : undefined,
581
+ params: metaDocumentToUpdate.params,
582
+ data: dataToUpdate
583
+ });
584
+ if ('error' in updateRes) {
585
+ toggleNotification({
586
+ type: 'danger',
587
+ message: formatAPIError(updateRes.error)
588
+ });
589
+ return;
590
+ }
591
+ } catch (err) {
592
+ toggleNotification({
593
+ type: 'danger',
594
+ message: formatMessage({
595
+ id: 'notification.error',
596
+ defaultMessage: 'An error occurred'
597
+ })
598
+ });
599
+ throw err;
600
+ }
601
+ }
602
+ dispatch({
603
+ type: 'GO_TO_CREATED_RELATION',
604
+ payload: {
605
+ document: newRelation,
606
+ shouldBypassConfirmation: true
607
+ }
608
+ });
520
609
  }
521
610
  } else if ('error' in res && api.isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
522
611
  setErrors(formatValidationErrors(res.error));
@@ -590,16 +679,40 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
590
679
  const isCloning = cloneMatch !== null;
591
680
  const { formatMessage } = reactIntl.useIntl();
592
681
  const { create, update, clone, isLoading } = useDocumentActions.useDocumentActions();
682
+ const { currentDocument: { components } } = useDocumentContext.useDocumentContext('UpdateAction');
593
683
  const [{ rawQuery }] = strapiAdmin.useQueryParams();
594
684
  const onPreview = Preview.usePreviewContext('UpdateAction', (state)=>state.onPreview, false);
685
+ const { getInitialFormValues } = useDocument.useDoc();
595
686
  const isSubmitting = strapiAdmin.useForm('UpdateAction', ({ isSubmitting })=>isSubmitting);
596
687
  const modified = strapiAdmin.useForm('UpdateAction', ({ modified })=>modified);
597
688
  const setSubmitting = strapiAdmin.useForm('UpdateAction', ({ setSubmitting })=>setSubmitting);
689
+ const initialValues = strapiAdmin.useForm('UpdateAction', ({ initialValues })=>initialValues);
598
690
  const document = strapiAdmin.useForm('UpdateAction', ({ values })=>values);
599
691
  const validate = strapiAdmin.useForm('UpdateAction', (state)=>state.validate);
600
692
  const setErrors = strapiAdmin.useForm('UpdateAction', (state)=>state.setErrors);
601
- const resetForm = strapiAdmin.useForm('PublishAction', ({ resetForm })=>resetForm);
693
+ const resetForm = strapiAdmin.useForm('UpdateAction', ({ resetForm })=>resetForm);
694
+ const dispatch = RelationModal.useRelationModal('UpdateAction', (state)=>state.dispatch);
695
+ // need to discriminate if the update is coming from a relation modal or in the edit view
696
+ const relationContext = RelationModal.useRelationModal('UpdateAction', ()=>true, false);
697
+ const relationalModalSchema = RelationModal.useRelationModal('UpdateAction', (state)=>state.currentDocument.schema, false);
698
+ const fieldToConnect = RelationModal.useRelationModal('UpdateAction', (state)=>state.state.fieldToConnect, false);
699
+ const fieldToConnectUID = RelationModal.useRelationModal('PublishAction', (state)=>state.state.fieldToConnectUID, false);
700
+ const documentHistory = RelationModal.useRelationModal('UpdateAction', (state)=>state.state.documentHistory, false);
701
+ const rootDocumentMeta = RelationModal.useRelationModal('UpdateAction', (state)=>state.rootDocumentMeta);
702
+ const fromRelationModal = relationContext != undefined;
602
703
  const { currentDocumentMeta } = useDocumentContext.useDocumentContext('UpdateAction');
704
+ const [updateDocumentMutation] = documents.useUpdateDocumentMutation();
705
+ const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
706
+ const parentDocumentMetaToUpdate = documentHistory?.at(-2) ?? rootDocumentMeta;
707
+ const parentDocumentData = useDocument.useDocument({
708
+ documentId: parentDocumentMetaToUpdate?.documentId,
709
+ model: parentDocumentMetaToUpdate?.model,
710
+ collectionType: parentDocumentMetaToUpdate?.collectionType,
711
+ params: parentDocumentMetaToUpdate?.params
712
+ }, {
713
+ skip: !parentDocumentMetaToUpdate
714
+ });
715
+ const { schema } = useDocument.useDoc();
603
716
  const handleUpdate = React__namespace.useCallback(async ()=>{
604
717
  setSubmitting(true);
605
718
  try {
@@ -636,30 +749,91 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
636
749
  setErrors(formatValidationErrors(res.error));
637
750
  }
638
751
  } else if (documentId || collectionType === collections.SINGLE_TYPES) {
752
+ const { data: data$1 } = data.handleInvisibleAttributes(transformData(document), {
753
+ schema: fromRelationModal ? relationalModalSchema : schema,
754
+ initialValues,
755
+ components
756
+ });
639
757
  const res = await update({
640
758
  collectionType,
641
759
  model,
642
760
  documentId,
643
761
  params: currentDocumentMeta.params
644
- }, transformData(document));
762
+ }, data$1);
645
763
  if ('error' in res && api.isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
646
764
  setErrors(formatValidationErrors(res.error));
647
765
  } else {
648
766
  resetForm();
649
767
  }
650
768
  } else {
769
+ const { data: data$1 } = data.handleInvisibleAttributes(transformData(document), {
770
+ schema: fromRelationModal ? relationalModalSchema : schema,
771
+ initialValues,
772
+ components
773
+ });
651
774
  const res = await create({
652
775
  model,
653
776
  params: currentDocumentMeta.params
654
- }, transformData(document));
777
+ }, data$1);
655
778
  if ('data' in res && collectionType !== collections.SINGLE_TYPES) {
656
- navigate({
657
- pathname: `../${res.data.documentId}`,
658
- search: rawQuery
659
- }, {
660
- replace: true,
661
- relative: 'path'
662
- });
779
+ if (fromRelationModal) {
780
+ const createdRelation = {
781
+ documentId: res.data.documentId,
782
+ collectionType,
783
+ model,
784
+ params: currentDocumentMeta.params
785
+ };
786
+ /*
787
+ * Update, if needed, the parent relation with the newly published document.
788
+ * Check if in history we have the parent relation otherwise use the
789
+ * rootDocument
790
+ */ if (fieldToConnect && documentHistory && (parentDocumentMetaToUpdate.documentId || parentDocumentMetaToUpdate.collectionType === collections.SINGLE_TYPES)) {
791
+ const parentDataToUpdate = parentDocumentMetaToUpdate.collectionType === collections.SINGLE_TYPES ? getInitialFormValues() : parentDocumentData.getInitialFormValues();
792
+ const dataToUpdate = connectRelationToParent(parentDataToUpdate, fieldToConnect, res.data, fieldToConnectUID);
793
+ try {
794
+ const updateRes = await updateDocumentMutation({
795
+ collectionType: parentDocumentMetaToUpdate.collectionType,
796
+ model: parentDocumentMetaToUpdate.model,
797
+ documentId: parentDocumentMetaToUpdate.collectionType !== collections.SINGLE_TYPES ? parentDocumentMetaToUpdate.documentId : undefined,
798
+ params: parentDocumentMetaToUpdate.params,
799
+ data: {
800
+ ...dataToUpdate
801
+ }
802
+ });
803
+ if ('error' in updateRes) {
804
+ toggleNotification({
805
+ type: 'danger',
806
+ message: formatAPIError(updateRes.error)
807
+ });
808
+ return;
809
+ }
810
+ } catch (err) {
811
+ toggleNotification({
812
+ type: 'danger',
813
+ message: formatMessage({
814
+ id: 'notification.error',
815
+ defaultMessage: 'An error occurred'
816
+ })
817
+ });
818
+ throw err;
819
+ }
820
+ }
821
+ dispatch({
822
+ type: 'GO_TO_CREATED_RELATION',
823
+ payload: {
824
+ document: createdRelation,
825
+ shouldBypassConfirmation: true
826
+ }
827
+ });
828
+ } else {
829
+ navigate({
830
+ pathname: `../${res.data.documentId}`,
831
+ search: rawQuery
832
+ }, {
833
+ replace: true,
834
+ relative: 'path'
835
+ });
836
+ }
663
837
  } else if ('error' in res && api.isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
664
838
  setErrors(formatValidationErrors(res.error));
665
839
  }
@@ -671,27 +845,41 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
671
845
  }
672
846
  }
673
847
  }, [
848
+ setSubmitting,
849
+ modified,
850
+ validate,
851
+ isCloning,
852
+ documentId,
853
+ collectionType,
854
+ toggleNotification,
855
+ formatMessage,
674
856
  clone,
857
+ model,
675
858
  cloneMatch?.params.origin,
676
- collectionType,
677
- create,
678
859
  currentDocumentMeta.params,
679
860
  document,
680
- documentId,
681
- formatMessage,
682
- formatValidationErrors,
683
- isCloning,
684
- model,
685
- modified,
686
861
  navigate,
687
862
  rawQuery,
688
- resetForm,
689
863
  setErrors,
690
- setSubmitting,
691
- toggleNotification,
864
+ formatValidationErrors,
692
865
  update,
693
- validate,
694
- onPreview
866
+ resetForm,
867
+ create,
868
+ fromRelationModal,
869
+ fieldToConnect,
870
+ documentHistory,
871
+ parentDocumentMetaToUpdate,
872
+ dispatch,
873
+ getInitialFormValues,
874
+ parentDocumentData,
875
+ fieldToConnectUID,
876
+ updateDocumentMutation,
877
+ formatAPIError,
878
+ onPreview,
879
+ initialValues,
880
+ schema,
881
+ components,
882
+ relationalModalSchema
695
883
  ]);
696
884
  // Auto-save on CMD+S or CMD+Enter on macOS, and CTRL+S or CTRL+Enter on Windows/Linux
697
885
  React__namespace.useEffect(()=>{