@strapi/content-manager 0.0.0-next.8f63e1055db761e0213cb6610f80c55658196ae1 → 0.0.0-next.926e9af9369b89a571145e3c8fa1ce6bfd6cc0ab
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/_chunks/CardDragPreview-C0QyJgRA.js.map +1 -1
- package/dist/_chunks/CardDragPreview-DOxamsuj.mjs.map +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-Cmm0LJof.js → ComponentConfigurationPage-DMxUlNOo.js} +4 -5
- package/dist/_chunks/{ComponentConfigurationPage-Cmm0LJof.js.map → ComponentConfigurationPage-DMxUlNOo.js.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-FQd019My.mjs → ComponentConfigurationPage-baEkO-OV.mjs} +3 -3
- package/dist/_chunks/{ComponentConfigurationPage-FQd019My.mjs.map → ComponentConfigurationPage-baEkO-OV.mjs.map} +1 -1
- package/dist/_chunks/{ComponentIcon-BXdiCGQp.js → ComponentIcon-CRbtQEUV.js} +2 -3
- package/dist/_chunks/{ComponentIcon-BXdiCGQp.js.map → ComponentIcon-CRbtQEUV.js.map} +1 -1
- package/dist/_chunks/ComponentIcon-u4bIXTFY.mjs.map +1 -1
- package/dist/_chunks/{EditConfigurationPage-CseHna9y.js → EditConfigurationPage-CXxV7mKn.js} +4 -5
- package/dist/_chunks/{EditConfigurationPage-CseHna9y.js.map → EditConfigurationPage-CXxV7mKn.js.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-BUJqRuRq.mjs → EditConfigurationPage-YR8-4VCS.mjs} +3 -3
- package/dist/_chunks/{EditConfigurationPage-BUJqRuRq.mjs.map → EditConfigurationPage-YR8-4VCS.mjs.map} +1 -1
- package/dist/_chunks/{EditViewPage-BhjvFXZr.js → EditViewPage-BfR6jAR6.js} +22 -78
- package/dist/_chunks/EditViewPage-BfR6jAR6.js.map +1 -0
- package/dist/_chunks/{EditViewPage-BB9VeS-u.mjs → EditViewPage-DFF7c27p.mjs} +19 -74
- package/dist/_chunks/EditViewPage-DFF7c27p.mjs.map +1 -0
- package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +1 -1
- package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +1 -1
- package/dist/_chunks/{Form-DH5m7r5s.js → Form-CjcMRP5A.js} +5 -6
- package/dist/_chunks/{Form-DH5m7r5s.js.map → Form-CjcMRP5A.js.map} +1 -1
- package/dist/_chunks/{Form-B5b7zgoL.mjs → Form-MSOSfGGN.mjs} +3 -3
- package/dist/_chunks/{Form-B5b7zgoL.mjs.map → Form-MSOSfGGN.mjs.map} +1 -1
- package/dist/_chunks/{History-CNO4Db6U.js → History-BgZ7gVuF.js} +48 -72
- package/dist/_chunks/History-BgZ7gVuF.js.map +1 -0
- package/dist/_chunks/{History-Dhy0xF0L.mjs → History-WOQNVho-.mjs} +37 -60
- package/dist/_chunks/History-WOQNVho-.mjs.map +1 -0
- package/dist/_chunks/{Field-CWi7XMCa.mjs → Input-BkKwZ6Qt.mjs} +1245 -1243
- package/dist/_chunks/Input-BkKwZ6Qt.mjs.map +1 -0
- package/dist/_chunks/{Field-B03STsf9.js → Input-BwOibhc3.js} +1331 -1329
- package/dist/_chunks/Input-BwOibhc3.js.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-C_FCilGf.mjs → ListConfigurationPage-BeXfr6uW.mjs} +6 -5
- package/dist/_chunks/ListConfigurationPage-BeXfr6uW.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-DE7NESsr.js → ListConfigurationPage-DnJ3nbwL.js} +6 -6
- package/dist/_chunks/ListConfigurationPage-DnJ3nbwL.js.map +1 -0
- package/dist/_chunks/{ListViewPage-C7p0PteR.js → ListViewPage-CJFDudKl.js} +61 -58
- package/dist/_chunks/ListViewPage-CJFDudKl.js.map +1 -0
- package/dist/_chunks/{ListViewPage-B6Ut2BH0.mjs → ListViewPage-VK2v44Q1.mjs} +55 -51
- package/dist/_chunks/ListViewPage-VK2v44Q1.mjs.map +1 -0
- package/dist/_chunks/{NoContentTypePage-rR7QwWP5.mjs → NoContentTypePage-T8ttty6K.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-rR7QwWP5.mjs.map → NoContentTypePage-T8ttty6K.mjs.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-BN-8niig.js → NoContentTypePage-en2PwWgI.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-BN-8niig.js.map → NoContentTypePage-en2PwWgI.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-Bw3b0OQm.js → NoPermissionsPage-CcjILry3.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-Bw3b0OQm.js.map → NoPermissionsPage-CcjILry3.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-CGUgxmce.mjs → NoPermissionsPage-CokBHhhy.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-CGUgxmce.mjs.map → NoPermissionsPage-CokBHhhy.mjs.map} +1 -1
- package/dist/_chunks/{Preview-_gomrUna.mjs → Preview-BF81YhRj.mjs} +75 -76
- package/dist/_chunks/Preview-BF81YhRj.mjs.map +1 -0
- package/dist/_chunks/{Preview-CICG4cRf.js → Preview-DgzAuzWQ.js} +74 -76
- package/dist/_chunks/Preview-DgzAuzWQ.js.map +1 -0
- package/dist/_chunks/{Relations-uyLoal2t.js → Relations-1O-JcM4t.js} +7 -10
- package/dist/_chunks/{Relations-uyLoal2t.js.map → Relations-1O-JcM4t.js.map} +1 -1
- package/dist/_chunks/{Relations-BEvinUkU.mjs → Relations-BncdhGCd.mjs} +6 -8
- package/dist/_chunks/{Relations-BEvinUkU.mjs.map → Relations-BncdhGCd.mjs.map} +1 -1
- package/dist/_chunks/{en-D_BMf0hT.mjs → en-BZaUty0m.mjs} +12 -3
- package/dist/_chunks/{en-D_BMf0hT.mjs.map → en-BZaUty0m.mjs.map} +1 -1
- package/dist/_chunks/{en-CHOp_xJv.js → en-CzCnBk4S.js} +12 -3
- package/dist/_chunks/{en-CHOp_xJv.js.map → en-CzCnBk4S.js.map} +1 -1
- package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
- package/dist/_chunks/{index-BagcPV6I.mjs → index-DiluOUp6.mjs} +462 -226
- package/dist/_chunks/index-DiluOUp6.mjs.map +1 -0
- package/dist/_chunks/{index-D_AvCmmG.js → index-EXJvmn4t.js} +445 -210
- package/dist/_chunks/index-EXJvmn4t.js.map +1 -0
- package/dist/_chunks/{layout-Dk0odfYR.js → layout-4TbKVax8.js} +5 -6
- package/dist/_chunks/{layout-Dk0odfYR.js.map → layout-4TbKVax8.js.map} +1 -1
- package/dist/_chunks/{layout-DKEX3X49.mjs → layout-mSwsYzxv.mjs} +4 -4
- package/dist/_chunks/{layout-DKEX3X49.mjs.map → layout-mSwsYzxv.mjs.map} +1 -1
- package/dist/_chunks/objects-BcXOv6_9.js.map +1 -1
- package/dist/_chunks/objects-D6yBsdmx.mjs.map +1 -1
- package/dist/_chunks/{relations-DDoMdwk6.mjs → relations--YOvQBqv.mjs} +2 -2
- package/dist/_chunks/{relations-DDoMdwk6.mjs.map → relations--YOvQBqv.mjs.map} +1 -1
- package/dist/_chunks/{relations-C312DwGU.js → relations-Ai6Izh7h.js} +2 -2
- package/dist/_chunks/{relations-C312DwGU.js.map → relations-Ai6Izh7h.js.map} +1 -1
- package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
- package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
- package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
- package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
- package/dist/_chunks/{useDebounce-DmuSJIF3.mjs → usePrev-CZGy2Vjf.mjs} +11 -11
- package/dist/_chunks/usePrev-CZGy2Vjf.mjs.map +1 -0
- package/dist/_chunks/{useDebounce-CtcjDB3L.js → usePrev-D5J_2fEu.js} +8 -8
- package/dist/_chunks/usePrev-D5J_2fEu.js.map +1 -0
- package/dist/admin/index.js +2 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +6 -5
- package/dist/admin/src/content-manager.d.ts +3 -2
- package/dist/admin/src/exports.d.ts +1 -0
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useDocument.d.ts +19 -2
- package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +3 -3
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +4 -1
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +27 -0
- package/dist/admin/src/pages/EditView/utils/data.d.ts +1 -0
- package/dist/admin/src/preview/pages/Preview.d.ts +1 -1
- package/dist/admin/src/preview/services/preview.d.ts +1 -1
- package/dist/admin/src/router.d.ts +1 -1
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/components.d.ts +2 -2
- package/dist/admin/src/services/contentTypes.d.ts +3 -3
- package/dist/admin/src/services/documents.d.ts +16 -19
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +2 -2
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/server/index.js +230 -187
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +231 -187
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
- package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
- package/dist/server/src/history/controllers/history-version.d.ts +1 -1
- package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
- package/dist/server/src/history/services/history.d.ts +3 -3
- package/dist/server/src/history/services/history.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts +6 -10
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +3 -2
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
- package/dist/server/src/preview/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/index.d.ts +1 -0
- package/dist/server/src/preview/services/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview-config.d.ts +2 -0
- package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
- package/dist/server/src/preview/utils.d.ts +1 -0
- package/dist/server/src/preview/utils.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts +4 -2
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +3 -2
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
- package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
- package/dist/server/src/services/utils/populate.d.ts +2 -2
- package/dist/server/src/services/utils/populate.d.ts.map +1 -1
- package/package.json +12 -11
- package/dist/_chunks/EditViewPage-BB9VeS-u.mjs.map +0 -1
- package/dist/_chunks/EditViewPage-BhjvFXZr.js.map +0 -1
- package/dist/_chunks/Field-B03STsf9.js.map +0 -1
- package/dist/_chunks/Field-CWi7XMCa.mjs.map +0 -1
- package/dist/_chunks/History-CNO4Db6U.js.map +0 -1
- package/dist/_chunks/History-Dhy0xF0L.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-C_FCilGf.mjs.map +0 -1
- package/dist/_chunks/ListConfigurationPage-DE7NESsr.js.map +0 -1
- package/dist/_chunks/ListViewPage-B6Ut2BH0.mjs.map +0 -1
- package/dist/_chunks/ListViewPage-C7p0PteR.js.map +0 -1
- package/dist/_chunks/Preview-CICG4cRf.js.map +0 -1
- package/dist/_chunks/Preview-_gomrUna.mjs.map +0 -1
- package/dist/_chunks/index-BagcPV6I.mjs.map +0 -1
- package/dist/_chunks/index-D_AvCmmG.js.map +0 -1
- package/dist/_chunks/useDebounce-CtcjDB3L.js.map +0 -1
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +0 -1
- package/dist/admin/src/preview/constants.d.ts +0 -1
- package/dist/server/src/preview/constants.d.ts +0 -2
- package/dist/server/src/preview/constants.d.ts.map +0 -1
package/dist/_chunks/{NoPermissionsPage-CGUgxmce.mjs.map → NoPermissionsPage-CokBHhhy.mjs.map}
RENAMED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"NoPermissionsPage-
|
1
|
+
{"version":3,"file":"NoPermissionsPage-CokBHhhy.mjs","sources":["../../admin/src/pages/NoPermissionsPage.tsx"],"sourcesContent":["import { Page, Layouts } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\n\nimport { getTranslation } from '../utils/translations';\n\nconst NoPermissions = () => {\n const { formatMessage } = useIntl();\n\n return (\n <>\n <Layouts.Header\n title={formatMessage({\n id: getTranslation('header.name'),\n defaultMessage: 'Content',\n })}\n />\n <Layouts.Content>\n <Page.NoPermissions />\n </Layouts.Content>\n </>\n );\n};\n\nexport { NoPermissions };\n"],"names":[],"mappings":";;;;AAKA,MAAM,gBAAgB,MAAM;AACpB,QAAA,EAAE,cAAc,IAAI,QAAQ;AAElC,SAEI,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAA;AAAA,MAAC,QAAQ;AAAA,MAAR;AAAA,QACC,OAAO,cAAc;AAAA,UACnB,IAAI,eAAe,aAAa;AAAA,UAChC,gBAAgB;AAAA,QACjB,CAAA;AAAA,MAAA;AAAA,IACH;AAAA,IACA,oBAAC,QAAQ,SAAR,EACC,8BAAC,KAAK,eAAL,CAAA,CAAmB,EACtB,CAAA;AAAA,EAAA,GACF;AAEJ;"}
|
@@ -1,13 +1,14 @@
|
|
1
1
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
2
2
|
import * as React from "react";
|
3
3
|
import { useNotification, useClipboard, useQueryParams, useHistory, createContext, useRBAC, Page } from "@strapi/admin/strapi-admin";
|
4
|
-
import { Box,
|
4
|
+
import { Box, Typography, Tabs, Grid, IconButton, Portal, FocusTrap, Flex } from "@strapi/design-system";
|
5
5
|
import { useIntl } from "react-intl";
|
6
|
-
import {
|
7
|
-
import { l as DocumentRBAC, d as buildValidParams, C as COLLECTION_TYPES,
|
6
|
+
import { Link as Link$1, useParams } from "react-router-dom";
|
7
|
+
import { D as DocumentStatus, l as DocumentRBAC, d as buildValidParams, C as COLLECTION_TYPES, N as useGetPreviewUrlQuery, M as useDocument, h as useDocumentLayout } from "./index-DiluOUp6.mjs";
|
8
8
|
import { Link, Cross } from "@strapi/icons";
|
9
9
|
import { stringify } from "qs";
|
10
|
-
import {
|
10
|
+
import { styled } from "styled-components";
|
11
|
+
import { getDocumentStatus } from "./EditViewPage-DFF7c27p.mjs";
|
11
12
|
const PreviewContent = () => {
|
12
13
|
const previewUrl = usePreviewContext("PreviewContent", (state) => state.url);
|
13
14
|
const { formatMessage } = useIntl();
|
@@ -23,33 +24,36 @@ const PreviewContent = () => {
|
|
23
24
|
height: "100%",
|
24
25
|
borderWidth: 0,
|
25
26
|
tag: "iframe"
|
26
|
-
}
|
27
|
+
},
|
28
|
+
previewUrl
|
27
29
|
);
|
28
30
|
};
|
29
31
|
const ClosePreviewButton = () => {
|
30
32
|
const [{ query }] = useQueryParams();
|
31
|
-
const navigate = useNavigate();
|
32
33
|
const { formatMessage } = useIntl();
|
33
34
|
const canGoBack = useHistory("BackButton", (state) => state.canGoBack);
|
34
35
|
const goBack = useHistory("BackButton", (state) => state.goBack);
|
35
36
|
const history = useHistory("BackButton", (state) => state.history);
|
36
|
-
const
|
37
|
+
const locationIndex = useHistory("BackButton", (state) => state.currentLocationIndex);
|
38
|
+
const historyTo = canGoBack ? history.at(locationIndex - 2) : void 0;
|
39
|
+
const fallback = {
|
37
40
|
pathname: "..",
|
38
41
|
search: stringify(query, { encode: false })
|
39
42
|
};
|
43
|
+
const toWithFallback = historyTo ?? fallback;
|
40
44
|
const handleClick = (e) => {
|
41
|
-
e.preventDefault();
|
42
45
|
if (canGoBack) {
|
46
|
+
e.preventDefault();
|
43
47
|
goBack();
|
44
|
-
|
45
|
-
navigate(fallbackUrl);
|
48
|
+
return;
|
46
49
|
}
|
47
50
|
};
|
48
51
|
return /* @__PURE__ */ jsx(
|
49
52
|
IconButton,
|
50
53
|
{
|
51
54
|
tag: Link$1,
|
52
|
-
|
55
|
+
relative: "path",
|
56
|
+
to: toWithFallback,
|
53
57
|
onClick: handleClick,
|
54
58
|
label: formatMessage({
|
55
59
|
id: "content-manager.preview.header.close",
|
@@ -59,72 +63,55 @@ const ClosePreviewButton = () => {
|
|
59
63
|
}
|
60
64
|
);
|
61
65
|
};
|
62
|
-
const
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
message: {
|
70
|
-
id: "content-manager.containers.List.draft",
|
71
|
-
defaultMessage: "Draft"
|
72
|
-
}
|
73
|
-
};
|
74
|
-
case "modified":
|
75
|
-
return {
|
76
|
-
background: "alternative100",
|
77
|
-
border: "alternative200",
|
78
|
-
text: "alternative700",
|
79
|
-
message: {
|
80
|
-
id: "content-manager.containers.List.modified",
|
81
|
-
defaultMessage: "Modified"
|
82
|
-
}
|
83
|
-
};
|
84
|
-
case "published":
|
85
|
-
default:
|
86
|
-
return {
|
87
|
-
background: "success100",
|
88
|
-
border: "success200",
|
89
|
-
text: "success700",
|
90
|
-
message: {
|
91
|
-
id: "content-manager.containers.List.published",
|
92
|
-
defaultMessage: "Published"
|
93
|
-
}
|
94
|
-
};
|
66
|
+
const Status = () => {
|
67
|
+
const document = usePreviewContext("PreviewHeader", (state) => state.document);
|
68
|
+
const schema = usePreviewContext("PreviewHeader", (state) => state.schema);
|
69
|
+
const meta = usePreviewContext("PreviewHeader", (state) => state.meta);
|
70
|
+
const hasDraftAndPublished = schema?.options?.draftAndPublish ?? false;
|
71
|
+
if (!hasDraftAndPublished) {
|
72
|
+
return null;
|
95
73
|
}
|
74
|
+
const status = getDocumentStatus(document, meta);
|
75
|
+
return /* @__PURE__ */ jsx(DocumentStatus, { status, size: "XS" });
|
96
76
|
};
|
97
|
-
const
|
77
|
+
const PreviewTabs = () => {
|
98
78
|
const { formatMessage } = useIntl();
|
79
|
+
const [{ query }, setQuery] = useQueryParams();
|
99
80
|
const document = usePreviewContext("PreviewHeader", (state) => state.document);
|
100
81
|
const schema = usePreviewContext("PreviewHeader", (state) => state.schema);
|
101
82
|
const meta = usePreviewContext("PreviewHeader", (state) => state.meta);
|
102
|
-
const
|
103
|
-
const
|
104
|
-
const
|
105
|
-
|
83
|
+
const hasDraftAndPublish = schema?.options?.draftAndPublish ?? false;
|
84
|
+
const documentStatus = getDocumentStatus(document, meta);
|
85
|
+
const handleTabChange = (status) => {
|
86
|
+
if (status === "published" || status === "draft") {
|
87
|
+
setQuery({ status }, "push", true);
|
88
|
+
}
|
89
|
+
};
|
90
|
+
if (!hasDraftAndPublish) {
|
106
91
|
return null;
|
107
92
|
}
|
108
|
-
return /* @__PURE__ */ jsx(
|
109
|
-
|
93
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Tabs.Root, { variant: "simple", value: query.status || "draft", onValueChange: handleTabChange, children: /* @__PURE__ */ jsxs(
|
94
|
+
Tabs.List,
|
110
95
|
{
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
96
|
+
"aria-label": formatMessage({
|
97
|
+
id: "preview.tabs.label",
|
98
|
+
defaultMessage: "Document status"
|
99
|
+
}),
|
100
|
+
children: [
|
101
|
+
/* @__PURE__ */ jsx(StatusTab, { value: "draft", children: formatMessage({
|
102
|
+
id: "content-manager.containers.List.draft",
|
103
|
+
defaultMessage: "draft"
|
104
|
+
}) }),
|
105
|
+
/* @__PURE__ */ jsx(StatusTab, { value: "published", disabled: documentStatus === "draft", children: formatMessage({
|
106
|
+
id: "content-manager.containers.List.published",
|
107
|
+
defaultMessage: "published"
|
108
|
+
}) })
|
109
|
+
]
|
121
110
|
}
|
122
|
-
);
|
111
|
+
) }) });
|
123
112
|
};
|
124
113
|
const PreviewHeader = () => {
|
125
|
-
const
|
126
|
-
const document = usePreviewContext("PreviewHeader", (state) => state.document);
|
127
|
-
const title = document[mainField];
|
114
|
+
const title = usePreviewContext("PreviewHeader", (state) => state.title);
|
128
115
|
const { formatMessage } = useIntl();
|
129
116
|
const { toggleNotification } = useNotification();
|
130
117
|
const { copy } = useClipboard();
|
@@ -139,20 +126,23 @@ const PreviewHeader = () => {
|
|
139
126
|
});
|
140
127
|
};
|
141
128
|
return /* @__PURE__ */ jsxs(
|
142
|
-
|
129
|
+
Grid.Root,
|
143
130
|
{
|
144
|
-
|
131
|
+
gap: 3,
|
132
|
+
gridCols: 3,
|
133
|
+
paddingLeft: 2,
|
134
|
+
paddingRight: 2,
|
145
135
|
background: "neutral0",
|
146
|
-
padding: 2,
|
147
136
|
borderColor: "neutral150",
|
148
137
|
tag: "header",
|
149
138
|
children: [
|
150
|
-
/* @__PURE__ */ jsxs(
|
139
|
+
/* @__PURE__ */ jsxs(Grid.Item, { xs: 1, paddingTop: 2, paddingBottom: 2, gap: 3, children: [
|
151
140
|
/* @__PURE__ */ jsx(ClosePreviewButton, {}),
|
152
|
-
/* @__PURE__ */ jsx(
|
153
|
-
/* @__PURE__ */ jsx(
|
141
|
+
/* @__PURE__ */ jsx(PreviewTitle, { tag: "h1", fontWeight: 600, fontSize: 2, maxWidth: "200px", title, children: title }),
|
142
|
+
/* @__PURE__ */ jsx(Status, {})
|
154
143
|
] }),
|
155
|
-
/* @__PURE__ */ jsx(
|
144
|
+
/* @__PURE__ */ jsx(Grid.Item, { xs: 1, marginBottom: "-1px", alignItems: "end", margin: "auto", children: /* @__PURE__ */ jsx(PreviewTabs, {}) }),
|
145
|
+
/* @__PURE__ */ jsx(Grid.Item, { xs: 1, justifyContent: "end", paddingTop: 2, paddingBottom: 2, children: /* @__PURE__ */ jsx(
|
156
146
|
IconButton,
|
157
147
|
{
|
158
148
|
type: "button",
|
@@ -163,11 +153,19 @@ const PreviewHeader = () => {
|
|
163
153
|
onClick: handleCopyLink,
|
164
154
|
children: /* @__PURE__ */ jsx(Link, {})
|
165
155
|
}
|
166
|
-
)
|
156
|
+
) })
|
167
157
|
]
|
168
158
|
}
|
169
159
|
);
|
170
160
|
};
|
161
|
+
const PreviewTitle = styled(Typography)`
|
162
|
+
overflow: hidden;
|
163
|
+
text-overflow: ellipsis;
|
164
|
+
white-space: nowrap;
|
165
|
+
`;
|
166
|
+
const StatusTab = styled(Tabs.Trigger)`
|
167
|
+
text-transform: uppercase;
|
168
|
+
`;
|
171
169
|
const [PreviewProvider, usePreviewContext] = createContext("PreviewPage");
|
172
170
|
const PreviewPage = () => {
|
173
171
|
const { formatMessage } = useIntl();
|
@@ -213,6 +211,7 @@ const PreviewPage = () => {
|
|
213
211
|
if (!previewUrlResponse.data?.data?.url) {
|
214
212
|
return /* @__PURE__ */ jsx(Page.NoData, {});
|
215
213
|
}
|
214
|
+
const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);
|
216
215
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
217
216
|
/* @__PURE__ */ jsx(Page.Title, { children: formatMessage(
|
218
217
|
{
|
@@ -220,15 +219,15 @@ const PreviewPage = () => {
|
|
220
219
|
defaultMessage: "{contentType} preview"
|
221
220
|
},
|
222
221
|
{
|
223
|
-
contentType:
|
222
|
+
contentType: documentTitle
|
224
223
|
}
|
225
224
|
) }),
|
226
225
|
/* @__PURE__ */ jsx(
|
227
226
|
PreviewProvider,
|
228
227
|
{
|
229
228
|
url: previewUrlResponse.data.data.url,
|
230
|
-
mainField: documentLayoutResponse.edit.settings.mainField,
|
231
229
|
document: documentResponse.document,
|
230
|
+
title: documentTitle,
|
232
231
|
meta: documentResponse.meta,
|
233
232
|
schema: documentResponse.schema,
|
234
233
|
children: /* @__PURE__ */ jsxs(Flex, { direction: "column", height: "100%", alignItems: "stretch", children: [
|
@@ -285,4 +284,4 @@ export {
|
|
285
284
|
ProtectedPreviewPage,
|
286
285
|
usePreviewContext
|
287
286
|
};
|
288
|
-
//# sourceMappingURL=Preview-
|
287
|
+
//# sourceMappingURL=Preview-BF81YhRj.mjs.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Preview-BF81YhRj.mjs","sources":["../../admin/src/preview/components/PreviewContent.tsx","../../admin/src/preview/components/PreviewHeader.tsx","../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { usePreviewContext } from '../pages/Preview';\n\nconst PreviewContent = () => {\n const previewUrl = usePreviewContext('PreviewContent', (state) => state.url);\n\n const { formatMessage } = useIntl();\n\n return (\n <Box\n src={previewUrl}\n /**\n * For some reason, changing an iframe's src tag causes the browser to add a new item in the\n * history stack. This is an issue for us as it means clicking the back button will not let us\n * go back to the edit view. To fix it, we need to trick the browser into thinking this is a\n * different iframe when the preview URL changes. So we set a key prop to force React\n * to mount a different node when the src changes.\n */\n key={previewUrl}\n title={formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n })}\n width=\"100%\"\n height=\"100%\"\n borderWidth={0}\n tag=\"iframe\"\n />\n );\n};\n\nexport { PreviewContent };\n","import * as React from 'react';\n\nimport {\n useClipboard,\n useHistory,\n useNotification,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { IconButton, Tabs, Typography, Grid } 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 { DocumentStatus } from '../../pages/EditView/components/DocumentStatus';\nimport { getDocumentStatus } from '../../pages/EditView/EditViewPage';\nimport { usePreviewContext } from '../pages/Preview';\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 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 <>\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/* -------------------------------------------------------------------------------------------------\n * PreviewHeader\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewHeader = () => {\n // Get the document title\n const title = usePreviewContext('PreviewHeader', (state) => state.title);\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 return (\n <Grid.Root\n gap={3}\n gridCols={3}\n paddingLeft={2}\n paddingRight={2}\n background=\"neutral0\"\n borderColor=\"neutral150\"\n tag=\"header\"\n >\n {/* Title and status */}\n <Grid.Item xs={1} paddingTop={2} paddingBottom={2} gap={3}>\n <ClosePreviewButton />\n <PreviewTitle tag=\"h1\" fontWeight={600} fontSize={2} maxWidth=\"200px\" title={title}>\n {title}\n </PreviewTitle>\n <Status />\n </Grid.Item>\n {/* Tabs */}\n <Grid.Item xs={1} marginBottom=\"-1px\" alignItems=\"end\" margin=\"auto\">\n <PreviewTabs />\n </Grid.Item>\n {/* Copy link */}\n <Grid.Item xs={1} justifyContent=\"end\" paddingTop={2} paddingBottom={2}>\n <IconButton\n type=\"button\"\n label={formatMessage({\n id: 'preview.copy.label',\n defaultMessage: 'Copy preview link',\n })}\n onClick={handleCopyLink}\n >\n <LinkIcon />\n </IconButton>\n </Grid.Item>\n </Grid.Root>\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\nexport { PreviewHeader };\n","import * as React from 'react';\n\nimport { Page, useQueryParams, useRBAC, createContext } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, FocusTrap, Portal } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { buildValidParams } from '../../utils/api';\nimport { PreviewContent } from '../components/PreviewContent';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\n\nimport type { UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PreviewContextValue {\n url: string;\n title: string;\n document: NonNullable<ReturnType<UseDocument>['document']>;\n meta: NonNullable<ReturnType<UseDocument>['meta']>;\n schema: NonNullable<ReturnType<UseDocument>['schema']>;\n}\n\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewPage = () => {\n const { formatMessage } = useIntl();\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale,\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n\n const documentLayoutResponse = useDocumentLayout(model);\n\n if (\n documentResponse.isLoading ||\n previewUrlResponse.isLoading ||\n documentLayoutResponse.isLoading\n ) {\n return <Page.Loading />;\n }\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrlResponse.data.data.url}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n >\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <PreviewHeader />\n <PreviewContent />\n </Flex>\n </PreviewProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedPreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedPreviewPageImpl = () => {\n const { slug: model } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC([{ action: 'plugin::content-manager.explorer.read', subject: model }]);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !model) {\n return (\n <Box\n height=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\n background=\"neutral0\"\n >\n <Page.Protect permissions={permissions}>\n {({ permissions }) => (\n <DocumentRBAC permissions={permissions}>\n <PreviewPage />\n </DocumentRBAC>\n )}\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedPreviewPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedPreviewPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedPreviewPage, usePreviewContext };\n"],"names":["Link","LinkIcon","permissions"],"mappings":";;;;;;;;;;;AAOA,MAAM,iBAAiB,MAAM;AAC3B,QAAM,aAAa,kBAAkB,kBAAkB,CAAC,UAAU,MAAM,GAAG;AAErE,QAAA,EAAE,cAAc,IAAI,QAAQ;AAGhC,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK;AAAA,MASL,OAAO,cAAc;AAAA,QACnB,IAAI;AAAA,QACJ,gBAAgB;AAAA,MAAA,CACjB;AAAA,MACD,OAAM;AAAA,MACN,QAAO;AAAA,MACP,aAAa;AAAA,MACb,KAAI;AAAA,IAAA;AAAA,IARC;AAAA,EASP;AAEJ;ACVA,MAAM,qBAAqB,MAAM;AAC/B,QAAM,CAAC,EAAE,OAAO,IAAI,eAEjB;AACG,QAAA,EAAE,cAAc,IAAI,QAAQ;AAElC,QAAM,YAAY,WAAW,cAAc,CAAC,UAAU,MAAM,SAAS;AACrE,QAAM,SAAS,WAAW,cAAc,CAAC,UAAU,MAAM,MAAM;AAC/D,QAAM,UAAU,WAAW,cAAc,CAAC,UAAU,MAAM,OAAO;AACjE,QAAM,gBAAgB,WAAW,cAAc,CAAC,UAAU,MAAM,oBAAoB;AAMpF,QAAM,YAAY,YAAY,QAAQ,GAAG,gBAAgB,CAAC,IAAI;AAC9D,QAAM,WAAW;AAAA,IACf,UAAU;AAAA,IACV,QAAQ,UAAU,OAAO,EAAE,QAAQ,MAAO,CAAA;AAAA,EAC5C;AACA,QAAM,iBAAiB,aAAa;AAE9B,QAAA,cAAc,CAAC,MAAwB;AAC3C,QAAI,WAAW;AAEb,QAAE,eAAe;AACV,aAAA;AACP;AAAA,IAAA;AAAA,EAKJ;AAGE,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKA;AAAAA,MACL,UAAS;AAAA,MACT,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,OAAO,cAAc;AAAA,QACnB,IAAI;AAAA,QACJ,gBAAgB;AAAA,MAAA,CACjB;AAAA,MAED,8BAAC,OAAM,CAAA,CAAA;AAAA,IAAA;AAAA,EACT;AAEJ;AAMA,MAAM,SAAS,MAAM;AAEnB,QAAM,WAAW,kBAAkB,iBAAiB,CAAC,UAAU,MAAM,QAAQ;AAC7E,QAAM,SAAS,kBAAkB,iBAAiB,CAAC,UAAU,MAAM,MAAM;AACzE,QAAM,OAAO,kBAAkB,iBAAiB,CAAC,UAAU,MAAM,IAAI;AAC/D,QAAA,uBAAuB,QAAQ,SAAS,mBAAmB;AAEjE,MAAI,CAAC,sBAAsB;AAClB,WAAA;AAAA,EAAA;AAGH,QAAA,SAAS,kBAAkB,UAAU,IAAI;AAE/C,SAAQ,oBAAA,gBAAA,EAAe,QAAgB,MAAK,KAAK,CAAA;AACnD;AAEA,MAAM,cAAc,MAAM;AAClB,QAAA,EAAE,cAAc,IAAI,QAAQ;AAGlC,QAAM,CAAC,EAAE,MAAA,GAAS,QAAQ,IAAI,eAAkD;AAGhF,QAAM,WAAW,kBAAkB,iBAAiB,CAAC,UAAU,MAAM,QAAQ;AAC7E,QAAM,SAAS,kBAAkB,iBAAiB,CAAC,UAAU,MAAM,MAAM;AACzE,QAAM,OAAO,kBAAkB,iBAAiB,CAAC,UAAU,MAAM,IAAI;AAC/D,QAAA,qBAAqB,QAAQ,SAAS,mBAAmB;AACzD,QAAA,iBAAiB,kBAAkB,UAAU,IAAI;AAEjD,QAAA,kBAAkB,CAAC,WAAmB;AACtC,QAAA,WAAW,eAAe,WAAW,SAAS;AAChD,eAAS,EAAE,UAAU,QAAQ,IAAI;AAAA,IAAA;AAAA,EAErC;AAEA,MAAI,CAAC,oBAAoB;AAChB,WAAA;AAAA,EAAA;AAGT,SAEI,oBAAA,UAAA,EAAA,UAAA,oBAAC,KAAK,MAAL,EAAU,SAAQ,UAAS,OAAO,MAAM,UAAU,SAAS,eAAe,iBACzE,UAAA;AAAA,IAAC,KAAK;AAAA,IAAL;AAAA,MACC,cAAY,cAAc;AAAA,QACxB,IAAI;AAAA,QACJ,gBAAgB;AAAA,MAAA,CACjB;AAAA,MAED,UAAA;AAAA,QAAC,oBAAA,WAAA,EAAU,OAAM,SACd,UAAc,cAAA;AAAA,UACb,IAAI;AAAA,UACJ,gBAAgB;AAAA,QACjB,CAAA,GACH;AAAA,4BACC,WAAU,EAAA,OAAM,aAAY,UAAU,mBAAmB,SACvD,UAAc,cAAA;AAAA,UACb,IAAI;AAAA,UACJ,gBAAgB;AAAA,QAAA,CACjB,EACH,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,KAEJ,EACF,CAAA;AAEJ;AAMA,MAAM,gBAAgB,MAAM;AAE1B,QAAM,QAAQ,kBAAkB,iBAAiB,CAAC,UAAU,MAAM,KAAK;AAEjE,QAAA,EAAE,cAAc,IAAI,QAAQ;AAC5B,QAAA,EAAE,mBAAmB,IAAI,gBAAgB;AACzC,QAAA,EAAE,KAAK,IAAI,aAAa;AAE9B,QAAM,iBAAiB,MAAM;AACtB,SAAA,OAAO,SAAS,IAAI;AACN,uBAAA;AAAA,MACjB,SAAS,cAAc;AAAA,QACrB,IAAI;AAAA,QACJ,gBAAgB;AAAA,MAAA,CACjB;AAAA,MACD,MAAM;AAAA,IAAA,CACP;AAAA,EACH;AAGE,SAAA;AAAA,IAAC,KAAK;AAAA,IAAL;AAAA,MACC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,aAAa;AAAA,MACb,cAAc;AAAA,MACd,YAAW;AAAA,MACX,aAAY;AAAA,MACZ,KAAI;AAAA,MAGJ,UAAA;AAAA,QAAC,qBAAA,KAAK,MAAL,EAAU,IAAI,GAAG,YAAY,GAAG,eAAe,GAAG,KAAK,GACtD,UAAA;AAAA,UAAA,oBAAC,oBAAmB,EAAA;AAAA,UACpB,oBAAC,cAAa,EAAA,KAAI,MAAK,YAAY,KAAK,UAAU,GAAG,UAAS,SAAQ,OACnE,UACH,MAAA,CAAA;AAAA,8BACC,QAAO,CAAA,CAAA;AAAA,QAAA,GACV;AAAA,QAEC,oBAAA,KAAK,MAAL,EAAU,IAAI,GAAG,cAAa,QAAO,YAAW,OAAM,QAAO,QAC5D,UAAA,oBAAC,cAAY,CAAA,GACf;AAAA,QAEA,oBAAC,KAAK,MAAL,EAAU,IAAI,GAAG,gBAAe,OAAM,YAAY,GAAG,eAAe,GACnE,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAO,cAAc;AAAA,cACnB,IAAI;AAAA,cACJ,gBAAgB;AAAA,YAAA,CACjB;AAAA,YACD,SAAS;AAAA,YAET,8BAACC,MAAS,CAAA,CAAA;AAAA,UAAA;AAAA,QAAA,EAEd,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF;AAEJ;AAEA,MAAM,eAAe,OAAO,UAAU;AAAA;AAAA;AAAA;AAAA;AAMtC,MAAM,YAAY,OAAO,KAAK,OAAO;AAAA;AAAA;ACpLrC,MAAM,CAAC,iBAAiB,iBAAiB,IAAI,cAAmC,aAAa;AAM7F,MAAM,cAAc,MAAM;AAClB,QAAA,EAAE,cAAc,IAAI,QAAQ;AAG5B,QAAA;AAAA,IACJ,MAAM;AAAA,IACN,IAAI;AAAA,IACJ;AAAA,MACE,UAID;AACH,QAAM,CAAC,EAAE,OAAO,IAAI,eAEjB;AAEG,QAAA,SAAS,MAAM,QAAQ,MAAM,iBAAiB,KAAK,GAAG,CAAC,KAAK,CAAC;AAEnE,MAAI,CAAC,gBAAgB;AACb,UAAA,IAAI,MAAM,6CAA6C;AAAA,EAAA;AAG/D,MAAI,CAAC,OAAO;AACJ,UAAA,IAAI,MAAM,oCAAoC;AAAA,EAAA;AAIlD,MAAA,mBAAmB,oBAAoB,CAAC,YAAY;AAChD,UAAA,IAAI,MAAM,yCAAyC;AAAA,EAAA;AAG3D,QAAM,qBAAqB,sBAAsB;AAAA,IAC/C,QAAQ;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,OAAO;AAAA,MACL;AAAA,MACA,QAAQ,OAAO;AAAA,MACf,QAAQ,OAAO;AAAA,IAAA;AAAA,EACjB,CACD;AAED,QAAM,mBAAmB,YAAY;AAAA,IACnC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA,CACD;AAEK,QAAA,yBAAyB,kBAAkB,KAAK;AAEtD,MACE,iBAAiB,aACjB,mBAAmB,aACnB,uBAAuB,WACvB;AACO,WAAA,oBAAC,KAAK,SAAL,EAAa;AAAA,EAAA;AAGvB,MACE,mBAAmB,SACnB,uBAAuB,SACvB,CAAC,iBAAiB,YAClB,CAAC,iBAAiB,QAClB,CAAC,iBAAiB,QAClB;AACO,WAAA,oBAAC,KAAK,OAAL,EAAW;AAAA,EAAA;AAGrB,MAAI,CAAC,mBAAmB,MAAM,MAAM,KAAK;AAChC,WAAA,oBAAC,KAAK,QAAL,EAAY;AAAA,EAAA;AAGtB,QAAM,gBAAgB,iBAAiB,SAAS,uBAAuB,KAAK,SAAS,SAAS;AAE9F,SAEI,qBAAA,UAAA,EAAA,UAAA;AAAA,IAAC,oBAAA,KAAK,OAAL,EACE,UAAA;AAAA,MACC;AAAA,QACE,IAAI;AAAA,QACJ,gBAAgB;AAAA,MAClB;AAAA,MACA;AAAA,QACE,aAAa;AAAA,MAAA;AAAA,IACf,GAEJ;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK,mBAAmB,KAAK,KAAK;AAAA,QAClC,UAAU,iBAAiB;AAAA,QAC3B,OAAO;AAAA,QACP,MAAM,iBAAiB;AAAA,QACvB,QAAQ,iBAAiB;AAAA,QAEzB,+BAAC,MAAK,EAAA,WAAU,UAAS,QAAO,QAAO,YAAW,WAChD,UAAA;AAAA,UAAA,oBAAC,eAAc,EAAA;AAAA,8BACd,gBAAe,CAAA,CAAA;AAAA,QAAA,EAClB,CAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAMA,MAAM,2BAA2B,MAAM;AACrC,QAAM,EAAE,MAAM,MAAM,IAAI,UAErB;AACG,QAAA;AAAA,IACJ,cAAc,CAAC;AAAA,IACf;AAAA,IACA;AAAA,EAAA,IACE,QAAQ,CAAC,EAAE,QAAQ,yCAAyC,SAAS,MAAM,CAAC,CAAC;AAEjF,MAAI,WAAW;AACN,WAAA,oBAAC,KAAK,SAAL,EAAa;AAAA,EAAA;AAGnB,MAAA,SAAS,CAAC,OAAO;AAEjB,WAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAO;AAAA,QACP,OAAM;AAAA,QACN,UAAS;AAAA,QACT,KAAK;AAAA,QACL,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,YAAW;AAAA,QAEX,UAAA,oBAAC,KAAK,OAAL,CAAW,CAAA;AAAA,MAAA;AAAA,IACd;AAAA,EAAA;AAKF,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,QAAO;AAAA,MACP,OAAM;AAAA,MACN,UAAS;AAAA,MACT,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,YAAW;AAAA,MAEX,8BAAC,KAAK,SAAL,EAAa,aACX,WAAC,EAAE,aAAAC,aAAY,0BACb,cAAa,EAAA,aAAaA,cACzB,UAAC,oBAAA,aAAA,EAAY,GACf,EAEJ,CAAA;AAAA,IAAA;AAAA,EACF;AAEJ;AAEA,MAAM,uBAAuB,MAAM;AACjC,6BACG,QACC,EAAA,UAAA,oBAAC,aACC,UAAC,oBAAA,0BAAA,EAAyB,GAC5B,EACF,CAAA;AAEJ;"}
|
@@ -6,13 +6,13 @@ const strapiAdmin = require("@strapi/admin/strapi-admin");
|
|
6
6
|
const designSystem = require("@strapi/design-system");
|
7
7
|
const reactIntl = require("react-intl");
|
8
8
|
const reactRouterDom = require("react-router-dom");
|
9
|
-
const index = require("./index-
|
9
|
+
const index = require("./index-EXJvmn4t.js");
|
10
10
|
const Icons = require("@strapi/icons");
|
11
11
|
const qs = require("qs");
|
12
|
-
const
|
12
|
+
const styledComponents = require("styled-components");
|
13
|
+
const EditViewPage = require("./EditViewPage-BfR6jAR6.js");
|
13
14
|
function _interopNamespace(e) {
|
14
|
-
if (e && e.__esModule)
|
15
|
-
return e;
|
15
|
+
if (e && e.__esModule) return e;
|
16
16
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
17
17
|
if (e) {
|
18
18
|
for (const k in e) {
|
@@ -44,33 +44,36 @@ const PreviewContent = () => {
|
|
44
44
|
height: "100%",
|
45
45
|
borderWidth: 0,
|
46
46
|
tag: "iframe"
|
47
|
-
}
|
47
|
+
},
|
48
|
+
previewUrl
|
48
49
|
);
|
49
50
|
};
|
50
51
|
const ClosePreviewButton = () => {
|
51
52
|
const [{ query }] = strapiAdmin.useQueryParams();
|
52
|
-
const navigate = reactRouterDom.useNavigate();
|
53
53
|
const { formatMessage } = reactIntl.useIntl();
|
54
54
|
const canGoBack = strapiAdmin.useHistory("BackButton", (state) => state.canGoBack);
|
55
55
|
const goBack = strapiAdmin.useHistory("BackButton", (state) => state.goBack);
|
56
56
|
const history = strapiAdmin.useHistory("BackButton", (state) => state.history);
|
57
|
-
const
|
57
|
+
const locationIndex = strapiAdmin.useHistory("BackButton", (state) => state.currentLocationIndex);
|
58
|
+
const historyTo = canGoBack ? history.at(locationIndex - 2) : void 0;
|
59
|
+
const fallback = {
|
58
60
|
pathname: "..",
|
59
61
|
search: qs.stringify(query, { encode: false })
|
60
62
|
};
|
63
|
+
const toWithFallback = historyTo ?? fallback;
|
61
64
|
const handleClick = (e) => {
|
62
|
-
e.preventDefault();
|
63
65
|
if (canGoBack) {
|
66
|
+
e.preventDefault();
|
64
67
|
goBack();
|
65
|
-
|
66
|
-
navigate(fallbackUrl);
|
68
|
+
return;
|
67
69
|
}
|
68
70
|
};
|
69
71
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
70
72
|
designSystem.IconButton,
|
71
73
|
{
|
72
74
|
tag: reactRouterDom.Link,
|
73
|
-
|
75
|
+
relative: "path",
|
76
|
+
to: toWithFallback,
|
74
77
|
onClick: handleClick,
|
75
78
|
label: formatMessage({
|
76
79
|
id: "content-manager.preview.header.close",
|
@@ -80,72 +83,55 @@ const ClosePreviewButton = () => {
|
|
80
83
|
}
|
81
84
|
);
|
82
85
|
};
|
83
|
-
const
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
message: {
|
91
|
-
id: "content-manager.containers.List.draft",
|
92
|
-
defaultMessage: "Draft"
|
93
|
-
}
|
94
|
-
};
|
95
|
-
case "modified":
|
96
|
-
return {
|
97
|
-
background: "alternative100",
|
98
|
-
border: "alternative200",
|
99
|
-
text: "alternative700",
|
100
|
-
message: {
|
101
|
-
id: "content-manager.containers.List.modified",
|
102
|
-
defaultMessage: "Modified"
|
103
|
-
}
|
104
|
-
};
|
105
|
-
case "published":
|
106
|
-
default:
|
107
|
-
return {
|
108
|
-
background: "success100",
|
109
|
-
border: "success200",
|
110
|
-
text: "success700",
|
111
|
-
message: {
|
112
|
-
id: "content-manager.containers.List.published",
|
113
|
-
defaultMessage: "Published"
|
114
|
-
}
|
115
|
-
};
|
86
|
+
const Status = () => {
|
87
|
+
const document = usePreviewContext("PreviewHeader", (state) => state.document);
|
88
|
+
const schema = usePreviewContext("PreviewHeader", (state) => state.schema);
|
89
|
+
const meta = usePreviewContext("PreviewHeader", (state) => state.meta);
|
90
|
+
const hasDraftAndPublished = schema?.options?.draftAndPublish ?? false;
|
91
|
+
if (!hasDraftAndPublished) {
|
92
|
+
return null;
|
116
93
|
}
|
94
|
+
const status = EditViewPage.getDocumentStatus(document, meta);
|
95
|
+
return /* @__PURE__ */ jsxRuntime.jsx(index.DocumentStatus, { status, size: "XS" });
|
117
96
|
};
|
118
|
-
const
|
97
|
+
const PreviewTabs = () => {
|
119
98
|
const { formatMessage } = reactIntl.useIntl();
|
99
|
+
const [{ query }, setQuery] = strapiAdmin.useQueryParams();
|
120
100
|
const document = usePreviewContext("PreviewHeader", (state) => state.document);
|
121
101
|
const schema = usePreviewContext("PreviewHeader", (state) => state.schema);
|
122
102
|
const meta = usePreviewContext("PreviewHeader", (state) => state.meta);
|
123
|
-
const
|
124
|
-
const
|
125
|
-
const
|
126
|
-
|
103
|
+
const hasDraftAndPublish = schema?.options?.draftAndPublish ?? false;
|
104
|
+
const documentStatus = EditViewPage.getDocumentStatus(document, meta);
|
105
|
+
const handleTabChange = (status) => {
|
106
|
+
if (status === "published" || status === "draft") {
|
107
|
+
setQuery({ status }, "push", true);
|
108
|
+
}
|
109
|
+
};
|
110
|
+
if (!hasDraftAndPublish) {
|
127
111
|
return null;
|
128
112
|
}
|
129
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
130
|
-
designSystem.
|
113
|
+
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tabs.Root, { variant: "simple", value: query.status || "draft", onValueChange: handleTabChange, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
114
|
+
designSystem.Tabs.List,
|
131
115
|
{
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
116
|
+
"aria-label": formatMessage({
|
117
|
+
id: "preview.tabs.label",
|
118
|
+
defaultMessage: "Document status"
|
119
|
+
}),
|
120
|
+
children: [
|
121
|
+
/* @__PURE__ */ jsxRuntime.jsx(StatusTab, { value: "draft", children: formatMessage({
|
122
|
+
id: "content-manager.containers.List.draft",
|
123
|
+
defaultMessage: "draft"
|
124
|
+
}) }),
|
125
|
+
/* @__PURE__ */ jsxRuntime.jsx(StatusTab, { value: "published", disabled: documentStatus === "draft", children: formatMessage({
|
126
|
+
id: "content-manager.containers.List.published",
|
127
|
+
defaultMessage: "published"
|
128
|
+
}) })
|
129
|
+
]
|
142
130
|
}
|
143
|
-
);
|
131
|
+
) }) });
|
144
132
|
};
|
145
133
|
const PreviewHeader = () => {
|
146
|
-
const
|
147
|
-
const document = usePreviewContext("PreviewHeader", (state) => state.document);
|
148
|
-
const title = document[mainField];
|
134
|
+
const title = usePreviewContext("PreviewHeader", (state) => state.title);
|
149
135
|
const { formatMessage } = reactIntl.useIntl();
|
150
136
|
const { toggleNotification } = strapiAdmin.useNotification();
|
151
137
|
const { copy } = strapiAdmin.useClipboard();
|
@@ -160,20 +146,23 @@ const PreviewHeader = () => {
|
|
160
146
|
});
|
161
147
|
};
|
162
148
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
163
|
-
designSystem.
|
149
|
+
designSystem.Grid.Root,
|
164
150
|
{
|
165
|
-
|
151
|
+
gap: 3,
|
152
|
+
gridCols: 3,
|
153
|
+
paddingLeft: 2,
|
154
|
+
paddingRight: 2,
|
166
155
|
background: "neutral0",
|
167
|
-
padding: 2,
|
168
156
|
borderColor: "neutral150",
|
169
157
|
tag: "header",
|
170
158
|
children: [
|
171
|
-
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.
|
159
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Grid.Item, { xs: 1, paddingTop: 2, paddingBottom: 2, gap: 3, children: [
|
172
160
|
/* @__PURE__ */ jsxRuntime.jsx(ClosePreviewButton, {}),
|
173
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
174
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
161
|
+
/* @__PURE__ */ jsxRuntime.jsx(PreviewTitle, { tag: "h1", fontWeight: 600, fontSize: 2, maxWidth: "200px", title, children: title }),
|
162
|
+
/* @__PURE__ */ jsxRuntime.jsx(Status, {})
|
175
163
|
] }),
|
176
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
164
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { xs: 1, marginBottom: "-1px", alignItems: "end", margin: "auto", children: /* @__PURE__ */ jsxRuntime.jsx(PreviewTabs, {}) }),
|
165
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { xs: 1, justifyContent: "end", paddingTop: 2, paddingBottom: 2, children: /* @__PURE__ */ jsxRuntime.jsx(
|
177
166
|
designSystem.IconButton,
|
178
167
|
{
|
179
168
|
type: "button",
|
@@ -184,11 +173,19 @@ const PreviewHeader = () => {
|
|
184
173
|
onClick: handleCopyLink,
|
185
174
|
children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Link, {})
|
186
175
|
}
|
187
|
-
)
|
176
|
+
) })
|
188
177
|
]
|
189
178
|
}
|
190
179
|
);
|
191
180
|
};
|
181
|
+
const PreviewTitle = styledComponents.styled(designSystem.Typography)`
|
182
|
+
overflow: hidden;
|
183
|
+
text-overflow: ellipsis;
|
184
|
+
white-space: nowrap;
|
185
|
+
`;
|
186
|
+
const StatusTab = styledComponents.styled(designSystem.Tabs.Trigger)`
|
187
|
+
text-transform: uppercase;
|
188
|
+
`;
|
192
189
|
const [PreviewProvider, usePreviewContext] = strapiAdmin.createContext("PreviewPage");
|
193
190
|
const PreviewPage = () => {
|
194
191
|
const { formatMessage } = reactIntl.useIntl();
|
@@ -234,6 +231,7 @@ const PreviewPage = () => {
|
|
234
231
|
if (!previewUrlResponse.data?.data?.url) {
|
235
232
|
return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.NoData, {});
|
236
233
|
}
|
234
|
+
const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);
|
237
235
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
238
236
|
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Title, { children: formatMessage(
|
239
237
|
{
|
@@ -241,15 +239,15 @@ const PreviewPage = () => {
|
|
241
239
|
defaultMessage: "{contentType} preview"
|
242
240
|
},
|
243
241
|
{
|
244
|
-
contentType:
|
242
|
+
contentType: documentTitle
|
245
243
|
}
|
246
244
|
) }),
|
247
245
|
/* @__PURE__ */ jsxRuntime.jsx(
|
248
246
|
PreviewProvider,
|
249
247
|
{
|
250
248
|
url: previewUrlResponse.data.data.url,
|
251
|
-
mainField: documentLayoutResponse.edit.settings.mainField,
|
252
249
|
document: documentResponse.document,
|
250
|
+
title: documentTitle,
|
253
251
|
meta: documentResponse.meta,
|
254
252
|
schema: documentResponse.schema,
|
255
253
|
children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", height: "100%", alignItems: "stretch", children: [
|
@@ -304,4 +302,4 @@ const ProtectedPreviewPage = () => {
|
|
304
302
|
};
|
305
303
|
exports.ProtectedPreviewPage = ProtectedPreviewPage;
|
306
304
|
exports.usePreviewContext = usePreviewContext;
|
307
|
-
//# sourceMappingURL=Preview-
|
305
|
+
//# sourceMappingURL=Preview-DgzAuzWQ.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Preview-DgzAuzWQ.js","sources":["../../admin/src/preview/components/PreviewContent.tsx","../../admin/src/preview/components/PreviewHeader.tsx","../../admin/src/preview/pages/Preview.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { usePreviewContext } from '../pages/Preview';\n\nconst PreviewContent = () => {\n const previewUrl = usePreviewContext('PreviewContent', (state) => state.url);\n\n const { formatMessage } = useIntl();\n\n return (\n <Box\n src={previewUrl}\n /**\n * For some reason, changing an iframe's src tag causes the browser to add a new item in the\n * history stack. This is an issue for us as it means clicking the back button will not let us\n * go back to the edit view. To fix it, we need to trick the browser into thinking this is a\n * different iframe when the preview URL changes. So we set a key prop to force React\n * to mount a different node when the src changes.\n */\n key={previewUrl}\n title={formatMessage({\n id: 'content-manager.preview.panel.title',\n defaultMessage: 'Preview',\n })}\n width=\"100%\"\n height=\"100%\"\n borderWidth={0}\n tag=\"iframe\"\n />\n );\n};\n\nexport { PreviewContent };\n","import * as React from 'react';\n\nimport {\n useClipboard,\n useHistory,\n useNotification,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { IconButton, Tabs, Typography, Grid } 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 { DocumentStatus } from '../../pages/EditView/components/DocumentStatus';\nimport { getDocumentStatus } from '../../pages/EditView/EditViewPage';\nimport { usePreviewContext } from '../pages/Preview';\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 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 <>\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/* -------------------------------------------------------------------------------------------------\n * PreviewHeader\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewHeader = () => {\n // Get the document title\n const title = usePreviewContext('PreviewHeader', (state) => state.title);\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 return (\n <Grid.Root\n gap={3}\n gridCols={3}\n paddingLeft={2}\n paddingRight={2}\n background=\"neutral0\"\n borderColor=\"neutral150\"\n tag=\"header\"\n >\n {/* Title and status */}\n <Grid.Item xs={1} paddingTop={2} paddingBottom={2} gap={3}>\n <ClosePreviewButton />\n <PreviewTitle tag=\"h1\" fontWeight={600} fontSize={2} maxWidth=\"200px\" title={title}>\n {title}\n </PreviewTitle>\n <Status />\n </Grid.Item>\n {/* Tabs */}\n <Grid.Item xs={1} marginBottom=\"-1px\" alignItems=\"end\" margin=\"auto\">\n <PreviewTabs />\n </Grid.Item>\n {/* Copy link */}\n <Grid.Item xs={1} justifyContent=\"end\" paddingTop={2} paddingBottom={2}>\n <IconButton\n type=\"button\"\n label={formatMessage({\n id: 'preview.copy.label',\n defaultMessage: 'Copy preview link',\n })}\n onClick={handleCopyLink}\n >\n <LinkIcon />\n </IconButton>\n </Grid.Item>\n </Grid.Root>\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\nexport { PreviewHeader };\n","import * as React from 'react';\n\nimport { Page, useQueryParams, useRBAC, createContext } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, FocusTrap, Portal } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\n\nimport { GetPreviewUrl } from '../../../../shared/contracts/preview';\nimport { COLLECTION_TYPES } from '../../constants/collections';\nimport { DocumentRBAC } from '../../features/DocumentRBAC';\nimport { type UseDocument, useDocument } from '../../hooks/useDocument';\nimport { useDocumentLayout } from '../../hooks/useDocumentLayout';\nimport { buildValidParams } from '../../utils/api';\nimport { PreviewContent } from '../components/PreviewContent';\nimport { PreviewHeader } from '../components/PreviewHeader';\nimport { useGetPreviewUrlQuery } from '../services/preview';\n\nimport type { UID } from '@strapi/types';\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewProvider\n * -----------------------------------------------------------------------------------------------*/\n\ninterface PreviewContextValue {\n url: string;\n title: string;\n document: NonNullable<ReturnType<UseDocument>['document']>;\n meta: NonNullable<ReturnType<UseDocument>['meta']>;\n schema: NonNullable<ReturnType<UseDocument>['schema']>;\n}\n\nconst [PreviewProvider, usePreviewContext] = createContext<PreviewContextValue>('PreviewPage');\n\n/* -------------------------------------------------------------------------------------------------\n * PreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst PreviewPage = () => {\n const { formatMessage } = useIntl();\n\n // Read all the necessary data from the URL to find the right preview URL\n const {\n slug: model,\n id: documentId,\n collectionType,\n } = useParams<{\n slug: UID.ContentType;\n id: string;\n collectionType: string;\n }>();\n const [{ query }] = useQueryParams<{\n plugins?: Record<string, unknown>;\n }>();\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n\n if (!collectionType) {\n throw new Error('Could not find collectionType in url params');\n }\n\n if (!model) {\n throw new Error('Could not find model in url params');\n }\n\n // Only collection types must have a documentId\n if (collectionType === COLLECTION_TYPES && !documentId) {\n throw new Error('Could not find documentId in url params');\n }\n\n const previewUrlResponse = useGetPreviewUrlQuery({\n params: {\n contentType: model,\n },\n query: {\n documentId,\n locale: params.locale,\n status: params.status as GetPreviewUrl.Request['query']['status'],\n },\n });\n\n const documentResponse = useDocument({\n model,\n collectionType,\n documentId,\n params,\n });\n\n const documentLayoutResponse = useDocumentLayout(model);\n\n if (\n documentResponse.isLoading ||\n previewUrlResponse.isLoading ||\n documentLayoutResponse.isLoading\n ) {\n return <Page.Loading />;\n }\n\n if (\n previewUrlResponse.error ||\n documentLayoutResponse.error ||\n !documentResponse.document ||\n !documentResponse.meta ||\n !documentResponse.schema\n ) {\n return <Page.Error />;\n }\n\n if (!previewUrlResponse.data?.data?.url) {\n return <Page.NoData />;\n }\n\n const documentTitle = documentResponse.getTitle(documentLayoutResponse.edit.settings.mainField);\n\n return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentTitle,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrlResponse.data.data.url}\n document={documentResponse.document}\n title={documentTitle}\n meta={documentResponse.meta}\n schema={documentResponse.schema}\n >\n <Flex direction=\"column\" height=\"100%\" alignItems=\"stretch\">\n <PreviewHeader />\n <PreviewContent />\n </Flex>\n </PreviewProvider>\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedPreviewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedPreviewPageImpl = () => {\n const { slug: model } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC([{ action: 'plugin::content-manager.explorer.read', subject: model }]);\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !model) {\n return (\n <Box\n height=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\n background=\"neutral0\"\n >\n <Page.Error />\n </Box>\n );\n }\n\n return (\n <Box\n height=\"100vh\"\n width=\"100vw\"\n position=\"fixed\"\n top={0}\n left={0}\n zIndex={2}\n background=\"neutral0\"\n >\n <Page.Protect permissions={permissions}>\n {({ permissions }) => (\n <DocumentRBAC permissions={permissions}>\n <PreviewPage />\n </DocumentRBAC>\n )}\n </Page.Protect>\n </Box>\n );\n};\n\nconst ProtectedPreviewPage = () => {\n return (\n <Portal>\n <FocusTrap>\n <ProtectedPreviewPageImpl />\n </FocusTrap>\n </Portal>\n );\n};\n\nexport { ProtectedPreviewPage, usePreviewContext };\n"],"names":["useIntl","jsx","Box","useQueryParams","useHistory","stringify","IconButton","Link","Cross","getDocumentStatus","DocumentStatus","Fragment","Tabs","jsxs","useNotification","useClipboard","Grid","LinkIcon","styled","Typography","createContext","useParams","React","buildValidParams","COLLECTION_TYPES","useGetPreviewUrlQuery","useDocument","useDocumentLayout","Page","Flex","useRBAC","permissions","DocumentRBAC","Portal","FocusTrap"],"mappings":"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"}
|