apostrophe 3.63.2 → 4.0.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 (146) hide show
  1. package/.eslintrc +13 -4
  2. package/CHANGELOG.md +21 -0
  3. package/defaults.js +1 -0
  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 +6 -6
  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/busy/ui/apos/apps/AposBusy.js +8 -7
  26. package/modules/@apostrophecms/busy/ui/apos/components/TheAposBusy.vue +1 -1
  27. package/modules/@apostrophecms/command-menu/ui/apos/apps/AposCommandMenu.js +11 -29
  28. package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuShortcut.vue +6 -6
  29. package/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue +10 -7
  30. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue +20 -15
  31. package/modules/@apostrophecms/doc-type/ui/apos/logic/AposDocContextMenu.js +1 -1
  32. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalize.vue +36 -27
  33. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalizeErrors.vue +3 -3
  34. package/modules/@apostrophecms/image/ui/apos/components/AposImageCropper.vue +5 -5
  35. package/modules/@apostrophecms/image/ui/apos/components/AposImageRelationshipEditor.vue +6 -6
  36. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManager.vue +23 -16
  37. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerDisplay.vue +11 -11
  38. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerEditor.vue +28 -21
  39. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerSelections.vue +1 -1
  40. package/modules/@apostrophecms/image/ui/apos/components/AposMediaUploader.vue +5 -4
  41. package/modules/@apostrophecms/login/ui/apos/apps/AposLogin.js +6 -7
  42. package/modules/@apostrophecms/login/ui/apos/components/AposForgotPasswordForm.vue +3 -3
  43. package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +10 -10
  44. package/modules/@apostrophecms/login/ui/apos/components/AposResetPasswordForm.vue +1 -1
  45. package/modules/@apostrophecms/login/ui/apos/components/TheAposLogin.vue +2 -2
  46. package/modules/@apostrophecms/modal/ui/apos/apps/AposModals.js +60 -87
  47. package/modules/@apostrophecms/modal/ui/apos/components/AposDocsManagerToolbar.vue +15 -11
  48. package/modules/@apostrophecms/modal/ui/apos/components/AposModal.vue +8 -2
  49. package/modules/@apostrophecms/modal/ui/apos/components/AposModalBreadcrumbs.vue +7 -4
  50. package/modules/@apostrophecms/modal/ui/apos/components/AposModalConfirm.vue +5 -5
  51. package/modules/@apostrophecms/modal/ui/apos/components/AposModalShareDraft.vue +8 -8
  52. package/modules/@apostrophecms/modal/ui/apos/components/AposModalToolbar.vue +7 -7
  53. package/modules/@apostrophecms/modal/ui/apos/components/TheAposModals.vue +22 -4
  54. package/modules/@apostrophecms/modal/ui/apos/composables/AposFocus.js +95 -0
  55. package/modules/@apostrophecms/modal/ui/apos/mixins/AposDocsManagerMixin.js +2 -3
  56. package/modules/@apostrophecms/modal/ui/apos/mixins/AposEditorMixin.js +6 -0
  57. package/modules/@apostrophecms/multisite-i18n/i18n/aposMultisite/en.json +48 -0
  58. package/modules/@apostrophecms/multisite-i18n/index.js +7 -0
  59. package/modules/@apostrophecms/notification/index.js +4 -4
  60. package/modules/@apostrophecms/notification/ui/apos/apps/AposNotification.js +6 -9
  61. package/modules/@apostrophecms/notification/ui/apos/components/AposNotification.vue +12 -8
  62. package/modules/@apostrophecms/oembed-field/ui/apos/components/AposInputOembed.vue +4 -4
  63. package/modules/@apostrophecms/page/ui/apos/components/AposPagesManager.vue +15 -11
  64. package/modules/@apostrophecms/page/ui/apos/logic/AposPagesManager.js +1 -1
  65. package/modules/@apostrophecms/permission/ui/apos/components/AposInputRole.vue +3 -3
  66. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +25 -17
  67. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManagerDisplay.vue +24 -20
  68. package/modules/@apostrophecms/piece-type/ui/apos/components/AposRelationshipEditor.vue +15 -11
  69. package/modules/@apostrophecms/rich-text-widget/index.js +1 -0
  70. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposImageControlDialog.vue +7 -6
  71. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +31 -30
  72. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapAnchor.vue +12 -10
  73. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapLink.vue +9 -8
  74. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapStyles.vue +3 -3
  75. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapTable.vue +3 -3
  76. package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +10 -8
  77. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArea.vue +5 -3
  78. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArray.vue +81 -277
  79. package/modules/@apostrophecms/schema/ui/apos/components/AposInputAttachment.vue +4 -2
  80. package/modules/@apostrophecms/schema/ui/apos/components/AposInputBoolean.vue +24 -14
  81. package/modules/@apostrophecms/schema/ui/apos/components/AposInputCheckboxes.vue +7 -6
  82. package/modules/@apostrophecms/schema/ui/apos/components/AposInputColor.vue +10 -7
  83. package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +3 -3
  84. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRadio.vue +5 -4
  85. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRelationship.vue +15 -12
  86. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSelect.vue +1 -1
  87. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +16 -12
  88. package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +19 -11
  89. package/modules/@apostrophecms/schema/ui/apos/components/AposInputWrapper.vue +1 -1
  90. package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +65 -21
  91. package/modules/@apostrophecms/schema/ui/apos/components/AposSubform.vue +2 -2
  92. package/modules/@apostrophecms/schema/ui/apos/logic/AposArrayEditor.js +0 -4
  93. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArea.js +3 -3
  94. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputArray.js +15 -4
  95. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputAttachment.js +3 -3
  96. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputCheckboxes.js +7 -7
  97. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputColor.js +5 -8
  98. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputDateAndTime.js +1 -1
  99. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputObject.js +1 -1
  100. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRadio.js +1 -1
  101. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRelationship.js +12 -9
  102. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputSelect.js +2 -2
  103. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputString.js +6 -8
  104. package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +39 -13
  105. package/modules/@apostrophecms/schema/ui/apos/logic/AposSubform.js +1 -1
  106. package/modules/@apostrophecms/schema/ui/apos/mixins/AposInputMixin.js +9 -9
  107. package/modules/@apostrophecms/schema/ui/apos/scss/AposInputArray.scss +205 -0
  108. package/modules/@apostrophecms/settings/ui/apos/components/AposSettingsManager.vue +4 -4
  109. package/modules/@apostrophecms/settings/ui/apos/logic/AposSettingsManager.js +4 -4
  110. package/modules/@apostrophecms/submitted-draft/ui/apos/components/AposSubmittedDraftIcon.vue +5 -4
  111. package/modules/@apostrophecms/ui/ui/apos/components/AposButton.vue +4 -4
  112. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonGroup.vue +6 -6
  113. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonSplit.vue +120 -113
  114. package/modules/@apostrophecms/ui/ui/apos/components/AposCheckbox.vue +19 -19
  115. package/modules/@apostrophecms/ui/ui/apos/components/AposCombo.vue +15 -15
  116. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenu.vue +216 -191
  117. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuDialog.vue +77 -65
  118. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuItem.vue +1 -1
  119. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuTip.vue +28 -50
  120. package/modules/@apostrophecms/ui/ui/apos/components/AposFile.vue +5 -5
  121. package/modules/@apostrophecms/ui/ui/apos/components/AposFilterMenu.vue +4 -4
  122. package/modules/@apostrophecms/ui/ui/apos/components/AposMinMaxCount.vue +5 -5
  123. package/modules/@apostrophecms/ui/ui/apos/components/AposPager.vue +14 -8
  124. package/modules/@apostrophecms/ui/ui/apos/components/AposSlat.vue +2 -2
  125. package/modules/@apostrophecms/ui/ui/apos/components/AposSlatList.vue +53 -59
  126. package/modules/@apostrophecms/ui/ui/apos/components/AposSubformPreview.vue +2 -2
  127. package/modules/@apostrophecms/ui/ui/apos/components/AposTagApply.vue +40 -35
  128. package/modules/@apostrophecms/ui/ui/apos/components/AposToggle.vue +2 -2
  129. package/modules/@apostrophecms/ui/ui/apos/components/AposTree.vue +9 -11
  130. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeHeader.vue +5 -3
  131. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeRows.vue +129 -129
  132. package/modules/@apostrophecms/ui/ui/apos/composables/AposTheme.js +11 -0
  133. package/modules/@apostrophecms/ui/ui/apos/lib/click-outside-element.js +4 -4
  134. package/modules/@apostrophecms/ui/ui/apos/lib/i18next.js +56 -50
  135. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip.js +191 -0
  136. package/modules/@apostrophecms/ui/ui/apos/lib/vue.js +19 -10
  137. package/modules/@apostrophecms/ui/ui/apos/mixins/AposAdvisoryLockMixin.js +1 -1
  138. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tables.scss +1 -1
  139. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tooltips.scss +6 -22
  140. package/modules/@apostrophecms/ui/ui/apos/scss/shared/_table-rows.scss +1 -1
  141. package/modules/@apostrophecms/widget-type/index.js +8 -2
  142. package/modules/@apostrophecms/widget-type/ui/apos/components/AposWidgetEditor.vue +26 -22
  143. package/modules/@apostrophecms/widget-type/ui/apos/mixins/AposWidgetMixin.js +4 -4
  144. package/package.json +31 -44
  145. package/modules/@apostrophecms/ui/ui/apos/lib/localized-v-tooltip.js +0 -63
  146. package/modules/@apostrophecms/ui/ui/apos/lib/tooltip-options.js +0 -13
