apostrophe 4.3.3 → 4.4.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 (158) hide show
  1. package/.stylelintrc +1 -93
  2. package/CHANGELOG.md +51 -1
  3. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBar.vue +7 -1
  4. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarLocale.vue +6 -3
  5. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposAdminBarUser.vue +2 -1
  6. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextModeAndSettings.vue +1 -0
  7. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposContextTitle.vue +3 -2
  8. package/modules/@apostrophecms/admin-bar/ui/apos/components/TheAposSavingIndicator.vue +6 -2
  9. package/modules/@apostrophecms/any-page-type/index.js +2 -2
  10. package/modules/@apostrophecms/area/ui/apos/components/AposAreaContextualMenu.vue +13 -7
  11. package/modules/@apostrophecms/area/ui/apos/components/AposAreaEditor.vue +4 -4
  12. package/modules/@apostrophecms/area/ui/apos/components/AposAreaExpandedMenu.vue +17 -11
  13. package/modules/@apostrophecms/area/ui/apos/components/AposAreaMenu.vue +13 -7
  14. package/modules/@apostrophecms/area/ui/apos/components/AposAreaMenuItem.vue +3 -0
  15. package/modules/@apostrophecms/area/ui/apos/components/AposAreaWidget.vue +36 -20
  16. package/modules/@apostrophecms/area/ui/apos/components/AposWidgetControls.vue +18 -11
  17. package/modules/@apostrophecms/busy/ui/apos/components/TheAposBusy.vue +6 -8
  18. package/modules/@apostrophecms/command-menu/index.js +12 -7
  19. package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuKey.vue +9 -7
  20. package/modules/@apostrophecms/command-menu/ui/apos/components/AposCommandMenuShortcut.vue +28 -15
  21. package/modules/@apostrophecms/command-menu/ui/apos/components/TheAposCommandMenu.vue +44 -42
  22. package/modules/@apostrophecms/doc-type/index.js +2 -1
  23. package/modules/@apostrophecms/doc-type/ui/apos/components/AposDocEditor.vue +4 -3
  24. package/modules/@apostrophecms/file-tag/index.js +1 -1
  25. package/modules/@apostrophecms/global/index.js +29 -0
  26. package/modules/@apostrophecms/i18n/i18n/de.json +20 -0
  27. package/modules/@apostrophecms/i18n/i18n/en.json +1 -0
  28. package/modules/@apostrophecms/i18n/i18n/es.json +1 -0
  29. package/modules/@apostrophecms/i18n/i18n/fr.json +1 -0
  30. package/modules/@apostrophecms/i18n/i18n/it.json +1 -0
  31. package/modules/@apostrophecms/i18n/i18n/pt-BR.json +1 -0
  32. package/modules/@apostrophecms/i18n/i18n/sk.json +1 -0
  33. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalize.vue +25 -17
  34. package/modules/@apostrophecms/i18n/ui/apos/components/AposI18nLocalizeErrors.vue +5 -4
  35. package/modules/@apostrophecms/image/index.js +2 -1
  36. package/modules/@apostrophecms/image/ui/apos/components/AposImageCropper.vue +1 -1
  37. package/modules/@apostrophecms/image/ui/apos/components/AposImageRelationshipEditor.vue +9 -8
  38. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManager.vue +13 -10
  39. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerDisplay.vue +11 -7
  40. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerEditor.vue +12 -2
  41. package/modules/@apostrophecms/image/ui/apos/components/AposMediaManagerSelections.vue +8 -5
  42. package/modules/@apostrophecms/image/ui/apos/components/AposMediaUploader.vue +17 -8
  43. package/modules/@apostrophecms/image-tag/index.js +1 -1
  44. package/modules/@apostrophecms/login/ui/apos/components/AposLoginForm.vue +1 -0
  45. package/modules/@apostrophecms/login/ui/apos/components/AposResetPasswordForm.vue +1 -0
  46. package/modules/@apostrophecms/login/ui/apos/components/TheAposLogin.vue +16 -14
  47. package/modules/@apostrophecms/login/ui/apos/components/TheAposLoginHeader.vue +9 -4
  48. package/modules/@apostrophecms/modal/ui/apos/apps/AposModals.js +11 -59
  49. package/modules/@apostrophecms/modal/ui/apos/components/AposDocsManagerToolbar.vue +1 -0
  50. package/modules/@apostrophecms/modal/ui/apos/components/AposModal.vue +59 -55
  51. package/modules/@apostrophecms/modal/ui/apos/components/AposModalBody.vue +1 -0
  52. package/modules/@apostrophecms/modal/ui/apos/components/AposModalBreadcrumbs.vue +5 -0
  53. package/modules/@apostrophecms/modal/ui/apos/components/AposModalConfirm.vue +6 -10
  54. package/modules/@apostrophecms/modal/ui/apos/components/AposModalShareDraft.vue +14 -16
  55. package/modules/@apostrophecms/modal/ui/apos/components/AposModalTabs.vue +68 -5
  56. package/modules/@apostrophecms/modal/ui/apos/components/AposWidgetModalTabs.vue +15 -9
  57. package/modules/@apostrophecms/modal/ui/apos/components/TheAposModals.vue +48 -122
  58. package/modules/@apostrophecms/modal/ui/apos/composables/AposFocus.js +9 -6
  59. package/modules/@apostrophecms/modal/ui/apos/mixins/AposDocsManagerMixin.js +38 -36
  60. package/modules/@apostrophecms/notification/ui/apos/components/AposNotification.vue +15 -9
  61. package/modules/@apostrophecms/notification/ui/apos/components/TheAposNotifications.vue +2 -2
  62. package/modules/@apostrophecms/page/index.js +9 -6
  63. package/modules/@apostrophecms/page/ui/apos/components/AposPagesManager.vue +3 -4
  64. package/modules/@apostrophecms/page/ui/apos/logic/AposPagesManager.js +5 -10
  65. package/modules/@apostrophecms/page/views/notFound.html +5 -5
  66. package/modules/@apostrophecms/permission/ui/apos/components/AposPermissionGrid.vue +6 -2
  67. package/modules/@apostrophecms/piece-page-type/index.js +1 -0
  68. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManager.vue +8 -12
  69. package/modules/@apostrophecms/piece-type/ui/apos/components/AposDocsManagerSelectBox.vue +2 -2
  70. package/modules/@apostrophecms/piece-type/ui/apos/components/AposRelationshipEditor.vue +1 -2
  71. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposRichTextWidgetEditor.vue +59 -41
  72. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapDivider.vue +1 -0
  73. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapMarks.vue +3 -1
  74. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapStyles.vue +3 -1
  75. package/modules/@apostrophecms/rich-text-widget/ui/apos/components/AposTiptapTable.vue +2 -0
  76. package/modules/@apostrophecms/rich-text-widget/ui/apos/tiptap-extensions/Classes.js +1 -7
  77. package/modules/@apostrophecms/rich-text-widget/ui/apos/tiptap-extensions/Heading.js +10 -0
  78. package/modules/@apostrophecms/schema/lib/addFieldTypes.js +8 -3
  79. package/modules/@apostrophecms/schema/ui/apos/components/AposArrayEditor.vue +4 -6
  80. package/modules/@apostrophecms/schema/ui/apos/components/AposInputArea.vue +1 -0
  81. package/modules/@apostrophecms/schema/ui/apos/components/AposInputBoolean.vue +5 -2
  82. package/modules/@apostrophecms/schema/ui/apos/components/AposInputColor.vue +1 -0
  83. package/modules/@apostrophecms/schema/ui/apos/components/AposInputDateAndTime.vue +1 -1
  84. package/modules/@apostrophecms/schema/ui/apos/components/AposInputObject.vue +2 -0
  85. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRadio.vue +1 -0
  86. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRange.vue +14 -8
  87. package/modules/@apostrophecms/schema/ui/apos/components/AposInputRelationship.vue +4 -2
  88. package/modules/@apostrophecms/schema/ui/apos/components/AposInputSlug.vue +7 -1
  89. package/modules/@apostrophecms/schema/ui/apos/components/AposInputString.vue +3 -1
  90. package/modules/@apostrophecms/schema/ui/apos/components/AposInputWrapper.vue +35 -5
  91. package/modules/@apostrophecms/schema/ui/apos/components/AposSchema.vue +6 -3
  92. package/modules/@apostrophecms/schema/ui/apos/components/AposSearchList.vue +50 -15
  93. package/modules/@apostrophecms/schema/ui/apos/components/AposSubform.vue +5 -10
  94. package/modules/@apostrophecms/schema/ui/apos/logic/AposArrayEditor.js +17 -17
  95. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputRelationship.js +3 -0
  96. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputString.js +9 -0
  97. package/modules/@apostrophecms/schema/ui/apos/logic/AposInputWrapper.js +7 -0
  98. package/modules/@apostrophecms/schema/ui/apos/logic/AposSchema.js +8 -3
  99. package/modules/@apostrophecms/schema/ui/apos/logic/AposSearchList.js +3 -0
  100. package/modules/@apostrophecms/schema/ui/apos/mixins/AposInputMixin.js +5 -0
  101. package/modules/@apostrophecms/schema/ui/apos/scss/AposInputArray.scss +42 -9
  102. package/modules/@apostrophecms/search/index.js +1 -0
  103. package/modules/@apostrophecms/settings/index.js +33 -0
  104. package/modules/@apostrophecms/settings/ui/apos/components/AposSettingsManager.vue +6 -7
  105. package/modules/@apostrophecms/settings/ui/apos/logic/AposSettingsManager.js +0 -1
  106. package/modules/@apostrophecms/submitted-draft/index.js +26 -0
  107. package/modules/@apostrophecms/submitted-draft/ui/apos/components/AposSubmittedDraftIcon.vue +4 -4
  108. package/modules/@apostrophecms/template/views/templateError.html +4 -4
  109. package/modules/@apostrophecms/translation/ui/apos/components/AposTranslationIndicator.vue +2 -1
  110. package/modules/@apostrophecms/ui/ui/apos/components/AposAvatar.vue +3 -2
  111. package/modules/@apostrophecms/ui/ui/apos/components/AposButton.vue +62 -15
  112. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonGroup.vue +8 -0
  113. package/modules/@apostrophecms/ui/ui/apos/components/AposButtonSplit.vue +9 -3
  114. package/modules/@apostrophecms/ui/ui/apos/components/AposCellContextMenu.vue +2 -0
  115. package/modules/@apostrophecms/ui/ui/apos/components/AposCellLabels.vue +1 -0
  116. package/modules/@apostrophecms/ui/ui/apos/components/AposCloudUploadIcon.vue +5 -5
  117. package/modules/@apostrophecms/ui/ui/apos/components/AposCombo.vue +7 -5
  118. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenu.vue +8 -5
  119. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuDialog.vue +5 -3
  120. package/modules/@apostrophecms/ui/ui/apos/components/AposContextMenuItem.vue +22 -2
  121. package/modules/@apostrophecms/ui/ui/apos/components/AposEmptyState.vue +3 -1
  122. package/modules/@apostrophecms/ui/ui/apos/components/AposFile.vue +5 -1
  123. package/modules/@apostrophecms/ui/ui/apos/components/AposFilterMenu.vue +2 -1
  124. package/modules/@apostrophecms/ui/ui/apos/components/AposLabel.vue +1 -0
  125. package/modules/@apostrophecms/ui/ui/apos/components/AposMinMaxCount.vue +1 -0
  126. package/modules/@apostrophecms/ui/ui/apos/components/AposPager.vue +1 -0
  127. package/modules/@apostrophecms/ui/ui/apos/components/AposPagerDots.vue +3 -1
  128. package/modules/@apostrophecms/ui/ui/apos/components/AposSlat.vue +15 -2
  129. package/modules/@apostrophecms/ui/ui/apos/components/AposSlatList.vue +3 -1
  130. package/modules/@apostrophecms/ui/ui/apos/components/AposSpinner.vue +33 -7
  131. package/modules/@apostrophecms/ui/ui/apos/components/AposSubformPreview.vue +3 -2
  132. package/modules/@apostrophecms/ui/ui/apos/components/AposTag.vue +5 -3
  133. package/modules/@apostrophecms/ui/ui/apos/components/AposTagApply.vue +5 -2
  134. package/modules/@apostrophecms/ui/ui/apos/components/AposTagList.vue +5 -1
  135. package/modules/@apostrophecms/ui/ui/apos/components/AposTagListItem.vue +9 -1
  136. package/modules/@apostrophecms/ui/ui/apos/components/AposToggle.vue +13 -13
  137. package/modules/@apostrophecms/ui/ui/apos/components/AposTree.vue +1 -0
  138. package/modules/@apostrophecms/ui/ui/apos/components/AposTreeRows.vue +17 -7
  139. package/modules/@apostrophecms/ui/ui/apos/lib/vue.js +4 -0
  140. package/modules/@apostrophecms/ui/ui/apos/scss/global/_admin.scss +1 -1
  141. package/modules/@apostrophecms/ui/ui/apos/scss/global/_inputs.scss +28 -5
  142. package/modules/@apostrophecms/ui/ui/apos/scss/global/_scrollbars.scss +16 -0
  143. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tables.scss +8 -3
  144. package/modules/@apostrophecms/ui/ui/apos/scss/global/_theme.scss +9 -8
  145. package/modules/@apostrophecms/ui/ui/apos/scss/global/_tooltips.scss +13 -7
  146. package/modules/@apostrophecms/ui/ui/apos/scss/global/import-all.scss +1 -1
  147. package/modules/@apostrophecms/ui/ui/apos/scss/mixins/_input_mixins.scss +5 -3
  148. package/modules/@apostrophecms/ui/ui/apos/scss/mixins/_mixins.scss +1 -0
  149. package/modules/@apostrophecms/ui/ui/apos/scss/mixins/_responsive.scss +4 -3
  150. package/modules/@apostrophecms/ui/ui/apos/scss/mixins/_theme_mixins.scss +6 -0
  151. package/modules/@apostrophecms/ui/ui/apos/scss/shared/_table-rows.scss +6 -3
  152. package/modules/@apostrophecms/ui/ui/apos/stores/modal.js +180 -0
  153. package/modules/@apostrophecms/widget-type/ui/apos/components/AposWidgetEditor.vue +2 -2
  154. package/package.json +4 -4
  155. package/test/modules/@apostrophecms/search/views/index.html +1 -0
  156. package/test/pages.js +227 -0
  157. package/test/schemas.js +184 -0
  158. package/test/search.js +49 -13
