@strapi/content-manager 0.0.0-next.f6dca5adf05ef6bed9605a1535999ab0bbbf063e → 0.0.0-next.fc1775f7731f8999840e56e298a216b9a6c5c4ad

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.
Files changed (153) hide show
  1. package/dist/_chunks/CardDragPreview-C0QyJgRA.js.map +1 -1
  2. package/dist/_chunks/CardDragPreview-DOxamsuj.mjs.map +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage--MCP7Aew.js → ComponentConfigurationPage-BLWQy8ru.js} +4 -5
  4. package/dist/_chunks/{ComponentConfigurationPage--MCP7Aew.js.map → ComponentConfigurationPage-BLWQy8ru.js.map} +1 -1
  5. package/dist/_chunks/{ComponentConfigurationPage-DT41asyM.mjs → ComponentConfigurationPage-CtIa3aa2.mjs} +3 -3
  6. package/dist/_chunks/{ComponentConfigurationPage-DT41asyM.mjs.map → ComponentConfigurationPage-CtIa3aa2.mjs.map} +1 -1
  7. package/dist/_chunks/{ComponentIcon-BXdiCGQp.js → ComponentIcon-CRbtQEUV.js} +2 -3
  8. package/dist/_chunks/{ComponentIcon-BXdiCGQp.js.map → ComponentIcon-CRbtQEUV.js.map} +1 -1
  9. package/dist/_chunks/ComponentIcon-u4bIXTFY.mjs.map +1 -1
  10. package/dist/_chunks/{EditConfigurationPage-DznPxn9p.mjs → EditConfigurationPage-DsPR2DVk.mjs} +3 -3
  11. package/dist/_chunks/{EditConfigurationPage-DznPxn9p.mjs.map → EditConfigurationPage-DsPR2DVk.mjs.map} +1 -1
  12. package/dist/_chunks/{EditConfigurationPage-qgnNvv_u.js → EditConfigurationPage-RQkymxCy.js} +4 -5
  13. package/dist/_chunks/{EditConfigurationPage-qgnNvv_u.js.map → EditConfigurationPage-RQkymxCy.js.map} +1 -1
  14. package/dist/_chunks/{EditViewPage-Bb4S7p8c.js → EditViewPage-B-kExt8C.js} +36 -8
  15. package/dist/_chunks/EditViewPage-B-kExt8C.js.map +1 -0
  16. package/dist/_chunks/{EditViewPage-B_k7z288.mjs → EditViewPage-BPyVuPfM.mjs} +35 -6
  17. package/dist/_chunks/EditViewPage-BPyVuPfM.mjs.map +1 -0
  18. package/dist/_chunks/{Field-ByR1mllE.js → Field-DPIsQRre.js} +177 -122
  19. package/dist/_chunks/Field-DPIsQRre.js.map +1 -0
  20. package/dist/_chunks/{Field-DmwbE0TL.mjs → Field-Dltnt1km.mjs} +175 -120
  21. package/dist/_chunks/Field-Dltnt1km.mjs.map +1 -0
  22. package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +1 -1
  23. package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +1 -1
  24. package/dist/_chunks/{Form-BpeyAyS1.js → Form-BFi4MXMT.js} +5 -6
  25. package/dist/_chunks/{Form-BpeyAyS1.js.map → Form-BFi4MXMT.js.map} +1 -1
  26. package/dist/_chunks/{Form-Dvt5eouJ.mjs → Form-C1IcWm1u.mjs} +3 -3
  27. package/dist/_chunks/{Form-Dvt5eouJ.mjs.map → Form-C1IcWm1u.mjs.map} +1 -1
  28. package/dist/_chunks/{History-CAERKpYl.mjs → History-04ChQ4pl.mjs} +37 -60
  29. package/dist/_chunks/History-04ChQ4pl.mjs.map +1 -0
  30. package/dist/_chunks/{History-d-IgDGPl.js → History-wjcK4L0C.js} +37 -61
  31. package/dist/_chunks/History-wjcK4L0C.js.map +1 -0
  32. package/dist/_chunks/{ListConfigurationPage-CVVT45M8.mjs → ListConfigurationPage-BYqPYLSU.mjs} +6 -5
  33. package/dist/_chunks/ListConfigurationPage-BYqPYLSU.mjs.map +1 -0
  34. package/dist/_chunks/{ListConfigurationPage-DSX98CYb.js → ListConfigurationPage-CRbxIC3J.js} +6 -6
  35. package/dist/_chunks/ListConfigurationPage-CRbxIC3J.js.map +1 -0
  36. package/dist/_chunks/{ListViewPage-C9gPPp-V.js → ListViewPage-D5NY9183.js} +64 -53
  37. package/dist/_chunks/ListViewPage-D5NY9183.js.map +1 -0
  38. package/dist/_chunks/{ListViewPage-Q4g6kHDl.mjs → ListViewPage-FU2LBuhl.mjs} +63 -51
  39. package/dist/_chunks/ListViewPage-FU2LBuhl.mjs.map +1 -0
  40. package/dist/_chunks/{NoContentTypePage-D09gppmy.js → NoContentTypePage-BgQVE_Qb.js} +2 -2
  41. package/dist/_chunks/{NoContentTypePage-D09gppmy.js.map → NoContentTypePage-BgQVE_Qb.js.map} +1 -1
  42. package/dist/_chunks/{NoContentTypePage-BY4YRGs0.mjs → NoContentTypePage-DCKUkwb8.mjs} +2 -2
  43. package/dist/_chunks/{NoContentTypePage-BY4YRGs0.mjs.map → NoContentTypePage-DCKUkwb8.mjs.map} +1 -1
  44. package/dist/_chunks/{NoPermissionsPage-32WgThJG.js → NoPermissionsPage-C5jwn70o.js} +2 -2
  45. package/dist/_chunks/{NoPermissionsPage-32WgThJG.js.map → NoPermissionsPage-C5jwn70o.js.map} +1 -1
  46. package/dist/_chunks/{NoPermissionsPage-CyM16RKL.mjs → NoPermissionsPage-jqve7C8l.mjs} +2 -2
  47. package/dist/_chunks/{NoPermissionsPage-CyM16RKL.mjs.map → NoPermissionsPage-jqve7C8l.mjs.map} +1 -1
  48. package/dist/_chunks/{Preview-C2WFq4S8.mjs → Preview-BMYN548c.mjs} +100 -73
  49. package/dist/_chunks/Preview-BMYN548c.mjs.map +1 -0
  50. package/dist/_chunks/{Preview-PpV3g9wJ.js → Preview-DaOihysv.js} +98 -72
  51. package/dist/_chunks/Preview-DaOihysv.js.map +1 -0
  52. package/dist/_chunks/{Relations-mWaebC5t.js → Relations-CTGM7Hv5.js} +7 -10
  53. package/dist/_chunks/{Relations-mWaebC5t.js.map → Relations-CTGM7Hv5.js.map} +1 -1
  54. package/dist/_chunks/{Relations-B_Yn9xGB.mjs → Relations-gscPkxjF.mjs} +6 -8
  55. package/dist/_chunks/{Relations-B_Yn9xGB.mjs.map → Relations-gscPkxjF.mjs.map} +1 -1
  56. package/dist/_chunks/{en-CHOp_xJv.js → en-BzQmavmK.js} +11 -3
  57. package/dist/_chunks/{en-CHOp_xJv.js.map → en-BzQmavmK.js.map} +1 -1
  58. package/dist/_chunks/{en-D_BMf0hT.mjs → en-CSxLmrh1.mjs} +11 -3
  59. package/dist/_chunks/{en-D_BMf0hT.mjs.map → en-CSxLmrh1.mjs.map} +1 -1
  60. package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
  61. package/dist/_chunks/{index-iun2i4xv.js → index-Ca7YWlAA.js} +300 -204
  62. package/dist/_chunks/index-Ca7YWlAA.js.map +1 -0
  63. package/dist/_chunks/{index-CbytGVdz.mjs → index-DqasUQ6Q.mjs} +300 -203
  64. package/dist/_chunks/index-DqasUQ6Q.mjs.map +1 -0
  65. package/dist/_chunks/{layout-CkaP4K5_.js → layout-BW80JSCd.js} +5 -6
  66. package/dist/_chunks/{layout-CkaP4K5_.js.map → layout-BW80JSCd.js.map} +1 -1
  67. package/dist/_chunks/{layout-Btu_cMRF.mjs → layout-W3clJSCy.mjs} +4 -4
  68. package/dist/_chunks/{layout-Btu_cMRF.mjs.map → layout-W3clJSCy.mjs.map} +1 -1
  69. package/dist/_chunks/objects-BcXOv6_9.js.map +1 -1
  70. package/dist/_chunks/objects-D6yBsdmx.mjs.map +1 -1
  71. package/dist/_chunks/{relations-Cn5re8ia.mjs → relations-BlDkoeWh.mjs} +2 -2
  72. package/dist/_chunks/{relations-Cn5re8ia.mjs.map → relations-BlDkoeWh.mjs.map} +1 -1
  73. package/dist/_chunks/{relations-O_v9g0v_.js → relations-C9Usz9k5.js} +2 -2
  74. package/dist/_chunks/{relations-O_v9g0v_.js.map → relations-C9Usz9k5.js.map} +1 -1
  75. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -1
  76. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -1
  77. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
  78. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
  79. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
  80. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
  81. package/dist/admin/index.js +2 -1
  82. package/dist/admin/index.js.map +1 -1
  83. package/dist/admin/index.mjs +2 -1
  84. package/dist/admin/src/content-manager.d.ts +3 -2
  85. package/dist/admin/src/exports.d.ts +1 -0
  86. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  87. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
  88. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +3 -3
  89. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
  90. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
  91. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
  92. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +4 -1
  93. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +4 -1
  94. package/dist/admin/src/preview/components/PreviewContent.d.ts +2 -0
  95. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  96. package/dist/admin/src/router.d.ts +1 -1
  97. package/dist/admin/src/services/api.d.ts +1 -1
  98. package/dist/admin/src/services/components.d.ts +2 -2
  99. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  100. package/dist/admin/src/services/documents.d.ts +16 -19
  101. package/dist/admin/src/services/init.d.ts +1 -1
  102. package/dist/admin/src/services/relations.d.ts +2 -2
  103. package/dist/admin/src/services/uid.d.ts +3 -3
  104. package/dist/server/index.js +230 -187
  105. package/dist/server/index.js.map +1 -1
  106. package/dist/server/index.mjs +231 -187
  107. package/dist/server/index.mjs.map +1 -1
  108. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  109. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  110. package/dist/server/src/history/controllers/history-version.d.ts +1 -1
  111. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  112. package/dist/server/src/history/services/history.d.ts +3 -3
  113. package/dist/server/src/history/services/history.d.ts.map +1 -1
  114. package/dist/server/src/history/services/utils.d.ts +6 -10
  115. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  116. package/dist/server/src/index.d.ts +3 -2
  117. package/dist/server/src/index.d.ts.map +1 -1
  118. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  119. package/dist/server/src/preview/index.d.ts.map +1 -1
  120. package/dist/server/src/preview/services/index.d.ts +1 -0
  121. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  122. package/dist/server/src/preview/services/preview-config.d.ts +2 -0
  123. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  124. package/dist/server/src/preview/utils.d.ts +1 -0
  125. package/dist/server/src/preview/utils.d.ts.map +1 -1
  126. package/dist/server/src/register.d.ts.map +1 -1
  127. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  128. package/dist/server/src/services/document-metadata.d.ts +4 -2
  129. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  130. package/dist/server/src/services/index.d.ts +3 -2
  131. package/dist/server/src/services/index.d.ts.map +1 -1
  132. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  133. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  134. package/dist/server/src/services/utils/populate.d.ts +2 -2
  135. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  136. package/package.json +12 -11
  137. package/dist/_chunks/EditViewPage-B_k7z288.mjs.map +0 -1
  138. package/dist/_chunks/EditViewPage-Bb4S7p8c.js.map +0 -1
  139. package/dist/_chunks/Field-ByR1mllE.js.map +0 -1
  140. package/dist/_chunks/Field-DmwbE0TL.mjs.map +0 -1
  141. package/dist/_chunks/History-CAERKpYl.mjs.map +0 -1
  142. package/dist/_chunks/History-d-IgDGPl.js.map +0 -1
  143. package/dist/_chunks/ListConfigurationPage-CVVT45M8.mjs.map +0 -1
  144. package/dist/_chunks/ListConfigurationPage-DSX98CYb.js.map +0 -1
  145. package/dist/_chunks/ListViewPage-C9gPPp-V.js.map +0 -1
  146. package/dist/_chunks/ListViewPage-Q4g6kHDl.mjs.map +0 -1
  147. package/dist/_chunks/Preview-C2WFq4S8.mjs.map +0 -1
  148. package/dist/_chunks/Preview-PpV3g9wJ.js.map +0 -1
  149. package/dist/_chunks/index-CbytGVdz.mjs.map +0 -1
  150. package/dist/_chunks/index-iun2i4xv.js.map +0 -1
  151. package/dist/admin/src/preview/constants.d.ts +0 -1
  152. package/dist/server/src/preview/constants.d.ts +0 -2
  153. package/dist/server/src/preview/constants.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
