@strapi/content-manager 5.4.2 → 5.5.1

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 (95) 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-BaJMOQyq.mjs → ComponentConfigurationPage-CzVt9QCC.mjs} +3 -3
  4. package/dist/_chunks/{ComponentConfigurationPage-BaJMOQyq.mjs.map → ComponentConfigurationPage-CzVt9QCC.mjs.map} +1 -1
  5. package/dist/_chunks/{ComponentConfigurationPage-N-CTtgQa.js → ComponentConfigurationPage-DYq8aqos.js} +4 -5
  6. package/dist/_chunks/{ComponentConfigurationPage-N-CTtgQa.js.map → ComponentConfigurationPage-DYq8aqos.js.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-BHkjAbxH.js → EditConfigurationPage-C9IATpr0.js} +4 -5
  11. package/dist/_chunks/{EditConfigurationPage-BHkjAbxH.js.map → EditConfigurationPage-C9IATpr0.js.map} +1 -1
  12. package/dist/_chunks/{EditConfigurationPage-CKK-5LfX.mjs → EditConfigurationPage-CLDwrUv5.mjs} +3 -3
  13. package/dist/_chunks/{EditConfigurationPage-CKK-5LfX.mjs.map → EditConfigurationPage-CLDwrUv5.mjs.map} +1 -1
  14. package/dist/_chunks/{EditViewPage-QPUftxUd.js → EditViewPage-Ch-uBvbv.js} +4 -5
  15. package/dist/_chunks/{EditViewPage-QPUftxUd.js.map → EditViewPage-Ch-uBvbv.js.map} +1 -1
  16. package/dist/_chunks/{EditViewPage-B11aeMcf.mjs → EditViewPage-DtKM7Jgw.mjs} +3 -3
  17. package/dist/_chunks/{EditViewPage-B11aeMcf.mjs.map → EditViewPage-DtKM7Jgw.mjs.map} +1 -1
  18. package/dist/_chunks/{Field-DUK83cfh.js → Field-B9ADaInZ.js} +27 -47
  19. package/dist/_chunks/Field-B9ADaInZ.js.map +1 -0
  20. package/dist/_chunks/{Field-Bj_RgtGo.mjs → Field-Bn1jgMeF.mjs} +25 -44
  21. package/dist/_chunks/Field-Bn1jgMeF.mjs.map +1 -0
  22. package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +1 -1
  23. package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +1 -1
  24. package/dist/_chunks/{Form-DLMSoXV7.mjs → Form-BB5i9Pxl.mjs} +3 -3
  25. package/dist/_chunks/{Form-DLMSoXV7.mjs.map → Form-BB5i9Pxl.mjs.map} +1 -1
  26. package/dist/_chunks/{Form-DHmBRlHd.js → Form-C3kjKrPw.js} +5 -6
  27. package/dist/_chunks/{Form-DHmBRlHd.js.map → Form-C3kjKrPw.js.map} +1 -1
  28. package/dist/_chunks/{History-Di3zm4HT.js → History-AwrK0-SA.js} +5 -6
  29. package/dist/_chunks/{History-Di3zm4HT.js.map → History-AwrK0-SA.js.map} +1 -1
  30. package/dist/_chunks/{History-CfCSNlG9.mjs → History-Cw2Q7OQL.mjs} +4 -4
  31. package/dist/_chunks/{History-CfCSNlG9.mjs.map → History-Cw2Q7OQL.mjs.map} +1 -1
  32. package/dist/_chunks/{ListConfigurationPage-0mtv_iqk.mjs → ListConfigurationPage-B47JIu1e.mjs} +3 -3
  33. package/dist/_chunks/{ListConfigurationPage-0mtv_iqk.mjs.map → ListConfigurationPage-B47JIu1e.mjs.map} +1 -1
  34. package/dist/_chunks/{ListConfigurationPage-Cq361KIt.js → ListConfigurationPage-CNTJ0DBm.js} +4 -5
  35. package/dist/_chunks/{ListConfigurationPage-Cq361KIt.js.map → ListConfigurationPage-CNTJ0DBm.js.map} +1 -1
  36. package/dist/_chunks/{ListViewPage-DFDcG8gM.js → ListViewPage-Be_UEBar.js} +4 -5
  37. package/dist/_chunks/{ListViewPage-DFDcG8gM.js.map → ListViewPage-Be_UEBar.js.map} +1 -1
  38. package/dist/_chunks/{ListViewPage-BxLVROX8.mjs → ListViewPage-DuvjX6ra.mjs} +3 -3
  39. package/dist/_chunks/{ListViewPage-BxLVROX8.mjs.map → ListViewPage-DuvjX6ra.mjs.map} +1 -1
  40. package/dist/_chunks/{NoContentTypePage-BSyvnDZZ.js → NoContentTypePage-B1J0KUCO.js} +2 -2
  41. package/dist/_chunks/{NoContentTypePage-BSyvnDZZ.js.map → NoContentTypePage-B1J0KUCO.js.map} +1 -1
  42. package/dist/_chunks/{NoContentTypePage-BRfDd67_.mjs → NoContentTypePage-C6M-Q0Tv.mjs} +2 -2
  43. package/dist/_chunks/{NoContentTypePage-BRfDd67_.mjs.map → NoContentTypePage-C6M-Q0Tv.mjs.map} +1 -1
  44. package/dist/_chunks/{NoPermissionsPage-CV9V8KWa.mjs → NoPermissionsPage-CAi3zCAD.mjs} +2 -2
  45. package/dist/_chunks/{NoPermissionsPage-CV9V8KWa.mjs.map → NoPermissionsPage-CAi3zCAD.mjs.map} +1 -1
  46. package/dist/_chunks/{NoPermissionsPage-DyLphsn_.js → NoPermissionsPage-CN34TlEE.js} +2 -2
  47. package/dist/_chunks/{NoPermissionsPage-DyLphsn_.js.map → NoPermissionsPage-CN34TlEE.js.map} +1 -1
  48. package/dist/_chunks/{Preview-C_B1nx3g.mjs → Preview-BrBRcL10.mjs} +31 -10
  49. package/dist/_chunks/Preview-BrBRcL10.mjs.map +1 -0
  50. package/dist/_chunks/{Preview-D_3aO6Ly.js → Preview-DOqm5jcJ.js} +31 -11
  51. package/dist/_chunks/Preview-DOqm5jcJ.js.map +1 -0
  52. package/dist/_chunks/{Relations-C6pwmDXh.mjs → Relations-_K-HYOiM.mjs} +6 -8
  53. package/dist/_chunks/{Relations-C6pwmDXh.mjs.map → Relations-_K-HYOiM.mjs.map} +1 -1
  54. package/dist/_chunks/{Relations-Cne2AlrL.js → Relations-xtKZHtTN.js} +7 -10
  55. package/dist/_chunks/{Relations-Cne2AlrL.js.map → Relations-xtKZHtTN.js.map} +1 -1
  56. package/dist/_chunks/{en-Ic0kXjxB.js → en-BK8Xyl5I.js} +2 -1
  57. package/dist/_chunks/{en-Ic0kXjxB.js.map → en-BK8Xyl5I.js.map} +1 -1
  58. package/dist/_chunks/{en-DhFUjrNW.mjs → en-Dtk_ot79.mjs} +2 -1
  59. package/dist/_chunks/{en-DhFUjrNW.mjs.map → en-Dtk_ot79.mjs.map} +1 -1
  60. package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
  61. package/dist/_chunks/{index-T-aWjbj2.js → index-BlX-OdHL.js} +193 -119
  62. package/dist/_chunks/index-BlX-OdHL.js.map +1 -0
  63. package/dist/_chunks/{index-BpxR3En4.mjs → index-tETMKK2G.mjs} +192 -117
  64. package/dist/_chunks/index-tETMKK2G.mjs.map +1 -0
  65. package/dist/_chunks/{layout-DhMZ_lDx.mjs → layout-BaQBaz56.mjs} +4 -4
  66. package/dist/_chunks/{layout-DhMZ_lDx.mjs.map → layout-BaQBaz56.mjs.map} +1 -1
  67. package/dist/_chunks/{layout-BEuNwv-F.js → layout-D8Sz3KxF.js} +5 -6
  68. package/dist/_chunks/{layout-BEuNwv-F.js.map → layout-D8Sz3KxF.js.map} +1 -1
  69. package/dist/_chunks/objects-BcXOv6_9.js.map +1 -1
  70. package/dist/_chunks/objects-D6yBsdmx.mjs.map +1 -1
  71. package/dist/_chunks/{relations-kLcuobLk.js → relations-CAbbX8Sa.js} +2 -2
  72. package/dist/_chunks/{relations-kLcuobLk.js.map → relations-CAbbX8Sa.js.map} +1 -1
  73. package/dist/_chunks/{relations-BdnxoX6f.mjs → relations-CsfmCqOU.mjs} +2 -2
  74. package/dist/_chunks/{relations-BdnxoX6f.mjs.map → relations-CsfmCqOU.mjs.map} +1 -1
  75. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -1
  76. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -1
  77. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
  78. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
  79. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
  80. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
  81. package/dist/admin/index.js +1 -1
  82. package/dist/admin/index.mjs +1 -1
  83. package/dist/admin/src/content-manager.d.ts +3 -2
  84. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
  85. package/dist/server/index.js +18 -36
  86. package/dist/server/index.js.map +1 -1
  87. package/dist/server/index.mjs +17 -34
  88. package/dist/server/index.mjs.map +1 -1
  89. package/package.json +9 -10
  90. package/dist/_chunks/Field-Bj_RgtGo.mjs.map +0 -1
  91. package/dist/_chunks/Field-DUK83cfh.js.map +0 -1
  92. package/dist/_chunks/Preview-C_B1nx3g.mjs.map +0 -1
  93. package/dist/_chunks/Preview-D_3aO6Ly.js.map +0 -1
  94. package/dist/_chunks/index-BpxR3En4.mjs.map +0 -1
  95. package/dist/_chunks/index-T-aWjbj2.js.map +0 -1
