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,13 +1,13 @@
1
1
 
2
2
  <template>
3
3
  <div
4
+ ref="widget"
4
5
  class="apos-area-widget-wrapper"
5
6
  :class="{'apos-area-widget-wrapper--foreign': foreign}"
6
7
  :data-area-widget="widget._id"
7
8
  :data-area-label="widgetLabel"
8
9
  :data-apos-widget-foreign="foreign ? 1 : 0"
9
10
  :data-apos-widget-id="widget._id"
10
- ref="widget"
11
11
  >
12
12
  <div
13
13
  class="apos-area-widget-inner"
@@ -17,8 +17,8 @@
17
17
  @click="getFocus($event, widget._id)"
18
18
  >
19
19
  <div
20
- class="apos-area-widget-controls apos-area-widget__label"
21
20
  ref="label"
21
+ class="apos-area-widget-controls apos-area-widget__label"
22
22
  :class="labelsClasses"
23
23
  >
24
24
  <ol class="apos-area-widget__breadcrumbs">
@@ -33,18 +33,16 @@
33
33
  >
34
34
  <AposButton
35
35
  type="quiet"
36
- @click="getFocus($event, item.id)"
37
36
  :label="item.label"
38
37
  icon="chevron-right-icon"
39
38
  :icon-size="9"
40
39
  :modifiers="['icon-right', 'no-motion']"
40
+ @click="getFocus($event, item.id)"
41
41
  />
42
42
  </li>
43
43
  <li class="apos-area-widget__breadcrumb" data-apos-widget-breadcrumb="0">
44
44
  <AposButton
45
45
  type="quiet"
46
- @click="foreign ? $emit('edit', i) : null"
47
- @dblclick.native="(!foreign && !isContextual) ? $emit('edit', i) : null"
48
46
  :label="foreign ? {
49
47
  key: 'apostrophe:editWidgetType',
50
48
  label: $t(widgetLabel)
@@ -52,6 +50,8 @@
52
50
  :tooltip="!isContextual && 'apostrophe:editWidgetForeignTooltip'"
53
51
  :icon-size="11"
54
52
  :modifiers="['no-motion']"
53
+ @click="foreign ? $emit('edit', i) : null"
54
+ @dblclick="(!foreign && !isContextual) ? $emit('edit', i) : null"
55
55
  />
56
56
  </li>
57
57
  </ol>
@@ -63,14 +63,12 @@
63
63
  <AposAreaMenu
64
64
  v-if="!foreign"
65
65
  :max-reached="maxReached"
66
- @add="$emit('add', $event);"
67
- @menu-open="toggleMenuFocus($event, 'top', true)"
68
- @menu-close="toggleMenuFocus($event, 'top', false)"
69
66
  :context-menu-options="contextMenuOptions"
70
67
  :index="i"
71
68
  :widget-options="widgets"
72
69
  :options="options"
73
70
  :disabled="disabled"
71
+ @add="$emit('add', $event);"
74
72
  />
75
73
  </div>
76
74
  <div
@@ -104,33 +102,34 @@
104
102
  />
105
103
  <!-- Still used for contextual editing components -->
106
104
  <component
107
- v-if="isContextual && !foreign"
108
105
  :is="widgetEditorComponent(widget.type)"
106
+ v-if="isContextual && !foreign"
107
+ :key="generation"
109
108
  :options="widgetOptions"
110
109
  :type="widget.type"
111
- :value="widget"
110
+ :model-value="widget"
112
111
  :meta="meta"
113
- @update="$emit('update', $event)"
114
112
  :doc-id="docId"
115
113
  :focused="isFocused"
116
- :key="generation"
114
+ @update="$emit('update', $event)"
117
115
  />
118
116
  <component
119
- v-else
120
117
  :is="widgetComponent(widget.type)"
118
+ v-else
119
+ :id="widget._id"
120
+ :key="`${generation}-preview`"
121
121
  :options="widgetOptions"
122
122
  :type="widget.type"
123
- :id="widget._id"
124
123
  :area-field-id="fieldId"