@@ -6,6 +6,7 @@
6
6
  :uid="uid"
7
7
  :display-options="displayOptions"
8
8
  :meta="fieldMeta"
9
+ @replace-field-value="replaceFieldValue"
9
10
  >
10
11
  <template #body>
11
12
  <div :class="wrapperClasses">
@@ -52,12 +53,15 @@ export default {
52
53
  <style lang="scss" scoped>
53
54
  .apos-input-wrapper--with-prefix {
54
55
  @include apos-input();
56
+
55
57
  display: flex;
56
58
  align-items: center;
57
59
  color: var(--a-base-4);
60
+
58
61
  .apos-input {
59
- border: none;
60
62
  padding-left: 0;
63
+ border: none;
64
+
61
65
  &:hover,
62
66
  &:focus {
63
67
  border: none;
@@ -65,10 +69,12 @@ export default {
65
69
  }
66
70
  }
67
71
  }
72
+
68
73
  .apos-input__slug-locale-prefix {
69
74
  display: inline-block;
70
75
  padding-left: 20px;
71
76
  }
77
+
72
78
  .apos-field--inverted .apos-input-wrapper--with-prefix {
73
79
  background-color: var(--a-background-primary);
74
80
  }
@@ -6,6 +6,7 @@
6
6
  :uid="uid"
7
7
  :display-options="displayOptions"
8
8
  :meta="fieldMeta"
9
+ @replace-field-value="replaceFieldValue"
9
10
  >
10
11
  <template #body>
11
12
  <div class="apos-input-wrapper">
@@ -13,7 +14,7 @@
13
14
  v-if="field.textarea && field.type === 'string'"
14
15
  :id="uid"
15
16
  v-model="next"
16
- rows="5"
17
+ :rows="rows"
17
18
  :class="classes"
18
19
  :placeholder="$t(field.placeholder)"
19
20
  :disabled="field.readOnly"
@@ -63,6 +64,7 @@ export default {
63
64
  height: 46px;
64
65
  padding-right: 40px;
65
66
  }
67
+
66
68
  .apos-input--date {
67
69
  &::-webkit-clear-button {
68
70
  position: relative;
@@ -12,7 +12,10 @@
12
12
  :is="labelEl"
13
13
  v-if="field.label"
14
14
  class="apos-field__label"
15
- :class="{'apos-sr-only': field.hideLabel }"
15
+ :class="{
16
+ 'apos-sr-only': field.hideLabel,
17
+ 'apos-field__label--meta-left': field.meta && field.meta.position === 'left',
18
+ }"
16
19
  :for="uid"
17
20
  :data-apos-test-name="field.name"
18
21
  :data-apos-test-label="field.label"
@@ -69,6 +72,7 @@
69
72
  :data-apos-test-component="name"
70
73
  :data-apos-test-namespace="namespace"
71
74
  data-apos-test="field-meta"
75
+ @replace-field-value="replaceFieldValue"
72
76
  />
73
77
  </span>
74
78
  </component>
@@ -115,6 +119,7 @@ export default {
115
119
  .apos-field {
116
120
  border-width: 0;
117
121
  padding: 0;
122
+
118
123
  [disable]:hover, [disabled] ~ .apos-choice-label-text:hover {
119
124
  cursor: not-allowed;
120
125
  }
@@ -126,14 +131,28 @@ export default {
126
131
 
127
132
  .apos-field__label {
128
133
  @include type-label;
134
+
129
135
  display: flex;
136
+ flex-wrap: nowrap;
130
137
  align-items: center;
131
138
  justify-content: space-between;
132
- flex-wrap: nowrap;
133
- gap: $spacing-double;
134
139
  margin: 0 0 $spacing-base;
135
140
  padding: 0;
136
141
  color: var(--a-text-primary);
142
+ gap: $spacing-double;
143
+
144
+ &.apos-field__label--meta-left {
145
+ justify-content: flex-start;
146
+ gap: $spacing-base;
147
+
148
+ .apos-field__label-meta {
149
+ order: 1;
150
+ }
151
+
152
+ .apos-field_label-info {
153
+ order: 2;
154
+ }
155
+ }
137
156
 
138
157
  &-info {
139
158
  display: block;
@@ -148,8 +167,9 @@ export default {
148
167
  }
149
168
 
150
169
  .apos-field__help {
151
- margin: 0 0 $spacing-base;
152
170
  @include type-base;
171
+
172
+ margin: 0 0 $spacing-base;
153
173
  line-height: var(--a-line-tall);
154
174
  color: var(--a-base-3);
155
175
  }
@@ -160,12 +180,13 @@ export default {
160
180
 
161
181
  .apos-field__changed {
162
182
  position: relative;
163
- margin-left: $spacing-half;
164
183
  top: -2px;
184
+ margin-left: $spacing-half;
165
185
  }
166
186
 
167
187
  .apos-field__error {
168
188
  @include type-help;
189
+
169
190
  margin: $spacing-base 0;
170
191
  color: var(--a-danger);
171
192
  }
@@ -186,30 +207,39 @@ export default {
186
207
  .apos-field--inline {
187
208
  display: flex;
188
209
  align-items: center;
210
+
189
211
  .apos-field__label {
190
212
  margin-bottom: 0;
191
213
  }
214
+
192
215
  .apos-field__info,
193
216
  .apos-input-wrapper {
194
217
  width: 48%;
195
218
  }
219
+
196
220
  .apos-field__info {
197
221
  margin-right: 4%;
198
222
  }
223
+
199
224
  &.apos-field--range {
200
225
  display: block;
226
+
201
227
  .apos-range__input {
202
228
  margin: 5px 0 0;
203
229
  }
230
+
204
231
  .apos-range__scale {
205
232
  margin-top: 0;
206
233
  }
234
+
207
235
  .apos-range__value {
208
236
  padding-top: 9px;
209
237
  }
238
+
210
239
  .apos-field__info {
211
240
  margin: 0 0 5px;
212
241
  }
242
+
213
243
  .apos-field__info,
214
244
  .apos-input-wrapper {
215
245
  width: 100%;
@@ -107,11 +107,13 @@ export default {
107
107
 
108
108
  .apos-schema :deep(.apos-field) {
109
109
  margin-bottom: $spacing-quadruple;
110
+
110
111
  &.apos-field--small,
111
112
  &.apos-field--micro,
112
113
  &.apos-field--margin-micro {
113
114
  margin-bottom: $spacing-double;
114
115
  }
116
+
115
117
  &.apos-field--margin-none {
116
118
  margin-bottom: 0;
117
119
  }
@@ -129,15 +131,16 @@ export default {
129
131
  }
130
132
 
131
133
  & > .apos-field__wrapper {
132
- flex-grow: 1;
133
134
  flex-basis: 50%;
134
- border-right: 1px solid var(--a-base-9);
135
+ flex-grow: 1;
135
136
  padding-right: 20px;
137
+ border-right: 1px solid var(--a-base-9);
136
138
  }
139
+
137
140
  & > .apos-field__wrapper + .apos-field__wrapper {
138
- border-right: none;
139
141
  padding-right: 0;
140
142
  padding-left: 20px;
143
+ border-right: none;
141
144
  }
142
145
 
143
146
  & .apos-field__label {
@@ -7,11 +7,12 @@
7
7
  :class="getClasses(item)"
8
8
  @click="select(item, $event)"
9
9
  >
10
- <img
10
+ <div
11
11
  v-if="item?.attachment?._urls?.['one-sixth']"
12
- :src="item.attachment._urls['one-sixth']"
13
12
  class="apos-search-image"
14
13
  >
14
+ <img :src="item.attachment._urls['one-sixth']">
15
+ </div>
15
16
  <AposIndicator
16
17
  v-else-if="getIcon(item).icon"
17
18
  :icon="getIcon(item).icon"
@@ -53,18 +54,18 @@ export default {
53
54
  z-index: calc(#{$z-index-widget-focused-controls} + 1);
54
55
  position: absolute;
55
56
  overflow: auto;
57
+ box-sizing: border-box;
56
58
  width: 100%;
59
+ margin: 0;
60
+ padding: 0;
61
+ border: 1px solid var(--a-base-8);
62
+ background: var(--a-background-primary);
57
63
  list-style: none;
58
64
  box-shadow: var(--a-box-shadow);
59
- box-sizing: border-box;
60
65
  min-width: 320px;
61
66
  max-height: 300px;
62
- margin: 0;
63
- padding: 0;
64
67
  border-bottom-left-radius: var(--a-border-radius);
65
68
  border-bottom-right-radius: var(--a-border-radius);
66
- border: 1px solid var(--a-base-8);
67
- background: var(--a-background-primary);
68
69
 
69
70
  &:empty {
70
71
  display: none;
@@ -76,9 +77,11 @@ export default {
76
77
  border: none;
77
78
  background-color: var(--a-background-primary);
78
79
  cursor: auto;
80
+
79
81
  .apos-search__item__title {
80
82
  color: $input-color-disabled;
81
83
  }
84
+
82
85
  .apos-search__item__field {
83
86
  color: $input-color-disabled;
84
87
  }
@@ -87,9 +90,11 @@ export default {
87
90
  @mixin suggestion {
88
91
  padding-top: 14px;
89
92
  background-color: var(--a-background-inverted);
93
+
90
94
  .apos-search__item__title {
91
95
  color: var(--a-text-inverted);
92
96
  }
97
+
93
98
  .apos-search__item__field {
94
99
  color: var(--a-base-8);
95
100
  }
@@ -99,9 +104,11 @@ export default {
99
104
  flex-direction: column;
100
105
  gap: 4px;
101
106
  border-top: 1px solid var(--a-base-5);
107
+
102
108
  .apos-search__item__title {
103
109
  color: var(--a-base-2);
104
110
  }
111
+
105
112
  .apos-search__item__field {
106
113
  color: var(--a-text-primary);
107
114
  }
@@ -109,14 +116,15 @@ export default {
109
116
 
110
117
  .apos-search__item {
111
118
  display: flex;
112
- justify-content: flex-start;
119
+ box-sizing: border-box;
113
120
  align-items: center;
114
- gap: 10px;
121
+ justify-content: flex-start;
115
122
  margin: 0;
116
123
  padding: 10px 20px;
117
124
  border-top: 1px solid var(--a-base-5);
118
- box-sizing: border-box;
119
- transition: background-color 0.3s ease;
125
+ transition: background-color 300ms ease;
126
+ gap: 10px;
127
+
120
128
  & * {
121
129
  pointer-events: none;
122
130
  }
@@ -124,12 +132,15 @@ export default {
124
132
  &:hover.apos-search__item {
125
133
  background-color: var(--a-base-10);
126
134
  cursor: pointer;
135
+
127
136
  &.apos-search__item--disabled {
128
137
  @include disabled;
129
138
  }
139
+
130
140
  &.apos-search__item--suggestion {
131
141
  @include suggestion;
132
142
  }
143
+
133
144
  &.apos-search__item--hint {
134
145
  @include hint;
135
146
  }
@@ -137,11 +148,13 @@ export default {
137
148
 
138
149
  &__title {
139
150
  @include type-base;
151
+
140
152
  color: var(--a-text-primary);
141
153
  }
142
154
 
143
155
  &__field {
144
156
  @include type-base;
157
+
145
158
  color: var(--a-base-2);
146
159
  }
147
160
 
@@ -158,11 +171,33 @@ export default {
158
171
  }
159
172
 
160
173
  .apos-search-image {
161
- flex-basis: 0;
174
+ display: flex;
175
+ flex-basis: 32px;
162
176
  flex-grow: 0;
163
- max-width: 32px;
164
- max-height: 32px;
165
- object-fit: cover;
177
+
178
+ & img {
179
+ max-width: 32px;
180
+ max-height: 32px;
181
+ object-fit: cover;
182
+ margin: 0 auto;
183
+ }
184
+ }
185
+
186
+ &--attachment {
187
+ .apos-search-image {
188
+ flex-basis: 50px;
189
+ }
190
+
191
+ .apos-search-image img {
192
+ max-width: 50px;
193
+ max-height: 50px;
194
+ }
195
+
196
+ .apos-search__item__title {
197
+ white-space: nowrap;
198
+ text-overflow: ellipsis;
199
+ overflow: hidden;
200
+ }
166
201
  }
167
202
  }
168
203
  </style>
@@ -86,12 +86,9 @@ export default {
86
86
  &__preview-trigger {
87
87
  z-index: $z-index-default;
88
88
  position: absolute;
89
- box-sizing: border-box;
90
- top: 0;
91
- right: 0;
92
- bottom: 0;
93
- left: 0;
89
+ inset: 0;
94
90
  display: block;
91
+ box-sizing: border-box;
95
92
  width: 100%;
96
93
  height: 100%;
97
94
  margin: 0;
@@ -115,9 +112,9 @@ export default {
115
112
  @include type-base;
116
113
 
117
114
  display: block;
115
+ padding-bottom: $spacing-double;
118
116
  color: var(--a-base-3);
119
117
  line-height: 1;
120
- padding-bottom: $spacing-double;
121
118
  }
122
119
 
123
120
  &__controls {
@@ -152,11 +149,9 @@ export default {
152
149
  }
153
150
 
154
151
  .slide-fade-enter-active {
155
- transition: all 0.3s ease-in;
156
- }
157
- .slide-fade-leave-active {
158
- // nothing on expand: false
152
+ transition: all 300ms ease-in;
159
153
  }
154
+
160
155
  .slide-fade-enter, .slide-fade-leave-to {
161
156
  transform: translateY(-5px);
162
157
  opacity: 0;
@@ -37,7 +37,7 @@ export default {
37
37
  default: null
38
38
  }
39
39
  },
40
- emits: [ 'modal-result', 'safe-close' ],
40
+ emits: [ 'modal-result' ],
41
41
  data() {
42
42
  // Automatically add `_id` to default items
43
43
  const items = this.items.map(item => ({
@@ -47,7 +47,7 @@ export default {
47
47
 
48
48
  return {
49
49
  currentId: null,
50
- currentDoc: null,
50
+ currentDoc: { data: {} },
51
51
  modal: {
52
52
  active: false,
53
53
  type: 'overlay',
@@ -142,7 +142,7 @@ export default {
142
142
  this.modal.active = true;
143
143
  await this.evaluateExternalConditions();
144
144
  if (this.next.length) {
145
- await this.select(this.next[0]._id);
145
+ this.setCurrentDoc(this.next.at(0)._id);
146
146
  }
147
147
  if (this.serverError && this.serverError.data && this.serverError.data.errors) {
148
148
  const first = this.serverError.data.errors[0];
@@ -155,19 +155,22 @@ export default {
155
155
  this.titleFieldChoices = await this.getTitleFieldChoices();
156
156
  },
157
157
  methods: {
158
+ setCurrentDoc(_id) {
159
+ this.currentId = _id;
160
+ this.currentDoc = {
161
+ hasErrors: false,
162
+ data: this.next.find(item => item._id === _id)
163
+ };
164
+ this.evaluateConditions();
165
+ this.triggerValidation = false;
166
+ },
158
167
  async select(_id) {
159
168
  if (this.currentId === _id) {
160
169
  return;
161
170
  }
162
171
  if (await this.validate(true, false)) {
163
172
  this.currentDocToCurrentItem();
164
- this.currentId = _id;
165
- this.currentDoc = {
166
- hasErrors: false,
167
- data: this.next.find(item => item._id === _id)
168
- };
169
- this.evaluateConditions();
170
- this.triggerValidation = false;
173
+ this.setCurrentDoc(_id);
171
174
  }
172
175
  },
173
176
  update(items) {
@@ -176,9 +179,9 @@ export default {
176
179
  // drags fail
177
180
  this.next = items.map(item => this.next.find(_item => item._id === _item._id));
178
181
  if (this.currentId) {
179
- if (!this.next.find(item => item._id === this.currentId)) {
180
- this.currentId = null;
181
- this.currentDoc = null;
182
+ if (!this.next.some(item => item._id === this.currentId)) {
183
+ this.currentId = this.next.at(0)?._id || null;
184
+ this.currentDoc = { data: this.next.at(0) || {} };
182
185
  }
183
186
  }
184
187
  this.updateMinMax();
@@ -254,7 +257,7 @@ export default {
254
257
  return false;
255
258
  },
256
259
  async validate(validateItem, validateLength) {
257
- if (validateItem) {
260
+ if (validateItem && this.next.length > 0 && this.currentId) {
258
261
  this.triggerValidation = true;
259
262
  }
260
263
  await this.$nextTick();
@@ -355,9 +358,6 @@ export default {
355
358
  }
356
359
  }
357
360
  return choices;
358
- },
359
- emitSafeClose() {
360
- this.$emit('safe-close');
361
361
  }
362
362
  }
363
363
  };
@@ -17,9 +17,12 @@ export default {
17
17
  .map(doc => [ doc._id, doc._fields ])
18
18
  );
19
19
 
20
+ const suggestionFields = this.field.suggestionFields || apos.modules[this.field.withType]?.relationshipSuggestionFields;
21
+
20
22
  return {
21
23
  searchTerm: '',
22
24
  searchList: [],
25
+ suggestionFields,
23
26
  next,
24
27
  subfields,
25
28
  disabled: false,
@@ -4,6 +4,12 @@ export default {
4
4
  name: 'AposInputString',
5
5
  mixins: [ AposInputMixin ],
6
6
  emits: [ 'return' ],
7
+ props: {
8
+ rows: {
9
+ type: Number,
10
+ default: 5
11
+ }
12
+ },
7
13
  data () {
8
14
  return {
9
15
  step: undefined,
@@ -19,6 +25,9 @@ export default {
19
25
  if (this.field.type === 'float' || this.field.type === 'integer') {
20
26
  return 'number';
21
27
  }
28
+ if (this.field.type === 'string' && this.field.textarea) {
29
+ return 'textarea';
30
+ }
22
31
  if (this.field.type === 'string' || this.field.type === 'slug') {
23
32
  return 'text';
24
33
  }
@@ -9,6 +9,7 @@ export default {
9
9
  })
10
10
  }
11
11
  },
12
+ emits: [ 'replace-field-value' ],
12
13
  props: {
13
14
  field: {
14
15
  type: Object,
@@ -149,5 +150,11 @@ export default {
149
150
  this.wrapEl = 'fieldset';
150
151
  this.labelEl = 'legend';
151
152
  }
153
+ },
154
+ methods: {
155
+ // Notify about a value, suggested by meta components or their children.
156
+ replaceFieldValue(value) {
157
+ this.$emit('replace-field-value', value);
158
+ }
152
159
  }
153
160
  };
@@ -6,7 +6,12 @@ export default {
6
6
  props: {
7
7
  modelValue: {
8
8
  type: Object,
9
- required: true
9
+ required: true,
10
+ default() {
11
+ return {
12
+ data: {}
13
+ };
14
+ }
10
15
  },
11
16
  meta: {
12
17
  type: Object,
@@ -120,7 +125,7 @@ export default {
120
125
  required
121
126
  },
122
127
  value: {
123
- data: this.modelValue[item.name]
128
+ data: this.modelValue.data[item.name]
124
129
  },
125
130
  serverError: this.serverErrors && this.serverErrors[item.name],
126
131
  modifiers: [
@@ -181,7 +186,7 @@ export default {
181
186
  this.populateDocData();
182
187
  }
183
188
  },
184
- generation(generated) {
189
+ generation() {
185
190
  // repopulate the schema.
186
191
  this.populateDocData();
187
192
  },
@@ -69,6 +69,9 @@ export default {
69
69
  item.classes && Array.isArray(item.classes) && item.classes.forEach(suffix => {
70
70
  classes[`apos-search__item--${suffix}`] = true;
71
71
  });
72
+ if (item.attachment) {
73
+ classes['apos-search__item--attachment'] = true;
74
+ }
72
75
 
73
76
  return classes;
74
77
  },
@@ -145,6 +145,11 @@ export default {
145
145
  ranValidation: this.conditionMet === false ? this.modelValue.ranValidation : true
146
146
  });
147
147
  },
148
+ // Allows replacing the current component value externally, e.g. via
149
+ // local component or global bus events.
150
+ replaceFieldValue(value) {
151
+ this.next = value;
152
+ },
148
153
  watchValue () {
149
154
  this.error = this.modelValue.error;
150
155
  this.next = this.modelValue.data;