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
@@ -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
  }
@@ -1,28 +1,29 @@
1
1
  <template>
2
2
  <div class="apos-area-menu" :class="{'apos-is-focused': groupIsFocused}">
3
3
  <AposContextMenu
4
- :disabled="isDisabled"
5
- :button="buttonOptions"
6
4
  v-bind="extendedContextMenuOptions"
7
- @open="menuOpen"
8
- @close="menuClose"
9
5
  ref="contextMenu"
6
+ :disabled="isDisabled"
7
+ :button="buttonOptions"
10
8
  :popover-modifiers="inContext ? ['z-index-in-context'] : []"
11
9
  >
12
10
  <ul class="apos-area-menu__wrapper">
13
11
  <li
14
- class="apos-area-menu__item"
15
12
  v-for="(item, itemIndex) in myMenu"
16
13
  :key="item.type ? `${item.type}_${item.label}` : item.label"
17
- :class="{'apos-has-group': item.items}"
18
14
  :ref="`item-${itemIndex}`"
15
+ class="apos-area-menu__item"
16
+ :class="{'apos-has-group': item.items}"
19
17
  >
20
18
  <dl v-if="item.items" class="apos-area-menu__group">
21
19
  <dt>
22
20
  <button
23
- :for="item.label" class="apos-area-menu__group-label"
24
- v-if="item.items" tabindex="0"
21
+ v-if="item.items"
25
22
  :id="`${menuId}-trigger-${itemIndex}`"
23
+ ref="groupButton"
24
+ :for="item.label"
25
+ class="apos-area-menu__group-label"
26
+ tabindex="0"
26
27
  :aria-controls="`${menuId}-group-${itemIndex}`"
27
28
  @focus="groupFocused"
28
29
  @blur="groupBlurred"
@@ -33,33 +34,33 @@
33
34
  @keydown.prevent.arrow-up="switchGroup(itemIndex, -1)"
34
35
  @keydown.prevent.home="switchGroup(itemIndex, 0)"
35
36
  @keydown.prevent.end="switchGroup(itemIndex, null)"
36
- ref="groupButton"
37
37
  >
38
38
  <span>{{ item.label }}</span>
39
39
  <chevron-up-icon
40
40
  class="apos-area-menu__group-chevron"
41
- :class="{'apos-is-active': itemIndex === active}" :size="13"
41
+ :class="{'apos-is-active': itemIndex === active}"
42
+ :size="13"
42
43
  />
43
44
  </button>
44
45
  </dt>
45
46
  <dd class="apos-area-menu__group-list" role="region">
46
47
  <ul
48
+ :id="`${menuId}-group-${itemIndex}`"
47
49
  class="apos-area-menu__items apos-area-menu__items--accordion"
48
50
  :class="{'apos-is-active': active === itemIndex}"
49
- :id="`${menuId}-group-${itemIndex}`"
50
51
  :aria-labelledby="`${menuId}-trigger-${itemIndex}`"
51
52
  :aria-expanded="active === itemIndex ? 'true' : 'false'"
52
53
  >
53
54
  <li
54
- class="apos-area-menu__item"
55
55
  v-for="(child, childIndex) in item.items"
56
56
  :key="child.name"
57
57
  :ref="`child-${index}-${childIndex}`"
58
+ class="apos-area-menu__item"
58
59
  >
59
60
  <AposAreaMenuItem
60
- @click="add(child)"
61
61
  :item="child"
62
62
  :tabbable="itemIndex === active"
63
+ @click="add(child)"
63
64
  @up="switchItem(`child-${itemIndex}-${childIndex - 1}`, -1)"
64
65
  @down="switchItem(`child-${itemIndex}-${childIndex + 1}`, 1)"
65
66
  />
@@ -69,8 +70,8 @@
69
70
  </dl>
70
71
  <AposAreaMenuItem
71
72
  v-else
72
- @click="add(item)"
73
73
  :item="item"
74
+ @click="add(item)"
74
75
  @up="switchItem(`item-${itemIndex - 1}`, -1)"
75
76
  @down="switchItem(`item-${itemIndex + 1}`, 1)"
76
77
  />
@@ -118,7 +119,7 @@ export default {
118
119
  }
119
120
  }
120
121
  },
