@strapi/content-manager 0.0.0-experimental.abc → 0.0.0-experimental.ae69a6ec6a65b1061cd6a00b2608abeeff436042
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-DH3rgf1K.mjs} +4 -4
- package/dist/_chunks/{ComponentConfigurationPage-B3yDbeU1.mjs.map → ComponentConfigurationPage-DH3rgf1K.mjs.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-KXSuLnQD.js → ComponentConfigurationPage-DRh2GoZx.js} +4 -4
- package/dist/_chunks/{ComponentConfigurationPage-KXSuLnQD.js.map → ComponentConfigurationPage-DRh2GoZx.js.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-BQ17--5R.js → EditConfigurationPage-BOAqRJUV.js} +4 -4
- package/dist/_chunks/{EditConfigurationPage-BQ17--5R.js.map → EditConfigurationPage-BOAqRJUV.js.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-D7PrLO8j.mjs → EditConfigurationPage-C1HHivAz.mjs} +4 -4
- package/dist/_chunks/{EditConfigurationPage-D7PrLO8j.mjs.map → EditConfigurationPage-C1HHivAz.mjs.map} +1 -1
- package/dist/_chunks/{EditViewPage-BgjdnGz2.js → EditViewPage-CgfL33yw.js} +15 -5
- package/dist/_chunks/EditViewPage-CgfL33yw.js.map +1 -0
- package/dist/_chunks/{EditViewPage-B7VgwJaG.mjs → EditViewPage-DBV7CZVf.mjs} +15 -5
- package/dist/_chunks/EditViewPage-DBV7CZVf.mjs.map +1 -0
- package/dist/_chunks/{Field-tHCw4lGA.mjs → Field-BQFK_H87.mjs} +98 -85
- package/dist/_chunks/Field-BQFK_H87.mjs.map +1 -0
- package/dist/_chunks/{Field-CdK7ZLmv.js → Field-C647fIuP.js} +101 -88
- package/dist/_chunks/Field-C647fIuP.js.map +1 -0
- package/dist/_chunks/{Form-BJxdTv3Q.mjs → Form--31reETM.mjs} +16 -8
- package/dist/_chunks/Form--31reETM.mjs.map +1 -0
- package/dist/_chunks/{Form-C_0KTVvV.js → Form-CsYUrVEA.js} +16 -8
- package/dist/_chunks/Form-CsYUrVEA.js.map +1 -0
- package/dist/_chunks/{History-DR2txJLE.mjs → History-8tQaor_-.mjs} +25 -12
- package/dist/_chunks/History-8tQaor_-.mjs.map +1 -0
- package/dist/_chunks/{History-nuEzM5qm.js → History-Dl6wOm0V.js} +24 -11
- package/dist/_chunks/History-Dl6wOm0V.js.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-CnB86Psm.js → ListConfigurationPage-BedUJnmo.js} +3 -3
- package/dist/_chunks/{ListConfigurationPage-CnB86Psm.js.map → ListConfigurationPage-BedUJnmo.js.map} +1 -1
- package/dist/_chunks/{ListConfigurationPage-voFVtXu6.mjs → ListConfigurationPage-_WWIGpVT.mjs} +3 -3
- package/dist/_chunks/{ListConfigurationPage-voFVtXu6.mjs.map → ListConfigurationPage-_WWIGpVT.mjs.map} +1 -1
- package/dist/_chunks/{ListViewPage-SXIXm-RM.js → ListViewPage-5QzoAtAo.js} +55 -40
- package/dist/_chunks/ListViewPage-5QzoAtAo.js.map +1 -0
- package/dist/_chunks/{ListViewPage-B_GaWgRH.mjs → ListViewPage-CZfw9OW9.mjs} +52 -37
- package/dist/_chunks/ListViewPage-CZfw9OW9.mjs.map +1 -0
- package/dist/_chunks/{NoContentTypePage-CYiGpsbj.mjs → NoContentTypePage-D-RqshUI.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-CYiGpsbj.mjs.map → NoContentTypePage-D-RqshUI.mjs.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-BzsQ3hLZ.js → NoContentTypePage-DBIyA7hd.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-BzsQ3hLZ.js.map → NoContentTypePage-DBIyA7hd.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-IGkId4C5.js → NoPermissionsPage-CCAreseM.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-IGkId4C5.js.map → NoPermissionsPage-CCAreseM.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-B5baIHal.mjs → NoPermissionsPage-m7GAd26r.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-B5baIHal.mjs.map → NoPermissionsPage-m7GAd26r.mjs.map} +1 -1
- package/dist/_chunks/{Relations-CIYDdKU-.mjs → Relations-Dq52hb_u.mjs} +69 -36
- package/dist/_chunks/Relations-Dq52hb_u.mjs.map +1 -0
- package/dist/_chunks/{Relations-Dhuurpx2.js → Relations-SRwPhmo7.js} +68 -35
- package/dist/_chunks/Relations-SRwPhmo7.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-C9TJPyni.mjs → index-1Bdj-6ls.mjs} +2067 -1914
- package/dist/_chunks/index-1Bdj-6ls.mjs.map +1 -0
- package/dist/_chunks/{index-CdT0kHZ8.js → index-CsrCnNa3.js} +2048 -1894
- package/dist/_chunks/index-CsrCnNa3.js.map +1 -0
- package/dist/_chunks/{layout-C6dxWYT7.js → layout-B33V9Tdu.js} +5 -4
- package/dist/_chunks/{layout-C6dxWYT7.js.map → layout-B33V9Tdu.js.map} +1 -1
- package/dist/_chunks/{layout-BNqvLR_b.mjs → layout-ByD1cQSW.mjs} +5 -4
- package/dist/_chunks/{layout-BNqvLR_b.mjs.map → layout-ByD1cQSW.mjs.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-BBHlo3qQ.js} +3 -7
- package/dist/_chunks/relations-BBHlo3qQ.js.map +1 -0
- package/dist/_chunks/{relations-CkKqKw65.mjs → relations-DFwbNLZ0.mjs} +3 -7
- package/dist/_chunks/relations-DFwbNLZ0.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 +132 -55
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +132 -55
- 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/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/index.d.ts +4 -0
- package/dist/server/src/preview/index.d.ts.map +1 -0
- 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/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 +13 -13
- 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
@@ -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,
|
@@ -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 }) {
|
@@ -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,18 @@ 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 getFeature = () => {
|
705
|
+
if (!strapi.features.future.isEnabled(FEATURE_ID)) {
|
706
|
+
return {};
|
707
|
+
}
|
708
|
+
return {
|
709
|
+
bootstrap() {
|
710
|
+
console.log("Bootstrapping preview server");
|
711
|
+
}
|
712
|
+
};
|
713
|
+
};
|
714
|
+
const preview = getFeature();
|
687
715
|
const bootstrap = async () => {
|
688
716
|
Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
|
689
717
|
strapi.get("webhookStore").addAllowedEvent(key, value);
|
@@ -693,6 +721,7 @@ const bootstrap = async () => {
|
|
693
721
|
await getService$1("content-types").syncConfigurations();
|
694
722
|
await getService$1("permission").registerPermissions();
|
695
723
|
await history.bootstrap?.({ strapi });
|
724
|
+
await preview.bootstrap?.({ strapi });
|
696
725
|
};
|
697
726
|
const destroy = async ({ strapi: strapi2 }) => {
|
698
727
|
await history.destroy?.({ strapi: strapi2 });
|
@@ -1193,6 +1222,11 @@ const { createPolicy } = policy;
|
|
1193
1222
|
const hasPermissions = createPolicy({
|
1194
1223
|
name: "plugin::content-manager.hasPermissions",
|
1195
1224
|
validator: validateHasPermissionsInput,
|
1225
|
+
/**
|
1226
|
+
* NOTE: Action aliases are currently not checked at this level (policy).
|
1227
|
+
* This is currently the intended behavior to avoid changing the behavior of API related permissions.
|
1228
|
+
* If you want to add support for it, please create a dedicated RFC with a list of potential side effect this could have.
|
1229
|
+
*/
|
1196
1230
|
handler(ctx, config = {}) {
|
1197
1231
|
const { actions = [], hasAtLeastOne = false } = config;
|
1198
1232
|
const { userAbility } = ctx.state;
|
@@ -1673,7 +1707,7 @@ const updateDocument = async (ctx, opts) => {
|
|
1673
1707
|
throw new errors.ForbiddenError();
|
1674
1708
|
}
|
1675
1709
|
const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
|
1676
|
-
const setCreator = setCreatorFields({ user, isEdition: true });
|
1710
|
+
const setCreator = documentVersion ? setCreatorFields({ user, isEdition: true }) : setCreatorFields({ user });
|
1677
1711
|
const sanitizeFn = async.pipe(pickPermittedFields, setCreator);
|
1678
1712
|
const sanitizedBody = await sanitizeFn(body);
|
1679
1713
|
return documentManager2.update(documentVersion?.documentId || id, model, {
|
@@ -1745,7 +1779,7 @@ const collectionTypes = {
|
|
1745
1779
|
permissionChecker2,
|
1746
1780
|
model,
|
1747
1781
|
// @ts-expect-error TODO: fix
|
1748
|
-
{ id, locale, publishedAt: null },
|
1782
|
+
{ documentId: id, locale, publishedAt: null },
|
1749
1783
|
{ availableLocales: true, availableStatus: false }
|
1750
1784
|
);
|
1751
1785
|
ctx.body = { data: {}, meta };
|
@@ -1882,11 +1916,17 @@ const collectionTypes = {
|
|
1882
1916
|
}
|
1883
1917
|
const isUpdate = !isCreate;
|
1884
1918
|
if (isUpdate) {
|
1885
|
-
|
1886
|
-
if (!
|
1919
|
+
const documentExists = documentManager2.exists(model, id);
|
1920
|
+
if (!documentExists) {
|
1887
1921
|
throw new errors.NotFoundError("Document not found");
|
1888
1922
|
}
|
1889
|
-
|
1923
|
+
document = await documentManager2.findOne(id, model, { populate, locale });
|
1924
|
+
if (!document) {
|
1925
|
+
if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
|
1926
|
+
throw new errors.ForbiddenError();
|
1927
|
+
}
|
1928
|
+
document = await updateDocument(ctx);
|
1929
|
+
} else if (permissionChecker2.can.update(document)) {
|
1890
1930
|
await updateDocument(ctx);
|
1891
1931
|
}
|
1892
1932
|
}
|
@@ -1948,7 +1988,9 @@ const collectionTypes = {
|
|
1948
1988
|
if (permissionChecker2.cannot.unpublish()) {
|
1949
1989
|
return ctx.forbidden();
|
1950
1990
|
}
|
1951
|
-
const { locale } = await getDocumentLocaleAndStatus(body, model
|
1991
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
1992
|
+
allowMultipleLocales: true
|
1993
|
+
});
|
1952
1994
|
const entityPromises = documentIds.map(
|
1953
1995
|
(documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
|
1954
1996
|
);
|
@@ -2299,32 +2341,37 @@ const sanitizeMainField = (model, mainField, userAbility) => {
|
|
2299
2341
|
userAbility,
|
2300
2342
|
model: model.uid
|
2301
2343
|
});
|
2302
|
-
|
2344
|
+
const isMainFieldListable = isListable(model, mainField);
|
2345
|
+
const canReadMainField = permissionChecker2.can.read(null, mainField);
|
2346
|
+
if (!isMainFieldListable || !canReadMainField) {
|
2303
2347
|
return "id";
|
2304
2348
|
}
|
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";
|
2349
|
+
if (model.uid === "plugin::users-permissions.role") {
|
2350
|
+
return "name";
|
2316
2351
|
}
|
2317
2352
|
return mainField;
|
2318
2353
|
};
|
2319
|
-
const addStatusToRelations = async (
|
2320
|
-
if (!contentTypes$1.hasDraftAndPublish(strapi.
|
2354
|
+
const addStatusToRelations = async (targetUid, relations2) => {
|
2355
|
+
if (!contentTypes$1.hasDraftAndPublish(strapi.getModel(targetUid))) {
|
2321
2356
|
return relations2;
|
2322
2357
|
}
|
2323
2358
|
const documentMetadata2 = getService$1("document-metadata");
|
2324
|
-
|
2359
|
+
if (!relations2.length) {
|
2360
|
+
return relations2;
|
2361
|
+
}
|
2362
|
+
const firstRelation = relations2[0];
|
2363
|
+
const filters = {
|
2364
|
+
documentId: { $in: relations2.map((r) => r.documentId) },
|
2365
|
+
// NOTE: find the "opposite" status
|
2366
|
+
publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
|
2367
|
+
};
|
2368
|
+
const availableStatus = await strapi.query(targetUid).findMany({
|
2369
|
+
select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
|
2370
|
+
filters
|
2371
|
+
});
|
2325
2372
|
return relations2.map((relation) => {
|
2326
|
-
const availableStatuses =
|
2327
|
-
(availableDocument) => availableDocument.documentId === relation.documentId
|
2373
|
+
const availableStatuses = availableStatus.filter(
|
2374
|
+
(availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
|
2328
2375
|
);
|
2329
2376
|
return {
|
2330
2377
|
...relation,
|
@@ -2345,11 +2392,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
|
|
2345
2392
|
const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
|
2346
2393
|
const isSourceLocalized = isLocalized(sourceModel);
|
2347
2394
|
const isTargetLocalized = isLocalized(targetModel);
|
2348
|
-
let validatedLocale = locale;
|
2349
|
-
if (!targetModel || !isTargetLocalized)
|
2350
|
-
validatedLocale = void 0;
|
2351
2395
|
return {
|
2352
|
-
locale
|
2396
|
+
locale,
|
2353
2397
|
isSourceLocalized,
|
2354
2398
|
isTargetLocalized
|
2355
2399
|
};
|
@@ -2452,7 +2496,7 @@ const relations = {
|
|
2452
2496
|
attribute,
|
2453
2497
|
fieldsToSelect,
|
2454
2498
|
mainField,
|
2455
|
-
source: { schema: sourceSchema },
|
2499
|
+
source: { schema: sourceSchema, isLocalized: isSourceLocalized },
|
2456
2500
|
target: { schema: targetSchema, isLocalized: isTargetLocalized },
|
2457
2501
|
sourceSchema,
|
2458
2502
|
targetSchema,
|
@@ -2474,7 +2518,8 @@ const relations = {
|
|
2474
2518
|
fieldsToSelect,
|
2475
2519
|
mainField,
|
2476
2520
|
source: {
|
2477
|
-
schema: { uid: sourceUid, modelType: sourceModelType }
|
2521
|
+
schema: { uid: sourceUid, modelType: sourceModelType },
|
2522
|
+
isLocalized: isSourceLocalized
|
2478
2523
|
},
|
2479
2524
|
target: {
|
2480
2525
|
schema: { uid: targetUid },
|
@@ -2512,12 +2557,16 @@ const relations = {
|
|
2512
2557
|
} else {
|
2513
2558
|
where.id = id;
|
2514
2559
|
}
|
2515
|
-
|
2516
|
-
|
2560
|
+
const publishedAt = getPublishedAtClause(status, targetUid);
|
2561
|
+
if (!isEmpty(publishedAt)) {
|
2562
|
+
where[`${alias}.published_at`] = publishedAt;
|
2517
2563
|
}
|
2518
|
-
if (
|
2564
|
+
if (isTargetLocalized && locale) {
|
2519
2565
|
where[`${alias}.locale`] = locale;
|
2520
2566
|
}
|
2567
|
+
if (isSourceLocalized && locale) {
|
2568
|
+
where.locale = locale;
|
2569
|
+
}
|
2521
2570
|
if ((idsToInclude?.length ?? 0) !== 0) {
|
2522
2571
|
where[`${alias}.id`].$notIn = idsToInclude;
|
2523
2572
|
}
|
@@ -2535,7 +2584,8 @@ const relations = {
|
|
2535
2584
|
id: { $notIn: uniq(idsToOmit) }
|
2536
2585
|
});
|
2537
2586
|
}
|
2538
|
-
const
|
2587
|
+
const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
|
2588
|
+
const res = await strapi.db.query(targetUid).findPage(dbQuery);
|
2539
2589
|
ctx.body = {
|
2540
2590
|
...res,
|
2541
2591
|
results: await addStatusToRelations(targetUid, res.results)
|
@@ -2550,29 +2600,39 @@ const relations = {
|
|
2550
2600
|
attribute,
|
2551
2601
|
targetField,
|
2552
2602
|
fieldsToSelect,
|
2553
|
-
|
2554
|
-
|
2555
|
-
}
|
2556
|
-
target: {
|
2557
|
-
schema: { uid: targetUid }
|
2558
|
-
}
|
2603
|
+
status,
|
2604
|
+
source: { schema: sourceSchema },
|
2605
|
+
target: { schema: targetSchema }
|
2559
2606
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2607
|
+
const { uid: sourceUid } = sourceSchema;
|
2608
|
+
const { uid: targetUid } = targetSchema;
|
2560
2609
|
const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
|
2561
2610
|
const dbQuery = strapi.db.query(sourceUid);
|
2562
2611
|
const loadRelations = relations$1.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
|
2612
|
+
const filters = {};
|
2613
|
+
if (sourceSchema?.options?.draftAndPublish) {
|
2614
|
+
if (targetSchema?.options?.draftAndPublish) {
|
2615
|
+
if (status === "published") {
|
2616
|
+
filters.publishedAt = { $notNull: true };
|
2617
|
+
} else {
|
2618
|
+
filters.publishedAt = { $null: true };
|
2619
|
+
}
|
2620
|
+
}
|
2621
|
+
} else if (targetSchema?.options?.draftAndPublish) {
|
2622
|
+
filters.publishedAt = { $null: true };
|
2623
|
+
}
|
2563
2624
|
const res = await loadRelations({ id: entryId }, targetField, {
|
2564
|
-
select: ["id", "documentId", "locale", "publishedAt"],
|
2625
|
+
select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
|
2565
2626
|
ordering: "desc",
|
2566
2627
|
page: ctx.request.query.page,
|
2567
|
-
pageSize: ctx.request.query.pageSize
|
2628
|
+
pageSize: ctx.request.query.pageSize,
|
2629
|
+
filters
|
2568
2630
|
});
|
2569
2631
|
const loadedIds = res.results.map((item) => item.id);
|
2570
2632
|
addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
|
2571
2633
|
const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
|
2572
2634
|
...strapi.get("query-params").transform(targetUid, permissionQuery),
|
2573
|
-
ordering: "desc"
|
2574
|
-
page: ctx.request.query.page,
|
2575
|
-
pageSize: ctx.request.query.pageSize
|
2635
|
+
ordering: "desc"
|
2576
2636
|
});
|
2577
2637
|
const relationsUnion = uniqBy("id", concat(sanitizedRes.results, res.results));
|
2578
2638
|
ctx.body = {
|
@@ -2659,7 +2719,7 @@ const singleTypes = {
|
|
2659
2719
|
permissionChecker2,
|
2660
2720
|
model,
|
2661
2721
|
// @ts-expect-error - fix types
|
2662
|
-
{
|
2722
|
+
{ documentId: document.documentId, locale, publishedAt: null },
|
2663
2723
|
{ availableLocales: true, availableStatus: false }
|
2664
2724
|
);
|
2665
2725
|
ctx.body = { data: {}, meta };
|
@@ -3478,12 +3538,27 @@ const createPermissionChecker = (strapi2) => ({ userAbility, model }) => {
|
|
3478
3538
|
ability: userAbility,
|
3479
3539
|
model
|
3480
3540
|
});
|
3481
|
-
const
|
3541
|
+
const { actionProvider } = strapi2.service("admin::permission");
|
3542
|
+
const toSubject = (entity) => {
|
3543
|
+
return entity ? permissionsManager.toSubject(entity, model) : model;
|
3544
|
+
};
|
3482
3545
|
const can = (action, entity, field) => {
|
3483
|
-
|
3546
|
+
const subject = toSubject(entity);
|
3547
|
+
const aliases = actionProvider.unstable_aliases(action, model);
|
3548
|
+
return (
|
3549
|
+
// Test the original action to see if it passes
|
3550
|
+
userAbility.can(action, subject, field) || // Else try every known alias if at least one of them succeed, then the user "can"
|
3551
|
+
aliases.some((alias) => userAbility.can(alias, subject, field))
|
3552
|
+
);
|
3484
3553
|
};
|
3485
3554
|
const cannot = (action, entity, field) => {
|
3486
|
-
|
3555
|
+
const subject = toSubject(entity);
|
3556
|
+
const aliases = actionProvider.unstable_aliases(action, model);
|
3557
|
+
return (
|
3558
|
+
// Test both the original action
|
3559
|
+
userAbility.cannot(action, subject, field) && // and every known alias, if all of them fail (cannot), then the user truly "cannot"
|
3560
|
+
aliases.every((alias) => userAbility.cannot(alias, subject, field))
|
3561
|
+
);
|
3487
3562
|
};
|
3488
3563
|
const sanitizeOutput = (data, { action = ACTIONS.read } = {}) => {
|
3489
3564
|
return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });
|
@@ -4015,7 +4090,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4015
4090
|
*/
|
4016
4091
|
async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
|
4017
4092
|
const versionsByLocale = groupBy("locale", allVersions);
|
4018
|
-
|
4093
|
+
if (version.locale) {
|
4094
|
+
delete versionsByLocale[version.locale];
|
4095
|
+
}
|
4019
4096
|
const model = strapi2.getModel(uid2);
|
4020
4097
|
const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
|
4021
4098
|
const traversalFunction = async (localeVersion) => traverseEntity(
|