@strapi/content-manager 0.0.0-experimental.62ce06180fe9a772eaeb3d43d238b26644f39f7c → 0.0.0-experimental.65ad956ae83ac65d866b9bb3e8c022c34b85468f

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 (127) hide show
  1. package/LICENSE +18 -3
  2. package/dist/_chunks/{ComponentConfigurationPage-DErJQEVW.mjs → ComponentConfigurationPage-CpBFh6_r.mjs} +3 -3
  3. package/dist/_chunks/{ComponentConfigurationPage-DErJQEVW.mjs.map → ComponentConfigurationPage-CpBFh6_r.mjs.map} +1 -1
  4. package/dist/_chunks/{ComponentConfigurationPage-Cl7eB3s4.js → ComponentConfigurationPage-_zF8p6CY.js} +3 -3
  5. package/dist/_chunks/{ComponentConfigurationPage-Cl7eB3s4.js.map → ComponentConfigurationPage-_zF8p6CY.js.map} +1 -1
  6. package/dist/_chunks/{EditConfigurationPage-CBosWqQ7.mjs → EditConfigurationPage-CE_yavTi.mjs} +3 -3
  7. package/dist/_chunks/{EditConfigurationPage-CBosWqQ7.mjs.map → EditConfigurationPage-CE_yavTi.mjs.map} +1 -1
  8. package/dist/_chunks/{EditConfigurationPage-CyfFvH6-.js → EditConfigurationPage-_aG2DJSU.js} +3 -3
  9. package/dist/_chunks/{EditConfigurationPage-CyfFvH6-.js.map → EditConfigurationPage-_aG2DJSU.js.map} +1 -1
  10. package/dist/_chunks/{EditViewPage-ClIueJnM.mjs → EditViewPage-DeTn7rAF.mjs} +19 -8
  11. package/dist/_chunks/EditViewPage-DeTn7rAF.mjs.map +1 -0
  12. package/dist/_chunks/{EditViewPage-DxyAOItK.js → EditViewPage-G9uNzwYL.js} +19 -8
  13. package/dist/_chunks/EditViewPage-G9uNzwYL.js.map +1 -0
  14. package/dist/_chunks/{Field-BZBYmvaf.mjs → Field-CnCKhI1R.mjs} +463 -143
  15. package/dist/_chunks/Field-CnCKhI1R.mjs.map +1 -0
  16. package/dist/_chunks/{Field-C0Y_SR9e.js → Field-DDHUWEfV.js} +465 -145
  17. package/dist/_chunks/Field-DDHUWEfV.js.map +1 -0
  18. package/dist/_chunks/{Form-DwvGnISS.js → Form-DYETaKUX.js} +35 -16
  19. package/dist/_chunks/Form-DYETaKUX.js.map +1 -0
  20. package/dist/_chunks/{Form-jwRSC2kV.mjs → Form-IvVVwqRL.mjs} +35 -16
  21. package/dist/_chunks/Form-IvVVwqRL.mjs.map +1 -0
  22. package/dist/_chunks/{History-BgzAIj0G.mjs → History-BMunT-do.mjs} +44 -19
  23. package/dist/_chunks/History-BMunT-do.mjs.map +1 -0
  24. package/dist/_chunks/{History-Cda0Yjzz.js → History-CnZDctSO.js} +44 -19
  25. package/dist/_chunks/History-CnZDctSO.js.map +1 -0
  26. package/dist/_chunks/{ListConfigurationPage-C29EF97r.js → ListConfigurationPage-BynalOp8.js} +20 -8
  27. package/dist/_chunks/ListConfigurationPage-BynalOp8.js.map +1 -0
  28. package/dist/_chunks/{ListConfigurationPage-GH55qfoT.mjs → ListConfigurationPage-CDqkCxgV.mjs} +20 -8
  29. package/dist/_chunks/ListConfigurationPage-CDqkCxgV.mjs.map +1 -0
  30. package/dist/_chunks/{ListViewPage-CnRt0UT7.js → ListViewPage-I88Ouzoq.js} +56 -42
  31. package/dist/_chunks/ListViewPage-I88Ouzoq.js.map +1 -0
  32. package/dist/_chunks/{ListViewPage-QU03PFj1.mjs → ListViewPage-_5gS-DOF.mjs} +54 -40
  33. package/dist/_chunks/ListViewPage-_5gS-DOF.mjs.map +1 -0
  34. package/dist/_chunks/{NoContentTypePage-DFDjxByI.js → NoContentTypePage-BaWQ7HsA.js} +2 -2
  35. package/dist/_chunks/{NoContentTypePage-DFDjxByI.js.map → NoContentTypePage-BaWQ7HsA.js.map} +1 -1
  36. package/dist/_chunks/{NoContentTypePage-CPs2CnzH.mjs → NoContentTypePage-Dht-55hr.mjs} +2 -2
  37. package/dist/_chunks/{NoContentTypePage-CPs2CnzH.mjs.map → NoContentTypePage-Dht-55hr.mjs.map} +1 -1
  38. package/dist/_chunks/{NoPermissionsPage-ct58lcY0.mjs → NoPermissionsPage-Bs8D5W_v.mjs} +2 -2
  39. package/dist/_chunks/{NoPermissionsPage-ct58lcY0.mjs.map → NoPermissionsPage-Bs8D5W_v.mjs.map} +1 -1
  40. package/dist/_chunks/{NoPermissionsPage-BVHI-jv5.js → NoPermissionsPage-DCVUh5at.js} +2 -2
  41. package/dist/_chunks/{NoPermissionsPage-BVHI-jv5.js.map → NoPermissionsPage-DCVUh5at.js.map} +1 -1
  42. package/dist/_chunks/{Relations-BjpPPCKp.js → Relations-BPgFQeGj.js} +4 -4
  43. package/dist/_chunks/Relations-BPgFQeGj.js.map +1 -0
  44. package/dist/_chunks/{Relations-KMf5qEN0.mjs → Relations-Chdt5qWc.mjs} +4 -4
  45. package/dist/_chunks/Relations-Chdt5qWc.mjs.map +1 -0
  46. package/dist/_chunks/{en-fbKQxLGn.js → en-BVzUkPxZ.js} +10 -8
  47. package/dist/_chunks/{en-fbKQxLGn.js.map → en-BVzUkPxZ.js.map} +1 -1
  48. package/dist/_chunks/{en-Ux26r5pl.mjs → en-CPTj6CjC.mjs} +10 -8
  49. package/dist/_chunks/{en-Ux26r5pl.mjs.map → en-CPTj6CjC.mjs.map} +1 -1
  50. package/dist/_chunks/{index-D9ZwczCV.js → index-BhbLFX4l.js} +440 -199
  51. package/dist/_chunks/index-BhbLFX4l.js.map +1 -0
  52. package/dist/_chunks/{index-6kKXK7y8.mjs → index-D4UGPFZC.mjs} +447 -206
  53. package/dist/_chunks/index-D4UGPFZC.mjs.map +1 -0
  54. package/dist/_chunks/{layout-BJfBoBiF.js → layout-CYA7s0qO.js} +25 -12
  55. package/dist/_chunks/layout-CYA7s0qO.js.map +1 -0
  56. package/dist/_chunks/{layout-B1Z-9koY.mjs → layout-D4HI4_PS.mjs} +27 -14
  57. package/dist/_chunks/layout-D4HI4_PS.mjs.map +1 -0
  58. package/dist/_chunks/{relations-CgZg7Pyx.mjs → relations-1pXaYpBK.mjs} +2 -2
  59. package/dist/_chunks/{relations-CgZg7Pyx.mjs.map → relations-1pXaYpBK.mjs.map} +1 -1
  60. package/dist/_chunks/{relations-CMvjzyU3.js → relations-DDZ9OxNo.js} +2 -2
  61. package/dist/_chunks/{relations-CMvjzyU3.js.map → relations-DDZ9OxNo.js.map} +1 -1
  62. package/dist/_chunks/{usePrev-B9w_-eYc.js → useDebounce-CtcjDB3L.js} +14 -1
  63. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -0
  64. package/dist/_chunks/useDebounce-DmuSJIF3.mjs +29 -0
  65. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -0
  66. package/dist/admin/index.js +1 -1
  67. package/dist/admin/index.mjs +1 -1
  68. package/dist/admin/src/history/index.d.ts +3 -0
  69. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  70. package/dist/admin/src/index.d.ts +1 -0
  71. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -0
  72. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +4 -0
  73. package/dist/admin/src/pages/EditView/components/FormInputs/Relations.d.ts +20 -0
  74. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  75. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +2 -2
  76. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +4 -48
  77. package/dist/admin/src/pages/EditView/components/Header.d.ts +10 -11
  78. package/dist/admin/src/services/api.d.ts +1 -1
  79. package/dist/admin/src/services/components.d.ts +2 -2
  80. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  81. package/dist/admin/src/services/documents.d.ts +19 -17
  82. package/dist/admin/src/services/init.d.ts +1 -1
  83. package/dist/admin/src/services/relations.d.ts +2 -2
  84. package/dist/admin/src/services/uid.d.ts +3 -3
  85. package/dist/admin/src/utils/validation.d.ts +4 -1
  86. package/dist/server/index.js +178 -105
  87. package/dist/server/index.js.map +1 -1
  88. package/dist/server/index.mjs +179 -106
  89. package/dist/server/index.mjs.map +1 -1
  90. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  91. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  92. package/dist/server/src/controllers/uid.d.ts.map +1 -1
  93. package/dist/server/src/controllers/validation/dimensions.d.ts +4 -2
  94. package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
  95. package/dist/server/src/history/services/history.d.ts.map +1 -1
  96. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  97. package/dist/server/src/history/services/utils.d.ts +2 -1
  98. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  99. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  100. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  101. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  102. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  103. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  104. package/dist/shared/contracts/collection-types.d.ts +3 -1
  105. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  106. package/package.json +9 -9
  107. package/dist/_chunks/EditViewPage-ClIueJnM.mjs.map +0 -1
  108. package/dist/_chunks/EditViewPage-DxyAOItK.js.map +0 -1
  109. package/dist/_chunks/Field-BZBYmvaf.mjs.map +0 -1
  110. package/dist/_chunks/Field-C0Y_SR9e.js.map +0 -1
  111. package/dist/_chunks/Form-DwvGnISS.js.map +0 -1
  112. package/dist/_chunks/Form-jwRSC2kV.mjs.map +0 -1
  113. package/dist/_chunks/History-BgzAIj0G.mjs.map +0 -1
  114. package/dist/_chunks/History-Cda0Yjzz.js.map +0 -1
  115. package/dist/_chunks/ListConfigurationPage-C29EF97r.js.map +0 -1
  116. package/dist/_chunks/ListConfigurationPage-GH55qfoT.mjs.map +0 -1
  117. package/dist/_chunks/ListViewPage-CnRt0UT7.js.map +0 -1
  118. package/dist/_chunks/ListViewPage-QU03PFj1.mjs.map +0 -1
  119. package/dist/_chunks/Relations-BjpPPCKp.js.map +0 -1
  120. package/dist/_chunks/Relations-KMf5qEN0.mjs.map +0 -1
  121. package/dist/_chunks/index-6kKXK7y8.mjs.map +0 -1
  122. package/dist/_chunks/index-D9ZwczCV.js.map +0 -1
  123. package/dist/_chunks/layout-B1Z-9koY.mjs.map +0 -1
  124. package/dist/_chunks/layout-BJfBoBiF.js.map +0 -1
  125. package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
  126. package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
  127. package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
