apostrophe 3.63.3 → 4.1.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 (184) hide show
  1. package/.eslintrc +13 -4
  2. package/CHANGELOG.md +37 -5
  3. package/defaults.js +2 -1
  4. package/modules/@apostrophecms/admin-bar/ui/apos/apps/AposAdminBar.js +7 -17
  5. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBar.vue +14 -16
  6. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarLocale.vue +1 -1
  7. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarMenu.vue +22 -15
  8. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarUser.vue +2 -2
  9. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextBar.vue +13 -8
  10. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextModeAndSettings.vue +18 -10
  11. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextTitle.vue +4 -4
  12. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextUndoRedo.vue +14 -8
  13. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposSavingIndicator.vue +2 -1
  14. package/modules/@apostrophecms/area/ui/apos/apps/AposAreas.js +36 -54
  15. package/modules/@apostrophecms/area/ui/apos/components/AposAreaContextualMenu.vue +20 -25
  16. package/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +5 -12
  17. package/modules/@apostrophecms/area/ui/apos/components/AposAreaExpandedMenu.vue +11 -3
  18. package/modules/@apostrophecms/area/ui/apos/components/AposAreaMenu.vue +6 -6
  19. package/modules/@apostrophecms/area/ui/apos/components/AposAreaMenuItem.vue +3 -2
  20. package/modules/@apostrophecms/area/ui/apos/components/AposAreaWidget.vue +31 -44
  21. package/modules/@apostrophecms/area/ui/apos/components/AposWidgetControls.vue +16 -16
  22. package/modules/@apostrophecms/asset/index.js +25 -12
  23. package/modules/@apostrophecms/asset/lib/webpack/apos/webpack.config.js +3 -3
  24. package/modules/@apostrophecms/asset/lib/webpack/apos/webpack.vue.js +7 -1
  25. package/modules/@apostrophecms/attachment/index.js +2 -1
  26. package/modules/@apostrophecms/attachment/public/img/missing-icon.svg +14 -0
  27. package/modules/@apostrophecms/busy/ui/apos/apps/AposBusy.js +8 -7
  28. package/modules/@apostrophecms/busy/ui/apos/components/TheAposBusy.vue +1 -1
  29. package/modules/@apostrophecms/command-menu/ui/apos/apps/AposCommandMenu.js +11 -29
  30. package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuKey.vue +1 -1
  31. package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuShortcut.vue +6 -6
  32. package/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue +10 -7
  33. package/modules/@apostrophecms/doc-type/index.js +34 -13
  34. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocContextMenu.vue +3 -3
  35. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue +20 -15
  36. package/modules/@apostrophecms/doc-type/ui/apos/logic/AposDocContextMenu.js +1 -1
  37. package/modules/@apostrophecms/i18n/i18n/en.json +13 -0
  38. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalize.vue +209 -33
  39. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalizeErrors.vue +3 -3
  40. package/modules/@apostrophecms/image/ui/apos/components/AposImageCropper.vue +5 -5
  41. package/modules/@apostrophecms/image/ui/apos/components/AposImageRelationshipEditor.vue +6 -6
  42. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManager.vue +23 -16
  43. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerDisplay.vue +11 -11
  44. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerEditor.vue +28 -21
  45. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerSelections.vue +4 -3
  46. package/modules/@apostrophecms/image/ui/apos/components/AposMediaUploader.vue +5 -4
  47. package/modules/@apostrophecms/login/index.js +18 -1
  48. package/modules/@apostrophecms/login/ui/apos/apps/AposLogin.js +6 -7
  49. package/modules/@apostrophecms/login/ui/apos/components/AposForgotPasswordForm.vue +3 -3
  50. package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +10 -10
  51. package/modules/@apostrophecms/login/ui/apos/components/AposResetPasswordForm.vue +3 -3
  52. package/modules/@apostrophecms/login/ui/apos/components/TheAposLogin.vue +2 -2
  53. package/modules/@apostrophecms/login/ui/apos/logic/AposLoginForm.js +1 -16
  54. package/modules/@apostrophecms/modal/ui/apos/apps/AposModals.js +60 -87
  55. package/modules/@apostrophecms/modal/ui/apos/components/AposDocsManagerToolbar.vue +15 -11
  56. package/modules/@apostrophecms/modal/ui/apos/components/AposModal.vue +17 -11
  57. package/modules/@apostrophecms/modal/ui/apos/components/AposModalBreadcrumbs.vue +7 -4
  58. package/modules/@apostrophecms/modal/ui/apos/components/AposModalConfirm.vue +9 -9
  59. package/modules/@apostrophecms/modal/ui/apos/components/AposModalLip.vue +2 -2
  60. package/modules/@apostrophecms/modal/ui/apos/components/AposModalShareDraft.vue +8 -8
  61. package/modules/@apostrophecms/modal/ui/apos/components/AposModalTabs.vue +4 -3
  62. package/modules/@apostrophecms/modal/ui/apos/components/AposModalToolbar.vue +7 -7
  63. package/modules/@apostrophecms/modal/ui/apos/components/TheAposModals.vue +22 -4
  64. package/modules/@apostrophecms/modal/ui/apos/composables/AposFocus.js +95 -0
  65. package/modules/@apostrophecms/modal/ui/apos/mixins/AposDocsManagerMixin.js +2 -3
  66. package/modules/@apostrophecms/modal/ui/apos/mixins/AposEditorMixin.js +6 -0
  67. package/modules/@apostrophecms/notification/index.js +4 -4
  68. package/modules/@apostrophecms/notification/ui/apos/apps/AposNotification.js +6 -9
  69. package/modules/@apostrophecms/notification/ui/apos/components/AposNotification.vue +12 -8
  70. package/modules/@apostrophecms/notification/ui/apos/components/TheAposNotifications.vue +4 -2
  71. package/modules/@apostrophecms/oembed-field/ui/apos/components/AposInputOembed.vue +12 -10
  72. package/modules/@apostrophecms/page/index.js +1 -0
  73. package/modules/@apostrophecms/page/ui/apos/components/AposPagesManager.vue +15 -11
  74. package/modules/@apostrophecms/page/ui/apos/logic/AposPagesManager.js +1 -1
  75. package/modules/@apostrophecms/permission/ui/apos/components/AposInputRole.vue +3 -3
  76. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +25 -17
  77. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManagerDisplay.vue +24 -20
  78. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManagerSelectBox.vue +9 -5
  79. package/modules/@apostrophecms/piece-type/ui/apos/components/AposRelationshipEditor.vue +15 -11
  80. package/modules/@apostrophecms/rich-text-widget/index.js +1 -0
  81. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposImageControlDialog.vue +7 -6
  82. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +31 -30
  83. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapAnchor.vue +12 -10
  84. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapButton.vue +1 -1
  85. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapImage.vue +1 -1
  86. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapLink.vue +9 -8
  87. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapStyles.vue +3 -3
  88. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapTable.vue +3 -3
  89. package/modules/@apostrophecms/schema/index.js +69 -8
  90. package/modules/@apostrophecms/schema/lib/addFieldTypes.js +1 -1
  91. package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +10 -8
  92. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArea.vue +5 -3
  93. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +81 -277
  94. package/modules/@apostrophecms/schema/ui/apos/components/AposInputAttachment.vue +4 -2
  95. package/modules/@apostrophecms/schema/ui/apos/components/AposInputBoolean.vue +24 -14
  96. package/modules/@apostrophecms/schema/ui/apos/components/AposInputCheckboxes.vue +7 -6
  97. package/modules/@apostrophecms/schema/ui/apos/components/AposInputColor.vue +10 -7
  98. package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +3 -3
  99. package/modules/@apostrophecms/schema/ui/apos/components/AposInputPassword.vue +6 -4
  100. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRadio.vue +5 -4
  101. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRange.vue +9 -6
  102. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRelationship.vue +15 -12
  103. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSelect.vue +1 -1
  104. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +16 -12
  105. package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +19 -11
  106. package/modules/@apostrophecms/schema/ui/apos/components/AposInputWrapper.vue +15 -12
  107. package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +75 -22
  108. package/modules/@apostrophecms/schema/ui/apos/components/AposSearchList.vue +1 -1
  109. package/modules/@apostrophecms/schema/ui/apos/components/AposSubform.vue +2 -2
  110. package/modules/@apostrophecms/schema/ui/apos/logic/AposArrayEditor.js +0 -4
  111. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArea.js +3 -3
  112. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArray.js +15 -4
  113. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputAttachment.js +3 -3
  114. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputCheckboxes.js +7 -7
  115. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputColor.js +5 -8
  116. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputDateAndTime.js +1 -1
  117. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputObject.js +1 -1
  118. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRadio.js +1 -1
  119. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRelationship.js +12 -9
  120. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputSelect.js +3 -3
  121. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputString.js +7 -9
  122. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputWrapper.js +4 -4
  123. package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +42 -13
  124. package/modules/@apostrophecms/schema/ui/apos/logic/AposSubform.js +1 -1
  125. package/modules/@apostrophecms/schema/ui/apos/mixins/AposInputMixin.js +9 -9
  126. package/modules/@apostrophecms/schema/ui/apos/scss/AposInputArray.scss +205 -0
  127. package/modules/@apostrophecms/settings/ui/apos/components/AposSettingsManager.vue +5 -5
  128. package/modules/@apostrophecms/settings/ui/apos/logic/AposSettingsManager.js +4 -4
  129. package/modules/@apostrophecms/submitted-draft/ui/apos/components/AposSubmittedDraftIcon.vue +5 -4
  130. package/modules/@apostrophecms/task/index.js +2 -0
  131. package/modules/@apostrophecms/translation/index.js +233 -0
  132. package/modules/@apostrophecms/translation/ui/apos/components/AposTranslationIndicator.vue +84 -0
  133. package/modules/@apostrophecms/ui/ui/apos/components/AposAvatar.vue +2 -1
  134. package/modules/@apostrophecms/ui/ui/apos/components/AposButton.vue +4 -4
  135. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonGroup.vue +6 -6
  136. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonSplit.vue +120 -113
  137. package/modules/@apostrophecms/ui/ui/apos/components/AposCellButton.vue +2 -1
  138. package/modules/@apostrophecms/ui/ui/apos/components/AposCellLabels.vue +49 -5
  139. package/modules/@apostrophecms/ui/ui/apos/components/AposCheckbox.vue +19 -19
  140. package/modules/@apostrophecms/ui/ui/apos/components/AposCloudUploadIcon.vue +10 -5
  141. package/modules/@apostrophecms/ui/ui/apos/components/AposCombo.vue +15 -15
  142. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenu.vue +214 -191
  143. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuDialog.vue +77 -65
  144. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuItem.vue +1 -1
  145. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuTip.vue +28 -50
  146. package/modules/@apostrophecms/ui/ui/apos/components/AposEmptyState.vue +3 -3
  147. package/modules/@apostrophecms/ui/ui/apos/components/AposFile.vue +5 -5
  148. package/modules/@apostrophecms/ui/ui/apos/components/AposFilterMenu.vue +4 -4
  149. package/modules/@apostrophecms/ui/ui/apos/components/AposIndicator.vue +1 -1
  150. package/modules/@apostrophecms/ui/ui/apos/components/AposLabel.vue +1 -1
  151. package/modules/@apostrophecms/ui/ui/apos/components/AposMinMaxCount.vue +5 -5
  152. package/modules/@apostrophecms/ui/ui/apos/components/AposPager.vue +14 -8
  153. package/modules/@apostrophecms/ui/ui/apos/components/AposPagerDots.vue +2 -1
  154. package/modules/@apostrophecms/ui/ui/apos/components/AposSlat.vue +13 -12
  155. package/modules/@apostrophecms/ui/ui/apos/components/AposSlatList.vue +53 -59
  156. package/modules/@apostrophecms/ui/ui/apos/components/AposSpinner.vue +2 -2
  157. package/modules/@apostrophecms/ui/ui/apos/components/AposSubformPreview.vue +2 -2
  158. package/modules/@apostrophecms/ui/ui/apos/components/AposTag.vue +3 -2
  159. package/modules/@apostrophecms/ui/ui/apos/components/AposTagApply.vue +40 -35
  160. package/modules/@apostrophecms/ui/ui/apos/components/AposTagListItem.vue +2 -1
  161. package/modules/@apostrophecms/ui/ui/apos/components/AposToggle.vue +2 -2
  162. package/modules/@apostrophecms/ui/ui/apos/components/AposTree.vue +9 -11
  163. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeHeader.vue +5 -3
  164. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeRows.vue +129 -129
  165. package/modules/@apostrophecms/ui/ui/apos/composables/AposTheme.js +11 -0
  166. package/modules/@apostrophecms/ui/ui/apos/lib/click-outside-element.js +4 -4
  167. package/modules/@apostrophecms/ui/ui/apos/lib/i18next.js +56 -50
  168. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip.js +191 -0
  169. package/modules/@apostrophecms/ui/ui/apos/lib/vue.js +19 -10
  170. package/modules/@apostrophecms/ui/ui/apos/mixins/AposAdvisoryLockMixin.js +1 -1
  171. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tables.scss +1 -1
  172. package/modules/@apostrophecms/ui/ui/apos/scss/global/_theme.scss +1 -0
  173. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tooltips.scss +6 -22
  174. package/modules/@apostrophecms/ui/ui/apos/scss/shared/_table-rows.scss +1 -1
  175. package/modules/@apostrophecms/widget-type/index.js +8 -2
  176. package/modules/@apostrophecms/widget-type/ui/apos/components/AposWidgetEditor.vue +26 -22
  177. package/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +4 -4
  178. package/package.json +31 -44
  179. package/test/attachments.js +5 -0
  180. package/test/schemas.js +138 -0
  181. package/test/translation.js +538 -0
  182. package/test-lib/util.js +21 -0
  183. package/modules/@apostrophecms/ui/ui/apos/lib/localized-v-tooltip.js +0 -63
  184. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip-options.js +0 -13
