@strapi/content-manager 0.0.0-experimental.60f3ded53a22a24d208ebf6df9b84c118aa97abf → 0.0.0-experimental.626cf5324f21d318dee435c11cb3e08bb4c414b7

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-CnL10QYC.mjs} +3 -3
  3. package/dist/_chunks/{ComponentConfigurationPage-DErJQEVW.mjs.map → ComponentConfigurationPage-CnL10QYC.mjs.map} +1 -1
  4. package/dist/_chunks/{ComponentConfigurationPage-Cl7eB3s4.js → ComponentConfigurationPage-G4EIirP8.js} +3 -3
  5. package/dist/_chunks/{ComponentConfigurationPage-Cl7eB3s4.js.map → ComponentConfigurationPage-G4EIirP8.js.map} +1 -1
  6. package/dist/_chunks/{EditConfigurationPage-CyfFvH6-.js → EditConfigurationPage-B2AA1kVF.js} +3 -3
  7. package/dist/_chunks/{EditConfigurationPage-CyfFvH6-.js.map → EditConfigurationPage-B2AA1kVF.js.map} +1 -1
  8. package/dist/_chunks/{EditConfigurationPage-CBosWqQ7.mjs → EditConfigurationPage-I2kKh9dx.mjs} +3 -3
  9. package/dist/_chunks/{EditConfigurationPage-CBosWqQ7.mjs.map → EditConfigurationPage-I2kKh9dx.mjs.map} +1 -1
  10. package/dist/_chunks/{EditViewPage-DxyAOItK.js → EditViewPage-CHgoNwlc.js} +19 -8
  11. package/dist/_chunks/EditViewPage-CHgoNwlc.js.map +1 -0
  12. package/dist/_chunks/{EditViewPage-ClIueJnM.mjs → EditViewPage-zFjJK0s8.mjs} +19 -8
  13. package/dist/_chunks/EditViewPage-zFjJK0s8.mjs.map +1 -0
  14. package/dist/_chunks/{Field-C0Y_SR9e.js → Field-9DePZh-0.js} +465 -145
  15. package/dist/_chunks/Field-9DePZh-0.js.map +1 -0
  16. package/dist/_chunks/{Field-BZBYmvaf.mjs → Field-DPAzUS1M.mjs} +463 -143
  17. package/dist/_chunks/Field-DPAzUS1M.mjs.map +1 -0
  18. package/dist/_chunks/{Form-jwRSC2kV.mjs → Form-CEkENbkF.mjs} +35 -16
  19. package/dist/_chunks/Form-CEkENbkF.mjs.map +1 -0
  20. package/dist/_chunks/{Form-DwvGnISS.js → Form-DPm-KZ1A.js} +35 -16
  21. package/dist/_chunks/Form-DPm-KZ1A.js.map +1 -0
  22. package/dist/_chunks/{History-Cda0Yjzz.js → History-DXSbTWez.js} +44 -19
  23. package/dist/_chunks/History-DXSbTWez.js.map +1 -0
  24. package/dist/_chunks/{History-BgzAIj0G.mjs → History-utls71em.mjs} +44 -19
  25. package/dist/_chunks/History-utls71em.mjs.map +1 -0
  26. package/dist/_chunks/{ListConfigurationPage-GH55qfoT.mjs → ListConfigurationPage-CuMXWWqb.mjs} +20 -8
  27. package/dist/_chunks/ListConfigurationPage-CuMXWWqb.mjs.map +1 -0
  28. package/dist/_chunks/{ListConfigurationPage-C29EF97r.js → ListConfigurationPage-D5C7ACZ_.js} +20 -8
  29. package/dist/_chunks/ListConfigurationPage-D5C7ACZ_.js.map +1 -0
  30. package/dist/_chunks/{ListViewPage-QU03PFj1.mjs → ListViewPage-CdKd-PS_.mjs} +58 -40
  31. package/dist/_chunks/ListViewPage-CdKd-PS_.mjs.map +1 -0
  32. package/dist/_chunks/{ListViewPage-CnRt0UT7.js → ListViewPage-DfuwH1tt.js} +60 -42
  33. package/dist/_chunks/ListViewPage-DfuwH1tt.js.map +1 -0
  34. package/dist/_chunks/{NoContentTypePage-DFDjxByI.js → NoContentTypePage-BIxlkWWi.js} +2 -2
  35. package/dist/_chunks/{NoContentTypePage-DFDjxByI.js.map → NoContentTypePage-BIxlkWWi.js.map} +1 -1
  36. package/dist/_chunks/{NoContentTypePage-CPs2CnzH.mjs → NoContentTypePage-DkToTT7u.mjs} +2 -2
  37. package/dist/_chunks/{NoContentTypePage-CPs2CnzH.mjs.map → NoContentTypePage-DkToTT7u.mjs.map} +1 -1
  38. package/dist/_chunks/{NoPermissionsPage-BVHI-jv5.js → NoPermissionsPage-Bu4GWYb-.js} +2 -2
  39. package/dist/_chunks/{NoPermissionsPage-BVHI-jv5.js.map → NoPermissionsPage-Bu4GWYb-.js.map} +1 -1
  40. package/dist/_chunks/{NoPermissionsPage-ct58lcY0.mjs → NoPermissionsPage-DlWi4BAH.mjs} +2 -2
  41. package/dist/_chunks/{NoPermissionsPage-ct58lcY0.mjs.map → NoPermissionsPage-DlWi4BAH.mjs.map} +1 -1
  42. package/dist/_chunks/{Relations-BjpPPCKp.js → Relations-CFjTESWQ.js} +4 -4
  43. package/dist/_chunks/Relations-CFjTESWQ.js.map +1 -0
  44. package/dist/_chunks/{Relations-KMf5qEN0.mjs → Relations-QP5yn9_z.mjs} +4 -4
  45. package/dist/_chunks/Relations-QP5yn9_z.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-6kKXK7y8.mjs → index-BHfS6_D5.mjs} +448 -207
  51. package/dist/_chunks/index-BHfS6_D5.mjs.map +1 -0
  52. package/dist/_chunks/{index-D9ZwczCV.js → index-DXiHxy70.js} +441 -200
  53. package/dist/_chunks/index-DXiHxy70.js.map +1 -0
  54. package/dist/_chunks/{layout-B1Z-9koY.mjs → layout-DX_52HSH.mjs} +27 -14
  55. package/dist/_chunks/layout-DX_52HSH.mjs.map +1 -0
  56. package/dist/_chunks/{layout-BJfBoBiF.js → layout-bE-WUnQ0.js} +25 -12
  57. package/dist/_chunks/layout-bE-WUnQ0.js.map +1 -0
  58. package/dist/_chunks/{relations-CMvjzyU3.js → relations-D706vblp.js} +2 -2
  59. package/dist/_chunks/{relations-CMvjzyU3.js.map → relations-D706vblp.js.map} +1 -1
  60. package/dist/_chunks/{relations-CgZg7Pyx.mjs → relations-SCVAL_aJ.mjs} +2 -2
  61. package/dist/_chunks/{relations-CgZg7Pyx.mjs.map → relations-SCVAL_aJ.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 +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
@@ -1,17 +1,17 @@
1
- import { ClockCounterClockwise, CrossCircle, More, WarningCircle, ListPlus, Pencil, Trash, Check, CheckCircle, ArrowsCounterClockwise, ChevronRight, Duplicate, Feather } from "@strapi/icons";
1
+ import { More, Cross, WarningCircle, ListPlus, Pencil, Trash, Check, CrossCircle, CheckCircle, ArrowsCounterClockwise, ChevronRight, Duplicate, ClockCounterClockwise, Feather } from "@strapi/icons";
2
2
  import { jsx, Fragment, jsxs } from "react/jsx-runtime";
3
- import { useStrapiApp, useQueryParams, createContext, useAuth, useRBAC, Page, adminApi, translatedErrors, useNotification, useAPIErrorHandler, getYupValidationErrors, useTracking, useForm, BackButton, DescriptionComponentRenderer, useTable, Table } from "@strapi/admin/strapi-admin";
4
- import { stringify } from "qs";
5
- import { useIntl } from "react-intl";
6
- import { useNavigate, useParams, Navigate, useMatch, useLocation, Link, NavLink } from "react-router-dom";
3
+ import { useStrapiApp, createContext, useAuth, useRBAC, Page, adminApi, translatedErrors, useNotification, useAPIErrorHandler, getYupValidationErrors, useQueryParams, useTracking, useForm, BackButton, DescriptionComponentRenderer, useTable, Table } from "@strapi/admin/strapi-admin";
7
4
  import * as React from "react";
8
5
  import { lazy } from "react";
9
- import { Button, Menu, VisuallyHidden, Flex, Box, Typography, Dialog, Modal, Radio, Status, SingleSelect, SingleSelectOption, Loader, IconButton, Tooltip, LinkButton } from "@strapi/design-system";
10
- import { styled } from "styled-components";
6
+ import { Button, Menu, VisuallyHidden, Flex, Typography, Dialog, Modal, Radio, Status, Box, SingleSelect, SingleSelectOption, IconButton, Loader, Tooltip, LinkButton } from "@strapi/design-system";
7
+ import { useIntl } from "react-intl";
8
+ import { useParams, useNavigate, Navigate, useMatch, useLocation, Link, NavLink } from "react-router-dom";
11
9
  import * as yup from "yup";
12
10
  import { ValidationError } from "yup";
13
11
  import pipe from "lodash/fp/pipe";
14
12
  import { intervalToDuration, isPast } from "date-fns";
13
+ import { styled } from "styled-components";
14
+ import { stringify } from "qs";
15
15
  import { createSlice, combineReducers } from "@reduxjs/toolkit";
16
16
  const __variableDynamicImportRuntimeHelper = (glob, path) => {
17
17
  const v = glob[path];
@@ -49,42 +49,6 @@ const useInjectionZone = (area) => {
49
49
  const [page, position] = area.split(".");
50
50
  return contentManagerPlugin.getInjectedComponents(page, position);
51
51
  };
52
- const HistoryAction = ({ model, document }) => {
53
- const { formatMessage } = useIntl();
54
- const [{ query }] = useQueryParams();
55
- const navigate = useNavigate();
56
- const pluginsQueryParams = stringify({ plugins: query.plugins }, { encode: false });
57
- if (!window.strapi.features.isEnabled("cms-content-history")) {
58
- return null;
59
- }
60
- return {
61
- icon: /* @__PURE__ */ jsx(ClockCounterClockwise, {}),
62
- label: formatMessage({
63
- id: "content-manager.history.document-action",
64
- defaultMessage: "Content History"
65
- }),
66
- onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
67
- disabled: (
68
- /**
69
- * The user is creating a new document.
70
- * It hasn't been saved yet, so there's no history to go to
71
- */
72
- !document || /**
73
- * The document has been created but the current dimension has never been saved.
74
- * For example, the user is creating a new locale in an existing document,
75
- * so there's no history for the document in that locale
76
- */
77
- !document.id || /**
78
- * History is only available for content types created by the user.
79
- * These have the `api::` prefix, as opposed to the ones created by Strapi or plugins,
80
- * which start with `admin::` or `plugin::`
81
- */
82
- !model.startsWith("api::")
83
- ),
84
- position: "header"
85
- };
86
- };
87
- HistoryAction.type = "history";
88
52
  const ID = "id";
89
53
  const CREATED_BY_ATTRIBUTE_NAME = "createdBy";
90
54
  const UPDATED_BY_ATTRIBUTE_NAME = "updatedBy";
@@ -195,8 +159,7 @@ const contentManagerApi = adminApi.enhanceEndpoints({
195
159
  "InitialData",
196
160
  "HistoryVersion",
197
161
  "Relations",
198
- "Release",
199
- "ReleaseAction"
162
+ "UidAvailability"
200
163
  ]
201
164
  });
202
165
  const documentApi = contentManagerApi.injectEndpoints({
@@ -210,7 +173,12 @@ const documentApi = contentManagerApi.injectEndpoints({
210
173
  params: query
211
174
  }
212
175
  }),
213
- invalidatesTags: (_result, _error, { model }) => [{ type: "Document", id: `${model}_LIST` }]
176
+ invalidatesTags: (_result, error, { model }) => {
177
+ if (error) {
178
+ return [];
179
+ }
180
+ return [{ type: "Document", id: `${model}_LIST` }];
181
+ }
214
182
  }),