@@ -2,15 +2,15 @@
2
2
  const Icons = require("@strapi/icons");
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const strapiAdmin = require("@strapi/admin/strapi-admin");
5
- const qs = require("qs");
6
- const reactIntl = require("react-intl");
7
- const reactRouterDom = require("react-router-dom");
8
5
  const React = require("react");
9
6
  const designSystem = require("@strapi/design-system");
10
- const styledComponents = require("styled-components");
7
+ const reactIntl = require("react-intl");
8
+ const reactRouterDom = require("react-router-dom");
11
9
  const yup = require("yup");
12
10
  const pipe = require("lodash/fp/pipe");
13
11
  const dateFns = require("date-fns");
12
+ const styledComponents = require("styled-components");
13
+ const qs = require("qs");
14
14
  const toolkit = require("@reduxjs/toolkit");
15
15
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
16
16
  function _interopNamespace(e) {
@@ -70,42 +70,6 @@ const useInjectionZone = (area) => {
70
70
  const [page, position] = area.split(".");
71
71
  return contentManagerPlugin.getInjectedComponents(page, position);
72
72
  };
73
- const HistoryAction = ({ model, document }) => {
74
- const { formatMessage } = reactIntl.useIntl();
75
- const [{ query }] = strapiAdmin.useQueryParams();
76
- const navigate = reactRouterDom.useNavigate();
77
- const pluginsQueryParams = qs.stringify({ plugins: query.plugins }, { encode: false });
78
- if (!window.strapi.features.isEnabled("cms-content-history")) {
79
- return null;
80
- }
81
- return {
82
- icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.ClockCounterClockwise, {}),
83
- label: formatMessage({
84
- id: "content-manager.history.document-action",
85
- defaultMessage: "Content History"
86
- }),
87
- onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
88
- disabled: (
89
- /**
90
- * The user is creating a new document.
91
- * It hasn't been saved yet, so there's no history to go to
92
- */
93
- !document || /**
94
- * The document has been created but the current dimension has never been saved.
95
- * For example, the user is creating a new locale in an existing document,
96
- * so there's no history for the document in that locale
97
- */
98
- !document.id || /**
99
- * History is only available for content types created by the user.
100
- * These have the `api::` prefix, as opposed to the ones created by Strapi or plugins,
101
- * which start with `admin::` or `plugin::`
102
- */
103
- !model.startsWith("api::")
104
- ),
105
- position: "header"
106
- };
107
- };
108
- HistoryAction.type = "history";
109
73
  const ID = "id";
110
74
  const CREATED_BY_ATTRIBUTE_NAME = "createdBy";
111
75
  const UPDATED_BY_ATTRIBUTE_NAME = "updatedBy";
@@ -216,8 +180,7 @@ const contentManagerApi = strapiAdmin.adminApi.enhanceEndpoints({
216
180
  "InitialData",
217
181
  "HistoryVersion",
218
182
  "Relations",
219
- "Release",
220
- "ReleaseAction"
183
+ "UidAvailability"
221
184
  ]
222
185
  });
223
186
  const documentApi = contentManagerApi.injectEndpoints({
@@ -231,7 +194,12 @@ const documentApi = contentManagerApi.injectEndpoints({
231
194
  params: query
232
195
  }
233
196
  }),
234
- invalidatesTags: (_result, _error, { model }) => [{ type: "Document", id: `${model}_LIST` }]
197
+ invalidatesTags: (_result, error, { model }) => {
198
+ if (error) {
199
+ return [];
200
+ }
201
+ return [{ type: "Document", id: `${model}_LIST` }];
202
+ }
235
203
  }),
