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,20 +1,22 @@
1
1
  <template>
2
2
  <AposInputWrapper
3
- :modifiers="modifiers" :field="field"
4
- :error="effectiveError" :uid="uid"
3
+ :modifiers="modifiers"
4
+ :field="field"
5
+ :error="effectiveError"
6
+ :uid="uid"
5
7
  :display-options="displayOptions"
6
8
  >
7
9
  <template #body>
8
10
  <div class="apos-input-wrapper">
9
- <div class="apos-range" v-apos-tooltip="tooltip">
11
+ <div v-apos-tooltip="tooltip" class="apos-range">
10
12
  <input
13
+ :id="uid"
14
+ v-model="next"
11
15
  type="range"
12
16
  :min="field.min"
13
17
  :max="field.max"
14
18
  :step="field.step"
15
19
  class="apos-range__input"
16
- v-model="next"
17
- :id="uid"
18
20
  :disabled="field.readOnly"
19
21
  >
20
22
  <div class="apos-range__scale">
@@ -39,7 +41,8 @@
39
41
  >
40
42
  {{ valueLabel }}
41
43
  <AposButton
42
- type="quiet" label="apostrophe:clear"
44
+ type="quiet"
45
+ label="apostrophe:clear"
43
46
  class="apos-range__clear"
44
47
  :modifiers="['no-motion']"
45
48
  @click="unset"
@@ -1,7 +1,9 @@
1
1
  <template>
2
2
  <AposInputWrapper
3
- :field="field" :error="effectiveError"
4
- :uid="uid" :items="next"
3
+ :field="field"
4
+ :error="effectiveError"
5
+ :uid="uid"
6
+ :items="next"
5
7
  :display-options="displayOptions"
6
8
  :modifiers="modifiers"
7
9
  >
@@ -20,7 +22,7 @@
20
22
  <AposMinMaxCount
21
23
  v-if="field.max > 1"
22
24
  :field="field"
23
- :value="next"
25
+ :model-value="next"
24
26
  />
25
27
  </template>
26
28
  <template #body>
@@ -28,20 +30,21 @@
28
30
  <div class="apos-input-relationship__input-wrapper">
29
31
  <input
30
32
  v-if="!modifiers.includes('no-search')"
33
+ :id="uid"
34
+ v-model="searchTerm"
31
35
  class="apos-input apos-input--text apos-input--relationship"
32
- v-model="searchTerm" type="text"
36
+ type="text"
33
37
  :placeholder="$t(placeholder)"
34
38
  :disabled="field.readOnly || limitReached"
35
39
  :required="field.required"
36
- :id="uid"
40
+ tabindex="0"
37
41
  @input="input"
38
42
  @focus="input"
39
43
  @focusout="handleFocusOut"
40
- tabindex="0"
41
44
  >
42
45
  <AposButton
43
- class="apos-input-relationship__button"
44
46
  v-if="field.browse !== false"
47
+ class="apos-input-relationship__button"
45
48
  :disabled="field.readOnly || limitReached"
46
49
  :label="browseLabel"
47
50
  :modifiers="buttonModifiers"
@@ -50,25 +53,25 @@
50
53
  />
51
54
  </div>
52
55
  <AposSlatList
53
- class="apos-input-relationship__items"
54
56
  v-if="next.length"
55
- @input="updateSelected"
56
- @item-clicked="editRelationship"
57
- :value="next"
57
+ class="apos-input-relationship__items"
58
+ :model-value="next"
58
59
  :duplicate="duplicate"
59
60
  :disabled="field.readOnly"
60
61
  :relationship-schema="field.schema"
61
62
  :editor-label="field.editorLabel"
62
63
  :editor-icon="field.editorIcon"
64
+ @update:model-value="updateSelected"
65
+ @item-clicked="editRelationship"
63
66
  />
64
67
  <AposSearchList
65
68
  :list="searchList"
66
- @select="updateSelected"
67
69
  :selected-items="next"
68
70
  :icon="field.suggestionIcon"
69
71
  :icon-size="field.suggestionIconSize"
70
72
  :fields="field.suggestionFields"
71
73
  disabled-tooltip="apostrophe:publishBeforeUsingTooltip"
74
+ @select="updateSelected"
72
75
  />
73
76
  </div>
74
77
  </template>
