@strapi/content-manager 0.0.0-next.f6dca5adf05ef6bed9605a1535999ab0bbbf063e → 0.0.0-next.fc1775f7731f8999840e56e298a216b9a6c5c4ad

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 (153) 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--MCP7Aew.js → ComponentConfigurationPage-BLWQy8ru.js} +4 -5
  4. package/dist/_chunks/{ComponentConfigurationPage--MCP7Aew.js.map → ComponentConfigurationPage-BLWQy8ru.js.map} +1 -1
  5. package/dist/_chunks/{ComponentConfigurationPage-DT41asyM.mjs → ComponentConfigurationPage-CtIa3aa2.mjs} +3 -3
  6. package/dist/_chunks/{ComponentConfigurationPage-DT41asyM.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-DznPxn9p.mjs → EditConfigurationPage-DsPR2DVk.mjs} +3 -3
  11. package/dist/_chunks/{EditConfigurationPage-DznPxn9p.mjs.map → EditConfigurationPage-DsPR2DVk.mjs.map} +1 -1
  12. package/dist/_chunks/{EditConfigurationPage-qgnNvv_u.js → EditConfigurationPage-RQkymxCy.js} +4 -5
  13. package/dist/_chunks/{EditConfigurationPage-qgnNvv_u.js.map → EditConfigurationPage-RQkymxCy.js.map} +1 -1
  14. package/dist/_chunks/{EditViewPage-Bb4S7p8c.js → EditViewPage-B-kExt8C.js} +36 -8
  15. package/dist/_chunks/EditViewPage-B-kExt8C.js.map +1 -0
  16. package/dist/_chunks/{EditViewPage-B_k7z288.mjs → EditViewPage-BPyVuPfM.mjs} +35 -6
  17. package/dist/_chunks/EditViewPage-BPyVuPfM.mjs.map +1 -0
  18. package/dist/_chunks/{Field-ByR1mllE.js → Field-DPIsQRre.js} +177 -122
  19. package/dist/_chunks/Field-DPIsQRre.js.map +1 -0
  20. package/dist/_chunks/{Field-DmwbE0TL.mjs → Field-Dltnt1km.mjs} +175 -120
  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-BpeyAyS1.js → Form-BFi4MXMT.js} +5 -6
  25. package/dist/_chunks/{Form-BpeyAyS1.js.map → Form-BFi4MXMT.js.map} +1 -1
  26. package/dist/_chunks/{Form-Dvt5eouJ.mjs → Form-C1IcWm1u.mjs} +3 -3
  27. package/dist/_chunks/{Form-Dvt5eouJ.mjs.map → Form-C1IcWm1u.mjs.map} +1 -1
  28. package/dist/_chunks/{History-CAERKpYl.mjs → History-04ChQ4pl.mjs} +37 -60
  29. package/dist/_chunks/History-04ChQ4pl.mjs.map +1 -0
  30. package/dist/_chunks/{History-d-IgDGPl.js → History-wjcK4L0C.js} +37 -61
  31. package/dist/_chunks/History-wjcK4L0C.js.map +1 -0
  32. package/dist/_chunks/{ListConfigurationPage-CVVT45M8.mjs → ListConfigurationPage-BYqPYLSU.mjs} +6 -5
  33. package/dist/_chunks/ListConfigurationPage-BYqPYLSU.mjs.map +1 -0
  34. package/dist/_chunks/{ListConfigurationPage-DSX98CYb.js → ListConfigurationPage-CRbxIC3J.js} +6 -6
  35. package/dist/_chunks/ListConfigurationPage-CRbxIC3J.js.map +1 -0
  36. package/dist/_chunks/{ListViewPage-C9gPPp-V.js → ListViewPage-D5NY9183.js} +64 -53
  37. package/dist/_chunks/ListViewPage-D5NY9183.js.map +1 -0
  38. package/dist/_chunks/{ListViewPage-Q4g6kHDl.mjs → ListViewPage-FU2LBuhl.mjs} +63 -51
  39. package/dist/_chunks/ListViewPage-FU2LBuhl.mjs.map +1 -0
  40. package/dist/_chunks/{NoContentTypePage-D09gppmy.js → NoContentTypePage-BgQVE_Qb.js} +2 -2
  41. package/dist/_chunks/{NoContentTypePage-D09gppmy.js.map → NoContentTypePage-BgQVE_Qb.js.map} +1 -1
  42. package/dist/_chunks/{NoContentTypePage-BY4YRGs0.mjs → NoContentTypePage-DCKUkwb8.mjs} +2 -2
  43. package/dist/_chunks/{NoContentTypePage-BY4YRGs0.mjs.map → NoContentTypePage-DCKUkwb8.mjs.map} +1 -1
  44. package/dist/_chunks/{NoPermissionsPage-32WgThJG.js → NoPermissionsPage-C5jwn70o.js} +2 -2
  45. package/dist/_chunks/{NoPermissionsPage-32WgThJG.js.map → NoPermissionsPage-C5jwn70o.js.map} +1 -1
  46. package/dist/_chunks/{NoPermissionsPage-CyM16RKL.mjs → NoPermissionsPage-jqve7C8l.mjs} +2 -2
  47. package/dist/_chunks/{NoPermissionsPage-CyM16RKL.mjs.map → NoPermissionsPage-jqve7C8l.mjs.map} +1 -1
  48. package/dist/_chunks/{Preview-C2WFq4S8.mjs → Preview-BMYN548c.mjs} +100 -73
  49. package/dist/_chunks/Preview-BMYN548c.mjs.map +1 -0
  50. package/dist/_chunks/{Preview-PpV3g9wJ.js → Preview-DaOihysv.js} +98 -72
  51. package/dist/_chunks/Preview-DaOihysv.js.map +1 -0
  52. package/dist/_chunks/{Relations-mWaebC5t.js → Relations-CTGM7Hv5.js} +7 -10
  53. package/dist/_chunks/{Relations-mWaebC5t.js.map → Relations-CTGM7Hv5.js.map} +1 -1
  54. package/dist/_chunks/{Relations-B_Yn9xGB.mjs → Relations-gscPkxjF.mjs} +6 -8
  55. package/dist/_chunks/{Relations-B_Yn9xGB.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-iun2i4xv.js → index-Ca7YWlAA.js} +300 -204
  62. package/dist/_chunks/index-Ca7YWlAA.js.map +1 -0
  63. package/dist/_chunks/{index-CbytGVdz.mjs → index-DqasUQ6Q.mjs} +300 -203
  64. package/dist/_chunks/index-DqasUQ6Q.mjs.map +1 -0
  65. package/dist/_chunks/{layout-CkaP4K5_.js → layout-BW80JSCd.js} +5 -6
  66. package/dist/_chunks/{layout-CkaP4K5_.js.map → layout-BW80JSCd.js.map} +1 -1
  67. package/dist/_chunks/{layout-Btu_cMRF.mjs → layout-W3clJSCy.mjs} +4 -4
  68. package/dist/_chunks/{layout-Btu_cMRF.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-Cn5re8ia.mjs → relations-BlDkoeWh.mjs} +2 -2
  72. package/dist/_chunks/{relations-Cn5re8ia.mjs.map → relations-BlDkoeWh.mjs.map} +1 -1
  73. package/dist/_chunks/{relations-O_v9g0v_.js → relations-C9Usz9k5.js} +2 -2
  74. package/dist/_chunks/{relations-O_v9g0v_.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/components/PreviewContent.d.ts +2 -0
  95. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  96. package/dist/admin/src/router.d.ts +1 -1
  97. package/dist/admin/src/services/api.d.ts +1 -1
  98. package/dist/admin/src/services/components.d.ts +2 -2
  99. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  100. package/dist/admin/src/services/documents.d.ts +16 -19
  101. package/dist/admin/src/services/init.d.ts +1 -1
  102. package/dist/admin/src/services/relations.d.ts +2 -2
  103. package/dist/admin/src/services/uid.d.ts +3 -3
  104. package/dist/server/index.js +230 -187
  105. package/dist/server/index.js.map +1 -1
  106. package/dist/server/index.mjs +231 -187
  107. package/dist/server/index.mjs.map +1 -1
  108. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  109. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  110. package/dist/server/src/history/controllers/history-version.d.ts +1 -1
  111. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  112. package/dist/server/src/history/services/history.d.ts +3 -3
  113. package/dist/server/src/history/services/history.d.ts.map +1 -1
  114. package/dist/server/src/history/services/utils.d.ts +6 -10
  115. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  116. package/dist/server/src/index.d.ts +3 -2
  117. package/dist/server/src/index.d.ts.map +1 -1
  118. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  119. package/dist/server/src/preview/index.d.ts.map +1 -1
  120. package/dist/server/src/preview/services/index.d.ts +1 -0
  121. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  122. package/dist/server/src/preview/services/preview-config.d.ts +2 -0
  123. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  124. package/dist/server/src/preview/utils.d.ts +1 -0
  125. package/dist/server/src/preview/utils.d.ts.map +1 -1
  126. package/dist/server/src/register.d.ts.map +1 -1
  127. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  128. package/dist/server/src/services/document-metadata.d.ts +4 -2
  129. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  130. package/dist/server/src/services/index.d.ts +3 -2
  131. package/dist/server/src/services/index.d.ts.map +1 -1
  132. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  133. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  134. package/dist/server/src/services/utils/populate.d.ts +2 -2
  135. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  136. package/package.json +12 -11
  137. package/dist/_chunks/EditViewPage-B_k7z288.mjs.map +0 -1
  138. package/dist/_chunks/EditViewPage-Bb4S7p8c.js.map +0 -1
  139. package/dist/_chunks/Field-ByR1mllE.js.map +0 -1
  140. package/dist/_chunks/Field-DmwbE0TL.mjs.map +0 -1
  141. package/dist/_chunks/History-CAERKpYl.mjs.map +0 -1
  142. package/dist/_chunks/History-d-IgDGPl.js.map +0 -1
  143. package/dist/_chunks/ListConfigurationPage-CVVT45M8.mjs.map +0 -1
  144. package/dist/_chunks/ListConfigurationPage-DSX98CYb.js.map +0 -1
  145. package/dist/_chunks/ListViewPage-C9gPPp-V.js.map +0 -1
  146. package/dist/_chunks/ListViewPage-Q4g6kHDl.mjs.map +0 -1
  147. package/dist/_chunks/Preview-C2WFq4S8.mjs.map +0 -1
  148. package/dist/_chunks/Preview-PpV3g9wJ.js.map +0 -1
  149. package/dist/_chunks/index-CbytGVdz.mjs.map +0 -1
  150. package/dist/_chunks/index-iun2i4xv.js.map +0 -1
  151. package/dist/admin/src/preview/constants.d.ts +0 -1
  152. package/dist/server/src/preview/constants.d.ts +0 -2
  153. package/dist/server/src/preview/constants.d.ts.map +0 -1
@@ -3,24 +3,31 @@ import { jsx, Fragment, jsxs } from "react/jsx-runtime";
3
3
  import { useStrapiApp, createContext, useQueryParams, useAuth, useRBAC, Page, adminApi, translatedErrors, useNotification, useAPIErrorHandler, getYupValidationErrors, useForm, useTracking, useGuidedTour, BackButton, DescriptionComponentRenderer, useTable, Table } from "@strapi/admin/strapi-admin";
4
4
  import * as React from "react";
5
5
  import { lazy } from "react";
6
- import { Button, Menu, VisuallyHidden, Flex, Typography, Dialog, Modal, Radio, Status, Box, SingleSelect, SingleSelectOption, IconButton, Loader, Tooltip, LinkButton } from "@strapi/design-system";
6
+ import { Menu, Button, VisuallyHidden, Flex, Dialog, Modal, Typography, Radio, Status, Box, SingleSelect, SingleSelectOption, IconButton, Loader, Tooltip, LinkButton } from "@strapi/design-system";
7
7
  import mapValues from "lodash/fp/mapValues";
8
8
  import { useIntl } from "react-intl";
9
9
  import { useParams, useNavigate, Navigate, useMatch, useLocation, Link, NavLink } from "react-router-dom";
10
+ import { styled } from "styled-components";
10
11
  import * as yup from "yup";
11
12
  import { ValidationError } from "yup";
13
+ import { stringify } from "qs";
12
14
  import pipe from "lodash/fp/pipe";
13
15
  import { intervalToDuration, isPast } from "date-fns";
14
- import { styled } from "styled-components";
15
- import { stringify } from "qs";
16
16
  import { createSlice, combineReducers } from "@reduxjs/toolkit";
17
- const __variableDynamicImportRuntimeHelper = (glob, path) => {
17
+ const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
18
18
  const v = glob[path];
19
19
  if (v) {
20
20
  return typeof v === "function" ? v() : Promise.resolve(v);
21
21
  }
22
22
  return new Promise((_, reject) => {
23
- (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(reject.bind(null, new Error("Unknown variable dynamic import: " + path)));
23
+ (typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
24
+ reject.bind(
25
+ null,
26
+ new Error(
27
+ "Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
28
+ )
29
+ )
30
+ );
24
31
  });
25
32
  };
26
33
  const PLUGIN_ID = "content-manager";
@@ -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-CAERKpYl.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-C2WFq4S8.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-B_k7z288.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-Q4g6kHDl.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-CVVT45M8.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-DznPxn9p.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-DT41asyM.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-CyM16RKL.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-BY4YRGs0.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();
@@ -1726,7 +1756,7 @@ const CollectionTypePages = () => {
1726
1756
  const CLONE_RELATIVE_PATH = ":collectionType/:slug/clone/:origin";
1727
1757
  const CLONE_PATH = `/content-manager/${CLONE_RELATIVE_PATH}`;
1728
1758
  const LIST_RELATIVE_PATH = ":collectionType/:slug";
1729
- const LIST_PATH = `/content-manager/${LIST_RELATIVE_PATH}`;
1759
+ const LIST_PATH = `/content-manager/collection-types/:slug`;
1730
1760
  const routes = [
1731
1761
  {
1732
1762
  path: LIST_RELATIVE_PATH,
@@ -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,48 +1952,32 @@ 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",
1925
- children: /* @__PURE__ */ jsxs(Flex, { justifyContent: "space-between", gap: 4, children: [
1926
- /* @__PURE__ */ jsxs(
1927
- Flex,
1928
- {
1929
- color: !action.disabled ? convertActionVariantToColor(action.variant) : "inherit",
1930
- gap: 2,
1931
- tag: "span",
1932
- children: [
1933
- /* @__PURE__ */ jsx(
1934
- Flex,
1935
- {
1936
- tag: "span",
1937
- color: !action.disabled ? convertActionVariantToIconColor(action.variant) : "inherit",
1938
- children: action.icon
1939
- }
1940
- ),
1941
- action.label
1942
- ]
1943
- }
1944
- ),
1945
- action.id.startsWith("HistoryAction") && /* @__PURE__ */ jsx(
1946
- Flex,
1947
- {
1948
- alignItems: "center",
1949
- background: "alternative100",
1950
- borderStyle: "solid",
1951
- borderColor: "alternative200",
1952
- borderWidth: "1px",
1953
- height: 5,
1954
- paddingLeft: 2,
1955
- paddingRight: 2,
1956
- hasRadius: true,
1957
- color: "alternative600",
1958
- children: /* @__PURE__ */ jsx(Typography, { variant: "sigma", fontWeight: "bold", lineHeight: 1, children: formatMessage({ id: "global.new", defaultMessage: "New" }) })
1959
- }
1960
- )
1961
- ] })
1960
+ isVariantDanger: action.variant === "danger",
1961
+ isDisabled: action.disabled,
1962
+ children: /* @__PURE__ */ jsx(Flex, { justifyContent: "space-between", gap: 4, children: /* @__PURE__ */ jsxs(
1963
+ Flex,
1964
+ {
1965
+ color: !action.disabled ? convertActionVariantToColor(action.variant) : "inherit",
1966
+ gap: 2,
1967
+ tag: "span",
1968
+ children: [
1969
+ /* @__PURE__ */ jsx(
1970
+ Flex,
1971
+ {
1972
+ tag: "span",
1973
+ color: !action.disabled ? convertActionVariantToIconColor(action.variant) : "inherit",
1974
+ children: action.icon
1975
+ }
1976
+ ),
1977
+ action.label
1978
+ ]
1979
+ }
1980
+ ) })
1962
1981
  },
1963
1982
  action.id
1964
1983
  );
@@ -2095,6 +2114,7 @@ const PublishAction$1 = ({
2095
2114
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
2096
2115
  const isListView = useMatch(LIST_PATH) !== null;
2097
2116
  const isCloning = useMatch(CLONE_PATH) !== null;
2117
+ const { id } = useParams();
2098
2118
  const { formatMessage } = useIntl();
2099
2119
  const canPublish = useDocumentRBAC("PublishAction", ({ canPublish: canPublish2 }) => canPublish2);
2100
2120
  const { publish } = useDocumentActions();
@@ -2197,10 +2217,12 @@ const PublishAction$1 = ({
2197
2217
  transformData(formValues)
2198
2218
  );
2199
2219
  if ("data" in res && collectionType !== SINGLE_TYPES) {
2200
- navigate({
2201
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
2202
- search: rawQuery
2203
- });
2220
+ if (id === "create") {
2221
+ navigate({
2222
+ pathname: `../${collectionType}/${model}/${res.data.documentId}`,
2223
+ search: rawQuery
2224
+ });
2225
+ }
2204
2226
  } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2205
2227
  setErrors(formatValidationErrors(res.error));
2206
2228
  }
@@ -2253,6 +2275,7 @@ const PublishAction$1 = ({
2253
2275
  };
2254
2276
  };
2255
2277
  PublishAction$1.type = "publish";
2278
+ PublishAction$1.position = "panel";
2256
2279
  const UpdateAction = ({
2257
2280
  activeTab,
2258
2281
  documentId,
@@ -2275,96 +2298,134 @@ const UpdateAction = ({
2275
2298
  const validate = useForm("UpdateAction", (state) => state.validate);
2276
2299
  const setErrors = useForm("UpdateAction", (state) => state.setErrors);
2277
2300
  const resetForm = useForm("PublishAction", ({ resetForm: resetForm2 }) => resetForm2);
2278
- return {
2279
- /**
2280
- * Disabled when:
2281
- * - the form is submitting
2282
- * - the document is not modified & we're not cloning (you can save a clone entity straight away)
2283
- * - the active tab is the published tab
2284
- */
2285
- disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
2286
- label: formatMessage({
2287
- id: "content-manager.containers.Edit.save",
2288
- defaultMessage: "Save"
2289
- }),
2290
- onClick: async () => {
2291
- setSubmitting(true);
2292
- try {
2293
- const { errors } = await validate(true, {
2294
- 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
+ })
2295
2317
  });
2296
- if (errors) {
2297
- toggleNotification({
2298
- type: "danger",
2299
- message: formatMessage({
2300
- id: "content-manager.validation.error",
2301
- defaultMessage: "There are validation errors in your document. Please fix them before saving."
2302
- })
2303
- });
2304
- return;
2305
- }
2306
- if (isCloning) {
2307
- const res = await clone(
2308
- {
2309
- model,
2310
- documentId: cloneMatch.params.origin,
2311
- params
2312
- },
2313
- transformData(document)
2314
- );
2315
- if ("data" in res) {
2316
- navigate(
2317
- {
2318
- pathname: `../${res.data.documentId}`,
2319
- search: rawQuery
2320
- },
2321
- { relative: "path" }
2322
- );
2323
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2324
- setErrors(formatValidationErrors(res.error));
2325
- }
2326
- } else if (documentId || collectionType === SINGLE_TYPES) {
2327
- 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(
2328
2331
  {
2329
- collectionType,
2330
- model,
2331
- documentId,
2332
- params
2332
+ pathname: `../${res.data.documentId}`,
2333
+ search: rawQuery
2333
2334
  },
2334
- transformData(document)
2335
+ { relative: "path" }
2335
2336
  );
2336
- if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2337
- setErrors(formatValidationErrors(res.error));
2338
- } else {
2339
- resetForm();
2340
- }
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));
2341
2352
  } else {
2342
- 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(
2343
2365
  {
2344
- model,
2345
- params
2366
+ pathname: `../${res.data.documentId}`,
2367
+ search: rawQuery
2346
2368
  },
2347
- transformData(document)
2369
+ { replace: true, relative: "path" }
2348
2370
  );
2349
- if ("data" in res && collectionType !== SINGLE_TYPES) {
2350
- navigate(
2351
- {
2352
- pathname: `../${res.data.documentId}`,
2353
- search: rawQuery
2354
- },
2355
- { replace: true, relative: "path" }
2356
- );
2357
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2358
- setErrors(formatValidationErrors(res.error));
2359
- }
2371
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
2372
+ setErrors(formatValidationErrors(res.error));
2360
2373
  }
2361
- } finally {
2362
- setSubmitting(false);
2363
2374
  }
2375
+ } finally {
2376
+ setSubmitting(false);
2364
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
2365
2425
  };
2366
2426
  };
2367
2427
  UpdateAction.type = "update";
2428
+ UpdateAction.position = "panel";
2368
2429
  const UNPUBLISH_DRAFT_OPTIONS = {
2369
2430
  KEEP: "keep",
2370
2431
  DISCARD: "discard"
@@ -2487,6 +2548,7 @@ const UnpublishAction$1 = ({
2487
2548
  };
2488
2549
  };
2489
2550
  UnpublishAction$1.type = "unpublish";
2551
+ UnpublishAction$1.position = "panel";
2490
2552
  const DiscardAction = ({
2491
2553
  activeTab,
2492
2554
  documentId,
@@ -2537,6 +2599,7 @@ const DiscardAction = ({
2537
2599
  };
2538
2600
  };
2539
2601
  DiscardAction.type = "discard";
2602
+ DiscardAction.position = "panel";
2540
2603
  const DEFAULT_ACTIONS = [PublishAction$1, UpdateAction, UnpublishAction$1, DiscardAction];
2541
2604
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
2542
2605
  const RelativeTime = React.forwardRef(
@@ -2549,7 +2612,7 @@ const RelativeTime = React.forwardRef(
2549
2612
  });
2550
2613
  const unit = intervals.find((intervalUnit) => {
2551
2614
  return interval[intervalUnit] > 0 && Object.keys(interval).includes(intervalUnit);
2552
- });
2615
+ }) ?? "seconds";
2553
2616
  const relativeTime = isPast(timestamp) ? -interval[unit] : interval[unit];
2554
2617
  const customInterval = customIntervals.find(
2555
2618
  (custom) => interval[custom.unit] < custom.threshold
@@ -2583,10 +2646,10 @@ const getDisplayName = ({
2583
2646
  return email ?? "";
2584
2647
  };
2585
2648
  const capitalise = (str) => str.charAt(0).toUpperCase() + str.slice(1);
2586
- const DocumentStatus = ({ status = "draft", ...restProps }) => {
2649
+ const DocumentStatus = ({ status = "draft", size = "S", ...restProps }) => {
2587
2650
  const statusVariant = status === "draft" ? "secondary" : status === "published" ? "success" : "alternative";
2588
2651
  const { formatMessage } = useIntl();
2589
- return /* @__PURE__ */ jsx(Status, { ...restProps, showBullet: false, 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({
2590
2653
  id: `content-manager.containers.List.${status}`,
2591
2654
  defaultMessage: capitalise(status)
2592
2655
  }) }) });
@@ -2594,12 +2657,18 @@ const DocumentStatus = ({ status = "draft", ...restProps }) => {
2594
2657
  const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
2595
2658
  const { formatMessage } = useIntl();
2596
2659
  const isCloning = useMatch(CLONE_PATH) !== null;
2660
+ const params = useParams();
2597
2661
  const title = isCreating ? formatMessage({
2598
2662
  id: "content-manager.containers.edit.title.new",
2599
2663
  defaultMessage: "Create an entry"
2600
2664
  }) : documentTitle;
2601
2665
  return /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "flex-start", paddingTop: 6, paddingBottom: 4, gap: 2, children: [
2602
- /* @__PURE__ */ jsx(BackButton, {}),
2666
+ /* @__PURE__ */ jsx(
2667
+ BackButton,
2668
+ {
2669
+ fallback: params.collectionType === SINGLE_TYPES ? void 0 : `../${COLLECTION_TYPES}/${params.slug}`
2670
+ }
2671
+ ),
2603
2672
  /* @__PURE__ */ jsxs(Flex, { width: "100%", justifyContent: "space-between", gap: "80px", alignItems: "flex-start", children: [
2604
2673
  /* @__PURE__ */ jsx(Typography, { variant: "alpha", tag: "h1", children: title }),
2605
2674
  /* @__PURE__ */ jsx(HeaderToolbar, {})
@@ -2650,7 +2719,7 @@ const HeaderToolbar = () => {
2650
2719
  meta: isCloning ? void 0 : meta,
2651
2720
  collectionType
2652
2721
  },
2653
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
2722
+ descriptions: plugins["content-manager"].apis.getDocumentActions("header"),
2654
2723
  children: (actions2) => {
2655
2724
  const headerActions = actions2.filter((action) => {
2656
2725
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -2858,6 +2927,7 @@ const ConfigureTheViewAction = ({ collectionType, model }) => {
2858
2927
  };
2859
2928
  };
2860
2929
  ConfigureTheViewAction.type = "configure-the-view";
2930
+ ConfigureTheViewAction.position = "header";
2861
2931
  const EditTheModelAction = ({ model }) => {
2862
2932
  const navigate = useNavigate();
2863
2933
  const { formatMessage } = useIntl();
@@ -2874,6 +2944,7 @@ const EditTheModelAction = ({ model }) => {
2874
2944
  };
2875
2945
  };
2876
2946
  EditTheModelAction.type = "edit-the-model";
2947
+ EditTheModelAction.position = "header";
2877
2948
  const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2878
2949
  const navigate = useNavigate();
2879
2950
  const { formatMessage } = useIntl();
@@ -2947,6 +3018,7 @@ const DeleteAction$1 = ({ documentId, model, collectionType, document }) => {
2947
3018
  };
2948
3019
  };
2949
3020
  DeleteAction$1.type = "delete";
3021
+ DeleteAction$1.position = ["header", "table-row"];
2950
3022
  const DEFAULT_HEADER_ACTIONS = [EditTheModelAction, ConfigureTheViewAction, DeleteAction$1];
2951
3023
  const Panels = () => {
2952
3024
  const isCloning = useMatch(CLONE_PATH) !== null;
@@ -3009,7 +3081,7 @@ const ActionsPanelContent = () => {
3009
3081
  DescriptionComponentRenderer,
3010
3082
  {
3011
3083
  props,
3012
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
3084
+ descriptions: plugins["content-manager"].apis.getDocumentActions("panel"),
3013
3085
  children: (actions2) => /* @__PURE__ */ jsx(DocumentActions, { actions: actions2 })
3014
3086
  }
3015
3087
  ),
@@ -3286,18 +3358,10 @@ const SelectedEntriesTableContent = ({
3286
3358
  search: row.locale && `?plugins[i18n][locale]=${row.locale}`
3287
3359
  },
3288
3360
  state: { from: pathname },
3289
- label: formatMessage(
3290
- { id: "app.component.HelperPluginTable.edit", defaultMessage: "Edit {target}" },
3291
- {
3292
- target: formatMessage(
3293
- {
3294
- id: "content-manager.components.ListViewHelperPluginTable.row-line",
3295
- defaultMessage: "item line {number}"
3296
- },
3297
- { number: index2 + 1 }
3298
- )
3299
- }
3300
- ),
3361
+ label: formatMessage({
3362
+ id: "content-manager.bulk-publish.edit",
3363
+ defaultMessage: "Edit"
3364
+ }),
3301
3365
  target: "_blank",
3302
3366
  marginLeft: "auto",
3303
3367
  variant: "ghost",
@@ -3471,8 +3535,7 @@ const PublishAction = ({ documents, model }) => {
3471
3535
  const refetchList = () => {
3472
3536
  contentManagerApi.util.invalidateTags([{ type: "Document", id: `${model}_LIST` }]);
3473
3537
  };
3474
- if (!showPublishButton)
3475
- return null;
3538
+ if (!showPublishButton) return null;
3476
3539
  return {
3477
3540
  actionType: "publish",
3478
3541
  variant: "tertiary",
@@ -3540,8 +3603,7 @@ const DeleteAction = ({ documents, model }) => {
3540
3603
  selectRow([]);
3541
3604
  }
3542
3605
  };
3543
- if (!hasDeletePermission)
3544
- return null;
3606
+ if (!hasDeletePermission) return null;
3545
3607
  return {
3546
3608
  variant: "danger-light",
3547
3609
  label: formatMessage({ id: "global.delete", defaultMessage: "Delete" }),
@@ -3590,8 +3652,7 @@ const UnpublishAction = ({ documents, model }) => {
3590
3652
  }
3591
3653
  };
3592
3654
  const showUnpublishButton = hasDraftAndPublishEnabled && hasPublishPermission && documents.some((entry) => entry.status === "published" || entry.status === "modified");
3593
- if (!showUnpublishButton)
3594
- return null;
3655
+ if (!showUnpublishButton) return null;
3595
3656
  return {
3596
3657
  variant: "tertiary",
3597
3658
  label: formatMessage({ id: "app.utils.unpublish", defaultMessage: "Unpublish" }),
@@ -3696,7 +3757,7 @@ const TableActions = ({ document }) => {
3696
3757
  DescriptionComponentRenderer,
3697
3758
  {
3698
3759
  props,
3699
- 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"),
3700
3761
  children: (actions2) => {
3701
3762
  const tableRowActions = actions2.filter((action) => {
3702
3763
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -3755,6 +3816,7 @@ const EditAction = ({ documentId }) => {
3755
3816
  };
3756
3817
  };
3757
3818
  EditAction.type = "edit";
3819
+ EditAction.position = "table-row";
3758
3820
  const StyledPencil = styled(Pencil)`
3759
3821
  path {
3760
3822
  fill: currentColor;
@@ -3831,6 +3893,7 @@ const CloneAction = ({ model, documentId }) => {
3831
3893
  };
3832
3894
  };
3833
3895
  CloneAction.type = "clone";
3896
+ CloneAction.position = "table-row";
3834
3897
  const StyledDuplicate = styled(Duplicate)`
3835
3898
  path {
3836
3899
  fill: currentColor;
@@ -3917,7 +3980,14 @@ class ContentManagerPlugin {
3917
3980
  addDocumentHeaderAction: this.addDocumentHeaderAction.bind(this),
3918
3981
  addEditViewSidePanel: this.addEditViewSidePanel.bind(this),
3919
3982
  getBulkActions: () => this.bulkActions,
3920
- 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
+ },
3921
3991
  getEditViewSidePanels: () => this.editViewSidePanels,
3922
3992
  getHeaderActions: () => this.headerActions
3923
3993
  }
@@ -3927,10 +3997,8 @@ class ContentManagerPlugin {
3927
3997
  const getPrintableType = (value) => {
3928
3998
  const nativeType = typeof value;
3929
3999
  if (nativeType === "object") {
3930
- if (value === null)
3931
- return "null";
3932
- if (Array.isArray(value))
3933
- return "array";
4000
+ if (value === null) return "null";
4001
+ if (Array.isArray(value)) return "array";
3934
4002
  if (value instanceof Object && value.constructor.name !== "Object") {
3935
4003
  return value.constructor.name;
3936
4004
  }
@@ -3941,17 +4009,27 @@ const HistoryAction = ({ model, document }) => {
3941
4009
  const { formatMessage } = useIntl();
3942
4010
  const [{ query }] = useQueryParams();
3943
4011
  const navigate = useNavigate();
4012
+ const { trackUsage } = useTracking();
4013
+ const { pathname } = useLocation();
3944
4014
  const pluginsQueryParams = stringify({ plugins: query.plugins }, { encode: false });
3945
4015
  if (!window.strapi.features.isEnabled("cms-content-history")) {
3946
4016
  return null;
3947
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
+ };
3948
4026
  return {
3949
4027
  icon: /* @__PURE__ */ jsx(ClockCounterClockwise, {}),
3950
4028
  label: formatMessage({
3951
4029
  id: "content-manager.history.document-action",
3952
4030
  defaultMessage: "Content History"
3953
4031
  }),
3954
- onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
4032
+ onClick: handleOnClick,
3955
4033
  disabled: (
3956
4034
  /**
3957
4035
  * The user is creating a new document.
@@ -3973,6 +4051,7 @@ const HistoryAction = ({ model, document }) => {
3973
4051
  };
3974
4052
  };
3975
4053
  HistoryAction.type = "history";
4054
+ HistoryAction.position = "header";
3976
4055
  const historyAdmin = {
3977
4056
  bootstrap(app) {
3978
4057
  const { addDocumentAction } = app.getPlugin("content-manager").apis;
@@ -4035,10 +4114,18 @@ const previewApi = contentManagerApi.injectEndpoints({
4035
4114
  })
4036
4115
  });
4037
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
+ };
4038
4123
  const PreviewSidePanel = ({ model, documentId, document }) => {
4039
4124
  const { formatMessage } = useIntl();
4040
4125
  const { trackUsage } = useTracking();
4126
+ const { pathname } = useLocation();
4041
4127
  const [{ query }] = useQueryParams();
4128
+ const isModified = useForm("PreviewSidePanel", (state) => state.modified);
4042
4129
  const { data, error } = useGetPreviewUrlQuery({
4043
4130
  params: {
4044
4131
  contentType: model
@@ -4052,33 +4139,43 @@ const PreviewSidePanel = ({ model, documentId, document }) => {
4052
4139
  if (!data?.data?.url || error) {
4053
4140
  return null;
4054
4141
  }
4055
- const handleClick = () => {
4056
- trackUsage("willOpenPreview");
4142
+ const trackNavigation = () => {
4143
+ const destinationPathname = pathname.replace(/\/$/, "") + "/preview";
4144
+ trackUsage("willNavigate", { from: pathname, to: destinationPathname });
4057
4145
  };
4058
4146
  return {
4059
4147
  title: formatMessage({ id: "content-manager.preview.panel.title", defaultMessage: "Preview" }),
4060
- content: /* @__PURE__ */ jsx(Flex, { gap: 2, width: "100%", children: /* @__PURE__ */ jsx(
4061
- Button,
4148
+ content: /* @__PURE__ */ jsx(
4149
+ ConditionalTooltip,
4062
4150
  {
4063
- variant: "tertiary",
4064
- tag: Link,
4065
- to: { pathname: "preview", search: stringify(query, { encode: false }) },
4066
- onClick: handleClick,
4067
- flex: "auto",
4068
- children: formatMessage({
4069
- id: "content-manager.preview.panel.button",
4070
- defaultMessage: "Open preview"
4071
- })
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
+ ) })
4072
4173
  }
4073
- ) })
4174
+ )
4074
4175
  };
4075
4176
  };
4076
- const FEATURE_ID = "preview";
4077
4177
  const previewAdmin = {
4078
4178
  bootstrap(app) {
4079
- if (!window.strapi.future.isEnabled(FEATURE_ID)) {
4080
- return;
4081
- }
4082
4179
  const contentManagerPluginApis = app.getPlugin("content-manager").apis;
4083
4180
  contentManagerPluginApis.addEditViewSidePanel([PreviewSidePanel]);
4084
4181
  }
@@ -4102,7 +4199,7 @@ const index = {
4102
4199
  app.router.addRoute({
4103
4200
  path: "content-manager/*",
4104
4201
  lazy: async () => {
4105
- const { Layout } = await import("./layout-Btu_cMRF.mjs");
4202
+ const { Layout } = await import("./layout-W3clJSCy.mjs");
4106
4203
  return {
4107
4204
  Component: Layout
4108
4205
  };
@@ -4122,7 +4219,7 @@ const index = {
4122
4219
  async registerTrads({ locales }) {
4123
4220
  const importedTrads = await Promise.all(
4124
4221
  locales.map((locale) => {
4125
- 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 }) => {
4126
4223
  return {
4127
4224
  data: prefixPluginTranslations(data, PLUGIN_ID),
4128
4225
  locale
@@ -4184,4 +4281,4 @@ export {
4184
4281
  capitalise as y,
4185
4282
  useUpdateContentTypeConfigurationMutation as z
4186
4283
  };
4187
- //# sourceMappingURL=index-CbytGVdz.mjs.map
4284
+ //# sourceMappingURL=index-DqasUQ6Q.mjs.map