@strapi/content-manager 0.0.0-next.973df62640087231761ffaeb1c2b5d0d706346d8 → 0.0.0-next.a4bb06d54b493ab973659d0200e0e42937988850

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 (148) 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-BCCTDNe1.js → ComponentConfigurationPage-BLWQy8ru.js} +4 -5
  4. package/dist/_chunks/{ComponentConfigurationPage-BCCTDNe1.js.map → ComponentConfigurationPage-BLWQy8ru.js.map} +1 -1
  5. package/dist/_chunks/{ComponentConfigurationPage-CsMNJw_0.mjs → ComponentConfigurationPage-CtIa3aa2.mjs} +3 -3
  6. package/dist/_chunks/{ComponentConfigurationPage-CsMNJw_0.mjs.map → ComponentConfigurationPage-CtIa3aa2.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-BkEV5bFT.mjs → EditConfigurationPage-DsPR2DVk.mjs} +3 -3
  11. package/dist/_chunks/{EditConfigurationPage-BkEV5bFT.mjs.map → EditConfigurationPage-DsPR2DVk.mjs.map} +1 -1
  12. package/dist/_chunks/{EditConfigurationPage-DC1Bpfr1.js → EditConfigurationPage-RQkymxCy.js} +4 -5
  13. package/dist/_chunks/{EditConfigurationPage-DC1Bpfr1.js.map → EditConfigurationPage-RQkymxCy.js.map} +1 -1
  14. package/dist/_chunks/{EditViewPage-B_Gr-2r6.js → EditViewPage-B-kExt8C.js} +4 -5
  15. package/dist/_chunks/{EditViewPage-B_Gr-2r6.js.map → EditViewPage-B-kExt8C.js.map} +1 -1
  16. package/dist/_chunks/{EditViewPage-Bc97GGF4.mjs → EditViewPage-BPyVuPfM.mjs} +3 -3
  17. package/dist/_chunks/{EditViewPage-Bc97GGF4.mjs.map → EditViewPage-BPyVuPfM.mjs.map} +1 -1
  18. package/dist/_chunks/{Field-CqmTpeRt.js → Field-DPIsQRre.js} +155 -120
  19. package/dist/_chunks/Field-DPIsQRre.js.map +1 -0
  20. package/dist/_chunks/{Field-CIuPhh1m.mjs → Field-Dltnt1km.mjs} +153 -118
  21. package/dist/_chunks/Field-Dltnt1km.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-BRlXI9Ey.js → Form-BFi4MXMT.js} +5 -6
  25. package/dist/_chunks/{Form-BRlXI9Ey.js.map → Form-BFi4MXMT.js.map} +1 -1
  26. package/dist/_chunks/{Form-C22QTzNy.mjs → Form-C1IcWm1u.mjs} +3 -3
  27. package/dist/_chunks/{Form-C22QTzNy.mjs.map → Form-C1IcWm1u.mjs.map} +1 -1
  28. package/dist/_chunks/{History-nFKCaE9Y.mjs → History-04ChQ4pl.mjs} +37 -60
  29. package/dist/_chunks/History-04ChQ4pl.mjs.map +1 -0
  30. package/dist/_chunks/{History-mYpwx4Rh.js → History-wjcK4L0C.js} +37 -61
  31. package/dist/_chunks/History-wjcK4L0C.js.map +1 -0
  32. package/dist/_chunks/{ListConfigurationPage-vjQ_UKxh.mjs → ListConfigurationPage-BYqPYLSU.mjs} +6 -5
  33. package/dist/_chunks/ListConfigurationPage-BYqPYLSU.mjs.map +1 -0
  34. package/dist/_chunks/{ListConfigurationPage-CXwjTP1m.js → ListConfigurationPage-CRbxIC3J.js} +6 -6
  35. package/dist/_chunks/ListConfigurationPage-CRbxIC3J.js.map +1 -0
  36. package/dist/_chunks/{ListViewPage-DFq-_rFt.js → ListViewPage-D5NY9183.js} +51 -51
  37. package/dist/_chunks/ListViewPage-D5NY9183.js.map +1 -0
  38. package/dist/_chunks/{ListViewPage-Cf1E8F2V.mjs → ListViewPage-FU2LBuhl.mjs} +50 -49
  39. package/dist/_chunks/ListViewPage-FU2LBuhl.mjs.map +1 -0
  40. package/dist/_chunks/{NoContentTypePage-BUnPLdSC.js → NoContentTypePage-BgQVE_Qb.js} +2 -2
  41. package/dist/_chunks/{NoContentTypePage-BUnPLdSC.js.map → NoContentTypePage-BgQVE_Qb.js.map} +1 -1
  42. package/dist/_chunks/{NoContentTypePage-CpFh_nLX.mjs → NoContentTypePage-DCKUkwb8.mjs} +2 -2
  43. package/dist/_chunks/{NoContentTypePage-CpFh_nLX.mjs.map → NoContentTypePage-DCKUkwb8.mjs.map} +1 -1
  44. package/dist/_chunks/{NoPermissionsPage-DlEaSUxx.js → NoPermissionsPage-C5jwn70o.js} +2 -2
  45. package/dist/_chunks/{NoPermissionsPage-DlEaSUxx.js.map → NoPermissionsPage-C5jwn70o.js.map} +1 -1
  46. package/dist/_chunks/{NoPermissionsPage-GgY8yEd6.mjs → NoPermissionsPage-jqve7C8l.mjs} +2 -2
  47. package/dist/_chunks/{NoPermissionsPage-GgY8yEd6.mjs.map → NoPermissionsPage-jqve7C8l.mjs.map} +1 -1
  48. package/dist/_chunks/{Preview-BbRS-OKT.mjs → Preview-BMYN548c.mjs} +78 -72
  49. package/dist/_chunks/Preview-BMYN548c.mjs.map +1 -0
  50. package/dist/_chunks/{Preview-BPBvJI2O.js → Preview-DaOihysv.js} +77 -72
  51. package/dist/_chunks/Preview-DaOihysv.js.map +1 -0
  52. package/dist/_chunks/{Relations-C1HdkZyt.js → Relations-CTGM7Hv5.js} +7 -10
  53. package/dist/_chunks/{Relations-C1HdkZyt.js.map → Relations-CTGM7Hv5.js.map} +1 -1
  54. package/dist/_chunks/{Relations-CkIXcHbJ.mjs → Relations-gscPkxjF.mjs} +6 -8
  55. package/dist/_chunks/{Relations-CkIXcHbJ.mjs.map → Relations-gscPkxjF.mjs.map} +1 -1
  56. package/dist/_chunks/{en-CHOp_xJv.js → en-BzQmavmK.js} +11 -3
  57. package/dist/_chunks/{en-CHOp_xJv.js.map → en-BzQmavmK.js.map} +1 -1
  58. package/dist/_chunks/{en-D_BMf0hT.mjs → en-CSxLmrh1.mjs} +11 -3
  59. package/dist/_chunks/{en-D_BMf0hT.mjs.map → en-CSxLmrh1.mjs.map} +1 -1
  60. package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
  61. package/dist/_chunks/{index-BL9NYW88.js → index-Ca7YWlAA.js} +279 -165
  62. package/dist/_chunks/index-Ca7YWlAA.js.map +1 -0
  63. package/dist/_chunks/{index-C_KAytfk.mjs → index-DqasUQ6Q.mjs} +279 -164
  64. package/dist/_chunks/index-DqasUQ6Q.mjs.map +1 -0
  65. package/dist/_chunks/{layout-_a2iPFa6.js → layout-BW80JSCd.js} +5 -6
  66. package/dist/_chunks/{layout-_a2iPFa6.js.map → layout-BW80JSCd.js.map} +1 -1
  67. package/dist/_chunks/{layout-D6QIbKn7.mjs → layout-W3clJSCy.mjs} +4 -4
  68. package/dist/_chunks/{layout-D6QIbKn7.mjs.map → layout-W3clJSCy.mjs.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-BIejV2xk.mjs → relations-BlDkoeWh.mjs} +2 -2
  72. package/dist/_chunks/{relations-BIejV2xk.mjs.map → relations-BlDkoeWh.mjs.map} +1 -1
  73. package/dist/_chunks/{relations-BX-k1SIX.js → relations-C9Usz9k5.js} +2 -2
  74. package/dist/_chunks/{relations-BX-k1SIX.js.map → relations-C9Usz9k5.js.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 +2 -1
  82. package/dist/admin/index.js.map +1 -1
  83. package/dist/admin/index.mjs +2 -1
  84. package/dist/admin/src/content-manager.d.ts +3 -2
  85. package/dist/admin/src/exports.d.ts +1 -0
  86. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  87. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
  88. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +3 -3
  89. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
  90. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
  91. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
  92. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +4 -1
  93. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +4 -1
  94. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  95. package/dist/admin/src/services/api.d.ts +1 -1
  96. package/dist/admin/src/services/components.d.ts +2 -2
  97. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  98. package/dist/admin/src/services/documents.d.ts +16 -19
  99. package/dist/admin/src/services/init.d.ts +1 -1
  100. package/dist/admin/src/services/relations.d.ts +2 -2
  101. package/dist/admin/src/services/uid.d.ts +3 -3
  102. package/dist/server/index.js +230 -187
  103. package/dist/server/index.js.map +1 -1
  104. package/dist/server/index.mjs +231 -187
  105. package/dist/server/index.mjs.map +1 -1
  106. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  107. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  108. package/dist/server/src/history/controllers/history-version.d.ts +1 -1
  109. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  110. package/dist/server/src/history/services/history.d.ts +3 -3
  111. package/dist/server/src/history/services/history.d.ts.map +1 -1
  112. package/dist/server/src/history/services/utils.d.ts +6 -10
  113. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  114. package/dist/server/src/index.d.ts +3 -2
  115. package/dist/server/src/index.d.ts.map +1 -1
  116. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  117. package/dist/server/src/preview/index.d.ts.map +1 -1
  118. package/dist/server/src/preview/services/index.d.ts +1 -0
  119. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  120. package/dist/server/src/preview/services/preview-config.d.ts +2 -0
  121. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  122. package/dist/server/src/preview/utils.d.ts +1 -0
  123. package/dist/server/src/preview/utils.d.ts.map +1 -1
  124. package/dist/server/src/register.d.ts.map +1 -1
  125. package/dist/server/src/services/document-metadata.d.ts +4 -2
  126. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  127. package/dist/server/src/services/index.d.ts +3 -2
  128. package/dist/server/src/services/index.d.ts.map +1 -1
  129. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  130. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  131. package/dist/server/src/services/utils/populate.d.ts +2 -2
  132. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  133. package/package.json +12 -11
  134. package/dist/_chunks/Field-CIuPhh1m.mjs.map +0 -1
  135. package/dist/_chunks/Field-CqmTpeRt.js.map +0 -1
  136. package/dist/_chunks/History-mYpwx4Rh.js.map +0 -1
  137. package/dist/_chunks/History-nFKCaE9Y.mjs.map +0 -1
  138. package/dist/_chunks/ListConfigurationPage-CXwjTP1m.js.map +0 -1
  139. package/dist/_chunks/ListConfigurationPage-vjQ_UKxh.mjs.map +0 -1
  140. package/dist/_chunks/ListViewPage-Cf1E8F2V.mjs.map +0 -1
  141. package/dist/_chunks/ListViewPage-DFq-_rFt.js.map +0 -1
  142. package/dist/_chunks/Preview-BPBvJI2O.js.map +0 -1
  143. package/dist/_chunks/Preview-BbRS-OKT.mjs.map +0 -1
  144. package/dist/_chunks/index-BL9NYW88.js.map +0 -1
  145. package/dist/_chunks/index-C_KAytfk.mjs.map +0 -1
  146. package/dist/admin/src/preview/constants.d.ts +0 -1
  147. package/dist/server/src/preview/constants.d.ts +0 -2
  148. package/dist/server/src/preview/constants.d.ts.map +0 -1
@@ -3,24 +3,31 @@ import { jsx, Fragment, jsxs } from "react/jsx-runtime";
3
3
  import { useStrapiApp, createContext, useQueryParams, useAuth, useRBAC, Page, adminApi, translatedErrors, useNotification, useAPIErrorHandler, getYupValidationErrors, useForm, useTracking, useGuidedTour, BackButton, DescriptionComponentRenderer, useTable, Table } from "@strapi/admin/strapi-admin";
4
4
  import * as React from "react";
5
5
  import { lazy } from "react";
6
- import { Button, Menu, VisuallyHidden, Flex, 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";
@@ -168,7 +175,8 @@ const contentManagerApi = adminApi.enhanceEndpoints({
168
175
  "InitialData",
169
176
  "HistoryVersion",
170
177
  "Relations",
171
- "UidAvailability"
178
+ "UidAvailability",
179
+ "RecentDocumentList"
172
180
  ]
173
181
  });
174
182
  const documentApi = contentManagerApi.injectEndpoints({
@@ -186,7 +194,7 @@ const documentApi = contentManagerApi.injectEndpoints({
186
194
  if (error) {
187
195
  return [];
188
196
  }
189
- return [{ type: "Document", id: `${model}_LIST` }];
197
+ return [{ type: "Document", id: `${model}_LIST` }, "RecentDocumentList"];
190
198
  }
191
199
  }),
192
200
  cloneDocument: builder.mutation({
@@ -200,7 +208,8 @@ const documentApi = contentManagerApi.injectEndpoints({
200
208
  }),
201
209
  invalidatesTags: (_result, _error, { model }) => [
202
210
  { type: "Document", id: `${model}_LIST` },
203
- { type: "UidAvailability", id: model }
211
+ { type: "UidAvailability", id: model },
212
+ "RecentDocumentList"
204
213
  ]
205
214
  }),
206
215
  /**
@@ -219,8 +228,21 @@ const documentApi = contentManagerApi.injectEndpoints({
219
228
  invalidatesTags: (result, _error, { model }) => [
220
229
  { type: "Document", id: `${model}_LIST` },
221
230
  "Relations",
222
- { type: "UidAvailability", id: model }
223
- ]
231
+ { type: "UidAvailability", id: model },
232
+ "RecentDocumentList"
233
+ ],
234
+ transformResponse: (response, meta, arg) => {
235
+ if (!("data" in response) && arg.model === "plugin::users-permissions.user") {
236
+ return {
237
+ data: response,
238
+ meta: {
239
+ availableStatus: [],
240
+ availableLocales: []
241
+ }
242
+ };
243
+ }
244
+ return response;
245
+ }
224
246
  }),
225
247
  deleteDocument: builder.mutation({
226
248
  query: ({ collectionType, model, documentId, params }) => ({
@@ -231,7 +253,8 @@ const documentApi = contentManagerApi.injectEndpoints({
231
253
  }
232
254
  }),
233
255
  invalidatesTags: (_result, _error, { collectionType, model }) => [
234
- { type: "Document", id: collectionType !== SINGLE_TYPES ? `${model}_LIST` : model }
256
+ { type: "Document", id: collectionType !== SINGLE_TYPES ? `${model}_LIST` : model },
257
+ "RecentDocumentList"
235
258
  ]
236
259
  }),
237
260
  deleteManyDocuments: builder.mutation({
@@ -243,7 +266,10 @@ const documentApi = contentManagerApi.injectEndpoints({
243
266
  params
244
267
  }
245
268
  }),
246
- invalidatesTags: (_res, _error, { model }) => [{ type: "Document", id: `${model}_LIST` }]
269
+ invalidatesTags: (_res, _error, { model }) => [
270
+ { type: "Document", id: `${model}_LIST` },
271
+ "RecentDocumentList"
272
+ ]
247
273
  }),
248
274
  discardDocument: builder.mutation({
249
275
  query: ({ collectionType, model, documentId, params }) => ({
@@ -261,7 +287,8 @@ const documentApi = contentManagerApi.injectEndpoints({
261
287
  },
262
288
  { type: "Document", id: `${model}_LIST` },
263
289
  "Relations",
264
- { type: "UidAvailability", id: model }
290
+ { type: "UidAvailability", id: model },
291
+ "RecentDocumentList"
265
292
  ];
266
293
  }
267
294
  }),
@@ -274,7 +301,7 @@ const documentApi = contentManagerApi.injectEndpoints({
274
301
  url: `/content-manager/collection-types/${model}`,
275
302
  method: "GET",
276
303
  config: {
277
- params
304
+ params: stringify(params, { encode: true })
278
305
  }
279
306
  }),
280
307
  providesTags: (result, _error, arg) => {
@@ -356,7 +383,8 @@ const documentApi = contentManagerApi.injectEndpoints({
356
383
  id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
357
384
  },
358
385
  { type: "Document", id: `${model}_LIST` },
359
- "Relations"
386
+ "Relations",
387
+ "RecentDocumentList"
360
388
  ];
361
389
  }
362
390
  }),
@@ -387,7 +415,9 @@ const documentApi = contentManagerApi.injectEndpoints({
387
415
  id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
388
416
  },
389
417
  "Relations",
390
- { type: "UidAvailability", id: model }
418
+ { type: "UidAvailability", id: model },
419
+ "RecentDocumentList",
420
+ "RecentDocumentList"
391
421
  ];
392
422
  },
393
423
  async onQueryStarted({ data, ...patch }, { dispatch, queryFulfilled }) {
@@ -417,7 +447,8 @@ const documentApi = contentManagerApi.injectEndpoints({
417
447
  {
418
448
  type: "Document",
419
449
  id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
420
- }
450
+ },
451
+ "RecentDocumentList"
421
452
  ];
422
453
  }
423
454
  }),
@@ -430,7 +461,10 @@ const documentApi = contentManagerApi.injectEndpoints({
430
461
  params
431
462
  }
432
463
  }),
433
- invalidatesTags: (_res, _error, { model, documentIds }) => documentIds.map((id) => ({ type: "Document", id: `${model}_${id}` }))
464
+ invalidatesTags: (_res, _error, { model, documentIds }) => [
465
+ ...documentIds.map((id) => ({ type: "Document", id: `${model}_${id}` })),
466
+ "RecentDocumentList"
467
+ ]
434
468
  })
435
469
  })
436
470
  });
@@ -453,8 +487,7 @@ const {
453
487
  useUnpublishManyDocumentsMutation
454
488
  } = documentApi;
455
489
  const buildValidParams = (query) => {
456
- if (!query)
457
- return query;
490
+ if (!query) return query;
458
491
  const { plugins: _, ...validQueryParams } = {
459
492
  ...query,
460
493
  ...Object.values(query?.plugins ?? {}).reduce(
@@ -462,9 +495,6 @@ const buildValidParams = (query) => {
462
495
  {}
463
496
  )
464
497
  };
465
- if ("_q" in validQueryParams) {
466
- validQueryParams._q = encodeURIComponent(validQueryParams._q);
467
- }
468
498
  return validQueryParams;
469
499
  };
470
500
  const isBaseQueryError = (error) => {
@@ -1664,7 +1694,7 @@ const useDocumentActions = () => {
1664
1694
  };
1665
1695
  };
1666
1696
  const ProtectedHistoryPage = React.lazy(
1667
- () => import("./History-nFKCaE9Y.mjs").then((mod) => ({ default: mod.ProtectedHistoryPage }))
1697
+ () => import("./History-04ChQ4pl.mjs").then((mod) => ({ default: mod.ProtectedHistoryPage }))
1668
1698
  );
1669
1699
  const routes$2 = [
1670
1700
  {
@@ -1677,7 +1707,7 @@ const routes$2 = [
1677
1707
  }
1678
1708
  ];
1679
1709
  const ProtectedPreviewPage = React.lazy(
1680
- () => import("./Preview-BbRS-OKT.mjs").then((mod) => ({ default: mod.ProtectedPreviewPage }))
1710
+ () => import("./Preview-BMYN548c.mjs").then((mod) => ({ default: mod.ProtectedPreviewPage }))
1681
1711
  );
1682
1712
  const routes$1 = [
1683
1713
  {
@@ -1690,31 +1720,31 @@ const routes$1 = [
1690
1720
  }
1691
1721
  ];
1692
1722
  const ProtectedEditViewPage = lazy(
1693
- () => import("./EditViewPage-Bc97GGF4.mjs").then((mod) => ({ default: mod.ProtectedEditViewPage }))
1723
+ () => import("./EditViewPage-BPyVuPfM.mjs").then((mod) => ({ default: mod.ProtectedEditViewPage }))
1694
1724
  );
1695
1725
  const ProtectedListViewPage = lazy(
1696
- () => import("./ListViewPage-Cf1E8F2V.mjs").then((mod) => ({ default: mod.ProtectedListViewPage }))
1726
+ () => import("./ListViewPage-FU2LBuhl.mjs").then((mod) => ({ default: mod.ProtectedListViewPage }))
1697
1727
  );
1698
1728
  const ProtectedListConfiguration = lazy(
1699
- () => import("./ListConfigurationPage-vjQ_UKxh.mjs").then((mod) => ({
1729
+ () => import("./ListConfigurationPage-BYqPYLSU.mjs").then((mod) => ({
1700
1730
  default: mod.ProtectedListConfiguration
1701
1731
  }))
1702
1732
  );
1703
1733
  const ProtectedEditConfigurationPage = lazy(
1704
- () => import("./EditConfigurationPage-BkEV5bFT.mjs").then((mod) => ({
1734
+ () => import("./EditConfigurationPage-DsPR2DVk.mjs").then((mod) => ({
1705
1735
  default: mod.ProtectedEditConfigurationPage
1706
1736
  }))
1707
1737
  );
1708
1738
  const ProtectedComponentConfigurationPage = lazy(
1709
- () => import("./ComponentConfigurationPage-CsMNJw_0.mjs").then((mod) => ({
1739
+ () => import("./ComponentConfigurationPage-CtIa3aa2.mjs").then((mod) => ({
1710
1740
  default: mod.ProtectedComponentConfigurationPage
1711
1741
  }))
1712
1742
  );
1713
1743
  const NoPermissions = lazy(
1714
- () => import("./NoPermissionsPage-GgY8yEd6.mjs").then((mod) => ({ default: mod.NoPermissions }))
1744
+ () => import("./NoPermissionsPage-jqve7C8l.mjs").then((mod) => ({ default: mod.NoPermissions }))
1715
1745
  );
1716
1746
  const NoContentType = lazy(
1717
- () => import("./NoContentTypePage-CpFh_nLX.mjs").then((mod) => ({ default: mod.NoContentType }))
1747
+ () => import("./NoContentTypePage-DCKUkwb8.mjs").then((mod) => ({ default: mod.NoContentType }))
1718
1748
  );
1719
1749
  const CollectionTypePages = () => {
1720
1750
  const { collectionType } = useParams();
@@ -1859,6 +1889,11 @@ const DocumentActionButton = (action) => {
1859
1889
  ) : null
1860
1890
  ] });
1861
1891
  };
1892
+ const MenuItem = styled(Menu.Item)`
1893
+ &:hover {
1894
+ background: ${({ theme, isVariantDanger, isDisabled }) => isVariantDanger && !isDisabled ? theme.colors.danger100 : "neutral"};
1895
+ }
1896
+ `;
1862
1897
  const DocumentActionsMenu = ({
1863
1898
  actions: actions2,
1864
1899
  children,
@@ -1917,11 +1952,13 @@ const DocumentActionsMenu = ({
1917
1952
  /* @__PURE__ */ jsxs(Menu.Content, { maxHeight: void 0, popoverPlacement: "bottom-end", children: [
1918
1953
  actions2.map((action) => {
1919
1954
  return /* @__PURE__ */ jsx(
1920
- Menu.Item,
1955
+ MenuItem,
1921
1956
  {
1922
1957
  disabled: action.disabled,
1923
1958
  onSelect: handleClick(action),
1924
1959
  display: "block",
1960
+ isVariantDanger: action.variant === "danger",
1961
+ isDisabled: action.disabled,
1925
1962
  children: /* @__PURE__ */ jsx(Flex, { justifyContent: "space-between", gap: 4, children: /* @__PURE__ */ jsxs(
1926
1963
  Flex,
1927
1964
  {
@@ -2077,6 +2114,7 @@ const PublishAction$1 = ({
2077
2114
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
2078
2115
  const isListView = useMatch(LIST_PATH) !== null;
2079
2116
  const isCloning = useMatch(CLONE_PATH) !== null;
2117
+ const { id } = useParams();
2080
2118
  const { formatMessage } = useIntl();
2081
2119
  const canPublish = useDocumentRBAC("PublishAction", ({ canPublish: canPublish2 }) => canPublish2);
2082
2120
  const { publish } = useDocumentActions();
@@ -2179,10 +2217,12 @@ const PublishAction$1 = ({
2179
2217
  transformData(formValues)
2180
2218
  );
2181
2219
  if ("data" in res && collectionType !== SINGLE_TYPES) {
2182
- navigate({
2183
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
2184
- search: rawQuery
2185
- });
2220
+ if (id === "create") {
2221
+ navigate({
2222
+ pathname: `../${collectionType}/${model}/${res.data.documentId}`,
2223
+ search: rawQuery
2224
+ });
2225
+ }
2186
2226
  } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2187
2227
  setErrors(formatValidationErrors(res.error));
2188
2228
  }
@@ -2235,6 +2275,7 @@ const PublishAction$1 = ({
2235
2275
  };
2236
2276
  };
2237
2277
  PublishAction$1.type = "publish";
2278
+ PublishAction$1.position = "panel";
2238
2279
  const UpdateAction = ({
2239
2280
  activeTab,
2240
2281
  documentId,
@@ -2257,96 +2298,134 @@ const UpdateAction = ({
2257
2298
  const validate = useForm("UpdateAction", (state) => state.validate);
2258
2299
  const setErrors = useForm("UpdateAction", (state) => state.setErrors);
2259
2300
  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"
2301
+ const handleUpdate = React.useCallback(async () => {
2302
+ setSubmitting(true);
2303
+ try {
2304
+ if (!modified) {
2305
+ return;
2306
+ }
2307
+ const { errors } = await validate(true, {
2308
+ status: "draft"
2309
+ });
2310
+ if (errors) {
2311
+ toggleNotification({
2312
+ type: "danger",
2313
+ message: formatMessage({
2314
+ id: "content-manager.validation.error",
2315
+ defaultMessage: "There are validation errors in your document. Please fix them before saving."
2316
+ })
2277
2317
  });
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(
2318
+ return;
2319
+ }
2320
+ if (isCloning) {
2321
+ const res = await clone(
2322
+ {
2323
+ model,
2324
+ documentId: cloneMatch.params.origin,
2325
+ params
2326
+ },
2327
+ transformData(document)
2328
+ );
2329
+ if ("data" in res) {
2330
+ navigate(
2310
2331
  {
2311
- collectionType,
2312
- model,
2313
- documentId,
2314
- params
2332
+ pathname: `../${res.data.documentId}`,
2333
+ search: rawQuery
2315
2334
  },
2316
- transformData(document)
2335
+ { relative: "path" }
2317
2336
  );
2318
- if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2319
- setErrors(formatValidationErrors(res.error));
2320
- } else {
2321
- resetForm();
2322
- }
2337
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2338
+ setErrors(formatValidationErrors(res.error));
2339
+ }
2340
+ } else if (documentId || collectionType === SINGLE_TYPES) {
2341
+ const res = await update(
2342
+ {
2343
+ collectionType,
2344
+ model,
2345
+ documentId,
2346
+ params
2347
+ },
2348
+ transformData(document)
2349
+ );
2350
+ if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2351
+ setErrors(formatValidationErrors(res.error));
2323
2352
  } else {
2324
- const res = await create(
2353
+ resetForm();
2354
+ }
2355
+ } else {
2356
+ const res = await create(
2357
+ {
2358
+ model,
2359
+ params
2360
+ },
2361
+ transformData(document)
2362
+ );
2363
+ if ("data" in res && collectionType !== SINGLE_TYPES) {
2364
+ navigate(
2325
2365
  {
2326
- model,
2327
- params
2366
+ pathname: `../${res.data.documentId}`,
2367
+ search: rawQuery
2328
2368
  },
2329
- transformData(document)
2369
+ { replace: true, relative: "path" }
2330
2370
  );
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
- }
2371
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2372
+ setErrors(formatValidationErrors(res.error));
2342
2373
  }
2343
- } finally {
2344
- setSubmitting(false);
2345
2374
  }
2375
+ } finally {
2376
+ setSubmitting(false);
2346
2377
  }
2378
+ }, [
2379
+ clone,
2380
+ cloneMatch?.params.origin,
2381
+ collectionType,
2382
+ create,
2383
+ document,
2384
+ documentId,
2385
+ formatMessage,
2386
+ formatValidationErrors,
2387
+ isCloning,
2388
+ model,
2389
+ modified,
2390
+ navigate,
2391
+ params,
2392
+ rawQuery,
2393
+ resetForm,
2394
+ setErrors,
2395
+ setSubmitting,
2396
+ toggleNotification,
2397
+ update,
2398
+ validate
2399
+ ]);
2400
+ React.useEffect(() => {
2401
+ const handleKeyDown = (e) => {
2402
+ if (e.key === "Enter" && (e.metaKey || e.ctrlKey)) {
2403
+ e.preventDefault();
2404
+ handleUpdate();
2405
+ }
2406
+ };
2407
+ window.addEventListener("keydown", handleKeyDown);
2408
+ return () => {
2409
+ window.removeEventListener("keydown", handleKeyDown);
2410
+ };
2411
+ }, [handleUpdate]);
2412
+ return {
2413
+ /**
2414
+ * Disabled when:
2415
+ * - the form is submitting
2416
+ * - the document is not modified & we're not cloning (you can save a clone entity straight away)
2417
+ * - the active tab is the published tab
2418
+ */
2419
+ disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
2420
+ label: formatMessage({
2421
+ id: "global.save",
2422
+ defaultMessage: "Save"
2423
+ }),
2424
+ onClick: handleUpdate
2347
2425
  };
2348
2426
  };
2349
2427
  UpdateAction.type = "update";
2428
+ UpdateAction.position = "panel";
2350
2429
  const UNPUBLISH_DRAFT_OPTIONS = {
2351
2430
  KEEP: "keep",
2352
2431
  DISCARD: "discard"
@@ -2469,6 +2548,7 @@ const UnpublishAction$1 = ({
2469
2548
  };
2470
2549
  };
2471
2550
  UnpublishAction$1.type = "unpublish";
2551
+ UnpublishAction$1.position = "panel";
2472
2552
  const DiscardAction = ({
2473
2553
  activeTab,
2474
2554
  documentId,
@@ -2519,6 +2599,7 @@ const DiscardAction = ({
2519
2599
  };
2520
2600
  };
2521
2601
  DiscardAction.type = "discard";
2602
+ DiscardAction.position = "panel";
2522
2603
  const DEFAULT_ACTIONS = [PublishAction$1, UpdateAction, UnpublishAction$1, DiscardAction];
2523
2604
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
2524
2605
  const RelativeTime = React.forwardRef(
@@ -2565,10 +2646,10 @@ const getDisplayName = ({
2565
2646
  return email ?? "";
2566
2647
  };
2567
2648
  const capitalise = (str) => str.charAt(0).toUpperCase() + str.slice(1);
2568
- const DocumentStatus = ({ status = "draft", ...restProps }) => {
2649
+ const DocumentStatus = ({ status = "draft", size = "S", ...restProps }) => {
2569
2650
  const statusVariant = status === "draft" ? "secondary" : status === "published" ? "success" : "alternative";
2570
2651
  const { formatMessage } = useIntl();
2571
- return /* @__PURE__ */ jsx(Status, { ...restProps, size: "S", variant: statusVariant, children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "omega", fontWeight: "bold", children: formatMessage({
2652
+ return /* @__PURE__ */ jsx(Status, { ...restProps, size, variant: statusVariant, children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "omega", fontWeight: "bold", children: formatMessage({
2572
2653
  id: `content-manager.containers.List.${status}`,
2573
2654
  defaultMessage: capitalise(status)
2574
2655
  }) }) });
@@ -2576,12 +2657,18 @@ const DocumentStatus = ({ status = "draft", ...restProps }) => {
2576
2657
  const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
2577
2658
  const { formatMessage } = useIntl();
2578
2659
  const isCloning = useMatch(CLONE_PATH) !== null;
2660
+ const params = useParams();
2579
2661
  const title = isCreating ? formatMessage({
2580
2662
  id: "content-manager.containers.edit.title.new",
2581
2663
  defaultMessage: "Create an entry"
2582
2664
  }) : documentTitle;
2583
2665
  return /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "flex-start", paddingTop: 6, paddingBottom: 4, gap: 2, children: [
2584
- /* @__PURE__ */ jsx(BackButton, {}),
2666
+ /* @__PURE__ */ jsx(
2667
+ BackButton,
2668
+ {
2669
+ fallback: params.collectionType === SINGLE_TYPES ? void 0 : `../${COLLECTION_TYPES}/${params.slug}`
2670
+ }
2671
+ ),
2585
2672
  /* @__PURE__ */ jsxs(Flex, { width: "100%", justifyContent: "space-between", gap: "80px", alignItems: "flex-start", children: [
2586
2673
  /* @__PURE__ */ jsx(Typography, { variant: "alpha", tag: "h1", children: title }),
2587
2674
  /* @__PURE__ */ jsx(HeaderToolbar, {})
@@ -2632,7 +2719,7 @@ const HeaderToolbar = () => {
2632
2719
  meta: isCloning ? void 0 : meta,
2633
2720
  collectionType
2634
2721
  },
2635
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
2722
+ descriptions: plugins["content-manager"].apis.getDocumentActions("header"),
2636
2723
  children: (actions2) => {
2637
2724
  const headerActions = actions2.filter((action) => {
2638
2725
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -2840,6 +2927,7 @@ const ConfigureTheViewAction = ({ collectionType, model }) => {
2840
2927
  };
2841
2928
  };
2842
2929
  ConfigureTheViewAction.type = "configure-the-view";
2930
+ ConfigureTheViewAction.position = "header";
2843
2931
  const EditTheModelAction = ({ model }) => {
2844
2932
  const navigate = useNavigate();
2845
2933
  const { formatMessage } = useIntl();
@@ -2856,6 +2944,7 @@ const EditTheModelAction = ({ model }) => {
2856
2944
  };
2857
2945
  };
2858
2946
  EditTheModelAction.type = "edit-the-model";
2947
+ EditTheModelAction.position = "header";
2859
2948
  const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2860
2949
  const navigate = useNavigate();
2861
2950
  const { formatMessage } = useIntl();
@@ -2929,6 +3018,7 @@ const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2929
3018
  };
2930
3019
  };
2931
3020
  DeleteAction$1.type = "delete";
3021
+ DeleteAction$1.position = ["header", "table-row"];
2932
3022
  const DEFAULT_HEADER_ACTIONS = [EditTheModelAction, ConfigureTheViewAction, DeleteAction$1];
2933
3023
  const Panels = () => {
2934
3024
  const isCloning = useMatch(CLONE_PATH) !== null;
@@ -2991,7 +3081,7 @@ const ActionsPanelContent = () => {
2991
3081
  DescriptionComponentRenderer,
2992
3082
  {
2993
3083
  props,
2994
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
3084
+ descriptions: plugins["content-manager"].apis.getDocumentActions("panel"),
2995
3085
  children: (actions2) => /* @__PURE__ */ jsx(DocumentActions, { actions: actions2 })
2996
3086
  }
2997
3087
  ),
@@ -3268,18 +3358,10 @@ const SelectedEntriesTableContent = ({
3268
3358
  search: row.locale && `?plugins[i18n][locale]=${row.locale}`
3269
3359
  },
3270
3360
  state: { from: pathname },
3271
- label: formatMessage(
3272
- { id: "app.component.HelperPluginTable.edit", defaultMessage: "Edit {target}" },
3273
- {
3274
- target: formatMessage(
3275
- {
3276
- id: "content-manager.components.ListViewHelperPluginTable.row-line",
3277
- defaultMessage: "item line {number}"
3278
- },
3279
- { number: index2 + 1 }
3280
- )
3281
- }
3282
- ),
3361
+ label: formatMessage({
3362
+ id: "content-manager.bulk-publish.edit",
3363
+ defaultMessage: "Edit"
3364
+ }),
3283
3365
  target: "_blank",
3284
3366
  marginLeft: "auto",
3285
3367
  variant: "ghost",
@@ -3453,8 +3535,7 @@ const PublishAction = ({ documents, model }) => {
3453
3535
  const refetchList = () => {
3454
3536
  contentManagerApi.util.invalidateTags([{ type: "Document", id: `${model}_LIST` }]);
3455
3537
  };
3456
- if (!showPublishButton)
3457
- return null;
3538
+ if (!showPublishButton) return null;
3458
3539
  return {
3459
3540
  actionType: "publish",
3460
3541
  variant: "tertiary",
@@ -3522,8 +3603,7 @@ const DeleteAction = ({ documents, model }) => {
3522
3603
  selectRow([]);
3523
3604
  }
3524
3605
  };
3525
- if (!hasDeletePermission)
3526
- return null;
3606
+ if (!hasDeletePermission) return null;
3527
3607
  return {
3528
3608
  variant: "danger-light",
3529
3609
  label: formatMessage({ id: "global.delete", defaultMessage: "Delete" }),
@@ -3572,8 +3652,7 @@ const UnpublishAction = ({ documents, model }) => {
3572
3652
  }
3573
3653
  };
3574
3654
  const showUnpublishButton = hasDraftAndPublishEnabled && hasPublishPermission && documents.some((entry) => entry.status === "published" || entry.status === "modified");
3575
- if (!showUnpublishButton)
3576
- return null;
3655
+ if (!showUnpublishButton) return null;
3577
3656
  return {
3578
3657
  variant: "tertiary",
3579
3658
  label: formatMessage({ id: "app.utils.unpublish", defaultMessage: "Unpublish" }),
@@ -3678,7 +3757,7 @@ const TableActions = ({ document }) => {
3678
3757
  DescriptionComponentRenderer,
3679
3758
  {
3680
3759
  props,
3681
- descriptions: plugins["content-manager"].apis.getDocumentActions().filter((action) => action.name !== "PublishAction"),
3760
+ descriptions: plugins["content-manager"].apis.getDocumentActions("table-row").filter((action) => action.name !== "PublishAction"),
3682
3761
  children: (actions2) => {
3683
3762
  const tableRowActions = actions2.filter((action) => {
3684
3763
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -3737,6 +3816,7 @@ const EditAction = ({ documentId }) => {
3737
3816
  };
3738
3817
  };
3739
3818
  EditAction.type = "edit";
3819
+ EditAction.position = "table-row";
3740
3820
  const StyledPencil = styled(Pencil)`
3741
3821
  path {
3742
3822
  fill: currentColor;
@@ -3813,6 +3893,7 @@ const CloneAction = ({ model, documentId }) => {
3813
3893
  };
3814
3894
  };
3815
3895
  CloneAction.type = "clone";
3896
+ CloneAction.position = "table-row";
3816
3897
  const StyledDuplicate = styled(Duplicate)`
3817
3898
  path {
3818
3899
  fill: currentColor;
@@ -3899,7 +3980,14 @@ class ContentManagerPlugin {
3899
3980
  addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),
3900
3981
  addEditViewSidePanel: this.addEditViewSidePanel.bind(this),
3901
3982
  getBulkActions: () => this.bulkActions,
3902
- getDocumentActions: () => this.documentActions,
3983
+ getDocumentActions: (position) => {
3984
+ if (position) {
3985
+ return this.documentActions.filter(
3986
+ (action) => action.position == void 0 || [action.position].flat().includes(position)
3987
+ );
3988
+ }
3989
+ return this.documentActions;
3990
+ },
3903
3991
  getEditViewSidePanels: () => this.editViewSidePanels,
3904
3992
  getHeaderActions: () => this.headerActions
3905
3993
  }
@@ -3909,10 +3997,8 @@ class ContentManagerPlugin {
3909
3997
  const getPrintableType = (value) => {
3910
3998
  const nativeType = typeof value;
3911
3999
  if (nativeType === "object") {
3912
- if (value === null)
3913
- return "null";
3914
- if (Array.isArray(value))
3915
- return "array";
4000
+ if (value === null) return "null";
4001
+ if (Array.isArray(value)) return "array";
3916
4002
  if (value instanceof Object && value.constructor.name !== "Object") {
3917
4003
  return value.constructor.name;
3918
4004
  }
@@ -3923,17 +4009,27 @@ const HistoryAction = ({ model, document }) => {
3923
4009
  const { formatMessage } = useIntl();
3924
4010
  const [{ query }] = useQueryParams();
3925
4011
  const navigate = useNavigate();
4012
+ const { trackUsage } = useTracking();
4013
+ const { pathname } = useLocation();
3926
4014
  const pluginsQueryParams = stringify({ plugins: query.plugins }, { encode: false });
3927
4015
  if (!window.strapi.features.isEnabled("cms-content-history")) {
3928
4016
  return null;
3929
4017
  }
4018
+ const handleOnClick = () => {
4019
+ const destination = { pathname: "history", search: pluginsQueryParams };
4020
+ trackUsage("willNavigate", {
4021
+ from: pathname,
4022
+ to: `${pathname}/${destination.pathname}`
4023
+ });
4024
+ navigate(destination);
4025
+ };
3930
4026
  return {
3931
4027
  icon: /* @__PURE__ */ jsx(ClockCounterClockwise, {}),
3932
4028
  label: formatMessage({
3933
4029
  id: "content-manager.history.document-action",
3934
4030
  defaultMessage: "Content History"
3935
4031
  }),
3936
- onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
4032
+ onClick: handleOnClick,
3937
4033
  disabled: (
3938
4034
  /**
3939
4035
  * The user is creating a new document.
@@ -3955,6 +4051,7 @@ const HistoryAction = ({ model, document }) => {
3955
4051
  };
3956
4052
  };
3957
4053
  HistoryAction.type = "history";
4054
+ HistoryAction.position = "header";
3958
4055
  const historyAdmin = {
3959
4056
  bootstrap(app) {
3960
4057
  const { addDocumentAction } = app.getPlugin("content-manager").apis;
@@ -4017,10 +4114,18 @@ const previewApi = contentManagerApi.injectEndpoints({
4017
4114
  })
4018
4115
  });
4019
4116
  const { useGetPreviewUrlQuery } = previewApi;
4117
+ const ConditionalTooltip = ({ isShown, label, children }) => {
4118
+ if (isShown) {
4119
+ return /* @__PURE__ */ jsx(Tooltip, { label, children });
4120
+ }
4121
+ return children;
4122
+ };
4020
4123
  const PreviewSidePanel = ({ model, documentId, document }) => {
4021
4124
  const { formatMessage } = useIntl();
4022
4125
  const { trackUsage } = useTracking();
4126
+ const { pathname } = useLocation();
4023
4127
  const [{ query }] = useQueryParams();
4128
+ const isModified = useForm("PreviewSidePanel", (state) => state.modified);
4024
4129
  const { data, error } = useGetPreviewUrlQuery({
4025
4130
  params: {
4026
4131
  contentType: model
@@ -4034,33 +4139,43 @@ const PreviewSidePanel = ({ model, documentId, document }) => {
4034
4139
  if (!data?.data?.url || error) {
4035
4140
  return null;
4036
4141
  }
4037
- const handleClick = () => {
4038
- trackUsage("willOpenPreview");
4142
+ const trackNavigation = () => {
4143
+ const destinationPathname = pathname.replace(/\/$/, "") + "/preview";
4144
+ trackUsage("willNavigate", { from: pathname, to: destinationPathname });
4039
4145
  };
4040
4146
  return {
4041
4147
  title: formatMessage({ id: "content-manager.preview.panel.title", defaultMessage: "Preview" }),
4042
- content: /* @__PURE__ */ jsx(Flex, { gap: 2, width: "100%", children: /* @__PURE__ */ jsx(
4043
- Button,
4148
+ content: /* @__PURE__ */ jsx(
4149
+ ConditionalTooltip,
4044
4150
  {
4045
- variant: "tertiary",
4046
- tag: Link,
4047
- to: { pathname: "preview", search: stringify(query, { encode: false }) },
4048
- onClick: handleClick,
4049
- flex: "auto",
4050
- children: formatMessage({
4051
- id: "content-manager.preview.panel.button",
4052
- defaultMessage: "Open preview"
4053
- })
4151
+ label: formatMessage({
4152
+ id: "content-manager.preview.panel.button-disabled-tooltip",
4153
+ defaultMessage: "Please save to open the preview"
4154
+ }),
4155
+ isShown: isModified,
4156
+ children: /* @__PURE__ */ jsx(Box, { cursor: "not-allowed", width: "100%", children: /* @__PURE__ */ jsx(
4157
+ Button,
4158
+ {
4159
+ variant: "tertiary",
4160
+ tag: Link,
4161
+ to: { pathname: "preview", search: stringify(query, { encode: false }) },
4162
+ onClick: trackNavigation,
4163
+ width: "100%",
4164
+ disabled: isModified,
4165
+ pointerEvents: isModified ? "none" : void 0,
4166
+ tabIndex: isModified ? -1 : void 0,
4167
+ children: formatMessage({
4168
+ id: "content-manager.preview.panel.button",
4169
+ defaultMessage: "Open preview"
4170
+ })
4171
+ }
4172
+ ) })
4054
4173
  }
4055
- ) })
4174
+ )
4056
4175
  };
4057
4176
  };
4058
- const FEATURE_ID = "preview";
4059
4177
  const previewAdmin = {
4060
4178
  bootstrap(app) {
4061
- if (!window.strapi.future.isEnabled(FEATURE_ID)) {
4062
- return;
4063
- }
4064
4179
  const contentManagerPluginApis = app.getPlugin("content-manager").apis;
4065
4180
  contentManagerPluginApis.addEditViewSidePanel([PreviewSidePanel]);
4066
4181
  }
@@ -4084,7 +4199,7 @@ const index = {
4084
4199
  app.router.addRoute({
4085
4200
  path: "content-manager/*",
4086
4201
  lazy: async () => {
4087
- const { Layout } = await import("./layout-D6QIbKn7.mjs");
4202
+ const { Layout } = await import("./layout-W3clJSCy.mjs");
4088
4203
  return {
4089
4204
  Component: Layout
4090
4205
  };
@@ -4104,7 +4219,7 @@ const index = {
4104
4219
  async registerTrads({ locales }) {
4105
4220
  const importedTrads = await Promise.all(
4106
4221
  locales.map((locale) => {
4107
- 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-D_BMf0hT.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 }) => {
4222
+ 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-CSxLmrh1.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 }) => {
4108
4223
  return {
4109
4224
  data: prefixPluginTranslations(data, PLUGIN_ID),
4110
4225
  locale
@@ -4166,4 +4281,4 @@ export {
4166
4281
  capitalise as y,
4167
4282
  useUpdateContentTypeConfigurationMutation as z
4168
4283
  };
4169
- //# sourceMappingURL=index-C_KAytfk.mjs.map
4284
+ //# sourceMappingURL=index-DqasUQ6Q.mjs.map