@@ -12,7 +12,7 @@
12
12
  :choices="choices"
13
13
  :classes="classes"
14
14
  :disabled="field.readOnly"
15
- :selected="value.data"
15
+ :selected="modelValue.data"
16
16
  :autocomplete="field.autocomplete"
17
17
  @change="change"
18
18
  />
@@ -1,35 +1,40 @@
1
1
  <template>
2
2
  <AposInputWrapper
3
- :modifiers="modifiers" :field="field"
4
- :error="effectiveError" :uid="uid"
3
+ :modifiers="modifiers"
4
+ :field="field"
5
+ :error="effectiveError"
6
+ :uid="uid"
5
7
  :display-options="displayOptions"
6
8
  :meta="fieldMeta"
7
9
  >
8
10
  <template #body>
9
11
  <div :class="wrapperClasses">
10
12
  <span
11
- class="apos-input__slug-locale-prefix"
12
13
  v-if="localePrefix"
13
- @click="passFocus"
14
14
  v-apos-tooltip="'apostrophe:cannotChangeSlugPrefix'"
15
+ class="apos-input__slug-locale-prefix"
16
+ @click="passFocus"
15
17
  >
16
18
  {{ localePrefix }}
17
19
  </span>
18
20
  <input
21
+ :id="uid"
22
+ ref="input"
23
+ v-model="next"
19
24
  :class="classes"
20
- v-model="next" :type="type"
25
+ :type="type"
21
26
  :placeholder="$t(field.placeholder)"
22
- @keydown.enter="emitReturn"
23
- :disabled="field.readOnly" :required="field.required"
24
- :id="uid" :tabindex="tabindex"
25
- ref="input"
27
+ :disabled="field.readOnly"
28
+ :required="field.required"
29
+ :tabindex="tabindex"
26
30
  :autocomplete="field.autocomplete"
31
+ @keydown.enter="emitReturn"
27
32
  >
28
33
  <component
34
+ :is="icon"
29
35
  v-if="icon"
30
36
  :size="iconSize"
31
37
  class="apos-input-icon"
32
- :is="icon"
33
38
  />
34
39
  </div>
35
40
  </template>
@@ -40,8 +45,7 @@
40
45
  import AposInputSlugLogic from '../logic/AposInputSlug';
41
46
  export default {
42
47
  name: 'AposInputSlug',
43
- mixins: [ AposInputSlugLogic ],
44
- emits: [ 'return' ]
48
+ mixins: [ AposInputSlugLogic ]
45
49
  };
46
50
  </script>
47
51
 
@@ -1,38 +1,46 @@
1
1
  <template>
2
2
  <AposInputWrapper
3
- :modifiers="modifiers" :field="field"
4
- :error="effectiveError" :uid="uid"
3
+ :modifiers="modifiers"
4
+ :field="field"
5
+ :error="effectiveError"
6
+ :uid="uid"
5
7
  :display-options="displayOptions"
6
8
  :meta="fieldMeta"
7
9
  >
8
10
  <template #body>
9
11
  <div class="apos-input-wrapper">
10
12
  <textarea
13
+ v-if="field.textarea && field.type === 'string'"
14
+ :id="uid"
15
+ v-model="next"
16
+ rows="5"
11
17
  :class="classes"
12
- v-if="field.textarea && field.type === 'string'" rows="5"
13
- v-model="next" :placeholder="$t(field.placeholder)"
14
- @keydown.enter="enterEmit"
18
+ :placeholder="$t(field.placeholder)"
15
19
  :disabled="field.readOnly"
16
20
  :required="field.required"
17
- :id="uid" :tabindex="tabindex"
21
+ :tabindex="tabindex"
18
22
  :autocomplete="field.autocomplete"
23
+ @keydown.enter="enterEmit"
19
24
  />
20
25
  <input
21
- v-else :class="classes"
22
- v-model="next" :type="type"
26
+ v-else
27
+ :id="uid"
28
+ v-model="next"
29
+ :class="classes"
30
+ :type="type"
23
31
  :placeholder="$t(field.placeholder)"
24
- @keydown.enter="enterEmit"
25
32
  :disabled="field.readOnly || field.disabled"
26
33
  :required="field.required"
27
- :id="uid" :tabindex="tabindex"
34
+ :tabindex="tabindex"
28
35
  :step="step"