121
- emits: [ 'menu-close', 'menu-open', 'add' ],
122
+ emits: [ 'add' ],
122
123
  data() {
123
124
  return {
124
125
  active: 0,
@@ -192,17 +193,11 @@ export default {
192
193
  this.inContext = !apos.util.closest(this.$el, '[data-apos-schema-area]');
193
194
  },
194
195
  methods: {
195
- menuClose(e) {
196
- this.$emit('menu-close', e);
197
- },
198
- menuOpen(e) {
199
- this.$emit('menu-open', e);
200
- },
201
196
  async add(item) {
202
197
  // Potential TODO: If we find ourselves manually flipping these bits in other AposContextMenu overrides
203
198
  // we should consider refactoring contextmenus to be able to self close when any click takes place within their el
204
199
  // as it is often the logical experience (not always, see tag menus and filters)
205
- this.$refs.contextMenu.isOpen = false;
200
+ this.$refs.contextMenu.hide();
206
201
  this.$emit('add', {
207
202
  ...item,
208
203
  index: this.index
@@ -278,11 +273,11 @@ export default {
278
273
 
279
274
  <style lang="scss" scoped>
280
275
 
281
- .apos-area-menu.apos-is-focused ::v-deep .apos-context-menu__inner {
276
+ .apos-area-menu.apos-is-focused :deep(.apos-context-menu__inner) {
282
277
  border: 1px solid var(--a-base-4);
283
278
  }
284
279
 
285
- .apos-area-menu.apos-is-focused ::v-deep .apos-context-menu__tip-outline {
280
+ .apos-area-menu.apos-is-focused :deep(.apos-context-menu__tip-outline) {
286
281
  stroke: var(--a-base-4);
287
282
  }
288
283
 
@@ -306,7 +301,7 @@ export default {
306
301
 
307
302
  &:hover,
308
303
  &:focus {
309
- & ::v-deep .apos-area-menu__item-icon {
304
+ &:deep(.apos-area-menu__item-icon) {
310
305
  color: var(--a-primary);
311
306
  }
312
307
  }
@@ -22,7 +22,6 @@
22
22
  </template>
23
23
  <template v-else>
24
24
  <AposAreaMenu
25
- @add="add"
26
25
  :context-menu-options="contextMenuOptions"
27
26
  :empty="true"
28
27
  :index="0"
@@ -30,14 +29,15 @@
30
29
  :max-reached="maxReached"
31
30
  :disabled="field && field.readOnly"
32
31
  :widget-options="options.widgets"
32
+ @add="add"
33
33
  />
34
34
  </template>
35
35
  </div>
36
36
  <div class="apos-areas-widgets-list">
37
37
  <AposAreaWidget
38
38
  v-for="(widget, i) in next"
39
- :area-id="areaId"
40
39
  :key="widget._id"
40
+ :area-id="areaId"
41
41
  :widget="widget"
42
42
  :meta="meta[widget._id]"
43
43
  :generation="generation"
@@ -227,7 +227,7 @@ export default {
227
227
  mounted() {
228
228
  this.bindEventListeners();
229
229
  },
230
- beforeDestroy() {
230
+ beforeUnmount() {
231
231
  this.unbindEventListeners();
232
232
  },
233
233
  methods: {
@@ -235,14 +235,12 @@ export default {
235
235
  apos.bus.$on('area-updated', this.areaUpdatedHandler);
236
236
  apos.bus.$on('widget-hover', this.updateWidgetHovered);
237
237
  apos.bus.$on('widget-focus', this.updateWidgetFocused);
238
- apos.bus.$on('refreshed', this.destroyParentComponent);
239
238
  window.addEventListener('keydown', this.focusParentEvent);
240
239
  },
241
240
  unbindEventListeners() {
242
241
  apos.bus.$off('area-updated', this.areaUpdatedHandler);
243
242
  apos.bus.$off('widget-hover', this.updateWidgetHovered);
244
243
  apos.bus.$off('widget-focus', this.updateWidgetFocused);
245
- apos.bus.$off('refreshed', this.destroyParentComponent);
246
244
  window.removeEventListener('keydown', this.focusParentEvent);
247
245
  },
248
246
  areaUpdatedHandler(area) {
@@ -382,7 +380,7 @@ export default {
382
380
  apos.area.activeEditor = this;
383
381
  apos.bus.$on('apos-refreshing', cancelRefresh);
384
382
  const result = await apos.modal.execute(componentName, {
385
- value: widget,
383
+ modelValue: widget,
386
384
  options: this.widgetOptionsByType(widget.type),
387
385
  type: widget.type,
388
386
  docId: this.docId,
@@ -481,7 +479,7 @@ export default {
481
479
  const componentName = this.widgetEditorComponent(name);
482
480
  apos.area.activeEditor = this;
483
481
  const widget = await apos.modal.execute(componentName, {
484
- value: null,
482
+ modelValue: null,
485
483
  options: this.widgetOptionsByType(name),
486
484
  type: name,
487
485
  docId: this.docId,
@@ -606,11 +604,6 @@ export default {
606
604
  }
607
605
  });
608
606
  return widget;
609
- },
610
- destroyParentComponent() {
611
- if (!document.body.contains(this.$parent.$el)) {
612
- this.$parent.$destroy();
613
- }
614
607
  }
615
608
  }
616
609
  };
@@ -16,7 +16,7 @@
16
16
  :key="groupIndex"
17
17
  class="apos-widget-group"
18
18
  >
19
- <h2 class="apos-widget-group__label" v-if="group.label">{{ $t(group.label) }}</h2>
19
+ <h2 v-if="group.label" class="apos-widget-group__label">{{ $t(group.label) }}</h2>
20
20
  <div
21
21
  :class="[
22
22
  `apos-widget-group--${group.columns}-column${
@@ -42,10 +42,11 @@
42
42
  class="apos-widget__preview-image"
43
43
  >
44
44
  <component
45
+ :is="getIcon(item)"
45
46
  v-else-if="hasIcon(item)"
47
+ :title="getTitle(item)"
46
48
  :size="25"
47
49
  class="apos-widget__preview--icon"
48
- :is="item.previewIcon || item.icon"
49
50
  />
50
51
  </div>
51
52
  <p class="apos-widget__label">
@@ -173,9 +174,16 @@ export default {
173
174
 
174
175
  return group;
175
176
  },
176
- hasIcon(widget) {
177
+ getIcon(widget) {
177
178
  return widget.previewIcon || widget.icon;
178
179
  },
180
+ hasIcon(widget) {
181
+ return Boolean(widget.previewIcon || widget.icon);
182
+ },
183
+ getTitle(widget) {
184
+ const icon = this.getIcon(widget);
185
+ return icon.replaceAll('-', ' ');
186
+ },
179
187
  close() {
180
188
  this.modal.showModal = false;
181
189
  },
@@ -1,14 +1,13 @@
1
1
  <template>
2
2
  <AposButton
3
3
  v-if="options.expanded"
4
- :disabled="disabled"
5
4
  v-bind="buttonOptions"
6
- @click="openExpandedMenu(index)"
5
+ :disabled="disabled"
7
6
  role="button"
7
+ @click="openExpandedMenu(index)"
8
8
  />
9
9
  <AposAreaContextualMenu
10
10
  v-else
11
- @add="$emit('add', $event);"
12
11
  :button-options="buttonOptions"
13
12
  :context-menu-options="contextMenuOptions"
14
13
  :empty="true"
@@ -17,6 +16,7 @@
17
16
  :options="options"
18
17
  :max-reached="maxReached"
19
18
  :disabled="disabled"
19
+ @add="$emit('add', $event);"
20
20
  />
21
21
  </template>
22
22
 
@@ -86,11 +86,11 @@ export default {
86
86
 
87
87
  <style lang="scss" scoped>
88
88
 
89
- .apos-area-menu.apos-is-focused ::v-deep .apos-context-menu__inner {
89
+ .apos-area-menu.apos-is-focused :deep(.apos-context-menu__inner) {
90
90
  border: 1px solid var(--a-base-4);
91
91
  }
92
92
 
93
- .apos-area-menu.apos-is-focused ::v-deep .apos-context-menu__tip-outline {
93
+ .apos-area-menu.apos-is-focused :deep(.apos-context-menu__tip-outline) {
94
94
  stroke: var(--a-base-4);
95
95
  }
96
96
 
@@ -114,7 +114,7 @@ export default {
114
114
 
115
115
  &:hover,
116
116
  &:focus {
117
- & ::v-deep .apos-area-menu__item-icon {
117
+ &:deep(.apos-area-menu__item-icon) {
118
118
  color: var(--a-primary);
119
119
  }
120
120
  }
@@ -1,9 +1,10 @@
1
1
  <template>
2
2
  <button
3
- @click="click" class="apos-area-menu__button"
3
+ class="apos-area-menu__button"
4
4
  :class="{ 'apos-area-menu__button--separated': item.type }"
5
5
  :data-action="item.name"
6
6
  :tabindex="String(tabindex)"
7
+ @click="click"
7
8
  @keydown.prevent.arrow-down="$emit('down')"
8
9
  @keydown.prevent.arrow-up="$emit('up')"
9
10
  >
@@ -15,10 +16,10 @@
15
16
  </div>
16
17
  <div class="apos-area-menu__item-content">
17
18
  <component
19
+ :is="item.icon"
18
20
  v-if="item.icon"
19
21
  :size="15"
20
22
  class="apos-area-menu__item-icon"
21
- :is="item.icon"
22
23
  />
23
24
  {{ $t(item.label) }}
24
25
  </div>