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,64 +1,42 @@
1
1
  <template>
2
- <!-- Disabling since the SVG is mostly not active vue template code. -->
3
- <!-- eslint-disable vue/max-attributes-per-line -->
4
2
  <svg
5
- :class="alignmentModifier"
6
- class="apos-context-menu__tip" width="27px" height="11px" viewBox="0 0 27 11" version="1.1" xmlns="http://www.w3.org/2000/svg"
3
+ :ref="(el) => emit('set-arrow', el)"
4
+ class="apos-context-menu__tip"
5
+ width="27px"
6
+ height="11px"
7
+ viewBox="0 0 27 11"
8
+ version="1.1"
9
+ xmlns="http://www.w3.org/2000/svg"
7
10
  >
8
- <g width="27px" height="11px" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
9
- <path class="apos-context-menu__tip-outline" d="M17.2842712,1.46446609 L25.748,9.928 L1.749,9.928 L10.2132034,1.46446609 C12.1658249,-0.488155365 15.3316498,-0.488155365 17.2842712,1.46446609 Z" stroke="var(--a-base-8)" />
10
- <path class="apos-context-menu__tip-background" d="M17.0029602,1.84623992 C15.3903198,0.179595947 12.5749711,0.0148310371 10.7918701,1.61499023 C9.60313614,2.68176303 9.52086075,2.75884626 10.5450439,1.84623992 L0.815307617,11.4361572 L26.6676025,11.4361572 L17.0029602,1.84623992 Z" fill="var(--a-background-primary)" fill-rule="nonzero" />
11
+ <g
12
+ width="27px"
13
+ height="11px"
14
+ stroke="none"
15
+ stroke-width="1"
16
+ fill="none"
17
+ fill-rule="evenodd"
18
+ >
19
+ <path
20
+ class="apos-context-menu__tip-outline"
21
+ d="M17.2842712,1.46446609 L25.748,9.928 L1.749,9.928 L10.2132034,1.46446609 C12.1658249,-0.488155365 15.3316498,-0.488155365 17.2842712,1.46446609 Z"
22
+ stroke="var(--a-base-8)"
23
+ />
24
+ <path
25
+ class="apos-context-menu__tip-background"
26
+ d="M17.0029602,1.84623992 C15.3903198,0.179595947 12.5749711,0.0148310371 10.7918701,1.61499023 C9.60313614,2.68176303 9.52086075,2.75884626 10.5450439,1.84623992 L0.815307617,11.4361572 L26.6676025,11.4361572 L17.0029602,1.84623992 Z"
27
+ fill="var(--a-background-primary)"
28
+ fill-rule="nonzero"
29
+ />
11
30
  </g>
12
31
  </svg>
13
- <!-- eslint-enable vue/max-attributes-per-line -->
14
32
  </template>
15
33
 
16
- <script>
17
- export default {
18
- name: 'AposContextMenuTip',
19
- props: {
20
- align: {
21
- type: String,
22
- required: true
23
- }
24
- },
25
- computed: {
26
- alignmentModifier () {
27
- return `apos-context-menu__tip--alignment-${this.align}`;
28
- }
29
- }
30
- };
34
+ <script setup>
35
+ const emit = defineEmits([ 'set-arrow' ]);
31
36
  </script>
32
37
 
33
38
  <style lang="scss">
34
39
  .apos-context-menu__tip {
35
40
  position: absolute;
36
41
  }
37
-
38
- .apos-context-menu__tip--alignment-start {
39
- left: 20px;
40
- }
41
-
42
- .apos-context-menu__tip--alignment-center {
43
- right: 0;
44
- left: 0;
45
- margin-left: auto;
46
- margin-right: auto;
47
- }
48
-
49
- .apos-context-menu__tip--alignment-end {
50
- right: 20px;
51
- }
52
-
53
- .apos-popover[x-placement^='bottom'] .apos-context-menu__tip {
54
- top: -10px;
55
- bottom: auto;
56
- }
57
-
58
- .apos-popover[x-placement^='top'] .apos-context-menu__tip {
59
- top: auto;
60
- bottom: -10px;
61
- transform: rotate(180deg);
62
- }
63
-
64
42
  </style>
@@ -1,12 +1,12 @@
1
1
  <template>
2
2
  <div class="apos-empty-state">