29
36
  :autocomplete="field.autocomplete"
37
+ @keydown.enter="enterEmit"
30
38
  >
31
39
  <component
40
+ :is="icon"
32
41
  v-if="icon"
33
42
  :size="iconSize"
34
43
  class="apos-input-icon"
35
- :is="icon"
36
44
  />
37
45
  </div>
38
46
  </template>
@@ -9,10 +9,10 @@
9
9
  <component :is="wrapEl" :class="classList">
10
10
  <div class="apos-field__info">
11
11
  <component
12
+ :is="labelEl"
12
13
  v-if="field.label"
13
14
  class="apos-field__label"
14
15
  :class="{'apos-sr-only': field.hideLabel }"
15
- :is="labelEl"
16
16
  :for="uid"
17
17
  :data-apos-test-name="field.name"
18
18
  :data-apos-test-label="field.label"
@@ -24,8 +24,8 @@
24
24
  *
25
25
  </span>
26
26
  <AposLabel
27
- class="apos-field__tag"
28
27
  v-if="field.tag"
28
+ class="apos-field__tag"
29
29
  :label="field.tag.value || field.tag"
30
30
  :modifiers="[ `apos-is-${field.tag.type || 'success'}`, 'apos-is-filled' ]"
31
31
  data-apos-test="field-tag"
@@ -44,11 +44,13 @@
44
44
  />
45
45
  </span>
46
46
  <span
47
- v-if="displayOptions.changed" class="apos-field__changed"
47
+ v-if="displayOptions.changed"
48
+ class="apos-field__changed"
48
49
  data-apos-test="field-changed"
49
50
  >
50
51
  <AposLabel
51
- label="apostrophe:changed" class="apos-field__changed__label"
52
+ label="apostrophe:changed"
53
+ class="apos-field__changed__label"
52
54
  :modifiers="[ 'apos-is-warning', 'apos-is-filled' ]"
53
55
  tooltip="apostrophe:fieldHasUnpublishedChanges"
54
56
  />
@@ -56,16 +58,16 @@
56
58
  </span>
57
59
  <span data-apos-test="field-meta-wrapper" class="apos-field__label-meta">
58
60
  <component
59
- v-for="component in metaComponents"
60
- :key="component.name"
61
- :is="component.name"
61
+ v-for="{name, namespace, data} in metaComponents"
62
+ :key="name"
63
+ :is="name"
62
64
  :field="field"
63
65
  :items="items"
64
- :namespace="component.namespace"
65
- :meta="component.data"
66
+ :namespace="namespace"
67
+ :meta="data"
66
68
  :meta-raw="meta"
67
- :data-apos-test-component="component.name"
68
- :data-apos-test-namespace="component.namespace"
69
+ :data-apos-test-component="name"
70
+ :data-apos-test-namespace="namespace"
69
71
  data-apos-test="field-meta"
70
72
  />
71
73
  </span>
@@ -81,7 +83,8 @@
81
83
  </div>
82
84
  <slot name="body" />
83
85
  <div
84
- v-if="errorMessage" class="apos-field__error"
86
+ v-if="errorMessage"
87
+ class="apos-field__error"
85
88
  data-apos-test="field-error"
86
89
  >
87
90
  {{ $t(errorMessage) }}
@@ -24,21 +24,24 @@
24
24
  -->
25
25
  <template>
26
26
  <component
27
- class="apos-schema"
28
27
  :is="fieldStyle === 'table' ? 'tr' : 'div'"
28
+ class="apos-schema"
29
+ :class="classes"
29
30
  >
30
31
  <slot name="before" />
31
32
  <component
32
- v-for="field in schema" :key="field.name.concat(field._id ?? '')"
33
- :data-apos-field="field.name"
34
33
  :is="fieldStyle === 'table' ? 'td' : 'div'"
34
+ v-for="field in schema"
35
+ :key="field.name.concat(field._id ?? '')"
36
+ :data-apos-field="field.name"
35
37
  :style="(fieldStyle === 'table' && field.columnStyle) || {}"
36
- v-show="displayComponent(field)"
38
+ :class="{'apos-field--hidden': !displayComponent(field)}"
37
39
  >
38
40
  <component
39
- v-show="displayComponent(field)"
40
- v-model="fieldState[field.name]"
41
41
  :is="fieldComponentMap[field.type]"
