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

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 (123) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-KXSuLnQD.js → ComponentConfigurationPage-CQDCxI8x.js} +3 -3
  2. package/dist/_chunks/{ComponentConfigurationPage-KXSuLnQD.js.map → ComponentConfigurationPage-CQDCxI8x.js.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-B3yDbeU1.mjs → ComponentConfigurationPage-jmWwucg_.mjs} +3 -3
  4. package/dist/_chunks/{ComponentConfigurationPage-B3yDbeU1.mjs.map → ComponentConfigurationPage-jmWwucg_.mjs.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-BQ17--5R.js → EditConfigurationPage-Ce4bIm4n.js} +3 -3
  6. package/dist/_chunks/{EditConfigurationPage-BQ17--5R.js.map → EditConfigurationPage-Ce4bIm4n.js.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-D7PrLO8j.mjs → EditConfigurationPage-W07CEdm2.mjs} +3 -3
  8. package/dist/_chunks/{EditConfigurationPage-D7PrLO8j.mjs.map → EditConfigurationPage-W07CEdm2.mjs.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-BgjdnGz2.js → EditViewPage-CqHMM0P0.js} +15 -5
  10. package/dist/_chunks/EditViewPage-CqHMM0P0.js.map +1 -0
  11. package/dist/_chunks/{EditViewPage-B7VgwJaG.mjs → EditViewPage-al5OO1NR.mjs} +15 -5
  12. package/dist/_chunks/EditViewPage-al5OO1NR.mjs.map +1 -0
  13. package/dist/_chunks/{Field-CdK7ZLmv.js → Field-DSOUlTCm.js} +100 -87
  14. package/dist/_chunks/Field-DSOUlTCm.js.map +1 -0
  15. package/dist/_chunks/{Field-tHCw4lGA.mjs → Field-EeG6NQ7x.mjs} +97 -84
  16. package/dist/_chunks/Field-EeG6NQ7x.mjs.map +1 -0
  17. package/dist/_chunks/{Form-BJxdTv3Q.mjs → Form-BAo9ANb_.mjs} +16 -8
  18. package/dist/_chunks/Form-BAo9ANb_.mjs.map +1 -0
  19. package/dist/_chunks/{Form-C_0KTVvV.js → Form-DAEfHKzm.js} +16 -8
  20. package/dist/_chunks/Form-DAEfHKzm.js.map +1 -0
  21. package/dist/_chunks/{History-DR2txJLE.mjs → History-BpLIu67W.mjs} +24 -11
  22. package/dist/_chunks/History-BpLIu67W.mjs.map +1 -0
  23. package/dist/_chunks/{History-nuEzM5qm.js → History-CTFvy6XH.js} +23 -10
  24. package/dist/_chunks/History-CTFvy6XH.js.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-CnB86Psm.js → ListConfigurationPage-CDzlMBz_.js} +2 -2
  26. package/dist/_chunks/{ListConfigurationPage-CnB86Psm.js.map → ListConfigurationPage-CDzlMBz_.js.map} +1 -1
  27. package/dist/_chunks/{ListConfigurationPage-voFVtXu6.mjs → ListConfigurationPage-DOqj5f8Y.mjs} +2 -2
  28. package/dist/_chunks/{ListConfigurationPage-voFVtXu6.mjs.map → ListConfigurationPage-DOqj5f8Y.mjs.map} +1 -1
  29. package/dist/_chunks/{ListViewPage-B_GaWgRH.mjs → ListViewPage-BbXYNI0v.mjs} +40 -36
  30. package/dist/_chunks/ListViewPage-BbXYNI0v.mjs.map +1 -0
  31. package/dist/_chunks/{ListViewPage-SXIXm-RM.js → ListViewPage-D0fpPYKp.js} +43 -39
  32. package/dist/_chunks/ListViewPage-D0fpPYKp.js.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-BzsQ3hLZ.js → NoContentTypePage-DTzkSAV5.js} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-BzsQ3hLZ.js.map → NoContentTypePage-DTzkSAV5.js.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-CYiGpsbj.mjs → NoContentTypePage-w2Q0VVOT.mjs} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-CYiGpsbj.mjs.map → NoContentTypePage-w2Q0VVOT.mjs.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-IGkId4C5.js → NoPermissionsPage-BoI2rU68.js} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-IGkId4C5.js.map → NoPermissionsPage-BoI2rU68.js.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-B5baIHal.mjs → NoPermissionsPage-Km0Vk5Wp.mjs} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-B5baIHal.mjs.map → NoPermissionsPage-Km0Vk5Wp.mjs.map} +1 -1
  41. package/dist/_chunks/{Relations-CIYDdKU-.mjs → Relations-C_bpmSuQ.mjs} +50 -28
  42. package/dist/_chunks/Relations-C_bpmSuQ.mjs.map +1 -0
  43. package/dist/_chunks/{Relations-Dhuurpx2.js → Relations-D6Nz5ksc.js} +50 -28
  44. package/dist/_chunks/Relations-D6Nz5ksc.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-CdT0kHZ8.js → index-BsMu2oVP.js} +1907 -1762
  50. package/dist/_chunks/index-BsMu2oVP.js.map +1 -0
  51. package/dist/_chunks/{index-C9TJPyni.mjs → index-DcQ6xogO.mjs} +1926 -1782
  52. package/dist/_chunks/index-DcQ6xogO.mjs.map +1 -0
  53. package/dist/_chunks/{layout-C6dxWYT7.js → layout-B4aCAdTt.js} +5 -4
  54. package/dist/_chunks/{layout-C6dxWYT7.js.map → layout-B4aCAdTt.js.map} +1 -1
  55. package/dist/_chunks/{layout-BNqvLR_b.mjs → layout-BavJ6v4B.mjs} +5 -4
  56. package/dist/_chunks/{layout-BNqvLR_b.mjs.map → layout-BavJ6v4B.mjs.map} +1 -1
  57. package/dist/_chunks/{relations-CkKqKw65.mjs → relations-DMG453Od.mjs} +2 -2
  58. package/dist/_chunks/{relations-CkKqKw65.mjs.map → relations-DMG453Od.mjs.map} +1 -1
  59. package/dist/_chunks/{relations-DtFaDnP1.js → relations-Lrm9nz_m.js} +2 -2
  60. package/dist/_chunks/{relations-DtFaDnP1.js.map → relations-Lrm9nz_m.js.map} +1 -1
  61. package/dist/_chunks/{usePrev-B9w_-eYc.js → useDebounce-CtcjDB3L.js} +14 -1
  62. package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -0
  63. package/dist/_chunks/useDebounce-DmuSJIF3.mjs +29 -0
  64. package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -0
  65. package/dist/admin/index.js +2 -1
  66. package/dist/admin/index.js.map +1 -1
  67. package/dist/admin/index.mjs +5 -4
  68. package/dist/admin/src/exports.d.ts +1 -1
  69. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  70. package/dist/admin/src/hooks/useDocument.d.ts +32 -1
  71. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +0 -32
  72. package/dist/admin/src/pages/EditView/components/Header.d.ts +11 -11
  73. package/dist/admin/src/services/api.d.ts +1 -1
  74. package/dist/admin/src/services/components.d.ts +2 -2
  75. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  76. package/dist/admin/src/services/documents.d.ts +19 -17
  77. package/dist/admin/src/services/init.d.ts +1 -1
  78. package/dist/admin/src/services/relations.d.ts +2 -2
  79. package/dist/admin/src/services/uid.d.ts +3 -3
  80. package/dist/admin/src/utils/validation.d.ts +4 -1
  81. package/dist/server/index.js +117 -53
  82. package/dist/server/index.js.map +1 -1
  83. package/dist/server/index.mjs +117 -53
  84. package/dist/server/index.mjs.map +1 -1
  85. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  86. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  87. package/dist/server/src/controllers/utils/metadata.d.ts +15 -1
  88. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  89. package/dist/server/src/history/services/history.d.ts.map +1 -1
  90. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  91. package/dist/server/src/history/services/utils.d.ts +1 -0
  92. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  93. package/dist/server/src/index.d.ts +4 -4
  94. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  95. package/dist/server/src/services/document-metadata.d.ts +8 -8
  96. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  97. package/dist/server/src/services/index.d.ts +4 -4
  98. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  99. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  100. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  101. package/dist/server/src/utils/index.d.ts +2 -0
  102. package/dist/server/src/utils/index.d.ts.map +1 -1
  103. package/dist/shared/contracts/collection-types.d.ts +3 -1
  104. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  105. package/package.json +12 -12
  106. package/dist/_chunks/EditViewPage-B7VgwJaG.mjs.map +0 -1
  107. package/dist/_chunks/EditViewPage-BgjdnGz2.js.map +0 -1
  108. package/dist/_chunks/Field-CdK7ZLmv.js.map +0 -1
  109. package/dist/_chunks/Field-tHCw4lGA.mjs.map +0 -1
  110. package/dist/_chunks/Form-BJxdTv3Q.mjs.map +0 -1
  111. package/dist/_chunks/Form-C_0KTVvV.js.map +0 -1
  112. package/dist/_chunks/History-DR2txJLE.mjs.map +0 -1
  113. package/dist/_chunks/History-nuEzM5qm.js.map +0 -1
  114. package/dist/_chunks/ListViewPage-B_GaWgRH.mjs.map +0 -1
  115. package/dist/_chunks/ListViewPage-SXIXm-RM.js.map +0 -1
  116. package/dist/_chunks/Relations-CIYDdKU-.mjs.map +0 -1
  117. package/dist/_chunks/Relations-Dhuurpx2.js.map +0 -1
  118. package/dist/_chunks/index-C9TJPyni.mjs.map +0 -1
  119. package/dist/_chunks/index-CdT0kHZ8.js.map +0 -1
  120. package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
  121. package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
  122. package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
  123. package/strapi-server.js +0 -3
