@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
@@ -1,6 +1,6 @@
1
1
  import { Cross, WarningCircle, More, ListPlus, Pencil, Trash, Check, CheckCircle, ArrowsCounterClockwise, CrossCircle, ChevronRight, Duplicate, ClockCounterClockwise, Feather } from '@strapi/icons';
2
2
  import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
3
- import { useStrapiApp, createContext, useQueryParams, useAuth, useRBAC, Page, adminApi, translatedErrors, useNotification, useAPIErrorHandler, getYupValidationErrors, useForm, useTracking, useGuidedTour, BackButton, DescriptionComponentRenderer, useTable, Table } from '@strapi/admin/strapi-admin';
3
+ import { useStrapiApp, adminApi, translatedErrors, useNotification, useAPIErrorHandler, useQueryParams, getYupValidationErrors, useForm, createContext, useAuth, useRBAC, Page, useTracking, useGuidedTour, BackButton, DescriptionComponentRenderer, useTable, Table } from '@strapi/admin/strapi-admin';
4
4
  import * as React from 'react';
5
5
  import { lazy } from 'react';
6
6
  import { Menu, Flex, Typography, Radio, Button, VisuallyHidden, Dialog, Modal, Status, Box, SingleSelect, SingleSelectOption, IconButton, RawTable, Loader, Tbody, Tr, Td, Tooltip, LinkButton } from '@strapi/design-system';
