@strapi/content-manager 0.0.0-experimental.fb442e5e12dd3f611303691bf85a249520ba348b → 0.0.0-experimental.fd379e4937e431407d784eaa5fe7f93cf2a53386

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 (153) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-B3yDbeU1.mjs → ComponentConfigurationPage-CIjXcRAB.mjs} +4 -4
  2. package/dist/_chunks/{ComponentConfigurationPage-B3yDbeU1.mjs.map → ComponentConfigurationPage-CIjXcRAB.mjs.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-KXSuLnQD.js → ComponentConfigurationPage-gsCd80MU.js} +4 -4
  4. package/dist/_chunks/{ComponentConfigurationPage-KXSuLnQD.js.map → ComponentConfigurationPage-gsCd80MU.js.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-D7PrLO8j.mjs → EditConfigurationPage-BglmD_BF.mjs} +4 -4
  6. package/dist/_chunks/{EditConfigurationPage-D7PrLO8j.mjs.map → EditConfigurationPage-BglmD_BF.mjs.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-BQ17--5R.js → EditConfigurationPage-DHDQKBzw.js} +4 -4
  8. package/dist/_chunks/{EditConfigurationPage-BQ17--5R.js.map → EditConfigurationPage-DHDQKBzw.js.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-BgjdnGz2.js → EditViewPage-C4iTxUPU.js} +15 -5
  10. package/dist/_chunks/EditViewPage-C4iTxUPU.js.map +1 -0
  11. package/dist/_chunks/{EditViewPage-B7VgwJaG.mjs → EditViewPage-CiwVPMaK.mjs} +15 -5
  12. package/dist/_chunks/EditViewPage-CiwVPMaK.mjs.map +1 -0
  13. package/dist/_chunks/{Field-tHCw4lGA.mjs → Field-DIjL1b5d.mjs} +98 -85
  14. package/dist/_chunks/Field-DIjL1b5d.mjs.map +1 -0
  15. package/dist/_chunks/{Field-CdK7ZLmv.js → Field-DhXEK8y1.js} +101 -88
  16. package/dist/_chunks/Field-DhXEK8y1.js.map +1 -0
  17. package/dist/_chunks/{Form-BJxdTv3Q.mjs → Form-CmNesrvR.mjs} +16 -8
  18. package/dist/_chunks/Form-CmNesrvR.mjs.map +1 -0
  19. package/dist/_chunks/{Form-C_0KTVvV.js → Form-CwmJ4sWe.js} +16 -8
  20. package/dist/_chunks/Form-CwmJ4sWe.js.map +1 -0
  21. package/dist/_chunks/{History-nuEzM5qm.js → History-BLCCNgCt.js} +24 -11
  22. package/dist/_chunks/History-BLCCNgCt.js.map +1 -0
  23. package/dist/_chunks/{History-DR2txJLE.mjs → History-D-99Wh30.mjs} +25 -12
  24. package/dist/_chunks/History-D-99Wh30.mjs.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-CnB86Psm.js → ListConfigurationPage-DxWpeZrO.js} +3 -3
  26. package/dist/_chunks/{ListConfigurationPage-CnB86Psm.js.map → ListConfigurationPage-DxWpeZrO.js.map} +1 -1
  27. package/dist/_chunks/{ListConfigurationPage-voFVtXu6.mjs → ListConfigurationPage-JPWZz7Kg.mjs} +3 -3
  28. package/dist/_chunks/{ListConfigurationPage-voFVtXu6.mjs.map → ListConfigurationPage-JPWZz7Kg.mjs.map} +1 -1
  29. package/dist/_chunks/{ListViewPage-SXIXm-RM.js → ListViewPage-CIQekSFz.js} +55 -40
  30. package/dist/_chunks/ListViewPage-CIQekSFz.js.map +1 -0
  31. package/dist/_chunks/{ListViewPage-B_GaWgRH.mjs → ListViewPage-DSK3f0ST.mjs} +52 -37
  32. package/dist/_chunks/ListViewPage-DSK3f0ST.mjs.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-BzsQ3hLZ.js → NoContentTypePage-C5cxKvC2.js} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-BzsQ3hLZ.js.map → NoContentTypePage-C5cxKvC2.js.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-CYiGpsbj.mjs → NoContentTypePage-D99LU1YP.mjs} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-CYiGpsbj.mjs.map → NoContentTypePage-D99LU1YP.mjs.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-B5baIHal.mjs → NoPermissionsPage-DBrBw-0y.mjs} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-B5baIHal.mjs.map → NoPermissionsPage-DBrBw-0y.mjs.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-IGkId4C5.js → NoPermissionsPage-Oy4tmUrW.js} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-IGkId4C5.js.map → NoPermissionsPage-Oy4tmUrW.js.map} +1 -1
  41. package/dist/_chunks/{Relations-CIYDdKU-.mjs → Relations-BBmhcWFV.mjs} +69 -36
  42. package/dist/_chunks/Relations-BBmhcWFV.mjs.map +1 -0
  43. package/dist/_chunks/{Relations-Dhuurpx2.js → Relations-eG-9p_qS.js} +68 -35
  44. package/dist/_chunks/Relations-eG-9p_qS.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-BIWDoFLK.js} +2051 -1896
  50. package/dist/_chunks/index-BIWDoFLK.js.map +1 -0
  51. package/dist/_chunks/{index-C9TJPyni.mjs → index-BrUzbQ30.mjs} +2070 -1916
  52. package/dist/_chunks/index-BrUzbQ30.mjs.map +1 -0
  53. package/dist/_chunks/{layout-BNqvLR_b.mjs → layout-_5-cXs34.mjs} +5 -4
  54. package/dist/_chunks/{layout-BNqvLR_b.mjs.map → layout-_5-cXs34.mjs.map} +1 -1
  55. package/dist/_chunks/{layout-C6dxWYT7.js → layout-lMc9i1-Z.js} +5 -4
  56. package/dist/_chunks/{layout-C6dxWYT7.js.map → layout-lMc9i1-Z.js.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-BRHithi8.js} +3 -7
  62. package/dist/_chunks/relations-BRHithi8.js.map +1 -0
  63. package/dist/_chunks/{relations-CkKqKw65.mjs → relations-B_VLk-DD.mjs} +3 -7
  64. package/dist/_chunks/relations-B_VLk-DD.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 +191 -67
  88. package/dist/server/index.js.map +1 -1
  89. package/dist/server/index.mjs +191 -67
  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/index.d.ts.map +1 -1
  94. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  95. package/dist/server/src/controllers/utils/metadata.d.ts +15 -1
  96. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  97. package/dist/server/src/history/services/history.d.ts.map +1 -1
  98. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  99. package/dist/server/src/history/services/utils.d.ts +1 -0
  100. package/dist/server/src/history/services/utils.d.ts.map +1 -1
  101. package/dist/server/src/index.d.ts +4 -4
  102. package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
  103. package/dist/server/src/preview/constants.d.ts +2 -0
  104. package/dist/server/src/preview/constants.d.ts.map +1 -0
  105. package/dist/server/src/preview/controllers/index.d.ts +2 -0
  106. package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
  107. package/dist/server/src/preview/controllers/preview.d.ts +9 -0
  108. package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
  109. package/dist/server/src/preview/index.d.ts +4 -0
  110. package/dist/server/src/preview/index.d.ts.map +1 -0
  111. package/dist/server/src/preview/routes/index.d.ts +8 -0
  112. package/dist/server/src/preview/routes/index.d.ts.map +1 -0
  113. package/dist/server/src/preview/routes/preview.d.ts +4 -0
  114. package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
  115. package/dist/server/src/preview/services/index.d.ts +4 -0
  116. package/dist/server/src/preview/services/index.d.ts.map +1 -0
  117. package/dist/server/src/preview/services/preview.d.ts +6 -0
  118. package/dist/server/src/preview/services/preview.d.ts.map +1 -0
  119. package/dist/server/src/preview/utils.d.ts +7 -0
  120. package/dist/server/src/preview/utils.d.ts.map +1 -0
  121. package/dist/server/src/routes/index.d.ts.map +1 -1
  122. package/dist/server/src/services/document-metadata.d.ts +8 -8
  123. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  124. package/dist/server/src/services/index.d.ts +4 -4
  125. package/dist/server/src/services/index.d.ts.map +1 -1
  126. package/dist/server/src/services/permission-checker.d.ts.map +1 -1
  127. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  128. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  129. package/dist/server/src/utils/index.d.ts +2 -0
  130. package/dist/server/src/utils/index.d.ts.map +1 -1
  131. package/dist/shared/contracts/collection-types.d.ts +3 -1
  132. package/dist/shared/contracts/collection-types.d.ts.map +1 -1
  133. package/package.json +12 -12
  134. package/dist/_chunks/EditViewPage-B7VgwJaG.mjs.map +0 -1
  135. package/dist/_chunks/EditViewPage-BgjdnGz2.js.map +0 -1
  136. package/dist/_chunks/Field-CdK7ZLmv.js.map +0 -1
  137. package/dist/_chunks/Field-tHCw4lGA.mjs.map +0 -1
  138. package/dist/_chunks/Form-BJxdTv3Q.mjs.map +0 -1
  139. package/dist/_chunks/Form-C_0KTVvV.js.map +0 -1
  140. package/dist/_chunks/History-DR2txJLE.mjs.map +0 -1
  141. package/dist/_chunks/History-nuEzM5qm.js.map +0 -1
  142. package/dist/_chunks/ListViewPage-B_GaWgRH.mjs.map +0 -1
  143. package/dist/_chunks/ListViewPage-SXIXm-RM.js.map +0 -1
  144. package/dist/_chunks/Relations-CIYDdKU-.mjs.map +0 -1
  145. package/dist/_chunks/Relations-Dhuurpx2.js.map +0 -1
  146. package/dist/_chunks/index-C9TJPyni.mjs.map +0 -1
  147. package/dist/_chunks/index-CdT0kHZ8.js.map +0 -1
  148. package/dist/_chunks/relations-CkKqKw65.mjs.map +0 -1
  149. package/dist/_chunks/relations-DtFaDnP1.js.map +0 -1
  150. package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
  151. package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
  152. package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
  153. package/strapi-server.js +0 -3
