apostrophe 3.53.0 → 3.55.0

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 (77) hide show
  1. package/CHANGELOG.md +58 -1
  2. package/defaults.js +1 -0
  3. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextModeAndSettings.vue +5 -2
  4. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextTitle.vue +28 -19
  5. package/modules/@apostrophecms/any-doc-type/index.js +2 -2
  6. package/modules/@apostrophecms/any-page-type/index.js +2 -2
  7. package/modules/@apostrophecms/doc/index.js +55 -29
  8. package/modules/@apostrophecms/doc-type/index.js +11 -6
  9. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocContextMenu.vue +4 -440
  10. package/modules/@apostrophecms/doc-type/ui/apos/logic/AposDocContextMenu.js +445 -0
  11. package/modules/@apostrophecms/i18n/i18n/de.json +113 -105
  12. package/modules/@apostrophecms/i18n/i18n/es.json +10 -0
  13. package/modules/@apostrophecms/i18n/i18n/fr.json +8 -0
  14. package/modules/@apostrophecms/i18n/i18n/pt-BR.json +10 -0
  15. package/modules/@apostrophecms/i18n/i18n/sk.json +8 -0
  16. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManager.vue +1 -0
  17. package/modules/@apostrophecms/log/index.js +429 -0
  18. package/modules/@apostrophecms/login/index.js +47 -4
  19. package/modules/@apostrophecms/modal/ui/apos/components/AposDocsManagerToolbar.vue +14 -1
  20. package/modules/@apostrophecms/modal/ui/apos/mixins/AposEditorMixin.js +1 -1
  21. package/modules/@apostrophecms/module/index.js +32 -6
  22. package/modules/@apostrophecms/module/lib/log.js +68 -0
  23. package/modules/@apostrophecms/page/index.js +71 -19
  24. package/modules/@apostrophecms/page/lib/legacy-migrations.js +0 -57
  25. package/modules/@apostrophecms/page/ui/apos/components/AposPagesManager.vue +8 -285
  26. package/modules/@apostrophecms/page/ui/apos/logic/AposPagesManager.js +291 -0
  27. package/modules/@apostrophecms/page-type/index.js +39 -26
  28. package/modules/@apostrophecms/piece-type/index.js +19 -11
  29. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +1 -0
  30. package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +2 -357
  31. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArea.vue +2 -86
  32. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +2 -254
  33. package/modules/@apostrophecms/schema/ui/apos/components/AposInputAttachment.vue +2 -77
  34. package/modules/@apostrophecms/schema/ui/apos/components/AposInputBoolean.vue +2 -44
  35. package/modules/@apostrophecms/schema/ui/apos/components/AposInputCheckboxes.vue +2 -64
  36. package/modules/@apostrophecms/schema/ui/apos/components/AposInputColor.vue +2 -94
  37. package/modules/@apostrophecms/schema/ui/apos/components/AposInputDateAndTime.vue +3 -47
  38. package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +2 -82
  39. package/modules/@apostrophecms/schema/ui/apos/components/AposInputPassword.vue +2 -37
  40. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRadio.vue +2 -26
  41. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRange.vue +2 -57
  42. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRelationship.vue +2 -259
  43. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSelect.vue +2 -38
  44. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +2 -275
  45. package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +2 -167
  46. package/modules/@apostrophecms/schema/ui/apos/components/AposInputWrapper.vue +2 -115
  47. package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +3 -279
  48. package/modules/@apostrophecms/schema/ui/apos/components/AposSearchList.vue +2 -83
  49. package/modules/@apostrophecms/schema/ui/apos/lib/detectChange.js +10 -1
  50. package/modules/@apostrophecms/schema/ui/apos/logic/AposArrayEditor.js +361 -0
  51. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArea.js +89 -0
  52. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArray.js +257 -0
  53. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputAttachment.js +81 -0
  54. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputBoolean.js +48 -0
  55. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputCheckboxes.js +68 -0
  56. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputColor.js +98 -0
  57. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputDateAndTime.js +49 -0
  58. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputObject.js +86 -0
  59. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputPassword.js +41 -0
  60. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRadio.js +29 -0
  61. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRange.js +60 -0
  62. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRelationship.js +262 -0
  63. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputSelect.js +41 -0
  64. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputSlug.js +278 -0
  65. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputString.js +170 -0
  66. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputWrapper.js +118 -0
  67. package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +281 -0
  68. package/modules/@apostrophecms/schema/ui/apos/logic/AposSearchList.js +85 -0
  69. package/modules/@apostrophecms/template/index.js +1 -1
  70. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeHeader.vue +2 -2
  71. package/modules/@apostrophecms/util/index.js +83 -13
  72. package/modules/@apostrophecms/util/lib/logger.js +19 -17
  73. package/package.json +1 -1
  74. package/test/docs.js +35 -2
  75. package/test/log.js +1765 -0
  76. package/test/pages.js +57 -0
  77. package/test-lib/util.js +1 -1
