@strapi/content-manager 0.0.0-experimental.1253cf1413edf12553abf0600cb28a78b02935fb → 0.0.0-experimental.13421055c5da2ac016c435155c449a633d399dea

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 (106) hide show
  1. package/dist/admin/chunks/{ComponentConfigurationPage-Bn-SMKJG.js → ComponentConfigurationPage-DCsX9dT5.js} +5 -6
  2. package/dist/admin/chunks/{ComponentConfigurationPage-Bn-SMKJG.js.map → ComponentConfigurationPage-DCsX9dT5.js.map} +1 -1
  3. package/dist/admin/chunks/{ComponentConfigurationPage-Cqi5KqZa.mjs → ComponentConfigurationPage-jcxWDVZf.mjs} +5 -6
  4. package/dist/admin/chunks/{ComponentConfigurationPage-Cqi5KqZa.mjs.map → ComponentConfigurationPage-jcxWDVZf.mjs.map} +1 -1
  5. package/dist/admin/chunks/{EditConfigurationPage-CRxsqOhS.js → EditConfigurationPage-DPE54bv4.js} +5 -6
  6. package/dist/admin/chunks/{EditConfigurationPage-CRxsqOhS.js.map → EditConfigurationPage-DPE54bv4.js.map} +1 -1
  7. package/dist/admin/chunks/{EditConfigurationPage-Dm16gciL.mjs → EditConfigurationPage-Dqe4n8fp.mjs} +5 -6
  8. package/dist/admin/chunks/{EditConfigurationPage-Dm16gciL.mjs.map → EditConfigurationPage-Dqe4n8fp.mjs.map} +1 -1
  9. package/dist/admin/chunks/{EditViewPage-eTCSh2HB.mjs → EditViewPage-BN-tRpIl.mjs} +98 -94
  10. package/dist/admin/chunks/EditViewPage-BN-tRpIl.mjs.map +1 -0
  11. package/dist/admin/chunks/{EditViewPage-Dk8CeS40.js → EditViewPage-BuXES73t.js} +98 -94
  12. package/dist/admin/chunks/EditViewPage-BuXES73t.js.map +1 -0
  13. package/dist/admin/chunks/{Form-K_hq8zU4.mjs → Form-CgZ8ChAp.mjs} +3 -3
  14. package/dist/admin/chunks/{Form-K_hq8zU4.mjs.map → Form-CgZ8ChAp.mjs.map} +1 -1
  15. package/dist/admin/chunks/{Form-PB1sNax8.js → Form-Y-luFjWf.js} +5 -5
  16. package/dist/admin/chunks/{Form-PB1sNax8.js.map → Form-Y-luFjWf.js.map} +1 -1
  17. package/dist/admin/chunks/{History-CfsF-U-3.js → History-CpOv78Ft.js} +17 -13
  18. package/dist/admin/chunks/History-CpOv78Ft.js.map +1 -0
  19. package/dist/admin/chunks/{History-CD5uVchr.mjs → History-D06b9Z-W.mjs} +16 -12
  20. package/dist/admin/chunks/History-D06b9Z-W.mjs.map +1 -0
  21. package/dist/admin/chunks/{Input-grmHplxs.mjs → Input-DjZiwJwC.mjs} +1108 -47
  22. package/dist/admin/chunks/Input-DjZiwJwC.mjs.map +1 -0
  23. package/dist/admin/chunks/{Input-CU93J6dl.js → Input-_yWeQWev.js} +1121 -57
  24. package/dist/admin/chunks/Input-_yWeQWev.js.map +1 -0
  25. package/dist/admin/chunks/{ListConfigurationPage-Eo8txFp0.mjs → ListConfigurationPage-C9bHjgDI.mjs} +4 -5
  26. package/dist/admin/chunks/{ListConfigurationPage-Eo8txFp0.mjs.map → ListConfigurationPage-C9bHjgDI.mjs.map} +1 -1
  27. package/dist/admin/chunks/{ListConfigurationPage-nZti--Mw.js → ListConfigurationPage-dry2u2na.js} +6 -7
  28. package/dist/admin/chunks/{ListConfigurationPage-nZti--Mw.js.map → ListConfigurationPage-dry2u2na.js.map} +1 -1
  29. package/dist/admin/chunks/{ListViewPage-BBX-zSka.mjs → ListViewPage-CA5MkiUV.mjs} +3 -4
  30. package/dist/admin/chunks/{ListViewPage-BBX-zSka.mjs.map → ListViewPage-CA5MkiUV.mjs.map} +1 -1
  31. package/dist/admin/chunks/{ListViewPage-DQYvHCxn.js → ListViewPage-lg2Rqa6F.js} +7 -8
  32. package/dist/admin/chunks/{ListViewPage-DQYvHCxn.js.map → ListViewPage-lg2Rqa6F.js.map} +1 -1
  33. package/dist/admin/chunks/{NoContentTypePage-C-rbOQO1.mjs → NoContentTypePage-BSrBZBqj.mjs} +2 -2
  34. package/dist/admin/chunks/{NoContentTypePage-C-rbOQO1.mjs.map → NoContentTypePage-BSrBZBqj.mjs.map} +1 -1
  35. package/dist/admin/chunks/{NoContentTypePage-ChYgz3sN.js → NoContentTypePage-FT7uXIGM.js} +2 -2
  36. package/dist/admin/chunks/{NoContentTypePage-ChYgz3sN.js.map → NoContentTypePage-FT7uXIGM.js.map} +1 -1
  37. package/dist/admin/chunks/{NoPermissionsPage-CuxrInhz.mjs → NoPermissionsPage-Bd9W5bao.mjs} +2 -2
  38. package/dist/admin/chunks/{NoPermissionsPage-CuxrInhz.mjs.map → NoPermissionsPage-Bd9W5bao.mjs.map} +1 -1
  39. package/dist/admin/chunks/{NoPermissionsPage-H4SAlJeF.js → NoPermissionsPage-CMz3Dyqd.js} +2 -2
  40. package/dist/admin/chunks/{NoPermissionsPage-H4SAlJeF.js.map → NoPermissionsPage-CMz3Dyqd.js.map} +1 -1
  41. package/dist/admin/chunks/{Preview-HqnNXn4S.mjs → Preview-D5k-M3hC.mjs} +133 -125
  42. package/dist/admin/chunks/Preview-D5k-M3hC.mjs.map +1 -0
  43. package/dist/admin/chunks/{Preview-Bz2dgOiw.js → Preview-Dy1QMgx2.js} +131 -123
  44. package/dist/admin/chunks/Preview-Dy1QMgx2.js.map +1 -0
  45. package/dist/admin/chunks/{en-CLf4SuMQ.js → en-CH__IC8g.js} +2 -1
  46. package/dist/admin/chunks/{en-CLf4SuMQ.js.map → en-CH__IC8g.js.map} +1 -1
  47. package/dist/admin/chunks/{en-CImiNxXE.mjs → en-DBP0Gaid.mjs} +2 -1
  48. package/dist/admin/chunks/{en-CImiNxXE.mjs.map → en-DBP0Gaid.mjs.map} +1 -1
  49. package/dist/admin/chunks/{index-CS_nLuw2.mjs → index-C3_UywVP.mjs} +177 -123
  50. package/dist/admin/chunks/index-C3_UywVP.mjs.map +1 -0
  51. package/dist/admin/chunks/{index-DfX0uEQT.js → index-CCql3IuL.js} +178 -121
  52. package/dist/admin/chunks/index-CCql3IuL.js.map +1 -0
  53. package/dist/admin/chunks/{layout-B4Uk0v1z.js → layout-DPQGAHVR.js} +86 -13
  54. package/dist/admin/chunks/layout-DPQGAHVR.js.map +1 -0
  55. package/dist/admin/chunks/{layout-BInXGFmo.mjs → layout-LwPR2YFL.mjs} +78 -5
  56. package/dist/admin/chunks/layout-LwPR2YFL.mjs.map +1 -0
  57. package/dist/admin/chunks/{useDragAndDrop-gcqEJMnO.js → objects-BJTP843m.js} +73 -1
  58. package/dist/admin/chunks/objects-BJTP843m.js.map +1 -0
  59. package/dist/admin/chunks/{useDragAndDrop-HYwNDExe.mjs → objects-D2z-IJgu.mjs} +72 -2
  60. package/dist/admin/chunks/objects-D2z-IJgu.mjs.map +1 -0
  61. package/dist/admin/chunks/{relations-CwL0ThH9.mjs → usePrev-C5DWLlSW.mjs} +18 -4
  62. package/dist/admin/chunks/usePrev-C5DWLlSW.mjs.map +1 -0
  63. package/dist/admin/chunks/{relations-9C5dQI9e.js → usePrev-D8mtUeZf.js} +18 -2
  64. package/dist/admin/chunks/usePrev-D8mtUeZf.js.map +1 -0
  65. package/dist/admin/index.js +1 -1
  66. package/dist/admin/index.mjs +1 -1
  67. package/dist/admin/src/content-manager.d.ts +1 -0
  68. package/dist/admin/src/features/DocumentContext.d.ts +48 -0
  69. package/dist/admin/src/features/DocumentRBAC.d.ts +3 -2
  70. package/dist/admin/src/hooks/useDocument.d.ts +2 -0
  71. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
  72. package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +7 -0
  73. package/dist/admin/src/pages/EditView/components/FormInputs/{Relations.d.ts → Relations/Relations.d.ts} +9 -4
  74. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +5 -2
  75. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +3 -3
  76. package/dist/admin/src/preview/components/PreviewContent.d.ts +1 -2
  77. package/dist/admin/src/preview/pages/Preview.d.ts +2 -0
  78. package/package.json +5 -5
  79. package/dist/admin/chunks/EditViewPage-Dk8CeS40.js.map +0 -1
  80. package/dist/admin/chunks/EditViewPage-eTCSh2HB.mjs.map +0 -1
  81. package/dist/admin/chunks/History-CD5uVchr.mjs.map +0 -1
  82. package/dist/admin/chunks/History-CfsF-U-3.js.map +0 -1
  83. package/dist/admin/chunks/Input-CU93J6dl.js.map +0 -1
  84. package/dist/admin/chunks/Input-grmHplxs.mjs.map +0 -1
  85. package/dist/admin/chunks/Preview-Bz2dgOiw.js.map +0 -1
  86. package/dist/admin/chunks/Preview-HqnNXn4S.mjs.map +0 -1
  87. package/dist/admin/chunks/Relations-BMvL4yMN.mjs +0 -1291
  88. package/dist/admin/chunks/Relations-BMvL4yMN.mjs.map +0 -1
  89. package/dist/admin/chunks/Relations-CbCAt692.js +0 -1318
  90. package/dist/admin/chunks/Relations-CbCAt692.js.map +0 -1
  91. package/dist/admin/chunks/index-CS_nLuw2.mjs.map +0 -1
  92. package/dist/admin/chunks/index-DfX0uEQT.js.map +0 -1
  93. package/dist/admin/chunks/layout-B4Uk0v1z.js.map +0 -1
  94. package/dist/admin/chunks/layout-BInXGFmo.mjs.map +0 -1
  95. package/dist/admin/chunks/objects-C3EebVVe.js +0 -76
  96. package/dist/admin/chunks/objects-C3EebVVe.js.map +0 -1
  97. package/dist/admin/chunks/objects-wl73iEma.mjs +0 -73
  98. package/dist/admin/chunks/objects-wl73iEma.mjs.map +0 -1
  99. package/dist/admin/chunks/relations-9C5dQI9e.js.map +0 -1
  100. package/dist/admin/chunks/relations-CwL0ThH9.mjs.map +0 -1
  101. package/dist/admin/chunks/useDragAndDrop-HYwNDExe.mjs.map +0 -1
  102. package/dist/admin/chunks/useDragAndDrop-gcqEJMnO.js.map +0 -1
  103. package/dist/admin/chunks/usePrev-Bjw2dhmq.mjs +0 -18
  104. package/dist/admin/chunks/usePrev-Bjw2dhmq.mjs.map +0 -1
  105. package/dist/admin/chunks/usePrev-DIYl-IAL.js +0 -21
  106. package/dist/admin/chunks/usePrev-DIYl-IAL.js.map +0 -1
