@veltra/desktop 1.8.3 → 1.8.4

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 (197) hide show
  1. package/dist/components/action/action-group.js.map +1 -1
  2. package/dist/components/action/action-group.vue_vue_type_script_setup_true_lang.js.map +1 -1
  3. package/dist/components/action/action.js.map +1 -1
  4. package/dist/components/auto-complete/auto-complete.js.map +1 -1
  5. package/dist/components/badge/badge.js.map +1 -1
  6. package/dist/components/batch-edit/batch-edit-form.js.map +1 -1
  7. package/dist/components/batch-edit/batch-edit-list.js.map +1 -1
  8. package/dist/components/batch-edit/batch-edit.js.map +1 -1
  9. package/dist/components/breadcrumb/breadcrumb.js.map +1 -1
  10. package/dist/components/button/button-group.js.map +1 -1
  11. package/dist/components/button/button.js.map +1 -1
  12. package/dist/components/calendar/calendar.js.map +1 -1
  13. package/dist/components/card/card-action.js.map +1 -1
  14. package/dist/components/card/card-content.js.map +1 -1
  15. package/dist/components/card/card-cover.js.map +1 -1
  16. package/dist/components/card/card-header.js.map +1 -1
  17. package/dist/components/card/card.js.map +1 -1
  18. package/dist/components/cascade/cascade-panel-item.js.map +1 -1
  19. package/dist/components/cascade/cascade.js +1 -0
  20. package/dist/components/cascade/cascade.js.map +1 -1
  21. package/dist/components/cascade/use-select.js +6 -2
  22. package/dist/components/cascade/use-select.js.map +1 -1
  23. package/dist/components/check-tag/check-tag.js.map +1 -1
  24. package/dist/components/checkbox/checkbox-button.js.map +1 -1
  25. package/dist/components/checkbox/checkbox.js.map +1 -1
  26. package/dist/components/checkbox-group/checkbox-group.js.map +1 -1
  27. package/dist/components/code-editor/code-editor.js.map +1 -1
  28. package/dist/components/collapse/collapse-item.js.map +1 -1
  29. package/dist/components/collapse/collapse.js.map +1 -1
  30. package/dist/components/condition-editor/components/condition-group.js.map +1 -1
  31. package/dist/components/condition-editor/components/condition-row.js.map +1 -1
  32. package/dist/components/condition-editor/condition-editor.js.map +1 -1
  33. package/dist/components/contextmenu/contextmenu-item.js.map +1 -1
  34. package/dist/components/contextmenu/contextmenu-panel.js.map +1 -1
  35. package/dist/components/contextmenu/contextmenu-sub.js.map +1 -1
  36. package/dist/components/contextmenu/contextmenu.js.map +1 -1
  37. package/dist/components/date-panel/date-panel.js.map +1 -1
  38. package/dist/components/date-panel/headers/day.js.map +1 -1
  39. package/dist/components/date-panel/headers/month.js.map +1 -1
  40. package/dist/components/date-panel/headers/year.js.map +1 -1
  41. package/dist/components/date-panel/panels/day.js.map +1 -1
  42. package/dist/components/date-panel/panels/month.js.map +1 -1
  43. package/dist/components/date-panel/panels/year.js.map +1 -1
  44. package/dist/components/date-picker/date-picker.js.map +1 -1
  45. package/dist/components/date-range-picker/date-range-picker.js.map +1 -1
  46. package/dist/components/dialog/dialog.js.map +1 -1
  47. package/dist/components/drawer/drawer.js.map +1 -1
  48. package/dist/components/dropdown/dropdown.js.map +1 -1
  49. package/dist/components/dual-nav/dual-nav-app.js.map +1 -1
  50. package/dist/components/dual-nav/dual-nav.js.map +1 -1
  51. package/dist/components/empty/empty.js.map +1 -1
  52. package/dist/components/expression-editor/components/path-preview.js.map +1 -1
  53. package/dist/components/expression-editor/components/variable-picker.js.map +1 -1
  54. package/dist/components/expression-editor/expression-editor.js.map +1 -1
  55. package/dist/components/file-picker/file-picker.js.map +1 -1
  56. package/dist/components/file-viewer/file-viewer.js.map +1 -1
  57. package/dist/components/file-viewer/previewers/docx-previewer.js.map +1 -1
  58. package/dist/components/file-viewer/previewers/image-previewer.js.map +1 -1
  59. package/dist/components/file-viewer/previewers/ofd-previewer.js.map +1 -1
  60. package/dist/components/file-viewer/previewers/pdf-previewer.js.map +1 -1
  61. package/dist/components/file-viewer/previewers/pdf-viewport-scroll.js.map +1 -1
  62. package/dist/components/file-viewer/previewers/pdf-zoom-bridge.js.map +1 -1
  63. package/dist/components/file-viewer/previewers/sheet-previewer.js.map +1 -1
  64. package/dist/components/file-viewer/previewers/text-previewer.js.map +1 -1
  65. package/dist/components/file-viewer/previewers/video-previewer.js.map +1 -1
  66. package/dist/components/float-button/float-button.js.map +1 -1
  67. package/dist/components/form/form.js.map +1 -1
  68. package/dist/components/form/form.vue_vue_type_script_setup_true_lang.js.map +1 -1
  69. package/dist/components/form-item/form-item.js.map +1 -1
  70. package/dist/components/form-item/form-item.vue_vue_type_script_setup_true_lang.js.map +1 -1
  71. package/dist/components/gantt-chart/gantt-chart.js.map +1 -1
  72. package/dist/components/grid/grid-item.js.map +1 -1
  73. package/dist/components/grid/grid.js.map +1 -1
  74. package/dist/components/grid-input/grid-input.js.map +1 -1
  75. package/dist/components/group-input/group-input.js.map +1 -1
  76. package/dist/components/group-nav/group-nav-item.js.map +1 -1
  77. package/dist/components/group-nav/group-nav.js.map +1 -1
  78. package/dist/components/icon/icon.js.map +1 -1
  79. package/dist/components/image-cropper/image-cropper.js.map +1 -1
  80. package/dist/components/input/input.js.map +1 -1
  81. package/dist/components/input/input.vue_vue_type_script_setup_true_lang.js.map +1 -1
  82. package/dist/components/kanban/kanban-column.js.map +1 -1
  83. package/dist/components/kanban/kanban.js.map +1 -1
  84. package/dist/components/kbd/kbd.js.map +1 -1
  85. package/dist/components/layout/layout-resizer.js.map +1 -1
  86. package/dist/components/layout/layout.js.map +1 -1
  87. package/dist/components/list/list-item.js.map +1 -1
  88. package/dist/components/list/list.js.map +1 -1
  89. package/dist/components/loading/loading.js.map +1 -1
  90. package/dist/components/message/message-box.js.map +1 -1
  91. package/dist/components/message/message.js.map +1 -1
  92. package/dist/components/message-confirm/message-confirm-box.js.map +1 -1
  93. package/dist/components/message-confirm/message-confirm.js.map +1 -1
  94. package/dist/components/multi-select/multi-select-option.js.map +1 -1
  95. package/dist/components/multi-select/multi-select.js.map +1 -1
  96. package/dist/components/multi-tree-select/multi-tree-select.js.map +1 -1
  97. package/dist/components/nav/nav-icon.js.map +1 -1
  98. package/dist/components/nav/nav-item-collapsed.js.map +1 -1
  99. package/dist/components/nav/nav-item.js.map +1 -1
  100. package/dist/components/nav/nav-sub-collapsed.js.map +1 -1
  101. package/dist/components/nav/nav-sub.js.map +1 -1
  102. package/dist/components/nav/nav.js.map +1 -1
  103. package/dist/components/notification/notification-box.js.map +1 -1
  104. package/dist/components/notification/notification.js.map +1 -1
  105. package/dist/components/number/number.js.map +1 -1
  106. package/dist/components/number-input/number-input.js.map +1 -1
  107. package/dist/components/number-range-input/number-range-input.js.map +1 -1
  108. package/dist/components/paginator/paginator.js.map +1 -1
  109. package/dist/components/palette/palette-alpha.js.map +1 -1
  110. package/dist/components/palette/palette-color-switch.js.map +1 -1
  111. package/dist/components/palette/palette-hue.js.map +1 -1
  112. package/dist/components/palette/palette-sv.js.map +1 -1
  113. package/dist/components/palette/palette.js.map +1 -1
  114. package/dist/components/password-input/password-input.js.map +1 -1
  115. package/dist/components/pop-confirm/pop-confirm.js.map +1 -1
  116. package/dist/components/progress/progress.js.map +1 -1
  117. package/dist/components/progress-nodes/progress-nodes.js.map +1 -1
  118. package/dist/components/radio/radio.js.map +1 -1
  119. package/dist/components/radio-group/radio-group.js.map +1 -1
  120. package/dist/components/rich-text-editor/rich-text-editor.js.map +1 -1
  121. package/dist/components/rich-text-editor/toolbar.js.map +1 -1
  122. package/dist/components/scroll/scroll-bar.js.map +1 -1
  123. package/dist/components/scroll/scroll.js.map +1 -1
  124. package/dist/components/segment/segment.js.map +1 -1
  125. package/dist/components/select/select.js +9 -5
  126. package/dist/components/select/select.js.map +1 -1
  127. package/dist/components/slider/slider-thumb.js.map +1 -1
  128. package/dist/components/slider/slider.js.map +1 -1
  129. package/dist/components/steps/steps.js.map +1 -1
  130. package/dist/components/switch/switch.js.map +1 -1
  131. package/dist/components/table/table-body.js.map +1 -1
  132. package/dist/components/table/table-cell.js.map +1 -1
  133. package/dist/components/table/table-foot.js.map +1 -1
  134. package/dist/components/table/table-head.js.map +1 -1
  135. package/dist/components/table/table-row.js.map +1 -1
  136. package/dist/components/table/table.js.map +1 -1
  137. package/dist/components/table-editor/table-editor.js.map +1 -1
  138. package/dist/components/tabs/tabs-horizontal.js.map +1 -1
  139. package/dist/components/tabs/tabs-vertical.js.map +1 -1
  140. package/dist/components/tabs/tabs.js.map +1 -1
  141. package/dist/components/tag/tag.js.map +1 -1
  142. package/dist/components/text/text.js.map +1 -1
  143. package/dist/components/textarea/textarea.js.map +1 -1
  144. package/dist/components/theme/theme.js.map +1 -1
  145. package/dist/components/tip/tip.js.map +1 -1
  146. package/dist/components/tree/tree-node.js.map +1 -1
  147. package/dist/components/tree/tree.js.map +1 -1
  148. package/dist/components/tree-select/tree-select.js +19 -10
  149. package/dist/components/tree-select/tree-select.js.map +1 -1
  150. package/dist/components/watermark/watermark.js.map +1 -1
  151. package/dist/types/cascade.d.ts +5 -0
  152. package/dist/types/select.d.ts +8 -2
  153. package/dist/types/tree-select.d.ts +8 -2
  154. package/package.json +18 -18
  155. package/src/components/batch-edit/__test__/batch-edit.test.ts +1 -1
  156. package/src/components/button/__test__/button.test.ts +1 -1
  157. package/src/components/cascade/__test__/cascade.test.ts +26 -1
  158. package/src/components/cascade/use-select.ts +5 -5
  159. package/src/components/collapse/__test__/collapse.test.ts +1 -1
  160. package/src/components/condition-editor/__test__/condition-editor.test.ts +1 -1
  161. package/src/components/contextmenu/__test__/contextmenu.test.ts +1 -1
  162. package/src/components/date-picker/__test__/date-picker.test.ts +1 -1
  163. package/src/components/date-range-picker/__test__/date-range-picker.test.ts +1 -1
  164. package/src/components/drawer/__test__/drawer.test.ts +1 -1
  165. package/src/components/expression-editor/__test__/chip.test.ts +1 -1
  166. package/src/components/expression-editor/__test__/editor.test.ts +1 -1
  167. package/src/components/expression-editor/__test__/expression-editor.test.ts +1 -1
  168. package/src/components/expression-editor/__test__/mention.test.ts +1 -1
  169. package/src/components/expression-editor/__test__/model.test.ts +1 -1
  170. package/src/components/file-viewer/__test__/helper.test.ts +1 -1
  171. package/src/components/form/__test__/form.test.ts +1 -1
  172. package/src/components/form/__test__/is-field-modified.test.ts +1 -1
  173. package/src/components/form-item/__test__/form-item.test.ts +1 -1
  174. package/src/components/image-cropper/__test__/draw-crop.test.ts +1 -1
  175. package/src/components/image-cropper/__test__/image-cropper.test.ts +1 -1
  176. package/src/components/image-cropper/__test__/use-transform.test.ts +1 -1
  177. package/src/components/kanban/__test__/kanban.test.ts +1 -1
  178. package/src/components/message-confirm/__test__/message-confirm.test.ts +1 -1
  179. package/src/components/multi-tree-select/__test__/multi-tree-select.test.ts +1 -1
  180. package/src/components/number-input/__test__/number-input.test.ts +1 -1
  181. package/src/components/number-range-input/__test__/number-range-input.test.ts +1 -1
  182. package/src/components/palette/__test__/color-transform.test.ts +1 -1
  183. package/src/components/palette/__test__/palette.test.ts +1 -1
  184. package/src/components/password-input/__test__/password-input.test.ts +1 -1
  185. package/src/components/radio-group/__test__/radio-group.test.ts +1 -1
  186. package/src/components/rich-text-editor/__test__/image-node.test.ts +1 -1
  187. package/src/components/segment/__test__/segment.test.ts +1 -1
  188. package/src/components/select/__test__/select.test.ts +68 -1
  189. package/src/components/select/select.vue +15 -5
  190. package/src/components/table/__test__/col-width.test.ts +1 -1
  191. package/src/components/table/__test__/column-style.test.ts +1 -1
  192. package/src/components/table-editor/__test__/table-editor.test.ts +1 -1
  193. package/src/components/tree-select/__test__/tree-select.test.ts +50 -1
  194. package/src/components/tree-select/tree-select.vue +28 -11
  195. package/src/types/cascade.ts +5 -0
  196. package/src/types/select.ts +8 -2
  197. package/src/types/tree-select.ts +9 -2