2
  import { Layouts, Page } from "@strapi/admin/strapi-admin";
3
3
  import { useIntl } from "react-intl";
4
- import { g as getTranslation } from "./index-CbytGVdz.mjs";
4
+ import { g as getTranslation } from "./index-DqasUQ6Q.mjs";
5
5
  const NoPermissions = () => {
6
6
  const { formatMessage } = useIntl();
7
7
  return /* @__PURE__ */ jsxs(Fragment, { children: [
@@ -20,4 +20,4 @@ const NoPermissions = () => {
20
20
  export {
21
21
  NoPermissions
22
22
  };
23
- //# sourceMappingURL=NoPermissionsPage-CyM16RKL.mjs.map
23
+ //# sourceMappingURL=NoPermissionsPage-jqve7C8l.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"NoPermissionsPage-CyM16RKL.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,kBAAkB;AAE1B,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,QAAA,CACjB;AAAA,MAAA;AAAA,IACH;AAAA,IACA,oBAAC,QAAQ,SAAR,EACC,8BAAC,KAAK,eAAL,CAAmB,CAAA,GACtB;AAAA,EACF,EAAA,CAAA;AAEJ;"}
1
+ {"version":3,"file":"NoPermissionsPage-jqve7C8l.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,37 +1,59 @@
1
- import { jsxs, jsx, Fragment } from "react/jsx-runtime";
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 { Flex, Typography, IconButton, Box, Portal, FocusTrap } from "@strapi/design-system";
4
+ import { Box, Typography, Tabs, Grid, IconButton, Portal, FocusTrap, Flex } from "@strapi/design-system";
5
5
  import { useIntl } from "react-intl";
6
- import { useNavigate, Link as Link$1, useParams } from "react-router-dom";
7
- import { l as DocumentRBAC, d as buildValidParams, C as COLLECTION_TYPES, K as useGetPreviewUrlQuery, J as useDocument, h as useDocumentLayout } from "./index-CbytGVdz.mjs";
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, K as useGetPreviewUrlQuery, J as useDocument, h as useDocumentLayout } from "./index-DqasUQ6Q.mjs";
8
8
  import { Link, Cross } from "@strapi/icons";
9
9
  import { stringify } from "qs";
10
- import { getDocumentStatus } from "./EditViewPage-B_k7z288.mjs";
10
+ import { styled } from "styled-components";
11
+ import { getDocumentStatus } from "./EditViewPage-BPyVuPfM.mjs";
12
+ const PreviewContent = () => {
13
+ const previewUrl = usePreviewContext("PreviewContent", (state) => state.url);
14
+ const { formatMessage } = useIntl();
15
+ return /* @__PURE__ */ jsx(
16
+ Box,
17
+ {
18
+ src: previewUrl,
19
+ title: formatMessage({
20
+ id: "content-manager.preview.panel.title",
21
+ defaultMessage: "Preview"
22
+ }),
23
+ width: "100%",
24
+ height: "100%",
25
+ borderWidth: 0,
26
+ tag: "iframe"
27
+ },
28
+ previewUrl
29
+ );
30
+ };
11
31
  const ClosePreviewButton = () => {
12
32
  const [{ query }] = useQueryParams();
13
- const navigate = useNavigate();
14
33
  const { formatMessage } = useIntl();
15
34
  const canGoBack = useHistory("BackButton", (state) => state.canGoBack);
16
35
  const goBack = useHistory("BackButton", (state) => state.goBack);
17
36
  const history = useHistory("BackButton", (state) => state.history);
18
- const fallbackUrl = {
37
+ const locationIndex = useHistory("BackButton", (state) => state.currentLocationIndex);
38
+ const historyTo = canGoBack ? history.at(locationIndex - 2) : void 0;
39
+ const fallback = {
19
40
  pathname: "..",
20
41
  search: stringify(query, { encode: false })
21
42
  };
43
+ const toWithFallback = historyTo ?? fallback;
22
44
  const handleClick = (e) => {
23
- e.preventDefault();
24
45
  if (canGoBack) {
46
+ e.preventDefault();
25
47
  goBack();
26
- } else {
27
- navigate(fallbackUrl);
48
+ return;
28
49
  }
29
50
  };
30
51
  return /* @__PURE__ */ jsx(
31
52
  IconButton,
32
53
  {
33
54
  tag: Link$1,
34
- to: history.at(-1) ?? fallbackUrl,
55
+ relative: "path",
56
+ to: toWithFallback,
35
57
  onClick: handleClick,
36
58
  label: formatMessage({
37
59
  id: "content-manager.preview.header.close",
@@ -41,72 +63,63 @@ const ClosePreviewButton = () => {
41
63
  }
42
64
  );
43
65
  };
44
- const getStatusData = (status) => {
45
- switch (status) {
46
- case "draft":
47
- return {
48
- background: "secondary100",
49
- border: "secondary200",
50
- text: "secondary700",
51
- message: {
52
- id: "content-manager.containers.List.draft",
53
- defaultMessage: "Draft"
54
- }
55
- };
56
- case "modified":
57
- return {
58
- background: "alternative100",
59
- border: "alternative200",
60
- text: "alternative700",
61
- message: {
62
- id: "content-manager.containers.List.modified",
63
- defaultMessage: "Modified"
64
- }
65
- };
66
- case "published":
67
- default:
68
- return {
69
- background: "success100",
70
- border: "success200",
71
- text: "success700",
72
- message: {
73
- id: "content-manager.containers.List.published",
74
- defaultMessage: "Published"
75
- }
76
- };
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;
77
73
  }
74
+ const status = getDocumentStatus(document, meta);
75
+ return /* @__PURE__ */ jsx(DocumentStatus, { status, size: "XS" });
78
76
  };
79
- const DocumentStatus = () => {
77
+ const PreviewTabs = () => {
80
78
  const { formatMessage } = useIntl();
79
+ const [{ query }, setQuery] = useQueryParams();
81
80
  const document = usePreviewContext("PreviewHeader", (state) => state.document);
82
81
  const schema = usePreviewContext("PreviewHeader", (state) => state.schema);
83
82
  const meta = usePreviewContext("PreviewHeader", (state) => state.meta);
84
- const hasDraftAndPublished = schema?.options?.draftAndPublish ?? false;
85
- const status = getDocumentStatus(document, meta);
86
- const statusData = getStatusData(status);
87
- if (!hasDraftAndPublished) {
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) {
88
91
  return null;
89
92
  }
90
- return /* @__PURE__ */ jsx(
91
- Box,
93
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(Tabs.Root, { variant: "simple", value: query.status || "draft", onValueChange: handleTabChange, children: /* @__PURE__ */ jsxs(
94
+ Tabs.List,
92
95
  {
93
- background: statusData.background,
94
- borderStyle: "solid",
95
- borderWidth: "1px",
96
- borderColor: statusData.border,
97
- hasRadius: true,
98
- paddingLeft: "6px",
99
- paddingRight: "6px",
100
- paddingTop: "2px",
101
- paddingBottom: "2px",
102
- children: /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", textColor: statusData.text, children: formatMessage(statusData.message) })
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
+ ]
103
110
  }
104
- );
111
+ ) }) });
105
112
  };
106
113
  const PreviewHeader = () => {
107
114
  const mainField = usePreviewContext("PreviewHeader", (state) => state.mainField);
108
115
  const document = usePreviewContext("PreviewHeader", (state) => state.document);
109
- const title = document[mainField];
116
+ const schema = usePreviewContext("PreviewHeader", (state) => state.schema);
117
+ let documentTitle = "Untitled";
118
+ if (mainField !== "id" && document?.[mainField]) {
119
+ documentTitle = document[mainField];
120
+ } else if (schema.kind === "singleType" && schema?.info.displayName) {
121
+ documentTitle = schema.info.displayName;
122
+ }
110
123
  const { formatMessage } = useIntl();
111
124
  const { toggleNotification } = useNotification();
112
125
  const { copy } = useClipboard();
@@ -121,20 +134,23 @@ const PreviewHeader = () => {
121
134
  });
122
135
  };
123
136
  return /* @__PURE__ */ jsxs(
124
- Flex,
137
+ Grid.Root,
125
138
  {
126
- justifyContent: "space-between",
139
+ gap: 3,
140
+ gridCols: 3,
141
+ paddingLeft: 2,
142
+ paddingRight: 2,
127
143
  background: "neutral0",
128
- padding: 2,
129
144
  borderColor: "neutral150",
130
145
  tag: "header",
131
146
  children: [
132
- /* @__PURE__ */ jsxs(Flex, { gap: 3, children: [
147
+ /* @__PURE__ */ jsxs(Grid.Item, { xs: 1, paddingTop: 2, paddingBottom: 2, gap: 3, children: [
133
148
  /* @__PURE__ */ jsx(ClosePreviewButton, {}),
134
- /* @__PURE__ */ jsx(Typography, { tag: "h1", fontWeight: 600, fontSize: 2, children: title }),
135
- /* @__PURE__ */ jsx(DocumentStatus, {})
149
+ /* @__PURE__ */ jsx(PreviewTitle, { tag: "h1", fontWeight: 600, fontSize: 2, maxWidth: "200px", title: documentTitle, children: documentTitle }),
150
+ /* @__PURE__ */ jsx(Status, {})
136
151
  ] }),
137
- /* @__PURE__ */ jsx(
152
+ /* @__PURE__ */ jsx(Grid.Item, { xs: 1, marginBottom: "-1px", alignItems: "end", margin: "auto", children: /* @__PURE__ */ jsx(PreviewTabs, {}) }),
153
+ /* @__PURE__ */ jsx(Grid.Item, { xs: 1, justifyContent: "end", paddingTop: 2, paddingBottom: 2, children: /* @__PURE__ */ jsx(
138
154
  IconButton,
139
155
  {
140
156
  type: "button",
@@ -145,11 +161,19 @@ const PreviewHeader = () => {
145
161
  onClick: handleCopyLink,
146
162
  children: /* @__PURE__ */ jsx(Link, {})
147
163
  }
148
- )
164
+ ) })
149
165
  ]
150
166
  }
151
167
  );
152
168
  };
169
+ const PreviewTitle = styled(Typography)`
170
+ overflow: hidden;
171
+ text-overflow: ellipsis;
172
+ white-space: nowrap;
173
+ `;
174
+ const StatusTab = styled(Tabs.Trigger)`
175
+ text-transform: uppercase;
176
+ `;
153
177
  const [PreviewProvider, usePreviewContext] = createContext("PreviewPage");
154
178
  const PreviewPage = () => {
155
179
  const { formatMessage } = useIntl();
@@ -213,7 +237,10 @@ const PreviewPage = () => {
213
237
  document: documentResponse.document,
214
238
  meta: documentResponse.meta,
215
239
  schema: documentResponse.schema,
216
- children: /* @__PURE__ */ jsx(PreviewHeader, {})
240
+ children: /* @__PURE__ */ jsxs(Flex, { direction: "column", height: "100%", alignItems: "stretch", children: [
241
+ /* @__PURE__ */ jsx(PreviewHeader, {}),
242
+ /* @__PURE__ */ jsx(PreviewContent, {})
243
+ ] })
217
244
  }
218
245
  )
219
246
  ] });
@@ -264,4 +291,4 @@ export {
264
291
  ProtectedPreviewPage,
265
292
  usePreviewContext
266
293
  };
267
- //# sourceMappingURL=Preview-C2WFq4S8.mjs.map
294
+ //# sourceMappingURL=Preview-BMYN548c.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Preview-BMYN548c.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 main field\n const mainField = usePreviewContext('PreviewHeader', (state) => state.mainField);\n const document = usePreviewContext('PreviewHeader', (state) => state.document);\n const schema = usePreviewContext('PreviewHeader', (state) => state.schema);\n\n /**\n * We look to see what the mainField is from the configuration, if it's an id\n * we don't use it because it's a uuid format and not very user friendly.\n * Instead, we display the schema name for single-type documents\n * or \"Untitled\".\n */\n let documentTitle = 'Untitled';\n if (mainField !== 'id' && document?.[mainField]) {\n documentTitle = document[mainField];\n } else if (schema.kind === 'singleType' && schema?.info.displayName) {\n documentTitle = schema.info.displayName;\n }\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={documentTitle}>\n {documentTitle}\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 mainField: 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 return (\n <>\n <Page.Title>\n {formatMessage(\n {\n id: 'content-manager.preview.page-title',\n defaultMessage: '{contentType} preview',\n },\n {\n contentType: documentLayoutResponse.edit.settings.displayName,\n }\n )}\n </Page.Title>\n <PreviewProvider\n url={previewUrlResponse.data.data.url}\n mainField={documentLayoutResponse.edit.settings.mainField}\n document={documentResponse.document}\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":"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"}
@@ -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-iun2i4xv.js");
9
+ const index = require("./index-Ca7YWlAA.js");
10
10
  const Icons = require("@strapi/icons");
11
11
  const qs = require("qs");
12
- const EditViewPage = require("./EditViewPage-Bb4S7p8c.js");
12
+ const styledComponents = require("styled-components");
13
+ const EditViewPage = require("./EditViewPage-B-kExt8C.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) {
@@ -29,30 +29,51 @@ function _interopNamespace(e) {
29
29
  return Object.freeze(n);
30
30
  }
31
31
  const React__namespace = /* @__PURE__ */ _interopNamespace(React);
32
+ const PreviewContent = () => {
33
+ const previewUrl = usePreviewContext("PreviewContent", (state) => state.url);
34
+ const { formatMessage } = reactIntl.useIntl();
35
+ return /* @__PURE__ */ jsxRuntime.jsx(
36
+ designSystem.Box,
37
+ {
38
+ src: previewUrl,
39
+ title: formatMessage({
40
+ id: "content-manager.preview.panel.title",
41
+ defaultMessage: "Preview"
42
+ }),
43
+ width: "100%",
44
+ height: "100%",
45
+ borderWidth: 0,
46
+ tag: "iframe"
47
+ },
48
+ previewUrl
49
+ );
50
+ };
32
51
  const ClosePreviewButton = () => {
33
52
  const [{ query }] = strapiAdmin.useQueryParams();
34
- const navigate = reactRouterDom.useNavigate();
35
53
  const { formatMessage } = reactIntl.useIntl();
36
54
  const canGoBack = strapiAdmin.useHistory("BackButton", (state) => state.canGoBack);
37
55
  const goBack = strapiAdmin.useHistory("BackButton", (state) => state.goBack);
38
56
  const history = strapiAdmin.useHistory("BackButton", (state) => state.history);
39
- const fallbackUrl = {
57
+ const locationIndex = strapiAdmin.useHistory("BackButton", (state) => state.currentLocationIndex);
58
+ const historyTo = canGoBack ? history.at(locationIndex - 2) : void 0;
59
+ const fallback = {
40
60
  pathname: "..",
41
61
  search: qs.stringify(query, { encode: false })
42
62
  };
63
+ const toWithFallback = historyTo ?? fallback;
43
64
  const handleClick = (e) => {
44
- e.preventDefault();
45
65
  if (canGoBack) {
66
+ e.preventDefault();
46
67
  goBack();
47
- } else {
48
- navigate(fallbackUrl);
68
+ return;
49
69
  }
50
70
  };
51
71
  return /* @__PURE__ */ jsxRuntime.jsx(
52
72
  designSystem.IconButton,
53
73
  {
54
74
  tag: reactRouterDom.Link,
55
- to: history.at(-1) ?? fallbackUrl,
75
+ relative: "path",
76
+ to: toWithFallback,
56
77
  onClick: handleClick,
57
78
  label: formatMessage({
58
79
  id: "content-manager.preview.header.close",
@@ -62,72 +83,63 @@ const ClosePreviewButton = () => {
62
83
  }
63
84
  );
64
85
  };
65
- const getStatusData = (status) => {
66
- switch (status) {
67
- case "draft":
68
- return {
69
- background: "secondary100",
70
- border: "secondary200",
71
- text: "secondary700",
72
- message: {
73
- id: "content-manager.containers.List.draft",
74
- defaultMessage: "Draft"
75
- }
76
- };
77
- case "modified":
78
- return {
79
- background: "alternative100",
80
- border: "alternative200",
81
- text: "alternative700",
82
- message: {
83
- id: "content-manager.containers.List.modified",
84
- defaultMessage: "Modified"
85
- }
86
- };
87
- case "published":
88
- default:
89
- return {
90
- background: "success100",
91
- border: "success200",
92
- text: "success700",
93
- message: {
94
- id: "content-manager.containers.List.published",
95
- defaultMessage: "Published"
96
- }
97
- };
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;
98
93
  }
94
+ const status = EditViewPage.getDocumentStatus(document, meta);
95
+ return /* @__PURE__ */ jsxRuntime.jsx(index.DocumentStatus, { status, size: "XS" });
99
96
  };
100
- const DocumentStatus = () => {
97
+ const PreviewTabs = () => {
101
98
  const { formatMessage } = reactIntl.useIntl();
99
+ const [{ query }, setQuery] = strapiAdmin.useQueryParams();
102
100
  const document = usePreviewContext("PreviewHeader", (state) => state.document);
103
101
  const schema = usePreviewContext("PreviewHeader", (state) => state.schema);
104
102
  const meta = usePreviewContext("PreviewHeader", (state) => state.meta);
105
- const hasDraftAndPublished = schema?.options?.draftAndPublish ?? false;
106
- const status = EditViewPage.getDocumentStatus(document, meta);
107
- const statusData = getStatusData(status);
108
- if (!hasDraftAndPublished) {
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) {
109
111
  return null;
110
112
  }
111
- return /* @__PURE__ */ jsxRuntime.jsx(
112
- designSystem.Box,
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,
113
115
  {
114
- background: statusData.background,
115
- borderStyle: "solid",
116
- borderWidth: "1px",
117
- borderColor: statusData.border,
118
- hasRadius: true,
119
- paddingLeft: "6px",
120
- paddingRight: "6px",
121
- paddingTop: "2px",
122
- paddingBottom: "2px",
123
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", textColor: statusData.text, children: formatMessage(statusData.message) })
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
+ ]
124
130
  }
125
- );
131
+ ) }) });
126
132
  };
127
133
  const PreviewHeader = () => {
128
134
  const mainField = usePreviewContext("PreviewHeader", (state) => state.mainField);
129
135
  const document = usePreviewContext("PreviewHeader", (state) => state.document);
130
- const title = document[mainField];
136
+ const schema = usePreviewContext("PreviewHeader", (state) => state.schema);
137
+ let documentTitle = "Untitled";
138
+ if (mainField !== "id" && document?.[mainField]) {
139
+ documentTitle = document[mainField];
140
+ } else if (schema.kind === "singleType" && schema?.info.displayName) {
141
+ documentTitle = schema.info.displayName;
142
+ }
131
143
  const { formatMessage } = reactIntl.useIntl();
132
144
  const { toggleNotification } = strapiAdmin.useNotification();
133
145
  const { copy } = strapiAdmin.useClipboard();
@@ -142,20 +154,23 @@ const PreviewHeader = () => {
142
154
  });
143
155
  };
144
156
  return /* @__PURE__ */ jsxRuntime.jsxs(
145
- designSystem.Flex,
157
+ designSystem.Grid.Root,
146
158
  {
147
- justifyContent: "space-between",
159
+ gap: 3,
160
+ gridCols: 3,
161
+ paddingLeft: 2,
162
+ paddingRight: 2,
148
163
  background: "neutral0",
149
- padding: 2,
150
164
  borderColor: "neutral150",
151
165
  tag: "header",
152
166
  children: [
153
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 3, children: [
167
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Grid.Item, { xs: 1, paddingTop: 2, paddingBottom: 2, gap: 3, children: [
154
168
  /* @__PURE__ */ jsxRuntime.jsx(ClosePreviewButton, {}),
155
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "h1", fontWeight: 600, fontSize: 2, children: title }),
156
- /* @__PURE__ */ jsxRuntime.jsx(DocumentStatus, {})
169
+ /* @__PURE__ */ jsxRuntime.jsx(PreviewTitle, { tag: "h1", fontWeight: 600, fontSize: 2, maxWidth: "200px", title: documentTitle, children: documentTitle }),
170
+ /* @__PURE__ */ jsxRuntime.jsx(Status, {})
157
171
  ] }),
158
- /* @__PURE__ */ jsxRuntime.jsx(
172
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { xs: 1, marginBottom: "-1px", alignItems: "end", margin: "auto", children: /* @__PURE__ */ jsxRuntime.jsx(PreviewTabs, {}) }),
173
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { xs: 1, justifyContent: "end", paddingTop: 2, paddingBottom: 2, children: /* @__PURE__ */ jsxRuntime.jsx(
159
174
  designSystem.IconButton,
160
175
  {
161
176
  type: "button",
@@ -166,11 +181,19 @@ const PreviewHeader = () => {
166
181
  onClick: handleCopyLink,
167
182
  children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Link, {})
168
183
  }
169
- )
184
+ ) })
170
185
  ]
171
186
  }
172
187
  );
173
188
  };
