@strapi/content-manager 0.0.0-experimental.2a7cb5ff33df35e8ccde5ef918f9f9a4a3ee9a08 → 0.0.0-experimental.312e2942332daff7ae98a4f357d1913a4ae5e1ef

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 (126) hide show
  1. package/LICENSE +18 -3
  2. package/dist/_chunks/{ComponentConfigurationPage-BvHtG7uH.js → ComponentConfigurationPage-BfOUhLa9.js} +3 -3
  3. package/dist/_chunks/{ComponentConfigurationPage-BvHtG7uH.js.map → ComponentConfigurationPage-BfOUhLa9.js.map} +1 -1
  4. package/dist/_chunks/{ComponentConfigurationPage-DHNM3YBz.mjs → ComponentConfigurationPage-DgDrdk-k.mjs} +3 -3
  5. package/dist/_chunks/{ComponentConfigurationPage-DHNM3YBz.mjs.map → ComponentConfigurationPage-DgDrdk-k.mjs.map} +1 -1
  6. package/dist/_chunks/{EditConfigurationPage-DOmfCEMo.js → EditConfigurationPage-BcXQLYY9.js} +3 -3
  7. package/dist/_chunks/{EditConfigurationPage-DOmfCEMo.js.map → EditConfigurationPage-BcXQLYY9.js.map} +1 -1
  8. package/dist/_chunks/{EditConfigurationPage-Cp6HAEzN.mjs → EditConfigurationPage-CjV1kPAw.mjs} +3 -3
  9. package/dist/_chunks/{EditConfigurationPage-Cp6HAEzN.mjs.map → EditConfigurationPage-CjV1kPAw.mjs.map} +1 -1
  10. package/dist/_chunks/{EditViewPage-BqNpC6hO.js → EditViewPage-BOeuvemd.js} +19 -8
  11. package/dist/_chunks/EditViewPage-BOeuvemd.js.map +1 -0
  12. package/dist/_chunks/{EditViewPage-BtkEx339.mjs → EditViewPage-s_bjnR0M.mjs} +19 -8
  13. package/dist/_chunks/EditViewPage-s_bjnR0M.mjs.map +1 -0
  14. package/dist/_chunks/{Field-lsPFnAmH.js → Field-CvfOxLel.js} +196 -143
  15. package/dist/_chunks/Field-CvfOxLel.js.map +1 -0
  16. package/dist/_chunks/{Field-R5NbffTB.mjs → Field-D9nHkdjy.mjs} +194 -141
  17. package/dist/_chunks/Field-D9nHkdjy.mjs.map +1 -0
  18. package/dist/_chunks/{Form-CcGboku8.js → Form-BKnDhP2B.js} +35 -16
  19. package/dist/_chunks/Form-BKnDhP2B.js.map +1 -0
  20. package/dist/_chunks/{Form-BHmXSfyy.mjs → Form-G4C35wJ4.mjs} +35 -16
  21. package/dist/_chunks/Form-G4C35wJ4.mjs.map +1 -0
  22. package/dist/_chunks/{History-Bsud8jwh.js → History-BIYOzHws.js} +28 -18
  23. package/dist/_chunks/History-BIYOzHws.js.map +1 -0
  24. package/dist/_chunks/{History-ByUPL3T3.mjs → History-FWwaCNUD.mjs} +28 -18
  25. package/dist/_chunks/History-FWwaCNUD.mjs.map +1 -0
  26. package/dist/_chunks/{ListConfigurationPage-Bm5HACXf.mjs → ListConfigurationPage-BbOp66T2.mjs} +20 -8
  27. package/dist/_chunks/ListConfigurationPage-BbOp66T2.mjs.map +1 -0
  28. package/dist/_chunks/{ListConfigurationPage-DiT463qx.js → ListConfigurationPage-N7prXhOp.js} +20 -8
  29. package/dist/_chunks/ListConfigurationPage-N7prXhOp.js.map +1 -0
  30. package/dist/_chunks/{ListViewPage-JSyNAAYu.mjs → ListViewPage-DTSW3r3X.mjs} +46 -37
  31. package/dist/_chunks/ListViewPage-DTSW3r3X.mjs.map +1 -0
  32. package/dist/_chunks/{ListViewPage-CsrC9L_d.js → ListViewPage-Djc5M_c0.js} +48 -39
  33. package/dist/_chunks/ListViewPage-Djc5M_c0.js.map +1 -0
  34. package/dist/_chunks/{NoContentTypePage-CsrQUpBE.mjs → NoContentTypePage-A-6Pk0le.mjs} +2 -2
  35. package/dist/_chunks/{NoContentTypePage-CsrQUpBE.mjs.map → NoContentTypePage-A-6Pk0le.mjs.map} +1 -1
  36. package/dist/_chunks/{NoContentTypePage-Bsvng4II.js → NoContentTypePage-DCX-hEMB.js} +2 -2
  37. package/dist/_chunks/{NoContentTypePage-Bsvng4II.js.map → NoContentTypePage-DCX-hEMB.js.map} +1 -1
  38. package/dist/_chunks/{NoPermissionsPage-DNmf_pj0.mjs → NoPermissionsPage-B0vWytDx.mjs} +2 -2
  39. package/dist/_chunks/{NoPermissionsPage-DNmf_pj0.mjs.map → NoPermissionsPage-B0vWytDx.mjs.map} +1 -1
  40. package/dist/_chunks/{NoPermissionsPage-CdHNJtEf.js → NoPermissionsPage-PfJfspJV.js} +2 -2
  41. package/dist/_chunks/{NoPermissionsPage-CdHNJtEf.js.map → NoPermissionsPage-PfJfspJV.js.map} +1 -1
  42. package/dist/_chunks/{Relations-CghaPv2D.js → Relations--9jwQ8HV.js} +4 -4
  43. package/dist/_chunks/Relations--9jwQ8HV.js.map +1 -0
  44. package/dist/_chunks/{Relations-u8-37jK0.mjs → Relations-Ccdfw1dU.mjs} +4 -4
  45. package/dist/_chunks/Relations-Ccdfw1dU.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-CaE6NG4a.mjs → index-BwqXeHiv.mjs} +439 -205
  51. package/dist/_chunks/index-BwqXeHiv.mjs.map +1 -0
  52. package/dist/_chunks/{index-BOZx6IMg.js → index-jun-ZqyN.js} +420 -186
  53. package/dist/_chunks/index-jun-ZqyN.js.map +1 -0
  54. package/dist/_chunks/{layout-Bx7svTbY.mjs → layout-BV5oiZQ9.mjs} +23 -10
  55. package/dist/_chunks/layout-BV5oiZQ9.mjs.map +1 -0
  56. package/dist/_chunks/{layout-Ciz224q5.js → layout-T2xBqmuZ.js} +22 -9
  57. package/dist/_chunks/layout-T2xBqmuZ.js.map +1 -0
  58. package/dist/_chunks/{relations-CP8sB2YZ.js → relations-D8jegO_8.js} +2 -2
  59. package/dist/_chunks/{relations-CP8sB2YZ.js.map → relations-D8jegO_8.js.map} +1 -1
  60. package/dist/_chunks/{relations-Cxc1cEv3.mjs → relations-wAeF76DP.mjs} +2 -2
  61. package/dist/_chunks/{relations-Cxc1cEv3.mjs.map → relations-wAeF76DP.mjs.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 +4 -4
  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/Relations.d.ts +20 -0
  73. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +2 -2
  74. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygFooter.d.ts +2 -2
  75. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +4 -48
  76. package/dist/admin/src/pages/EditView/components/Header.d.ts +10 -11
  77. package/dist/admin/src/services/api.d.ts +1 -1
  78. package/dist/admin/src/services/components.d.ts +2 -2
  79. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  80. package/dist/admin/src/services/documents.d.ts +19 -17
  81. package/dist/admin/src/services/init.d.ts +1 -1
  82. package/dist/admin/src/services/relations.d.ts +2 -2
  83. package/dist/admin/src/services/uid.d.ts +3 -3
  84. package/dist/admin/src/utils/validation.d.ts +4 -1
  85. package/dist/server/index.js +177 -107
  86. package/dist/server/index.js.map +1 -1
  87. package/dist/server/index.mjs +178 -108
  88. package/dist/server/index.mjs.map +1 -1
  89. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  90. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  91. package/dist/server/src/controllers/uid.d.ts.map +1 -1
  92. package/dist/server/src/controllers/validation/dimensions.d.ts +4 -2
  93. package/dist/server/src/controllers/validation/dimensions.d.ts.map +1 -1
  94. package/dist/server/src/history/services/history.d.ts.map +1 -1
  95. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  96. package/dist/server/src/history/services/utils.d.ts +2 -1
  97. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  98. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  99. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  100. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  101. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  102. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  103. package/dist/shared/contracts/collection-types.d.ts +3 -1
  104. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  105. package/package.json +9 -9
  106. package/dist/_chunks/EditViewPage-BqNpC6hO.js.map +0 -1
  107. package/dist/_chunks/EditViewPage-BtkEx339.mjs.map +0 -1
  108. package/dist/_chunks/Field-R5NbffTB.mjs.map +0 -1
  109. package/dist/_chunks/Field-lsPFnAmH.js.map +0 -1
  110. package/dist/_chunks/Form-BHmXSfyy.mjs.map +0 -1
  111. package/dist/_chunks/Form-CcGboku8.js.map +0 -1
  112. package/dist/_chunks/History-Bsud8jwh.js.map +0 -1
  113. package/dist/_chunks/History-ByUPL3T3.mjs.map +0 -1
  114. package/dist/_chunks/ListConfigurationPage-Bm5HACXf.mjs.map +0 -1
  115. package/dist/_chunks/ListConfigurationPage-DiT463qx.js.map +0 -1
  116. package/dist/_chunks/ListViewPage-CsrC9L_d.js.map +0 -1
  117. package/dist/_chunks/ListViewPage-JSyNAAYu.mjs.map +0 -1
  118. package/dist/_chunks/Relations-CghaPv2D.js.map +0 -1
  119. package/dist/_chunks/Relations-u8-37jK0.mjs.map +0 -1
  120. package/dist/_chunks/index-BOZx6IMg.js.map +0 -1
  121. package/dist/_chunks/index-CaE6NG4a.mjs.map +0 -1
  122. package/dist/_chunks/layout-Bx7svTbY.mjs.map +0 -1
  123. package/dist/_chunks/layout-Ciz224q5.js.map +0 -1
  124. package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
  125. package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
  126. 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";
@@ -215,7 +179,8 @@ const contentManagerApi = strapiAdmin.adminApi.enhanceEndpoints({
215
179
  "Document",
216
180
  "InitialData",
217
181
  "HistoryVersion",
218
- "Relations"
182
+ "Relations",
183
+ "UidAvailability"
219
184
  ]
220
185
  });
