@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
@@ -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,
@@ -1193,6 +1209,11 @@ const { createPolicy } = policy;
1193
1209
  const hasPermissions = createPolicy({
1194
1210
  name: "plugin::content-manager.hasPermissions",
1195
1211
  validator: validateHasPermissionsInput,
1212
+ /**
1213
+ * NOTE: Action aliases are currently not checked at this level (policy).
1214
+ * This is currently the intended behavior to avoid changing the behavior of API related permissions.
1215
+ * If you want to add support for it, please create a dedicated RFC with a list of potential side effect this could have.
1216
+ */
1196
1217
  handler(ctx, config = {}) {
1197
1218
  const { actions = [], hasAtLeastOne = false } = config;
1198
1219
  const { userAbility } = ctx.state;
@@ -1673,7 +1694,7 @@ const updateDocument = async (ctx, opts) => {
1673
1694
  throw new errors.ForbiddenError();
1674
1695
  }
1675
1696
  const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
1676
- const setCreator = setCreatorFields({ user, isEdition: true });
1697
+ const setCreator = documentVersion ? setCreatorFields({ user, isEdition: true }) : setCreatorFields({ user });
1677
1698
  const sanitizeFn = async.pipe(pickPermittedFields, setCreator);
1678
1699
  const sanitizedBody = await sanitizeFn(body);
1679
1700
  return documentManager2.update(documentVersion?.documentId || id, model, {
@@ -1745,7 +1766,7 @@ const collectionTypes = {
1745
1766
  permissionChecker2,
1746
1767
  model,
1747
1768
  // @ts-expect-error TODO: fix
1748
- { id, locale, publishedAt: null },
1769
+ { documentId: id, locale, publishedAt: null },
1749
1770
  { availableLocales: true, availableStatus: false }
1750
1771
  );
1751
1772
  ctx.body = { data: {}, meta };
@@ -1882,11 +1903,17 @@ const collectionTypes = {
1882
1903
  }
1883
1904
  const isUpdate = !isCreate;
1884
1905
  if (isUpdate) {
1885
- document = await documentManager2.findOne(id, model, { populate, locale });
1886
- if (!document) {
1906
+ const documentExists = documentManager2.exists(model, id);
1907
+ if (!documentExists) {
1887
1908
  throw new errors.NotFoundError("Document not found");
1888
1909
  }
1889
- if (permissionChecker2.can.update(document)) {
1910
+ document = await documentManager2.findOne(id, model, { populate, locale });
1911
+ if (!document) {
1912
+ if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
1913
+ throw new errors.ForbiddenError();
1914
+ }
1915
+ document = await updateDocument(ctx);
1916
+ } else if (permissionChecker2.can.update(document)) {
1890
1917
  await updateDocument(ctx);
1891
1918
  }
1892
1919
  }
@@ -1948,7 +1975,9 @@ const collectionTypes = {
1948
1975
  if (permissionChecker2.cannot.unpublish()) {
1949
1976
  return ctx.forbidden();
1950
1977
  }
1951
- const { locale } = await getDocumentLocaleAndStatus(body, model);
1978
+ const { locale } = await getDocumentLocaleAndStatus(body, model, {
1979
+ allowMultipleLocales: true
1980
+ });
1952
1981
  const entityPromises = documentIds.map(
1953
1982
  (documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
1954
1983
  );
@@ -2299,32 +2328,37 @@ const sanitizeMainField = (model, mainField, userAbility) => {
2299
2328
  userAbility,
2300
2329
  model: model.uid
2301
2330
  });
2302
- if (!isListable(model, mainField)) {
2331
+ const isMainFieldListable = isListable(model, mainField);
2332
+ const canReadMainField = permissionChecker2.can.read(null, mainField);
2333
+ if (!isMainFieldListable || !canReadMainField) {
2303
2334
  return "id";
2304
2335
  }
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";
2336
+ if (model.uid === "plugin::users-permissions.role") {
2337
+ return "name";
2316
2338
  }
2317
2339
  return mainField;
2318
2340
  };
2319
- const addStatusToRelations = async (uid2, relations2) => {
2320
- if (!contentTypes$1.hasDraftAndPublish(strapi.contentTypes[uid2])) {
2341
+ const addStatusToRelations = async (targetUid, relations2) => {
2342
+ if (!contentTypes$1.hasDraftAndPublish(strapi.getModel(targetUid))) {
2321
2343
  return relations2;
2322
2344
  }
2323
2345
  const documentMetadata2 = getService$1("document-metadata");
2324
- const documentsAvailableStatus = await documentMetadata2.getManyAvailableStatus(uid2, relations2);
2346
+ if (!relations2.length) {
2347
+ return relations2;
2348
+ }
2349
+ const firstRelation = relations2[0];
2350
+ const filters = {
2351
+ documentId: { $in: relations2.map((r) => r.documentId) },
2352
+ // NOTE: find the "opposite" status
2353
+ publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
2354
+ };
2355
+ const availableStatus = await strapi.query(targetUid).findMany({
2356
+ select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
2357
+ filters
2358
+ });
2325
2359
  return relations2.map((relation) => {
2326
- const availableStatuses = documentsAvailableStatus.filter(
2327
- (availableDocument) => availableDocument.documentId === relation.documentId
2360
+ const availableStatuses = availableStatus.filter(
2361
+ (availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
2328
2362
  );
2329
2363
  return {
2330
2364
  ...relation,
@@ -2345,11 +2379,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
2345
2379
  const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
2346
2380
  const isSourceLocalized = isLocalized(sourceModel);
2347
2381
  const isTargetLocalized = isLocalized(targetModel);
2348
- let validatedLocale = locale;
2349
- if (!targetModel || !isTargetLocalized)
2350
- validatedLocale = void 0;
2351
2382
  return {
2352
- locale: validatedLocale,
2383
+ locale,
2353
2384
  isSourceLocalized,
2354
2385
  isTargetLocalized
2355
2386
  };
@@ -2452,7 +2483,7 @@ const relations = {
2452
2483
  attribute,
2453
2484
  fieldsToSelect,
2454
2485
  mainField,
2455
- source: { schema: sourceSchema },
2486
+ source: { schema: sourceSchema, isLocalized: isSourceLocalized },
2456
2487
  target: { schema: targetSchema, isLocalized: isTargetLocalized },
2457
2488
  sourceSchema,
2458
2489
  targetSchema,
@@ -2474,7 +2505,8 @@ const relations = {
2474
2505
  fieldsToSelect,
2475
2506
  mainField,
2476
2507
  source: {
2477
- schema: { uid: sourceUid, modelType: sourceModelType }
2508
+ schema: { uid: sourceUid, modelType: sourceModelType },
2509
+ isLocalized: isSourceLocalized
2478
2510
  },
2479
2511
  target: {
2480
2512
  schema: { uid: targetUid },
@@ -2512,12 +2544,16 @@ const relations = {
2512
2544
  } else {
2513
2545
  where.id = id;
2514
2546
  }
2515
- if (status) {
2516
- where[`${alias}.published_at`] = getPublishedAtClause(status, targetUid);
2547
+ const publishedAt = getPublishedAtClause(status, targetUid);
2548
+ if (!isEmpty(publishedAt)) {
2549
+ where[`${alias}.published_at`] = publishedAt;
2517
2550
  }
2518
- if (filterByLocale) {
2551
+ if (isTargetLocalized && locale) {
2519
2552
  where[`${alias}.locale`] = locale;
2520
2553
  }
2554
+ if (isSourceLocalized && locale) {
2555
+ where.locale = locale;
2556
+ }
2521
2557
  if ((idsToInclude?.length ?? 0) !== 0) {
2522
2558
  where[`${alias}.id`].$notIn = idsToInclude;
2523
2559
  }
@@ -2535,7 +2571,8 @@ const relations = {
2535
2571
  id: { $notIn: uniq(idsToOmit) }
2536
2572
  });
2537
2573
  }
2538
- const res = await strapi.db.query(targetUid).findPage(strapi.get("query-params").transform(targetUid, queryParams));
2574
+ const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
2575
+ const res = await strapi.db.query(targetUid).findPage(dbQuery);
2539
2576
  ctx.body = {
2540
2577
  ...res,
2541
2578
  results: await addStatusToRelations(targetUid, res.results)
@@ -2550,29 +2587,39 @@ const relations = {
2550
2587
  attribute,
2551
2588
  targetField,
2552
2589
  fieldsToSelect,
2553
- source: {
2554
- schema: { uid: sourceUid }
2555
- },
2556
- target: {
2557
- schema: { uid: targetUid }
2558
- }
2590
+ status,
2591
+ source: { schema: sourceSchema },
2592
+ target: { schema: targetSchema }
2559
2593
  } = await this.extractAndValidateRequestInfo(ctx, id);
2594
+ const { uid: sourceUid } = sourceSchema;
2595
+ const { uid: targetUid } = targetSchema;
2560
2596
  const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2561
2597
  const dbQuery = strapi.db.query(sourceUid);
2562
2598
  const loadRelations = relations$1.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
2599
+ const filters = {};
2600
+ if (sourceSchema?.options?.draftAndPublish) {
2601
+ if (targetSchema?.options?.draftAndPublish) {
2602
+ if (status === "published") {
2603
+ filters.publishedAt = { $notNull: true };
2604
+ } else {
2605
+ filters.publishedAt = { $null: true };
2606
+ }
2607
+ }
2608
+ } else if (targetSchema?.options?.draftAndPublish) {
2609
+ filters.publishedAt = { $null: true };
2610
+ }
2563
2611
  const res = await loadRelations({ id: entryId }, targetField, {
2564
- select: ["id", "documentId", "locale", "publishedAt"],
2612
+ select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
2565
2613
  ordering: "desc",
2566
2614
  page: ctx.request.query.page,
2567
- pageSize: ctx.request.query.pageSize
2615
+ pageSize: ctx.request.query.pageSize,
2616
+ filters
2568
2617
  });
2569
2618
  const loadedIds = res.results.map((item) => item.id);
2570
2619
  addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
2571
2620
  const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
2572
2621
  ...strapi.get("query-params").transform(targetUid, permissionQuery),
2573
- ordering: "desc",
2574
- page: ctx.request.query.page,
2575
- pageSize: ctx.request.query.pageSize
2622
+ ordering: "desc"
2576
2623
  });
2577
2624
  const relationsUnion = uniqBy("id", concat(sanitizedRes.results, res.results));
2578
2625
  ctx.body = {
@@ -2659,7 +2706,7 @@ const singleTypes = {
2659
2706
  permissionChecker2,
2660
2707
  model,
2661
2708
  // @ts-expect-error - fix types
2662
- { id: document.documentId, locale, publishedAt: null },
2709
+ { documentId: document.documentId, locale, publishedAt: null },
2663
2710
  { availableLocales: true, availableStatus: false }
2664
2711
  );
2665
2712
  ctx.body = { data: {}, meta };
@@ -3478,12 +3525,27 @@ const createPermissionChecker = (strapi2) => ({ userAbility, model }) => {
3478
3525
  ability: userAbility,
3479
3526
  model
3480
3527
  });
3481
- const toSubject = (entity) => entity ? permissionsManager.toSubject(entity, model) : model;
3528
+ const { actionProvider } = strapi2.service("admin::permission");
3529
+ const toSubject = (entity) => {
3530
+ return entity ? permissionsManager.toSubject(entity, model) : model;
3531
+ };
3482
3532
  const can = (action, entity, field) => {
3483
- return userAbility.can(action, toSubject(entity), field);
3533
+ const subject = toSubject(entity);
3534
+ const aliases = actionProvider.unstable_aliases(action, model);
3535
+ return (
3536
+ // Test the original action to see if it passes
3537
+ userAbility.can(action, subject, field) || // Else try every known alias if at least one of them succeed, then the user "can"
3538
+ aliases.some((alias) => userAbility.can(alias, subject, field))
3539
+ );
3484
3540
  };
3485
3541
  const cannot = (action, entity, field) => {
3486
- return userAbility.cannot(action, toSubject(entity), field);
3542
+ const subject = toSubject(entity);
3543
+ const aliases = actionProvider.unstable_aliases(action, model);
3544
+ return (
3545
+ // Test both the original action
3546
+ userAbility.cannot(action, subject, field) && // and every known alias, if all of them fail (cannot), then the user truly "cannot"
3547
+ aliases.every((alias) => userAbility.cannot(alias, subject, field))
3548
+ );
3487
3549
  };
3488
3550
  const sanitizeOutput = (data, { action = ACTIONS.read } = {}) => {
3489
3551
  return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });
@@ -4015,7 +4077,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4015
4077
  */
4016
4078
  async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4017
4079
  const versionsByLocale = groupBy("locale", allVersions);
4018
- delete versionsByLocale[version.locale];
4080
+ if (version.locale) {
4081
+ delete versionsByLocale[version.locale];
4082
+ }
4019
4083
  const model = strapi2.getModel(uid2);
4020
4084
  const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4021
4085
  const traversalFunction = async (localeVersion) => traverseEntity(