@strapi/content-manager 0.0.0-experimental.a4161dd0ce4a6742074cbfc43734281e14a29baa → 0.0.0-experimental.a4cee39f4705cbd534afa66170f94f2f68e65b75
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-CDKJ1saA.js → ComponentConfigurationPage-BWB_urBW.js} +3 -3
- package/dist/admin/chunks/{ComponentConfigurationPage-CDKJ1saA.js.map → ComponentConfigurationPage-BWB_urBW.js.map} +1 -1
- package/dist/admin/chunks/{ComponentConfigurationPage-BdKTyTdt.mjs → ComponentConfigurationPage-Bw3SD5w3.mjs} +3 -3
- package/dist/admin/chunks/{ComponentConfigurationPage-BdKTyTdt.mjs.map → ComponentConfigurationPage-Bw3SD5w3.mjs.map} +1 -1
- package/dist/admin/chunks/{EditConfigurationPage-BW5fpvkO.js → EditConfigurationPage-BazMqkY5.js} +3 -3
- package/dist/admin/chunks/{EditConfigurationPage-BW5fpvkO.js.map → EditConfigurationPage-BazMqkY5.js.map} +1 -1
- package/dist/admin/chunks/{EditConfigurationPage-CaJ_CmJz.mjs → EditConfigurationPage-bP8cL5u8.mjs} +3 -3
- package/dist/admin/chunks/{EditConfigurationPage-CaJ_CmJz.mjs.map → EditConfigurationPage-bP8cL5u8.mjs.map} +1 -1
- package/dist/admin/chunks/{EditViewPage-BDekCXSy.mjs → EditViewPage-D3F0FbHV.mjs} +10 -7
- package/dist/admin/chunks/EditViewPage-D3F0FbHV.mjs.map +1 -0
- package/dist/admin/chunks/{EditViewPage-CNacGhk_.js → EditViewPage-DjB2aEuN.js} +11 -8
- package/dist/admin/chunks/EditViewPage-DjB2aEuN.js.map +1 -0
- package/dist/admin/chunks/{Form-2LZDIqUE.mjs → Form-CO-twQva.mjs} +2 -2
- package/dist/admin/chunks/{Form-2LZDIqUE.mjs.map → Form-CO-twQva.mjs.map} +1 -1
- package/dist/admin/chunks/{Form-CouVf26p.js → Form-Dyr8enar.js} +2 -2
- package/dist/admin/chunks/{Form-CouVf26p.js.map → Form-Dyr8enar.js.map} +1 -1
- package/dist/admin/chunks/{History-Cv3uNjvV.js → History-BsZCxc7e.js} +6 -6
- package/dist/admin/chunks/{History-Cv3uNjvV.js.map → History-BsZCxc7e.js.map} +1 -1
- package/dist/admin/chunks/{History-B7zZvnQF.mjs → History-DJ_pI0gL.mjs} +5 -5
- package/dist/admin/chunks/{History-B7zZvnQF.mjs.map → History-DJ_pI0gL.mjs.map} +1 -1
- package/dist/admin/chunks/{Input-DPH5j7Yl.js → Input-D-yPzkxz.js} +634 -848
- package/dist/admin/chunks/Input-D-yPzkxz.js.map +1 -0
- package/dist/admin/chunks/{Input-BPTHgeyh.mjs → Input-DWQWd5MK.mjs} +634 -847
- package/dist/admin/chunks/Input-DWQWd5MK.mjs.map +1 -0
- package/dist/admin/chunks/{ListConfigurationPage-FS8YuoKF.mjs → ListConfigurationPage-DlvGrjR_.mjs} +2 -2
- package/dist/admin/chunks/{ListConfigurationPage-FS8YuoKF.mjs.map → ListConfigurationPage-DlvGrjR_.mjs.map} +1 -1
- package/dist/admin/chunks/{ListConfigurationPage-Cj1tt01r.js → ListConfigurationPage-dHbA6tve.js} +2 -2
- package/dist/admin/chunks/{ListConfigurationPage-Cj1tt01r.js.map → ListConfigurationPage-dHbA6tve.js.map} +1 -1
- package/dist/admin/chunks/{ListViewPage-Xv5mmaJq.mjs → ListViewPage-DaxIL_8o.mjs} +3 -3
- package/dist/admin/chunks/{ListViewPage-Xv5mmaJq.mjs.map → ListViewPage-DaxIL_8o.mjs.map} +1 -1
- package/dist/admin/chunks/{ListViewPage-BCmGmK7N.js → ListViewPage-gsJS3ulI.js} +3 -3
- package/dist/admin/chunks/{ListViewPage-BCmGmK7N.js.map → ListViewPage-gsJS3ulI.js.map} +1 -1
- package/dist/admin/chunks/{NoContentTypePage-DpvfQfhU.js → NoContentTypePage-BD-VEn6M.js} +2 -2
- package/dist/admin/chunks/{NoContentTypePage-DpvfQfhU.js.map → NoContentTypePage-BD-VEn6M.js.map} +1 -1
- package/dist/admin/chunks/{NoContentTypePage-Bbqw5ZV9.mjs → NoContentTypePage-xzAGzlVY.mjs} +2 -2
- package/dist/admin/chunks/{NoContentTypePage-Bbqw5ZV9.mjs.map → NoContentTypePage-xzAGzlVY.mjs.map} +1 -1
- package/dist/admin/chunks/{NoPermissionsPage-igrvpcW0.mjs → NoPermissionsPage-BAKqxUK7.mjs} +2 -2
- package/dist/admin/chunks/{NoPermissionsPage-igrvpcW0.mjs.map → NoPermissionsPage-BAKqxUK7.mjs.map} +1 -1
- package/dist/admin/chunks/{NoPermissionsPage-BYEkhBnk.js → NoPermissionsPage-BmE5T_Mq.js} +2 -2
- package/dist/admin/chunks/{NoPermissionsPage-BYEkhBnk.js.map → NoPermissionsPage-BmE5T_Mq.js.map} +1 -1
- package/dist/admin/chunks/{Preview-DR-9uYxZ.mjs → Preview-Bz2ir5R5.mjs} +102 -182
- package/dist/admin/chunks/Preview-Bz2ir5R5.mjs.map +1 -0
- package/dist/admin/chunks/{Preview-DlRltQbE.js → Preview-CP4m2RBm.js} +101 -181
- package/dist/admin/chunks/Preview-CP4m2RBm.js.map +1 -0
- package/dist/admin/chunks/{en-DBP0Gaid.mjs → en-C2zEwS3-.mjs} +3 -1
- package/dist/admin/chunks/{en-DBP0Gaid.mjs.map → en-C2zEwS3-.mjs.map} +1 -1
- package/dist/admin/chunks/{en-CH__IC8g.js → en-G976DLsg.js} +3 -1
- package/dist/admin/chunks/{en-CH__IC8g.js.map → en-G976DLsg.js.map} +1 -1
- package/dist/admin/chunks/{index-CISU19oJ.js → index-CFa6xmgK.js} +197 -127
- package/dist/admin/chunks/index-CFa6xmgK.js.map +1 -0
- package/dist/admin/chunks/{index-C_e5v8f7.mjs → index-ZyDJIuQ1.mjs} +196 -129
- package/dist/admin/chunks/index-ZyDJIuQ1.mjs.map +1 -0
- package/dist/admin/chunks/{layout-CrqscUTi.mjs → layout-D2tOWWAq.mjs} +4 -4
- package/dist/admin/chunks/{layout-CrqscUTi.mjs.map → layout-D2tOWWAq.mjs.map} +1 -1
- package/dist/admin/chunks/{layout-CajJum-G.js → layout-XA97mHoN.js} +4 -4
- package/dist/admin/chunks/{layout-CajJum-G.js.map → layout-XA97mHoN.js.map} +1 -1
- package/dist/admin/chunks/uk-BtM6WnaE.mjs +313 -0
- package/dist/admin/chunks/uk-BtM6WnaE.mjs.map +1 -0
- package/dist/admin/chunks/uk-DB6OgySY.js +318 -0
- package/dist/admin/chunks/uk-DB6OgySY.js.map +1 -0
- package/dist/admin/chunks/{usePrev-CHotxABl.js → usePrev-BEkg-rKP.js} +2 -2
- package/dist/admin/chunks/{usePrev-CHotxABl.js.map → usePrev-BEkg-rKP.js.map} +1 -1
- package/dist/admin/chunks/{usePrev-DF3ZO0z4.mjs → usePrev-DAPoUN3D.mjs} +2 -2
- package/dist/admin/chunks/{usePrev-DF3ZO0z4.mjs.map → usePrev-DAPoUN3D.mjs.map} +1 -1
- 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 +13 -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 +5 -7
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +1 -2
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +3 -1
- package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +5 -2
- package/dist/admin/src/preview/components/PreviewHeader.d.ts +1 -2
- package/package.json +8 -8
- package/dist/admin/chunks/EditViewPage-BDekCXSy.mjs.map +0 -1
- package/dist/admin/chunks/EditViewPage-CNacGhk_.js.map +0 -1
- package/dist/admin/chunks/Input-BPTHgeyh.mjs.map +0 -1
- package/dist/admin/chunks/Input-DPH5j7Yl.js.map +0 -1
- package/dist/admin/chunks/Preview-DR-9uYxZ.mjs.map +0 -1
- package/dist/admin/chunks/Preview-DlRltQbE.js.map +0 -1
- package/dist/admin/chunks/index-CISU19oJ.js.map +0 -1
- package/dist/admin/chunks/index-C_e5v8f7.mjs.map +0 -1
- package/dist/admin/chunks/uk-B24MoTVg.js +0 -145
- package/dist/admin/chunks/uk-B24MoTVg.js.map +0 -1
- package/dist/admin/chunks/uk-Cpgmm7gE.mjs +0 -140
- package/dist/admin/chunks/uk-Cpgmm7gE.mjs.map +0 -1
- package/dist/admin/src/preview/components/PreviewContent.d.ts +0 -3
@@ -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,103 +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 or the model if it is passed as arg.
|
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, model })=>{
|
122
|
-
const { slug } = useParams();
|
123
|
-
if (!slug && !model) {
|
124
|
-
throw new Error('Cannot find the slug param in the URL or the model prop is not provided.');
|
125
|
-
}
|
126
|
-
const contentTypeUid = model ?? slug;
|
127
|
-
const [{ rawQuery }] = useQueryParams();
|
128
|
-
const userPermissions = useAuth('DocumentRBAC', (state)=>state.permissions);
|
129
|
-
const contentTypePermissions = React.useMemo(()=>{
|
130
|
-
const contentTypePermissions = userPermissions.filter((permission)=>permission.subject === contentTypeUid);
|
131
|
-
return contentTypePermissions.reduce((acc, permission)=>{
|
132
|
-
const [action] = permission.action.split('.').slice(-1);
|
133
|
-
return {
|
134
|
-
...acc,
|
135
|
-
[action]: [
|
136
|
-
permission
|
137
|
-
]
|
138
|
-
};
|
139
|
-
}, {});
|
140
|
-
}, [
|
141
|
-
contentTypeUid,
|
142
|
-
userPermissions
|
143
|
-
]);
|
144
|
-
const { isLoading, allowedActions } = useRBAC(contentTypePermissions, permissions ?? undefined, // TODO: useRBAC context should be typed and built differently
|
145
|
-
// We are passing raw query as context to the hook so that it can
|
146
|
-
// rely on the locale provided from DocumentRBAC for its permission calculations.
|
147
|
-
rawQuery);
|
148
|
-
const canCreateFields = !isLoading && allowedActions.canCreate ? extractAndDedupeFields(contentTypePermissions.create) : [];
|
149
|
-
const canReadFields = !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];
|
150
|
-
const canUpdateFields = !isLoading && allowedActions.canUpdate ? extractAndDedupeFields(contentTypePermissions.update) : [];
|
151
|
-
/**
|
152
|
-
* @description Checks if the user can perform an action on a field based on the field names
|
153
|
-
* provided as the second argument.
|
154
|
-
*/ const canUserAction = React.useCallback((fieldName, fieldsUserCanAction, fieldType)=>{
|
155
|
-
const name = removeNumericalStrings(fieldName.split('.'));
|
156
|
-
const componentFieldNames = fieldsUserCanAction// filter out fields that aren't components (components are dot separated)
|
157
|
-
.filter((field)=>field.split('.').length > 1);
|
158
|
-
if (fieldType === 'component') {
|
159
|
-
// check if the field name is within any of those arrays
|
160
|
-
return componentFieldNames.some((field)=>{
|
161
|
-
return field.includes(name.join('.'));
|
162
|
-
});
|
163
|
-
}
|
164
|
-
/**
|
165
|
-
* The field is within a component.
|
166
|
-
*/ if (name.length > 1) {
|
167
|
-
return componentFieldNames.includes(name.join('.'));
|
168
|
-
}
|
169
|
-
/**
|
170
|
-
* just a regular field
|
171
|
-
*/ return fieldsUserCanAction.includes(fieldName);
|
172
|
-
}, []);
|
173
|
-
if (isLoading) {
|
174
|
-
return /*#__PURE__*/ jsx(Page.Loading, {});
|
175
|
-
}
|
176
|
-
return /*#__PURE__*/ jsx(DocumentRBACProvider, {
|
177
|
-
isLoading: isLoading,
|
178
|
-
canCreateFields: canCreateFields,
|
179
|
-
canReadFields: canReadFields,
|
180
|
-
canUpdateFields: canUpdateFields,
|
181
|
-
canUserAction: canUserAction,
|
182
|
-
...allowedActions,
|
183
|
-
children: children
|
184
|
-
});
|
185
|
-
};
|
186
|
-
/**
|
187
|
-
* @internal it's really small, but it's used three times in a row and DRY for something this straight forward.
|
188
|
-
*/ const extractAndDedupeFields = (permissions = [])=>permissions.flatMap((permission)=>permission.properties?.fields).filter((field, index, arr)=>arr.indexOf(field) === index && typeof field === 'string');
|
189
|
-
/**
|
190
|
-
* @internal removes numerical strings from arrays.
|
191
|
-
* @example
|
192
|
-
* ```ts
|
193
|
-
* const name = 'a.0.b';
|
194
|
-
* const res = removeNumericalStrings(name.split('.'));
|
195
|
-
* console.log(res); // ['a', 'b']
|
196
|
-
* ```
|
197
|
-
*/ const removeNumericalStrings = (arr)=>arr.filter((item)=>isNaN(Number(item)));
|
198
|
-
|
199
102
|
const BLOCK_LIST_ATTRIBUTE_KEYS = [
|
200
103
|
'__component',
|
201
104
|
'__temp_key__'
|
@@ -1506,7 +1409,7 @@ const checkIfAttributeIsDisplayable = (attribute)=>{
|
|
1506
1409
|
const { toggleNotification } = useNotification();
|
1507
1410
|
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
|
1508
1411
|
const { formatMessage } = useIntl();
|
1509
|
-
const { currentData: data, isLoading: isLoadingDocument, isFetching: isFetchingDocument, error } = useGetDocumentQuery(args, {
|
1412
|
+
const { currentData: data, isLoading: isLoadingDocument, isFetching: isFetchingDocument, error, refetch } = useGetDocumentQuery(args, {
|
1510
1413
|
...opts,
|
1511
1414
|
skip: !args.documentId && args.collectionType !== SINGLE_TYPES || opts?.skip
|
1512
1415
|
});
|
@@ -1605,7 +1508,8 @@ const checkIfAttributeIsDisplayable = (attribute)=>{
|
|
1605
1508
|
schemas,
|
1606
1509
|
validate,
|
1607
1510
|
getTitle,
|
1608
|
-
getInitialFormValues
|
1511
|
+
getInitialFormValues,
|
1512
|
+
refetch
|
1609
1513
|
};
|
1610
1514
|
};
|
1611
1515
|
/* -------------------------------------------------------------------------------------------------
|
@@ -1678,6 +1582,144 @@ const checkIfAttributeIsDisplayable = (attribute)=>{
|
|
1678
1582
|
};
|
1679
1583
|
};
|
1680
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
|
+
* - rootDocumentMeta: information about the root level document (current page)
|
1597
|
+
*/ const DocumentContextProvider = ({ children, initialDocument, onPreview })=>{
|
1598
|
+
/**
|
1599
|
+
* Initialize with the "root" document and expose a setter method to change to
|
1600
|
+
* one of the root level document's relations.
|
1601
|
+
*/ const [currentDocumentMeta, changeDocument] = React.useState(initialDocument);
|
1602
|
+
const params = React.useMemo(()=>buildValidParams(currentDocumentMeta.params ?? {}), [
|
1603
|
+
currentDocumentMeta.params
|
1604
|
+
]);
|
1605
|
+
const document = useDocument({
|
1606
|
+
...currentDocumentMeta,
|
1607
|
+
params
|
1608
|
+
});
|
1609
|
+
const [documentHistory, setDocumentHistory] = React.useState([]);
|
1610
|
+
return /*#__PURE__*/ jsx(DocumentProvider, {
|
1611
|
+
changeDocument: changeDocument,
|
1612
|
+
document: document,
|
1613
|
+
rootDocumentMeta: {
|
1614
|
+
documentId: initialDocument.documentId,
|
1615
|
+
model: initialDocument.model,
|
1616
|
+
collectionType: initialDocument.collectionType
|
1617
|
+
},
|
1618
|
+
meta: currentDocumentMeta,
|
1619
|
+
documentHistory: documentHistory,
|
1620
|
+
setDocumentHistory: setDocumentHistory,
|
1621
|
+
onPreview: onPreview,
|
1622
|
+
children: children
|
1623
|
+
});
|
1624
|
+
};
|
1625
|
+
|
1626
|
+
const [DocumentRBACProvider, useDocumentRBAC] = createContext('DocumentRBAC', {
|
1627
|
+
canCreate: false,
|
1628
|
+
canCreateFields: [],
|
1629
|
+
canDelete: false,
|
1630
|
+
canPublish: false,
|
1631
|
+
canRead: false,
|
1632
|
+
canReadFields: [],
|
1633
|
+
canUpdate: false,
|
1634
|
+
canUpdateFields: [],
|
1635
|
+
canUserAction: ()=>false,
|
1636
|
+
isLoading: false
|
1637
|
+
});
|
1638
|
+
/**
|
1639
|
+
* @internal This component is not meant to be used outside of the Content Manager plugin.
|
1640
|
+
* 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.
|
1641
|
+
* If you do use the hook outside of the context, we default to `false` for all actions.
|
1642
|
+
*
|
1643
|
+
* It then creates an list of `can{Action}` that are passed to the context for consumption
|
1644
|
+
* within the app to enforce RBAC.
|
1645
|
+
*/ const DocumentRBAC = ({ children, permissions, model })=>{
|
1646
|
+
const { slug } = useParams();
|
1647
|
+
if (!slug && !model) {
|
1648
|
+
throw new Error('Cannot find the slug param in the URL or the model prop is not provided.');
|
1649
|
+
}
|
1650
|
+
const contentTypeUid = model ?? slug;
|
1651
|
+
const [{ rawQuery }] = useQueryParams();
|
1652
|
+
const userPermissions = useAuth('DocumentRBAC', (state)=>state.permissions);
|
1653
|
+
const contentTypePermissions = React.useMemo(()=>{
|
1654
|
+
const contentTypePermissions = userPermissions.filter((permission)=>permission.subject === contentTypeUid);
|
1655
|
+
return contentTypePermissions.reduce((acc, permission)=>{
|
1656
|
+
const [action] = permission.action.split('.').slice(-1);
|
1657
|
+
return {
|
1658
|
+
...acc,
|
1659
|
+
[action]: [
|
1660
|
+
permission
|
1661
|
+
]
|
1662
|
+
};
|
1663
|
+
}, {});
|
1664
|
+
}, [
|
1665
|
+
contentTypeUid,
|
1666
|
+
userPermissions
|
1667
|
+
]);
|
1668
|
+
const { isLoading, allowedActions } = useRBAC(contentTypePermissions, permissions ?? undefined, // TODO: useRBAC context should be typed and built differently
|
1669
|
+
// We are passing raw query as context to the hook so that it can
|
1670
|
+
// rely on the locale provided from DocumentRBAC for its permission calculations.
|
1671
|
+
rawQuery);
|
1672
|
+
const canCreateFields = !isLoading && allowedActions.canCreate ? extractAndDedupeFields(contentTypePermissions.create) : [];
|
1673
|
+
const canReadFields = !isLoading && allowedActions.canRead ? extractAndDedupeFields(contentTypePermissions.read) : [];
|
1674
|
+
const canUpdateFields = !isLoading && allowedActions.canUpdate ? extractAndDedupeFields(contentTypePermissions.update) : [];
|
1675
|
+
/**
|
1676
|
+
* @description Checks if the user can perform an action on a field based on the field names
|
1677
|
+
* provided as the second argument.
|
1678
|
+
*/ const canUserAction = React.useCallback((fieldName, fieldsUserCanAction, fieldType)=>{
|
1679
|
+
const name = removeNumericalStrings(fieldName.split('.'));
|
1680
|
+
const componentFieldNames = fieldsUserCanAction// filter out fields that aren't components (components are dot separated)
|
1681
|
+
.filter((field)=>field.split('.').length > 1);
|
1682
|
+
if (fieldType === 'component') {
|
1683
|
+
// check if the field name is within any of those arrays
|
1684
|
+
return componentFieldNames.some((field)=>{
|
1685
|
+
return field.includes(name.join('.'));
|
1686
|
+
});
|
1687
|
+
}
|
1688
|
+
/**
|
1689
|
+
* The field is within a component.
|
1690
|
+
*/ if (name.length > 1) {
|
1691
|
+
return componentFieldNames.includes(name.join('.'));
|
1692
|
+
}
|
1693
|
+
/**
|
1694
|
+
* just a regular field
|
1695
|
+
*/ return fieldsUserCanAction.includes(fieldName);
|
1696
|
+
}, []);
|
1697
|
+
if (isLoading) {
|
1698
|
+
return /*#__PURE__*/ jsx(Page.Loading, {});
|
1699
|
+
}
|
1700
|
+
return /*#__PURE__*/ jsx(DocumentRBACProvider, {
|
1701
|
+
isLoading: isLoading,
|
1702
|
+
canCreateFields: canCreateFields,
|
1703
|
+
canReadFields: canReadFields,
|
1704
|
+
canUpdateFields: canUpdateFields,
|
1705
|
+
canUserAction: canUserAction,
|
1706
|
+
...allowedActions,
|
1707
|
+
children: children
|
1708
|
+
});
|
1709
|
+
};
|
1710
|
+
/**
|
1711
|
+
* @internal it's really small, but it's used three times in a row and DRY for something this straight forward.
|
1712
|
+
*/ const extractAndDedupeFields = (permissions = [])=>permissions.flatMap((permission)=>permission.properties?.fields).filter((field, index, arr)=>arr.indexOf(field) === index && typeof field === 'string');
|
1713
|
+
/**
|
1714
|
+
* @internal removes numerical strings from arrays.
|
1715
|
+
* @example
|
1716
|
+
* ```ts
|
1717
|
+
* const name = 'a.0.b';
|
1718
|
+
* const res = removeNumericalStrings(name.split('.'));
|
1719
|
+
* console.log(res); // ['a', 'b']
|
1720
|
+
* ```
|
1721
|
+
*/ const removeNumericalStrings = (arr)=>arr.filter((item)=>isNaN(Number(item)));
|
1722
|
+
|
1681
1723
|
const prefixPluginTranslations = (trad, pluginId)=>{
|
1682
1724
|
return Object.keys(trad).reduce((acc, current)=>{
|
1683
1725
|
acc[`${pluginId}.${current}`] = trad[current];
|
@@ -1850,7 +1892,9 @@ const DEFAULT_UNEXPECTED_ERROR_MSG = {
|
|
1850
1892
|
const [publishDocument, { isLoading: isPublishing }] = usePublishDocumentMutation();
|
1851
1893
|
const publish = React.useCallback(async ({ collectionType, model, documentId, params }, data)=>{
|
1852
1894
|
try {
|
1853
|
-
trackUsage('willPublishEntry'
|
1895
|
+
trackUsage('willPublishEntry', {
|
1896
|
+
documentId
|
1897
|
+
});
|
1854
1898
|
const res = await publishDocument({
|
1855
1899
|
collectionType,
|
1856
1900
|
model,
|
@@ -1867,7 +1911,9 @@ const DEFAULT_UNEXPECTED_ERROR_MSG = {
|
|
1867
1911
|
error: res.error
|
1868
1912
|
};
|
1869
1913
|
}
|
1870
|
-
trackUsage('didPublishEntry'
|
1914
|
+
trackUsage('didPublishEntry', {
|
1915
|
+
documentId
|
1916
|
+
});
|
1871
1917
|
toggleNotification({
|
1872
1918
|
type: 'success',
|
1873
1919
|
message: formatMessage({
|
@@ -1954,7 +2000,10 @@ const DEFAULT_UNEXPECTED_ERROR_MSG = {
|
|
1954
2000
|
error: res.error
|
1955
2001
|
};
|
1956
2002
|
}
|
1957
|
-
trackUsage('didEditEntry',
|
2003
|
+
trackUsage('didEditEntry', {
|
2004
|
+
...trackerProperty,
|
2005
|
+
documentId: res.data.data.documentId
|
2006
|
+
});
|
1958
2007
|
toggleNotification({
|
1959
2008
|
type: 'success',
|
1960
2009
|
message: formatMessage({
|
@@ -2090,7 +2139,10 @@ const DEFAULT_UNEXPECTED_ERROR_MSG = {
|
|
2090
2139
|
error: res.error
|
2091
2140
|
};
|
2092
2141
|
}
|
2093
|
-
trackUsage('didCreateEntry',
|
2142
|
+
trackUsage('didCreateEntry', {
|
2143
|
+
...trackerProperty,
|
2144
|
+
documentId: res.data.data.documentId
|
2145
|
+
});
|
2094
2146
|
toggleNotification({
|
2095
2147
|
type: 'success',
|
2096
2148
|
message: formatMessage({
|
@@ -2233,7 +2285,7 @@ const DEFAULT_UNEXPECTED_ERROR_MSG = {
|
|
2233
2285
|
};
|
2234
2286
|
};
|
2235
2287
|
|
2236
|
-
const ProtectedHistoryPage = /*#__PURE__*/ React.lazy(()=>import('./History-
|
2288
|
+
const ProtectedHistoryPage = /*#__PURE__*/ React.lazy(()=>import('./History-DJ_pI0gL.mjs').then((mod)=>({
|
2237
2289
|
default: mod.ProtectedHistoryPage
|
2238
2290
|
})));
|
2239
2291
|
/**
|
@@ -2249,7 +2301,7 @@ const ProtectedHistoryPage = /*#__PURE__*/ React.lazy(()=>import('./History-B7zZ
|
|
2249
2301
|
}
|
2250
2302
|
];
|
2251
2303
|
|
2252
|
-
const ProtectedPreviewPage = /*#__PURE__*/ React.lazy(()=>import('./Preview-
|
2304
|
+
const ProtectedPreviewPage = /*#__PURE__*/ React.lazy(()=>import('./Preview-Bz2ir5R5.mjs').then((mod)=>({
|
2253
2305
|
default: mod.ProtectedPreviewPage
|
2254
2306
|
})));
|
2255
2307
|
const routes$1 = [
|
@@ -2263,25 +2315,25 @@ const routes$1 = [
|
|
2263
2315
|
}
|
2264
2316
|
];
|
2265
2317
|
|
2266
|
-
const ProtectedEditViewPage = /*#__PURE__*/ lazy(()=>import('./EditViewPage-
|
2318
|
+
const ProtectedEditViewPage = /*#__PURE__*/ lazy(()=>import('./EditViewPage-D3F0FbHV.mjs').then((mod)=>({
|
2267
2319
|
default: mod.ProtectedEditViewPage
|
2268
2320
|
})));
|
2269
|
-
const ProtectedListViewPage = /*#__PURE__*/ lazy(()=>import('./ListViewPage-
|
2321
|
+
const ProtectedListViewPage = /*#__PURE__*/ lazy(()=>import('./ListViewPage-DaxIL_8o.mjs').then((mod)=>({
|
2270
2322
|
default: mod.ProtectedListViewPage
|
2271
2323
|
})));
|
2272
|
-
const ProtectedListConfiguration = /*#__PURE__*/ lazy(()=>import('./ListConfigurationPage-
|
2324
|
+
const ProtectedListConfiguration = /*#__PURE__*/ lazy(()=>import('./ListConfigurationPage-DlvGrjR_.mjs').then((mod)=>({
|
2273
2325
|
default: mod.ProtectedListConfiguration
|
2274
2326
|
})));
|
2275
|
-
const ProtectedEditConfigurationPage = /*#__PURE__*/ lazy(()=>import('./EditConfigurationPage-
|
2327
|
+
const ProtectedEditConfigurationPage = /*#__PURE__*/ lazy(()=>import('./EditConfigurationPage-bP8cL5u8.mjs').then((mod)=>({
|
2276
2328
|
default: mod.ProtectedEditConfigurationPage
|
2277
2329
|
})));
|
2278
|
-
const ProtectedComponentConfigurationPage = /*#__PURE__*/ lazy(()=>import('./ComponentConfigurationPage-
|
2330
|
+
const ProtectedComponentConfigurationPage = /*#__PURE__*/ lazy(()=>import('./ComponentConfigurationPage-Bw3SD5w3.mjs').then((mod)=>({
|
2279
2331
|
default: mod.ProtectedComponentConfigurationPage
|
2280
2332
|
})));
|
2281
|
-
const NoPermissions = /*#__PURE__*/ lazy(()=>import('./NoPermissionsPage-
|
2333
|
+
const NoPermissions = /*#__PURE__*/ lazy(()=>import('./NoPermissionsPage-BAKqxUK7.mjs').then((mod)=>({
|
2282
2334
|
default: mod.NoPermissions
|
2283
2335
|
})));
|
2284
|
-
const NoContentType = /*#__PURE__*/ lazy(()=>import('./NoContentTypePage-
|
2336
|
+
const NoContentType = /*#__PURE__*/ lazy(()=>import('./NoContentTypePage-xzAGzlVY.mjs').then((mod)=>({
|
2285
2337
|
default: mod.NoContentType
|
2286
2338
|
})));
|
2287
2339
|
const CollectionTypePages = ()=>{
|
@@ -2668,8 +2720,8 @@ const transformData = (data)=>{
|
|
2668
2720
|
};
|
2669
2721
|
/* -------------------------------------------------------------------------------------------------
|
2670
2722
|
* DocumentActionComponents
|
2671
|
-
* -----------------------------------------------------------------------------------------------*/ const PublishAction$1 = ({ activeTab, documentId, model, collectionType, meta, document })=>{
|
2672
|
-
const
|
2723
|
+
* -----------------------------------------------------------------------------------------------*/ const PublishAction$1 = ({ activeTab, documentId, model, collectionType, meta, document, onPreview })=>{
|
2724
|
+
const schema = useDocumentContext('PublishAction', (state)=>state.document.schema);
|
2673
2725
|
const navigate = useNavigate();
|
2674
2726
|
const { toggleNotification } = useNotification();
|
2675
2727
|
const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
|
@@ -2692,6 +2744,8 @@ const transformData = (data)=>{
|
|
2692
2744
|
const validate = useForm('PublishAction', (state)=>state.validate);
|
2693
2745
|
const setErrors = useForm('PublishAction', (state)=>state.setErrors);
|
2694
2746
|
const formValues = useForm('PublishAction', ({ values })=>values);
|
2747
|
+
const rootDocumentMeta = useDocumentContext('PublishAction', (state)=>state.rootDocumentMeta);
|
2748
|
+
const currentDocumentMeta = useDocumentContext('PublishAction', (state)=>state.meta);
|
2695
2749
|
React.useEffect(()=>{
|
2696
2750
|
if (isErrorDraftRelations) {
|
2697
2751
|
toggleNotification({
|
@@ -2794,11 +2848,12 @@ const transformData = (data)=>{
|
|
2794
2848
|
});
|
2795
2849
|
return;
|
2796
2850
|
}
|
2851
|
+
const isPublishingRelation = rootDocumentMeta.documentId !== currentDocumentMeta.documentId;
|
2797
2852
|
const res = await publish({
|
2798
2853
|
collectionType,
|
2799
2854
|
model,
|
2800
2855
|
documentId,
|
2801
|
-
params
|
2856
|
+
params: isPublishingRelation ? currentDocumentMeta.params : params
|
2802
2857
|
}, transformData(formValues));
|
2803
2858
|
if ('data' in res && collectionType !== SINGLE_TYPES) {
|
2804
2859
|
/**
|
@@ -2814,6 +2869,9 @@ const transformData = (data)=>{
|
|
2814
2869
|
}
|
2815
2870
|
} finally{
|
2816
2871
|
setSubmitting(false);
|
2872
|
+
if (onPreview) {
|
2873
|
+
onPreview();
|
2874
|
+
}
|
2817
2875
|
}
|
2818
2876
|
};
|
2819
2877
|
const totalDraftRelations = localCountOfDraftRelations + serverCountOfDraftRelations;
|
@@ -2825,7 +2883,8 @@ const transformData = (data)=>{
|
|
2825
2883
|
loading: isLoading,
|
2826
2884
|
position: [
|
2827
2885
|
'panel',
|
2828
|
-
'preview'
|
2886
|
+
'preview',
|
2887
|
+
'relation-modal'
|
2829
2888
|
],
|
2830
2889
|
/**
|
2831
2890
|
* Disabled when:
|
@@ -2866,9 +2925,10 @@ const transformData = (data)=>{
|
|
2866
2925
|
PublishAction$1.type = 'publish';
|
2867
2926
|
PublishAction$1.position = [
|
2868
2927
|
'panel',
|
2869
|
-
'preview'
|
2928
|
+
'preview',
|
2929
|
+
'relation-modal'
|
2870
2930
|
];
|
2871
|
-
const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
|
2931
|
+
const UpdateAction = ({ activeTab, documentId, model, collectionType, onPreview })=>{
|
2872
2932
|
const navigate = useNavigate();
|
2873
2933
|
const { toggleNotification } = useNotification();
|
2874
2934
|
const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
|
@@ -2887,6 +2947,8 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
|
|
2887
2947
|
const validate = useForm('UpdateAction', (state)=>state.validate);
|
2888
2948
|
const setErrors = useForm('UpdateAction', (state)=>state.setErrors);
|
2889
2949
|
const resetForm = useForm('PublishAction', ({ resetForm })=>resetForm);
|
2950
|
+
const rootDocumentMeta = useDocumentContext('UpdateAction', (state)=>state.rootDocumentMeta);
|
2951
|
+
const currentDocumentMeta = useDocumentContext('UpdateAction', (state)=>state.meta);
|
2890
2952
|
const handleUpdate = React.useCallback(async ()=>{
|
2891
2953
|
setSubmitting(true);
|
2892
2954
|
try {
|
@@ -2923,11 +2985,12 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
|
|
2923
2985
|
setErrors(formatValidationErrors(res.error));
|
2924
2986
|
}
|
2925
2987
|
} else if (documentId || collectionType === SINGLE_TYPES) {
|
2988
|
+
const isEditingRelation = rootDocumentMeta.documentId !== currentDocumentMeta.documentId;
|
2926
2989
|
const res = await update({
|
2927
2990
|
collectionType,
|
2928
2991
|
model,
|
2929
2992
|
documentId,
|
2930
|
-
params
|
2993
|
+
params: isEditingRelation ? currentDocumentMeta.params : params
|
2931
2994
|
}, transformData(document));
|
2932
2995
|
if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {
|
2933
2996
|
setErrors(formatValidationErrors(res.error));
|
@@ -2953,6 +3016,9 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
|
|
2953
3016
|
}
|
2954
3017
|
} finally{
|
2955
3018
|
setSubmitting(false);
|
3019
|
+
if (onPreview) {
|
3020
|
+
onPreview();
|
3021
|
+
}
|
2956
3022
|
}
|
2957
3023
|
}, [
|
2958
3024
|
clone,
|
@@ -3006,14 +3072,16 @@ const UpdateAction = ({ activeTab, documentId, model, collectionType })=>{
|
|
3006
3072
|
onClick: handleUpdate,
|
3007
3073
|
position: [
|
3008
3074
|
'panel',
|
3009
|
-
'preview'
|
3075
|
+
'preview',
|
3076
|
+
'relation-modal'
|
3010
3077
|
]
|
3011
3078
|
};
|
3012
3079
|
};
|
3013
3080
|
UpdateAction.type = 'update';
|
3014
3081
|
UpdateAction.position = [
|
3015
3082
|
'panel',
|
3016
|
-
'preview'
|
3083
|
+
'preview',
|
3084
|
+
'relation-modal'
|
3017
3085
|
];
|
3018
3086
|
const UNPUBLISH_DRAFT_OPTIONS = {
|
3019
3087
|
KEEP: 'keep',
|
@@ -3306,12 +3374,11 @@ const capitalise = (str)=>str.charAt(0).toUpperCase() + str.slice(1);
|
|
3306
3374
|
size: size,
|
3307
3375
|
variant: statusVariant,
|
3308
3376
|
role: "status",
|
3309
|
-
"aria-
|
3377
|
+
"aria-label": status,
|
3310
3378
|
children: /*#__PURE__*/ jsx(Typography, {
|
3311
3379
|
tag: "span",
|
3312
3380
|
variant: "omega",
|
3313
3381
|
fontWeight: "bold",
|
3314
|
-
id: "document-status",
|
3315
3382
|
children: formatMessage({
|
3316
3383
|
id: `content-manager.containers.List.${status}`,
|
3317
3384
|
defaultMessage: capitalise(status)
|
@@ -5290,7 +5357,7 @@ function __variableDynamicImportRuntime1__(path) {
|
|
5290
5357
|
case './translations/ca.json': return import('./ca-DviY7mRj.mjs');
|
5291
5358
|
case './translations/cs.json': return import('./cs-C7OSYFQ7.mjs');
|
5292
5359
|
case './translations/de.json': return import('./de-5QRlDHyR.mjs');
|
5293
|
-
case './translations/en.json': return import('./en-
|
5360
|
+
case './translations/en.json': return import('./en-C2zEwS3-.mjs');
|
5294
5361
|
case './translations/es.json': return import('./es-DkoWSExG.mjs');
|
5295
5362
|
case './translations/eu.json': return import('./eu-BG1xX7HK.mjs');
|
5296
5363
|
case './translations/fr.json': return import('./fr-CFdRaRVj.mjs');
|
@@ -5313,7 +5380,7 @@ function __variableDynamicImportRuntime1__(path) {
|
|
5313
5380
|
case './translations/sv.json': return import('./sv-cq4ZrQRd.mjs');
|
5314
5381
|
case './translations/th.json': return import('./th-mUH7hEtc.mjs');
|
5315
5382
|
case './translations/tr.json': return import('./tr-Yt38daxh.mjs');
|
5316
|
-
case './translations/uk.json': return import('./uk-
|
5383
|
+
case './translations/uk.json': return import('./uk-BtM6WnaE.mjs');
|
5317
5384
|
case './translations/vi.json': return import('./vi-CvBGlTjr.mjs');
|
5318
5385
|
case './translations/zh-Hans.json': return import('./zh-Hans-CI0HKio3.mjs');
|
5319
5386
|
case './translations/zh.json': return import('./zh-BmF-sHaT.mjs');
|
@@ -5344,7 +5411,7 @@ var index = {
|
|
5344
5411
|
app.router.addRoute({
|
5345
5412
|
path: 'content-manager/*',
|
5346
5413
|
lazy: async ()=>{
|
5347
|
-
const { Layout } = await import('./layout-
|
5414
|
+
const { Layout } = await import('./layout-D2tOWWAq.mjs');
|
5348
5415
|
return {
|
5349
5416
|
Component: Layout
|
5350
5417
|
};
|
@@ -5379,5 +5446,5 @@ var index = {
|
|
5379
5446
|
}
|
5380
5447
|
};
|
5381
5448
|
|
5382
|
-
export {
|
5383
|
-
//# sourceMappingURL=index-
|
5449
|
+
export { useGetAllDocumentsQuery as A, BulkActionsRenderer as B, COLLECTION_TYPES as C, DocumentStatus as D, convertListLayoutToFieldLayouts as E, capitalise as F, useDocLayout 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, useLazyGetDocumentQuery as f, getTranslation as g, createYupSchema as h, DocumentRBAC as i, DocumentActionButton as j, buildValidParams as k, contentManagerApi as l, useDoc as m, CLONE_PATH as n, useDocumentRBAC as o, DocumentContextProvider as p, Header as q, Panels as r, setInitialData as s, transformDocument as t, useContentTypeSchema as u, useGetContentTypeConfigurationQuery as v, CREATOR_FIELDS as w, getMainField as x, getDisplayName as y, checkIfAttributeIsDisplayable as z };
|
5450
|
+
//# sourceMappingURL=index-ZyDJIuQ1.mjs.map
|