3
- <p class="apos-title" v-if="emptyState.title">
3
+ <p v-if="emptyState.title" class="apos-title">
4
4
  {{ $t(emptyState.title) }}
5
5
  </p>
6
- <p class="apos-hint" v-if="emptyState.message">
6
+ <p v-if="emptyState.message" class="apos-hint">
7
7
  {{ $t(emptyState.message) }}
8
8
  </p>
9
- <div class="apos-emoji" v-if="emptyState.emoji">
9
+ <div v-if="emptyState.emoji" class="apos-emoji">
10
10
  {{ emptyState.emoji }}
11
11
  </div>
12
12
  </div>
@@ -18,7 +18,7 @@
18
18
  <template v-else>
19
19
  <paperclip-icon :size="14" class="apos-file-icon" />
20
20
  {{ messages.primary }}&nbsp;
21
- <span class="apos-file-highlight" v-if="messages.highlighted">
21
+ <span v-if="messages.highlighted" class="apos-file-highlight">
22
22
  {{ messages.highlighted }}
23
23
  </span>
24
24
  </template>
@@ -28,15 +28,15 @@
28
28
  type="file"
29
29
  class="apos-sr-only"
30
30
  :disabled="disabled || fileOrAttachment"
31
- @input="uploadFile"
32
31
  :accept="allowedExtensions"
32
+ @input="uploadFile"
33
33
  >
34
34
  </label>
35
35
  <div v-if="fileOrAttachment" class="apos-file-files">
36
36
  <AposSlatList
37
- :value="[fileOrAttachment]"
38
- @input="update"
37
+ :model-value="[fileOrAttachment]"
39
38
  :disabled="attachmentDisabled"
39
+ @update:model-value="update"
40
40
  />
41
41
  </div>
42
42
  </div>