189
+ const PreviewTitle = styledComponents.styled(designSystem.Typography)`
190
+ overflow: hidden;
191
+ text-overflow: ellipsis;
192
+ white-space: nowrap;
193
+ `;
194
+ const StatusTab = styledComponents.styled(designSystem.Tabs.Trigger)`
195
+ text-transform: uppercase;
196
+ `;
174
197
  const [PreviewProvider, usePreviewContext] = strapiAdmin.createContext("PreviewPage");
175
198
  const PreviewPage = () => {
176
199
  const { formatMessage } = reactIntl.useIntl();
@@ -234,7 +257,10 @@ const PreviewPage = () => {
234
257
  document: documentResponse.document,
235
258
  meta: documentResponse.meta,
236
259
  schema: documentResponse.schema,
237
- children: /* @__PURE__ */ jsxRuntime.jsx(PreviewHeader, {})
260
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", height: "100%", alignItems: "stretch", children: [
261
+ /* @__PURE__ */ jsxRuntime.jsx(PreviewHeader, {}),
262
+ /* @__PURE__ */ jsxRuntime.jsx(PreviewContent, {})
263
+ ] })
238
264
  }
239
265
  )
240
266
  ] });
@@ -283,4 +309,4 @@ const ProtectedPreviewPage = () => {
283
309
  };
284
310
  exports.ProtectedPreviewPage = ProtectedPreviewPage;
285
311
  exports.usePreviewContext = usePreviewContext;
286
- //# sourceMappingURL=Preview-PpV3g9wJ.js.map
312
+ //# sourceMappingURL=Preview-DaOihysv.js.map