125
124
  :area-field="field"
126
125
  :following-values="followingValuesWithParent"
126
+ :model-value="widget"
127
127
  :value="widget"
128
128
  :meta="meta"
129
129
  :foreign="foreign"
130
- @edit="$emit('edit', i);"
131
130
  :doc-id="docId"
132
131
  :rendering="rendering"
133
- :key="`${generation}-preview`"
132
+ @edit="$emit('edit', i);"
134
133
  />
135
134
  <div
136
135
  class="apos-area-widget-controls apos-area-widget-controls--add apos-area-widget-controls--add--bottom"
@@ -139,14 +138,12 @@
139
138
  <AposAreaMenu
140
139
  v-if="!foreign"
141
140
  :max-reached="maxReached"
142
- @add="$emit('add', $event)"
143
141
  :context-menu-options="bottomContextMenuOptions"
144
142
  :index="i + 1"
145
143
  :widget-options="widgets"
146
144
  :options="options"
147
145
  :disabled="disabled"
148
- @menu-open="toggleMenuFocus($event, 'bottom', true)"
149
- @menu-close="toggleMenuFocus($event, 'bottom', false)"
146
+ @add="$emit('add', $event)"
150
147
  />
151
148
  </div>
152
149
  </div>
@@ -279,7 +276,8 @@ export default {
279
276
  };
280
277
  },
281
278
  widgetIcon() {
282
- const natural = this.contextMenuOptions.menu.filter(item => item.name === this.widget.type)[0]?.icon || 'shape-icon';
279
+ const natural = this.contextMenuOptions.menu
280
+ .filter(item => item.name === this.widget.type)[0]?.icon || 'shape-icon';
283
281
  return this.foreign ? 'earth-icon' : natural;
284
282
  },
285
283
  widgetLabel() {
@@ -377,7 +375,7 @@ export default {
377
375
  apos.bus.$emit('widget-focus', this.widget._id);
378
376
  }
379
377
  },
380
- destroyed() {
378
+ unmounted() {
381
379
  // Remove the focus parent listener when unmounted
382
380
  apos.bus.$off('widget-focus-parent', this.focusParent);
383
381
  },
@@ -441,17 +439,6 @@ export default {
441
439
  }
442
440
  },
443
441
 
