@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.
- package/dist/_chunks/{ComponentConfigurationPage-B3yDbeU1.mjs → ComponentConfigurationPage-CIjXcRAB.mjs} +4 -4
- package/dist/_chunks/{ComponentConfigurationPage-B3yDbeU1.mjs.map → ComponentConfigurationPage-CIjXcRAB.mjs.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-KXSuLnQD.js → ComponentConfigurationPage-gsCd80MU.js} +4 -4
- package/dist/_chunks/{ComponentConfigurationPage-KXSuLnQD.js.map → ComponentConfigurationPage-gsCd80MU.js.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-D7PrLO8j.mjs → EditConfigurationPage-BglmD_BF.mjs} +4 -4
- package/dist/_chunks/{EditConfigurationPage-D7PrLO8j.mjs.map → EditConfigurationPage-BglmD_BF.mjs.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-BQ17--5R.js → EditConfigurationPage-DHDQKBzw.js} +4 -4
- package/dist/_chunks/{EditConfigurationPage-BQ17--5R.js.map → EditConfigurationPage-DHDQKBzw.js.map} +1 -1
- package/dist/_chunks/{EditViewPage-BgjdnGz2.js → EditViewPage-C4iTxUPU.js} +15 -5
- package/dist/_chunks/EditViewPage-C4iTxUPU.js.map +1 -0
- package/dist/_chunks/{EditViewPage-B7VgwJaG.mjs → EditViewPage-CiwVPMaK.mjs} +15 -5
- package/dist/_chunks/EditViewPage-CiwVPMaK.mjs.map +1 -0
- package/dist/_chunks/{Field-tHCw4lGA.mjs → Field-DIjL1b5d.mjs} +98 -85
- package/dist/_chunks/Field-DIjL1b5d.mjs.map +1 -0
- package/dist/_chunks/{Field-CdK7ZLmv.js → Field-DhXEK8y1.js} +101 -88
- package/dist/_chunks/Field-DhXEK8y1.js.map +1 -0
- package/dist/_chunks/{Form-BJxdTv3Q.mjs → Form-CmNesrvR.mjs} +16 -8
- package/dist/_chunks/Form-CmNesrvR.mjs.map +1 -0
- package/dist/_chunks/{Form-C_0KTVvV.js → Form-CwmJ4sWe.js} +16 -8
- package/dist/_chunks/Form-CwmJ4sWe.js.map +1 -0
- package/dist/_chunks/{History-nuEzM5qm.js → History-BLCCNgCt.js} +24 -11
- package/dist/_chunks/History-BLCCNgCt.js.map +1 -0
- package/dist/_chunks/{History-DR2txJLE.mjs → History-D-99Wh30.mjs} +25 -12
- package/dist/_chunks/History-D-99Wh30.mjs.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-CnB86Psm.js → ListConfigurationPage-DxWpeZrO.js} +3 -3
- package/dist/_chunks/{ListConfigurationPage-CnB86Psm.js.map → ListConfigurationPage-DxWpeZrO.js.map} +1 -1
- package/dist/_chunks/{ListConfigurationPage-voFVtXu6.mjs → ListConfigurationPage-JPWZz7Kg.mjs} +3 -3
- package/dist/_chunks/{ListConfigurationPage-voFVtXu6.mjs.map → ListConfigurationPage-JPWZz7Kg.mjs.map} +1 -1
- package/dist/_chunks/{ListViewPage-SXIXm-RM.js → ListViewPage-CIQekSFz.js} +55 -40
- package/dist/_chunks/ListViewPage-CIQekSFz.js.map +1 -0
- package/dist/_chunks/{ListViewPage-B_GaWgRH.mjs → ListViewPage-DSK3f0ST.mjs} +52 -37
- package/dist/_chunks/ListViewPage-DSK3f0ST.mjs.map +1 -0
- package/dist/_chunks/{NoContentTypePage-BzsQ3hLZ.js → NoContentTypePage-C5cxKvC2.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-BzsQ3hLZ.js.map → NoContentTypePage-C5cxKvC2.js.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-CYiGpsbj.mjs → NoContentTypePage-D99LU1YP.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-CYiGpsbj.mjs.map → NoContentTypePage-D99LU1YP.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-B5baIHal.mjs → NoPermissionsPage-DBrBw-0y.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-B5baIHal.mjs.map → NoPermissionsPage-DBrBw-0y.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-IGkId4C5.js → NoPermissionsPage-Oy4tmUrW.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-IGkId4C5.js.map → NoPermissionsPage-Oy4tmUrW.js.map} +1 -1
- package/dist/_chunks/{Relations-CIYDdKU-.mjs → Relations-BBmhcWFV.mjs} +69 -36
- package/dist/_chunks/Relations-BBmhcWFV.mjs.map +1 -0
- package/dist/_chunks/{Relations-Dhuurpx2.js → Relations-eG-9p_qS.js} +68 -35
- package/dist/_chunks/Relations-eG-9p_qS.js.map +1 -0
- package/dist/_chunks/{en-uOUIxfcQ.js → en-Bm0D0IWz.js} +13 -12
- package/dist/_chunks/{en-uOUIxfcQ.js.map → en-Bm0D0IWz.js.map} +1 -1
- package/dist/_chunks/{en-BrCTWlZv.mjs → en-DKV44jRb.mjs} +13 -12
- package/dist/_chunks/{en-BrCTWlZv.mjs.map → en-DKV44jRb.mjs.map} +1 -1
- package/dist/_chunks/{index-CdT0kHZ8.js → index-BIWDoFLK.js} +2051 -1896
- package/dist/_chunks/index-BIWDoFLK.js.map +1 -0
- package/dist/_chunks/{index-C9TJPyni.mjs → index-BrUzbQ30.mjs} +2070 -1916
- package/dist/_chunks/index-BrUzbQ30.mjs.map +1 -0
- package/dist/_chunks/{layout-BNqvLR_b.mjs → layout-_5-cXs34.mjs} +5 -4
- package/dist/_chunks/{layout-BNqvLR_b.mjs.map → layout-_5-cXs34.mjs.map} +1 -1
- package/dist/_chunks/{layout-C6dxWYT7.js → layout-lMc9i1-Z.js} +5 -4
- package/dist/_chunks/{layout-C6dxWYT7.js.map → layout-lMc9i1-Z.js.map} +1 -1
- package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
- package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
- package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
- package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
- package/dist/_chunks/{relations-DtFaDnP1.js → relations-BRHithi8.js} +3 -7
- package/dist/_chunks/relations-BRHithi8.js.map +1 -0
- package/dist/_chunks/{relations-CkKqKw65.mjs → relations-B_VLk-DD.mjs} +3 -7
- package/dist/_chunks/relations-B_VLk-DD.mjs.map +1 -0
- package/dist/_chunks/{usePrev-B9w_-eYc.js → useDebounce-CtcjDB3L.js} +14 -1
- package/dist/_chunks/useDebounce-CtcjDB3L.js.map +1 -0
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs +29 -0
- package/dist/_chunks/useDebounce-DmuSJIF3.mjs.map +1 -0
- package/dist/admin/index.js +2 -1
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +5 -4
- package/dist/admin/src/exports.d.ts +1 -1
- package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
- package/dist/admin/src/hooks/useDocument.d.ts +32 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +0 -32
- package/dist/admin/src/pages/EditView/components/Header.d.ts +11 -11
- package/dist/admin/src/preview/constants.d.ts +1 -0
- package/dist/admin/src/preview/index.d.ts +4 -0
- package/dist/admin/src/services/api.d.ts +1 -1
- package/dist/admin/src/services/components.d.ts +2 -2
- package/dist/admin/src/services/contentTypes.d.ts +3 -3
- package/dist/admin/src/services/documents.d.ts +19 -17
- package/dist/admin/src/services/init.d.ts +1 -1
- package/dist/admin/src/services/relations.d.ts +2 -2
- package/dist/admin/src/services/uid.d.ts +3 -3
- package/dist/admin/src/utils/validation.d.ts +4 -1
- package/dist/server/index.js +191 -67
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +191 -67
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/metadata.d.ts +15 -1
- package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
- package/dist/server/src/history/services/history.d.ts.map +1 -1
- package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts +1 -0
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +4 -4
- package/dist/server/src/policies/hasPermissions.d.ts.map +1 -1
- package/dist/server/src/preview/constants.d.ts +2 -0
- package/dist/server/src/preview/constants.d.ts.map +1 -0
- package/dist/server/src/preview/controllers/index.d.ts +2 -0
- package/dist/server/src/preview/controllers/index.d.ts.map +1 -0
- package/dist/server/src/preview/controllers/preview.d.ts +9 -0
- package/dist/server/src/preview/controllers/preview.d.ts.map +1 -0
- package/dist/server/src/preview/index.d.ts +4 -0
- package/dist/server/src/preview/index.d.ts.map +1 -0
- package/dist/server/src/preview/routes/index.d.ts +8 -0
- package/dist/server/src/preview/routes/index.d.ts.map +1 -0
- package/dist/server/src/preview/routes/preview.d.ts +4 -0
- package/dist/server/src/preview/routes/preview.d.ts.map +1 -0
- package/dist/server/src/preview/services/index.d.ts +4 -0
- package/dist/server/src/preview/services/index.d.ts.map +1 -0
- package/dist/server/src/preview/services/preview.d.ts +6 -0
- package/dist/server/src/preview/services/preview.d.ts.map +1 -0
- package/dist/server/src/preview/utils.d.ts +7 -0
- package/dist/server/src/preview/utils.d.ts.map +1 -0
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/services/document-metadata.d.ts +8 -8
- package/dist/server/src/services/document-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +4 -4
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permission-checker.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
- package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/shared/contracts/collection-types.d.ts +3 -1
- package/dist/shared/contracts/collection-types.d.ts.map +1 -1
- package/package.json +12 -12
- package/dist/_chunks/EditViewPage-B7VgwJaG.mjs.map +0 -1
- package/dist/_chunks/EditViewPage-BgjdnGz2.js.map +0 -1
- package/dist/_chunks/Field-CdK7ZLmv.js.map +0 -1
- package/dist/_chunks/Field-tHCw4lGA.mjs.map +0 -1
- package/dist/_chunks/Form-BJxdTv3Q.mjs.map +0 -1
- package/dist/_chunks/Form-C_0KTVvV.js.map +0 -1
- package/dist/_chunks/History-DR2txJLE.mjs.map +0 -1
- package/dist/_chunks/History-nuEzM5qm.js.map +0 -1
- package/dist/_chunks/ListViewPage-B_GaWgRH.mjs.map +0 -1
- package/dist/_chunks/ListViewPage-SXIXm-RM.js.map +0 -1
- package/dist/_chunks/Relations-CIYDdKU-.mjs.map +0 -1
- package/dist/_chunks/Relations-Dhuurpx2.js.map +0 -1
- package/dist/_chunks/index-C9TJPyni.mjs.map +0 -1
- package/dist/_chunks/index-CdT0kHZ8.js.map +0 -1
- package/dist/_chunks/relations-CkKqKw65.mjs.map +0 -1
- package/dist/_chunks/relations-DtFaDnP1.js.map +0 -1
- package/dist/_chunks/usePrev-B9w_-eYc.js.map +0 -1
- package/dist/_chunks/usePrev-DH6iah0A.mjs +0 -16
- package/dist/_chunks/usePrev-DH6iah0A.mjs.map +0 -1
- package/strapi-server.js +0 -3
package/dist/server/index.js
CHANGED
@@ -121,7 +121,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
121
121
|
}
|
122
122
|
};
|
123
123
|
};
|
124
|
-
const controllers$
|
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
|
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({
|
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$
|
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$
|
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$
|
695
|
-
services: services$
|
696
|
-
routes: routes$
|
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
|
-
|
1912
|
-
if (!
|
1990
|
+
const documentExists = documentManager2.exists(model, id);
|
1991
|
+
if (!documentExists) {
|
1913
1992
|
throw new strapiUtils.errors.NotFoundError("Document not found");
|
1914
1993
|
}
|
1915
|
-
|
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
|
-
|
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 (
|
2332
|
-
|
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 (
|
2346
|
-
if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.
|
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
|
-
|
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 =
|
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
|
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
|
-
|
2542
|
-
|
2631
|
+
const publishedAt = getPublishedAtClause(status, targetUid);
|
2632
|
+
if (!fp.isEmpty(publishedAt)) {
|
2633
|
+
where[`${alias}.published_at`] = publishedAt;
|
2543
2634
|
}
|
2544
|
-
if (
|
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
|
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
|
-
|
2580
|
-
|
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
|
-
{
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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 {
|