42
+ :ref="field.name"
43
+ v-model="fieldState[field.name]"
44
+ :class="{ 'apos-field__wrapper--highlight': highlight(field.name) }"
42
45
  :following-values="followingValues[field.name]"
43
46
  :condition-met="conditionalFields?.if[field.name]"
44
47
  :field="fields[field.name].field"
@@ -48,7 +51,26 @@
48
51
  :trigger-validation="triggerValidation"
49
52
  :server-error="fields[field.name].serverError"
50
53
  :doc-id="docId"
54
+ :generation="generation"
55
+ @update-doc-data="onUpdateDocData"
56
+ @validate="emitValidate()"
57
+ />
58
+ <component
59
+ :is="fieldComponentMap[field.type]"
60
+ v-if="hasCompareMeta"
61
+ v-show="displayComponent(field)"
51
62
  :ref="field.name"
63
+ v-model="compareMetaState[field.name]"
64
+ :class="{ 'apos-field__wrapper--highlight': highlight(field.name) }"
65
+ :following-values="followingValues[field.name]"
66
+ :condition-met="conditionalFields?.if[field.name]"
67
+ :field="fields[field.name].field"
68
+ :meta="meta"
69
+ :modifiers="fields[field.name].modifiers"
70
+ :display-options="getDisplayOptions(field.name)"
71
+ :trigger-validation="triggerValidation"
72
+ :server-error="fields[field.name].serverError"
73
+ :doc-id="docId"
52
74
  :generation="generation"
53
75
  @update-doc-data="onUpdateDocData"
54
76
  @validate="emitValidate()"
