@strapi/content-manager 5.61.1 → 5.62.0
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/components/ConfigurationForm/Fields.js +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +3 -3
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/features/I18nSharedFieldsLock.js +54 -0
- package/dist/admin/features/I18nSharedFieldsLock.js.map +1 -0
- package/dist/admin/features/I18nSharedFieldsLock.mjs +31 -0
- package/dist/admin/features/I18nSharedFieldsLock.mjs.map +1 -0
- package/dist/admin/history/components/VersionInputRenderer.js +7 -2
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs +7 -3
- package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
- package/dist/admin/hooks/useContentManagerInitData.js +27 -8
- package/dist/admin/hooks/useContentManagerInitData.js.map +1 -1
- package/dist/admin/hooks/useContentManagerInitData.mjs +29 -10
- package/dist/admin/hooks/useContentManagerInitData.mjs.map +1 -1
- package/dist/admin/hooks/useDocument.js +11 -13
- package/dist/admin/hooks/useDocument.js.map +1 -1
- package/dist/admin/hooks/useDocument.mjs +11 -13
- package/dist/admin/hooks/useDocument.mjs.map +1 -1
- package/dist/admin/hooks/useI18nFieldLock.js +169 -0
- package/dist/admin/hooks/useI18nFieldLock.js.map +1 -0
- package/dist/admin/hooks/useI18nFieldLock.mjs +140 -0
- package/dist/admin/hooks/useI18nFieldLock.mjs.map +1 -0
- package/dist/admin/hooks/usePersistentQueryParams.js +16 -3
- package/dist/admin/hooks/usePersistentQueryParams.js.map +1 -1
- package/dist/admin/hooks/usePersistentQueryParams.mjs +16 -3
- package/dist/admin/hooks/usePersistentQueryParams.mjs.map +1 -1
- package/dist/admin/index.js +5 -0
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +2 -0
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/modules/app.js +8 -1
- package/dist/admin/modules/app.js.map +1 -1
- package/dist/admin/modules/app.mjs +8 -2
- package/dist/admin/modules/app.mjs.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.js +129 -127
- package/dist/admin/pages/EditView/EditViewPage.js.map +1 -1
- package/dist/admin/pages/EditView/EditViewPage.mjs +129 -127
- package/dist/admin/pages/EditView/EditViewPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.js +11 -4
- package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
- package/dist/admin/pages/EditView/components/DocumentActions.mjs +12 -5
- package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js +31 -21
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs +32 -22
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/EditorLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js +98 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs +96 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/AddComponentMenu.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js +1103 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs +1077 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/ComponentCopyModal.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js +211 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs +183 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/CopiedComponents.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js +84 -41
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs +86 -43
- package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +86 -20
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +89 -23
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +142 -22
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +143 -23
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js +402 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs +389 -0
- package/dist/admin/pages/EditView/components/FormInputs/Component/utils/componentCopy.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +84 -33
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +85 -34
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +5 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +17 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +18 -5
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +54 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +54 -6
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +11 -9
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +12 -10
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +66 -63
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +66 -63
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +7 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +7 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +14 -9
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +14 -9
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/forms.js +34 -0
- package/dist/admin/pages/EditView/utils/forms.js.map +1 -1
- package/dist/admin/pages/EditView/utils/forms.mjs +34 -1
- package/dist/admin/pages/EditView/utils/forms.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js +2 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs +2 -1
- package/dist/admin/pages/ListConfiguration/components/DraggableCard.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js +7 -6
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs +7 -6
- package/dist/admin/pages/ListConfiguration/components/EditFieldForm.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +11 -2
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +13 -4
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +15 -5
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +16 -7
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/preview/components/InputPopover.js +18 -8
- package/dist/admin/preview/components/InputPopover.js.map +1 -1
- package/dist/admin/preview/components/InputPopover.mjs +19 -9
- package/dist/admin/preview/components/InputPopover.mjs.map +1 -1
- package/dist/admin/preview/pages/Preview.js +5 -16
- package/dist/admin/preview/pages/Preview.js.map +1 -1
- package/dist/admin/preview/pages/Preview.mjs +5 -16
- package/dist/admin/preview/pages/Preview.mjs.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.js +2 -0
- package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
- package/dist/admin/preview/utils/fieldUtils.mjs +2 -1
- package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
- package/dist/admin/services/api.js +2 -1
- package/dist/admin/services/api.js.map +1 -1
- package/dist/admin/services/api.mjs +2 -1
- package/dist/admin/services/api.mjs.map +1 -1
- package/dist/admin/services/documents.js +21 -1
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +21 -2
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/services/relations.js +47 -1
- package/dist/admin/services/relations.js.map +1 -1
- package/dist/admin/services/relations.mjs +47 -2
- package/dist/admin/services/relations.mjs.map +1 -1
- package/dist/admin/src/exports.d.ts +2 -0
- package/dist/admin/src/features/I18nSharedFieldsLock.d.ts +22 -0
- package/dist/admin/src/history/components/VersionInputRenderer.d.ts +7 -1
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useI18nFieldLock.d.ts +61 -0
- package/dist/admin/src/modules/app.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/AddComponentMenu.d.ts +15 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/ComponentCopyModal.d.ts +58 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/CopiedComponents.d.ts +41 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Initializer.d.ts +7 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/NonRepeatable.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Repeatable.d.ts +2 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/utils/componentCopy.d.ts +115 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.d.ts +6 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.d.ts +2 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +5 -1
- package/dist/admin/src/pages/EditView/utils/forms.d.ts +13 -2
- package/dist/admin/src/pages/ListView/components/Filters.d.ts +12 -3
- package/dist/admin/src/preview/services/preview.d.ts +1 -1
- package/dist/admin/src/preview/utils/fieldUtils.d.ts +1 -0
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/components.d.ts +2 -2
- package/dist/admin/src/services/contentTypes.d.ts +3 -3
- package/dist/admin/src/services/documents.d.ts +25 -21
- package/dist/admin/src/services/homepage.d.ts +1 -1
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +5 -3
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/admin/translations/en.json.js +41 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +41 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/controllers/relations.js +4 -2
- package/dist/server/controllers/relations.js.map +1 -1
- package/dist/server/controllers/relations.mjs +4 -2
- package/dist/server/controllers/relations.mjs.map +1 -1
- package/dist/server/controllers/utils/metadata.js +3 -1
- package/dist/server/controllers/utils/metadata.js.map +1 -1
- package/dist/server/controllers/utils/metadata.mjs +3 -1
- package/dist/server/controllers/utils/metadata.mjs.map +1 -1
- package/dist/server/history/services/utils.js +3 -1
- package/dist/server/history/services/utils.js.map +1 -1
- package/dist/server/history/services/utils.mjs +3 -1
- package/dist/server/history/services/utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.js +14 -0
- package/dist/server/homepage/services/homepage-query-utils.js.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.mjs +14 -1
- package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage.js +1 -1
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +2 -2
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.js +1 -3
- package/dist/server/mcp/sanitizers/shape-relations.js.map +1 -1
- package/dist/server/mcp/sanitizers/shape-relations.mjs +1 -3
- package/dist/server/mcp/sanitizers/shape-relations.mjs.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.js +2 -1
- package/dist/server/mcp/schemas/output-schemas.js.map +1 -1
- package/dist/server/mcp/schemas/output-schemas.mjs +2 -1
- package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -1
- package/dist/server/services/document-manager.js +3 -2
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +3 -2
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/document-metadata.js +92 -4
- package/dist/server/services/document-metadata.js.map +1 -1
- package/dist/server/services/document-metadata.mjs +92 -4
- package/dist/server/services/document-metadata.mjs.map +1 -1
- package/dist/server/services/permission-checker.js +20 -8
- package/dist/server/services/permission-checker.js.map +1 -1
- package/dist/server/services/permission-checker.mjs +20 -8
- package/dist/server/services/permission-checker.mjs.map +1 -1
- package/dist/server/services/uid.js +2 -1
- package/dist/server/services/uid.js.map +1 -1
- package/dist/server/services/uid.mjs +2 -1
- package/dist/server/services/uid.mjs.map +1 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
- package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts +6 -0
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +21 -7
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/sanitizers/shape-relations.d.ts.map +1 -1
- package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts +5 -1
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +21 -7
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permission-checker.d.ts +6 -5
- package/dist/server/src/services/permission-checker.d.ts.map +1 -1
- package/dist/server/src/services/uid.d.ts.map +1 -1
- package/dist/shared/contracts/collection-types.d.ts +7 -0
- package/dist/shared/contracts/collection-types.d.ts.map +1 -1
- package/dist/shared/contracts/single-types.d.ts +4 -0
- package/dist/shared/contracts/single-types.d.ts.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
import { generateNKeysBetween } from 'fractional-indexing';
|
|
2
|
+
import isEqual from 'lodash/isEqual';
|
|
3
|
+
import toPath from 'lodash/toPath';
|
|
4
|
+
import { isInteger, getIn, isObject, setIn } from '../../../../../../utils/objects.mjs';
|
|
5
|
+
import { transformDocument } from '../../../../utils/data.mjs';
|
|
6
|
+
import { createDefaultForm } from '../../../../utils/forms.mjs';
|
|
7
|
+
|
|
8
|
+
const COMPONENT_META_KEYS = [
|
|
9
|
+
'id',
|
|
10
|
+
'__temp_key__'
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* The schema of a component served to the admin lists its `id` and `documentId` among its
|
|
14
|
+
* attributes, they aren't content.
|
|
15
|
+
*/ const COMPONENT_META_ATTRIBUTES = new Set([
|
|
16
|
+
'id',
|
|
17
|
+
'documentId',
|
|
18
|
+
'__temp_key__'
|
|
19
|
+
]);
|
|
20
|
+
/**
|
|
21
|
+
* Blocks of a dynamic zone carry the uid of the component they're made of.
|
|
22
|
+
*/ const getDynamicZoneBlockUid = (block)=>isObject(block) && typeof block.__component === 'string' ? block.__component : undefined;
|
|
23
|
+
/**
|
|
24
|
+
* The value of a `uid` or `unique` attribute can't be copied: it's checked against the other
|
|
25
|
+
* published entries when the entry is published, and against the other rows of a repeatable
|
|
26
|
+
* component. Like the entry clone, the copy leaves it blank for the user to fill in.
|
|
27
|
+
*/ const isUniqueAttribute = (attribute)=>attribute.type === 'uid' || 'unique' in attribute && attribute.unique === true;
|
|
28
|
+
/* -------------------------------------------------------------------------------------------------
|
|
29
|
+
* cloneComponentData
|
|
30
|
+
* -----------------------------------------------------------------------------------------------*/ /**
|
|
31
|
+
* @description Creates a standalone copy of a component: ids and temp keys are removed
|
|
32
|
+
* (the component and the ones nested in it will be created as new ones), `uid` and `unique`
|
|
33
|
+
* values are blanked and the data is prepared for the form, where relations start empty,
|
|
34
|
+
* see `connectRelations`.
|
|
35
|
+
*/ const cloneComponentData = (value, componentUid, components)=>{
|
|
36
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
37
|
+
return {};
|
|
38
|
+
}
|
|
39
|
+
const schema = components[componentUid];
|
|
40
|
+
const cloned = structuredClone(value);
|
|
41
|
+
const sanitize = (datum, uid)=>{
|
|
42
|
+
const componentSchema = components[uid];
|
|
43
|
+
for (const key of COMPONENT_META_KEYS){
|
|
44
|
+
delete datum[key];
|
|
45
|
+
}
|
|
46
|
+
if (!componentSchema) {
|
|
47
|
+
return datum;
|
|
48
|
+
}
|
|
49
|
+
Object.entries(componentSchema.attributes).forEach(([attributeName, attribute])=>{
|
|
50
|
+
const currentValue = datum[attributeName];
|
|
51
|
+
if (currentValue == null) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (isUniqueAttribute(attribute)) {
|
|
55
|
+
datum[attributeName] = null;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
if (attribute.type === 'component') {
|
|
59
|
+
if (attribute.repeatable && Array.isArray(currentValue)) {
|
|
60
|
+
datum[attributeName] = currentValue.map((item)=>item && typeof item === 'object' ? sanitize(item, attribute.component) : item);
|
|
61
|
+
} else if (typeof currentValue === 'object' && !Array.isArray(currentValue)) {
|
|
62
|
+
datum[attributeName] = sanitize(currentValue, attribute.component);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (attribute.type === 'dynamiczone' && Array.isArray(currentValue)) {
|
|
66
|
+
datum[attributeName] = currentValue.map((item)=>{
|
|
67
|
+
if (!item || typeof item !== 'object' || Array.isArray(item)) {
|
|
68
|
+
return item;
|
|
69
|
+
}
|
|
70
|
+
const dynamicComponent = item;
|
|
71
|
+
const dynamicComponentUid = dynamicComponent.__component;
|
|
72
|
+
if (!dynamicComponentUid) {
|
|
73
|
+
return dynamicComponent;
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
...sanitize(dynamicComponent, dynamicComponentUid),
|
|
77
|
+
__component: dynamicComponentUid
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return datum;
|
|
83
|
+
};
|
|
84
|
+
const sanitized = sanitize(cloned, componentUid);
|
|
85
|
+
if (!schema) {
|
|
86
|
+
return sanitized;
|
|
87
|
+
}
|
|
88
|
+
return transformDocument(schema, components)(sanitized);
|
|
89
|
+
};
|
|
90
|
+
/* -------------------------------------------------------------------------------------------------
|
|
91
|
+
* getComponentInstances
|
|
92
|
+
* -----------------------------------------------------------------------------------------------*/ const getInstanceLabel = (componentData, componentUid, index, mainField, components)=>{
|
|
93
|
+
// `id` is the main field of a component without any string attribute: not a label
|
|
94
|
+
const fieldValue = mainField && mainField !== 'id' ? getIn(componentData, mainField) : undefined;
|
|
95
|
+
if (fieldValue !== undefined && fieldValue !== null && String(fieldValue).trim().length > 0) {
|
|
96
|
+
return String(fieldValue);
|
|
97
|
+
}
|
|
98
|
+
const displayName = components[componentUid]?.info?.displayName ?? componentUid;
|
|
99
|
+
return `${displayName} ${index + 1}`;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* @description Finds the components of the source entry that can be copied into a field.
|
|
103
|
+
*
|
|
104
|
+
* When the field is nested in a block of a repeatable component or of a dynamic zone, every block
|
|
105
|
+
* of the same kind is searched and not only the one at the same position: blocks are freely
|
|
106
|
+
* reordered from one entry to another, their position tells nothing about what they hold.
|
|
107
|
+
*/ const getComponentInstances = ({ componentUid, components, getMainField, mode, schema, sourceDocument, sourceFieldName, targetValues })=>{
|
|
108
|
+
const segments = toPath(sourceFieldName);
|
|
109
|
+
let attributes = schema?.attributes;
|
|
110
|
+
// The uid of the component the blocks of a repeatable component are made of.
|
|
111
|
+
let repeatableUid;
|
|
112
|
+
let matches = [
|
|
113
|
+
{
|
|
114
|
+
value: sourceDocument,
|
|
115
|
+
path: []
|
|
116
|
+
}
|
|
117
|
+
];
|
|
118
|
+
segments.forEach((segment, position)=>{
|
|
119
|
+
if (isInteger(segment)) {
|
|
120
|
+
const dynamicZoneUid = getDynamicZoneBlockUid(getIn(targetValues, segments.slice(0, position + 1)));
|
|
121
|
+
const blockUid = dynamicZoneUid ?? repeatableUid;
|
|
122
|
+
matches = matches.flatMap(({ value, path })=>(Array.isArray(value) ? value : []).map((block, index)=>({
|
|
123
|
+
block,
|
|
124
|
+
index
|
|
125
|
+
})).filter(({ block })=>isObject(block) && (!dynamicZoneUid || block.__component === dynamicZoneUid)).map(({ block, index }, blockPosition)=>({
|
|
126
|
+
value: block,
|
|
127
|
+
path: [
|
|
128
|
+
...path,
|
|
129
|
+
String(index)
|
|
130
|
+
],
|
|
131
|
+
parentLabel: blockUid ? getInstanceLabel(block, blockUid, blockPosition, getMainField(blockUid), components) : undefined
|
|
132
|
+
})));
|
|
133
|
+
attributes = blockUid ? components[blockUid]?.attributes : undefined;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const attribute = attributes?.[segment];
|
|
137
|
+
repeatableUid = attribute?.type === 'component' ? attribute.component : undefined;
|
|
138
|
+
attributes = repeatableUid ? components[repeatableUid]?.attributes : undefined;
|
|
139
|
+
matches = matches.flatMap(({ value, path, parentLabel })=>{
|
|
140
|
+
const nextValue = isObject(value) ? value[segment] : undefined;
|
|
141
|
+
return nextValue === undefined || nextValue === null ? [] : [
|
|
142
|
+
{
|
|
143
|
+
value: nextValue,
|
|
144
|
+
path: [
|
|
145
|
+
...path,
|
|
146
|
+
segment
|
|
147
|
+
],
|
|
148
|
+
parentLabel
|
|
149
|
+
}
|
|
150
|
+
];
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
return matches.flatMap(({ value, path, parentLabel })=>{
|
|
154
|
+
const items = Array.isArray(value) ? value.map((item, index)=>({
|
|
155
|
+
item,
|
|
156
|
+
itemPath: [
|
|
157
|
+
...path,
|
|
158
|
+
String(index)
|
|
159
|
+
]
|
|
160
|
+
})) : [
|
|
161
|
+
{
|
|
162
|
+
item: value,
|
|
163
|
+
itemPath: path
|
|
164
|
+
}
|
|
165
|
+
];
|
|
166
|
+
return items// a dynamic zone holds different components, only the ones of the wanted kind can be copied
|
|
167
|
+
.filter(({ item })=>isObject(item) && (mode !== 'dynamiczone' || item.__component === componentUid)).map(({ item, itemPath }, itemPosition)=>({
|
|
168
|
+
source: item,
|
|
169
|
+
label: getInstanceLabel(item, componentUid, itemPosition, getMainField(componentUid), components),
|
|
170
|
+
parentLabel,
|
|
171
|
+
sourcePath: itemPath.join('.')
|
|
172
|
+
}));
|
|
173
|
+
});
|
|
174
|
+
};
|
|
175
|
+
/* -------------------------------------------------------------------------------------------------
|
|
176
|
+
* Previews
|
|
177
|
+
* -----------------------------------------------------------------------------------------------*/ /**
|
|
178
|
+
* The attributes a component is summed up with before it's copied: the ones with a value that
|
|
179
|
+
* reads as a single line.
|
|
180
|
+
*/ const PREVIEW_ATTRIBUTE_TYPES = new Set([
|
|
181
|
+
'string',
|
|
182
|
+
'text',
|
|
183
|
+
'richtext',
|
|
184
|
+
'email',
|
|
185
|
+
'uid',
|
|
186
|
+
'enumeration',
|
|
187
|
+
'integer',
|
|
188
|
+
'biginteger',
|
|
189
|
+
'float',
|
|
190
|
+
'decimal',
|
|
191
|
+
'boolean',
|
|
192
|
+
'date',
|
|
193
|
+
'datetime',
|
|
194
|
+
'time'
|
|
195
|
+
]);
|
|
196
|
+
/**
|
|
197
|
+
* @description Lists the filled scalar fields of a component, in the order of the given fields
|
|
198
|
+
* (typically the edit layout of the component) or of the schema. The fields whose value isn't
|
|
199
|
+
* copied (`uid`, `unique`) are left out.
|
|
200
|
+
*/ const getComponentPreview = (source, componentUid, components, fields)=>{
|
|
201
|
+
const schema = components[componentUid];
|
|
202
|
+
if (!schema || !isObject(source)) {
|
|
203
|
+
return [];
|
|
204
|
+
}
|
|
205
|
+
const previewFields = fields ?? Object.keys(schema.attributes).filter((name)=>!COMPONENT_META_ATTRIBUTES.has(name)).map((name)=>({
|
|
206
|
+
name,
|
|
207
|
+
label: name
|
|
208
|
+
}));
|
|
209
|
+
return previewFields.flatMap(({ name, label })=>{
|
|
210
|
+
const attribute = schema.attributes[name];
|
|
211
|
+
const value = source[name];
|
|
212
|
+
if (!attribute || !PREVIEW_ATTRIBUTE_TYPES.has(attribute.type) || isUniqueAttribute(attribute) || value === undefined || value === null || value === '') {
|
|
213
|
+
return [];
|
|
214
|
+
}
|
|
215
|
+
return [
|
|
216
|
+
{
|
|
217
|
+
name,
|
|
218
|
+
label,
|
|
219
|
+
type: attribute.type,
|
|
220
|
+
value
|
|
221
|
+
}
|
|
222
|
+
];
|
|
223
|
+
});
|
|
224
|
+
};
|
|
225
|
+
/**
|
|
226
|
+
* The stored version of a component of the form: only a component that kept its id is one,
|
|
227
|
+
* a component put in the place of a saved one (a copy, a reset then re-added one) is new.
|
|
228
|
+
*/ const getSavedCounterpart = (saved, value)=>{
|
|
229
|
+
if (!isObject(value) || value.id === undefined || value.id === null) {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
const candidates = Array.isArray(saved) ? saved : [
|
|
233
|
+
saved
|
|
234
|
+
];
|
|
235
|
+
return candidates.find((candidate)=>isObject(candidate) && candidate.id === value.id && (value.__component === undefined || candidate.__component === value.__component));
|
|
236
|
+
};
|
|
237
|
+
/**
|
|
238
|
+
* @description Finds the stored version of the component at `name` in the document as the server
|
|
239
|
+
* sent it, following the ids of the rows on the way rather than their indexes (rows are
|
|
240
|
+
* reordered in the form). Returns `undefined` when the component, or a row holding it, isn't
|
|
241
|
+
* stored yet.
|
|
242
|
+
*/ const getSavedComponent = (document, values, name)=>{
|
|
243
|
+
const segments = toPath(name);
|
|
244
|
+
let saved = document;
|
|
245
|
+
for (const [position, segment] of segments.entries()){
|
|
246
|
+
saved = isInteger(segment) ? getSavedCounterpart(saved, getIn(values, segments.slice(0, position + 1))) : isObject(saved) ? saved[segment] : undefined;
|
|
247
|
+
if (saved === undefined || saved === null) {
|
|
248
|
+
return undefined;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return getSavedCounterpart(saved, getIn(values, name));
|
|
252
|
+
};
|
|
253
|
+
/**
|
|
254
|
+
* @description Tells whether a component holds any content, i.e. whether copying into it would
|
|
255
|
+
* replace something. A value still equal to the default of its attribute isn't content: a
|
|
256
|
+
* component that was just added is filled with its defaults. Nested components are looked into,
|
|
257
|
+
* a boolean set to `false` is content when its attribute defaults to `true`.
|
|
258
|
+
*
|
|
259
|
+
* The form doesn't hold the saved relations of a component, only the ones being connected or
|
|
260
|
+
* disconnected: pass the stored version of the component (`saved`, see `getSavedComponent`)
|
|
261
|
+
* so that they're counted.
|
|
262
|
+
*/ const isComponentBlank = (value, componentUid, components, saved)=>{
|
|
263
|
+
if (!isObject(value)) {
|
|
264
|
+
return true;
|
|
265
|
+
}
|
|
266
|
+
const schema = components[componentUid];
|
|
267
|
+
if (!schema) {
|
|
268
|
+
return Object.keys(value).every((key)=>COMPONENT_META_KEYS.includes(key));
|
|
269
|
+
}
|
|
270
|
+
const defaults = createDefaultForm(schema, components);
|
|
271
|
+
return Object.entries(schema.attributes).every(([name, attribute])=>{
|
|
272
|
+
const attributeValue = value[name];
|
|
273
|
+
if (attribute.type === 'relation') {
|
|
274
|
+
return isRelationValueBlank(attributeValue, saved?.[name]);
|
|
275
|
+
}
|
|
276
|
+
if (COMPONENT_META_ATTRIBUTES.has(name) || attributeValue === undefined || attributeValue === null || attributeValue === '' || name in defaults && isEqual(attributeValue, defaults[name])) {
|
|
277
|
+
return true;
|
|
278
|
+
}
|
|
279
|
+
return isAttributeValueBlank(attribute, attributeValue, components, saved?.[name]);
|
|
280
|
+
});
|
|
281
|
+
};
|
|
282
|
+
const getRelationCount = (value, key)=>isObject(value) && Array.isArray(value[key]) ? value[key].length : 0;
|
|
283
|
+
/**
|
|
284
|
+
* A relation is blank when nothing is connected to it: what the form connects, plus what's
|
|
285
|
+
* stored (the `count` the server sends) minus what the form disconnects.
|
|
286
|
+
*/ const isRelationValueBlank = (value, saved)=>{
|
|
287
|
+
if (Array.isArray(value)) {
|
|
288
|
+
return value.length === 0;
|
|
289
|
+
}
|
|
290
|
+
const savedCount = isObject(saved) && typeof saved.count === 'number' ? saved.count : 0;
|
|
291
|
+
const count = isObject(value) && typeof value.count === 'number' ? value.count : savedCount;
|
|
292
|
+
return getRelationCount(value, 'connect') === 0 && count - getRelationCount(value, 'disconnect') <= 0;
|
|
293
|
+
};
|
|
294
|
+
/**
|
|
295
|
+
* Whether the value of an attribute is blank, once the obvious cases (no value, the default of the
|
|
296
|
+
* attribute) are ruled out by `isComponentBlank`.
|
|
297
|
+
*/ const isAttributeValueBlank = (attribute, value, components, saved)=>{
|
|
298
|
+
switch(attribute.type){
|
|
299
|
+
case 'component':
|
|
300
|
+
if (attribute.repeatable) {
|
|
301
|
+
return !Array.isArray(value) || value.every((item)=>isComponentBlank(item, attribute.component, components, getSavedCounterpart(saved, item)));
|
|
302
|
+
}
|
|
303
|
+
return isComponentBlank(value, attribute.component, components, getSavedCounterpart(saved, value));
|
|
304
|
+
case 'dynamiczone':
|
|
305
|
+
case 'media':
|
|
306
|
+
return Array.isArray(value) && value.length === 0;
|
|
307
|
+
case 'boolean':
|
|
308
|
+
// `false` is content when the attribute defaults to `true`
|
|
309
|
+
return value === false && attribute.default !== true;
|
|
310
|
+
default:
|
|
311
|
+
if (Array.isArray(value)) {
|
|
312
|
+
return value.length === 0;
|
|
313
|
+
}
|
|
314
|
+
return isObject(value) && Object.keys(value).length === 0;
|
|
315
|
+
}
|
|
316
|
+
};
|
|
317
|
+
/* -------------------------------------------------------------------------------------------------
|
|
318
|
+
* Relations
|
|
319
|
+
* -----------------------------------------------------------------------------------------------*/ /**
|
|
320
|
+
* @description Lists the relations of a component of the source entry, including the ones of the
|
|
321
|
+
* components nested in it. An entry only holds the count of its relations, they have to be
|
|
322
|
+
* loaded to be copied. Relation fields the user isn't allowed to read aren't part of the entry
|
|
323
|
+
* and are left out.
|
|
324
|
+
*/ const getRelationsToCopy = (source, componentUid, components, path = [])=>{
|
|
325
|
+
const schema = components[componentUid];
|
|
326
|
+
if (!schema || !isObject(source)) {
|
|
327
|
+
return [];
|
|
328
|
+
}
|
|
329
|
+
const { id } = source;
|
|
330
|
+
return Object.entries(schema.attributes).flatMap(([name, attribute])=>{
|
|
331
|
+
const value = source[name];
|
|
332
|
+
if (attribute.type === 'relation') {
|
|
333
|
+
// Only what came back with the source can be copied: a relation field the user isn't
|
|
334
|
+
// allowed to read is left out of the entry. A component that was never saved has no
|
|
335
|
+
// relations to load either.
|
|
336
|
+
const hasRelations = isObject(value) && value.count !== 0;
|
|
337
|
+
if (typeof id !== 'number' && typeof id !== 'string' || !hasRelations) {
|
|
338
|
+
return [];
|
|
339
|
+
}
|
|
340
|
+
return [
|
|
341
|
+
{
|
|
342
|
+
model: componentUid,
|
|
343
|
+
id,
|
|
344
|
+
targetField: name,
|
|
345
|
+
path: [
|
|
346
|
+
...path,
|
|
347
|
+
name
|
|
348
|
+
]
|
|
349
|
+
}
|
|
350
|
+
];
|
|
351
|
+
}
|
|
352
|
+
if (attribute.type === 'component') {
|
|
353
|
+
if (attribute.repeatable) {
|
|
354
|
+
return (Array.isArray(value) ? value : []).flatMap((item, index)=>getRelationsToCopy(item, attribute.component, components, [
|
|
355
|
+
...path,
|
|
356
|
+
name,
|
|
357
|
+
String(index)
|
|
358
|
+
]));
|
|
359
|
+
}
|
|
360
|
+
return getRelationsToCopy(value, attribute.component, components, [
|
|
361
|
+
...path,
|
|
362
|
+
name
|
|
363
|
+
]);
|
|
364
|
+
}
|
|
365
|
+
return [];
|
|
366
|
+
});
|
|
367
|
+
};
|
|
368
|
+
/**
|
|
369
|
+
* @description Connects relations loaded from the source entry to the relation field at `path`
|
|
370
|
+
* of a copied component, in the shape the relations input works with.
|
|
371
|
+
*/ const connectRelations = (data, path, relations)=>{
|
|
372
|
+
const keys = generateNKeysBetween(null, null, relations.length);
|
|
373
|
+
return setIn(data, [
|
|
374
|
+
...path,
|
|
375
|
+
'connect'
|
|
376
|
+
].join('.'), relations.map((relation, index)=>({
|
|
377
|
+
...relation,
|
|
378
|
+
// This is what's sent to the API when the entry is saved.
|
|
379
|
+
apiData: {
|
|
380
|
+
id: relation.id,
|
|
381
|
+
documentId: relation.documentId,
|
|
382
|
+
locale: relation.locale
|
|
383
|
+
},
|
|
384
|
+
__temp_key__: keys[index]
|
|
385
|
+
})));
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
export { cloneComponentData, connectRelations, getComponentInstances, getComponentPreview, getRelationsToCopy, getSavedComponent, isComponentBlank };
|
|
389
|
+
//# sourceMappingURL=componentCopy.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"componentCopy.mjs","sources":["../../../../../../../../admin/src/pages/EditView/components/FormInputs/Component/utils/componentCopy.ts"],"sourcesContent":["import { generateNKeysBetween } from 'fractional-indexing';\nimport isEqual from 'lodash/isEqual';\nimport toPath from 'lodash/toPath';\n\nimport { getIn, isInteger, isObject, setIn } from '../../../../../../utils/objects';\nimport { type AnyData, transformDocument } from '../../../../utils/data';\nimport { createDefaultForm } from '../../../../utils/forms';\n\nimport type { RelationResult } from '../../../../../../../../shared/contracts/relations';\nimport type { ComponentsDictionary, Document, Schema } from '../../../../../../hooks/useDocument';\nimport type { Schema as StrapiSchema } from '@strapi/types';\n\ntype ComponentCopyMode = 'component' | 'dynamiczone';\n\ninterface ComponentInstance {\n /**\n * The component as it's stored on the source entry. It still has its ids,\n * they're needed to load its relations.\n */\n source: AnyData;\n label: string;\n /**\n * Label of the block holding the field, when the field is nested\n * in a repeatable component or in a dynamic zone.\n */\n parentLabel?: string;\n /**\n * Where the component sits in the source entry, e.g. `dynamiczone.2.dish.0`.\n */\n sourcePath: string;\n}\n\ninterface RelationToCopy {\n /**\n * The uid & id of the component holding the relation on the source entry.\n */\n model: string;\n id: RelationResult['id'];\n targetField: string;\n /**\n * Path of the relation field from the root of the copied component.\n */\n path: string[];\n}\n\nconst COMPONENT_META_KEYS = ['id', '__temp_key__'];\n\n/**\n * The schema of a component served to the admin lists its `id` and `documentId` among its\n * attributes, they aren't content.\n */\nconst COMPONENT_META_ATTRIBUTES = new Set(['id', 'documentId', '__temp_key__']);\n\n/**\n * Blocks of a dynamic zone carry the uid of the component they're made of.\n */\nconst getDynamicZoneBlockUid = (block: unknown) =>\n isObject(block) && typeof block.__component === 'string' ? block.__component : undefined;\n\n/**\n * The value of a `uid` or `unique` attribute can't be copied: it's checked against the other\n * published entries when the entry is published, and against the other rows of a repeatable\n * component. Like the entry clone, the copy leaves it blank for the user to fill in.\n */\nconst isUniqueAttribute = (attribute: StrapiSchema.Attribute.AnyAttribute) =>\n attribute.type === 'uid' || ('unique' in attribute && attribute.unique === true);\n\n/* -------------------------------------------------------------------------------------------------\n * cloneComponentData\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description Creates a standalone copy of a component: ids and temp keys are removed\n * (the component and the ones nested in it will be created as new ones), `uid` and `unique`\n * values are blanked and the data is prepared for the form, where relations start empty,\n * see `connectRelations`.\n */\nconst cloneComponentData = (\n value: unknown,\n componentUid: string,\n components: ComponentsDictionary\n): AnyData => {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return {};\n }\n\n const schema = components[componentUid];\n const cloned = structuredClone(value) as AnyData;\n\n const sanitize = (datum: AnyData, uid: string) => {\n const componentSchema = components[uid];\n\n for (const key of COMPONENT_META_KEYS) {\n delete datum[key];\n }\n\n if (!componentSchema) {\n return datum;\n }\n\n Object.entries(componentSchema.attributes).forEach(([attributeName, attribute]) => {\n const currentValue = datum[attributeName];\n\n if (currentValue == null) {\n return;\n }\n\n if (isUniqueAttribute(attribute)) {\n datum[attributeName] = null;\n\n return;\n }\n\n if (attribute.type === 'component') {\n if (attribute.repeatable && Array.isArray(currentValue)) {\n datum[attributeName] = currentValue.map((item) =>\n item && typeof item === 'object' ? sanitize(item as AnyData, attribute.component) : item\n );\n } else if (typeof currentValue === 'object' && !Array.isArray(currentValue)) {\n datum[attributeName] = sanitize(currentValue as AnyData, attribute.component);\n }\n }\n\n if (attribute.type === 'dynamiczone' && Array.isArray(currentValue)) {\n datum[attributeName] = currentValue.map((item) => {\n if (!item || typeof item !== 'object' || Array.isArray(item)) {\n return item;\n }\n\n const dynamicComponent = item as AnyData & { __component?: string };\n const dynamicComponentUid = dynamicComponent.__component;\n\n if (!dynamicComponentUid) {\n return dynamicComponent;\n }\n\n return {\n ...sanitize(dynamicComponent, dynamicComponentUid),\n __component: dynamicComponentUid,\n };\n });\n }\n });\n\n return datum;\n };\n\n const sanitized = sanitize(cloned, componentUid);\n\n if (!schema) {\n return sanitized;\n }\n\n return transformDocument(schema, components)(sanitized);\n};\n\n/* -------------------------------------------------------------------------------------------------\n * getComponentInstances\n * -----------------------------------------------------------------------------------------------*/\n\nconst getInstanceLabel = (\n componentData: unknown,\n componentUid: string,\n index: number,\n mainField: string | undefined,\n components: ComponentsDictionary\n) => {\n // `id` is the main field of a component without any string attribute: not a label\n const fieldValue = mainField && mainField !== 'id' ? getIn(componentData, mainField) : undefined;\n\n if (fieldValue !== undefined && fieldValue !== null && String(fieldValue).trim().length > 0) {\n return String(fieldValue);\n }\n\n const displayName = components[componentUid]?.info?.displayName ?? componentUid;\n\n return `${displayName} ${index + 1}`;\n};\n\ninterface GetComponentInstancesArgs {\n componentUid: string;\n components: ComponentsDictionary;\n getMainField: (componentUid: string) => string | undefined;\n mode: ComponentCopyMode;\n /**\n * The schema of the content-type the entries belong to.\n */\n schema?: Schema;\n sourceDocument: Document;\n /**\n * The path of the field in the entry being edited, e.g. `dynamiczone.1.dish`\n */\n sourceFieldName: string;\n /**\n * The values of the entry being edited.\n */\n targetValues: unknown;\n}\n\ninterface SourceMatch {\n value: unknown;\n path: string[];\n parentLabel?: string;\n}\n\n/**\n * @description Finds the components of the source entry that can be copied into a field.\n *\n * When the field is nested in a block of a repeatable component or of a dynamic zone, every block\n * of the same kind is searched and not only the one at the same position: blocks are freely\n * reordered from one entry to another, their position tells nothing about what they hold.\n */\nconst getComponentInstances = ({\n componentUid,\n components,\n getMainField,\n mode,\n schema,\n sourceDocument,\n sourceFieldName,\n targetValues,\n}: GetComponentInstancesArgs): ComponentInstance[] => {\n const segments = toPath(sourceFieldName);\n\n let attributes: Schema['attributes'] | undefined = schema?.attributes;\n // The uid of the component the blocks of a repeatable component are made of.\n let repeatableUid: string | undefined;\n let matches: SourceMatch[] = [{ value: sourceDocument, path: [] }];\n\n segments.forEach((segment, position) => {\n if (isInteger(segment)) {\n const dynamicZoneUid = getDynamicZoneBlockUid(\n getIn(targetValues, segments.slice(0, position + 1))\n );\n const blockUid = dynamicZoneUid ?? repeatableUid;\n\n matches = matches.flatMap(({ value, path }) =>\n (Array.isArray(value) ? value : [])\n .map((block, index) => ({ block, index }))\n .filter(\n ({ block }) =>\n isObject(block) && (!dynamicZoneUid || block.__component === dynamicZoneUid)\n )\n .map(({ block, index }, blockPosition) => ({\n value: block,\n path: [...path, String(index)],\n parentLabel: blockUid\n ? getInstanceLabel(block, blockUid, blockPosition, getMainField(blockUid), components)\n : undefined,\n }))\n );\n\n attributes = blockUid ? components[blockUid]?.attributes : undefined;\n\n return;\n }\n\n const attribute = attributes?.[segment];\n\n repeatableUid = attribute?.type === 'component' ? attribute.component : undefined;\n attributes = repeatableUid ? components[repeatableUid]?.attributes : undefined;\n\n matches = matches.flatMap(({ value, path, parentLabel }) => {\n const nextValue = isObject(value) ? value[segment] : undefined;\n\n return nextValue === undefined || nextValue === null\n ? []\n : [{ value: nextValue, path: [...path, segment], parentLabel }];\n });\n });\n\n return matches.flatMap(({ value, path, parentLabel }) => {\n const items = Array.isArray(value)\n ? value.map((item, index) => ({ item, itemPath: [...path, String(index)] }))\n : [{ item: value, itemPath: path }];\n\n return (\n items\n // a dynamic zone holds different components, only the ones of the wanted kind can be copied\n .filter(\n ({ item }) =>\n isObject(item) && (mode !== 'dynamiczone' || item.__component === componentUid)\n )\n .map(({ item, itemPath }, itemPosition) => ({\n source: item as AnyData,\n label: getInstanceLabel(\n item,\n componentUid,\n itemPosition,\n getMainField(componentUid),\n components\n ),\n parentLabel,\n sourcePath: itemPath.join('.'),\n }))\n );\n });\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Previews\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * The attributes a component is summed up with before it's copied: the ones with a value that\n * reads as a single line.\n */\nconst PREVIEW_ATTRIBUTE_TYPES = new Set<StrapiSchema.Attribute.Kind>([\n 'string',\n 'text',\n 'richtext',\n 'email',\n 'uid',\n 'enumeration',\n 'integer',\n 'biginteger',\n 'float',\n 'decimal',\n 'boolean',\n 'date',\n 'datetime',\n 'time',\n]);\n\ninterface ComponentPreviewField {\n name: string;\n label: string;\n type: StrapiSchema.Attribute.Kind;\n value: unknown;\n}\n\n/**\n * @description Lists the filled scalar fields of a component, in the order of the given fields\n * (typically the edit layout of the component) or of the schema. The fields whose value isn't\n * copied (`uid`, `unique`) are left out.\n */\nconst getComponentPreview = (\n source: unknown,\n componentUid: string,\n components: ComponentsDictionary,\n fields?: Array<{ name: string; label: string }>\n): ComponentPreviewField[] => {\n const schema = components[componentUid];\n\n if (!schema || !isObject(source)) {\n return [];\n }\n\n const previewFields =\n fields ??\n Object.keys(schema.attributes)\n .filter((name) => !COMPONENT_META_ATTRIBUTES.has(name))\n .map((name) => ({ name, label: name }));\n\n return previewFields.flatMap(({ name, label }) => {\n const attribute = schema.attributes[name];\n const value = source[name];\n\n if (\n !attribute ||\n !PREVIEW_ATTRIBUTE_TYPES.has(attribute.type) ||\n isUniqueAttribute(attribute) ||\n value === undefined ||\n value === null ||\n value === ''\n ) {\n return [];\n }\n\n return [{ name, label, type: attribute.type, value }];\n });\n};\n\n/**\n * The stored version of a component of the form: only a component that kept its id is one,\n * a component put in the place of a saved one (a copy, a reset then re-added one) is new.\n */\nconst getSavedCounterpart = (saved: unknown, value: unknown): AnyData | undefined => {\n if (!isObject(value) || value.id === undefined || value.id === null) {\n return undefined;\n }\n\n const candidates = Array.isArray(saved) ? saved : [saved];\n\n return candidates.find(\n (candidate): candidate is AnyData =>\n isObject(candidate) &&\n candidate.id === value.id &&\n (value.__component === undefined || candidate.__component === value.__component)\n );\n};\n\n/**\n * @description Finds the stored version of the component at `name` in the document as the server\n * sent it, following the ids of the rows on the way rather than their indexes (rows are\n * reordered in the form). Returns `undefined` when the component, or a row holding it, isn't\n * stored yet.\n */\nconst getSavedComponent = (\n document: unknown,\n values: unknown,\n name: string\n): AnyData | undefined => {\n const segments = toPath(name);\n let saved: unknown = document;\n\n for (const [position, segment] of segments.entries()) {\n saved = isInteger(segment)\n ? getSavedCounterpart(saved, getIn(values, segments.slice(0, position + 1)))\n : isObject(saved)\n ? saved[segment]\n : undefined;\n\n if (saved === undefined || saved === null) {\n return undefined;\n }\n }\n\n return getSavedCounterpart(saved, getIn(values, name));\n};\n\n/**\n * @description Tells whether a component holds any content, i.e. whether copying into it would\n * replace something. A value still equal to the default of its attribute isn't content: a\n * component that was just added is filled with its defaults. Nested components are looked into,\n * a boolean set to `false` is content when its attribute defaults to `true`.\n *\n * The form doesn't hold the saved relations of a component, only the ones being connected or\n * disconnected: pass the stored version of the component (`saved`, see `getSavedComponent`)\n * so that they're counted.\n */\nconst isComponentBlank = (\n value: unknown,\n componentUid: string,\n components: ComponentsDictionary,\n saved?: AnyData\n): boolean => {\n if (!isObject(value)) {\n return true;\n }\n\n const schema = components[componentUid];\n\n if (!schema) {\n return Object.keys(value).every((key) => COMPONENT_META_KEYS.includes(key));\n }\n\n const defaults = createDefaultForm(schema, components);\n\n return Object.entries(schema.attributes).every(([name, attribute]) => {\n const attributeValue = value[name];\n\n if (attribute.type === 'relation') {\n return isRelationValueBlank(attributeValue, saved?.[name]);\n }\n\n if (\n COMPONENT_META_ATTRIBUTES.has(name) ||\n attributeValue === undefined ||\n attributeValue === null ||\n attributeValue === '' ||\n (name in defaults && isEqual(attributeValue, defaults[name]))\n ) {\n return true;\n }\n\n return isAttributeValueBlank(attribute, attributeValue, components, saved?.[name]);\n });\n};\n\nconst getRelationCount = (value: unknown, key: 'connect' | 'disconnect') =>\n isObject(value) && Array.isArray(value[key]) ? value[key].length : 0;\n\n/**\n * A relation is blank when nothing is connected to it: what the form connects, plus what's\n * stored (the `count` the server sends) minus what the form disconnects.\n */\nconst isRelationValueBlank = (value: unknown, saved: unknown) => {\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n\n const savedCount = isObject(saved) && typeof saved.count === 'number' ? saved.count : 0;\n const count = isObject(value) && typeof value.count === 'number' ? value.count : savedCount;\n\n return (\n getRelationCount(value, 'connect') === 0 && count - getRelationCount(value, 'disconnect') <= 0\n );\n};\n\n/**\n * Whether the value of an attribute is blank, once the obvious cases (no value, the default of the\n * attribute) are ruled out by `isComponentBlank`.\n */\nconst isAttributeValueBlank = (\n attribute: StrapiSchema.Attribute.AnyAttribute,\n value: unknown,\n components: ComponentsDictionary,\n saved: unknown\n): boolean => {\n switch (attribute.type) {\n case 'component':\n if (attribute.repeatable) {\n return (\n !Array.isArray(value) ||\n value.every((item) =>\n isComponentBlank(\n item,\n attribute.component,\n components,\n getSavedCounterpart(saved, item)\n )\n )\n );\n }\n\n return isComponentBlank(\n value,\n attribute.component,\n components,\n getSavedCounterpart(saved, value)\n );\n case 'dynamiczone':\n case 'media':\n return Array.isArray(value) && value.length === 0;\n case 'boolean':\n // `false` is content when the attribute defaults to `true`\n return value === false && attribute.default !== true;\n default:\n if (Array.isArray(value)) {\n return value.length === 0;\n }\n\n return isObject(value) && Object.keys(value).length === 0;\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Relations\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @description Lists the relations of a component of the source entry, including the ones of the\n * components nested in it. An entry only holds the count of its relations, they have to be\n * loaded to be copied. Relation fields the user isn't allowed to read aren't part of the entry\n * and are left out.\n */\nconst getRelationsToCopy = (\n source: unknown,\n componentUid: string,\n components: ComponentsDictionary,\n path: string[] = []\n): RelationToCopy[] => {\n const schema = components[componentUid];\n\n if (!schema || !isObject(source)) {\n return [];\n }\n\n const { id } = source;\n\n return Object.entries(schema.attributes).flatMap(([name, attribute]) => {\n const value = source[name];\n\n if (attribute.type === 'relation') {\n // Only what came back with the source can be copied: a relation field the user isn't\n // allowed to read is left out of the entry. A component that was never saved has no\n // relations to load either.\n const hasRelations = isObject(value) && value.count !== 0;\n\n if ((typeof id !== 'number' && typeof id !== 'string') || !hasRelations) {\n return [];\n }\n\n return [{ model: componentUid, id, targetField: name, path: [...path, name] }];\n }\n\n if (attribute.type === 'component') {\n if (attribute.repeatable) {\n return (Array.isArray(value) ? value : []).flatMap((item, index) =>\n getRelationsToCopy(item, attribute.component, components, [...path, name, String(index)])\n );\n }\n\n return getRelationsToCopy(value, attribute.component, components, [...path, name]);\n }\n\n return [];\n });\n};\n\n/**\n * @description Connects relations loaded from the source entry to the relation field at `path`\n * of a copied component, in the shape the relations input works with.\n */\nconst connectRelations = (data: AnyData, path: string[], relations: RelationResult[]): AnyData => {\n const keys = generateNKeysBetween(null, null, relations.length);\n\n return setIn(\n data,\n [...path, 'connect'].join('.'),\n relations.map((relation, index) => ({\n ...relation,\n // This is what's sent to the API when the entry is saved.\n apiData: {\n id: relation.id,\n documentId: relation.documentId,\n locale: relation.locale,\n },\n __temp_key__: keys[index],\n }))\n );\n};\n\nexport {\n cloneComponentData,\n connectRelations,\n getComponentInstances,\n getComponentPreview,\n getRelationsToCopy,\n getSavedComponent,\n isComponentBlank,\n};\nexport type { ComponentCopyMode, ComponentInstance, ComponentPreviewField, RelationToCopy };\n"],"names":["COMPONENT_META_KEYS","COMPONENT_META_ATTRIBUTES","Set","getDynamicZoneBlockUid","block","isObject","__component","undefined","isUniqueAttribute","attribute","type","unique","cloneComponentData","value","componentUid","components","Array","isArray","schema","cloned","structuredClone","sanitize","datum","uid","componentSchema","key","Object","entries","attributes","forEach","attributeName","currentValue","repeatable","map","item","component","dynamicComponent","dynamicComponentUid","sanitized","transformDocument","getInstanceLabel","componentData","index","mainField","fieldValue","getIn","String","trim","length","displayName","info","getComponentInstances","getMainField","mode","sourceDocument","sourceFieldName","targetValues","segments","toPath","repeatableUid","matches","path","segment","position","isInteger","dynamicZoneUid","slice","blockUid","flatMap","filter","blockPosition","parentLabel","nextValue","items","itemPath","itemPosition","source","label","sourcePath","join","PREVIEW_ATTRIBUTE_TYPES","getComponentPreview","fields","previewFields","keys","name","has","getSavedCounterpart","saved","id","candidates","find","candidate","getSavedComponent","document","values","isComponentBlank","every","includes","defaults","createDefaultForm","attributeValue","isRelationValueBlank","isEqual","isAttributeValueBlank","getRelationCount","savedCount","count","default","getRelationsToCopy","hasRelations","model","targetField","connectRelations","data","relations","generateNKeysBetween","setIn","relation","apiData","documentId","locale","__temp_key__"],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ var reactIntl = require('react-intl');
|
|
|
8
8
|
var styledComponents = require('styled-components');
|
|
9
9
|
var ComponentIcon = require('../../../../../components/ComponentIcon.js');
|
|
10
10
|
var previewImage = require('../../../../../utils/previewImage.js');
|
|
11
|
+
var AddComponentMenu = require('../Component/AddComponentMenu.js');
|
|
11
12
|
|
|
12
13
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
14
|
|
|
@@ -105,7 +106,7 @@ const EMPTY_COMPONENTS = [];
|
|
|
105
106
|
onError: ()=>setHasLoadError(true)
|
|
106
107
|
});
|
|
107
108
|
};
|
|
108
|
-
const ComponentCategory = ({ category, components = EMPTY_COMPONENTS, variant = 'primary', onAddComponent })=>{
|
|
109
|
+
const ComponentCategory = ({ category, components = EMPTY_COMPONENTS, variant = 'primary', onAddComponent, onCopyComponent })=>{
|
|
109
110
|
const { formatMessage } = reactIntl.useIntl();
|
|
110
111
|
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Accordion.Item, {
|
|
111
112
|
value: category,
|
|
@@ -127,6 +128,53 @@ const ComponentCategory = ({ category, components = EMPTY_COMPONENTS, variant =
|
|
|
127
128
|
paddingRight: 3,
|
|
128
129
|
children: components.map(({ uid, displayName, icon, preview })=>{
|
|
129
130
|
const previewUrl = previewImage.resolvePreviewImageUrl(preview);
|
|
131
|
+
const name = formatMessage({
|
|
132
|
+
id: uid,
|
|
133
|
+
defaultMessage: displayName ?? uid
|
|
134
|
+
});
|
|
135
|
+
const tile = /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
136
|
+
tag: "span",
|
|
137
|
+
direction: "column",
|
|
138
|
+
gap: 1,
|
|
139
|
+
alignItems: "center",
|
|
140
|
+
justifyContent: "center",
|
|
141
|
+
width: "100%",
|
|
142
|
+
paddingLeft: 2,
|
|
143
|
+
paddingRight: 2,
|
|
144
|
+
children: [
|
|
145
|
+
/*#__PURE__*/ jsxRuntime.jsx(ComponentTileVisual, {
|
|
146
|
+
previewUrl: previewUrl,
|
|
147
|
+
icon: icon,
|
|
148
|
+
displayName: displayName
|
|
149
|
+
}),
|
|
150
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Tooltip, {
|
|
151
|
+
label: name,
|
|
152
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
153
|
+
tag: "span",
|
|
154
|
+
variant: "pi",
|
|
155
|
+
fontWeight: "bold",
|
|
156
|
+
ellipsis: true,
|
|
157
|
+
width: "100%",
|
|
158
|
+
children: name
|
|
159
|
+
})
|
|
160
|
+
})
|
|
161
|
+
]
|
|
162
|
+
});
|
|
163
|
+
if (onCopyComponent) {
|
|
164
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Menu.Root, {
|
|
165
|
+
children: [
|
|
166
|
+
/*#__PURE__*/ jsxRuntime.jsx(ComponentMenuTrigger, {
|
|
167
|
+
endIcon: null,
|
|
168
|
+
children: tile
|
|
169
|
+
}),
|
|
170
|
+
/*#__PURE__*/ jsxRuntime.jsx(AddComponentMenu.AddComponentMenuContent, {
|
|
171
|
+
kind: "component",
|
|
172
|
+
onAddEmpty: onAddComponent(uid),
|
|
173
|
+
onCopy: onCopyComponent(uid)
|
|
174
|
+
})
|
|
175
|
+
]
|
|
176
|
+
}, uid);
|
|
177
|
+
}
|
|
130
178
|
return /*#__PURE__*/ jsxRuntime.jsx(ComponentBox, {
|
|
131
179
|
tag: "button",
|
|
132
180
|
type: "button",
|
|
@@ -137,38 +185,7 @@ const ComponentCategory = ({ category, components = EMPTY_COMPONENTS, variant =
|
|
|
137
185
|
height: "8.4rem",
|
|
138
186
|
shrink: 0,
|
|
139
187
|
borderColor: "neutral200",
|
|
140
|
-
children:
|
|
141
|
-
direction: "column",
|
|
142
|
-
gap: 1,
|
|
143
|
-
alignItems: "center",
|
|
144
|
-
justifyContent: "center",
|
|
145
|
-
width: "100%",
|
|
146
|
-
paddingLeft: 2,
|
|
147
|
-
paddingRight: 2,
|
|
148
|
-
children: [
|
|
149
|
-
/*#__PURE__*/ jsxRuntime.jsx(ComponentTileVisual, {
|
|
150
|
-
previewUrl: previewUrl,
|
|
151
|
-
icon: icon,
|
|
152
|
-
displayName: displayName
|
|
153
|
-
}),
|
|
154
|
-
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Tooltip, {
|
|
155
|
-
label: formatMessage({
|
|
156
|
-
id: uid,
|
|
157
|
-
defaultMessage: displayName ?? uid
|
|
158
|
-
}),
|
|
159
|
-
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
160
|
-
variant: "pi",
|
|
161
|
-
fontWeight: "bold",
|
|
162
|
-
ellipsis: true,
|
|
163
|
-
width: "100%",
|
|
164
|
-
children: formatMessage({
|
|
165
|
-
id: uid,
|
|
166
|
-
defaultMessage: displayName ?? uid
|
|
167
|
-
})
|
|
168
|
-
})
|
|
169
|
-
})
|
|
170
|
-
]
|
|
171
|
-
})
|
|
188
|
+
children: tile
|
|
172
189
|
}, uid);
|
|
173
190
|
})
|
|
174
191
|
})
|
|
@@ -217,6 +234,40 @@ const ComponentBox = styledComponents.styled(designSystem.Flex)`
|
|
|
217
234
|
color: ${({ theme })=>theme.colors.primary600};
|
|
218
235
|
}
|
|
219
236
|
`;
|
|
237
|
+
/**
|
|
238
|
+
* Same tile as `ComponentBox`, as the trigger of the menu offering to add the component empty or
|
|
239
|
+
* to copy it from another entry. The trigger is a button of the design system, hence the
|
|
240
|
+
* overrides.
|
|
241
|
+
*/ const ComponentMenuTrigger = styledComponents.styled(designSystem.Menu.Trigger)`
|
|
242
|
+
&& {
|
|
243
|
+
width: 100%;
|
|
244
|
+
height: 8.4rem;
|
|
245
|
+
padding: 0;
|
|
246
|
+
justify-content: center;
|
|
247
|
+
border: 1px solid ${({ theme })=>theme.colors.neutral200};
|
|
248
|
+
border-radius: ${({ theme })=>theme.borderRadius};
|
|
249
|
+
background: ${({ theme })=>theme.colors.neutral100};
|
|
250
|
+
color: ${({ theme })=>theme.colors.neutral600};
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/* the wrapper of the tile content */
|
|
254
|
+
&& > span {
|
|
255
|
+
flex: 1;
|
|
256
|
+
min-width: 0;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
260
|
+
transition: color 120ms ${(props)=>props.theme.motion.easings.easeOutQuad};
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
&&:focus,
|
|
264
|
+
&&:hover,
|
|
265
|
+
&&[data-state='open'] {
|
|
266
|
+
border-color: ${({ theme })=>theme.colors.primary200};
|
|
267
|
+
background: ${({ theme })=>theme.colors.primary100};
|
|
268
|
+
color: ${({ theme })=>theme.colors.primary600};
|
|
269
|
+
}
|
|
270
|
+
`;
|
|
220
271
|
|
|
221
272
|
exports.ComponentCategory = ComponentCategory;
|
|
222
273
|
//# sourceMappingURL=ComponentCategory.js.map
|