@@ -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
+ v-model="next"
15
+ rows="5"
16
+ :id="uid"
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>
@@ -38,7 +38,7 @@
38
38
  <AposIndicator
39
39
  icon="help-circle-icon"
40
40
  class="apos-field__help-tooltip__icon"
41
- :tooltip="field.help || field.htmlHelp"
41
+ :tooltip="$t(field.help || field.htmlHelp)"
42
42
  :icon-size="11"
43
43
  icon-color="var(--a-base-4)"
44
44
  />
@@ -24,21 +24,23 @@
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]"
42
44
  :following-values="followingValues[field.name]"
43
45
  :condition-met="conditionalFields?.if[field.name]"
44
46
  :field="fields[field.name].field"
@@ -48,7 +50,25 @@
48
50
  :trigger-validation="triggerValidation"
49
51
  :server-error="fields[field.name].serverError"
50
52
  :doc-id="docId"
53
+ :generation="generation"
54
+ @update-doc-data="onUpdateDocData"
55
+ @validate="emitValidate()"
56
+ />
57
+ <component
58
+ :is="fieldComponentMap[field.type]"
59
+ v-if="hasCompareMeta"
60
+ v-show="displayComponent(field)"
51
61
  :ref="field.name"
62
+ v-model="compareMetaState[field.name]"
63
+ :following-values="followingValues[field.name]"
64
+ :condition-met="conditionalFields?.if[field.name]"
65
+ :field="fields[field.name].field"
66
+ :meta="meta"
67
+ :modifiers="fields[field.name].modifiers"
68
+ :display-options="getDisplayOptions(field.name)"
69
+ :trigger-validation="triggerValidation"
70
+ :server-error="fields[field.name].serverError"
71
+ :doc-id="docId"
52
72
  :generation="generation"
