@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.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,
|
@@ -1193,6 +1209,11 @@ const { createPolicy } = policy;
|
|
1193
1209
|
const hasPermissions = createPolicy({
|
1194
1210
|
name: "plugin::content-manager.hasPermissions",
|
1195
1211
|
validator: validateHasPermissionsInput,
|
1212
|
+
/**
|
1213
|
+
* NOTE: Action aliases are currently not checked at this level (policy).
|
1214
|
+
* This is currently the intended behavior to avoid changing the behavior of API related permissions.
|
1215
|
+
* If you want to add support for it, please create a dedicated RFC with a list of potential side effect this could have.
|
1216
|
+
*/
|
1196
1217
|
handler(ctx, config = {}) {
|
1197
1218
|
const { actions = [], hasAtLeastOne = false } = config;
|
1198
1219
|
const { userAbility } = ctx.state;
|
@@ -1673,7 +1694,7 @@ const updateDocument = async (ctx, opts) => {
|
|
1673
1694
|
throw new errors.ForbiddenError();
|
1674
1695
|
}
|
1675
1696
|
const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
|
1676
|
-
const setCreator = setCreatorFields({ user, isEdition: true });
|
1697
|
+
const setCreator = documentVersion ? setCreatorFields({ user, isEdition: true }) : setCreatorFields({ user });
|
1677
1698
|
const sanitizeFn = async.pipe(pickPermittedFields, setCreator);
|
1678
1699
|
const sanitizedBody = await sanitizeFn(body);
|
1679
1700
|
return documentManager2.update(documentVersion?.documentId || id, model, {
|
@@ -1745,7 +1766,7 @@ const collectionTypes = {
|
|
1745
1766
|
permissionChecker2,
|
1746
1767
|
model,
|
1747
1768
|
// @ts-expect-error TODO: fix
|
1748
|
-
{ id, locale, publishedAt: null },
|
1769
|
+
{ documentId: id, locale, publishedAt: null },
|
1749
1770
|
{ availableLocales: true, availableStatus: false }
|
1750
1771
|
);
|
1751
1772
|
ctx.body = { data: {}, meta };
|
@@ -1882,11 +1903,17 @@ const collectionTypes = {
|
|
1882
1903
|
}
|
1883
1904
|
const isUpdate = !isCreate;
|
1884
1905
|
if (isUpdate) {
|
1885
|
-
|
1886
|
-
if (!
|
1906
|
+
const documentExists = documentManager2.exists(model, id);
|
1907
|
+
if (!documentExists) {
|
1887
1908
|
throw new errors.NotFoundError("Document not found");
|
1888
1909
|
}
|
1889
|
-
|
1910
|
+
document = await documentManager2.findOne(id, model, { populate, locale });
|
1911
|
+
if (!document) {
|
1912
|
+
if (permissionChecker2.cannot.create({ locale }) || permissionChecker2.cannot.publish({ locale })) {
|
1913
|
+
throw new errors.ForbiddenError();
|
1914
|
+
}
|
1915
|
+
document = await updateDocument(ctx);
|
1916
|
+
} else if (permissionChecker2.can.update(document)) {
|
1890
1917
|
await updateDocument(ctx);
|
1891
1918
|
}
|
1892
1919
|
}
|
@@ -1948,7 +1975,9 @@ const collectionTypes = {
|
|
1948
1975
|
if (permissionChecker2.cannot.unpublish()) {
|
1949
1976
|
return ctx.forbidden();
|
1950
1977
|
}
|
1951
|
-
const { locale } = await getDocumentLocaleAndStatus(body, model
|
1978
|
+
const { locale } = await getDocumentLocaleAndStatus(body, model, {
|
1979
|
+
allowMultipleLocales: true
|
1980
|
+
});
|
1952
1981
|
const entityPromises = documentIds.map(
|
1953
1982
|
(documentId) => documentManager2.findLocales(documentId, model, { locale, isPublished: true })
|
1954
1983
|
);
|
@@ -2299,32 +2328,37 @@ const sanitizeMainField = (model, mainField, userAbility) => {
|
|
2299
2328
|
userAbility,
|
2300
2329
|
model: model.uid
|
2301
2330
|
});
|
2302
|
-
|
2331
|
+
const isMainFieldListable = isListable(model, mainField);
|
2332
|
+
const canReadMainField = permissionChecker2.can.read(null, mainField);
|
2333
|
+
if (!isMainFieldListable || !canReadMainField) {
|
2303
2334
|
return "id";
|
2304
2335
|
}
|
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";
|
2336
|
+
if (model.uid === "plugin::users-permissions.role") {
|
2337
|
+
return "name";
|
2316
2338
|
}
|
2317
2339
|
return mainField;
|
2318
2340
|
};
|
2319
|
-
const addStatusToRelations = async (
|
2320
|
-
if (!contentTypes$1.hasDraftAndPublish(strapi.
|
2341
|
+
const addStatusToRelations = async (targetUid, relations2) => {
|
2342
|
+
if (!contentTypes$1.hasDraftAndPublish(strapi.getModel(targetUid))) {
|
2321
2343
|
return relations2;
|
2322
2344
|
}
|
2323
2345
|
const documentMetadata2 = getService$1("document-metadata");
|
2324
|
-
|
2346
|
+
if (!relations2.length) {
|
2347
|
+
return relations2;
|
2348
|
+
}
|
2349
|
+
const firstRelation = relations2[0];
|
2350
|
+
const filters = {
|
2351
|
+
documentId: { $in: relations2.map((r) => r.documentId) },
|
2352
|
+
// NOTE: find the "opposite" status
|
2353
|
+
publishedAt: firstRelation.publishedAt !== null ? { $null: true } : { $notNull: true }
|
2354
|
+
};
|
2355
|
+
const availableStatus = await strapi.query(targetUid).findMany({
|
2356
|
+
select: ["id", "documentId", "locale", "updatedAt", "createdAt", "publishedAt"],
|
2357
|
+
filters
|
2358
|
+
});
|
2325
2359
|
return relations2.map((relation) => {
|
2326
|
-
const availableStatuses =
|
2327
|
-
(availableDocument) => availableDocument.documentId === relation.documentId
|
2360
|
+
const availableStatuses = availableStatus.filter(
|
2361
|
+
(availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
|
2328
2362
|
);
|
2329
2363
|
return {
|
2330
2364
|
...relation,
|
@@ -2345,11 +2379,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
|
|
2345
2379
|
const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
|
2346
2380
|
const isSourceLocalized = isLocalized(sourceModel);
|
2347
2381
|
const isTargetLocalized = isLocalized(targetModel);
|
2348
|
-
let validatedLocale = locale;
|
2349
|
-
if (!targetModel || !isTargetLocalized)
|
2350
|
-
validatedLocale = void 0;
|
2351
2382
|
return {
|
2352
|
-
locale
|
2383
|
+
locale,
|
2353
2384
|
isSourceLocalized,
|
2354
2385
|
isTargetLocalized
|
2355
2386
|
};
|
@@ -2452,7 +2483,7 @@ const relations = {
|
|
2452
2483
|
attribute,
|
2453
2484
|
fieldsToSelect,
|
2454
2485
|
mainField,
|
2455
|
-
source: { schema: sourceSchema },
|
2486
|
+
source: { schema: sourceSchema, isLocalized: isSourceLocalized },
|
2456
2487
|
target: { schema: targetSchema, isLocalized: isTargetLocalized },
|
2457
2488
|
sourceSchema,
|
2458
2489
|
targetSchema,
|
@@ -2474,7 +2505,8 @@ const relations = {
|
|
2474
2505
|
fieldsToSelect,
|
2475
2506
|
mainField,
|
2476
2507
|
source: {
|
2477
|
-
schema: { uid: sourceUid, modelType: sourceModelType }
|
2508
|
+
schema: { uid: sourceUid, modelType: sourceModelType },
|
2509
|
+
isLocalized: isSourceLocalized
|
2478
2510
|
},
|
2479
2511
|
target: {
|
2480
2512
|
schema: { uid: targetUid },
|
@@ -2512,12 +2544,16 @@ const relations = {
|
|
2512
2544
|
} else {
|
2513
2545
|
where.id = id;
|
2514
2546
|
}
|
2515
|
-
|
2516
|
-
|
2547
|
+
const publishedAt = getPublishedAtClause(status, targetUid);
|
2548
|
+
if (!isEmpty(publishedAt)) {
|
2549
|
+
where[`${alias}.published_at`] = publishedAt;
|
2517
2550
|
}
|
2518
|
-
if (
|
2551
|
+
if (isTargetLocalized && locale) {
|
2519
2552
|
where[`${alias}.locale`] = locale;
|
2520
2553
|
}
|
2554
|
+
if (isSourceLocalized && locale) {
|
2555
|
+
where.locale = locale;
|
2556
|
+
}
|
2521
2557
|
if ((idsToInclude?.length ?? 0) !== 0) {
|
2522
2558
|
where[`${alias}.id`].$notIn = idsToInclude;
|
2523
2559
|
}
|
@@ -2535,7 +2571,8 @@ const relations = {
|
|
2535
2571
|
id: { $notIn: uniq(idsToOmit) }
|
2536
2572
|
});
|
2537
2573
|
}
|
2538
|
-
const
|
2574
|
+
const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
|
2575
|
+
const res = await strapi.db.query(targetUid).findPage(dbQuery);
|
2539
2576
|
ctx.body = {
|
2540
2577
|
...res,
|
2541
2578
|
results: await addStatusToRelations(targetUid, res.results)
|
@@ -2550,29 +2587,39 @@ const relations = {
|
|
2550
2587
|
attribute,
|
2551
2588
|
targetField,
|
2552
2589
|
fieldsToSelect,
|
2553
|
-
|
2554
|
-
|
2555
|
-
}
|
2556
|
-
target: {
|
2557
|
-
schema: { uid: targetUid }
|
2558
|
-
}
|
2590
|
+
status,
|
2591
|
+
source: { schema: sourceSchema },
|
2592
|
+
target: { schema: targetSchema }
|
2559
2593
|
} = await this.extractAndValidateRequestInfo(ctx, id);
|
2594
|
+
const { uid: sourceUid } = sourceSchema;
|
2595
|
+
const { uid: targetUid } = targetSchema;
|
2560
2596
|
const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
|
2561
2597
|
const dbQuery = strapi.db.query(sourceUid);
|
2562
2598
|
const loadRelations = relations$1.isAnyToMany(attribute) ? (...args) => dbQuery.loadPages(...args) : (...args) => dbQuery.load(...args).then((res2) => ({ results: res2 ? [res2] : [] }));
|
2599
|
+
const filters = {};
|
2600
|
+
if (sourceSchema?.options?.draftAndPublish) {
|
2601
|
+
if (targetSchema?.options?.draftAndPublish) {
|
2602
|
+
if (status === "published") {
|
2603
|
+
filters.publishedAt = { $notNull: true };
|
2604
|
+
} else {
|
2605
|
+
filters.publishedAt = { $null: true };
|
2606
|
+
}
|
2607
|
+
}
|
2608
|
+
} else if (targetSchema?.options?.draftAndPublish) {
|
2609
|
+
filters.publishedAt = { $null: true };
|
2610
|
+
}
|
2563
2611
|
const res = await loadRelations({ id: entryId }, targetField, {
|
2564
|
-
select: ["id", "documentId", "locale", "publishedAt"],
|
2612
|
+
select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
|
2565
2613
|
ordering: "desc",
|
2566
2614
|
page: ctx.request.query.page,
|
2567
|
-
pageSize: ctx.request.query.pageSize
|
2615
|
+
pageSize: ctx.request.query.pageSize,
|
2616
|
+
filters
|
2568
2617
|
});
|
2569
2618
|
const loadedIds = res.results.map((item) => item.id);
|
2570
2619
|
addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
|
2571
2620
|
const sanitizedRes = await loadRelations({ id: entryId }, targetField, {
|
2572
2621
|
...strapi.get("query-params").transform(targetUid, permissionQuery),
|
2573
|
-
ordering: "desc"
|
2574
|
-
page: ctx.request.query.page,
|
2575
|
-
pageSize: ctx.request.query.pageSize
|
2622
|
+
ordering: "desc"
|
2576
2623
|
});
|
2577
2624
|
const relationsUnion = uniqBy("id", concat(sanitizedRes.results, res.results));
|
2578
2625
|
ctx.body = {
|
@@ -2659,7 +2706,7 @@ const singleTypes = {
|
|
2659
2706
|
permissionChecker2,
|
2660
2707
|
model,
|
2661
2708
|
// @ts-expect-error - fix types
|
2662
|
-
{
|
2709
|
+
{ documentId: document.documentId, locale, publishedAt: null },
|
2663
2710
|
{ availableLocales: true, availableStatus: false }
|
2664
2711
|
);
|
2665
2712
|
ctx.body = { data: {}, meta };
|
@@ -3478,12 +3525,27 @@ const createPermissionChecker = (strapi2) => ({ userAbility, model }) => {
|
|
3478
3525
|
ability: userAbility,
|
3479
3526
|
model
|
3480
3527
|
});
|
3481
|
-
const
|
3528
|
+
const { actionProvider } = strapi2.service("admin::permission");
|
3529
|
+
const toSubject = (entity) => {
|
3530
|
+
return entity ? permissionsManager.toSubject(entity, model) : model;
|
3531
|
+
};
|
3482
3532
|
const can = (action, entity, field) => {
|
3483
|
-
|
3533
|
+
const subject = toSubject(entity);
|
3534
|
+
const aliases = actionProvider.unstable_aliases(action, model);
|
3535
|
+
return (
|
3536
|
+
// Test the original action to see if it passes
|
3537
|
+
userAbility.can(action, subject, field) || // Else try every known alias if at least one of them succeed, then the user "can"
|
3538
|
+
aliases.some((alias) => userAbility.can(alias, subject, field))
|
3539
|
+
);
|
3484
3540
|
};
|
3485
3541
|
const cannot = (action, entity, field) => {
|
3486
|
-
|
3542
|
+
const subject = toSubject(entity);
|
3543
|
+
const aliases = actionProvider.unstable_aliases(action, model);
|
3544
|
+
return (
|
3545
|
+
// Test both the original action
|
3546
|
+
userAbility.cannot(action, subject, field) && // and every known alias, if all of them fail (cannot), then the user truly "cannot"
|
3547
|
+
aliases.every((alias) => userAbility.cannot(alias, subject, field))
|
3548
|
+
);
|
3487
3549
|
};
|
3488
3550
|
const sanitizeOutput = (data, { action = ACTIONS.read } = {}) => {
|
3489
3551
|
return permissionsManager.sanitizeOutput(data, { subject: toSubject(data), action });
|
@@ -4015,7 +4077,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
|
|
4015
4077
|
*/
|
4016
4078
|
async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
|
4017
4079
|
const versionsByLocale = groupBy("locale", allVersions);
|
4018
|
-
|
4080
|
+
if (version.locale) {
|
4081
|
+
delete versionsByLocale[version.locale];
|
4082
|
+
}
|
4019
4083
|
const model = strapi2.getModel(uid2);
|
4020
4084
|
const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
|
4021
4085
|
const traversalFunction = async (localeVersion) => traverseEntity(
|