@strapi/content-manager 0.0.0-next.c823b10e981295994d8b0733c78fa065aec064ee → 0.0.0-next.cb5f24c83e8fde7c31e5850c14430d38aa9b8862

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 (139) 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-CL9CAMaL.js → ComponentConfigurationPage-BSEZcJVB.js} +4 -5
  4. package/dist/_chunks/{ComponentConfigurationPage-CL9CAMaL.js.map → ComponentConfigurationPage-BSEZcJVB.js.map} +1 -1
  5. package/dist/_chunks/{ComponentConfigurationPage-BpM_Hc7r.mjs → ComponentConfigurationPage-BiASGi7x.mjs} +3 -3
  6. package/dist/_chunks/{ComponentConfigurationPage-BpM_Hc7r.mjs.map → ComponentConfigurationPage-BiASGi7x.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-ILWo0h1e.js → EditConfigurationPage-D2rtvneE.js} +4 -5
  11. package/dist/_chunks/{EditConfigurationPage-ILWo0h1e.js.map → EditConfigurationPage-D2rtvneE.js.map} +1 -1
  12. package/dist/_chunks/{EditConfigurationPage-_prbqpTM.mjs → EditConfigurationPage-vN4zupij.mjs} +3 -3
  13. package/dist/_chunks/{EditConfigurationPage-_prbqpTM.mjs.map → EditConfigurationPage-vN4zupij.mjs.map} +1 -1
  14. package/dist/_chunks/{EditViewPage-BqZvBN4s.js → EditViewPage-BwisF04Q.js} +38 -9
  15. package/dist/_chunks/EditViewPage-BwisF04Q.js.map +1 -0
  16. package/dist/_chunks/{EditViewPage-DAtscabN.mjs → EditViewPage-_A31Cl4g.mjs} +38 -8
  17. package/dist/_chunks/EditViewPage-_A31Cl4g.mjs.map +1 -0
  18. package/dist/_chunks/{Field-D-mgn1tH.mjs → Field-CvIunNOj.mjs} +169 -117
  19. package/dist/_chunks/Field-CvIunNOj.mjs.map +1 -0
  20. package/dist/_chunks/{Field-CcoQiiz1.js → Field-Dsu6-FrM.js} +171 -119
  21. package/dist/_chunks/Field-Dsu6-FrM.js.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-BxyeWiXW.mjs → Form-DK0fG0Gj.mjs} +3 -3
  25. package/dist/_chunks/{Form-BxyeWiXW.mjs.map → Form-DK0fG0Gj.mjs.map} +1 -1
  26. package/dist/_chunks/{Form-CmLbZDfi.js → Form-DUwWcCmA.js} +5 -6
  27. package/dist/_chunks/{Form-CmLbZDfi.js.map → Form-DUwWcCmA.js.map} +1 -1
  28. package/dist/_chunks/{History-uECUbCZB.js → History-CeCDhoJG.js} +9 -64
  29. package/dist/_chunks/History-CeCDhoJG.js.map +1 -0
  30. package/dist/_chunks/{History-BOhLaq_g.mjs → History-DP8gmXpm.mjs} +9 -63
  31. package/dist/_chunks/History-DP8gmXpm.mjs.map +1 -0
  32. package/dist/_chunks/{ListConfigurationPage-D0vQez6F.mjs → ListConfigurationPage-BCkO5iuN.mjs} +6 -5
  33. package/dist/_chunks/ListConfigurationPage-BCkO5iuN.mjs.map +1 -0
  34. package/dist/_chunks/{ListConfigurationPage-D_bBSFNW.js → ListConfigurationPage-C-bAd44a.js} +6 -6
  35. package/dist/_chunks/ListConfigurationPage-C-bAd44a.js.map +1 -0
  36. package/dist/_chunks/{ListViewPage-BkZ83b1A.js → ListViewPage-BKTZFhsM.js} +64 -53
  37. package/dist/_chunks/ListViewPage-BKTZFhsM.js.map +1 -0
  38. package/dist/_chunks/{ListViewPage-ns-bmy5C.mjs → ListViewPage-Cf_DgaFV.mjs} +63 -51
  39. package/dist/_chunks/ListViewPage-Cf_DgaFV.mjs.map +1 -0
  40. package/dist/_chunks/{NoContentTypePage-C1439s4s.js → NoContentTypePage-D3Cm3v3q.js} +2 -2
  41. package/dist/_chunks/{NoContentTypePage-C1439s4s.js.map → NoContentTypePage-D3Cm3v3q.js.map} +1 -1
  42. package/dist/_chunks/{NoContentTypePage-BA5ZKMDR.mjs → NoContentTypePage-nHIyvJcB.mjs} +2 -2
  43. package/dist/_chunks/{NoContentTypePage-BA5ZKMDR.mjs.map → NoContentTypePage-nHIyvJcB.mjs.map} +1 -1
  44. package/dist/_chunks/{NoPermissionsPage-B0GdMw1Q.mjs → NoPermissionsPage-BALVSJ7x.mjs} +2 -2
  45. package/dist/_chunks/{NoPermissionsPage-B0GdMw1Q.mjs.map → NoPermissionsPage-BALVSJ7x.mjs.map} +1 -1
  46. package/dist/_chunks/{NoPermissionsPage-CPGwsVfb.js → NoPermissionsPage-CChGWBj5.js} +2 -2
  47. package/dist/_chunks/{NoPermissionsPage-CPGwsVfb.js.map → NoPermissionsPage-CChGWBj5.js.map} +1 -1
  48. package/dist/_chunks/Preview-C4NBzKUV.mjs +294 -0
  49. package/dist/_chunks/Preview-C4NBzKUV.mjs.map +1 -0
  50. package/dist/_chunks/Preview-CT28Ckpg.js +312 -0
  51. package/dist/_chunks/Preview-CT28Ckpg.js.map +1 -0
  52. package/dist/_chunks/{Relations-BIGPMSW4.mjs → Relations-C8uC89cT.mjs} +6 -8
  53. package/dist/_chunks/{Relations-BIGPMSW4.mjs.map → Relations-C8uC89cT.mjs.map} +1 -1
  54. package/dist/_chunks/{Relations-d-8Uef_-.js → Relations-CvkPCng_.js} +7 -10
  55. package/dist/_chunks/{Relations-d-8Uef_-.js.map → Relations-CvkPCng_.js.map} +1 -1
  56. package/dist/_chunks/{en-Bdpa50w3.js → en-BK8Xyl5I.js} +11 -3
  57. package/dist/_chunks/{en-Bdpa50w3.js.map → en-BK8Xyl5I.js.map} +1 -1
  58. package/dist/_chunks/{en-CZw4xdPY.mjs → en-Dtk_ot79.mjs} +11 -3
  59. package/dist/_chunks/{en-CZw4xdPY.mjs.map → en-Dtk_ot79.mjs.map} +1 -1
  60. package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
  61. package/dist/_chunks/{index-BgaeYWIy.js → index-CnX_j5h-.js} +298 -210
  62. package/dist/_chunks/index-CnX_j5h-.js.map +1 -0
  63. package/dist/_chunks/{index-3_WeHXYp.mjs → index-Dh2aGTGJ.mjs} +303 -214
  64. package/dist/_chunks/index-Dh2aGTGJ.mjs.map +1 -0
  65. package/dist/_chunks/{layout-CrTxOnCy.mjs → layout-B5qsPihj.mjs} +4 -4
  66. package/dist/_chunks/{layout-CrTxOnCy.mjs.map → layout-B5qsPihj.mjs.map} +1 -1
  67. package/dist/_chunks/{layout-ByFyQRDH.js → layout-B_qdWGny.js} +5 -6
  68. package/dist/_chunks/{layout-ByFyQRDH.js.map → layout-B_qdWGny.js.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-C5RSW926.js → relations-ChcieiF5.js} +6 -3
  72. package/dist/_chunks/relations-ChcieiF5.js.map +1 -0
  73. package/dist/_chunks/{relations-BlpLgngh.mjs → relations-DMXpNY-e.mjs} +6 -3
  74. package/dist/_chunks/relations-DMXpNY-e.mjs.map +1 -0
  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 +1 -1
  82. package/dist/admin/index.mjs +4 -4
  83. package/dist/admin/src/content-manager.d.ts +3 -2
  84. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
  85. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
  86. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +2 -2
  87. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
  88. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
  89. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
  90. package/dist/admin/src/preview/components/PreviewContent.d.ts +2 -0
  91. package/dist/admin/src/preview/components/PreviewHeader.d.ts +2 -0
  92. package/dist/admin/src/preview/pages/Preview.d.ts +11 -0
  93. package/dist/admin/src/preview/routes.d.ts +3 -0
  94. package/dist/admin/src/router.d.ts +1 -1
  95. package/dist/admin/src/services/documents.d.ts +0 -3
  96. package/dist/server/index.js +151 -112
  97. package/dist/server/index.js.map +1 -1
  98. package/dist/server/index.mjs +152 -112
  99. package/dist/server/index.mjs.map +1 -1
  100. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  101. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  102. package/dist/server/src/index.d.ts +3 -2
  103. package/dist/server/src/index.d.ts.map +1 -1
  104. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  105. package/dist/server/src/preview/index.d.ts.map +1 -1
  106. package/dist/server/src/preview/services/index.d.ts +1 -0
  107. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  108. package/dist/server/src/preview/services/preview-config.d.ts +2 -0
  109. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  110. package/dist/server/src/preview/utils.d.ts +1 -0
  111. package/dist/server/src/preview/utils.d.ts.map +1 -1
  112. package/dist/server/src/register.d.ts.map +1 -1
  113. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  114. package/dist/server/src/services/document-metadata.d.ts +4 -2
  115. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  116. package/dist/server/src/services/index.d.ts +3 -2
  117. package/dist/server/src/services/index.d.ts.map +1 -1
  118. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  119. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  120. package/dist/server/src/services/utils/populate.d.ts +2 -2
  121. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  122. package/package.json +12 -10
  123. package/dist/_chunks/EditViewPage-BqZvBN4s.js.map +0 -1
  124. package/dist/_chunks/EditViewPage-DAtscabN.mjs.map +0 -1
  125. package/dist/_chunks/Field-CcoQiiz1.js.map +0 -1
  126. package/dist/_chunks/Field-D-mgn1tH.mjs.map +0 -1
  127. package/dist/_chunks/History-BOhLaq_g.mjs.map +0 -1
  128. package/dist/_chunks/History-uECUbCZB.js.map +0 -1
  129. package/dist/_chunks/ListConfigurationPage-D0vQez6F.mjs.map +0 -1
  130. package/dist/_chunks/ListConfigurationPage-D_bBSFNW.js.map +0 -1
  131. package/dist/_chunks/ListViewPage-BkZ83b1A.js.map +0 -1
  132. package/dist/_chunks/ListViewPage-ns-bmy5C.mjs.map +0 -1
  133. package/dist/_chunks/index-3_WeHXYp.mjs.map +0 -1
  134. package/dist/_chunks/index-BgaeYWIy.js.map +0 -1
  135. package/dist/_chunks/relations-BlpLgngh.mjs.map +0 -1
  136. package/dist/_chunks/relations-C5RSW926.js.map +0 -1
  137. package/dist/admin/src/preview/constants.d.ts +0 -1
  138. package/dist/server/src/preview/constants.d.ts +0 -2
  139. package/dist/server/src/preview/constants.d.ts.map +0 -1