@@ -119,102 +119,6 @@ const DOCUMENT_META_FIELDS = [
119
119
  const SINGLE_TYPES = 'single-types';
120
120
  const COLLECTION_TYPES = 'collection-types';
121
121
 
122
- const [DocumentRBACProvider, useDocumentRBAC] = strapiAdmin.createContext('DocumentRBAC', {
123
- canCreate: false,
124
- canCreateFields: [],
125
- canDelete: false,
126
- canPublish: false,
127
- canRead: false,
128
- canReadFields: [],
129
- canUpdate: false,
130
- canUpdateFields: [],
131
- canUserAction: ()=>false,
132
- isLoading: false
133
- });
134
- /**
135
- * @internal This component is not meant to be used outside of the Content Manager plugin.
136
- * It depends on knowing the slug/model of the content-type using the params of the URL.
137
- * If you do use the hook outside of the context, we default to `false` for all actions.
138
- *
139
- * It then creates an list of `can{Action}` that are passed to the context for consumption
140
- * within the app to enforce RBAC.
141
- */ const DocumentRBAC = ({ children, permissions })=>{
142
- const { slug } = reactRouterDom.useParams();
143
- if (!slug) {
144
- throw new Error('Cannot find the slug param in the URL');
145
- }
146
- const [{ rawQuery }] = strapiAdmin.useQueryParams();
147
- const userPermissions = strapiAdmin.useAuth('DocumentRBAC', (state)=>state.permissions);
148
- const contentTypePermissions = React__namespace.useMemo(()=>{
149
- const contentTypePermissions = userPermissions.filter((permission)=>permission.subject === slug);
150
- return contentTypePermissions.reduce((acc, permission)=>{
151
- const [action] = permission.action.split('.').slice(-1);
152
- return {
153
- ...acc,
154
- [action]: [
155
- permission
156
- ]
157
- };
158
- }, {});
159
- }, [
160
- slug,
161
- userPermissions
162
- ]);
163
- const { isLoading, allowedActions } = strapiAdmin.useRBAC(contentTypePermissions, permissions ?? undefined, // TODO: useRBAC context should be typed and built differently
164
- // We are passing raw query as context to the hook so that it can
165
- // rely on the locale provided from DocumentRBAC for its permission calculations.
166
- rawQuery);
167
- const canCreateFields = !isLoading && allowedActions.canCreate ? extractAndDedupeFields(contentTypePermissions.create) : [];
168
- const canReadFields = !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];
169
- const canUpdateFields = !isLoading && allowedActions.canUpdate ? extractAndDedupeFields(contentTypePermissions.update) : [];
170
- /**
171
- * @description Checks if the user can perform an action on a field based on the field names
172
- * provided as the second argument.
173
- */ const canUserAction = React__namespace.useCallback((fieldName, fieldsUserCanAction, fieldType)=>{
174
- const name = removeNumericalStrings(fieldName.split('.'));
175
- const componentFieldNames = fieldsUserCanAction// filter out fields that aren't components (components are dot separated)
176
- .filter((field)=>field.split('.').length > 1);
177
- if (fieldType === 'component') {
178
- // check if the field name is within any of those arrays
179
- return componentFieldNames.some((field)=>{
180
- return field.includes(name.join('.'));
181
- });
182
- }
183
- /**
184
- * The field is within a component.
185
- */ if (name.length > 1) {
186
- return componentFieldNames.includes(name.join('.'));
187
- }
188
- /**
189
- * just a regular field
190
- */ return fieldsUserCanAction.includes(fieldName);
191
- }, []);
192
- if (isLoading) {
193
- return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Loading, {});
194
- }
195
- return /*#__PURE__*/ jsxRuntime.jsx(DocumentRBACProvider, {
196
- isLoading: isLoading,
197
- canCreateFields: canCreateFields,
198
- canReadFields: canReadFields,
199
- canUpdateFields: canUpdateFields,
200
- canUserAction: canUserAction,
201
- ...allowedActions,
202
- children: children
203
- });
204
- };
205
- /**
206
- * @internal it's really small, but it's used three times in a row and DRY for something this straight forward.
207
- */ const extractAndDedupeFields = (permissions = [])=>permissions.flatMap((permission)=>permission.properties?.fields).filter((field, index, arr)=>arr.indexOf(field) === index && typeof field === 'string');
208
- /**
209
- * @internal removes numerical strings from arrays.
210
- * @example
211
- * ```ts
212
- * const name = 'a.0.b';
213
- * const res = removeNumericalStrings(name.split('.'));
214
- * console.log(res); // ['a', 'b']
215
- * ```
216
- */ const removeNumericalStrings = (arr)=>arr.filter((item)=>isNaN(Number(item)));
217
-
218
122
  const BLOCK_LIST_ATTRIBUTE_KEYS = [
219
123
  '__component',
220
124
  '__temp_key__'
@@ -1525,7 +1429,7 @@ const checkIfAttributeIsDisplayable = (attribute)=>{
1525
1429
  const { toggleNotification } = strapiAdmin.useNotification();
1526
1430
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
1527
1431
  const { formatMessage } = reactIntl.useIntl();
1528
- const { currentData: data, isLoading: isLoadingDocument, isFetching: isFetchingDocument, error } = useGetDocumentQuery(args, {
1432
+ const { currentData: data, isLoading: isLoadingDocument, isFetching: isFetchingDocument, error, refetch } = useGetDocumentQuery(args, {
1529
1433
  ...opts,
1530
1434
  skip: !args.documentId && args.collectionType !== SINGLE_TYPES || opts?.skip
1531
1435
  });
@@ -1624,7 +1528,8 @@ const checkIfAttributeIsDisplayable = (attribute)=>{
1624
1528
  schemas,
1625
1529
  validate,
1626
1530
  getTitle,
1627
- getInitialFormValues
1531
+ getInitialFormValues,
1532
+ refetch
1628
1533
  };
1629
1534
  };
1630
1535
  /* -------------------------------------------------------------------------------------------------
@@ -1697,6 +1602,140 @@ const checkIfAttributeIsDisplayable = (attribute)=>{
1697
1602
  };
1698
1603
  };
1699
1604
 
1605
+ const [DocumentProvider, useDocumentContext] = strapiAdmin.createContext('DocumentContext');
1606
+ /**
1607
+ * TODO: Document in contributor docs, Add unit test
1608
+ *
1609
+ * This context provider and its associated hook are used to access a document at its root level
1610
+ * and expose a function to change the current document being viewed to one of the root level docuemnt's relations.
1611
+ *
1612
+ * The useDocumentContext hook exposes:
1613
+ * - meta: information about the currentDocument,
1614
+ * - document: the actual document,
1615
+ * - changeDocument: a function to change the current document to one of its relations.
1616
+ */ const DocumentContextProvider = ({ children, initialDocument })=>{
1617
+ /**
1618
+ * Initialize with the "root" document and expose a setter method to change to
1619
+ * one of the root level document's relations.
1620
+ */ const [currentDocumentMeta, changeDocument] = React__namespace.useState(initialDocument);
1621
+ const params = React__namespace.useMemo(()=>buildValidParams(currentDocumentMeta.params ?? {}), [
1622
+ currentDocumentMeta.params
1623
+ ]);
1624
+ const document = useDocument({
1625
+ ...currentDocumentMeta,
1626
+ params
1627
+ });
1628
+ return /*#__PURE__*/ jsxRuntime.jsx(DocumentProvider, {
1629
+ changeDocument: changeDocument,
1630
+ document: document,
1631
+ rootDocumentMeta: {
1632
+ documentId: initialDocument.documentId,
1633
+ model: initialDocument.model,
1634
+ collectionType: initialDocument.collectionType,
1635
+ params: initialDocument.params
1636
+ },
1637
+ meta: currentDocumentMeta,
1638
+ children: children
1639
+ });
1640
+ };
1641
+
1642
+ const [DocumentRBACProvider, useDocumentRBAC] = strapiAdmin.createContext('DocumentRBAC', {
1643
+ canCreate: false,
1644
+ canCreateFields: [],
1645
+ canDelete: false,
1646
+ canPublish: false,
1647
+ canRead: false,
1648
+ canReadFields: [],
1649
+ canUpdate: false,
1650
+ canUpdateFields: [],
1651
+ canUserAction: ()=>false,
1652
+ isLoading: false
1653
+ });
1654
+ /**
1655
+ * @internal This component is not meant to be used outside of the Content Manager plugin.
1656
+ * It depends on knowing the slug/model of the content-type using the params of the URL or the model if it is passed as arg.
1657
+ * If you do use the hook outside of the context, we default to `false` for all actions.
1658
+ *
1659
+ * It then creates an list of `can{Action}` that are passed to the context for consumption
1660
+ * within the app to enforce RBAC.
1661
+ */ const DocumentRBAC = ({ children, permissions, model })=>{
1662
+ const { slug } = reactRouterDom.useParams();
1663
+ if (!slug && !model) {
1664
+ throw new Error('Cannot find the slug param in the URL or the model prop is not provided.');
1665
+ }
1666
+ const contentTypeUid = model ?? slug;
1667
+ const [{ rawQuery }] = strapiAdmin.useQueryParams();
1668
+ const userPermissions = strapiAdmin.useAuth('DocumentRBAC', (state)=>state.permissions);
1669
+ const contentTypePermissions = React__namespace.useMemo(()=>{
1670
+ const contentTypePermissions = userPermissions.filter((permission)=>permission.subject === contentTypeUid);
1671
+ return contentTypePermissions.reduce((acc, permission)=>{
1672
+ const [action] = permission.action.split('.').slice(-1);
1673
+ return {
1674
+ ...acc,
1675
+ [action]: [
1676
+ permission
1677
+ ]
1678
+ };
1679
+ }, {});
1680
+ }, [
1681
+ contentTypeUid,
1682
+ userPermissions
1683
+ ]);
1684
+ const { isLoading, allowedActions } = strapiAdmin.useRBAC(contentTypePermissions, permissions ?? undefined, // TODO: useRBAC context should be typed and built differently
1685
+ // We are passing raw query as context to the hook so that it can
1686
+ // rely on the locale provided from DocumentRBAC for its permission calculations.
1687
+ rawQuery);
1688
+ const canCreateFields = !isLoading && allowedActions.canCreate ? extractAndDedupeFields(contentTypePermissions.create) : [];
1689
+ const canReadFields = !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];
1690
+ const canUpdateFields = !isLoading && allowedActions.canUpdate ? extractAndDedupeFields(contentTypePermissions.update) : [];
1691
+ /**
1692
+ * @description Checks if the user can perform an action on a field based on the field names
1693
+ * provided as the second argument.
1694
+ */ const canUserAction = React__namespace.useCallback((fieldName, fieldsUserCanAction, fieldType)=>{
1695
+ const name = removeNumericalStrings(fieldName.split('.'));
1696
+ const componentFieldNames = fieldsUserCanAction// filter out fields that aren't components (components are dot separated)
1697
+ .filter((field)=>field.split('.').length > 1);
1698
+ if (fieldType === 'component') {
1699
+ // check if the field name is within any of those arrays
1700
+ return componentFieldNames.some((field)=>{
1701
+ return field.includes(name.join('.'));
1702
+ });
1703
+ }
1704
+ /**
1705
+ * The field is within a component.
1706
+ */ if (name.length > 1) {
1707
+ return componentFieldNames.includes(name.join('.'));
1708
+ }
1709
+ /**
1710
+ * just a regular field
1711
+ */ return fieldsUserCanAction.includes(fieldName);
1712
+ }, []);
1713
+ if (isLoading) {
1714
+ return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Loading, {});
1715
+ }
1716
+ return /*#__PURE__*/ jsxRuntime.jsx(DocumentRBACProvider, {
1717
+ isLoading: isLoading,
1718
+ canCreateFields: canCreateFields,
1719
+ canReadFields: canReadFields,
1720
+ canUpdateFields: canUpdateFields,
1721
+ canUserAction: canUserAction,
1722
+ ...allowedActions,
1723
+ children: children
1724
+ });
1725
+ };
1726
+ /**
1727
+ * @internal it's really small, but it's used three times in a row and DRY for something this straight forward.
1728
+ */ const extractAndDedupeFields = (permissions = [])=>permissions.flatMap((permission)=>permission.properties?.fields).filter((field, index, arr)=>arr.indexOf(field) === index && typeof field === 'string');
1729
+ /**
1730
+ * @internal removes numerical strings from arrays.
1731
+ * @example
1732
+ * ```ts
1733
+ * const name = 'a.0.b';
1734
+ * const res = removeNumericalStrings(name.split('.'));
1735
+ * console.log(res); // ['a', 'b']
1736
+ * ```
1737
+ */ const removeNumericalStrings = (arr)=>arr.filter((item)=>isNaN(Number(item)));
1738
+
1700
1739
  const prefixPluginTranslations = (trad, pluginId)=>{
1701
1740
  return Object.keys(trad).reduce((acc, current)=>{
1702
1741
  acc[`${pluginId}.${current}`] = trad[current];
@@ -2252,7 +2291,7 @@ const DEFAULT_UNEXPECTED_ERROR_MSG = {
2252
2291
  };
2253
2292
  };
2254
2293
 
2255
- const ProtectedHistoryPage = /*#__PURE__*/ React__namespace.lazy(()=>Promise.resolve().then(function () { return require('./History-CfsF-U-3.js'); }).then((mod)=>({
2294
+ const ProtectedHistoryPage = /*#__PURE__*/ React__namespace.lazy(()=>Promise.resolve().then(function () { return require('./History-CpOv78Ft.js'); }).then((mod)=>({
2256
2295
  default: mod.ProtectedHistoryPage
2257
2296
  })));
2258
2297
  /**
@@ -2268,7 +2307,7 @@ const ProtectedHistoryPage = /*#__PURE__*/ React__namespace.lazy(()=>Promise.res
2268
2307
  }
2269
2308
  ];
2270
2309
 
2271
- const ProtectedPreviewPage = /*#__PURE__*/ React__namespace.lazy(()=>Promise.resolve().then(function () { return require('./Preview-Bz2dgOiw.js'); }).then((mod)=>({
2310
+ const ProtectedPreviewPage = /*#__PURE__*/ React__namespace.lazy(()=>Promise.resolve().then(function () { return require('./Preview-Dy1QMgx2.js'); }).then((mod)=>({
2272
2311
  default: mod.ProtectedPreviewPage
2273
2312
  })));
2274
2313
  const routes$1 = [
@@ -2282,25 +2321,25 @@ const routes$1 = [
2282
2321
  }
2283
2322
  ];
2284
2323
 
2285
- const ProtectedEditViewPage = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./EditViewPage-Dk8CeS40.js'); }).then((mod)=>({
2324
+ const ProtectedEditViewPage = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./EditViewPage-BuXES73t.js'); }).then((mod)=>({
2286
2325
  default: mod.ProtectedEditViewPage
2287
2326
  })));
2288
- const ProtectedListViewPage = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./ListViewPage-DQYvHCxn.js'); }).then((mod)=>({
2327
+ const ProtectedListViewPage = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./ListViewPage-lg2Rqa6F.js'); }).then((mod)=>({
2289
2328
  default: mod.ProtectedListViewPage
2290
2329
  })));
2291
- const ProtectedListConfiguration = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./ListConfigurationPage-nZti--Mw.js'); }).then((mod)=>({
2330
+ const ProtectedListConfiguration = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./ListConfigurationPage-dry2u2na.js'); }).then((mod)=>({
2292
2331
  default: mod.ProtectedListConfiguration
2293
2332
  })));
