@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.mjs
CHANGED
@@ -95,7 +95,7 @@ const createHistoryVersionController = ({ strapi: strapi2 }) => {
|
|
95
95
|
}
|
96
96
|
};
|
97
97
|
};
|
98
|
-
const controllers$
|
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
|
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({
|
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$
|
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$
|
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$
|
669
|
-
services: services$
|
670
|
-
routes: routes$
|
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
|
-
|
1886
|
-
if (!
|
1964
|
+
const documentExists = documentManager2.exists(model, id);
|
1965
|
+
if (!documentExists) {
|
1887
1966
|
throw new errors.NotFoundError("Document not found");
|
1888
1967
|
}
|
1889
|
-
|
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
|
-
|
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 (
|
2306
|
-
|
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 (
|
2320
|
-
if (!contentTypes$1.hasDraftAndPublish(strapi.
|
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
|
-
|
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 =
|
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
|
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
|
-
|
2516
|
-
|
2605
|
+
const publishedAt = getPublishedAtClause(status, targetUid);
|
2606
|
+
if (!isEmpty(publishedAt)) {
|
2607
|
+
where[`${alias}.published_at`] = publishedAt;
|
2517
2608
|
}
|
2518
|
-
if (
|
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
|
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
|
-
|
2554
|
-
|
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
|
-
{
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
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 {
|