@strapi/content-manager 0.0.0-next.bb6ff32f5168f3e380d3d9acba90a9d53bfcfb89 → 0.0.0-next.bffd3c1819cd08304e7d270e88b4973e9fcbc183

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 (162) 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-DqB7veg_.mjs → ComponentConfigurationPage-9_4yUE9L.mjs} +3 -3
  4. package/dist/_chunks/{ComponentConfigurationPage-DqB7veg_.mjs.map → ComponentConfigurationPage-9_4yUE9L.mjs.map} +1 -1
  5. package/dist/_chunks/{ComponentConfigurationPage-Bmwd-G2q.js → ComponentConfigurationPage-DBSh-kET.js} +4 -5
  6. package/dist/_chunks/{ComponentConfigurationPage-Bmwd-G2q.js.map → ComponentConfigurationPage-DBSh-kET.js.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-DmruXqgR.js → EditConfigurationPage-Bl_U2JgH.js} +4 -5
  11. package/dist/_chunks/{EditConfigurationPage-DmruXqgR.js.map → EditConfigurationPage-Bl_U2JgH.js.map} +1 -1
  12. package/dist/_chunks/{EditConfigurationPage-CDLVqqay.mjs → EditConfigurationPage-COe6hjPC.mjs} +3 -3
  13. package/dist/_chunks/{EditConfigurationPage-CDLVqqay.mjs.map → EditConfigurationPage-COe6hjPC.mjs.map} +1 -1
  14. package/dist/_chunks/{EditViewPage-0zrWXtMz.js → EditViewPage-D4yFJET6.js} +14 -78
  15. package/dist/_chunks/EditViewPage-D4yFJET6.js.map +1 -0
  16. package/dist/_chunks/{EditViewPage-BgcbLW7w.mjs → EditViewPage-DrmVmYN0.mjs} +11 -74
  17. package/dist/_chunks/EditViewPage-DrmVmYN0.mjs.map +1 -0
  18. package/dist/_chunks/FieldTypeIcon-CMlNO8PE.mjs.map +1 -1
  19. package/dist/_chunks/FieldTypeIcon-Dnwq_IRF.js.map +1 -1
  20. package/dist/_chunks/{Form-CIDoAFoD.js → Form-C4rSaGsz.js} +5 -6
  21. package/dist/_chunks/{Form-CIDoAFoD.js.map → Form-C4rSaGsz.js.map} +1 -1
  22. package/dist/_chunks/{Form-WNWgTBtb.mjs → Form-DamaxNpG.mjs} +3 -3
  23. package/dist/_chunks/{Form-WNWgTBtb.mjs.map → Form-DamaxNpG.mjs.map} +1 -1
  24. package/dist/_chunks/{History-DEZDHwP0.mjs → History-D1PreDSY.mjs} +36 -10
  25. package/dist/_chunks/History-D1PreDSY.mjs.map +1 -0
  26. package/dist/_chunks/{History-BNvm2TK2.js → History-DTm8UCCQ.js} +47 -22
  27. package/dist/_chunks/History-DTm8UCCQ.js.map +1 -0
  28. package/dist/_chunks/{Field-BV7ZYdqe.js → Input-B7sapvBG.js} +1331 -1329
  29. package/dist/_chunks/Input-B7sapvBG.js.map +1 -0
  30. package/dist/_chunks/{Field-fTjqtEem.mjs → Input-CZ1YvjHR.mjs} +1245 -1243
  31. package/dist/_chunks/Input-CZ1YvjHR.mjs.map +1 -0
  32. package/dist/_chunks/{ListConfigurationPage-Ddz3G-It.mjs → ListConfigurationPage-Bbi32isk.mjs} +6 -5
  33. package/dist/_chunks/ListConfigurationPage-Bbi32isk.mjs.map +1 -0
  34. package/dist/_chunks/{ListConfigurationPage-B3FZwPHp.js → ListConfigurationPage-ysFMjKI3.js} +6 -6
  35. package/dist/_chunks/ListConfigurationPage-ysFMjKI3.js.map +1 -0
  36. package/dist/_chunks/{ListViewPage-BsLdw25U.mjs → ListViewPage-Bud_jBDQ.mjs} +55 -51
  37. package/dist/_chunks/ListViewPage-Bud_jBDQ.mjs.map +1 -0
  38. package/dist/_chunks/{ListViewPage-BEilNylQ.js → ListViewPage-DTuuxU3n.js} +61 -58
  39. package/dist/_chunks/ListViewPage-DTuuxU3n.js.map +1 -0
  40. package/dist/_chunks/{NoContentTypePage-BD2C-IMr.js → NoContentTypePage-CL7VVeYs.js} +2 -2
  41. package/dist/_chunks/{NoContentTypePage-BD2C-IMr.js.map → NoContentTypePage-CL7VVeYs.js.map} +1 -1
  42. package/dist/_chunks/{NoContentTypePage-D0jXEWKM.mjs → NoContentTypePage-DVhkugsf.mjs} +2 -2
  43. package/dist/_chunks/{NoContentTypePage-D0jXEWKM.mjs.map → NoContentTypePage-DVhkugsf.mjs.map} +1 -1
  44. package/dist/_chunks/{NoPermissionsPage-CIPqlrQq.mjs → NoPermissionsPage-CMdM-dCo.mjs} +2 -2
  45. package/dist/_chunks/{NoPermissionsPage-CIPqlrQq.mjs.map → NoPermissionsPage-CMdM-dCo.mjs.map} +1 -1
  46. package/dist/_chunks/{NoPermissionsPage-yNOvz9XO.js → NoPermissionsPage-v7I599vC.js} +2 -2
  47. package/dist/_chunks/{NoPermissionsPage-yNOvz9XO.js.map → NoPermissionsPage-v7I599vC.js.map} +1 -1
  48. package/dist/_chunks/{Preview-ot2fh0yZ.mjs → Preview-BNuU0SuQ.mjs} +74 -24
  49. package/dist/_chunks/Preview-BNuU0SuQ.mjs.map +1 -0
  50. package/dist/_chunks/{Preview-1cqLecKr.js → Preview-Cxq-uI6D.js} +73 -24
  51. package/dist/_chunks/Preview-Cxq-uI6D.js.map +1 -0
  52. package/dist/_chunks/{Relations-CfdwHP-0.mjs → Relations-C2Ahkrdg.mjs} +6 -8
  53. package/dist/_chunks/{Relations-CfdwHP-0.mjs.map → Relations-C2Ahkrdg.mjs.map} +1 -1
  54. package/dist/_chunks/{Relations-C3U9SKEb.js → Relations-CWS79QQn.js} +7 -10
  55. package/dist/_chunks/{Relations-C3U9SKEb.js.map → Relations-CWS79QQn.js.map} +1 -1
  56. package/dist/_chunks/{en-CHOp_xJv.js → en-BR48D_RH.js} +13 -3
  57. package/dist/_chunks/{en-CHOp_xJv.js.map → en-BR48D_RH.js.map} +1 -1
  58. package/dist/_chunks/{en-D_BMf0hT.mjs → en-D65uIF6Y.mjs} +13 -3
  59. package/dist/_chunks/{en-D_BMf0hT.mjs.map → en-D65uIF6Y.mjs.map} +1 -1
  60. package/dist/_chunks/{fr-B2Kyv8Z9.js → fr-C43IbhA_.js} +4 -1
  61. package/dist/_chunks/{fr-B2Kyv8Z9.js.map → fr-C43IbhA_.js.map} +1 -1
  62. package/dist/_chunks/{fr--pg5jUbt.mjs → fr-DBseuRuB.mjs} +4 -1
  63. package/dist/_chunks/{fr--pg5jUbt.mjs.map → fr-DBseuRuB.mjs.map} +1 -1
  64. package/dist/_chunks/hooks-BAaaKPS_.js.map +1 -1
  65. package/dist/_chunks/{index-Cg4RLIAw.js → index-DQsvBb_N.js} +518 -207
  66. package/dist/_chunks/index-DQsvBb_N.js.map +1 -0
  67. package/dist/_chunks/{index-BzUT1l9A.mjs → index-ZKrsjv-2.mjs} +536 -224
  68. package/dist/_chunks/index-ZKrsjv-2.mjs.map +1 -0
  69. package/dist/_chunks/{layout-Cj_1EKbm.js → layout-Cl0NhlQB.js} +5 -6
  70. package/dist/_chunks/{layout-Cj_1EKbm.js.map → layout-Cl0NhlQB.js.map} +1 -1
  71. package/dist/_chunks/{layout-C0QEDBAh.mjs → layout-fQk1rMk9.mjs} +4 -4
  72. package/dist/_chunks/{layout-C0QEDBAh.mjs.map → layout-fQk1rMk9.mjs.map} +1 -1
  73. package/dist/_chunks/objects-BcXOv6_9.js.map +1 -1
  74. package/dist/_chunks/objects-D6yBsdmx.mjs.map +1 -1
  75. package/dist/_chunks/{relations-hDOgJy2R.js → relations-BRfBxVbX.js} +2 -2
  76. package/dist/_chunks/{relations-hDOgJy2R.js.map → relations-BRfBxVbX.js.map} +1 -1
  77. package/dist/_chunks/{relations-CgPG3AwU.mjs → relations-BakOFl_1.mjs} +2 -2
  78. package/dist/_chunks/{relations-CgPG3AwU.mjs.map → relations-BakOFl_1.mjs.map} +1 -1
  79. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js → useDragAndDrop-BMtgCYzL.js} +5 -9
  80. package/dist/_chunks/{useDragAndDrop-J0TUUbR6.js.map → useDragAndDrop-BMtgCYzL.js.map} +1 -1
  81. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs → useDragAndDrop-DJ6jqvZN.mjs} +4 -7
  82. package/dist/_chunks/{useDragAndDrop-DdHgKsqq.mjs.map → useDragAndDrop-DJ6jqvZN.mjs.map} +1 -1
  83. package/dist/_chunks/{useDebounce-DmuSJIF3.mjs → usePrev-CZGy2Vjf.mjs} +11 -11
  84. package/dist/_chunks/usePrev-CZGy2Vjf.mjs.map +1 -0
  85. package/dist/_chunks/{useDebounce-CtcjDB3L.js → usePrev-D5J_2fEu.js} +8 -8
  86. package/dist/_chunks/usePrev-D5J_2fEu.js.map +1 -0
  87. package/dist/admin/index.js +2 -1
  88. package/dist/admin/index.js.map +1 -1
  89. package/dist/admin/index.mjs +6 -5
  90. package/dist/admin/src/content-manager.d.ts +3 -2
  91. package/dist/admin/src/exports.d.ts +1 -0
  92. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  93. package/dist/admin/src/hooks/useDocument.d.ts +19 -2
  94. package/dist/admin/src/pages/EditView/components/DocumentActions.d.ts +1 -1
  95. package/dist/admin/src/pages/EditView/components/DocumentStatus.d.ts +1 -1
  96. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.d.ts +7 -0
  97. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/utils/prismLanguages.d.ts +49 -0
  98. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/utils/constants.d.ts +1 -0
  99. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +4 -1
  100. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/Field.d.ts +4 -1
  101. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +27 -0
  102. package/dist/admin/src/pages/EditView/utils/data.d.ts +1 -0
  103. package/dist/admin/src/preview/pages/Preview.d.ts +1 -1
  104. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  105. package/dist/admin/src/services/api.d.ts +1 -1
  106. package/dist/admin/src/services/components.d.ts +2 -2
  107. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  108. package/dist/admin/src/services/documents.d.ts +16 -19
  109. package/dist/admin/src/services/init.d.ts +1 -1
  110. package/dist/admin/src/services/relations.d.ts +2 -2
  111. package/dist/admin/src/services/uid.d.ts +3 -3
  112. package/dist/server/index.js +230 -187
  113. package/dist/server/index.js.map +1 -1
  114. package/dist/server/index.mjs +231 -187
  115. package/dist/server/index.mjs.map +1 -1
  116. package/dist/server/src/controllers/utils/metadata.d.ts +1 -0
  117. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  118. package/dist/server/src/history/controllers/history-version.d.ts +1 -1
  119. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  120. package/dist/server/src/history/services/history.d.ts +3 -3
  121. package/dist/server/src/history/services/history.d.ts.map +1 -1
  122. package/dist/server/src/history/services/utils.d.ts +6 -10
  123. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  124. package/dist/server/src/index.d.ts +3 -2
  125. package/dist/server/src/index.d.ts.map +1 -1
  126. package/dist/server/src/preview/controllers/validation/preview.d.ts.map +1 -1
  127. package/dist/server/src/preview/index.d.ts.map +1 -1
  128. package/dist/server/src/preview/services/index.d.ts +1 -0
  129. package/dist/server/src/preview/services/index.d.ts.map +1 -1
  130. package/dist/server/src/preview/services/preview-config.d.ts +2 -0
  131. package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
  132. package/dist/server/src/preview/utils.d.ts +1 -0
  133. package/dist/server/src/preview/utils.d.ts.map +1 -1
  134. package/dist/server/src/register.d.ts.map +1 -1
  135. package/dist/server/src/services/document-metadata.d.ts +4 -2
  136. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  137. package/dist/server/src/services/index.d.ts +3 -2
  138. package/dist/server/src/services/index.d.ts.map +1 -1
  139. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  140. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  141. package/dist/server/src/services/utils/populate.d.ts +2 -2
  142. package/dist/server/src/services/utils/populate.d.ts.map +1 -1
  143. package/package.json +12 -11
  144. package/dist/_chunks/EditViewPage-0zrWXtMz.js.map +0 -1
  145. package/dist/_chunks/EditViewPage-BgcbLW7w.mjs.map +0 -1
  146. package/dist/_chunks/Field-BV7ZYdqe.js.map +0 -1
  147. package/dist/_chunks/Field-fTjqtEem.mjs.map +0 -1
  148. package/dist/_chunks/History-BNvm2TK2.js.map +0 -1
  149. package/dist/_chunks/History-DEZDHwP0.mjs.map +0 -1
  150. package/dist/_chunks/ListConfigurationPage-B3FZwPHp.js.map +0 -1
  151. package/dist/_chunks/ListConfigurationPage-Ddz3G-It.mjs.map +0 -1
  152. package/dist/_chunks/ListViewPage-BEilNylQ.js.map +0 -1
  153. package/dist/_chunks/ListViewPage-BsLdw25U.mjs.map +0 -1
  154. package/dist/_chunks/Preview-1cqLecKr.js.map +0 -1
  155. package/dist/_chunks/Preview-ot2fh0yZ.mjs.map +0 -1
  156. package/dist/_chunks/index-BzUT1l9A.mjs.map +0 -1
  157. package/dist/_chunks/index-Cg4RLIAw.js.map +0 -1
  158. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +0 -1
  159. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +0 -1
  160. package/dist/admin/src/preview/constants.d.ts +0 -1
  161. package/dist/server/src/preview/constants.d.ts +0 -2
  162. package/dist/server/src/preview/constants.d.ts.map +0 -1
