@strapi/content-manager 0.0.0-next.4119cc523a8fec549bb2f1869c6e789650f7f4de → 0.0.0-next.4afb25b82502b04f05bbc122b43e1e3a806e7600

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 (109) 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-aeNlfgi9.mjs → ComponentConfigurationPage-CzVt9QCC.mjs} +3 -3
  4. package/dist/_chunks/{ComponentConfigurationPage-aeNlfgi9.mjs.map → ComponentConfigurationPage-CzVt9QCC.mjs.map} +1 -1
  5. package/dist/_chunks/{ComponentConfigurationPage-_EzKh4uq.js → ComponentConfigurationPage-DYq8aqos.js} +4 -5
  6. package/dist/_chunks/{ComponentConfigurationPage-_EzKh4uq.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-DaK5-ltL.js → EditConfigurationPage-C9IATpr0.js} +4 -5
  11. package/dist/_chunks/{EditConfigurationPage-DaK5-ltL.js.map → EditConfigurationPage-C9IATpr0.js.map} +1 -1
  12. package/dist/_chunks/{EditConfigurationPage-DBVSBjCB.mjs → EditConfigurationPage-CLDwrUv5.mjs} +3 -3
  13. package/dist/_chunks/{EditConfigurationPage-DBVSBjCB.mjs.map → EditConfigurationPage-CLDwrUv5.mjs.map} +1 -1
  14. package/dist/_chunks/{EditViewPage-C3qKSunQ.js → EditViewPage-Ch-uBvbv.js} +4 -5
  15. package/dist/_chunks/{EditViewPage-C3qKSunQ.js.map → EditViewPage-Ch-uBvbv.js.map} +1 -1
  16. package/dist/_chunks/{EditViewPage-BeRi9xCR.mjs → EditViewPage-DtKM7Jgw.mjs} +3 -3
  17. package/dist/_chunks/{EditViewPage-BeRi9xCR.mjs.map → EditViewPage-DtKM7Jgw.mjs.map} +1 -1
  18. package/dist/_chunks/{Field-BwLr5b0V.js → Field-B9ADaInZ.js} +43 -64
  19. package/dist/_chunks/Field-B9ADaInZ.js.map +1 -0
  20. package/dist/_chunks/{Field-CfbMEZLv.mjs → Field-Bn1jgMeF.mjs} +42 -62
  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-Br-9I4vG.mjs → Form-BB5i9Pxl.mjs} +3 -3
  25. package/dist/_chunks/{Form-Br-9I4vG.mjs.map → Form-BB5i9Pxl.mjs.map} +1 -1
  26. package/dist/_chunks/{Form-BSInvgp4.js → Form-C3kjKrPw.js} +5 -6
  27. package/dist/_chunks/{Form-BSInvgp4.js.map → Form-C3kjKrPw.js.map} +1 -1
  28. package/dist/_chunks/{History-BHH0axCz.js → History-AwrK0-SA.js} +8 -7
  29. package/dist/_chunks/History-AwrK0-SA.js.map +1 -0
  30. package/dist/_chunks/{History-BQ721fHN.mjs → History-Cw2Q7OQL.mjs} +8 -6
  31. package/dist/_chunks/History-Cw2Q7OQL.mjs.map +1 -0
  32. package/dist/_chunks/{ListConfigurationPage-BVtVADtP.mjs → ListConfigurationPage-B47JIu1e.mjs} +3 -3
  33. package/dist/_chunks/{ListConfigurationPage-BVtVADtP.mjs.map → ListConfigurationPage-B47JIu1e.mjs.map} +1 -1
  34. package/dist/_chunks/{ListConfigurationPage-B7VtZkjG.js → ListConfigurationPage-CNTJ0DBm.js} +4 -5
  35. package/dist/_chunks/{ListConfigurationPage-B7VtZkjG.js.map → ListConfigurationPage-CNTJ0DBm.js.map} +1 -1
  36. package/dist/_chunks/{ListViewPage-C4UCZKeD.js → ListViewPage-Be_UEBar.js} +51 -51
  37. package/dist/_chunks/ListViewPage-Be_UEBar.js.map +1 -0
  38. package/dist/_chunks/{ListViewPage-Dq7nBEKD.mjs → ListViewPage-DuvjX6ra.mjs} +50 -49
  39. package/dist/_chunks/ListViewPage-DuvjX6ra.mjs.map +1 -0
  40. package/dist/_chunks/{NoContentTypePage-YNlmMHbx.js → NoContentTypePage-B1J0KUCO.js} +2 -2
  41. package/dist/_chunks/{NoContentTypePage-YNlmMHbx.js.map → NoContentTypePage-B1J0KUCO.js.map} +1 -1
  42. package/dist/_chunks/{NoContentTypePage-CQlgc_9h.mjs → NoContentTypePage-C6M-Q0Tv.mjs} +2 -2
  43. package/dist/_chunks/{NoContentTypePage-CQlgc_9h.mjs.map → NoContentTypePage-C6M-Q0Tv.mjs.map} +1 -1
  44. package/dist/_chunks/{NoPermissionsPage-CT2YbxJK.mjs → NoPermissionsPage-CAi3zCAD.mjs} +2 -2
  45. package/dist/_chunks/{NoPermissionsPage-CT2YbxJK.mjs.map → NoPermissionsPage-CAi3zCAD.mjs.map} +1 -1
  46. package/dist/_chunks/{NoPermissionsPage-CERDW9_P.js → NoPermissionsPage-CN34TlEE.js} +2 -2
  47. package/dist/_chunks/{NoPermissionsPage-CERDW9_P.js.map → NoPermissionsPage-CN34TlEE.js.map} +1 -1
  48. package/dist/_chunks/{Preview-GZFXtAgo.mjs → Preview-BrBRcL10.mjs} +49 -12
  49. package/dist/_chunks/Preview-BrBRcL10.mjs.map +1 -0
  50. package/dist/_chunks/{Preview-D9FlX2H8.js → Preview-DOqm5jcJ.js} +48 -12
  51. package/dist/_chunks/Preview-DOqm5jcJ.js.map +1 -0
  52. package/dist/_chunks/{Relations-49C4HPsL.mjs → Relations-_K-HYOiM.mjs} +6 -8
  53. package/dist/_chunks/{Relations-49C4HPsL.mjs.map → Relations-_K-HYOiM.mjs.map} +1 -1
  54. package/dist/_chunks/{Relations-CcJBqH7I.js → Relations-xtKZHtTN.js} +7 -10
  55. package/dist/_chunks/{Relations-CcJBqH7I.js.map → Relations-xtKZHtTN.js.map} +1 -1
  56. package/dist/_chunks/{en-DTWPCdTS.js → en-BK8Xyl5I.js} +3 -2
  57. package/dist/_chunks/{en-DTWPCdTS.js.map → en-BK8Xyl5I.js.map} +1 -1
  58. package/dist/_chunks/{en-CfIXaZf9.mjs → en-Dtk_ot79.mjs} +3 -2
  59. package/dist/_chunks/{en-CfIXaZf9.mjs.map → en-Dtk_ot79.mjs.map} +1 -1
  60. package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
  61. package/dist/_chunks/{index-DUjGm1xz.js → index-BlX-OdHL.js} +227 -134
  62. package/dist/_chunks/index-BlX-OdHL.js.map +1 -0
  63. package/dist/_chunks/{index-CP5EOEiH.mjs → index-tETMKK2G.mjs} +227 -133
  64. package/dist/_chunks/index-tETMKK2G.mjs.map +1 -0
  65. package/dist/_chunks/{layout-B3LdnMTA.mjs → layout-BaQBaz56.mjs} +4 -4
  66. package/dist/_chunks/{layout-B3LdnMTA.mjs.map → layout-BaQBaz56.mjs.map} +1 -1
  67. package/dist/_chunks/{layout-zHc8BsKI.js → layout-D8Sz3KxF.js} +5 -6
  68. package/dist/_chunks/{layout-zHc8BsKI.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-DrsZXRl-.js → relations-CAbbX8Sa.js} +2 -2
  72. package/dist/_chunks/{relations-DrsZXRl-.js.map → relations-CAbbX8Sa.js.map} +1 -1
  73. package/dist/_chunks/{relations-DnT2jc-S.mjs → relations-CsfmCqOU.mjs} +2 -2
  74. package/dist/_chunks/{relations-DnT2jc-S.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/admin/src/services/documents.d.ts +0 -3
  86. package/dist/server/index.js +74 -45
  87. package/dist/server/index.js.map +1 -1
  88. package/dist/server/index.mjs +74 -44
  89. package/dist/server/index.mjs.map +1 -1
  90. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  91. package/dist/server/src/preview/index.d.ts.map +1 -1
  92. package/dist/server/src/preview/services/index.d.ts +1 -0
  93. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  94. package/dist/server/src/preview/services/preview-config.d.ts +2 -0
  95. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  96. package/dist/server/src/preview/utils.d.ts +1 -0
  97. package/dist/server/src/preview/utils.d.ts.map +1 -1
  98. package/dist/server/src/register.d.ts.map +1 -1
  99. package/package.json +10 -10
  100. package/dist/_chunks/Field-BwLr5b0V.js.map +0 -1
  101. package/dist/_chunks/Field-CfbMEZLv.mjs.map +0 -1
  102. package/dist/_chunks/History-BHH0axCz.js.map +0 -1
  103. package/dist/_chunks/History-BQ721fHN.mjs.map +0 -1
  104. package/dist/_chunks/ListViewPage-C4UCZKeD.js.map +0 -1
  105. package/dist/_chunks/ListViewPage-Dq7nBEKD.mjs.map +0 -1
  106. package/dist/_chunks/Preview-D9FlX2H8.js.map +0 -1
  107. package/dist/_chunks/Preview-GZFXtAgo.mjs.map +0 -1
  108. package/dist/_chunks/index-CP5EOEiH.mjs.map +0 -1
  109. package/dist/_chunks/index-DUjGm1xz.js.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, Dialog, Modal, Typography, 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";
@@ -274,7 +281,7 @@ const documentApi = contentManagerApi.injectEndpoints({
274
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) => {
@@ -1664,7 +1667,7 @@ const useDocumentActions = () => {
1664
1667
  };
1665
1668
  };
1666
1669
  const ProtectedHistoryPage = React.lazy(
1667
- () => import("./History-BQ721fHN.mjs").then((mod) => ({ default: mod.ProtectedHistoryPage }))
1670
+ () => import("./History-Cw2Q7OQL.mjs").then((mod) => ({ default: mod.ProtectedHistoryPage }))
1668
1671
  );
1669
1672
  const routes$2 = [
1670
1673
  {
@@ -1677,7 +1680,7 @@ const routes$2 = [
1677
1680
  }
1678
1681
  ];
1679
1682
  const ProtectedPreviewPage = React.lazy(
1680
- () => import("./Preview-GZFXtAgo.mjs").then((mod) => ({ default: mod.ProtectedPreviewPage }))
1683
+ () => import("./Preview-BrBRcL10.mjs").then((mod) => ({ default: mod.ProtectedPreviewPage }))
1681
1684
  );
1682
1685
  const routes$1 = [
1683
1686
  {
@@ -1690,31 +1693,31 @@ const routes$1 = [
1690
1693
  }
1691
1694
  ];
1692
1695
  const ProtectedEditViewPage = lazy(
1693
- () => import("./EditViewPage-BeRi9xCR.mjs").then((mod) => ({ default: mod.ProtectedEditViewPage }))
1696
+ () => import("./EditViewPage-DtKM7Jgw.mjs").then((mod) => ({ default: mod.ProtectedEditViewPage }))
1694
1697
  );
1695
1698
  const ProtectedListViewPage = lazy(
1696
- () => import("./ListViewPage-Dq7nBEKD.mjs").then((mod) => ({ default: mod.ProtectedListViewPage }))
1699
+ () => import("./ListViewPage-DuvjX6ra.mjs").then((mod) => ({ default: mod.ProtectedListViewPage }))
1697
1700
  );
1698
1701
  const ProtectedListConfiguration = lazy(
1699
- () => import("./ListConfigurationPage-BVtVADtP.mjs").then((mod) => ({
1702
+ () => import("./ListConfigurationPage-B47JIu1e.mjs").then((mod) => ({
1700
1703
  default: mod.ProtectedListConfiguration
1701
1704
  }))
1702
1705
  );
1703
1706
  const ProtectedEditConfigurationPage = lazy(
1704
- () => import("./EditConfigurationPage-DBVSBjCB.mjs").then((mod) => ({
1707
+ () => import("./EditConfigurationPage-CLDwrUv5.mjs").then((mod) => ({
1705
1708
  default: mod.ProtectedEditConfigurationPage
1706
1709
  }))
1707
1710
  );
1708
1711
  const ProtectedComponentConfigurationPage = lazy(
1709
- () => import("./ComponentConfigurationPage-aeNlfgi9.mjs").then((mod) => ({
1712
+ () => import("./ComponentConfigurationPage-CzVt9QCC.mjs").then((mod) => ({
1710
1713
  default: mod.ProtectedComponentConfigurationPage
1711
1714
  }))
1712
1715
  );
1713
1716
  const NoPermissions = lazy(
1714
- () => import("./NoPermissionsPage-CT2YbxJK.mjs").then((mod) => ({ default: mod.NoPermissions }))
1717
+ () => import("./NoPermissionsPage-CAi3zCAD.mjs").then((mod) => ({ default: mod.NoPermissions }))
1715
1718
  );
1716
1719
  const NoContentType = lazy(
1717
- () => import("./NoContentTypePage-CQlgc_9h.mjs").then((mod) => ({ default: mod.NoContentType }))
1720
+ () => import("./NoContentTypePage-C6M-Q0Tv.mjs").then((mod) => ({ default: mod.NoContentType }))
1718
1721
  );
1719
1722
  const CollectionTypePages = () => {
1720
1723
  const { collectionType } = useParams();
@@ -1859,6 +1862,11 @@ const DocumentActionButton = (action) => {
1859
1862
  ) : null
1860
1863
  ] });
1861
1864
  };
1865
+ const MenuItem = styled(Menu.Item)`
1866
+ &:hover {
1867
+ background: ${({ theme, isVariantDanger, isDisabled }) => isVariantDanger && !isDisabled ? theme.colors.danger100 : "neutral"};
1868
+ }
1869
+ `;
1862
1870
  const DocumentActionsMenu = ({
1863
1871
  actions: actions2,
1864
1872
  children,
@@ -1917,11 +1925,13 @@ const DocumentActionsMenu = ({
1917
1925
  /* @__PURE__ */ jsxs(Menu.Content, { maxHeight: void 0, popoverPlacement: "bottom-end", children: [
1918
1926
  actions2.map((action) => {
1919
1927
  return /* @__PURE__ */ jsx(
1920
- Menu.Item,
1928
+ MenuItem,
1921
1929
  {
1922
1930
  disabled: action.disabled,
1923
1931
  onSelect: handleClick(action),
1924
1932
  display: "block",
1933
+ isVariantDanger: action.variant === "danger",
1934
+ isDisabled: action.disabled,
1925
1935
  children: /* @__PURE__ */ jsx(Flex, { justifyContent: "space-between", gap: 4, children: /* @__PURE__ */ jsxs(
1926
1936
  Flex,
1927
1937
  {
@@ -2077,6 +2087,7 @@ const PublishAction$1 = ({
2077
2087
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
2078
2088
  const isListView = useMatch(LIST_PATH) !== null;
2079
2089
  const isCloning = useMatch(CLONE_PATH) !== null;
2090
+ const { id } = useParams();
2080
2091
  const { formatMessage } = useIntl();
2081
2092
  const canPublish = useDocumentRBAC("PublishAction", ({ canPublish: canPublish2 }) => canPublish2);
2082
2093
  const { publish } = useDocumentActions();
@@ -2179,10 +2190,12 @@ const PublishAction$1 = ({
2179
2190
  transformData(formValues)
2180
2191
  );
2181
2192
  if ("data" in res && collectionType !== SINGLE_TYPES) {
2182
- navigate({
2183
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
2184
- search: rawQuery
2185
- });
2193
+ if (id === "create") {
2194
+ navigate({
2195
+ pathname: `../${collectionType}/${model}/${res.data.documentId}`,
2196
+ search: rawQuery
2197
+ });
2198
+ }
2186
2199
  } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2187
2200
  setErrors(formatValidationErrors(res.error));
2188
2201
  }
@@ -2235,6 +2248,7 @@ const PublishAction$1 = ({
2235
2248
  };
2236
2249
  };
2237
2250
  PublishAction$1.type = "publish";
2251
+ PublishAction$1.position = "panel";
2238
2252
  const UpdateAction = ({
2239
2253
  activeTab,
2240
2254
  documentId,
@@ -2257,96 +2271,134 @@ const UpdateAction = ({
2257
2271
  const validate = useForm("UpdateAction", (state) => state.validate);
2258
2272
  const setErrors = useForm("UpdateAction", (state) => state.setErrors);
2259
2273
  const resetForm = useForm("PublishAction", ({ resetForm: resetForm2 }) => resetForm2);
2260
- return {
2261
- /**
2262
- * Disabled when:
2263
- * - the form is submitting
2264
- * - the document is not modified & we're not cloning (you can save a clone entity straight away)
2265
- * - the active tab is the published tab
2266
- */
2267
- disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
2268
- label: formatMessage({
2269
- id: "content-manager.containers.Edit.save",
2270
- defaultMessage: "Save"
2271
- }),
2272
- onClick: async () => {
2273
- setSubmitting(true);
2274
- try {
2275
- const { errors } = await validate(true, {
2276
- 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
+ })
2277
2290
  });
2278
- if (errors) {
2279
- toggleNotification({
2280
- type: "danger",
2281
- message: formatMessage({
2282
- id: "content-manager.validation.error",
2283
- defaultMessage: "There are validation errors in your document. Please fix them before saving."
2284
- })
2285
- });
2286
- return;
2287
- }
2288
- if (isCloning) {
2289
- const res = await clone(
2290
- {
2291
- model,
2292
- documentId: cloneMatch.params.origin,
2293
- params
2294
- },
2295
- transformData(document)
2296
- );
2297
- if ("data" in res) {
2298
- navigate(
2299
- {
2300
- pathname: `../${res.data.documentId}`,
2301
- search: rawQuery
2302
- },
2303
- { relative: "path" }
2304
- );
2305
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2306
- setErrors(formatValidationErrors(res.error));
2307
- }
2308
- } else if (documentId || collectionType === SINGLE_TYPES) {
2309
- 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(
2310
2304
  {
2311
- collectionType,
2312
- model,
2313
- documentId,
2314
- params
2305
+ pathname: `../${res.data.documentId}`,
2306
+ search: rawQuery
2315
2307
  },
2316
- transformData(document)
2308
+ { relative: "path" }
2317
2309
  );
2318
- if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2319
- setErrors(formatValidationErrors(res.error));
2320
- } else {
2321
- resetForm();
2322
- }
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));
2323
2325
  } else {
2324
- 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(
2325
2338
  {
2326
- model,
2327
- params
2339
+ pathname: `../${res.data.documentId}`,
2340
+ search: rawQuery
2328
2341
  },
2329
- transformData(document)
2342
+ { replace: true, relative: "path" }
2330
2343
  );
2331
- if ("data" in res && collectionType !== SINGLE_TYPES) {
2332
- navigate(
2333
- {
2334
- pathname: `../${res.data.documentId}`,
2335
- search: rawQuery
2336
- },
2337
- { replace: true, relative: "path" }
2338
- );
2339
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2340
- setErrors(formatValidationErrors(res.error));
2341
- }
2344
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2345
+ setErrors(formatValidationErrors(res.error));
2342
2346
  }
2343
- } finally {
2344
- setSubmitting(false);
2345
2347
  }
2348
+ } finally {
2349
+ setSubmitting(false);
2346
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
2347
2398
  };
2348
2399
  };
2349
2400
  UpdateAction.type = "update";
2401
+ UpdateAction.position = "panel";
2350
2402
  const UNPUBLISH_DRAFT_OPTIONS = {
2351
2403
  KEEP: "keep",
2352
2404
  DISCARD: "discard"
@@ -2469,6 +2521,7 @@ const UnpublishAction$1 = ({
2469
2521
  };
2470
2522
  };
2471
2523
  UnpublishAction$1.type = "unpublish";
2524
+ UnpublishAction$1.position = "panel";
2472
2525
  const DiscardAction = ({
2473
2526
  activeTab,
2474
2527
  documentId,
@@ -2519,6 +2572,7 @@ const DiscardAction = ({
2519
2572
  };
2520
2573
  };
2521
2574
  DiscardAction.type = "discard";
2575
+ DiscardAction.position = "panel";
2522
2576
  const DEFAULT_ACTIONS = [PublishAction$1, UpdateAction, UnpublishAction$1, DiscardAction];
2523
2577
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
2524
2578
  const RelativeTime = React.forwardRef(
@@ -2638,7 +2692,7 @@ const HeaderToolbar = () => {
2638
2692
  meta: isCloning ? void 0 : meta,
2639
2693
  collectionType
2640
2694
  },
2641
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
2695
+ descriptions: plugins["content-manager"].apis.getDocumentActions("header"),
2642
2696
  children: (actions2) => {
2643
2697
  const headerActions = actions2.filter((action) => {
2644
2698
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -2846,6 +2900,7 @@ const ConfigureTheViewAction = ({ collectionType, model }) => {
2846
2900
  };
2847
2901
  };
2848
2902
  ConfigureTheViewAction.type = "configure-the-view";
2903
+ ConfigureTheViewAction.position = "header";
2849
2904
  const EditTheModelAction = ({ model }) => {
2850
2905
  const navigate = useNavigate();
2851
2906
  const { formatMessage } = useIntl();
@@ -2862,6 +2917,7 @@ const EditTheModelAction = ({ model }) => {
2862
2917
  };
2863
2918
  };
2864
2919
  EditTheModelAction.type = "edit-the-model";
2920
+ EditTheModelAction.position = "header";
2865
2921
  const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2866
2922
  const navigate = useNavigate();
2867
2923
  const { formatMessage } = useIntl();
@@ -2935,6 +2991,7 @@ const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2935
2991
  };
2936
2992
  };
2937
2993
  DeleteAction$1.type = "delete";
2994
+ DeleteAction$1.position = ["header", "table-row"];
2938
2995
  const DEFAULT_HEADER_ACTIONS = [EditTheModelAction, ConfigureTheViewAction, DeleteAction$1];
2939
2996
  const Panels = () => {
2940
2997
  const isCloning = useMatch(CLONE_PATH) !== null;
@@ -2997,7 +3054,7 @@ const ActionsPanelContent = () => {
2997
3054
  DescriptionComponentRenderer,
2998
3055
  {
2999
3056
  props,
3000
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
3057
+ descriptions: plugins["content-manager"].apis.getDocumentActions("panel"),
3001
3058
  children: (actions2) => /* @__PURE__ */ jsx(DocumentActions, { actions: actions2 })
3002
3059
  }
3003
3060
  ),
@@ -3451,8 +3508,7 @@ const PublishAction = ({ documents, model }) => {
3451
3508
  const refetchList = () => {
3452
3509
  contentManagerApi.util.invalidateTags([{ type: "Document", id: `${model}_LIST` }]);
3453
3510
  };
3454
- if (!showPublishButton)
3455
- return null;
3511
+ if (!showPublishButton) return null;
3456
3512
  return {
3457
3513
  actionType: "publish",
3458
3514
  variant: "tertiary",
@@ -3520,8 +3576,7 @@ const DeleteAction = ({ documents, model }) => {
3520
3576
  selectRow([]);
3521
3577
  }
3522
3578
  };
3523
- if (!hasDeletePermission)
3524
- return null;
3579
+ if (!hasDeletePermission) return null;
3525
3580
  return {
3526
3581
  variant: "danger-light",
3527
3582
  label: formatMessage({ id: "global.delete", defaultMessage: "Delete" }),
@@ -3570,8 +3625,7 @@ const UnpublishAction = ({ documents, model }) => {
3570
3625
  }
3571
3626
  };
3572
3627
  const showUnpublishButton = hasDraftAndPublishEnabled && hasPublishPermission && documents.some((entry) => entry.status === "published" || entry.status === "modified");
3573
- if (!showUnpublishButton)
3574
- return null;
3628
+ if (!showUnpublishButton) return null;
3575
3629
  return {
3576
3630
  variant: "tertiary",
3577
3631
  label: formatMessage({ id: "app.utils.unpublish", defaultMessage: "Unpublish" }),
@@ -3676,7 +3730,7 @@ const TableActions = ({ document }) => {
3676
3730
  DescriptionComponentRenderer,
3677
3731
  {
3678
3732
  props,
3679
- 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"),
3680
3734
  children: (actions2) => {
3681
3735
  const tableRowActions = actions2.filter((action) => {
3682
3736
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -3735,6 +3789,7 @@ const EditAction = ({ documentId }) => {
3735
3789
  };
3736
3790
  };
3737
3791
  EditAction.type = "edit";
3792
+ EditAction.position = "table-row";
3738
3793
  const StyledPencil = styled(Pencil)`
3739
3794
  path {
3740
3795
  fill: currentColor;
@@ -3811,6 +3866,7 @@ const CloneAction = ({ model, documentId }) => {
3811
3866
  };
3812
3867
  };
3813
3868
  CloneAction.type = "clone";
3869
+ CloneAction.position = "table-row";
3814
3870
  const StyledDuplicate = styled(Duplicate)`
3815
3871
  path {
3816
3872
  fill: currentColor;
@@ -3897,7 +3953,14 @@ class ContentManagerPlugin {
3897
3953
  addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),
3898
3954
  addEditViewSidePanel: this.addEditViewSidePanel.bind(this),
3899
3955
  getBulkActions: () => this.bulkActions,
3900
- 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
+ },
3901
3964
  getEditViewSidePanels: () => this.editViewSidePanels,
3902
3965
  getHeaderActions: () => this.headerActions
3903
3966
  }
@@ -3907,10 +3970,8 @@ class ContentManagerPlugin {
3907
3970
  const getPrintableType = (value) => {
3908
3971
  const nativeType = typeof value;
3909
3972
  if (nativeType === "object") {
3910
- if (value === null)
3911
- return "null";
3912
- if (Array.isArray(value))
3913
- return "array";
3973
+ if (value === null) return "null";
3974
+ if (Array.isArray(value)) return "array";
3914
3975
  if (value instanceof Object && value.constructor.name !== "Object") {
3915
3976
  return value.constructor.name;
3916
3977
  }
@@ -3921,17 +3982,27 @@ const HistoryAction = ({ model, document }) => {
3921
3982
  const { formatMessage } = useIntl();
3922
3983
  const [{ query }] = useQueryParams();
3923
3984
  const navigate = useNavigate();
3985
+ const { trackUsage } = useTracking();
3986
+ const { pathname } = useLocation();
3924
3987
  const pluginsQueryParams = stringify({ plugins: query.plugins }, { encode: false });
3925
3988
  if (!window.strapi.features.isEnabled("cms-content-history")) {
3926
3989
  return null;
3927
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
+ };
3928
3999
  return {
3929
4000
  icon: /* @__PURE__ */ jsx(ClockCounterClockwise, {}),
3930
4001
  label: formatMessage({
3931
4002
  id: "content-manager.history.document-action",
3932
4003
  defaultMessage: "Content History"
3933
4004
  }),
3934
- onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
4005
+ onClick: handleOnClick,
3935
4006
  disabled: (
3936
4007
  /**
3937
4008
  * The user is creating a new document.
@@ -3953,6 +4024,7 @@ const HistoryAction = ({ model, document }) => {
3953
4024
  };
3954
4025
  };
3955
4026
  HistoryAction.type = "history";
4027
+ HistoryAction.position = "header";
3956
4028
  const historyAdmin = {
3957
4029
  bootstrap(app) {
3958
4030
  const { addDocumentAction } = app.getPlugin("content-manager").apis;
@@ -4015,10 +4087,18 @@ const previewApi = contentManagerApi.injectEndpoints({
4015
4087
  })
4016
4088
  });
4017
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
+ };
4018
4096
  const PreviewSidePanel = ({ model, documentId, document }) => {
4019
4097
  const { formatMessage } = useIntl();
4020
4098
  const { trackUsage } = useTracking();
4099
+ const { pathname } = useLocation();
4021
4100
  const [{ query }] = useQueryParams();
4101
+ const isModified = useForm("PreviewSidePanel", (state) => state.modified);
4022
4102
  const { data, error } = useGetPreviewUrlQuery({
4023
4103
  params: {
4024
4104
  contentType: model
@@ -4032,25 +4112,39 @@ const PreviewSidePanel = ({ model, documentId, document }) => {
4032
4112
  if (!data?.data?.url || error) {
4033
4113
  return null;
4034
4114
  }
4035
- const handleClick = () => {
4036
- trackUsage("willOpenPreview");
4115
+ const trackNavigation = () => {
4116
+ const destinationPathname = pathname.replace(/\/$/, "") + "/preview";
4117
+ trackUsage("willNavigate", { from: pathname, to: destinationPathname });
4037
4118
  };
4038
4119
  return {
4039
4120
  title: formatMessage({ id: "content-manager.preview.panel.title", defaultMessage: "Preview" }),
4040
- content: /* @__PURE__ */ jsx(Flex, { gap: 2, width: "100%", children: /* @__PURE__ */ jsx(
4041
- Button,
4121
+ content: /* @__PURE__ */ jsx(
4122
+ ConditionalTooltip,
4042
4123
  {
4043
- variant: "tertiary",
4044
- tag: Link,
4045
- to: { pathname: "preview", search: stringify(query, { encode: false }) },
4046
- onClick: handleClick,
4047
- flex: "auto",
4048
- children: formatMessage({
4049
- id: "content-manager.preview.panel.button",
4050
- defaultMessage: "Open preview"
4051
- })
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
+ ) })
4052
4146
  }
4053
- ) })
4147
+ )
4054
4148
  };
4055
4149
  };
4056
4150
  const FEATURE_ID = "preview";
@@ -4082,7 +4176,7 @@ const index = {
4082
4176
  app.router.addRoute({
4083
4177
  path: "content-manager/*",
4084
4178
  lazy: async () => {
4085
- const { Layout } = await import("./layout-B3LdnMTA.mjs");
4179
+ const { Layout } = await import("./layout-BaQBaz56.mjs");
4086
4180
  return {
4087
4181
  Component: Layout
4088
4182
  };
@@ -4102,7 +4196,7 @@ const index = {
4102
4196
  async registerTrads({ locales }) {
4103
4197
  const importedTrads = await Promise.all(
4104
4198
  locales.map((locale) => {
4105
- 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-CfIXaZf9.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 }) => {
4106
4200
  return {
4107
4201
  data: prefixPluginTranslations(data, PLUGIN_ID),
4108
4202
  locale
@@ -4164,4 +4258,4 @@ export {
4164
4258
  capitalise as y,
4165
4259
  useUpdateContentTypeConfigurationMutation as z
4166
4260
  };
4167
- //# sourceMappingURL=index-CP5EOEiH.mjs.map
4261
+ //# sourceMappingURL=index-tETMKK2G.mjs.map