@strapi/content-manager 0.0.0-next.b558642be856459a3e6c076f5d76fffbfc5fc5a1 → 0.0.0-next.b6435ada233136a0d0b14fba67961ff8f16cdac2

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 (171) 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-gsCd80MU.js → ComponentConfigurationPage-BlzvDpbX.js} +4 -5
  4. package/dist/_chunks/{ComponentConfigurationPage-gsCd80MU.js.map → ComponentConfigurationPage-BlzvDpbX.js.map} +1 -1
  5. package/dist/_chunks/{ComponentConfigurationPage-CIjXcRAB.mjs → ComponentConfigurationPage-DaPOlQaD.mjs} +3 -3
  6. package/dist/_chunks/{ComponentConfigurationPage-CIjXcRAB.mjs.map → ComponentConfigurationPage-DaPOlQaD.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-BglmD_BF.mjs → EditConfigurationPage-BZPXItXo.mjs} +3 -3
  11. package/dist/_chunks/{EditConfigurationPage-BglmD_BF.mjs.map → EditConfigurationPage-BZPXItXo.mjs.map} +1 -1
  12. package/dist/_chunks/{EditConfigurationPage-DHDQKBzw.js → EditConfigurationPage-uy-v43AR.js} +4 -5
  13. package/dist/_chunks/{EditConfigurationPage-DHDQKBzw.js.map → EditConfigurationPage-uy-v43AR.js.map} +1 -1
  14. package/dist/_chunks/{EditViewPage-C4iTxUPU.js → EditViewPage-DT6A4ayX.js} +38 -9
  15. package/dist/_chunks/EditViewPage-DT6A4ayX.js.map +1 -0
  16. package/dist/_chunks/{EditViewPage-CiwVPMaK.mjs → EditViewPage-oOLeTySr.mjs} +38 -8
  17. package/dist/_chunks/EditViewPage-oOLeTySr.mjs.map +1 -0
  18. package/dist/_chunks/{Field-DIjL1b5d.mjs → Field-D7dv2aUX.mjs} +169 -117
  19. package/dist/_chunks/Field-D7dv2aUX.mjs.map +1 -0
  20. package/dist/_chunks/{Field-DhXEK8y1.js → Field-kYFVIGiP.js} +171 -119
  21. package/dist/_chunks/Field-kYFVIGiP.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-CmNesrvR.mjs → Form-BxR6sc29.mjs} +3 -3
  25. package/dist/_chunks/{Form-CmNesrvR.mjs.map → Form-BxR6sc29.mjs.map} +1 -1
  26. package/dist/_chunks/{Form-CwmJ4sWe.js → Form-CCijSg3V.js} +5 -6
  27. package/dist/_chunks/{Form-CwmJ4sWe.js.map → Form-CCijSg3V.js.map} +1 -1
  28. package/dist/_chunks/{History-BLCCNgCt.js → History-BMndx49M.js} +22 -93
  29. package/dist/_chunks/History-BMndx49M.js.map +1 -0
  30. package/dist/_chunks/{History-D-99Wh30.mjs → History-D8F7aYQU.mjs} +22 -92
  31. package/dist/_chunks/History-D8F7aYQU.mjs.map +1 -0
  32. package/dist/_chunks/{ListConfigurationPage-DxWpeZrO.js → ListConfigurationPage-DouY1EWM.js} +6 -6
  33. package/dist/_chunks/ListConfigurationPage-DouY1EWM.js.map +1 -0
  34. package/dist/_chunks/{ListConfigurationPage-JPWZz7Kg.mjs → ListConfigurationPage-DqAdSPwC.mjs} +6 -5
  35. package/dist/_chunks/ListConfigurationPage-DqAdSPwC.mjs.map +1 -0
  36. package/dist/_chunks/{ListViewPage-CIQekSFz.js → ListViewPage-BPVmh9pq.js} +64 -53
  37. package/dist/_chunks/ListViewPage-BPVmh9pq.js.map +1 -0
  38. package/dist/_chunks/{ListViewPage-DSK3f0ST.mjs → ListViewPage-C73F0jPh.mjs} +63 -51
  39. package/dist/_chunks/ListViewPage-C73F0jPh.mjs.map +1 -0
  40. package/dist/_chunks/{NoContentTypePage-D99LU1YP.mjs → NoContentTypePage-B5w7iJOF.mjs} +2 -2
  41. package/dist/_chunks/{NoContentTypePage-D99LU1YP.mjs.map → NoContentTypePage-B5w7iJOF.mjs.map} +1 -1
  42. package/dist/_chunks/{NoContentTypePage-C5cxKvC2.js → NoContentTypePage-BwcL--4H.js} +2 -2
  43. package/dist/_chunks/{NoContentTypePage-C5cxKvC2.js.map → NoContentTypePage-BwcL--4H.js.map} +1 -1
  44. package/dist/_chunks/{NoPermissionsPage-Oy4tmUrW.js → NoPermissionsPage-BMFKVcwJ.js} +2 -2
  45. package/dist/_chunks/{NoPermissionsPage-Oy4tmUrW.js.map → NoPermissionsPage-BMFKVcwJ.js.map} +1 -1
  46. package/dist/_chunks/{NoPermissionsPage-DBrBw-0y.mjs → NoPermissionsPage-UnEgMGK4.mjs} +2 -2
  47. package/dist/_chunks/{NoPermissionsPage-DBrBw-0y.mjs.map → NoPermissionsPage-UnEgMGK4.mjs.map} +1 -1
  48. package/dist/_chunks/Preview-B7PR3Ok_.js +312 -0
  49. package/dist/_chunks/Preview-B7PR3Ok_.js.map +1 -0
  50. package/dist/_chunks/Preview-DECOhK0D.mjs +294 -0
  51. package/dist/_chunks/Preview-DECOhK0D.mjs.map +1 -0
  52. package/dist/_chunks/{Relations-BBmhcWFV.mjs → Relations-DinMQJ4B.mjs} +9 -8
  53. package/dist/_chunks/Relations-DinMQJ4B.mjs.map +1 -0
  54. package/dist/_chunks/{Relations-eG-9p_qS.js → Relations-lndx3aQk.js} +10 -10
  55. package/dist/_chunks/Relations-lndx3aQk.js.map +1 -0
  56. package/dist/_chunks/{en-Bm0D0IWz.js → en-BK8Xyl5I.js} +16 -4
  57. package/dist/_chunks/{en-Bm0D0IWz.js.map → en-BK8Xyl5I.js.map} +1 -1
  58. package/dist/_chunks/{en-DKV44jRb.mjs → en-Dtk_ot79.mjs} +16 -4
  59. package/dist/_chunks/{en-DKV44jRb.mjs.map → en-Dtk_ot79.mjs.map} +1 -1
  60. package/dist/_chunks/{es-EUonQTon.js → es-9K52xZIr.js} +2 -2
  61. package/dist/_chunks/{ja-CcFe8diO.js.map → es-9K52xZIr.js.map} +1 -1
  62. package/dist/_chunks/{es-CeXiYflN.mjs → es-D34tqjMw.mjs} +2 -2
  63. package/dist/_chunks/{es-CeXiYflN.mjs.map → es-D34tqjMw.mjs.map} +1 -1
  64. package/dist/_chunks/{fr-CD9VFbPM.mjs → fr--pg5jUbt.mjs} +13 -3
  65. package/dist/_chunks/{fr-CD9VFbPM.mjs.map → fr--pg5jUbt.mjs.map} +1 -1
  66. package/dist/_chunks/{fr-B7kGGg3E.js → fr-B2Kyv8Z9.js} +13 -3
  67. package/dist/_chunks/{fr-B7kGGg3E.js.map → fr-B2Kyv8Z9.js.map} +1 -1
  68. package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
  69. package/dist/_chunks/{index-BrUzbQ30.mjs → index-C2SagWVW.mjs} +327 -183
  70. package/dist/_chunks/index-C2SagWVW.mjs.map +1 -0
  71. package/dist/_chunks/{index-BIWDoFLK.js → index-Cnw4gqee.js} +324 -181
  72. package/dist/_chunks/index-Cnw4gqee.js.map +1 -0
  73. package/dist/_chunks/{ja-CcFe8diO.js → ja-7sfIbjxE.js} +2 -2
  74. package/dist/_chunks/{es-EUonQTon.js.map → ja-7sfIbjxE.js.map} +1 -1
  75. package/dist/_chunks/{ja-CtsUxOvk.mjs → ja-BHqhDq4V.mjs} +2 -2
  76. package/dist/_chunks/{ja-CtsUxOvk.mjs.map → ja-BHqhDq4V.mjs.map} +1 -1
  77. package/dist/_chunks/{layout-_5-cXs34.mjs → layout-DY_D9MGA.mjs} +4 -4
  78. package/dist/_chunks/{layout-_5-cXs34.mjs.map → layout-DY_D9MGA.mjs.map} +1 -1
  79. package/dist/_chunks/{layout-lMc9i1-Z.js → layout-ivwIVPnV.js} +5 -6
  80. package/dist/_chunks/{layout-lMc9i1-Z.js.map → layout-ivwIVPnV.js.map} +1 -1
  81. package/dist/_chunks/objects-BcXOv6_9.js.map +1 -1
  82. package/dist/_chunks/objects-D6yBsdmx.mjs.map +1 -1
  83. package/dist/_chunks/{relations-BRHithi8.js → relations-B7C7O_Pv.js} +6 -3
  84. package/dist/_chunks/relations-B7C7O_Pv.js.map +1 -0
  85. package/dist/_chunks/{relations-B_VLk-DD.mjs → relations-Boc5Y9kX.mjs} +6 -3
  86. package/dist/_chunks/relations-Boc5Y9kX.mjs.map +1 -0
  87. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -1
  88. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -1
  89. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
  90. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
  91. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
  92. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
  93. package/dist/admin/index.js +1 -1
  94. package/dist/admin/index.mjs +4 -4
  95. package/dist/admin/src/content-manager.d.ts +3 -2
  96. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
  97. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
  98. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +2 -2
  99. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
  100. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
  101. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
  102. package/dist/admin/src/preview/components/PreviewContent.d.ts +2 -0
  103. package/dist/admin/src/preview/components/PreviewHeader.d.ts +2 -0
  104. package/dist/admin/src/preview/components/PreviewSidePanel.d.ts +3 -0
  105. package/dist/admin/src/preview/index.d.ts +1 -1
  106. package/dist/admin/src/preview/pages/Preview.d.ts +11 -0
  107. package/dist/admin/src/preview/routes.d.ts +3 -0
  108. package/dist/admin/src/preview/services/preview.d.ts +3 -0
  109. package/dist/admin/src/router.d.ts +1 -1
  110. package/dist/admin/src/services/documents.d.ts +0 -3
  111. package/dist/server/index.js +384 -233
  112. package/dist/server/index.js.map +1 -1
  113. package/dist/server/index.mjs +385 -233
  114. package/dist/server/index.mjs.map +1 -1
  115. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  116. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  117. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  118. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  119. package/dist/server/src/index.d.ts +3 -2
  120. package/dist/server/src/index.d.ts.map +1 -1
  121. package/dist/server/src/preview/controllers/preview.d.ts +6 -2
  122. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -1
  123. package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
  124. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
  125. package/dist/server/src/preview/index.d.ts.map +1 -1
  126. package/dist/server/src/preview/services/index.d.ts +13 -1
  127. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  128. package/dist/server/src/preview/services/preview-config.d.ts +32 -0
  129. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
  130. package/dist/server/src/preview/services/preview.d.ts +7 -1
  131. package/dist/server/src/preview/services/preview.d.ts.map +1 -1
  132. package/dist/server/src/preview/utils.d.ts +13 -1
  133. package/dist/server/src/preview/utils.d.ts.map +1 -1
  134. package/dist/server/src/register.d.ts.map +1 -1
  135. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  136. package/dist/server/src/services/document-metadata.d.ts +4 -2
  137. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  138. package/dist/server/src/services/index.d.ts +3 -2
  139. package/dist/server/src/services/index.d.ts.map +1 -1
  140. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  141. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  142. package/dist/server/src/services/utils/populate.d.ts +2 -2
  143. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  144. package/dist/shared/contracts/index.d.ts +1 -0
  145. package/dist/shared/contracts/index.d.ts.map +1 -1
  146. package/dist/shared/contracts/preview.d.ts +27 -0
  147. package/dist/shared/contracts/preview.d.ts.map +1 -0
  148. package/dist/shared/index.js +4 -0
  149. package/dist/shared/index.js.map +1 -1
  150. package/dist/shared/index.mjs +4 -0
  151. package/dist/shared/index.mjs.map +1 -1
  152. package/package.json +13 -11
  153. package/dist/_chunks/EditViewPage-C4iTxUPU.js.map +0 -1
  154. package/dist/_chunks/EditViewPage-CiwVPMaK.mjs.map +0 -1
  155. package/dist/_chunks/Field-DIjL1b5d.mjs.map +0 -1
  156. package/dist/_chunks/Field-DhXEK8y1.js.map +0 -1
  157. package/dist/_chunks/History-BLCCNgCt.js.map +0 -1
  158. package/dist/_chunks/History-D-99Wh30.mjs.map +0 -1
  159. package/dist/_chunks/ListConfigurationPage-DxWpeZrO.js.map +0 -1
  160. package/dist/_chunks/ListConfigurationPage-JPWZz7Kg.mjs.map +0 -1
  161. package/dist/_chunks/ListViewPage-CIQekSFz.js.map +0 -1
  162. package/dist/_chunks/ListViewPage-DSK3f0ST.mjs.map +0 -1
  163. package/dist/_chunks/Relations-BBmhcWFV.mjs.map +0 -1
  164. package/dist/_chunks/Relations-eG-9p_qS.js.map +0 -1
  165. package/dist/_chunks/index-BIWDoFLK.js.map +0 -1
  166. package/dist/_chunks/index-BrUzbQ30.mjs.map +0 -1
  167. package/dist/_chunks/relations-BRHithi8.js.map +0 -1
  168. package/dist/_chunks/relations-B_VLk-DD.mjs.map +0 -1
  169. package/dist/admin/src/preview/constants.d.ts +0 -1
  170. package/dist/server/src/preview/constants.d.ts +0 -2
  171. package/dist/server/src/preview/constants.d.ts.map +0 -1