236
204
  cloneDocument: builder.mutation({
237
205
  query: ({ model, sourceId, data, params }) => ({
@@ -242,7 +210,10 @@ const documentApi = contentManagerApi.injectEndpoints({
242
210
  params
243
211
  }
244
212
  }),
245
- invalidatesTags: (_result, _error, { model }) => [{ type: "Document", id: `${model}_LIST` }]
213
+ invalidatesTags: (_result, _error, { model }) => [
214
+ { type: "Document", id: `${model}_LIST` },
215
+ { type: "UidAvailability", id: model }
216
+ ]
246
217
  }),
247
218
  /**
248
219
  * Creates a new collection-type document. This should ONLY be used for collection-types.
@@ -259,7 +230,8 @@ const documentApi = contentManagerApi.injectEndpoints({
259
230
  }),
260
231
  invalidatesTags: (result, _error, { model }) => [
261
232
  { type: "Document", id: `${model}_LIST` },
262
- "Relations"
233
+ "Relations",
234
+ { type: "UidAvailability", id: model }
263
235
  ]
264
236
  }),
265
237
  deleteDocument: builder.mutation({
@@ -271,9 +243,7 @@ const documentApi = contentManagerApi.injectEndpoints({
271
243
  }
272
244
  }),
273
245
  invalidatesTags: (_result, _error, { collectionType, model }) => [
274
- { type: "Document", id: collectionType !== SINGLE_TYPES ? `${model}_LIST` : model },
275
- { type: "Release", id: "LIST" },
276
- { type: "ReleaseAction", id: "LIST" }
246
+ { type: "Document", id: collectionType !== SINGLE_TYPES ? `${model}_LIST` : model }
277
247
  ]
278
248
  }),
279
249
  deleteManyDocuments: builder.mutation({
@@ -285,11 +255,7 @@ const documentApi = contentManagerApi.injectEndpoints({
285
255
  params
286
256
  }
287
257
  }),
288
- invalidatesTags: (_res, _error, { model }) => [
289
- { type: "Document", id: `${model}_LIST` },
290
- { type: "Release", id: "LIST" },
291
- { type: "ReleaseAction", id: "LIST" }
292
- ]
258
+ invalidatesTags: (_res, _error, { model }) => [{ type: "Document", id: `${model}_LIST` }]
293
259
  }),
294
260
  discardDocument: builder.mutation({
295
261
  query: ({ collectionType, model, documentId, params }) => ({
@@ -307,8 +273,7 @@ const documentApi = contentManagerApi.injectEndpoints({
307
273
  },
308
274
  { type: "Document", id: `${model}_LIST` },
309
275
  "Relations",
310
- { type: "Release", id: "LIST" },
311
- { type: "ReleaseAction", id: "LIST" }
276
+ { type: "UidAvailability", id: model }
312
277
  ];
313
278
  }
314
279
  }),
@@ -326,6 +291,7 @@ const documentApi = contentManagerApi.injectEndpoints({
326
291
  }),
327
292
  providesTags: (result, _error, arg) => {
328
293
  return [
294
+ { type: "Document", id: `ALL_LIST` },
329
295
  { type: "Document", id: `${arg.model}_LIST` },
330
296
  ...result?.results.map(({ documentId }) => ({
331
297
  type: "Document",
@@ -364,6 +330,11 @@ const documentApi = contentManagerApi.injectEndpoints({
364
330
  {
365
331
  type: "Document",
366
332
  id: collectionType !== SINGLE_TYPES ? `${model}_${result && "documentId" in result ? result.documentId : documentId}` : model
333
+ },
334
+ // Make it easy to invalidate all individual documents queries for a model
335
+ {
336
+ type: "Document",
337
+ id: `${model}_ALL_ITEMS`
367
338
  }
368
339
  ];
369
340
  }
@@ -428,9 +399,20 @@ const documentApi = contentManagerApi.injectEndpoints({
428
399
  id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
429
400
  },
430
401
  "Relations",
431
- { type: "Release", id: "LIST" },
432
- { type: "ReleaseAction", id: "LIST" }
402
+ { type: "UidAvailability", id: model }
433
403
  ];
404
+ },
405
+ async onQueryStarted({ data, ...patch }, { dispatch, queryFulfilled }) {
406
+ const patchResult = dispatch(
407
+ documentApi.util.updateQueryData("getDocument", patch, (draft) => {
408
+ Object.assign(draft.data, data);
409
+ })
410
+ );
411
+ try {
412
+ await queryFulfilled;
413
+ } catch {
414
+ patchResult.undo();
415
+ }
434
416
  }
435
417
  }),
436
418
  unpublishDocument: builder.mutation({
@@ -500,7 +482,7 @@ const buildValidParams = (query) => {
500
482
  const isBaseQueryError = (error) => {
501
483
  return error.name !== void 0;
502
484
  };
503
- const createYupSchema = (attributes = {}, components = {}) => {
485
+ const createYupSchema = (attributes = {}, components = {}, options = { status: null }) => {
504
486
  const createModelSchema = (attributes2) => yup__namespace.object().shape(
505
487
  Object.entries(attributes2).reduce((acc, [name, attribute]) => {
506
488
  if (DOCUMENT_META_FIELDS.includes(name)) {
@@ -513,7 +495,7 @@ const createYupSchema = (attributes = {}, components = {}) => {
513
495
  addMinValidation,
514
496
  addMaxValidation,
515
497
  addRegexValidation
516
- ].map((fn) => fn(attribute));
498
+ ].map((fn) => fn(attribute, options));
517
499
  const transformSchema = pipe__default.default(...validations);
518
500
  switch (attribute.type) {
519
501
  case "component": {
@@ -614,6 +596,14 @@ const createAttributeSchema = (attribute) => {
614
596
  if (!value || typeof value === "string" && value.length === 0) {
615
597
  return true;
616
598
  }
599
+ if (typeof value === "object") {
600
+ try {
601
+ JSON.stringify(value);
602
+ return true;
603
+ } catch (err) {
604
+ return false;
605
+ }
606
+ }
617
607
  try {
618
608
  JSON.parse(value);
619
609
  return true;
@@ -632,13 +622,7 @@ const createAttributeSchema = (attribute) => {
632
622
  return yup__namespace.mixed();
633
623
  }
634
624
  };
635
- const addRequiredValidation = (attribute) => (schema) => {
636
- if (attribute.required) {
637
- return schema.required({
638
- id: strapiAdmin.translatedErrors.required.id,
639
- defaultMessage: "This field is required."
640
- });
641
- }
625
+ const nullableSchema = (schema) => {
642
626
  return schema?.nullable ? schema.nullable() : (
643
627
  // In some cases '.nullable' will not be available on the schema.
644
628
  // e.g. when the schema has been built using yup.lazy (e.g. for relations).
@@ -646,7 +630,22 @@ const addRequiredValidation = (attribute) => (schema) => {
646
630
  schema
647
631
  );
648
632
  };
649
- const addMinLengthValidation = (attribute) => (schema) => {
633
+ const addRequiredValidation = (attribute, options) => (schema) => {
634
+ if (options.status === "draft") {
635
+ return nullableSchema(schema);
636
+ }
637
+ if ((attribute.type === "component" && attribute.repeatable || attribute.type === "dynamiczone") && attribute.required && "min" in schema) {
638
+ return schema.min(1, strapiAdmin.translatedErrors.required);
639
+ }
640
+ if (attribute.required && attribute.type !== "relation") {
641
+ return schema.required(strapiAdmin.translatedErrors.required);
642
+ }
643
+ return nullableSchema(schema);
644
+ };
645
+ const addMinLengthValidation = (attribute, options) => (schema) => {
646
+ if (options.status === "draft") {
647
+ return schema;
648
+ }
650
649
  if ("minLength" in attribute && attribute.minLength && Number.isInteger(attribute.minLength) && "min" in schema) {
651
650
  return schema.min(attribute.minLength, {
652
651
  ...strapiAdmin.translatedErrors.minLength,
@@ -668,9 +667,31 @@ const addMaxLengthValidation = (attribute) => (schema) => {
668
667
  }
669
668
  return schema;
670
669
  };
671
- const addMinValidation = (attribute) => (schema) => {
670
+ const addMinValidation = (attribute, options) => (schema) => {
672
671
  if ("min" in attribute) {
673
672
  const min = toInteger(attribute.min);
673
+ if (attribute.type === "component" && attribute.repeatable || attribute.type === "dynamiczone") {
674
+ if (options.status !== "draft" && !attribute.required && "test" in schema && min) {
675
+ return schema.test(
676
+ "custom-min",
677
+ {
678
+ ...strapiAdmin.translatedErrors.min,
679
+ values: {
680
+ min: attribute.min
681
+ }
682
+ },
683
+ (value) => {
684
+ if (!value) {
685
+ return true;
686
+ }
687
+ if (Array.isArray(value) && value.length === 0) {
688
+ return true;
689
+ }
690
+ return value.length >= min;
691
+ }
692
+ );
693
+ }
694
+ }
674
695
  if ("min" in schema && min) {
675
696
  return schema.min(min, {
676
697
  ...strapiAdmin.translatedErrors.min,
@@ -797,7 +818,10 @@ const useDocument = (args, opts) => {
797
818
  isLoading: isLoadingDocument,
798
819
  isFetching: isFetchingDocument,
799
820
  error
800
- } = useGetDocumentQuery(args, opts);
821
+ } = useGetDocumentQuery(args, {
822
+ ...opts,
823
+ skip: !args.documentId && args.collectionType !== SINGLE_TYPES || opts?.skip
824
+ });
801
825
  const { components, schema, isLoading: isLoadingSchema } = useContentTypeSchema(args.model);
802
826
  React__namespace.useEffect(() => {
803
827
  if (error) {
@@ -883,6 +907,7 @@ const useDocumentActions = () => {
883
907
  const { formatMessage } = reactIntl.useIntl();
884
908
  const { trackUsage } = strapiAdmin.useTracking();
885
909
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
910
+ const navigate = reactRouterDom.useNavigate();
886
911
  const [deleteDocument] = useDeleteDocumentMutation();
887
912
  const _delete = React__namespace.useCallback(
888
913
  async ({ collectionType, model, documentId, params }, trackerProperty) => {
@@ -1218,7 +1243,6 @@ const useDocumentActions = () => {
1218
1243
  sourceId
1219
1244
  });
1220
1245
  if ("error" in res) {
1221
- toggleNotification({ type: "danger", message: formatAPIError(res.error) });
1222
1246
  return { error: res.error };
1223
1247
  }
1224
1248
  toggleNotification({
@@ -1237,7 +1261,7 @@ const useDocumentActions = () => {
1237
1261
  throw err;
1238
1262
  }
1239
1263
  },
1240
- [autoCloneDocument, formatAPIError, formatMessage, toggleNotification]
1264
+ [autoCloneDocument, formatMessage, toggleNotification]
1241
1265
  );
1242
1266
  const [cloneDocument] = useCloneDocumentMutation();
1243
1267
  const clone = React__namespace.useCallback(
@@ -1263,6 +1287,7 @@ const useDocumentActions = () => {
1263
1287
  defaultMessage: "Cloned document"
1264
1288
  })
1265
1289
  });
1290
+ navigate(`../../${res.data.data.documentId}`, { relative: "path" });
1266
1291
  return res.data;
1267
1292
  } catch (err) {
1268
1293
  toggleNotification({
@@ -1273,7 +1298,7 @@ const useDocumentActions = () => {
1273
1298
  throw err;
1274
1299
  }
1275
1300
  },
1276
- [cloneDocument, trackUsage, toggleNotification, formatMessage, formatAPIError]
1301
+ [cloneDocument, trackUsage, toggleNotification, formatMessage, formatAPIError, navigate]
1277
1302
  );
1278
1303
  const [getDoc] = useLazyGetDocumentQuery();
1279
1304
  const getDocument = React__namespace.useCallback(
@@ -1299,7 +1324,7 @@ const useDocumentActions = () => {
1299
1324
  };
1300
1325
  };
1301
1326
  const ProtectedHistoryPage = React.lazy(
1302
- () => Promise.resolve().then(() => require("./History-Cda0Yjzz.js")).then((mod) => ({ default: mod.ProtectedHistoryPage }))
1327
+ () => Promise.resolve().then(() => require("./History-CnZDctSO.js")).then((mod) => ({ default: mod.ProtectedHistoryPage }))
1303
1328
  );
1304
1329
  const routes$1 = [
1305
1330
  {
@@ -1312,31 +1337,31 @@ const routes$1 = [
1312
1337
  }
1313
1338
  ];
1314
1339
  const ProtectedEditViewPage = React.lazy(
1315
- () => Promise.resolve().then(() => require("./EditViewPage-DxyAOItK.js")).then((mod) => ({ default: mod.ProtectedEditViewPage }))
1340
+ () => Promise.resolve().then(() => require("./EditViewPage-G9uNzwYL.js")).then((mod) => ({ default: mod.ProtectedEditViewPage }))
1316
1341
  );
1317
1342
  const ProtectedListViewPage = React.lazy(
1318
- () => Promise.resolve().then(() => require("./ListViewPage-CnRt0UT7.js")).then((mod) => ({ default: mod.ProtectedListViewPage }))
1343
+ () => Promise.resolve().then(() => require("./ListViewPage-I88Ouzoq.js")).then((mod) => ({ default: mod.ProtectedListViewPage }))
1319
1344
  );
1320
1345
  const ProtectedListConfiguration = React.lazy(
1321
- () => Promise.resolve().then(() => require("./ListConfigurationPage-C29EF97r.js")).then((mod) => ({
1346
+ () => Promise.resolve().then(() => require("./ListConfigurationPage-BynalOp8.js")).then((mod) => ({
1322
1347
  default: mod.ProtectedListConfiguration
1323
1348
  }))
1324
1349
  );
1325
1350
  const ProtectedEditConfigurationPage = React.lazy(
1326
- () => Promise.resolve().then(() => require("./EditConfigurationPage-CyfFvH6-.js")).then((mod) => ({
1351
+ () => Promise.resolve().then(() => require("./EditConfigurationPage-_aG2DJSU.js")).then((mod) => ({
1327
1352
  default: mod.ProtectedEditConfigurationPage
1328
1353
  }))
1329
1354
  );
1330
1355
  const ProtectedComponentConfigurationPage = React.lazy(
1331
- () => Promise.resolve().then(() => require("./ComponentConfigurationPage-Cl7eB3s4.js")).then((mod) => ({
1356
+ () => Promise.resolve().then(() => require("./ComponentConfigurationPage-_zF8p6CY.js")).then((mod) => ({
1332
1357
  default: mod.ProtectedComponentConfigurationPage
1333
1358
  }))
1334
1359
  );
1335
1360
  const NoPermissions = React.lazy(
1336
- () => Promise.resolve().then(() => require("./NoPermissionsPage-BVHI-jv5.js")).then((mod) => ({ default: mod.NoPermissions }))
1361
+ () => Promise.resolve().then(() => require("./NoPermissionsPage-DCVUh5at.js")).then((mod) => ({ default: mod.NoPermissions }))
1337
1362
  );
1338
1363
  const NoContentType = React.lazy(
1339
- () => Promise.resolve().then(() => require("./NoContentTypePage-DFDjxByI.js")).then((mod) => ({ default: mod.NoContentType }))
1364
+ () => Promise.resolve().then(() => require("./NoContentTypePage-BaWQ7HsA.js")).then((mod) => ({ default: mod.NoContentType }))
1340
1365
  );
1341
1366
  const CollectionTypePages = () => {
1342
1367
  const { collectionType } = reactRouterDom.useParams();
@@ -1450,12 +1475,14 @@ const DocumentActionButton = (action) => {
1450
1475
  /* @__PURE__ */ jsxRuntime.jsx(
1451
1476
  designSystem.Button,
1452
1477
  {
1453
- flex: 1,
1478
+ flex: "auto",
1454
1479
  startIcon: action.icon,
1455
1480
  disabled: action.disabled,
1456
1481
  onClick: handleClick(action),
1457
1482
  justifyContent: "center",
1458
1483
  variant: action.variant || "default",
1484
+ paddingTop: "7px",
1485
+ paddingBottom: "7px",
1459
1486
  children: action.label
1460
1487
  }
1461
1488
  ),
@@ -1463,7 +1490,7 @@ const DocumentActionButton = (action) => {
1463
1490
  DocumentActionConfirmDialog,
1464
1491
  {
1465
1492
  ...action.dialog,
1466
- variant: action.variant,
1493
+ variant: action.dialog?.variant ?? action.variant,
1467
1494
  isOpen: dialogId === action.id,
1468
1495
  onClose: handleClose
1469
1496
  }
@@ -1520,9 +1547,9 @@ const DocumentActionsMenu = ({
1520
1547
  disabled: isDisabled,
1521
1548
  size: "S",
1522
1549
  endIcon: null,
1523
- paddingTop: "7px",
1524
- paddingLeft: "9px",
1525
- paddingRight: "9px",
1550
+ paddingTop: "4px",
1551
+ paddingLeft: "7px",
1552
+ paddingRight: "7px",
1526
1553
  variant,
1527
1554
  children: [
1528
1555
  /* @__PURE__ */ jsxRuntime.jsx(Icons.More, { "aria-hidden": true, focusable: false }),
@@ -1542,10 +1569,25 @@ const DocumentActionsMenu = ({
1542
1569
  onSelect: handleClick(action),
1543
1570
  display: "block",
1544
1571
  children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", gap: 4, children: [
1545
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { color: convertActionVariantToColor(action.variant), gap: 2, tag: "span", children: [
1546
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { tag: "span", color: convertActionVariantToIconColor(action.variant), children: action.icon }),
1547
- action.label
1548
- ] }),
1572
+ /* @__PURE__ */ jsxRuntime.jsxs(
1573
+ designSystem.Flex,
1574
+ {
1575
+ color: !action.disabled ? convertActionVariantToColor(action.variant) : "inherit",
1576
+ gap: 2,
1577
+ tag: "span",
1578
+ children: [
1579
+ /* @__PURE__ */ jsxRuntime.jsx(
1580
+ designSystem.Flex,
1581
+ {
1582
+ tag: "span",
1583
+ color: !action.disabled ? convertActionVariantToIconColor(action.variant) : "inherit",
1584
+ children: action.icon
1585
+ }
1586
+ ),
1587
+ action.label
1588
+ ]
1589
+ }
1590
+ ),
1549
1591
  action.id.startsWith("HistoryAction") && /* @__PURE__ */ jsxRuntime.jsx(
1550
1592
  designSystem.Flex,
1551
1593
  {
@@ -1642,11 +1684,11 @@ const DocumentActionConfirmDialog = ({
1642
1684
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: title }),
1643
1685
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Body, { children: content }),
1644
1686
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Footer, { children: [
1645
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Cancel, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", children: formatMessage({
1687
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Cancel, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", fullWidth: true, children: formatMessage({
1646
1688
  id: "app.components.Button.cancel",
1647
1689
  defaultMessage: "Cancel"
1648
1690
  }) }) }),
1649
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleConfirm, variant, children: formatMessage({
1691
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleConfirm, variant, fullWidth: true, children: formatMessage({
1650
1692
  id: "app.components.Button.confirm",
1651
1693
  defaultMessage: "Confirm"
1652
1694
  }) })
@@ -1685,13 +1727,17 @@ const PublishAction$1 = ({
1685
1727
  const navigate = reactRouterDom.useNavigate();
1686
1728
  const { toggleNotification } = strapiAdmin.useNotification();
1687
1729
  const { _unstableFormatValidationErrors: formatValidationErrors } = strapiAdmin.useAPIErrorHandler();
1730
+ const isListView = reactRouterDom.useMatch(LIST_PATH) !== null;
1688
1731
  const isCloning = reactRouterDom.useMatch(CLONE_PATH) !== null;
1689
1732
  const { formatMessage } = reactIntl.useIntl();
1690
- const { canPublish, canCreate, canUpdate } = useDocumentRBAC(
1691
- "PublishAction",
1692
- ({ canPublish: canPublish2, canCreate: canCreate2, canUpdate: canUpdate2 }) => ({ canPublish: canPublish2, canCreate: canCreate2, canUpdate: canUpdate2 })
1693
- );
1733
+ const canPublish = useDocumentRBAC("PublishAction", ({ canPublish: canPublish2 }) => canPublish2);
1694
1734
  const { publish } = useDocumentActions();
1735
+ const [
1736
+ countDraftRelations,
1737
+ { isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }
1738
+ ] = useLazyGetDraftRelationCountQuery();
1739
+ const [localCountOfDraftRelations, setLocalCountOfDraftRelations] = React__namespace.useState(0);
1740
+ const [serverCountOfDraftRelations, setServerCountOfDraftRelations] = React__namespace.useState(0);
1695
1741
  const [{ query, rawQuery }] = strapiAdmin.useQueryParams();
1696
1742
  const params = React__namespace.useMemo(() => buildValidParams(query), [query]);
1697
1743
  const modified = strapiAdmin.useForm("PublishAction", ({ modified: modified2 }) => modified2);
@@ -1700,10 +1746,103 @@ const PublishAction$1 = ({
1700
1746
  const validate = strapiAdmin.useForm("PublishAction", (state) => state.validate);
1701
1747
  const setErrors = strapiAdmin.useForm("PublishAction", (state) => state.setErrors);
1702
1748
  const formValues = strapiAdmin.useForm("PublishAction", ({ values }) => values);
1749
+ React__namespace.useEffect(() => {
1750
+ if (isErrorDraftRelations) {
1751
+ toggleNotification({
1752
+ type: "danger",
1753
+ message: formatMessage({
1754
+ id: getTranslation("error.records.fetch-draft-relatons"),
1755
+ defaultMessage: "An error occurred while fetching draft relations on this document."
1756
+ })
1757
+ });
1758
+ }
1759
+ }, [isErrorDraftRelations, toggleNotification, formatMessage]);
1760
+ React__namespace.useEffect(() => {
1761
+ const localDraftRelations = /* @__PURE__ */ new Set();
1762
+ const extractDraftRelations = (data) => {
1763
+ const relations = data.connect || [];
1764
+ relations.forEach((relation) => {
1765
+ if (relation.status === "draft") {
1766
+ localDraftRelations.add(relation.id);
1767
+ }
1768
+ });
1769
+ };
1770
+ const traverseAndExtract = (data) => {
1771
+ Object.entries(data).forEach(([key, value]) => {
1772
+ if (key === "connect" && Array.isArray(value)) {
1773
+ extractDraftRelations({ connect: value });
1774
+ } else if (typeof value === "object" && value !== null) {
1775
+ traverseAndExtract(value);
1776
+ }
1777
+ });
1778
+ };
1779
+ if (!documentId || modified) {
1780
+ traverseAndExtract(formValues);
1781
+ setLocalCountOfDraftRelations(localDraftRelations.size);
1782
+ }
1783
+ }, [documentId, modified, formValues, setLocalCountOfDraftRelations]);
1784
+ React__namespace.useEffect(() => {
1785
+ if (!document || !document.documentId || isListView) {
1786
+ return;
1787
+ }
1788
+ const fetchDraftRelationsCount = async () => {
1789
+ const { data, error } = await countDraftRelations({
1790
+ collectionType,
1791
+ model,
1792
+ documentId,
1793
+ params
1794
+ });
1795
+ if (error) {
1796
+ throw error;
1797
+ }
1798
+ if (data) {
1799
+ setServerCountOfDraftRelations(data.data);
1800
+ }
1801
+ };
1802
+ fetchDraftRelationsCount();
1803
+ }, [isListView, document, documentId, countDraftRelations, collectionType, model, params]);
1703
1804
  const isDocumentPublished = (document?.[PUBLISHED_AT_ATTRIBUTE_NAME] || meta?.availableStatus.some((doc) => doc[PUBLISHED_AT_ATTRIBUTE_NAME] !== null)) && document?.status !== "modified";
1704
1805
  if (!schema?.options?.draftAndPublish) {
1705
1806
  return null;
1706
1807
  }
1808
+ const performPublish = async () => {
1809
+ setSubmitting(true);
1810
+ try {
1811
+ const { errors } = await validate();
1812
+ if (errors) {
1813
+ toggleNotification({
1814
+ type: "danger",
1815
+ message: formatMessage({
1816
+ id: "content-manager.validation.error",
1817
+ defaultMessage: "There are validation errors in your document. Please fix them before saving."
1818
+ })
1819
+ });
1820
+ return;
1821
+ }
1822
+ const res = await publish(
1823
+ {
1824
+ collectionType,
1825
+ model,
1826
+ documentId,
1827
+ params
1828
+ },
1829
+ formValues
1830
+ );
1831
+ if ("data" in res && collectionType !== SINGLE_TYPES) {
1832
+ navigate({
1833
+ pathname: `../${collectionType}/${model}/${res.data.documentId}`,
1834
+ search: rawQuery
1835
+ });
1836
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1837
+ setErrors(formatValidationErrors(res.error));
1838
+ }
1839
+ } finally {
1840
+ setSubmitting(false);
1841
+ }
1842
+ };
1843
+ const totalDraftRelations = localCountOfDraftRelations + serverCountOfDraftRelations;
1844
+ const enableDraftRelationsCount = false;
1845
+ const hasDraftRelations = enableDraftRelationsCount;
1707
1846
  return {
1708
1847
  /**
1709
1848
  * Disabled when:
@@ -1713,49 +1852,36 @@ const PublishAction$1 = ({
1713
1852
  * - the document is already published & not modified
1714
1853
  * - the document is being created & not modified
1715
1854
  * - the user doesn't have the permission to publish
1716
- * - the user doesn't have the permission to create a new document
1717
- * - the user doesn't have the permission to update the document
1718
1855
  */
1719
- disabled: isCloning || isSubmitting || activeTab === "published" || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish || Boolean(!document?.documentId && !canCreate || document?.documentId && !canUpdate),
1856
+ disabled: isCloning || isSubmitting || isLoadingDraftRelations || activeTab === "published" || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish,
1720
1857
  label: formatMessage({
1721
1858
  id: "app.utils.publish",
1722
1859
  defaultMessage: "Publish"
1723
1860
  }),
1724
1861
  onClick: async () => {
1725
- setSubmitting(true);
1726
- try {
1727
- const { errors } = await validate();
1728
- if (errors) {
1729
- toggleNotification({
1730
- type: "danger",
1731
- message: formatMessage({
1732
- id: "content-manager.validation.error",
1733
- defaultMessage: "There are validation errors in your document. Please fix them before saving."
1734
- })
1735
- });
1736
- return;
1737
- }
1738
- const res = await publish(
1739
- {
1740
- collectionType,
1741
- model,
1742
- documentId,
1743
- params
1744
- },
1745
- formValues
1746
- );
1747
- if ("data" in res && collectionType !== SINGLE_TYPES) {
1748
- navigate({
1749
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
1750
- search: rawQuery
1751
- });
1752
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1753
- setErrors(formatValidationErrors(res.error));
1862
+ await performPublish();
1863
+ },
1864
+ dialog: hasDraftRelations ? {
1865
+ type: "dialog",
1866
+ variant: "danger",
1867
+ footer: null,
1868
+ title: formatMessage({
1869
+ id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.title`),
1870
+ defaultMessage: "Confirmation"
1871
+ }),
1872
+ content: formatMessage(
1873
+ {
1874
+ id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.message`),
1875
+ defaultMessage: "This entry is related to {count, plural, one {# draft entry} other {# draft entries}}. Publishing it could leave broken links in your app."
1876
+ },
1877
+ {
1878
+ count: totalDraftRelations
1754
1879
  }
1755
- } finally {
1756
- setSubmitting(false);
1880
+ ),
1881
+ onConfirm: async () => {
1882
+ await performPublish();
1757
1883
  }
1758
- }
1884
+ } : void 0
1759
1885
  };
1760
1886
  };
1761
1887
  PublishAction$1.type = "publish";
@@ -1771,10 +1897,6 @@ const UpdateAction = ({
1771
1897
  const cloneMatch = reactRouterDom.useMatch(CLONE_PATH);
1772
1898
  const isCloning = cloneMatch !== null;
1773
1899
  const { formatMessage } = reactIntl.useIntl();
1774
- const { canCreate, canUpdate } = useDocumentRBAC("UpdateAction", ({ canCreate: canCreate2, canUpdate: canUpdate2 }) => ({
1775
- canCreate: canCreate2,
1776
- canUpdate: canUpdate2
1777
- }));
1778
1900
  const { create, update, clone } = useDocumentActions();
1779
1901
  const [{ query, rawQuery }] = strapiAdmin.useQueryParams();
1780
1902
  const params = React__namespace.useMemo(() => buildValidParams(query), [query]);
@@ -1791,10 +1913,8 @@ const UpdateAction = ({
1791
1913
  * - the form is submitting
1792
1914
  * - the document is not modified & we're not cloning (you can save a clone entity straight away)
1793
1915
  * - the active tab is the published tab
1794
- * - the user doesn't have the permission to create a new document
1795
- * - the user doesn't have the permission to update the document
1796
1916
  */
1797
- disabled: isSubmitting || !modified && !isCloning || activeTab === "published" || Boolean(!documentId && !canCreate || documentId && !canUpdate),
1917
+ disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
1798
1918
  label: formatMessage({
1799
1919
  id: "content-manager.containers.Edit.save",
1800
1920
  defaultMessage: "Save"
@@ -1802,16 +1922,18 @@ const UpdateAction = ({
1802
1922
  onClick: async () => {
1803
1923
  setSubmitting(true);
1804
1924
  try {
1805
- const { errors } = await validate();
1806
- if (errors) {
1807
- toggleNotification({
1808
- type: "danger",
1809
- message: formatMessage({
1810
- id: "content-manager.validation.error",
1811
- defaultMessage: "There are validation errors in your document. Please fix them before saving."
1812
- })
1813
- });
1814
- return;
1925
+ if (activeTab !== "draft") {
1926
+ const { errors } = await validate();
1927
+ if (errors) {
1928
+ toggleNotification({
1929
+ type: "danger",
1930
+ message: formatMessage({
1931
+ id: "content-manager.validation.error",
1932
+ defaultMessage: "There are validation errors in your document. Please fix them before saving."
1933
+ })
1934
+ });
1935
+ return;
1936
+ }
1815
1937
  }
1816
1938
  if (isCloning) {
1817
1939
  const res = await clone(
@@ -1823,10 +1945,13 @@ const UpdateAction = ({
1823
1945
  document
1824
1946
  );
1825
1947
  if ("data" in res) {
1826
- navigate({
1827
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
1828
- search: rawQuery
1829
- });
1948
+ navigate(
1949
+ {
1950
+ pathname: `../${res.data.documentId}`,
1951
+ search: rawQuery
1952
+ },
1953
+ { relative: "path" }
1954
+ );
1830
1955
  } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1831
1956
  setErrors(formatValidationErrors(res.error));
1832
1957
  }
@@ -1854,10 +1979,13 @@ const UpdateAction = ({
1854
1979
  document
1855
1980
  );
1856
1981
  if ("data" in res && collectionType !== SINGLE_TYPES) {
1857
- navigate({
1858
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
1859
- search: rawQuery
1860
- });
1982
+ navigate(
1983
+ {
1984
+ pathname: `../${res.data.documentId}`,
1985
+ search: rawQuery
1986
+ },
1987
+ { replace: true, relative: "path" }
1988
+ );
1861
1989
  } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1862
1990
  setErrors(formatValidationErrors(res.error));
1863
1991
  }
@@ -1901,7 +2029,7 @@ const UnpublishAction$1 = ({
1901
2029
  id: "app.utils.unpublish",
1902
2030
  defaultMessage: "Unpublish"
1903
2031
  }),
1904
- icon: /* @__PURE__ */ jsxRuntime.jsx(StyledCrossCircle, {}),
2032
+ icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Cross, {}),
1905
2033
  onClick: async () => {
1906
2034
  if (!documentId && collectionType !== SINGLE_TYPES || isDocumentModified) {
1907
2035
  if (!documentId) {
@@ -2013,7 +2141,7 @@ const DiscardAction = ({
2013
2141
  id: "content-manager.actions.discard.label",
2014
2142
  defaultMessage: "Discard changes"
2015
2143
  }),
2016
- icon: /* @__PURE__ */ jsxRuntime.jsx(StyledCrossCircle, {}),
2144
+ icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Cross, {}),
2017
2145
  position: ["panel", "table-row"],
2018
2146
  variant: "danger",
2019
2147
  dialog: {
@@ -2041,11 +2169,6 @@ const DiscardAction = ({
2041
2169
  };
2042
2170
  };
2043
2171
  DiscardAction.type = "discard";
2044
- const StyledCrossCircle = styledComponents.styled(Icons.CrossCircle)`
2045
- path {
2046
- fill: currentColor;
2047
- }
2048
- `;
2049
2172
  const DEFAULT_ACTIONS = [PublishAction$1, UpdateAction, UnpublishAction$1, DiscardAction];
2050
2173
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
2051
2174
  const RelativeTime = React__namespace.forwardRef(
@@ -2093,7 +2216,7 @@ const getDisplayName = ({
2093
2216
  };
2094
2217
  const capitalise = (str) => str.charAt(0).toUpperCase() + str.slice(1);
2095
2218
  const DocumentStatus = ({ status = "draft", ...restProps }) => {
2096
- const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
2219
+ const statusVariant = status === "draft" ? "secondary" : status === "published" ? "success" : "alternative";
2097
2220
  return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Status, { ...restProps, showBullet: false, size: "S", variant: statusVariant, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "omega", fontWeight: "bold", children: capitalise(status) }) });
2098
2221
  };
2099
2222
  const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
@@ -2103,23 +2226,13 @@ const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
2103
2226
  id: "content-manager.containers.edit.title.new",
2104
2227
  defaultMessage: "Create an entry"
2105
2228
  }) : documentTitle;
2106
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "flex-start", paddingTop: 8, paddingBottom: 4, gap: 3, children: [
2229
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "flex-start", paddingTop: 6, paddingBottom: 4, gap: 2, children: [
2107
2230
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.BackButton, {}),
2108
- /* @__PURE__ */ jsxRuntime.jsxs(
2109
- designSystem.Flex,
2110
- {
2111
- width: "100%",
2112
- justifyContent: "space-between",
2113
- paddingTop: 1,
2114
- gap: "80px",
2115
- alignItems: "flex-start",
2116
- children: [
2117
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "alpha", tag: "h1", children: title }),
2118
- /* @__PURE__ */ jsxRuntime.jsx(HeaderToolbar, {})
2119
- ]
2120
- }
2121
- ),
2122
- status ? /* @__PURE__ */ jsxRuntime.jsx(DocumentStatus, { status: isCloning ? "draft" : status }) : null
2231
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", justifyContent: "space-between", gap: "80px", alignItems: "flex-start", children: [
2232
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "alpha", tag: "h1", children: title }),
2233
+ /* @__PURE__ */ jsxRuntime.jsx(HeaderToolbar, {})
2234
+ ] }),
2235
+ status ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 1, children: /* @__PURE__ */ jsxRuntime.jsx(DocumentStatus, { status: isCloning ? "draft" : status }) }) : null
2123
2236
  ] });
2124
2237
  };
2125
2238
  const HeaderToolbar = () => {
@@ -2286,8 +2399,22 @@ const Information = ({ activeTab }) => {
2286
2399
  );
2287
2400
  };
2288
2401
  const HeaderActions = ({ actions: actions2 }) => {
2289
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: actions2.map((action) => {
2290
- if ("options" in action) {
2402
+ const [dialogId, setDialogId] = React__namespace.useState(null);
2403
+ const handleClick = (action) => async (e) => {
2404
+ if (!("options" in action)) {
2405
+ const { onClick = () => false, dialog, id } = action;
2406
+ const muteDialog = await onClick(e);
2407
+ if (dialog && !muteDialog) {
2408
+ e.preventDefault();
2409
+ setDialogId(id);
2410
+ }
2411
+ }
2412
+ };
2413
+ const handleClose = () => {
2414
+ setDialogId(null);
2415
+ };
2416
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { gap: 1, children: actions2.map((action) => {
2417
+ if (action.options) {
2291
2418
  return /* @__PURE__ */ jsxRuntime.jsx(
2292
2419
  designSystem.SingleSelect,
2293
2420
  {
@@ -2301,10 +2428,49 @@ const HeaderActions = ({ actions: actions2 }) => {
2301
2428
  action.id
2302
2429
  );
2303
2430
  } else {
2304
- return null;
2431
+ if (action.type === "icon") {
2432
+ return /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
2433
+ /* @__PURE__ */ jsxRuntime.jsx(
2434
+ designSystem.IconButton,
2435
+ {
2436
+ disabled: action.disabled,
2437
+ label: action.label,
2438
+ size: "S",
2439
+ onClick: handleClick(action),
2440
+ children: action.icon
2441
+ }
2442
+ ),
2443
+ action.dialog ? /* @__PURE__ */ jsxRuntime.jsx(
2444
+ HeaderActionDialog,
2445
+ {
2446
+ ...action.dialog,
2447
+ isOpen: dialogId === action.id,
2448
+ onClose: handleClose
2449
+ }
2450
+ ) : null
2451
+ ] }, action.id);
2452
+ }
2305
2453
  }
2306
2454
  }) });
2307
2455
  };
2456
+ const HeaderActionDialog = ({
2457
+ onClose,
2458
+ onCancel,
2459
+ title,
2460
+ content: Content,
2461
+ isOpen
2462
+ }) => {
2463
+ const handleClose = async () => {
2464
+ if (onCancel) {
2465
+ await onCancel();
2466
+ }
2467
+ onClose();
2468
+ };
2469
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, { open: isOpen, onOpenChange: handleClose, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
2470
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: title }),
2471
+ typeof Content === "function" ? /* @__PURE__ */ jsxRuntime.jsx(Content, { onClose: handleClose }) : Content
2472
+ ] }) });
2473
+ };
2308
2474
  const ConfigureTheViewAction = ({ collectionType, model }) => {
2309
2475
  const navigate = reactRouterDom.useNavigate();
2310
2476
  const { formatMessage } = reactIntl.useIntl();
@@ -2440,7 +2606,7 @@ const ActionsPanel = () => {
2440
2606
  return {
2441
2607
  title: formatMessage({
2442
2608
  id: "content-manager.containers.edit.panels.default.title",
2443
- defaultMessage: "Document"
2609
+ defaultMessage: "Entry"
2444
2610
  }),
2445
2611
  content: /* @__PURE__ */ jsxRuntime.jsx(ActionsPanelContent, {})
2446
2612
  };
@@ -2684,7 +2850,8 @@ const formatEditLayout = (data, {
2684
2850
  layout: convertEditLayoutToFieldLayouts(
2685
2851
  configuration.layouts.edit,
2686
2852
  components[uid].attributes,
2687
- configuration.metadatas
2853
+ configuration.metadatas,
2854
+ { configurations: data.components, schemas: components }
2688
2855
  ),
2689
2856
  settings: {
2690
2857
  ...configuration.settings,
@@ -2810,7 +2977,7 @@ const ConfirmBulkActionDialog = ({
2810
2977
  endAction
2811
2978
  }) => {
2812
2979
  const { formatMessage } = reactIntl.useIntl();
2813
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, { onOpenChange: onToggleDialog, open: isOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
2980
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, { open: isOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
2814
2981
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: formatMessage({
2815
2982
  id: "app.components.ConfirmDialog.title",
2816
2983
  defaultMessage: "Confirmation"
@@ -2841,6 +3008,7 @@ const ConfirmDialogPublishAll = ({
2841
3008
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler(getTranslation);
2842
3009
  const { model, schema } = useDoc();
2843
3010
  const [{ query }] = strapiAdmin.useQueryParams();
3011
+ const enableDraftRelationsCount = false;
2844
3012
  const {
2845
3013
  data: countDraftRelations = 0,
2846
3014
  isLoading,
@@ -2852,7 +3020,7 @@ const ConfirmDialogPublishAll = ({
2852
3020
  locale: query?.plugins?.i18n?.locale
2853
3021
  },
2854
3022
  {
2855
- skip: selectedEntries.length === 0
3023
+ skip: !enableDraftRelationsCount
2856
3024
  }
2857
3025
  );
2858
3026
  React__namespace.useEffect(() => {
@@ -2931,7 +3099,14 @@ const formatErrorMessages = (errors, parentKey, formatMessage) => {
2931
3099
  )
2932
3100
  );
2933
3101
  } else {
2934
- messages.push(...formatErrorMessages(value, currentKey, formatMessage));
3102
+ messages.push(
3103
+ ...formatErrorMessages(
3104
+ // @ts-expect-error TODO: check why value is not compatible with FormErrors
3105
+ value,
3106
+ currentKey,
3107
+ formatMessage
3108
+ )
3109
+ );
2935
3110
  }
2936
3111
  } else {
2937
3112
  messages.push(
@@ -3030,7 +3205,7 @@ const SelectedEntriesTableContent = ({
3030
3205
  status: row.status
3031
3206
  }
3032
3207
  ) }),
3033
- /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(
3208
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(
3034
3209
  designSystem.IconButton,
3035
3210
  {
3036
3211
  tag: reactRouterDom.Link,
@@ -3053,9 +3228,10 @@ const SelectedEntriesTableContent = ({
3053
3228
  ),
3054
3229
  target: "_blank",
3055
3230
  marginLeft: "auto",
3056
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Pencil, {})
3231
+ variant: "ghost",
3232
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Pencil, { width: "1.6rem", height: "1.6rem" })
3057
3233
  }
3058
- ) })
3234
+ ) }) })
3059
3235
  ] }, row.id)) })
