@strapi/content-manager 0.0.0-experimental.fed75ee8e64c57dbed0b670b25ef026b69baab10 → 0.0.0-next.146a31b564bc8232686331f6b28f7ff966817963

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 (182) 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-DNRPa10q.js → ComponentConfigurationPage-BSEZcJVB.js} +5 -6
  4. package/dist/_chunks/{ComponentConfigurationPage-DNRPa10q.js.map → ComponentConfigurationPage-BSEZcJVB.js.map} +1 -1
  5. package/dist/_chunks/{ComponentConfigurationPage-BVM7LScS.mjs → ComponentConfigurationPage-BiASGi7x.mjs} +4 -4
  6. package/dist/_chunks/{ComponentConfigurationPage-BVM7LScS.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-BrG0mEfF.js → EditConfigurationPage-D2rtvneE.js} +5 -6
  11. package/dist/_chunks/{EditConfigurationPage-BrG0mEfF.js.map → EditConfigurationPage-D2rtvneE.js.map} +1 -1
  12. package/dist/_chunks/{EditConfigurationPage-BWq-9Zhk.mjs → EditConfigurationPage-vN4zupij.mjs} +4 -4
  13. package/dist/_chunks/{EditConfigurationPage-BWq-9Zhk.mjs.map → EditConfigurationPage-vN4zupij.mjs.map} +1 -1
  14. package/dist/_chunks/{EditViewPage-BbY0bNNE.js → EditViewPage-BwisF04Q.js} +38 -9
  15. package/dist/_chunks/EditViewPage-BwisF04Q.js.map +1 -0
  16. package/dist/_chunks/{EditViewPage-Dx0QnTxn.mjs → EditViewPage-_A31Cl4g.mjs} +38 -8
  17. package/dist/_chunks/EditViewPage-_A31Cl4g.mjs.map +1 -0
  18. package/dist/_chunks/{Field-DVZSGAon.mjs → Field-CvIunNOj.mjs} +170 -118
  19. package/dist/_chunks/Field-CvIunNOj.mjs.map +1 -0
  20. package/dist/_chunks/{Field-CglKum3X.js → Field-Dsu6-FrM.js} +172 -120
  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-BQwxPqu3.mjs → Form-DK0fG0Gj.mjs} +3 -3
  25. package/dist/_chunks/{Form-BQwxPqu3.mjs.map → Form-DK0fG0Gj.mjs.map} +1 -1
  26. package/dist/_chunks/{Form-B7nYNIUm.js → Form-DUwWcCmA.js} +5 -6
  27. package/dist/_chunks/{Form-B7nYNIUm.js.map → Form-DUwWcCmA.js.map} +1 -1
  28. package/dist/_chunks/{History-3JN4BIS1.js → History-CeCDhoJG.js} +23 -94
  29. package/dist/_chunks/History-CeCDhoJG.js.map +1 -0
  30. package/dist/_chunks/{History-Bmu6tx6s.mjs → History-DP8gmXpm.mjs} +23 -93
  31. package/dist/_chunks/History-DP8gmXpm.mjs.map +1 -0
  32. package/dist/_chunks/{ListConfigurationPage-DwijcJ17.mjs → ListConfigurationPage-BCkO5iuN.mjs} +7 -6
  33. package/dist/_chunks/ListConfigurationPage-BCkO5iuN.mjs.map +1 -0
  34. package/dist/_chunks/{ListConfigurationPage-BcC28SV0.js → ListConfigurationPage-C-bAd44a.js} +7 -7
  35. package/dist/_chunks/ListConfigurationPage-C-bAd44a.js.map +1 -0
  36. package/dist/_chunks/{ListViewPage-ZPNQ6jWC.js → ListViewPage-BKTZFhsM.js} +63 -41
  37. package/dist/_chunks/ListViewPage-BKTZFhsM.js.map +1 -0
  38. package/dist/_chunks/{ListViewPage-DzhuS3CW.mjs → ListViewPage-Cf_DgaFV.mjs} +62 -39
  39. package/dist/_chunks/ListViewPage-Cf_DgaFV.mjs.map +1 -0
  40. package/dist/_chunks/{NoContentTypePage-DzwJNXvn.js → NoContentTypePage-D3Cm3v3q.js} +2 -2
  41. package/dist/_chunks/{NoContentTypePage-DzwJNXvn.js.map → NoContentTypePage-D3Cm3v3q.js.map} +1 -1
  42. package/dist/_chunks/{NoContentTypePage-BKMgOyd3.mjs → NoContentTypePage-nHIyvJcB.mjs} +2 -2
  43. package/dist/_chunks/{NoContentTypePage-BKMgOyd3.mjs.map → NoContentTypePage-nHIyvJcB.mjs.map} +1 -1
  44. package/dist/_chunks/{NoPermissionsPage-DBbGJqL9.mjs → NoPermissionsPage-BALVSJ7x.mjs} +2 -2
  45. package/dist/_chunks/{NoPermissionsPage-DBbGJqL9.mjs.map → NoPermissionsPage-BALVSJ7x.mjs.map} +1 -1
  46. package/dist/_chunks/{NoPermissionsPage-GaweP-NG.js → NoPermissionsPage-CChGWBj5.js} +2 -2
  47. package/dist/_chunks/{NoPermissionsPage-GaweP-NG.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-B7VtRA3g.mjs → Relations-C8uC89cT.mjs} +47 -23
  53. package/dist/_chunks/Relations-C8uC89cT.mjs.map +1 -0
  54. package/dist/_chunks/{Relations-BHXq_cKF.js → Relations-CvkPCng_.js} +47 -24
  55. package/dist/_chunks/Relations-CvkPCng_.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-DcA8_tJw.js → index-CnX_j5h-.js} +362 -213
  70. package/dist/_chunks/index-CnX_j5h-.js.map +1 -0
  71. package/dist/_chunks/{index-TaRzG09p.mjs → index-Dh2aGTGJ.mjs} +364 -215
  72. package/dist/_chunks/index-Dh2aGTGJ.mjs.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-aX-RJhd5.mjs → layout-B5qsPihj.mjs} +4 -4
  78. package/dist/_chunks/{layout-aX-RJhd5.mjs.map → layout-B5qsPihj.mjs.map} +1 -1
  79. package/dist/_chunks/{layout-CrgXpOxT.js → layout-B_qdWGny.js} +5 -6
  80. package/dist/_chunks/{layout-CrgXpOxT.js.map → layout-B_qdWGny.js.map} +1 -1
  81. package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
  82. package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
  83. package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
  84. package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
  85. package/dist/_chunks/{relations-Z6RA1sBS.js → relations-ChcieiF5.js} +6 -7
  86. package/dist/_chunks/relations-ChcieiF5.js.map +1 -0
  87. package/dist/_chunks/{relations-D3Hlx6QX.mjs → relations-DMXpNY-e.mjs} +6 -7
  88. package/dist/_chunks/relations-DMXpNY-e.mjs.map +1 -0
  89. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -1
  90. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -1
  91. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
  92. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
  93. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
  94. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
  95. package/dist/admin/index.js +1 -1
  96. package/dist/admin/index.mjs +4 -4
  97. package/dist/admin/src/content-manager.d.ts +3 -2
  98. package/dist/admin/src/pages/EditView/EditViewPage.d.ts +9 -1
  99. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
  100. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +2 -2
  101. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
  102. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
  103. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
  104. package/dist/admin/src/preview/components/PreviewContent.d.ts +2 -0
  105. package/dist/admin/src/preview/components/PreviewHeader.d.ts +2 -0
  106. package/dist/admin/src/preview/components/PreviewSidePanel.d.ts +3 -0
  107. package/dist/admin/src/preview/index.d.ts +4 -0
  108. package/dist/admin/src/preview/pages/Preview.d.ts +11 -0
  109. package/dist/admin/src/preview/routes.d.ts +3 -0
  110. package/dist/admin/src/preview/services/preview.d.ts +3 -0
  111. package/dist/admin/src/router.d.ts +1 -1
  112. package/dist/admin/src/services/documents.d.ts +0 -3
  113. package/dist/server/index.js +482 -243
  114. package/dist/server/index.js.map +1 -1
  115. package/dist/server/index.mjs +483 -243
  116. package/dist/server/index.mjs.map +1 -1
  117. package/dist/server/src/bootstrap.d.ts.map +1 -1
  118. package/dist/server/src/controllers/index.d.ts.map +1 -1
  119. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  120. package/dist/server/src/controllers/utils/metadata.d.ts +16 -1
  121. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  122. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  123. package/dist/server/src/history/services/utils.d.ts +2 -3
  124. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  125. package/dist/server/src/index.d.ts +7 -6
  126. package/dist/server/src/index.d.ts.map +1 -1
  127. package/dist/server/src/preview/controllers/index.d.ts +2 -0
  128. package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
  129. package/dist/server/src/preview/controllers/preview.d.ts +13 -0
  130. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
  131. package/dist/server/src/preview/controllers/validation/preview.d.ts +6 -0
  132. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -0
  133. package/dist/server/src/preview/index.d.ts +4 -0
  134. package/dist/server/src/preview/index.d.ts.map +1 -0
  135. package/dist/server/src/preview/routes/index.d.ts +8 -0
  136. package/dist/server/src/preview/routes/index.d.ts.map +1 -0
  137. package/dist/server/src/preview/routes/preview.d.ts +4 -0
  138. package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
  139. package/dist/server/src/preview/services/index.d.ts +16 -0
  140. package/dist/server/src/preview/services/index.d.ts.map +1 -0
  141. package/dist/server/src/preview/services/preview-config.d.ts +32 -0
  142. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -0
  143. package/dist/server/src/preview/services/preview.d.ts +12 -0
  144. package/dist/server/src/preview/services/preview.d.ts.map +1 -0
  145. package/dist/server/src/preview/utils.d.ts +19 -0
  146. package/dist/server/src/preview/utils.d.ts.map +1 -0
  147. package/dist/server/src/register.d.ts.map +1 -1
  148. package/dist/server/src/routes/index.d.ts.map +1 -1
  149. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  150. package/dist/server/src/services/document-metadata.d.ts +12 -10
  151. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  152. package/dist/server/src/services/index.d.ts +7 -6
  153. package/dist/server/src/services/index.d.ts.map +1 -1
  154. package/dist/server/src/services/utils/populate.d.ts +2 -2
  155. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  156. package/dist/server/src/utils/index.d.ts +2 -0
  157. package/dist/server/src/utils/index.d.ts.map +1 -1
  158. package/dist/shared/contracts/index.d.ts +1 -0
  159. package/dist/shared/contracts/index.d.ts.map +1 -1
  160. package/dist/shared/contracts/preview.d.ts +27 -0
  161. package/dist/shared/contracts/preview.d.ts.map +1 -0
  162. package/dist/shared/index.js +4 -0
  163. package/dist/shared/index.js.map +1 -1
  164. package/dist/shared/index.mjs +4 -0
  165. package/dist/shared/index.mjs.map +1 -1
  166. package/package.json +13 -11
  167. package/dist/_chunks/EditViewPage-BbY0bNNE.js.map +0 -1
  168. package/dist/_chunks/EditViewPage-Dx0QnTxn.mjs.map +0 -1
  169. package/dist/_chunks/Field-CglKum3X.js.map +0 -1
  170. package/dist/_chunks/Field-DVZSGAon.mjs.map +0 -1
  171. package/dist/_chunks/History-3JN4BIS1.js.map +0 -1
  172. package/dist/_chunks/History-Bmu6tx6s.mjs.map +0 -1
  173. package/dist/_chunks/ListConfigurationPage-BcC28SV0.js.map +0 -1
  174. package/dist/_chunks/ListConfigurationPage-DwijcJ17.mjs.map +0 -1
  175. package/dist/_chunks/ListViewPage-DzhuS3CW.mjs.map +0 -1
  176. package/dist/_chunks/ListViewPage-ZPNQ6jWC.js.map +0 -1
  177. package/dist/_chunks/Relations-B7VtRA3g.mjs.map +0 -1
  178. package/dist/_chunks/Relations-BHXq_cKF.js.map +0 -1
  179. package/dist/_chunks/index-DcA8_tJw.js.map +0 -1
  180. package/dist/_chunks/index-TaRzG09p.mjs.map +0 -1
  181. package/dist/_chunks/relations-D3Hlx6QX.mjs.map +0 -1
  182. package/dist/_chunks/relations-Z6RA1sBS.js.map +0 -1