@@ -95,7 +95,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
95
95
  }
96
96
  };
97
97
  };
98
- const controllers$1 = {
98
+ const controllers$2 = {
99
99
  "history-version": createHistoryVersionController
100
100
  /**
101
101
  * Casting is needed because the types aren't aware that Strapi supports
@@ -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,
@@ -578,17 +594,17 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
578
594
  }
579
595
  };
580
596
  };
581
- const services$1 = {
597
+ const services$2 = {
582
598
  history: createHistoryService,
583
599
  lifecycles: createLifecyclesService
584
600
  };
585
- const info = { pluginName: "content-manager", type: "admin" };
601
+ const info$1 = { pluginName: "content-manager", type: "admin" };
586
602
  const historyVersionRouter = {
587
603
  type: "admin",
588
604
  routes: [
589
605
  {
590
606
  method: "GET",
591
- info,
607
+ info: info$1,
592
608
  path: "/history-versions",
593
609
  handler: "history-version.findMany",
594
610
  config: {
@@ -597,7 +613,7 @@ const historyVersionRouter = {
597
613
  },
598
614
  {
599
615
  method: "PUT",
600
- info,
616
+ info: info$1,
601
617
  path: "/history-versions/:versionId/restore",
602
618
  handler: "history-version.restoreVersion",
603
619
  config: {
@@ -606,7 +622,7 @@ const historyVersionRouter = {
606
622
  }
607
623
  ]
608
624
  };
609
- const routes$1 = {
625
+ const routes$2 = {
610
626
  "history-version": historyVersionRouter
611
627
  };
612
628
  const historyVersion = {
@@ -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 }) {
@@ -665,9 +681,9 @@ const getFeature = () => {
665
681
  destroy({ strapi: strapi2 }) {
666
682
  getService(strapi2, "lifecycles").destroy();
667
683
  },
668
- controllers: controllers$1,
669
- services: services$1,
670
- routes: routes$1
684
+ controllers: controllers$2,
685
+ services: services$2,
686
+ routes: routes$2
671
687
  };
672
688
  }
673
689
  return {
@@ -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,62 @@ 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 info = { pluginName: "content-manager", type: "admin" };
705
+ const previewRouter = {
706
+ type: "admin",
707
+ routes: [
708
+ {
709
+ method: "GET",
710
+ info,
711
+ path: "/preview/url/:contentType",
712
+ handler: "preview.getPreviewURL",
713
+ config: {
714
+ policies: ["admin::isAuthenticatedAdmin"]
715
+ }
716
+ }
717
+ ]
718
+ };
719
+ const routes$1 = {
720
+ preview: previewRouter
721
+ };
722
+ const createPreviewController = () => {
723
+ return {
724
+ async getPreviewURL(ctx) {
725
+ ctx.request;
726
+ return {
727
+ data: { url: "" }
728
+ };
729
+ }
730
+ };
731
+ };
732
+ const controllers$1 = {
733
+ preview: createPreviewController
734
+ /**
735
+ * Casting is needed because the types aren't aware that Strapi supports
736
+ * passing a controller factory as the value, instead of a controller object directly
737
+ */
738
+ };
739
+ const createPreviewService = () => {
740
+ };
741
+ const services$1 = {
742
+ preview: createPreviewService
743
+ };
744
+ const getFeature = () => {
745
+ if (!strapi.features.future.isEnabled(FEATURE_ID)) {
746
+ return {};
747
+ }
748
+ return {
749
+ bootstrap() {
750
+ console.log("Bootstrapping preview server");
751
+ strapi.config.get("admin.preview");
752
+ },
753
+ routes: routes$1,
754
+ controllers: controllers$1,
755
+ services: services$1
756
+ };
757
+ };
758
+ const preview = getFeature();
687
759
  const bootstrap = async () => {
688
760
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
689
761
  strapi.get("webhookStore").addAllowedEvent(key, value);
@@ -693,6 +765,7 @@ const bootstrap = async () => {
693
765
  await getService$1("content-types").syncConfigurations();
694
766
  await getService$1("permission").registerPermissions();
695
767
  await history.bootstrap?.({ strapi });
768
+ await preview.bootstrap?.({ strapi });
696
769
  };
697
770
  const destroy = async ({ strapi: strapi2 }) => {
698
771
  await history.destroy?.({ strapi: strapi2 });
@@ -1182,7 +1255,8 @@ const admin = {
1182
1255
  };
1183
1256
  const routes = {
1184
1257
  admin,
1185
- ...history.routes ? history.routes : {}
1258
+ ...history.routes ? history.routes : {},
1259
+ ...preview.routes ? preview.routes : {}
1186
1260
  };
1187
1261
  const hasPermissionsSchema = yup$1.object({
1188
1262
  actions: yup$1.array().of(yup$1.string()),
@@ -1193,6 +1267,11 @@ const { createPolicy } = policy;
1193
1267
  const hasPermissions = createPolicy({
1194
1268
  name: "plugin::content-manager.hasPermissions",
1195
1269
  validator: validateHasPermissionsInput,
1270
+ /**
1271
+ * NOTE: Action aliases are currently not checked at this level (policy).
1272
+ * This is currently the intended behavior to avoid changing the behavior of API related permissions.
1273
+ * If you want to add support for it, please create a dedicated RFC with a list of potential side effect this could have.
1274
+ */
1196
1275
  handler(ctx, config = {}) {
1197
1276
  const { actions = [], hasAtLeastOne = false } = config;
1198
1277
  const { userAbility } = ctx.state;
@@ -1673,7 +1752,7 @@ const updateDocument = async (ctx, opts) => {
1673
1752
  throw new errors.ForbiddenError();
1674
1753
  }
1675
1754
  const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
1676
- const setCreator = setCreatorFields({ user, isEdition: true });
1755
+ const setCreator = documentVersion ? setCreatorFields({ user, isEdition: true }) : setCreatorFields({ user });
1677
1756
  const sanitizeFn = async.pipe(pickPermittedFields, setCreator);
1678
1757
  const sanitizedBody = await sanitizeFn(body);
1679
1758
  return documentManager2.update(documentVersion?.documentId || id, model, {
@@ -1745,7 +1824,7 @@ const collectionTypes = {
1745
1824
  permissionChecker2,
1746
1825
  model,
1747
1826
  // @ts-expect-error TODO: fix
1748
- { id, locale, publishedAt: null },
1827
+ { documentId: id, locale, publishedAt: null },
1749
1828
  { availableLocales: true, availableStatus: false }
1750
1829
  );
1751
1830
  ctx.body = { data: {}, meta };
@@ -1882,11 +1961,17 @@ const collectionTypes = {
1882
1961
  }
1883
1962
  const isUpdate = !isCreate;
1884
1963
  if (isUpdate) {
1885
- document = await documentManager2.findOne(id, model, { populate, locale });
1886
- if (!document) {
1964
+ const documentExists = documentManager2.exists(model, id);
1965
+ if (!documentExists) {
1887
1966
  throw new errors.NotFoundError("Document not found");
1888
1967
  }
1889
- if (permissionChecker2.can.update(document)) {
1968
+ document = await documentManager2.findOne(id, model, { populate, locale });
1969
+ if (!document) {
1970
+ if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
1971
+ throw new errors.ForbiddenError();
1972
+ }
1973
+ document = await updateDocument(ctx);
1974
+ } else if (permissionChecker2.can.update(document)) {
1890
1975
  await updateDocument(ctx);
1891
1976
  }
1892
1977
  }
@@ -1948,7 +2033,9 @@ const collectionTypes = {
1948
2033
  if (permissionChecker2.cannot.unpublish()) {
1949
2034
  return ctx.forbidden();
1950
2035
  }
1951
- const { locale } = await getDocumentLocaleAndStatus(body, model);
2036
+ const { locale } = await getDocumentLocaleAndStatus(body, model, {
2037
+ allowMultipleLocales: true
2038
+ });
1952
2039
  const entityPromises = documentIds.map(
1953
2040
  (documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
1954
2041
  );
@@ -2299,32 +2386,37 @@ const sanitizeMainField = (model, mainField, userAbility) => {
2299
2386
  userAbility,
2300
2387
  model: model.uid
2301
2388
  });
2302
- if (!isListable(model, mainField)) {
2389
+ const isMainFieldListable = isListable(model, mainField);
2390
+ const canReadMainField = permissionChecker2.can.read(null, mainField);
2391
+ if (!isMainFieldListable || !canReadMainField) {
2303
2392
  return "id";
2304
2393
  }
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";
2394
+ if (model.uid === "plugin::users-permissions.role") {
2395
+ return "name";
2316
2396
  }
2317
2397
  return mainField;
2318
2398
  };
2319
- const addStatusToRelations = async (uid2, relations2) => {
2320
- if (!contentTypes$1.hasDraftAndPublish(strapi.contentTypes[uid2])) {
2399
+ const addStatusToRelations = async (targetUid, relations2) => {
2400
+ if (!contentTypes$1.hasDraftAndPublish(strapi.getModel(targetUid))) {
2321
2401
  return relations2;
2322
2402
  }
2323
2403
  const documentMetadata2 = getService$1("document-metadata");
2324
- const documentsAvailableStatus = await documentMetadata2.getManyAvailableStatus(uid2, relations2);
2404
+ if (!relations2.length) {
2405
+ return relations2;
2406
+ }
2407
+ const firstRelation = relations2[0];
2408
+ const filters = {
2409
+ documentId: { $in: relations2.map((r) => r.documentId) },
2410
+ // NOTE: find the "opposite" status
2411
+ publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
2412
+ };
2413
+ const availableStatus = await strapi.query(targetUid).findMany({
2414
+ select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
2415
+ filters
2416
+ });
2325
2417
  return relations2.map((relation) => {
2326
- const availableStatuses = documentsAvailableStatus.filter(
2327
- (availableDocument) => availableDocument.documentId === relation.documentId
2418
+ const availableStatuses = availableStatus.filter(
2419
+ (availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
2328
2420
  );
2329
2421
  return {
2330
2422
  ...relation,
@@ -2345,11 +2437,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
2345
2437
  const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
2346
2438
  const isSourceLocalized = isLocalized(sourceModel);
2347
2439
  const isTargetLocalized = isLocalized(targetModel);
2348
- let validatedLocale = locale;
2349
- if (!targetModel || !isTargetLocalized)
2350
- validatedLocale = void 0;
2351
2440
  return {
2352
- locale: validatedLocale,
2441
+ locale,
2353
2442
  isSourceLocalized,
2354
2443
  isTargetLocalized
2355
2444
  };
@@ -2452,7 +2541,7 @@ const relations = {
2452
2541
  attribute,
2453
2542
  fieldsToSelect,
2454
2543
  mainField,
2455
- source: { schema: sourceSchema },
2544
+ source: { schema: sourceSchema, isLocalized: isSourceLocalized },
2456
2545
  target: { schema: targetSchema, isLocalized: isTargetLocalized },
2457
2546
  sourceSchema,
2458
2547
  targetSchema,
@@ -2474,7 +2563,8 @@ const relations = {
2474
2563
  fieldsToSelect,
2475
2564
  mainField,
2476
2565
  source: {
2477
- schema: { uid: sourceUid, modelType: sourceModelType }
2566
+ schema: { uid: sourceUid, modelType: sourceModelType },
2567
+ isLocalized: isSourceLocalized
2478
2568
  },
2479
2569
  target: {
2480
2570
  schema: { uid: targetUid },
@@ -2512,12 +2602,16 @@ const relations = {
2512
2602
  } else {
2513
2603
  where.id = id;
2514
2604
  }
2515
- if (status) {
2516
- where[`${alias}.published_at`] = getPublishedAtClause(status, targetUid);
2605
+ const publishedAt = getPublishedAtClause(status, targetUid);
2606
+ if (!isEmpty(publishedAt)) {
2607
+ where[`${alias}.published_at`] = publishedAt;
2517
2608
  }
2518
- if (filterByLocale) {
2609
+ if (isTargetLocalized && locale) {
2519
2610
  where[`${alias}.locale`] = locale;
2520
2611
  }
2612
+ if (isSourceLocalized && locale) {
2613
+ where.locale = locale;
2614
+ }
2521
2615
  if ((idsToInclude?.length ?? 0) !== 0) {
2522
2616
  where[`${alias}.id`].$notIn = idsToInclude;
2523
2617
  }
@@ -2535,7 +2629,8 @@ const relations = {
2535
2629
  id: { $notIn: uniq(idsToOmit) }
2536
2630
  });
2537
2631
  }
2538
- const res = await strapi.db.query(targetUid).findPage(strapi.get("query-params").transform(targetUid, queryParams));
2632
+ const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
2633
+ const res = await strapi.db.query(targetUid).findPage(dbQuery);
2539
2634
  ctx.body = {
2540
2635
  ...res,
2541
2636
  results: await addStatusToRelations(targetUid, res.results)
@@ -2550,29 +2645,39 @@ const relations = {
2550
2645
  attribute,
2551
2646
  targetField,
2552
2647
  fieldsToSelect,
2553
- source: {
2554
- schema: { uid: sourceUid }
2555
- },
2556
- target: {
2557
- schema: { uid: targetUid }
2558
- }
2648
+ status,
2649
+ source: { schema: sourceSchema },
2650
+ target: { schema: targetSchema }
2559
2651
  } = await this.extractAndValidateRequestInfo(ctx, id);
2652
+ const { uid: sourceUid } = sourceSchema;
2653
+ const { uid: targetUid } = targetSchema;
2560
2654
  const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2561
2655
  const dbQuery = strapi.db.query(sourceUid);
2562
2656
  const loadRelations = relations$1.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
2657
+ const filters = {};
2658
+ if (sourceSchema?.options?.draftAndPublish) {
2659
+ if (targetSchema?.options?.draftAndPublish) {
2660
+ if (status === "published") {
2661
+ filters.publishedAt = { $notNull: true };
2662
+ } else {
2663
+ filters.publishedAt = { $null: true };
2664
+ }
2665
+ }
2666
+ } else if (targetSchema?.options?.draftAndPublish) {
2667
+ filters.publishedAt = { $null: true };
2668
+ }
2563
2669
  const res = await loadRelations({ id: entryId }, targetField, {
2564
- select: ["id", "documentId", "locale", "publishedAt"],
2670
+ select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
2565
2671
  ordering: "desc",
2566
2672
  page: ctx.request.query.page,
2567
- pageSize: ctx.request.query.pageSize
2673
+ pageSize: ctx.request.query.pageSize,
2674
+ filters
2568
2675
  });
2569
2676
  const loadedIds = res.results.map((item) => item.id);
2570
2677
  addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
2571
2678
  const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
2572
2679
  ...strapi.get("query-params").transform(targetUid, permissionQuery),
2573
- ordering: "desc",
2574
- page: ctx.request.query.page,
2575
- pageSize: ctx.request.query.pageSize
2680
+ ordering: "desc"
2576
2681
  });
2577
2682
  const relationsUnion = uniqBy("id", concat(sanitizedRes.results, res.results));
2578
2683
  ctx.body = {
@@ -2659,7 +2764,7 @@ const singleTypes = {
2659
2764
  permissionChecker2,
2660
2765
  model,
2661
2766
  // @ts-expect-error - fix types
2662
- { id: document.documentId, locale, publishedAt: null },
2767
+ { documentId: document.documentId, locale, publishedAt: null },
2663
2768
  { availableLocales: true, availableStatus: false }
2664
2769
  );
2665
2770
  ctx.body = { data: {}, meta };
@@ -2858,7 +2963,8 @@ const controllers = {
2858
2963
  relations,
2859
2964
  "single-types": singleTypes,
2860
2965
  uid: uid$1,
2861
- ...history.controllers ? history.controllers : {}
2966
+ ...history.controllers ? history.controllers : {},
2967
+ ...preview.controllers ? preview.controllers : {}
2862
2968
  };
2863
2969
  const keys = {
2864
2970
  CONFIGURATION: "configuration"
@@ -3478,12 +3584,27 @@ const createPermissionChecker = (strapi2) => ({ userAbility, model }) => {
3478
3584
  ability: userAbility,
3479
3585
  model
3480
3586
  });
3481
- const toSubject = (entity) => entity ? permissionsManager.toSubject(entity, model) : model;
3587
+ const { actionProvider } = strapi2.service("admin::permission");
3588
+ const toSubject = (entity) => {
3589
+ return entity ? permissionsManager.toSubject(entity, model) : model;
3590
+ };
3482
3591
  const can = (action, entity, field) => {
3483
- return userAbility.can(action, toSubject(entity), field);
3592
+ const subject = toSubject(entity);
3593
+ const aliases = actionProvider.unstable_aliases(action, model);
3594
+ return (
3595
+ // Test the original action to see if it passes
3596
+ userAbility.can(action, subject, field) || // Else try every known alias if at least one of them succeed, then the user "can"
3597
+ aliases.some((alias) => userAbility.can(alias, subject, field))
3598
+ );
3484
3599
  };
3485
3600
  const cannot = (action, entity, field) => {
3486
- return userAbility.cannot(action, toSubject(entity), field);
3601
+ const subject = toSubject(entity);
3602
+ const aliases = actionProvider.unstable_aliases(action, model);
3603
+ return (
3604
+ // Test both the original action
3605
+ userAbility.cannot(action, subject, field) && // and every known alias, if all of them fail (cannot), then the user truly "cannot"
3606
+ aliases.every((alias) => userAbility.cannot(alias, subject, field))
3607
+ );
3487
3608
  };
3488
3609
  const sanitizeOutput = (data, { action = ACTIONS.read } = {}) => {
3489
3610
  return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });
@@ -4015,7 +4136,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4015
4136
  */
4016
4137
  async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4017
4138
  const versionsByLocale = groupBy("locale", allVersions);
4018
- delete versionsByLocale[version.locale];
4139
+ if (version.locale) {
4140
+ delete versionsByLocale[version.locale];
4141
+ }
4019
4142
  const model = strapi2.getModel(uid2);
4020
4143
  const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4021
4144
  const traversalFunction = async (localeVersion) => traverseEntity(
@@ -4371,7 +4494,8 @@ const services = {
4371
4494
  permission,
4372
4495
  "populate-builder": populateBuilder$1,
4373
4496
  uid,
4374
- ...history.services ? history.services : {}
4497
+ ...history.services ? history.services : {},
4498
+ ...preview.services ? preview.services : {}
4375
4499
  };
4376
4500
  const index = () => {
4377
4501
  return {