@strapi/content-manager 0.0.0-next.b0db56479de441dfe8feb37a43c7f6f6fecf75c1 → 0.0.0-next.b6435ada233136a0d0b14fba67961ff8f16cdac2

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 (129) hide show
  1. package/dist/_chunks/CardDragPreview-C0QyJgRA.js.map +1 -1
  2. package/dist/_chunks/CardDragPreview-DOxamsuj.mjs.map +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-Cjr64OS0.js → ComponentConfigurationPage-BlzvDpbX.js} +4 -5
  4. package/dist/_chunks/{ComponentConfigurationPage-Cjr64OS0.js.map → ComponentConfigurationPage-BlzvDpbX.js.map} +1 -1
  5. package/dist/_chunks/{ComponentConfigurationPage-DKuCF_uX.mjs → ComponentConfigurationPage-DaPOlQaD.mjs} +3 -3
  6. package/dist/_chunks/{ComponentConfigurationPage-DKuCF_uX.mjs.map → ComponentConfigurationPage-DaPOlQaD.mjs.map} +1 -1
  7. package/dist/_chunks/{ComponentIcon-BXdiCGQp.js → ComponentIcon-CRbtQEUV.js} +2 -3
  8. package/dist/_chunks/{ComponentIcon-BXdiCGQp.js.map → ComponentIcon-CRbtQEUV.js.map} +1 -1
  9. package/dist/_chunks/ComponentIcon-u4bIXTFY.mjs.map +1 -1
  10. package/dist/_chunks/{EditConfigurationPage-CyqSP6ru.mjs → EditConfigurationPage-BZPXItXo.mjs} +3 -3
  11. package/dist/_chunks/{EditConfigurationPage-CyqSP6ru.mjs.map → EditConfigurationPage-BZPXItXo.mjs.map} +1 -1
  12. package/dist/_chunks/{EditConfigurationPage-BeikGxvq.js → EditConfigurationPage-uy-v43AR.js} +4 -5
  13. package/dist/_chunks/{EditConfigurationPage-BeikGxvq.js.map → EditConfigurationPage-uy-v43AR.js.map} +1 -1
  14. package/dist/_chunks/{EditViewPage-pyqEgLgP.js → EditViewPage-DT6A4ayX.js} +4 -5
  15. package/dist/_chunks/{EditViewPage-pyqEgLgP.js.map → EditViewPage-DT6A4ayX.js.map} +1 -1
  16. package/dist/_chunks/{EditViewPage-PrPHZN_9.mjs → EditViewPage-oOLeTySr.mjs} +3 -3
  17. package/dist/_chunks/{EditViewPage-PrPHZN_9.mjs.map → EditViewPage-oOLeTySr.mjs.map} +1 -1
  18. package/dist/_chunks/{Field-DuAYQka5.mjs → Field-D7dv2aUX.mjs} +146 -114
  19. package/dist/_chunks/Field-D7dv2aUX.mjs.map +1 -0
  20. package/dist/_chunks/{Field-fKtb7rWK.js → Field-kYFVIGiP.js} +148 -116
  21. package/dist/_chunks/Field-kYFVIGiP.js.map +1 -0
  22. package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +1 -1
  23. package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +1 -1
  24. package/dist/_chunks/{Form-Dxh71ckp.mjs → Form-BxR6sc29.mjs} +3 -3
  25. package/dist/_chunks/{Form-Dxh71ckp.mjs.map → Form-BxR6sc29.mjs.map} +1 -1
  26. package/dist/_chunks/{Form-BPXw-S-J.js → Form-CCijSg3V.js} +5 -6
  27. package/dist/_chunks/{Form-BPXw-S-J.js.map → Form-CCijSg3V.js.map} +1 -1
  28. package/dist/_chunks/{History-BGGn9JGY.js → History-BMndx49M.js} +8 -7
  29. package/dist/_chunks/History-BMndx49M.js.map +1 -0
  30. package/dist/_chunks/{History-CGblSVMc.mjs → History-D8F7aYQU.mjs} +8 -6
  31. package/dist/_chunks/History-D8F7aYQU.mjs.map +1 -0
  32. package/dist/_chunks/{ListConfigurationPage-D3Avyi4t.js → ListConfigurationPage-DouY1EWM.js} +6 -6
  33. package/dist/_chunks/ListConfigurationPage-DouY1EWM.js.map +1 -0
  34. package/dist/_chunks/{ListConfigurationPage-TIM0JveM.mjs → ListConfigurationPage-DqAdSPwC.mjs} +6 -5
  35. package/dist/_chunks/ListConfigurationPage-DqAdSPwC.mjs.map +1 -0
  36. package/dist/_chunks/{ListViewPage-DtAHWFMV.js → ListViewPage-BPVmh9pq.js} +51 -51
  37. package/dist/_chunks/ListViewPage-BPVmh9pq.js.map +1 -0
  38. package/dist/_chunks/{ListViewPage-C975eW-t.mjs → ListViewPage-C73F0jPh.mjs} +50 -49
  39. package/dist/_chunks/ListViewPage-C73F0jPh.mjs.map +1 -0
  40. package/dist/_chunks/{NoContentTypePage-SgNTVGjF.mjs → NoContentTypePage-B5w7iJOF.mjs} +2 -2
  41. package/dist/_chunks/{NoContentTypePage-SgNTVGjF.mjs.map → NoContentTypePage-B5w7iJOF.mjs.map} +1 -1
  42. package/dist/_chunks/{NoContentTypePage-BFjWZX0i.js → NoContentTypePage-BwcL--4H.js} +2 -2
  43. package/dist/_chunks/{NoContentTypePage-BFjWZX0i.js.map → NoContentTypePage-BwcL--4H.js.map} +1 -1
  44. package/dist/_chunks/{NoPermissionsPage-j7oulOpl.js → NoPermissionsPage-BMFKVcwJ.js} +2 -2
  45. package/dist/_chunks/{NoPermissionsPage-j7oulOpl.js.map → NoPermissionsPage-BMFKVcwJ.js.map} +1 -1
  46. package/dist/_chunks/{NoPermissionsPage-D4XYRoPf.mjs → NoPermissionsPage-UnEgMGK4.mjs} +2 -2
  47. package/dist/_chunks/{NoPermissionsPage-D4XYRoPf.mjs.map → NoPermissionsPage-UnEgMGK4.mjs.map} +1 -1
  48. package/dist/_chunks/{Preview-Bx1WfmKJ.js → Preview-B7PR3Ok_.js} +76 -20
  49. package/dist/_chunks/Preview-B7PR3Ok_.js.map +1 -0
  50. package/dist/_chunks/{Preview-Cy6fuAnd.mjs → Preview-DECOhK0D.mjs} +77 -20
  51. package/dist/_chunks/Preview-DECOhK0D.mjs.map +1 -0
  52. package/dist/_chunks/{Relations-DUrYWw0N.mjs → Relations-DinMQJ4B.mjs} +6 -8
  53. package/dist/_chunks/{Relations-DUrYWw0N.mjs.map → Relations-DinMQJ4B.mjs.map} +1 -1
  54. package/dist/_chunks/{Relations-CXQqwRXC.js → Relations-lndx3aQk.js} +7 -10
  55. package/dist/_chunks/{Relations-CXQqwRXC.js.map → Relations-lndx3aQk.js.map} +1 -1
  56. package/dist/_chunks/{en-DAgtrRoa.js → en-BK8Xyl5I.js} +4 -2
  57. package/dist/_chunks/{en-DAgtrRoa.js.map → en-BK8Xyl5I.js.map} +1 -1
  58. package/dist/_chunks/{en-69jRDM9j.mjs → en-Dtk_ot79.mjs} +4 -2
  59. package/dist/_chunks/{en-69jRDM9j.mjs.map → en-Dtk_ot79.mjs.map} +1 -1
  60. package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
  61. package/dist/_chunks/{index-Ta--2bRa.mjs → index-C2SagWVW.mjs} +234 -138
  62. package/dist/_chunks/index-C2SagWVW.mjs.map +1 -0
  63. package/dist/_chunks/{index-_j7lH3CO.js → index-Cnw4gqee.js} +234 -139
  64. package/dist/_chunks/index-Cnw4gqee.js.map +1 -0
  65. package/dist/_chunks/{layout-C8H4oKDo.mjs → layout-DY_D9MGA.mjs} +4 -4
  66. package/dist/_chunks/{layout-C8H4oKDo.mjs.map → layout-DY_D9MGA.mjs.map} +1 -1
  67. package/dist/_chunks/{layout-BDwU2I_y.js → layout-ivwIVPnV.js} +5 -6
  68. package/dist/_chunks/{layout-BDwU2I_y.js.map → layout-ivwIVPnV.js.map} +1 -1
  69. package/dist/_chunks/objects-BcXOv6_9.js.map +1 -1
  70. package/dist/_chunks/objects-D6yBsdmx.mjs.map +1 -1
  71. package/dist/_chunks/{relations-CPfMNzM6.js → relations-B7C7O_Pv.js} +2 -2
  72. package/dist/_chunks/{relations-CPfMNzM6.js.map → relations-B7C7O_Pv.js.map} +1 -1
  73. package/dist/_chunks/{relations-Ch70q86O.mjs → relations-Boc5Y9kX.mjs} +2 -2
  74. package/dist/_chunks/{relations-Ch70q86O.mjs.map → relations-Boc5Y9kX.mjs.map} +1 -1
  75. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -1
  76. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -1
  77. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
  78. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
  79. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
  80. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
  81. package/dist/admin/index.js +1 -1
  82. package/dist/admin/index.mjs +1 -1
  83. package/dist/admin/src/content-manager.d.ts +3 -2
  84. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
  85. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
  86. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
  87. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
  88. package/dist/admin/src/services/documents.d.ts +0 -3
  89. package/dist/server/index.js +148 -111
  90. package/dist/server/index.js.map +1 -1
  91. package/dist/server/index.mjs +149 -111
  92. package/dist/server/index.mjs.map +1 -1
  93. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  94. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  95. package/dist/server/src/index.d.ts +3 -2
  96. package/dist/server/src/index.d.ts.map +1 -1
  97. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  98. package/dist/server/src/preview/index.d.ts.map +1 -1
  99. package/dist/server/src/preview/services/index.d.ts +1 -0
  100. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  101. package/dist/server/src/preview/services/preview-config.d.ts +2 -0
  102. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  103. package/dist/server/src/preview/utils.d.ts +1 -0
  104. package/dist/server/src/preview/utils.d.ts.map +1 -1
  105. package/dist/server/src/register.d.ts.map +1 -1
  106. package/dist/server/src/services/document-metadata.d.ts +4 -2
  107. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  108. package/dist/server/src/services/index.d.ts +3 -2
  109. package/dist/server/src/services/index.d.ts.map +1 -1
  110. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  111. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  112. package/dist/server/src/services/utils/populate.d.ts +2 -2
  113. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  114. package/package.json +12 -10
  115. package/dist/_chunks/Field-DuAYQka5.mjs.map +0 -1
  116. package/dist/_chunks/Field-fKtb7rWK.js.map +0 -1
  117. package/dist/_chunks/History-BGGn9JGY.js.map +0 -1
  118. package/dist/_chunks/History-CGblSVMc.mjs.map +0 -1
  119. package/dist/_chunks/ListConfigurationPage-D3Avyi4t.js.map +0 -1
  120. package/dist/_chunks/ListConfigurationPage-TIM0JveM.mjs.map +0 -1
  121. package/dist/_chunks/ListViewPage-C975eW-t.mjs.map +0 -1
  122. package/dist/_chunks/ListViewPage-DtAHWFMV.js.map +0 -1
  123. package/dist/_chunks/Preview-Bx1WfmKJ.js.map +0 -1
  124. package/dist/_chunks/Preview-Cy6fuAnd.mjs.map +0 -1
  125. package/dist/_chunks/index-Ta--2bRa.mjs.map +0 -1
  126. package/dist/_chunks/index-_j7lH3CO.js.map +0 -1
  127. package/dist/admin/src/preview/constants.d.ts +0 -1
  128. package/dist/server/src/preview/constants.d.ts +0 -2
  129. package/dist/server/src/preview/constants.d.ts.map +0 -1