@@ -10,8 +10,7 @@ const qs = require("qs");
10
10
  const slugify = require("@sindresorhus/slugify");
11
11
  const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
12
12
  function _interopNamespace(e) {
13
- if (e && e.__esModule)
14
- return e;
13
+ if (e && e.__esModule) return e;
15
14
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
16
15
  if (e) {
17
16
  for (const k in e) {
@@ -167,8 +166,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
167
166
  };
168
167
  const getRelationRestoreValue = async (versionRelationData, attribute) => {
169
168
  if (Array.isArray(versionRelationData)) {
170
- if (versionRelationData.length === 0)
171
- return versionRelationData;
169
+ if (versionRelationData.length === 0) return versionRelationData;
172
170
  const existingAndMissingRelations = await Promise.all(
173
171
  versionRelationData.map((relation) => {
174
172
  return strapi2.documents(attribute.target).findOne({
@@ -177,19 +175,16 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
177
175
  });
178
176
  })
179
177
  );
180
- return existingAndMissingRelations.filter(
181
- (relation) => relation !== null
182
- );
178
+ return existingAndMissingRelations.filter((relation) => relation !== null);
183
179
  }
184
180
  return strapi2.documents(attribute.target).findOne({
185
181
  documentId: versionRelationData.documentId,
186
182
  locale: versionRelationData.locale || void 0
187
183
  });
188
184
  };
189
- const getMediaRestoreValue = async (versionRelationData, attribute) => {
190
- if (attribute.multiple) {
185
+ const getMediaRestoreValue = async (versionRelationData) => {
186
+ if (Array.isArray(versionRelationData)) {
191
187
  const existingAndMissingMedias = await Promise.all(
192
- // @ts-expect-error Fix the type definitions so this isn't any
193
188
  versionRelationData.map((media) => {
194
189
  return strapi2.db.query("plugin::upload.file").findOne({ where: { id: media.id } });
195
190
  })
@@ -203,8 +198,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
203
198
  const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
204
199
  const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
205
200
  const getLocaleDictionary = async () => {
206
- if (!localesService)
207
- return {};
201
+ if (!localesService) return {};
208
202
  const locales = await localesService.find() || [];
209
203
  return locales.reduce(
210
204
  (acc, locale) => {
@@ -359,8 +353,8 @@ const createHistoryService = ({ strapi: strapi2 }) => {
359
353
  });
360
354
  },
361
355
  async findVersionsPage(params) {
362
- const model = strapi2.getModel(params.query.contentType);
363
- const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
356
+ const schema = strapi2.getModel(params.query.contentType);
357
+ const isLocalizedContentType = serviceUtils.isLocalizedContentType(schema);
364
358
  const defaultLocale = await serviceUtils.getDefaultLocale();
365
359
  let locale = null;
366
360
  if (isLocalizedContentType) {
@@ -381,32 +375,20 @@ const createHistoryService = ({ strapi: strapi2 }) => {
381
375
  }),
382
376
  serviceUtils.getLocaleDictionary()
383
377
  ]);
384
- const populateEntryRelations = async (entry) => {
385
- const entryWithRelations = await Object.entries(entry.schema).reduce(
386
- async (currentDataWithRelations, [attributeKey, attributeSchema]) => {
387
- const attributeValue = entry.data[attributeKey];
388
- const attributeValues = Array.isArray(attributeValue) ? attributeValue : [attributeValue];
389
- if (attributeSchema.type === "media") {
390
- const permissionChecker2 = getService$2("permission-checker").create({
391
- userAbility: params.state.userAbility,
392
- model: "plugin::upload.file"
393
- });
394
- const response = await serviceUtils.buildMediaResponse(attributeValues);
395
- const sanitizedResults = await Promise.all(
396
- response.results.map((media) => permissionChecker2.sanitizeOutput(media))
397
- );
398
- return {
399
- ...await currentDataWithRelations,
400
- [attributeKey]: {
401
- results: sanitizedResults,
402
- meta: response.meta
403
- }
404
- };
378
+ const populateEntry = async (entry) => {
379
+ return strapiUtils.traverseEntity(
380
+ async (options, utils) => {
381
+ if (!options.attribute) return;
382
+ if (!options.value) return;
383
+ const currentValue = Array.isArray(options.value) ? options.value : [options.value];
384
+ if (options.attribute.type === "component") {
385
+ utils.remove("id");
405
386
  }
406
- if (attributeSchema.type === "relation" && attributeSchema.relation !== "morphToOne" && attributeSchema.relation !== "morphToMany") {
407
- if (attributeSchema.target === "admin::user") {
387
+ if (options.attribute.type === "relation" && // TODO: handle polymorphic relations
388
+ options.attribute.relation !== "morphToOne" && options.attribute.relation !== "morphToMany") {
389
+ if (options.attribute.target === "admin::user") {
408
390
  const adminUsers = await Promise.all(
409
- attributeValues.map((userToPopulate) => {
391
+ currentValue.map((userToPopulate) => {
410
392
  if (userToPopulate == null) {
411
393
  return null;
412
394
  }
@@ -418,46 +400,51 @@ const createHistoryService = ({ strapi: strapi2 }) => {
418
400
  });
419
401
  })
420
402
  );
421
- return {
422
- ...await currentDataWithRelations,
423
- /**
424
- * Ideally we would return the same "{results: [], meta: {}}" shape, however,
425
- * when sanitizing the data as a whole in the controller before sending to the client,
426
- * the data for admin relation user is completely sanitized if we return an object here as opposed to an array.
427
- */
428
- [attributeKey]: adminUsers
429
- };
403
+ utils.set(options.key, adminUsers);
430
404
  }
431
405
  const permissionChecker2 = getService$2("permission-checker").create({
432
406
  userAbility: params.state.userAbility,
433
- model: attributeSchema.target
407
+ model: options.attribute.target
434
408
  });
435
409
  const response = await serviceUtils.buildRelationReponse(
436
- attributeValues,
437
- attributeSchema
410
+ currentValue,
411
+ options.attribute
438
412
  );
439
413
  const sanitizedResults = await Promise.all(
440
414
  response.results.map((media) => permissionChecker2.sanitizeOutput(media))
441
415
  );
442
- return {
443
- ...await currentDataWithRelations,
444
- [attributeKey]: {
445
- results: sanitizedResults,
446
- meta: response.meta
447
- }
448
- };
416
+ utils.set(options.key, {
417
+ results: sanitizedResults,
418
+ meta: response.meta
419
+ });
420
+ }
421
+ if (options.attribute.type === "media") {
422
+ const permissionChecker2 = getService$2("permission-checker").create({
423
+ userAbility: params.state.userAbility,
424
+ model: "plugin::upload.file"
425
+ });
426
+ const response = await serviceUtils.buildMediaResponse(currentValue);
427
+ const sanitizedResults = await Promise.all(
428
+ response.results.map((media) => permissionChecker2.sanitizeOutput(media))
429
+ );
430
+ utils.set(options.key, {
431
+ results: sanitizedResults,
432
+ meta: response.meta
433
+ });
449
434
  }
450
- return currentDataWithRelations;
451
435
  },
452
- Promise.resolve(entry.data)
436
+ {
437
+ schema,
438
+ getModel: strapi2.getModel.bind(strapi2)
439
+ },
440
+ entry.data
453
441
  );
454
- return entryWithRelations;
455
442
  };
456
443
  const formattedResults = await Promise.all(
457
444
  results.map(async (result) => {
458
445
  return {
459
446
  ...result,
460
- data: await populateEntryRelations(result),
447
+ data: await populateEntry(result),
461
448
  meta: {
462
449
  unknownAttributes: serviceUtils.getSchemaAttributesDiff(
463
450
  result.schema,
@@ -488,30 +475,44 @@ const createHistoryService = ({ strapi: strapi2 }) => {
488
475
  // Clone to avoid mutating the original version data
489
476
  structuredClone(version.data)
490
477
  );
491
- const sanitizedSchemaAttributes = fp.omit(
492
- FIELDS_TO_IGNORE,
493
- contentTypeSchemaAttributes
494
- );
495
- const reducer = strapiUtils.async.reduce(Object.entries(sanitizedSchemaAttributes));
496
- const dataWithoutMissingRelations = await reducer(
497
- async (previousRelationAttributes, [name, attribute]) => {
498
- const versionRelationData = version.data[name];
499
- if (!versionRelationData) {
500
- return previousRelationAttributes;
478
+ const schema = structuredClone(version.schema);
479
+ schema.attributes = fp.omit(FIELDS_TO_IGNORE, contentTypeSchemaAttributes);
480
+ const dataWithoutMissingRelations = await strapiUtils.traverseEntity(
481
+ async (options, utils) => {
482
+ if (!options.attribute) return;
483
+ if (options.attribute.type === "component") {
484
+ utils.remove("id");
485
+ if (options.attribute.repeatable && options.value === null) {
486
+ utils.set(options.key, []);
487
+ }
488
+ }
489
+ if (options.attribute.type === "dynamiczone") {
490
+ if (options.value === null) {
491
+ utils.set(options.key, []);
492
+ }
501
493
  }
502
- if (attribute.type === "relation" && // TODO: handle polymorphic relations
503
- attribute.relation !== "morphToOne" && attribute.relation !== "morphToMany") {
504
- const data2 = await serviceUtils.getRelationRestoreValue(versionRelationData, attribute);
505
- previousRelationAttributes[name] = data2;
494
+ if (options.attribute.type === "relation" && // TODO: handle polymorphic relations
495
+ options.attribute.relation !== "morphToOne" && options.attribute.relation !== "morphToMany") {
496
+ if (!options.value) return;
497
+ const data2 = await serviceUtils.getRelationRestoreValue(
498
+ options.value,
499
+ options.attribute
500
+ );
501
+ utils.set(options.key, data2);
506
502
  }
507
- if (attribute.type === "media") {
508
- const data2 = await serviceUtils.getMediaRestoreValue(versionRelationData, attribute);
509
- previousRelationAttributes[name] = data2;
503
+ if (options.attribute.type === "media") {
504
+ if (!options.value) return;
505
+ const data2 = await serviceUtils.getMediaRestoreValue(
506
+ options.value
507
+ );
508
+ utils.set(options.key, data2);
510
509
  }
511
- return previousRelationAttributes;
512
510
  },
513
- // Clone to avoid mutating the original version data
514
- structuredClone(dataWithoutAddedAttributes)
511
+ {
512
+ schema,
513
+ getModel: strapi2.getModel.bind(strapi2)
514
+ },
515
+ dataWithoutAddedAttributes
515
516
  );
516
517
  const data = fp.omit(["id", ...Object.keys(schemaDiff.removed)], dataWithoutMissingRelations);
517
518
  const restoredDocument = await strapi2.documents(version.contentType).update({
@@ -740,14 +741,6 @@ const getFeature$1 = () => {
740
741
  };
741
742
  };
742
743
  const history = getFeature$1();
743
- const register = async ({ strapi: strapi2 }) => {
744
- await history.register?.({ strapi: strapi2 });
745
- };
746
- const ALLOWED_WEBHOOK_EVENTS = {
747
- ENTRY_PUBLISH: "entry.publish",
748
- ENTRY_UNPUBLISH: "entry.unpublish"
749
- };
750
- const FEATURE_ID = "preview";
751
744
  const info = { pluginName: "content-manager", type: "admin" };
752
745
  const previewRouter = {
753
746
  type: "admin",
@@ -793,6 +786,10 @@ const validatePreviewUrl = async (strapi2, uid2, params) => {
793
786
  }
794
787
  newParams.documentId = doc?.documentId;
795
788
  }
789
+ if (!newParams.status) {
790
+ const isDPEnabled = model?.options?.draftAndPublish;
791
+ newParams.status = isDPEnabled ? "draft" : "published";
792
+ }
796
793
  return newParams;
797
794
  };
798
795
  const createPreviewController = () => {
@@ -838,8 +835,48 @@ const createPreviewService = ({ strapi: strapi2 }) => {
838
835
  }
839
836
  };
840
837
  };
838
+ const extendMiddlewareConfiguration = (middleware = { name: "", config: {} }) => {
839
+ const middlewares = strapi.config.get("middlewares");
840
+ const configuredMiddlewares = middlewares.map((currentMiddleware) => {
841
+ if (currentMiddleware === middleware.name) {
842
+ return middleware;
843
+ }
844
+ if (currentMiddleware.name === middleware.name) {
845
+ return fp.mergeWith(
846
+ (objValue, srcValue) => {
847
+ if (Array.isArray(objValue)) {
848
+ return objValue.concat(srcValue);
849
+ }
850
+ return void 0;
851
+ },
852
+ currentMiddleware,
853
+ middleware
854
+ );
855
+ }
856
+ return currentMiddleware;
857
+ });
858
+ strapi.config.set("middlewares", configuredMiddlewares);
859
+ };
841
860
  const createPreviewConfigService = ({ strapi: strapi2 }) => {
842
861
  return {
862
+ register() {
863
+ if (!this.isEnabled()) {
864
+ return;
865
+ }
866
+ const config = strapi2.config.get("admin.preview");
867
+ if (config.config?.allowedOrigins) {
868
+ extendMiddlewareConfiguration({
869
+ name: "strapi::security",
870
+ config: {
871
+ contentSecurityPolicy: {
872
+ directives: {
873
+ "frame-src": config.config.allowedOrigins
874
+ }
875
+ }
876
+ }
877
+ });
878
+ }
879
+ },
843
880
  isEnabled() {
844
881
  const config = strapi2.config.get("admin.preview");
845
882
  if (!config) {
@@ -881,14 +918,13 @@ const services$1 = {
881
918
  "preview-config": createPreviewConfigService
882
919
  };
883
920
  const getFeature = () => {
884
- if (!strapi.features.future.isEnabled(FEATURE_ID)) {
885
- return {};
886
- }
887
921
  return {
888
- bootstrap() {
889
- console.log("Bootstrapping preview server");
922
+ register() {
890
923
  const config = getService(strapi, "preview-config");
891
924
  config.validate();
925
+ config.register();
926
+ },
927
+ bootstrap() {
892
928
  },
893
929
  routes: routes$1,
894
930
  controllers: controllers$1,
@@ -896,6 +932,14 @@ const getFeature = () => {
896
932
  };
897
933
  };
898
934
  const preview = getFeature();
935
+ const register = async ({ strapi: strapi2 }) => {
936
+ await history.register?.({ strapi: strapi2 });
937
+ await preview.register?.({ strapi: strapi2 });
938
+ };
939
+ const ALLOWED_WEBHOOK_EVENTS = {
940
+ ENTRY_PUBLISH: "entry.publish",
941
+ ENTRY_UNPUBLISH: "entry.unpublish"
942
+ };
899
943
  const bootstrap = async () => {
900
944
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
901
945
  strapi.get("webhookStore").addAllowedEvent(key, value);
@@ -1459,8 +1503,7 @@ const isSortable = (schema, name) => {
1459
1503
  if (!___default.default.has(schema.attributes, name)) {
1460
1504
  return false;
1461
1505
  }
1462
- if (schema.modelType === "component" && name === "id")
1463
- return false;
1506
+ if (schema.modelType === "component" && name === "id") return false;
1464
1507
  const attribute = schema.attributes[name];
1465
1508
  if (NON_SORTABLES.includes(attribute.type)) {
1466
1509
  return false;
@@ -1605,8 +1648,7 @@ const createDefaultSettings = async (schema) => {
1605
1648
  };
1606
1649
  };
1607
1650
  const syncSettings = async (configuration, schema) => {
1608
- if (fp.isEmpty(configuration.settings))
1609
- return createDefaultSettings(schema);
1651
+ if (fp.isEmpty(configuration.settings)) return createDefaultSettings(schema);
1610
1652
  const defaultField = getDefaultMainField(schema);
1611
1653
  const { mainField = defaultField, defaultSortBy = defaultField } = configuration.settings || {};
1612
1654
  return {
@@ -1782,8 +1824,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
1782
1824
  }
1783
1825
  switch (attribute.type) {
1784
1826
  case "relation": {
1785
- if (canCreate(attributePath))
1786
- return body2;
1827
+ if (canCreate(attributePath)) return body2;
1787
1828
  return fp.set(attributePath, { set: [] }, body2);
1788
1829
  }
1789
1830
  case "component": {
@@ -1793,8 +1834,7 @@ const excludeNotCreatableFields = (uid2, permissionChecker2) => (body, path = []
1793
1834
  ]);
1794
1835
  }
1795
1836
  default: {
1796
- if (canCreate(attributePath))
1797
- return body2;
1837
+ if (canCreate(attributePath)) return body2;
1798
1838
  return fp.set(attributePath, null, body2);
1799
1839
  }
1800
1840
  }
@@ -2587,8 +2627,7 @@ const validateStatus = (sourceUid, status) => {
2587
2627
  const sourceModel = strapi.getModel(sourceUid);
2588
2628
  const isDP = strapiUtils.contentTypes.hasDraftAndPublish;
2589
2629
  const isSourceDP = isDP(sourceModel);
2590
- if (!isSourceDP)
2591
- return { status: void 0 };
2630
+ if (!isSourceDP) return { status: void 0 };
2592
2631
  switch (status) {
2593
2632
  case "published":
2594
2633
  return { status: "published" };
@@ -3233,18 +3272,15 @@ async function syncMetadatas(configuration, schema) {
3233
3272
  ___default.default.set(updatedMeta, ["list", "searchable"], false);
3234
3273
  ___default.default.set(acc, [key], updatedMeta);
3235
3274
  }
3236
- if (!___default.default.has(edit, "mainField"))
3237
- return acc;
3275
+ if (!___default.default.has(edit, "mainField")) return acc;
3238
3276
  if (!isRelation$1(attr)) {
3239
3277
  ___default.default.set(updatedMeta, "edit", ___default.default.omit(edit, ["mainField"]));
3240
3278
  ___default.default.set(acc, [key], updatedMeta);
3241
3279
  return acc;
3242
3280
  }
3243
- if (edit.mainField === "id")
3244
- return acc;
3281
+ if (edit.mainField === "id") return acc;
3245
3282
  const targetSchema = getTargetSchema(attr.targetModel);
3246
- if (!targetSchema)
3247
- return acc;
3283
+ if (!targetSchema) return acc;
3248
3284
  if (!isSortable(targetSchema, edit.mainField) && !isListable(targetSchema, edit.mainField)) {
3249
3285
  ___default.default.set(updatedMeta, ["edit", "mainField"], getDefaultMainField(targetSchema));
3250
3286
  ___default.default.set(acc, [key], updatedMeta);
@@ -3289,8 +3325,7 @@ function createDefaultEditLayout(schema) {
3289
3325
  return appendToEditLayout([], keys2, schema);
3290
3326
  }
3291
3327
  function syncLayouts(configuration, schema) {
3292
- if (___default.default.isEmpty(configuration.layouts))
3293
- return createDefaultLayouts(schema);
3328
+ if (___default.default.isEmpty(configuration.layouts)) return createDefaultLayouts(schema);
3294
3329
  const { list = [], editRelations = [], edit = [] } = configuration.layouts || {};
3295
3330
  let cleanList = list.filter((attr) => isListable(schema, attr));
3296
3331
  const cleanEditRelations = editRelations.filter(
@@ -3301,8 +3336,7 @@ function syncLayouts(configuration, schema) {
3301
3336
  for (const row of edit) {
3302
3337
  const newRow = [];
3303
3338
  for (const el of row) {
3304
- if (!hasEditableAttribute(schema, el.name))
3305
- continue;
3339
+ if (!hasEditableAttribute(schema, el.name)) continue;
3306
3340
  const { hasFieldSize } = getService$2("field-sizes");
3307
3341
  const fieldType = hasFieldSize(schema.attributes[el.name].customField) ? schema.attributes[el.name].customField : schema.attributes[el.name].type;
3308
3342
  if (!isAllowedFieldSize(fieldType, el.size)) {
@@ -3333,8 +3367,7 @@ function syncLayouts(configuration, schema) {
3333
3367
  };
3334
3368
  }
3335
3369
  const appendToEditLayout = (layout = [], keysToAppend, schema) => {
3336
- if (keysToAppend.length === 0)
3337
- return layout;
3370
+ if (keysToAppend.length === 0) return layout;
3338
3371
  let currentRowIndex = Math.max(layout.length - 1, 0);
3339
3372
  if (!layout[currentRowIndex]) {
3340
3373
  layout[currentRowIndex] = [];
@@ -3900,6 +3933,12 @@ function getPopulateForRelation(attribute, model, attributeName, { countMany, co
3900
3933
  if (initialPopulate) {
3901
3934
  return initialPopulate;
3902
3935
  }
3936
+ if (attributeName === "localizations") {
3937
+ const validationPopulate = getPopulateForValidation(model.uid);
3938
+ return {
3939
+ populate: validationPopulate.populate
3940
+ };
3941
+ }
3903
3942
  if (!isVisibleAttribute$1(model, attributeName)) {
3904
3943
  return true;
3905
3944
  }
@@ -3959,6 +3998,9 @@ const getDeepPopulate = (uid2, {
3959
3998
  return {};
3960
3999
  }
3961
4000
  const model = strapi.getModel(uid2);
4001
+ if (!model) {
4002
+ return {};
4003
+ }
3962
4004
  return Object.keys(model.attributes).reduce(
3963
4005
  (populateAcc, attributeName) => fp.merge(
3964
4006
  populateAcc,
@@ -3978,40 +4020,46 @@ const getDeepPopulate = (uid2, {
3978
4020
  {}
3979
4021
  );
3980
4022
  };
3981
- const getValidatableFieldsPopulate = (uid2, {
3982
- initialPopulate = {},
3983
- countMany = false,
3984
- countOne = false,
3985
- maxLevel = Infinity
3986
- } = {}, level = 1) => {
3987
- if (level > maxLevel) {
4023
+ const getPopulateForValidation = (uid2) => {
4024
+ const model = strapi.getModel(uid2);
4025
+ if (!model) {
3988
4026
  return {};
3989
4027
  }
3990
- const model = strapi.getModel(uid2);
3991
4028
  return Object.entries(model.attributes).reduce((populateAcc, [attributeName, attribute]) => {
3992
- if (!getDoesAttributeRequireValidation(attribute)) {
4029
+ if (isScalarAttribute(attribute)) {
4030
+ if (getDoesAttributeRequireValidation(attribute)) {
4031
+ populateAcc.fields = populateAcc.fields || [];
4032
+ populateAcc.fields.push(attributeName);
4033
+ }
3993
4034
  return populateAcc;
3994
4035
  }
3995
- if (isScalarAttribute(attribute)) {
3996
- return fp.merge(populateAcc, {
3997
- [attributeName]: true
3998
- });
4036
+ if (isComponent(attribute)) {
4037
+ const component = attribute.component;
4038
+ const componentResult = getPopulateForValidation(component);
4039
+ if (Object.keys(componentResult).length > 0) {
4040
+ populateAcc.populate = populateAcc.populate || {};
4041
+ populateAcc.populate[attributeName] = componentResult;
4042
+ }
4043
+ return populateAcc;
3999
4044
  }
4000
- return fp.merge(
4001
- populateAcc,
4002
- getPopulateFor(
4003
- attributeName,
4004
- model,
4005
- {
4006
- // @ts-expect-error - improve types
4007
- initialPopulate: initialPopulate?.[attributeName],
4008
- countMany,
4009
- countOne,
4010
- maxLevel
4045
+ if (isDynamicZone(attribute)) {
4046
+ const components2 = attribute.components;
4047
+ const componentsResult = (components2 || []).reduce(
4048
+ (acc, componentUID) => {
4049
+ const componentResult = getPopulateForValidation(componentUID);
4050
+ if (Object.keys(componentResult).length > 0) {
4051
+ acc[componentUID] = componentResult;
4052
+ }
4053
+ return acc;
4011
4054
  },
4012
- level
4013
- )
4014
- );
4055
+ {}
4056
+ );
4057
+ if (Object.keys(componentsResult).length > 0) {
4058
+ populateAcc.populate = populateAcc.populate || {};
4059
+ populateAcc.populate[attributeName] = { on: componentsResult };
4060
+ }
4061
+ }
4062
+ return populateAcc;
4015
4063
  }, {});
4016
4064
  };
4017
4065
  const getDeepPopulateDraftCount = (uid2) => {
@@ -4253,7 +4301,6 @@ const AVAILABLE_LOCALES_FIELDS = [
4253
4301
  "locale",
4254
4302
  "updatedAt",
4255
4303
  "createdAt",
4256
- "status",
4257
4304
  "publishedAt",
4258
4305
  "documentId"
4259
4306
  ];
@@ -4274,36 +4321,20 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4274
4321
  /**
4275
4322
  * Returns available locales of a document for the current status
4276
4323
  */
4277
- async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4324
+ async getAvailableLocales(uid2, version, allVersions) {
4278
4325
  const versionsByLocale = fp.groupBy("locale", allVersions);
4279
4326
  if (version.locale) {
4280
4327
  delete versionsByLocale[version.locale];
4281
4328
  }
4282
4329
  const model = strapi2.getModel(uid2);
4283
- const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4284
- const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(
4285
- ({ key }, { remove }) => {
4286
- if (keysToKeep.includes(key)) {
4287
- return;
4288
- }
4289
- remove(key);
4290
- },
4291
- { schema: model, getModel: strapi2.getModel.bind(strapi2) },
4292
- // @ts-expect-error fix types DocumentVersion incompatible with Data
4293
- localeVersion
4294
- );
4295
4330
  const mappingResult = await strapiUtils.async.map(
4296
4331
  Object.values(versionsByLocale),
4297
4332
  async (localeVersions) => {
4298
- const mappedLocaleVersions = await strapiUtils.async.map(
4299
- localeVersions,
4300
- traversalFunction
4301
- );
4302
4333
  if (!strapiUtils.contentTypes.hasDraftAndPublish(model)) {
4303
- return mappedLocaleVersions[0];
4334
+ return localeVersions[0];
4304
4335
  }
4305
- const draftVersion = mappedLocaleVersions.find((v) => v.publishedAt === null);
4306
- const otherVersions = mappedLocaleVersions.filter((v) => v.id !== draftVersion?.id);
4336
+ const draftVersion = localeVersions.find((v) => v.publishedAt === null);
4337
+ const otherVersions = localeVersions.filter((v) => v.id !== draftVersion?.id);
4307
4338
  if (!draftVersion) {
4308
4339
  return;
4309
4340
  }
@@ -4325,8 +4356,7 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4325
4356
  const matchStatus = status === "published" ? v.publishedAt !== null : v.publishedAt === null;
4326
4357
  return matchLocale && matchStatus;
4327
4358
  });
4328
- if (!availableStatus)
4329
- return availableStatus;
4359
+ if (!availableStatus) return availableStatus;
4330
4360
  return fp.pick(AVAILABLE_STATUS_FIELDS, availableStatus);
4331
4361
  },
4332
4362
  /**
@@ -4336,18 +4366,19 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4336
4366
  * @returns
4337
4367
  */
4338
4368
  async getManyAvailableStatus(uid2, documents) {
4339
- if (!documents.length)
4340
- return [];
4369
+ if (!documents.length) return [];
4341
4370
  const status = documents[0].publishedAt !== null ? "published" : "draft";
4342
- const locale = documents[0]?.locale;
4343
- const otherStatus = status === "published" ? "draft" : "published";
4344
- return strapi2.documents(uid2).findMany({
4345
- filters: {
4346
- documentId: { $in: documents.map((d) => d.documentId).filter(Boolean) }
4347
- },
4348
- status: otherStatus,
4349
- locale,
4350
- fields: ["documentId", "locale", "updatedAt", "createdAt", "publishedAt"]
4371
+ const locales = documents.map((d) => d.locale).filter(Boolean);
4372
+ const where = {
4373
+ documentId: { $in: documents.map((d) => d.documentId).filter(Boolean) },
4374
+ publishedAt: { $null: status === "published" }
4375
+ };
4376
+ if (locales.length) {
4377
+ where.locale = { $in: locales };
4378
+ }
4379
+ return strapi2.query(uid2).findMany({
4380
+ where,
4381
+ select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"]
4351
4382
  });
4352
4383
  },
4353
4384
  getStatus(version, otherDocumentStatuses) {
@@ -4364,10 +4395,8 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4364
4395
  } else if (otherVersion) {
4365
4396
  draftVersion = otherVersion;
4366
4397
  }
4367
- if (!draftVersion)
4368
- return CONTENT_MANAGER_STATUS.PUBLISHED;
4369
- if (!publishedVersion)
4370
- return CONTENT_MANAGER_STATUS.DRAFT;
4398
+ if (!draftVersion) return CONTENT_MANAGER_STATUS.PUBLISHED;
4399
+ if (!publishedVersion) return CONTENT_MANAGER_STATUS.DRAFT;
4371
4400
  const isDraftModified = getIsVersionLatestModification(draftVersion, publishedVersion);
4372
4401
  return isDraftModified ? CONTENT_MANAGER_STATUS.MODIFIED : CONTENT_MANAGER_STATUS.PUBLISHED;
4373
4402
  },
@@ -4375,11 +4404,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4375
4404
  // We could refactor this so the locales are only loaded when they're
4376
4405
  // needed. e.g. in the bulk locale action modal.
4377
4406
  async getMetadata(uid2, version, { availableLocales = true, availableStatus = true } = {}) {
4378
- const populate = getValidatableFieldsPopulate(uid2);
4379
- const versions = await strapi2.db.query(uid2).findMany({
4380
- where: { documentId: version.documentId },
4407
+ const { populate = {}, fields = [] } = getPopulateForValidation(uid2);
4408
+ const params = {
4381
4409
  populate: {
4382
- // Populate only fields that require validation for bulk locale actions
4383
4410
  ...populate,
4384
4411
  // NOTE: creator fields are selected in this way to avoid exposing sensitive data
4385
4412
  createdBy: {
@@ -4388,9 +4415,15 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4388
4415
  updatedBy: {
4389
4416
  select: ["id", "firstname", "lastname", "email"]
4390
4417
  }
4418
+ },
4419
+ fields: fp.uniq([...AVAILABLE_LOCALES_FIELDS, ...fields]),
4420
+ filters: {
4421
+ documentId: version.documentId
4391
4422
  }
4392
- });
4393
- const availableLocalesResult = availableLocales ? await this.getAvailableLocales(uid2, version, versions, Object.keys(populate)) : [];
4423
+ };
4424
+ const dbParams = strapi2.get("query-params").transform(uid2, params);
4425
+ const versions = await strapi2.db.query(uid2).findMany(dbParams);
4426
+ const availableLocalesResult = availableLocales ? await this.getAvailableLocales(uid2, version, versions) : [];
4394
4427
  const availableStatusResult = availableStatus ? this.getAvailableStatus(version, versions) : null;
4395
4428
  return {
4396
4429
  availableLocales: availableLocalesResult,
@@ -4417,6 +4450,16 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4417
4450
  opts.availableStatus = false;
4418
4451
  }
4419
4452
  const meta = await this.getMetadata(uid2, document, opts);
4453
+ if (document.localizations) {
4454
+ const otherStatus = await this.getManyAvailableStatus(uid2, document.localizations);
4455
+ document.localizations = document.localizations.map((d) => {
4456
+ const status = otherStatus.find((s) => s.documentId === d.documentId);
4457
+ return {
4458
+ ...d,
4459
+ status: this.getStatus(d, status ? [status] : [])
4460
+ };
4461
+ });
4462
+ }
4420
4463
  return {
4421
4464
  data: {
4422
4465
  ...document,