@@ -14,13 +14,20 @@ import { stringify } from "qs";
14
14
  import pipe from "lodash/fp/pipe";
15
15
  import { intervalToDuration, isPast } from "date-fns";
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";
@@ -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(
@@ -1661,7 +1667,7 @@ const useDocumentActions = () => {
1661
1667
  };
1662
1668
  };
1663
1669
  const ProtectedHistoryPage = React.lazy(
1664
- () => import("./History-CfCSNlG9.mjs").then((mod) => ({ default: mod.ProtectedHistoryPage }))
1670
+ () => import("./History-Cw2Q7OQL.mjs").then((mod) => ({ default: mod.ProtectedHistoryPage }))
1665
1671
  );
1666
1672
  const routes$2 = [
1667
1673
  {
@@ -1674,7 +1680,7 @@ const routes$2 = [
1674
1680
  }
1675
1681
  ];
1676
1682
  const ProtectedPreviewPage = React.lazy(
1677
- () => import("./Preview-C_B1nx3g.mjs").then((mod) => ({ default: mod.ProtectedPreviewPage }))
1683
+ () => import("./Preview-BrBRcL10.mjs").then((mod) => ({ default: mod.ProtectedPreviewPage }))
1678
1684
  );
1679
1685
  const routes$1 = [
1680
1686
  {
@@ -1687,31 +1693,31 @@ const routes$1 = [
1687
1693
  }
1688
1694
  ];
1689
1695
  const ProtectedEditViewPage = lazy(
1690
- () => import("./EditViewPage-B11aeMcf.mjs").then((mod) => ({ default: mod.ProtectedEditViewPage }))
1696
+ () => import("./EditViewPage-DtKM7Jgw.mjs").then((mod) => ({ default: mod.ProtectedEditViewPage }))
1691
1697
  );
1692
1698
  const ProtectedListViewPage = lazy(
1693
- () => import("./ListViewPage-BxLVROX8.mjs").then((mod) => ({ default: mod.ProtectedListViewPage }))
1699
+ () => import("./ListViewPage-DuvjX6ra.mjs").then((mod) => ({ default: mod.ProtectedListViewPage }))
1694
1700
  );
1695
1701
  const ProtectedListConfiguration = lazy(
1696
- () => import("./ListConfigurationPage-0mtv_iqk.mjs").then((mod) => ({
1702
+ () => import("./ListConfigurationPage-B47JIu1e.mjs").then((mod) => ({
1697
1703
  default: mod.ProtectedListConfiguration
1698
1704
  }))
1699
1705
  );
1700
1706
  const ProtectedEditConfigurationPage = lazy(
1701
- () => import("./EditConfigurationPage-CKK-5LfX.mjs").then((mod) => ({
1707
+ () => import("./EditConfigurationPage-CLDwrUv5.mjs").then((mod) => ({
1702
1708
  default: mod.ProtectedEditConfigurationPage
1703
1709
  }))
1704
1710
  );
1705
1711
  const ProtectedComponentConfigurationPage = lazy(
1706
- () => import("./ComponentConfigurationPage-BaJMOQyq.mjs").then((mod) => ({
1712
+ () => import("./ComponentConfigurationPage-CzVt9QCC.mjs").then((mod) => ({
1707
1713
  default: mod.ProtectedComponentConfigurationPage
1708
1714
  }))
1709
1715
  );
1710
1716
  const NoPermissions = lazy(
1711
- () => import("./NoPermissionsPage-CV9V8KWa.mjs").then((mod) => ({ default: mod.NoPermissions }))
1717
+ () => import("./NoPermissionsPage-CAi3zCAD.mjs").then((mod) => ({ default: mod.NoPermissions }))
1712
1718
  );
1713
1719
  const NoContentType = lazy(
1714
- () => import("./NoContentTypePage-BRfDd67_.mjs").then((mod) => ({ default: mod.NoContentType }))
1720
+ () => import("./NoContentTypePage-C6M-Q0Tv.mjs").then((mod) => ({ default: mod.NoContentType }))
1715
1721
  );
1716
1722
  const CollectionTypePages = () => {
1717
1723
  const { collectionType } = useParams();
@@ -2242,6 +2248,7 @@ const PublishAction$1 = ({
2242
2248
  };
2243
2249
  };
2244
2250
  PublishAction$1.type = "publish";
2251
+ PublishAction$1.position = "panel";
2245
2252
  const UpdateAction = ({
2246
2253
  activeTab,
2247
2254
  documentId,
@@ -2264,6 +2271,117 @@ const UpdateAction = ({
2264
2271
  const validate = useForm("UpdateAction", (state) => state.validate);
2265
2272
  const setErrors = useForm("UpdateAction", (state) => state.setErrors);
2266
2273
  const resetForm = useForm("PublishAction", ({ resetForm: resetForm2 }) => resetForm2);
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
+ })
2290
+ });
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(
2304
+ {
2305
+ pathname: `../${res.data.documentId}`,
2306
+ search: rawQuery
2307
+ },
2308
+ { relative: "path" }
2309
+ );
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));
2325
+ } else {
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(
2338
+ {
2339
+ pathname: `../${res.data.documentId}`,
2340
+ search: rawQuery
2341
+ },
2342
+ { replace: true, relative: "path" }
2343
+ );
2344
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2345
+ setErrors(formatValidationErrors(res.error));
2346
+ }
2347
+ }
2348
+ } finally {
2349
+ setSubmitting(false);
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]);
2267
2385
  return {
2268
2386
  /**
2269
2387
  * Disabled when:
@@ -2276,84 +2394,11 @@ const UpdateAction = ({
2276
2394
  id: "global.save",
2277
2395
  defaultMessage: "Save"
2278
2396
  }),
2279
- onClick: async () => {
2280
- setSubmitting(true);
2281
- try {
2282
- const { errors } = await validate(true, {
2283
- status: "draft"
2284
- });
2285
- if (errors) {
2286
- toggleNotification({
2287
- type: "danger",
2288
- message: formatMessage({
2289
- id: "content-manager.validation.error",
2290
- defaultMessage: "There are validation errors in your document. Please fix them before saving."
2291
- })
2292
- });
2293
- return;
2294
- }
2295
- if (isCloning) {
2296
- const res = await clone(
2297
- {
2298
- model,
2299
- documentId: cloneMatch.params.origin,
2300
- params
2301
- },
2302
- transformData(document)
2303
- );
2304
- if ("data" in res) {
2305
- navigate(
2306
- {
2307
- pathname: `../${res.data.documentId}`,
2308
- search: rawQuery
2309
- },
2310
- { relative: "path" }
2311
- );
2312
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2313
- setErrors(formatValidationErrors(res.error));
2314
- }
2315
- } else if (documentId || collectionType === SINGLE_TYPES) {
2316
- const res = await update(
2317
- {
2318
- collectionType,
2319
- model,
2320
- documentId,
2321
- params
2322
- },
2323
- transformData(document)
2324
- );
2325
- if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2326
- setErrors(formatValidationErrors(res.error));
2327
- } else {
2328
- resetForm();
2329
- }
2330
- } else {
2331
- const res = await create(
2332
- {
2333
- model,
2334
- params
2335
- },
2336
- transformData(document)
2337
- );
2338
- if ("data" in res && collectionType !== SINGLE_TYPES) {
2339
- navigate(
2340
- {
2341
- pathname: `../${res.data.documentId}`,
2342
- search: rawQuery
2343
- },
2344
- { replace: true, relative: "path" }
2345
- );
2346
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2347
- setErrors(formatValidationErrors(res.error));
2348
- }
2349
- }
2350
- } finally {
2351
- setSubmitting(false);
2352
- }
2353
- }
2397
+ onClick: handleUpdate
2354
2398
  };
2355
2399
  };
2356
2400
  UpdateAction.type = "update";
2401
+ UpdateAction.position = "panel";
2357
2402
  const UNPUBLISH_DRAFT_OPTIONS = {
2358
2403
  KEEP: "keep",
2359
2404
  DISCARD: "discard"
@@ -2476,6 +2521,7 @@ const UnpublishAction$1 = ({
2476
2521
  };
2477
2522
  };
2478
2523
  UnpublishAction$1.type = "unpublish";
2524
+ UnpublishAction$1.position = "panel";
2479
2525
  const DiscardAction = ({
2480
2526
  activeTab,
2481
2527
  documentId,
@@ -2526,6 +2572,7 @@ const DiscardAction = ({
2526
2572
  };
2527
2573
  };
2528
2574
  DiscardAction.type = "discard";
2575
+ DiscardAction.position = "panel";
2529
2576
  const DEFAULT_ACTIONS = [PublishAction$1, UpdateAction, UnpublishAction$1, DiscardAction];
2530
2577
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
2531
2578
  const RelativeTime = React.forwardRef(
@@ -2645,7 +2692,7 @@ const HeaderToolbar = () => {
2645
2692
  meta: isCloning ? void 0 : meta,
2646
2693
  collectionType
2647
2694
  },
2648
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
2695
+ descriptions: plugins["content-manager"].apis.getDocumentActions("header"),
2649
2696
  children: (actions2) => {
2650
2697
  const headerActions = actions2.filter((action) => {
2651
2698
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -2853,6 +2900,7 @@ const ConfigureTheViewAction = ({ collectionType, model }) => {
2853
2900
  };
2854
2901
  };
2855
2902
  ConfigureTheViewAction.type = "configure-the-view";
2903
+ ConfigureTheViewAction.position = "header";
2856
2904
  const EditTheModelAction = ({ model }) => {
2857
2905
  const navigate = useNavigate();
2858
2906
  const { formatMessage } = useIntl();
@@ -2869,6 +2917,7 @@ const EditTheModelAction = ({ model }) => {
2869
2917
  };
2870
2918
  };
2871
2919
  EditTheModelAction.type = "edit-the-model";
2920
+ EditTheModelAction.position = "header";
2872
2921
  const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2873
2922
  const navigate = useNavigate();
2874
2923
  const { formatMessage } = useIntl();
@@ -2942,6 +2991,7 @@ const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2942
2991
  };
2943
2992
  };
2944
2993
  DeleteAction$1.type = "delete";
2994
+ DeleteAction$1.position = ["header", "table-row"];
2945
2995
  const DEFAULT_HEADER_ACTIONS = [EditTheModelAction, ConfigureTheViewAction, DeleteAction$1];
2946
2996
  const Panels = () => {
2947
2997
  const isCloning = useMatch(CLONE_PATH) !== null;
@@ -3004,7 +3054,7 @@ const ActionsPanelContent = () => {
3004
3054
  DescriptionComponentRenderer,
3005
3055
  {
3006
3056
  props,
3007
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
3057
+ descriptions: plugins["content-manager"].apis.getDocumentActions("panel"),
3008
3058
  children: (actions2) => /* @__PURE__ */ jsx(DocumentActions, { actions: actions2 })
3009
3059
  }
3010
3060
  ),
@@ -3458,8 +3508,7 @@ const PublishAction = ({ documents, model }) => {
3458
3508
  const refetchList = () => {
3459
3509
  contentManagerApi.util.invalidateTags([{ type: "Document", id: `${model}_LIST` }]);
3460
3510
  };
3461
- if (!showPublishButton)
3462
- return null;
3511
+ if (!showPublishButton) return null;
3463
3512
  return {
3464
3513
  actionType: "publish",
3465
3514
  variant: "tertiary",
@@ -3527,8 +3576,7 @@ const DeleteAction = ({ documents, model }) => {
3527
3576
  selectRow([]);
3528
3577
  }
3529
3578
  };
3530
- if (!hasDeletePermission)
3531
- return null;
3579
+ if (!hasDeletePermission) return null;
3532
3580
  return {
3533
3581
  variant: "danger-light",
3534
3582
  label: formatMessage({ id: "global.delete", defaultMessage: "Delete" }),
@@ -3577,8 +3625,7 @@ const UnpublishAction = ({ documents, model }) => {
3577
3625
  }
3578
3626
  };
3579
3627
  const showUnpublishButton = hasDraftAndPublishEnabled && hasPublishPermission && documents.some((entry) => entry.status === "published" || entry.status === "modified");
3580
- if (!showUnpublishButton)
3581
- return null;
3628
+ if (!showUnpublishButton) return null;
3582
3629
  return {
3583
3630
  variant: "tertiary",
3584
3631
  label: formatMessage({ id: "app.utils.unpublish", defaultMessage: "Unpublish" }),
@@ -3683,7 +3730,7 @@ const TableActions = ({ document }) => {
3683
3730
  DescriptionComponentRenderer,
3684
3731
  {
3685
3732
  props,
3686
- 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"),
3687
3734
  children: (actions2) => {
3688
3735
  const tableRowActions = actions2.filter((action) => {
3689
3736
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -3742,6 +3789,7 @@ const EditAction = ({ documentId }) => {
3742
3789
  };
3743
3790
  };
3744
3791
  EditAction.type = "edit";
3792
+ EditAction.position = "table-row";
3745
3793
  const StyledPencil = styled(Pencil)`
3746
3794
  path {
3747
3795
  fill: currentColor;
@@ -3818,6 +3866,7 @@ const CloneAction = ({ model, documentId }) => {
3818
3866
  };
3819
3867
  };
3820
3868
  CloneAction.type = "clone";
3869
+ CloneAction.position = "table-row";
3821
3870
  const StyledDuplicate = styled(Duplicate)`
3822
3871
  path {
3823
3872
  fill: currentColor;
@@ -3904,7 +3953,14 @@ class ContentManagerPlugin {
3904
3953
  addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),
3905
3954
  addEditViewSidePanel: this.addEditViewSidePanel.bind(this),
3906
3955
  getBulkActions: () => this.bulkActions,
3907
- 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
+ },
3908
3964
  getEditViewSidePanels: () => this.editViewSidePanels,
3909
3965
  getHeaderActions: () => this.headerActions
3910
3966
  }
@@ -3914,10 +3970,8 @@ class ContentManagerPlugin {
3914
3970
  const getPrintableType = (value) => {
3915
3971
  const nativeType = typeof value;
3916
3972
  if (nativeType === "object") {
3917
- if (value === null)
3918
- return "null";
3919
- if (Array.isArray(value))
3920
- return "array";
3973
+ if (value === null) return "null";
3974
+ if (Array.isArray(value)) return "array";
3921
3975
  if (value instanceof Object && value.constructor.name !== "Object") {
3922
3976
  return value.constructor.name;
3923
3977
  }
@@ -3970,6 +4024,7 @@ const HistoryAction = ({ model, document }) => {
3970
4024
  };
3971
4025
  };
3972
4026
  HistoryAction.type = "history";
4027
+ HistoryAction.position = "header";
3973
4028
  const historyAdmin = {
3974
4029
  bootstrap(app) {
3975
4030
  const { addDocumentAction } = app.getPlugin("content-manager").apis;
@@ -4032,11 +4087,18 @@ const previewApi = contentManagerApi.injectEndpoints({
4032
4087
  })
4033
4088
  });
4034
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
+ };
4035
4096
  const PreviewSidePanel = ({ model, documentId, document }) => {
4036
4097
  const { formatMessage } = useIntl();
4037
4098
  const { trackUsage } = useTracking();
4038
4099
  const { pathname } = useLocation();
4039
4100
  const [{ query }] = useQueryParams();
4101
+ const isModified = useForm("PreviewSidePanel", (state) => state.modified);
4040
4102
  const { data, error } = useGetPreviewUrlQuery({
4041
4103
  params: {
4042
4104
  contentType: model
@@ -4056,20 +4118,33 @@ const PreviewSidePanel = ({ model, documentId, document }) => {
4056
4118
  };
4057
4119
  return {
4058
4120
  title: formatMessage({ id: "content-manager.preview.panel.title", defaultMessage: "Preview" }),
4059
- content: /* @__PURE__ */ jsx(Flex, { gap: 2, width: "100%", children: /* @__PURE__ */ jsx(
4060
- Button,
4121
+ content: /* @__PURE__ */ jsx(
4122
+ ConditionalTooltip,
4061
4123
  {
4062
- variant: "tertiary",
4063
- tag: Link,
4064
- to: { pathname: "preview", search: stringify(query, { encode: false }) },
4065
- onClick: trackNavigation,
4066
- flex: "auto",
4067
- children: formatMessage({
4068
- id: "content-manager.preview.panel.button",
4069
- defaultMessage: "Open preview"
4070
- })
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
+ ) })
4071
4146
  }
4072
- ) })
4147
+ )
4073
4148
  };
4074
4149
  };
4075
4150
  const FEATURE_ID = "preview";
@@ -4101,7 +4176,7 @@ const index = {
4101
4176
  app.router.addRoute({
4102
4177
  path: "content-manager/*",
4103
4178
  lazy: async () => {
4104
- const { Layout } = await import("./layout-DhMZ_lDx.mjs");
4179
+ const { Layout } = await import("./layout-BaQBaz56.mjs");
4105
4180
  return {
4106
4181
  Component: Layout
4107
4182
  };
@@ -4121,7 +4196,7 @@ const index = {
4121
4196
  async registerTrads({ locales }) {
4122
4197
  const importedTrads = await Promise.all(
4123
4198
  locales.map((locale) => {
4124
- 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-DhFUjrNW.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`).then(({ default: data }) => {
4199
+ 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 }) => {
4125
4200
  return {
4126
4201
  data: prefixPluginTranslations(data, PLUGIN_ID),
4127
4202
  locale
@@ -4183,4 +4258,4 @@ export {
4183
4258
  capitalise as y,
4184
4259
  useUpdateContentTypeConfigurationMutation as z
4185
4260
  };
4186
- //# sourceMappingURL=index-BpxR3En4.mjs.map
4261
+ //# sourceMappingURL=index-tETMKK2G.mjs.map