@@ -3,24 +3,31 @@ import { jsx, Fragment, jsxs } from "react/jsx-runtime";
3
3
  import { useStrapiApp, createContext, useQueryParams, useAuth, useRBAC, Page, adminApi, translatedErrors, useNotification, useAPIErrorHandler, getYupValidationErrors, useForm, useTracking, useGuidedTour, BackButton, DescriptionComponentRenderer, useTable, Table } from "@strapi/admin/strapi-admin";
4
4
  import * as React from "react";
5
5
  import { lazy } from "react";
6
- import { Button, Menu, VisuallyHidden, Flex, Typography, Dialog, Modal, Radio, Status, Box, SingleSelect, SingleSelectOption, IconButton, Loader, Tooltip, LinkButton } from "@strapi/design-system";
6
+ import { Menu, Button, VisuallyHidden, Flex, Dialog, Modal, Typography, Radio, Status, Box, SingleSelect, SingleSelectOption, IconButton, Loader, Tooltip, LinkButton } from "@strapi/design-system";
7
7
  import mapValues from "lodash/fp/mapValues";
8
8
  import { useIntl } from "react-intl";
9
9
  import { useParams, useNavigate, Navigate, useMatch, useLocation, Link, NavLink } from "react-router-dom";
10
+ import { styled } from "styled-components";
10
11
  import * as yup from "yup";
