apostrophe 3.63.2 → 4.0.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 (146) hide show
  1. package/.eslintrc +13 -4
  2. package/CHANGELOG.md +21 -0
  3. package/defaults.js +1 -0
  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 +6 -6
  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/busy/ui/apos/apps/AposBusy.js +8 -7
  26. package/modules/@apostrophecms/busy/ui/apos/components/TheAposBusy.vue +1 -1
  27. package/modules/@apostrophecms/command-menu/ui/apos/apps/AposCommandMenu.js +11 -29
  28. package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuShortcut.vue +6 -6
  29. package/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue +10 -7
  30. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue +20 -15
  31. package/modules/@apostrophecms/doc-type/ui/apos/logic/AposDocContextMenu.js +1 -1
  32. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalize.vue +36 -27
  33. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalizeErrors.vue +3 -3
  34. package/modules/@apostrophecms/image/ui/apos/components/AposImageCropper.vue +5 -5
  35. package/modules/@apostrophecms/image/ui/apos/components/AposImageRelationshipEditor.vue +6 -6
  36. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManager.vue +23 -16
  37. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerDisplay.vue +11 -11
  38. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerEditor.vue +28 -21
  39. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerSelections.vue +1 -1
  40. package/modules/@apostrophecms/image/ui/apos/components/AposMediaUploader.vue +5 -4
  41. package/modules/@apostrophecms/login/ui/apos/apps/AposLogin.js +6 -7
  42. package/modules/@apostrophecms/login/ui/apos/components/AposForgotPasswordForm.vue +3 -3
  43. package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +10 -10
  44. package/modules/@apostrophecms/login/ui/apos/components/AposResetPasswordForm.vue +1 -1
  45. package/modules/@apostrophecms/login/ui/apos/components/TheAposLogin.vue +2 -2
  46. package/modules/@apostrophecms/modal/ui/apos/apps/AposModals.js +60 -87
  47. package/modules/@apostrophecms/modal/ui/apos/components/AposDocsManagerToolbar.vue +15 -11
  48. package/modules/@apostrophecms/modal/ui/apos/components/AposModal.vue +8 -2
  49. package/modules/@apostrophecms/modal/ui/apos/components/AposModalBreadcrumbs.vue +7 -4
  50. package/modules/@apostrophecms/modal/ui/apos/components/AposModalConfirm.vue +5 -5
  51. package/modules/@apostrophecms/modal/ui/apos/components/AposModalShareDraft.vue +8 -8
  52. package/modules/@apostrophecms/modal/ui/apos/components/AposModalToolbar.vue +7 -7
  53. package/modules/@apostrophecms/modal/ui/apos/components/TheAposModals.vue +22 -4
  54. package/modules/@apostrophecms/modal/ui/apos/composables/AposFocus.js +95 -0
  55. package/modules/@apostrophecms/modal/ui/apos/mixins/AposDocsManagerMixin.js +2 -3
  56. package/modules/@apostrophecms/modal/ui/apos/mixins/AposEditorMixin.js +6 -0
  57. package/modules/@apostrophecms/multisite-i18n/i18n/aposMultisite/en.json +48 -0
  58. package/modules/@apostrophecms/multisite-i18n/index.js +7 -0
  59. package/modules/@apostrophecms/notification/index.js +4 -4
  60. package/modules/@apostrophecms/notification/ui/apos/apps/AposNotification.js +6 -9
  61. package/modules/@apostrophecms/notification/ui/apos/components/AposNotification.vue +12 -8
  62. package/modules/@apostrophecms/oembed-field/ui/apos/components/AposInputOembed.vue +4 -4
  63. package/modules/@apostrophecms/page/ui/apos/components/AposPagesManager.vue +15 -11
  64. package/modules/@apostrophecms/page/ui/apos/logic/AposPagesManager.js +1 -1
  65. package/modules/@apostrophecms/permission/ui/apos/components/AposInputRole.vue +3 -3
  66. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +25 -17
  67. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManagerDisplay.vue +24 -20
  68. package/modules/@apostrophecms/piece-type/ui/apos/components/AposRelationshipEditor.vue +15 -11
  69. package/modules/@apostrophecms/rich-text-widget/index.js +1 -0
  70. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposImageControlDialog.vue +7 -6
  71. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +31 -30
  72. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapAnchor.vue +12 -10
  73. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapLink.vue +9 -8
  74. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapStyles.vue +3 -3
  75. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapTable.vue +3 -3
  76. package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +10 -8
  77. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArea.vue +5 -3
  78. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +81 -277
  79. package/modules/@apostrophecms/schema/ui/apos/components/AposInputAttachment.vue +4 -2
  80. package/modules/@apostrophecms/schema/ui/apos/components/AposInputBoolean.vue +24 -14
  81. package/modules/@apostrophecms/schema/ui/apos/components/AposInputCheckboxes.vue +7 -6
  82. package/modules/@apostrophecms/schema/ui/apos/components/AposInputColor.vue +10 -7
  83. package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +3 -3
  84. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRadio.vue +5 -4
  85. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRelationship.vue +15 -12
  86. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSelect.vue +1 -1
  87. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +16 -12
  88. package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +19 -11
  89. package/modules/@apostrophecms/schema/ui/apos/components/AposInputWrapper.vue +1 -1
  90. package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +65 -21
  91. package/modules/@apostrophecms/schema/ui/apos/components/AposSubform.vue +2 -2
  92. package/modules/@apostrophecms/schema/ui/apos/logic/AposArrayEditor.js +0 -4
  93. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArea.js +3 -3
  94. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArray.js +15 -4
  95. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputAttachment.js +3 -3
  96. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputCheckboxes.js +7 -7
  97. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputColor.js +5 -8
  98. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputDateAndTime.js +1 -1
  99. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputObject.js +1 -1
  100. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRadio.js +1 -1
  101. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRelationship.js +12 -9
  102. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputSelect.js +2 -2
  103. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputString.js +6 -8
  104. package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +39 -13
  105. package/modules/@apostrophecms/schema/ui/apos/logic/AposSubform.js +1 -1
  106. package/modules/@apostrophecms/schema/ui/apos/mixins/AposInputMixin.js +9 -9
  107. package/modules/@apostrophecms/schema/ui/apos/scss/AposInputArray.scss +205 -0
  108. package/modules/@apostrophecms/settings/ui/apos/components/AposSettingsManager.vue +4 -4
  109. package/modules/@apostrophecms/settings/ui/apos/logic/AposSettingsManager.js +4 -4
  110. package/modules/@apostrophecms/submitted-draft/ui/apos/components/AposSubmittedDraftIcon.vue +5 -4
  111. package/modules/@apostrophecms/ui/ui/apos/components/AposButton.vue +4 -4
  112. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonGroup.vue +6 -6
  113. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonSplit.vue +120 -113
  114. package/modules/@apostrophecms/ui/ui/apos/components/AposCheckbox.vue +19 -19
  115. package/modules/@apostrophecms/ui/ui/apos/components/AposCombo.vue +15 -15
  116. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenu.vue +216 -191
  117. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuDialog.vue +77 -65
  118. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuItem.vue +1 -1
  119. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuTip.vue +28 -50
  120. package/modules/@apostrophecms/ui/ui/apos/components/AposFile.vue +5 -5
  121. package/modules/@apostrophecms/ui/ui/apos/components/AposFilterMenu.vue +4 -4
  122. package/modules/@apostrophecms/ui/ui/apos/components/AposMinMaxCount.vue +5 -5
  123. package/modules/@apostrophecms/ui/ui/apos/components/AposPager.vue +14 -8
  124. package/modules/@apostrophecms/ui/ui/apos/components/AposSlat.vue +2 -2
  125. package/modules/@apostrophecms/ui/ui/apos/components/AposSlatList.vue +53 -59
  126. package/modules/@apostrophecms/ui/ui/apos/components/AposSubformPreview.vue +2 -2
  127. package/modules/@apostrophecms/ui/ui/apos/components/AposTagApply.vue +40 -35
  128. package/modules/@apostrophecms/ui/ui/apos/components/AposToggle.vue +2 -2
  129. package/modules/@apostrophecms/ui/ui/apos/components/AposTree.vue +9 -11
  130. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeHeader.vue +5 -3
  131. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeRows.vue +129 -129
  132. package/modules/@apostrophecms/ui/ui/apos/composables/AposTheme.js +11 -0
  133. package/modules/@apostrophecms/ui/ui/apos/lib/click-outside-element.js +4 -4
  134. package/modules/@apostrophecms/ui/ui/apos/lib/i18next.js +56 -50
  135. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip.js +191 -0
  136. package/modules/@apostrophecms/ui/ui/apos/lib/vue.js +19 -10
  137. package/modules/@apostrophecms/ui/ui/apos/mixins/AposAdvisoryLockMixin.js +1 -1
  138. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tables.scss +1 -1
  139. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tooltips.scss +6 -22
  140. package/modules/@apostrophecms/ui/ui/apos/scss/shared/_table-rows.scss +1 -1
  141. package/modules/@apostrophecms/widget-type/index.js +8 -2
  142. package/modules/@apostrophecms/widget-type/ui/apos/components/AposWidgetEditor.vue +26 -22
  143. package/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +4 -4
  144. package/package.json +31 -44
  145. package/modules/@apostrophecms/ui/ui/apos/lib/localized-v-tooltip.js +0 -63
  146. 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,5 +1,26 @@