53
73
  @update-doc-data="onUpdateDocData"
54
74
  @validate="emitValidate()"
@@ -67,33 +87,57 @@ export default {
67
87
  </script>
68
88
 
69
89
  <style lang="scss" scoped>
70
- .apos-schema ::v-deep .apos-field__wrapper {
90
+ .apos-schema :deep(.apos-field__wrapper) {
71
91
  max-width: $input-max-width;
72
92
  }
73
93
 
74
- .apos-schema ::v-deep .apos-field__wrapper.apos-field__wrapper--full-width {
94
+ .apos-schema :deep(.apos-field__wrapper.apos-field__wrapper--full-width) {
75
95
  max-width: inherit;
76
96
  }
77
97
 
78
- .apos-schema ::v-deep img {
98
+ .apos-schema :deep(img) {
79
99
  max-width: 100%;
80
100
  }
81
101
 
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;
102
+ .apos-schema .apos-field--hidden {
103
+ display: none;
104
+ }
105
+
106
+ .apos-schema :deep(.apos-field) {
107
+ margin-bottom: $spacing-quadruple;
108
+ &.apos-field--small,
109
+ &.apos-field--micro,
110
+ &.apos-field--margin-micro {
111
+ margin-bottom: $spacing-double;
112
+ }
113
+ &.apos-field--margin-none {
114
+ margin-bottom: 0;
115
+ }
116
+ }
117
+
118
+ .apos-field .apos-schema :deep(.apos-toolbar) {
119
+ margin-bottom: 0;
120
+ }
121
+
122
+ .apos-schema.apos-schema--compare {
123
+ & > ::v-deep [data-apos-field] {
124
+ display: flex;
125
+
126
+ & > .apos-field__wrapper {
127
+ flex-grow: 1;
128
+ flex-basis: 50%;
129
+ border-right: 1px solid var(--a-base-9);
130
+ padding-right: 20px;
89
131
  }
90
- &.apos-field--margin-none {
91
- margin-bottom: 0;
132
+ & > .apos-field__wrapper + .apos-field__wrapper {
133
+ border-right: none;
134
+ padding-right: 0;
135
+ padding-left: 20px;
92
136
  }
93
- }
94
137
 
95
- .apos-schema ::v-deep .apos-toolbar & {
96
- margin-bottom: 0;
138
+ & .apos-field__label {
139
+ word-break: break-all;
140
+ }
97
141
  }
98
142
  }
99
143
  </style>
@@ -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
@@ -106,7 +106,7 @@ export default {
106
106
  },
107
107
  // Return next at mount or when generation changes
108
108
  getNext() {
109
- return this.value?.data ? this.value.data : (this.field.def || {});
109
+ return this.modelValue?.data ? this.modelValue.data : (this.field.def || {});
110
110
  }
111
111
  }
112
112
  };
@@ -1,6 +1,6 @@
1
1
  import AposInputMixin from 'Modules/@apostrophecms/schema/mixins/AposInputMixin';
2
2
  import AposInputChoicesMixin from 'Modules/@apostrophecms/schema/mixins/AposInputChoicesMixin';
3
- import InformationIcon from 'vue-material-design-icons/Information.vue';
3
+ import InformationIcon from '@apostrophecms/vue-material-design-icons/Information.vue';
4
4
 
5
5
  export default {
6
6
  name: 'AposInputRadio',
@@ -6,8 +6,8 @@ export default {
6
6
  mixins: [ AposInputMixin ],
7
7
  emits: [ 'input' ],
8
8
  data () {
9
- const next = (this.value && Array.isArray(this.value.data))
10
- ? klona(this.value.data) : (klona(this.field.def) || []);
9
+ const next = (this.modelValue && Array.isArray(this.modelValue.data))
10
+ ? klona(this.modelValue.data) : (klona(this.field.def) || []);
11
11
 
12
12
  // Remember relationship subfield values even if a document
13
13
  // is temporarily deselected, easing the user's pain if they
@@ -99,7 +99,7 @@ export default {
99
99
  return widgetOptions.minSize || [];
100
100
  },
101
101
  duplicate () {
102
- return this.value.duplicate ? 'apos-input--error' : null;
102
+ return this.modelValue.duplicate ? 'apos-input--error' : null;
103
103
  }
104
104
  },
105
105
  watch: {
@@ -209,9 +209,9 @@ export default {
209
209
  }, 200);
210
210
  },
211
211
  watchValue () {
212
- this.error = this.value.error;
212
+ this.error = this.modelValue.error;
213
213
  // Ensure the internal state is an array.
214
- this.next = Array.isArray(this.value.data) ? this.value.data : [];
214
+ this.next = Array.isArray(this.modelValue.data) ? this.modelValue.data : [];
215
215
  },
216
216
  async choose () {
217
217
  const result = await apos.modal.execute(this.chooserComponent, {
@@ -231,14 +231,17 @@ export default {
231
231
  schema: this.field.schema,
232
232
  item,
233
233
  title: item.title,
234
- value: item._fields
234
+ 'model-value': item._fields
235
235
  });
236
236
 
237
237
  if (result) {
238
238
  const index = this.next.findIndex(_item => _item._id === item._id);
239
- this.$set(this.next, index, {
240
- ...this.next[index],
241
- _fields: result
239
+
240
+ this.next = this.next.map((item, i) => {
241
+ return i === index ? {
242
+ ...item,
243
+ _fields: result
244
+ } : item;
242
245
  });
243
246
  }
244
247
  },
@@ -12,13 +12,13 @@ export default {
12
12
  },
13
13
  data() {
14
14
  return {
15
- next: (this.value.data == null) ? null : this.value.data,
15
+ next: (this.modelValue.data == null) ? null : this.modelValue.data,
16
16
  choices: []
17
17
  };
18
18
  },
19
19
  computed: {
20
20
  classes () {
21
- return [ this.value.duplicate && 'apos-input--error' ];
21
+ return [ this.modelValue.duplicate && 'apos-input--error' ];
22
22
  }
23
23
  },
24
24
  methods: {