@@ -1,5 +1,5 @@
1
- import strapiUtils, { validateYupSchema, errors, async, contentTypes as contentTypes$1, yup as yup$1, validateYupSchemaSync, policy, traverse, setCreatorFields, isOperatorOfType, relations as relations$1, traverseEntity, pagination } from "@strapi/utils";
2
- import { pick, omit, difference, castArray, intersection, pipe, propOr, isEqual, isEmpty, set, isNil as isNil$1, has, prop, assoc, mapValues, flow, uniq, uniqBy, concat, getOr, propEq, merge, groupBy } from "lodash/fp";
1
+ import strapiUtils, { validateYupSchema, errors, async, contentTypes as contentTypes$1, yup as yup$1, validateYupSchemaSync, policy, traverse, setCreatorFields, isOperatorOfType, relations as relations$1, pagination } from "@strapi/utils";
2
+ import { pick, omit, difference, castArray, mergeWith, intersection, pipe, propOr, isEqual, isEmpty, set, isNil as isNil$1, has, prop, assoc, mapValues, flow, uniq, uniqBy, concat, getOr, propEq, merge, groupBy } from "lodash/fp";
3
3
  import "@strapi/types";
4
4
  import * as yup from "yup";
5
5
  import { scheduleJob } from "node-schedule";