221
186
  const documentApi = contentManagerApi.injectEndpoints({
@@ -229,7 +194,12 @@ const documentApi = contentManagerApi.injectEndpoints({
229
194
  params: query
230
195
  }
231
196
  }),
232
- 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
+ }
233
203
  }),
234
204
  cloneDocument: builder.mutation({
235
205
  query: ({ model, sourceId, data, params }) => ({
@@ -240,7 +210,10 @@ const documentApi = contentManagerApi.injectEndpoints({
240
210
  params
241
211
  }
242
212
  }),
243
- 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
+ ]
244
217
  }),
245
218
  /**
246
219
  * Creates a new collection-type document. This should ONLY be used for collection-types.
@@ -257,7 +230,8 @@ const documentApi = contentManagerApi.injectEndpoints({
257
230
  }),
258
231
  invalidatesTags: (result, _error, { model }) => [
259
232
  { type: "Document", id: `${model}_LIST` },
260
- "Relations"
233
+ "Relations",
234
+ { type: "UidAvailability", id: model }
261
235
  ]
262
236
  }),
263
237
  deleteDocument: builder.mutation({
@@ -298,7 +272,8 @@ const documentApi = contentManagerApi.injectEndpoints({
298
272
  id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
299
273
  },
300
274
  { type: "Document", id: `${model}_LIST` },
301
- "Relations"
275
+ "Relations",
276
+ { type: "UidAvailability", id: model }
302
277
  ];
303
278
  }
304
279
  }),
@@ -316,6 +291,7 @@ const documentApi = contentManagerApi.injectEndpoints({
316
291
  }),
317
292
  providesTags: (result, _error, arg) => {
318
293
  return [
294
+ { type: "Document", id: `ALL_LIST` },
319
295
  { type: "Document", id: `${arg.model}_LIST` },
320
296
  ...result?.results.map(({ documentId }) => ({
321
297
  type: "Document",
@@ -354,6 +330,11 @@ const documentApi = contentManagerApi.injectEndpoints({
354
330
  {
355
331
  type: "Document",
356
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`
357
338
  }
358
339
  ];
359
340
  }
@@ -417,8 +398,21 @@ const documentApi = contentManagerApi.injectEndpoints({
417
398
  type: "Document",
418
399
  id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
419
400
  },
420
- "Relations"
401
+ "Relations",
402
+ { type: "UidAvailability", id: model }
421
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
+ }
422
416
  }
423
417
  }),
424
418
  unpublishDocument: builder.mutation({
@@ -488,7 +482,7 @@ const buildValidParams = (query) => {
488
482
  const isBaseQueryError = (error) => {
489
483
  return error.name !== void 0;
490
484
  };
491
- const createYupSchema = (attributes = {}, components = {}) => {
485
+ const createYupSchema = (attributes = {}, components = {}, options = { status: null }) => {
492
486
  const createModelSchema = (attributes2) => yup__namespace.object().shape(
493
487
  Object.entries(attributes2).reduce((acc, [name, attribute]) => {
494
488
  if (DOCUMENT_META_FIELDS.includes(name)) {
@@ -501,7 +495,7 @@ const createYupSchema = (attributes = {}, components = {}) => {
501
495
  addMinValidation,
502
496
  addMaxValidation,
503
497
  addRegexValidation
504
- ].map((fn) => fn(attribute));
498
+ ].map((fn) => fn(attribute, options));
505
499
  const transformSchema = pipe__default.default(...validations);
506
500
  switch (attribute.type) {
507
501
  case "component": {
@@ -602,6 +596,14 @@ const createAttributeSchema = (attribute) => {
602
596
  if (!value || typeof value === "string" && value.length === 0) {
603
597
  return true;
604
598
  }
599
+ if (typeof value === "object") {
600
+ try {
601
+ JSON.stringify(value);
602
+ return true;
603
+ } catch (err) {
604
+ return false;
605
+ }
606
+ }
605
607
  try {
606
608
  JSON.parse(value);
607
609
  return true;
@@ -620,13 +622,7 @@ const createAttributeSchema = (attribute) => {
620
622
  return yup__namespace.mixed();
621
623
  }
622
624
  };
623
- const addRequiredValidation = (attribute) => (schema) => {
624
- if (attribute.required && attribute.type !== "relation") {
625
- return schema.required({
626
- id: strapiAdmin.translatedErrors.required.id,
627
- defaultMessage: "This field is required."
628
- });
629
- }
625
+ const nullableSchema = (schema) => {
630
626
  return schema?.nullable ? schema.nullable() : (
631
627
  // In some cases '.nullable' will not be available on the schema.
632
628
  // e.g. when the schema has been built using yup.lazy (e.g. for relations).
@@ -634,7 +630,22 @@ const addRequiredValidation = (attribute) => (schema) => {
634
630
  schema
635
631
  );
636
632
  };
637
- 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
+ }
638
649
  if ("minLength" in attribute && attribute.minLength && Number.isInteger(attribute.minLength) && "min" in schema) {
639
650
  return schema.min(attribute.minLength, {
640
651
  ...strapiAdmin.translatedErrors.minLength,
@@ -656,9 +667,31 @@ const addMaxLengthValidation = (attribute) => (schema) => {
656
667
  }
657
668
  return schema;
658
669
  };
659
- const addMinValidation = (attribute) => (schema) => {
670
+ const addMinValidation = (attribute, options) => (schema) => {
660
671
  if ("min" in attribute) {
661
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
+ }
662
695
  if ("min" in schema && min) {
663
696
  return schema.min(min, {
664
697
  ...strapiAdmin.translatedErrors.min,
@@ -874,6 +907,8 @@ const useDocumentActions = () => {
874
907
  const { formatMessage } = reactIntl.useIntl();
875
908
  const { trackUsage } = strapiAdmin.useTracking();
876
909
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
910
+ const navigate = reactRouterDom.useNavigate();
911
+ const setCurrentStep = strapiAdmin.useGuidedTour("useDocumentActions", (state) => state.setCurrentStep);
877
912
  const [deleteDocument] = useDeleteDocumentMutation();
878
913
  const _delete = React__namespace.useCallback(
879
914
  async ({ collectionType, model, documentId, params }, trackerProperty) => {
@@ -1188,6 +1223,7 @@ const useDocumentActions = () => {
1188
1223
  defaultMessage: "Saved document"
1189
1224
  })
1190
1225
  });
1226
+ setCurrentStep("contentManager.success");
1191
1227
  return res.data;
1192
1228
  } catch (err) {
1193
1229
  toggleNotification({
@@ -1209,7 +1245,6 @@ const useDocumentActions = () => {
1209
1245
  sourceId
1210
1246
  });
1211
1247
  if ("error" in res) {
1212
- toggleNotification({ type: "danger", message: formatAPIError(res.error) });
1213
1248
  return { error: res.error };
1214
1249
  }
1215
1250
  toggleNotification({
@@ -1228,7 +1263,7 @@ const useDocumentActions = () => {
1228
1263
  throw err;
1229
1264
  }
1230
1265
  },
1231
- [autoCloneDocument, formatAPIError, formatMessage, toggleNotification]
1266
+ [autoCloneDocument, formatMessage, toggleNotification]
1232
1267
  );
1233
1268
  const [cloneDocument] = useCloneDocumentMutation();
1234
1269
  const clone = React__namespace.useCallback(
@@ -1254,6 +1289,7 @@ const useDocumentActions = () => {
1254
1289
  defaultMessage: "Cloned document"
1255
1290
  })
1256
1291
  });
1292
+ navigate(`../../${res.data.data.documentId}`, { relative: "path" });
1257
1293
  return res.data;
1258
1294
  } catch (err) {
1259
1295
  toggleNotification({
@@ -1264,7 +1300,7 @@ const useDocumentActions = () => {
1264
1300
  throw err;
1265
1301
  }
1266
1302
  },
1267
- [cloneDocument, trackUsage, toggleNotification, formatMessage, formatAPIError]
1303
+ [cloneDocument, trackUsage, toggleNotification, formatMessage, formatAPIError, navigate]
1268
1304
  );
1269
1305
  const [getDoc] = useLazyGetDocumentQuery();
1270
1306
  const getDocument = React__namespace.useCallback(
@@ -1290,7 +1326,7 @@ const useDocumentActions = () => {
1290
1326
  };
1291
1327
  };
1292
1328
  const ProtectedHistoryPage = React.lazy(
1293
- () => Promise.resolve().then(() => require("./History-Bsud8jwh.js")).then((mod) => ({ default: mod.ProtectedHistoryPage }))
1329
+ () => Promise.resolve().then(() => require("./History-BIYOzHws.js")).then((mod) => ({ default: mod.ProtectedHistoryPage }))
1294
1330
  );
1295
1331
  const routes$1 = [
1296
1332
  {
@@ -1303,31 +1339,31 @@ const routes$1 = [
1303
1339
  }
1304
1340
  ];
1305
1341
  const ProtectedEditViewPage = React.lazy(
1306
- () => Promise.resolve().then(() => require("./EditViewPage-BqNpC6hO.js")).then((mod) => ({ default: mod.ProtectedEditViewPage }))
1342
+ () => Promise.resolve().then(() => require("./EditViewPage-BOeuvemd.js")).then((mod) => ({ default: mod.ProtectedEditViewPage }))
1307
1343
  );
1308
1344
  const ProtectedListViewPage = React.lazy(
1309
- () => Promise.resolve().then(() => require("./ListViewPage-CsrC9L_d.js")).then((mod) => ({ default: mod.ProtectedListViewPage }))
1345
+ () => Promise.resolve().then(() => require("./ListViewPage-Djc5M_c0.js")).then((mod) => ({ default: mod.ProtectedListViewPage }))
1310
1346
  );
1311
1347
  const ProtectedListConfiguration = React.lazy(
1312
- () => Promise.resolve().then(() => require("./ListConfigurationPage-DiT463qx.js")).then((mod) => ({
1348
+ () => Promise.resolve().then(() => require("./ListConfigurationPage-N7prXhOp.js")).then((mod) => ({
1313
1349
  default: mod.ProtectedListConfiguration
1314
1350
  }))
1315
1351
  );
1316
1352
  const ProtectedEditConfigurationPage = React.lazy(
1317
- () => Promise.resolve().then(() => require("./EditConfigurationPage-DOmfCEMo.js")).then((mod) => ({
1353
+ () => Promise.resolve().then(() => require("./EditConfigurationPage-BcXQLYY9.js")).then((mod) => ({
1318
1354
  default: mod.ProtectedEditConfigurationPage
1319
1355
  }))
1320
1356
  );
1321
1357
  const ProtectedComponentConfigurationPage = React.lazy(
1322
- () => Promise.resolve().then(() => require("./ComponentConfigurationPage-BvHtG7uH.js")).then((mod) => ({
1358
+ () => Promise.resolve().then(() => require("./ComponentConfigurationPage-BfOUhLa9.js")).then((mod) => ({
1323
1359
  default: mod.ProtectedComponentConfigurationPage
1324
1360
  }))
1325
1361
  );
1326
1362
  const NoPermissions = React.lazy(
1327
- () => Promise.resolve().then(() => require("./NoPermissionsPage-CdHNJtEf.js")).then((mod) => ({ default: mod.NoPermissions }))
1363
+ () => Promise.resolve().then(() => require("./NoPermissionsPage-PfJfspJV.js")).then((mod) => ({ default: mod.NoPermissions }))
1328
1364
  );
1329
1365
  const NoContentType = React.lazy(
1330
- () => Promise.resolve().then(() => require("./NoContentTypePage-Bsvng4II.js")).then((mod) => ({ default: mod.NoContentType }))
1366
+ () => Promise.resolve().then(() => require("./NoContentTypePage-DCX-hEMB.js")).then((mod) => ({ default: mod.NoContentType }))
1331
1367
  );
1332
1368
  const CollectionTypePages = () => {
1333
1369
  const { collectionType } = reactRouterDom.useParams();
@@ -1441,12 +1477,14 @@ const DocumentActionButton = (action) => {
1441
1477
  /* @__PURE__ */ jsxRuntime.jsx(
1442
1478
  designSystem.Button,
1443
1479
  {
1444
- flex: 1,
1480
+ flex: "auto",
1445
1481
  startIcon: action.icon,
1446
1482
  disabled: action.disabled,
1447
1483
  onClick: handleClick(action),
1448
1484
  justifyContent: "center",
1449
1485
  variant: action.variant || "default",
1486
+ paddingTop: "7px",
1487
+ paddingBottom: "7px",
1450
1488
  children: action.label
1451
1489
  }
1452
1490
  ),
