@strapi/content-manager 0.0.0-experimental.9c5778c9200404fcee94d5a0fc88da5e4376b82c → 0.0.0-experimental.9c7de54d8ce77e13047fc15ada33f937a068f1f2

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.
Files changed (112) hide show
  1. package/dist/_chunks/{ComponentConfigurationPage-CpBFh6_r.mjs → ComponentConfigurationPage-CIjXcRAB.mjs} +4 -4
  2. package/dist/_chunks/{ComponentConfigurationPage-CpBFh6_r.mjs.map → ComponentConfigurationPage-CIjXcRAB.mjs.map} +1 -1
  3. package/dist/_chunks/{ComponentConfigurationPage-_zF8p6CY.js → ComponentConfigurationPage-gsCd80MU.js} +4 -4
  4. package/dist/_chunks/{ComponentConfigurationPage-_zF8p6CY.js.map → ComponentConfigurationPage-gsCd80MU.js.map} +1 -1
  5. package/dist/_chunks/{EditConfigurationPage-CE_yavTi.mjs → EditConfigurationPage-BglmD_BF.mjs} +4 -4
  6. package/dist/_chunks/{EditConfigurationPage-CE_yavTi.mjs.map → EditConfigurationPage-BglmD_BF.mjs.map} +1 -1
  7. package/dist/_chunks/{EditConfigurationPage-_aG2DJSU.js → EditConfigurationPage-DHDQKBzw.js} +4 -4
  8. package/dist/_chunks/{EditConfigurationPage-_aG2DJSU.js.map → EditConfigurationPage-DHDQKBzw.js.map} +1 -1
  9. package/dist/_chunks/{EditViewPage-G9uNzwYL.js → EditViewPage-C4iTxUPU.js} +15 -5
  10. package/dist/_chunks/EditViewPage-C4iTxUPU.js.map +1 -0
  11. package/dist/_chunks/{EditViewPage-DeTn7rAF.mjs → EditViewPage-CiwVPMaK.mjs} +15 -5
  12. package/dist/_chunks/EditViewPage-CiwVPMaK.mjs.map +1 -0
  13. package/dist/_chunks/{Field-CnCKhI1R.mjs → Field-DIjL1b5d.mjs} +70 -26
  14. package/dist/_chunks/Field-DIjL1b5d.mjs.map +1 -0
  15. package/dist/_chunks/{Field-DDHUWEfV.js → Field-DhXEK8y1.js} +70 -26
  16. package/dist/_chunks/Field-DhXEK8y1.js.map +1 -0
  17. package/dist/_chunks/{Form-IvVVwqRL.mjs → Form-CmNesrvR.mjs} +3 -3
  18. package/dist/_chunks/Form-CmNesrvR.mjs.map +1 -0
  19. package/dist/_chunks/{Form-DYETaKUX.js → Form-CwmJ4sWe.js} +3 -3
  20. package/dist/_chunks/Form-CwmJ4sWe.js.map +1 -0
  21. package/dist/_chunks/{History-CnZDctSO.js → History-BLCCNgCt.js} +24 -11
  22. package/dist/_chunks/History-BLCCNgCt.js.map +1 -0
  23. package/dist/_chunks/{History-BMunT-do.mjs → History-D-99Wh30.mjs} +25 -12
  24. package/dist/_chunks/History-D-99Wh30.mjs.map +1 -0
  25. package/dist/_chunks/{ListConfigurationPage-BynalOp8.js → ListConfigurationPage-DxWpeZrO.js} +3 -3
  26. package/dist/_chunks/{ListConfigurationPage-BynalOp8.js.map → ListConfigurationPage-DxWpeZrO.js.map} +1 -1
  27. package/dist/_chunks/{ListConfigurationPage-CDqkCxgV.mjs → ListConfigurationPage-JPWZz7Kg.mjs} +3 -3
  28. package/dist/_chunks/{ListConfigurationPage-CDqkCxgV.mjs.map → ListConfigurationPage-JPWZz7Kg.mjs.map} +1 -1
  29. package/dist/_chunks/{ListViewPage-I88Ouzoq.js → ListViewPage-CIQekSFz.js} +22 -7
  30. package/dist/_chunks/ListViewPage-CIQekSFz.js.map +1 -0
  31. package/dist/_chunks/{ListViewPage-_5gS-DOF.mjs → ListViewPage-DSK3f0ST.mjs} +22 -7
  32. package/dist/_chunks/ListViewPage-DSK3f0ST.mjs.map +1 -0
  33. package/dist/_chunks/{NoContentTypePage-BaWQ7HsA.js → NoContentTypePage-C5cxKvC2.js} +2 -2
  34. package/dist/_chunks/{NoContentTypePage-BaWQ7HsA.js.map → NoContentTypePage-C5cxKvC2.js.map} +1 -1
  35. package/dist/_chunks/{NoContentTypePage-Dht-55hr.mjs → NoContentTypePage-D99LU1YP.mjs} +2 -2
  36. package/dist/_chunks/{NoContentTypePage-Dht-55hr.mjs.map → NoContentTypePage-D99LU1YP.mjs.map} +1 -1
  37. package/dist/_chunks/{NoPermissionsPage-Bs8D5W_v.mjs → NoPermissionsPage-DBrBw-0y.mjs} +2 -2
  38. package/dist/_chunks/{NoPermissionsPage-Bs8D5W_v.mjs.map → NoPermissionsPage-DBrBw-0y.mjs.map} +1 -1
  39. package/dist/_chunks/{NoPermissionsPage-DCVUh5at.js → NoPermissionsPage-Oy4tmUrW.js} +2 -2
  40. package/dist/_chunks/{NoPermissionsPage-DCVUh5at.js.map → NoPermissionsPage-Oy4tmUrW.js.map} +1 -1
  41. package/dist/_chunks/{Relations-Chdt5qWc.mjs → Relations-BBmhcWFV.mjs} +69 -36
  42. package/dist/_chunks/Relations-BBmhcWFV.mjs.map +1 -0
  43. package/dist/_chunks/{Relations-BPgFQeGj.js → Relations-eG-9p_qS.js} +68 -35
  44. package/dist/_chunks/Relations-eG-9p_qS.js.map +1 -0
  45. package/dist/_chunks/{en-BVzUkPxZ.js → en-Bm0D0IWz.js} +8 -8
  46. package/dist/_chunks/{en-BVzUkPxZ.js.map → en-Bm0D0IWz.js.map} +1 -1
  47. package/dist/_chunks/{en-CPTj6CjC.mjs → en-DKV44jRb.mjs} +8 -8
  48. package/dist/_chunks/{en-CPTj6CjC.mjs.map → en-DKV44jRb.mjs.map} +1 -1
  49. package/dist/_chunks/{index-BhbLFX4l.js → index-BIWDoFLK.js} +957 -868
  50. package/dist/_chunks/index-BIWDoFLK.js.map +1 -0
  51. package/dist/_chunks/{index-D4UGPFZC.mjs → index-BrUzbQ30.mjs} +958 -870
  52. package/dist/_chunks/index-BrUzbQ30.mjs.map +1 -0
  53. package/dist/_chunks/{layout-D4HI4_PS.mjs → layout-_5-cXs34.mjs} +3 -3
  54. package/dist/_chunks/{layout-D4HI4_PS.mjs.map → layout-_5-cXs34.mjs.map} +1 -1
  55. package/dist/_chunks/{layout-CYA7s0qO.js → layout-lMc9i1-Z.js} +3 -3
  56. package/dist/_chunks/{layout-CYA7s0qO.js.map → layout-lMc9i1-Z.js.map} +1 -1
  57. package/dist/_chunks/{objects-gigeqt7s.js → objects-BcXOv6_9.js} +2 -4
  58. package/dist/_chunks/{objects-gigeqt7s.js.map → objects-BcXOv6_9.js.map} +1 -1
  59. package/dist/_chunks/{objects-mKMAmfec.mjs → objects-D6yBsdmx.mjs} +2 -4
  60. package/dist/_chunks/{objects-mKMAmfec.mjs.map → objects-D6yBsdmx.mjs.map} +1 -1
  61. package/dist/_chunks/{relations-DDZ9OxNo.js → relations-BRHithi8.js} +3 -7
  62. package/dist/_chunks/relations-BRHithi8.js.map +1 -0
  63. package/dist/_chunks/{relations-1pXaYpBK.mjs → relations-B_VLk-DD.mjs} +3 -7
  64. package/dist/_chunks/relations-B_VLk-DD.mjs.map +1 -0
  65. package/dist/admin/index.js +2 -1
  66. package/dist/admin/index.js.map +1 -1
  67. package/dist/admin/index.mjs +3 -2
  68. package/dist/admin/src/exports.d.ts +1 -1
  69. package/dist/admin/src/hooks/useDocument.d.ts +32 -1
  70. package/dist/admin/src/pages/EditView/components/Header.d.ts +1 -0
  71. package/dist/admin/src/preview/constants.d.ts +1 -0
  72. package/dist/admin/src/preview/index.d.ts +4 -0
  73. package/dist/server/index.js +85 -32
  74. package/dist/server/index.js.map +1 -1
  75. package/dist/server/index.mjs +85 -32
  76. package/dist/server/index.mjs.map +1 -1
  77. package/dist/server/src/bootstrap.d.ts.map +1 -1
  78. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  79. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  80. package/dist/server/src/controllers/utils/metadata.d.ts +15 -1
  81. package/dist/server/src/controllers/utils/metadata.d.ts.map +1 -1
  82. package/dist/server/src/history/services/history.d.ts.map +1 -1
  83. package/dist/server/src/index.d.ts +4 -4
  84. package/dist/server/src/preview/constants.d.ts +2 -0
  85. package/dist/server/src/preview/constants.d.ts.map +1 -0
  86. package/dist/server/src/preview/index.d.ts +4 -0
  87. package/dist/server/src/preview/index.d.ts.map +1 -0
  88. package/dist/server/src/services/document-metadata.d.ts +8 -8
  89. package/dist/server/src/services/document-metadata.d.ts.map +1 -1
  90. package/dist/server/src/services/index.d.ts +4 -4
  91. package/dist/server/src/services/utils/configuration/index.d.ts +2 -2
  92. package/dist/server/src/services/utils/configuration/layouts.d.ts +2 -2
  93. package/dist/server/src/utils/index.d.ts +2 -0
  94. package/dist/server/src/utils/index.d.ts.map +1 -1
  95. package/package.json +12 -12
  96. package/dist/_chunks/EditViewPage-DeTn7rAF.mjs.map +0 -1
  97. package/dist/_chunks/EditViewPage-G9uNzwYL.js.map +0 -1
  98. package/dist/_chunks/Field-CnCKhI1R.mjs.map +0 -1
  99. package/dist/_chunks/Field-DDHUWEfV.js.map +0 -1
  100. package/dist/_chunks/Form-DYETaKUX.js.map +0 -1
  101. package/dist/_chunks/Form-IvVVwqRL.mjs.map +0 -1
  102. package/dist/_chunks/History-BMunT-do.mjs.map +0 -1
  103. package/dist/_chunks/History-CnZDctSO.js.map +0 -1
  104. package/dist/_chunks/ListViewPage-I88Ouzoq.js.map +0 -1
  105. package/dist/_chunks/ListViewPage-_5gS-DOF.mjs.map +0 -1
  106. package/dist/_chunks/Relations-BPgFQeGj.js.map +0 -1
  107. package/dist/_chunks/Relations-Chdt5qWc.mjs.map +0 -1
  108. package/dist/_chunks/index-BhbLFX4l.js.map +0 -1
  109. package/dist/_chunks/index-D4UGPFZC.mjs.map +0 -1
  110. package/dist/_chunks/relations-1pXaYpBK.mjs.map +0 -1
  111. package/dist/_chunks/relations-DDZ9OxNo.js.map +0 -1
  112. package/strapi-server.js +0 -3