2294
- const ProtectedEditConfigurationPage = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./EditConfigurationPage-CRxsqOhS.js'); }).then((mod)=>({
2333
+ const ProtectedEditConfigurationPage = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./EditConfigurationPage-DPE54bv4.js'); }).then((mod)=>({
2295
2334
  default: mod.ProtectedEditConfigurationPage
2296
2335
  })));
2297
- const ProtectedComponentConfigurationPage = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./ComponentConfigurationPage-Bn-SMKJG.js'); }).then((mod)=>({
2336
+ const ProtectedComponentConfigurationPage = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./ComponentConfigurationPage-DCsX9dT5.js'); }).then((mod)=>({
2298
2337
  default: mod.ProtectedComponentConfigurationPage
2299
2338
  })));
2300
- const NoPermissions = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./NoPermissionsPage-H4SAlJeF.js'); }).then((mod)=>({
2339
+ const NoPermissions = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./NoPermissionsPage-CMz3Dyqd.js'); }).then((mod)=>({
2301
2340
  default: mod.NoPermissions
2302
2341
  })));
2303
- const NoContentType = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./NoContentTypePage-ChYgz3sN.js'); }).then((mod)=>({
2342
+ const NoContentType = /*#__PURE__*/ React.lazy(()=>Promise.resolve().then(function () { return require('./NoContentTypePage-FT7uXIGM.js'); }).then((mod)=>({
2304
2343
  default: mod.NoContentType
2305
2344
  })));
