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
@@ -3,15 +3,15 @@
3
3
  <template #leftControls>
4
4
  <AposButton
5
5
  v-if="canSelectAll"
6
+ ref="selectAll"
6
7
  label="apostrophe:select"
7
8
  type="outline"
8
9
  :modifiers="['small']"
9
10
  text-color="var(--a-base-1)"
10
11
  :icon-only="true"
11
12
  :icon="checkboxIcon"
12
- @click="selectAll"
13
- ref="selectAll"
14
13
  data-apos-test="selectAll"
14
+ @click="selectAll"
15
15
  />
16
16
  <div
17
17
  v-for="{
@@ -50,8 +50,10 @@
50
50
  <template #rightControls>
51
51
  <AposPager
52
52
  v-if="!options.noPager && totalPages !== 0"
53
- @click="registerPageChange" @change="registerPageChange"
54
- :total-pages="totalPages" :current-page="currentPage"
53
+ :total-pages="totalPages"
54
+ :current-page="currentPage"
55
+ @click="registerPageChange"
56
+ @change="registerPageChange"
55
57
  />
56
58
  <AposFilterMenu
57
59
  v-if="filters.length"
@@ -62,11 +64,13 @@
62
64
  />
63
65
  <AposInputString
64
66
  v-if="hasSearch"
65
- @input="search" @return="search($event, true)"
67
+ ref="search"
66
68
  :field="searchField.field"
67
- :status="searchField.status" :value="searchField.value"
69
+ :status="searchField.status"
70
+ :model-value="searchField.value"
68
71
  :modifiers="['small']"
69
- ref="search"
72
+ @update:model-value="search"
73
+ @return="search($event, true)"
70
74
  />
71
75
  </template>
72
76
  </AposModalToolbar>
@@ -188,7 +192,7 @@ export default {
188
192
  apos.bus.$on('command-menu-manager-archive-selected', this.archiveSelected);
189
193
  apos.bus.$on('command-menu-manager-focus-search', this.focusSearch);
190
194
  },
