@strapi/content-manager 0.0.0-experimental.abc → 0.0.0-experimental.ae69a6ec6a65b1061cd6a00b2608abeeff436042

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 (136) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-B3yDbeU1.mjs → ComponentConfigurationPage-DH3rgf1K.mjs} +4 -4
  2. package/dist/_chunks/{ComponentConfigurationPage-B3yDbeU1.mjs.map → ComponentConfigurationPage-DH3rgf1K.mjs.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-KXSuLnQD.js → ComponentConfigurationPage-DRh2GoZx.js} +4 -4
  4. package/dist/_chunks/{ComponentConfigurationPage-KXSuLnQD.js.map → ComponentConfigurationPage-DRh2GoZx.js.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-BQ17--5R.js → EditConfigurationPage-BOAqRJUV.js} +4 -4
  6. package/dist/_chunks/{EditConfigurationPage-BQ17--5R.js.map → EditConfigurationPage-BOAqRJUV.js.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-D7PrLO8j.mjs → EditConfigurationPage-C1HHivAz.mjs} +4 -4
  8. package/dist/_chunks/{EditConfigurationPage-D7PrLO8j.mjs.map → EditConfigurationPage-C1HHivAz.mjs.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-BgjdnGz2.js → EditViewPage-CgfL33yw.js} +15 -5
  10. package/dist/_chunks/EditViewPage-CgfL33yw.js.map +1 -0
  11. package/dist/_chunks/{EditViewPage-B7VgwJaG.mjs → EditViewPage-DBV7CZVf.mjs} +15 -5
  12. package/dist/_chunks/EditViewPage-DBV7CZVf.mjs.map +1 -0
  13. package/dist/_chunks/{Field-tHCw4lGA.mjs → Field-BQFK_H87.mjs} +98 -85
  14. package/dist/_chunks/Field-BQFK_H87.mjs.map +1 -0
  15. package/dist/_chunks/{Field-CdK7ZLmv.js → Field-C647fIuP.js} +101 -88
  16. package/dist/_chunks/Field-C647fIuP.js.map +1 -0
  17. package/dist/_chunks/{Form-BJxdTv3Q.mjs → Form--31reETM.mjs} +16 -8
  18. package/dist/_chunks/Form--31reETM.mjs.map +1 -0
  19. package/dist/_chunks/{Form-C_0KTVvV.js → Form-CsYUrVEA.js} +16 -8
  20. package/dist/_chunks/Form-CsYUrVEA.js.map +1 -0
  21. package/dist/_chunks/{History-DR2txJLE.mjs → History-8tQaor_-.mjs} +25 -12
  22. package/dist/_chunks/History-8tQaor_-.mjs.map +1 -0
  23. package/dist/_chunks/{History-nuEzM5qm.js → History-Dl6wOm0V.js} +24 -11
  24. package/dist/_chunks/History-Dl6wOm0V.js.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-CnB86Psm.js → ListConfigurationPage-BedUJnmo.js} +3 -3
  26. package/dist/_chunks/{ListConfigurationPage-CnB86Psm.js.map → ListConfigurationPage-BedUJnmo.js.map} +1 -1
  27. package/dist/_chunks/{ListConfigurationPage-voFVtXu6.mjs → ListConfigurationPage-_WWIGpVT.mjs} +3 -3
  28. package/dist/_chunks/{ListConfigurationPage-voFVtXu6.mjs.map → ListConfigurationPage-_WWIGpVT.mjs.map} +1 -1
  29. package/dist/_chunks/{ListViewPage-SXIXm-RM.js → ListViewPage-5QzoAtAo.js} +55 -40
  30. package/dist/_chunks/ListViewPage-5QzoAtAo.js.map +1 -0
  31. package/dist/_chunks/{ListViewPage-B_GaWgRH.mjs → ListViewPage-CZfw9OW9.mjs} +52 -37
  32. package/dist/_chunks/ListViewPage-CZfw9OW9.mjs.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-CYiGpsbj.mjs → NoContentTypePage-D-RqshUI.mjs} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-CYiGpsbj.mjs.map → NoContentTypePage-D-RqshUI.mjs.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-BzsQ3hLZ.js → NoContentTypePage-DBIyA7hd.js} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-BzsQ3hLZ.js.map → NoContentTypePage-DBIyA7hd.js.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-IGkId4C5.js → NoPermissionsPage-CCAreseM.js} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-IGkId4C5.js.map → NoPermissionsPage-CCAreseM.js.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-B5baIHal.mjs → NoPermissionsPage-m7GAd26r.mjs} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-B5baIHal.mjs.map → NoPermissionsPage-m7GAd26r.mjs.map} +1 -1
  41. package/dist/_chunks/{Relations-CIYDdKU-.mjs → Relations-Dq52hb_u.mjs} +69 -36
  42. package/dist/_chunks/Relations-Dq52hb_u.mjs.map +1 -0
  43. package/dist/_chunks/{Relations-Dhuurpx2.js → Relations-SRwPhmo7.js} +68 -35
  44. package/dist/_chunks/Relations-SRwPhmo7.js.map +1 -0
  45. package/dist/_chunks/{en-uOUIxfcQ.js → en-Bm0D0IWz.js} +13 -12
  46. package/dist/_chunks/{en-uOUIxfcQ.js.map → en-Bm0D0IWz.js.map} +1 -1
  47. package/dist/_chunks/{en-BrCTWlZv.mjs → en-DKV44jRb.mjs} +13 -12
  48. package/dist/_chunks/{en-BrCTWlZv.mjs.map → en-DKV44jRb.mjs.map} +1 -1
  49. package/dist/_chunks/{index-C9TJPyni.mjs → index-1Bdj-6ls.mjs} +2067 -1914
  50. package/dist/_chunks/index-1Bdj-6ls.mjs.map +1 -0
  51. package/dist/_chunks/{index-CdT0kHZ8.js → index-CsrCnNa3.js} +2048 -1894
  52. package/dist/_chunks/index-CsrCnNa3.js.map +1 -0
  53. package/dist/_chunks/{layout-C6dxWYT7.js → layout-B33V9Tdu.js} +5 -4
  54. package/dist/_chunks/{layout-C6dxWYT7.js.map → layout-B33V9Tdu.js.map} +1 -1
  55. package/dist/_chunks/{layout-BNqvLR_b.mjs → layout-ByD1cQSW.mjs} +5 -4
  56. package/dist/_chunks/{layout-BNqvLR_b.mjs.map → layout-ByD1cQSW.mjs.map} +1 -1
  57. package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
  58. package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
  59. package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
  60. package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
  61. package/dist/_chunks/{relations-DtFaDnP1.js → relations-BBHlo3qQ.js} +3 -7
  62. package/dist/_chunks/relations-BBHlo3qQ.js.map +1 -0
  63. package/dist/_chunks/{relations-CkKqKw65.mjs → relations-DFwbNLZ0.mjs} +3 -7
  64. package/dist/_chunks/relations-DFwbNLZ0.mjs.map +1 -0
  65. package/dist/_chunks/{usePrev-B9w_-eYc.js → useDebounce-CtcjDB3L.js} +14 -1
  66. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -0
  67. package/dist/_chunks/useDebounce-DmuSJIF3.mjs +29 -0
  68. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -0
  69. package/dist/admin/index.js +2 -1
  70. package/dist/admin/index.js.map +1 -1
  71. package/dist/admin/index.mjs +5 -4
  72. package/dist/admin/src/exports.d.ts +1 -1
  73. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  74. package/dist/admin/src/hooks/useDocument.d.ts +32 -1
  75. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +0 -32
  76. package/dist/admin/src/pages/EditView/components/Header.d.ts +11 -11
  77. package/dist/admin/src/preview/constants.d.ts +1 -0
  78. package/dist/admin/src/preview/index.d.ts +4 -0
  79. package/dist/admin/src/services/api.d.ts +1 -1
  80. package/dist/admin/src/services/components.d.ts +2 -2
  81. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  82. package/dist/admin/src/services/documents.d.ts +19 -17
  83. package/dist/admin/src/services/init.d.ts +1 -1
  84. package/dist/admin/src/services/relations.d.ts +2 -2
  85. package/dist/admin/src/services/uid.d.ts +3 -3
  86. package/dist/admin/src/utils/validation.d.ts +4 -1
  87. package/dist/server/index.js +132 -55
  88. package/dist/server/index.js.map +1 -1
  89. package/dist/server/index.mjs +132 -55
  90. package/dist/server/index.mjs.map +1 -1
  91. package/dist/server/src/bootstrap.d.ts.map +1 -1
  92. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  93. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  94. package/dist/server/src/controllers/utils/metadata.d.ts +15 -1
  95. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  96. package/dist/server/src/history/services/history.d.ts.map +1 -1
  97. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  98. package/dist/server/src/history/services/utils.d.ts +1 -0
  99. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  100. package/dist/server/src/index.d.ts +4 -4
  101. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  102. package/dist/server/src/preview/constants.d.ts +2 -0
  103. package/dist/server/src/preview/constants.d.ts.map +1 -0
  104. package/dist/server/src/preview/index.d.ts +4 -0
  105. package/dist/server/src/preview/index.d.ts.map +1 -0
  106. package/dist/server/src/services/document-metadata.d.ts +8 -8
  107. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  108. package/dist/server/src/services/index.d.ts +4 -4
  109. package/dist/server/src/services/permission-checker.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/utils/index.d.ts +2 -0
  113. package/dist/server/src/utils/index.d.ts.map +1 -1
  114. package/dist/shared/contracts/collection-types.d.ts +3 -1
  115. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  116. package/package.json +13 -13
  117. package/dist/_chunks/EditViewPage-B7VgwJaG.mjs.map +0 -1
  118. package/dist/_chunks/EditViewPage-BgjdnGz2.js.map +0 -1
  119. package/dist/_chunks/Field-CdK7ZLmv.js.map +0 -1
  120. package/dist/_chunks/Field-tHCw4lGA.mjs.map +0 -1
  121. package/dist/_chunks/Form-BJxdTv3Q.mjs.map +0 -1
  122. package/dist/_chunks/Form-C_0KTVvV.js.map +0 -1
  123. package/dist/_chunks/History-DR2txJLE.mjs.map +0 -1
  124. package/dist/_chunks/History-nuEzM5qm.js.map +0 -1
  125. package/dist/_chunks/ListViewPage-B_GaWgRH.mjs.map +0 -1
  126. package/dist/_chunks/ListViewPage-SXIXm-RM.js.map +0 -1
  127. package/dist/_chunks/Relations-CIYDdKU-.mjs.map +0 -1
  128. package/dist/_chunks/Relations-Dhuurpx2.js.map +0 -1
  129. package/dist/_chunks/index-C9TJPyni.mjs.map +0 -1
  130. package/dist/_chunks/index-CdT0kHZ8.js.map +0 -1
  131. package/dist/_chunks/relations-CkKqKw65.mjs.map +0 -1
  132. package/dist/_chunks/relations-DtFaDnP1.js.map +0 -1
  133. package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
  134. package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
  135. package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
  136. package/strapi-server.js +0 -3
