@strapi/content-manager 5.58.0 → 5.59.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 +4 -3
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +4 -3
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/components/RelativeTime.js +2 -1
- package/dist/admin/components/RelativeTime.js.map +1 -1
- package/dist/admin/components/RelativeTime.mjs +2 -1
- package/dist/admin/components/RelativeTime.mjs.map +1 -1
- package/dist/admin/content-manager.js.map +1 -1
- package/dist/admin/content-manager.mjs.map +1 -1
- package/dist/admin/history/components/VersionContent.js +8 -8
- package/dist/admin/history/components/VersionContent.js.map +1 -1
- package/dist/admin/history/components/VersionContent.mjs +8 -8
- package/dist/admin/history/components/VersionContent.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentActions.js.map +1 -1
- package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +7 -6
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +7 -6
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +4 -3
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +4 -3
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +4 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +4 -4
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.js +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +4 -4
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +4 -4
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
- package/dist/admin/pages/EditView/components/Panels.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +3 -3
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +3 -3
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.js +3 -3
- package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.mjs +3 -3
- package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +2 -2
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +2 -2
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +73 -13
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +74 -14
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js +1 -1
- package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js.map +1 -1
- package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs +1 -1
- package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +4 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +4 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +12 -10
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +12 -10
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.js +2 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.js.map +1 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs +2 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs.map +1 -1
- package/dist/admin/pages/ListView/utils/applyAttributeRenames.js +68 -0
- package/dist/admin/pages/ListView/utils/applyAttributeRenames.js.map +1 -0
- package/dist/admin/pages/ListView/utils/applyAttributeRenames.mjs +64 -0
- package/dist/admin/pages/ListView/utils/applyAttributeRenames.mjs.map +1 -0
- package/dist/admin/preview/components/PreviewHeader.js +3 -1
- package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.mjs +3 -1
- package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
- package/dist/admin/services/relations.js +2 -2
- package/dist/admin/services/relations.js.map +1 -1
- package/dist/admin/services/relations.mjs +2 -2
- package/dist/admin/services/relations.mjs.map +1 -1
- package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +1 -1
- package/dist/admin/src/pages/ListView/utils/applyAttributeRenames.d.ts +12 -0
- package/dist/admin/translations/eu.json.js +3 -3
- package/dist/admin/translations/eu.json.mjs +3 -3
- package/dist/admin/translations/gu.json.js +4 -4
- package/dist/admin/translations/gu.json.mjs +4 -4
- package/dist/admin/translations/hi.json.js +9 -9
- package/dist/admin/translations/hi.json.mjs +9 -9
- package/dist/admin/translations/ml.json.js +6 -6
- package/dist/admin/translations/ml.json.mjs +6 -6
- package/dist/admin/translations/sa.json.js +10 -10
- package/dist/admin/translations/sa.json.mjs +10 -10
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/preview/services/preview-config.js.map +1 -1
- package/dist/server/preview/services/preview-config.mjs.map +1 -1
- package/dist/server/register.js +6 -0
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +6 -0
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/components.js.map +1 -1
- package/dist/server/services/components.mjs.map +1 -1
- package/dist/server/services/configuration/rename-fields.js +68 -0
- package/dist/server/services/configuration/rename-fields.js.map +1 -0
- package/dist/server/services/configuration/rename-fields.mjs +66 -0
- package/dist/server/services/configuration/rename-fields.mjs.map +1 -0
- package/dist/server/services/utils/configuration/attribute-renames.js +164 -0
- package/dist/server/services/utils/configuration/attribute-renames.js.map +1 -0
- package/dist/server/services/utils/configuration/attribute-renames.mjs +161 -0
- package/dist/server/services/utils/configuration/attribute-renames.mjs.map +1 -0
- package/dist/server/services/utils/configuration/attributes.js +12 -12
- package/dist/server/services/utils/configuration/attributes.js.map +1 -1
- package/dist/server/services/utils/configuration/attributes.mjs +12 -12
- package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +2 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/components.d.ts +2 -0
- package/dist/server/src/services/components.d.ts.map +1 -1
- package/dist/server/src/services/configuration/rename-fields.d.ts +15 -0
- package/dist/server/src/services/configuration/rename-fields.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +2 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/attribute-renames.d.ts +57 -0
- package/dist/server/src/services/utils/configuration/attribute-renames.d.ts.map +1 -0
- package/dist/shared/contracts/content-types.d.ts +5 -0
- package/dist/shared/contracts/content-types.d.ts.map +1 -1
- package/package.json +6 -6
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const renamedName = (name, attributes, renames)=>{
|
|
4
|
+
if (Object.prototype.hasOwnProperty.call(attributes, name)) {
|
|
5
|
+
return name;
|
|
6
|
+
}
|
|
7
|
+
const renamed = renames[name];
|
|
8
|
+
if (renamed && Object.prototype.hasOwnProperty.call(attributes, renamed)) {
|
|
9
|
+
return renamed;
|
|
10
|
+
}
|
|
11
|
+
return null;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* The selected list columns live in the browser. A renamed field is no longer
|
|
15
|
+
* on the schema, so replace it with the name from the server map and drop a
|
|
16
|
+
* name that was deleted. A name that still exists is left alone, even when an
|
|
17
|
+
* older map mentions it.
|
|
18
|
+
*/ const applyAttributeRenamesToHeaders = (headers, attributes, renames)=>{
|
|
19
|
+
const next = [];
|
|
20
|
+
const seen = new Set();
|
|
21
|
+
for (const header of headers){
|
|
22
|
+
const name = renamedName(header, attributes, renames);
|
|
23
|
+
if (!name || seen.has(name)) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
seen.add(name);
|
|
27
|
+
next.push(name);
|
|
28
|
+
}
|
|
29
|
+
return next;
|
|
30
|
+
};
|
|
31
|
+
const applyAttributeRenamesToSort = (sort, attributes, renames)=>{
|
|
32
|
+
return sort.split(',').map((part)=>{
|
|
33
|
+
const trimmed = part.trim();
|
|
34
|
+
const separator = trimmed.indexOf(':');
|
|
35
|
+
const field = separator === -1 ? trimmed : trimmed.slice(0, separator);
|
|
36
|
+
const direction = separator === -1 ? '' : trimmed.slice(separator);
|
|
37
|
+
const name = renamedName(field, attributes, renames);
|
|
38
|
+
if (!name || name === field) {
|
|
39
|
+
return trimmed;
|
|
40
|
+
}
|
|
41
|
+
return `${name}${direction}`;
|
|
42
|
+
}).join(',');
|
|
43
|
+
};
|
|
44
|
+
const applyAttributeRenamesToFilters = (filters, attributes, renames, renameKeys = true)=>{
|
|
45
|
+
// Keys inside a field belong to a relation, a component, or an operator.
|
|
46
|
+
// The map is this content-type's attributes, so those keys stay as they are.
|
|
47
|
+
if (!renameKeys || !filters || typeof filters !== 'object') {
|
|
48
|
+
return filters;
|
|
49
|
+
}
|
|
50
|
+
if (Array.isArray(filters)) {
|
|
51
|
+
return filters.map((entry)=>applyAttributeRenamesToFilters(entry, attributes, renames, true));
|
|
52
|
+
}
|
|
53
|
+
const next = {};
|
|
54
|
+
for (const [key, value] of Object.entries(filters)){
|
|
55
|
+
if (key.startsWith('$') || key === '_q') {
|
|
56
|
+
next[key] = applyAttributeRenamesToFilters(value, attributes, renames, true);
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
const name = renamedName(key, attributes, renames) ?? key;
|
|
60
|
+
next[name] = applyAttributeRenamesToFilters(value, attributes, renames, false);
|
|
61
|
+
}
|
|
62
|
+
return next;
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
exports.applyAttributeRenamesToFilters = applyAttributeRenamesToFilters;
|
|
66
|
+
exports.applyAttributeRenamesToHeaders = applyAttributeRenamesToHeaders;
|
|
67
|
+
exports.applyAttributeRenamesToSort = applyAttributeRenamesToSort;
|
|
68
|
+
//# sourceMappingURL=applyAttributeRenames.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyAttributeRenames.js","sources":["../../../../../admin/src/pages/ListView/utils/applyAttributeRenames.ts"],"sourcesContent":["type Attributes = Record<string, unknown>;\ntype Renames = Record<string, string>;\n\nconst renamedName = (name: string, attributes: Attributes, renames: Renames): string | null => {\n if (Object.prototype.hasOwnProperty.call(attributes, name)) {\n return name;\n }\n\n const renamed = renames[name];\n\n if (renamed && Object.prototype.hasOwnProperty.call(attributes, renamed)) {\n return renamed;\n }\n\n return null;\n};\n\n/**\n * The selected list columns live in the browser. A renamed field is no longer\n * on the schema, so replace it with the name from the server map and drop a\n * name that was deleted. A name that still exists is left alone, even when an\n * older map mentions it.\n */\nconst applyAttributeRenamesToHeaders = (\n headers: string[],\n attributes: Attributes,\n renames: Renames\n): string[] => {\n const next: string[] = [];\n const seen = new Set<string>();\n\n for (const header of headers) {\n const name = renamedName(header, attributes, renames);\n\n if (!name || seen.has(name)) {\n continue;\n }\n\n seen.add(name);\n next.push(name);\n }\n\n return next;\n};\n\nconst applyAttributeRenamesToSort = (\n sort: string,\n attributes: Attributes,\n renames: Renames\n): string => {\n return sort\n .split(',')\n .map((part) => {\n const trimmed = part.trim();\n const separator = trimmed.indexOf(':');\n const field = separator === -1 ? trimmed : trimmed.slice(0, separator);\n const direction = separator === -1 ? '' : trimmed.slice(separator);\n const name = renamedName(field, attributes, renames);\n\n if (!name || name === field) {\n return trimmed;\n }\n\n return `${name}${direction}`;\n })\n .join(',');\n};\n\nconst applyAttributeRenamesToFilters = <T>(\n filters: T,\n attributes: Attributes,\n renames: Renames,\n renameKeys = true\n): T => {\n // Keys inside a field belong to a relation, a component, or an operator.\n // The map is this content-type's attributes, so those keys stay as they are.\n if (!renameKeys || !filters || typeof filters !== 'object') {\n return filters;\n }\n\n if (Array.isArray(filters)) {\n return filters.map((entry) =>\n applyAttributeRenamesToFilters(entry, attributes, renames, true)\n ) as T;\n }\n\n const next: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(filters)) {\n if (key.startsWith('$') || key === '_q') {\n next[key] = applyAttributeRenamesToFilters(value, attributes, renames, true);\n continue;\n }\n\n const name = renamedName(key, attributes, renames) ?? key;\n\n next[name] = applyAttributeRenamesToFilters(value, attributes, renames, false);\n }\n\n return next as T;\n};\n\nexport {\n applyAttributeRenamesToFilters,\n applyAttributeRenamesToHeaders,\n applyAttributeRenamesToSort,\n};\n"],"names":["renamedName","name","attributes","renames","Object","prototype","hasOwnProperty","call","renamed","applyAttributeRenamesToHeaders","headers","next","seen","Set","header","has","add","push","applyAttributeRenamesToSort","sort","split","map","part","trimmed","trim","separator","indexOf","field","slice","direction","join","applyAttributeRenamesToFilters","filters","renameKeys","Array","isArray","entry","key","value","entries","startsWith"],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
const renamedName = (name, attributes, renames)=>{
|
|
2
|
+
if (Object.prototype.hasOwnProperty.call(attributes, name)) {
|
|
3
|
+
return name;
|
|
4
|
+
}
|
|
5
|
+
const renamed = renames[name];
|
|
6
|
+
if (renamed && Object.prototype.hasOwnProperty.call(attributes, renamed)) {
|
|
7
|
+
return renamed;
|
|
8
|
+
}
|
|
9
|
+
return null;
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* The selected list columns live in the browser. A renamed field is no longer
|
|
13
|
+
* on the schema, so replace it with the name from the server map and drop a
|
|
14
|
+
* name that was deleted. A name that still exists is left alone, even when an
|
|
15
|
+
* older map mentions it.
|
|
16
|
+
*/ const applyAttributeRenamesToHeaders = (headers, attributes, renames)=>{
|
|
17
|
+
const next = [];
|
|
18
|
+
const seen = new Set();
|
|
19
|
+
for (const header of headers){
|
|
20
|
+
const name = renamedName(header, attributes, renames);
|
|
21
|
+
if (!name || seen.has(name)) {
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
seen.add(name);
|
|
25
|
+
next.push(name);
|
|
26
|
+
}
|
|
27
|
+
return next;
|
|
28
|
+
};
|
|
29
|
+
const applyAttributeRenamesToSort = (sort, attributes, renames)=>{
|
|
30
|
+
return sort.split(',').map((part)=>{
|
|
31
|
+
const trimmed = part.trim();
|
|
32
|
+
const separator = trimmed.indexOf(':');
|
|
33
|
+
const field = separator === -1 ? trimmed : trimmed.slice(0, separator);
|
|
34
|
+
const direction = separator === -1 ? '' : trimmed.slice(separator);
|
|
35
|
+
const name = renamedName(field, attributes, renames);
|
|
36
|
+
if (!name || name === field) {
|
|
37
|
+
return trimmed;
|
|
38
|
+
}
|
|
39
|
+
return `${name}${direction}`;
|
|
40
|
+
}).join(',');
|
|
41
|
+
};
|
|
42
|
+
const applyAttributeRenamesToFilters = (filters, attributes, renames, renameKeys = true)=>{
|
|
43
|
+
// Keys inside a field belong to a relation, a component, or an operator.
|
|
44
|
+
// The map is this content-type's attributes, so those keys stay as they are.
|
|
45
|
+
if (!renameKeys || !filters || typeof filters !== 'object') {
|
|
46
|
+
return filters;
|
|
47
|
+
}
|
|
48
|
+
if (Array.isArray(filters)) {
|
|
49
|
+
return filters.map((entry)=>applyAttributeRenamesToFilters(entry, attributes, renames, true));
|
|
50
|
+
}
|
|
51
|
+
const next = {};
|
|
52
|
+
for (const [key, value] of Object.entries(filters)){
|
|
53
|
+
if (key.startsWith('$') || key === '_q') {
|
|
54
|
+
next[key] = applyAttributeRenamesToFilters(value, attributes, renames, true);
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
const name = renamedName(key, attributes, renames) ?? key;
|
|
58
|
+
next[name] = applyAttributeRenamesToFilters(value, attributes, renames, false);
|
|
59
|
+
}
|
|
60
|
+
return next;
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export { applyAttributeRenamesToFilters, applyAttributeRenamesToHeaders, applyAttributeRenamesToSort };
|
|
64
|
+
//# sourceMappingURL=applyAttributeRenames.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"applyAttributeRenames.mjs","sources":["../../../../../admin/src/pages/ListView/utils/applyAttributeRenames.ts"],"sourcesContent":["type Attributes = Record<string, unknown>;\ntype Renames = Record<string, string>;\n\nconst renamedName = (name: string, attributes: Attributes, renames: Renames): string | null => {\n if (Object.prototype.hasOwnProperty.call(attributes, name)) {\n return name;\n }\n\n const renamed = renames[name];\n\n if (renamed && Object.prototype.hasOwnProperty.call(attributes, renamed)) {\n return renamed;\n }\n\n return null;\n};\n\n/**\n * The selected list columns live in the browser. A renamed field is no longer\n * on the schema, so replace it with the name from the server map and drop a\n * name that was deleted. A name that still exists is left alone, even when an\n * older map mentions it.\n */\nconst applyAttributeRenamesToHeaders = (\n headers: string[],\n attributes: Attributes,\n renames: Renames\n): string[] => {\n const next: string[] = [];\n const seen = new Set<string>();\n\n for (const header of headers) {\n const name = renamedName(header, attributes, renames);\n\n if (!name || seen.has(name)) {\n continue;\n }\n\n seen.add(name);\n next.push(name);\n }\n\n return next;\n};\n\nconst applyAttributeRenamesToSort = (\n sort: string,\n attributes: Attributes,\n renames: Renames\n): string => {\n return sort\n .split(',')\n .map((part) => {\n const trimmed = part.trim();\n const separator = trimmed.indexOf(':');\n const field = separator === -1 ? trimmed : trimmed.slice(0, separator);\n const direction = separator === -1 ? '' : trimmed.slice(separator);\n const name = renamedName(field, attributes, renames);\n\n if (!name || name === field) {\n return trimmed;\n }\n\n return `${name}${direction}`;\n })\n .join(',');\n};\n\nconst applyAttributeRenamesToFilters = <T>(\n filters: T,\n attributes: Attributes,\n renames: Renames,\n renameKeys = true\n): T => {\n // Keys inside a field belong to a relation, a component, or an operator.\n // The map is this content-type's attributes, so those keys stay as they are.\n if (!renameKeys || !filters || typeof filters !== 'object') {\n return filters;\n }\n\n if (Array.isArray(filters)) {\n return filters.map((entry) =>\n applyAttributeRenamesToFilters(entry, attributes, renames, true)\n ) as T;\n }\n\n const next: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(filters)) {\n if (key.startsWith('$') || key === '_q') {\n next[key] = applyAttributeRenamesToFilters(value, attributes, renames, true);\n continue;\n }\n\n const name = renamedName(key, attributes, renames) ?? key;\n\n next[name] = applyAttributeRenamesToFilters(value, attributes, renames, false);\n }\n\n return next as T;\n};\n\nexport {\n applyAttributeRenamesToFilters,\n applyAttributeRenamesToHeaders,\n applyAttributeRenamesToSort,\n};\n"],"names":["renamedName","name","attributes","renames","Object","prototype","hasOwnProperty","call","renamed","applyAttributeRenamesToHeaders","headers","next","seen","Set","header","has","add","push","applyAttributeRenamesToSort","sort","split","map","part","trimmed","trim","separator","indexOf","field","slice","direction","join","applyAttributeRenamesToFilters","filters","renameKeys","Array","isArray","entry","key","value","entries","startsWith"],"mappings":"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"}
|
|
@@ -146,9 +146,10 @@ const PreviewTabs = ()=>{
|
|
|
146
146
|
type: 'success'
|
|
147
147
|
});
|
|
148
148
|
};
|
|
149
|
+
const activeTab = query.status ?? null;
|
|
149
150
|
const hasDraftAndPublish = schema.options?.draftAndPublish ?? false;
|
|
150
151
|
const documentActionProps = {
|
|
151
|
-
activeTab
|
|
152
|
+
activeTab,
|
|
152
153
|
collectionType: schema.kind === 'collectionType' ? 'collection-types' : 'single-types',
|
|
153
154
|
model: schema.uid,
|
|
154
155
|
documentId: schema.kind === 'collectionType' ? document.documentId : undefined,
|
|
@@ -203,6 +204,7 @@ const PreviewTabs = ()=>{
|
|
|
203
204
|
children: /*#__PURE__*/ jsxRuntime.jsx(Icons.Link, {})
|
|
204
205
|
}),
|
|
205
206
|
/*#__PURE__*/ jsxRuntime.jsx(InjectionZone.InjectionZone, {
|
|
207
|
+
...documentActionProps,
|
|
206
208
|
area: "preview.actions"
|
|
207
209
|
}),
|
|
208
210
|
/*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.DescriptionComponentRenderer, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewHeader.js","sources":["../../../../admin/src/preview/components/PreviewHeader.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n DescriptionComponentRenderer,\n useClipboard,\n useHistory,\n useNotification,\n useQueryParams,\n useStrapiApp,\n} from '@strapi/admin/strapi-admin';\nimport { IconButton, Tabs, Typography, Flex } from '@strapi/design-system';\nimport { Cross, Link as LinkIcon } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link, type To } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { InjectionZone } from '../../components/InjectionZone';\nimport { DocumentActionButton } from '../../pages/EditView/components/DocumentActions';\nimport { DocumentStatus } from '../../pages/EditView/components/DocumentStatus';\nimport { getDocumentStatus } from '../../pages/EditView/EditViewPage';\nimport { usePreviewContext } from '../pages/Preview';\n\nimport type { ContentManagerPlugin, DocumentActionProps } from '../../content-manager';\n\n/* -------------------------------------------------------------------------------------------------\n * ClosePreviewButton\n * -----------------------------------------------------------------------------------------------*/\n\nconst ClosePreviewButton = () => {\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n }>();\n const { formatMessage } = useIntl();\n\n const canGoBack = useHistory('BackButton', (state) => state.canGoBack);\n const goBack = useHistory('BackButton', (state) => state.goBack);\n const history = useHistory('BackButton', (state) => state.history);\n const locationIndex = useHistory('BackButton', (state) => state.currentLocationIndex);\n\n /**\n * Get the link destination from the history.\n * Rely on a fallback (the parent edit view page) if there's no page to go back .\n */\n const historyTo = canGoBack ? history.at(locationIndex - 2) : undefined;\n const fallback = {\n pathname: '..',\n search: stringify(query, { encode: false }),\n } satisfies To;\n const toWithFallback = historyTo ?? fallback;\n\n const handleClick = (e: React.MouseEvent) => {\n if (canGoBack) {\n // Prevent normal link behavior, go back in the history stack instead\n e.preventDefault();\n goBack();\n return;\n }\n\n // Otherwise rely on native link behavior to go back to the edit view. We don't use navigate()\n // here in order to get the relative=\"path\" functionality from the Link component.\n };\n\n return (\n <IconButton\n variant=\"ghost\"\n tag={Link}\n relative=\"path\"\n to={toWithFallback}\n onClick={handleClick}\n label={formatMessage({\n id: 'content-manager.preview.header.close',\n defaultMessage: 'Close preview',\n })}\n >\n <Cross />\n </IconButton>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Status\n * -----------------------------------------------------------------------------------------------*/\n\nconst Status = () => {\n // Get status\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n const meta = usePreviewContext('PreviewHeader', (state) => state.meta);\n const hasDraftAndPublished = schema?.options?.draftAndPublish ?? false;\n\n if (!hasDraftAndPublished) {\n return null;\n }\n\n const status = getDocumentStatus(document, meta);\n\n return <DocumentStatus status={status} size=\"XS\" />;\n};\n\nconst PreviewTabs = () => {\n const { formatMessage } = useIntl();\n\n // URL query params\n const [{ query }, setQuery] = useQueryParams<{ status: 'draft' | 'published' }>();\n\n // Get status\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n const meta = usePreviewContext('PreviewHeader', (state) => state.meta);\n const hasDraftAndPublish = schema?.options?.draftAndPublish ?? false;\n const documentStatus = getDocumentStatus(document, meta);\n\n const handleTabChange = (status: string) => {\n if (status === 'published' || status === 'draft') {\n setQuery({ status }, 'push', true);\n }\n };\n\n if (!hasDraftAndPublish) {\n return null;\n }\n\n return (\n <Tabs.Root variant=\"simple\" value={query.status || 'draft'} onValueChange={handleTabChange}>\n <Tabs.List\n aria-label={formatMessage({\n id: 'preview.tabs.label',\n defaultMessage: 'Document status',\n })}\n >\n <StatusTab value=\"draft\">\n {formatMessage({\n id: 'content-manager.containers.List.draft',\n defaultMessage: 'draft',\n })}\n </StatusTab>\n <StatusTab value=\"published\" disabled={documentStatus === 'draft'}>\n {formatMessage({\n id: 'content-manager.containers.List.published',\n defaultMessage: 'published',\n })}\n </StatusTab>\n </Tabs.List>\n </Tabs.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewHeader\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewHeader = () => {\n const title = usePreviewContext('PreviewHeader', (state) => state.title);\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n const meta = usePreviewContext('PreviewHeader', (state) => state.meta);\n const plugins = useStrapiApp('PreviewHeader', (state) => state.plugins);\n\n const [{ query }] = useQueryParams<{\n status?: 'draft' | 'published';\n }>();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { copy } = useClipboard();\n\n const handleCopyLink = () => {\n copy(window.location.href);\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.preview.copy.success',\n defaultMessage: 'Copied preview link',\n }),\n type: 'success',\n });\n };\n\n const hasDraftAndPublish = schema.options?.draftAndPublish ?? false;\n const documentActionProps = {\n activeTab: query.status ?? null,\n collectionType: schema.kind === 'collectionType' ? 'collection-types' : 'single-types',\n model: schema.uid,\n documentId: schema.kind === 'collectionType' ? document.documentId : undefined,\n document,\n meta,\n } satisfies DocumentActionProps;\n\n return (\n <Flex height=\"48px\" gap={4} background=\"neutral0\" borderColor=\"neutral150\" tag=\"header\">\n {/* Title and status */}\n <TitleContainer height=\"100%\" paddingLeft={2} paddingRight={4}>\n <ClosePreviewButton />\n <PreviewTitle\n tag=\"h1\"\n title={title}\n maxWidth=\"200px\"\n fontSize={2}\n paddingLeft={2}\n paddingRight={3}\n fontWeight={600}\n >\n {title}\n </PreviewTitle>\n <Status />\n </TitleContainer>\n\n {/* Tabs and actions */}\n <Flex\n flex={1}\n paddingRight={2}\n gap={2}\n justifyContent={hasDraftAndPublish ? 'space-between' : 'flex-end'}\n >\n <Flex flex=\"1 1 70%\">\n <PreviewTabs />\n </Flex>\n <Flex gap={2}>\n <IconButton\n label={formatMessage({\n id: 'preview.copy.label',\n defaultMessage: 'Copy preview link',\n })}\n onClick={handleCopyLink}\n >\n <LinkIcon />\n </IconButton>\n <InjectionZone area=\"preview.actions\" />\n <DescriptionComponentRenderer\n props={documentActionProps}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions('preview')}\n >\n {(actions) => {\n const filteredActions = actions.filter((action) =>\n [action.position].flat().includes('preview')\n );\n const [primaryAction, secondaryAction] = filteredActions;\n\n if (!primaryAction && !secondaryAction) return null;\n\n // Both actions are available when draft and publish enabled\n if (primaryAction && secondaryAction) {\n return (\n <>\n {/* Save */}\n <DocumentActionButton\n {...secondaryAction}\n variant={secondaryAction.variant || 'secondary'}\n />\n {/* Publish */}\n <DocumentActionButton\n {...primaryAction}\n variant={primaryAction.variant || 'default'}\n />\n </>\n );\n }\n\n // Otherwise we just have the save action\n return (\n <DocumentActionButton\n {...primaryAction}\n variant={primaryAction.variant || 'secondary'}\n />\n );\n }}\n </DescriptionComponentRenderer>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n\nconst PreviewTitle = styled(Typography)`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst StatusTab = styled(Tabs.Trigger)`\n text-transform: uppercase;\n`;\n\nconst TitleContainer = styled(Flex)`\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nexport { PreviewHeader };\n"],"names":["ClosePreviewButton","query","useQueryParams","formatMessage","useIntl","canGoBack","useHistory","state","goBack","history","locationIndex","currentLocationIndex","historyTo","at","undefined","fallback","pathname","search","stringify","encode","toWithFallback","handleClick","e","preventDefault","_jsx","IconButton","variant","tag","Link","relative","to","onClick","label","id","defaultMessage","Cross","Status","document","usePreviewContext","schema","meta","hasDraftAndPublished","options","draftAndPublish","status","getDocumentStatus","DocumentStatus","size","PreviewTabs","setQuery","hasDraftAndPublish","documentStatus","handleTabChange","Tabs","Root","value","onValueChange","_jsxs","List","aria-label","StatusTab","disabled","PreviewHeader","title","plugins","useStrapiApp","toggleNotification","useNotification","copy","useClipboard","handleCopyLink","window","location","href","message","type","documentActionProps","activeTab","collectionType","kind","model","uid","documentId","Flex","height","gap","background","borderColor","TitleContainer","paddingLeft","paddingRight","PreviewTitle","maxWidth","fontSize","fontWeight","flex","justifyContent","LinkIcon","InjectionZone","area","DescriptionComponentRenderer","props","descriptions","apis","getDocumentActions","actions","filteredActions","filter","action","position","flat","includes","primaryAction","secondaryAction","_Fragment","DocumentActionButton","styled","Typography","Trigger","theme","colors","neutral150"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PreviewHeader.js","sources":["../../../../admin/src/preview/components/PreviewHeader.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n DescriptionComponentRenderer,\n useClipboard,\n useHistory,\n useNotification,\n useQueryParams,\n useStrapiApp,\n} from '@strapi/admin/strapi-admin';\nimport { IconButton, Tabs, Typography, Flex } from '@strapi/design-system';\nimport { Cross, Link as LinkIcon } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link, type To } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { InjectionZone } from '../../components/InjectionZone';\nimport { DocumentActionButton } from '../../pages/EditView/components/DocumentActions';\nimport { DocumentStatus } from '../../pages/EditView/components/DocumentStatus';\nimport { getDocumentStatus } from '../../pages/EditView/EditViewPage';\nimport { usePreviewContext } from '../pages/Preview';\n\nimport type { ContentManagerPlugin, DocumentActionProps } from '../../content-manager';\n\n/* -------------------------------------------------------------------------------------------------\n * ClosePreviewButton\n * -----------------------------------------------------------------------------------------------*/\n\nconst ClosePreviewButton = () => {\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n }>();\n const { formatMessage } = useIntl();\n\n const canGoBack = useHistory('BackButton', (state) => state.canGoBack);\n const goBack = useHistory('BackButton', (state) => state.goBack);\n const history = useHistory('BackButton', (state) => state.history);\n const locationIndex = useHistory('BackButton', (state) => state.currentLocationIndex);\n\n /**\n * Get the link destination from the history.\n * Rely on a fallback (the parent edit view page) if there's no page to go back .\n */\n const historyTo = canGoBack ? history.at(locationIndex - 2) : undefined;\n const fallback = {\n pathname: '..',\n search: stringify(query, { encode: false }),\n } satisfies To;\n const toWithFallback = historyTo ?? fallback;\n\n const handleClick = (e: React.MouseEvent) => {\n if (canGoBack) {\n // Prevent normal link behavior, go back in the history stack instead\n e.preventDefault();\n goBack();\n return;\n }\n\n // Otherwise rely on native link behavior to go back to the edit view. We don't use navigate()\n // here in order to get the relative=\"path\" functionality from the Link component.\n };\n\n return (\n <IconButton\n variant=\"ghost\"\n tag={Link}\n relative=\"path\"\n to={toWithFallback}\n onClick={handleClick}\n label={formatMessage({\n id: 'content-manager.preview.header.close',\n defaultMessage: 'Close preview',\n })}\n >\n <Cross />\n </IconButton>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Status\n * -----------------------------------------------------------------------------------------------*/\n\nconst Status = () => {\n // Get status\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n const meta = usePreviewContext('PreviewHeader', (state) => state.meta);\n const hasDraftAndPublished = schema?.options?.draftAndPublish ?? false;\n\n if (!hasDraftAndPublished) {\n return null;\n }\n\n const status = getDocumentStatus(document, meta);\n\n return <DocumentStatus status={status} size=\"XS\" />;\n};\n\nconst PreviewTabs = () => {\n const { formatMessage } = useIntl();\n\n // URL query params\n const [{ query }, setQuery] = useQueryParams<{ status: 'draft' | 'published' }>();\n\n // Get status\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n const meta = usePreviewContext('PreviewHeader', (state) => state.meta);\n const hasDraftAndPublish = schema?.options?.draftAndPublish ?? false;\n const documentStatus = getDocumentStatus(document, meta);\n\n const handleTabChange = (status: string) => {\n if (status === 'published' || status === 'draft') {\n setQuery({ status }, 'push', true);\n }\n };\n\n if (!hasDraftAndPublish) {\n return null;\n }\n\n return (\n <Tabs.Root variant=\"simple\" value={query.status || 'draft'} onValueChange={handleTabChange}>\n <Tabs.List\n aria-label={formatMessage({\n id: 'preview.tabs.label',\n defaultMessage: 'Document status',\n })}\n >\n <StatusTab value=\"draft\">\n {formatMessage({\n id: 'content-manager.containers.List.draft',\n defaultMessage: 'draft',\n })}\n </StatusTab>\n <StatusTab value=\"published\" disabled={documentStatus === 'draft'}>\n {formatMessage({\n id: 'content-manager.containers.List.published',\n defaultMessage: 'published',\n })}\n </StatusTab>\n </Tabs.List>\n </Tabs.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewHeader\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewHeader = () => {\n const title = usePreviewContext('PreviewHeader', (state) => state.title);\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n const meta = usePreviewContext('PreviewHeader', (state) => state.meta);\n const plugins = useStrapiApp('PreviewHeader', (state) => state.plugins);\n\n const [{ query }] = useQueryParams<{\n status?: 'draft' | 'published';\n }>();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { copy } = useClipboard();\n\n const handleCopyLink = () => {\n copy(window.location.href);\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.preview.copy.success',\n defaultMessage: 'Copied preview link',\n }),\n type: 'success',\n });\n };\n\n const activeTab = query.status ?? null;\n const hasDraftAndPublish = schema.options?.draftAndPublish ?? false;\n const documentActionProps = {\n activeTab,\n collectionType: schema.kind === 'collectionType' ? 'collection-types' : 'single-types',\n model: schema.uid,\n documentId: schema.kind === 'collectionType' ? document.documentId : undefined,\n document,\n meta,\n } satisfies DocumentActionProps;\n\n return (\n <Flex height=\"48px\" gap={4} background=\"neutral0\" borderColor=\"neutral150\" tag=\"header\">\n {/* Title and status */}\n <TitleContainer height=\"100%\" paddingLeft={2} paddingRight={4}>\n <ClosePreviewButton />\n <PreviewTitle\n tag=\"h1\"\n title={title}\n maxWidth=\"200px\"\n fontSize={2}\n paddingLeft={2}\n paddingRight={3}\n fontWeight={600}\n >\n {title}\n </PreviewTitle>\n <Status />\n </TitleContainer>\n\n {/* Tabs and actions */}\n <Flex\n flex={1}\n paddingRight={2}\n gap={2}\n justifyContent={hasDraftAndPublish ? 'space-between' : 'flex-end'}\n >\n <Flex flex=\"1 1 70%\">\n <PreviewTabs />\n </Flex>\n <Flex gap={2}>\n <IconButton\n label={formatMessage({\n id: 'preview.copy.label',\n defaultMessage: 'Copy preview link',\n })}\n onClick={handleCopyLink}\n >\n <LinkIcon />\n </IconButton>\n <InjectionZone {...documentActionProps} area=\"preview.actions\" />\n <DescriptionComponentRenderer\n props={documentActionProps}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions('preview')}\n >\n {(actions) => {\n const filteredActions = actions.filter((action) =>\n [action.position].flat().includes('preview')\n );\n const [primaryAction, secondaryAction] = filteredActions;\n\n if (!primaryAction && !secondaryAction) return null;\n\n // Both actions are available when draft and publish enabled\n if (primaryAction && secondaryAction) {\n return (\n <>\n {/* Save */}\n <DocumentActionButton\n {...secondaryAction}\n variant={secondaryAction.variant || 'secondary'}\n />\n {/* Publish */}\n <DocumentActionButton\n {...primaryAction}\n variant={primaryAction.variant || 'default'}\n />\n </>\n );\n }\n\n // Otherwise we just have the save action\n return (\n <DocumentActionButton\n {...primaryAction}\n variant={primaryAction.variant || 'secondary'}\n />\n );\n }}\n </DescriptionComponentRenderer>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n\nconst PreviewTitle = styled(Typography)`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst StatusTab = styled(Tabs.Trigger)`\n text-transform: uppercase;\n`;\n\nconst TitleContainer = styled(Flex)`\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nexport { PreviewHeader };\n"],"names":["ClosePreviewButton","query","useQueryParams","formatMessage","useIntl","canGoBack","useHistory","state","goBack","history","locationIndex","currentLocationIndex","historyTo","at","undefined","fallback","pathname","search","stringify","encode","toWithFallback","handleClick","e","preventDefault","_jsx","IconButton","variant","tag","Link","relative","to","onClick","label","id","defaultMessage","Cross","Status","document","usePreviewContext","schema","meta","hasDraftAndPublished","options","draftAndPublish","status","getDocumentStatus","DocumentStatus","size","PreviewTabs","setQuery","hasDraftAndPublish","documentStatus","handleTabChange","Tabs","Root","value","onValueChange","_jsxs","List","aria-label","StatusTab","disabled","PreviewHeader","title","plugins","useStrapiApp","toggleNotification","useNotification","copy","useClipboard","handleCopyLink","window","location","href","message","type","activeTab","documentActionProps","collectionType","kind","model","uid","documentId","Flex","height","gap","background","borderColor","TitleContainer","paddingLeft","paddingRight","PreviewTitle","maxWidth","fontSize","fontWeight","flex","justifyContent","LinkIcon","InjectionZone","area","DescriptionComponentRenderer","props","descriptions","apis","getDocumentActions","actions","filteredActions","filter","action","position","flat","includes","primaryAction","secondaryAction","_Fragment","DocumentActionButton","styled","Typography","Trigger","theme","colors","neutral150"],"mappings":"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"}
|
|
@@ -144,9 +144,10 @@ const PreviewTabs = ()=>{
|
|
|
144
144
|
type: 'success'
|
|
145
145
|
});
|
|
146
146
|
};
|
|
147
|
+
const activeTab = query.status ?? null;
|
|
147
148
|
const hasDraftAndPublish = schema.options?.draftAndPublish ?? false;
|
|
148
149
|
const documentActionProps = {
|
|
149
|
-
activeTab
|
|
150
|
+
activeTab,
|
|
150
151
|
collectionType: schema.kind === 'collectionType' ? 'collection-types' : 'single-types',
|
|
151
152
|
model: schema.uid,
|
|
152
153
|
documentId: schema.kind === 'collectionType' ? document.documentId : undefined,
|
|
@@ -201,6 +202,7 @@ const PreviewTabs = ()=>{
|
|
|
201
202
|
children: /*#__PURE__*/ jsx(Link, {})
|
|
202
203
|
}),
|
|
203
204
|
/*#__PURE__*/ jsx(InjectionZone, {
|
|
205
|
+
...documentActionProps,
|
|
204
206
|
area: "preview.actions"
|
|
205
207
|
}),
|
|
206
208
|
/*#__PURE__*/ jsx(DescriptionComponentRenderer, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewHeader.mjs","sources":["../../../../admin/src/preview/components/PreviewHeader.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n DescriptionComponentRenderer,\n useClipboard,\n useHistory,\n useNotification,\n useQueryParams,\n useStrapiApp,\n} from '@strapi/admin/strapi-admin';\nimport { IconButton, Tabs, Typography, Flex } from '@strapi/design-system';\nimport { Cross, Link as LinkIcon } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link, type To } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { InjectionZone } from '../../components/InjectionZone';\nimport { DocumentActionButton } from '../../pages/EditView/components/DocumentActions';\nimport { DocumentStatus } from '../../pages/EditView/components/DocumentStatus';\nimport { getDocumentStatus } from '../../pages/EditView/EditViewPage';\nimport { usePreviewContext } from '../pages/Preview';\n\nimport type { ContentManagerPlugin, DocumentActionProps } from '../../content-manager';\n\n/* -------------------------------------------------------------------------------------------------\n * ClosePreviewButton\n * -----------------------------------------------------------------------------------------------*/\n\nconst ClosePreviewButton = () => {\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n }>();\n const { formatMessage } = useIntl();\n\n const canGoBack = useHistory('BackButton', (state) => state.canGoBack);\n const goBack = useHistory('BackButton', (state) => state.goBack);\n const history = useHistory('BackButton', (state) => state.history);\n const locationIndex = useHistory('BackButton', (state) => state.currentLocationIndex);\n\n /**\n * Get the link destination from the history.\n * Rely on a fallback (the parent edit view page) if there's no page to go back .\n */\n const historyTo = canGoBack ? history.at(locationIndex - 2) : undefined;\n const fallback = {\n pathname: '..',\n search: stringify(query, { encode: false }),\n } satisfies To;\n const toWithFallback = historyTo ?? fallback;\n\n const handleClick = (e: React.MouseEvent) => {\n if (canGoBack) {\n // Prevent normal link behavior, go back in the history stack instead\n e.preventDefault();\n goBack();\n return;\n }\n\n // Otherwise rely on native link behavior to go back to the edit view. We don't use navigate()\n // here in order to get the relative=\"path\" functionality from the Link component.\n };\n\n return (\n <IconButton\n variant=\"ghost\"\n tag={Link}\n relative=\"path\"\n to={toWithFallback}\n onClick={handleClick}\n label={formatMessage({\n id: 'content-manager.preview.header.close',\n defaultMessage: 'Close preview',\n })}\n >\n <Cross />\n </IconButton>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Status\n * -----------------------------------------------------------------------------------------------*/\n\nconst Status = () => {\n // Get status\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n const meta = usePreviewContext('PreviewHeader', (state) => state.meta);\n const hasDraftAndPublished = schema?.options?.draftAndPublish ?? false;\n\n if (!hasDraftAndPublished) {\n return null;\n }\n\n const status = getDocumentStatus(document, meta);\n\n return <DocumentStatus status={status} size=\"XS\" />;\n};\n\nconst PreviewTabs = () => {\n const { formatMessage } = useIntl();\n\n // URL query params\n const [{ query }, setQuery] = useQueryParams<{ status: 'draft' | 'published' }>();\n\n // Get status\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n const meta = usePreviewContext('PreviewHeader', (state) => state.meta);\n const hasDraftAndPublish = schema?.options?.draftAndPublish ?? false;\n const documentStatus = getDocumentStatus(document, meta);\n\n const handleTabChange = (status: string) => {\n if (status === 'published' || status === 'draft') {\n setQuery({ status }, 'push', true);\n }\n };\n\n if (!hasDraftAndPublish) {\n return null;\n }\n\n return (\n <Tabs.Root variant=\"simple\" value={query.status || 'draft'} onValueChange={handleTabChange}>\n <Tabs.List\n aria-label={formatMessage({\n id: 'preview.tabs.label',\n defaultMessage: 'Document status',\n })}\n >\n <StatusTab value=\"draft\">\n {formatMessage({\n id: 'content-manager.containers.List.draft',\n defaultMessage: 'draft',\n })}\n </StatusTab>\n <StatusTab value=\"published\" disabled={documentStatus === 'draft'}>\n {formatMessage({\n id: 'content-manager.containers.List.published',\n defaultMessage: 'published',\n })}\n </StatusTab>\n </Tabs.List>\n </Tabs.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewHeader\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewHeader = () => {\n const title = usePreviewContext('PreviewHeader', (state) => state.title);\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n const meta = usePreviewContext('PreviewHeader', (state) => state.meta);\n const plugins = useStrapiApp('PreviewHeader', (state) => state.plugins);\n\n const [{ query }] = useQueryParams<{\n status?: 'draft' | 'published';\n }>();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { copy } = useClipboard();\n\n const handleCopyLink = () => {\n copy(window.location.href);\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.preview.copy.success',\n defaultMessage: 'Copied preview link',\n }),\n type: 'success',\n });\n };\n\n const hasDraftAndPublish = schema.options?.draftAndPublish ?? false;\n const documentActionProps = {\n activeTab: query.status ?? null,\n collectionType: schema.kind === 'collectionType' ? 'collection-types' : 'single-types',\n model: schema.uid,\n documentId: schema.kind === 'collectionType' ? document.documentId : undefined,\n document,\n meta,\n } satisfies DocumentActionProps;\n\n return (\n <Flex height=\"48px\" gap={4} background=\"neutral0\" borderColor=\"neutral150\" tag=\"header\">\n {/* Title and status */}\n <TitleContainer height=\"100%\" paddingLeft={2} paddingRight={4}>\n <ClosePreviewButton />\n <PreviewTitle\n tag=\"h1\"\n title={title}\n maxWidth=\"200px\"\n fontSize={2}\n paddingLeft={2}\n paddingRight={3}\n fontWeight={600}\n >\n {title}\n </PreviewTitle>\n <Status />\n </TitleContainer>\n\n {/* Tabs and actions */}\n <Flex\n flex={1}\n paddingRight={2}\n gap={2}\n justifyContent={hasDraftAndPublish ? 'space-between' : 'flex-end'}\n >\n <Flex flex=\"1 1 70%\">\n <PreviewTabs />\n </Flex>\n <Flex gap={2}>\n <IconButton\n label={formatMessage({\n id: 'preview.copy.label',\n defaultMessage: 'Copy preview link',\n })}\n onClick={handleCopyLink}\n >\n <LinkIcon />\n </IconButton>\n <InjectionZone area=\"preview.actions\" />\n <DescriptionComponentRenderer\n props={documentActionProps}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions('preview')}\n >\n {(actions) => {\n const filteredActions = actions.filter((action) =>\n [action.position].flat().includes('preview')\n );\n const [primaryAction, secondaryAction] = filteredActions;\n\n if (!primaryAction && !secondaryAction) return null;\n\n // Both actions are available when draft and publish enabled\n if (primaryAction && secondaryAction) {\n return (\n <>\n {/* Save */}\n <DocumentActionButton\n {...secondaryAction}\n variant={secondaryAction.variant || 'secondary'}\n />\n {/* Publish */}\n <DocumentActionButton\n {...primaryAction}\n variant={primaryAction.variant || 'default'}\n />\n </>\n );\n }\n\n // Otherwise we just have the save action\n return (\n <DocumentActionButton\n {...primaryAction}\n variant={primaryAction.variant || 'secondary'}\n />\n );\n }}\n </DescriptionComponentRenderer>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n\nconst PreviewTitle = styled(Typography)`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst StatusTab = styled(Tabs.Trigger)`\n text-transform: uppercase;\n`;\n\nconst TitleContainer = styled(Flex)`\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nexport { PreviewHeader };\n"],"names":["ClosePreviewButton","query","useQueryParams","formatMessage","useIntl","canGoBack","useHistory","state","goBack","history","locationIndex","currentLocationIndex","historyTo","at","undefined","fallback","pathname","search","stringify","encode","toWithFallback","handleClick","e","preventDefault","_jsx","IconButton","variant","tag","Link","relative","to","onClick","label","id","defaultMessage","Cross","Status","document","usePreviewContext","schema","meta","hasDraftAndPublished","options","draftAndPublish","status","getDocumentStatus","DocumentStatus","size","PreviewTabs","setQuery","hasDraftAndPublish","documentStatus","handleTabChange","Tabs","Root","value","onValueChange","_jsxs","List","aria-label","StatusTab","disabled","PreviewHeader","title","plugins","useStrapiApp","toggleNotification","useNotification","copy","useClipboard","handleCopyLink","window","location","href","message","type","documentActionProps","activeTab","collectionType","kind","model","uid","documentId","Flex","height","gap","background","borderColor","TitleContainer","paddingLeft","paddingRight","PreviewTitle","maxWidth","fontSize","fontWeight","flex","justifyContent","LinkIcon","InjectionZone","area","DescriptionComponentRenderer","props","descriptions","apis","getDocumentActions","actions","filteredActions","filter","action","position","flat","includes","primaryAction","secondaryAction","_Fragment","DocumentActionButton","styled","Typography","Trigger","theme","colors","neutral150"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PreviewHeader.mjs","sources":["../../../../admin/src/preview/components/PreviewHeader.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n DescriptionComponentRenderer,\n useClipboard,\n useHistory,\n useNotification,\n useQueryParams,\n useStrapiApp,\n} from '@strapi/admin/strapi-admin';\nimport { IconButton, Tabs, Typography, Flex } from '@strapi/design-system';\nimport { Cross, Link as LinkIcon } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link, type To } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { InjectionZone } from '../../components/InjectionZone';\nimport { DocumentActionButton } from '../../pages/EditView/components/DocumentActions';\nimport { DocumentStatus } from '../../pages/EditView/components/DocumentStatus';\nimport { getDocumentStatus } from '../../pages/EditView/EditViewPage';\nimport { usePreviewContext } from '../pages/Preview';\n\nimport type { ContentManagerPlugin, DocumentActionProps } from '../../content-manager';\n\n/* -------------------------------------------------------------------------------------------------\n * ClosePreviewButton\n * -----------------------------------------------------------------------------------------------*/\n\nconst ClosePreviewButton = () => {\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n }>();\n const { formatMessage } = useIntl();\n\n const canGoBack = useHistory('BackButton', (state) => state.canGoBack);\n const goBack = useHistory('BackButton', (state) => state.goBack);\n const history = useHistory('BackButton', (state) => state.history);\n const locationIndex = useHistory('BackButton', (state) => state.currentLocationIndex);\n\n /**\n * Get the link destination from the history.\n * Rely on a fallback (the parent edit view page) if there's no page to go back .\n */\n const historyTo = canGoBack ? history.at(locationIndex - 2) : undefined;\n const fallback = {\n pathname: '..',\n search: stringify(query, { encode: false }),\n } satisfies To;\n const toWithFallback = historyTo ?? fallback;\n\n const handleClick = (e: React.MouseEvent) => {\n if (canGoBack) {\n // Prevent normal link behavior, go back in the history stack instead\n e.preventDefault();\n goBack();\n return;\n }\n\n // Otherwise rely on native link behavior to go back to the edit view. We don't use navigate()\n // here in order to get the relative=\"path\" functionality from the Link component.\n };\n\n return (\n <IconButton\n variant=\"ghost\"\n tag={Link}\n relative=\"path\"\n to={toWithFallback}\n onClick={handleClick}\n label={formatMessage({\n id: 'content-manager.preview.header.close',\n defaultMessage: 'Close preview',\n })}\n >\n <Cross />\n </IconButton>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Status\n * -----------------------------------------------------------------------------------------------*/\n\nconst Status = () => {\n // Get status\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n const meta = usePreviewContext('PreviewHeader', (state) => state.meta);\n const hasDraftAndPublished = schema?.options?.draftAndPublish ?? false;\n\n if (!hasDraftAndPublished) {\n return null;\n }\n\n const status = getDocumentStatus(document, meta);\n\n return <DocumentStatus status={status} size=\"XS\" />;\n};\n\nconst PreviewTabs = () => {\n const { formatMessage } = useIntl();\n\n // URL query params\n const [{ query }, setQuery] = useQueryParams<{ status: 'draft' | 'published' }>();\n\n // Get status\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n const meta = usePreviewContext('PreviewHeader', (state) => state.meta);\n const hasDraftAndPublish = schema?.options?.draftAndPublish ?? false;\n const documentStatus = getDocumentStatus(document, meta);\n\n const handleTabChange = (status: string) => {\n if (status === 'published' || status === 'draft') {\n setQuery({ status }, 'push', true);\n }\n };\n\n if (!hasDraftAndPublish) {\n return null;\n }\n\n return (\n <Tabs.Root variant=\"simple\" value={query.status || 'draft'} onValueChange={handleTabChange}>\n <Tabs.List\n aria-label={formatMessage({\n id: 'preview.tabs.label',\n defaultMessage: 'Document status',\n })}\n >\n <StatusTab value=\"draft\">\n {formatMessage({\n id: 'content-manager.containers.List.draft',\n defaultMessage: 'draft',\n })}\n </StatusTab>\n <StatusTab value=\"published\" disabled={documentStatus === 'draft'}>\n {formatMessage({\n id: 'content-manager.containers.List.published',\n defaultMessage: 'published',\n })}\n </StatusTab>\n </Tabs.List>\n </Tabs.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewHeader\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewHeader = () => {\n const title = usePreviewContext('PreviewHeader', (state) => state.title);\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n const meta = usePreviewContext('PreviewHeader', (state) => state.meta);\n const plugins = useStrapiApp('PreviewHeader', (state) => state.plugins);\n\n const [{ query }] = useQueryParams<{\n status?: 'draft' | 'published';\n }>();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { copy } = useClipboard();\n\n const handleCopyLink = () => {\n copy(window.location.href);\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.preview.copy.success',\n defaultMessage: 'Copied preview link',\n }),\n type: 'success',\n });\n };\n\n const activeTab = query.status ?? null;\n const hasDraftAndPublish = schema.options?.draftAndPublish ?? false;\n const documentActionProps = {\n activeTab,\n collectionType: schema.kind === 'collectionType' ? 'collection-types' : 'single-types',\n model: schema.uid,\n documentId: schema.kind === 'collectionType' ? document.documentId : undefined,\n document,\n meta,\n } satisfies DocumentActionProps;\n\n return (\n <Flex height=\"48px\" gap={4} background=\"neutral0\" borderColor=\"neutral150\" tag=\"header\">\n {/* Title and status */}\n <TitleContainer height=\"100%\" paddingLeft={2} paddingRight={4}>\n <ClosePreviewButton />\n <PreviewTitle\n tag=\"h1\"\n title={title}\n maxWidth=\"200px\"\n fontSize={2}\n paddingLeft={2}\n paddingRight={3}\n fontWeight={600}\n >\n {title}\n </PreviewTitle>\n <Status />\n </TitleContainer>\n\n {/* Tabs and actions */}\n <Flex\n flex={1}\n paddingRight={2}\n gap={2}\n justifyContent={hasDraftAndPublish ? 'space-between' : 'flex-end'}\n >\n <Flex flex=\"1 1 70%\">\n <PreviewTabs />\n </Flex>\n <Flex gap={2}>\n <IconButton\n label={formatMessage({\n id: 'preview.copy.label',\n defaultMessage: 'Copy preview link',\n })}\n onClick={handleCopyLink}\n >\n <LinkIcon />\n </IconButton>\n <InjectionZone {...documentActionProps} area=\"preview.actions\" />\n <DescriptionComponentRenderer\n props={documentActionProps}\n descriptions={(\n plugins['content-manager'].apis as ContentManagerPlugin['config']['apis']\n ).getDocumentActions('preview')}\n >\n {(actions) => {\n const filteredActions = actions.filter((action) =>\n [action.position].flat().includes('preview')\n );\n const [primaryAction, secondaryAction] = filteredActions;\n\n if (!primaryAction && !secondaryAction) return null;\n\n // Both actions are available when draft and publish enabled\n if (primaryAction && secondaryAction) {\n return (\n <>\n {/* Save */}\n <DocumentActionButton\n {...secondaryAction}\n variant={secondaryAction.variant || 'secondary'}\n />\n {/* Publish */}\n <DocumentActionButton\n {...primaryAction}\n variant={primaryAction.variant || 'default'}\n />\n </>\n );\n }\n\n // Otherwise we just have the save action\n return (\n <DocumentActionButton\n {...primaryAction}\n variant={primaryAction.variant || 'secondary'}\n />\n );\n }}\n </DescriptionComponentRenderer>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n\nconst PreviewTitle = styled(Typography)`\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst StatusTab = styled(Tabs.Trigger)`\n text-transform: uppercase;\n`;\n\nconst TitleContainer = styled(Flex)`\n border-right: 1px solid ${({ theme }) => theme.colors.neutral150};\n`;\n\nexport { PreviewHeader };\n"],"names":["ClosePreviewButton","query","useQueryParams","formatMessage","useIntl","canGoBack","useHistory","state","goBack","history","locationIndex","currentLocationIndex","historyTo","at","undefined","fallback","pathname","search","stringify","encode","toWithFallback","handleClick","e","preventDefault","_jsx","IconButton","variant","tag","Link","relative","to","onClick","label","id","defaultMessage","Cross","Status","document","usePreviewContext","schema","meta","hasDraftAndPublished","options","draftAndPublish","status","getDocumentStatus","DocumentStatus","size","PreviewTabs","setQuery","hasDraftAndPublish","documentStatus","handleTabChange","Tabs","Root","value","onValueChange","_jsxs","List","aria-label","StatusTab","disabled","PreviewHeader","title","plugins","useStrapiApp","toggleNotification","useNotification","copy","useClipboard","handleCopyLink","window","location","href","message","type","activeTab","documentActionProps","collectionType","kind","model","uid","documentId","Flex","height","gap","background","borderColor","TitleContainer","paddingLeft","paddingRight","PreviewTitle","maxWidth","fontSize","fontWeight","flex","justifyContent","LinkIcon","InjectionZone","area","DescriptionComponentRenderer","props","descriptions","apis","getDocumentActions","actions","filteredActions","filter","action","position","flat","includes","primaryAction","secondaryAction","_Fragment","DocumentActionButton","styled","Typography","Trigger","theme","colors","neutral150"],"mappings":"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"}
|
|
@@ -97,8 +97,8 @@ const relationsApi = api.contentManagerApi.injectEndpoints({
|
|
|
97
97
|
/**
|
|
98
98
|
* Relations will always have unique IDs, so we can therefore assume
|
|
99
99
|
* that we only need to push the new items to the cache.
|
|
100
|
-
*/ const existingIds = currentCache.results.map((item)=>item.documentId);
|
|
101
|
-
const uniqueNewItems = newItems.results.filter((item)=>!existingIds.
|
|
100
|
+
*/ const existingIds = new Set(currentCache.results.map((item)=>item.documentId));
|
|
101
|
+
const uniqueNewItems = newItems.results.filter((item)=>!existingIds.has(item.documentId));
|
|
102
102
|
currentCache.results.push(...uniqueNewItems);
|
|
103
103
|
currentCache.pagination = newItems.pagination;
|
|
104
104
|
} else if (newItems.pagination.page === 1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relations.js","sources":["../../../admin/src/services/relations.ts"],"sourcesContent":["import { generateNKeysBetween } from 'fractional-indexing';\n\nimport {\n RelationResult as RelResult,\n FindAvailable,\n FindExisting,\n} from '../../../shared/contracts/relations';\n\nimport { contentManagerApi } from './api';\n\nimport type { Modules } from '@strapi/types';\nimport type { errors } from '@strapi/utils';\n\ninterface RelationResult extends RelResult {\n __temp_key__: string;\n}\n\ntype GetRelationsResponse =\n | {\n results: Array<RelationResult>;\n pagination: {\n page: NonNullable<Modules.EntityService.Params.Pagination.PageNotation['page']>;\n pageSize: NonNullable<Modules.EntityService.Params.Pagination.PageNotation['pageSize']>;\n pageCount: number;\n total: number;\n } | null;\n error?: never;\n }\n | {\n results?: never;\n pagination?: never;\n error: errors.ApplicationError | errors.YupValidationError;\n };\n\nconst relationsApi = contentManagerApi.injectEndpoints({\n endpoints: (build) => ({\n getRelations: build.query<\n GetRelationsResponse,\n FindExisting.Params & {\n params?: FindExisting.Request['query'];\n }\n >({\n query: ({ model, id, targetField, params }) => {\n return {\n url: `/content-manager/relations/${model}/${id}/${targetField}`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n serializeQueryArgs: (args) => {\n const { endpointName, queryArgs } = args;\n return {\n endpointName,\n model: queryArgs.model,\n id: queryArgs.id,\n targetField: queryArgs.targetField,\n locale: queryArgs.params?.locale,\n status: queryArgs.params?.status,\n };\n },\n merge: (currentCache, newItems) => {\n if (currentCache.pagination && newItems.pagination) {\n if (currentCache.pagination.page < newItems.pagination.page) {\n /**\n * Relations will always have unique IDs, so we can therefore assume\n * that we only need to push the new items to the cache.\n *\n * Push new items at the beginning as latest items are shown first\n */\n currentCache.results = [\n ...prepareTempKeys(newItems.results, currentCache.results),\n ...currentCache.results,\n ];\n currentCache.pagination = newItems.pagination;\n } else if (newItems.pagination.page === 1) {\n /**\n * We're resetting the relations\n */\n currentCache.results = prepareTempKeys(newItems.results);\n currentCache.pagination = newItems.pagination;\n }\n }\n },\n forceRefetch({ currentArg, previousArg }) {\n if (!currentArg?.params && !previousArg?.params) {\n return false;\n }\n\n return (\n currentArg?.params?.page !== previousArg?.params?.page ||\n currentArg?.params?.pageSize !== previousArg?.params?.pageSize\n );\n },\n transformResponse: (response: FindExisting.Response) => {\n if ('results' in response && response.results) {\n return {\n ...response,\n results: prepareTempKeys(response.results.toReversed()),\n };\n } else {\n return response;\n }\n },\n providesTags: ['Relations'],\n }),\n searchRelations: build.query<\n FindAvailable.Response,\n FindAvailable.Params & {\n params?: FindAvailable.Request['query'];\n }\n >({\n query: ({ model, targetField, params }) => {\n return {\n url: `/content-manager/relations/${model}/${targetField}`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n serializeQueryArgs: (args) => {\n const { endpointName, queryArgs } = args;\n return {\n endpointName,\n model: queryArgs.model,\n targetField: queryArgs.targetField,\n id: queryArgs.params?.id,\n locale: queryArgs.params?.locale,\n status: queryArgs.params?.status,\n _q: queryArgs.params?._q,\n idsToOmit: queryArgs.params?.idsToOmit,\n idsToInclude: queryArgs.params?.idsToInclude,\n };\n },\n merge: (currentCache, newItems) => {\n if (currentCache.pagination && newItems.pagination) {\n if (currentCache.pagination.page < newItems.pagination.page) {\n /**\n * Relations will always have unique IDs, so we can therefore assume\n * that we only need to push the new items to the cache.\n */\n const existingIds = currentCache.results.map((item) => item.documentId);\n const uniqueNewItems = newItems.results.filter(\n (item) => !existingIds.includes(item.documentId)\n );\n currentCache.results.push(...uniqueNewItems);\n currentCache.pagination = newItems.pagination;\n } else if (newItems.pagination.page === 1) {\n /**\n * We're resetting the relations\n */\n currentCache.results = newItems.results;\n currentCache.pagination = newItems.pagination;\n }\n }\n },\n forceRefetch({ currentArg, previousArg }) {\n if (!currentArg?.params && !previousArg?.params) {\n return false;\n }\n\n return (\n currentArg?.params?.page !== previousArg?.params?.page ||\n currentArg?.params?.pageSize !== previousArg?.params?.pageSize\n );\n },\n transformResponse: (response: FindAvailable.Response) => {\n if (response.results) {\n return {\n ...response,\n results: response.results,\n };\n } else {\n return response;\n }\n },\n }),\n }),\n});\n\n/**\n * @internal\n * @description Adds a `__temp_key__` to each relation item. This gives us\n * a stable identifier regardless of it's ids etc. that we can then use for drag and drop.\n */\nconst prepareTempKeys = (relations: RelResult[], existingRelations: RelationResult[] = []) => {\n const [firstItem] = existingRelations.slice(0);\n const keys = generateNKeysBetween(null, firstItem?.__temp_key__ ?? null, relations.length);\n\n return relations.map((datum, index) => ({\n ...datum,\n __temp_key__: keys[index],\n }));\n};\n\nconst { useGetRelationsQuery, useLazySearchRelationsQuery } = relationsApi;\n\nexport { useGetRelationsQuery, useLazySearchRelationsQuery };\nexport type { RelationResult };\n"],"names":["relationsApi","contentManagerApi","injectEndpoints","endpoints","build","getRelations","query","model","id","targetField","params","url","method","config","serializeQueryArgs","args","endpointName","queryArgs","locale","status","merge","currentCache","newItems","pagination","page","results","prepareTempKeys","forceRefetch","currentArg","previousArg","pageSize","transformResponse","response","toReversed","providesTags","searchRelations","_q","idsToOmit","idsToInclude","existingIds","map","item","documentId","uniqueNewItems","filter","includes","push","relations","existingRelations","firstItem","slice","keys","generateNKeysBetween","__temp_key__","length","datum","index","useGetRelationsQuery","useLazySearchRelationsQuery"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"relations.js","sources":["../../../admin/src/services/relations.ts"],"sourcesContent":["import { generateNKeysBetween } from 'fractional-indexing';\n\nimport {\n RelationResult as RelResult,\n FindAvailable,\n FindExisting,\n} from '../../../shared/contracts/relations';\n\nimport { contentManagerApi } from './api';\n\nimport type { Modules } from '@strapi/types';\nimport type { errors } from '@strapi/utils';\n\ninterface RelationResult extends RelResult {\n __temp_key__: string;\n}\n\ntype GetRelationsResponse =\n | {\n results: Array<RelationResult>;\n pagination: {\n page: NonNullable<Modules.EntityService.Params.Pagination.PageNotation['page']>;\n pageSize: NonNullable<Modules.EntityService.Params.Pagination.PageNotation['pageSize']>;\n pageCount: number;\n total: number;\n } | null;\n error?: never;\n }\n | {\n results?: never;\n pagination?: never;\n error: errors.ApplicationError | errors.YupValidationError;\n };\n\nconst relationsApi = contentManagerApi.injectEndpoints({\n endpoints: (build) => ({\n getRelations: build.query<\n GetRelationsResponse,\n FindExisting.Params & {\n params?: FindExisting.Request['query'];\n }\n >({\n query: ({ model, id, targetField, params }) => {\n return {\n url: `/content-manager/relations/${model}/${id}/${targetField}`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n serializeQueryArgs: (args) => {\n const { endpointName, queryArgs } = args;\n return {\n endpointName,\n model: queryArgs.model,\n id: queryArgs.id,\n targetField: queryArgs.targetField,\n locale: queryArgs.params?.locale,\n status: queryArgs.params?.status,\n };\n },\n merge: (currentCache, newItems) => {\n if (currentCache.pagination && newItems.pagination) {\n if (currentCache.pagination.page < newItems.pagination.page) {\n /**\n * Relations will always have unique IDs, so we can therefore assume\n * that we only need to push the new items to the cache.\n *\n * Push new items at the beginning as latest items are shown first\n */\n currentCache.results = [\n ...prepareTempKeys(newItems.results, currentCache.results),\n ...currentCache.results,\n ];\n currentCache.pagination = newItems.pagination;\n } else if (newItems.pagination.page === 1) {\n /**\n * We're resetting the relations\n */\n currentCache.results = prepareTempKeys(newItems.results);\n currentCache.pagination = newItems.pagination;\n }\n }\n },\n forceRefetch({ currentArg, previousArg }) {\n if (!currentArg?.params && !previousArg?.params) {\n return false;\n }\n\n return (\n currentArg?.params?.page !== previousArg?.params?.page ||\n currentArg?.params?.pageSize !== previousArg?.params?.pageSize\n );\n },\n transformResponse: (response: FindExisting.Response) => {\n if ('results' in response && response.results) {\n return {\n ...response,\n results: prepareTempKeys(response.results.toReversed()),\n };\n } else {\n return response;\n }\n },\n providesTags: ['Relations'],\n }),\n searchRelations: build.query<\n FindAvailable.Response,\n FindAvailable.Params & {\n params?: FindAvailable.Request['query'];\n }\n >({\n query: ({ model, targetField, params }) => {\n return {\n url: `/content-manager/relations/${model}/${targetField}`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n serializeQueryArgs: (args) => {\n const { endpointName, queryArgs } = args;\n return {\n endpointName,\n model: queryArgs.model,\n targetField: queryArgs.targetField,\n id: queryArgs.params?.id,\n locale: queryArgs.params?.locale,\n status: queryArgs.params?.status,\n _q: queryArgs.params?._q,\n idsToOmit: queryArgs.params?.idsToOmit,\n idsToInclude: queryArgs.params?.idsToInclude,\n };\n },\n merge: (currentCache, newItems) => {\n if (currentCache.pagination && newItems.pagination) {\n if (currentCache.pagination.page < newItems.pagination.page) {\n /**\n * Relations will always have unique IDs, so we can therefore assume\n * that we only need to push the new items to the cache.\n */\n const existingIds = new Set(currentCache.results.map((item) => item.documentId));\n const uniqueNewItems = newItems.results.filter(\n (item) => !existingIds.has(item.documentId)\n );\n currentCache.results.push(...uniqueNewItems);\n currentCache.pagination = newItems.pagination;\n } else if (newItems.pagination.page === 1) {\n /**\n * We're resetting the relations\n */\n currentCache.results = newItems.results;\n currentCache.pagination = newItems.pagination;\n }\n }\n },\n forceRefetch({ currentArg, previousArg }) {\n if (!currentArg?.params && !previousArg?.params) {\n return false;\n }\n\n return (\n currentArg?.params?.page !== previousArg?.params?.page ||\n currentArg?.params?.pageSize !== previousArg?.params?.pageSize\n );\n },\n transformResponse: (response: FindAvailable.Response) => {\n if (response.results) {\n return {\n ...response,\n results: response.results,\n };\n } else {\n return response;\n }\n },\n }),\n }),\n});\n\n/**\n * @internal\n * @description Adds a `__temp_key__` to each relation item. This gives us\n * a stable identifier regardless of it's ids etc. that we can then use for drag and drop.\n */\nconst prepareTempKeys = (relations: RelResult[], existingRelations: RelationResult[] = []) => {\n const [firstItem] = existingRelations.slice(0);\n const keys = generateNKeysBetween(null, firstItem?.__temp_key__ ?? null, relations.length);\n\n return relations.map((datum, index) => ({\n ...datum,\n __temp_key__: keys[index],\n }));\n};\n\nconst { useGetRelationsQuery, useLazySearchRelationsQuery } = relationsApi;\n\nexport { useGetRelationsQuery, useLazySearchRelationsQuery };\nexport type { RelationResult };\n"],"names":["relationsApi","contentManagerApi","injectEndpoints","endpoints","build","getRelations","query","model","id","targetField","params","url","method","config","serializeQueryArgs","args","endpointName","queryArgs","locale","status","merge","currentCache","newItems","pagination","page","results","prepareTempKeys","forceRefetch","currentArg","previousArg","pageSize","transformResponse","response","toReversed","providesTags","searchRelations","_q","idsToOmit","idsToInclude","existingIds","Set","map","item","documentId","uniqueNewItems","filter","has","push","relations","existingRelations","firstItem","slice","keys","generateNKeysBetween","__temp_key__","length","datum","index","useGetRelationsQuery","useLazySearchRelationsQuery"],"mappings":"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"}
|
|
@@ -95,8 +95,8 @@ const relationsApi = contentManagerApi.injectEndpoints({
|
|
|
95
95
|
/**
|
|
96
96
|
* Relations will always have unique IDs, so we can therefore assume
|
|
97
97
|
* that we only need to push the new items to the cache.
|
|
98
|
-
*/ const existingIds = currentCache.results.map((item)=>item.documentId);
|
|
99
|
-
const uniqueNewItems = newItems.results.filter((item)=>!existingIds.
|
|
98
|
+
*/ const existingIds = new Set(currentCache.results.map((item)=>item.documentId));
|
|
99
|
+
const uniqueNewItems = newItems.results.filter((item)=>!existingIds.has(item.documentId));
|
|
100
100
|
currentCache.results.push(...uniqueNewItems);
|
|
101
101
|
currentCache.pagination = newItems.pagination;
|
|
102
102
|
} else if (newItems.pagination.page === 1) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relations.mjs","sources":["../../../admin/src/services/relations.ts"],"sourcesContent":["import { generateNKeysBetween } from 'fractional-indexing';\n\nimport {\n RelationResult as RelResult,\n FindAvailable,\n FindExisting,\n} from '../../../shared/contracts/relations';\n\nimport { contentManagerApi } from './api';\n\nimport type { Modules } from '@strapi/types';\nimport type { errors } from '@strapi/utils';\n\ninterface RelationResult extends RelResult {\n __temp_key__: string;\n}\n\ntype GetRelationsResponse =\n | {\n results: Array<RelationResult>;\n pagination: {\n page: NonNullable<Modules.EntityService.Params.Pagination.PageNotation['page']>;\n pageSize: NonNullable<Modules.EntityService.Params.Pagination.PageNotation['pageSize']>;\n pageCount: number;\n total: number;\n } | null;\n error?: never;\n }\n | {\n results?: never;\n pagination?: never;\n error: errors.ApplicationError | errors.YupValidationError;\n };\n\nconst relationsApi = contentManagerApi.injectEndpoints({\n endpoints: (build) => ({\n getRelations: build.query<\n GetRelationsResponse,\n FindExisting.Params & {\n params?: FindExisting.Request['query'];\n }\n >({\n query: ({ model, id, targetField, params }) => {\n return {\n url: `/content-manager/relations/${model}/${id}/${targetField}`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n serializeQueryArgs: (args) => {\n const { endpointName, queryArgs } = args;\n return {\n endpointName,\n model: queryArgs.model,\n id: queryArgs.id,\n targetField: queryArgs.targetField,\n locale: queryArgs.params?.locale,\n status: queryArgs.params?.status,\n };\n },\n merge: (currentCache, newItems) => {\n if (currentCache.pagination && newItems.pagination) {\n if (currentCache.pagination.page < newItems.pagination.page) {\n /**\n * Relations will always have unique IDs, so we can therefore assume\n * that we only need to push the new items to the cache.\n *\n * Push new items at the beginning as latest items are shown first\n */\n currentCache.results = [\n ...prepareTempKeys(newItems.results, currentCache.results),\n ...currentCache.results,\n ];\n currentCache.pagination = newItems.pagination;\n } else if (newItems.pagination.page === 1) {\n /**\n * We're resetting the relations\n */\n currentCache.results = prepareTempKeys(newItems.results);\n currentCache.pagination = newItems.pagination;\n }\n }\n },\n forceRefetch({ currentArg, previousArg }) {\n if (!currentArg?.params && !previousArg?.params) {\n return false;\n }\n\n return (\n currentArg?.params?.page !== previousArg?.params?.page ||\n currentArg?.params?.pageSize !== previousArg?.params?.pageSize\n );\n },\n transformResponse: (response: FindExisting.Response) => {\n if ('results' in response && response.results) {\n return {\n ...response,\n results: prepareTempKeys(response.results.toReversed()),\n };\n } else {\n return response;\n }\n },\n providesTags: ['Relations'],\n }),\n searchRelations: build.query<\n FindAvailable.Response,\n FindAvailable.Params & {\n params?: FindAvailable.Request['query'];\n }\n >({\n query: ({ model, targetField, params }) => {\n return {\n url: `/content-manager/relations/${model}/${targetField}`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n serializeQueryArgs: (args) => {\n const { endpointName, queryArgs } = args;\n return {\n endpointName,\n model: queryArgs.model,\n targetField: queryArgs.targetField,\n id: queryArgs.params?.id,\n locale: queryArgs.params?.locale,\n status: queryArgs.params?.status,\n _q: queryArgs.params?._q,\n idsToOmit: queryArgs.params?.idsToOmit,\n idsToInclude: queryArgs.params?.idsToInclude,\n };\n },\n merge: (currentCache, newItems) => {\n if (currentCache.pagination && newItems.pagination) {\n if (currentCache.pagination.page < newItems.pagination.page) {\n /**\n * Relations will always have unique IDs, so we can therefore assume\n * that we only need to push the new items to the cache.\n */\n const existingIds = currentCache.results.map((item) => item.documentId);\n const uniqueNewItems = newItems.results.filter(\n (item) => !existingIds.includes(item.documentId)\n );\n currentCache.results.push(...uniqueNewItems);\n currentCache.pagination = newItems.pagination;\n } else if (newItems.pagination.page === 1) {\n /**\n * We're resetting the relations\n */\n currentCache.results = newItems.results;\n currentCache.pagination = newItems.pagination;\n }\n }\n },\n forceRefetch({ currentArg, previousArg }) {\n if (!currentArg?.params && !previousArg?.params) {\n return false;\n }\n\n return (\n currentArg?.params?.page !== previousArg?.params?.page ||\n currentArg?.params?.pageSize !== previousArg?.params?.pageSize\n );\n },\n transformResponse: (response: FindAvailable.Response) => {\n if (response.results) {\n return {\n ...response,\n results: response.results,\n };\n } else {\n return response;\n }\n },\n }),\n }),\n});\n\n/**\n * @internal\n * @description Adds a `__temp_key__` to each relation item. This gives us\n * a stable identifier regardless of it's ids etc. that we can then use for drag and drop.\n */\nconst prepareTempKeys = (relations: RelResult[], existingRelations: RelationResult[] = []) => {\n const [firstItem] = existingRelations.slice(0);\n const keys = generateNKeysBetween(null, firstItem?.__temp_key__ ?? null, relations.length);\n\n return relations.map((datum, index) => ({\n ...datum,\n __temp_key__: keys[index],\n }));\n};\n\nconst { useGetRelationsQuery, useLazySearchRelationsQuery } = relationsApi;\n\nexport { useGetRelationsQuery, useLazySearchRelationsQuery };\nexport type { RelationResult };\n"],"names":["relationsApi","contentManagerApi","injectEndpoints","endpoints","build","getRelations","query","model","id","targetField","params","url","method","config","serializeQueryArgs","args","endpointName","queryArgs","locale","status","merge","currentCache","newItems","pagination","page","results","prepareTempKeys","forceRefetch","currentArg","previousArg","pageSize","transformResponse","response","toReversed","providesTags","searchRelations","_q","idsToOmit","idsToInclude","existingIds","map","item","documentId","uniqueNewItems","filter","includes","push","relations","existingRelations","firstItem","slice","keys","generateNKeysBetween","__temp_key__","length","datum","index","useGetRelationsQuery","useLazySearchRelationsQuery"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"relations.mjs","sources":["../../../admin/src/services/relations.ts"],"sourcesContent":["import { generateNKeysBetween } from 'fractional-indexing';\n\nimport {\n RelationResult as RelResult,\n FindAvailable,\n FindExisting,\n} from '../../../shared/contracts/relations';\n\nimport { contentManagerApi } from './api';\n\nimport type { Modules } from '@strapi/types';\nimport type { errors } from '@strapi/utils';\n\ninterface RelationResult extends RelResult {\n __temp_key__: string;\n}\n\ntype GetRelationsResponse =\n | {\n results: Array<RelationResult>;\n pagination: {\n page: NonNullable<Modules.EntityService.Params.Pagination.PageNotation['page']>;\n pageSize: NonNullable<Modules.EntityService.Params.Pagination.PageNotation['pageSize']>;\n pageCount: number;\n total: number;\n } | null;\n error?: never;\n }\n | {\n results?: never;\n pagination?: never;\n error: errors.ApplicationError | errors.YupValidationError;\n };\n\nconst relationsApi = contentManagerApi.injectEndpoints({\n endpoints: (build) => ({\n getRelations: build.query<\n GetRelationsResponse,\n FindExisting.Params & {\n params?: FindExisting.Request['query'];\n }\n >({\n query: ({ model, id, targetField, params }) => {\n return {\n url: `/content-manager/relations/${model}/${id}/${targetField}`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n serializeQueryArgs: (args) => {\n const { endpointName, queryArgs } = args;\n return {\n endpointName,\n model: queryArgs.model,\n id: queryArgs.id,\n targetField: queryArgs.targetField,\n locale: queryArgs.params?.locale,\n status: queryArgs.params?.status,\n };\n },\n merge: (currentCache, newItems) => {\n if (currentCache.pagination && newItems.pagination) {\n if (currentCache.pagination.page < newItems.pagination.page) {\n /**\n * Relations will always have unique IDs, so we can therefore assume\n * that we only need to push the new items to the cache.\n *\n * Push new items at the beginning as latest items are shown first\n */\n currentCache.results = [\n ...prepareTempKeys(newItems.results, currentCache.results),\n ...currentCache.results,\n ];\n currentCache.pagination = newItems.pagination;\n } else if (newItems.pagination.page === 1) {\n /**\n * We're resetting the relations\n */\n currentCache.results = prepareTempKeys(newItems.results);\n currentCache.pagination = newItems.pagination;\n }\n }\n },\n forceRefetch({ currentArg, previousArg }) {\n if (!currentArg?.params && !previousArg?.params) {\n return false;\n }\n\n return (\n currentArg?.params?.page !== previousArg?.params?.page ||\n currentArg?.params?.pageSize !== previousArg?.params?.pageSize\n );\n },\n transformResponse: (response: FindExisting.Response) => {\n if ('results' in response && response.results) {\n return {\n ...response,\n results: prepareTempKeys(response.results.toReversed()),\n };\n } else {\n return response;\n }\n },\n providesTags: ['Relations'],\n }),\n searchRelations: build.query<\n FindAvailable.Response,\n FindAvailable.Params & {\n params?: FindAvailable.Request['query'];\n }\n >({\n query: ({ model, targetField, params }) => {\n return {\n url: `/content-manager/relations/${model}/${targetField}`,\n method: 'GET',\n config: {\n params,\n },\n };\n },\n serializeQueryArgs: (args) => {\n const { endpointName, queryArgs } = args;\n return {\n endpointName,\n model: queryArgs.model,\n targetField: queryArgs.targetField,\n id: queryArgs.params?.id,\n locale: queryArgs.params?.locale,\n status: queryArgs.params?.status,\n _q: queryArgs.params?._q,\n idsToOmit: queryArgs.params?.idsToOmit,\n idsToInclude: queryArgs.params?.idsToInclude,\n };\n },\n merge: (currentCache, newItems) => {\n if (currentCache.pagination && newItems.pagination) {\n if (currentCache.pagination.page < newItems.pagination.page) {\n /**\n * Relations will always have unique IDs, so we can therefore assume\n * that we only need to push the new items to the cache.\n */\n const existingIds = new Set(currentCache.results.map((item) => item.documentId));\n const uniqueNewItems = newItems.results.filter(\n (item) => !existingIds.has(item.documentId)\n );\n currentCache.results.push(...uniqueNewItems);\n currentCache.pagination = newItems.pagination;\n } else if (newItems.pagination.page === 1) {\n /**\n * We're resetting the relations\n */\n currentCache.results = newItems.results;\n currentCache.pagination = newItems.pagination;\n }\n }\n },\n forceRefetch({ currentArg, previousArg }) {\n if (!currentArg?.params && !previousArg?.params) {\n return false;\n }\n\n return (\n currentArg?.params?.page !== previousArg?.params?.page ||\n currentArg?.params?.pageSize !== previousArg?.params?.pageSize\n );\n },\n transformResponse: (response: FindAvailable.Response) => {\n if (response.results) {\n return {\n ...response,\n results: response.results,\n };\n } else {\n return response;\n }\n },\n }),\n }),\n});\n\n/**\n * @internal\n * @description Adds a `__temp_key__` to each relation item. This gives us\n * a stable identifier regardless of it's ids etc. that we can then use for drag and drop.\n */\nconst prepareTempKeys = (relations: RelResult[], existingRelations: RelationResult[] = []) => {\n const [firstItem] = existingRelations.slice(0);\n const keys = generateNKeysBetween(null, firstItem?.__temp_key__ ?? null, relations.length);\n\n return relations.map((datum, index) => ({\n ...datum,\n __temp_key__: keys[index],\n }));\n};\n\nconst { useGetRelationsQuery, useLazySearchRelationsQuery } = relationsApi;\n\nexport { useGetRelationsQuery, useLazySearchRelationsQuery };\nexport type { RelationResult };\n"],"names":["relationsApi","contentManagerApi","injectEndpoints","endpoints","build","getRelations","query","model","id","targetField","params","url","method","config","serializeQueryArgs","args","endpointName","queryArgs","locale","status","merge","currentCache","newItems","pagination","page","results","prepareTempKeys","forceRefetch","currentArg","previousArg","pageSize","transformResponse","response","toReversed","providesTags","searchRelations","_q","idsToOmit","idsToInclude","existingIds","Set","map","item","documentId","uniqueNewItems","filter","has","push","relations","existingRelations","firstItem","slice","keys","generateNKeysBetween","__temp_key__","length","datum","index","useGetRelationsQuery","useLazySearchRelationsQuery"],"mappings":";;;AAkCA,MAAMA,YAAAA,GAAeC,iBAAAA,CAAkBC,eAAe,CAAC;IACrDC,SAAAA,EAAW,CAACC,SAAW;YACrBC,YAAAA,EAAcD,KAAAA,CAAME,KAAK,CAKvB;gBACAA,KAAAA,EAAO,CAAC,EAAEC,KAAK,EAAEC,EAAE,EAAEC,WAAW,EAAEC,MAAM,EAAE,GAAA;oBACxC,OAAO;wBACLC,GAAAA,EAAK,CAAC,2BAA2B,EAAEJ,KAAAA,CAAM,CAAC,EAAEC,EAAAA,CAAG,CAAC,EAAEC,WAAAA,CAAAA,CAAa;wBAC/DG,MAAAA,EAAQ,KAAA;wBACRC,MAAAA,EAAQ;AACNH,4BAAAA;AACF;AACF,qBAAA;AACF,gBAAA,CAAA;AACAI,gBAAAA,kBAAAA,EAAoB,CAACC,IAAAA,GAAAA;AACnB,oBAAA,MAAM,EAAEC,YAAY,EAAEC,SAAS,EAAE,GAAGF,IAAAA;oBACpC,OAAO;AACLC,wBAAAA,YAAAA;AACAT,wBAAAA,KAAAA,EAAOU,UAAUV,KAAK;AACtBC,wBAAAA,EAAAA,EAAIS,UAAUT,EAAE;AAChBC,wBAAAA,WAAAA,EAAaQ,UAAUR,WAAW;wBAClCS,MAAAA,EAAQD,SAAAA,CAAUP,MAAM,EAAEQ,MAAAA;wBAC1BC,MAAAA,EAAQF,SAAAA,CAAUP,MAAM,EAAES;AAC5B,qBAAA;AACF,gBAAA,CAAA;AACAC,gBAAAA,KAAAA,EAAO,CAACC,YAAAA,EAAcC,QAAAA,GAAAA;AACpB,oBAAA,IAAID,YAAAA,CAAaE,UAAU,IAAID,QAAAA,CAASC,UAAU,EAAE;wBAClD,IAAIF,YAAAA,CAAaE,UAAU,CAACC,IAAI,GAAGF,QAAAA,CAASC,UAAU,CAACC,IAAI,EAAE;AAC3D;;;;;gBAMAH,YAAAA,CAAaI,OAAO,GAAG;AAClBC,gCAAAA,GAAAA,eAAAA,CAAgBJ,QAAAA,CAASG,OAAO,EAAEJ,YAAAA,CAAaI,OAAO,CAAA;AACtDJ,gCAAAA,GAAAA,YAAAA,CAAaI;AACjB,6BAAA;4BACDJ,YAAAA,CAAaE,UAAU,GAAGD,QAAAA,CAASC,UAAU;AAC/C,wBAAA,CAAA,MAAO,IAAID,QAAAA,CAASC,UAAU,CAACC,IAAI,KAAK,CAAA,EAAG;AACzC;;AAEC,gBACDH,YAAAA,CAAaI,OAAO,GAAGC,eAAAA,CAAgBJ,SAASG,OAAO,CAAA;4BACvDJ,YAAAA,CAAaE,UAAU,GAAGD,QAAAA,CAASC,UAAU;AAC/C,wBAAA;AACF,oBAAA;AACF,gBAAA,CAAA;AACAI,gBAAAA,YAAAA,CAAAA,CAAa,EAAEC,UAAU,EAAEC,WAAW,EAAE,EAAA;AACtC,oBAAA,IAAI,CAACD,UAAAA,EAAYlB,MAAAA,IAAU,CAACmB,aAAanB,MAAAA,EAAQ;wBAC/C,OAAO,KAAA;AACT,oBAAA;oBAEA,OACEkB,UAAAA,EAAYlB,MAAAA,EAAQc,IAAAA,KAASK,WAAAA,EAAanB,MAAAA,EAAQc,QAClDI,UAAAA,EAAYlB,MAAAA,EAAQoB,QAAAA,KAAaD,WAAAA,EAAanB,MAAAA,EAAQoB,QAAAA;AAE1D,gBAAA,CAAA;AACAC,gBAAAA,iBAAAA,EAAmB,CAACC,QAAAA,GAAAA;AAClB,oBAAA,IAAI,SAAA,IAAaA,QAAAA,IAAYA,QAAAA,CAASP,OAAO,EAAE;wBAC7C,OAAO;AACL,4BAAA,GAAGO,QAAQ;AACXP,4BAAAA,OAAAA,EAASC,eAAAA,CAAgBM,QAAAA,CAASP,OAAO,CAACQ,UAAU,EAAA;AACtD,yBAAA;oBACF,CAAA,MAAO;wBACL,OAAOD,QAAAA;AACT,oBAAA;AACF,gBAAA,CAAA;gBACAE,YAAAA,EAAc;AAAC,oBAAA;AAAY;AAC7B,aAAA,CAAA;YACAC,eAAAA,EAAiB/B,KAAAA,CAAME,KAAK,CAK1B;AACAA,gBAAAA,KAAAA,EAAO,CAAC,EAAEC,KAAK,EAAEE,WAAW,EAAEC,MAAM,EAAE,GAAA;oBACpC,OAAO;AACLC,wBAAAA,GAAAA,EAAK,CAAC,2BAA2B,EAAEJ,KAAAA,CAAM,CAAC,EAAEE,WAAAA,CAAAA,CAAa;wBACzDG,MAAAA,EAAQ,KAAA;wBACRC,MAAAA,EAAQ;AACNH,4BAAAA;AACF;AACF,qBAAA;AACF,gBAAA,CAAA;AACAI,gBAAAA,kBAAAA,EAAoB,CAACC,IAAAA,GAAAA;AACnB,oBAAA,MAAM,EAAEC,YAAY,EAAEC,SAAS,EAAE,GAAGF,IAAAA;oBACpC,OAAO;AACLC,wBAAAA,YAAAA;AACAT,wBAAAA,KAAAA,EAAOU,UAAUV,KAAK;AACtBE,wBAAAA,WAAAA,EAAaQ,UAAUR,WAAW;wBAClCD,EAAAA,EAAIS,SAAAA,CAAUP,MAAM,EAAEF,EAAAA;wBACtBU,MAAAA,EAAQD,SAAAA,CAAUP,MAAM,EAAEQ,MAAAA;wBAC1BC,MAAAA,EAAQF,SAAAA,CAAUP,MAAM,EAAES,MAAAA;wBAC1BiB,EAAAA,EAAInB,SAAAA,CAAUP,MAAM,EAAE0B,EAAAA;wBACtBC,SAAAA,EAAWpB,SAAAA,CAAUP,MAAM,EAAE2B,SAAAA;wBAC7BC,YAAAA,EAAcrB,SAAAA,CAAUP,MAAM,EAAE4B;AAClC,qBAAA;AACF,gBAAA,CAAA;AACAlB,gBAAAA,KAAAA,EAAO,CAACC,YAAAA,EAAcC,QAAAA,GAAAA;AACpB,oBAAA,IAAID,YAAAA,CAAaE,UAAU,IAAID,QAAAA,CAASC,UAAU,EAAE;wBAClD,IAAIF,YAAAA,CAAaE,UAAU,CAACC,IAAI,GAAGF,QAAAA,CAASC,UAAU,CAACC,IAAI,EAAE;AAC3D;;;AAGC,gBACD,MAAMe,WAAAA,GAAc,IAAIC,GAAAA,CAAInB,YAAAA,CAAaI,OAAO,CAACgB,GAAG,CAAC,CAACC,IAAAA,GAASA,IAAAA,CAAKC,UAAU,CAAA,CAAA;AAC9E,4BAAA,MAAMC,cAAAA,GAAiBtB,QAAAA,CAASG,OAAO,CAACoB,MAAM,CAC5C,CAACH,IAAAA,GAAS,CAACH,WAAAA,CAAYO,GAAG,CAACJ,KAAKC,UAAU,CAAA,CAAA;4BAE5CtB,YAAAA,CAAaI,OAAO,CAACsB,IAAI,CAAA,GAAIH,cAAAA,CAAAA;4BAC7BvB,YAAAA,CAAaE,UAAU,GAAGD,QAAAA,CAASC,UAAU;AAC/C,wBAAA,CAAA,MAAO,IAAID,QAAAA,CAASC,UAAU,CAACC,IAAI,KAAK,CAAA,EAAG;AACzC;;AAEC,gBACDH,YAAAA,CAAaI,OAAO,GAAGH,QAAAA,CAASG,OAAO;4BACvCJ,YAAAA,CAAaE,UAAU,GAAGD,QAAAA,CAASC,UAAU;AAC/C,wBAAA;AACF,oBAAA;AACF,gBAAA,CAAA;AACAI,gBAAAA,YAAAA,CAAAA,CAAa,EAAEC,UAAU,EAAEC,WAAW,EAAE,EAAA;AACtC,oBAAA,IAAI,CAACD,UAAAA,EAAYlB,MAAAA,IAAU,CAACmB,aAAanB,MAAAA,EAAQ;wBAC/C,OAAO,KAAA;AACT,oBAAA;oBAEA,OACEkB,UAAAA,EAAYlB,MAAAA,EAAQc,IAAAA,KAASK,WAAAA,EAAanB,MAAAA,EAAQc,QAClDI,UAAAA,EAAYlB,MAAAA,EAAQoB,QAAAA,KAAaD,WAAAA,EAAanB,MAAAA,EAAQoB,QAAAA;AAE1D,gBAAA,CAAA;AACAC,gBAAAA,iBAAAA,EAAmB,CAACC,QAAAA,GAAAA;oBAClB,IAAIA,QAAAA,CAASP,OAAO,EAAE;wBACpB,OAAO;AACL,4BAAA,GAAGO,QAAQ;AACXP,4BAAAA,OAAAA,EAASO,SAASP;AACpB,yBAAA;oBACF,CAAA,MAAO;wBACL,OAAOO,QAAAA;AACT,oBAAA;AACF,gBAAA;AACF,aAAA;SACF;AACF,CAAA,CAAA;AAEA;;;;AAIC,IACD,MAAMN,eAAAA,GAAkB,CAACsB,SAAAA,EAAwBC,oBAAsC,EAAE,GAAA;AACvF,IAAA,MAAM,CAACC,SAAAA,CAAU,GAAGD,iBAAAA,CAAkBE,KAAK,CAAC,CAAA,CAAA;AAC5C,IAAA,MAAMC,OAAOC,oBAAAA,CAAqB,IAAA,EAAMH,WAAWI,YAAAA,IAAgB,IAAA,EAAMN,UAAUO,MAAM,CAAA;AAEzF,IAAA,OAAOP,UAAUP,GAAG,CAAC,CAACe,KAAAA,EAAOC,SAAW;AACtC,YAAA,GAAGD,KAAK;YACRF,YAAAA,EAAcF,IAAI,CAACK,KAAAA;SACrB,CAAA,CAAA;AACF,CAAA;AAEA,MAAM,EAAEC,oBAAoB,EAAEC,2BAA2B,EAAE,GAAG3D;;;;"}
|
|
@@ -12,7 +12,7 @@ interface FieldsProps extends Pick<EditLayout, 'metadatas'>, Pick<FieldProps, 'c
|
|
|
12
12
|
fieldSizes: Record<string, number>;
|
|
13
13
|
components: EditLayout['components'];
|
|
14
14
|
}
|
|
15
|
-
declare const Fields: ({ attributes, fieldSizes, components, metadatas }: FieldsProps) => import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
declare const Fields: ({ attributes, fieldSizes, components, metadatas, }: FieldsProps) => import("react/jsx-runtime").JSX.Element;
|
|
16
16
|
interface FieldProps extends Pick<EditFieldFormProps, 'name' | 'attribute'> {
|
|
17
17
|
components: EditLayout['components'];
|
|
18
18
|
dndId: string;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type Attributes = Record<string, unknown>;
|
|
2
|
+
type Renames = Record<string, string>;
|
|
3
|
+
/**
|
|
4
|
+
* The selected list columns live in the browser. A renamed field is no longer
|
|
5
|
+
* on the schema, so replace it with the name from the server map and drop a
|
|
6
|
+
* name that was deleted. A name that still exists is left alone, even when an
|
|
7
|
+
* older map mentions it.
|
|
8
|
+
*/
|
|
9
|
+
declare const applyAttributeRenamesToHeaders: (headers: string[], attributes: Attributes, renames: Renames) => string[];
|
|
10
|
+
declare const applyAttributeRenamesToSort: (sort: string, attributes: Attributes, renames: Renames) => string;
|
|
11
|
+
declare const applyAttributeRenamesToFilters: <T>(filters: T, attributes: Attributes, renames: Renames, renameKeys?: boolean) => T;
|
|
12
|
+
export { applyAttributeRenamesToFilters, applyAttributeRenamesToHeaders, applyAttributeRenamesToSort, };
|