package/test/pages.js CHANGED
@@ -335,6 +335,27 @@ describe('Pages', function() {
335
335
  assert(subPage.level === 3);
336
336
  });
337
337
 
338
+ it('is able to insert a draft subpage from published parent id', async function() {
339
+
340
+ const subPageInfo = {
341
+ slug: '/parent/sub-draft-page',
342
+ visibility: 'public',
343
+ type: 'test-page',
344
+ title: 'Sub Draft Page'
345
+ };
346
+ console.log('PARENT PAGE', newPage);
347
+
348
+ const subPage = await apos.page.insert(
349
+ apos.task.getReq({ mode: 'draft' }),
350
+ // ensure it ends with ":published"
351
+ newPage._id.replace(':draft', ':published'),
352
+ 'lastChild',
353
+ subPageInfo
354
+ );
355
+ // Should not throw 'notfound'.
356
+ assert(subPage);
357
+ });
358
+
338
359
  // MOVING
339
360
 
340
361
  it('is able to move root/parent/sibling/cousin after root/parent', async function() {
@@ -386,6 +407,42 @@ describe('Pages', function() {
386
407
  assert.strictEqual(page.path, `${homeId.replace(':en:published', '')}/another-parent/parent/sibling`);
387
408
  });
388
409
 
410
+ it('inferred page relationships are correct', async function() {
411
+ const req = apos.task.getReq();
412
+ const pages = await apos.page.find(req, {}).toArray();
413
+ for (const page of pages) {
414
+ if (page.level === 0) {
415
+ continue;
416
+ }
417
+ const { lastTargetId, lastPosition } = await apos.page.inferLastTargetIdAndPosition(page);
418
+ const parentPath = page.path.split('/').slice(0, page.path.split('/').length - 1).join('/');
419
+ assert(pages.find(p => p.path === parentPath));
420
+ const peers = pages.filter(p => p.path.match(apos.page.matchDescendants(parentPath)) && (p.level === page.level));
421
+ if (peers.length === 1) {
422
+ const parent = pages.find(p => p._id === lastTargetId);
423
+ assert(parent);
424
+ assert(page.path.startsWith(parent.path));
425
+ assert([ 'firstChild', 'lastChild' ].includes(lastPosition));
426
+ } else if (page.rank === Math.max(...peers.map(peer => peer.rank))) {
427
+ assert.strictEqual(lastPosition, 'lastChild');
428
+ const parent = pages.find(p => p._id === lastTargetId);
429
+ assert(parent);
430
+ assert(page.path.startsWith(parent.path));
431
+ } else if (page.rank === Math.min(...peers.map(peer => peer.rank))) {
432
+ assert.strictEqual(lastPosition, 'firstChild');
433
+ const parent = pages.find(p => p._id === lastTargetId);
434
+ assert(parent);
435
+ assert(page.path.startsWith(parent.path));
436
+ } else if (lastPosition === 'after') {
437
+ const peer = pages.find(p => p._id === lastTargetId);
438
+ assert(peer);
439
+ assert(page.rank > peer.rank);
440
+ } else {
441
+ throw new Error(`Unexpected position for ${page.path}: ${lastPosition}`);
442
+ }
443
+ }
444
+ });
445
+
389
446
  it('should be able to serve a page', async function() {
390
447
  const response = await apos.http.get('/another-parent/parent/child', {
391
448
  fullResponse: true
package/test-lib/util.js CHANGED
@@ -29,7 +29,7 @@ async function destroy(apos) {
29
29
  }
30
30
  };
31
31
 
32
- async function create(options) {
32
+ async function create(options = {}) {
33
33
  const config = {
34
34
  shortName: options.shortName || `test-${cuid()}`,
35
35
  argv: {