215
183
  cloneDocument: builder.mutation({
216
184
  query: ({ model, sourceId, data, params }) => ({
@@ -221,7 +189,10 @@ const documentApi = contentManagerApi.injectEndpoints({
221
189
  params
222
190
  }
223
191
  }),
224
- invalidatesTags: (_result, _error, { model }) => [{ type: "Document", id: `${model}_LIST` }]
192
+ invalidatesTags: (_result, _error, { model }) => [
193
+ { type: "Document", id: `${model}_LIST` },
194
+ { type: "UidAvailability", id: model }
195
+ ]
225
196
  }),
226
197
  /**
227
198
  * Creates a new collection-type document. This should ONLY be used for collection-types.
@@ -238,7 +209,8 @@ const documentApi = contentManagerApi.injectEndpoints({
238
209
  }),
239
210
  invalidatesTags: (result, _error, { model }) => [
240
211
  { type: "Document", id: `${model}_LIST` },
241
- "Relations"
212
+ "Relations",
213
+ { type: "UidAvailability", id: model }
242
214
  ]
243
215
  }),
244
216
  deleteDocument: builder.mutation({
@@ -250,9 +222,7 @@ const documentApi = contentManagerApi.injectEndpoints({
250
222
  }
251
223
  }),
252
224
  invalidatesTags: (_result, _error, { collectionType, model }) => [
253
- { type: "Document", id: collectionType !== SINGLE_TYPES ? `${model}_LIST` : model },
254
- { type: "Release", id: "LIST" },
255
- { type: "ReleaseAction", id: "LIST" }
225
+ { type: "Document", id: collectionType !== SINGLE_TYPES ? `${model}_LIST` : model }
256
226
  ]
257
227
  }),
258
228
  deleteManyDocuments: builder.mutation({
@@ -264,11 +234,7 @@ const documentApi = contentManagerApi.injectEndpoints({
264
234
  params
265
235
  }
266
236
  }),
267
- invalidatesTags: (_res, _error, { model }) => [
268
- { type: "Document", id: `${model}_LIST` },
269
- { type: "Release", id: "LIST" },
270
- { type: "ReleaseAction", id: "LIST" }
271
- ]
237
+ invalidatesTags: (_res, _error, { model }) => [{ type: "Document", id: `${model}_LIST` }]
272
238
  }),
273
239
  discardDocument: builder.mutation({
274
240
  query: ({ collectionType, model, documentId, params }) => ({
@@ -286,8 +252,7 @@ const documentApi = contentManagerApi.injectEndpoints({
286
252
  },
287
253
  { type: "Document", id: `${model}_LIST` },
288
254
  "Relations",
289
- { type: "Release", id: "LIST" },
290
- { type: "ReleaseAction", id: "LIST" }
255
+ { type: "UidAvailability", id: model }
291
256
  ];
292
257
  }
293
258
  }),
@@ -305,6 +270,7 @@ const documentApi = contentManagerApi.injectEndpoints({
305
270
  }),
306
271
  providesTags: (result, _error, arg) => {
307
272
  return [
273
+ { type: "Document", id: `ALL_LIST` },
308
274
  { type: "Document", id: `${arg.model}_LIST` },
309
275
  ...result?.results.map(({ documentId }) => ({
310
276
  type: "Document",
@@ -343,6 +309,11 @@ const documentApi = contentManagerApi.injectEndpoints({
343
309
  {
344
310
  type: "Document",
345
311
  id: collectionType !== SINGLE_TYPES ? `${model}_${result && "documentId" in result ? result.documentId : documentId}` : model
312
+ },
313
+ // Make it easy to invalidate all individual documents queries for a model
314
+ {
315
+ type: "Document",
316
+ id: `${model}_ALL_ITEMS`
346
317
  }
347
318
  ];
348
319
  }
@@ -407,9 +378,20 @@ const documentApi = contentManagerApi.injectEndpoints({
407
378
  id: collectionType !== SINGLE_TYPES ? `${model}_${documentId}` : model
408
379
  },
409
380
  "Relations",
410
- { type: "Release", id: "LIST" },
411
- { type: "ReleaseAction", id: "LIST" }
381
+ { type: "UidAvailability", id: model }
412
382
  ];
383
+ },
384
+ async onQueryStarted({ data, ...patch }, { dispatch, queryFulfilled }) {
385
+ const patchResult = dispatch(
386
+ documentApi.util.updateQueryData("getDocument", patch, (draft) => {
387
+ Object.assign(draft.data, data);
388
+ })
389
+ );
390
+ try {
391
+ await queryFulfilled;
392
+ } catch {
393
+ patchResult.undo();
394
+ }
413
395
  }
414
396
  }),
415
397
  unpublishDocument: builder.mutation({
@@ -479,7 +461,7 @@ const buildValidParams = (query) => {
479
461
  const isBaseQueryError = (error) => {
480
462
  return error.name !== void 0;
481
463
  };
482
- const createYupSchema = (attributes = {}, components = {}) => {
464
+ const createYupSchema = (attributes = {}, components = {}, options = { status: null }) => {
483
465
  const createModelSchema = (attributes2) => yup.object().shape(
484
466
  Object.entries(attributes2).reduce((acc, [name, attribute]) => {
485
467
  if (DOCUMENT_META_FIELDS.includes(name)) {
@@ -492,7 +474,7 @@ const createYupSchema = (attributes = {}, components = {}) => {
492
474
  addMinValidation,
493
475
  addMaxValidation,
494
476
  addRegexValidation
495
- ].map((fn) => fn(attribute));
477
+ ].map((fn) => fn(attribute, options));
496
478
  const transformSchema = pipe(...validations);
497
479
  switch (attribute.type) {
498
480
  case "component": {
@@ -593,6 +575,14 @@ const createAttributeSchema = (attribute) => {
593
575
  if (!value || typeof value === "string" && value.length === 0) {
594
576
  return true;
595
577
  }
578
+ if (typeof value === "object") {
579
+ try {
580
+ JSON.stringify(value);
581
+ return true;
582
+ } catch (err) {
583
+ return false;
584
+ }
585
+ }
596
586
  try {
597
587
  JSON.parse(value);
598
588
  return true;
@@ -611,13 +601,7 @@ const createAttributeSchema = (attribute) => {
611
601
  return yup.mixed();
612
602
  }
613
603
  };
614
- const addRequiredValidation = (attribute) => (schema) => {
615
- if (attribute.required) {
616
- return schema.required({
617
- id: translatedErrors.required.id,
618
- defaultMessage: "This field is required."
619
- });
620
- }
604
+ const nullableSchema = (schema) => {
621
605
  return schema?.nullable ? schema.nullable() : (
622
606
  // In some cases '.nullable' will not be available on the schema.
623
607
  // e.g. when the schema has been built using yup.lazy (e.g. for relations).
@@ -625,7 +609,22 @@ const addRequiredValidation = (attribute) => (schema) => {
625
609
  schema
626
610
  );
627
611
  };
628
- const addMinLengthValidation = (attribute) => (schema) => {
612
+ const addRequiredValidation = (attribute, options) => (schema) => {
613
+ if (options.status === "draft") {
614
+ return nullableSchema(schema);
615
+ }
616
+ if ((attribute.type === "component" && attribute.repeatable || attribute.type === "dynamiczone") && attribute.required && "min" in schema) {
617
+ return schema.min(1, translatedErrors.required);
618
+ }
619
+ if (attribute.required && attribute.type !== "relation") {
620
+ return schema.required(translatedErrors.required);
621
+ }
622
+ return nullableSchema(schema);
623
+ };
624
+ const addMinLengthValidation = (attribute, options) => (schema) => {
625
+ if (options.status === "draft") {
626
+ return schema;
627
+ }
629
628
  if ("minLength" in attribute && attribute.minLength && Number.isInteger(attribute.minLength) && "min" in schema) {
630
629
  return schema.min(attribute.minLength, {
631
630
  ...translatedErrors.minLength,
@@ -647,9 +646,31 @@ const addMaxLengthValidation = (attribute) => (schema) => {
647
646
  }
648
647
  return schema;
649
648
  };
650
- const addMinValidation = (attribute) => (schema) => {
649
+ const addMinValidation = (attribute, options) => (schema) => {
651
650
  if ("min" in attribute) {
652
651
  const min = toInteger(attribute.min);
652
+ if (attribute.type === "component" && attribute.repeatable || attribute.type === "dynamiczone") {
653
+ if (options.status !== "draft" && !attribute.required && "test" in schema && min) {
654
+ return schema.test(
655
+ "custom-min",
656
+ {
657
+ ...translatedErrors.min,
658
+ values: {
659
+ min: attribute.min
660
+ }
661
+ },
662
+ (value) => {
663
+ if (!value) {
664
+ return true;
665
+ }
666
+ if (Array.isArray(value) && value.length === 0) {
667
+ return true;
668
+ }
669
+ return value.length >= min;
670
+ }
671
+ );
672
+ }
673
+ }
653
674
  if ("min" in schema && min) {
654
675
  return schema.min(min, {
655
676
  ...translatedErrors.min,
@@ -776,7 +797,10 @@ const useDocument = (args, opts) => {
776
797
  isLoading: isLoadingDocument,
777
798
  isFetching: isFetchingDocument,
778
799
  error
779
- } = useGetDocumentQuery(args, opts);
800
+ } = useGetDocumentQuery(args, {
801
+ ...opts,
802
+ skip: !args.documentId && args.collectionType !== SINGLE_TYPES || opts?.skip
803
+ });
780
804
  const { components, schema, isLoading: isLoadingSchema } = useContentTypeSchema(args.model);
781
805
  React.useEffect(() => {
782
806
  if (error) {
@@ -862,6 +886,7 @@ const useDocumentActions = () => {
862
886
  const { formatMessage } = useIntl();
863
887
  const { trackUsage } = useTracking();
864
888
  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
889
+ const navigate = useNavigate();
865
890
  const [deleteDocument] = useDeleteDocumentMutation();
866
891
  const _delete = React.useCallback(
867
892
  async ({ collectionType, model, documentId, params }, trackerProperty) => {
@@ -1197,7 +1222,6 @@ const useDocumentActions = () => {
1197
1222
  sourceId
1198
1223
  });
1199
1224
  if ("error" in res) {
1200
- toggleNotification({ type: "danger", message: formatAPIError(res.error) });
1201
1225
  return { error: res.error };
1202
1226
  }
1203
1227
  toggleNotification({
@@ -1216,7 +1240,7 @@ const useDocumentActions = () => {
1216
1240
  throw err;
1217
1241
  }
1218
1242
  },
1219
- [autoCloneDocument, formatAPIError, formatMessage, toggleNotification]
1243
+ [autoCloneDocument, formatMessage, toggleNotification]
1220
1244
  );
1221
1245
  const [cloneDocument] = useCloneDocumentMutation();
1222
1246
  const clone = React.useCallback(
@@ -1242,6 +1266,7 @@ const useDocumentActions = () => {
1242
1266
  defaultMessage: "Cloned document"
1243
1267
  })
1244
1268
  });
1269
+ navigate(`../../${res.data.data.documentId}`, { relative: "path" });
1245
1270
  return res.data;
1246
1271
  } catch (err) {
1247
1272
  toggleNotification({
@@ -1252,7 +1277,7 @@ const useDocumentActions = () => {
1252
1277
  throw err;
1253
1278
  }
1254
1279
  },
1255
- [cloneDocument, trackUsage, toggleNotification, formatMessage, formatAPIError]
1280
+ [cloneDocument, trackUsage, toggleNotification, formatMessage, formatAPIError, navigate]
1256
1281
  );
1257
1282
  const [getDoc] = useLazyGetDocumentQuery();
1258
1283
  const getDocument = React.useCallback(
@@ -1278,7 +1303,7 @@ const useDocumentActions = () => {
1278
1303
  };
1279
1304
  };
1280
1305
  const ProtectedHistoryPage = lazy(
1281
- () => import("./History-BgzAIj0G.mjs").then((mod) => ({ default: mod.ProtectedHistoryPage }))
1306
+ () => import("./History-utls71em.mjs").then((mod) => ({ default: mod.ProtectedHistoryPage }))
1282
1307
  );
1283
1308
  const routes$1 = [
1284
1309
  {
@@ -1291,31 +1316,31 @@ const routes$1 = [
1291
1316
  }
1292
1317
  ];
1293
1318
  const ProtectedEditViewPage = lazy(
1294
- () => import("./EditViewPage-ClIueJnM.mjs").then((mod) => ({ default: mod.ProtectedEditViewPage }))
1319
+ () => import("./EditViewPage-zFjJK0s8.mjs").then((mod) => ({ default: mod.ProtectedEditViewPage }))
1295
1320
  );
1296
1321
  const ProtectedListViewPage = lazy(
1297
- () => import("./ListViewPage-QU03PFj1.mjs").then((mod) => ({ default: mod.ProtectedListViewPage }))
1322
+ () => import("./ListViewPage-CdKd-PS_.mjs").then((mod) => ({ default: mod.ProtectedListViewPage }))
1298
1323
  );
1299
1324
  const ProtectedListConfiguration = lazy(
1300
- () => import("./ListConfigurationPage-GH55qfoT.mjs").then((mod) => ({
1325
+ () => import("./ListConfigurationPage-CuMXWWqb.mjs").then((mod) => ({
1301
1326
  default: mod.ProtectedListConfiguration
1302
1327
  }))
1303
1328
  );
1304
1329
  const ProtectedEditConfigurationPage = lazy(
1305
- () => import("./EditConfigurationPage-CBosWqQ7.mjs").then((mod) => ({
1330
+ () => import("./EditConfigurationPage-I2kKh9dx.mjs").then((mod) => ({
1306
1331
  default: mod.ProtectedEditConfigurationPage
1307
1332
  }))
1308
1333
  );
1309
1334
  const ProtectedComponentConfigurationPage = lazy(
1310
- () => import("./ComponentConfigurationPage-DErJQEVW.mjs").then((mod) => ({
1335
+ () => import("./ComponentConfigurationPage-CnL10QYC.mjs").then((mod) => ({
1311
1336
  default: mod.ProtectedComponentConfigurationPage
1312
1337
  }))
1313
1338
  );
1314
1339
  const NoPermissions = lazy(
1315
- () => import("./NoPermissionsPage-ct58lcY0.mjs").then((mod) => ({ default: mod.NoPermissions }))
1340
+ () => import("./NoPermissionsPage-DlWi4BAH.mjs").then((mod) => ({ default: mod.NoPermissions }))
1316
1341
  );
1317
1342
  const NoContentType = lazy(
1318
- () => import("./NoContentTypePage-CPs2CnzH.mjs").then((mod) => ({ default: mod.NoContentType }))
1343
+ () => import("./NoContentTypePage-DkToTT7u.mjs").then((mod) => ({ default: mod.NoContentType }))
1319
1344
  );
1320
1345
  const CollectionTypePages = () => {
1321
1346
  const { collectionType } = useParams();
@@ -1429,12 +1454,14 @@ const DocumentActionButton = (action) => {
1429
1454
  /* @__PURE__ */ jsx(
1430
1455
  Button,
1431
1456
  {
1432
- flex: 1,
1457
+ flex: "auto",
1433
1458
  startIcon: action.icon,
1434
1459
  disabled: action.disabled,
1435
1460
  onClick: handleClick(action),
1436
1461
  justifyContent: "center",
1437
1462
  variant: action.variant || "default",
1463
+ paddingTop: "7px",
1464
+ paddingBottom: "7px",
1438
1465
  children: action.label
1439
1466
  }
1440
1467
  ),
@@ -1442,7 +1469,7 @@ const DocumentActionButton = (action) => {
1442
1469
  DocumentActionConfirmDialog,
1443
1470
  {
1444
1471
  ...action.dialog,
1445
- variant: action.variant,
1472
+ variant: action.dialog?.variant ?? action.variant,
1446
1473
  isOpen: dialogId === action.id,
1447
1474
  onClose: handleClose
1448
1475
  }
@@ -1499,9 +1526,9 @@ const DocumentActionsMenu = ({
1499
1526
  disabled: isDisabled,
1500
1527
  size: "S",
1501
1528
  endIcon: null,
1502
- paddingTop: "7px",
1503
- paddingLeft: "9px",
1504
- paddingRight: "9px",
1529
+ paddingTop: "4px",
1530
+ paddingLeft: "7px",
1531
+ paddingRight: "7px",
1505
1532
  variant,
1506
1533
  children: [
1507
1534
  /* @__PURE__ */ jsx(More, { "aria-hidden": true, focusable: false }),
@@ -1512,7 +1539,7 @@ const DocumentActionsMenu = ({
1512
1539
  ]
1513
1540
  }
1514
1541
  ),
1515
- /* @__PURE__ */ jsxs(Menu.Content, { top: "4px", maxHeight: void 0, popoverPlacement: "bottom-end", children: [
1542
+ /* @__PURE__ */ jsxs(Menu.Content, { maxHeight: void 0, popoverPlacement: "bottom-end", children: [
1516
1543
  actions2.map((action) => {
1517
1544
  return /* @__PURE__ */ jsx(
1518
1545
  Menu.Item,
@@ -1521,10 +1548,25 @@ const DocumentActionsMenu = ({
1521
1548
  onSelect: handleClick(action),
1522
1549
  display: "block",
1523
1550
  children: /* @__PURE__ */ jsxs(Flex, { justifyContent: "space-between", gap: 4, children: [
1524
- /* @__PURE__ */ jsxs(Flex, { color: convertActionVariantToColor(action.variant), gap: 2, tag: "span", children: [
1525
- /* @__PURE__ */ jsx(Box, { tag: "span", color: convertActionVariantToIconColor(action.variant), children: action.icon }),
1526
- action.label
1527
- ] }),
1551
+ /* @__PURE__ */ jsxs(
1552
+ Flex,
1553
+ {
1554
+ color: !action.disabled ? convertActionVariantToColor(action.variant) : "inherit",
1555
+ gap: 2,
1556
+ tag: "span",
1557
+ children: [
1558
+ /* @__PURE__ */ jsx(
1559
+ Flex,
1560
+ {
1561
+ tag: "span",
1562
+ color: !action.disabled ? convertActionVariantToIconColor(action.variant) : "inherit",
1563
+ children: action.icon
1564
+ }
1565
+ ),
1566
+ action.label
1567
+ ]
1568
+ }
1569
+ ),
1528
1570
  action.id.startsWith("HistoryAction") && /* @__PURE__ */ jsx(
1529
1571
  Flex,
1530
1572
  {
@@ -1621,11 +1663,11 @@ const DocumentActionConfirmDialog = ({
1621
1663
  /* @__PURE__ */ jsx(Dialog.Header, { children: title }),
1622
1664
  /* @__PURE__ */ jsx(Dialog.Body, { children: content }),
1623
1665
  /* @__PURE__ */ jsxs(Dialog.Footer, { children: [
1624
- /* @__PURE__ */ jsx(Dialog.Cancel, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", children: formatMessage({
1666
+ /* @__PURE__ */ jsx(Dialog.Cancel, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", fullWidth: true, children: formatMessage({
1625
1667
  id: "app.components.Button.cancel",
1626
1668
  defaultMessage: "Cancel"
1627
1669
  }) }) }),
1628
- /* @__PURE__ */ jsx(Button, { onClick: handleConfirm, variant, children: formatMessage({
1670
+ /* @__PURE__ */ jsx(Button, { onClick: handleConfirm, variant, fullWidth: true, children: formatMessage({
1629
1671
  id: "app.components.Button.confirm",
1630
1672
  defaultMessage: "Confirm"
1631
1673
  }) })
@@ -1664,13 +1706,17 @@ const PublishAction$1 = ({
1664
1706
  const navigate = useNavigate();
1665
1707
  const { toggleNotification } = useNotification();
1666
1708
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
1709
+ const isListView = useMatch(LIST_PATH) !== null;
1667
1710
  const isCloning = useMatch(CLONE_PATH) !== null;
1668
1711
  const { formatMessage } = useIntl();
1669
- const { canPublish, canCreate, canUpdate } = useDocumentRBAC(
1670
- "PublishAction",
1671
- ({ canPublish: canPublish2, canCreate: canCreate2, canUpdate: canUpdate2 }) => ({ canPublish: canPublish2, canCreate: canCreate2, canUpdate: canUpdate2 })
1672
- );
1712
+ const canPublish = useDocumentRBAC("PublishAction", ({ canPublish: canPublish2 }) => canPublish2);
1673
1713
  const { publish } = useDocumentActions();
1714
+ const [
1715
+ countDraftRelations,
1716
+ { isLoading: isLoadingDraftRelations, isError: isErrorDraftRelations }
1717
+ ] = useLazyGetDraftRelationCountQuery();
1718
+ const [localCountOfDraftRelations, setLocalCountOfDraftRelations] = React.useState(0);
1719
+ const [serverCountOfDraftRelations, setServerCountOfDraftRelations] = React.useState(0);
1674
1720
  const [{ query, rawQuery }] = useQueryParams();
1675
1721
  const params = React.useMemo(() => buildValidParams(query), [query]);
1676
1722
  const modified = useForm("PublishAction", ({ modified: modified2 }) => modified2);
@@ -1679,10 +1725,103 @@ const PublishAction$1 = ({
1679
1725
  const validate = useForm("PublishAction", (state) => state.validate);
1680
1726
  const setErrors = useForm("PublishAction", (state) => state.setErrors);
1681
1727
  const formValues = useForm("PublishAction", ({ values }) => values);
1728
+ React.useEffect(() => {
1729
+ if (isErrorDraftRelations) {
1730
+ toggleNotification({
1731
+ type: "danger",
1732
+ message: formatMessage({
1733
+ id: getTranslation("error.records.fetch-draft-relatons"),
1734
+ defaultMessage: "An error occurred while fetching draft relations on this document."
1735
+ })
1736
+ });
1737
+ }
1738
+ }, [isErrorDraftRelations, toggleNotification, formatMessage]);
1739
+ React.useEffect(() => {
1740
+ const localDraftRelations = /* @__PURE__ */ new Set();
1741
+ const extractDraftRelations = (data) => {
1742
+ const relations = data.connect || [];
1743
+ relations.forEach((relation) => {
1744
+ if (relation.status === "draft") {
1745
+ localDraftRelations.add(relation.id);
1746
+ }
1747
+ });
1748
+ };
1749
+ const traverseAndExtract = (data) => {
1750
+ Object.entries(data).forEach(([key, value]) => {
1751
+ if (key === "connect" && Array.isArray(value)) {
1752
+ extractDraftRelations({ connect: value });
1753
+ } else if (typeof value === "object" && value !== null) {
1754
+ traverseAndExtract(value);
1755
+ }
1756
+ });
1757
+ };
1758
+ if (!documentId || modified) {
1759
+ traverseAndExtract(formValues);
1760
+ setLocalCountOfDraftRelations(localDraftRelations.size);
1761
+ }
1762
+ }, [documentId, modified, formValues, setLocalCountOfDraftRelations]);
1763
+ React.useEffect(() => {
1764
+ if (!document || !document.documentId || isListView) {
1765
+ return;
1766
+ }
1767
+ const fetchDraftRelationsCount = async () => {
1768
+ const { data, error } = await countDraftRelations({
1769
+ collectionType,
1770
+ model,
1771
+ documentId,
1772
+ params
1773
+ });
1774
+ if (error) {
1775
+ throw error;
1776
+ }
1777
+ if (data) {
1778
+ setServerCountOfDraftRelations(data.data);
1779
+ }
1780
+ };
1781
+ fetchDraftRelationsCount();
1782
+ }, [isListView, document, documentId, countDraftRelations, collectionType, model, params]);
1682
1783
  const isDocumentPublished = (document?.[PUBLISHED_AT_ATTRIBUTE_NAME] || meta?.availableStatus.some((doc) => doc[PUBLISHED_AT_ATTRIBUTE_NAME] !== null)) && document?.status !== "modified";
1683
1784
  if (!schema?.options?.draftAndPublish) {
1684
1785
  return null;
1685
1786
  }
1787
+ const performPublish = async () => {
1788
+ setSubmitting(true);
1789
+ try {
1790
+ const { errors } = await validate();
1791
+ if (errors) {
1792
+ toggleNotification({
1793
+ type: "danger",
1794
+ message: formatMessage({
1795
+ id: "content-manager.validation.error",
1796
+ defaultMessage: "There are validation errors in your document. Please fix them before saving."
1797
+ })
1798
+ });
1799
+ return;
1800
+ }
1801
+ const res = await publish(
1802
+ {
1803
+ collectionType,
1804
+ model,
1805
+ documentId,
1806
+ params
1807
+ },
1808
+ formValues
1809
+ );
1810
+ if ("data" in res && collectionType !== SINGLE_TYPES) {
1811
+ navigate({
1812
+ pathname: `../${collectionType}/${model}/${res.data.documentId}`,
1813
+ search: rawQuery
1814
+ });
1815
+ } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1816
+ setErrors(formatValidationErrors(res.error));
1817
+ }
1818
+ } finally {
1819
+ setSubmitting(false);
1820
+ }
1821
+ };
1822
+ const totalDraftRelations = localCountOfDraftRelations + serverCountOfDraftRelations;
1823
+ const enableDraftRelationsCount = false;
1824
+ const hasDraftRelations = enableDraftRelationsCount;
1686
1825
  return {
1687
1826
  /**
1688
1827
  * Disabled when:
@@ -1692,49 +1831,36 @@ const PublishAction$1 = ({
1692
1831
  * - the document is already published & not modified
1693
1832
  * - the document is being created & not modified
1694
1833
  * - the user doesn't have the permission to publish
1695
- * - the user doesn't have the permission to create a new document
1696
- * - the user doesn't have the permission to update the document
1697
1834
  */
1698
- disabled: isCloning || isSubmitting || activeTab === "published" || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish || Boolean(!document?.documentId && !canCreate || document?.documentId && !canUpdate),
1835
+ disabled: isCloning || isSubmitting || isLoadingDraftRelations || activeTab === "published" || !modified && isDocumentPublished || !modified && !document?.documentId || !canPublish,
1699
1836
  label: formatMessage({
1700
1837
  id: "app.utils.publish",
1701
1838
  defaultMessage: "Publish"
1702
1839
  }),
1703
1840
  onClick: async () => {
1704
- setSubmitting(true);
1705
- try {
1706
- const { errors } = await validate();
1707
- if (errors) {
1708
- toggleNotification({
1709
- type: "danger",
1710
- message: formatMessage({
1711
- id: "content-manager.validation.error",
1712
- defaultMessage: "There are validation errors in your document. Please fix them before saving."
1713
- })
1714
- });
1715
- return;
1716
- }
1717
- const res = await publish(
1718
- {
1719
- collectionType,
1720
- model,
1721
- documentId,
1722
- params
1723
- },
1724
- formValues
1725
- );
1726
- if ("data" in res && collectionType !== SINGLE_TYPES) {
1727
- navigate({
1728
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
1729
- search: rawQuery
1730
- });
1731
- } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1732
- setErrors(formatValidationErrors(res.error));
1841
+ await performPublish();
1842
+ },
1843
+ dialog: hasDraftRelations ? {
1844
+ type: "dialog",
1845
+ variant: "danger",
1846
+ footer: null,
1847
+ title: formatMessage({
1848
+ id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.title`),
1849
+ defaultMessage: "Confirmation"
1850
+ }),
1851
+ content: formatMessage(
1852
+ {
1853
+ id: getTranslation(`popUpwarning.warning.bulk-has-draft-relations.message`),
1854
+ defaultMessage: "This entry is related to {count, plural, one {# draft entry} other {# draft entries}}. Publishing it could leave broken links in your app."
1855
+ },
1856
+ {
1857
+ count: totalDraftRelations
1733
1858
  }
1734
- } finally {
1735
- setSubmitting(false);
1859
+ ),
1860
+ onConfirm: async () => {
1861
+ await performPublish();
1736
1862
  }
1737
- }
1863
+ } : void 0
1738
1864
  };
1739
1865
  };
1740
1866
  PublishAction$1.type = "publish";
@@ -1750,10 +1876,6 @@ const UpdateAction = ({
1750
1876
  const cloneMatch = useMatch(CLONE_PATH);
1751
1877
  const isCloning = cloneMatch !== null;
1752
1878
  const { formatMessage } = useIntl();
1753
- const { canCreate, canUpdate } = useDocumentRBAC("UpdateAction", ({ canCreate: canCreate2, canUpdate: canUpdate2 }) => ({
1754
- canCreate: canCreate2,
1755
- canUpdate: canUpdate2
1756
- }));
1757
1879
  const { create, update, clone } = useDocumentActions();
1758
1880
  const [{ query, rawQuery }] = useQueryParams();
1759
1881
  const params = React.useMemo(() => buildValidParams(query), [query]);
@@ -1770,10 +1892,8 @@ const UpdateAction = ({
1770
1892
  * - the form is submitting
1771
1893
  * - the document is not modified & we're not cloning (you can save a clone entity straight away)
1772
1894
  * - the active tab is the published tab
1773
- * - the user doesn't have the permission to create a new document
1774
- * - the user doesn't have the permission to update the document
1775
1895
  */
1776
- disabled: isSubmitting || !modified && !isCloning || activeTab === "published" || Boolean(!documentId && !canCreate || documentId && !canUpdate),
1896
+ disabled: isSubmitting || !modified && !isCloning || activeTab === "published",
1777
1897
  label: formatMessage({
1778
1898
  id: "content-manager.containers.Edit.save",
1779
1899
  defaultMessage: "Save"
@@ -1781,16 +1901,18 @@ const UpdateAction = ({
1781
1901
  onClick: async () => {
1782
1902
  setSubmitting(true);
1783
1903
  try {
1784
- const { errors } = await validate();
1785
- if (errors) {
1786
- toggleNotification({
1787
- type: "danger",
1788
- message: formatMessage({
1789
- id: "content-manager.validation.error",
1790
- defaultMessage: "There are validation errors in your document. Please fix them before saving."
1791
- })
1792
- });
1793
- return;
1904
+ if (activeTab !== "draft") {
1905
+ const { errors } = await validate();
1906
+ if (errors) {
1907
+ toggleNotification({
1908
+ type: "danger",
1909
+ message: formatMessage({
1910
+ id: "content-manager.validation.error",
1911
+ defaultMessage: "There are validation errors in your document. Please fix them before saving."
1912
+ })
1913
+ });
1914
+ return;
1915
+ }
1794
1916
  }
1795
1917
  if (isCloning) {
1796
1918
  const res = await clone(
@@ -1802,10 +1924,13 @@ const UpdateAction = ({
1802
1924
  document
1803
1925
  );
1804
1926
  if ("data" in res) {
1805
- navigate({
1806
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
1807
- search: rawQuery
1808
- });
1927
+ navigate(
1928
+ {
1929
+ pathname: `../${res.data.documentId}`,
1930
+ search: rawQuery
1931
+ },
1932
+ { relative: "path" }
1933
+ );
1809
1934
  } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1810
1935
  setErrors(formatValidationErrors(res.error));
1811
1936
  }
@@ -1833,10 +1958,13 @@ const UpdateAction = ({
1833
1958
  document
1834
1959
  );
1835
1960
  if ("data" in res && collectionType !== SINGLE_TYPES) {
1836
- navigate({
1837
- pathname: `../${collectionType}/${model}/${res.data.documentId}`,
1838
- search: rawQuery
1839
- });
1961
+ navigate(
1962
+ {
1963
+ pathname: `../${res.data.documentId}`,
1964
+ search: rawQuery
1965
+ },
1966
+ { replace: true, relative: "path" }
1967
+ );
1840
1968
  } else if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1841
1969
  setErrors(formatValidationErrors(res.error));
1842
1970
  }
@@ -1880,7 +2008,7 @@ const UnpublishAction$1 = ({
1880
2008
  id: "app.utils.unpublish",
1881
2009
  defaultMessage: "Unpublish"
1882
2010
  }),
1883
- icon: /* @__PURE__ */ jsx(StyledCrossCircle, {}),
2011
+ icon: /* @__PURE__ */ jsx(Cross, {}),
1884
2012
  onClick: async () => {
1885
2013
  if (!documentId && collectionType !== SINGLE_TYPES || isDocumentModified) {
1886
2014
  if (!documentId) {
@@ -1992,7 +2120,7 @@ const DiscardAction = ({
1992
2120
  id: "content-manager.actions.discard.label",
1993
2121
  defaultMessage: "Discard changes"
1994
2122
  }),
1995
- icon: /* @__PURE__ */ jsx(StyledCrossCircle, {}),
2123
+ icon: /* @__PURE__ */ jsx(Cross, {}),
1996
2124
  position: ["panel", "table-row"],
1997
2125
  variant: "danger",
1998
2126
  dialog: {
@@ -2020,11 +2148,6 @@ const DiscardAction = ({
2020
2148
  };
2021
2149
  };
2022
2150
  DiscardAction.type = "discard";
2023
- const StyledCrossCircle = styled(CrossCircle)`
2024
- path {
2025
- fill: currentColor;
2026
- }
2027
- `;
2028
2151
  const DEFAULT_ACTIONS = [PublishAction$1, UpdateAction, UnpublishAction$1, DiscardAction];
2029
2152
  const intervals = ["years", "months", "days", "hours", "minutes", "seconds"];
2030
2153
  const RelativeTime = React.forwardRef(
@@ -2072,7 +2195,7 @@ const getDisplayName = ({
2072
2195
  };
2073
2196
  const capitalise = (str) => str.charAt(0).toUpperCase() + str.slice(1);
2074
2197
  const DocumentStatus = ({ status = "draft", ...restProps }) => {
2075
- const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
2198
+ const statusVariant = status === "draft" ? "secondary" : status === "published" ? "success" : "alternative";
2076
2199
  return /* @__PURE__ */ jsx(Status, { ...restProps, showBullet: false, size: "S", variant: statusVariant, children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "omega", fontWeight: "bold", children: capitalise(status) }) });
2077
2200
  };
2078
2201
  const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
@@ -2082,23 +2205,13 @@ const Header = ({ isCreating, status, title: documentTitle = "Untitled" }) => {
2082
2205
  id: "content-manager.containers.edit.title.new",
2083
2206
  defaultMessage: "Create an entry"
2084
2207
  }) : documentTitle;
2085
- return /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "flex-start", paddingTop: 8, paddingBottom: 4, gap: 3, children: [
2208
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "flex-start", paddingTop: 6, paddingBottom: 4, gap: 2, children: [
2086
2209
  /* @__PURE__ */ jsx(BackButton, {}),
2087
- /* @__PURE__ */ jsxs(
2088
- Flex,
2089
- {
2090
- width: "100%",
2091
- justifyContent: "space-between",
2092
- paddingTop: 1,
2093
- gap: "80px",
2094
- alignItems: "flex-start",
2095
- children: [
2096
- /* @__PURE__ */ jsx(Typography, { variant: "alpha", tag: "h1", children: title }),
2097
- /* @__PURE__ */ jsx(HeaderToolbar, {})
2098
- ]
2099
- }
2100
- ),
2101
- status ? /* @__PURE__ */ jsx(DocumentStatus, { status: isCloning ? "draft" : status }) : null
2210
+ /* @__PURE__ */ jsxs(Flex, { width: "100%", justifyContent: "space-between", gap: "80px", alignItems: "flex-start", children: [
2211
+ /* @__PURE__ */ jsx(Typography, { variant: "alpha", tag: "h1", children: title }),
2212
+ /* @__PURE__ */ jsx(HeaderToolbar, {})
2213
+ ] }),
2214
+ status ? /* @__PURE__ */ jsx(Box, { marginTop: 1, children: /* @__PURE__ */ jsx(DocumentStatus, { status: isCloning ? "draft" : status }) }) : null
2102
2215
  ] });
2103
2216
  };
2104
2217
  const HeaderToolbar = () => {
@@ -2265,8 +2378,22 @@ const Information = ({ activeTab }) => {
2265
2378
  );
2266
2379
  };
2267
2380
  const HeaderActions = ({ actions: actions2 }) => {
2268
- return /* @__PURE__ */ jsx(Flex, { children: actions2.map((action) => {
2269
- if ("options" in action) {
2381
+ const [dialogId, setDialogId] = React.useState(null);
2382
+ const handleClick = (action) => async (e) => {
2383
+ if (!("options" in action)) {
2384
+ const { onClick = () => false, dialog, id } = action;
2385
+ const muteDialog = await onClick(e);
2386
+ if (dialog && !muteDialog) {
2387
+ e.preventDefault();
2388
+ setDialogId(id);
2389
+ }
2390
+ }
2391
+ };
2392
+ const handleClose = () => {
2393
+ setDialogId(null);
2394
+ };
2395
+ return /* @__PURE__ */ jsx(Flex, { gap: 1, children: actions2.map((action) => {
2396
+ if (action.options) {
2270
2397
  return /* @__PURE__ */ jsx(
2271
2398
  SingleSelect,
2272
2399
  {
@@ -2280,10 +2407,49 @@ const HeaderActions = ({ actions: actions2 }) => {
2280
2407
  action.id
2281
2408
  );
2282
2409
  } else {
2283
- return null;
2410
+ if (action.type === "icon") {
2411
+ return /* @__PURE__ */ jsxs(React.Fragment, { children: [
2412
+ /* @__PURE__ */ jsx(
2413
+ IconButton,
2414
+ {
2415
+ disabled: action.disabled,
2416
+ label: action.label,
2417
+ size: "S",
2418
+ onClick: handleClick(action),
2419
+ children: action.icon
2420
+ }
2421
+ ),
2422
+ action.dialog ? /* @__PURE__ */ jsx(
2423
+ HeaderActionDialog,
2424
+ {
2425
+ ...action.dialog,
2426
+ isOpen: dialogId === action.id,
2427
+ onClose: handleClose
2428
+ }
2429
+ ) : null
2430
+ ] }, action.id);
2431
+ }
2284
2432
  }
2285
2433
  }) });
2286
2434
  };
2435
+ const HeaderActionDialog = ({
2436
+ onClose,
2437
+ onCancel,
2438
+ title,
2439
+ content: Content,
2440
+ isOpen
2441
+ }) => {
2442
+ const handleClose = async () => {
2443
+ if (onCancel) {
2444
+ await onCancel();
2445
+ }
2446
+ onClose();
2447
+ };
2448
+ return /* @__PURE__ */ jsx(Dialog.Root, { open: isOpen, onOpenChange: handleClose, children: /* @__PURE__ */ jsxs(Dialog.Content, { children: [
2449
+ /* @__PURE__ */ jsx(Dialog.Header, { children: title }),
2450
+ typeof Content === "function" ? /* @__PURE__ */ jsx(Content, { onClose: handleClose }) : Content
2451
+ ] }) });
2452
+ };
2287
2453
  const ConfigureTheViewAction = ({ collectionType, model }) => {
2288
2454
  const navigate = useNavigate();
2289
2455
  const { formatMessage } = useIntl();
@@ -2419,7 +2585,7 @@ const ActionsPanel = () => {
2419
2585
  return {
2420
2586
  title: formatMessage({
2421
2587
  id: "content-manager.containers.edit.panels.default.title",
2422
- defaultMessage: "Document"
2588
+ defaultMessage: "Entry"
2423
2589
  }),
2424
2590
  content: /* @__PURE__ */ jsx(ActionsPanelContent, {})
2425
2591
  };
@@ -2663,7 +2829,8 @@ const formatEditLayout = (data, {
2663
2829
  layout: convertEditLayoutToFieldLayouts(
2664
2830
  configuration.layouts.edit,
2665
2831
  components[uid].attributes,
2666
- configuration.metadatas
2832
+ configuration.metadatas,
2833
+ { configurations: data.components, schemas: components }
2667
2834
  ),
2668
2835
  settings: {
2669
2836
  ...configuration.settings,
@@ -2789,7 +2956,7 @@ const ConfirmBulkActionDialog = ({
2789
2956
  endAction
2790
2957
  }) => {
2791
2958
  const { formatMessage } = useIntl();
2792
- return /* @__PURE__ */ jsx(Dialog.Root, { onOpenChange: onToggleDialog, open: isOpen, children: /* @__PURE__ */ jsxs(Dialog.Content, { children: [
2959
+ return /* @__PURE__ */ jsx(Dialog.Root, { open: isOpen, children: /* @__PURE__ */ jsxs(Dialog.Content, { children: [
2793
2960
  /* @__PURE__ */ jsx(Dialog.Header, { children: formatMessage({
2794
2961
  id: "app.components.ConfirmDialog.title",
2795
2962
  defaultMessage: "Confirmation"
@@ -2820,6 +2987,7 @@ const ConfirmDialogPublishAll = ({
2820
2987
  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);
2821
2988
  const { model, schema } = useDoc();
2822
2989
  const [{ query }] = useQueryParams();
2990
+ const enableDraftRelationsCount = false;
2823
2991
  const {
2824
2992
  data: countDraftRelations = 0,
2825
2993
  isLoading,
@@ -2831,7 +2999,7 @@ const ConfirmDialogPublishAll = ({
2831
2999
  locale: query?.plugins?.i18n?.locale
2832
3000
  },
2833
3001
  {
2834
- skip: selectedEntries.length === 0
3002
+ skip: !enableDraftRelationsCount
2835
3003
  }
2836
3004
  );
2837
3005
  React.useEffect(() => {
@@ -2910,7 +3078,14 @@ const formatErrorMessages = (errors, parentKey, formatMessage) => {
2910
3078
  )
2911
3079
  );
2912
3080
  } else {
2913
- messages.push(...formatErrorMessages(value, currentKey, formatMessage));
3081
+ messages.push(
3082
+ ...formatErrorMessages(
3083
+ // @ts-expect-error TODO: check why value is not compatible with FormErrors
3084
+ value,
3085
+ currentKey,
3086
+ formatMessage
3087
+ )
3088
+ );
2914
3089
  }
2915
3090
  } else {
2916
3091
  messages.push(
@@ -3009,7 +3184,7 @@ const SelectedEntriesTableContent = ({
3009
3184
  status: row.status
3010
3185
  }
3011
3186
  ) }),
3012
- /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(
3187
+ /* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
3013
3188
  IconButton,
3014
3189
  {
3015
3190
  tag: Link,
@@ -3032,9 +3207,10 @@ const SelectedEntriesTableContent = ({
3032
3207
  ),
3033
3208
  target: "_blank",
3034
3209
  marginLeft: "auto",
3035
- children: /* @__PURE__ */ jsx(Pencil, {})
3210
+ variant: "ghost",
3211
+ children: /* @__PURE__ */ jsx(Pencil, { width: "1.6rem", height: "1.6rem" })
3036
3212
  }
3037
- ) })
3213
+ ) }) })
3038
3214
  ] }, row.id)) })
3039
3215
  ] });
3040
3216
  };
@@ -3071,7 +3247,13 @@ const SelectedEntriesModalContent = ({
3071
3247
  );
3072
3248
  const { rows, validationErrors } = React.useMemo(() => {
3073
3249
  if (data.length > 0 && schema) {
3074
- const validate = createYupSchema(schema.attributes, components);
3250
+ const validate = createYupSchema(
3251
+ schema.attributes,
3252
+ components,
3253
+ // Since this is the "Publish" action, the validation
3254
+ // schema must enforce the rules for published entities
3255
+ { status: "published" }
3256
+ );
3075
3257
  const validationErrors2 = {};
3076
3258
  const rows2 = data.map((entry) => {
3077
3259
  try {
@@ -3421,7 +3603,7 @@ const TableActions = ({ document }) => {
3421
3603
  DescriptionComponentRenderer,
3422
3604
  {
3423
3605
  props,
3424
- descriptions: plugins["content-manager"].apis.getDocumentActions(),
3606
+ descriptions: plugins["content-manager"].apis.getDocumentActions().filter((action) => action.name !== "PublishAction"),
3425
3607
  children: (actions2) => {
3426
3608
  const tableRowActions = actions2.filter((action) => {
3427
3609
  const positions = Array.isArray(action.position) ? action.position : [action.position];
@@ -3532,7 +3714,7 @@ const CloneAction = ({ model, documentId }) => {
3532
3714
  }),
3533
3715
  content: /* @__PURE__ */ jsx(AutoCloneFailureModalBody, { prohibitedFields }),
3534
3716
  footer: ({ onClose }) => {
3535
- return /* @__PURE__ */ jsxs(Flex, { justifyContent: "space-between", children: [
3717
+ return /* @__PURE__ */ jsxs(Modal.Footer, { children: [
3536
3718
  /* @__PURE__ */ jsx(Button, { onClick: onClose, variant: "tertiary", children: formatMessage({
3537
3719
  id: "cancel",
3538
3720
  defaultMessage: "Cancel"
@@ -3573,8 +3755,7 @@ class ContentManagerPlugin {
3573
3755
  documentActions = [
3574
3756
  ...DEFAULT_ACTIONS,
3575
3757
  ...DEFAULT_TABLE_ROW_ACTIONS,
3576
- ...DEFAULT_HEADER_ACTIONS,
3577
- HistoryAction
3758
+ ...DEFAULT_HEADER_ACTIONS
3578
3759
  ];
3579
3760
  editViewSidePanels = [ActionsPanel];
3580
3761
  headerActions = [];
@@ -3663,6 +3844,52 @@ const getPrintableType = (value) => {
3663
3844
  }
3664
3845
  return nativeType;
3665
3846
  };
3847
+ const HistoryAction = ({ model, document }) => {
3848
+ const { formatMessage } = useIntl();
3849
+ const [{ query }] = useQueryParams();
3850
+ const navigate = useNavigate();
3851
+ const pluginsQueryParams = stringify({ plugins: query.plugins }, { encode: false });
3852
+ if (!window.strapi.features.isEnabled("cms-content-history")) {
3853
+ return null;
3854
+ }
3855
+ return {
3856
+ icon: /* @__PURE__ */ jsx(ClockCounterClockwise, {}),
3857
+ label: formatMessage({
3858
+ id: "content-manager.history.document-action",
3859
+ defaultMessage: "Content History"
3860
+ }),
3861
+ onClick: () => navigate({ pathname: "history", search: pluginsQueryParams }),
3862
+ disabled: (
3863
+ /**
3864
+ * The user is creating a new document.
3865
+ * It hasn't been saved yet, so there's no history to go to
3866
+ */
3867
+ !document || /**
3868
+ * The document has been created but the current dimension has never been saved.
3869
+ * For example, the user is creating a new locale in an existing document,
3870
+ * so there's no history for the document in that locale
3871
+ */
3872
+ !document.id || /**
3873
+ * History is only available for content types created by the user.
3874
+ * These have the `api::` prefix, as opposed to the ones created by Strapi or plugins,
3875
+ * which start with `admin::` or `plugin::`
3876
+ */
3877
+ !model.startsWith("api::")
3878
+ ),
3879
+ position: "header"
3880
+ };
3881
+ };
3882
+ HistoryAction.type = "history";
3883
+ const historyAdmin = {
3884
+ bootstrap(app) {
3885
+ const { addDocumentAction } = app.getPlugin("content-manager").apis;
3886
+ addDocumentAction((actions2) => {
3887
+ const indexOfDeleteAction = actions2.findIndex((action) => action.type === "delete");
3888
+ actions2.splice(indexOfDeleteAction, 0, HistoryAction);
3889
+ return actions2;
3890
+ });
3891
+ }
3892
+ };
3666
3893
  const initialState = {
3667
3894
  collectionTypeLinks: [],
3668
3895
  components: [],
@@ -3713,15 +3940,29 @@ const index = {
3713
3940
  defaultMessage: "Content Manager"
3714
3941
  },
3715
3942
  permissions: [],
3716
- Component: () => import("./layout-B1Z-9koY.mjs").then((mod) => ({ default: mod.Layout })),
3717
3943
  position: 1
3718
3944
  });
3945
+ app.router.addRoute({
3946
+ path: "content-manager/*",
3947
+ lazy: async () => {
3948
+ const { Layout } = await import("./layout-DX_52HSH.mjs");
3949
+ return {
3950
+ Component: Layout
3951
+ };
3952
+ },
3953
+ children: routes
3954
+ });
3719
3955
  app.registerPlugin(cm.config);
3720
3956
  },
3957
+ bootstrap(app) {
3958
+ if (typeof historyAdmin.bootstrap === "function") {
3959
+ historyAdmin.bootstrap(app);
3960
+ }
3961
+ },
3721
3962
  async registerTrads({ locales }) {
3722
3963
  const importedTrads = await Promise.all(
3723
3964
  locales.map((locale) => {
3724
- return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/ar.json": () => import("./ar-CCEVvqGG.mjs"), "./translations/ca.json": () => import("./ca-5U32ON2v.mjs"), "./translations/cs.json": () => import("./cs-CM2aBUar.mjs"), "./translations/de.json": () => import("./de-C72KDNOl.mjs"), "./translations/en.json": () => import("./en-Ux26r5pl.mjs"), "./translations/es.json": () => import("./es-CeXiYflN.mjs"), "./translations/eu.json": () => import("./eu-CdALomew.mjs"), "./translations/fr.json": () => import("./fr-CD9VFbPM.mjs"), "./translations/gu.json": () => import("./gu-CNpaMDpH.mjs"), "./translations/hi.json": () => import("./hi-Dwvd04m3.mjs"), "./translations/hu.json": () => import("./hu-CeYvaaO0.mjs"), "./translations/id.json": () => import("./id-BtwA9WJT.mjs"), "./translations/it.json": () => import("./it-BrVPqaf1.mjs"), "./translations/ja.json": () => import("./ja-CtsUxOvk.mjs"), "./translations/ko.json": () => import("./ko-HVQRlfUI.mjs"), "./translations/ml.json": () => import("./ml-BihZwQit.mjs"), "./translations/ms.json": () => import("./ms-m_WjyWx7.mjs"), "./translations/nl.json": () => import("./nl-D4R9gHx5.mjs"), "./translations/pl.json": () => import("./pl-sbx9mSt_.mjs"), "./translations/pt-BR.json": () => import("./pt-BR-C71iDxnh.mjs"), "./translations/pt.json": () => import("./pt-BsaFvS8-.mjs"), "./translations/ru.json": () => import("./ru-BE6A4Exp.mjs"), "./translations/sa.json": () => import("./sa-Dag0k-Z8.mjs"), "./translations/sk.json": () => import("./sk-BFg-R8qJ.mjs"), "./translations/sv.json": () => import("./sv-CUnfWGsh.mjs"), "./translations/th.json": () => import("./th-BqbI8lIT.mjs"), "./translations/tr.json": () => import("./tr-CgeK3wJM.mjs"), "./translations/uk.json": () => import("./uk-CR-zDhAY.mjs"), "./translations/vi.json": () => import("./vi-DUXIk_fw.mjs"), "./translations/zh-Hans.json": () => import("./zh-Hans-BPQcRIyH.mjs"), "./translations/zh.json": () => import("./zh-BWZspA60.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
3965
+ return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/ar.json": () => import("./ar-CCEVvqGG.mjs"), "./translations/ca.json": () => import("./ca-5U32ON2v.mjs"), "./translations/cs.json": () => import("./cs-CM2aBUar.mjs"), "./translations/de.json": () => import("./de-C72KDNOl.mjs"), "./translations/en.json": () => import("./en-CPTj6CjC.mjs"), "./translations/es.json": () => import("./es-CeXiYflN.mjs"), "./translations/eu.json": () => import("./eu-CdALomew.mjs"), "./translations/fr.json": () => import("./fr-CD9VFbPM.mjs"), "./translations/gu.json": () => import("./gu-CNpaMDpH.mjs"), "./translations/hi.json": () => import("./hi-Dwvd04m3.mjs"), "./translations/hu.json": () => import("./hu-CeYvaaO0.mjs"), "./translations/id.json": () => import("./id-BtwA9WJT.mjs"), "./translations/it.json": () => import("./it-BrVPqaf1.mjs"), "./translations/ja.json": () => import("./ja-CtsUxOvk.mjs"), "./translations/ko.json": () => import("./ko-HVQRlfUI.mjs"), "./translations/ml.json": () => import("./ml-BihZwQit.mjs"), "./translations/ms.json": () => import("./ms-m_WjyWx7.mjs"), "./translations/nl.json": () => import("./nl-D4R9gHx5.mjs"), "./translations/pl.json": () => import("./pl-sbx9mSt_.mjs"), "./translations/pt-BR.json": () => import("./pt-BR-C71iDxnh.mjs"), "./translations/pt.json": () => import("./pt-BsaFvS8-.mjs"), "./translations/ru.json": () => import("./ru-BE6A4Exp.mjs"), "./translations/sa.json": () => import("./sa-Dag0k-Z8.mjs"), "./translations/sk.json": () => import("./sk-BFg-R8qJ.mjs"), "./translations/sv.json": () => import("./sv-CUnfWGsh.mjs"), "./translations/th.json": () => import("./th-BqbI8lIT.mjs"), "./translations/tr.json": () => import("./tr-CgeK3wJM.mjs"), "./translations/uk.json": () => import("./uk-CR-zDhAY.mjs"), "./translations/vi.json": () => import("./vi-DUXIk_fw.mjs"), "./translations/zh-Hans.json": () => import("./zh-Hans-BPQcRIyH.mjs"), "./translations/zh.json": () => import("./zh-BWZspA60.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
3725
3966
  return {
3726
3967
  data: prefixPluginTranslations(data, PLUGIN_ID),
3727
3968
  locale
@@ -3767,11 +4008,11 @@ export {
3767
4008
  PERMISSIONS as k,
3768
4009
  DocumentRBAC as l,
3769
4010
  DOCUMENT_META_FIELDS as m,
3770
- useDocLayout as n,
3771
- useGetContentTypeConfigurationQuery as o,
3772
- CREATOR_FIELDS as p,
3773
- getMainField as q,
3774
- routes as r,
4011
+ CLONE_PATH as n,
4012
+ useDocLayout as o,
4013
+ useGetContentTypeConfigurationQuery as p,
4014
+ CREATOR_FIELDS as q,
4015
+ getMainField as r,
3775
4016
  setInitialData as s,
3776
4017
  getDisplayName as t,
3777
4018
  useContentTypeSchema as u,
@@ -3781,4 +4022,4 @@ export {
3781
4022
  capitalise as y,
3782
4023
  useUpdateContentTypeConfigurationMutation as z
3783
4024
  };
3784
- //# sourceMappingURL=index-6kKXK7y8.mjs.map
4025
+ //# sourceMappingURL=index-BHfS6_D5.mjs.map