11
12
  import { ValidationError } from "yup";
13
+ import { stringify } from "qs";
12
14
  import pipe from "lodash/fp/pipe";
13
15
  import { intervalToDuration, isPast } from "date-fns";
14
- import { styled } from "styled-components";
15
- import { stringify } from "qs";
16
16
  import { createSlice, combineReducers } from "@reduxjs/toolkit";
17
- const __variableDynamicImportRuntimeHelper = (glob, path) => {
17
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
18
18
  const v = glob[path];
19
19
  if (v) {
20
20
  return typeof v === "function" ? v() : Promise.resolve(v);
21
21
  }
22
22
  return new Promise((_, reject) => {
23
- (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(reject.bind(null, new Error("Unknown variable dynamic import: " + path)));
23
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
24
+ reject.bind(
25
+ null,
26
+ new Error(
27
+ "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
28
+ )
29
+ )
30
+ );
24
31
  });
25
32
  };
26
33
  const PLUGIN_ID = "content-manager";
@@ -271,10 +278,10 @@ const documentApi = contentManagerApi.injectEndpoints({
271
278
  */
272
279
  getAllDocuments: builder.query({
273
280
  query: ({ model, params }) => ({
274
- url: `/content-manager/collection-types/${model}${params ? `?${params}` : ""}`,
281
+ url: `/content-manager/collection-types/${model}`,
275
282
  method: "GET",
276
283
  config: {
277
- params
284
+ params: stringify(params, { encode: true })
278
285
  }
279
286
  }),
280
287
  providesTags: (result, _error, arg) => {
@@ -453,8 +460,7 @@ const {
453
460
  useUnpublishManyDocumentsMutation
454
461
  } = documentApi;
455
462
  const buildValidParams = (query) => {
456
- if (!query)
457
- return query;
463
+ if (!query) return query;
458
464
  const { plugins: _, ...validQueryParams } = {
459
465
  ...query,
460
466
  ...Object.values(query?.plugins ?? {}).reduce(
@@ -462,9 +468,6 @@ const buildValidParams = (query) => {
462
468
  {}
463
469
  )
464
470
  };
465
- if ("_q" in validQueryParams) {
466
- validQueryParams._q = encodeURIComponent(validQueryParams._q);
467
- }
468
471
  return validQueryParams;
469
472
  };
470
473
  const isBaseQueryError = (error) => {
@@ -1663,10 +1666,10 @@ const useDocumentActions = () => {
1663
1666
  update
1664
1667
  };
1665
1668
  };
1666
- const ProtectedHistoryPage = lazy(
1667
- () => import("./History-D-99Wh30.mjs").then((mod) => ({ default: mod.ProtectedHistoryPage }))
1669
+ const ProtectedHistoryPage = React.lazy(
1670
+ () => import("./History-D8F7aYQU.mjs").then((mod) => ({ default: mod.ProtectedHistoryPage }))
1668
1671
  );
1669
- const routes$1 = [
1672
+ const routes$2 = [
1670
1673
  {
1671
1674
  path: ":collectionType/:slug/:id/history",
1672
1675
  Component: ProtectedHistoryPage
@@ -1676,32 +1679,45 @@ const routes$1 = [
1676
1679
  Component: ProtectedHistoryPage
1677
1680
  }
1678
1681
  ];
1682
+ const ProtectedPreviewPage = React.lazy(
1683
+ () => import("./Preview-DECOhK0D.mjs").then((mod) => ({ default: mod.ProtectedPreviewPage }))
1684
+ );
1685
+ const routes$1 = [
1686
+ {
1687
+ path: ":collectionType/:slug/:id/preview",
1688
+ Component: ProtectedPreviewPage
1689
+ },
1690
+ {
1691
+ path: ":collectionType/:slug/preview",
1692
+ Component: ProtectedPreviewPage
1693
+ }
1694
+ ];
1679
1695
  const ProtectedEditViewPage = lazy(
1680
- () => import("./EditViewPage-CiwVPMaK.mjs").then((mod) => ({ default: mod.ProtectedEditViewPage }))
1696
+ () => import("./EditViewPage-oOLeTySr.mjs").then((mod) => ({ default: mod.ProtectedEditViewPage }))
1681
1697
  );
1682
1698
  const ProtectedListViewPage = lazy(
1683
- () => import("./ListViewPage-DSK3f0ST.mjs").then((mod) => ({ default: mod.ProtectedListViewPage }))
1699
+ () => import("./ListViewPage-C73F0jPh.mjs").then((mod) => ({ default: mod.ProtectedListViewPage }))
1684
1700
  );
1685
1701
  const ProtectedListConfiguration = lazy(
1686
- () => import("./ListConfigurationPage-JPWZz7Kg.mjs").then((mod) => ({
1702
+ () => import("./ListConfigurationPage-DqAdSPwC.mjs").then((mod) => ({
1687
1703
  default: mod.ProtectedListConfiguration
1688
1704
  }))
1689
1705
  );
1690
1706
  const ProtectedEditConfigurationPage = lazy(
1691
- () => import("./EditConfigurationPage-BglmD_BF.mjs").then((mod) => ({
1707
+ () => import("./EditConfigurationPage-BZPXItXo.mjs").then((mod) => ({
1692
1708
  default: mod.ProtectedEditConfigurationPage
1693
1709
  }))
1694
1710
  );
1695
1711
  const ProtectedComponentConfigurationPage = lazy(
1696
- () => import("./ComponentConfigurationPage-CIjXcRAB.mjs").then((mod) => ({
1712
+ () => import("./ComponentConfigurationPage-DaPOlQaD.mjs").then((mod) => ({
1697
1713
  default: mod.ProtectedComponentConfigurationPage
1698
1714
  }))
1699
1715
  );
1700
1716
  const NoPermissions = lazy(
1701
- () => import("./NoPermissionsPage-DBrBw-0y.mjs").then((mod) => ({ default: mod.NoPermissions }))
1717
+ () => import("./NoPermissionsPage-UnEgMGK4.mjs").then((mod) => ({ default: mod.NoPermissions }))
1702
1718
  );
1703
1719
  const NoContentType = lazy(
1704
- () => import("./NoContentTypePage-D99LU1YP.mjs").then((mod) => ({ default: mod.NoContentType }))
1720
+ () => import("./NoContentTypePage-B5w7iJOF.mjs").then((mod) => ({ default: mod.NoContentType }))
1705
1721
  );
1706
1722
  const CollectionTypePages = () => {
1707
1723
  const { collectionType } = useParams();
@@ -1713,7 +1729,7 @@ const CollectionTypePages = () => {
1713
1729
  const CLONE_RELATIVE_PATH = ":collectionType/:slug/clone/:origin";
1714
1730
  const CLONE_PATH = `/content-manager/${CLONE_RELATIVE_PATH}`;
1715
1731
  const LIST_RELATIVE_PATH = ":collectionType/:slug";
1716
- const LIST_PATH = `/content-manager/${LIST_RELATIVE_PATH}`;
1732
+ const LIST_PATH = `/content-manager/collection-types/:slug`;
1717
1733
  const routes = [
1718
1734
  {
1719
1735
  path: LIST_RELATIVE_PATH,
@@ -1747,6 +1763,7 @@ const routes = [
1747
1763
  path: "no-content-types",
1748
1764
  Component: NoContentType
1749
1765
  },
1766
+ ...routes$2,
1750
1767
  ...routes$1
1751
1768
  ];
1752
1769
  const DocumentActions = ({ actions: actions2 }) => {
@@ -1845,6 +1862,11 @@ const DocumentActionButton = (action) => {
1845
1862
  ) : null
1846
1863
  ] });
1847
1864
  };
1865
+ const MenuItem = styled(Menu.Item)`
1866
+ &:hover {
1867
+ background: ${({ theme, isVariantDanger, isDisabled }) => isVariantDanger && !isDisabled ? theme.colors.danger100 : "neutral"};
1868
+ }
1869
+ `;
1848
1870
  const DocumentActionsMenu = ({
1849
1871
  actions: actions2,
1850
1872
  children,
@@ -1903,48 +1925,32 @@ const DocumentActionsMenu = ({
1903
1925
  /* @__PURE__ */ jsxs(Menu.Content, { maxHeight: void 0, popoverPlacement: "bottom-end", children: [
1904
1926
  actions2.map((action) => {
1905
1927
  return /* @__PURE__ */ jsx(
1906
- Menu.Item,
1928
+ MenuItem,
1907
1929
  {
1908
1930
  disabled: action.disabled,
1909
1931
  onSelect: handleClick(action),
1910
1932
  display: "block",
1911
- children: /* @__PURE__ */ jsxs(Flex, { justifyContent: "space-between", gap: 4, children: [
1912
- /* @__PURE__ */ jsxs(
1913
- Flex,
1914
- {
1915
- color: !action.disabled ? convertActionVariantToColor(action.variant) : "inherit",
1916
- gap: 2,
1917
- tag: "span",
1918
- children: [
1919
- /* @__PURE__ */ jsx(
1920
- Flex,
1921
- {
1922
- tag: "span",
1923
- color: !action.disabled ? convertActionVariantToIconColor(action.variant) : "inherit",
1924
- children: action.icon
1925
- }
1926
- ),
1927
- action.label
1928
- ]
1929
- }
1930
- ),
1931
- action.id.startsWith("HistoryAction") && /* @__PURE__ */ jsx(
1932
- Flex,
1933
- {
1934
- alignItems: "center",
1935
- background: "alternative100",
1936
- borderStyle: "solid",
1937
- borderColor: "alternative200",
1938
- borderWidth: "1px",
1939
- height: 5,
1940
- paddingLeft: 2,
1941
- paddingRight: 2,
1942
- hasRadius: true,
1943
- color: "alternative600",
1944
- children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", fontWeight: "bold", lineHeight: 1, children: formatMessage({ id: "global.new", defaultMessage: "New" }) })
1945
- }
1946
- )
1947
- ] })
1933
+ isVariantDanger: action.variant === "danger",
1934
+ isDisabled: action.disabled,
1935
+ children: /* @__PURE__ */ jsx(Flex, { justifyContent: "space-between", gap: 4, children: /* @__PURE__ */ jsxs(
1936
+ Flex,
1937
+ {
1938
+ color: !action.disabled ? convertActionVariantToColor(action.variant) : "inherit",
1939
+ gap: 2,
1940
+ tag: "span",
1941
+ children: [
1942
+ /* @__PURE__ */ jsx(
1943
+ Flex,
1944
+ {
1945
+ tag: "span",
1946
+ color: !action.disabled ? convertActionVariantToIconColor(action.variant) : "inherit",
1947
+ children: action.icon
1948
+ }
1949
+ ),
1950
+ action.label
1951
+ ]
1952
+ }
1953
+ ) })
1948
1954
  },
1949
1955
  action.id
1950
1956
  );
@@ -2081,6 +2087,7 @@ const PublishAction$1 = ({
2081
2087
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
2082
2088
  const isListView = useMatch(LIST_PATH) !== null;
2083
2089
  const isCloning = useMatch(CLONE_PATH) !== null;
2090
+ const { id } = useParams();
2084
2091
  const { formatMessage } = useIntl();
2085
2092
  const canPublish = useDocumentRBAC("PublishAction", ({ canPublish: canPublish2 }) => canPublish2);
2086
2093
  const { publish } = useDocumentActions();
@@ -2183,10 +2190,12 @@ const PublishAction$1 = ({
2183
2190
  transformData(formValues)
2184
2191
  );
2185
2192
  if ("data" in res && collectionType !== SINGLE_TYPES) {
2186
- navigate({
2187
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
2188
- search: rawQuery
2189
- });
2193
+ if (id === "create") {
2194
+ navigate({
2195
+ pathname: `../${collectionType}/${model}/${res.data.documentId}`,
2196
+ search: rawQuery
2197
+ });
2198
+ }
2190
2199
  } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2191
2200
  setErrors(formatValidationErrors(res.error));
2192
2201
  }
@@ -2239,6 +2248,7 @@ const PublishAction$1 = ({
2239
2248
  };
2240
2249
  };
2241
2250
  PublishAction$1.type = "publish";
2251
+ PublishAction$1.position = "panel";
2242
2252
  const UpdateAction = ({
2243
2253
  activeTab,
2244
2254
  documentId,
@@ -2261,96 +2271,134 @@ const UpdateAction = ({
2261
2271
  const validate = useForm("UpdateAction", (state) => state.validate);
2262
2272
  const setErrors = useForm("UpdateAction", (state) => state.setErrors);
2263
2273
  const resetForm = useForm("PublishAction", ({ resetForm: resetForm2 }) => resetForm2);
2264
- return {
2265
- /**
2266
- * Disabled when:
2267
- * - the form is submitting
2268
- * - the document is not modified & we're not cloning (you can save a clone entity straight away)
2269
- * - the active tab is the published tab
2270
- */
2271
- disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
2272
- label: formatMessage({
2273
- id: "content-manager.containers.Edit.save",
2274
- defaultMessage: "Save"
2275
- }),
2276
- onClick: async () => {
2277
- setSubmitting(true);
2278
- try {
2279
- const { errors } = await validate(true, {
2280
- status: "draft"
2274
+ const handleUpdate = React.useCallback(async () => {
2275
+ setSubmitting(true);
2276
+ try {
2277
+ if (!modified) {
2278
+ return;
2279
+ }
2280
+ const { errors } = await validate(true, {
2281
+ status: "draft"
2282
+ });
2283
+ if (errors) {
2284
+ toggleNotification({
2285
+ type: "danger",
2286
+ message: formatMessage({
2287
+ id: "content-manager.validation.error",
2288
+ defaultMessage: "There are validation errors in your document. Please fix them before saving."
2289
+ })
2281
2290
  });
2282
- if (errors) {
2283
- toggleNotification({
2284
- type: "danger",
2285
- message: formatMessage({
2286
- id: "content-manager.validation.error",
2287
- defaultMessage: "There are validation errors in your document. Please fix them before saving."
2288
- })
2289
- });
2290
- return;
2291
- }
2292
- if (isCloning) {
2293
- const res = await clone(
2294
- {
2295
- model,
2296
- documentId: cloneMatch.params.origin,
2297
- params
2298
- },
2299
- transformData(document)
2300
- );
2301
- if ("data" in res) {
2302
- navigate(
2303
- {
2304
- pathname: `../${res.data.documentId}`,
2305
- search: rawQuery
2306
- },
2307
- { relative: "path" }
2308
- );
2309
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2310
- setErrors(formatValidationErrors(res.error));
2311
- }
2312
- } else if (documentId || collectionType === SINGLE_TYPES) {
2313
- const res = await update(
2291
+ return;
2292
+ }
2293
+ if (isCloning) {
2294
+ const res = await clone(
2295
+ {
2296
+ model,
2297
+ documentId: cloneMatch.params.origin,
2298
+ params
2299
+ },
2300
+ transformData(document)
2301
+ );
2302
+ if ("data" in res) {
2303
+ navigate(
2314
2304
  {
2315
- collectionType,
2316
- model,
2317
- documentId,
2318
- params
2305
+ pathname: `../${res.data.documentId}`,
2306
+ search: rawQuery
2319
2307
  },
2320
- transformData(document)
2308
+ { relative: "path" }
2321
2309
  );
2322
- if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2323
- setErrors(formatValidationErrors(res.error));
2324
- } else {
2325
- resetForm();
2326
- }
2310
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2311
+ setErrors(formatValidationErrors(res.error));
2312
+ }
2313
+ } else if (documentId || collectionType === SINGLE_TYPES) {
2314
+ const res = await update(
2315
+ {
2316
+ collectionType,
2317
+ model,
2318
+ documentId,
2319
+ params
2320
+ },
2321
+ transformData(document)
2322
+ );
2323
+ if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2324
+ setErrors(formatValidationErrors(res.error));
2327
2325
  } else {
2328
- const res = await create(
2326
+ resetForm();
2327
+ }
2328
+ } else {
2329
+ const res = await create(
2330
+ {
2331
+ model,
2332
+ params
2333
+ },
2334
+ transformData(document)
2335
+ );
2336
+ if ("data" in res && collectionType !== SINGLE_TYPES) {
2337
+ navigate(
2329
2338
  {
2330
- model,
2331
- params
2339
+ pathname: `../${res.data.documentId}`,
2340
+ search: rawQuery
2332
2341
  },
2333
- transformData(document)
2342
+ { replace: true, relative: "path" }
2334
2343
  );
2335
- if ("data" in res && collectionType !== SINGLE_TYPES) {
2336
- navigate(
2337
- {
2338
- pathname: `../${res.data.documentId}`,
2339
- search: rawQuery
2340
- },
2341
- { replace: true, relative: "path" }
2342
- );
2343
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2344
- setErrors(formatValidationErrors(res.error));
2345
- }
2344
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2345
+ setErrors(formatValidationErrors(res.error));
2346
2346
  }
2347
- } finally {
2348
- setSubmitting(false);
2349
2347
  }
2348
+ } finally {
2349
+ setSubmitting(false);
2350
2350
  }
2351
+ }, [
2352
+ clone,
2353
+ cloneMatch?.params.origin,
2354
+ collectionType,
2355
+ create,
2356
+ document,
2357
+ documentId,
2358
+ formatMessage,
2359
+ formatValidationErrors,
2360
+ isCloning,
2361
+ model,
2362
+ modified,
2363
+ navigate,
2364
+ params,
2365
+ rawQuery,
2366
+ resetForm,
2367
+ setErrors,
2368
+ setSubmitting,
2369
+ toggleNotification,
2370
+ update,
2371
+ validate
2372
+ ]);
2373
+ React.useEffect(() => {
2374
+ const handleKeyDown = (e) => {
2375
+ if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
2376
+ e.preventDefault();
2377
+ handleUpdate();
2378
+ }
2379
+ };
2380
+ window.addEventListener("keydown", handleKeyDown);
2381
+ return () => {
2382
+ window.removeEventListener("keydown", handleKeyDown);
2383
+ };
2384
+ }, [handleUpdate]);
2385
+ return {
2386
+ /**
2387
+ * Disabled when:
2388
+ * - the form is submitting
2389
+ * - the document is not modified & we're not cloning (you can save a clone entity straight away)
2390
+ * - the active tab is the published tab
2391
+ */
2392
+ disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
2393
+ label: formatMessage({
2394
+ id: "global.save",
2395
+ defaultMessage: "Save"
2396
+ }),
2397
+ onClick: handleUpdate
2351
2398
  };
2352
2399
  };
2353
2400
  UpdateAction.type = "update";
2401
+ UpdateAction.position = "panel";
2354
2402
  const UNPUBLISH_DRAFT_OPTIONS = {
2355
2403
  KEEP: "keep",
2356
2404
  DISCARD: "discard"
@@ -2473,6 +2521,7 @@ const UnpublishAction$1 = ({
2473
2521
  };
2474
2522
  };
2475
2523
  UnpublishAction$1.type = "unpublish";
2524
+ UnpublishAction$1.position = "panel";
2476
2525
  const DiscardAction = ({
2477
2526
  activeTab,
2478
2527
  documentId,
@@ -2523,6 +2572,7 @@ const DiscardAction = ({
2523
2572
  };
2524
2573
  };
2525
2574
  DiscardAction.type = "discard";
2575
+ DiscardAction.position = "panel";
2526
2576
  const DEFAULT_ACTIONS = [PublishAction$1, UpdateAction, UnpublishAction$1, DiscardAction];
2527
2577
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
2528
2578
  const RelativeTime = React.forwardRef(
@@ -2535,7 +2585,7 @@ const RelativeTime = React.forwardRef(
2535
2585
  });
2536
2586
  const unit = intervals.find((intervalUnit) => {
2537
2587
  return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
2538
- });
2588
+ }) ?? "seconds";
2539
2589
  const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
2540
2590
  const customInterval = customIntervals.find(
2541
2591
  (custom) => interval[custom.unit] < custom.threshold
@@ -2569,19 +2619,29 @@ const getDisplayName = ({
2569
2619
  return email ?? "";
2570
2620
  };
2571
2621
  const capitalise = (str) => str.charAt(0).toUpperCase() + str.slice(1);
2572
- const DocumentStatus = ({ status = "draft", ...restProps }) => {
2622
+ const DocumentStatus = ({ status = "draft", size = "S", ...restProps }) => {
2573
2623
  const statusVariant = status === "draft" ? "secondary" : status === "published" ? "success" : "alternative";
2574
- return /* @__PURE__ */ jsx(Status, { ...restProps, showBullet: false, size: "S", variant: statusVariant, children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "omega", fontWeight: "bold", children: capitalise(status) }) });
2624
+ const { formatMessage } = useIntl();
2625
+ return /* @__PURE__ */ jsx(Status, { ...restProps, size, variant: statusVariant, children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "omega", fontWeight: "bold", children: formatMessage({
2626
+ id: `content-manager.containers.List.${status}`,
2627
+ defaultMessage: capitalise(status)
2628
+ }) }) });
2575
2629
  };
2576
2630
  const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
2577
2631
  const { formatMessage } = useIntl();
2578
2632
  const isCloning = useMatch(CLONE_PATH) !== null;
2633
+ const params = useParams();
2579
2634
  const title = isCreating ? formatMessage({
2580
2635
  id: "content-manager.containers.edit.title.new",
2581
2636
  defaultMessage: "Create an entry"
2582
2637
  }) : documentTitle;
2583
2638
  return /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "flex-start", paddingTop: 6, paddingBottom: 4, gap: 2, children: [
2584
- /* @__PURE__ */ jsx(BackButton, {}),
2639
+ /* @__PURE__ */ jsx(
2640
+ BackButton,
2641
+ {
2642
+ fallback: params.collectionType === SINGLE_TYPES ? void 0 : `../${COLLECTION_TYPES}/${params.slug}`
2643
+ }
2644
+ ),
2585
2645
  /* @__PURE__ */ jsxs(Flex, { width: "100%", justifyContent: "space-between", gap: "80px", alignItems: "flex-start", children: [
2586
2646
  /* @__PURE__ */ jsx(Typography, { variant: "alpha", tag: "h1", children: title }),
2587
2647
  /* @__PURE__ */ jsx(HeaderToolbar, {})
@@ -2632,7 +2692,7 @@ const HeaderToolbar = () => {
2632
2692
  meta: isCloning ? void 0 : meta,
2633
2693
  collectionType
2634
2694
  },
2635
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
2695
+ descriptions: plugins["content-manager"].apis.getDocumentActions("header"),
2636
2696
  children: (actions2) => {
2637
2697
  const headerActions = actions2.filter((action) => {
2638
2698
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -2840,6 +2900,7 @@ const ConfigureTheViewAction = ({ collectionType, model }) => {
2840
2900
  };
2841
2901
  };
2842
2902
  ConfigureTheViewAction.type = "configure-the-view";
2903
+ ConfigureTheViewAction.position = "header";
2843
2904
  const EditTheModelAction = ({ model }) => {
2844
2905
  const navigate = useNavigate();
2845
2906
  const { formatMessage } = useIntl();
@@ -2856,6 +2917,7 @@ const EditTheModelAction = ({ model }) => {
2856
2917
  };
2857
2918
  };
2858
2919
  EditTheModelAction.type = "edit-the-model";
2920
+ EditTheModelAction.position = "header";
2859
2921
  const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2860
2922
  const navigate = useNavigate();
2861
2923
  const { formatMessage } = useIntl();
@@ -2929,6 +2991,7 @@ const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2929
2991
  };
2930
2992
  };
2931
2993
  DeleteAction$1.type = "delete";
2994
+ DeleteAction$1.position = ["header", "table-row"];
2932
2995
  const DEFAULT_HEADER_ACTIONS = [EditTheModelAction, ConfigureTheViewAction, DeleteAction$1];
2933
2996
  const Panels = () => {
2934
2997
  const isCloning = useMatch(CLONE_PATH) !== null;
@@ -2991,7 +3054,7 @@ const ActionsPanelContent = () => {
2991
3054
  DescriptionComponentRenderer,
2992
3055
  {
2993
3056
  props,
2994
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
3057
+ descriptions: plugins["content-manager"].apis.getDocumentActions("panel"),
2995
3058
  children: (actions2) => /* @__PURE__ */ jsx(DocumentActions, { actions: actions2 })
2996
3059
  }
2997
3060
  ),
@@ -3268,18 +3331,10 @@ const SelectedEntriesTableContent = ({
3268
3331
  search: row.locale && `?plugins[i18n][locale]=${row.locale}`
3269
3332
  },
3270
3333
  state: { from: pathname },
3271
- label: formatMessage(
3272
- { id: "app.component.HelperPluginTable.edit", defaultMessage: "Edit {target}" },
3273
- {
3274
- target: formatMessage(
3275
- {
3276
- id: "content-manager.components.ListViewHelperPluginTable.row-line",
3277
- defaultMessage: "item line {number}"
3278
- },
3279
- { number: index2 + 1 }
3280
- )
3281
- }
3282
- ),
3334
+ label: formatMessage({
3335
+ id: "content-manager.bulk-publish.edit",
3336
+ defaultMessage: "Edit"
3337
+ }),
3283
3338
  target: "_blank",
3284
3339
  marginLeft: "auto",
3285
3340
  variant: "ghost",
@@ -3453,8 +3508,7 @@ const PublishAction = ({ documents, model }) => {
3453
3508
  const refetchList = () => {
3454
3509
  contentManagerApi.util.invalidateTags([{ type: "Document", id: `${model}_LIST` }]);
3455
3510
  };
3456
- if (!showPublishButton)
3457
- return null;
3511
+ if (!showPublishButton) return null;
3458
3512
  return {
3459
3513
  actionType: "publish",
3460
3514
  variant: "tertiary",
@@ -3522,8 +3576,7 @@ const DeleteAction = ({ documents, model }) => {
3522
3576
  selectRow([]);
3523
3577
  }
3524
3578
  };
3525
- if (!hasDeletePermission)
3526
- return null;
3579
+ if (!hasDeletePermission) return null;
3527
3580
  return {
3528
3581
  variant: "danger-light",
3529
3582
  label: formatMessage({ id: "global.delete", defaultMessage: "Delete" }),
@@ -3572,8 +3625,7 @@ const UnpublishAction = ({ documents, model }) => {
3572
3625
  }
3573
3626
  };
3574
3627
  const showUnpublishButton = hasDraftAndPublishEnabled && hasPublishPermission && documents.some((entry) => entry.status === "published" || entry.status === "modified");
3575
- if (!showUnpublishButton)
3576
- return null;
3628
+ if (!showUnpublishButton) return null;
3577
3629
  return {
3578
3630
  variant: "tertiary",
3579
3631
  label: formatMessage({ id: "app.utils.unpublish", defaultMessage: "Unpublish" }),
@@ -3678,7 +3730,7 @@ const TableActions = ({ document }) => {
3678
3730
  DescriptionComponentRenderer,
3679
3731
  {
3680
3732
  props,
3681
- descriptions: plugins["content-manager"].apis.getDocumentActions().filter((action) => action.name !== "PublishAction"),
3733
+ descriptions: plugins["content-manager"].apis.getDocumentActions("table-row").filter((action) => action.name !== "PublishAction"),
3682
3734
  children: (actions2) => {
3683
3735
  const tableRowActions = actions2.filter((action) => {
3684
3736
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -3737,6 +3789,7 @@ const EditAction = ({ documentId }) => {
3737
3789
  };
3738
3790
  };
3739
3791
  EditAction.type = "edit";
3792
+ EditAction.position = "table-row";
3740
3793
  const StyledPencil = styled(Pencil)`
3741
3794
  path {
3742
3795
  fill: currentColor;
@@ -3813,6 +3866,7 @@ const CloneAction = ({ model, documentId }) => {
3813
3866
  };
3814
3867
  };
3815
3868
  CloneAction.type = "clone";
3869
+ CloneAction.position = "table-row";
3816
3870
  const StyledDuplicate = styled(Duplicate)`
3817
3871
  path {
3818
3872
  fill: currentColor;
@@ -3899,7 +3953,14 @@ class ContentManagerPlugin {
3899
3953
  addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),
3900
3954
  addEditViewSidePanel: this.addEditViewSidePanel.bind(this),
3901
3955
  getBulkActions: () => this.bulkActions,
3902
- getDocumentActions: () => this.documentActions,
3956
+ getDocumentActions: (position) => {
3957
+ if (position) {
3958
+ return this.documentActions.filter(
3959
+ (action) => action.position == void 0 || [action.position].flat().includes(position)
3960
+ );
3961
+ }
3962
+ return this.documentActions;
3963
+ },
3903
3964
  getEditViewSidePanels: () => this.editViewSidePanels,
3904
3965
  getHeaderActions: () => this.headerActions
3905
3966
  }
@@ -3909,10 +3970,8 @@ class ContentManagerPlugin {
3909
3970
  const getPrintableType = (value) => {
3910
3971
  const nativeType = typeof value;
3911
3972
  if (nativeType === "object") {
3912
- if (value === null)
3913
- return "null";
3914
- if (Array.isArray(value))
3915
- return "array";
3973
+ if (value === null) return "null";
3974
+ if (Array.isArray(value)) return "array";
3916
3975
  if (value instanceof Object && value.constructor.name !== "Object") {
3917
3976
  return value.constructor.name;
3918
3977
  }
@@ -3923,17 +3982,27 @@ const HistoryAction = ({ model, document }) => {
3923
3982
  const { formatMessage } = useIntl();
3924
3983
  const [{ query }] = useQueryParams();
3925
3984
  const navigate = useNavigate();
3985
+ const { trackUsage } = useTracking();
3986
+ const { pathname } = useLocation();
3926
3987
  const pluginsQueryParams = stringify({ plugins: query.plugins }, { encode: false });
3927
3988
  if (!window.strapi.features.isEnabled("cms-content-history")) {
3928
3989
  return null;
3929
3990
  }
3991
+ const handleOnClick = () => {
3992
+ const destination = { pathname: "history", search: pluginsQueryParams };
3993
+ trackUsage("willNavigate", {
3994
+ from: pathname,
3995
+ to: `${pathname}/${destination.pathname}`
3996
+ });
3997
+ navigate(destination);
3998
+ };
3930
3999
  return {
3931
4000
  icon: /* @__PURE__ */ jsx(ClockCounterClockwise, {}),
3932
4001
  label: formatMessage({
3933
4002
  id: "content-manager.history.document-action",
3934
4003
  defaultMessage: "Content History"
3935
4004
  }),
3936
- onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
4005
+ onClick: handleOnClick,
3937
4006
  disabled: (
3938
4007
  /**
3939
4008
  * The user is creating a new document.
@@ -3955,6 +4024,7 @@ const HistoryAction = ({ model, document }) => {
3955
4024
  };
3956
4025
  };
3957
4026
  HistoryAction.type = "history";
4027
+ HistoryAction.position = "header";
3958
4028
  const historyAdmin = {
3959
4029
  bootstrap(app) {
3960
4030
  const { addDocumentAction } = app.getPlugin("content-manager").apis;
@@ -4001,13 +4071,86 @@ const { setInitialData } = actions;
4001
4071
  const reducer = combineReducers({
4002
4072
  app: reducer$1
4003
4073
  });
4004
- const FEATURE_ID = "preview";
4074
+ const previewApi = contentManagerApi.injectEndpoints({
4075
+ endpoints: (builder) => ({
4076
+ getPreviewUrl: builder.query({
4077
+ query({ query, params }) {
4078
+ return {
4079
+ url: `/content-manager/preview/url/${params.contentType}`,
4080
+ method: "GET",
4081
+ config: {
4082
+ params: query
4083
+ }
4084
+ };
4085
+ }
4086
+ })
4087
+ })
4088
+ });
4089
+ const { useGetPreviewUrlQuery } = previewApi;
4090
+ const ConditionalTooltip = ({ isShown, label, children }) => {
4091
+ if (isShown) {
4092
+ return /* @__PURE__ */ jsx(Tooltip, { label, children });
4093
+ }
4094
+ return children;
4095
+ };
4096
+ const PreviewSidePanel = ({ model, documentId, document }) => {
4097
+ const { formatMessage } = useIntl();
4098
+ const { trackUsage } = useTracking();
4099
+ const { pathname } = useLocation();
4100
+ const [{ query }] = useQueryParams();
4101
+ const isModified = useForm("PreviewSidePanel", (state) => state.modified);
4102
+ const { data, error } = useGetPreviewUrlQuery({
4103
+ params: {
4104
+ contentType: model
4105
+ },
4106
+ query: {
4107
+ documentId,
4108
+ locale: document?.locale,
4109
+ status: document?.status
4110
+ }
4111
+ });
4112
+ if (!data?.data?.url || error) {
4113
+ return null;
4114
+ }
4115
+ const trackNavigation = () => {
4116
+ const destinationPathname = pathname.replace(/\/$/, "") + "/preview";
4117
+ trackUsage("willNavigate", { from: pathname, to: destinationPathname });
4118
+ };
4119
+ return {
4120
+ title: formatMessage({ id: "content-manager.preview.panel.title", defaultMessage: "Preview" }),
4121
+ content: /* @__PURE__ */ jsx(
4122
+ ConditionalTooltip,
4123
+ {
4124
+ label: formatMessage({
4125
+ id: "content-manager.preview.panel.button-disabled-tooltip",
4126
+ defaultMessage: "Please save to open the preview"
4127
+ }),
4128
+ isShown: isModified,
4129
+ children: /* @__PURE__ */ jsx(Box, { cursor: "not-allowed", width: "100%", children: /* @__PURE__ */ jsx(
4130
+ Button,
4131
+ {
4132
+ variant: "tertiary",
4133
+ tag: Link,
4134
+ to: { pathname: "preview", search: stringify(query, { encode: false }) },
4135
+ onClick: trackNavigation,
4136
+ width: "100%",
4137
+ disabled: isModified,
4138
+ pointerEvents: isModified ? "none" : void 0,
4139
+ tabIndex: isModified ? -1 : void 0,
4140
+ children: formatMessage({
4141
+ id: "content-manager.preview.panel.button",
4142
+ defaultMessage: "Open preview"
4143
+ })
4144
+ }
4145
+ ) })
4146
+ }
4147
+ )
4148
+ };
4149
+ };
4005
4150
  const previewAdmin = {
4006
4151
  bootstrap(app) {
4007
- if (!window.strapi.future.isEnabled(FEATURE_ID)) {
4008
- return {};
4009
- }
4010
- console.log("Bootstrapping preview admin");
4152
+ const contentManagerPluginApis = app.getPlugin("content-manager").apis;
4153
+ contentManagerPluginApis.addEditViewSidePanel([PreviewSidePanel]);
4011
4154
  }
4012
4155
  };
4013
4156
  const index = {
@@ -4029,7 +4172,7 @@ const index = {
4029
4172
  app.router.addRoute({
4030
4173
  path: "content-manager/*",
4031
4174
  lazy: async () => {
4032
- const { Layout } = await import("./layout-_5-cXs34.mjs");
4175
+ const { Layout } = await import("./layout-DY_D9MGA.mjs");
4033
4176
  return {
4034
4177
  Component: Layout
4035
4178
  };
@@ -4049,7 +4192,7 @@ const index = {
4049
4192
  async registerTrads({ locales }) {
4050
4193
  const importedTrads = await Promise.all(
4051
4194
  locales.map((locale) => {
4052
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/ar.json": () => import("./ar-CCEVvqGG.mjs"), "./translations/ca.json": () => import("./ca-5U32ON2v.mjs"), "./translations/cs.json": () => import("./cs-CM2aBUar.mjs"), "./translations/de.json": () => import("./de-C72KDNOl.mjs"), "./translations/en.json": () => import("./en-DKV44jRb.mjs"), "./translations/es.json": () => import("./es-CeXiYflN.mjs"), "./translations/eu.json": () => import("./eu-CdALomew.mjs"), "./translations/fr.json": () => import("./fr-CD9VFbPM.mjs"), "./translations/gu.json": () => import("./gu-CNpaMDpH.mjs"), "./translations/hi.json": () => import("./hi-Dwvd04m3.mjs"), "./translations/hu.json": () => import("./hu-CeYvaaO0.mjs"), "./translations/id.json": () => import("./id-BtwA9WJT.mjs"), "./translations/it.json": () => import("./it-BrVPqaf1.mjs"), "./translations/ja.json": () => import("./ja-CtsUxOvk.mjs"), "./translations/ko.json": () => import("./ko-HVQRlfUI.mjs"), "./translations/ml.json": () => import("./ml-BihZwQit.mjs"), "./translations/ms.json": () => import("./ms-m_WjyWx7.mjs"), "./translations/nl.json": () => import("./nl-D4R9gHx5.mjs"), "./translations/pl.json": () => import("./pl-sbx9mSt_.mjs"), "./translations/pt-BR.json": () => import("./pt-BR-C71iDxnh.mjs"), "./translations/pt.json": () => import("./pt-BsaFvS8-.mjs"), "./translations/ru.json": () => import("./ru-BE6A4Exp.mjs"), "./translations/sa.json": () => import("./sa-Dag0k-Z8.mjs"), "./translations/sk.json": () => import("./sk-BFg-R8qJ.mjs"), "./translations/sv.json": () => import("./sv-CUnfWGsh.mjs"), "./translations/th.json": () => import("./th-BqbI8lIT.mjs"), "./translations/tr.json": () => import("./tr-CgeK3wJM.mjs"), "./translations/uk.json": () => import("./uk-CR-zDhAY.mjs"), "./translations/vi.json": () => import("./vi-DUXIk_fw.mjs"), "./translations/zh-Hans.json": () => import("./zh-Hans-BPQcRIyH.mjs"), "./translations/zh.json": () => import("./zh-BWZspA60.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
4195
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/ar.json": () => import("./ar-CCEVvqGG.mjs"), "./translations/ca.json": () => import("./ca-5U32ON2v.mjs"), "./translations/cs.json": () => import("./cs-CM2aBUar.mjs"), "./translations/de.json": () => import("./de-C72KDNOl.mjs"), "./translations/en.json": () => import("./en-Dtk_ot79.mjs"), "./translations/es.json": () => import("./es-D34tqjMw.mjs"), "./translations/eu.json": () => import("./eu-CdALomew.mjs"), "./translations/fr.json": () => import("./fr--pg5jUbt.mjs"), "./translations/gu.json": () => import("./gu-CNpaMDpH.mjs"), "./translations/hi.json": () => import("./hi-Dwvd04m3.mjs"), "./translations/hu.json": () => import("./hu-CeYvaaO0.mjs"), "./translations/id.json": () => import("./id-BtwA9WJT.mjs"), "./translations/it.json": () => import("./it-BrVPqaf1.mjs"), "./translations/ja.json": () => import("./ja-BHqhDq4V.mjs"), "./translations/ko.json": () => import("./ko-HVQRlfUI.mjs"), "./translations/ml.json": () => import("./ml-BihZwQit.mjs"), "./translations/ms.json": () => import("./ms-m_WjyWx7.mjs"), "./translations/nl.json": () => import("./nl-D4R9gHx5.mjs"), "./translations/pl.json": () => import("./pl-sbx9mSt_.mjs"), "./translations/pt-BR.json": () => import("./pt-BR-C71iDxnh.mjs"), "./translations/pt.json": () => import("./pt-BsaFvS8-.mjs"), "./translations/ru.json": () => import("./ru-BE6A4Exp.mjs"), "./translations/sa.json": () => import("./sa-Dag0k-Z8.mjs"), "./translations/sk.json": () => import("./sk-BFg-R8qJ.mjs"), "./translations/sv.json": () => import("./sv-CUnfWGsh.mjs"), "./translations/th.json": () => import("./th-BqbI8lIT.mjs"), "./translations/tr.json": () => import("./tr-CgeK3wJM.mjs"), "./translations/uk.json": () => import("./uk-CR-zDhAY.mjs"), "./translations/vi.json": () => import("./vi-DUXIk_fw.mjs"), "./translations/zh-Hans.json": () => import("./zh-Hans-BPQcRIyH.mjs"), "./translations/zh.json": () => import("./zh-BWZspA60.mjs") }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
4053
4196
  return {
4054
4197
  data: prefixPluginTranslations(data, PLUGIN_ID),
4055
4198
  locale
@@ -4076,9 +4219,10 @@ export {
4076
4219
  HOOKS as H,
4077
4220
  InjectionZone as I,
4078
4221
  useDocument as J,
4079
- index as K,
4080
- useContentManagerContext as L,
4081
- useDocumentActions as M,
4222
+ useGetPreviewUrlQuery as K,
4223
+ index as L,
4224
+ useContentManagerContext as M,
4225
+ useDocumentActions as N,
4082
4226
  Panels as P,
4083
4227
  RelativeTime as R,
4084
4228
  SINGLE_TYPES as S,
@@ -4110,4 +4254,4 @@ export {
4110
4254
  capitalise as y,
4111
4255
  useUpdateContentTypeConfigurationMutation as z
4112
4256
  };
4113
- //# sourceMappingURL=index-BrUzbQ30.mjs.map
4257
+ //# sourceMappingURL=index-C2SagWVW.mjs.map