@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
@@ -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,
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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-
|
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
|
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-
|
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-
|
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-
|
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 {
|
5382
|
-
//# sourceMappingURL=index-
|
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
|