@@ -173,7 +173,9 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
173
173
  return strapi2.db.query("plugin::upload.file").findOne({ where: { id: versionRelationData.id } });
174
174
  };
175
175
  const localesService = strapi2.plugin("i18n")?.service("locales");
176
+ const i18nContentTypeService = strapi2.plugin("i18n")?.service("content-types");
176
177
  const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
178
+ const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
177
179
  const getLocaleDictionary = async () => {
178
180
  if (!localesService)
179
181
  return {};
@@ -291,6 +293,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
291
293
  getRelationRestoreValue,
292
294
  getMediaRestoreValue,
293
295
  getDefaultLocale,
296
+ isLocalizedContentType,
294
297
  getLocaleDictionary,
295
298
  getRetentionDays,
296
299
  getVersionStatus,
@@ -313,7 +316,13 @@ const createHistoryService = ({ strapi: strapi2 }) => {
313
316
  });
314
317
  },
315
318
  async findVersionsPage(params) {
316
- const locale = params.query.locale || await serviceUtils.getDefaultLocale();
319
+ const model = strapi2.getModel(params.query.contentType);
320
+ const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
321
+ const defaultLocale = await serviceUtils.getDefaultLocale();
322
+ let locale = null;
323
+ if (isLocalizedContentType) {
324
+ locale = params.query.locale || defaultLocale;
325
+ }
317
326
  const [{ results, pagination: pagination2 }, localeDictionary] = await Promise.all([
318
327
  query.findPage({
319
328
  ...params.query,
@@ -358,7 +367,12 @@ const createHistoryService = ({ strapi: strapi2 }) => {
358
367
  if (userToPopulate == null) {
359
368
  return null;
360
369
  }
361
- return strapi2.query("admin::user").findOne({ where: { id: userToPopulate.id } });
370
+ return strapi2.query("admin::user").findOne({
371
+ where: {
372
+ ...userToPopulate.id ? { id: userToPopulate.id } : {},
373
+ ...userToPopulate.documentId ? { documentId: userToPopulate.documentId } : {}
374
+ }
375
+ });
362
376
  })
363
377
  );
364
378
  return {
@@ -529,11 +543,13 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
529
543
  }
530
544
  const uid2 = context.contentType.uid;
531
545
  const schemas = getSchemas(uid2);
546
+ const model = strapi2.getModel(uid2);
547
+ const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
532
548
  const localeEntries = await strapi2.db.query(uid2).findMany({
533
549
  where: {
534
550
  documentId,
535
- locale: { $in: locales },
536
- publishedAt: null
551
+ ...isLocalizedContentType ? { locale: { $in: locales } } : {},
552
+ ...contentTypes$1.hasDraftAndPublish(strapi2.contentTypes[uid2]) ? { publishedAt: null } : {}
537
553
  },
538
554
  populate: serviceUtils.getDeepPopulate(
539
555
  uid2,
@@ -653,7 +669,7 @@ const historyVersion = {
653
669
  }
654
670
  }
655
671
  };
656
- const getFeature = () => {
672
+ const getFeature$1 = () => {
657
673
  if (strapi.ee.features.isEnabled("cms-content-history")) {
658
674
  return {
659
675
  register({ strapi: strapi2 }) {
@@ -676,7 +692,7 @@ const getFeature = () => {
676
692
  }
677
693
  };
678
694
  };
679
- const history = getFeature();
695
+ const history = getFeature$1();
680
696
  const register = async ({ strapi: strapi2 }) => {
681
697
  await history.register?.({ strapi: strapi2 });
682
698
  };
@@ -684,6 +700,18 @@ const ALLOWED_WEBHOOK_EVENTS = {
684
700
  ENTRY_PUBLISH: "entry.publish",
685
701
  ENTRY_UNPUBLISH: "entry.unpublish"
686
702
  };
703
+ const FEATURE_ID = "preview";
704
+ const getFeature = () => {
705
+ if (!strapi.features.future.isEnabled(FEATURE_ID)) {
706
+ return {};
707
+ }
708
+ return {
709
+ bootstrap() {
710
+ console.log("Bootstrapping preview server");
711
+ }
712
+ };
713
+ };
714
+ const preview = getFeature();
687
715
  const bootstrap = async () => {
688
716
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
689
717
  strapi.get("webhookStore").addAllowedEvent(key, value);
@@ -693,6 +721,7 @@ const bootstrap = async () => {
693
721
  await getService$1("content-types").syncConfigurations();
694
722
  await getService$1("permission").registerPermissions();
695
723
  await history.bootstrap?.({ strapi });
724
+ await preview.bootstrap?.({ strapi });
696
725
  };
697
726
  const destroy = async ({ strapi: strapi2 }) => {
698
727
  await history.destroy?.({ strapi: strapi2 });
@@ -1193,6 +1222,11 @@ const { createPolicy } = policy;
1193
1222
  const hasPermissions = createPolicy({
1194
1223
  name: "plugin::content-manager.hasPermissions",
1195
1224
  validator: validateHasPermissionsInput,
1225
+ /**
1226
+ * NOTE: Action aliases are currently not checked at this level (policy).
1227
+ * This is currently the intended behavior to avoid changing the behavior of API related permissions.
1228
+ * If you want to add support for it, please create a dedicated RFC with a list of potential side effect this could have.
1229
+ */
1196
1230
  handler(ctx, config = {}) {
1197
1231
  const { actions = [], hasAtLeastOne = false } = config;
1198
1232
  const { userAbility } = ctx.state;
@@ -1673,7 +1707,7 @@ const updateDocument = async (ctx, opts) => {
1673
1707
  throw new errors.ForbiddenError();
1674
1708
  }
1675
1709
  const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
1676
- const setCreator = setCreatorFields({ user, isEdition: true });
1710
+ const setCreator = documentVersion ? setCreatorFields({ user, isEdition: true }) : setCreatorFields({ user });
1677
1711
  const sanitizeFn = async.pipe(pickPermittedFields, setCreator);
1678
1712
  const sanitizedBody = await sanitizeFn(body);
1679
1713
  return documentManager2.update(documentVersion?.documentId || id, model, {
@@ -1745,7 +1779,7 @@ const collectionTypes = {
1745
1779
  permissionChecker2,
1746
1780
  model,
1747
1781
  // @ts-expect-error TODO: fix
1748
- { id, locale, publishedAt: null },
1782
+ { documentId: id, locale, publishedAt: null },
1749
1783
  { availableLocales: true, availableStatus: false }
1750
1784
  );
1751
1785
  ctx.body = { data: {}, meta };
@@ -1882,11 +1916,17 @@ const collectionTypes = {
1882
1916
  }
1883
1917
  const isUpdate = !isCreate;
1884
1918
  if (isUpdate) {
1885
- document = await documentManager2.findOne(id, model, { populate, locale });
1886
- if (!document) {
1919
+ const documentExists = documentManager2.exists(model, id);
1920
+ if (!documentExists) {
1887
1921
  throw new errors.NotFoundError("Document not found");
1888
1922
  }
1889
- if (permissionChecker2.can.update(document)) {
1923
+ document = await documentManager2.findOne(id, model, { populate, locale });
1924
+ if (!document) {
1925
+ if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
1926
+ throw new errors.ForbiddenError();
1927
+ }
1928
+ document = await updateDocument(ctx);
1929
+ } else if (permissionChecker2.can.update(document)) {
1890
1930
  await updateDocument(ctx);
1891
1931
  }
1892
1932
  }
@@ -1948,7 +1988,9 @@ const collectionTypes = {
1948
1988
  if (permissionChecker2.cannot.unpublish()) {
1949
1989
  return ctx.forbidden();
1950
1990
  }
1951
- const { locale } = await getDocumentLocaleAndStatus(body, model);
1991
+ const { locale } = await getDocumentLocaleAndStatus(body, model, {
1992
+ allowMultipleLocales: true
1993
+ });
1952
1994
  const entityPromises = documentIds.map(
1953
1995
  (documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
1954
1996
  );
@@ -2299,32 +2341,37 @@ const sanitizeMainField = (model, mainField, userAbility) => {
2299
2341
  userAbility,
2300
2342
  model: model.uid
2301
2343
  });
2302
- if (!isListable(model, mainField)) {
2344
+ const isMainFieldListable = isListable(model, mainField);
2345
+ const canReadMainField = permissionChecker2.can.read(null, mainField);
2346
+ if (!isMainFieldListable || !canReadMainField) {
2303
2347
  return "id";
2304
2348
  }
2305
- if (permissionChecker2.cannot.read(null, mainField)) {
2306
- if (model.uid === "plugin::users-permissions.role") {
2307
- const userPermissionChecker = getService$1("permission-checker").create({
2308
- userAbility,
2309
- model: "plugin::users-permissions.user"
2310
- });
2311
- if (userPermissionChecker.can.read()) {
2312
- return "name";
2313
- }
2314
- }
2315
- return "id";
2349
+ if (model.uid === "plugin::users-permissions.role") {
2350
+ return "name";
2316
2351
  }
2317
2352
  return mainField;
2318
2353
  };
2319
- const addStatusToRelations = async (uid2, relations2) => {
2320
- if (!contentTypes$1.hasDraftAndPublish(strapi.contentTypes[uid2])) {
2354
+ const addStatusToRelations = async (targetUid, relations2) => {
2355
+ if (!contentTypes$1.hasDraftAndPublish(strapi.getModel(targetUid))) {
2321
2356
  return relations2;
2322
2357
  }
2323
2358
  const documentMetadata2 = getService$1("document-metadata");
2324
- const documentsAvailableStatus = await documentMetadata2.getManyAvailableStatus(uid2, relations2);
2359
+ if (!relations2.length) {
2360
+ return relations2;
2361
+ }
2362
+ const firstRelation = relations2[0];
2363
+ const filters = {
2364
+ documentId: { $in: relations2.map((r) => r.documentId) },
2365
+ // NOTE: find the "opposite" status
2366
+ publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
2367
+ };
2368
+ const availableStatus = await strapi.query(targetUid).findMany({
2369
+ select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
2370
+ filters
2371
+ });
2325
2372
  return relations2.map((relation) => {
2326
- const availableStatuses = documentsAvailableStatus.filter(
2327
- (availableDocument) => availableDocument.documentId === relation.documentId
2373
+ const availableStatuses = availableStatus.filter(
2374
+ (availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
2328
2375
  );
2329
2376
  return {
2330
2377
  ...relation,
@@ -2345,11 +2392,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
2345
2392
  const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
2346
2393
  const isSourceLocalized = isLocalized(sourceModel);
2347
2394
  const isTargetLocalized = isLocalized(targetModel);
2348
- let validatedLocale = locale;
2349
- if (!targetModel || !isTargetLocalized)
2350
- validatedLocale = void 0;
2351
2395
  return {
2352
- locale: validatedLocale,
2396
+ locale,
2353
2397
  isSourceLocalized,
2354
2398
  isTargetLocalized
2355
2399
  };
@@ -2452,7 +2496,7 @@ const relations = {
2452
2496
  attribute,
2453
2497
  fieldsToSelect,
2454
2498
  mainField,
2455
- source: { schema: sourceSchema },
2499
+ source: { schema: sourceSchema, isLocalized: isSourceLocalized },
2456
2500
  target: { schema: targetSchema, isLocalized: isTargetLocalized },
2457
2501
  sourceSchema,
2458
2502
  targetSchema,
@@ -2474,7 +2518,8 @@ const relations = {
2474
2518
  fieldsToSelect,
2475
2519
  mainField,
2476
2520
  source: {
2477
- schema: { uid: sourceUid, modelType: sourceModelType }
2521
+ schema: { uid: sourceUid, modelType: sourceModelType },
2522
+ isLocalized: isSourceLocalized
2478
2523
  },
2479
2524
  target: {
2480
2525
  schema: { uid: targetUid },
@@ -2512,12 +2557,16 @@ const relations = {
2512
2557
  } else {
2513
2558
  where.id = id;
2514
2559
  }
2515
- if (status) {
2516
- where[`${alias}.published_at`] = getPublishedAtClause(status, targetUid);
2560
+ const publishedAt = getPublishedAtClause(status, targetUid);
2561
+ if (!isEmpty(publishedAt)) {
2562
+ where[`${alias}.published_at`] = publishedAt;
2517
2563
  }
2518
- if (filterByLocale) {
2564
+ if (isTargetLocalized && locale) {
2519
2565
  where[`${alias}.locale`] = locale;
2520
2566
  }
2567
+ if (isSourceLocalized && locale) {
2568
+ where.locale = locale;
2569
+ }
2521
2570
  if ((idsToInclude?.length ?? 0) !== 0) {
2522
2571
  where[`${alias}.id`].$notIn = idsToInclude;
2523
2572
  }
@@ -2535,7 +2584,8 @@ const relations = {
2535
2584
  id: { $notIn: uniq(idsToOmit) }
2536
2585
  });
2537
2586
  }
2538
- const res = await strapi.db.query(targetUid).findPage(strapi.get("query-params").transform(targetUid, queryParams));
2587
+ const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
2588
+ const res = await strapi.db.query(targetUid).findPage(dbQuery);
2539
2589
  ctx.body = {
2540
2590
  ...res,
2541
2591
  results: await addStatusToRelations(targetUid, res.results)
@@ -2550,29 +2600,39 @@ const relations = {
2550
2600
  attribute,
2551
2601
  targetField,
2552
2602
  fieldsToSelect,
2553
- source: {
2554
- schema: { uid: sourceUid }
2555
- },
2556
- target: {
2557
- schema: { uid: targetUid }
2558
- }
2603
+ status,
2604
+ source: { schema: sourceSchema },
2605
+ target: { schema: targetSchema }
2559
2606
  } = await this.extractAndValidateRequestInfo(ctx, id);
2607
+ const { uid: sourceUid } = sourceSchema;
2608
+ const { uid: targetUid } = targetSchema;
2560
2609
  const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2561
2610
  const dbQuery = strapi.db.query(sourceUid);
2562
2611
  const loadRelations = relations$1.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
2612
+ const filters = {};
2613
+ if (sourceSchema?.options?.draftAndPublish) {
2614
+ if (targetSchema?.options?.draftAndPublish) {
2615
+ if (status === "published") {
2616
+ filters.publishedAt = { $notNull: true };
2617
+ } else {
2618
+ filters.publishedAt = { $null: true };
2619
+ }
2620
+ }
2621
+ } else if (targetSchema?.options?.draftAndPublish) {
2622
+ filters.publishedAt = { $null: true };
2623
+ }
2563
2624
  const res = await loadRelations({ id: entryId }, targetField, {
2564
- select: ["id", "documentId", "locale", "publishedAt"],
2625
+ select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
2565
2626
  ordering: "desc",
2566
2627
  page: ctx.request.query.page,
2567
- pageSize: ctx.request.query.pageSize
2628
+ pageSize: ctx.request.query.pageSize,
2629
+ filters
2568
2630
  });
2569
2631
  const loadedIds = res.results.map((item) => item.id);
2570
2632
  addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
2571
2633
  const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
2572
2634
  ...strapi.get("query-params").transform(targetUid, permissionQuery),
2573
- ordering: "desc",
2574
- page: ctx.request.query.page,
2575
- pageSize: ctx.request.query.pageSize
2635
+ ordering: "desc"
2576
2636
  });
2577
2637
  const relationsUnion = uniqBy("id", concat(sanitizedRes.results, res.results));
2578
2638
  ctx.body = {
@@ -2659,7 +2719,7 @@ const singleTypes = {
2659
2719
  permissionChecker2,
2660
2720
  model,
2661
2721
  // @ts-expect-error - fix types
2662
- { id: document.documentId, locale, publishedAt: null },
2722
+ { documentId: document.documentId, locale, publishedAt: null },
2663
2723
  { availableLocales: true, availableStatus: false }
2664
2724
  );
2665
2725
  ctx.body = { data: {}, meta };
@@ -3478,12 +3538,27 @@ const createPermissionChecker = (strapi2) => ({ userAbility, model }) => {
3478
3538
  ability: userAbility,
3479
3539
  model
3480
3540
  });
3481
- const toSubject = (entity) => entity ? permissionsManager.toSubject(entity, model) : model;
3541
+ const { actionProvider } = strapi2.service("admin::permission");
3542
+ const toSubject = (entity) => {
3543
+ return entity ? permissionsManager.toSubject(entity, model) : model;
3544
+ };
3482
3545
  const can = (action, entity, field) => {
3483
- return userAbility.can(action, toSubject(entity), field);
3546
+ const subject = toSubject(entity);
3547
+ const aliases = actionProvider.unstable_aliases(action, model);
3548
+ return (
3549
+ // Test the original action to see if it passes
3550
+ userAbility.can(action, subject, field) || // Else try every known alias if at least one of them succeed, then the user "can"
3551
+ aliases.some((alias) => userAbility.can(alias, subject, field))
3552
+ );
3484
3553
  };
3485
3554
  const cannot = (action, entity, field) => {
3486
- return userAbility.cannot(action, toSubject(entity), field);
3555
+ const subject = toSubject(entity);
3556
+ const aliases = actionProvider.unstable_aliases(action, model);
3557
+ return (
3558
+ // Test both the original action
3559
+ userAbility.cannot(action, subject, field) && // and every known alias, if all of them fail (cannot), then the user truly "cannot"
3560
+ aliases.every((alias) => userAbility.cannot(alias, subject, field))
3561
+ );
3487
3562
  };
3488
3563
  const sanitizeOutput = (data, { action = ACTIONS.read } = {}) => {
3489
3564
  return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });
@@ -4015,7 +4090,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4015
4090
  */
4016
4091
  async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4017
4092
  const versionsByLocale = groupBy("locale", allVersions);
4018
- delete versionsByLocale[version.locale];
4093
+ if (version.locale) {
4094
+ delete versionsByLocale[version.locale];
4095
+ }
4019
4096
  const model = strapi2.getModel(uid2);
4020
4097
  const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4021
4098
  const traversalFunction = async (localeVersion) => traverseEntity(