@@ -1454,7 +1492,7 @@ const DocumentActionButton = (action) => {
1454
1492
  DocumentActionConfirmDialog,
1455
1493
  {
1456
1494
  ...action.dialog,
1457
- variant: action.variant,
1495
+ variant: action.dialog?.variant ?? action.variant,
1458
1496
  isOpen: dialogId === action.id,
1459
1497
  onClose: handleClose
1460
1498
  }
@@ -1511,9 +1549,9 @@ const DocumentActionsMenu = ({
1511
1549
  disabled: isDisabled,
1512
1550
  size: "S",
1513
1551
  endIcon: null,
1514
- paddingTop: "7px",
1515
- paddingLeft: "9px",
1516
- paddingRight: "9px",
1552
+ paddingTop: "4px",
1553
+ paddingLeft: "7px",
1554
+ paddingRight: "7px",
1517
1555
  variant,
1518
1556
  children: [
1519
1557
  /* @__PURE__ */ jsxRuntime.jsx(Icons.More, { "aria-hidden": true, focusable: false }),
@@ -1524,7 +1562,7 @@ const DocumentActionsMenu = ({
1524
1562
  ]
1525
1563
  }
1526
1564
  ),
1527
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { top: "4px", maxHeight: void 0, popoverPlacement: "bottom-end", children: [
1565
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Content, { maxHeight: void 0, popoverPlacement: "bottom-end", children: [
1528
1566
  actions2.map((action) => {
1529
1567
  return /* @__PURE__ */ jsxRuntime.jsx(
1530
1568
  designSystem.Menu.Item,
@@ -1533,10 +1571,25 @@ const DocumentActionsMenu = ({
1533
1571
  onSelect: handleClick(action),
1534
1572
  display: "block",
1535
1573
  children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", gap: 4, children: [
1536
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { color: convertActionVariantToColor(action.variant), gap: 2, tag: "span", children: [
1537
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { tag: "span", color: convertActionVariantToIconColor(action.variant), children: action.icon }),
1538
- action.label
1539
- ] }),
1574
+ /* @__PURE__ */ jsxRuntime.jsxs(
1575
+ designSystem.Flex,
1576
+ {
1577
+ color: !action.disabled ? convertActionVariantToColor(action.variant) : "inherit",
1578
+ gap: 2,
1579
+ tag: "span",
1580
+ children: [
1581
+ /* @__PURE__ */ jsxRuntime.jsx(
1582
+ designSystem.Flex,
1583
+ {
1584
+ tag: "span",
1585
+ color: !action.disabled ? convertActionVariantToIconColor(action.variant) : "inherit",
1586
+ children: action.icon
1587
+ }
1588
+ ),
1589
+ action.label
1590
+ ]
1591
+ }
1592
+ ),
1540
1593
  action.id.startsWith("HistoryAction") && /* @__PURE__ */ jsxRuntime.jsx(
1541
1594
  designSystem.Flex,
1542
1595
  {
@@ -1633,11 +1686,11 @@ const DocumentActionConfirmDialog = ({
1633
1686
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: title }),
1634
1687
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Body, { children: content }),
1635
1688
  /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Footer, { children: [
1636
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Cancel, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", children: formatMessage({
1689
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Cancel, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "tertiary", fullWidth: true, children: formatMessage({
1637
1690
  id: "app.components.Button.cancel",
1638
1691
  defaultMessage: "Cancel"
1639
1692
  }) }) }),
1640
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleConfirm, variant, children: formatMessage({
1693
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: handleConfirm, variant, fullWidth: true, children: formatMessage({
1641
1694
  id: "app.components.Button.confirm",
1642
1695
  defaultMessage: "Confirm"
1643
1696
  }) })
@@ -1660,8 +1713,8 @@ const DocumentActionModal = ({
1660
1713
  };
1661
1714
  return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Root, { open: isOpen, onOpenChange: handleClose, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Content, { children: [
1662
1715
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Header, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Title, { children: title }) }),
1663
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Body, { children: typeof Content === "function" ? /* @__PURE__ */ jsxRuntime.jsx(Content, { onClose: handleClose }) : Content }),
1664
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Footer, { children: typeof Footer === "function" ? /* @__PURE__ */ jsxRuntime.jsx(Footer, { onClose: handleClose }) : Footer })
1716
+ typeof Content === "function" ? /* @__PURE__ */ jsxRuntime.jsx(Content, { onClose: handleClose }) : /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Body, { children: Content }),
1717
+ typeof Footer === "function" ? /* @__PURE__ */ jsxRuntime.jsx(Footer, { onClose: handleClose }) : Footer
1665
1718
  ] }) });
1666
1719
  };
1667
1720
  const PublishAction$1 = ({
@@ -1676,13 +1729,17 @@ const PublishAction$1 = ({
1676
1729
  const navigate = reactRouterDom.useNavigate();
1677
1730
  const { toggleNotification } = strapiAdmin.useNotification();
1678
1731
  const { _unstableFormatValidationErrors: formatValidationErrors } = strapiAdmin.useAPIErrorHandler();
1732
+ const isListView = reactRouterDom.useMatch(LIST_PATH) !== null;
1679
1733
  const isCloning = reactRouterDom.useMatch(CLONE_PATH) !== null;
1680
1734
  const { formatMessage } = reactIntl.useIntl();
1681
- const { canPublish, canCreate, canUpdate } = useDocumentRBAC(
1682
- "PublishAction",
1683
- ({ canPublish: canPublish2, canCreate: canCreate2, canUpdate: canUpdate2 }) => ({ canPublish: canPublish2, canCreate: canCreate2, canUpdate: canUpdate2 })
1684
- );
1735
+ const canPublish = useDocumentRBAC("PublishAction", ({ canPublish: canPublish2 }) => canPublish2);
1685
1736
  const { publish } = useDocumentActions();
1737
+ const [
1738
+ countDraftRelations,
1739
+ { isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }
1740
+ ] = useLazyGetDraftRelationCountQuery();
1741
+ const [localCountOfDraftRelations, setLocalCountOfDraftRelations] = React__namespace.useState(0);
1742
+ const [serverCountOfDraftRelations, setServerCountOfDraftRelations] = React__namespace.useState(0);
1686
1743
  const [{ query, rawQuery }] = strapiAdmin.useQueryParams();
1687
1744
  const params = React__namespace.useMemo(() => buildValidParams(query), [query]);
1688
1745
  const modified = strapiAdmin.useForm("PublishAction", ({ modified: modified2 }) => modified2);
@@ -1691,10 +1748,103 @@ const PublishAction$1 = ({
1691
1748
  const validate = strapiAdmin.useForm("PublishAction", (state) => state.validate);
1692
1749
  const setErrors = strapiAdmin.useForm("PublishAction", (state) => state.setErrors);
1693
1750
  const formValues = strapiAdmin.useForm("PublishAction", ({ values }) => values);
1751
+ React__namespace.useEffect(() => {
1752
+ if (isErrorDraftRelations) {
1753
+ toggleNotification({
1754
+ type: "danger",
1755
+ message: formatMessage({
1756
+ id: getTranslation("error.records.fetch-draft-relatons"),
1757
+ defaultMessage: "An error occurred while fetching draft relations on this document."
1758
+ })
1759
+ });
1760
+ }
1761
+ }, [isErrorDraftRelations, toggleNotification, formatMessage]);
1762
+ React__namespace.useEffect(() => {
1763
+ const localDraftRelations = /* @__PURE__ */ new Set();
1764
+ const extractDraftRelations = (data) => {
1765
+ const relations = data.connect || [];
1766
+ relations.forEach((relation) => {
1767
+ if (relation.status === "draft") {
1768
+ localDraftRelations.add(relation.id);
1769
+ }
1770
+ });
1771
+ };
1772
+ const traverseAndExtract = (data) => {
1773
+ Object.entries(data).forEach(([key, value]) => {
1774
+ if (key === "connect" && Array.isArray(value)) {
1775
+ extractDraftRelations({ connect: value });
1776
+ } else if (typeof value === "object" && value !== null) {
1777
+ traverseAndExtract(value);
1778
+ }
1779
+ });
1780
+ };
1781
+ if (!documentId || modified) {
1782
+ traverseAndExtract(formValues);
1783
+ setLocalCountOfDraftRelations(localDraftRelations.size);
1784
+ }
1785
+ }, [documentId, modified, formValues, setLocalCountOfDraftRelations]);
1786
+ React__namespace.useEffect(() => {
1787
+ if (!document || !document.documentId || isListView) {
1788
+ return;
1789
+ }
1790
+ const fetchDraftRelationsCount = async () => {
1791
+ const { data, error } = await countDraftRelations({
1792
+ collectionType,
1793
+ model,
1794
+ documentId,
1795
+ params
1796
+ });
1797
+ if (error) {
1798
+ throw error;
1799
+ }
1800
+ if (data) {
1801
+ setServerCountOfDraftRelations(data.data);
1802
+ }
1803
+ };
1804
+ fetchDraftRelationsCount();
1805
+ }, [isListView, document, documentId, countDraftRelations, collectionType, model, params]);
1694
1806
  const isDocumentPublished = (document?.[PUBLISHED_AT_ATTRIBUTE_NAME] || meta?.availableStatus.some((doc) => doc[PUBLISHED_AT_ATTRIBUTE_NAME] !== null)) && document?.status !== "modified";
1695
1807
  if (!schema?.options?.draftAndPublish) {
1696
1808
  return null;
1697
1809
  }
1810
+ const performPublish = async () => {
1811
+ setSubmitting(true);
1812
+ try {
1813
+ const { errors } = await validate();
1814
+ if (errors) {
1815
+ toggleNotification({
1816
+ type: "danger",
1817
+ message: formatMessage({
1818
+ id: "content-manager.validation.error",
1819
+ defaultMessage: "There are validation errors in your document. Please fix them before saving."
1820
+ })
1821
+ });
1822
+ return;
1823
+ }
1824
+ const res = await publish(
1825
+ {
1826
+ collectionType,
1827
+ model,
1828
+ documentId,
1829
+ params
1830
+ },
1831
+ formValues
1832
+ );
1833
+ if ("data" in res && collectionType !== SINGLE_TYPES) {
1834
+ navigate({
1835
+ pathname: `../${collectionType}/${model}/${res.data.documentId}`,
1836
+ search: rawQuery
1837
+ });
1838
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1839
+ setErrors(formatValidationErrors(res.error));
1840
+ }
1841
+ } finally {
1842
+ setSubmitting(false);
1843
+ }
1844
+ };
1845
+ const totalDraftRelations = localCountOfDraftRelations + serverCountOfDraftRelations;
1846
+ const enableDraftRelationsCount = false;
1847
+ const hasDraftRelations = enableDraftRelationsCount;
1698
1848
  return {
1699
1849
  /**
1700
1850
  * Disabled when:
@@ -1704,49 +1854,36 @@ const PublishAction$1 = ({
1704
1854
  * - the document is already published & not modified
1705
1855
  * - the document is being created & not modified
1706
1856
  * - the user doesn't have the permission to publish
1707
- * - the user doesn't have the permission to create a new document
1708
- * - the user doesn't have the permission to update the document
1709
1857
  */
1710
- disabled: isCloning || isSubmitting || activeTab === "published" || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish || Boolean(!document?.documentId && !canCreate || document?.documentId && !canUpdate),
1858
+ disabled: isCloning || isSubmitting || isLoadingDraftRelations || activeTab === "published" || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish,
1711
1859
  label: formatMessage({
1712
1860
  id: "app.utils.publish",
1713
1861
  defaultMessage: "Publish"
1714
1862
  }),
1715
1863
  onClick: async () => {
1716
- setSubmitting(true);
1717
- try {
1718
- const { errors } = await validate();
1719
- if (errors) {
1720
- toggleNotification({
1721
- type: "danger",
1722
- message: formatMessage({
1723
- id: "content-manager.validation.error",
1724
- defaultMessage: "There are validation errors in your document. Please fix them before saving."
1725
- })
1726
- });
1727
- return;
1728
- }
1729
- const res = await publish(
1730
- {
1731
- collectionType,
1732
- model,
1733
- documentId,
1734
- params
1735
- },
1736
- formValues
1737
- );
1738
- if ("data" in res && collectionType !== SINGLE_TYPES) {
1739
- navigate({
1740
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
1741
- search: rawQuery
1742
- });
1743
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1744
- setErrors(formatValidationErrors(res.error));
1864
+ await performPublish();
1865
+ },
1866
+ dialog: hasDraftRelations ? {
1867
+ type: "dialog",
1868
+ variant: "danger",
1869
+ footer: null,
1870
+ title: formatMessage({
1871
+ id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.title`),
1872
+ defaultMessage: "Confirmation"
1873
+ }),
1874
+ content: formatMessage(
1875
+ {
1876
+ id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.message`),
1877
+ defaultMessage: "This entry is related to {count, plural, one {# draft entry} other {# draft entries}}. Publishing it could leave broken links in your app."
1878
+ },
1879
+ {
1880
+ count: totalDraftRelations
1745
1881
  }
1746
- } finally {
1747
- setSubmitting(false);
1882
+ ),
1883
+ onConfirm: async () => {
1884
+ await performPublish();
1748
1885
  }
1749
- }
1886
+ } : void 0
1750
1887
  };
1751
1888
  };
1752
1889
  PublishAction$1.type = "publish";
@@ -1762,10 +1899,6 @@ const UpdateAction = ({
1762
1899
  const cloneMatch = reactRouterDom.useMatch(CLONE_PATH);
1763
1900
  const isCloning = cloneMatch !== null;
1764
1901
  const { formatMessage } = reactIntl.useIntl();
1765
- const { canCreate, canUpdate } = useDocumentRBAC("UpdateAction", ({ canCreate: canCreate2, canUpdate: canUpdate2 }) => ({
1766
- canCreate: canCreate2,
1767
- canUpdate: canUpdate2
1768
- }));
1769
1902
  const { create, update, clone } = useDocumentActions();
1770
1903
  const [{ query, rawQuery }] = strapiAdmin.useQueryParams();
1771
1904
  const params = React__namespace.useMemo(() => buildValidParams(query), [query]);
@@ -1782,10 +1915,8 @@ const UpdateAction = ({
1782
1915
  * - the form is submitting
1783
1916
  * - the document is not modified & we're not cloning (you can save a clone entity straight away)
1784
1917
  * - the active tab is the published tab
1785
- * - the user doesn't have the permission to create a new document
1786
- * - the user doesn't have the permission to update the document
1787
1918
  */
1788
- disabled: isSubmitting || !modified && !isCloning || activeTab === "published" || Boolean(!documentId && !canCreate || documentId && !canUpdate),
1919
+ disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
1789
1920
  label: formatMessage({
1790
1921
  id: "content-manager.containers.Edit.save",
1791
1922
  defaultMessage: "Save"
@@ -1793,16 +1924,18 @@ const UpdateAction = ({
1793
1924
  onClick: async () => {
1794
1925
  setSubmitting(true);
1795
1926
  try {
1796
- const { errors } = await validate();
1797
- if (errors) {
1798
- toggleNotification({
1799
- type: "danger",
1800
- message: formatMessage({
1801
- id: "content-manager.validation.error",
1802
- defaultMessage: "There are validation errors in your document. Please fix them before saving."
1803
- })
1804
- });
1805
- return;
1927
+ if (activeTab !== "draft") {
1928
+ const { errors } = await validate();
1929
+ if (errors) {
1930
+ toggleNotification({
1931
+ type: "danger",
1932
+ message: formatMessage({
1933
+ id: "content-manager.validation.error",
1934
+ defaultMessage: "There are validation errors in your document. Please fix them before saving."
1935
+ })
1936
+ });
1937
+ return;
1938
+ }
1806
1939
  }
1807
1940
  if (isCloning) {
1808
1941
  const res = await clone(
@@ -1814,10 +1947,13 @@ const UpdateAction = ({
1814
1947
  document
1815
1948
  );
1816
1949
  if ("data" in res) {
1817
- navigate({
1818
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
1819
- search: rawQuery
1820
- });
1950
+ navigate(
1951
+ {
1952
+ pathname: `../${res.data.documentId}`,
1953
+ search: rawQuery
1954
+ },
1955
+ { relative: "path" }
1956
+ );
1821
1957
  } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1822
1958
  setErrors(formatValidationErrors(res.error));
1823
1959
  }
@@ -1847,10 +1983,10 @@ const UpdateAction = ({
1847
1983
  if ("data" in res && collectionType !== SINGLE_TYPES) {
1848
1984
  navigate(
1849
1985
  {
1850
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
1986
+ pathname: `../${res.data.documentId}`,
1851
1987
  search: rawQuery
1852
1988
  },
1853
- { replace: true }
1989
+ { replace: true, relative: "path" }
1854
1990
  );
1855
1991
  } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1856
1992
  setErrors(formatValidationErrors(res.error));
@@ -1895,7 +2031,7 @@ const UnpublishAction$1 = ({
1895
2031
  id: "app.utils.unpublish",
1896
2032
  defaultMessage: "Unpublish"
1897
2033
  }),
1898
- icon: /* @__PURE__ */ jsxRuntime.jsx(StyledCrossCircle, {}),
2034
+ icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Cross, {}),
1899
2035
  onClick: async () => {
1900
2036
  if (!documentId && collectionType !== SINGLE_TYPES || isDocumentModified) {
1901
2037
  if (!documentId) {
@@ -2007,7 +2143,7 @@ const DiscardAction = ({
2007
2143
  id: "content-manager.actions.discard.label",
2008
2144
  defaultMessage: "Discard changes"
2009
2145
  }),
2010
- icon: /* @__PURE__ */ jsxRuntime.jsx(StyledCrossCircle, {}),
2146
+ icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.Cross, {}),
2011
2147
  position: ["panel", "table-row"],
2012
2148
  variant: "danger",
2013
2149
  dialog: {
@@ -2035,11 +2171,6 @@ const DiscardAction = ({
2035
2171
  };
2036
2172
  };
2037
2173
  DiscardAction.type = "discard";
2038
- const StyledCrossCircle = styledComponents.styled(Icons.CrossCircle)`
2039
- path {
2040
- fill: currentColor;
2041
- }
2042
- `;
2043
2174
  const DEFAULT_ACTIONS = [PublishAction$1, UpdateAction, UnpublishAction$1, DiscardAction];
2044
2175
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
2045
2176
  const RelativeTime = React__namespace.forwardRef(
@@ -2087,7 +2218,7 @@ const getDisplayName = ({
2087
2218
  };
2088
2219
  const capitalise = (str) => str.charAt(0).toUpperCase() + str.slice(1);
2089
2220
  const DocumentStatus = ({ status = "draft", ...restProps }) => {
2090
- const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
2221
+ const statusVariant = status === "draft" ? "secondary" : status === "published" ? "success" : "alternative";
2091
2222
  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) }) });
2092
2223
  };
2093
2224
  const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
@@ -2097,23 +2228,13 @@ const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
2097
2228
  id: "content-manager.containers.edit.title.new",
2098
2229
  defaultMessage: "Create an entry"
2099
2230
  }) : documentTitle;
2100
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "flex-start", paddingTop: 8, paddingBottom: 4, gap: 3, children: [
2231
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "flex-start", paddingTop: 6, paddingBottom: 4, gap: 2, children: [
2101
2232
  /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.BackButton, {}),
2102
- /* @__PURE__ */ jsxRuntime.jsxs(
2103
- designSystem.Flex,
2104
- {
2105
- width: "100%",
2106
- justifyContent: "space-between",
2107
- paddingTop: 1,
2108
- gap: "80px",
2109
- alignItems: "flex-start",
2110
- children: [
2111
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "alpha", tag: "h1", children: title }),
2112
- /* @__PURE__ */ jsxRuntime.jsx(HeaderToolbar, {})
2113
- ]
2114
- }
2115
- ),
2116
- status ? /* @__PURE__ */ jsxRuntime.jsx(DocumentStatus, { status: isCloning ? "draft" : status }) : null
2233
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", justifyContent: "space-between", gap: "80px", alignItems: "flex-start", children: [
2234
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "alpha", tag: "h1", children: title }),
2235
+ /* @__PURE__ */ jsxRuntime.jsx(HeaderToolbar, {})
2236
+ ] }),
2237
+ status ? /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 1, children: /* @__PURE__ */ jsxRuntime.jsx(DocumentStatus, { status: isCloning ? "draft" : status }) }) : null
2117
2238
  ] });
2118
2239
  };
2119
2240
  const HeaderToolbar = () => {
@@ -2280,8 +2401,22 @@ const Information = ({ activeTab }) => {
2280
2401
  );
2281
2402
  };
2282
2403
  const HeaderActions = ({ actions: actions2 }) => {
2283
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: actions2.map((action) => {
2284
- if ("options" in action) {
2404
+ const [dialogId, setDialogId] = React__namespace.useState(null);
2405
+ const handleClick = (action) => async (e) => {
2406
+ if (!("options" in action)) {
2407
+ const { onClick = () => false, dialog, id } = action;
2408
+ const muteDialog = await onClick(e);
2409
+ if (dialog && !muteDialog) {
2410
+ e.preventDefault();
2411
+ setDialogId(id);
2412
+ }
2413
+ }
2414
+ };
2415
+ const handleClose = () => {
2416
+ setDialogId(null);
2417
+ };
2418
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { gap: 1, children: actions2.map((action) => {
2419
+ if (action.options) {
2285
2420
  return /* @__PURE__ */ jsxRuntime.jsx(
2286
2421
  designSystem.SingleSelect,
2287
2422
  {
@@ -2295,10 +2430,49 @@ const HeaderActions = ({ actions: actions2 }) => {
2295
2430
  action.id
2296
2431
  );
2297
2432
  } else {
2298
- return null;
2433
+ if (action.type === "icon") {
2434
+ return /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
2435
+ /* @__PURE__ */ jsxRuntime.jsx(
2436
+ designSystem.IconButton,
2437
+ {
2438
+ disabled: action.disabled,
2439
+ label: action.label,
2440
+ size: "S",
2441
+ onClick: handleClick(action),
2442
+ children: action.icon
2443
+ }
2444
+ ),
2445
+ action.dialog ? /* @__PURE__ */ jsxRuntime.jsx(
2446
+ HeaderActionDialog,
2447
+ {
2448
+ ...action.dialog,
2449
+ isOpen: dialogId === action.id,
2450
+ onClose: handleClose
2451
+ }
2452
+ ) : null
2453
+ ] }, action.id);
2454
+ }
2299
2455
  }
2300
2456
  }) });
2301
2457
  };
2458
+ const HeaderActionDialog = ({
2459
+ onClose,
2460
+ onCancel,
2461
+ title,
2462
+ content: Content,
2463
+ isOpen
2464
+ }) => {
2465
+ const handleClose = async () => {
2466
+ if (onCancel) {
2467
+ await onCancel();
2468
+ }
2469
+ onClose();
2470
+ };
2471
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, { open: isOpen, onOpenChange: handleClose, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
2472
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: title }),
2473
+ typeof Content === "function" ? /* @__PURE__ */ jsxRuntime.jsx(Content, { onClose: handleClose }) : Content
2474
+ ] }) });
2475
+ };
2302
2476
  const ConfigureTheViewAction = ({ collectionType, model }) => {
2303
2477
  const navigate = reactRouterDom.useNavigate();
2304
2478
  const { formatMessage } = reactIntl.useIntl();
@@ -2434,7 +2608,7 @@ const ActionsPanel = () => {
2434
2608
  return {
2435
2609
  title: formatMessage({
2436
2610
  id: "content-manager.containers.edit.panels.default.title",
2437
- defaultMessage: "Document"
2611
+ defaultMessage: "Entry"
2438
2612
  }),
2439
2613
  content: /* @__PURE__ */ jsxRuntime.jsx(ActionsPanelContent, {})
2440
2614
  };
@@ -2678,7 +2852,8 @@ const formatEditLayout = (data, {
2678
2852
  layout: convertEditLayoutToFieldLayouts(
2679
2853
  configuration.layouts.edit,
2680
2854
  components[uid].attributes,
2681
- configuration.metadatas
2855
+ configuration.metadatas,
2856
+ { configurations: data.components, schemas: components }
2682
2857
  ),
2683
2858
  settings: {
2684
2859
  ...configuration.settings,
@@ -2804,7 +2979,7 @@ const ConfirmBulkActionDialog = ({
2804
2979
  endAction
2805
2980
  }) => {
2806
2981
  const { formatMessage } = reactIntl.useIntl();
2807
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, { onOpenChange: onToggleDialog, open: isOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
2982
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Root, { open: isOpen, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Content, { children: [
2808
2983
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Header, { children: formatMessage({
2809
2984
  id: "app.components.ConfirmDialog.title",
2810
2985
  defaultMessage: "Confirmation"
@@ -2835,6 +3010,7 @@ const ConfirmDialogPublishAll = ({
2835
3010
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler(getTranslation);
2836
3011
  const { model, schema } = useDoc();
2837
3012
  const [{ query }] = strapiAdmin.useQueryParams();
3013
+ const enableDraftRelationsCount = false;
2838
3014
  const {
2839
3015
  data: countDraftRelations = 0,
2840
3016
  isLoading,
@@ -2846,7 +3022,7 @@ const ConfirmDialogPublishAll = ({
2846
3022
  locale: query?.plugins?.i18n?.locale
2847
3023
  },
2848
3024
  {
2849
- skip: selectedEntries.length === 0
3025
+ skip: !enableDraftRelationsCount
2850
3026
  }
2851
3027
  );
2852
3028
  React__namespace.useEffect(() => {
@@ -3031,7 +3207,7 @@ const SelectedEntriesTableContent = ({
3031
3207
  status: row.status
3032
3208
  }
3033
3209
  ) }),
3034
- /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(
3210
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(
3035
3211
  designSystem.IconButton,
3036
3212
  {
3037
3213
  tag: reactRouterDom.Link,
@@ -3054,9 +3230,10 @@ const SelectedEntriesTableContent = ({
3054
3230
  ),
3055
3231
  target: "_blank",
3056
3232
  marginLeft: "auto",
3057
- children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Pencil, {})
3233
+ variant: "ghost",
3234
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icons.Pencil, { width: "1.6rem", height: "1.6rem" })
3058
3235
  }
3059
- ) })
3236
+ ) }) })
3060
3237
  ] }, row.id)) })
3061
3238
  ] });
3062
3239
  };