@@ -199,7 +199,9 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
199
199
  return strapi2.db.query("plugin::upload.file").findOne({ where: { id: versionRelationData.id } });
200
200
  };
201
201
  const localesService = strapi2.plugin("i18n")?.service("locales");
202
+ const i18nContentTypeService = strapi2.plugin("i18n")?.service("content-types");
202
203
  const getDefaultLocale = async () => localesService ? localesService.getDefaultLocale() : null;
204
+ const isLocalizedContentType = (model) => i18nContentTypeService ? i18nContentTypeService.isLocalizedContentType(model) : false;
203
205
  const getLocaleDictionary = async () => {
204
206
  if (!localesService)
205
207
  return {};
@@ -317,6 +319,7 @@ const createServiceUtils = ({ strapi: strapi2 }) => {
317
319
  getRelationRestoreValue,
318
320
  getMediaRestoreValue,
319
321
  getDefaultLocale,
322
+ isLocalizedContentType,
320
323
  getLocaleDictionary,
321
324
  getRetentionDays,
322
325
  getVersionStatus,
@@ -339,7 +342,13 @@ const createHistoryService = ({ strapi: strapi2 }) => {
339
342
  });
340
343
  },
341
344
  async findVersionsPage(params) {
342
- const locale = params.query.locale || await serviceUtils.getDefaultLocale();
345
+ const model = strapi2.getModel(params.query.contentType);
346
+ const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
347
+ const defaultLocale = await serviceUtils.getDefaultLocale();
348
+ let locale = null;
349
+ if (isLocalizedContentType) {
350
+ locale = params.query.locale || defaultLocale;
351
+ }
343
352
  const [{ results, pagination }, localeDictionary] = await Promise.all([
344
353
  query.findPage({
345
354
  ...params.query,
@@ -384,7 +393,12 @@ const createHistoryService = ({ strapi: strapi2 }) => {
384
393
  if (userToPopulate == null) {
385
394
  return null;
386
395
  }
387
- return strapi2.query("admin::user").findOne({ where: { id: userToPopulate.id } });
396
+ return strapi2.query("admin::user").findOne({
397
+ where: {
398
+ ...userToPopulate.id ? { id: userToPopulate.id } : {},
399
+ ...userToPopulate.documentId ? { documentId: userToPopulate.documentId } : {}
400
+ }
401
+ });
388
402
  })
389
403
  );
390
404
  return {
@@ -555,11 +569,13 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
555
569
  }
556
570
  const uid2 = context.contentType.uid;
557
571
  const schemas = getSchemas(uid2);
572
+ const model = strapi2.getModel(uid2);
573
+ const isLocalizedContentType = serviceUtils.isLocalizedContentType(model);
558
574
  const localeEntries = await strapi2.db.query(uid2).findMany({
559
575
  where: {
560
576
  documentId,
561
- locale: { $in: locales },
562
- publishedAt: null
577
+ ...isLocalizedContentType ? { locale: { $in: locales } } : {},
578
+ ...strapiUtils.contentTypes.hasDraftAndPublish(strapi2.contentTypes[uid2]) ? { publishedAt: null } : {}
563
579
  },
564
580
  populate: serviceUtils.getDeepPopulate(
565
581
  uid2,
@@ -1219,6 +1235,11 @@ const { createPolicy } = strapiUtils.policy;
1219
1235
  const hasPermissions = createPolicy({
1220
1236
  name: "plugin::content-manager.hasPermissions",
1221
1237
  validator: validateHasPermissionsInput,
1238
+ /**
1239
+ * NOTE: Action aliases are currently not checked at this level (policy).
1240
+ * This is currently the intended behavior to avoid changing the behavior of API related permissions.
1241
+ * If you want to add support for it, please create a dedicated RFC with a list of potential side effect this could have.
1242
+ */
1222
1243
  handler(ctx, config = {}) {
1223
1244
  const { actions = [], hasAtLeastOne = false } = config;
1224
1245
  const { userAbility } = ctx.state;
@@ -1699,7 +1720,7 @@ const updateDocument = async (ctx, opts) => {
1699
1720
  throw new strapiUtils.errors.ForbiddenError();
1700
1721
  }
1701
1722
  const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
1702
- const setCreator = strapiUtils.setCreatorFields({ user, isEdition: true });
1723
+ const setCreator = documentVersion ? strapiUtils.setCreatorFields({ user, isEdition: true }) : strapiUtils.setCreatorFields({ user });
1703
1724
  const sanitizeFn = strapiUtils.async.pipe(pickPermittedFields, setCreator);
1704
1725
  const sanitizedBody = await sanitizeFn(body);
1705
1726
  return documentManager2.update(documentVersion?.documentId || id, model, {
@@ -1771,7 +1792,7 @@ const collectionTypes = {
1771
1792
  permissionChecker2,
1772
1793
  model,
1773
1794
  // @ts-expect-error TODO: fix
1774
- { id, locale, publishedAt: null },
1795
+ { documentId: id, locale, publishedAt: null },
1775
1796
  { availableLocales: true, availableStatus: false }
1776
1797
  );
1777
1798
  ctx.body = { data: {}, meta };
@@ -1908,11 +1929,17 @@ const collectionTypes = {
1908
1929
  }
1909
1930
  const isUpdate = !isCreate;
1910
1931
  if (isUpdate) {
1911
- document = await documentManager2.findOne(id, model, { populate, locale });
1912
- if (!document) {
1932
+ const documentExists = documentManager2.exists(model, id);
1933
+ if (!documentExists) {
1913
1934
  throw new strapiUtils.errors.NotFoundError("Document not found");
1914
1935
  }
1915
- if (permissionChecker2.can.update(document)) {
1936
+ document = await documentManager2.findOne(id, model, { populate, locale });
1937
+ if (!document) {
1938
+ if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
1939
+ throw new strapiUtils.errors.ForbiddenError();
1940
+ }
1941
+ document = await updateDocument(ctx);
1942
+ } else if (permissionChecker2.can.update(document)) {
1916
1943
  await updateDocument(ctx);
1917
1944
  }
1918
1945
  }
@@ -1974,7 +2001,9 @@ const collectionTypes = {
1974
2001
  if (permissionChecker2.cannot.unpublish()) {
1975
2002
  return ctx.forbidden();
1976
2003
  }
1977
- const { locale } = await getDocumentLocaleAndStatus(body, model);
2004
+ const { locale } = await getDocumentLocaleAndStatus(body, model, {
2005
+ allowMultipleLocales: true
2006
+ });
1978
2007
  const entityPromises = documentIds.map(
1979
2008
  (documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
1980
2009
  );
@@ -2325,32 +2354,37 @@ const sanitizeMainField = (model, mainField, userAbility) => {
2325
2354
  userAbility,
2326
2355
  model: model.uid
2327
2356
  });
2328
- if (!isListable(model, mainField)) {
2357
+ const isMainFieldListable = isListable(model, mainField);
2358
+ const canReadMainField = permissionChecker2.can.read(null, mainField);
2359
+ if (!isMainFieldListable || !canReadMainField) {
2329
2360
  return "id";
2330
2361
  }
2331
- if (permissionChecker2.cannot.read(null, mainField)) {
2332
- if (model.uid === "plugin::users-permissions.role") {
2333
- const userPermissionChecker = getService$1("permission-checker").create({
2334
- userAbility,
2335
- model: "plugin::users-permissions.user"
2336
- });
2337
- if (userPermissionChecker.can.read()) {
2338
- return "name";
2339
- }
2340
- }
2341
- return "id";
2362
+ if (model.uid === "plugin::users-permissions.role") {
2363
+ return "name";
2342
2364
  }
2343
2365
  return mainField;
2344
2366
  };
2345
- const addStatusToRelations = async (uid2, relations2) => {
2346
- if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.contentTypes[uid2])) {
2367
+ const addStatusToRelations = async (targetUid, relations2) => {
2368
+ if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {
2347
2369
  return relations2;
2348
2370
  }
2349
2371
  const documentMetadata2 = getService$1("document-metadata");
2350
- const documentsAvailableStatus = await documentMetadata2.getManyAvailableStatus(uid2, relations2);
2372
+ if (!relations2.length) {
2373
+ return relations2;
2374
+ }
2375
+ const firstRelation = relations2[0];
2376
+ const filters = {
2377
+ documentId: { $in: relations2.map((r) => r.documentId) },
2378
+ // NOTE: find the "opposite" status
2379
+ publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
2380
+ };
2381
+ const availableStatus = await strapi.query(targetUid).findMany({
2382
+ select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
2383
+ filters
2384
+ });
2351
2385
  return relations2.map((relation) => {
2352
- const availableStatuses = documentsAvailableStatus.filter(
2353
- (availableDocument) => availableDocument.documentId === relation.documentId
2386
+ const availableStatuses = availableStatus.filter(
2387
+ (availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
2354
2388
  );
2355
2389
  return {
2356
2390
  ...relation,
@@ -2371,11 +2405,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
2371
2405
  const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
2372
2406
  const isSourceLocalized = isLocalized(sourceModel);
2373
2407
  const isTargetLocalized = isLocalized(targetModel);
2374
- let validatedLocale = locale;
2375
- if (!targetModel || !isTargetLocalized)
2376
- validatedLocale = void 0;
2377
2408
  return {
2378
- locale: validatedLocale,
2409
+ locale,
2379
2410
  isSourceLocalized,
2380
2411
  isTargetLocalized
2381
2412
  };
@@ -2478,7 +2509,7 @@ const relations = {
2478
2509
  attribute,
2479
2510
  fieldsToSelect,
2480
2511
  mainField,
2481
- source: { schema: sourceSchema },
2512
+ source: { schema: sourceSchema, isLocalized: isSourceLocalized },
2482
2513
  target: { schema: targetSchema, isLocalized: isTargetLocalized },
2483
2514
  sourceSchema,
2484
2515
  targetSchema,
@@ -2500,7 +2531,8 @@ const relations = {
2500
2531
  fieldsToSelect,
2501
2532
  mainField,
2502
2533
  source: {
2503
- schema: { uid: sourceUid, modelType: sourceModelType }
2534
+ schema: { uid: sourceUid, modelType: sourceModelType },
2535
+ isLocalized: isSourceLocalized
2504
2536
  },
2505
2537
  target: {
2506
2538
  schema: { uid: targetUid },
@@ -2538,12 +2570,16 @@ const relations = {
2538
2570
  } else {
2539
2571
  where.id = id;
2540
2572
  }
2541
- if (status) {
2542
- where[`${alias}.published_at`] = getPublishedAtClause(status, targetUid);
2573
+ const publishedAt = getPublishedAtClause(status, targetUid);
2574
+ if (!fp.isEmpty(publishedAt)) {
2575
+ where[`${alias}.published_at`] = publishedAt;
2543
2576
  }
2544
- if (filterByLocale) {
2577
+ if (isTargetLocalized && locale) {
2545
2578
  where[`${alias}.locale`] = locale;
2546
2579
  }
2580
+ if (isSourceLocalized && locale) {
2581
+ where.locale = locale;
2582
+ }
2547
2583
  if ((idsToInclude?.length ?? 0) !== 0) {
2548
2584
  where[`${alias}.id`].$notIn = idsToInclude;
2549
2585
  }
@@ -2561,7 +2597,8 @@ const relations = {
2561
2597
  id: { $notIn: fp.uniq(idsToOmit) }
2562
2598
  });
2563
2599
  }
2564
- const res = await strapi.db.query(targetUid).findPage(strapi.get("query-params").transform(targetUid, queryParams));
2600
+ const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
2601
+ const res = await strapi.db.query(targetUid).findPage(dbQuery);
2565
2602
  ctx.body = {
2566
2603
  ...res,
2567
2604
  results: await addStatusToRelations(targetUid, res.results)
@@ -2576,29 +2613,39 @@ const relations = {
2576
2613
  attribute,
2577
2614
  targetField,
2578
2615
  fieldsToSelect,
2579
- source: {
2580
- schema: { uid: sourceUid }
2581
- },
2582
- target: {
2583
- schema: { uid: targetUid }
2584
- }
2616
+ status,
2617
+ source: { schema: sourceSchema },
2618
+ target: { schema: targetSchema }
2585
2619
  } = await this.extractAndValidateRequestInfo(ctx, id);
2620
+ const { uid: sourceUid } = sourceSchema;
2621
+ const { uid: targetUid } = targetSchema;
2586
2622
  const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2587
2623
  const dbQuery = strapi.db.query(sourceUid);
2588
2624
  const loadRelations = strapiUtils.relations.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
2625
+ const filters = {};
2626
+ if (sourceSchema?.options?.draftAndPublish) {
2627
+ if (targetSchema?.options?.draftAndPublish) {
2628
+ if (status === "published") {
2629
+ filters.publishedAt = { $notNull: true };
2630
+ } else {
2631
+ filters.publishedAt = { $null: true };
2632
+ }
2633
+ }
2634
+ } else if (targetSchema?.options?.draftAndPublish) {
2635
+ filters.publishedAt = { $null: true };
2636
+ }
2589
2637
  const res = await loadRelations({ id: entryId }, targetField, {
2590
- select: ["id", "documentId", "locale", "publishedAt"],
2638
+ select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
2591
2639
  ordering: "desc",
2592
2640
  page: ctx.request.query.page,
2593
- pageSize: ctx.request.query.pageSize
2641
+ pageSize: ctx.request.query.pageSize,
2642
+ filters
2594
2643
  });
2595
2644
  const loadedIds = res.results.map((item) => item.id);
2596
2645
  addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
2597
2646
  const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
2598
2647
  ...strapi.get("query-params").transform(targetUid, permissionQuery),
2599
- ordering: "desc",
2600
- page: ctx.request.query.page,
2601
- pageSize: ctx.request.query.pageSize
2648
+ ordering: "desc"
2602
2649
  });
2603
2650
  const relationsUnion = fp.uniqBy("id", fp.concat(sanitizedRes.results, res.results));
2604
2651
  ctx.body = {
@@ -2685,7 +2732,7 @@ const singleTypes = {
2685
2732
  permissionChecker2,
2686
2733
  model,
2687
2734
  // @ts-expect-error - fix types
2688
- { id: document.documentId, locale, publishedAt: null },
2735
+ { documentId: document.documentId, locale, publishedAt: null },
2689
2736
  { availableLocales: true, availableStatus: false }
2690
2737
  );
2691
2738
  ctx.body = { data: {}, meta };
@@ -3504,12 +3551,27 @@ const createPermissionChecker = (strapi2) => ({ userAbility, model }) => {
3504
3551
  ability: userAbility,
3505
3552
  model
3506
3553
  });
3507
- const toSubject = (entity) => entity ? permissionsManager.toSubject(entity, model) : model;
3554
+ const { actionProvider } = strapi2.service("admin::permission");
3555
+ const toSubject = (entity) => {
3556
+ return entity ? permissionsManager.toSubject(entity, model) : model;
3557
+ };
3508
3558
  const can = (action, entity, field) => {
3509
- return userAbility.can(action, toSubject(entity), field);
3559
+ const subject = toSubject(entity);
3560
+ const aliases = actionProvider.unstable_aliases(action, model);
3561
+ return (
3562
+ // Test the original action to see if it passes
3563
+ userAbility.can(action, subject, field) || // Else try every known alias if at least one of them succeed, then the user "can"
3564
+ aliases.some((alias) => userAbility.can(alias, subject, field))
3565
+ );
3510
3566
  };
3511
3567
  const cannot = (action, entity, field) => {
3512
- return userAbility.cannot(action, toSubject(entity), field);
3568
+ const subject = toSubject(entity);
3569
+ const aliases = actionProvider.unstable_aliases(action, model);
3570
+ return (
3571
+ // Test both the original action
3572
+ userAbility.cannot(action, subject, field) && // and every known alias, if all of them fail (cannot), then the user truly "cannot"
3573
+ aliases.every((alias) => userAbility.cannot(alias, subject, field))
3574
+ );
3513
3575
  };
3514
3576
  const sanitizeOutput = (data, { action = ACTIONS.read } = {}) => {
3515
3577
  return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });
@@ -4041,7 +4103,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4041
4103
  */
4042
4104
  async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4043
4105
  const versionsByLocale = fp.groupBy("locale", allVersions);
4044
- delete versionsByLocale[version.locale];
4106
+ if (version.locale) {
4107
+ delete versionsByLocale[version.locale];
4108
+ }
4045
4109
  const model = strapi2.getModel(uid2);
4046
4110
  const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4047
4111
  const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(