@strapi/content-manager 0.0.0-experimental.abc → 0.0.0-experimental.b1d7921ddb1b36c84b58a3946e1dc9dbda91b2dc
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-KXSuLnQD.js → ComponentConfigurationPage-CQDCxI8x.js} +3 -3
- package/dist/_chunks/{ComponentConfigurationPage-KXSuLnQD.js.map → ComponentConfigurationPage-CQDCxI8x.js.map} +1 -1
- package/dist/_chunks/{ComponentConfigurationPage-B3yDbeU1.mjs → ComponentConfigurationPage-jmWwucg_.mjs} +3 -3
- package/dist/_chunks/{ComponentConfigurationPage-B3yDbeU1.mjs.map → ComponentConfigurationPage-jmWwucg_.mjs.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-BQ17--5R.js → EditConfigurationPage-Ce4bIm4n.js} +3 -3
- package/dist/_chunks/{EditConfigurationPage-BQ17--5R.js.map → EditConfigurationPage-Ce4bIm4n.js.map} +1 -1
- package/dist/_chunks/{EditConfigurationPage-D7PrLO8j.mjs → EditConfigurationPage-W07CEdm2.mjs} +3 -3
- package/dist/_chunks/{EditConfigurationPage-D7PrLO8j.mjs.map → EditConfigurationPage-W07CEdm2.mjs.map} +1 -1
- package/dist/_chunks/{EditViewPage-BgjdnGz2.js → EditViewPage-CqHMM0P0.js} +15 -5
- package/dist/_chunks/EditViewPage-CqHMM0P0.js.map +1 -0
- package/dist/_chunks/{EditViewPage-B7VgwJaG.mjs → EditViewPage-al5OO1NR.mjs} +15 -5
- package/dist/_chunks/EditViewPage-al5OO1NR.mjs.map +1 -0
- package/dist/_chunks/{Field-CdK7ZLmv.js → Field-DSOUlTCm.js} +100 -87
- package/dist/_chunks/Field-DSOUlTCm.js.map +1 -0
- package/dist/_chunks/{Field-tHCw4lGA.mjs → Field-EeG6NQ7x.mjs} +97 -84
- package/dist/_chunks/Field-EeG6NQ7x.mjs.map +1 -0
- package/dist/_chunks/{Form-BJxdTv3Q.mjs → Form-BAo9ANb_.mjs} +16 -8
- package/dist/_chunks/Form-BAo9ANb_.mjs.map +1 -0
- package/dist/_chunks/{Form-C_0KTVvV.js → Form-DAEfHKzm.js} +16 -8
- package/dist/_chunks/Form-DAEfHKzm.js.map +1 -0
- package/dist/_chunks/{History-DR2txJLE.mjs → History-BpLIu67W.mjs} +24 -11
- package/dist/_chunks/History-BpLIu67W.mjs.map +1 -0
- package/dist/_chunks/{History-nuEzM5qm.js → History-CTFvy6XH.js} +23 -10
- package/dist/_chunks/History-CTFvy6XH.js.map +1 -0
- package/dist/_chunks/{ListConfigurationPage-CnB86Psm.js → ListConfigurationPage-CDzlMBz_.js} +2 -2
- package/dist/_chunks/{ListConfigurationPage-CnB86Psm.js.map → ListConfigurationPage-CDzlMBz_.js.map} +1 -1
- package/dist/_chunks/{ListConfigurationPage-voFVtXu6.mjs → ListConfigurationPage-DOqj5f8Y.mjs} +2 -2
- package/dist/_chunks/{ListConfigurationPage-voFVtXu6.mjs.map → ListConfigurationPage-DOqj5f8Y.mjs.map} +1 -1
- package/dist/_chunks/{ListViewPage-B_GaWgRH.mjs → ListViewPage-BbXYNI0v.mjs} +40 -36
- package/dist/_chunks/ListViewPage-BbXYNI0v.mjs.map +1 -0
- package/dist/_chunks/{ListViewPage-SXIXm-RM.js → ListViewPage-D0fpPYKp.js} +43 -39
- package/dist/_chunks/ListViewPage-D0fpPYKp.js.map +1 -0
- package/dist/_chunks/{NoContentTypePage-BzsQ3hLZ.js → NoContentTypePage-DTzkSAV5.js} +2 -2
- package/dist/_chunks/{NoContentTypePage-BzsQ3hLZ.js.map → NoContentTypePage-DTzkSAV5.js.map} +1 -1
- package/dist/_chunks/{NoContentTypePage-CYiGpsbj.mjs → NoContentTypePage-w2Q0VVOT.mjs} +2 -2
- package/dist/_chunks/{NoContentTypePage-CYiGpsbj.mjs.map → NoContentTypePage-w2Q0VVOT.mjs.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-IGkId4C5.js → NoPermissionsPage-BoI2rU68.js} +2 -2
- package/dist/_chunks/{NoPermissionsPage-IGkId4C5.js.map → NoPermissionsPage-BoI2rU68.js.map} +1 -1
- package/dist/_chunks/{NoPermissionsPage-B5baIHal.mjs → NoPermissionsPage-Km0Vk5Wp.mjs} +2 -2
- package/dist/_chunks/{NoPermissionsPage-B5baIHal.mjs.map → NoPermissionsPage-Km0Vk5Wp.mjs.map} +1 -1
- package/dist/_chunks/{Relations-CIYDdKU-.mjs → Relations-C_bpmSuQ.mjs} +50 -28
- package/dist/_chunks/Relations-C_bpmSuQ.mjs.map +1 -0
- package/dist/_chunks/{Relations-Dhuurpx2.js → Relations-D6Nz5ksc.js} +50 -28
- package/dist/_chunks/Relations-D6Nz5ksc.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-BsMu2oVP.js} +1907 -1762
- package/dist/_chunks/index-BsMu2oVP.js.map +1 -0
- package/dist/_chunks/{index-C9TJPyni.mjs → index-DcQ6xogO.mjs} +1926 -1782
- package/dist/_chunks/index-DcQ6xogO.mjs.map +1 -0
- package/dist/_chunks/{layout-C6dxWYT7.js → layout-B4aCAdTt.js} +5 -4
- package/dist/_chunks/{layout-C6dxWYT7.js.map → layout-B4aCAdTt.js.map} +1 -1
- package/dist/_chunks/{layout-BNqvLR_b.mjs → layout-BavJ6v4B.mjs} +5 -4
- package/dist/_chunks/{layout-BNqvLR_b.mjs.map → layout-BavJ6v4B.mjs.map} +1 -1
- package/dist/_chunks/{relations-CkKqKw65.mjs → relations-DMG453Od.mjs} +2 -2
- package/dist/_chunks/{relations-CkKqKw65.mjs.map → relations-DMG453Od.mjs.map} +1 -1
- package/dist/_chunks/{relations-DtFaDnP1.js → relations-Lrm9nz_m.js} +2 -2
- package/dist/_chunks/{relations-DtFaDnP1.js.map → relations-Lrm9nz_m.js.map} +1 -1
- 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/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 +117 -53
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +117 -53
- package/dist/server/index.mjs.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/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 +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/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
@@ -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,
|
@@ -1219,6 +1235,11 @@ const { createPolicy } = strapiUtils.policy;
|
|
1219
1235
|
const hasPermissions = createPolicy({
|
1220
1236
|
name: "plugin::content-manager.hasPermissions",
|
1221
1237
|
validator: validateHasPermissionsInput,
|
1238
|
+
/**
|
1239
|
+
* NOTE: Action aliases are currently not checked at this level (policy).
|
1240
|
+
* This is currently the intended behavior to avoid changing the behavior of API related permissions.
|
1241
|
+
* If you want to add support for it, please create a dedicated RFC with a list of potential side effect this could have.
|
1242
|
+
*/
|
1222
1243
|
handler(ctx, config = {}) {
|
1223
1244
|
const { actions = [], hasAtLeastOne = false } = config;
|
1224
1245
|
const { userAbility } = ctx.state;
|
@@ -1699,7 +1720,7 @@ const updateDocument = async (ctx, opts) => {
|
|
1699
1720
|
throw new strapiUtils.errors.ForbiddenError();
|
1700
1721
|
}
|
1701
1722
|
const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
|
1702
|
-
const setCreator = strapiUtils.setCreatorFields({ user, isEdition: true });
|
1723
|
+
const setCreator = documentVersion ? strapiUtils.setCreatorFields({ user, isEdition: true }) : strapiUtils.setCreatorFields({ user });
|
1703
1724
|
const sanitizeFn = strapiUtils.async.pipe(pickPermittedFields, setCreator);
|
1704
1725
|
const sanitizedBody = await sanitizeFn(body);
|
1705
1726
|
return documentManager2.update(documentVersion?.documentId || id, model, {
|
@@ -1771,7 +1792,7 @@ const collectionTypes = {
|
|
1771
1792
|
permissionChecker2,
|
1772
1793
|
model,
|
1773
1794
|
// @ts-expect-error TODO: fix
|
1774
|
-
{ id, locale, publishedAt: null },
|
1795
|
+
{ documentId: id, locale, publishedAt: null },
|
1775
1796
|
{ availableLocales: true, availableStatus: false }
|
1776
1797
|
);
|
1777
1798
|
ctx.body = { data: {}, meta };
|
@@ -1908,11 +1929,17 @@ const collectionTypes = {
|
|
1908
1929
|
}
|
1909
1930
|
const isUpdate = !isCreate;
|
1910
1931
|
if (isUpdate) {
|
1911
|
-
|
1912
|
-
if (!
|
1932
|
+
const documentExists = documentManager2.exists(model, id);
|
1933
|
+
if (!documentExists) {
|
1913
1934
|
throw new strapiUtils.errors.NotFoundError("Document not found");
|
1914
1935
|
}
|
1915
|
-
|
1936
|
+
document = await documentManager2.findOne(id, model, { populate, locale });
|
1937
|
+
if (!document) {
|
1938
|
+
if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
|
1939
|
+
throw new strapiUtils.errors.ForbiddenError();
|
1940
|
+
}
|
1941
|
+
document = await updateDocument(ctx);
|
1942
|
+
} else if (permissionChecker2.can.update(document)) {
|
1916
1943
|
await updateDocument(ctx);
|
1917
1944
|
}
|
1918
1945
|
}
|
@@ -1974,7 +2001,9 @@ const collectionTypes = {
|
|
1974
2001
|
if (permissionChecker2.cannot.unpublish()) {
|
1975
2002
|
return ctx.forbidden();
|
1976
2003
|
}
|
1977
|
-
const { locale } = await getDocumentLocaleAndStatus(body, model
|
2004
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
2005
|
+
allowMultipleLocales: true
|
2006
|
+
});
|
1978
2007
|
const entityPromises = documentIds.map(
|
1979
2008
|
(documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
|
1980
2009
|
);
|
@@ -2325,32 +2354,37 @@ const sanitizeMainField = (model, mainField, userAbility) => {
|
|
2325
2354
|
userAbility,
|
2326
2355
|
model: model.uid
|
2327
2356
|
});
|
2328
|
-
|
2357
|
+
const isMainFieldListable = isListable(model, mainField);
|
2358
|
+
const canReadMainField = permissionChecker2.can.read(null, mainField);
|
2359
|
+
if (!isMainFieldListable || !canReadMainField) {
|
2329
2360
|
return "id";
|
2330
2361
|
}
|
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";
|
2362
|
+
if (model.uid === "plugin::users-permissions.role") {
|
2363
|
+
return "name";
|
2342
2364
|
}
|
2343
2365
|
return mainField;
|
2344
2366
|
};
|
2345
|
-
const addStatusToRelations = async (
|
2346
|
-
if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.
|
2367
|
+
const addStatusToRelations = async (targetUid, relations2) => {
|
2368
|
+
if (!strapiUtils.contentTypes.hasDraftAndPublish(strapi.getModel(targetUid))) {
|
2347
2369
|
return relations2;
|
2348
2370
|
}
|
2349
2371
|
const documentMetadata2 = getService$1("document-metadata");
|
2350
|
-
|
2372
|
+
if (!relations2.length) {
|
2373
|
+
return relations2;
|
2374
|
+
}
|
2375
|
+
const firstRelation = relations2[0];
|
2376
|
+
const filters = {
|
2377
|
+
documentId: { $in: relations2.map((r) => r.documentId) },
|
2378
|
+
// NOTE: find the "opposite" status
|
2379
|
+
publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
|
2380
|
+
};
|
2381
|
+
const availableStatus = await strapi.query(targetUid).findMany({
|
2382
|
+
select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
|
2383
|
+
filters
|
2384
|
+
});
|
2351
2385
|
return relations2.map((relation) => {
|
2352
|
-
const availableStatuses =
|
2353
|
-
(availableDocument) => availableDocument.documentId === relation.documentId
|
2386
|
+
const availableStatuses = availableStatus.filter(
|
2387
|
+
(availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
|
2354
2388
|
);
|
2355
2389
|
return {
|
2356
2390
|
...relation,
|
@@ -2371,11 +2405,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
|
|
2371
2405
|
const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
|
2372
2406
|
const isSourceLocalized = isLocalized(sourceModel);
|
2373
2407
|
const isTargetLocalized = isLocalized(targetModel);
|
2374
|
-
let validatedLocale = locale;
|
2375
|
-
if (!targetModel || !isTargetLocalized)
|
2376
|
-
validatedLocale = void 0;
|
2377
2408
|
return {
|
2378
|
-
locale
|
2409
|
+
locale,
|
2379
2410
|
isSourceLocalized,
|
2380
2411
|
isTargetLocalized
|
2381
2412
|
};
|
@@ -2478,7 +2509,7 @@ const relations = {
|
|
2478
2509
|
attribute,
|
2479
2510
|
fieldsToSelect,
|
2480
2511
|
mainField,
|
2481
|
-
source: { schema: sourceSchema },
|
2512
|
+
source: { schema: sourceSchema, isLocalized: isSourceLocalized },
|
2482
2513
|
target: { schema: targetSchema, isLocalized: isTargetLocalized },
|
2483
2514
|
sourceSchema,
|
2484
2515
|
targetSchema,
|
@@ -2500,7 +2531,8 @@ const relations = {
|
|
2500
2531
|
fieldsToSelect,
|
2501
2532
|
mainField,
|
2502
2533
|
source: {
|
2503
|
-
schema: { uid: sourceUid, modelType: sourceModelType }
|
2534
|
+
schema: { uid: sourceUid, modelType: sourceModelType },
|
2535
|
+
isLocalized: isSourceLocalized
|
2504
2536
|
},
|
2505
2537
|
target: {
|
2506
2538
|
schema: { uid: targetUid },
|
@@ -2538,12 +2570,16 @@ const relations = {
|
|
2538
2570
|
} else {
|
2539
2571
|
where.id = id;
|
2540
2572
|
}
|
2541
|
-
|
2542
|
-
|
2573
|
+
const publishedAt = getPublishedAtClause(status, targetUid);
|
2574
|
+
if (!fp.isEmpty(publishedAt)) {
|
2575
|
+
where[`${alias}.published_at`] = publishedAt;
|
2543
2576
|
}
|
2544
|
-
if (
|
2577
|
+
if (isTargetLocalized && locale) {
|
2545
2578
|
where[`${alias}.locale`] = locale;
|
2546
2579
|
}
|
2580
|
+
if (isSourceLocalized && locale) {
|
2581
|
+
where.locale = locale;
|
2582
|
+
}
|
2547
2583
|
if ((idsToInclude?.length ?? 0) !== 0) {
|
2548
2584
|
where[`${alias}.id`].$notIn = idsToInclude;
|
2549
2585
|
}
|
@@ -2561,7 +2597,8 @@ const relations = {
|
|
2561
2597
|
id: { $notIn: fp.uniq(idsToOmit) }
|
2562
2598
|
});
|
2563
2599
|
}
|
2564
|
-
const
|
2600
|
+
const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
|
2601
|
+
const res = await strapi.db.query(targetUid).findPage(dbQuery);
|
2565
2602
|
ctx.body = {
|
2566
2603
|
...res,
|
2567
2604
|
results: await addStatusToRelations(targetUid, res.results)
|
@@ -2576,29 +2613,39 @@ const relations = {
|
|
2576
2613
|
attribute,
|
2577
2614
|
targetField,
|
2578
2615
|
fieldsToSelect,
|
2579
|
-
|
2580
|
-
|
2581
|
-
}
|
2582
|
-
target: {
|
2583
|
-
schema: { uid: targetUid }
|
2584
|
-
}
|
2616
|
+
status,
|
2617
|
+
source: { schema: sourceSchema },
|
2618
|
+
target: { schema: targetSchema }
|
2585
2619
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2620
|
+
const { uid: sourceUid } = sourceSchema;
|
2621
|
+
const { uid: targetUid } = targetSchema;
|
2586
2622
|
const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
|
2587
2623
|
const dbQuery = strapi.db.query(sourceUid);
|
2588
2624
|
const loadRelations = strapiUtils.relations.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
|
2625
|
+
const filters = {};
|
2626
|
+
if (sourceSchema?.options?.draftAndPublish) {
|
2627
|
+
if (targetSchema?.options?.draftAndPublish) {
|
2628
|
+
if (status === "published") {
|
2629
|
+
filters.publishedAt = { $notNull: true };
|
2630
|
+
} else {
|
2631
|
+
filters.publishedAt = { $null: true };
|
2632
|
+
}
|
2633
|
+
}
|
2634
|
+
} else if (targetSchema?.options?.draftAndPublish) {
|
2635
|
+
filters.publishedAt = { $null: true };
|
2636
|
+
}
|
2589
2637
|
const res = await loadRelations({ id: entryId }, targetField, {
|
2590
|
-
select: ["id", "documentId", "locale", "publishedAt"],
|
2638
|
+
select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
|
2591
2639
|
ordering: "desc",
|
2592
2640
|
page: ctx.request.query.page,
|
2593
|
-
pageSize: ctx.request.query.pageSize
|
2641
|
+
pageSize: ctx.request.query.pageSize,
|
2642
|
+
filters
|
2594
2643
|
});
|
2595
2644
|
const loadedIds = res.results.map((item) => item.id);
|
2596
2645
|
addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
|
2597
2646
|
const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
|
2598
2647
|
...strapi.get("query-params").transform(targetUid, permissionQuery),
|
2599
|
-
ordering: "desc"
|
2600
|
-
page: ctx.request.query.page,
|
2601
|
-
pageSize: ctx.request.query.pageSize
|
2648
|
+
ordering: "desc"
|
2602
2649
|
});
|
2603
2650
|
const relationsUnion = fp.uniqBy("id", fp.concat(sanitizedRes.results, res.results));
|
2604
2651
|
ctx.body = {
|
@@ -2685,7 +2732,7 @@ const singleTypes = {
|
|
2685
2732
|
permissionChecker2,
|
2686
2733
|
model,
|
2687
2734
|
// @ts-expect-error - fix types
|
2688
|
-
{
|
2735
|
+
{ documentId: document.documentId, locale, publishedAt: null },
|
2689
2736
|
{ availableLocales: true, availableStatus: false }
|
2690
2737
|
);
|
2691
2738
|
ctx.body = { data: {}, meta };
|
@@ -3504,12 +3551,27 @@ const createPermissionChecker = (strapi2) => ({ userAbility, model }) => {
|
|
3504
3551
|
ability: userAbility,
|
3505
3552
|
model
|
3506
3553
|
});
|
3507
|
-
const
|
3554
|
+
const { actionProvider } = strapi2.service("admin::permission");
|
3555
|
+
const toSubject = (entity) => {
|
3556
|
+
return entity ? permissionsManager.toSubject(entity, model) : model;
|
3557
|
+
};
|
3508
3558
|
const can = (action, entity, field) => {
|
3509
|
-
|
3559
|
+
const subject = toSubject(entity);
|
3560
|
+
const aliases = actionProvider.unstable_aliases(action, model);
|
3561
|
+
return (
|
3562
|
+
// Test the original action to see if it passes
|
3563
|
+
userAbility.can(action, subject, field) || // Else try every known alias if at least one of them succeed, then the user "can"
|
3564
|
+
aliases.some((alias) => userAbility.can(alias, subject, field))
|
3565
|
+
);
|
3510
3566
|
};
|
3511
3567
|
const cannot = (action, entity, field) => {
|
3512
|
-
|
3568
|
+
const subject = toSubject(entity);
|
3569
|
+
const aliases = actionProvider.unstable_aliases(action, model);
|
3570
|
+
return (
|
3571
|
+
// Test both the original action
|
3572
|
+
userAbility.cannot(action, subject, field) && // and every known alias, if all of them fail (cannot), then the user truly "cannot"
|
3573
|
+
aliases.every((alias) => userAbility.cannot(alias, subject, field))
|
3574
|
+
);
|
3513
3575
|
};
|
3514
3576
|
const sanitizeOutput = (data, { action = ACTIONS.read } = {}) => {
|
3515
3577
|
return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });
|
@@ -4041,7 +4103,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4041
4103
|
*/
|
4042
4104
|
async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
|
4043
4105
|
const versionsByLocale = fp.groupBy("locale", allVersions);
|
4044
|
-
|
4106
|
+
if (version.locale) {
|
4107
|
+
delete versionsByLocale[version.locale];
|
4108
|
+
}
|
4045
4109
|
const model = strapi2.getModel(uid2);
|
4046
4110
|
const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
|
4047
4111
|
const traversalFunction = async (localeVersion) => strapiUtils.traverseEntity(
|