@strapi/content-manager 5.58.0 → 5.60.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/history/components/VersionInputRenderer.js +2 -1
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs +2 -1
- package/dist/admin/history/components/VersionInputRenderer.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 +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +3 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +8 -6
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +8 -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 +6 -3
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +6 -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 +5 -4
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +5 -4
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js +3 -1
- package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
- package/dist/admin/pages/EditView/components/InputRenderer.mjs +3 -1
- package/dist/admin/pages/EditView/components/InputRenderer.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/preview/components/PreviewSidePanel.js +2 -1
- package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -1
- package/dist/admin/preview/components/PreviewSidePanel.mjs +2 -1
- package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -1
- package/dist/admin/preview/utils/getPreviewUrlStatus.js +17 -0
- package/dist/admin/preview/utils/getPreviewUrlStatus.js.map +1 -0
- package/dist/admin/preview/utils/getPreviewUrlStatus.mjs +15 -0
- package/dist/admin/preview/utils/getPreviewUrlStatus.mjs.map +1 -0
- 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/history/components/VersionInputRenderer.d.ts +3 -1
- package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +2 -0
- package/dist/admin/src/pages/ListView/utils/applyAttributeRenames.d.ts +12 -0
- package/dist/admin/src/preview/utils/getPreviewUrlStatus.d.ts +6 -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/controllers/relations.js +48 -16
- package/dist/server/controllers/relations.js.map +1 -1
- package/dist/server/controllers/relations.mjs +49 -17
- package/dist/server/controllers/relations.mjs.map +1 -1
- package/dist/server/history/services/history.js +1 -1
- package/dist/server/history/services/history.js.map +1 -1
- package/dist/server/history/services/history.mjs +1 -1
- package/dist/server/history/services/history.mjs.map +1 -1
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/mcp/schemas/filters-schema.js +10 -2
- package/dist/server/mcp/schemas/filters-schema.js.map +1 -1
- package/dist/server/mcp/schemas/filters-schema.mjs +10 -2
- package/dist/server/mcp/schemas/filters-schema.mjs.map +1 -1
- package/dist/server/preview/controllers/validation/preview.js +1 -1
- package/dist/server/preview/controllers/validation/preview.js.map +1 -1
- package/dist/server/preview/controllers/validation/preview.mjs +2 -2
- package/dist/server/preview/controllers/validation/preview.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/document-metadata.js +1 -1
- package/dist/server/services/document-metadata.js.map +1 -1
- package/dist/server/services/document-metadata.mjs +1 -1
- package/dist/server/services/document-metadata.mjs.map +1 -1
- 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/controllers/relations.d.ts.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/mcp/schemas/filters-schema.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 +7 -7
|
@@ -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":";;;;;;;;;;;;;;;AAyBA;;AAEkG,qGAElG,MAAMA,kBAAAA,GAAqB,IAAA;AACzB,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,CAAC,GAAGC,cAAAA,EAAAA;IAGpB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAE1B,IAAA,MAAMC,YAAYC,UAAAA,CAAW,YAAA,EAAc,CAACC,KAAAA,GAAUA,MAAMF,SAAS,CAAA;AACrE,IAAA,MAAMG,SAASF,UAAAA,CAAW,YAAA,EAAc,CAACC,KAAAA,GAAUA,MAAMC,MAAM,CAAA;AAC/D,IAAA,MAAMC,UAAUH,UAAAA,CAAW,YAAA,EAAc,CAACC,KAAAA,GAAUA,MAAME,OAAO,CAAA;AACjE,IAAA,MAAMC,gBAAgBJ,UAAAA,CAAW,YAAA,EAAc,CAACC,KAAAA,GAAUA,MAAMI,oBAAoB,CAAA;AAEpF;;;AAGC,MACD,MAAMC,SAAAA,GAAYP,SAAAA,GAAYI,QAAQI,EAAE,CAACH,gBAAgB,CAAA,CAAA,GAAKI,SAAAA;AAC9D,IAAA,MAAMC,QAAAA,GAAW;QACfC,QAAAA,EAAU,IAAA;AACVC,QAAAA,MAAAA,EAAQC,UAAUjB,KAAAA,EAAO;YAAEkB,MAAAA,EAAQ;AAAM,SAAA;AAC3C,KAAA;AACA,IAAA,MAAMC,iBAAiBR,SAAAA,IAAaG,QAAAA;AAEpC,IAAA,MAAMM,cAAc,CAACC,CAAAA,GAAAA;AACnB,QAAA,IAAIjB,SAAAA,EAAW;;AAEbiB,YAAAA,CAAAA,CAAEC,cAAc,EAAA;AAChBf,YAAAA,MAAAA,EAAAA;AACA,YAAA;AACF,QAAA;;;AAIF,IAAA,CAAA;AAEA,IAAA,qBACEgB,GAAA,CAACC,UAAAA,EAAAA;QACCC,OAAAA,EAAQ,OAAA;QACRC,GAAAA,EAAKC,MAAAA;QACLC,QAAAA,EAAS,MAAA;QACTC,EAAAA,EAAIV,cAAAA;QACJW,OAAAA,EAASV,WAAAA;AACTW,QAAAA,KAAAA,EAAO7B,aAAAA,CAAc;YACnB8B,EAAAA,EAAI,sCAAA;YACJC,cAAAA,EAAgB;AAClB,SAAA,CAAA;AAEA,QAAA,QAAA,gBAAAV,GAAA,CAACW,KAAAA,EAAAA,EAAAA;;AAGP,CAAA;AAEA;;AAEkG,qGAElG,MAAMC,MAAAA,GAAS,IAAA;;AAEb,IAAA,MAAMC,WAAWC,iBAAAA,CAAkB,eAAA,EAAiB,CAAC/B,KAAAA,GAAUA,MAAM8B,QAAQ,CAAA;AAC7E,IAAA,MAAME,SAASD,iBAAAA,CAAkB,eAAA,EAAiB,CAAC/B,KAAAA,GAAUA,MAAMgC,MAAM,CAAA;AACzE,IAAA,MAAMC,OAAOF,iBAAAA,CAAkB,eAAA,EAAiB,CAAC/B,KAAAA,GAAUA,MAAMiC,IAAI,CAAA;IACrE,MAAMC,oBAAAA,GAAuBF,MAAAA,EAAQG,OAAAA,EAASC,eAAAA,IAAmB,KAAA;AAEjE,IAAA,IAAI,CAACF,oBAAAA,EAAsB;QACzB,OAAO,IAAA;AACT,IAAA;IAEA,MAAMG,MAAAA,GAASC,kBAAkBR,QAAAA,EAAUG,IAAAA,CAAAA;AAE3C,IAAA,qBAAOhB,GAAA,CAACsB,cAAAA,EAAAA;QAAeF,MAAAA,EAAQA,MAAAA;QAAQG,IAAAA,EAAK;;AAC9C,CAAA;AAEA,MAAMC,WAAAA,GAAc,IAAA;IAClB,MAAM,EAAE7C,aAAa,EAAE,GAAGC,OAAAA,EAAAA;;AAG1B,IAAA,MAAM,CAAC,EAAEH,KAAK,EAAE,EAAEgD,SAAS,GAAG/C,cAAAA,EAAAA;;AAG9B,IAAA,MAAMmC,WAAWC,iBAAAA,CAAkB,eAAA,EAAiB,CAAC/B,KAAAA,GAAUA,MAAM8B,QAAQ,CAAA;AAC7E,IAAA,MAAME,SAASD,iBAAAA,CAAkB,eAAA,EAAiB,CAAC/B,KAAAA,GAAUA,MAAMgC,MAAM,CAAA;AACzE,IAAA,MAAMC,OAAOF,iBAAAA,CAAkB,eAAA,EAAiB,CAAC/B,KAAAA,GAAUA,MAAMiC,IAAI,CAAA;IACrE,MAAMU,kBAAAA,GAAqBX,MAAAA,EAAQG,OAAAA,EAASC,eAAAA,IAAmB,KAAA;IAC/D,MAAMQ,cAAAA,GAAiBN,kBAAkBR,QAAAA,EAAUG,IAAAA,CAAAA;AAEnD,IAAA,MAAMY,kBAAkB,CAACR,MAAAA,GAAAA;QACvB,IAAIA,MAAAA,KAAW,WAAA,IAAeA,MAAAA,KAAW,OAAA,EAAS;YAChDK,QAAAA,CAAS;AAAEL,gBAAAA;AAAO,aAAA,EAAG,MAAA,EAAQ,IAAA,CAAA;AAC/B,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,IAAI,CAACM,kBAAAA,EAAoB;QACvB,OAAO,IAAA;AACT,IAAA;IAEA,qBACE1B,GAAA,CAAC6B,KAAKC,IAAI,EAAA;QAAC5B,OAAAA,EAAQ,QAAA;QAAS6B,KAAAA,EAAOtD,KAAAA,CAAM2C,MAAM,IAAI,OAAA;QAASY,aAAAA,EAAeJ,eAAAA;gCACzEK,IAAA,CAACJ,KAAKK,IAAI,EAAA;AACRC,YAAAA,YAAAA,EAAYxD,aAAAA,CAAc;gBACxB8B,EAAAA,EAAI,oBAAA;gBACJC,cAAAA,EAAgB;AAClB,aAAA,CAAA;;8BAEAV,GAAA,CAACoC,SAAAA,EAAAA;oBAAUL,KAAAA,EAAM,OAAA;8BACdpD,aAAAA,CAAc;wBACb8B,EAAAA,EAAI,uCAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;8BAEFV,GAAA,CAACoC,SAAAA,EAAAA;oBAAUL,KAAAA,EAAM,WAAA;AAAYM,oBAAAA,QAAAA,EAAUV,cAAAA,KAAmB,OAAA;8BACvDhD,aAAAA,CAAc;wBACb8B,EAAAA,EAAI,2CAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA;;;;;AAKV,CAAA;AAEA;;AAEkG,2GAE5F4B,aAAAA,GAAgB,IAAA;AACpB,IAAA,MAAMC,QAAQzB,iBAAAA,CAAkB,eAAA,EAAiB,CAAC/B,KAAAA,GAAUA,MAAMwD,KAAK,CAAA;AACvE,IAAA,MAAM1B,WAAWC,iBAAAA,CAAkB,eAAA,EAAiB,CAAC/B,KAAAA,GAAUA,MAAM8B,QAAQ,CAAA;AAC7E,IAAA,MAAME,SAASD,iBAAAA,CAAkB,eAAA,EAAiB,CAAC/B,KAAAA,GAAUA,MAAMgC,MAAM,CAAA;AACzE,IAAA,MAAMC,OAAOF,iBAAAA,CAAkB,eAAA,EAAiB,CAAC/B,KAAAA,GAAUA,MAAMiC,IAAI,CAAA;AACrE,IAAA,MAAMwB,UAAUC,YAAAA,CAAa,eAAA,EAAiB,CAAC1D,KAAAA,GAAUA,MAAMyD,OAAO,CAAA;AAEtE,IAAA,MAAM,CAAC,EAAE/D,KAAK,EAAE,CAAC,GAAGC,cAAAA,EAAAA;IAGpB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAE8D,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;IAC/B,MAAM,EAAEC,IAAI,EAAE,GAAGC,YAAAA,EAAAA;AAEjB,IAAA,MAAMC,cAAAA,GAAiB,IAAA;QACrBF,IAAAA,CAAKG,MAAAA,CAAOC,QAAQ,CAACC,IAAI,CAAA;QACzBP,kBAAAA,CAAmB;AACjBQ,YAAAA,OAAAA,EAASvE,aAAAA,CAAc;gBACrB8B,EAAAA,EAAI,sCAAA;gBACJC,cAAAA,EAAgB;AAClB,aAAA,CAAA;YACAyC,IAAAA,EAAM;AACR,SAAA,CAAA;AACF,IAAA,CAAA;IAEA,MAAMC,SAAAA,GAAY3E,KAAAA,CAAM2C,MAAM,IAAI,IAAA;AAClC,IAAA,MAAMM,kBAAAA,GAAqBX,MAAAA,CAAOG,OAAO,EAAEC,eAAAA,IAAmB,KAAA;AAC9D,IAAA,MAAMkC,mBAAAA,GAAsB;AAC1BD,QAAAA,SAAAA;AACAE,QAAAA,cAAAA,EAAgBvC,MAAAA,CAAOwC,IAAI,KAAK,gBAAA,GAAmB,kBAAA,GAAqB,cAAA;AACxEC,QAAAA,KAAAA,EAAOzC,OAAO0C,GAAG;AACjBC,QAAAA,UAAAA,EAAY3C,OAAOwC,IAAI,KAAK,gBAAA,GAAmB1C,QAAAA,CAAS6C,UAAU,GAAGpE,SAAAA;AACrEuB,QAAAA,QAAAA;AACAG,QAAAA;AACF,KAAA;AAEA,IAAA,qBACEiB,IAAA,CAAC0B,IAAAA,EAAAA;QAAKC,MAAAA,EAAO,MAAA;QAAOC,GAAAA,EAAK,CAAA;QAAGC,UAAAA,EAAW,UAAA;QAAWC,WAAAA,EAAY,YAAA;QAAa5D,GAAAA,EAAI,QAAA;;0BAE7E8B,IAAA,CAAC+B,cAAAA,EAAAA;gBAAeJ,MAAAA,EAAO,MAAA;gBAAOK,WAAAA,EAAa,CAAA;gBAAGC,YAAAA,EAAc,CAAA;;kCAC1DlE,GAAA,CAACxB,kBAAAA,EAAAA,EAAAA,CAAAA;kCACDwB,GAAA,CAACmE,YAAAA,EAAAA;wBACChE,GAAAA,EAAI,IAAA;wBACJoC,KAAAA,EAAOA,KAAAA;wBACP6B,QAAAA,EAAS,OAAA;wBACTC,QAAAA,EAAU,CAAA;wBACVJ,WAAAA,EAAa,CAAA;wBACbC,YAAAA,EAAc,CAAA;wBACdI,UAAAA,EAAY,GAAA;AAEX/B,wBAAAA,QAAAA,EAAAA;;kCAEHvC,GAAA,CAACY,MAAAA,EAAAA,EAAAA;;;0BAIHqB,IAAA,CAAC0B,IAAAA,EAAAA;gBACCY,IAAAA,EAAM,CAAA;gBACNL,YAAAA,EAAc,CAAA;gBACdL,GAAAA,EAAK,CAAA;AACLW,gBAAAA,cAAAA,EAAgB9C,qBAAqB,eAAA,GAAkB,UAAA;;kCAEvD1B,GAAA,CAAC2D,IAAAA,EAAAA;wBAAKY,IAAAA,EAAK,SAAA;AACT,wBAAA,QAAA,gBAAAvE,GAAA,CAACwB,WAAAA,EAAAA,EAAAA;;kCAEHS,IAAA,CAAC0B,IAAAA,EAAAA;wBAAKE,GAAAA,EAAK,CAAA;;0CACT7D,GAAA,CAACC,UAAAA,EAAAA;AACCO,gCAAAA,KAAAA,EAAO7B,aAAAA,CAAc;oCACnB8B,EAAAA,EAAI,oBAAA;oCACJC,cAAAA,EAAgB;AAClB,iCAAA,CAAA;gCACAH,OAAAA,EAASuC,cAAAA;AAET,gCAAA,QAAA,gBAAA9C,GAAA,CAACyE,IAAAA,EAAAA,EAAAA;;0CAEHzE,GAAA,CAAC0E,aAAAA,EAAAA;AAAe,gCAAA,GAAGrB,mBAAmB;gCAAEsB,IAAAA,EAAK;;0CAC7C3E,GAAA,CAAC4E,4BAAAA,EAAAA;gCACCC,KAAAA,EAAOxB,mBAAAA;gCACPyB,YAAAA,EACEtC,OAAO,CAAC,iBAAA,CAAkB,CAACuC,IAAI,CAC/BC,kBAAkB,CAAC,SAAA,CAAA;0CAEpB,CAACC,OAAAA,GAAAA;AACA,oCAAA,MAAMC,eAAAA,GAAkBD,OAAAA,CAAQE,MAAM,CAAC,CAACC,MAAAA,GACtC;AAACA,4CAAAA,MAAAA,CAAOC;yCAAS,CAACC,IAAI,EAAA,CAAGC,QAAQ,CAAC,SAAA,CAAA,CAAA;oCAEpC,MAAM,CAACC,aAAAA,EAAeC,eAAAA,CAAgB,GAAGP,eAAAA;AAEzC,oCAAA,IAAI,CAACM,aAAAA,IAAiB,CAACC,eAAAA,EAAiB,OAAO,IAAA;;AAG/C,oCAAA,IAAID,iBAAiBC,eAAAA,EAAiB;wCACpC,qBACExD,IAAA,CAAAyD,QAAA,EAAA;;8DAEE1F,GAAA,CAAC2F,oBAAAA,EAAAA;AACE,oDAAA,GAAGF,eAAe;oDACnBvF,OAAAA,EAASuF,eAAAA,CAAgBvF,OAAO,IAAI;;8DAGtCF,GAAA,CAAC2F,oBAAAA,EAAAA;AACE,oDAAA,GAAGH,aAAa;oDACjBtF,OAAAA,EAASsF,aAAAA,CAActF,OAAO,IAAI;;;;AAI1C,oCAAA;;AAGA,oCAAA,qBACEF,GAAA,CAAC2F,oBAAAA,EAAAA;AACE,wCAAA,GAAGH,aAAa;wCACjBtF,OAAAA,EAASsF,aAAAA,CAActF,OAAO,IAAI;;AAGxC,gCAAA;;;;;;;;AAMZ;AAEA,MAAMiE,YAAAA,GAAeyB,MAAAA,CAAOC,UAAAA,CAAW;;;;AAIvC,CAAC;AAED,MAAMzD,SAAAA,GAAYwD,MAAAA,CAAO/D,IAAAA,CAAKiE,OAAO,CAAC;;AAEtC,CAAC;AAED,MAAM9B,cAAAA,GAAiB4B,MAAAA,CAAOjC,IAAAA,CAAK;0BACT,EAAE,CAAC,EAAEoC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACC,UAAU,CAAC;AACnE,CAAC;;;;"}
|
|
@@ -8,6 +8,7 @@ var qs = require('qs');
|
|
|
8
8
|
var reactIntl = require('react-intl');
|
|
9
9
|
var reactRouterDom = require('react-router-dom');
|
|
10
10
|
var preview = require('../services/preview.js');
|
|
11
|
+
var getPreviewUrlStatus = require('../utils/getPreviewUrlStatus.js');
|
|
11
12
|
|
|
12
13
|
function _interopNamespace(e) {
|
|
13
14
|
if (e && e.__esModule) return e;
|
|
@@ -63,7 +64,7 @@ const PreviewSidePanel = ({ model, documentId, document })=>{
|
|
|
63
64
|
query: {
|
|
64
65
|
documentId,
|
|
65
66
|
locale: document?.locale,
|
|
66
|
-
status: document?.status
|
|
67
|
+
status: getPreviewUrlStatus.getPreviewUrlStatus(document?.status)
|
|
67
68
|
}
|
|
68
69
|
}, // Don't bother making the request since we won't show any UI
|
|
69
70
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewSidePanel.js","sources":["../../../../admin/src/preview/components/PreviewSidePanel.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams, useTracking, useForm } from '@strapi/admin/strapi-admin';\nimport { Box, Button, Tooltip, type TooltipProps } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link, useLocation } from 'react-router-dom';\n\nimport { useGetPreviewUrlQuery } from '../services/preview';\n\nimport type { PanelComponent } from '@strapi/content-manager/strapi-admin';\nimport type { UID } from '@strapi/types';\n\ninterface ConditionalTooltipProps {\n isShown: boolean;\n label: TooltipProps['label'];\n children: React.ReactNode;\n}\n\n/**\n * Always keeps the Tooltip (and therefore the children subtree) mounted: conditionally wrapping\n * would remount the child button whenever `isShown` flips, and a click landing during that swap\n * is silently lost. When the tooltip must not show, it is force-closed via the controlled `open`\n * prop instead of being removed from the tree.\n */\nconst ConditionalTooltip = ({ isShown, label, children }: ConditionalTooltipProps) => {\n return (\n <Tooltip label={label} open={isShown ? undefined : false}>\n {children}\n </Tooltip>\n );\n};\n\nconst PreviewSidePanel: PanelComponent = ({ model, documentId, document }) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const isModified = useForm('PreviewSidePanel', (state) => state.modified);\n const isUnsaved = Boolean(!document || !document.id);\n\n const title = formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n });\n\n /**\n * The preview URL isn't used in this component, we just fetch it to know if preview is enabled\n * for the content type. If it's not, the panel is not displayed. If it is, we display a link to\n * /preview, and the URL will already be loaded in the RTK query cache.\n */\n const { data, error } = useGetPreviewUrlQuery(\n {\n params: {\n contentType: model as UID.ContentType,\n },\n query: {\n documentId,\n locale: document?.locale,\n status: document?.status,\n },\n },\n // Don't bother making the request since we won't show any UI\n { skip: isUnsaved }\n );\n\n /**\n * The query args above change while the document settles (locale/status resolve after load and\n * on save/publish), and each change is a new cache entry with transiently empty data. Latch\n * enablement once a URL has been seen so the \"Open preview\" button doesn't unmount and remount\n * mid-interaction — a click landing during such a swap is silently lost.\n */\n const [isPreviewEnabled, setIsPreviewEnabled] = React.useState(false);\n const previewUrl = data?.data?.url;\n React.useEffect(() => {\n if (previewUrl) {\n setIsPreviewEnabled(true);\n }\n }, [previewUrl]);\n\n if (isUnsaved) {\n return null;\n }\n\n // Preview was not configured but not disabled either (otherwise it would be a success 204).\n // So we encourage the user to set it up.\n if (error && error.name === 'NotFoundError') {\n return {\n title,\n content: (\n <Button\n variant=\"tertiary\"\n tag={Link}\n to=\"https://docs.strapi.io/cms/features/preview\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n width=\"100%\"\n >\n {formatMessage({\n id: 'content-manager.preview.panel.button-configuration',\n defaultMessage: 'Set up preview',\n })}\n </Button>\n ),\n };\n }\n\n if (!isPreviewEnabled && (!data?.data?.url || error)) {\n return null;\n }\n\n const trackNavigation = () => {\n // Append /preview to the current URL\n const destinationPathname = pathname.replace(/\\/$/, '') + '/preview';\n trackUsage('willNavigate', { from: pathname, to: destinationPathname });\n };\n\n return {\n title,\n content: (\n <ConditionalTooltip\n label={formatMessage({\n id: 'content-manager.preview.panel.button-disabled-tooltip',\n defaultMessage: 'Please save to open the preview',\n })}\n isShown={isModified}\n >\n <Box cursor=\"not-allowed\" width=\"100%\">\n <Button\n variant=\"tertiary\"\n tag={Link}\n to={{ pathname: 'preview', search: stringify(query, { encode: false }) }}\n onClick={trackNavigation}\n width=\"100%\"\n disabled={isModified}\n pointerEvents={isModified ? 'none' : undefined}\n tabIndex={isModified ? -1 : undefined}\n >\n {formatMessage({\n id: 'content-manager.preview.panel.button',\n defaultMessage: 'Open preview',\n })}\n </Button>\n </Box>\n </ConditionalTooltip>\n ),\n };\n};\n\nexport { PreviewSidePanel };\n"],"names":["ConditionalTooltip","isShown","label","children","_jsx","Tooltip","open","undefined","PreviewSidePanel","model","documentId","document","formatMessage","useIntl","trackUsage","useTracking","pathname","useLocation","query","useQueryParams","isModified","useForm","state","modified","isUnsaved","Boolean","id","title","defaultMessage","data","error","useGetPreviewUrlQuery","params","contentType","locale","status","skip","isPreviewEnabled","setIsPreviewEnabled","React","useState","previewUrl","url","useEffect","name","content","Button","variant","tag","Link","to","target","rel","width","trackNavigation","destinationPathname","replace","from","Box","cursor","search","stringify","encode","onClick","disabled","pointerEvents","tabIndex"],"mappings":"
|
|
1
|
+
{"version":3,"file":"PreviewSidePanel.js","sources":["../../../../admin/src/preview/components/PreviewSidePanel.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams, useTracking, useForm } from '@strapi/admin/strapi-admin';\nimport { Box, Button, Tooltip, type TooltipProps } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link, useLocation } from 'react-router-dom';\n\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { getPreviewUrlStatus } from '../utils/getPreviewUrlStatus';\n\nimport type { PanelComponent } from '@strapi/content-manager/strapi-admin';\nimport type { UID } from '@strapi/types';\n\ninterface ConditionalTooltipProps {\n isShown: boolean;\n label: TooltipProps['label'];\n children: React.ReactNode;\n}\n\n/**\n * Always keeps the Tooltip (and therefore the children subtree) mounted: conditionally wrapping\n * would remount the child button whenever `isShown` flips, and a click landing during that swap\n * is silently lost. When the tooltip must not show, it is force-closed via the controlled `open`\n * prop instead of being removed from the tree.\n */\nconst ConditionalTooltip = ({ isShown, label, children }: ConditionalTooltipProps) => {\n return (\n <Tooltip label={label} open={isShown ? undefined : false}>\n {children}\n </Tooltip>\n );\n};\n\nconst PreviewSidePanel: PanelComponent = ({ model, documentId, document }) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const isModified = useForm('PreviewSidePanel', (state) => state.modified);\n const isUnsaved = Boolean(!document || !document.id);\n\n const title = formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n });\n\n /**\n * The preview URL isn't used in this component, we just fetch it to know if preview is enabled\n * for the content type. If it's not, the panel is not displayed. If it is, we display a link to\n * /preview, and the URL will already be loaded in the RTK query cache.\n */\n const { data, error } = useGetPreviewUrlQuery(\n {\n params: {\n contentType: model as UID.ContentType,\n },\n query: {\n documentId,\n locale: document?.locale,\n status: getPreviewUrlStatus(document?.status),\n },\n },\n // Don't bother making the request since we won't show any UI\n { skip: isUnsaved }\n );\n\n /**\n * The query args above change while the document settles (locale/status resolve after load and\n * on save/publish), and each change is a new cache entry with transiently empty data. Latch\n * enablement once a URL has been seen so the \"Open preview\" button doesn't unmount and remount\n * mid-interaction — a click landing during such a swap is silently lost.\n */\n const [isPreviewEnabled, setIsPreviewEnabled] = React.useState(false);\n const previewUrl = data?.data?.url;\n React.useEffect(() => {\n if (previewUrl) {\n setIsPreviewEnabled(true);\n }\n }, [previewUrl]);\n\n if (isUnsaved) {\n return null;\n }\n\n // Preview was not configured but not disabled either (otherwise it would be a success 204).\n // So we encourage the user to set it up.\n if (error && error.name === 'NotFoundError') {\n return {\n title,\n content: (\n <Button\n variant=\"tertiary\"\n tag={Link}\n to=\"https://docs.strapi.io/cms/features/preview\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n width=\"100%\"\n >\n {formatMessage({\n id: 'content-manager.preview.panel.button-configuration',\n defaultMessage: 'Set up preview',\n })}\n </Button>\n ),\n };\n }\n\n if (!isPreviewEnabled && (!data?.data?.url || error)) {\n return null;\n }\n\n const trackNavigation = () => {\n // Append /preview to the current URL\n const destinationPathname = pathname.replace(/\\/$/, '') + '/preview';\n trackUsage('willNavigate', { from: pathname, to: destinationPathname });\n };\n\n return {\n title,\n content: (\n <ConditionalTooltip\n label={formatMessage({\n id: 'content-manager.preview.panel.button-disabled-tooltip',\n defaultMessage: 'Please save to open the preview',\n })}\n isShown={isModified}\n >\n <Box cursor=\"not-allowed\" width=\"100%\">\n <Button\n variant=\"tertiary\"\n tag={Link}\n to={{ pathname: 'preview', search: stringify(query, { encode: false }) }}\n onClick={trackNavigation}\n width=\"100%\"\n disabled={isModified}\n pointerEvents={isModified ? 'none' : undefined}\n tabIndex={isModified ? -1 : undefined}\n >\n {formatMessage({\n id: 'content-manager.preview.panel.button',\n defaultMessage: 'Open preview',\n })}\n </Button>\n </Box>\n </ConditionalTooltip>\n ),\n };\n};\n\nexport { PreviewSidePanel };\n"],"names":["ConditionalTooltip","isShown","label","children","_jsx","Tooltip","open","undefined","PreviewSidePanel","model","documentId","document","formatMessage","useIntl","trackUsage","useTracking","pathname","useLocation","query","useQueryParams","isModified","useForm","state","modified","isUnsaved","Boolean","id","title","defaultMessage","data","error","useGetPreviewUrlQuery","params","contentType","locale","status","getPreviewUrlStatus","skip","isPreviewEnabled","setIsPreviewEnabled","React","useState","previewUrl","url","useEffect","name","content","Button","variant","tag","Link","to","target","rel","width","trackNavigation","destinationPathname","replace","from","Box","cursor","search","stringify","encode","onClick","disabled","pointerEvents","tabIndex"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { stringify } from 'qs';
|
|
|
6
6
|
import { useIntl } from 'react-intl';
|
|
7
7
|
import { useLocation, Link } from 'react-router-dom';
|
|
8
8
|
import { useGetPreviewUrlQuery } from '../services/preview.mjs';
|
|
9
|
+
import { getPreviewUrlStatus } from '../utils/getPreviewUrlStatus.mjs';
|
|
9
10
|
|
|
10
11
|
/**
|
|
11
12
|
* Always keeps the Tooltip (and therefore the children subtree) mounted: conditionally wrapping
|
|
@@ -41,7 +42,7 @@ const PreviewSidePanel = ({ model, documentId, document })=>{
|
|
|
41
42
|
query: {
|
|
42
43
|
documentId,
|
|
43
44
|
locale: document?.locale,
|
|
44
|
-
status: document?.status
|
|
45
|
+
status: getPreviewUrlStatus(document?.status)
|
|
45
46
|
}
|
|
46
47
|
}, // Don't bother making the request since we won't show any UI
|
|
47
48
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PreviewSidePanel.mjs","sources":["../../../../admin/src/preview/components/PreviewSidePanel.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams, useTracking, useForm } from '@strapi/admin/strapi-admin';\nimport { Box, Button, Tooltip, type TooltipProps } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link, useLocation } from 'react-router-dom';\n\nimport { useGetPreviewUrlQuery } from '../services/preview';\n\nimport type { PanelComponent } from '@strapi/content-manager/strapi-admin';\nimport type { UID } from '@strapi/types';\n\ninterface ConditionalTooltipProps {\n isShown: boolean;\n label: TooltipProps['label'];\n children: React.ReactNode;\n}\n\n/**\n * Always keeps the Tooltip (and therefore the children subtree) mounted: conditionally wrapping\n * would remount the child button whenever `isShown` flips, and a click landing during that swap\n * is silently lost. When the tooltip must not show, it is force-closed via the controlled `open`\n * prop instead of being removed from the tree.\n */\nconst ConditionalTooltip = ({ isShown, label, children }: ConditionalTooltipProps) => {\n return (\n <Tooltip label={label} open={isShown ? undefined : false}>\n {children}\n </Tooltip>\n );\n};\n\nconst PreviewSidePanel: PanelComponent = ({ model, documentId, document }) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const isModified = useForm('PreviewSidePanel', (state) => state.modified);\n const isUnsaved = Boolean(!document || !document.id);\n\n const title = formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n });\n\n /**\n * The preview URL isn't used in this component, we just fetch it to know if preview is enabled\n * for the content type. If it's not, the panel is not displayed. If it is, we display a link to\n * /preview, and the URL will already be loaded in the RTK query cache.\n */\n const { data, error } = useGetPreviewUrlQuery(\n {\n params: {\n contentType: model as UID.ContentType,\n },\n query: {\n documentId,\n locale: document?.locale,\n status: document?.status,\n },\n },\n // Don't bother making the request since we won't show any UI\n { skip: isUnsaved }\n );\n\n /**\n * The query args above change while the document settles (locale/status resolve after load and\n * on save/publish), and each change is a new cache entry with transiently empty data. Latch\n * enablement once a URL has been seen so the \"Open preview\" button doesn't unmount and remount\n * mid-interaction — a click landing during such a swap is silently lost.\n */\n const [isPreviewEnabled, setIsPreviewEnabled] = React.useState(false);\n const previewUrl = data?.data?.url;\n React.useEffect(() => {\n if (previewUrl) {\n setIsPreviewEnabled(true);\n }\n }, [previewUrl]);\n\n if (isUnsaved) {\n return null;\n }\n\n // Preview was not configured but not disabled either (otherwise it would be a success 204).\n // So we encourage the user to set it up.\n if (error && error.name === 'NotFoundError') {\n return {\n title,\n content: (\n <Button\n variant=\"tertiary\"\n tag={Link}\n to=\"https://docs.strapi.io/cms/features/preview\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n width=\"100%\"\n >\n {formatMessage({\n id: 'content-manager.preview.panel.button-configuration',\n defaultMessage: 'Set up preview',\n })}\n </Button>\n ),\n };\n }\n\n if (!isPreviewEnabled && (!data?.data?.url || error)) {\n return null;\n }\n\n const trackNavigation = () => {\n // Append /preview to the current URL\n const destinationPathname = pathname.replace(/\\/$/, '') + '/preview';\n trackUsage('willNavigate', { from: pathname, to: destinationPathname });\n };\n\n return {\n title,\n content: (\n <ConditionalTooltip\n label={formatMessage({\n id: 'content-manager.preview.panel.button-disabled-tooltip',\n defaultMessage: 'Please save to open the preview',\n })}\n isShown={isModified}\n >\n <Box cursor=\"not-allowed\" width=\"100%\">\n <Button\n variant=\"tertiary\"\n tag={Link}\n to={{ pathname: 'preview', search: stringify(query, { encode: false }) }}\n onClick={trackNavigation}\n width=\"100%\"\n disabled={isModified}\n pointerEvents={isModified ? 'none' : undefined}\n tabIndex={isModified ? -1 : undefined}\n >\n {formatMessage({\n id: 'content-manager.preview.panel.button',\n defaultMessage: 'Open preview',\n })}\n </Button>\n </Box>\n </ConditionalTooltip>\n ),\n };\n};\n\nexport { PreviewSidePanel };\n"],"names":["ConditionalTooltip","isShown","label","children","_jsx","Tooltip","open","undefined","PreviewSidePanel","model","documentId","document","formatMessage","useIntl","trackUsage","useTracking","pathname","useLocation","query","useQueryParams","isModified","useForm","state","modified","isUnsaved","Boolean","id","title","defaultMessage","data","error","useGetPreviewUrlQuery","params","contentType","locale","status","skip","isPreviewEnabled","setIsPreviewEnabled","React","useState","previewUrl","url","useEffect","name","content","Button","variant","tag","Link","to","target","rel","width","trackNavigation","destinationPathname","replace","from","Box","cursor","search","stringify","encode","onClick","disabled","pointerEvents","tabIndex"],"mappings":"
|
|
1
|
+
{"version":3,"file":"PreviewSidePanel.mjs","sources":["../../../../admin/src/preview/components/PreviewSidePanel.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useQueryParams, useTracking, useForm } from '@strapi/admin/strapi-admin';\nimport { Box, Button, Tooltip, type TooltipProps } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { Link, useLocation } from 'react-router-dom';\n\nimport { useGetPreviewUrlQuery } from '../services/preview';\nimport { getPreviewUrlStatus } from '../utils/getPreviewUrlStatus';\n\nimport type { PanelComponent } from '@strapi/content-manager/strapi-admin';\nimport type { UID } from '@strapi/types';\n\ninterface ConditionalTooltipProps {\n isShown: boolean;\n label: TooltipProps['label'];\n children: React.ReactNode;\n}\n\n/**\n * Always keeps the Tooltip (and therefore the children subtree) mounted: conditionally wrapping\n * would remount the child button whenever `isShown` flips, and a click landing during that swap\n * is silently lost. When the tooltip must not show, it is force-closed via the controlled `open`\n * prop instead of being removed from the tree.\n */\nconst ConditionalTooltip = ({ isShown, label, children }: ConditionalTooltipProps) => {\n return (\n <Tooltip label={label} open={isShown ? undefined : false}>\n {children}\n </Tooltip>\n );\n};\n\nconst PreviewSidePanel: PanelComponent = ({ model, documentId, document }) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { pathname } = useLocation();\n const [{ query }] = useQueryParams();\n const isModified = useForm('PreviewSidePanel', (state) => state.modified);\n const isUnsaved = Boolean(!document || !document.id);\n\n const title = formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n });\n\n /**\n * The preview URL isn't used in this component, we just fetch it to know if preview is enabled\n * for the content type. If it's not, the panel is not displayed. If it is, we display a link to\n * /preview, and the URL will already be loaded in the RTK query cache.\n */\n const { data, error } = useGetPreviewUrlQuery(\n {\n params: {\n contentType: model as UID.ContentType,\n },\n query: {\n documentId,\n locale: document?.locale,\n status: getPreviewUrlStatus(document?.status),\n },\n },\n // Don't bother making the request since we won't show any UI\n { skip: isUnsaved }\n );\n\n /**\n * The query args above change while the document settles (locale/status resolve after load and\n * on save/publish), and each change is a new cache entry with transiently empty data. Latch\n * enablement once a URL has been seen so the \"Open preview\" button doesn't unmount and remount\n * mid-interaction — a click landing during such a swap is silently lost.\n */\n const [isPreviewEnabled, setIsPreviewEnabled] = React.useState(false);\n const previewUrl = data?.data?.url;\n React.useEffect(() => {\n if (previewUrl) {\n setIsPreviewEnabled(true);\n }\n }, [previewUrl]);\n\n if (isUnsaved) {\n return null;\n }\n\n // Preview was not configured but not disabled either (otherwise it would be a success 204).\n // So we encourage the user to set it up.\n if (error && error.name === 'NotFoundError') {\n return {\n title,\n content: (\n <Button\n variant=\"tertiary\"\n tag={Link}\n to=\"https://docs.strapi.io/cms/features/preview\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n width=\"100%\"\n >\n {formatMessage({\n id: 'content-manager.preview.panel.button-configuration',\n defaultMessage: 'Set up preview',\n })}\n </Button>\n ),\n };\n }\n\n if (!isPreviewEnabled && (!data?.data?.url || error)) {\n return null;\n }\n\n const trackNavigation = () => {\n // Append /preview to the current URL\n const destinationPathname = pathname.replace(/\\/$/, '') + '/preview';\n trackUsage('willNavigate', { from: pathname, to: destinationPathname });\n };\n\n return {\n title,\n content: (\n <ConditionalTooltip\n label={formatMessage({\n id: 'content-manager.preview.panel.button-disabled-tooltip',\n defaultMessage: 'Please save to open the preview',\n })}\n isShown={isModified}\n >\n <Box cursor=\"not-allowed\" width=\"100%\">\n <Button\n variant=\"tertiary\"\n tag={Link}\n to={{ pathname: 'preview', search: stringify(query, { encode: false }) }}\n onClick={trackNavigation}\n width=\"100%\"\n disabled={isModified}\n pointerEvents={isModified ? 'none' : undefined}\n tabIndex={isModified ? -1 : undefined}\n >\n {formatMessage({\n id: 'content-manager.preview.panel.button',\n defaultMessage: 'Open preview',\n })}\n </Button>\n </Box>\n </ConditionalTooltip>\n ),\n };\n};\n\nexport { PreviewSidePanel };\n"],"names":["ConditionalTooltip","isShown","label","children","_jsx","Tooltip","open","undefined","PreviewSidePanel","model","documentId","document","formatMessage","useIntl","trackUsage","useTracking","pathname","useLocation","query","useQueryParams","isModified","useForm","state","modified","isUnsaved","Boolean","id","title","defaultMessage","data","error","useGetPreviewUrlQuery","params","contentType","locale","status","getPreviewUrlStatus","skip","isPreviewEnabled","setIsPreviewEnabled","React","useState","previewUrl","url","useEffect","name","content","Button","variant","tag","Link","to","target","rel","width","trackNavigation","destinationPathname","replace","from","Box","cursor","search","stringify","encode","onClick","disabled","pointerEvents","tabIndex"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The preview URL endpoint only accepts the draft and published statuses.
|
|
5
|
+
* A modified document is a draft with changes that are not published yet, so its preview is the draft.
|
|
6
|
+
*/ function getPreviewUrlStatus(status) {
|
|
7
|
+
if (status === 'modified') {
|
|
8
|
+
return 'draft';
|
|
9
|
+
}
|
|
10
|
+
if (status === 'draft' || status === 'published') {
|
|
11
|
+
return status;
|
|
12
|
+
}
|
|
13
|
+
return undefined;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
exports.getPreviewUrlStatus = getPreviewUrlStatus;
|
|
17
|
+
//# sourceMappingURL=getPreviewUrlStatus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPreviewUrlStatus.js","sources":["../../../../admin/src/preview/utils/getPreviewUrlStatus.ts"],"sourcesContent":["import type { GetPreviewUrl } from '../../../../shared/contracts/preview';\n\n/**\n * The preview URL endpoint only accepts the draft and published statuses.\n * A modified document is a draft with changes that are not published yet, so its preview is the draft.\n */\nexport function getPreviewUrlStatus(\n status: string | undefined\n): GetPreviewUrl.Request['query']['status'] {\n if (status === 'modified') {\n return 'draft';\n }\n\n if (status === 'draft' || status === 'published') {\n return status;\n }\n\n return undefined;\n}\n"],"names":["getPreviewUrlStatus","status","undefined"],"mappings":";;AAEA;;;IAIO,SAASA,mBAAAA,CACdC,MAA0B,EAAA;AAE1B,IAAA,IAAIA,WAAW,UAAA,EAAY;QACzB,OAAO,OAAA;AACT,IAAA;IAEA,IAAIA,MAAAA,KAAW,OAAA,IAAWA,MAAAA,KAAW,WAAA,EAAa;QAChD,OAAOA,MAAAA;AACT,IAAA;IAEA,OAAOC,SAAAA;AACT;;;;"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The preview URL endpoint only accepts the draft and published statuses.
|
|
3
|
+
* A modified document is a draft with changes that are not published yet, so its preview is the draft.
|
|
4
|
+
*/ function getPreviewUrlStatus(status) {
|
|
5
|
+
if (status === 'modified') {
|
|
6
|
+
return 'draft';
|
|
7
|
+
}
|
|
8
|
+
if (status === 'draft' || status === 'published') {
|
|
9
|
+
return status;
|
|
10
|
+
}
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export { getPreviewUrlStatus };
|
|
15
|
+
//# sourceMappingURL=getPreviewUrlStatus.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getPreviewUrlStatus.mjs","sources":["../../../../admin/src/preview/utils/getPreviewUrlStatus.ts"],"sourcesContent":["import type { GetPreviewUrl } from '../../../../shared/contracts/preview';\n\n/**\n * The preview URL endpoint only accepts the draft and published statuses.\n * A modified document is a draft with changes that are not published yet, so its preview is the draft.\n */\nexport function getPreviewUrlStatus(\n status: string | undefined\n): GetPreviewUrl.Request['query']['status'] {\n if (status === 'modified') {\n return 'draft';\n }\n\n if (status === 'draft' || status === 'published') {\n return status;\n }\n\n return undefined;\n}\n"],"names":["getPreviewUrlStatus","status","undefined"],"mappings":"AAEA;;;IAIO,SAASA,mBAAAA,CACdC,MAA0B,EAAA;AAE1B,IAAA,IAAIA,WAAW,UAAA,EAAY;QACzB,OAAO,OAAA;AACT,IAAA;IAEA,IAAIA,MAAAA,KAAW,OAAA,IAAWA,MAAAA,KAAW,WAAA,EAAa;QAChD,OAAOA,MAAAA;AACT,IAAA;IAEA,OAAOC,SAAAA;AACT;;;;"}
|
|
@@ -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) {
|