3060
3236
  ] });
3061
3237
  };
@@ -3092,7 +3268,13 @@ const SelectedEntriesModalContent = ({
3092
3268
  );
3093
3269
  const { rows, validationErrors } = React__namespace.useMemo(() => {
3094
3270
  if (data.length > 0 && schema) {
3095
- const validate = createYupSchema(schema.attributes, components);
3271
+ const validate = createYupSchema(
3272
+ schema.attributes,
3273
+ components,
3274
+ // Since this is the "Publish" action, the validation
3275
+ // schema must enforce the rules for published entities
3276
+ { status: "published" }
3277
+ );
3096
3278
  const validationErrors2 = {};
3097
3279
  const rows2 = data.map((entry) => {
3098
3280
  try {
@@ -3442,7 +3624,7 @@ const TableActions = ({ document }) => {
3442
3624
  strapiAdmin.DescriptionComponentRenderer,
3443
3625
  {
3444
3626
  props,
3445
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
3627
+ descriptions: plugins["content-manager"].apis.getDocumentActions().filter((action) => action.name !== "PublishAction"),
3446
3628
  children: (actions2) => {
3447
3629
  const tableRowActions = actions2.filter((action) => {
3448
3630
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -3553,7 +3735,7 @@ const CloneAction = ({ model, documentId }) => {
3553
3735
  }),
3554
3736
  content: /* @__PURE__ */ jsxRuntime.jsx(AutoCloneFailureModalBody, { prohibitedFields }),
3555
3737
  footer: ({ onClose }) => {
3556
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", children: [
3738
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Footer, { children: [
3557
3739
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: onClose, variant: "tertiary", children: formatMessage({
3558
3740
  id: "cancel",
3559
3741
  defaultMessage: "Cancel"
@@ -3594,8 +3776,7 @@ class ContentManagerPlugin {
3594
3776
  documentActions = [
3595
3777
  ...DEFAULT_ACTIONS,
3596
3778
  ...DEFAULT_TABLE_ROW_ACTIONS,
3597
- ...DEFAULT_HEADER_ACTIONS,
3598
- HistoryAction
3779
+ ...DEFAULT_HEADER_ACTIONS
3599
3780
  ];
3600
3781
  editViewSidePanels = [ActionsPanel];
3601
3782
  headerActions = [];
@@ -3684,6 +3865,52 @@ const getPrintableType = (value) => {
3684
3865
  }
3685
3866
  return nativeType;
3686
3867
  };
3868
+ const HistoryAction = ({ model, document }) => {
3869
+ const { formatMessage } = reactIntl.useIntl();
3870
+ const [{ query }] = strapiAdmin.useQueryParams();
3871
+ const navigate = reactRouterDom.useNavigate();
3872
+ const pluginsQueryParams = qs.stringify({ plugins: query.plugins }, { encode: false });
3873
+ if (!window.strapi.features.isEnabled("cms-content-history")) {
3874
+ return null;
3875
+ }
3876
+ return {
3877
+ icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.ClockCounterClockwise, {}),
3878
+ label: formatMessage({
3879
+ id: "content-manager.history.document-action",
3880
+ defaultMessage: "Content History"
3881
+ }),
3882
+ onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
3883
+ disabled: (
3884
+ /**
3885
+ * The user is creating a new document.
3886
+ * It hasn't been saved yet, so there's no history to go to
3887
+ */
3888
+ !document || /**
3889
+ * The document has been created but the current dimension has never been saved.
3890
+ * For example, the user is creating a new locale in an existing document,
3891
+ * so there's no history for the document in that locale
3892
+ */
3893
+ !document.id || /**
3894
+ * History is only available for content types created by the user.
3895
+ * These have the `api::` prefix, as opposed to the ones created by Strapi or plugins,
3896
+ * which start with `admin::` or `plugin::`
3897
+ */
3898
+ !model.startsWith("api::")
3899
+ ),
3900
+ position: "header"
3901
+ };
3902
+ };
3903
+ HistoryAction.type = "history";
3904
+ const historyAdmin = {
3905
+ bootstrap(app) {
3906
+ const { addDocumentAction } = app.getPlugin("content-manager").apis;
3907
+ addDocumentAction((actions2) => {
3908
+ const indexOfDeleteAction = actions2.findIndex((action) => action.type === "delete");
3909
+ actions2.splice(indexOfDeleteAction, 0, HistoryAction);
3910
+ return actions2;
3911
+ });
3912
+ }
3913
+ };
3687
3914
  const initialState = {
3688
3915
  collectionTypeLinks: [],
3689
3916
  components: [],
@@ -3734,15 +3961,29 @@ const index = {
3734
3961
  defaultMessage: "Content Manager"
3735
3962
  },
3736
3963
  permissions: [],
3737
- Component: () => Promise.resolve().then(() => require("./layout-BJfBoBiF.js")).then((mod) => ({ default: mod.Layout })),
3738
3964
  position: 1
3739
3965
  });
3966
+ app.router.addRoute({
3967
+ path: "content-manager/*",
3968
+ lazy: async () => {
3969
+ const { Layout } = await Promise.resolve().then(() => require("./layout-CYA7s0qO.js"));
3970
+ return {
3971
+ Component: Layout
3972
+ };
3973
+ },
3974
+ children: routes
3975
+ });
3740
3976
  app.registerPlugin(cm.config);
3741
3977
  },
3978
+ bootstrap(app) {
3979
+ if (typeof historyAdmin.bootstrap === "function") {
3980
+ historyAdmin.bootstrap(app);
3981
+ }
3982
+ },
3742
3983
  async registerTrads({ locales }) {
3743
3984
  const importedTrads = await Promise.all(
3744
3985
  locales.map((locale) => {
3745
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/ar.json": () => Promise.resolve().then(() => require("./ar-BUUWXIYu.js")), "./translations/ca.json": () => Promise.resolve().then(() => require("./ca-Cmk45QO6.js")), "./translations/cs.json": () => Promise.resolve().then(() => require("./cs-CkJy6B2v.js")), "./translations/de.json": () => Promise.resolve().then(() => require("./de-CCEmbAah.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-fbKQxLGn.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-EUonQTon.js")), "./translations/eu.json": () => Promise.resolve().then(() => require("./eu-VDH-3ovk.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-B7kGGg3E.js")), "./translations/gu.json": () => Promise.resolve().then(() => require("./gu-BRmF601H.js")), "./translations/hi.json": () => Promise.resolve().then(() => require("./hi-CCJBptSq.js")), "./translations/hu.json": () => Promise.resolve().then(() => require("./hu-sNV_yLYy.js")), "./translations/id.json": () => Promise.resolve().then(() => require("./id-B5Ser98A.js")), "./translations/it.json": () => Promise.resolve().then(() => require("./it-DkBIs7vD.js")), "./translations/ja.json": () => Promise.resolve().then(() => require("./ja-CcFe8diO.js")), "./translations/ko.json": () => Promise.resolve().then(() => require("./ko-woFZPmLk.js")), "./translations/ml.json": () => Promise.resolve().then(() => require("./ml-C2W8N8k1.js")), "./translations/ms.json": () => Promise.resolve().then(() => require("./ms-BuFotyP_.js")), "./translations/nl.json": () => Promise.resolve().then(() => require("./nl-bbEOHChV.js")), "./translations/pl.json": () => Promise.resolve().then(() => require("./pl-uzwG-hk7.js")), "./translations/pt-BR.json": () => Promise.resolve().then(() => require("./pt-BR-BiOz37D9.js")), "./translations/pt.json": () => Promise.resolve().then(() => require("./pt-CeXQuq50.js")), "./translations/ru.json": () => Promise.resolve().then(() => require("./ru-BT3ybNny.js")), "./translations/sa.json": () => Promise.resolve().then(() => require("./sa-CcvkYInH.js")), "./translations/sk.json": () => Promise.resolve().then(() => require("./sk-CvY09Xjv.js")), "./translations/sv.json": () => Promise.resolve().then(() => require("./sv-MYDuzgvT.js")), "./translations/th.json": () => Promise.resolve().then(() => require("./th-D9_GfAjc.js")), "./translations/tr.json": () => Promise.resolve().then(() => require("./tr-D9UH-O_R.js")), "./translations/uk.json": () => Promise.resolve().then(() => require("./uk-C8EiqJY7.js")), "./translations/vi.json": () => Promise.resolve().then(() => require("./vi-CJlYDheJ.js")), "./translations/zh-Hans.json": () => Promise.resolve().then(() => require("./zh-Hans-9kOncHGw.js")), "./translations/zh.json": () => Promise.resolve().then(() => require("./zh-CQQfszqR.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
3986
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/ar.json": () => Promise.resolve().then(() => require("./ar-BUUWXIYu.js")), "./translations/ca.json": () => Promise.resolve().then(() => require("./ca-Cmk45QO6.js")), "./translations/cs.json": () => Promise.resolve().then(() => require("./cs-CkJy6B2v.js")), "./translations/de.json": () => Promise.resolve().then(() => require("./de-CCEmbAah.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-BVzUkPxZ.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-EUonQTon.js")), "./translations/eu.json": () => Promise.resolve().then(() => require("./eu-VDH-3ovk.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-B7kGGg3E.js")), "./translations/gu.json": () => Promise.resolve().then(() => require("./gu-BRmF601H.js")), "./translations/hi.json": () => Promise.resolve().then(() => require("./hi-CCJBptSq.js")), "./translations/hu.json": () => Promise.resolve().then(() => require("./hu-sNV_yLYy.js")), "./translations/id.json": () => Promise.resolve().then(() => require("./id-B5Ser98A.js")), "./translations/it.json": () => Promise.resolve().then(() => require("./it-DkBIs7vD.js")), "./translations/ja.json": () => Promise.resolve().then(() => require("./ja-CcFe8diO.js")), "./translations/ko.json": () => Promise.resolve().then(() => require("./ko-woFZPmLk.js")), "./translations/ml.json": () => Promise.resolve().then(() => require("./ml-C2W8N8k1.js")), "./translations/ms.json": () => Promise.resolve().then(() => require("./ms-BuFotyP_.js")), "./translations/nl.json": () => Promise.resolve().then(() => require("./nl-bbEOHChV.js")), "./translations/pl.json": () => Promise.resolve().then(() => require("./pl-uzwG-hk7.js")), "./translations/pt-BR.json": () => Promise.resolve().then(() => require("./pt-BR-BiOz37D9.js")), "./translations/pt.json": () => Promise.resolve().then(() => require("./pt-CeXQuq50.js")), "./translations/ru.json": () => Promise.resolve().then(() => require("./ru-BT3ybNny.js")), "./translations/sa.json": () => Promise.resolve().then(() => require("./sa-CcvkYInH.js")), "./translations/sk.json": () => Promise.resolve().then(() => require("./sk-CvY09Xjv.js")), "./translations/sv.json": () => Promise.resolve().then(() => require("./sv-MYDuzgvT.js")), "./translations/th.json": () => Promise.resolve().then(() => require("./th-D9_GfAjc.js")), "./translations/tr.json": () => Promise.resolve().then(() => require("./tr-D9UH-O_R.js")), "./translations/uk.json": () => Promise.resolve().then(() => require("./uk-C8EiqJY7.js")), "./translations/vi.json": () => Promise.resolve().then(() => require("./vi-CJlYDheJ.js")), "./translations/zh-Hans.json": () => Promise.resolve().then(() => require("./zh-Hans-9kOncHGw.js")), "./translations/zh.json": () => Promise.resolve().then(() => require("./zh-CQQfszqR.js")) }), `./translations/${locale}.json`).then(({ default: data }) => {
3746
3987
  return {
3747
3988
  data: prefixPluginTranslations(data, PLUGIN_ID),
3748
3989
  locale
@@ -3760,6 +4001,7 @@ const index = {
3760
4001
  };
3761
4002
  exports.ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD = ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD;
3762
4003
  exports.BulkActionsRenderer = BulkActionsRenderer;
4004
+ exports.CLONE_PATH = CLONE_PATH;
3763
4005
  exports.COLLECTION_TYPES = COLLECTION_TYPES;
3764
4006
  exports.CREATOR_FIELDS = CREATOR_FIELDS;
3765
4007
  exports.DEFAULT_SETTINGS = DEFAULT_SETTINGS;
@@ -3786,7 +4028,6 @@ exports.getDisplayName = getDisplayName;
3786
4028
  exports.getMainField = getMainField;
3787
4029
  exports.getTranslation = getTranslation;
3788
4030
  exports.index = index;
3789
- exports.routes = routes;
3790
4031
  exports.setInitialData = setInitialData;
3791
4032
  exports.useContentTypeSchema = useContentTypeSchema;
3792
4033
  exports.useDoc = useDoc;
@@ -3800,4 +4041,4 @@ exports.useGetAllDocumentsQuery = useGetAllDocumentsQuery;
3800
4041
  exports.useGetContentTypeConfigurationQuery = useGetContentTypeConfigurationQuery;
3801
4042
  exports.useGetInitialDataQuery = useGetInitialDataQuery;
3802
4043
  exports.useUpdateContentTypeConfigurationMutation = useUpdateContentTypeConfigurationMutation;
3803
- //# sourceMappingURL=index-D9ZwczCV.js.map
4044
+ //# sourceMappingURL=index-BhbLFX4l.js.map