@@ -141,8 +141,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
141
141
  };
142
142
  const getRelationRestoreValue = async (versionRelationData, attribute) => {
143
143
  if (Array.isArray(versionRelationData)) {
144
- if (versionRelationData.length === 0)
145
- return versionRelationData;
144
+ if (versionRelationData.length === 0) return versionRelationData;
146
145
  const existingAndMissingRelations = await Promise.all(
147
146
  versionRelationData.map((relation) => {
148
147
  return strapi2.documents(attribute.target).findOne({
@@ -177,8 +176,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
177
176
  const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
178
177
  const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
179
178
  const getLocaleDictionary = async () => {
180
- if (!localesService)
181
- return {};
179
+ if (!localesService) return {};
182
180
  const locales = await localesService.find() || [];
183
181
  return locales.reduce(
184
182
  (acc, locale) => {
@@ -714,14 +712,6 @@ const getFeature$1 = () => {
714
712
  };
715
713
  };
716
714
  const history = getFeature$1();
717
- const register = async ({ strapi: strapi2 }) => {
718
- await history.register?.({ strapi: strapi2 });
719
- };
720
- const ALLOWED_WEBHOOK_EVENTS = {
721
- ENTRY_PUBLISH: "entry.publish",
722
- ENTRY_UNPUBLISH: "entry.unpublish"
723
- };
724
- const FEATURE_ID = "preview";
725
715
  const info = { pluginName: "content-manager", type: "admin" };
726
716
  const previewRouter = {
727
717
  type: "admin",
@@ -767,6 +757,10 @@ const validatePreviewUrl = async (strapi2, uid2, params) => {
767
757
  }
768
758
  newParams.documentId = doc?.documentId;
769
759
  }
760
+ if (!newParams.status) {
761
+ const isDPEnabled = model?.options?.draftAndPublish;
762
+ newParams.status = isDPEnabled ? "draft" : "published";
763
+ }
770
764
  return newParams;
771
765
  };
772
766
  const createPreviewController = () => {
@@ -812,8 +806,48 @@ const createPreviewService = ({ strapi: strapi2 }) => {
812
806
  }
813
807
  };
814
808
  };
809
+ const extendMiddlewareConfiguration = (middleware = { name: "", config: {} }) => {
810
+ const middlewares = strapi.config.get("middlewares");
811
+ const configuredMiddlewares = middlewares.map((currentMiddleware) => {
812
+ if (currentMiddleware === middleware.name) {
813
+ return middleware;
814
+ }
815
+ if (currentMiddleware.name === middleware.name) {
816
+ return mergeWith(
817
+ (objValue, srcValue) => {
818
+ if (Array.isArray(objValue)) {
819
+ return objValue.concat(srcValue);
820
+ }
821
+ return void 0;
822
+ },
823
+ currentMiddleware,
824
+ middleware
825
+ );
826
+ }
827
+ return currentMiddleware;
828
+ });
829
+ strapi.config.set("middlewares", configuredMiddlewares);
830
+ };
815
831
  const createPreviewConfigService = ({ strapi: strapi2 }) => {
816
832
  return {
833
+ register() {
834
+ if (!this.isEnabled()) {
835
+ return;
836
+ }
837
+ const config = strapi2.config.get("admin.preview");
838
+ if (config.config?.allowedOrigins) {
839
+ extendMiddlewareConfiguration({
840
+ name: "strapi::security",
841
+ config: {
842
+ contentSecurityPolicy: {
843
+ directives: {
844
+ "frame-src": config.config.allowedOrigins
845
+ }
846
+ }
847
+ }
848
+ });
849
+ }
850
+ },
817
851
  isEnabled() {
818
852
  const config = strapi2.config.get("admin.preview");
819
853
  if (!config) {
@@ -855,14 +889,13 @@ const services$1 = {
855
889
  "preview-config": createPreviewConfigService
856
890
  };
857
891
  const getFeature = () => {
858
- if (!strapi.features.future.isEnabled(FEATURE_ID)) {
859
- return {};
860
- }
861
892
  return {
862
- bootstrap() {
863
- console.log("Bootstrapping preview server");
893
+ register() {
864
894
  const config = getService(strapi, "preview-config");
865
895
  config.validate();
896
+ config.register();
897
+ },
898
+ bootstrap() {
866
899
  },
867
900
  routes: routes$1,
868
901
  controllers: controllers$1,
@@ -870,6 +903,14 @@ const getFeature = () => {
870
903
  };
871
904
  };
872
905
  const preview = getFeature();
906
+ const register = async ({ strapi: strapi2 }) => {
907
+ await history.register?.({ strapi: strapi2 });
908
+ await preview.register?.({ strapi: strapi2 });
909
+ };
910
+ const ALLOWED_WEBHOOK_EVENTS = {
911
+ ENTRY_PUBLISH: "entry.publish",
912
+ ENTRY_UNPUBLISH: "entry.unpublish"
913
+ };
873
914
  const bootstrap = async () => {
874
915
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
875
916
  strapi.get("webhookStore").addAllowedEvent(key, value);
@@ -1433,8 +1474,7 @@ const isSortable = (schema, name) => {
1433
1474
  if (!_.has(schema.attributes, name)) {
1434
1475
  return false;
1435
1476
  }
1436
- if (schema.modelType === "component" && name === "id")
1437
- return false;
1477
+ if (schema.modelType === "component" && name === "id") return false;
1438
1478
  const attribute = schema.attributes[name];
1439
1479
  if (NON_SORTABLES.includes(attribute.type)) {
1440
1480
  return false;
@@ -1579,8 +1619,7 @@ const createDefaultSettings = async (schema) => {
1579
1619
  };
1580
1620
  };
1581
1621
  const syncSettings = async (configuration, schema) => {
1582
- if (isEmpty(configuration.settings))
1583
- return createDefaultSettings(schema);
1622
+ if (isEmpty(configuration.settings)) return createDefaultSettings(schema);
1584
1623
  const defaultField = getDefaultMainField(schema);
1585
1624
  const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};
1586
1625
  return {
@@ -1756,8 +1795,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
1756
1795
  }
1757
1796
  switch (attribute.type) {
1758
1797
  case "relation": {
1759
- if (canCreate(attributePath))
1760
- return body2;
1798
+ if (canCreate(attributePath)) return body2;
1761
1799
  return set(attributePath, { set: [] }, body2);
1762
1800
  }
1763
1801
  case "component": {
@@ -1767,8 +1805,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
1767
1805
  ]);
1768
1806
  }
1769
1807
  default: {
1770
- if (canCreate(attributePath))
1771
- return body2;
1808
+ if (canCreate(attributePath)) return body2;
1772
1809
  return set(attributePath, null, body2);
1773
1810
  }
1774
1811
  }
@@ -2561,8 +2598,7 @@ const validateStatus = (sourceUid, status) => {
2561
2598
  const sourceModel = strapi.getModel(sourceUid);
2562
2599
  const isDP = contentTypes$1.hasDraftAndPublish;
2563
2600
  const isSourceDP = isDP(sourceModel);
2564
- if (!isSourceDP)
2565
- return { status: void 0 };
2601
+ if (!isSourceDP) return { status: void 0 };
2566
2602
  switch (status) {
2567
2603
  case "published":
2568
2604
  return { status: "published" };
@@ -3207,18 +3243,15 @@ async function syncMetadatas(configuration, schema) {
3207
3243
  _.set(updatedMeta, ["list", "searchable"], false);
3208
3244
  _.set(acc, [key], updatedMeta);
3209
3245
  }
3210
- if (!_.has(edit, "mainField"))
3211
- return acc;
3246
+ if (!_.has(edit, "mainField")) return acc;
3212
3247
  if (!isRelation$1(attr)) {
3213
3248
  _.set(updatedMeta, "edit", _.omit(edit, ["mainField"]));
3214
3249
  _.set(acc, [key], updatedMeta);
3215
3250
  return acc;
3216
3251
  }
3217
- if (edit.mainField === "id")
3218
- return acc;
3252
+ if (edit.mainField === "id") return acc;
3219
3253
  const targetSchema = getTargetSchema(attr.targetModel);
3220
- if (!targetSchema)
3221
- return acc;
3254
+ if (!targetSchema) return acc;
3222
3255
  if (!isSortable(targetSchema, edit.mainField) && !isListable(targetSchema, edit.mainField)) {
3223
3256
  _.set(updatedMeta, ["edit", "mainField"], getDefaultMainField(targetSchema));
3224
3257
  _.set(acc, [key], updatedMeta);
@@ -3263,8 +3296,7 @@ function createDefaultEditLayout(schema) {
3263
3296
  return appendToEditLayout([], keys2, schema);
3264
3297
  }
3265
3298
  function syncLayouts(configuration, schema) {
3266
- if (_.isEmpty(configuration.layouts))
3267
- return createDefaultLayouts(schema);
3299
+ if (_.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);
3268
3300
  const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};
3269
3301
  let cleanList = list.filter((attr) => isListable(schema, attr));
3270
3302
  const cleanEditRelations = editRelations.filter(
@@ -3275,8 +3307,7 @@ function syncLayouts(configuration, schema) {
3275
3307
  for (const row of edit) {
3276
3308
  const newRow = [];
3277
3309
  for (const el of row) {
3278
- if (!hasEditableAttribute(schema, el.name))
3279
- continue;
3310
+ if (!hasEditableAttribute(schema, el.name)) continue;
3280
3311
  const { hasFieldSize } = getService$2("field-sizes");
3281
3312
  const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
3282
3313
  if (!isAllowedFieldSize(fieldType, el.size)) {
@@ -3307,8 +3338,7 @@ function syncLayouts(configuration, schema) {
3307
3338
  };
3308
3339
  }
3309
3340
  const appendToEditLayout = (layout = [], keysToAppend, schema) => {
3310
- if (keysToAppend.length === 0)
3311
- return layout;
3341
+ if (keysToAppend.length === 0) return layout;
3312
3342
  let currentRowIndex = Math.max(layout.length - 1, 0);
3313
3343
  if (!layout[currentRowIndex]) {
3314
3344
  layout[currentRowIndex] = [];
@@ -3874,6 +3904,12 @@ function getPopulateForRelation(attribute, model, attributeName, { countMany, co
3874
3904
  if (initialPopulate) {
3875
3905
  return initialPopulate;
3876
3906
  }
3907
+ if (attributeName === "localizations") {
3908
+ const validationPopulate = getPopulateForValidation(model.uid);
3909
+ return {
3910
+ populate: validationPopulate.populate
3911
+ };
3912
+ }
3877
3913
  if (!isVisibleAttribute$1(model, attributeName)) {
3878
3914
  return true;
3879
3915
  }
@@ -3933,6 +3969,9 @@ const getDeepPopulate = (uid2, {
3933
3969
  return {};
3934
3970
  }
3935
3971
  const model = strapi.getModel(uid2);
3972
+ if (!model) {
3973
+ return {};
3974
+ }
3936
3975
  return Object.keys(model.attributes).reduce(
3937
3976
  (populateAcc, attributeName) => merge(
3938
3977
  populateAcc,
@@ -3952,40 +3991,46 @@ const getDeepPopulate = (uid2, {
3952
3991
  {}
3953
3992
  );
3954
3993
  };
3955
- const getValidatableFieldsPopulate = (uid2, {
3956
- initialPopulate = {},
3957
- countMany = false,
3958
- countOne = false,
3959
- maxLevel = Infinity
3960
- } = {}, level = 1) => {
3961
- if (level > maxLevel) {
3994
+ const getPopulateForValidation = (uid2) => {
3995
+ const model = strapi.getModel(uid2);
3996
+ if (!model) {
3962
3997
  return {};
3963
3998
  }
3964
- const model = strapi.getModel(uid2);
3965
3999
  return Object.entries(model.attributes).reduce((populateAcc, [attributeName, attribute]) => {
3966
- if (!getDoesAttributeRequireValidation(attribute)) {
4000
+ if (isScalarAttribute(attribute)) {
4001
+ if (getDoesAttributeRequireValidation(attribute)) {
4002
+ populateAcc.fields = populateAcc.fields || [];
4003
+ populateAcc.fields.push(attributeName);
4004
+ }
3967
4005
  return populateAcc;
3968
4006
  }
3969
- if (isScalarAttribute(attribute)) {
3970
- return merge(populateAcc, {
3971
- [attributeName]: true
3972
- });
4007
+ if (isComponent(attribute)) {
4008
+ const component = attribute.component;
4009
+ const componentResult = getPopulateForValidation(component);
4010
+ if (Object.keys(componentResult).length > 0) {
4011
+ populateAcc.populate = populateAcc.populate || {};
4012
+ populateAcc.populate[attributeName] = componentResult;
4013
+ }
4014
+ return populateAcc;
3973
4015
  }
3974
- return merge(
3975
- populateAcc,
3976
- getPopulateFor(
3977
- attributeName,
3978
- model,
3979
- {
3980
- // @ts-expect-error - improve types
3981
- initialPopulate: initialPopulate?.[attributeName],
3982
- countMany,
3983
- countOne,
3984
- maxLevel
4016
+ if (isDynamicZone(attribute)) {
4017
+ const components2 = attribute.components;
4018
+ const componentsResult = (components2 || []).reduce(
4019
+ (acc, componentUID) => {
4020
+ const componentResult = getPopulateForValidation(componentUID);
4021
+ if (Object.keys(componentResult).length > 0) {
4022
+ acc[componentUID] = componentResult;
4023
+ }
4024
+ return acc;
3985
4025
  },
3986
- level
3987
- )
3988
- );
4026
+ {}
4027
+ );
4028
+ if (Object.keys(componentsResult).length > 0) {
4029
+ populateAcc.populate = populateAcc.populate || {};
4030
+ populateAcc.populate[attributeName] = { on: componentsResult };
4031
+ }
4032
+ }
4033
+ return populateAcc;
3989
4034
  }, {});
3990
4035
  };
3991
4036
  const getDeepPopulateDraftCount = (uid2) => {
@@ -4227,7 +4272,6 @@ const AVAILABLE_LOCALES_FIELDS = [
4227
4272
  "locale",
4228
4273
  "updatedAt",
4229
4274
  "createdAt",
4230
- "status",
4231
4275
  "publishedAt",
4232
4276
  "documentId"
4233
4277
  ];
@@ -4248,36 +4292,20 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4248
4292
  /**
4249
4293
  * Returns available locales of a document for the current status
4250
4294
  */
4251
- async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4295
+ async getAvailableLocales(uid2, version, allVersions) {
4252
4296
  const versionsByLocale = groupBy("locale", allVersions);
4253
4297
  if (version.locale) {
4254
4298
  delete versionsByLocale[version.locale];
4255
4299
  }
4256
4300
  const model = strapi2.getModel(uid2);
4257
- const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4258
- const traversalFunction = async (localeVersion) => traverseEntity(
4259
- ({ key }, { remove }) => {
4260
- if (keysToKeep.includes(key)) {
4261
- return;
4262
- }
4263
- remove(key);
4264
- },
4265
- { schema: model, getModel: strapi2.getModel.bind(strapi2) },
4266
- // @ts-expect-error fix types DocumentVersion incompatible with Data
4267
- localeVersion
4268
- );
4269
4301
  const mappingResult = await async.map(
4270
4302
  Object.values(versionsByLocale),
4271
4303
  async (localeVersions) => {
4272
- const mappedLocaleVersions = await async.map(
4273
- localeVersions,
4274
- traversalFunction
4275
- );
4276
4304
  if (!contentTypes$1.hasDraftAndPublish(model)) {
4277
- return mappedLocaleVersions[0];
4305
+ return localeVersions[0];
4278
4306
  }
4279
- const draftVersion = mappedLocaleVersions.find((v) => v.publishedAt === null);
4280
- const otherVersions = mappedLocaleVersions.filter((v) => v.id !== draftVersion?.id);
4307
+ const draftVersion = localeVersions.find((v) => v.publishedAt === null);
4308
+ const otherVersions = localeVersions.filter((v) => v.id !== draftVersion?.id);
4281
4309
  if (!draftVersion) {
4282
4310
  return;
4283
4311
  }
@@ -4299,8 +4327,7 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4299
4327
  const matchStatus = status === "published" ? v.publishedAt !== null : v.publishedAt === null;
4300
4328
  return matchLocale && matchStatus;
4301
4329
  });
4302
- if (!availableStatus)
4303
- return availableStatus;
4330
+ if (!availableStatus) return availableStatus;
4304
4331
  return pick(AVAILABLE_STATUS_FIELDS, availableStatus);
4305
4332
  },
4306
4333
  /**
@@ -4310,18 +4337,17 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4310
4337
  * @returns
4311
4338
  */
4312
4339
  async getManyAvailableStatus(uid2, documents) {
4313
- if (!documents.length)
4314
- return [];
4340
+ if (!documents.length) return [];
4315
4341
  const status = documents[0].publishedAt !== null ? "published" : "draft";
4316
- const locale = documents[0]?.locale;
4317
- const otherStatus = status === "published" ? "draft" : "published";
4318
- return strapi2.documents(uid2).findMany({
4319
- filters: {
4320
- documentId: { $in: documents.map((d) => d.documentId).filter(Boolean) }
4342
+ const locales = documents.map((d) => d.locale).filter(Boolean);
4343
+ return strapi2.query(uid2).findMany({
4344
+ where: {
4345
+ documentId: { $in: documents.map((d) => d.documentId).filter(Boolean) },
4346
+ // NOTE: find the "opposite" status
4347
+ publishedAt: { $null: status === "published" },
4348
+ locale: { $in: locales }
4321
4349
  },
4322
- status: otherStatus,
4323
- locale,
4324
- fields: ["documentId", "locale", "updatedAt", "createdAt", "publishedAt"]
4350
+ select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"]
4325
4351
  });
4326
4352
  },
4327
4353
  getStatus(version, otherDocumentStatuses) {
@@ -4338,10 +4364,8 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4338
4364
  } else if (otherVersion) {
4339
4365
  draftVersion = otherVersion;
4340
4366
  }
4341
- if (!draftVersion)
4342
- return CONTENT_MANAGER_STATUS.PUBLISHED;
4343
- if (!publishedVersion)
4344
- return CONTENT_MANAGER_STATUS.DRAFT;
4367
+ if (!draftVersion) return CONTENT_MANAGER_STATUS.PUBLISHED;
4368
+ if (!publishedVersion) return CONTENT_MANAGER_STATUS.DRAFT;
4345
4369
  const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);
4346
4370
  return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;
4347
4371
  },
@@ -4349,11 +4373,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4349
4373
  // We could refactor this so the locales are only loaded when they're
4350
4374
  // needed. e.g. in the bulk locale action modal.
4351
4375
  async getMetadata(uid2, version, { availableLocales = true, availableStatus = true } = {}) {
4352
- const populate = getValidatableFieldsPopulate(uid2);
4353
- const versions = await strapi2.db.query(uid2).findMany({
4354
- where: { documentId: version.documentId },
4376
+ const { populate = {}, fields = [] } = getPopulateForValidation(uid2);
4377
+ const params = {
4355
4378
  populate: {
4356
- // Populate only fields that require validation for bulk locale actions
4357
4379
  ...populate,
4358
4380
  // NOTE: creator fields are selected in this way to avoid exposing sensitive data
4359
4381
  createdBy: {
@@ -4362,9 +4384,15 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4362
4384
  updatedBy: {
4363
4385
  select: ["id", "firstname", "lastname", "email"]
4364
4386
  }
4387
+ },
4388
+ fields: uniq([...AVAILABLE_LOCALES_FIELDS, ...fields]),
4389
+ filters: {
4390
+ documentId: version.documentId
4365
4391
  }
4366
- });
4367
- const availableLocalesResult = availableLocales ? await this.getAvailableLocales(uid2, version, versions, Object.keys(populate)) : [];
4392
+ };
4393
+ const dbParams = strapi2.get("query-params").transform(uid2, params);
4394
+ const versions = await strapi2.db.query(uid2).findMany(dbParams);
4395
+ const availableLocalesResult = availableLocales ? await this.getAvailableLocales(uid2, version, versions) : [];
4368
4396
  const availableStatusResult = availableStatus ? this.getAvailableStatus(version, versions) : null;
4369
4397
  return {
4370
4398
  availableLocales: availableLocalesResult,
@@ -4391,6 +4419,16 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4391
4419
  opts.availableStatus = false;
4392
4420
  }
4393
4421
  const meta = await this.getMetadata(uid2, document, opts);
4422
+ if (document.localizations) {
4423
+ const otherStatus = await this.getManyAvailableStatus(uid2, document.localizations);
4424
+ document.localizations = document.localizations.map((d) => {
4425
+ const status = otherStatus.find((s) => s.documentId === d.documentId);
4426
+ return {
4427
+ ...d,
4428
+ status: this.getStatus(d, status ? [status] : [])
4429
+ };
4430
+ });
4431
+ }
4394
4432
  return {
4395
4433
  data: {
4396
4434
  ...document,