@@ -200,7 +200,7 @@ export default {
200
200
  justify-content: center;
201
201
  pointer-events: none;
202
202
  // v-html goofiness
203
- & ::v-deep .apos-file-highlight {
203
+ &:deep(.apos-file-highlight) {
204
204
  color: var(--a-primary);
205
205
  font-weight: var(--a-weight-bold);
206
206
  }
@@ -9,12 +9,12 @@
9
9
  <component
10
10
  :is="map[set.field.type]"
11
11
  :field="set.field"
12
- :value="set.value"
12
+ :model-value="set.value"
13
13
  :status="set.status"
14
14
  :icon="
15
15
  set.field.type === 'select' ? 'unfold-more-horizontal-icon' : ''
16
16
  "
17
- @input="input($event, set.name)"
17
+ @update:model-value="input($event, set.name)"
18
18
  />
19
19
  </div>
20
20
  </div>
@@ -133,7 +133,7 @@ export default {
133
133
  .apos-filters-menu {
134
134
  min-width: 140px;
135
135
 
136
- ::v-deep .apos-input--select {
136
+ :deep(.apos-input--select) {
137
137
  padding-top: 10px;
138
138
  padding-bottom: 10px;
139
139
  background-color: var(--a-base-10);
@@ -141,7 +141,7 @@ export default {
141
141
  }
142
142
  }
143
143
 
144
- .apos-filters-menu ::v-deep .apos-field__label {
144
+ .apos-filters-menu :deep(.apos-field__label) {
145
145
  display: block;
146
146
  width: 100%;
147
147
  padding-bottom: 10px;
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <span
3
- class="apos-indicator"
4
3
  v-apos-tooltip="tooltip"
4
+ class="apos-indicator"
5
5
  :aria-hidden="decorative"
6
6
  >
7
7
  <component
@@ -1,8 +1,8 @@
1
1
  <template>
2
2
  <span
3
+ v-apos-tooltip="tooltip"
3
4
  class="apos-label"
4
5
  :class="modifiers"
5
- v-apos-tooltip="tooltip"
6
6
  >
7
7
  {{ $t(label) }}
8
8
  </span>
@@ -28,7 +28,7 @@
28
28
  export default {
29
29
  name: 'AposMinMaxCount',
30
30
  props: {
31
- value: {
31
+ modelValue: {
32
32
  required: true,
33
33
  type: Array
34
34
  },
@@ -39,12 +39,12 @@ export default {
39
39
  },
40
40
  computed: {
41
41
  maxed() {
42
- return (this.field.max !== undefined) && (this.value.length >= this.field.max);
42
+ return (this.field.max !== undefined) && (this.modelValue.length >= this.field.max);
43
43
  },
44
44
  minError() {
45
45
  let minError = false;
46
46
  if (this.effectiveMin) {
47
- if (this.value.length < this.effectiveMin) {
47
+ if (this.modelValue.length < this.effectiveMin) {
48
48
  minError = true;
49
49
  }
50
50
  }
@@ -54,7 +54,7 @@ export default {
54
54
  maxError() {
55
55
  let maxError = false;
56
56
  if (this.field.max !== undefined) {
57
- if (this.value.length > this.field.max) {
57
+ if (this.modelValue.length > this.field.max) {
58
58
  maxError = true;
59
59
  }
60
60
  }
@@ -62,7 +62,7 @@ export default {
62
62
  },
63
63
  countLabel() {
64
64
  return this.$t('apostrophe:numberAdded', {
65
- count: this.value.length
65
+ count: this.modelValue.length
66
66
  });
67
67
  },
68
68
  // Here in the array editor we use effectiveMin to factor in the
@@ -3,19 +3,23 @@
3
3
  <AposButton
4
4
  :disabled="currentPage == 1"
5
5
  class="apos-pager__btn"
6
+ type="outline"
7
+ icon="chevron-left-icon"
6
8
  :modifiers="['small']"
7
- type="outline" @click="incrementPage(-1)"
8
- :icon-only="true" icon="chevron-left-icon"
9
+ :icon-only="true"
9
10
  :label="prevButtonLabel"
11
+ @click="incrementPage(-1)"
10
12
  />
11
13
  <div class="apos-input-wrapper">
12
14
  <select
13
- :disabled="totalPages <= 1"
15
+ v-model="selectedPage"
14
16
  class="apos-pager__page-select apos-input apos-input--select"
15
- v-model="selectedPage" :aria-label="$t('apostrophe:selectPage')"
17
+ :disabled="totalPages <= 1"
18
+ :aria-label="$t('apostrophe:selectPage')"
16
19
  >
17
20
  <option
18
- v-for="num in totalPages" :key="num"
21
+ v-for="num in totalPages"
22
+ :key="num"
19
23
  :value="num"
20
24
  >
21
25
  {{ $t('apostrophe:pageNumber', { number: num }) }}
@@ -25,17 +29,19 @@
25
29
  </div>
26
30
  <AposButton
27
31
  :disabled="currentPage >= totalPages"
32
+ type="outline"
28
33
  class="apos-pager__btn"
34
+ icon="chevron-right-icon"
29
35
  :modifiers="['small']"
30
- type="outline" @click="incrementPage(1)"
31
- :icon-only="true" icon="chevron-right-icon"
36
+ :icon-only="true"
32
37
  :label="nextButtonLabel"
38
+ @click="incrementPage(1)"
33
39
  />
34
40
  </nav>
35
41
  </template>
36
42
 
37
43
  <script>
38
- import MenuSwap from 'vue-material-design-icons/MenuSwap.vue';
44
+ import MenuSwap from '@apostrophecms/vue-material-design-icons/MenuSwap.vue';
39
45
 
40
46
  export default {
41
47
  name: 'AposPager',
@@ -1,8 +1,9 @@
1
1
  <template>
2
2
  <ul class="apos-pager-dots">
3
3
  <li
4
- class="apos-pager-dots__item" v-for="i in dots"
4
+ v-for="i in dots"
5
5
  :key="i"
6
+ class="apos-pager-dots__item"
6
7
  >
7
8
  <button
8
9
  role="button"
@@ -11,6 +11,9 @@
11
11
  'apos-is-selected': selected,
12
12
  'apos-is-disabled': disabled,
13
13
  }"
14
+ :aria-pressed="engaged"
15
+ role="listitem"
16
+ :aria-labelledby="parent"
14
17
  @keydown.prevent.space="toggleEngage"
15
18
  @keydown.prevent.enter="toggleEngage"
16
19
  @keydown.prevent.escape="disengage"
@@ -18,27 +21,25 @@
18
21
  @keydown.prevent.arrow-up="move(-1)"
19
22
  @keydown.prevent.backspace="remove(true)"
20
23
  @click="click"
21
- :aria-pressed="engaged"
22
- role="listitem"
23
- :aria-labelledby="parent"
24
24
  >
25
25
  <div class="apos-slat__main">
26
26
  <drag-icon
27
- v-if="slatCount > 1" class="apos-slat__control apos-slat__control--drag"
27
+ v-if="slatCount > 1"
28
+ class="apos-slat__control apos-slat__control--drag"
28
29
  :size="13"
29
30
  />
30
31
  <AposContextMenu
31
32
  v-if="hasRelationshipFields && more.menu.length"
32
33
  :button="more.button"
33
34
  :menu="more.menu"
34
- @item-clicked="$emit('item-clicked', item)"
35
35
  menu-placement="bottom-start"
36
36
  menu-offset="40, 10"
37
37
  :disabled="disabled"
38
+ @item-clicked="$emit('item-clicked', item)"
38
39
  />
39
40
  <AposButton
40
- class="apos-slat__editor-btn"
41
41
  v-if="editorIcon && hasRelationshipEditor"
42
+ class="apos-slat__editor-btn"
42
43
  role="button"
43
44
  :tooltip="{
44
45
  content: editorLabel,
@@ -47,12 +48,12 @@
47
48
  :icon="editorIcon"
48
49
  :icon-only="true"
49
50
  :modifiers="['inline']"
50
- @click="$emit('item-clicked', item)"
51
51
  :disabled="disabled"
52
+ @click="$emit('item-clicked', item)"
52
53
  />
53
54
  <a
54
- class="apos-slat__control apos-slat__control--view"
55
55
  v-if="item._url || item._urls"
56
+ class="apos-slat__control apos-slat__control--view"
56
57
  :href="item._url || item._urls.original"
57
58
  target="_blank"
58
59
  >
@@ -82,18 +83,18 @@
82
83
  </div>
83
84
  </div>
84
85
  <div class="apos-slat__secondary">
85
- <div class="apos-slat__size" v-if="item.length && item.length.size">
86
+ <div v-if="item.length && item.length.size" class="apos-slat__size">
86
87
  {{ itemSize }}
87
88
  </div>
88
89
  <AposButton
89
90
  v-if="removable"
90
- @click="remove"
91
91
  class="apos-slat__control apos-slat__control--remove"
92
92
  icon="close-icon"
93
93
  :icon-only="true"
94
94
  :modifiers="['inline']"
95
95
  label="apostrophe:removeItem"
96
96
  :disabled="disabled"
97
+ @click="remove"
97
98
  />
98
99
  </div>
99
100
  </li>
@@ -270,7 +271,7 @@ export default {
270
271
  .apos-slat.apos-is-selected:focus {
271
272
  background-color: var(--a-primary);
272
273
  &,
273
- ::v-deep .apos-button {
274
+ :deep(.apos-button) {
274
275
  color: var(--a-white);
275
276
  }
276
277
  &:hover {
@@ -292,7 +293,7 @@ export default {
292
293
  display: flex;
293
294
  align-items: center;
294
295
  max-width: 75%;
295
- & ::v-deep .trigger {
296
+ &:deep(.trigger) {
296
297
  /* This gets inline positioned and has doesn't provide an extra class to beef up, sorry */
297
298
  /* stylelint-disable-next-line declaration-no-important */
298
299
  display: flex !important;
@@ -2,55 +2,55 @@
2
2
  <template>
3
3
  <div ref="root">
4
4
  <draggable
5
+ :id="listId"
6
+ item-key="_id"
5
7
  class="apos-slat-list"
6
8
  tag="ol"
7
9
  role="list"
10
+ :options="dragOptions"
8
11
  :list="next"
9
- :move="onMove"
10
- v-bind="dragOptions"
11
- @start="isDragging=true"
12
- @end="isDragging=false"
13
- :id="listId"
12
+ @update="update"
14
13
  >
15
- <transition-group type="transition" name="apos-flip-list">
16
- <AposSlat
17
- v-for="item in next"
18
- class="apos-slat-list__item"
19
- @remove="remove"
20
- @engage="engage"
21
- @disengage="disengage"
22
- @select="select"
23
- @move="move"
24
- @item-clicked="$emit('item-clicked', item)"
25
- :key="item._id"
26
- :item="item"
27
- :selected="selected === item._id"
28
- :class="{'apos-slat-list__item--disabled' : disabled, 'apos-input--error': duplicate}"
29
- :disabled="disabled"
30
- :engaged="engaged === item._id"
31
- :parent="listId"
32
- :slat-count="next.length"
33
- :removable="removable"
34
- :relationship-schema="relationshipSchema"
35
- :editor-label="editorLabel"
36
- :editor-icon="editorIcon"
37
- />
38
- </transition-group>
14
+ <template #item="{element: item}">
15
+ <transition-group type="transition" name="apos-flip-list">
16
+ <AposSlat
17
+ :key="item._id"
18
+ class="apos-slat-list__item"
19
+ :item="item"
20
+ :selected="selected === item._id"
21
+ :class="{'apos-slat-list__item--disabled' : disabled, 'apos-input--error': duplicate}"
22
+ :disabled="disabled"
23
+ :engaged="engaged === item._id"
24
+ :parent="listId"
25
+ :slat-count="next.length"
26
+ :removable="removable"
27
+ :relationship-schema="relationshipSchema"
28
+ :editor-label="editorLabel"
29
+ :editor-icon="editorIcon"
30
+ @remove="remove"
31
+ @engage="engage"
32
+ @disengage="disengage"
33
+ @select="select"
34
+ @move="move"
35
+ @item-clicked="$emit('item-clicked', item)"
36
+ />
37
+ </transition-group>
38
+ </template>
39
39
  </draggable>
40
40
  </div>
41
41
  </template>
42
42
 
43
43
  <script>
44
- import draggable from 'vuedraggable';
44
+ import { Sortable } from 'sortablejs-vue3';
45
45
  import cuid from 'cuid';
46
46
 
47
47
  export default {
48
48
  name: 'AposSlatList',
49
49
  components: {
50
- draggable
50
+ draggable: Sortable
51
51
  },
52
52
  props: {
53
- value: {
53
+ modelValue: {
54
54
  type: Array,
55
55
  required: true
56
56
  },
@@ -83,13 +83,12 @@ export default {
83
83
  default: null
84
84
  }
85
85
  },
86
- emits: [ 'update', 'item-clicked', 'select', 'input' ],
86
+ emits: [ 'item-clicked', 'select', 'update:modelValue' ],
87
87
  data() {
88
88
  return {
89
89
  isDragging: false,
90
- delayedDragging: false,
91
90
  engaged: null,
92
- next: this.value.slice()
91
+ next: this.modelValue.slice()
93
92
  };
94
93
  },
95
94
  computed: {
@@ -104,24 +103,16 @@ export default {
104
103
  };
105
104
  }
106
105
  },
106
+
107
107
  watch: {
108
- isDragging(newValue) {
109
- if (newValue) {
110
- this.delayedDragging = true;
111
- return;
112
- }
113
- this.$nextTick(() => {
114
- this.delayedDragging = false;
115
- });
116
- },
117
- value() {
118
- this.next = this.value.slice();
108
+ modelValue() {
109
+ this.next = this.modelValue.slice();
119
110
  },
120
111
  next(newValue, oldValue) {
121
112
  let equal = true;
122
- if (newValue.length === this.value.length) {
113
+ if (newValue.length === this.modelValue.length) {
123
114
  for (let i = 0; (i < newValue.length); i++) {
124
- if ((newValue[i]._id !== this.value[i]._id) || (newValue[i].title !== this.value[i].title)) {
115
+ if ((newValue[i]._id !== this.modelValue[i]._id) || (newValue[i].title !== this.modelValue[i].title)) {
125
116
  equal = false;
126
117
  break;
127
118
  }
@@ -130,11 +121,22 @@ export default {
130
121
  equal = false;
131
122
  }
132
123
  if (!equal) {
133
- this.$emit('input', this.next);
124
+ this.$emit('update:modelValue', this.next);
134
125
  }
135
126
  }
136
127
  },
137
128
  methods: {
129
+ update({
130
+ oldIndex, newIndex
131
+ }) {
132
+ if (oldIndex !== newIndex) {
133
+ this.next = this.next.map((elem, index) => {
134
+ return index === oldIndex
135
+ ? this.next[newIndex]
136
+ : (index === newIndex && this.next[oldIndex]) || elem;
137
+ });
138
+ }
139
+ },
138
140
  engage(id) {
139
141
  this.engaged = id;
140
142
  },
@@ -152,15 +154,14 @@ export default {
152
154
  } else if (focusNext && this.next[itemIndex - 1]) {
153
155
  this.focusElement(this.next[itemIndex - 1]._id);
154
156
  }
155
- this.$emit('update', this.next);
156
157
  },
158
+
157
159
  move(id, dir) {
158
160
  const index = this.getIndex(id);
159
161
  const target = dir > 0 ? index + 1 : index - 1;
160
162
  if (this.next[target]) {
161
163
  this.next.splice(target, 0, this.next.splice(index, 1)[0]);
162
164
  this.focusElement(id);
163
- return this.$emit('update', this.next);
164
165
  }
165
166
  },
166
167
  getIndex(id) {
@@ -178,20 +179,13 @@ export default {
178
179
  this.$refs.root.querySelector(`[data-id="${id}"]`).focus();
179
180
  });
180
181
  }
181
- },
182
- onMove({ relatedContext, draggedContext }) {
183
- const relatedElement = relatedContext.element;
184
- const draggedElement = draggedContext.element;
185
- return (
186
- (!relatedElement || !relatedElement.fixed) && !draggedElement.fixed
187
- );
188
182
  }
189
183
  }
190
184
  };
191
185
  </script>
192
186
 
193
187
  <style lang="scss" scoped>
194
- .apos-slat-list ::v-deep .apos-slat {
188
+ .apos-slat-list :deep(.apos-slat) {
195
189
  margin-bottom: 5px;
196
190
  transition: all 0.4s;
197
191
  max-width: $input-max-width * 0.65;
@@ -32,7 +32,7 @@
32
32
  :style="style"
33
33
  >
34
34
  <defs>
35
- <linearGradient x1="8.042%" y1="0%" x2="65.682%" y2="23.865%" id="a">
35
+ <linearGradient id="a" x1="8.042%" y1="0%" x2="65.682%" y2="23.865%">
36
36
  <stop stop-color="currentColor" stop-opacity="0" offset="0%" />
37
37
  <stop stop-color="currentColor" stop-opacity=".631" offset="63.146%" />
38
38
  <stop stop-color="currentColor" offset="100%" />
@@ -40,7 +40,7 @@
40
40
  </defs>
41
41
  <g fill="none" fill-rule="evenodd">
42
42
  <g transform="translate(1 1)">
43
- <path d="M36 18c0-9.94-8.06-18-18-18" id="Oval-2" stroke="url(#a)" stroke-width="2" transform="rotate(266.312 18 18)">
43
+ <path id="Oval-2" d="M36 18c0-9.94-8.06-18-18-18" stroke="url(#a)" stroke-width="2" transform="rotate(266.312 18 18)">
44
44
  <animateTransform attributeName="transform" type="rotate" from="0 18 18" to="360 18 18" dur="0.9s" repeatCount="indefinite" />
45
45
  </path>
46
46
  <circle fill="currentColor" cx="36" cy="18" r="1" transform="rotate(266.312 18 18)">
@@ -5,13 +5,13 @@
5
5
  </div>
6
6
  <div class="apos-subform-preview__value" :class="{ 'is-help': !!subform.help }">
7
7
  <component
8
+ :is="subform.previewComponent"
8
9
  v-if="subform.previewComponent"
9
10
  class="apos-subform-preview__value-block"
10
- :is="subform.previewComponent"
11
11
  :subform="subform"
12
12
  :values="values"
13
13
  />
14
- <span class="apos-subform-preview__value-block" v-else>
14
+ <span v-else class="apos-subform-preview__value-block">
15
15
  {{ previewValue }}
16
16
  </span>
17
17
  </div>
@@ -1,8 +1,9 @@
1
1
  <template>
2
2
  <div class="apos-tag">
3
- <button @click="click" class="apos-tag__button">
3
+ <button class="apos-tag__button" @click="click">
4
4
  <close-icon
5
- class="apos-tag__remove" title="Remove Tag"
5
+ class="apos-tag__remove"
6
+ title="Remove Tag"
6
7
  :size="10"
7
8
  />
8
9
  </button>