@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
@@ -121,7 +121,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
121
121
  }
122
122
  };
123
123
  };
124
- const controllers$1 = {
124
+ const controllers$2 = {
125
125
  "history-version": createHistoryVersionController
126
126
  /**
127
127
  * Casting is needed because the types aren't aware that Strapi supports
@@ -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,
@@ -604,17 +620,17 @@ const createLifecyclesService = ({ strapi: strapi2 }) => {
604
620
  }
605
621
  };
606
622
  };
607
- const services$1 = {
623
+ const services$2 = {
608
624
  history: createHistoryService,
609
625
  lifecycles: createLifecyclesService
610
626
  };
611
- const info = { pluginName: "content-manager", type: "admin" };
627
+ const info$1 = { pluginName: "content-manager", type: "admin" };
612
628
  const historyVersionRouter = {
613
629
  type: "admin",
614
630
  routes: [
615
631
  {
616
632
  method: "GET",
617
- info,
633
+ info: info$1,
618
634
  path: "/history-versions",
619
635
  handler: "history-version.findMany",
620
636
  config: {
@@ -623,7 +639,7 @@ const historyVersionRouter = {
623
639
  },
624
640
  {
625
641
  method: "PUT",
626
- info,
642
+ info: info$1,
627
643
  path: "/history-versions/:versionId/restore",
628
644
  handler: "history-version.restoreVersion",
629
645
  config: {
@@ -632,7 +648,7 @@ const historyVersionRouter = {
632
648
  }
633
649
  ]
634
650
  };
635
- const routes$1 = {
651
+ const routes$2 = {
636
652
  "history-version": historyVersionRouter
637
653
  };
638
654
  const historyVersion = {
@@ -679,7 +695,7 @@ const historyVersion = {
679
695
  }
680
696
  }
681
697
  };
682
- const getFeature = () => {
698
+ const getFeature$1 = () => {
683
699
  if (strapi.ee.features.isEnabled("cms-content-history")) {
684
700
  return {
685
701
  register({ strapi: strapi2 }) {
@@ -691,9 +707,9 @@ const getFeature = () => {
691
707
  destroy({ strapi: strapi2 }) {
692
708
  getService(strapi2, "lifecycles").destroy();
693
709
  },
694
- controllers: controllers$1,
695
- services: services$1,
696
- routes: routes$1
710
+ controllers: controllers$2,
711
+ services: services$2,
712
+ routes: routes$2
697
713
  };
698
714
  }
699
715
  return {
@@ -702,7 +718,7 @@ const getFeature = () => {
702
718
  }
703
719
  };
704
720
  };
705
- const history = getFeature();
721
+ const history = getFeature$1();
706
722
  const register = async ({ strapi: strapi2 }) => {
707
723
  await history.register?.({ strapi: strapi2 });
708
724
  };
@@ -710,6 +726,62 @@ const ALLOWED_WEBHOOK_EVENTS = {
710
726
  ENTRY_PUBLISH: "entry.publish",
711
727
  ENTRY_UNPUBLISH: "entry.unpublish"
712
728
  };
729
+ const FEATURE_ID = "preview";
730
+ const info = { pluginName: "content-manager", type: "admin" };
731
+ const previewRouter = {
732
+ type: "admin",
733
+ routes: [
734
+ {
735
+ method: "GET",
736
+ info,
737
+ path: "/preview/url/:contentType",
738
+ handler: "preview.getPreviewURL",
739
+ config: {
740
+ policies: ["admin::isAuthenticatedAdmin"]
741
+ }
742
+ }
743
+ ]
744
+ };
745
+ const routes$1 = {
746
+ preview: previewRouter
747
+ };
748
+ const createPreviewController = () => {
749
+ return {
750
+ async getPreviewURL(ctx) {
751
+ ctx.request;
752
+ return {
753
+ data: { url: "" }
754
+ };
755
+ }
756
+ };
757
+ };
758
+ const controllers$1 = {
759
+ preview: createPreviewController
760
+ /**
761
+ * Casting is needed because the types aren't aware that Strapi supports
762
+ * passing a controller factory as the value, instead of a controller object directly
763
+ */
764
+ };
765
+ const createPreviewService = () => {
766
+ };
767
+ const services$1 = {
768
+ preview: createPreviewService
769
+ };
770
+ const getFeature = () => {
771
+ if (!strapi.features.future.isEnabled(FEATURE_ID)) {
772
+ return {};
773
+ }
774
+ return {
775
+ bootstrap() {
776
+ console.log("Bootstrapping preview server");
777
+ strapi.config.get("admin.preview");
778
+ },
779
+ routes: routes$1,
780
+ controllers: controllers$1,
781
+ services: services$1
782
+ };
783
+ };
784
+ const preview = getFeature();
713
785
  const bootstrap = async () => {
714
786
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
715
787
  strapi.get("webhookStore").addAllowedEvent(key, value);
@@ -719,6 +791,7 @@ const bootstrap = async () => {
719
791
  await getService$1("content-types").syncConfigurations();
720
792
  await getService$1("permission").registerPermissions();
721
793
  await history.bootstrap?.({ strapi });
794
+ await preview.bootstrap?.({ strapi });
722
795
  };
723
796
  const destroy = async ({ strapi: strapi2 }) => {
724
797
  await history.destroy?.({ strapi: strapi2 });
@@ -1208,7 +1281,8 @@ const admin = {
1208
1281
  };
1209
1282
  const routes = {
1210
1283
  admin,
1211
- ...history.routes ? history.routes : {}
1284
+ ...history.routes ? history.routes : {},
1285
+ ...preview.routes ? preview.routes : {}
1212
1286
  };
1213
1287
  const hasPermissionsSchema = strapiUtils.yup.object({
1214
1288
  actions: strapiUtils.yup.array().of(strapiUtils.yup.string()),
@@ -1219,6 +1293,11 @@ const { createPolicy } = strapiUtils.policy;
1219
1293
  const hasPermissions = createPolicy({
1220
1294
  name: "plugin::content-manager.hasPermissions",
1221
1295
  validator: validateHasPermissionsInput,
1296
+ /**
1297
+ * NOTE: Action aliases are currently not checked at this level (policy).
1298
+ * This is currently the intended behavior to avoid changing the behavior of API related permissions.
1299
+ * If you want to add support for it, please create a dedicated RFC with a list of potential side effect this could have.
1300
+ */
1222
1301
  handler(ctx, config = {}) {
1223
1302
  const { actions = [], hasAtLeastOne = false } = config;
1224
1303
  const { userAbility } = ctx.state;
@@ -1699,7 +1778,7 @@ const updateDocument = async (ctx, opts) => {
1699
1778
  throw new strapiUtils.errors.ForbiddenError();
1700
1779
  }
1701
1780
  const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
1702
- const setCreator = strapiUtils.setCreatorFields({ user, isEdition: true });
1781
+ const setCreator = documentVersion ? strapiUtils.setCreatorFields({ user, isEdition: true }) : strapiUtils.setCreatorFields({ user });
1703
1782
  const sanitizeFn = strapiUtils.async.pipe(pickPermittedFields, setCreator);
1704
1783
  const sanitizedBody = await sanitizeFn(body);
1705
1784
  return documentManager2.update(documentVersion?.documentId || id, model, {
@@ -1771,7 +1850,7 @@ const collectionTypes = {
1771
1850
  permissionChecker2,
1772
1851
  model,
1773
1852
  // @ts-expect-error TODO: fix
1774
- { id, locale, publishedAt: null },
1853
+ { documentId: id, locale, publishedAt: null },
1775
1854
  { availableLocales: true, availableStatus: false }
1776
1855
  );
1777
1856
  ctx.body = { data: {}, meta };
@@ -1908,11 +1987,17 @@ const collectionTypes = {
1908
1987
  }
1909
1988
  const isUpdate = !isCreate;
1910
1989
  if (isUpdate) {
1911
- document = await documentManager2.findOne(id, model, { populate, locale });
1912
- if (!document) {
1990
+ const documentExists = documentManager2.exists(model, id);
1991
+ if (!documentExists) {
1913
1992
  throw new strapiUtils.errors.NotFoundError("Document not found");
1914
1993
  }
1915
- if (permissionChecker2.can.update(document)) {
1994
+ document = await documentManager2.findOne(id, model, { populate, locale });
1995
+ if (!document) {
1996
+ if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
1997
+ throw new strapiUtils.errors.ForbiddenError();
1998
+ }
1999
+ document = await updateDocument(ctx);
2000
+ } else if (permissionChecker2.can.update(document)) {
1916
2001
  await updateDocument(ctx);
1917
2002
  }
1918
2003
  }
@@ -1974,7 +2059,9 @@ const collectionTypes = {
1974
2059
  if (permissionChecker2.cannot.unpublish()) {
1975
2060
  return ctx.forbidden();
1976
2061
  }
1977
- const { locale } = await getDocumentLocaleAndStatus(body, model);
2062
+ const { locale } = await getDocumentLocaleAndStatus(body, model, {
2063
+ allowMultipleLocales: true
2064
+ });
1978
2065
  const entityPromises = documentIds.map(
1979
2066
  (documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
1980
2067
  );
@@ -2325,32 +2412,37 @@ const sanitizeMainField = (model, mainField, userAbility) => {
2325
2412
  userAbility,
2326
2413
  model: model.uid
2327
2414
  });
2328
- if (!isListable(model, mainField)) {
2415
+ const isMainFieldListable = isListable(model, mainField);
2416
+ const canReadMainField = permissionChecker2.can.read(null, mainField);
2417
+ if (!isMainFieldListable || !canReadMainField) {
2329
2418
  return "id";
2330
2419
  }
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";
2420
+ if (model.uid === "plugin::users-permissions.role") {
2421
+ return "name";
2342
2422
  }
2343
2423
  return mainField;
2344
2424
  };
2345
- const addStatusToRelations = async (uid2, relations2) => {
2346
- if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.contentTypes[uid2])) {
2425
+ const addStatusToRelations = async (targetUid, relations2) => {
2426
+ if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {
2347
2427
  return relations2;
2348
2428
  }
2349
2429
  const documentMetadata2 = getService$1("document-metadata");
2350
- const documentsAvailableStatus = await documentMetadata2.getManyAvailableStatus(uid2, relations2);
2430
+ if (!relations2.length) {
2431
+ return relations2;
2432
+ }
2433
+ const firstRelation = relations2[0];
2434
+ const filters = {
2435
+ documentId: { $in: relations2.map((r) => r.documentId) },
2436
+ // NOTE: find the "opposite" status
2437
+ publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
2438
+ };
2439
+ const availableStatus = await strapi.query(targetUid).findMany({
2440
+ select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
2441
+ filters
2442
+ });
2351
2443
  return relations2.map((relation) => {
2352
- const availableStatuses = documentsAvailableStatus.filter(
2353
- (availableDocument) => availableDocument.documentId === relation.documentId
2444
+ const availableStatuses = availableStatus.filter(
2445
+ (availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
2354
2446
  );
2355
2447
  return {
2356
2448
  ...relation,
@@ -2371,11 +2463,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
2371
2463
  const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
2372
2464
  const isSourceLocalized = isLocalized(sourceModel);
2373
2465
  const isTargetLocalized = isLocalized(targetModel);
2374
- let validatedLocale = locale;
2375
- if (!targetModel || !isTargetLocalized)
2376
- validatedLocale = void 0;
2377
2466
  return {
2378
- locale: validatedLocale,
2467
+ locale,
2379
2468
  isSourceLocalized,
2380
2469
  isTargetLocalized
2381
2470
  };
@@ -2478,7 +2567,7 @@ const relations = {
2478
2567
  attribute,
2479
2568
  fieldsToSelect,
2480
2569
  mainField,
2481
- source: { schema: sourceSchema },
2570
+ source: { schema: sourceSchema, isLocalized: isSourceLocalized },
2482
2571
  target: { schema: targetSchema, isLocalized: isTargetLocalized },
2483
2572
  sourceSchema,
2484
2573
  targetSchema,
@@ -2500,7 +2589,8 @@ const relations = {
2500
2589
  fieldsToSelect,
2501
2590
  mainField,
2502
2591
  source: {
2503
- schema: { uid: sourceUid, modelType: sourceModelType }
2592
+ schema: { uid: sourceUid, modelType: sourceModelType },
2593
+ isLocalized: isSourceLocalized
2504
2594
  },
2505
2595
  target: {
2506
2596
  schema: { uid: targetUid },
@@ -2538,12 +2628,16 @@ const relations = {
2538
2628
  } else {
2539
2629
  where.id = id;
2540
2630
  }
2541
- if (status) {
2542
- where[`${alias}.published_at`] = getPublishedAtClause(status, targetUid);
2631
+ const publishedAt = getPublishedAtClause(status, targetUid);
2632
+ if (!fp.isEmpty(publishedAt)) {
2633
+ where[`${alias}.published_at`] = publishedAt;
2543
2634
  }
2544
- if (filterByLocale) {
2635
+ if (isTargetLocalized && locale) {
2545
2636
  where[`${alias}.locale`] = locale;
2546
2637
  }
2638
+ if (isSourceLocalized && locale) {
2639
+ where.locale = locale;
2640
+ }
2547
2641
  if ((idsToInclude?.length ?? 0) !== 0) {
2548
2642
  where[`${alias}.id`].$notIn = idsToInclude;
2549
2643
  }
@@ -2561,7 +2655,8 @@ const relations = {
2561
2655
  id: { $notIn: fp.uniq(idsToOmit) }
2562
2656
  });
2563
2657
  }
2564
- const res = await strapi.db.query(targetUid).findPage(strapi.get("query-params").transform(targetUid, queryParams));
2658
+ const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
2659
+ const res = await strapi.db.query(targetUid).findPage(dbQuery);
2565
2660
  ctx.body = {
2566
2661
  ...res,
2567
2662
  results: await addStatusToRelations(targetUid, res.results)
@@ -2576,29 +2671,39 @@ const relations = {
2576
2671
  attribute,
2577
2672
  targetField,
2578
2673
  fieldsToSelect,
2579
- source: {
2580
- schema: { uid: sourceUid }
2581
- },
2582
- target: {
2583
- schema: { uid: targetUid }
2584
- }
2674
+ status,
2675
+ source: { schema: sourceSchema },
2676
+ target: { schema: targetSchema }
2585
2677
  } = await this.extractAndValidateRequestInfo(ctx, id);
2678
+ const { uid: sourceUid } = sourceSchema;
2679
+ const { uid: targetUid } = targetSchema;
2586
2680
  const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2587
2681
  const dbQuery = strapi.db.query(sourceUid);
2588
2682
  const loadRelations = strapiUtils.relations.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
2683
+ const filters = {};
2684
+ if (sourceSchema?.options?.draftAndPublish) {
2685
+ if (targetSchema?.options?.draftAndPublish) {
2686
+ if (status === "published") {
2687
+ filters.publishedAt = { $notNull: true };
2688
+ } else {
2689
+ filters.publishedAt = { $null: true };
2690
+ }
2691
+ }
2692
+ } else if (targetSchema?.options?.draftAndPublish) {
2693
+ filters.publishedAt = { $null: true };
2694
+ }
2589
2695
  const res = await loadRelations({ id: entryId }, targetField, {
2590
- select: ["id", "documentId", "locale", "publishedAt"],
2696
+ select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
2591
2697
  ordering: "desc",
2592
2698
  page: ctx.request.query.page,
2593
- pageSize: ctx.request.query.pageSize
2699
+ pageSize: ctx.request.query.pageSize,
2700
+ filters
2594
2701
  });
2595
2702
  const loadedIds = res.results.map((item) => item.id);
2596
2703
  addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
2597
2704
  const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
2598
2705
  ...strapi.get("query-params").transform(targetUid, permissionQuery),
2599
- ordering: "desc",
2600
- page: ctx.request.query.page,
2601
- pageSize: ctx.request.query.pageSize
2706
+ ordering: "desc"
2602
2707
  });
2603
2708
  const relationsUnion = fp.uniqBy("id", fp.concat(sanitizedRes.results, res.results));
2604
2709
  ctx.body = {
@@ -2685,7 +2790,7 @@ const singleTypes = {
2685
2790
  permissionChecker2,
2686
2791
  model,
2687
2792
  // @ts-expect-error - fix types
2688
- { id: document.documentId, locale, publishedAt: null },
2793
+ { documentId: document.documentId, locale, publishedAt: null },
2689
2794
  { availableLocales: true, availableStatus: false }
2690
2795
  );
2691
2796
  ctx.body = { data: {}, meta };
@@ -2884,7 +2989,8 @@ const controllers = {
2884
2989
  relations,
2885
2990
  "single-types": singleTypes,
2886
2991
  uid: uid$1,
2887
- ...history.controllers ? history.controllers : {}
2992
+ ...history.controllers ? history.controllers : {},
2993
+ ...preview.controllers ? preview.controllers : {}
2888
2994
  };
2889
2995
  const keys = {
2890
2996
  CONFIGURATION: "configuration"
@@ -3504,12 +3610,27 @@ const createPermissionChecker = (strapi2) => ({ userAbility, model }) => {
3504
3610
  ability: userAbility,
3505
3611
  model
3506
3612
  });
3507
- const toSubject = (entity) => entity ? permissionsManager.toSubject(entity, model) : model;
3613
+ const { actionProvider } = strapi2.service("admin::permission");
3614
+ const toSubject = (entity) => {
3615
+ return entity ? permissionsManager.toSubject(entity, model) : model;
3616
+ };
3508
3617
  const can = (action, entity, field) => {
3509
- return userAbility.can(action, toSubject(entity), field);
3618
+ const subject = toSubject(entity);
3619
+ const aliases = actionProvider.unstable_aliases(action, model);
3620
+ return (
3621
+ // Test the original action to see if it passes
3622
+ userAbility.can(action, subject, field) || // Else try every known alias if at least one of them succeed, then the user "can"
3623
+ aliases.some((alias) => userAbility.can(alias, subject, field))
3624
+ );
3510
3625
  };
3511
3626
  const cannot = (action, entity, field) => {
3512
- return userAbility.cannot(action, toSubject(entity), field);
3627
+ const subject = toSubject(entity);
3628
+ const aliases = actionProvider.unstable_aliases(action, model);
3629
+ return (
3630
+ // Test both the original action
3631
+ userAbility.cannot(action, subject, field) && // and every known alias, if all of them fail (cannot), then the user truly "cannot"
3632
+ aliases.every((alias) => userAbility.cannot(alias, subject, field))
3633
+ );
3513
3634
  };
3514
3635
  const sanitizeOutput = (data, { action = ACTIONS.read } = {}) => {
3515
3636
  return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });
@@ -4041,7 +4162,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4041
4162
  */
4042
4163
  async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4043
4164
  const versionsByLocale = fp.groupBy("locale", allVersions);
4044
- delete versionsByLocale[version.locale];
4165
+ if (version.locale) {
4166
+ delete versionsByLocale[version.locale];
4167
+ }
4045
4168
  const model = strapi2.getModel(uid2);
4046
4169
  const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4047
4170
  const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(
@@ -4397,7 +4520,8 @@ const services = {
4397
4520
  permission,
4398
4521
  "populate-builder": populateBuilder$1,
4399
4522
  uid,
4400
- ...history.services ? history.services : {}
4523
+ ...history.services ? history.services : {},
4524
+ ...preview.services ? preview.services : {}
4401
4525
  };
4402
4526
  const index = () => {
4403
4527
  return {