1
1
  # Changelog
2
2
 
3
+ ## 4.0.0 (2024-03-12)
4
+
5
+ ### Adds
6
+
7
+ * Add translation keys used by the multisite assembly module.
8
+ * Add side by side comparison support in AposSchema component.
9
+ * 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).
10
+
11
+ ### Changes
12
+
13
+ * Migrate to Vue 3. This entails changes to some admin UI code, as detailed in our public announcement.
14
+ There are no other backwards incompatible changes in apostrophe version 4.0.0.
15
+ Certain other modules containing custom admin UI have also been updated in a new major version to be compatible,
16
+ as noted in our announcement and on the migration page of our website.
17
+
18
+ ### Fixes
19
+
20
+ * Adds `textStyle` to Tiptap types so that spans are rendered on RT initialization
21
+ * `field.help` and `field.htmlHelp` are now correctly translated when displayed in a tooltip.
22
+ * Notification REST APIs should not directly return the result of MongoDB operations.
23
+
3
24
  ## 3.63.2 (2024-03-01)
4
25
 
5
26
  ### Security
package/defaults.js CHANGED
@@ -4,6 +4,7 @@ module.exports = {
4
4
  '@apostrophecms/error': {},
5
5
  '@apostrophecms/util': {},
6
6
  '@apostrophecms/i18n': {},
7
+ '@apostrophecms/multisite-i18n': {},
7
8
  '@apostrophecms/task': {},
8
9
  '@apostrophecms/schema': {},
9
10
  '@apostrophecms/uploadfs': {},
@@ -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>
@@ -1,8 +1,11 @@
1
- import Vue from 'Modules/@apostrophecms/ui/lib/vue';
1
+ /* eslint-disable vue/one-component-per-file */
2
+ import createApp from 'Modules/@apostrophecms/ui/lib/vue';
2
3
  import { klona } from 'klona';
3
4
 
4
5
  export default function() {
5
6
 
7
+ const component = apos.vueComponents.AposAreaEditor;
8
+
6
9
  let widgetsRendering = 0;
7
10
 
8
11
  apos.area.widgetOptions = [];
@@ -90,8 +93,6 @@ export default function() {
90
93
  }
91
94
  el.removeAttribute('data-apos-area-newly-editable');
92
95
 
93
- const component = window.apos.area.components.editor;
94
-
95
96
  if (apos.area.activeEditor && (apos.area.activeEditor.id === data._id)) {
96
97
  // Editing a piece causes a refresh of the main content area,
97
98
  // but this may contain the area we originally intended to add
@@ -101,68 +102,49 @@ export default function() {
101
102
 
102
103
  el.parentNode.replaceChild(apos.area.activeEditor.$el, el);
103
104
  } else {
104
- return new Vue({
105
- el,
106
- data: function() {
107
- return {
108
- options,
109
- id: data._id,
110
- items: data.items,
111
- choices,
112
- docId: _docId,
113
- fieldId,
114
- renderings
115
- };
116
- },
117
- render(h) {
118
- return h(component, {
119
- props: {
120
- options: this.options,
121
- items: this.items,
122
- choices: this.choices,
123
- id: this.id,
124
- docId: this.docId,
125
- fieldId: this.fieldId,
126
- renderings: this.renderings
127
- }
128
- });
129
- }
105
+ const app = createApp(component, {
106
+ options,
107
+ id: data._id,
108
+ items: data.items,
109
+ choices,
110
+ docId: _docId,
111
+ fieldId,
112
+ renderings
130
113
  });
114
+
115
+ app.mount(el);
131
116
  }
132
117
  }
133
118
 
134
119
  function createWidgetClipboardApp() {
135
- // Headless app to provide simple reactivity for the clipboard state
136
- apos.area.widgetClipboard = new Vue({
137
- el: null,
138
- data: () => {
120
+ class Clipboard {
121
+ constructor() {
139
122
  const existing = window.localStorage.getItem('aposWidgetClipboard');
140
- return {
141
- widgetClipboard: existing ? JSON.parse(existing) : null
142
- };
143
- },
144
- mounted() {
123
+ this.widgetClipboard = existing ? JSON.parse(existing) : null;
124
+
145
125
  window.addEventListener('storage', this.onStorage);
146
- },
147
- methods: {
148
- set(widget) {
149
- this.widgetClipboard = widget;
150
- localStorage.setItem('aposWidgetClipboard', JSON.stringify(this.widgetClipboard));
151
- },
152
- get() {
126
+ }
127
+
128
+ set(widget) {
129
+ this.widgetClipboard = widget;
130
+ localStorage.setItem('aposWidgetClipboard', JSON.stringify(this.widgetClipboard));
131
+ }
132
+
133
+ get() {
153
134
  // If we don't clone, the second paste will be a duplicate key error
154
- return klona(this.widgetClipboard);
155
- },
156
- onStorage() {
135
+ return klona(this.widgetClipboard);
136
+ }
137
+
138
+ onStorage() {
157
139
  // When local storage changes, dump the list to
158
140
  // the console.
159
- const contents = window.localStorage.getItem('aposWidgetClipboard');
160
- if (contents) {
161
- this.widgetClipboard = JSON.parse(contents);
162
- }
141
+ const contents = window.localStorage.getItem('aposWidgetClipboard');
142
+ if (contents) {
143
+ this.widgetClipboard = JSON.parse(contents);
163
144
  }
164
145
  }
165
- });
166
- }
146
+ }
167
147
 
148
+ apos.area.widgetClipboard = new Clipboard();
149
+ }
168
150
  }