@@ -3093,7 +3270,13 @@ const SelectedEntriesModalContent = ({
3093
3270
  );
3094
3271
  const { rows, validationErrors } = React__namespace.useMemo(() => {
3095
3272
  if (data.length > 0 && schema) {
3096
- const validate = createYupSchema(schema.attributes, components);
3273
+ const validate = createYupSchema(
3274
+ schema.attributes,
3275
+ components,
3276
+ // Since this is the "Publish" action, the validation
3277
+ // schema must enforce the rules for published entities
3278
+ { status: "published" }
3279
+ );
3097
3280
  const validationErrors2 = {};
3098
3281
  const rows2 = data.map((entry) => {
3099
3282
  try {
@@ -3443,7 +3626,7 @@ const TableActions = ({ document }) => {
3443
3626
  strapiAdmin.DescriptionComponentRenderer,
3444
3627
  {
3445
3628
  props,
3446
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
3629
+ descriptions: plugins["content-manager"].apis.getDocumentActions().filter((action) => action.name !== "PublishAction"),
3447
3630
  children: (actions2) => {
3448
3631
  const tableRowActions = actions2.filter((action) => {
3449
3632
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -3554,7 +3737,7 @@ const CloneAction = ({ model, documentId }) => {
3554
3737
  }),
3555
3738
  content: /* @__PURE__ */ jsxRuntime.jsx(AutoCloneFailureModalBody, { prohibitedFields }),
3556
3739
  footer: ({ onClose }) => {
3557
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { justifyContent: "space-between", children: [
3740
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Footer, { children: [
3558
3741
  /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { onClick: onClose, variant: "tertiary", children: formatMessage({
3559
3742
  id: "cancel",
3560
3743
  defaultMessage: "Cancel"
@@ -3595,8 +3778,7 @@ class ContentManagerPlugin {
3595
3778
  documentActions = [
3596
3779
  ...DEFAULT_ACTIONS,
3597
3780
  ...DEFAULT_TABLE_ROW_ACTIONS,
3598
- ...DEFAULT_HEADER_ACTIONS,
3599
- HistoryAction
3781
+ ...DEFAULT_HEADER_ACTIONS
3600
3782
  ];
3601
3783
  editViewSidePanels = [ActionsPanel];
3602
3784
  headerActions = [];
@@ -3685,6 +3867,52 @@ const getPrintableType = (value) => {
3685
3867
  }
3686
3868
  return nativeType;
3687
3869
  };
3870
+ const HistoryAction = ({ model, document }) => {
3871
+ const { formatMessage } = reactIntl.useIntl();
3872
+ const [{ query }] = strapiAdmin.useQueryParams();
3873
+ const navigate = reactRouterDom.useNavigate();
3874
+ const pluginsQueryParams = qs.stringify({ plugins: query.plugins }, { encode: false });
3875
+ if (!window.strapi.features.isEnabled("cms-content-history")) {
3876
+ return null;
3877
+ }
3878
+ return {
3879
+ icon: /* @__PURE__ */ jsxRuntime.jsx(Icons.ClockCounterClockwise, {}),
3880
+ label: formatMessage({
3881
+ id: "content-manager.history.document-action",
3882
+ defaultMessage: "Content History"
3883
+ }),
3884
+ onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
3885
+ disabled: (
3886
+ /**
3887
+ * The user is creating a new document.
3888
+ * It hasn't been saved yet, so there's no history to go to
3889
+ */
3890
+ !document || /**
3891
+ * The document has been created but the current dimension has never been saved.
3892
+ * For example, the user is creating a new locale in an existing document,
3893
+ * so there's no history for the document in that locale
3894
+ */
3895
+ !document.id || /**
3896
+ * History is only available for content types created by the user.
3897
+ * These have the `api::` prefix, as opposed to the ones created by Strapi or plugins,
3898
+ * which start with `admin::` or `plugin::`
3899
+ */
3900
+ !model.startsWith("api::")
3901
+ ),
3902
+ position: "header"
3903
+ };
3904
+ };
3905
+ HistoryAction.type = "history";
3906
+ const historyAdmin = {
3907
+ bootstrap(app) {
3908
+ const { addDocumentAction } = app.getPlugin("content-manager").apis;
3909
+ addDocumentAction((actions2) => {
3910
+ const indexOfDeleteAction = actions2.findIndex((action) => action.type === "delete");
3911
+ actions2.splice(indexOfDeleteAction, 0, HistoryAction);
3912
+ return actions2;
3913
+ });
3914
+ }
3915
+ };
3688
3916
  const initialState = {
3689
3917
  collectionTypeLinks: [],
3690
3918
  components: [],
@@ -3740,7 +3968,7 @@ const index = {
3740
3968
  app.router.addRoute({
3741
3969
  path: "content-manager/*",
3742
3970
  lazy: async () => {
3743
- const { Layout } = await Promise.resolve().then(() => require("./layout-Ciz224q5.js"));
3971
+ const { Layout } = await Promise.resolve().then(() => require("./layout-T2xBqmuZ.js"));
3744
3972
  return {
3745
3973
  Component: Layout
3746
3974
  };
@@ -3749,10 +3977,15 @@ const index = {
3749
3977
  });
3750
3978
  app.registerPlugin(cm.config);
3751
3979
  },
3980
+ bootstrap(app) {
3981
+ if (typeof historyAdmin.bootstrap === "function") {
3982
+ historyAdmin.bootstrap(app);
3983
+ }
3984
+ },
3752
3985
  async registerTrads({ locales }) {
3753
3986
  const importedTrads = await Promise.all(
3754
3987
  locales.map((locale) => {
3755
- 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 }) => {
3988
+ 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 }) => {
3756
3989
  return {
3757
3990
  data: prefixPluginTranslations(data, PLUGIN_ID),
3758
3991
  locale
@@ -3770,6 +4003,7 @@ const index = {
3770
4003
  };
3771
4004
  exports.ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD = ATTRIBUTE_TYPES_THAT_CANNOT_BE_MAIN_FIELD;
3772
4005
  exports.BulkActionsRenderer = BulkActionsRenderer;
4006
+ exports.CLONE_PATH = CLONE_PATH;
3773
4007
  exports.COLLECTION_TYPES = COLLECTION_TYPES;
3774
4008
  exports.CREATOR_FIELDS = CREATOR_FIELDS;
3775
4009
  exports.DEFAULT_SETTINGS = DEFAULT_SETTINGS;
@@ -3809,4 +4043,4 @@ exports.useGetAllDocumentsQuery = useGetAllDocumentsQuery;
3809
4043
  exports.useGetContentTypeConfigurationQuery = useGetContentTypeConfigurationQuery;
3810
4044
  exports.useGetInitialDataQuery = useGetInitialDataQuery;
3811
4045
  exports.useUpdateContentTypeConfigurationMutation = useUpdateContentTypeConfigurationMutation;
3812
- //# sourceMappingURL=index-BOZx6IMg.js.map
4046
+ //# sourceMappingURL=index-jun-ZqyN.js.map