@@ -67,33 +89,64 @@ export default {
67
89
  </script>
68
90
 
69
91
  <style lang="scss" scoped>
70
- .apos-schema ::v-deep .apos-field__wrapper {
92
+ .apos-schema :deep(.apos-field__wrapper) {
71
93
  max-width: $input-max-width;
72
94
  }
73
95
 
74
- .apos-schema ::v-deep .apos-field__wrapper.apos-field__wrapper--full-width {
96
+ .apos-schema :deep(.apos-field__wrapper.apos-field__wrapper--full-width) {
75
97
  max-width: inherit;
76
98
  }
77
99
 
78
- .apos-schema ::v-deep img {
100
+ .apos-schema :deep(img) {
79
101
  max-width: 100%;
80
102
  }
81
103
 
82
- .apos-field {
83
- .apos-schema ::v-deep & {
84
- margin-bottom: $spacing-quadruple;
85
- &.apos-field--small,
86
- &.apos-field--micro,
87
- &.apos-field--margin-micro {
88
- margin-bottom: $spacing-double;
89
- }
90
- &.apos-field--margin-none {
91
- margin-bottom: 0;
92
- }
93
- }
104
+ .apos-schema .apos-field--hidden {
105
+ display: none;
106
+ }
94
107
 
95
- .apos-schema ::v-deep .apos-toolbar & {
108
+ .apos-schema :deep(.apos-field) {
109
+ margin-bottom: $spacing-quadruple;
110
+ &.apos-field--small,
111
+ &.apos-field--micro,
112
+ &.apos-field--margin-micro {
113
+ margin-bottom: $spacing-double;
114
+ }
115
+ &.apos-field--margin-none {
96
116
  margin-bottom: 0;
97
117
  }
98
118
  }
119
+
120
+ .apos-field .apos-schema :deep(.apos-toolbar) {
121
+ margin-bottom: 0;
122
+ }
123
+
124
+ .apos-schema.apos-schema--compare > :deep([data-apos-field]) {
125
+ display: flex;
126
+
127
+ &.apos-field--hidden {
128
+ display: none;
129
+ }
130
+
131
+ & > .apos-field__wrapper {
132
+ flex-grow: 1;
133
+ flex-basis: 50%;
134
+ border-right: 1px solid var(--a-base-9);
135
+ padding-right: 20px;
136
+ }
137
+ & > .apos-field__wrapper + .apos-field__wrapper {
138
+ border-right: none;
139
+ padding-right: 0;
140
+ padding-left: 20px;
141
+ }
142
+
143
+ & .apos-field__label {
144
+ word-break: break-all;
145
+ }
146
+ }
147
+
148
+ :deep(.apos-field__wrapper--highlight > .apos-field) {
149
+ padding: 10px;
150
+ background: var(--a-highlight);
151
+ }
99
152
  </style>
@@ -3,8 +3,8 @@
3
3
  <li
4
4
  v-for="item in list"
5
5
  :key="item._id"
6
- :class="getClasses(item)"
7
6
  v-apos-tooltip="getTooltip(item)"
7
+ :class="getClasses(item)"
8
8
  @click="select(item, $event)"
9
9
  >
10
10
  <img
@@ -13,12 +13,12 @@
13
13
  :data-apos-test-name="subform.name"
14
14
  :trigger-validation="triggerValidation"
15
15
  :schema="schema"
16
- :value="docFields"
16
+ :model-value="docFields"
17
17
  :following-values="followingValues()"
18
18
  :conditional-fields="conditionalFields"
19
19
  :server-errors="serverErrors"
20
20
  :modifiers="['small']"
21
- @input="updateDocFields"
21
+ @update:model-value="updateDocFields"
22
22
  @validate="triggerValidate"
23
23
  />
24
24
  <div class="apos-subform__controls">
@@ -35,10 +35,6 @@ export default {
35
35
  docId: {
36
36
  type: String,
37
37
  default: null
38
- },
39
- parentFollowingValues: {
40
- type: Object,
41
- default: null
42
38
  }
43
39
  },
44
40
  emits: [ 'modal-result', 'safe-close' ],
@@ -16,7 +16,7 @@ export default {
16
16
  },
17
17
  data () {
18
18
  return {
19
- next: this.value.data || this.getEmptyValue(),
19
+ next: this.modelValue.data || this.getEmptyValue(),
20
20
  error: false,
21
21
  // This is just meant to be sufficient to prevent unintended collisions
22
22
  // in the UI between id attributes
@@ -70,8 +70,8 @@ export default {
70
70
  };
71
71
  },
72
72
  watchValue () {
73
- this.error = this.value.error;
74
- this.next = this.value.data || this.getEmptyValue();
73
+ this.error = this.modelValue.error;
74
+ this.next = this.modelValue.data || this.getEmptyValue();
75
75
  },
76
76
  validate(value) {
77
77
  if (this.field.required) {
@@ -6,11 +6,11 @@ import { getConditionTypesObject } from 'Modules/@apostrophecms/schema/lib/condi
6
6
  import cuid from 'cuid';
7
7
  import { klona } from 'klona';
8
8
  import { get } from 'lodash';
9
- import draggable from 'vuedraggable';
9
+ import { Sortable } from 'sortablejs-vue3';
10
10
 
11
11
  export default {
12
12
  name: 'AposInputArray',
13
- components: { draggable },
13
+ components: { draggable: Sortable },
14
14
  mixins: [
15
15
  AposInputMixin,
16
16
  AposInputFollowingMixin,
@@ -124,6 +124,17 @@ export default {
124
124
  }
125
125
  },
126
126
  methods: {
127
+ moveUpdate({
128
+ oldIndex, newIndex
129
+ }) {
130
+ if (oldIndex !== newIndex) {
131
+ this.items = this.items.map((elem, index) => {
132
+ return index === oldIndex
133
+ ? this.items[newIndex]
134
+ : (index === newIndex && this.items[oldIndex]) || elem;
135
+ });
136
+ }
137
+ },
127
138
  getItemsSchema(_id) {
128
139
  return (this.items.find((item) => item._id === _id))?.schemaInput.data;
129
140
  },
@@ -199,8 +210,8 @@ export default {
199
210
  },
200
211
  getNext() {
201
212
  // Next should consistently be an array.
202
- return (this.value && Array.isArray(this.value.data))
203
- ? this.value.data
213
+ return (this.modelValue && Array.isArray(this.modelValue.data))
214
+ ? this.modelValue.data
204
215
  : (this.field.def || []);
205
216
  },
206
217
  disableAdd() {
@@ -9,8 +9,8 @@ export default {
9
9
  return {
10
10
  // Next should consistently be an object or null (an attachment field with
11
11
  // no value yet is null, per server side).
12
- next: (this.value && (typeof this.value.data === 'object'))
13
- ? this.value.data : (this.field.def || null),
12
+ next: (this.modelValue && (typeof this.modelValue.data === 'object'))
13
+ ? this.modelValue.data : (this.field.def || null),
14
14
  disabled: false,
15
15
  uploading: false
16
16
  };
@@ -61,7 +61,7 @@ export default {
61
61
  });
62
62
 
63
63
  this.$emit('upload-complete');
64
- this.value.data = attachment;
64
+ this.modelValue.data = attachment;
65
65
  } catch (error) {
66
66
  console.error('Error uploading file.', error);
67
67
  const msg = error.body && error.body.message ? error.body.message : this.$t('apostrophe:uploadError');
@@ -6,15 +6,15 @@ export default {
6
6
  name: 'AposInputCheckboxes',
7
7
  mixins: [ AposInputMixin, AposInputChoicesMixin ],
8
8
  beforeMount () {
9
- this.value.data = Array.isArray(this.value.data) ? this.value.data : [];
9
+ this.modelValue.data = Array.isArray(this.modelValue.data) ? this.modelValue.data : [];
10
10
  },
11
11
  methods: {
12
12
  getChoiceId(uid, value) {
13
13
  return uid + value.replace(/\s/g, '');
14
14
  },
15
15
  watchValue () {
16
- this.error = this.value.error;
17
- this.next = this.value.data || [];
16
+ this.error = this.modelValue.error;
17
+ this.next = this.modelValue.data || [];
18
18
  },
19
19
  validate(values) {
20
20
  // The choices and values should always be arrays.
@@ -51,17 +51,17 @@ export default {
51
51
  },
52
52
  selectItems(choice) {
53
53
  if (choice.value === '__all') {
54
- this.value.data = this.choices.length === this.value.data.length
54
+ this.modelValue.data = this.choices.length === this.modelValue.data.length
55
55
  ? []
56
56
  : this.choices.map(({ value }) => value);
57
57
 
58
58
  return;
59
59
  }
60
60
 
61
- if (this.value.data.includes(choice.value)) {
62
- this.value.data = this.value.data.filter((val) => val !== choice.value);
61
+ if (this.modelValue.data.includes(choice.value)) {
62
+ this.modelValue.data = this.modelValue.data.filter((val) => val !== choice.value);
63
63
  } else {
64
- this.value.data.push(choice.value);
64
+ this.modelValue.data.push(choice.value);
65
65
  }
66
66
  }
67
67
  }
@@ -1,6 +1,6 @@
1
1
 
2
2
  import AposInputMixin from 'Modules/@apostrophecms/schema/mixins/AposInputMixin';
3
- import Picker from '@apostrophecms/vue-color/src/components/Sketch';
3
+ import { Sketch as Picker } from '@ckpack/vue-color';
4
4
  import tinycolor from 'tinycolor2';
5
5
 
6
6
  export default {
@@ -31,7 +31,7 @@ export default {
31
31
  return {
32
32
  label: this.field.label,
33
33
  type: 'color',
34
- color: this.value.data || ''
34
+ color: this.modelValue.data || ''
35
35
  };
36
36
  },
37
37
  format() {
@@ -40,10 +40,7 @@ export default {
40
40
  : this.defaultFormat;
41
41
  },
42
42
  pickerOptions() {
43
- let fieldOptions = {};
44
- if (this.field.options && this.field.options.pickerOptions) {
45
- fieldOptions = this.field.options.pickerOptions;
46
- }
43
+ const fieldOptions = this.field.options?.pickerOptions || {};
47
44
  return Object.assign(this.defaultPickerOptions, fieldOptions);
48
45
  },
49
46
 
@@ -63,7 +60,7 @@ export default {
63
60
  },
64
61
  mounted() {
65
62
  if (!this.next) {
66
- this.next = null;
63
+ this.next = '';
67
64
  }
68
65
  },
69
66
  methods: {
@@ -92,7 +89,7 @@ export default {
92
89
  return color.isValid() ? false : 'Error';
93
90
  },
94
91
  clear() {
95
- this.next = null;
92
+ this.next = '';
96
93
  }
97
94
  }
98
95
  };
@@ -6,7 +6,7 @@ export default {
6
6
  emits: [ 'return' ],
7
7
  data() {
8
8
  return {
9
- next: (this.value && this.value.data) || null,
9
+ next: (this.modelValue && this.modelValue.data) || null,
10
10
  date: '',
11
11
  time: '',
12
12
  disabled: !this.field.required