2306
2345
  const CollectionTypePages = ()=>{
@@ -2687,8 +2726,8 @@ const transformData = (data)=>{
2687
2726
  };
2688
2727
  /* -------------------------------------------------------------------------------------------------
2689
2728
  * DocumentActionComponents
2690
- * -----------------------------------------------------------------------------------------------*/ const PublishAction$1 = ({ activeTab, documentId, model, collectionType, meta, document })=>{
2691
- const { schema } = useDoc();
2729
+ * -----------------------------------------------------------------------------------------------*/ const PublishAction$1 = ({ activeTab, documentId, model, collectionType, meta, document, onPreview })=>{
2730
+ const schema = useDocumentContext('PublishAction', (state)=>state.document.schema);
2692
2731
  const navigate = reactRouterDom.useNavigate();
2693
2732
  const { toggleNotification } = strapiAdmin.useNotification();
2694
2733
  const { _unstableFormatValidationErrors: formatValidationErrors } = strapiAdmin.useAPIErrorHandler();
@@ -2711,6 +2750,8 @@ const transformData = (data)=>{
2711
2750
  const validate = strapiAdmin.useForm('PublishAction', (state)=>state.validate);
2712
2751
  const setErrors = strapiAdmin.useForm('PublishAction', (state)=>state.setErrors);
2713
2752
  const formValues = strapiAdmin.useForm('PublishAction', ({ values })=>values);
2753
+ const rootDocumentMeta = useDocumentContext('PublishAction', (state)=>state.rootDocumentMeta);
2754
+ const currentDocumentMeta = useDocumentContext('PublishAction', (state)=>state.meta);
2714
2755
  React__namespace.useEffect(()=>{
2715
2756
  if (isErrorDraftRelations) {
2716
2757
  toggleNotification({
@@ -2813,11 +2854,12 @@ const transformData = (data)=>{
2813
2854
  });
2814
2855
  return;
2815
2856
  }
2857
+ const isPublishingRelation = rootDocumentMeta.documentId !== currentDocumentMeta.documentId;
2816
2858
  const res = await publish({
2817
2859
  collectionType,
2818
2860
  model,
2819
2861
  documentId,
2820
- params
2862
+ params: isPublishingRelation ? currentDocumentMeta.params : params
2821
2863
  }, transformData(formValues));
2822
2864
  if ('data' in res && collectionType !== SINGLE_TYPES) {
2823
2865
  /**
@@ -2833,6 +2875,9 @@ const transformData = (data)=>{
2833
2875
  }
2834
2876
  } finally{
2835
2877
  setSubmitting(false);
2878
+ if (onPreview) {
2879
+ onPreview();
2880
+ }
2836
2881
  }
2837
2882
  };
2838
2883
  const totalDraftRelations = localCountOfDraftRelations + serverCountOfDraftRelations;
@@ -2844,7 +2889,8 @@ const transformData = (data)=>{
2844
2889
  loading: isLoading,
2845
2890
  position: [
2846
2891
  'panel',
2847
- 'preview'
2892
+ 'preview',
2893
+ 'relation-modal'
2848
2894
  ],
2849
2895
  /**
2850
2896
  * Disabled when:
@@ -2885,9 +2931,10 @@ const transformData = (data)=>{
2885
2931
  PublishAction$1.type = 'publish';
2886
2932
  PublishAction$1.position = [
2887
2933
  'panel',
2888
- 'preview'
2934
+ 'preview',
2935
+ 'relation-modal'
2889
2936
  ];
2890
- const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
2937
+ const UpdateAction = ({ activeTab, documentId, model, collectionType, onPreview })=>{
2891
2938
  const navigate = reactRouterDom.useNavigate();
2892
2939
  const { toggleNotification } = strapiAdmin.useNotification();
2893
2940
  const { _unstableFormatValidationErrors: formatValidationErrors } = strapiAdmin.useAPIErrorHandler();
@@ -2906,6 +2953,8 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
2906
2953
  const validate = strapiAdmin.useForm('UpdateAction', (state)=>state.validate);
2907
2954
  const setErrors = strapiAdmin.useForm('UpdateAction', (state)=>state.setErrors);
2908
2955
  const resetForm = strapiAdmin.useForm('PublishAction', ({ resetForm })=>resetForm);
2956
+ const rootDocumentMeta = useDocumentContext('UpdateAction', (state)=>state.rootDocumentMeta);
2957
+ const currentDocumentMeta = useDocumentContext('UpdateAction', (state)=>state.meta);
2909
2958
  const handleUpdate = React__namespace.useCallback(async ()=>{
2910
2959
  setSubmitting(true);
2911
2960
  try {
@@ -2942,11 +2991,12 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
2942
2991
  setErrors(formatValidationErrors(res.error));
2943
2992
  }
2944
2993
  } else if (documentId || collectionType === SINGLE_TYPES) {
2994
+ const isEditingRelation = rootDocumentMeta.documentId !== currentDocumentMeta.documentId;
2945
2995
  const res = await update({
2946
2996
  collectionType,
2947
2997
  model,
2948
2998
  documentId,
2949
- params
2999
+ params: isEditingRelation ? currentDocumentMeta.params : params
2950
3000
  }, transformData(document));
2951
3001
  if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
2952
3002
  setErrors(formatValidationErrors(res.error));
@@ -2972,6 +3022,9 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
2972
3022
  }
2973
3023
  } finally{
2974
3024
  setSubmitting(false);
3025
+ if (onPreview) {
3026
+ onPreview();
3027
+ }
2975
3028
  }
2976
3029
  }, [
2977
3030
  clone,
@@ -3025,14 +3078,16 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
3025
3078
  onClick: handleUpdate,
3026
3079
  position: [
3027
3080
  'panel',
3028
- 'preview'
3081
+ 'preview',
3082
+ 'relation-modal'
3029
3083
  ]
3030
3084
  };
3031
3085
  };
3032
3086
  UpdateAction.type = 'update';
3033
3087
  UpdateAction.position = [
3034
3088
  'panel',
3035
- 'preview'
3089
+ 'preview',
3090
+ 'relation-modal'
3036
3091
  ];
3037
3092
  const UNPUBLISH_DRAFT_OPTIONS = {
3038
3093
  KEEP: 'keep',
@@ -3325,12 +3380,11 @@ const capitalise = (str)=>str.charAt(0).toUpperCase() + str.slice(1);
3325
3380
  size: size,
3326
3381
  variant: statusVariant,
3327
3382
  role: "status",
3328
- "aria-labelledby": "document-status",
3383
+ "aria-label": status,
3329
3384
  children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
3330
3385
  tag: "span",
3331
3386
  variant: "omega",
3332
3387
  fontWeight: "bold",
3333
- id: "document-status",
3334
3388
  children: formatMessage({
3335
3389
  id: `content-manager.containers.List.${status}`,
3336
3390
  defaultMessage: capitalise(status)
@@ -5309,7 +5363,7 @@ function __variableDynamicImportRuntime1__(path) {
5309
5363
  case './translations/ca.json': return Promise.resolve().then(function () { return require('./ca-ClDTvatJ.js'); });
5310
5364
  case './translations/cs.json': return Promise.resolve().then(function () { return require('./cs-BJFxwIWj.js'); });
5311
5365
  case './translations/de.json': return Promise.resolve().then(function () { return require('./de-CbImAUA5.js'); });
5312
- case './translations/en.json': return Promise.resolve().then(function () { return require('./en-CLf4SuMQ.js'); });
5366
+ case './translations/en.json': return Promise.resolve().then(function () { return require('./en-CH__IC8g.js'); });
5313
5367
  case './translations/es.json': return Promise.resolve().then(function () { return require('./es-C8vLuvZL.js'); });
5314
5368
  case './translations/eu.json': return Promise.resolve().then(function () { return require('./eu-BJW3AvXu.js'); });
5315
5369
  case './translations/fr.json': return Promise.resolve().then(function () { return require('./fr-gQSilC7w.js'); });
@@ -5363,7 +5417,7 @@ var index = {
5363
5417
  app.router.addRoute({
5364
5418
  path: 'content-manager/*',
5365
5419
  lazy: async ()=>{
5366
- const { Layout } = await Promise.resolve().then(function () { return require('./layout-B4Uk0v1z.js'); });
5420
+ const { Layout } = await Promise.resolve().then(function () { return require('./layout-DPQGAHVR.js'); });
5367
5421
  return {
5368
5422
  Component: Layout
5369
5423
  };
@@ -5405,6 +5459,7 @@ exports.COLLECTION_TYPES = COLLECTION_TYPES;
5405
5459
  exports.CREATOR_FIELDS = CREATOR_FIELDS;
5406
5460
  exports.DEFAULT_SETTINGS = DEFAULT_SETTINGS;
5407
5461
  exports.DocumentActionButton = DocumentActionButton;
5462
+ exports.DocumentContextProvider = DocumentContextProvider;
5408
5463
  exports.DocumentRBAC = DocumentRBAC;
5409
5464
  exports.DocumentStatus = DocumentStatus;
5410
5465
  exports.HOOKS = HOOKS;
@@ -5438,6 +5493,7 @@ exports.useDoc = useDoc;
5438
5493
  exports.useDocLayout = useDocLayout;
5439
5494
  exports.useDocument = useDocument;
5440
5495
  exports.useDocumentActions = useDocumentActions;
5496
+ exports.useDocumentContext = useDocumentContext;
5441
5497
  exports.useDocumentLayout = useDocumentLayout;
5442
5498
  exports.useDocumentRBAC = useDocumentRBAC;
5443
5499
  exports.useGetAllContentTypeSettingsQuery = useGetAllContentTypeSettingsQuery;
@@ -5445,5 +5501,6 @@ exports.useGetAllDocumentsQuery = useGetAllDocumentsQuery;
5445
5501
  exports.useGetContentTypeConfigurationQuery = useGetContentTypeConfigurationQuery;
5446
5502
  exports.useGetInitialDataQuery = useGetInitialDataQuery;
5447
5503
  exports.useGetPreviewUrlQuery = useGetPreviewUrlQuery;
5504
+ exports.useLazyGetDocumentQuery = useLazyGetDocumentQuery;
5448
5505
  exports.useUpdateContentTypeConfigurationMutation = useUpdateContentTypeConfigurationMutation;
5449
- //# sourceMappingURL=index-DfX0uEQT.js.map
5506
+ //# sourceMappingURL=index-CCql3IuL.js.map