444
- toggleMenuFocus(event, name, value) {
445
- if (event) {
446
- event.cancelBubble = true;
447
- }
448
- this.state.add[name].focus = value;
449
-
450
- if (value) {
451
- this.focus();
452
- }
453
- },
454
-
455
442
  getParent() {
456
443
  if (!this.mounted) {
457
444
  return false;
@@ -517,7 +504,7 @@ export default {
517
504
  }
518
505
  &.apos-is-focused {
519
506
  outline: 1px dashed var(--a-primary);
520
- &::v-deep .apos-rich-text-editor__editor.apos-is-visually-empty {
507
+ &:deep(.apos-rich-text-editor__editor.apos-is-visually-empty) {
521
508
  box-shadow: none;
522
509
  }
523
510
  }
@@ -577,11 +564,11 @@ export default {
577
564
  .apos-area-widget-controls--modify {
578
565
  right: 0;
579
566
  transform: translate3d(-10px, 30px, 0);
580
- ::v-deep .apos-button-group__inner {
567
+ :deep(.apos-button-group__inner) {
581
568
  border: 1px solid var(--a-primary-transparent-25);
582
569
  box-shadow: var(--a-box-shadow);
583
570
  }
584
- ::v-deep .apos-button-group .apos-button {
571
+ :deep(.apos-button-group) .apos-button {
585
572
  width: 32px;
586
573
  height: 32px;
587
574
  padding: 0;
@@ -608,9 +595,9 @@ export default {
608
595
  transform: translate(-50%, -50%);
609
596
  }
610
597
 
611
- .apos-area-widget-controls--add ::v-deep {
598
+ .apos-area-widget-controls--add {
612
599
 
613
- .apos-button__wrapper {
600
+ :deep(.apos-button__wrapper) {
614
601
  padding: 8px;
615
602
 
616
603
  &:hover .apos-button:not([disabled]) {
@@ -634,11 +621,11 @@ export default {
634
621
  }
635
622
  }
636
623
 
637
- .apos-button__icon {
624
+ :deep(.apos-button__icon) {
638
625
  margin-right: 0;
639
626
  }
640
627
 
641
- .apos-button__label {
628
+ :deep(.apos-button__label) {
642
629
  display: inline-block;
643
630
  overflow: hidden;
644
631
  max-width: 0;
@@ -648,7 +635,7 @@ export default {
648
635
  font-size: var(--a-type-small);
649
636
  }
650
637
 
651
- .apos-button {
638
+ :deep(.apos-button) {
652
639
  display: flex;
653
640
  align-items: center;
654
641
  justify-content: center;
@@ -666,7 +653,7 @@ export default {
666
653
  transform: translate(-50%, 50%);
667
654
  }
668
655
 
669
- .apos-area-widget-inner ::v-deep .apos-context-menu__popup.apos-is-visible {
656
+ .apos-area-widget-inner :deep(.apos-context-menu__popup.apos-is-visible) {
670
657
  top: calc(100% + 20px);
671
658
  left: 50%;
672
659
  transform: translate(-50%, 0);
@@ -698,7 +685,7 @@ export default {
698
685
  }
699
686
 
700
687
  .apos-area-widget__breadcrumb,
701
- .apos-area-widget__breadcrumb ::v-deep .apos-button__content {
688
+ .apos-area-widget__breadcrumb :deep(.apos-button__content) {
702
689
  @include type-help;
703
690
  padding: 2px;
704
691
  white-space: nowrap;
@@ -707,7 +694,7 @@ export default {
707
694
  }
708
695
 
709
696
  .apos-area-widget__breadcrumbs:hover .apos-area-widget__breadcrumb,
710
- .apos-area-widget__breadcrumbs:hover .apos-area-widget__breadcrumb ::v-deep .apos-button__content {
697
+ .apos-area-widget__breadcrumbs:hover .apos-area-widget__breadcrumb :deep(.apos-button__content) {
711
698
  color: var(--a-text-primary);
712
699
  }
713
700
 
@@ -729,7 +716,7 @@ export default {
729
716
  color: var(--a-text-primary);
730
717
  }
731
718
 
732
- .apos-area-widget__breadcrumb ::v-deep .apos-button {
719
+ .apos-area-widget__breadcrumb :deep(.apos-button) {
733
720
  color: var(--a-primary-dark-10);
734
721
  &:hover, &:active, &:focus {
735
722
  text-decoration: none;
@@ -7,75 +7,75 @@
7
7
  v-if="!foreign"
8
8
  v-bind="upButton"
9
9
  :disabled="first || disabled"
10
- @click="$emit('up')"
11
10
  :tooltip="{
12
11
  content: (!disabled && !first) ? 'apostrophe:nudgeUp' : null,
13
12
  placement: 'left'
14
13
  }"
15
14
  :modifiers="[ 'inline' ]"
15
+ @click="$emit('up')"
16
16
  />
17
17
  <AposButton
18
+ v-if="!foreign && !options.contextual"
18
19
  v-bind="editButton"
19
20
  :disabled="disabled"
20
- v-if="!foreign && !options.contextual"
21
- @click="$emit('edit')"
22
21
  :tooltip="{
23
22
  content: 'apostrophe:editWidget',
24
23
  placement: 'left'
25
24
  }"
26
25
  :modifiers="[ 'inline' ]"
26
+ @click="$emit('edit')"
27
27
  />
28
28
  <AposButton
29
- v-bind="cutButton"
30
29
  v-if="!foreign"
31
- @click="$emit('cut')"
30
+ v-bind="cutButton"
32
31
  :tooltip="{
33
32
  content: 'apostrophe:cut',
34
33
  placement: 'left'
35
34
  }"
36
35
  :modifiers="[ 'inline' ]"
36
+ @click="$emit('cut')"
37
37
  />
38
38
  <AposButton
39
- v-bind="copyButton"
40
39
  v-if="!foreign"
41
- @click="$emit('copy')"
40
+ v-bind="copyButton"
42
41
  :tooltip="{
43
42
  content: 'apostrophe:copy',
44
43
  placement: 'left'
45
44
  }"
45
+ @click="$emit('copy')"
46
46
  />
47
47
  <AposButton
48
48
  v-if="!foreign"
49
- :disabled="disabled || maxReached"
50
49
  v-bind="cloneButton"
51
- @click="$emit('clone')"
50
+ :disabled="disabled || maxReached"
52
51
  :tooltip="{
53
52
  content: 'apostrophe:duplicate',
54
53
  placement: 'left'
55
54
  }"
56
55
  :modifiers="[ 'inline' ]"
56
+ @click="$emit('clone')"
57
57
  />
58
58
  <AposButton
59
59
  v-if="!foreign"
60
- :disabled="disabled"
61
60
  v-bind="removeButton"
62
- @click="$emit('remove')"
61
+ :disabled="disabled"
63
62
  :tooltip="{
64
63
  content: 'apostrophe:delete',
65
64
  placement: 'left'
66
65
  }"
67
66
  :modifiers="[ 'inline' ]"
67
+ @click="$emit('remove')"
68
68
  />
69
69
  <AposButton
70
70
  v-if="!foreign"
71
71
  v-bind="downButton"
72
72
  :disabled="last || disabled"
73
- @click="$emit('down')"
74
73
  :tooltip="{
75
74
  content: (!disabled && !last) ? 'apostrophe:nudgeDown' : null,
76
75
  placement: 'left'
77
76
  }"
78
77
  :modifiers="[ 'inline' ]"
78
+ @click="$emit('down')"
79
79
  />
80
80
  </AposButtonGroup>
81
81
  </div>
@@ -184,15 +184,15 @@ export default {
184
184
  $z-index-button-background: 1;
185
185
  $z-index-button-foreground: 2;
186
186
 
187
- .apos-area-modify-controls ::v-deep {
188
- .apos-button__content {
187
+ .apos-area-modify-controls {
188
+ :deep(.apos-button__content) {
189
189
  z-index: $z-index-button-foreground;
190
190
  position: relative;
191
191
  }
192
- .apos-button__icon {
192
+ :deep(.apos-button__icon) {
193
193
  transition: all 0.3s var(--a-transition-timing-bounce);
194
194
  }
195
- .apos-button {
195
+ :deep(.apos-button) {
196
196
  background-color: transparent;
197
197
 
198
198
  &:not([disabled]):hover:after {
@@ -53,6 +53,7 @@ module.exports = {
53
53
  };
54
54
  self.configureBuilds();
55
55
  self.initUploadfs();
56
+ self.enableBrowserData();
56
57
 
57
58
  const {
58
59
  extensions = {},
@@ -325,6 +326,7 @@ module.exports = {
325
326
  registerComponents: true,
326
327
  importLastVersion: true
327
328
  });
329
+ /* componentImports = getGlobalVueComponents(self); */
328
330
  tiptapExtensionImports = getImports(`${source}/tiptap-extensions`, '*.js', { registerTiptapExtensions: true });
329
331
  appImports = getImports(`${source}/apps`, '*.js', {
330
332
  invokeApps: true,
@@ -513,7 +515,6 @@ module.exports = {
513
515
  }) {
514
516
  fs.writeFileSync(importFile, (prologue || '') + stripIndent`
515
517
  ${(icon && icon.importCode) || ''}
516
- ${(icon && icon.registerCode) || ''}
517
518
  ${(components && components.importCode) || ''}
518
519
  ${(tiptap && tiptap.importCode) || ''}
519
520
  ${(app && app.importCode) || ''}
@@ -563,16 +564,16 @@ module.exports = {
563
564
  // Load global vue icon components.
564
565
  const output = {
565
566
  importCode: '',
566
- registerCode: ''
567
+ registerCode: 'window.apos.iconComponents = window.apos.iconComponents || {};\n'
567
568
  };
568
569
 
569
570
  for (const [ registerAs, importFrom ] of Object.entries(self.iconMap)) {
570
571
  if (importFrom.substring(0, 1) === '~') {
571
572
  output.importCode += `import ${importFrom}Icon from '${importFrom.substring(1)}';\n`;
572
573
  } else {
573
- output.importCode += `import ${importFrom}Icon from 'vue-material-design-icons/${importFrom}.vue';\n`;
574
+ output.importCode += `import ${importFrom}Icon from '@apostrophecms/vue-material-design-icons/${importFrom}.vue';\n`;
574
575
  }
575
- output.registerCode += `Vue.component('${registerAs}', ${importFrom}Icon);\n`;
576
+ output.registerCode += `window.apos.iconComponents['${registerAs}'] = ${importFrom}Icon;\n`;
576
577
  }
577
578
 
578
579
  return output;
@@ -727,9 +728,17 @@ module.exports = {
727
728
  }
728
729
 
729
730
  function getImportFileOutput (components, options = {}) {
731
+ let registerCode;
732
+ if (options.registerComponents) {
733
+ registerCode = 'window.apos.vueComponents = window.apos.vueComponents || {};\n';
734
+ } else if (options.registerTiptapExtensions) {
735
+ registerCode = 'window.apos.tiptapExtensions = window.apos.tiptapExtensions || [];\n';
736
+ } else {
737
+ registerCode = '';
738
+ }
730
739
  const output = {
731
740
  importCode: '',
732
- registerCode: '',
741
+ registerCode,
733
742
  invokeCode: '',
734
743
  paths: []
735
744
  };
@@ -748,21 +757,21 @@ module.exports = {
748
757
  const jsFilename = JSON.stringify(component);
749
758
  const name = getComponentName(component, options, i);
750
759
  const jsName = JSON.stringify(name);
760
+ const importName = `${name}${options.importSuffix || ''}`;
751
761
  const importCode = `
752
- import ${name}${options.importSuffix || ''} from ${jsFilename};
762
+ import ${importName} from ${jsFilename};
753
763
  `;
754
764
 
755
765
  output.paths.push(component);
756
766
  output.importCode += `${importCode}\n`;
757
767
 
758
768
  if (options.registerComponents) {
759
- output.registerCode += `Vue.component(${jsName}, ${name});\n`;
769
+ output.registerCode += `window.apos.vueComponents[${jsName}] = ${importName};\n`;
760
770
  }
761
771
 
762
772
  if (options.registerTiptapExtensions) {
763
773
  output.registerCode += stripIndent`
764
- apos.tiptapExtensions = apos.tiptapExtensions || [];
765
- apos.tiptapExtensions.push(${name});
774
+ apos.tiptapExtensions.push(${importName});
766
775
  `;
767
776
  }
768
777
  if (options.invokeApps) {
@@ -1328,9 +1337,13 @@ module.exports = {
1328
1337
  apos: true,
1329
1338
  prologue: stripIndent`
1330
1339
  import 'Modules/@apostrophecms/ui/scss/global/import-all.scss';
1331
- import Vue from 'Modules/@apostrophecms/ui/lib/vue';
1332
- window.apos.bus = new Vue();
1333
- `,
1340
+ import emitter from 'tiny-emitter/instance';
1341
+ window.apos.bus = {
1342
+ $on: (...args) => emitter.on(...args),
1343
+ $once: (...args) => emitter.once(...args),
1344
+ $off: (...args) => emitter.off(...args),
1345
+ $emit: (...args) => emitter.emit(...args)
1346
+ };`,
1334
1347
  // Load only in browsers that support ES6 modules
1335
1348
  condition: 'module'
1336
1349
  }
@@ -49,7 +49,7 @@ module.exports = ({
49
49
  // we could extend this with aliases for other apostrophe modules
50
50
  // at a later date if needed
51
51
  resolveLoader: {
52
- extensions: [ '*', '.js', '.vue', '.json' ],
52
+ extensions: [ '.*', '.js', '.vue', '.json' ],
53
53
  modules: [
54
54
  // 1. Allow webpack to find loaders from core dependencies (pnpm), empty if not pnpm
55
55
  ...pnpmModulePath,
@@ -62,9 +62,9 @@ module.exports = ({
62
62
  ]
63
63
  },
64
64
  resolve: {
65
- extensions: [ '*', '.js', '.vue', '.json' ],
65
+ extensions: [ '.*', '.js', '.vue', '.json' ],
66
66
  alias: {
67
- vue$: 'vue/dist/vue.runtime.esm.js',
67
+ vue$: '@vue/runtime-dom',
68
68
  // resolve apostrophe modules
69
69
  Modules: path.resolve(modulesDir)
70
70
  },
@@ -1,3 +1,4 @@
1
+ const webpack = require('webpack');
1
2
  const { VueLoaderPlugin } = require('vue-loader');
2
3
 
3
4
  module.exports = (options, apos) => {
@@ -15,7 +16,12 @@ module.exports = (options, apos) => {
15
16
  },
16
17
  plugins: [
17
18
  // make sure to include the plugin for the magic
18
- new VueLoaderPlugin()
19
+ new VueLoaderPlugin(),
20
+ new webpack.DefinePlugin({
21
+ __VUE_OPTIONS_API__: 'true',
22
+ __VUE_PROD_DEVTOOLS__: 'false',
23
+ __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: 'false'
24
+ })
19
25
  ]
20
26
  };
21
27
  };
@@ -592,7 +592,8 @@ module.exports = {
592
592
  getMissingAttachmentUrl() {
593
593
  const defaultIconUrl = '/modules/@apostrophecms/attachment/img/missing-icon.svg';
594
594
  self.apos.util.warn('Template warning: Impossible to retrieve the attachment url since it is missing, a default icon has been set. Please fix this ASAP!');
595
- return defaultIconUrl;
595
+ // Convert static asset path to full URL, which matters when static assets are in uploadfs
596
+ return self.apos.asset.url(defaultIconUrl);
596
597
  },
597
598
  // This method is available as a template helper: apos.attachment.url
598
599
  //
@@ -0,0 +1,14 @@
1
+ <?xml version="1.0" encoding="iso-8859-1"?>
2
+ <svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
3
+ viewBox="0 0 29.536 29.536" style="enable-background:new 0 0 29.536 29.536; fill: red;" xml:space="preserve">
4
+ <g>
5
+ <path d="M14.768,0C6.611,0,0,6.609,0,14.768c0,8.155,6.611,14.767,14.768,14.767s14.768-6.612,14.768-14.767
6
+ C29.535,6.609,22.924,0,14.768,0z M14.768,27.126c-6.828,0-12.361-5.532-12.361-12.359c0-6.828,5.533-12.362,12.361-12.362
7
+ c6.826,0,12.359,5.535,12.359,12.362C27.127,21.594,21.594,27.126,14.768,27.126z"/>
8
+ <path d="M14.385,19.337c-1.338,0-2.289,0.951-2.289,2.34c0,1.336,0.926,2.339,2.289,2.339c1.414,0,2.314-1.003,2.314-2.339
9
+ C16.672,20.288,15.771,19.337,14.385,19.337z"/>
10
+ <path d="M14.742,6.092c-1.824,0-3.34,0.513-4.293,1.053l0.875,2.804c0.668-0.462,1.697-0.772,2.545-0.772
11
+ c1.285,0.027,1.879,0.644,1.879,1.543c0,0.85-0.67,1.697-1.494,2.701c-1.156,1.364-1.594,2.701-1.516,4.012l0.025,0.669h3.42
12
+ v-0.463c-0.025-1.158,0.387-2.162,1.311-3.215c0.979-1.08,2.211-2.366,2.211-4.321C19.705,7.968,18.139,6.092,14.742,6.092z"/>
13
+ </g>
14
+ </svg>
@@ -1,10 +1,11 @@
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
- return new Vue({
5
- el: '#apos-busy',
6
- render: function (h) {
7
- return h('TheAposBusy');
8
- }
9
- });
4
+ const component = apos.vueComponents.TheAposBusy;
5
+ const el = document.querySelector('#apos-busy');
6
+ if (!el) {
7
+ return;
8
+ }
9
+ const app = createApp(component);
10
+ app.mount(el);
10
11
  };
@@ -76,7 +76,7 @@ export default {
76
76
  z-index: $z-index-default;
77
77
  width: 60px;
78
78
  height: 60px;
79
- & ::v-deep svg {
79
+ &:deep(svg) {
80
80
  width: 100%;
81
81
  height: 100%;
82
82
  }
@@ -1,34 +1,16 @@
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.TheAposCommandMenu;
4
5
  // Careful, login page is in user scene but has no command menu
5
- if (apos.commandMenu) {
6
- const theAposCommandMenu = new Vue({
7
- el: '#apos-command-menu',
8
- computed: {
9
- apos () {
10
- return window.apos;
11
- }
12
- },
13
- methods: {
14
- getModal() {
15
- return this.$refs.commandMenu.modal;
16
- }
17
- },
18
- render(h) {
19
- return h(
20
- apos.commandMenu.components.the,
21
- {
22
- ref: 'commandMenu',
23
- props: {
24
- groups: apos.commandMenu.groups,
25
- modals: apos.commandMenu.modals
26
- }
27
- }
28
- );
29
- }
30
- });
31
-
32
- apos.commandMenu.getModal = theAposCommandMenu.getModal;
6
+ const el = document.querySelector('#apos-command-menu');
7
+ if (!apos.commandMenu || !el) {
8
+ return;
33
9
  }
10
+ const app = createApp(component, {
11
+ modals: apos.commandMenu.modals
12
+ });
13
+ const theAposCommandMenu = app.mount(el);
14
+
15
+ apos.commandMenu.getModal = theAposCommandMenu.getModal;
34
16
  }
@@ -7,7 +7,7 @@
7
7
  class="apos-button__icon"
8
8
  fill-color="color"
9
9
  />
10
- <slot name="label" v-if="label">
10
+ <slot v-if="label" name="label">
11
11
  {{ $t(label ) }}
12
12
  </slot>
13
13
  </span>
@@ -88,7 +88,7 @@ export default {
88
88
  this.$emit('safe-close');
89
89
  }
90
90
  },
91
- beforeDestroy() {
91
+ beforeUnmount() {
92
92
  apos.bus.$off('modal-launched', this.autoCloseWhenHidden);
93
93
  apos.bus.$off('modal-resolved', this.close);
94
94
  },
@@ -125,11 +125,11 @@ export default {
125
125
  </script>
126
126
 
127
127
  <style lang="scss" scoped>
128
- ::v-deep .apos-modal__body {
128
+ :deep(.apos-modal__body) {
129
129
  padding: 0;
130
130
  }
131
131
 
132
- ::v-deep .apos-modal__inner {
132
+ :deep(.apos-modal__inner) {
133
133
  top: auto;
134
134
  left: auto;
135
135
  max-width: 700px;
@@ -137,7 +137,7 @@ export default {
137
137
  border-radius: $spacing-base + $spacing-half;
138
138
  }
139
139
 
140
- ::v-deep .apos-modal__overlay {
140
+ :deep(.apos-modal__overlay) {
141
141
  display: none;
142
142
  }
143
143
 
@@ -153,7 +153,7 @@ export default {
153
153
  padding: 0 $spacing-base + $spacing-half;
154
154
  }
155
155
 
156
- ::v-deep .apos-button {
156
+ :deep(.apos-button) {
157
157
  display: inline-flex;
158
158
  align-items: center;
159
159
  box-sizing: border-box;
@@ -176,7 +176,7 @@ export default {
176
176
  }
177
177
 
178
178
  .apos-command-menu-key {
179
- ::v-deep button {
179
+ :deep(button) {
180
180
  width: $spacing-double;
181
181
  height: $spacing-double;
182
182
  padding: 3px $spacing-half;