package/.eslintrc CHANGED
@@ -34,8 +34,7 @@
34
34
  "vue/max-attributes-per-line": [
35
35
  "warn",
36
36
  {
37
- "singleline": 2,
38
- "multiline": 2
37
+ "singleline": 2
39
38
  }
40
39
  ],
41
40
  "vue/singleline-html-element-content-newline": [
@@ -51,10 +50,20 @@
51
50
  "textarea"
52
51
  ]
53
52
  }
54
- ],
55
- "vue/attributes-order": 0
53
+ ]
56
54
  },
57
55
  "overrides": [
56
+ {
57
+ "files": "*.vue",
58
+ "globals": {
59
+ "defineProps": "readable",
60
+ "defineEmits": "readable",
61
+ "defineExpose": "readable",
62
+ "defineOptions": "readable",
63
+ "defineModel": "readable",
64
+ "defineSlots": "readable"
65
+ }
66
+ },
58
67
  {
59
68
  "files": [
60
69
  "**/ui/**/*.js"
package/CHANGELOG.md CHANGED
@@ -1,17 +1,49 @@
1
1
  # Changelog
2
2
 
3
- ## 3.63.3 (2024-03-14)
3
+ ## 4.1.0 (2024-03-20)
4
+
5
+ ### Fixes
6
+
7
+ * Don't crash if a document of a type no longer corresponding to any module is present
8
+ together with the advanced permission module.
9
+ * AposLoginForm.js now pulls its schema from the user module rather than hardcoding it. Includes the
10
+ addition of `enterUsername` and `enterPassword` i18n fields for front end customization and localization.
11
+ * Simulated Express requests returned by `apos.task.getReq` now include a `req.headers` property, for
12
+ greater accuracy and to prevent unexpected bugs in other code.
13
+ * Fix the missing attachment icon. The responsibility for checking whether an attachment
14
+ actually exists before calling `attachment.url` still lies with the developer.
15
+
16
+ ### Adds
17
+
18
+ * Add new `getChanges` method to the schema module to get an array of document changed field names instead of just a boolean like does the `isEqual` method.
19
+ * Add highlight class in UI when comparing documents.
20
+
21
+ ## 4.0.0 (2024-03-12)
4
22
 
5
23
  ### Adds
6
24
 
7
- * Add translation keys used by the multisite assembly module. This was released ahead of
8
- our regular schedule because the multisite module was released early with the expectation
9
- that these keys would be present.
25
+ * Add translation keys used by the multisite assembly module.
26
+ * Add side by side comparison support in AposSchema component.
27
+ * Add `beforeLocalize` and `afterLocalize` events.
28
+ * Add custom manager indicators support via `apos.schema.addManagerIndicator({ component, props, if })`. The component registered this way will be automatically rendered in the manager modal.
29
+ * Add the possibility to make widget modals wider, which can be useful for widgets that contain areas taking significant space. See [documentation](https://v3.docs.apostrophecms.org/reference/modules/widget-type.html#options).
30
+ * Temporarily add `translation` module to support document translations via the `@apostrophecms-pro/automatic-translation` module.
31
+ **The `translation` core module may be removed or refactored to reduce overhead in the core,** so its presence should
32
+ not be relied upon.
33
+
34
+ ### Changes
35
+
36
+ * Migrate to Vue 3. This entails changes to some admin UI code, as detailed in our public announcement.
37
+ There are no other backwards incompatible changes in apostrophe version 4.0.0.
38
+ Certain other modules containing custom admin UI have also been updated in a new major version to be compatible,
39
+ as noted in our announcement and on the migration page of our website.
10
40
 
11
41
  ### Fixes
12
42
 
43
+ * Adds `textStyle` to Tiptap types so that spans are rendered on RT initialization
13
44
  * `field.help` and `field.htmlHelp` are now correctly translated when displayed in a tooltip.
14
- This was also an expectation for the multisite module.
45
+ * Bump the `he` package to most recent version.
46
+ * Notification REST APIs should not directly return the result of MongoDB operations.
15
47
 
16
48
  ## 3.63.2 (2024-03-01)
17
49
 
package/defaults.js CHANGED
@@ -55,6 +55,7 @@ module.exports = {
55
55
  '@apostrophecms/file-tag': {},
56
56
  '@apostrophecms/soft-redirect': {},
57
57
  '@apostrophecms/submitted-draft': {},
58
- '@apostrophecms/command-menu': {}
58
+ '@apostrophecms/command-menu': {},
59
+ '@apostrophecms/translation': {}
59
60
  }
60
61
  };
@@ -1,22 +1,12 @@
1
- import Vue from 'Modules/@apostrophecms/ui/lib/vue';
1
+ import createApp from 'Modules/@apostrophecms/ui/lib/vue';
2
2
 
3
3
  export default function() {
4
+ const component = apos.vueComponents.TheAposAdminBar;
4
5
  // Careful, login page is in user scene but has no admin bar
5
- if (apos.adminBar) {
6
- return new Vue({
7
- el: '#apos-admin-bar',
8
- computed: {
9
- apos () {
10
- return window.apos;
11
- }
12
- },
13
- render: function (h) {
14
- return h('TheAposAdminBar', {
15
- props: {
16
- items: apos.adminBar.items
17
- }
18
- });
19
- }
20
- });
6
+ const el = document.querySelector('#apos-admin-bar');
7
+ if (!apos.adminBar || !el) {
8
+ return;
21
9
  }
10
+ const app = createApp(component, { items: apos.adminBar.items || [] });
11
+ app.mount(el);
22
12
  };
@@ -4,8 +4,8 @@
4
4
  class="apos-admin-bar-wrapper"
5
5
  :class="themeClass"
6
6
  >
7
- <div class="apos-admin-bar-spacer" ref="spacer" />
8
- <nav class="apos-admin-bar" ref="adminBar">
7
+ <div ref="spacer" class="apos-admin-bar-spacer" />
8
+ <nav ref="adminBar" class="apos-admin-bar">
9
9
  <div class="apos-admin-bar__row">
10
10
  <AposLogoPadless class="apos-admin-bar__logo" />
11
11
  <TheAposAdminBarMenu :items="menuItems" />
@@ -18,10 +18,10 @@
18
18
  </div>
19
19
  <TheAposContextBar @visibility-changed="setSpacer" />
20
20
  <component
21
- v-for="bar in bars"
22
21
  v-bind="bar.props || {}"
23
- :key="bar.id"
24
22
  :is="bar.componentName"
23
+ v-for="bar in bars"
24
+ :key="bar.id"
25
25
  />
26
26
  </nav>
27
27
  </div>
@@ -36,9 +36,7 @@ export default {
36
36
  props: {
37
37
  items: {
38
38
  type: Array,
39
- default: function () {
40
- return [];
41
- }
39
+ required: true
42
40
  }
43
41
  },
44
42
  computed: {
@@ -55,7 +53,7 @@ export default {
55
53
  return this.moduleOptions.bars;
56
54
  }
57
55
  },
58
- async mounted() {
56
+ mounted() {
59
57
  this.setSpacer();
60
58
  },
61
59
  methods: {
@@ -86,7 +84,7 @@ export default {
86
84
  background: var(--a-background-primary);
87
85
  }
88
86
 
89
- ::v-deep .apos-admin-bar__row {
87
+ :deep(.apos-admin-bar__row) {
90
88
  display: flex;
91
89
  align-items: center;
92
90
  height: 35px;
@@ -100,7 +98,7 @@ export default {
100
98
  margin-right: 10px;
101
99
  }
102
100
 
103
- ::v-deep .apos-admin-bar__control-set {
101
+ :deep(.apos-admin-bar__control-set) {
104
102
  @include type-base;
105
103
  display: flex;
106
104
  width: 100%;
@@ -111,27 +109,27 @@ export default {
111
109
  margin-left: auto;
112
110
  }
113
111
 
114
- ::v-deep .apos-context-menu__pane {
112
+ :deep(.apos-context-menu__pane) {
115
113
  min-width: 150px;
116
114
  }
117
- ::v-deep .flip-enter { // to the ground
115
+ :deep(.flip-enter) { // to the ground
118
116
  transform: translateY(-20%);
119
117
  opacity: 0;
120
118
  }
121
- ::v-deep .flip-leave { // in the frame
119
+ :deep(.flip-leave) { // in the frame
122
120
  transform: translateY(0);
123
121
  opacity: 1;
124
122
  }
125
- ::v-deep .flip-enter-to { // from the ground
123
+ :deep(.flip-enter-to) { // from the ground
126
124
  transform: translateY(0);
127
125
  opacity: 1;
128
126
  }
129
- ::v-deep .flip-leave-to { // to the sky
127
+ :deep(.flip-leave-to) { // to the sky
130
128
  transform: translateY(20%);
131
129
  opacity: 0;
132
130
  }
133
131
 
134
- ::v-deep .flip-enter-active, ::v-deep .flip-leave-active {
132
+ :deep(.flip-enter-active), :deep(.flip-leave-active) {
135
133
  transition: all 150ms;
136
134
  &.apos-admin-bar__control-set__group {
137
135
  position: absolute;
@@ -212,7 +212,7 @@ export default {
212
212
  right: 0;
213
213
  }
214
214
 
215
- &::v-deep .apos-button__label {
215
+ &:deep(.apos-button__label) {
216
216
  @include type-small;
217
217
  color: var(--a-primary);
218
218
  font-weight: var(--a-weight-bold);
@@ -1,20 +1,24 @@
1
1
  <template>
2
2
  <ul class="apos-admin-bar__items">
3
- <li class="apos-admin-bar__item" v-if="pageTree">
3
+ <li v-if="pageTree" class="apos-admin-bar__item">
4
4
  <AposButton
5
- type="subtle" label="apostrophe:pages"
5
+ type="subtle"
6
+ label="apostrophe:pages"
6
7
  class="apos-admin-bar__btn"
7
8
  :modifiers="['no-motion']"
8
9
  @click="emitEvent('@apostrophecms/page:manager')"
9
10
  />
10
11
  </li>
11
12
  <li
12
- v-for="item in menuItems" :key="item.name"
13
+ v-for="item in menuItems"
14
+ :key="item.name"
13
15
  class="apos-admin-bar__item"
14
16
  >
15
17
  <AposContextMenu
16
- v-if="item.items" class="apos-admin-bar__sub"
17
- :menu="item.items" :button="{
18
+ v-if="item.items"
19
+ class="apos-admin-bar__sub"
20
+ :menu="item.items"
21
+ :button="{
18
22
  label: item.label,
19
23
  modifiers: ['no-motion'],
20
24
  class: 'apos-admin-bar__btn',
@@ -23,16 +27,16 @@
23
27
  @item-clicked="emitEvent"
24
28
  />
25
29
  <Component
26
- v-else
27
30
  :is="item.options && item.options.component || 'AposButton'"
31
+ v-else
28
32
  type="subtle"
29
- @click="emitEvent(item.action)"
30
33
  :label="item.label"
31
34
  :modifiers="['no-motion']"
32
35
  class="apos-admin-bar__btn"
36
+ @click="emitEvent(item.action)"
33
37
  />
34
38
  </li>
35
- <li class="apos-admin-bar__item" v-if="createMenu.length > 0">
39
+ <li v-if="createMenu.length > 0" class="apos-admin-bar__item">
36
40
  <AposContextMenu
37
41
  class="apos-admin-bar__create"
38
42
  :menu="createMenu"
@@ -52,16 +56,19 @@
52
56
  >
53
57
  <template v-for="item in trayItems">
54
58
  <Component
55
- v-if="item.options.component"
56
59
  :is="item.options.component"
60
+ v-if="item.options.component"
57
61
  :key="`${item.name}.component`"
58
62
  />
59
63
  <AposButton
60
64
  v-else
61
65
  :key="`${item.name}.fallback`"
62
- type="subtle" :modifiers="['small', 'no-motion']"
63
- :tooltip="trayItemTooltip(item)" class="apos-admin-bar__context-button"
64
- :icon="item.options.icon" :icon-only="true"
66
+ type="subtle"
67
+ :modifiers="['small', 'no-motion']"
68
+ :tooltip="trayItemTooltip(item)"
69
+ class="apos-admin-bar__context-button"
70
+ :icon="item.options.icon"
71
+ :icon-only="true"
65
72
  :label="item.label"
66
73
  :state="trayItemState[item.name] ? [ 'active' ] : []"
67
74
  @click="emitEvent(item.action)"
@@ -177,15 +184,15 @@ export default {
177
184
  align-items: center;
178
185
  }
179
186
 
180
- .apos-admin-bar__sub ::v-deep .apos-context-menu__btn {
187
+ .apos-admin-bar__sub :deep(.apos-context-menu__btn) {
181
188
  border-radius: 0;
182
189
  }
183
190
 
184
- .apos-admin-bar__sub ::v-deep .apos-context-menu__popup {
191
+ .apos-admin-bar__sub :deep(.apos-context-menu__popup) {
185
192
  top: calc(100% + 5px);
186
193
  }
187
194
 
188
- ::v-deep .apos-admin-bar__create {
195
+ :deep(.apos-admin-bar__create) {
189
196
  margin-left: 10px;
190
197
 
191
198
  .apos-context-menu__btn {
@@ -54,12 +54,12 @@ export default {
54
54
  display: inline-flex;
55
55
  align-items: center;
56
56
 
57
- ::v-deep .apos-button {
57
+ :deep(.apos-button) {
58
58
  @include type-base;
59
59
  color: var(--a-text-primary);
60
60
  }
61
61
 
62
- ::v-deep .apos-context-menu__popup {
62
+ :deep(.apos-context-menu__popup) {
63
63
  right: 0;
64
64
  transform: translatex(10px);
65
65
  }
@@ -5,12 +5,12 @@
5
5
  :v-if="editMode"
6
6
  :can-undo="canUndo"
7
7
  :can-redo="canRedo"
8
- @undo="undo"
9
- @redo="redo"
10
8
  :retrying="retrying"
11
9
  :editing="editing"
12
10
  :saving="saving"
13
11
  :saved="saved"
12
+ @undo="undo"
13
+ @redo="redo"
14
14
  />
15
15
  <TheAposContextTitle
16
16
  v-if="!hasCustomUi"
@@ -531,12 +531,17 @@ export default {
531
531
  }
532
532
 
533
533
  const { action } = window.apos.modules[this.context.type];
534
- const doc = await apos.http.get(`${action}/${this.context.aposDocId}`, {
535
- qs: {
536
- aposMode: this.draftMode,
537
- project: { _url: 1 }
538
- }
539
- });
534
+ let doc;
535
+ try {
536
+ doc = await apos.http.get(`${action}/${this.context.aposDocId}`, {
537
+ qs: {
538
+ aposMode: this.draftMode,
539
+ project: { _url: 1 }
540
+ }
541
+ });
542
+ } catch (err) {
543
+ return;
544
+ }
540
545
 
541
546
  if (this.urlDiffers(doc._url)) {
542
547
  // Slug changed, change browser URL to reflect the actual url of the doc
@@ -11,12 +11,14 @@
11
11
  further illustrate this concept.
12
12
  -->
13
13
  <div
14
- v-if="!editMode" :key="'switchToEditMode'"
14
+ v-if="!editMode"
15
+ :key="'switchToEditMode'"
15
16
  class="apos-admin-bar__control-set__group"
16
17
  >
17
18
  <AposButton
18
19
  class="apos-admin-bar__context-button"
19
- label="apostrophe:edit" type="subtle"
20
+ label="apostrophe:edit"
21
+ type="subtle"
20
22
  :modifiers="['small', 'no-motion']"
21
23
  :tooltip="{
22
24
  content: 'apostrophe:toggleEditMode',
@@ -38,20 +40,23 @@
38
40
  <AposButton
39
41
  v-if="canSwitchToPreviewMode && !isAutopublished"
40
42
  class="apos-admin-bar__context-button"
41
- label="apostrophe:preview" :tooltip="{
43
+ label="apostrophe:preview"
44
+ :tooltip="{
42
45
  content: 'apostrophe:previewTooltip',
43
46
  placement: 'bottom'
44
47
  }"
45
- type="subtle" :modifiers="['small', 'no-motion']"
48
+ type="subtle"
49
+ :modifiers="['small', 'no-motion']"
46
50
  @click="switchEditMode(false)"
47
51
  />
48
52
  <AposButton
49
53
  v-if="editMode && !isAutopublished"
50
- type="primary" :label="publishLabel"
54
+ type="primary"
55
+ :label="publishLabel"
51
56
  :disabled="!readyToPublish"
52
57
  class="apos-admin-bar__btn apos-admin-bar__context-button"
53
- @click="onPublish"
54
58
  :modifiers="['no-motion']"
59
+ @click="onPublish"
55
60
  />
56
61
  </div>
57
62
  </transition-group>
@@ -66,7 +71,10 @@ export default {
66
71
  return null;
67
72
  }
68
73
  },
69
- hasCustomUi: Boolean,
74
+ hasCustomUi: {
75
+ type: Boolean,
76
+ required: true
77
+ },
70
78
  context: {
71
79
  type: Object,
72
80
  required: true
@@ -135,7 +143,7 @@ export default {
135
143
  return !this.editMode;
136
144
  },
137
145
  canSwitchToPreviewMode() {
138
- return this.editMode && !this.hasCustomUI;
146
+ return this.editMode && !this.hasCustomUi;
139
147
  }
140
148
  },
141
149
  mounted() {
@@ -143,7 +151,7 @@ export default {
143
151
  apos.bus.$on('command-menu-admin-bar-toggle-edit-preview', this.toggleEditPreviewMode);
144
152
  apos.bus.$on('command-menu-admin-bar-publish-draft', this.onPublish);
145
153
  },
146
- destroyed() {
154
+ unmounted() {
147
155
  apos.bus.$off('command-menu-admin-bar-toggle-edit-preview', this.toggleEditPreviewMode);
148
156
  apos.bus.$off('command-menu-admin-bar-publish-draft', this.onPublish);
149
157
  },
@@ -179,7 +187,7 @@ export default {
179
187
  <style lang="scss" scoped>
180
188
  .apos-admin-bar__control-set--mode-and-settings {
181
189
  justify-content: flex-end;
182
- & ::v-deep .apos-button {
190
+ &:deep(.apos-button) {
183
191
  margin-left: 4px;
184
192
  }
185
193
  }
@@ -6,8 +6,8 @@
6
6
  >
7
7
  <span
8
8
  v-show="true"
9
- class="apos-admin-bar__title"
10
9
  :key="'title'"
10
+ class="apos-admin-bar__title"
11
11
  >
12
12
  <AposIndicator
13
13
  icon="information-outline-icon"
@@ -31,9 +31,9 @@
31
31
  :button="draftButton"
32
32
  :menu="draftMenu"
33
33
  :disabled="hasCustomUi || isUnpublished"
34
- @item-clicked="switchDraftMode"
35
34
  menu-offset="13, 10"
36
35
  menu-placement="bottom-end"
36
+ @item-clicked="switchDraftMode"
37
37
  />
38
38
  <AposLabel
39
39
  v-else
@@ -43,9 +43,9 @@
43
43
  />
44
44
  </div>
45
45
  <AposLabel
46
- class="apos-admin-bar__title-context-label"
47
46
  v-for="{id, label, tooltip = '', modifiers = []} in moduleOptions.contextLabels"
48
47
  :key="id"
48
+ class="apos-admin-bar__title-context-label"
49
49
  :label="label"
50
50
  :tooltip="tooltip"
51
51
  :modifiers="modifiers"
@@ -130,7 +130,7 @@ export default {
130
130
  mounted() {
131
131
  apos.bus.$on('command-menu-admin-bar-toggle-publish-draft', this.togglePublishDraftMode);
132
132
  },
133
- destroyed() {
133
+ unmounted() {
134
134
  apos.bus.$off('command-menu-admin-bar-toggle-publish-draft', this.togglePublishDraftMode);
135
135
  },
136
136
  methods: {
@@ -11,9 +11,12 @@
11
11
  >
12
12
  <AposButton
13
13
  :disabled="!canUndo"
14
- type="subtle" :modifiers="['small', 'no-motion']"
15
- label="apostrophe:undo" class="apos-admin-bar__context-button"
16
- icon="undo-icon" :icon-only="true"
14
+ type="subtle"
15
+ :modifiers="['small', 'no-motion']"
16
+ label="apostrophe:undo"
17
+ class="apos-admin-bar__context-button"
18
+ icon="undo-icon"
19
+ :icon-only="true"
17
20
  @click="undo"
18
21
  />
19
22
  </div>
@@ -23,9 +26,12 @@
23
26
  >
24
27
  <AposButton
25
28
  :disabled="!canRedo"
26
- type="subtle" :modifiers="['small', 'no-motion']"
27
- label="apostrophe:redo" class="apos-admin-bar__context-button"
28
- icon="redo-icon" :icon-only="true"
29
+ type="subtle"
30
+ :modifiers="['small', 'no-motion']"
31
+ label="apostrophe:redo"
32
+ class="apos-admin-bar__context-button"
33
+ icon="redo-icon"
34
+ :icon-only="true"
29
35
  @click="redo"
30
36
  />
31
37
  </div>
@@ -74,7 +80,7 @@ export default {
74
80
  apos.bus.$on('command-menu-admin-bar-undo', this.undo);
75
81
  apos.bus.$on('command-menu-admin-bar-redo', this.redo);
76
82
  },
77
- destroyed() {
83
+ unmounted() {
78
84
  apos.bus.$off('command-menu-admin-bar-undo', this.undo);
79
85
  apos.bus.$off('command-menu-admin-bar-redo', this.redo);
80
86
  },
@@ -93,7 +99,7 @@ export default {
93
99
  };
94
100
  </script>
95
101
  <style lang="scss" scoped>
96
- ::v-deep .apos-admin-bar__context-button.apos-button__wrapper {
102
+ :deep(.apos-admin-bar__context-button.apos-button__wrapper) {
97
103
  display: flex;
98
104
  }
99
105
  </style>
@@ -6,10 +6,11 @@
6
6
  <span class="apos-admin-bar__status__inner">
7
7
  <component
8
8
  :is="savingIndicator.componentName"
9
+ v-if="savingIndicator?.componentName"
9
10
  v-bind="savingIndicator.options"
10
11
  class="apos-admin-bar__status__icon"
11
12
  />
12
- <div class="apos-admin-bar__status__label" ref="statusLabel">
13
+ <div ref="statusLabel" class="apos-admin-bar__status__label">
13
14
  {{ $t(savingLabel) }}
14
15
  </div>
15
16
  </span>