@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.
- package/dist/admin/chunks/{ComponentConfigurationPage-Bn-SMKJG.js → ComponentConfigurationPage-DCsX9dT5.js} +5 -6
- package/dist/admin/chunks/{ComponentConfigurationPage-Bn-SMKJG.js.map → ComponentConfigurationPage-DCsX9dT5.js.map} +1 -1
- package/dist/admin/chunks/{ComponentConfigurationPage-Cqi5KqZa.mjs → ComponentConfigurationPage-jcxWDVZf.mjs} +5 -6
- package/dist/admin/chunks/{ComponentConfigurationPage-Cqi5KqZa.mjs.map → ComponentConfigurationPage-jcxWDVZf.mjs.map} +1 -1
- package/dist/admin/chunks/{EditConfigurationPage-CRxsqOhS.js → EditConfigurationPage-DPE54bv4.js} +5 -6
- package/dist/admin/chunks/{EditConfigurationPage-CRxsqOhS.js.map → EditConfigurationPage-DPE54bv4.js.map} +1 -1
- package/dist/admin/chunks/{EditConfigurationPage-Dm16gciL.mjs → EditConfigurationPage-Dqe4n8fp.mjs} +5 -6
- package/dist/admin/chunks/{EditConfigurationPage-Dm16gciL.mjs.map → EditConfigurationPage-Dqe4n8fp.mjs.map} +1 -1
- package/dist/admin/chunks/{EditViewPage-eTCSh2HB.mjs → EditViewPage-BN-tRpIl.mjs} +98 -94
- package/dist/admin/chunks/EditViewPage-BN-tRpIl.mjs.map +1 -0
- package/dist/admin/chunks/{EditViewPage-Dk8CeS40.js → EditViewPage-BuXES73t.js} +98 -94
- package/dist/admin/chunks/EditViewPage-BuXES73t.js.map +1 -0
- package/dist/admin/chunks/{Form-K_hq8zU4.mjs → Form-CgZ8ChAp.mjs} +3 -3
- package/dist/admin/chunks/{Form-K_hq8zU4.mjs.map → Form-CgZ8ChAp.mjs.map} +1 -1
- package/dist/admin/chunks/{Form-PB1sNax8.js → Form-Y-luFjWf.js} +5 -5
- package/dist/admin/chunks/{Form-PB1sNax8.js.map → Form-Y-luFjWf.js.map} +1 -1
- package/dist/admin/chunks/{History-CfsF-U-3.js → History-CpOv78Ft.js} +17 -13
- package/dist/admin/chunks/History-CpOv78Ft.js.map +1 -0
- package/dist/admin/chunks/{History-CD5uVchr.mjs → History-D06b9Z-W.mjs} +16 -12
- package/dist/admin/chunks/History-D06b9Z-W.mjs.map +1 -0
- package/dist/admin/chunks/{Input-grmHplxs.mjs → Input-DjZiwJwC.mjs} +1108 -47
- package/dist/admin/chunks/Input-DjZiwJwC.mjs.map +1 -0
- package/dist/admin/chunks/{Input-CU93J6dl.js → Input-_yWeQWev.js} +1121 -57
- package/dist/admin/chunks/Input-_yWeQWev.js.map +1 -0
- package/dist/admin/chunks/{ListConfigurationPage-Eo8txFp0.mjs → ListConfigurationPage-C9bHjgDI.mjs} +4 -5
- package/dist/admin/chunks/{ListConfigurationPage-Eo8txFp0.mjs.map → ListConfigurationPage-C9bHjgDI.mjs.map} +1 -1
- package/dist/admin/chunks/{ListConfigurationPage-nZti--Mw.js → ListConfigurationPage-dry2u2na.js} +6 -7
- package/dist/admin/chunks/{ListConfigurationPage-nZti--Mw.js.map → ListConfigurationPage-dry2u2na.js.map} +1 -1
- package/dist/admin/chunks/{ListViewPage-BBX-zSka.mjs → ListViewPage-CA5MkiUV.mjs} +3 -4
- package/dist/admin/chunks/{ListViewPage-BBX-zSka.mjs.map → ListViewPage-CA5MkiUV.mjs.map} +1 -1
- package/dist/admin/chunks/{ListViewPage-DQYvHCxn.js → ListViewPage-lg2Rqa6F.js} +7 -8
- package/dist/admin/chunks/{ListViewPage-DQYvHCxn.js.map → ListViewPage-lg2Rqa6F.js.map} +1 -1
- package/dist/admin/chunks/{NoContentTypePage-C-rbOQO1.mjs → NoContentTypePage-BSrBZBqj.mjs} +2 -2
- package/dist/admin/chunks/{NoContentTypePage-C-rbOQO1.mjs.map → NoContentTypePage-BSrBZBqj.mjs.map} +1 -1
- package/dist/admin/chunks/{NoContentTypePage-ChYgz3sN.js → NoContentTypePage-FT7uXIGM.js} +2 -2
- package/dist/admin/chunks/{NoContentTypePage-ChYgz3sN.js.map → NoContentTypePage-FT7uXIGM.js.map} +1 -1
- package/dist/admin/chunks/{NoPermissionsPage-CuxrInhz.mjs → NoPermissionsPage-Bd9W5bao.mjs} +2 -2
- package/dist/admin/chunks/{NoPermissionsPage-CuxrInhz.mjs.map → NoPermissionsPage-Bd9W5bao.mjs.map} +1 -1
- package/dist/admin/chunks/{NoPermissionsPage-H4SAlJeF.js → NoPermissionsPage-CMz3Dyqd.js} +2 -2
- package/dist/admin/chunks/{NoPermissionsPage-H4SAlJeF.js.map → NoPermissionsPage-CMz3Dyqd.js.map} +1 -1
- package/dist/admin/chunks/{Preview-HqnNXn4S.mjs → Preview-D5k-M3hC.mjs} +133 -125
- package/dist/admin/chunks/Preview-D5k-M3hC.mjs.map +1 -0
- package/dist/admin/chunks/{Preview-Bz2dgOiw.js → Preview-Dy1QMgx2.js} +131 -123
- package/dist/admin/chunks/Preview-Dy1QMgx2.js.map +1 -0
- package/dist/admin/chunks/{en-CLf4SuMQ.js → en-CH__IC8g.js} +2 -1
- package/dist/admin/chunks/{en-CLf4SuMQ.js.map → en-CH__IC8g.js.map} +1 -1
- package/dist/admin/chunks/{en-CImiNxXE.mjs → en-DBP0Gaid.mjs} +2 -1
- package/dist/admin/chunks/{en-CImiNxXE.mjs.map → en-DBP0Gaid.mjs.map} +1 -1
- package/dist/admin/chunks/{index-CS_nLuw2.mjs → index-C3_UywVP.mjs} +177 -123
- package/dist/admin/chunks/index-C3_UywVP.mjs.map +1 -0
- package/dist/admin/chunks/{index-DfX0uEQT.js → index-CCql3IuL.js} +178 -121
- package/dist/admin/chunks/index-CCql3IuL.js.map +1 -0
- package/dist/admin/chunks/{layout-B4Uk0v1z.js → layout-DPQGAHVR.js} +86 -13
- package/dist/admin/chunks/layout-DPQGAHVR.js.map +1 -0
- package/dist/admin/chunks/{layout-BInXGFmo.mjs → layout-LwPR2YFL.mjs} +78 -5
- package/dist/admin/chunks/layout-LwPR2YFL.mjs.map +1 -0
- package/dist/admin/chunks/{useDragAndDrop-gcqEJMnO.js → objects-BJTP843m.js} +73 -1
- package/dist/admin/chunks/objects-BJTP843m.js.map +1 -0
- package/dist/admin/chunks/{useDragAndDrop-HYwNDExe.mjs → objects-D2z-IJgu.mjs} +72 -2
- package/dist/admin/chunks/objects-D2z-IJgu.mjs.map +1 -0
- package/dist/admin/chunks/{relations-CwL0ThH9.mjs → usePrev-C5DWLlSW.mjs} +18 -4
- package/dist/admin/chunks/usePrev-C5DWLlSW.mjs.map +1 -0
- package/dist/admin/chunks/{relations-9C5dQI9e.js → usePrev-D8mtUeZf.js} +18 -2
- package/dist/admin/chunks/usePrev-D8mtUeZf.js.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/src/content-manager.d.ts +1 -0
- package/dist/admin/src/features/DocumentContext.d.ts +48 -0
- package/dist/admin/src/features/DocumentRBAC.d.ts +3 -2
- package/dist/admin/src/hooks/useDocument.d.ts +2 -0
- package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations/RelationModal.d.ts +7 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/{Relations.d.ts → Relations/Relations.d.ts} +9 -4
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +5 -2
- package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +3 -3
- package/dist/admin/src/preview/components/PreviewContent.d.ts +1 -2
- package/dist/admin/src/preview/pages/Preview.d.ts +2 -0
- package/package.json +5 -5
- package/dist/admin/chunks/EditViewPage-Dk8CeS40.js.map +0 -1
- package/dist/admin/chunks/EditViewPage-eTCSh2HB.mjs.map +0 -1
- package/dist/admin/chunks/History-CD5uVchr.mjs.map +0 -1
- package/dist/admin/chunks/History-CfsF-U-3.js.map +0 -1
- package/dist/admin/chunks/Input-CU93J6dl.js.map +0 -1
- package/dist/admin/chunks/Input-grmHplxs.mjs.map +0 -1
- package/dist/admin/chunks/Preview-Bz2dgOiw.js.map +0 -1
- package/dist/admin/chunks/Preview-HqnNXn4S.mjs.map +0 -1
- package/dist/admin/chunks/Relations-BMvL4yMN.mjs +0 -1291
- package/dist/admin/chunks/Relations-BMvL4yMN.mjs.map +0 -1
- package/dist/admin/chunks/Relations-CbCAt692.js +0 -1318
- package/dist/admin/chunks/Relations-CbCAt692.js.map +0 -1
- package/dist/admin/chunks/index-CS_nLuw2.mjs.map +0 -1
- package/dist/admin/chunks/index-DfX0uEQT.js.map +0 -1
- package/dist/admin/chunks/layout-B4Uk0v1z.js.map +0 -1
- package/dist/admin/chunks/layout-BInXGFmo.mjs.map +0 -1
- package/dist/admin/chunks/objects-C3EebVVe.js +0 -76
- package/dist/admin/chunks/objects-C3EebVVe.js.map +0 -1
- package/dist/admin/chunks/objects-wl73iEma.mjs +0 -73
- package/dist/admin/chunks/objects-wl73iEma.mjs.map +0 -1
- package/dist/admin/chunks/relations-9C5dQI9e.js.map +0 -1
- package/dist/admin/chunks/relations-CwL0ThH9.mjs.map +0 -1
- package/dist/admin/chunks/useDragAndDrop-HYwNDExe.mjs.map +0 -1
- package/dist/admin/chunks/useDragAndDrop-gcqEJMnO.js.map +0 -1
- package/dist/admin/chunks/usePrev-Bjw2dhmq.mjs +0 -18
- package/dist/admin/chunks/usePrev-Bjw2dhmq.mjs.map +0 -1
- package/dist/admin/chunks/usePrev-DIYl-IAL.js +0 -21
- 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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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
|
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-
|
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-
|
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-
|
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-
|
5506
|
+
//# sourceMappingURL=index-CCql3IuL.js.map
|