@@ -4,18 +4,18 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const strapiAdmin = require("@strapi/admin/strapi-admin");
5
5
  const React = require("react");
6
6
  const designSystem = require("@strapi/design-system");
7
+ const mapValues = require("lodash/fp/mapValues");
7
8
  const reactIntl = require("react-intl");
8
9
  const reactRouterDom = require("react-router-dom");
10
+ const styledComponents = require("styled-components");
9
11
  const yup = require("yup");
12
+ const qs = require("qs");
10
13
  const pipe = require("lodash/fp/pipe");
11
14
  const dateFns = require("date-fns");
12
- const styledComponents = require("styled-components");
13
- const qs = require("qs");
14
15
  const toolkit = require("@reduxjs/toolkit");
15
16
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
16
17
  function _interopNamespace(e) {
17
- if (e && e.__esModule)
18
- return e;
18
+ if (e && e.__esModule) return e;
19
19
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
20
20
  if (e) {
21
21
  for (const k in e) {
@@ -32,15 +32,23 @@ function _interopNamespace(e) {
32
32
  return Object.freeze(n);
33
33
  }
34
34
  const React__namespace = /* @__PURE__ */ _interopNamespace(React);
35
+ const mapValues__default = /* @__PURE__ */ _interopDefault(mapValues);
35
36
  const yup__namespace = /* @__PURE__ */ _interopNamespace(yup);
36
37
  const pipe__default = /* @__PURE__ */ _interopDefault(pipe);
37
- const __variableDynamicImportRuntimeHelper = (glob, path) => {
38
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
38
39
  const v = glob[path];
39
40
  if (v) {
40
41
  return typeof v === "function" ? v() : Promise.resolve(v);
41
42
  }
42
43
  return new Promise((_, reject) => {
43
- (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
+ );
44
52
  });
45
53
  };
46
54
  const PLUGIN_ID = "content-manager";
@@ -240,7 +248,19 @@ const documentApi = contentManagerApi.injectEndpoints({
240
248
  { type: "Document", id: `${model}_LIST` },
241
249
  "Relations",
242
250
  { type: "UidAvailability", id: model }
243
- ]
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
+ }
244
264
  }),
245
265
  deleteDocument: builder.mutation({
246
266
  query: ({ collectionType, model, documentId, params }) => ({
@@ -294,7 +314,7 @@ const documentApi = contentManagerApi.injectEndpoints({
294
314
  url: `/content-manager/collection-types/${model}`,
295
315
  method: "GET",
296
316
  config: {
297
- params
317
+ params: qs.stringify(params, { encode: true })
298
318
  }
299
319
  }),
300
320
  providesTags: (result, _error, arg) => {
@@ -473,8 +493,7 @@ const {
473
493
  useUnpublishManyDocumentsMutation
474
494
  } = documentApi;
475
495
  const buildValidParams = (query) => {
476
- if (!query)
477
- return query;
496
+ if (!query) return query;
478
497
  const { plugins: _, ...validQueryParams } = {
479
498
  ...query,
480
499
  ...Object.values(query?.plugins ?? {}).reduce(
@@ -482,9 +501,6 @@ const buildValidParams = (query) => {
482
501
  {}
483
502
  )
484
503
  };
485
- if ("_q" in validQueryParams) {
486
- validQueryParams._q = encodeURIComponent(validQueryParams._q);
487
- }
488
504
  return validQueryParams;
489
505
  };
490
506
  const isBaseQueryError = (error) => {
@@ -989,9 +1005,10 @@ const formatEditLayout = (data, {
989
1005
  currentPanelIndex += 2;
990
1006
  } else {
991
1007
  if (!panels[currentPanelIndex]) {
992
- panels.push([]);
1008
+ panels.push([row]);
1009
+ } else {
1010
+ panels[currentPanelIndex].push(row);
993
1011
  }
994
- panels[currentPanelIndex].push(row);
995
1012
  }
996
1013
  return panels;
997
1014
  }, []);
@@ -1249,9 +1266,6 @@ const useContentManagerContext = () => {
1249
1266
  };
1250
1267
  };
1251
1268
  const prefixPluginTranslations = (trad, pluginId) => {
1252
- if (!pluginId) {
1253
- throw new TypeError("pluginId can't be empty");
1254
- }
1255
1269
  return Object.keys(trad).reduce((acc, current) => {
1256
1270
  acc[`${pluginId}.${current}`] = trad[current];
1257
1271
  return acc;
@@ -1685,10 +1699,10 @@ const useDocumentActions = () => {
1685
1699
  update
1686
1700
  };
1687
1701
  };
1688
- const ProtectedHistoryPage = React.lazy(
1689
- () => Promise.resolve().then(() => require("./History-3JN4BIS1.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-BbY0bNNE.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-ZPNQ6jWC.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-BcC28SV0.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-BrG0mEfF.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-DNRPa10q.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-GaweP-NG.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-DzwJNXvn.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
  );
@@ -2077,6 +2094,18 @@ const DocumentActionModal = ({
2077
2094
  typeof Footer === "function" ? /* @__PURE__ */ jsxRuntime.jsx(Footer, { onClose: handleClose }) : Footer
2078
2095
  ] }) });
2079
2096
  };
2097
+ const transformData = (data) => {
2098
+ if (Array.isArray(data)) {
2099
+ return data.map(transformData);
2100
+ }
2101
+ if (typeof data === "object" && data !== null) {
2102
+ if ("apiData" in data) {
2103
+ return data.apiData;
2104
+ }
2105
+ return mapValues__default.default(transformData)(data);
2106
+ }
2107
+ return data;
2108
+ };
2080
2109
  const PublishAction$1 = ({
2081
2110
  activeTab,
2082
2111
  documentId,
@@ -2091,6 +2120,7 @@ const PublishAction$1 = ({
2091
2120
  const { _unstableFormatValidationErrors: formatValidationErrors } = strapiAdmin.useAPIErrorHandler();
2092
2121
  const isListView = reactRouterDom.useMatch(LIST_PATH) !== null;
2093
2122
  const isCloning = reactRouterDom.useMatch(CLONE_PATH) !== null;
2123
+ const { id } = reactRouterDom.useParams();
2094
2124
  const { formatMessage } = reactIntl.useIntl();
2095
2125
  const canPublish = useDocumentRBAC("PublishAction", ({ canPublish: canPublish2 }) => canPublish2);
2096
2126
  const { publish } = useDocumentActions();
@@ -2190,13 +2220,15 @@ const PublishAction$1 = ({
2190
2220
  documentId,
2191
2221
  params
2192
2222
  },
2193
- formDocumentToData(formValues)
2223
+ transformData(formValues)
2194
2224
  );
2195
2225
  if ("data" in res && collectionType !== SINGLE_TYPES) {
2196
- navigate({
2197
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
2198
- search: rawQuery
2199
- });
2226
+ if (id === "create") {
2227
+ navigate({
2228
+ pathname: `../${collectionType}/${model}/${res.data.documentId}`,
2229
+ search: rawQuery
2230
+ });
2231
+ }
2200
2232
  } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2201
2233
  setErrors(formatValidationErrors(res.error));
2202
2234
  }
@@ -2249,36 +2281,7 @@ const PublishAction$1 = ({
2249
2281
  };
2250
2282
  };
2251
2283
  PublishAction$1.type = "publish";
2252
- const formDocumentToData = (document) => {
2253
- return Object.keys(document).reduce((acc, key) => {
2254
- if (document[key] !== void 0) {
2255
- acc[key] = document[key];
2256
- }
2257
- if (typeof document[key] === "object" && document[key] !== null) {
2258
- if ("connect" in document[key] && document[key].connect !== null) {
2259
- acc[key] = {
2260
- ...acc[key],
2261
- connect: document[key].connect.map((item) => {
2262
- return {
2263
- documentId: item.documentId
2264
- };
2265
- })
2266
- };
2267
- }
2268
- if ("disconnect" in document[key] && document[key].disconnect !== null) {
2269
- acc[key] = {
2270
- ...acc[key],
2271
- disconnect: document[key].disconnect.map((item) => {
2272
- return {
2273
- documentId: item.documentId
2274
- };
2275
- })
2276
- };
2277
- }
2278
- }
2279
- return acc;
2280
- }, {});
2281
- };
2284
+ PublishAction$1.position = "panel";
2282
2285
  const UpdateAction = ({
2283
2286
  activeTab,
2284
2287
  documentId,
@@ -2301,96 +2304,134 @@ const UpdateAction = ({
2301
2304
  const validate = strapiAdmin.useForm("UpdateAction", (state) => state.validate);
2302
2305
  const setErrors = strapiAdmin.useForm("UpdateAction", (state) => state.setErrors);
2303
2306
  const resetForm = strapiAdmin.useForm("PublishAction", ({ resetForm: resetForm2 }) => resetForm2);
2304
- return {
2305
- /**
2306
- * Disabled when:
2307
- * - the form is submitting
2308
- * - the document is not modified & we're not cloning (you can save a clone entity straight away)
2309
- * - the active tab is the published tab
2310
- */
2311
- disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
2312
- label: formatMessage({
2313
- id: "content-manager.containers.Edit.save",
2314
- defaultMessage: "Save"
2315
- }),
2316
- onClick: async () => {
2317
- setSubmitting(true);
2318
- try {
2319
- const { errors } = await validate(true, {
2320
- 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
+ })
2321
2323
  });
2322
- if (errors) {
2323
- toggleNotification({
2324
- type: "danger",
2325
- message: formatMessage({
2326
- id: "content-manager.validation.error",
2327
- defaultMessage: "There are validation errors in your document. Please fix them before saving."
2328
- })
2329
- });
2330
- return;
2331
- }
2332
- if (isCloning) {
2333
- const res = await clone(
2334
- {
2335
- model,
2336
- documentId: cloneMatch.params.origin,
2337
- params
2338
- },
2339
- formDocumentToData(document)
2340
- );
2341
- if ("data" in res) {
2342
- navigate(
2343
- {
2344
- pathname: `../${res.data.documentId}`,
2345
- search: rawQuery
2346
- },
2347
- { relative: "path" }
2348
- );
2349
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2350
- setErrors(formatValidationErrors(res.error));
2351
- }
2352
- } else if (documentId || collectionType === SINGLE_TYPES) {
2353
- 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(
2354
2337
  {
2355
- collectionType,
2356
- model,
2357
- documentId,
2358
- params
2338
+ pathname: `../${res.data.documentId}`,
2339
+ search: rawQuery
2359
2340
  },
2360
- formDocumentToData(document)
2341
+ { relative: "path" }
2361
2342
  );
2362
- if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2363
- setErrors(formatValidationErrors(res.error));
2364
- } else {
2365
- resetForm();
2366
- }
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));
2367
2358
  } else {
2368
- 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(
2369
2371
  {
2370
- model,
2371
- params
2372
+ pathname: `../${res.data.documentId}`,
2373
+ search: rawQuery
2372
2374
  },
2373
- formDocumentToData(document)
2375
+ { replace: true, relative: "path" }
2374
2376
  );
2375
- if ("data" in res && collectionType !== SINGLE_TYPES) {
2376
- navigate(
2377
- {
2378
- pathname: `../${res.data.documentId}`,
2379
- search: rawQuery
2380
- },
2381
- { replace: true, relative: "path" }
2382
- );
2383
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2384
- setErrors(formatValidationErrors(res.error));
2385
- }
2377
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2378
+ setErrors(formatValidationErrors(res.error));
2386
2379
  }
2387
- } finally {
2388
- setSubmitting(false);
2389
2380
  }
2381
+ } finally {
2382
+ setSubmitting(false);
2390
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
2391
2431
  };
2392
2432
  };
2393
2433
  UpdateAction.type = "update";
2434
+ UpdateAction.position = "panel";
2394
2435
  const UNPUBLISH_DRAFT_OPTIONS = {
2395
2436
  KEEP: "keep",
2396
2437
  DISCARD: "discard"
@@ -2513,6 +2554,7 @@ const UnpublishAction$1 = ({
2513
2554
  };
2514
2555
  };
2515
2556
  UnpublishAction$1.type = "unpublish";
2557
+ UnpublishAction$1.position = "panel";
2516
2558
  const DiscardAction = ({
2517
2559
  activeTab,
2518
2560
  documentId,
@@ -2563,6 +2605,7 @@ const DiscardAction = ({
2563
2605
  };
2564
2606
  };
2565
2607
  DiscardAction.type = "discard";
2608
+ DiscardAction.position = "panel";
2566
2609
  const DEFAULT_ACTIONS = [PublishAction$1, UpdateAction, UnpublishAction$1, DiscardAction];
2567
2610
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
2568
2611
  const RelativeTime = React__namespace.forwardRef(
@@ -2575,7 +2618,7 @@ const RelativeTime = React__namespace.forwardRef(
2575
2618
  });
2576
2619
  const unit = intervals.find((intervalUnit) => {
2577
2620
  return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
2578
- });
2621
+ }) ?? "seconds";
2579
2622
  const relativeTime = dateFns.isPast(timestamp) ? -interval[unit] : interval[unit];
2580
2623
  const customInterval = customIntervals.find(
2581
2624
  (custom) => interval[custom.unit] < custom.threshold
@@ -2609,19 +2652,29 @@ const getDisplayName = ({
2609
2652
  return email ?? "";
2610
2653
  };
2611
2654
  const capitalise = (str) => str.charAt(0).toUpperCase() + str.slice(1);
2612
- const DocumentStatus = ({ status = "draft", ...restProps }) => {
2655
+ const DocumentStatus = ({ status = "draft", size = "S", ...restProps }) => {
2613
2656
  const statusVariant = status === "draft" ? "secondary" : status === "published" ? "success" : "alternative";
2614
- 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
+ }) }) });
2615
2662
  };
2616
2663
  const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
2617
2664
  const { formatMessage } = reactIntl.useIntl();
2618
2665
  const isCloning = reactRouterDom.useMatch(CLONE_PATH) !== null;
2666
+ const params = reactRouterDom.useParams();
2619
2667
  const title = isCreating ? formatMessage({
2620
2668
  id: "content-manager.containers.edit.title.new",
2621
2669
  defaultMessage: "Create an entry"
2622
2670
  }) : documentTitle;
2623
2671
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "flex-start", paddingTop: 6, paddingBottom: 4, gap: 2, children: [
2624
- /* @__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
+ ),
2625
2678
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", justifyContent: "space-between", gap: "80px", alignItems: "flex-start", children: [
2626
2679
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "alpha", tag: "h1", children: title }),
2627
2680
  /* @__PURE__ */ jsxRuntime.jsx(HeaderToolbar, {})
@@ -2672,7 +2725,7 @@ const HeaderToolbar = () => {
2672
2725
  meta: isCloning ? void 0 : meta,
2673
2726
  collectionType
2674
2727
  },
2675
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
2728
+ descriptions: plugins["content-manager"].apis.getDocumentActions("header"),
2676
2729
  children: (actions2) => {
2677
2730
  const headerActions = actions2.filter((action) => {
2678
2731
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -2880,6 +2933,7 @@ const ConfigureTheViewAction = ({ collectionType, model }) => {
2880
2933
  };
2881
2934
  };
2882
2935
  ConfigureTheViewAction.type = "configure-the-view";
2936
+ ConfigureTheViewAction.position = "header";
2883
2937
  const EditTheModelAction = ({ model }) => {
2884
2938
  const navigate = reactRouterDom.useNavigate();
2885
2939
  const { formatMessage } = reactIntl.useIntl();
@@ -2896,6 +2950,7 @@ const EditTheModelAction = ({ model }) => {
2896
2950
  };
2897
2951
  };
2898
2952
  EditTheModelAction.type = "edit-the-model";
2953
+ EditTheModelAction.position = "header";
2899
2954
  const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2900
2955
  const navigate = reactRouterDom.useNavigate();
2901
2956
  const { formatMessage } = reactIntl.useIntl();
@@ -2969,6 +3024,7 @@ const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2969
3024
  };
2970
3025
  };
2971
3026
  DeleteAction$1.type = "delete";
3027
+ DeleteAction$1.position = ["header", "table-row"];
2972
3028
  const DEFAULT_HEADER_ACTIONS = [EditTheModelAction, ConfigureTheViewAction, DeleteAction$1];
2973
3029
  const Panels = () => {
2974
3030
  const isCloning = reactRouterDom.useMatch(CLONE_PATH) !== null;
@@ -3031,7 +3087,7 @@ const ActionsPanelContent = () => {
3031
3087
  strapiAdmin.DescriptionComponentRenderer,
3032
3088
  {
3033
3089
  props,
3034
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
3090
+ descriptions: plugins["content-manager"].apis.getDocumentActions("panel"),
3035
3091
  children: (actions2) => /* @__PURE__ */ jsxRuntime.jsx(DocumentActions, { actions: actions2 })
3036
3092
  }
3037
3093
  ),
@@ -3058,7 +3114,7 @@ const Panel = React__namespace.forwardRef(({ children, title }, ref) => {
3058
3114
  justifyContent: "stretch",
3059
3115
  alignItems: "flex-start",
3060
3116
  children: [
3061
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "h2", variant: "sigma", textTransform: "uppercase", children: title }),
3117
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "h2", variant: "sigma", textTransform: "uppercase", textColor: "neutral600", children: title }),
3062
3118
  children
3063
3119
  ]
3064
3120
  }
@@ -3308,18 +3364,10 @@ const SelectedEntriesTableContent = ({
3308
3364
  search: row.locale && `?plugins[i18n][locale]=${row.locale}`
3309
3365
  },
3310
3366
  state: { from: pathname },
3311
- label: formatMessage(
3312
- { id: "app.component.HelperPluginTable.edit", defaultMessage: "Edit {target}" },
3313
- {
3314
- target: formatMessage(
3315
- {
3316
- id: "content-manager.components.ListViewHelperPluginTable.row-line",
3317
- defaultMessage: "item line {number}"
3318
- },
3319
- { number: index2 + 1 }
3320
- )
3321
- }
3322
- ),
3367
+ label: formatMessage({
3368
+ id: "content-manager.bulk-publish.edit",
3369
+ defaultMessage: "Edit"
3370
+ }),
3323
3371
  target: "_blank",
3324
3372
  marginLeft: "auto",
3325
3373
  variant: "ghost",
@@ -3493,8 +3541,7 @@ const PublishAction = ({ documents, model }) => {
3493
3541
  const refetchList = () => {
3494
3542
  contentManagerApi.util.invalidateTags([{ type: "Document", id: `${model}_LIST` }]);
3495
3543
  };
3496
- if (!showPublishButton)
3497
- return null;
3544
+ if (!showPublishButton) return null;
3498
3545
  return {
3499
3546
  actionType: "publish",
3500
3547
  variant: "tertiary",
@@ -3562,8 +3609,7 @@ const DeleteAction = ({ documents, model }) => {
3562
3609
  selectRow([]);
3563
3610
  }
3564
3611
  };
3565
- if (!hasDeletePermission)
3566
- return null;
3612
+ if (!hasDeletePermission) return null;
3567
3613
  return {
3568
3614
  variant: "danger-light",
3569
3615
  label: formatMessage({ id: "global.delete", defaultMessage: "Delete" }),
@@ -3612,8 +3658,7 @@ const UnpublishAction = ({ documents, model }) => {
3612
3658
  }
3613
3659
  };
3614
3660
  const showUnpublishButton = hasDraftAndPublishEnabled && hasPublishPermission && documents.some((entry) => entry.status === "published" || entry.status === "modified");
3615
- if (!showUnpublishButton)
3616
- return null;
3661
+ if (!showUnpublishButton) return null;
3617
3662
  return {
3618
3663
  variant: "tertiary",
3619
3664
  label: formatMessage({ id: "app.utils.unpublish", defaultMessage: "Unpublish" }),
@@ -3718,7 +3763,7 @@ const TableActions = ({ document }) => {
3718
3763
  strapiAdmin.DescriptionComponentRenderer,
3719
3764
  {
3720
3765
  props,
3721
- 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"),
3722
3767
  children: (actions2) => {
3723
3768
  const tableRowActions = actions2.filter((action) => {
3724
3769
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -3777,6 +3822,7 @@ const EditAction = ({ documentId }) => {
3777
3822
  };
3778
3823
  };
3779
3824
  EditAction.type = "edit";
3825
+ EditAction.position = "table-row";
3780
3826
  const StyledPencil = styledComponents.styled(Icons.Pencil)`
3781
3827
  path {
3782
3828
  fill: currentColor;
@@ -3853,6 +3899,7 @@ const CloneAction = ({ model, documentId }) => {
3853
3899
  };
3854
3900
  };
3855
3901
  CloneAction.type = "clone";
3902
+ CloneAction.position = "table-row";
3856
3903
  const StyledDuplicate = styledComponents.styled(Icons.Duplicate)`
3857
3904
  path {
3858
3905
  fill: currentColor;
@@ -3939,7 +3986,14 @@ class ContentManagerPlugin {
3939
3986
  addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),
3940
3987
  addEditViewSidePanel: this.addEditViewSidePanel.bind(this),
3941
3988
  getBulkActions: () => this.bulkActions,
3942
- 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
+ },
3943
3997
  getEditViewSidePanels: () => this.editViewSidePanels,
3944
3998
  getHeaderActions: () => this.headerActions
3945
3999
  }
@@ -3949,10 +4003,8 @@ class ContentManagerPlugin {
3949
4003
  const getPrintableType = (value) => {
3950
4004
  const nativeType = typeof value;
3951
4005
  if (nativeType === "object") {
3952
- if (value === null)
3953
- return "null";
3954
- if (Array.isArray(value))
3955
- return "array";
4006
+ if (value === null) return "null";
4007
+ if (Array.isArray(value)) return "array";
3956
4008
  if (value instanceof Object && value.constructor.name !== "Object") {
3957
4009
  return value.constructor.name;
3958
4010
  }
@@ -3963,17 +4015,27 @@ const HistoryAction = ({ model, document }) => {
3963
4015
  const { formatMessage } = reactIntl.useIntl();
3964
4016
  const [{ query }] = strapiAdmin.useQueryParams();
3965
4017
  const navigate = reactRouterDom.useNavigate();
4018
+ const { trackUsage } = strapiAdmin.useTracking();
4019
+ const { pathname } = reactRouterDom.useLocation();
3966
4020
  const pluginsQueryParams = qs.stringify({ plugins: query.plugins }, { encode: false });
3967
4021
  if (!window.strapi.features.isEnabled("cms-content-history")) {
3968
4022
  return null;
3969
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
+ };
3970
4032
  return {
3971
4033
  icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.ClockCounterClockwise, {}),
3972
4034
  label: formatMessage({
3973
4035
  id: "content-manager.history.document-action",
3974
4036
  defaultMessage: "Content History"
3975
4037
  }),
3976
- onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
4038
+ onClick: handleOnClick,
3977
4039
  disabled: (
3978
4040
  /**
3979
4041
  * The user is creating a new document.
@@ -3995,6 +4057,7 @@ const HistoryAction = ({ model, document }) => {
3995
4057
  };
3996
4058
  };
3997
4059
  HistoryAction.type = "history";
4060
+ HistoryAction.position = "header";
3998
4061
  const historyAdmin = {
3999
4062
  bootstrap(app) {
4000
4063
  const { addDocumentAction } = app.getPlugin("content-manager").apis;
@@ -4041,6 +4104,88 @@ const { setInitialData } = actions;
4041
4104
  const reducer = toolkit.combineReducers({
4042
4105
  app: reducer$1
4043
4106
  });
4107
+ const previewApi = contentManagerApi.injectEndpoints({
4108
+ endpoints: (builder) => ({
4109
+ getPreviewUrl: builder.query({
4110
+ query({ query, params }) {
4111
+ return {
4112
+ url: `/content-manager/preview/url/${params.contentType}`,
4113
+ method: "GET",
4114
+ config: {
4115
+ params: query
4116
+ }
4117
+ };
4118
+ }
4119
+ })
4120
+ })
4121
+ });
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
+ };
4129
+ const PreviewSidePanel = ({ model, documentId, document }) => {
4130
+ const { formatMessage } = reactIntl.useIntl();
4131
+ const { trackUsage } = strapiAdmin.useTracking();
4132
+ const { pathname } = reactRouterDom.useLocation();
4133
+ const [{ query }] = strapiAdmin.useQueryParams();
4134
+ const isModified = strapiAdmin.useForm("PreviewSidePanel", (state) => state.modified);
4135
+ const { data, error } = useGetPreviewUrlQuery({
4136
+ params: {
4137
+ contentType: model
4138
+ },
4139
+ query: {
4140
+ documentId,
4141
+ locale: document?.locale,
4142
+ status: document?.status
4143
+ }
4144
+ });
4145
+ if (!data?.data?.url || error) {
4146
+ return null;
4147
+ }
4148
+ const trackNavigation = () => {
4149
+ const destinationPathname = pathname.replace(/\/$/, "") + "/preview";
4150
+ trackUsage("willNavigate", { from: pathname, to: destinationPathname });
4151
+ };
4152
+ return {
4153
+ title: formatMessage({ id: "content-manager.preview.panel.title", defaultMessage: "Preview" }),
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
+ )
4181
+ };
4182
+ };
4183
+ const previewAdmin = {
4184
+ bootstrap(app) {
4185
+ const contentManagerPluginApis = app.getPlugin("content-manager").apis;
4186
+ contentManagerPluginApis.addEditViewSidePanel([PreviewSidePanel]);
4187
+ }
4188
+ };
4044
4189
  const index = {
4045
4190
  register(app) {
4046
4191
  const cm = new ContentManagerPlugin();
@@ -4060,7 +4205,7 @@ const index = {
4060
4205
  app.router.addRoute({
4061
4206
  path: "content-manager/*",
4062
4207
  lazy: async () => {
4063
- const { Layout } = await Promise.resolve().then(() => require("./layout-CrgXpOxT.js"));
4208
+ const { Layout } = await Promise.resolve().then(() => require("./layout-B_qdWGny.js"));
4064
4209
  return {
4065
4210
  Component: Layout
4066
4211
  };
@@ -4073,11 +4218,14 @@ const index = {
4073
4218
  if (typeof historyAdmin.bootstrap === "function") {
4074
4219
  historyAdmin.bootstrap(app);
4075
4220
  }
4221
+ if (typeof previewAdmin.bootstrap === "function") {
4222
+ previewAdmin.bootstrap(app);
4223
+ }
4076
4224
  },
4077
4225
  async registerTrads({ locales }) {
4078
4226
  const importedTrads = await Promise.all(
4079
4227
  locales.map((locale) => {
4080
- 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-Bm0D0IWz.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-EUonQTon.js")), "./translations/eu.json": () => Promise.resolve().then(() => require("./eu-VDH-3ovk.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-B7kGGg3E.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-CcFe8diO.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 }) => {
4081
4229
  return {
4082
4230
  data: prefixPluginTranslations(data, PLUGIN_ID),
4083
4231
  locale
@@ -4135,5 +4283,6 @@ exports.useGetAllContentTypeSettingsQuery = useGetAllContentTypeSettingsQuery;
4135
4283
  exports.useGetAllDocumentsQuery = useGetAllDocumentsQuery;
4136
4284
  exports.useGetContentTypeConfigurationQuery = useGetContentTypeConfigurationQuery;
4137
4285
  exports.useGetInitialDataQuery = useGetInitialDataQuery;
4286
+ exports.useGetPreviewUrlQuery = useGetPreviewUrlQuery;
4138
4287
  exports.useUpdateContentTypeConfigurationMutation = useUpdateContentTypeConfigurationMutation;
4139
- //# sourceMappingURL=index-DcA8_tJw.js.map
4288
+ //# sourceMappingURL=index-CnX_j5h-.js.map