@@ -367,7 +367,12 @@ const createHistoryService = ({ strapi: strapi2 }) => {
367
367
  if (userToPopulate == null) {
368
368
  return null;
369
369
  }
370
- return strapi2.query("admin::user").findOne({ where: { id: userToPopulate.id } });
370
+ return strapi2.query("admin::user").findOne({
371
+ where: {
372
+ ...userToPopulate.id ? { id: userToPopulate.id } : {},
373
+ ...userToPopulate.documentId ? { documentId: userToPopulate.documentId } : {}
374
+ }
375
+ });
371
376
  })
372
377
  );
373
378
  return {
@@ -664,7 +669,7 @@ const historyVersion = {
664
669
  }
665
670
  }
666
671
  };
667
- const getFeature = () => {
672
+ const getFeature$1 = () => {
668
673
  if (strapi.ee.features.isEnabled("cms-content-history")) {
669
674
  return {
670
675
  register({ strapi: strapi2 }) {
@@ -687,7 +692,7 @@ const getFeature = () => {
687
692
  }
688
693
  };
689
694
  };
690
- const history = getFeature();
695
+ const history = getFeature$1();
691
696
  const register = async ({ strapi: strapi2 }) => {
692
697
  await history.register?.({ strapi: strapi2 });
693
698
  };
@@ -695,6 +700,18 @@ const ALLOWED_WEBHOOK_EVENTS = {
695
700
  ENTRY_PUBLISH: "entry.publish",
696
701
  ENTRY_UNPUBLISH: "entry.unpublish"
697
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();
698
715
  const bootstrap = async () => {
699
716
  Object.entries(ALLOWED_WEBHOOK_EVENTS).forEach(([key, value]) => {
700
717
  strapi.get("webhookStore").addAllowedEvent(key, value);
@@ -704,6 +721,7 @@ const bootstrap = async () => {
704
721
  await getService$1("content-types").syncConfigurations();
705
722
  await getService$1("permission").registerPermissions();
706
723
  await history.bootstrap?.({ strapi });
724
+ await preview.bootstrap?.({ strapi });
707
725
  };
708
726
  const destroy = async ({ strapi: strapi2 }) => {
709
727
  await history.destroy?.({ strapi: strapi2 });
@@ -1689,7 +1707,7 @@ const updateDocument = async (ctx, opts) => {
1689
1707
  throw new errors.ForbiddenError();
1690
1708
  }
1691
1709
  const pickPermittedFields = documentVersion ? permissionChecker2.sanitizeUpdateInput(documentVersion) : permissionChecker2.sanitizeCreateInput;
1692
- const setCreator = setCreatorFields({ user, isEdition: true });
1710
+ const setCreator = documentVersion ? setCreatorFields({ user, isEdition: true }) : setCreatorFields({ user });
1693
1711
  const sanitizeFn = async.pipe(pickPermittedFields, setCreator);
1694
1712
  const sanitizedBody = await sanitizeFn(body);
1695
1713
  return documentManager2.update(documentVersion?.documentId || id, model, {
@@ -1898,11 +1916,17 @@ const collectionTypes = {
1898
1916
  }
1899
1917
  const isUpdate = !isCreate;
1900
1918
  if (isUpdate) {
1901
- document = await documentManager2.findOne(id, model, { populate, locale });
1902
- if (!document) {
1919
+ const documentExists = documentManager2.exists(model, id);
1920
+ if (!documentExists) {
1903
1921
  throw new errors.NotFoundError("Document not found");
1904
1922
  }
1905
- if (permissionChecker2.can.update(document)) {
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)) {
1906
1930
  await updateDocument(ctx);
1907
1931
  }
1908
1932
  }
@@ -2327,15 +2351,27 @@ const sanitizeMainField = (model, mainField, userAbility) => {
2327
2351
  }
2328
2352
  return mainField;
2329
2353
  };
2330
- const addStatusToRelations = async (uid2, relations2) => {
2331
- if (!contentTypes$1.hasDraftAndPublish(strapi.contentTypes[uid2])) {
2354
+ const addStatusToRelations = async (targetUid, relations2) => {
2355
+ if (!contentTypes$1.hasDraftAndPublish(strapi.getModel(targetUid))) {
2332
2356
  return relations2;
2333
2357
  }
2334
2358
  const documentMetadata2 = getService$1("document-metadata");
2335
- const documentsAvailableStatus = await documentMetadata2.getManyAvailableStatus(uid2, relations2);
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
+ });
2336
2372
  return relations2.map((relation) => {
2337
- const availableStatuses = documentsAvailableStatus.filter(
2338
- (availableDocument) => availableDocument.documentId === relation.documentId
2373
+ const availableStatuses = availableStatus.filter(
2374
+ (availableDocument) => availableDocument.documentId === relation.documentId && (relation.locale ? availableDocument.locale === relation.locale : true)
2339
2375
  );
2340
2376
  return {
2341
2377
  ...relation,
@@ -2356,11 +2392,8 @@ const validateLocale = (sourceUid, targetUid, locale) => {
2356
2392
  const isLocalized = strapi.plugin("i18n").service("content-types").isLocalizedContentType;
2357
2393
  const isSourceLocalized = isLocalized(sourceModel);
2358
2394
  const isTargetLocalized = isLocalized(targetModel);
2359
- let validatedLocale = locale;
2360
- if (!targetModel || !isTargetLocalized)
2361
- validatedLocale = void 0;
2362
2395
  return {
2363
- locale: validatedLocale,
2396
+ locale,
2364
2397
  isSourceLocalized,
2365
2398
  isTargetLocalized
2366
2399
  };
@@ -2463,7 +2496,7 @@ const relations = {
2463
2496
  attribute,
2464
2497
  fieldsToSelect,
2465
2498
  mainField,
2466
- source: { schema: sourceSchema },
2499
+ source: { schema: sourceSchema, isLocalized: isSourceLocalized },
2467
2500
  target: { schema: targetSchema, isLocalized: isTargetLocalized },
2468
2501
  sourceSchema,
2469
2502
  targetSchema,
@@ -2485,7 +2518,8 @@ const relations = {
2485
2518
  fieldsToSelect,
2486
2519
  mainField,
2487
2520
  source: {
2488
- schema: { uid: sourceUid, modelType: sourceModelType }
2521
+ schema: { uid: sourceUid, modelType: sourceModelType },
2522
+ isLocalized: isSourceLocalized
2489
2523
  },
2490
2524
  target: {
2491
2525
  schema: { uid: targetUid },
@@ -2523,12 +2557,16 @@ const relations = {
2523
2557
  } else {
2524
2558
  where.id = id;
2525
2559
  }
2526
- if (status) {
2527
- where[`${alias}.published_at`] = getPublishedAtClause(status, targetUid);
2560
+ const publishedAt = getPublishedAtClause(status, targetUid);
2561
+ if (!isEmpty(publishedAt)) {
2562
+ where[`${alias}.published_at`] = publishedAt;
2528
2563
  }
2529
- if (filterByLocale) {
2564
+ if (isTargetLocalized && locale) {
2530
2565
  where[`${alias}.locale`] = locale;
2531
2566
  }
2567
+ if (isSourceLocalized && locale) {
2568
+ where.locale = locale;
2569
+ }
2532
2570
  if ((idsToInclude?.length ?? 0) !== 0) {
2533
2571
  where[`${alias}.id`].$notIn = idsToInclude;
2534
2572
  }
@@ -2546,7 +2584,8 @@ const relations = {
2546
2584
  id: { $notIn: uniq(idsToOmit) }
2547
2585
  });
2548
2586
  }
2549
- const res = await strapi.db.query(targetUid).findPage(strapi.get("query-params").transform(targetUid, queryParams));
2587
+ const dbQuery = strapi.get("query-params").transform(targetUid, queryParams);
2588
+ const res = await strapi.db.query(targetUid).findPage(dbQuery);
2550
2589
  ctx.body = {
2551
2590
  ...res,
2552
2591
  results: await addStatusToRelations(targetUid, res.results)
@@ -2561,21 +2600,33 @@ const relations = {
2561
2600
  attribute,
2562
2601
  targetField,
2563
2602
  fieldsToSelect,
2564
- source: {
2565
- schema: { uid: sourceUid }
2566
- },
2567
- target: {
2568
- schema: { uid: targetUid }
2569
- }
2603
+ status,
2604
+ source: { schema: sourceSchema },
2605
+ target: { schema: targetSchema }
2570
2606
  } = await this.extractAndValidateRequestInfo(ctx, id);
2607
+ const { uid: sourceUid } = sourceSchema;
2608
+ const { uid: targetUid } = targetSchema;
2571
2609
  const permissionQuery = await getService$1("permission-checker").create({ userAbility, model: targetUid }).sanitizedQuery.read({ fields: fieldsToSelect });
2572
2610
  const dbQuery = strapi.db.query(sourceUid);
2573
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
+ }
2574
2624
  const res = await loadRelations({ id: entryId }, targetField, {
2575
- select: ["id", "documentId", "locale", "publishedAt"],
2625
+ select: ["id", "documentId", "locale", "publishedAt", "updatedAt"],
2576
2626
  ordering: "desc",
2577
2627
  page: ctx.request.query.page,
2578
- pageSize: ctx.request.query.pageSize
2628
+ pageSize: ctx.request.query.pageSize,
2629
+ filters
2579
2630
  });
2580
2631
  const loadedIds = res.results.map((item) => item.id);
2581
2632
  addFiltersClause(permissionQuery, { id: { $in: loadedIds } });
@@ -2668,7 +2719,7 @@ const singleTypes = {
2668
2719
  permissionChecker2,
2669
2720
  model,
2670
2721
  // @ts-expect-error - fix types
2671
- { id: document.documentId, locale, publishedAt: null },
2722
+ { documentId: document.documentId, locale, publishedAt: null },
2672
2723
  { availableLocales: true, availableStatus: false }
2673
2724
  );
2674
2725
  ctx.body = { data: {}, meta };
@@ -4039,7 +4090,9 @@ const documentMetadata = ({ strapi: strapi2 }) => ({
4039
4090
  */
4040
4091
  async getAvailableLocales(uid2, version, allVersions, validatableFields = []) {
4041
4092
  const versionsByLocale = groupBy("locale", allVersions);
4042
- delete versionsByLocale[version.locale];
4093
+ if (version.locale) {
4094
+ delete versionsByLocale[version.locale];
4095
+ }
4043
4096
  const model = strapi2.getModel(uid2);
4044
4097
  const keysToKeep = [...AVAILABLE_LOCALES_FIELDS, ...validatableFields];
4045
4098
  const traversalFunction = async (localeVersion) => traverseEntity(