191
- destroyed () {
195
+ unmounted () {
192
196
  apos.bus.$off('command-menu-manager-select-all', this.selectAll);
193
197
  apos.bus.$off('command-menu-manager-archive-selected', this.archiveSelected);
194
198
  apos.bus.$off('command-menu-manager-focus-search', this.focusSearch);
@@ -322,11 +326,11 @@ export default {
322
326
  </script>
323
327
 
324
328
  <style lang="scss" scoped>
325
- .apos-manager-toolbar ::v-deep {
326
- .apos-field--search {
329
+ .apos-manager-toolbar {
330
+ :deep(.apos-field--search) {
327
331
  width: 250px;
328
332
  }
329
- .apos-input {
333
+ :deep(.apos-input) {
330
334
  height: 32px;
331
335
  }
332
336
  }
@@ -1,26 +1,26 @@
1
1
  <template>
2
2
  <transition
3
3
  :name="transitionType"
4
+ :duration="250"
4
5
  @enter="onEnter"
5
6
  @leave="onLeave"
6
- :duration="250"
7
7
  >
8
8
  <section
9
9
  v-if="modal.active"
10
+ ref="modalEl"
10
11
  :class="classes"
11
12
  role="dialog"
12
13
  aria-modal="true"
13
14
  :aria-labelledby="id"
14
- ref="modalEl"
15
+ data-apos-modal
15
16
  @keydown="cycleElementsToFocus"
16
17
  @focus.capture="storeFocusedElement"
17
- data-apos-modal
18
18
  >
19
19
  <transition :name="transitionType">
20
20
  <div
21
- @click="close"
22
21
  v-if="modal.showModal"
23
22
  class="apos-modal__overlay"
23
+ @click="close"
24
24
  />
25
25
  </transition>
26
26
  <transition :name="transitionType" @after-leave="$emit('inactive')">
@@ -39,7 +39,7 @@
39
39
  </div>
40
40
  </template>
41
41
  <template v-else>
42
- <header class="apos-modal__header" v-if="!modal.disableHeader">
42
+ <header v-if="!modal.disableHeader" class="apos-modal__header">
43
43
  <div class="apos-modal__header__main">
44
44
  <div v-if="hasSecondaryControls" class="apos-modal__controls--secondary">
45
45
  <slot name="secondaryControls" />
@@ -50,20 +50,20 @@
50
50
  </span>
51
51
  {{ $t(modalTitle) }}
52
52
  </h2>
53
- <div class="apos-modal__controls--header" v-if="hasBeenLocalized || hasPrimaryControls">
54
- <div class="apos-modal__locale" v-if="hasBeenLocalized">
53
+ <div v-if="hasBeenLocalized || hasPrimaryControls" class="apos-modal__controls--header">
54
+ <div v-if="hasBeenLocalized" class="apos-modal__locale">
55
55
  <span class="apos-modal__locale-label">
56
56
  {{ $t('apostrophe:locale') }}:
57
57
  </span> <span class="apos-modal__locale-name">
58
58
  {{ currentLocale }}
59
59
  </span>
60
60
  </div>
61
- <div class="apos-modal__controls--primary" v-if="hasPrimaryControls">
61
+ <div v-if="hasPrimaryControls" class="apos-modal__controls--primary">
62
62
  <slot name="primaryControls" />
63
63
  </div>
64
64
  </div>
65
65
  </div>
66
- <div class="apos-modal__breadcrumbs" v-if="hasBreadcrumbs">
66
+ <div v-if="hasBreadcrumbs" class="apos-modal__breadcrumbs">
67
67
  <slot class="apos-modal__breadcrumbs" name="breadcrumbs" />
68
68
  </div>
69
69
  </header>
@@ -308,7 +308,7 @@ export default {
308
308
  top: 0;
309
309
  bottom: 0;
310
310
  transform: translateX(0);
311
- width: 90%;
311
+ width: 100%;
312
312
  border-radius: 0;
313
313
  height: 100vh;
314
314
 
@@ -339,6 +339,12 @@ export default {
339
339
  }
340
340
  }
341
341
 
342
+ &.apos-modal__inner--full {
343
+ @media screen and (min-width: 800px) {
344
+ max-width: 100%;
345
+ }
346
+ }
347
+
342
348
  &.slide-left-enter,
343
349
  &.slide-left-leave-to {
344
350
  transform: translateX(100%);
@@ -448,7 +454,7 @@ export default {
448
454
  justify-content: flex-end;
449
455
  flex-grow: 1;
450
456
  }
451
- .apos-modal__controls--primary ::v-deep {
457
+ :deep(.apos-modal__controls--primary) {
452
458
  & > .apos-button__wrapper,
453
459
  & > .apos-context-menu {
454
460
  margin-left: 7.5px;
@@ -2,11 +2,13 @@
2
2
  <nav :class="['apos-breadcrumb', classObj]" aria-label="breadcrumb">
3
3
  <ol class="apos-breadcrumb__items">
4
4
  <li
5
- v-for="(item, index) in items" :key="index"
5
+ v-for="(item, index) in items"
6
+ :key="index"
6
7
  :class="`apos-breadcrumb__item ${modifier}`"
7
8
  >
8
9
  <component
9
- :is="item.target ? 'button' : 'span'" :data-apos-target="item.target"
10
+ :is="item.target ? 'button' : 'span'"
11
+ :data-apos-target="item.target"
10
12
  :type="item.target ? 'button' : null"
11
13
  :aria-label="item.target ? {
12
14
  key: 'apostrophe:returnToPage',
@@ -17,8 +19,9 @@
17
19
  {{ item.label }}
18
20
  </component>
19
21
  <ChevronRightIcon
20
- class="apos-breadcrumb__chevron" :size="13"
21
22
  v-if="index !== last"
23
+ class="apos-breadcrumb__chevron"
24
+ :size="13"
22
25
  />
23
26
  </li>
24
27
  </ol>
@@ -26,7 +29,7 @@
26
29
  </template>
27
30
 
28
31
  <script>
29
- import ChevronRightIcon from 'vue-material-design-icons/ChevronRight.vue';
32
+ import ChevronRightIcon from '@apostrophecms/vue-material-design-icons/ChevronRight.vue';
30
33
 
31
34
  export default {
32
35
  name: 'AposModalBreadcrumbs',
@@ -28,8 +28,8 @@
28
28
  {{ localize(content.description) }}
29
29
  </p>
30
30
  <Component
31
- v-if="content.body"
32
31
  :is="content.body.component"
32
+ v-if="content.body"
33
33
  v-bind="content.body.props"
34
34
  />
35
35
  <div v-if="content.form" class="apos-confirm__schema">
@@ -48,15 +48,15 @@
48
48
  @click="cancel"
49
49
  />
50
50
  <AposButton
51
+ ref="confirm"
51
52
  class="apos-confirm__btn"
52
53
  :label="affirmativeLabel"
53
- @click="confirm"
54
54
  :type="content.theme || 'primary'"
55
55
  :disabled="isDisabled"
56
- ref="confirm"
56
+ @click="confirm"
57
57
  />
58
58
  </div>
59
- <p class="apos-confirm__note" v-if="content.note">
59
+ <p v-if="content.note" class="apos-confirm__note">
60
60
  {{ localize(content.note) }}
61
61
  </p>
62
62
  </template>
@@ -167,7 +167,7 @@ export default {
167
167
  justify-content: center;
168
168
  }
169
169
 
170
- ::v-deep .apos-modal__inner {
170
+ :deep(.apos-modal__inner) {
171
171
  top: auto;
172
172
  right: auto;
173
173
  bottom: auto;
@@ -177,17 +177,17 @@ export default {
177
177
  text-align: center;
178
178
  }
179
179
 
180
- ::v-deep .apos-modal__overlay {
180
+ :deep(.apos-modal__overlay) {
181
181
  .apos-modal + .apos-confirm & {
182
182
  display: block;
183
183
  }
184
184
  }
185
185
 
186
- ::v-deep .apos-modal__body {
186
+ :deep(.apos-modal__body) {
187
187
  padding: 60px;
188
188
  }
189
189
 
190
- ::v-deep .apos-modal__body-main {
190
+ :deep(.apos-modal__body-main) {
191
191
  display: flex;
192
192
  flex-direction: column;
193
193
  align-items: center;
@@ -223,7 +223,7 @@ export default {
223
223
  margin-top: $spacing-base;
224
224
  }
225
225
 
226
- ::v-deep .apos-schema .apos-field {
226
+ :deep(.apos-schema .apos-field) {
227
227
  margin-bottom: $spacing-base;
228
228
  }
229
229
 
@@ -1,14 +1,14 @@
1
1
  <template>
2
2
  <!-- Disabling since the SVG is mostly not active vue template code. -->
3
3
  <!-- eslint-disable vue/max-attributes-per-line -->
4
- <div class="apos-modal-lip" ref="lip">
4
+ <div ref="lip" class="apos-modal-lip">
5
5
  <div class="apos-modal-lip__shadow">
6
6
  <svg width="406px" height="56px" viewBox="0 0 406 56" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
7
7
  <title>Shadow</title>
8
8
  <defs>
9
9
  <rect id="shadow-path-1" x="0" y="0" width="406" height="56" />
10
10
  <rect id="shadow-path-3" x="-13" y="20" width="432" height="83" />
11
- <filter x="-6.2%" y="-28.9%" width="112.5%" height="165.1%" filterUnits="objectBoundingBox" id="shadow-filter-4">
11
+ <filter id="shadow-filter-4" x="-6.2%" y="-28.9%" width="112.5%" height="165.1%" filterUnits="objectBoundingBox">
12
12
  <feMorphology radius="3" operator="dilate" in="SourceAlpha" result="shadowSpreadOuter1" />
13
13
  <feOffset dx="0" dy="0" in="shadowSpreadOuter1" result="shadowOffsetOuter1" />
14
14
  <feGaussianBlur stdDeviation="6.5" in="shadowOffsetOuter1" result="shadowBlurOuter1" />
@@ -30,7 +30,7 @@
30
30
  class="apos-share-draft__toggle"
31
31
  @toggle="toggle"
32
32
  />
33
- <p @click="toggle" class="apos-share-draft__toggle-label">
33
+ <p class="apos-share-draft__toggle-label" @click="toggle">
34
34
  {{ $t('apostrophe:shareDraftEnable') }}
35
35
  </p>
36
36
  </div>
@@ -42,8 +42,8 @@
42
42
  :duration="200"
43
43
  >
44
44
  <div
45
- class="apos-share-draft__url-block"
46
45
  v-show="!disabled"
46
+ class="apos-share-draft__url-block"
47
47
  >
48
48
  <input
49
49
  v-model="shareUrl"
@@ -74,8 +74,8 @@
74
74
  </template>
75
75
 
76
76
  <script>
77
- import Close from 'vue-material-design-icons/Close.vue';
78
- import LinkVariant from 'vue-material-design-icons/LinkVariant.vue';
77
+ import Close from '@apostrophecms/vue-material-design-icons/Close.vue';
78
+ import LinkVariant from '@apostrophecms/vue-material-design-icons/LinkVariant.vue';
79
79
 
80
80
  export default {
81
81
  components: {
@@ -213,7 +213,7 @@ export default {
213
213
  justify-content: center;
214
214
  }
215
215
 
216
- ::v-deep .apos-modal__inner {
216
+ :deep(.apos-modal__inner) {
217
217
  top: auto;
218
218
  right: auto;
219
219
  bottom: auto;
@@ -223,17 +223,17 @@ export default {
223
223
  border-radius: 15px;
224
224
  }
225
225
 
226
- ::v-deep .apos-modal__overlay {
226
+ :deep(.apos-modal__overlay) {
227
227
  .apos-modal + .apos-share-draft & {
228
228
  display: block;
229
229
  }
230
230
  }
231
231
 
232
- ::v-deep .apos-modal__body {
232
+ :deep(.apos-modal__body) {
233
233
  padding: 20px;
234
234
  }
235
235
 
236
- ::v-deep .apos-modal__body-main {
236
+ :deep(.apos-modal__body-main) {
237
237
  display: flex;
238
238
  flex-direction: column;
239
239
  align-items: center;
@@ -2,13 +2,14 @@
2
2
  <div class="apos-modal-tabs">
3
3
  <ul class="apos-modal-tabs__tabs">
4
4
  <li
5
- class="apos-modal-tabs__tab"
6
5
  v-for="tab in tabs"
7
- :key="tab.name"
8
6
  v-show="tab.isVisible !== false"
7
+ :key="tab.name"
8
+ class="apos-modal-tabs__tab"
9
9
  >
10
10
  <button
11
- :id="tab.name" class="apos-modal-tabs__btn"
11
+ :id="tab.name"
12
+ class="apos-modal-tabs__btn"
12
13
  :aria-selected="tab.name === current ? true : false"
13
14
  @click="selectTab"
14
15
  >
@@ -35,16 +35,16 @@ export default {
35
35
  justify-content: space-between;
36
36
  }
37
37
 
38
- .apos-toolbar__group--left > * {
39
- margin-right: 7.5px;
38
+ .apos-toolbar__group {
39
+ display: flex;
40
+ align-items: center;
40
41
  }
41
42
 
42
- .apos-toolbar__group--right > * {
43
- margin-left: 20px;
43
+ .apos-toolbar__group--left > :deep(*) {
44
+ margin-right: 7.5px;
44
45
  }
45
46
 
46
- .apos-toolbar__group {
47
- display: flex;
48
- align-items: center;
47
+ .apos-toolbar__group--right > :deep(*) {
48
+ margin-left: 20px;
49
49
  }
50
50
  </style>
@@ -1,11 +1,13 @@
1
1
  <template>
2
2
  <div
3
- id="apos-modals" :class="themeClass"
3
+ id="apos-modals"
4
+ :class="themeClass"
4
5
  >
5
6
  <component
6
- v-for="modal in stack" :key="modal.id"
7
- :is="modal.componentName"
8
7
  v-bind="modal.props"
8
+ :is="modal.componentName"
9
+ v-for="modal in stack"
10
+ :key="modal.id"
9
11
  @modal-result="modal.result = $event"
10
12
  @safe-close="resolve(modal)"
11
13
  />
@@ -64,7 +66,7 @@ export default {
64
66
  },
65
67
  methods: {
66
68
  async execute(componentName, props) {
67
- return new Promise((resolve, reject) => {
69
+ return new Promise((resolve) => {
68
70
  const item = {
69
71
  id: cuid(),
70
72
  componentName,
@@ -112,6 +114,22 @@ export default {
112
114
  };
113
115
 
114
116
  return properties;
117
+ },
118
+
119
+ async confirm(content, options = {}) {
120
+ return this.execute(apos.modal.components.confirm, {
121
+ content,
122
+ mode: 'confirm',
123
+ options
124
+ });
125
+ },
126
+
127
+ async alert(alertContent, options = {}) {
128
+ return this.execute(apos.modal.components.confirm, {
129
+ content: alertContent,
130
+ mode: 'alert',
131
+ options
132
+ });
115
133
  }
116
134
  }
117
135
  };
@@ -0,0 +1,95 @@
1
+ import { ref } from 'vue';
2
+
3
+ export function useAposFocus() {
4
+ const elementsToFocus = ref([]);
5
+ const focusedElement = ref(null);
6
+
7
+ return {
8
+ elementsToFocus,
9
+ focusedElement,
10
+ cycleElementsToFocus,
11
+ focuslastmodalfocusedelement,
12
+ storeFocusedElement,
13
+ focusElement,
14
+ isElementVisible
15
+ };
16
+
17
+ // Adapted from https://uxdesign.cc/how-to-trap-focus-inside-modal-to-make-it-ada-compliant-6a50f9a70700
18
+ // All the elements inside modal which you want to make focusable.
19
+ //
20
+ // This has been adapted to Vue logic with `this.elementsToFocus` array as a data
21
+ // so that any elements, not only from a modal but a menu for instance, can be focusable.
22
+ // `cycleElementsToFocus` listeners relies on this dynamic list which has the advantage of
23
+ // taking new or less elements to focus, after an update has happened inside a modal,
24
+ // like an XHR call to get the pieces list in the AposDocsManager modal, for instance.
25
+ function cycleElementsToFocus(e) {
26
+ if (!elementsToFocus.value.length) {
27
+ return;
28
+ }
29
+
30
+ const isTabPressed = e.key === 'Tab' || e.code === 'Tab';
31
+ if (!isTabPressed) {
32
+ return;
33
+ }
34
+
35
+ const firstElementToFocus = elementsToFocus.value.at(0);
36
+ const lastElementToFocus = elementsToFocus.value.at(-1);
37
+
38
+ // If shift key pressed for shift + tab combination
39
+ if (e.shiftKey) {
40
+ if (document.activeElement === firstElementToFocus) {
41
+ // Add focus for the last focusable element
42
+ lastElementToFocus.focus();
43
+ e.preventDefault();
44
+ }
45
+ return;
46
+ }
47
+
48
+ // If tab key is pressed
49
+ if (document.activeElement === lastElementToFocus) {
50
+ // Add focus for the first focusable element
51
+ firstElementToFocus.focus();
52
+ e.preventDefault();
53
+ }
54
+ }
55
+
56
+ // Focus the last focused element from the last modal.
57
+ // If it is not focusable (not visible/not in the DOM),
58
+ // fallbacks to the first focusable element from the last modal.
59
+ function focuslastmodalfocusedelement() {
60
+ const lastModal = apos.modal.stack.at(-1);
61
+
62
+ if (!lastModal) {
63
+ return;
64
+ }
65
+
66
+ const { focusedElement, elementsToFocus } = lastModal;
67
+
68
+ focusElement(focusedElement, elementsToFocus[0]);
69
+ }
70
+
71
+ function storeFocusedElement(e) {
72
+ focusedElement.value = e.target;
73
+ }
74
+
75
+ // Iterate through elements given in arguments and
76
+ // focus the first element that exists in the DOM.
77
+ function focusElement(...elementsToFocus) {
78
+ for (const element of elementsToFocus) {
79
+ const isAlreadySelected = document.activeElement === element;
80
+
81
+ if (!element || !isElementVisible(element)) {
82
+ continue;
83
+ }
84
+ if (!isAlreadySelected) {
85
+ element.focus();
86
+ }
87
+ // Element exists in the DOM and is focused, stop iterating.
88
+ return;
89
+ }
90
+ }
91
+
92
+ function isElementVisible(element) {
93
+ return element.offsetParent !== null;
94
+ }
95
+ }
@@ -12,8 +12,7 @@ export default {
12
12
  icons: {},
13
13
  // If passing in chosen items from the relationship input, use those
14
14
  // as initially checked.
15
- checked: Array.isArray(this.chosen) ? this.chosen.map(item => item._id)
16
- : [],
15
+ checked: Array.isArray(this.chosen) ? this.chosen.map(item => item._id) : [],
17
16
  checkedDocs: Array.isArray(this.chosen) ? klona(this.chosen) : [],
18
17
  // Remember relationship subfield values even if a document
19
18
  // is temporarily deselected, easing the user's pain if they
@@ -86,7 +85,7 @@ export default {
86
85
  mounted() {
87
86
  this.docsManagerAddEventHandlers();
88
87
  },
89
- destroyed() {
88
+ unmounted() {
90
89
  this.docsManagerRemoveEventHandlers();
91
90
  },
92
91
  watch: {
@@ -20,6 +20,12 @@ import {
20
20
  } from 'Modules/@apostrophecms/schema/lib/conditionalFields.js';
21
21
 
22
22
  export default {
23
+ props: {
24
+ parentFollowingValues: {
25
+ type: Object,
26
+ default: null
27
+ }
28
+ },
23
29
  data() {
24
30
  return {
25
31
  docFields: {
@@ -154,7 +154,7 @@ module.exports = {
154
154
  dismissed
155
155
  });
156
156
 
157
- return self.db.updateOne({ _id }, {
157
+ await self.db.updateOne({ _id }, {
158
158
  $set: {
159
159
  dismissed
160
160
  },
@@ -164,8 +164,8 @@ module.exports = {
164
164
  });
165
165
  }
166
166
  },
167
- delete(req, _id) {
168
- return self.db.deleteMany({ _id });
167
+ async delete(req, _id) {
168
+ await self.db.deleteMany({ _id });
169
169
  }
170
170
  }),
171
171
  apiRoutes(self) {
@@ -414,7 +414,7 @@ module.exports = {
414
414
 
415
415
  async ensureCollection() {
416
416
  self.db = self.apos.db.collection('aposNotifications');
417
- return self.db.createIndex({
417
+ await self.db.createIndex({
418
418
  userId: 1,
419
419
  createdAt: 1
420
420
  });
@@ -1,16 +1,13 @@
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
- if (!apos.login.user) {
4
+ const component = apos.vueComponents.TheAposNotifications;
5
+ const el = document.querySelector('#apos-notification');
6
+ if (!apos.login.user || !el) {
5
7
  // The user scene is being used but no one is logged in
6
8
  // (example: the login page)
7
9
  return;
8
10
  }
9
-
10
- return new Vue({
11
- el: '#apos-notification',
12
- render: function (h) {
13
- return h('TheAposNotifications');
14
- }
15
- });
11
+ const app = createApp(component);
12
+ app.mount(el);
16
13
  };