@@ -7,16 +7,15 @@ const designSystem = require("@strapi/design-system");
7
7
  const mapValues = require("lodash/fp/mapValues");
8
8
  const reactIntl = require("react-intl");
9
9
  const reactRouterDom = require("react-router-dom");
10
+ const styledComponents = require("styled-components");
10
11
  const yup = require("yup");
12
+ const qs = require("qs");
11
13
  const pipe = require("lodash/fp/pipe");
12
14
  const dateFns = require("date-fns");
13
- const styledComponents = require("styled-components");
14
- const qs = require("qs");
15
15
  const toolkit = require("@reduxjs/toolkit");
16
16
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
17
17
  function _interopNamespace(e) {
18
- if (e && e.__esModule)
19
- return e;
18
+ if (e && e.__esModule) return e;
20
19
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
21
20
  if (e) {
22
21
  for (const k in e) {
@@ -36,13 +35,20 @@ const React__namespace = /* @__PURE__ */ _interopNamespace(React);
36
35
  const mapValues__default = /* @__PURE__ */ _interopDefault(mapValues);
37
36
  const yup__namespace = /* @__PURE__ */ _interopNamespace(yup);
38
37
  const pipe__default = /* @__PURE__ */ _interopDefault(pipe);
39
- const __variableDynamicImportRuntimeHelper = (glob, path) => {
38
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
40
39
  const v = glob[path];
41
40
  if (v) {
42
41
  return typeof v === "function" ? v() : Promise.resolve(v);
43
42
  }
44
43
  return new Promise((_, reject) => {
45
- (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(reject.bind(null, new Error("Unknown variable dynamic import: " + path)));
44
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
45
+ reject.bind(
46
+ null,
47
+ new Error(
48
+ "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
49
+ )
50
+ )
51
+ );
46
52
  });
47
53
  };
48
54
  const PLUGIN_ID = "content-manager";
@@ -242,7 +248,19 @@ const documentApi = contentManagerApi.injectEndpoints({
242
248
  { type: "Document", id: `${model}_LIST` },
243
249
  "Relations",
244
250
  { type: "UidAvailability", id: model }
245
- ]
251
+ ],
252
+ transformResponse: (response, meta, arg) => {
253
+ if (!("data" in response) && arg.model === "plugin::users-permissions.user") {
254
+ return {
255
+ data: response,
256
+ meta: {
257
+ availableStatus: [],
258
+ availableLocales: []
259
+ }
260
+ };
261
+ }
262
+ return response;
263
+ }
246
264
  }),
247
265
  deleteDocument: builder.mutation({
248
266
  query: ({ collectionType, model, documentId, params }) => ({
@@ -296,7 +314,7 @@ const documentApi = contentManagerApi.injectEndpoints({
296
314
  url: `/content-manager/collection-types/${model}`,
297
315
  method: "GET",
298
316
  config: {
299
- params
317
+ params: qs.stringify(params, { encode: true })
300
318
  }
301
319
  }),
302
320
  providesTags: (result, _error, arg) => {
@@ -475,8 +493,7 @@ const {
475
493
  useUnpublishManyDocumentsMutation
476
494
  } = documentApi;
477
495
  const buildValidParams = (query) => {
478
- if (!query)
479
- return query;
496
+ if (!query) return query;
480
497
  const { plugins: _, ...validQueryParams } = {
481
498
  ...query,
482
499
  ...Object.values(query?.plugins ?? {}).reduce(
@@ -484,9 +501,6 @@ const buildValidParams = (query) => {
484
501
  {}
485
502
  )
486
503
  };
487
- if ("_q" in validQueryParams) {
488
- validQueryParams._q = encodeURIComponent(validQueryParams._q);
489
- }
490
504
  return validQueryParams;
491
505
  };
492
506
  const isBaseQueryError = (error) => {
@@ -1685,10 +1699,10 @@ const useDocumentActions = () => {
1685
1699
  update
1686
1700
  };
1687
1701
  };
1688
- const ProtectedHistoryPage = React.lazy(
1689
- () => Promise.resolve().then(() => require("./History-uECUbCZB.js")).then((mod) => ({ default: mod.ProtectedHistoryPage }))
1702
+ const ProtectedHistoryPage = React__namespace.lazy(
1703
+ () => Promise.resolve().then(() => require("./History-CeCDhoJG.js")).then((mod) => ({ default: mod.ProtectedHistoryPage }))
1690
1704
  );
1691
- const routes$1 = [
1705
+ const routes$2 = [
1692
1706
  {
1693
1707
  path: ":collectionType/:slug/:id/history",
1694
1708
  Component: ProtectedHistoryPage
@@ -1698,32 +1712,45 @@ const routes$1 = [
1698
1712
  Component: ProtectedHistoryPage
1699
1713
  }
1700
1714
  ];
1715
+ const ProtectedPreviewPage = React__namespace.lazy(
1716
+ () => Promise.resolve().then(() => require("./Preview-CT28Ckpg.js")).then((mod) => ({ default: mod.ProtectedPreviewPage }))
1717
+ );
1718
+ const routes$1 = [
1719
+ {
1720
+ path: ":collectionType/:slug/:id/preview",
1721
+ Component: ProtectedPreviewPage
1722
+ },
1723
+ {
1724
+ path: ":collectionType/:slug/preview",
1725
+ Component: ProtectedPreviewPage
1726
+ }
1727
+ ];
1701
1728
  const ProtectedEditViewPage = React.lazy(
1702
- () => Promise.resolve().then(() => require("./EditViewPage-BqZvBN4s.js")).then((mod) => ({ default: mod.ProtectedEditViewPage }))
1729
+ () => Promise.resolve().then(() => require("./EditViewPage-BwisF04Q.js")).then((mod) => ({ default: mod.ProtectedEditViewPage }))
1703
1730
  );
1704
1731
  const ProtectedListViewPage = React.lazy(
1705
- () => Promise.resolve().then(() => require("./ListViewPage-BkZ83b1A.js")).then((mod) => ({ default: mod.ProtectedListViewPage }))
1732
+ () => Promise.resolve().then(() => require("./ListViewPage-BKTZFhsM.js")).then((mod) => ({ default: mod.ProtectedListViewPage }))
1706
1733
  );
1707
1734
  const ProtectedListConfiguration = React.lazy(
1708
- () => Promise.resolve().then(() => require("./ListConfigurationPage-D_bBSFNW.js")).then((mod) => ({
1735
+ () => Promise.resolve().then(() => require("./ListConfigurationPage-C-bAd44a.js")).then((mod) => ({
1709
1736
  default: mod.ProtectedListConfiguration
1710
1737
  }))
1711
1738
  );
1712
1739
  const ProtectedEditConfigurationPage = React.lazy(
1713
- () => Promise.resolve().then(() => require("./EditConfigurationPage-ILWo0h1e.js")).then((mod) => ({
1740
+ () => Promise.resolve().then(() => require("./EditConfigurationPage-D2rtvneE.js")).then((mod) => ({
1714
1741
  default: mod.ProtectedEditConfigurationPage
1715
1742
  }))
1716
1743
  );
1717
1744
  const ProtectedComponentConfigurationPage = React.lazy(
1718
- () => Promise.resolve().then(() => require("./ComponentConfigurationPage-CL9CAMaL.js")).then((mod) => ({
1745
+ () => Promise.resolve().then(() => require("./ComponentConfigurationPage-BSEZcJVB.js")).then((mod) => ({
1719
1746
  default: mod.ProtectedComponentConfigurationPage
1720
1747
  }))
1721
1748
  );
1722
1749
  const NoPermissions = React.lazy(
1723
- () => Promise.resolve().then(() => require("./NoPermissionsPage-CPGwsVfb.js")).then((mod) => ({ default: mod.NoPermissions }))
1750
+ () => Promise.resolve().then(() => require("./NoPermissionsPage-CChGWBj5.js")).then((mod) => ({ default: mod.NoPermissions }))
1724
1751
  );
1725
1752
  const NoContentType = React.lazy(
1726
- () => Promise.resolve().then(() => require("./NoContentTypePage-C1439s4s.js")).then((mod) => ({ default: mod.NoContentType }))
1753
+ () => Promise.resolve().then(() => require("./NoContentTypePage-D3Cm3v3q.js")).then((mod) => ({ default: mod.NoContentType }))
1727
1754
  );
1728
1755
  const CollectionTypePages = () => {
1729
1756
  const { collectionType } = reactRouterDom.useParams();
@@ -1735,7 +1762,7 @@ const CollectionTypePages = () => {
1735
1762
  const CLONE_RELATIVE_PATH = ":collectionType/:slug/clone/:origin";
1736
1763
  const CLONE_PATH = `/content-manager/${CLONE_RELATIVE_PATH}`;
1737
1764
  const LIST_RELATIVE_PATH = ":collectionType/:slug";
1738
- const LIST_PATH = `/content-manager/${LIST_RELATIVE_PATH}`;
1765
+ const LIST_PATH = `/content-manager/collection-types/:slug`;
1739
1766
  const routes = [
1740
1767
  {
1741
1768
  path: LIST_RELATIVE_PATH,
@@ -1769,6 +1796,7 @@ const routes = [
1769
1796
  path: "no-content-types",
1770
1797
  Component: NoContentType
1771
1798
  },
1799
+ ...routes$2,
1772
1800
  ...routes$1
1773
1801
  ];
1774
1802
  const DocumentActions = ({ actions: actions2 }) => {
@@ -1867,6 +1895,11 @@ const DocumentActionButton = (action) => {
1867
1895
  ) : null
1868
1896
  ] });
1869
1897
  };
1898
+ const MenuItem = styledComponents.styled(designSystem.Menu.Item)`
1899
+ &:hover {
1900
+ background: ${({ theme, isVariantDanger, isDisabled }) => isVariantDanger && !isDisabled ? theme.colors.danger100 : "neutral"};
1901
+ }
1902
+ `;
1870
1903
  const DocumentActionsMenu = ({
1871
1904
  actions: actions2,
1872
1905
  children,
@@ -1925,48 +1958,32 @@ const DocumentActionsMenu = ({
1925
1958
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { maxHeight: void 0, popoverPlacement: "bottom-end", children: [
1926
1959
  actions2.map((action) => {
1927
1960
  return /* @__PURE__ */ jsxRuntime.jsx(
1928
- designSystem.Menu.Item,
1961
+ MenuItem,
1929
1962
  {
1930
1963
  disabled: action.disabled,
1931
1964
  onSelect: handleClick(action),
1932
1965
  display: "block",
1933
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", gap: 4, children: [
1934
- /* @__PURE__ */ jsxRuntime.jsxs(
1935
- designSystem.Flex,
1936
- {
1937
- color: !action.disabled ? convertActionVariantToColor(action.variant) : "inherit",
1938
- gap: 2,
1939
- tag: "span",
1940
- children: [
1941
- /* @__PURE__ */ jsxRuntime.jsx(
1942
- designSystem.Flex,
1943
- {
1944
- tag: "span",
1945
- color: !action.disabled ? convertActionVariantToIconColor(action.variant) : "inherit",
1946
- children: action.icon
1947
- }
1948
- ),
1949
- action.label
1950
- ]
1951
- }
1952
- ),
1953
- action.id.startsWith("HistoryAction") && /* @__PURE__ */ jsxRuntime.jsx(
1954
- designSystem.Flex,
1955
- {
1956
- alignItems: "center",
1957
- background: "alternative100",
1958
- borderStyle: "solid",
1959
- borderColor: "alternative200",
1960
- borderWidth: "1px",
1961
- height: 5,
1962
- paddingLeft: 2,
1963
- paddingRight: 2,
1964
- hasRadius: true,
1965
- color: "alternative600",
1966
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "sigma", fontWeight: "bold", lineHeight: 1, children: formatMessage({ id: "global.new", defaultMessage: "New" }) })
1967
- }
1968
- )
1969
- ] })
1966
+ isVariantDanger: action.variant === "danger",
1967
+ isDisabled: action.disabled,
1968
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { justifyContent: "space-between", gap: 4, children: /* @__PURE__ */ jsxRuntime.jsxs(
1969
+ designSystem.Flex,
1970
+ {
1971
+ color: !action.disabled ? convertActionVariantToColor(action.variant) : "inherit",
1972
+ gap: 2,
1973
+ tag: "span",
1974
+ children: [
1975
+ /* @__PURE__ */ jsxRuntime.jsx(
1976
+ designSystem.Flex,
1977
+ {
1978
+ tag: "span",
1979
+ color: !action.disabled ? convertActionVariantToIconColor(action.variant) : "inherit",
1980
+ children: action.icon
1981
+ }
1982
+ ),
1983
+ action.label
1984
+ ]
1985
+ }
1986
+ ) })
1970
1987
  },
1971
1988
  action.id
1972
1989
  );
@@ -2103,6 +2120,7 @@ const PublishAction$1 = ({
2103
2120
  const { _unstableFormatValidationErrors: formatValidationErrors } = strapiAdmin.useAPIErrorHandler();
2104
2121
  const isListView = reactRouterDom.useMatch(LIST_PATH) !== null;
2105
2122
  const isCloning = reactRouterDom.useMatch(CLONE_PATH) !== null;
2123
+ const { id } = reactRouterDom.useParams();
2106
2124
  const { formatMessage } = reactIntl.useIntl();
2107
2125
  const canPublish = useDocumentRBAC("PublishAction", ({ canPublish: canPublish2 }) => canPublish2);
2108
2126
  const { publish } = useDocumentActions();
@@ -2205,10 +2223,12 @@ const PublishAction$1 = ({
2205
2223
  transformData(formValues)
2206
2224
  );
2207
2225
  if ("data" in res && collectionType !== SINGLE_TYPES) {
2208
- navigate({
2209
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
2210
- search: rawQuery
2211
- });
2226
+ if (id === "create") {
2227
+ navigate({
2228
+ pathname: `../${collectionType}/${model}/${res.data.documentId}`,
2229
+ search: rawQuery
2230
+ });
2231
+ }
2212
2232
  } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2213
2233
  setErrors(formatValidationErrors(res.error));
2214
2234
  }
@@ -2261,6 +2281,7 @@ const PublishAction$1 = ({
2261
2281
  };
2262
2282
  };
2263
2283
  PublishAction$1.type = "publish";
2284
+ PublishAction$1.position = "panel";
2264
2285
  const UpdateAction = ({
2265
2286
  activeTab,
2266
2287
  documentId,
@@ -2283,96 +2304,134 @@ const UpdateAction = ({
2283
2304
  const validate = strapiAdmin.useForm("UpdateAction", (state) => state.validate);
2284
2305
  const setErrors = strapiAdmin.useForm("UpdateAction", (state) => state.setErrors);
2285
2306
  const resetForm = strapiAdmin.useForm("PublishAction", ({ resetForm: resetForm2 }) => resetForm2);
2286
- return {
2287
- /**
2288
- * Disabled when:
2289
- * - the form is submitting
2290
- * - the document is not modified & we're not cloning (you can save a clone entity straight away)
2291
- * - the active tab is the published tab
2292
- */
2293
- disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
2294
- label: formatMessage({
2295
- id: "content-manager.containers.Edit.save",
2296
- defaultMessage: "Save"
2297
- }),
2298
- onClick: async () => {
2299
- setSubmitting(true);
2300
- try {
2301
- const { errors } = await validate(true, {
2302
- status: "draft"
2307
+ const handleUpdate = React__namespace.useCallback(async () => {
2308
+ setSubmitting(true);
2309
+ try {
2310
+ if (!modified) {
2311
+ return;
2312
+ }
2313
+ const { errors } = await validate(true, {
2314
+ status: "draft"
2315
+ });
2316
+ if (errors) {
2317
+ toggleNotification({
2318
+ type: "danger",
2319
+ message: formatMessage({
2320
+ id: "content-manager.validation.error",
2321
+ defaultMessage: "There are validation errors in your document. Please fix them before saving."
2322
+ })
2303
2323
  });
2304
- if (errors) {
2305
- toggleNotification({
2306
- type: "danger",
2307
- message: formatMessage({
2308
- id: "content-manager.validation.error",
2309
- defaultMessage: "There are validation errors in your document. Please fix them before saving."
2310
- })
2311
- });
2312
- return;
2313
- }
2314
- if (isCloning) {
2315
- const res = await clone(
2316
- {
2317
- model,
2318
- documentId: cloneMatch.params.origin,
2319
- params
2320
- },
2321
- transformData(document)
2322
- );
2323
- if ("data" in res) {
2324
- navigate(
2325
- {
2326
- pathname: `../${res.data.documentId}`,
2327
- search: rawQuery
2328
- },
2329
- { relative: "path" }
2330
- );
2331
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2332
- setErrors(formatValidationErrors(res.error));
2333
- }
2334
- } else if (documentId || collectionType === SINGLE_TYPES) {
2335
- const res = await update(
2324
+ return;
2325
+ }
2326
+ if (isCloning) {
2327
+ const res = await clone(
2328
+ {
2329
+ model,
2330
+ documentId: cloneMatch.params.origin,
2331
+ params
2332
+ },
2333
+ transformData(document)
2334
+ );
2335
+ if ("data" in res) {
2336
+ navigate(
2336
2337
  {
2337
- collectionType,
2338
- model,
2339
- documentId,
2340
- params
2338
+ pathname: `../${res.data.documentId}`,
2339
+ search: rawQuery
2341
2340
  },
2342
- transformData(document)
2341
+ { relative: "path" }
2343
2342
  );
2344
- if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2345
- setErrors(formatValidationErrors(res.error));
2346
- } else {
2347
- resetForm();
2348
- }
2343
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2344
+ setErrors(formatValidationErrors(res.error));
2345
+ }
2346
+ } else if (documentId || collectionType === SINGLE_TYPES) {
2347
+ const res = await update(
2348
+ {
2349
+ collectionType,
2350
+ model,
2351
+ documentId,
2352
+ params
2353
+ },
2354
+ transformData(document)
2355
+ );
2356
+ if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2357
+ setErrors(formatValidationErrors(res.error));
2349
2358
  } else {
2350
- const res = await create(
2359
+ resetForm();
2360
+ }
2361
+ } else {
2362
+ const res = await create(
2363
+ {
2364
+ model,
2365
+ params
2366
+ },
2367
+ transformData(document)
2368
+ );
2369
+ if ("data" in res && collectionType !== SINGLE_TYPES) {
2370
+ navigate(
2351
2371
  {
2352
- model,
2353
- params
2372
+ pathname: `../${res.data.documentId}`,
2373
+ search: rawQuery
2354
2374
  },
2355
- transformData(document)
2375
+ { replace: true, relative: "path" }
2356
2376
  );
2357
- if ("data" in res && collectionType !== SINGLE_TYPES) {
2358
- navigate(
2359
- {
2360
- pathname: `../${res.data.documentId}`,
2361
- search: rawQuery
2362
- },
2363
- { replace: true, relative: "path" }
2364
- );
2365
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2366
- setErrors(formatValidationErrors(res.error));
2367
- }
2377
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2378
+ setErrors(formatValidationErrors(res.error));
2368
2379
  }
2369
- } finally {
2370
- setSubmitting(false);
2371
2380
  }
2381
+ } finally {
2382
+ setSubmitting(false);
2372
2383
  }
2384
+ }, [
2385
+ clone,
2386
+ cloneMatch?.params.origin,
2387
+ collectionType,
2388
+ create,
2389
+ document,
2390
+ documentId,
2391
+ formatMessage,
2392
+ formatValidationErrors,
2393
+ isCloning,
2394
+ model,
2395
+ modified,
2396
+ navigate,
2397
+ params,
2398
+ rawQuery,
2399
+ resetForm,
2400
+ setErrors,
2401
+ setSubmitting,
2402
+ toggleNotification,
2403
+ update,
2404
+ validate
2405
+ ]);
2406
+ React__namespace.useEffect(() => {
2407
+ const handleKeyDown = (e) => {
2408
+ if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
2409
+ e.preventDefault();
2410
+ handleUpdate();
2411
+ }
2412
+ };
2413
+ window.addEventListener("keydown", handleKeyDown);
2414
+ return () => {
2415
+ window.removeEventListener("keydown", handleKeyDown);
2416
+ };
2417
+ }, [handleUpdate]);
2418
+ return {
2419
+ /**
2420
+ * Disabled when:
2421
+ * - the form is submitting
2422
+ * - the document is not modified & we're not cloning (you can save a clone entity straight away)
2423
+ * - the active tab is the published tab
2424
+ */
2425
+ disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
2426
+ label: formatMessage({
2427
+ id: "global.save",
2428
+ defaultMessage: "Save"
2429
+ }),
2430
+ onClick: handleUpdate
2373
2431
  };
2374
2432
  };
2375
2433
  UpdateAction.type = "update";
2434
+ UpdateAction.position = "panel";
2376
2435
  const UNPUBLISH_DRAFT_OPTIONS = {
2377
2436
  KEEP: "keep",
2378
2437
  DISCARD: "discard"
@@ -2495,6 +2554,7 @@ const UnpublishAction$1 = ({
2495
2554
  };
2496
2555
  };
2497
2556
  UnpublishAction$1.type = "unpublish";
2557
+ UnpublishAction$1.position = "panel";
2498
2558
  const DiscardAction = ({
2499
2559
  activeTab,
2500
2560
  documentId,
@@ -2545,6 +2605,7 @@ const DiscardAction = ({
2545
2605
  };
2546
2606
  };
2547
2607
  DiscardAction.type = "discard";
2608
+ DiscardAction.position = "panel";
2548
2609
  const DEFAULT_ACTIONS = [PublishAction$1, UpdateAction, UnpublishAction$1, DiscardAction];
2549
2610
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
2550
2611
  const RelativeTime = React__namespace.forwardRef(
@@ -2557,7 +2618,7 @@ const RelativeTime = React__namespace.forwardRef(
2557
2618
  });
2558
2619
  const unit = intervals.find((intervalUnit) => {
2559
2620
  return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
2560
- });
2621
+ }) ?? "seconds";
2561
2622
  const relativeTime = dateFns.isPast(timestamp) ? -interval[unit] : interval[unit];
2562
2623
  const customInterval = customIntervals.find(
2563
2624
  (custom) => interval[custom.unit] < custom.threshold
@@ -2591,19 +2652,29 @@ const getDisplayName = ({
2591
2652
  return email ?? "";
2592
2653
  };
2593
2654
  const capitalise = (str) => str.charAt(0).toUpperCase() + str.slice(1);
2594
- const DocumentStatus = ({ status = "draft", ...restProps }) => {
2655
+ const DocumentStatus = ({ status = "draft", size = "S", ...restProps }) => {
2595
2656
  const statusVariant = status === "draft" ? "secondary" : status === "published" ? "success" : "alternative";
2596
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Status, { ...restProps, showBullet: false, size: "S", variant: statusVariant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "omega", fontWeight: "bold", children: capitalise(status) }) });
2657
+ const { formatMessage } = reactIntl.useIntl();
2658
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Status, { ...restProps, size, variant: statusVariant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "omega", fontWeight: "bold", children: formatMessage({
2659
+ id: `content-manager.containers.List.${status}`,
2660
+ defaultMessage: capitalise(status)
2661
+ }) }) });
2597
2662
  };
2598
2663
  const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
2599
2664
  const { formatMessage } = reactIntl.useIntl();
2600
2665
  const isCloning = reactRouterDom.useMatch(CLONE_PATH) !== null;
2666
+ const params = reactRouterDom.useParams();
2601
2667
  const title = isCreating ? formatMessage({
2602
2668
  id: "content-manager.containers.edit.title.new",
2603
2669
  defaultMessage: "Create an entry"
2604
2670
  }) : documentTitle;
2605
2671
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "flex-start", paddingTop: 6, paddingBottom: 4, gap: 2, children: [
2606
- /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.BackButton, {}),
2672
+ /* @__PURE__ */ jsxRuntime.jsx(
2673
+ strapiAdmin.BackButton,
2674
+ {
2675
+ fallback: params.collectionType === SINGLE_TYPES ? void 0 : `../${COLLECTION_TYPES}/${params.slug}`
2676
+ }
2677
+ ),
2607
2678
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", justifyContent: "space-between", gap: "80px", alignItems: "flex-start", children: [
2608
2679
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "alpha", tag: "h1", children: title }),
2609
2680
  /* @__PURE__ */ jsxRuntime.jsx(HeaderToolbar, {})
@@ -2654,7 +2725,7 @@ const HeaderToolbar = () => {
2654
2725
  meta: isCloning ? void 0 : meta,
2655
2726
  collectionType
2656
2727
  },
2657
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
2728
+ descriptions: plugins["content-manager"].apis.getDocumentActions("header"),
2658
2729
  children: (actions2) => {
2659
2730
  const headerActions = actions2.filter((action) => {
2660
2731
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -2862,6 +2933,7 @@ const ConfigureTheViewAction = ({ collectionType, model }) => {
2862
2933
  };
2863
2934
  };
2864
2935
  ConfigureTheViewAction.type = "configure-the-view";
2936
+ ConfigureTheViewAction.position = "header";
2865
2937
  const EditTheModelAction = ({ model }) => {
2866
2938
  const navigate = reactRouterDom.useNavigate();
2867
2939
  const { formatMessage } = reactIntl.useIntl();
@@ -2878,6 +2950,7 @@ const EditTheModelAction = ({ model }) => {
2878
2950
  };
2879
2951
  };
2880
2952
  EditTheModelAction.type = "edit-the-model";
2953
+ EditTheModelAction.position = "header";
2881
2954
  const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2882
2955
  const navigate = reactRouterDom.useNavigate();
2883
2956
  const { formatMessage } = reactIntl.useIntl();
@@ -2951,6 +3024,7 @@ const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2951
3024
  };
2952
3025
  };
2953
3026
  DeleteAction$1.type = "delete";
3027
+ DeleteAction$1.position = ["header", "table-row"];
2954
3028
  const DEFAULT_HEADER_ACTIONS = [EditTheModelAction, ConfigureTheViewAction, DeleteAction$1];
2955
3029
  const Panels = () => {
2956
3030
  const isCloning = reactRouterDom.useMatch(CLONE_PATH) !== null;
@@ -3013,7 +3087,7 @@ const ActionsPanelContent = () => {
3013
3087
  strapiAdmin.DescriptionComponentRenderer,
3014
3088
  {
3015
3089
  props,
3016
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
3090
+ descriptions: plugins["content-manager"].apis.getDocumentActions("panel"),
3017
3091
  children: (actions2) => /* @__PURE__ */ jsxRuntime.jsx(DocumentActions, { actions: actions2 })
3018
3092
  }
3019
3093
  ),
@@ -3290,18 +3364,10 @@ const SelectedEntriesTableContent = ({
3290
3364
  search: row.locale && `?plugins[i18n][locale]=${row.locale}`
3291
3365
  },
3292
3366
  state: { from: pathname },
3293
- label: formatMessage(
3294
- { id: "app.component.HelperPluginTable.edit", defaultMessage: "Edit {target}" },
3295
- {
3296
- target: formatMessage(
3297
- {
3298
- id: "content-manager.components.ListViewHelperPluginTable.row-line",
3299
- defaultMessage: "item line {number}"
3300
- },
3301
- { number: index2 + 1 }
3302
- )
3303
- }
3304
- ),
3367
+ label: formatMessage({
3368
+ id: "content-manager.bulk-publish.edit",
3369
+ defaultMessage: "Edit"
3370
+ }),
3305
3371
  target: "_blank",
3306
3372
  marginLeft: "auto",
3307
3373
  variant: "ghost",
@@ -3475,8 +3541,7 @@ const PublishAction = ({ documents, model }) => {
3475
3541
  const refetchList = () => {
3476
3542
  contentManagerApi.util.invalidateTags([{ type: "Document", id: `${model}_LIST` }]);
3477
3543
  };
3478
- if (!showPublishButton)
3479
- return null;
3544
+ if (!showPublishButton) return null;
3480
3545
  return {
3481
3546
  actionType: "publish",
3482
3547
  variant: "tertiary",
@@ -3544,8 +3609,7 @@ const DeleteAction = ({ documents, model }) => {
3544
3609
  selectRow([]);
3545
3610
  }
3546
3611
  };
3547
- if (!hasDeletePermission)
3548
- return null;
3612
+ if (!hasDeletePermission) return null;
3549
3613
  return {
3550
3614
  variant: "danger-light",
3551
3615
  label: formatMessage({ id: "global.delete", defaultMessage: "Delete" }),
@@ -3594,8 +3658,7 @@ const UnpublishAction = ({ documents, model }) => {
3594
3658
  }
3595
3659
  };
3596
3660
  const showUnpublishButton = hasDraftAndPublishEnabled && hasPublishPermission && documents.some((entry) => entry.status === "published" || entry.status === "modified");
3597
- if (!showUnpublishButton)
3598
- return null;
3661
+ if (!showUnpublishButton) return null;
3599
3662
  return {
3600
3663
  variant: "tertiary",
3601
3664
  label: formatMessage({ id: "app.utils.unpublish", defaultMessage: "Unpublish" }),
@@ -3700,7 +3763,7 @@ const TableActions = ({ document }) => {
3700
3763
  strapiAdmin.DescriptionComponentRenderer,
3701
3764
  {
3702
3765
  props,
3703
- descriptions: plugins["content-manager"].apis.getDocumentActions().filter((action) => action.name !== "PublishAction"),
3766
+ descriptions: plugins["content-manager"].apis.getDocumentActions("table-row").filter((action) => action.name !== "PublishAction"),
3704
3767
  children: (actions2) => {
3705
3768
  const tableRowActions = actions2.filter((action) => {
3706
3769
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -3759,6 +3822,7 @@ const EditAction = ({ documentId }) => {
3759
3822
  };
3760
3823
  };
3761
3824
  EditAction.type = "edit";
3825
+ EditAction.position = "table-row";
3762
3826
  const StyledPencil = styledComponents.styled(Icons.Pencil)`
3763
3827
  path {
3764
3828
  fill: currentColor;
@@ -3835,6 +3899,7 @@ const CloneAction = ({ model, documentId }) => {
3835
3899
  };
3836
3900
  };
3837
3901
  CloneAction.type = "clone";
3902
+ CloneAction.position = "table-row";
3838
3903
  const StyledDuplicate = styledComponents.styled(Icons.Duplicate)`
3839
3904
  path {
3840
3905
  fill: currentColor;
@@ -3921,7 +3986,14 @@ class ContentManagerPlugin {
3921
3986
  addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),
3922
3987
  addEditViewSidePanel: this.addEditViewSidePanel.bind(this),
3923
3988
  getBulkActions: () => this.bulkActions,
3924
- getDocumentActions: () => this.documentActions,
3989
+ getDocumentActions: (position) => {
3990
+ if (position) {
3991
+ return this.documentActions.filter(
3992
+ (action) => action.position == void 0 || [action.position].flat().includes(position)
3993
+ );
3994
+ }
3995
+ return this.documentActions;
3996
+ },
3925
3997
  getEditViewSidePanels: () => this.editViewSidePanels,
3926
3998
  getHeaderActions: () => this.headerActions
3927
3999
  }
@@ -3931,10 +4003,8 @@ class ContentManagerPlugin {
3931
4003
  const getPrintableType = (value) => {
3932
4004
  const nativeType = typeof value;
3933
4005
  if (nativeType === "object") {
3934
- if (value === null)
3935
- return "null";
3936
- if (Array.isArray(value))
3937
- return "array";
4006
+ if (value === null) return "null";
4007
+ if (Array.isArray(value)) return "array";
3938
4008
  if (value instanceof Object && value.constructor.name !== "Object") {
3939
4009
  return value.constructor.name;
3940
4010
  }
@@ -3945,17 +4015,27 @@ const HistoryAction = ({ model, document }) => {
3945
4015
  const { formatMessage } = reactIntl.useIntl();
3946
4016
  const [{ query }] = strapiAdmin.useQueryParams();
3947
4017
  const navigate = reactRouterDom.useNavigate();
4018
+ const { trackUsage } = strapiAdmin.useTracking();
4019
+ const { pathname } = reactRouterDom.useLocation();
3948
4020
  const pluginsQueryParams = qs.stringify({ plugins: query.plugins }, { encode: false });
3949
4021
  if (!window.strapi.features.isEnabled("cms-content-history")) {
3950
4022
  return null;
3951
4023
  }
4024
+ const handleOnClick = () => {
4025
+ const destination = { pathname: "history", search: pluginsQueryParams };
4026
+ trackUsage("willNavigate", {
4027
+ from: pathname,
4028
+ to: `${pathname}/${destination.pathname}`
4029
+ });
4030
+ navigate(destination);
4031
+ };
3952
4032
  return {
3953
4033
  icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.ClockCounterClockwise, {}),
3954
4034
  label: formatMessage({
3955
4035
  id: "content-manager.history.document-action",
3956
4036
  defaultMessage: "Content History"
3957
4037
  }),
3958
- onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
4038
+ onClick: handleOnClick,
3959
4039
  disabled: (
3960
4040
  /**
3961
4041
  * The user is creating a new document.
@@ -3977,6 +4057,7 @@ const HistoryAction = ({ model, document }) => {
3977
4057
  };
3978
4058
  };
3979
4059
  HistoryAction.type = "history";
4060
+ HistoryAction.position = "header";
3980
4061
  const historyAdmin = {
3981
4062
  bootstrap(app) {
3982
4063
  const { addDocumentAction } = app.getPlugin("content-manager").apis;
@@ -4039,10 +4120,18 @@ const previewApi = contentManagerApi.injectEndpoints({
4039
4120
  })
4040
4121
  });
4041
4122
  const { useGetPreviewUrlQuery } = previewApi;
4123
+ const ConditionalTooltip = ({ isShown, label, children }) => {
4124
+ if (isShown) {
4125
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Tooltip, { label, children });
4126
+ }
4127
+ return children;
4128
+ };
4042
4129
  const PreviewSidePanel = ({ model, documentId, document }) => {
4043
4130
  const { formatMessage } = reactIntl.useIntl();
4044
- const { toggleNotification } = strapiAdmin.useNotification();
4045
- const { copy } = strapiAdmin.useClipboard();
4131
+ const { trackUsage } = strapiAdmin.useTracking();
4132
+ const { pathname } = reactRouterDom.useLocation();
4133
+ const [{ query }] = strapiAdmin.useQueryParams();
4134
+ const isModified = strapiAdmin.useForm("PreviewSidePanel", (state) => state.modified);
4046
4135
  const { data, error } = useGetPreviewUrlQuery({
4047
4136
  params: {
4048
4137
  contentType: model
@@ -4056,45 +4145,43 @@ const PreviewSidePanel = ({ model, documentId, document }) => {
4056
4145
  if (!data?.data?.url || error) {
4057
4146
  return null;
4058
4147
  }
4059
- const { url } = data.data;
4060
- const handleCopyLink = () => {
4061
- copy(url);
4062
- toggleNotification({
4063
- message: formatMessage({
4064
- id: "content-manager.preview.copy.success",
4065
- defaultMessage: "Copied preview link"
4066
- }),
4067
- type: "success"
4068
- });
4148
+ const trackNavigation = () => {
4149
+ const destinationPathname = pathname.replace(/\/$/, "") + "/preview";
4150
+ trackUsage("willNavigate", { from: pathname, to: destinationPathname });
4069
4151
  };
4070
4152
  return {
4071
4153
  title: formatMessage({ id: "content-manager.preview.panel.title", defaultMessage: "Preview" }),
4072
- content: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, width: "100%", children: [
4073
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", tag: reactRouterDom.Link, to: url, target: "_blank", flex: "auto", children: formatMessage({
4074
- id: "content-manager.preview.panel.button",
4075
- defaultMessage: "Open preview"
4076
- }) }),
4077
- /* @__PURE__ */ jsxRuntime.jsx(
4078
- designSystem.IconButton,
4079
- {
4080
- type: "button",
4081
- label: formatMessage({
4082
- id: "preview.copy.label",
4083
- defaultMessage: "Copy preview link"
4084
- }),
4085
- onClick: handleCopyLink,
4086
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Link, {})
4087
- }
4088
- )
4089
- ] })
4154
+ content: /* @__PURE__ */ jsxRuntime.jsx(
4155
+ ConditionalTooltip,
4156
+ {
4157
+ label: formatMessage({
4158
+ id: "content-manager.preview.panel.button-disabled-tooltip",
4159
+ defaultMessage: "Please save to open the preview"
4160
+ }),
4161
+ isShown: isModified,
4162
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { cursor: "not-allowed", width: "100%", children: /* @__PURE__ */ jsxRuntime.jsx(
4163
+ designSystem.Button,
4164
+ {
4165
+ variant: "tertiary",
4166
+ tag: reactRouterDom.Link,
4167
+ to: { pathname: "preview", search: qs.stringify(query, { encode: false }) },
4168
+ onClick: trackNavigation,
4169
+ width: "100%",
4170
+ disabled: isModified,
4171
+ pointerEvents: isModified ? "none" : void 0,
4172
+ tabIndex: isModified ? -1 : void 0,
4173
+ children: formatMessage({
4174
+ id: "content-manager.preview.panel.button",
4175
+ defaultMessage: "Open preview"
4176
+ })
4177
+ }
4178
+ ) })
4179
+ }
4180
+ )
4090
4181
  };
4091
4182
  };
4092
- const FEATURE_ID = "preview";
4093
4183
  const previewAdmin = {
4094
4184
  bootstrap(app) {
4095
- if (!window.strapi.future.isEnabled(FEATURE_ID)) {
4096
- return;
4097
- }
4098
4185
  const contentManagerPluginApis = app.getPlugin("content-manager").apis;
4099
4186
  contentManagerPluginApis.addEditViewSidePanel([PreviewSidePanel]);
4100
4187
  }
@@ -4118,7 +4205,7 @@ const index = {
4118
4205
  app.router.addRoute({
4119
4206
  path: "content-manager/*",
4120
4207
  lazy: async () => {
4121
- const { Layout } = await Promise.resolve().then(() => require("./layout-ByFyQRDH.js"));
4208
+ const { Layout } = await Promise.resolve().then(() => require("./layout-B_qdWGny.js"));
4122
4209
  return {
4123
4210
  Component: Layout
4124
4211
  };
@@ -4138,7 +4225,7 @@ const index = {
4138
4225
  async registerTrads({ locales }) {
4139
4226
  const importedTrads = await Promise.all(
4140
4227
  locales.map((locale) => {
4141
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/ar.json": () => Promise.resolve().then(() => require("./ar-BUUWXIYu.js")), "./translations/ca.json": () => Promise.resolve().then(() => require("./ca-Cmk45QO6.js")), "./translations/cs.json": () => Promise.resolve().then(() => require("./cs-CkJy6B2v.js")), "./translations/de.json": () => Promise.resolve().then(() => require("./de-CCEmbAah.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-Bdpa50w3.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-9K52xZIr.js")), "./translations/eu.json": () => Promise.resolve().then(() => require("./eu-VDH-3ovk.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-B2Kyv8Z9.js")), "./translations/gu.json": () => Promise.resolve().then(() => require("./gu-BRmF601H.js")), "./translations/hi.json": () => Promise.resolve().then(() => require("./hi-CCJBptSq.js")), "./translations/hu.json": () => Promise.resolve().then(() => require("./hu-sNV_yLYy.js")), "./translations/id.json": () => Promise.resolve().then(() => require("./id-B5Ser98A.js")), "./translations/it.json": () => Promise.resolve().then(() => require("./it-DkBIs7vD.js")), "./translations/ja.json": () => Promise.resolve().then(() => require("./ja-7sfIbjxE.js")), "./translations/ko.json": () => Promise.resolve().then(() => require("./ko-woFZPmLk.js")), "./translations/ml.json": () => Promise.resolve().then(() => require("./ml-C2W8N8k1.js")), "./translations/ms.json": () => Promise.resolve().then(() => require("./ms-BuFotyP_.js")), "./translations/nl.json": () => Promise.resolve().then(() => require("./nl-bbEOHChV.js")), "./translations/pl.json": () => Promise.resolve().then(() => require("./pl-uzwG-hk7.js")), "./translations/pt-BR.json": () => Promise.resolve().then(() => require("./pt-BR-BiOz37D9.js")), "./translations/pt.json": () => Promise.resolve().then(() => require("./pt-CeXQuq50.js")), "./translations/ru.json": () => Promise.resolve().then(() => require("./ru-BT3ybNny.js")), "./translations/sa.json": () => Promise.resolve().then(() => require("./sa-CcvkYInH.js")), "./translations/sk.json": () => Promise.resolve().then(() => require("./sk-CvY09Xjv.js")), "./translations/sv.json": () => Promise.resolve().then(() => require("./sv-MYDuzgvT.js")), "./translations/th.json": () => Promise.resolve().then(() => require("./th-D9_GfAjc.js")), "./translations/tr.json": () => Promise.resolve().then(() => require("./tr-D9UH-O_R.js")), "./translations/uk.json": () => Promise.resolve().then(() => require("./uk-C8EiqJY7.js")), "./translations/vi.json": () => Promise.resolve().then(() => require("./vi-CJlYDheJ.js")), "./translations/zh-Hans.json": () => Promise.resolve().then(() => require("./zh-Hans-9kOncHGw.js")), "./translations/zh.json": () => Promise.resolve().then(() => require("./zh-CQQfszqR.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
4228
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/ar.json": () => Promise.resolve().then(() => require("./ar-BUUWXIYu.js")), "./translations/ca.json": () => Promise.resolve().then(() => require("./ca-Cmk45QO6.js")), "./translations/cs.json": () => Promise.resolve().then(() => require("./cs-CkJy6B2v.js")), "./translations/de.json": () => Promise.resolve().then(() => require("./de-CCEmbAah.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-BK8Xyl5I.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-9K52xZIr.js")), "./translations/eu.json": () => Promise.resolve().then(() => require("./eu-VDH-3ovk.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-B2Kyv8Z9.js")), "./translations/gu.json": () => Promise.resolve().then(() => require("./gu-BRmF601H.js")), "./translations/hi.json": () => Promise.resolve().then(() => require("./hi-CCJBptSq.js")), "./translations/hu.json": () => Promise.resolve().then(() => require("./hu-sNV_yLYy.js")), "./translations/id.json": () => Promise.resolve().then(() => require("./id-B5Ser98A.js")), "./translations/it.json": () => Promise.resolve().then(() => require("./it-DkBIs7vD.js")), "./translations/ja.json": () => Promise.resolve().then(() => require("./ja-7sfIbjxE.js")), "./translations/ko.json": () => Promise.resolve().then(() => require("./ko-woFZPmLk.js")), "./translations/ml.json": () => Promise.resolve().then(() => require("./ml-C2W8N8k1.js")), "./translations/ms.json": () => Promise.resolve().then(() => require("./ms-BuFotyP_.js")), "./translations/nl.json": () => Promise.resolve().then(() => require("./nl-bbEOHChV.js")), "./translations/pl.json": () => Promise.resolve().then(() => require("./pl-uzwG-hk7.js")), "./translations/pt-BR.json": () => Promise.resolve().then(() => require("./pt-BR-BiOz37D9.js")), "./translations/pt.json": () => Promise.resolve().then(() => require("./pt-CeXQuq50.js")), "./translations/ru.json": () => Promise.resolve().then(() => require("./ru-BT3ybNny.js")), "./translations/sa.json": () => Promise.resolve().then(() => require("./sa-CcvkYInH.js")), "./translations/sk.json": () => Promise.resolve().then(() => require("./sk-CvY09Xjv.js")), "./translations/sv.json": () => Promise.resolve().then(() => require("./sv-MYDuzgvT.js")), "./translations/th.json": () => Promise.resolve().then(() => require("./th-D9_GfAjc.js")), "./translations/tr.json": () => Promise.resolve().then(() => require("./tr-D9UH-O_R.js")), "./translations/uk.json": () => Promise.resolve().then(() => require("./uk-C8EiqJY7.js")), "./translations/vi.json": () => Promise.resolve().then(() => require("./vi-CJlYDheJ.js")), "./translations/zh-Hans.json": () => Promise.resolve().then(() => require("./zh-Hans-9kOncHGw.js")), "./translations/zh.json": () => Promise.resolve().then(() => require("./zh-CQQfszqR.js")) }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
4142
4229
  return {
4143
4230
  data: prefixPluginTranslations(data, PLUGIN_ID),
4144
4231
  locale
@@ -4196,5 +4283,6 @@ exports.useGetAllContentTypeSettingsQuery = useGetAllContentTypeSettingsQuery;
4196
4283
  exports.useGetAllDocumentsQuery = useGetAllDocumentsQuery;
4197
4284
  exports.useGetContentTypeConfigurationQuery = useGetContentTypeConfigurationQuery;
4198
4285
  exports.useGetInitialDataQuery = useGetInitialDataQuery;
4286
+ exports.useGetPreviewUrlQuery = useGetPreviewUrlQuery;
4199
4287
  exports.useUpdateContentTypeConfigurationMutation = useUpdateContentTypeConfigurationMutation;
4200
- //# sourceMappingURL=index-BgaeYWIy.js.map
4288
+ //# sourceMappingURL=index-CnX_j5h-.js.map