@@ -99,102 +99,6 @@ const DOCUMENT_META_FIELDS = [
99
99
  const SINGLE_TYPES = 'single-types';
100
100
  const COLLECTION_TYPES = 'collection-types';
101
101
 
102
- const [DocumentRBACProvider, useDocumentRBAC] = createContext('DocumentRBAC', {
103
- canCreate: false,
104
- canCreateFields: [],
105
- canDelete: false,
106
- canPublish: false,
107
- canRead: false,
108
- canReadFields: [],
109
- canUpdate: false,
110
- canUpdateFields: [],
111
- canUserAction: ()=>false,
112
- isLoading: false
113
- });
114
- /**
115
- * @internal This component is not meant to be used outside of the Content Manager plugin.
116
- * It depends on knowing the slug/model of the content-type using the params of the URL.
117
- * If you do use the hook outside of the context, we default to `false` for all actions.
118
- *
119
- * It then creates an list of `can{Action}` that are passed to the context for consumption
120
- * within the app to enforce RBAC.
121
- */ const DocumentRBAC = ({ children, permissions })=>{
122
- const { slug } = useParams();
123
- if (!slug) {
124
- throw new Error('Cannot find the slug param in the URL');
125
- }
126
- const [{ rawQuery }] = useQueryParams();
127
- const userPermissions = useAuth('DocumentRBAC', (state)=>state.permissions);
128
- const contentTypePermissions = React.useMemo(()=>{
129
- const contentTypePermissions = userPermissions.filter((permission)=>permission.subject === slug);
130
- return contentTypePermissions.reduce((acc, permission)=>{
131
- const [action] = permission.action.split('.').slice(-1);
132
- return {
133
- ...acc,
134
- [action]: [
135
- permission
136
- ]
137
- };
138
- }, {});
139
- }, [
140
- slug,
141
- userPermissions
142
- ]);
143
- const { isLoading, allowedActions } = useRBAC(contentTypePermissions, permissions ?? undefined, // TODO: useRBAC context should be typed and built differently
144
- // We are passing raw query as context to the hook so that it can
145
- // rely on the locale provided from DocumentRBAC for its permission calculations.
146
- rawQuery);
147
- const canCreateFields = !isLoading && allowedActions.canCreate ? extractAndDedupeFields(contentTypePermissions.create) : [];
148
- const canReadFields = !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];
149
- const canUpdateFields = !isLoading && allowedActions.canUpdate ? extractAndDedupeFields(contentTypePermissions.update) : [];
150
- /**
151
- * @description Checks if the user can perform an action on a field based on the field names
152
- * provided as the second argument.
153
- */ const canUserAction = React.useCallback((fieldName, fieldsUserCanAction, fieldType)=>{
154
- const name = removeNumericalStrings(fieldName.split('.'));
155
- const componentFieldNames = fieldsUserCanAction// filter out fields that aren't components (components are dot separated)
156
- .filter((field)=>field.split('.').length > 1);
157
- if (fieldType === 'component') {
158
- // check if the field name is within any of those arrays
159
- return componentFieldNames.some((field)=>{
160
- return field.includes(name.join('.'));
161
- });
162
- }
163
- /**
164
- * The field is within a component.
165
- */ if (name.length > 1) {
166
- return componentFieldNames.includes(name.join('.'));
167
- }
168
- /**
169
- * just a regular field
170
- */ return fieldsUserCanAction.includes(fieldName);
171
- }, []);
172
- if (isLoading) {
173
- return /*#__PURE__*/ jsx(Page.Loading, {});
174
- }
175
- return /*#__PURE__*/ jsx(DocumentRBACProvider, {
176
- isLoading: isLoading,
177
- canCreateFields: canCreateFields,
178
- canReadFields: canReadFields,
179
- canUpdateFields: canUpdateFields,
180
- canUserAction: canUserAction,
181
- ...allowedActions,
182
- children: children
183
- });
184
- };
185
- /**
186
- * @internal it's really small, but it's used three times in a row and DRY for something this straight forward.
187
- */ const extractAndDedupeFields = (permissions = [])=>permissions.flatMap((permission)=>permission.properties?.fields).filter((field, index, arr)=>arr.indexOf(field) === index && typeof field === 'string');
188
- /**
189
- * @internal removes numerical strings from arrays.
190
- * @example
191
- * ```ts
192
- * const name = 'a.0.b';
193
- * const res = removeNumericalStrings(name.split('.'));
194
- * console.log(res); // ['a', 'b']
195
- * ```
196
- */ const removeNumericalStrings = (arr)=>arr.filter((item)=>isNaN(Number(item)));
197
-
198
102
  const BLOCK_LIST_ATTRIBUTE_KEYS = [
199
103
  '__component',
200
104
  '__temp_key__'
@@ -1505,7 +1409,7 @@ const checkIfAttributeIsDisplayable = (attribute)=>{
1505
1409
  const { toggleNotification } = useNotification();
1506
1410
  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
1507
1411
  const { formatMessage } = useIntl();
1508
- const { currentData: data, isLoading: isLoadingDocument, isFetching: isFetchingDocument, error } = useGetDocumentQuery(args, {
1412
+ const { currentData: data, isLoading: isLoadingDocument, isFetching: isFetchingDocument, error, refetch } = useGetDocumentQuery(args, {
1509
1413
  ...opts,
1510
1414
  skip: !args.documentId && args.collectionType !== SINGLE_TYPES || opts?.skip
1511
1415
  });
@@ -1604,7 +1508,8 @@ const checkIfAttributeIsDisplayable = (attribute)=>{
1604
1508
  schemas,
1605
1509
  validate,
1606
1510
  getTitle,
1607
- getInitialFormValues
1511
+ getInitialFormValues,
1512
+ refetch
1608
1513
  };
1609
1514
  };
1610
1515
  /* -------------------------------------------------------------------------------------------------
@@ -1677,6 +1582,140 @@ const checkIfAttributeIsDisplayable = (attribute)=>{
1677
1582
  };
1678
1583
  };
1679
1584
 
1585
+ const [DocumentProvider, useDocumentContext] = createContext('DocumentContext');
1586
+ /**
1587
+ * TODO: Document in contributor docs, Add unit test
1588
+ *
1589
+ * This context provider and its associated hook are used to access a document at its root level
1590
+ * and expose a function to change the current document being viewed to one of the root level docuemnt's relations.
1591
+ *
1592
+ * The useDocumentContext hook exposes:
1593
+ * - meta: information about the currentDocument,
1594
+ * - document: the actual document,
1595
+ * - changeDocument: a function to change the current document to one of its relations.
1596
+ */ const DocumentContextProvider = ({ children, initialDocument })=>{
1597
+ /**
1598
+ * Initialize with the "root" document and expose a setter method to change to
1599
+ * one of the root level document's relations.
1600
+ */ const [currentDocumentMeta, changeDocument] = React.useState(initialDocument);
1601
+ const params = React.useMemo(()=>buildValidParams(currentDocumentMeta.params ?? {}), [
1602
+ currentDocumentMeta.params
1603
+ ]);
1604
+ const document = useDocument({
1605
+ ...currentDocumentMeta,
1606
+ params
1607
+ });
1608
+ return /*#__PURE__*/ jsx(DocumentProvider, {
1609
+ changeDocument: changeDocument,
1610
+ document: document,
1611
+ rootDocumentMeta: {
1612
+ documentId: initialDocument.documentId,
1613
+ model: initialDocument.model,
1614
+ collectionType: initialDocument.collectionType,
1615
+ params: initialDocument.params
1616
+ },
1617
+ meta: currentDocumentMeta,
1618
+ children: children
1619
+ });
1620
+ };
1621
+
1622
+ const [DocumentRBACProvider, useDocumentRBAC] = createContext('DocumentRBAC', {
1623
+ canCreate: false,
1624
+ canCreateFields: [],
1625
+ canDelete: false,
1626
+ canPublish: false,
1627
+ canRead: false,
1628
+ canReadFields: [],
1629
+ canUpdate: false,
1630
+ canUpdateFields: [],
1631
+ canUserAction: ()=>false,
1632
+ isLoading: false
1633
+ });
1634
+ /**
1635
+ * @internal This component is not meant to be used outside of the Content Manager plugin.
1636
+ * 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.
1637
+ * If you do use the hook outside of the context, we default to `false` for all actions.
1638
+ *
1639
+ * It then creates an list of `can{Action}` that are passed to the context for consumption
1640
+ * within the app to enforce RBAC.
1641
+ */ const DocumentRBAC = ({ children, permissions, model })=>{
1642
+ const { slug } = useParams();
1643
+ if (!slug && !model) {
1644
+ throw new Error('Cannot find the slug param in the URL or the model prop is not provided.');
1645
+ }
1646
+ const contentTypeUid = model ?? slug;
1647
+ const [{ rawQuery }] = useQueryParams();
1648
+ const userPermissions = useAuth('DocumentRBAC', (state)=>state.permissions);
1649
+ const contentTypePermissions = React.useMemo(()=>{
1650
+ const contentTypePermissions = userPermissions.filter((permission)=>permission.subject === contentTypeUid);
1651
+ return contentTypePermissions.reduce((acc, permission)=>{
1652
+ const [action] = permission.action.split('.').slice(-1);
1653
+ return {
1654
+ ...acc,
1655
+ [action]: [
1656
+ permission
1657
+ ]
1658
+ };
1659
+ }, {});
1660
+ }, [
1661
+ contentTypeUid,
1662
+ userPermissions
1663
+ ]);
1664
+ const { isLoading, allowedActions } = useRBAC(contentTypePermissions, permissions ?? undefined, // TODO: useRBAC context should be typed and built differently
1665
+ // We are passing raw query as context to the hook so that it can
1666
+ // rely on the locale provided from DocumentRBAC for its permission calculations.
1667
+ rawQuery);
1668
+ const canCreateFields = !isLoading && allowedActions.canCreate ? extractAndDedupeFields(contentTypePermissions.create) : [];
1669
+ const canReadFields = !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];
1670
+ const canUpdateFields = !isLoading && allowedActions.canUpdate ? extractAndDedupeFields(contentTypePermissions.update) : [];
1671
+ /**
1672
+ * @description Checks if the user can perform an action on a field based on the field names
1673
+ * provided as the second argument.
1674
+ */ const canUserAction = React.useCallback((fieldName, fieldsUserCanAction, fieldType)=>{
1675
+ const name = removeNumericalStrings(fieldName.split('.'));
1676
+ const componentFieldNames = fieldsUserCanAction// filter out fields that aren't components (components are dot separated)
1677
+ .filter((field)=>field.split('.').length > 1);
1678
+ if (fieldType === 'component') {
1679
+ // check if the field name is within any of those arrays
1680
+ return componentFieldNames.some((field)=>{
1681
+ return field.includes(name.join('.'));
1682
+ });
1683
+ }
1684
+ /**
1685
+ * The field is within a component.
1686
+ */ if (name.length > 1) {
1687
+ return componentFieldNames.includes(name.join('.'));
1688
+ }
1689
+ /**
1690
+ * just a regular field
1691
+ */ return fieldsUserCanAction.includes(fieldName);
1692
+ }, []);
1693
+ if (isLoading) {
1694
+ return /*#__PURE__*/ jsx(Page.Loading, {});
1695
+ }
1696
+ return /*#__PURE__*/ jsx(DocumentRBACProvider, {
1697
+ isLoading: isLoading,
1698
+ canCreateFields: canCreateFields,
1699
+ canReadFields: canReadFields,
1700
+ canUpdateFields: canUpdateFields,
1701
+ canUserAction: canUserAction,
1702
+ ...allowedActions,
1703
+ children: children
1704
+ });
1705
+ };
1706
+ /**
1707
+ * @internal it's really small, but it's used three times in a row and DRY for something this straight forward.
1708
+ */ const extractAndDedupeFields = (permissions = [])=>permissions.flatMap((permission)=>permission.properties?.fields).filter((field, index, arr)=>arr.indexOf(field) === index && typeof field === 'string');
1709
+ /**
1710
+ * @internal removes numerical strings from arrays.
1711
+ * @example
1712
+ * ```ts
1713
+ * const name = 'a.0.b';
1714
+ * const res = removeNumericalStrings(name.split('.'));
1715
+ * console.log(res); // ['a', 'b']
1716
+ * ```
1717
+ */ const removeNumericalStrings = (arr)=>arr.filter((item)=>isNaN(Number(item)));
1718
+
1680
1719
  const prefixPluginTranslations = (trad, pluginId)=>{
1681
1720
  return Object.keys(trad).reduce((acc, current)=>{
1682
1721
  acc[`${pluginId}.${current}`] = trad[current];
@@ -2232,7 +2271,7 @@ const DEFAULT_UNEXPECTED_ERROR_MSG = {
2232
2271
  };
2233
2272
  };
2234
2273
 
2235
- const ProtectedHistoryPage = /*#__PURE__*/ React.lazy(()=>import('./History-CD5uVchr.mjs').then((mod)=>({
2274
+ const ProtectedHistoryPage = /*#__PURE__*/ React.lazy(()=>import('./History-D06b9Z-W.mjs').then((mod)=>({
2236
2275
  default: mod.ProtectedHistoryPage
2237
2276
  })));
2238
2277
  /**
@@ -2248,7 +2287,7 @@ const ProtectedHistoryPage = /*#__PURE__*/ React.lazy(()=>import('./History-CD5u
2248
2287
  }
2249
2288
  ];
2250
2289
 
2251
- const ProtectedPreviewPage = /*#__PURE__*/ React.lazy(()=>import('./Preview-HqnNXn4S.mjs').then((mod)=>({
2290
+ const ProtectedPreviewPage = /*#__PURE__*/ React.lazy(()=>import('./Preview-D5k-M3hC.mjs').then((mod)=>({
2252
2291
  default: mod.ProtectedPreviewPage
2253
2292
  })));
2254
2293
  const routes$1 = [
@@ -2262,25 +2301,25 @@ const routes$1 = [
2262
2301
  }
2263
2302
  ];
2264
2303
 
2265
- const ProtectedEditViewPage = /*#__PURE__*/ lazy(()=>import('./EditViewPage-eTCSh2HB.mjs').then((mod)=>({
2304
+ const ProtectedEditViewPage = /*#__PURE__*/ lazy(()=>import('./EditViewPage-BN-tRpIl.mjs').then((mod)=>({
2266
2305
  default: mod.ProtectedEditViewPage
2267
2306
  })));
2268
- const ProtectedListViewPage = /*#__PURE__*/ lazy(()=>import('./ListViewPage-BBX-zSka.mjs').then((mod)=>({
2307
+ const ProtectedListViewPage = /*#__PURE__*/ lazy(()=>import('./ListViewPage-CA5MkiUV.mjs').then((mod)=>({
2269
2308
  default: mod.ProtectedListViewPage
2270
2309
  })));
2271
- const ProtectedListConfiguration = /*#__PURE__*/ lazy(()=>import('./ListConfigurationPage-Eo8txFp0.mjs').then((mod)=>({
2310
+ const ProtectedListConfiguration = /*#__PURE__*/ lazy(()=>import('./ListConfigurationPage-C9bHjgDI.mjs').then((mod)=>({
2272
2311
  default: mod.ProtectedListConfiguration
2273
2312
  })));
2274
- const ProtectedEditConfigurationPage = /*#__PURE__*/ lazy(()=>import('./EditConfigurationPage-Dm16gciL.mjs').then((mod)=>({
2313
+ const ProtectedEditConfigurationPage = /*#__PURE__*/ lazy(()=>import('./EditConfigurationPage-Dqe4n8fp.mjs').then((mod)=>({
2275
2314
  default: mod.ProtectedEditConfigurationPage
2276
2315
  })));
2277
- const ProtectedComponentConfigurationPage = /*#__PURE__*/ lazy(()=>import('./ComponentConfigurationPage-Cqi5KqZa.mjs').then((mod)=>({
2316
+ const ProtectedComponentConfigurationPage = /*#__PURE__*/ lazy(()=>import('./ComponentConfigurationPage-jcxWDVZf.mjs').then((mod)=>({
2278
2317
  default: mod.ProtectedComponentConfigurationPage
2279
2318
  })));
2280
- const NoPermissions = /*#__PURE__*/ lazy(()=>import('./NoPermissionsPage-CuxrInhz.mjs').then((mod)=>({
2319
+ const NoPermissions = /*#__PURE__*/ lazy(()=>import('./NoPermissionsPage-Bd9W5bao.mjs').then((mod)=>({
2281
2320
  default: mod.NoPermissions
2282
2321
  })));
2283
- const NoContentType = /*#__PURE__*/ lazy(()=>import('./NoContentTypePage-C-rbOQO1.mjs').then((mod)=>({
2322
+ const NoContentType = /*#__PURE__*/ lazy(()=>import('./NoContentTypePage-BSrBZBqj.mjs').then((mod)=>({
2284
2323
  default: mod.NoContentType
2285
2324
  })));
2286
2325
  const CollectionTypePages = ()=>{
@@ -2667,8 +2706,8 @@ const transformData = (data)=>{
2667
2706
  };
2668
2707
  /* -------------------------------------------------------------------------------------------------
2669
2708
  * DocumentActionComponents
2670
- * -----------------------------------------------------------------------------------------------*/ const PublishAction$1 = ({ activeTab, documentId, model, collectionType, meta, document })=>{
2671
- const { schema } = useDoc();
2709
+ * -----------------------------------------------------------------------------------------------*/ const PublishAction$1 = ({ activeTab, documentId, model, collectionType, meta, document, onPreview })=>{
2710
+ const schema = useDocumentContext('PublishAction', (state)=>state.document.schema);
2672
2711
  const navigate = useNavigate();
2673
2712
  const { toggleNotification } = useNotification();
2674
2713
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
@@ -2691,6 +2730,8 @@ const transformData = (data)=>{
2691
2730
  const validate = useForm('PublishAction', (state)=>state.validate);
2692
2731
  const setErrors = useForm('PublishAction', (state)=>state.setErrors);
2693
2732
  const formValues = useForm('PublishAction', ({ values })=>values);
2733
+ const rootDocumentMeta = useDocumentContext('PublishAction', (state)=>state.rootDocumentMeta);
2734
+ const currentDocumentMeta = useDocumentContext('PublishAction', (state)=>state.meta);
2694
2735
  React.useEffect(()=>{
2695
2736
  if (isErrorDraftRelations) {
2696
2737
  toggleNotification({
@@ -2793,11 +2834,12 @@ const transformData = (data)=>{
2793
2834
  });
2794
2835
  return;
2795
2836
  }
2837
+ const isPublishingRelation = rootDocumentMeta.documentId !== currentDocumentMeta.documentId;
2796
2838
  const res = await publish({
2797
2839
  collectionType,
2798
2840
  model,
2799
2841
  documentId,
2800
- params
2842
+ params: isPublishingRelation ? currentDocumentMeta.params : params
2801
2843
  }, transformData(formValues));
2802
2844
  if ('data' in res && collectionType !== SINGLE_TYPES) {
2803
2845
  /**
@@ -2813,6 +2855,9 @@ const transformData = (data)=>{
2813
2855
  }
2814
2856
  } finally{
2815
2857
  setSubmitting(false);
2858
+ if (onPreview) {
2859
+ onPreview();
2860
+ }
2816
2861
  }
2817
2862
  };
2818
2863
  const totalDraftRelations = localCountOfDraftRelations + serverCountOfDraftRelations;
@@ -2824,7 +2869,8 @@ const transformData = (data)=>{
2824
2869
  loading: isLoading,
2825
2870
  position: [
2826
2871
  'panel',
2827
- 'preview'
2872
+ 'preview',
2873
+ 'relation-modal'
2828
2874
  ],
2829
2875
  /**
2830
2876
  * Disabled when:
@@ -2865,9 +2911,10 @@ const transformData = (data)=>{
2865
2911
  PublishAction$1.type = 'publish';
2866
2912
  PublishAction$1.position = [
2867
2913
  'panel',
2868
- 'preview'
2914
+ 'preview',
2915
+ 'relation-modal'
2869
2916
  ];
2870
- const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
2917
+ const UpdateAction = ({ activeTab, documentId, model, collectionType, onPreview })=>{
2871
2918
  const navigate = useNavigate();
2872
2919
  const { toggleNotification } = useNotification();
2873
2920
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
@@ -2886,6 +2933,8 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
2886
2933
  const validate = useForm('UpdateAction', (state)=>state.validate);
2887
2934
  const setErrors = useForm('UpdateAction', (state)=>state.setErrors);
2888
2935
  const resetForm = useForm('PublishAction', ({ resetForm })=>resetForm);
2936
+ const rootDocumentMeta = useDocumentContext('UpdateAction', (state)=>state.rootDocumentMeta);
2937
+ const currentDocumentMeta = useDocumentContext('UpdateAction', (state)=>state.meta);
2889
2938
  const handleUpdate = React.useCallback(async ()=>{
2890
2939
  setSubmitting(true);
2891
2940
  try {
@@ -2922,11 +2971,12 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
2922
2971
  setErrors(formatValidationErrors(res.error));
2923
2972
  }
2924
2973
  } else if (documentId || collectionType === SINGLE_TYPES) {
2974
+ const isEditingRelation = rootDocumentMeta.documentId !== currentDocumentMeta.documentId;
2925
2975
  const res = await update({
2926
2976
  collectionType,
2927
2977
  model,
2928
2978
  documentId,
2929
- params
2979
+ params: isEditingRelation ? currentDocumentMeta.params : params
2930
2980
  }, transformData(document));
2931
2981
  if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
2932
2982
  setErrors(formatValidationErrors(res.error));
@@ -2952,6 +3002,9 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
2952
3002
  }
2953
3003
  } finally{
2954
3004
  setSubmitting(false);
3005
+ if (onPreview) {
3006
+ onPreview();
3007
+ }
2955
3008
  }
2956
3009
  }, [
2957
3010
  clone,
@@ -3005,14 +3058,16 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
3005
3058
  onClick: handleUpdate,
3006
3059
  position: [
3007
3060
  'panel',
3008
- 'preview'
3061
+ 'preview',
3062
+ 'relation-modal'
3009
3063
  ]
3010
3064
  };
3011
3065
  };
3012
3066
  UpdateAction.type = 'update';
3013
3067
  UpdateAction.position = [
3014
3068
  'panel',
3015
- 'preview'
3069
+ 'preview',
3070
+ 'relation-modal'
3016
3071
  ];
3017
3072
  const UNPUBLISH_DRAFT_OPTIONS = {
3018
3073
  KEEP: 'keep',
@@ -3305,12 +3360,11 @@ const capitalise = (str)=>str.charAt(0).toUpperCase() + str.slice(1);
3305
3360
  size: size,
3306
3361
  variant: statusVariant,
3307
3362
  role: "status",
3308
- "aria-labelledby": "document-status",
3363
+ "aria-label": status,
3309
3364
  children: /*#__PURE__*/ jsx(Typography, {
3310
3365
  tag: "span",
3311
3366
  variant: "omega",
3312
3367
  fontWeight: "bold",
3313
- id: "document-status",
3314
3368
  children: formatMessage({
3315
3369
  id: `content-manager.containers.List.${status}`,
3316
3370
  defaultMessage: capitalise(status)
@@ -5289,7 +5343,7 @@ function __variableDynamicImportRuntime1__(path) {
5289
5343
  case './translations/ca.json': return import('./ca-DviY7mRj.mjs');
5290
5344
  case './translations/cs.json': return import('./cs-C7OSYFQ7.mjs');
5291
5345
  case './translations/de.json': return import('./de-5QRlDHyR.mjs');
5292
- case './translations/en.json': return import('./en-CImiNxXE.mjs');
5346
+ case './translations/en.json': return import('./en-DBP0Gaid.mjs');
5293
5347
  case './translations/es.json': return import('./es-DkoWSExG.mjs');
5294
5348
  case './translations/eu.json': return import('./eu-BG1xX7HK.mjs');
5295
5349
  case './translations/fr.json': return import('./fr-CFdRaRVj.mjs');
@@ -5343,7 +5397,7 @@ var index = {
5343
5397
  app.router.addRoute({
5344
5398
  path: 'content-manager/*',
5345
5399
  lazy: async ()=>{
5346
- const { Layout } = await import('./layout-BInXGFmo.mjs');
5400
+ const { Layout } = await import('./layout-LwPR2YFL.mjs');
5347
5401
  return {
5348
5402
  Component: Layout
5349
5403
  };
@@ -5378,5 +5432,5 @@ var index = {
5378
5432
  }
5379
5433
  };
5380
5434
 
5381
- export { useUpdateContentTypeConfigurationMutation as A, BulkActionsRenderer as B, COLLECTION_TYPES as C, DocumentStatus as D, ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD as E, extractContentTypeComponents as F, DEFAULT_SETTINGS as G, HOOKS as H, InjectionZone as I, convertEditLayoutToFieldLayouts as J, removeFieldsThatDontExistOnSchema as K, prepareTempKeys as L, useDocument as M, DocumentActionButton as N, useGetPreviewUrlQuery as O, Panels as P, index as Q, RelativeTime as R, SINGLE_TYPES as S, TableActions as T, useContentManagerContext as U, useDocumentActions as V, useGetInitialDataQuery as a, useGetAllContentTypeSettingsQuery as b, useDoc as c, buildValidParams as d, contentManagerApi as e, useDocumentRBAC as f, getTranslation as g, useDocumentLayout as h, createYupSchema as i, Header as j, PERMISSIONS as k, DocumentRBAC as l, useDocLayout as m, createDefaultForm as n, CLONE_PATH as o, useGetContentTypeConfigurationQuery as p, CREATOR_FIELDS as q, getMainField as r, setInitialData as s, transformDocument as t, useContentTypeSchema as u, getDisplayName as v, checkIfAttributeIsDisplayable as w, useGetAllDocumentsQuery as x, convertListLayoutToFieldLayouts as y, capitalise as z };
5382
- //# sourceMappingURL=index-CS_nLuw2.mjs.map
5435
+ export { checkIfAttributeIsDisplayable as A, useGetAllDocumentsQuery as B, COLLECTION_TYPES as C, DocumentStatus as D, BulkActionsRenderer as E, convertListLayoutToFieldLayouts as F, capitalise as G, HOOKS as H, InjectionZone as I, useUpdateContentTypeConfigurationMutation as J, ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD as K, extractContentTypeComponents as L, DEFAULT_SETTINGS as M, convertEditLayoutToFieldLayouts as N, removeFieldsThatDontExistOnSchema as O, PERMISSIONS as P, prepareTempKeys as Q, RelativeTime as R, SINGLE_TYPES as S, TableActions as T, useDocument as U, useGetPreviewUrlQuery as V, index as W, useContentManagerContext as X, useDocumentActions as Y, useGetInitialDataQuery as a, useGetAllContentTypeSettingsQuery as b, useDocumentContext as c, useDocumentLayout as d, createDefaultForm as e, DocumentRBAC as f, getTranslation as g, createYupSchema as h, DocumentActionButton as i, buildValidParams as j, useLazyGetDocumentQuery as k, contentManagerApi as l, useDoc as m, CLONE_PATH as n, useDocumentRBAC as o, useDocLayout as p, DocumentContextProvider as q, Header as r, setInitialData as s, transformDocument as t, useContentTypeSchema as u, Panels as v, useGetContentTypeConfigurationQuery as w, CREATOR_FIELDS as x, getMainField as y, getDisplayName as z };
5436
+ //# sourceMappingURL=index-C3_UywVP.mjs.map