@@ -180,14 +180,16 @@ const { size, disabled, readonly } = useFormFallbackProps([formProps ?? {}, prop
180
180
  })
181
181
 
182
182
  const currentIndex = shallowRef(-1)
183
- /** 内部展示文案,仅由选项推导;通过 update:text 单向通知父级 */
183
+ /** 内部展示文案,仅由选项推导(未命中时展示 text 兜底);经 update:text 通知父级 */
184
184
  const label = shallowRef<string>()
185
185
  const selected = shallowRef<Record<string, any>>()
186
186
 
187
187
  const displayedValue = computed(() => {
188
188
  if (label.value) return label.value
189
189
 
190
- return selected.value ? o(selected.value).get(labelKey.value) : String(props.modelValue ?? '')
190
+ if (selected.value) return o(selected.value).get(labelKey.value)
191
+ // 未命中选项:优先展示 text 兜底文案,避免露出不可读的编码
192
+ return props.text ?? String(props.modelValue ?? '')
191
193
  })
192
194
 
193
195
  const dropdownRef = shallowRef<DropdownExposed>()
@@ -260,11 +262,11 @@ function handleTriggerClickCapture(e: MouseEvent) {
260
262
 
261
263
  const { userAction, isUserActive } = useUserAction()
262
264
 
263
- /** 更新内部文案;值变化时单向 emit update:text */
265
+ /** 更新内部文案;值变化时 emit update:text(readonly 纯展示,不通知父级) */
264
266
  function setLabel(next?: string) {
265
267
  if (label.value === next) return
266
268
  label.value = next
267
- emit('update:text', next)
269
+ if (!readonly.value) emit('update:text', next)
268
270
  }
269
271
 
270
272
  /** 按 modelValue 与完整选项列表同步高亮索引、选中项与显示标签(外部回显用,O(n)) */
@@ -282,7 +284,15 @@ function syncSelected(modelValue: any, sourceOptions: Record<string, any>[] | un
282
284
  (option) => o(option).get(valueKey.value) === modelValue
283
285
  )
284
286
  selected.value = currentIndex.value >= 0 ? sourceOptions[currentIndex.value] : undefined
285
- setLabel(selected.value ? o(selected.value).get(labelKey.value) : undefined)
287
+ if (selected.value) {
288
+ setLabel(o(selected.value).get(labelKey.value))
289
+ } else if (props.text) {
290
+ // 未命中但有 text 兜底:文案以父级为准,不回发
291
+ label.value = undefined
292
+ } else {
293
+ // 未命中且无兜底:如实通知父级当前没有可展示文案
294
+ setLabel(undefined)
295
+ }
286
296
  } else {
287
297
  currentIndex.value = -1
288
298
  selected.value = undefined
@@ -1,4 +1,4 @@
1
- import { describe, expect, it } from 'vitest'
1
+ import { describe, expect, it } from 'vite-plus/test'
2
2
 
3
3
  import type { TableColumn } from '../../../types'
4
4
  import { allocateLeafColumnWidths } from '../allocate-column-widths'
@@ -1,4 +1,4 @@
1
- import { describe, expect, it } from 'vitest'
1
+ import { describe, expect, it } from 'vite-plus/test'
2
2
 
3
3
  import { ColumnNode } from '../node/col'
4
4
 
@@ -1,4 +1,4 @@
1
- import { describe, expect, it } from 'vitest'
1
+ import { describe, expect, it } from 'vite-plus/test'
2
2
  import { createApp, h, nextTick, shallowRef, ref, type Ref } from 'vue'
3
3
 
4
4
  import type { TableColumn, TableEditorColumn } from '../../../../types'
@@ -1,4 +1,4 @@
1
- import { describe, expect, it } from 'vitest'
1
+ import { describe, expect, it } from 'vite-plus/test'
2
2
  import { createApp, h, nextTick, ref, type Ref } from 'vue'
3
3
 
4
4
  import UTreeSelect from '../tree-select.vue'
@@ -122,6 +122,55 @@ describe('UTreeSelect', () => {
122
122
  }
123
123
  })
124
124
 
125
+ it('falls back to text when modelValue matches no node', async () => {
126
+ const { host, texts, unmount } = mountTreeSelect({
127
+ modelValue: 'removed',
128
+ text: '已删除的节点'
129
+ })
130
+
131
+ try {
132
+ await nextTick()
133
+ expect(host.querySelector('input')!.value).toBe('已删除的节点')
134
+
135
+ // 未命中且传了 text 兜底:不发送 update:text,父级 text 即事实来源
136
+ expect(texts).toHaveLength(0)
137
+ } finally {
138
+ unmount()
139
+ }
140
+ })
141
+
142
+ it('emits update:text undefined when unmatched echo has no text fallback', async () => {
143
+ const { host, model, texts, unmount } = mountTreeSelect({ modelValue: 'beijing' })
144
+
145
+ try {
146
+ await nextTick()
147
+ expect(texts.at(-1)).toBe('北京')
148
+
149
+ // 值改为不在数据中的值且无 text 兜底:如实发出 undefined
150
+ model.value = 'removed'
151
+ await nextTick()
152
+ await nextTick()
153
+ expect(texts.at(-1)).toBeUndefined()
154
+ expect(host.querySelector('input')!.value).toBe('')
155
+ } finally {
156
+ unmount()
157
+ }
158
+ })
159
+
160
+ it('does not emit update:text in readonly', async () => {
161
+ const { host, texts, unmount } = mountTreeSelect({ modelValue: 'chaoyang', readonly: true })
162
+
163
+ try {
164
+ await nextTick()
165
+ await nextTick()
166
+ // readonly 纯展示:不触发 update:text,避免下游回写
167
+ expect(texts).toHaveLength(0)
168
+ expect(host.textContent).toContain('朝阳区(最新)')
169
+ } finally {
170
+ unmount()
171
+ }
172
+ })
173
+
125
174
  it('emits update:text after data arrives for an existing modelValue', async () => {
126
175
  const { host, data, texts, unmount } = mountTreeSelect({ modelValue: 'shanghai', data: [] })
127
176
 
@@ -68,7 +68,7 @@
68
68
  </u-dropdown>
69
69
 
70
70
  <template v-else>
71
- {{ label || FORM_EMPTY_CONTENT }}
71
+ {{ displayText || FORM_EMPTY_CONTENT }}
72
72
  </template>
73
73
  </template>
74
74
 
@@ -118,6 +118,7 @@ const treeProps = computed(() => {
118
118
  'placeholder',
119
119
  'disabled',
120
120
  'label',
121
+ 'text',
121
122
  'readonly',
122
123
  'data',
123
124
  'contentClass',
@@ -185,9 +186,15 @@ watch(
185
186
 
186
187
  const model = defineModel<string | number>()
187
188
 
188
- /** 内部展示文案,仅由 data 推导;通过 update:text 单向通知父级 */
189
+ /** 内部展示文案,仅由 data 推导(未命中时展示 text 兜底);经 update:text 通知父级 */
189
190
  const label = shallowRef<string>()
190
191
 
192
+ /** 展示文案:data 推导优先,未命中时回退 text 兜底 */
193
+ const displayText = computed(() => {
194
+ if (!(model.value || model.value === 0)) return undefined
195
+ return label.value ?? props.text
196
+ })
197
+
191
198
  const dropdownVisible = shallowRef(false)
192
199
 
193
200
  /**
@@ -199,24 +206,23 @@ const querying = shallowRef(false)
199
206
 
200
207
  const inputRef = useTemplateRef<InputExposed>('inputRef')
201
208
 
202
- /** 更新内部文案;值变化时单向 emit update:text */
209
+ /** 更新内部文案;值变化时 emit update:text(readonly 纯展示,不通知父级) */
203
210
  function setLabel(next?: string) {
204
211
  if (label.value === next) return
205
212
  label.value = next
206
- emit('update:text', next)
213
+ if (!readonly.value) emit('update:text', next)
207
214
  }
208
215
 
209
216
  /** 触发输入框的值:查询态下承载查询串,否则展示选中标签 */
210
217
  const inputValue = computed(() => {
211
218
  if (filterable.value && querying.value) return qs.value
212
- return model.value || model.value === 0 ? label.value : undefined
219
+ return displayText.value
213
220
  })
214
221
 
215
222
  /** 查询态下已选标签降级为占位提示 */
216
223
  const inputPlaceholder = computed(() => {
217
- const display = model.value || model.value === 0 ? label.value : undefined
218
- if (filterable.value && querying.value && display) {
219
- return display
224
+ if (filterable.value && querying.value && displayText.value) {
225
+ return displayText.value
220
226
  }
221
227
  return props.placeholder
222
228
  })
@@ -231,7 +237,7 @@ const hovered = shallowRef(false)
231
237
  /** 悬停且存在选中值时展示清除按钮(替代下拉箭头) */
232
238
  const showClear = computed(() => {
233
239
  if (!props.clearable || disabled.value || !hovered.value) return false
234
- return !!(model.value || model.value === 0 ? label.value : undefined)
240
+ return !!displayText.value
235
241
  })
236
242
 
237
243
  /**
@@ -278,11 +284,14 @@ watch(
278
284
  [treeData, model],
279
285
  ([data, modelVal]) => {
280
286
  if (isUserActive()) return
281
- if (!data?.length || modelVal === undefined || modelVal === null || modelVal === '') {
287
+ if (modelVal === undefined || modelVal === null || modelVal === '') {
282
288
  setLabel(undefined)
283
289
  return
284
290
  }
285
291
 
292
+ // 数据未就绪(远程加载等):保留现有文案与父级 text 兜底,避免中途被清空
293
+ if (!data?.length) return
294
+
286
295
  let nextLabel: string | undefined
287
296
  const childrenKey = props.childrenKey ?? 'children'
288
297
  data.some((item) => {
@@ -301,7 +310,15 @@ watch(
301
310
 
302
311
  return founded
303
312
  })
304
- setLabel(nextLabel)
313
+ if (nextLabel !== undefined) {
314
+ setLabel(nextLabel)
315
+ } else if (props.text) {
316
+ // 未命中但有 text 兜底:文案以父级为准,不回发
317
+ label.value = undefined
318
+ } else {
319
+ // 未命中且无兜底:如实通知父级当前没有可展示文案
320
+ setLabel(undefined)
321
+ }
305
322
  },
306
323
  { immediate: true }
307
324
  )
@@ -20,6 +20,11 @@ export interface CascadeProps extends FormComponentProps {
20
20
  modelValue?: string[] | string
21
21
  /** 级联数据项的标签字段 */
22
22
  labelKey?: string
23
+ /**
24
+ * 兜底展示文案
25
+ * @description 单选 modelValue 未命中数据时展示 text(如回显路径已不在选项中),命中时展示节点 label 路径
26
+ */
27
+ text?: string
23
28
  /** 级联数据项的值字段 */
24
29
  valueKey?: string
25
30
  /** 占位符 */
@@ -16,6 +16,11 @@ export interface SelectProps extends FormComponentProps {
16
16
  valueKey?: string
17
17
  /** 标签字段 */
18
18
  labelKey?: string
19
+ /**
20
+ * 兜底展示文案
21
+ * @description modelValue 未命中选项时展示 text(如回显数据已不在选项中),命中时展示选项 label
22
+ */
23
+ text?: string
19
24
  /** 是否可清除 */
20
25
  clearable?: boolean
21
26
  /** 占位符 */
@@ -54,8 +59,9 @@ export interface SelectProps extends FormComponentProps {
54
59
 
55
60
  export interface SelectEmits {
56
61
  /**
57
- * 选中项文案变化(单向通知,用于同步父级冗余字段)
58
- * @description 展示始终由 options 推导,请用 `@update:text` 而非 `v-model:text`
62
+ * 选中项文案变化(用于同步父级冗余字段)
63
+ * @description 命中选项时发出 label,清空时发出 undefined;未命中选项时,
64
+ * 传了 text 兜底则不发出(父级文案已是事实来源),未传 text 时发出 undefined;readonly 下不发出
59
65
  */
60
66
  (e: 'update:text', text?: string): void
61
67
  (e: 'update:modelValue', modelValue?: any): void
@@ -10,6 +10,12 @@ export interface TreeSelectProps
10
10
  Omit<TreeProps, 'selected' | 'checked' | 'selectable' | 'checkable' | 'data'> {
11
11
  modelValue?: string | number
12
12
 
13
+ /**
14
+ * 兜底展示文案
15
+ * @description modelValue 未命中树节点时展示 text(如回显数据已不在选项中),命中时展示节点 label
16
+ */
17
+ text?: string
18
+
13
19
  /**
14
20
  * 树数据
15
21
  * @description 如果传入一个函数,那么filterable会被强制启用;
@@ -53,8 +59,9 @@ export interface TreeSelectEmits {
53
59
  (e: 'update:modelValue', value?: string | number): void
54
60
  (e: 'change', selectedData?: Record<string, any>): void
55
61
  /**
56
- * 选中项文案变化(单向通知,用于同步父级冗余字段)
57
- * @description 展示始终由 data 推导,请用 `@update:text` 而非 `v-model:text`
62
+ * 选中项文案变化(用于同步父级冗余字段)
63
+ * @description 命中节点时发出 label,清空时发出 undefined;未命中节点时,
64
+ * 传了 text 兜底则不发出(父级文案已是事实来源),未传 text 时发出 undefined;readonly 下不发出
58
65
  */
59
66
  (e: 'update:text', text?: string): void
60
67
  }