vxe-pc-ui 4.7.5 → 4.7.7

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/es/icon/style.css +1 -1
  2. package/es/language/ar-EG.js +19 -1
  3. package/es/language/de-DE.js +19 -1
  4. package/es/language/en-US.js +20 -2
  5. package/es/language/es-ES.js +19 -1
  6. package/es/language/fr-FR.js +19 -1
  7. package/es/language/hu-HU.js +19 -1
  8. package/es/language/hy-AM.js +18 -0
  9. package/es/language/id-ID.js +19 -1
  10. package/es/language/it-IT.js +19 -1
  11. package/es/language/ja-JP.js +19 -1
  12. package/es/language/ko-KR.js +19 -1
  13. package/es/language/ms-MY.js +19 -1
  14. package/es/language/nb-NO.js +19 -1
  15. package/es/language/pt-BR.js +19 -1
  16. package/es/language/ru-RU.js +19 -1
  17. package/es/language/th-TH.js +19 -1
  18. package/es/language/ug-CN.js +19 -1
  19. package/es/language/uk-UA.js +19 -1
  20. package/es/language/uz-UZ.js +19 -1
  21. package/es/language/vi-VN.js +19 -1
  22. package/es/language/zh-CHT.js +19 -1
  23. package/es/language/zh-CN.js +18 -0
  24. package/es/list/src/list.js +1 -1
  25. package/es/select/src/select.js +135 -42
  26. package/es/select/style.css +21 -0
  27. package/es/select/style.min.css +1 -1
  28. package/es/style.css +1 -1
  29. package/es/style.min.css +1 -1
  30. package/es/tree/src/tree.js +924 -407
  31. package/es/tree/src/util.js +32 -0
  32. package/es/tree/style.css +29 -26
  33. package/es/tree/style.min.css +1 -1
  34. package/es/tree-select/src/tree-select.js +227 -18
  35. package/es/tree-select/style.css +36 -1
  36. package/es/tree-select/style.min.css +1 -1
  37. package/es/ui/index.js +19 -3
  38. package/es/ui/src/dom.js +9 -0
  39. package/es/ui/src/log.js +1 -1
  40. package/es/vxe-select/style.css +21 -0
  41. package/es/vxe-select/style.min.css +1 -1
  42. package/es/vxe-tree/style.css +29 -26
  43. package/es/vxe-tree/style.min.css +1 -1
  44. package/es/vxe-tree-select/style.css +36 -1
  45. package/es/vxe-tree-select/style.min.css +1 -1
  46. package/lib/icon/style/style.css +1 -1
  47. package/lib/icon/style/style.min.css +1 -1
  48. package/lib/index.umd.js +1512 -530
  49. package/lib/index.umd.min.js +1 -1
  50. package/lib/language/ar-EG.js +19 -1
  51. package/lib/language/ar-EG.min.js +1 -1
  52. package/lib/language/ar-EG.umd.js +19 -1
  53. package/lib/language/de-DE.js +19 -1
  54. package/lib/language/de-DE.min.js +1 -1
  55. package/lib/language/de-DE.umd.js +19 -1
  56. package/lib/language/en-US.js +20 -2
  57. package/lib/language/en-US.min.js +1 -1
  58. package/lib/language/en-US.umd.js +20 -2
  59. package/lib/language/es-ES.js +19 -1
  60. package/lib/language/es-ES.min.js +1 -1
  61. package/lib/language/es-ES.umd.js +19 -1
  62. package/lib/language/fr-FR.js +19 -1
  63. package/lib/language/fr-FR.min.js +1 -1
  64. package/lib/language/fr-FR.umd.js +19 -1
  65. package/lib/language/hu-HU.js +19 -1
  66. package/lib/language/hu-HU.min.js +1 -1
  67. package/lib/language/hu-HU.umd.js +19 -1
  68. package/lib/language/hy-AM.js +18 -0
  69. package/lib/language/hy-AM.min.js +1 -1
  70. package/lib/language/hy-AM.umd.js +18 -0
  71. package/lib/language/id-ID.js +19 -1
  72. package/lib/language/id-ID.min.js +1 -1
  73. package/lib/language/id-ID.umd.js +19 -1
  74. package/lib/language/it-IT.js +19 -1
  75. package/lib/language/it-IT.min.js +1 -1
  76. package/lib/language/it-IT.umd.js +19 -1
  77. package/lib/language/ja-JP.js +19 -1
  78. package/lib/language/ja-JP.min.js +1 -1
  79. package/lib/language/ja-JP.umd.js +19 -1
  80. package/lib/language/ko-KR.js +19 -1
  81. package/lib/language/ko-KR.min.js +1 -1
  82. package/lib/language/ko-KR.umd.js +19 -1
  83. package/lib/language/ms-MY.js +19 -1
  84. package/lib/language/ms-MY.min.js +1 -1
  85. package/lib/language/ms-MY.umd.js +19 -1
  86. package/lib/language/nb-NO.js +19 -1
  87. package/lib/language/nb-NO.min.js +1 -1
  88. package/lib/language/nb-NO.umd.js +19 -1
  89. package/lib/language/pt-BR.js +19 -1
  90. package/lib/language/pt-BR.min.js +1 -1
  91. package/lib/language/pt-BR.umd.js +19 -1
  92. package/lib/language/ru-RU.js +19 -1
  93. package/lib/language/ru-RU.min.js +1 -1
  94. package/lib/language/ru-RU.umd.js +19 -1
  95. package/lib/language/th-TH.js +19 -1
  96. package/lib/language/th-TH.min.js +1 -1
  97. package/lib/language/th-TH.umd.js +19 -1
  98. package/lib/language/ug-CN.js +19 -1
  99. package/lib/language/ug-CN.min.js +1 -1
  100. package/lib/language/ug-CN.umd.js +19 -1
  101. package/lib/language/uk-UA.js +19 -1
  102. package/lib/language/uk-UA.min.js +1 -1
  103. package/lib/language/uk-UA.umd.js +19 -1
  104. package/lib/language/uz-UZ.js +19 -1
  105. package/lib/language/uz-UZ.min.js +1 -1
  106. package/lib/language/uz-UZ.umd.js +19 -1
  107. package/lib/language/vi-VN.js +19 -1
  108. package/lib/language/vi-VN.min.js +1 -1
  109. package/lib/language/vi-VN.umd.js +19 -1
  110. package/lib/language/zh-CHT.js +19 -1
  111. package/lib/language/zh-CHT.min.js +1 -1
  112. package/lib/language/zh-CHT.umd.js +19 -1
  113. package/lib/language/zh-CN.js +18 -0
  114. package/lib/language/zh-CN.min.js +1 -1
  115. package/lib/language/zh-CN.umd.js +18 -0
  116. package/lib/list/src/list.js +1 -1
  117. package/lib/list/src/list.min.js +1 -1
  118. package/lib/select/src/select.js +139 -44
  119. package/lib/select/src/select.min.js +1 -1
  120. package/lib/select/style/style.css +21 -0
  121. package/lib/select/style/style.min.css +1 -1
  122. package/lib/style.css +1 -1
  123. package/lib/style.min.css +1 -1
  124. package/lib/tree/src/tree.js +1154 -572
  125. package/lib/tree/src/tree.min.js +1 -1
  126. package/lib/tree/src/util.js +51 -0
  127. package/lib/tree/src/util.min.js +1 -0
  128. package/lib/tree/style/style.css +29 -26
  129. package/lib/tree/style/style.min.css +1 -1
  130. package/lib/tree-select/src/tree-select.js +237 -21
  131. package/lib/tree-select/src/tree-select.min.js +1 -1
  132. package/lib/tree-select/style/style.css +36 -1
  133. package/lib/tree-select/style/style.min.css +1 -1
  134. package/lib/ui/index.js +19 -3
  135. package/lib/ui/index.min.js +1 -1
  136. package/lib/ui/src/dom.js +10 -0
  137. package/lib/ui/src/dom.min.js +1 -1
  138. package/lib/ui/src/log.js +1 -1
  139. package/lib/ui/src/log.min.js +1 -1
  140. package/lib/vxe-select/style/style.css +21 -0
  141. package/lib/vxe-select/style/style.min.css +1 -1
  142. package/lib/vxe-tree/style/style.css +29 -26
  143. package/lib/vxe-tree/style/style.min.css +1 -1
  144. package/lib/vxe-tree-select/style/style.css +36 -1
  145. package/lib/vxe-tree-select/style/style.min.css +1 -1
  146. package/package.json +1 -1
  147. package/packages/language/ar-EG.ts +19 -1
  148. package/packages/language/de-DE.ts +19 -1
  149. package/packages/language/en-US.ts +20 -2
  150. package/packages/language/es-ES.ts +19 -1
  151. package/packages/language/fr-FR.ts +19 -1
  152. package/packages/language/hu-HU.ts +19 -1
  153. package/packages/language/hy-AM.ts +18 -0
  154. package/packages/language/id-ID.ts +19 -1
  155. package/packages/language/it-IT.ts +19 -1
  156. package/packages/language/ja-JP.ts +19 -1
  157. package/packages/language/ko-KR.ts +19 -1
  158. package/packages/language/ms-MY.ts +19 -1
  159. package/packages/language/nb-NO.ts +19 -1
  160. package/packages/language/pt-BR.ts +19 -1
  161. package/packages/language/ru-RU.ts +19 -1
  162. package/packages/language/th-TH.ts +19 -1
  163. package/packages/language/ug-CN.ts +19 -1
  164. package/packages/language/uk-UA.ts +19 -1
  165. package/packages/language/uz-UZ.ts +19 -1
  166. package/packages/language/vi-VN.ts +19 -1
  167. package/packages/language/zh-CHT.ts +19 -1
  168. package/packages/language/zh-CN.ts +18 -0
  169. package/packages/list/src/list.ts +1 -1
  170. package/packages/select/src/select.ts +146 -50
  171. package/packages/tree/src/tree.ts +947 -410
  172. package/packages/tree/src/util.ts +35 -0
  173. package/packages/tree-select/src/tree-select.ts +240 -19
  174. package/packages/ui/index.ts +18 -2
  175. package/packages/ui/src/dom.ts +10 -0
  176. package/styles/components/select.scss +19 -0
  177. package/styles/components/tree-select.scss +36 -1
  178. package/styles/components/tree.scss +34 -31
  179. package/types/components/button.d.ts +11 -1
  180. package/types/components/grid.d.ts +5 -0
  181. package/types/components/icon-picker.d.ts +11 -1
  182. package/types/components/input.d.ts +2 -2
  183. package/types/components/select.d.ts +28 -39
  184. package/types/components/tree-select.d.ts +73 -12
  185. package/types/components/tree.d.ts +125 -8
  186. /package/es/icon/{iconfont.1752151733538.ttf → iconfont.1752462949194.ttf} +0 -0
  187. /package/es/icon/{iconfont.1752151733538.woff → iconfont.1752462949194.woff} +0 -0
  188. /package/es/icon/{iconfont.1752151733538.woff2 → iconfont.1752462949194.woff2} +0 -0
  189. /package/es/{iconfont.1752151733538.ttf → iconfont.1752462949194.ttf} +0 -0
  190. /package/es/{iconfont.1752151733538.woff → iconfont.1752462949194.woff} +0 -0
  191. /package/es/{iconfont.1752151733538.woff2 → iconfont.1752462949194.woff2} +0 -0
  192. /package/lib/icon/style/{iconfont.1752151733538.ttf → iconfont.1752462949194.ttf} +0 -0
  193. /package/lib/icon/style/{iconfont.1752151733538.woff → iconfont.1752462949194.woff} +0 -0
  194. /package/lib/icon/style/{iconfont.1752151733538.woff2 → iconfont.1752462949194.woff2} +0 -0
  195. /package/lib/{iconfont.1752151733538.ttf → iconfont.1752462949194.ttf} +0 -0
  196. /package/lib/{iconfont.1752151733538.woff → iconfont.1752462949194.woff} +0 -0
  197. /package/lib/{iconfont.1752151733538.woff2 → iconfont.1752462949194.woff2} +0 -0
@@ -0,0 +1,35 @@
1
+ import type { VxeTreeConstructor } from '../../../types'
2
+
3
+ function countTreeExpand ($xeTree: VxeTreeConstructor, prevNode: any) {
4
+ let count = 1
5
+ if (!prevNode) {
6
+ return count
7
+ }
8
+ const props = $xeTree.props
9
+ const { transform } = props
10
+ const reactData = $xeTree.reactData
11
+ const { updateExpandedFlag } = reactData
12
+ const internalData = $xeTree.internalData
13
+ const { treeExpandedMaps } = internalData
14
+ const { computeChildrenField, computeMapChildrenField } = $xeTree.getComputeMaps()
15
+ const childrenField = computeChildrenField.value
16
+ const mapChildrenField = computeMapChildrenField.value
17
+ const nodeChildren = prevNode[transform ? mapChildrenField : childrenField]
18
+ if (nodeChildren && updateExpandedFlag && treeExpandedMaps[$xeTree.getNodeId(prevNode)]) {
19
+ for (let index = 0; index < nodeChildren.length; index++) {
20
+ count += countTreeExpand($xeTree, nodeChildren[index])
21
+ }
22
+ }
23
+ return count
24
+ }
25
+
26
+ export function calcTreeLine ($xeTree: VxeTreeConstructor, node: any, prevNode: any) {
27
+ const internalData = $xeTree.internalData
28
+ const { scrollYStore } = internalData
29
+ const { rowHeight } = scrollYStore
30
+ let expandSize = 1
31
+ if (prevNode) {
32
+ expandSize = countTreeExpand($xeTree, prevNode)
33
+ }
34
+ return (rowHeight || 28) * expandSize - (prevNode ? 1 : 12)
35
+ }
@@ -6,9 +6,10 @@ import { getLastZIndex, nextZIndex } from '../../ui/src/utils'
6
6
  import { errLog } from '../../ui/src/log'
7
7
  import XEUtils from 'xe-utils'
8
8
  import VxeInputComponent from '../../input/src/input'
9
+ import VxeButtonComponent from '../../button/src/button'
9
10
  import VxeTreeComponent from '../../tree/src/tree'
10
11
 
11
- import type { TreeSelectReactData, VxeTreeSelectEmits, TreeSelectInternalData, ValueOf, VxeComponentStyleType, TreeSelectPrivateRef, TreeSelectPrivateMethods, TreeSelectMethods, VxeTreeSelectPrivateComputed, VxeTreeSelectPropTypes, VxeTreeSelectConstructor, VxeFormDefines, VxeDrawerConstructor, VxeDrawerMethods, VxeTreeSelectPrivateMethods, VxeFormConstructor, VxeFormPrivateMethods, VxeInputConstructor, VxeModalConstructor, VxeModalMethods } from '../../../types'
12
+ import type { TreeSelectReactData, VxeTreeSelectEmits, TreeSelectInternalData, VxeButtonEvents, ValueOf, VxeComponentStyleType, TreeSelectPrivateRef, TreeSelectPrivateMethods, TreeSelectMethods, VxeTreeSelectPrivateComputed, VxeTreeSelectPropTypes, VxeTreeSelectConstructor, VxeFormDefines, VxeDrawerConstructor, VxeDrawerMethods, VxeTreeSelectPrivateMethods, VxeFormConstructor, VxeFormPrivateMethods, VxeInputConstructor, VxeModalConstructor, VxeModalMethods, VxeTreeConstructor } from '../../../types'
12
13
  import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
13
14
 
14
15
  function getOptUniqueId () {
@@ -33,6 +34,8 @@ export default defineVxeComponent({
33
34
  type: Boolean as PropType<VxeTreeSelectPropTypes.Disabled>,
34
35
  default: null
35
36
  },
37
+ filterable: Boolean as PropType<VxeTreeSelectPropTypes.Filterable>,
38
+ filterConfig: Object as PropType<VxeTreeSelectPropTypes.FilterConfig>,
36
39
  multiple: Boolean as PropType<VxeTreeSelectPropTypes.Multiple>,
37
40
  className: [String, Function] as PropType<VxeTreeSelectPropTypes.ClassName>,
38
41
  popupClassName: [String, Function] as PropType<VxeTreeSelectPropTypes.PopupClassName>,
@@ -42,20 +45,48 @@ export default defineVxeComponent({
42
45
  optionProps: Object as PropType<VxeTreeSelectPropTypes.OptionProps>,
43
46
  size: {
44
47
  type: String as PropType<VxeTreeSelectPropTypes.Size>,
45
- default: () => getConfig().select.size || getConfig().size
48
+ default: () => getConfig().treeSelect.size || getConfig().size
46
49
  },
47
50
  remote: Boolean as PropType<VxeTreeSelectPropTypes.Remote>,
48
- remoteMethod: Function as PropType<VxeTreeSelectPropTypes.RemoteMethod>,
51
+ remoteConfig: Function as PropType<VxeTreeSelectPropTypes.RemoteConfig>,
49
52
  popupConfig: Object as PropType<VxeTreeSelectPropTypes.PopupConfig>,
50
53
  treeConfig: Object as PropType<VxeTreeSelectPropTypes.TreeConfig>,
54
+ virtualYConfig: Object as PropType<VxeTreeSelectPropTypes.VirtualYConfig>,
55
+ autoClose: {
56
+ type: Boolean as PropType<VxeTreeSelectPropTypes.AutoClose>,
57
+ default: () => getConfig().treeSelect.autoClose
58
+ },
59
+ showTotalButoon: {
60
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowTotalButoon>,
61
+ default: () => getConfig().treeSelect.showTotalButoon
62
+ },
63
+ showCheckedButoon: {
64
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowCheckedButoon>,
65
+ default: () => getConfig().treeSelect.showCheckedButoon
66
+ },
67
+ showClearButton: {
68
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowClearButton>,
69
+ default: () => getConfig().treeSelect.showClearButton
70
+ },
71
+ showExpandButton: {
72
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowExpandButton>,
73
+ default: () => getConfig().treeSelect.showExpandButton
74
+ },
51
75
  transfer: {
52
76
  type: Boolean as PropType<VxeTreeSelectPropTypes.Transfer>,
53
77
  default: null
54
- }
78
+ },
79
+
80
+ /**
81
+ * 已废弃,被 remote-config.queryMethod 替换
82
+ * @deprecated
83
+ */
84
+ remoteMethod: Function as PropType<VxeTreeSelectPropTypes.RemoteMethod>
55
85
  },
56
86
  emits: [
57
87
  'update:modelValue',
58
88
  'change',
89
+ 'all-change',
59
90
  'clear',
60
91
  'blur',
61
92
  'focus',
@@ -77,13 +108,15 @@ export default defineVxeComponent({
77
108
 
78
109
  const refElem = ref<HTMLDivElement>()
79
110
  const refInput = ref<VxeInputConstructor>()
111
+ const refInpSearch = ref<VxeInputConstructor>()
80
112
  const refTreeWrapper = ref<HTMLDivElement>()
81
113
  const refOptionPanel = ref<HTMLDivElement>()
114
+ const refTree = ref<VxeTreeConstructor>()
82
115
 
83
116
  const reactData = reactive<TreeSelectReactData>({
84
117
  initialized: false,
85
- fullOptionList: [],
86
- fullNodeMaps: {},
118
+ searchValue: '',
119
+ searchLoading: false,
87
120
  panelIndex: 0,
88
121
  panelStyle: {},
89
122
  panelPlacement: null,
@@ -94,7 +127,9 @@ export default defineVxeComponent({
94
127
  })
95
128
 
96
129
  const internalData: TreeSelectInternalData = {
97
- hpTimeout: undefined
130
+ // hpTimeout: undefined,
131
+ fullOptionList: [],
132
+ fullNodeMaps: {}
98
133
  }
99
134
 
100
135
  const refMaps: TreeSelectPrivateRef = {
@@ -202,11 +237,25 @@ export default defineVxeComponent({
202
237
  return propsOpts.hasChild || 'hasChild'
203
238
  })
204
239
 
240
+ const computeVirtualYOpts = computed(() => {
241
+ return Object.assign({} as { gt: number }, getConfig().treeSelect.virtualYConfig, props.virtualYConfig)
242
+ })
243
+
244
+ const computeRemoteOpts = computed(() => {
245
+ return Object.assign({}, getConfig().treeSelect.remoteConfig, props.remoteConfig)
246
+ })
247
+
248
+ const computeFilterOpts = computed(() => {
249
+ const treeOpts = computeTreeOpts.value
250
+ return Object.assign({}, treeOpts.filterConfig, props.filterConfig)
251
+ })
252
+
205
253
  const computeSelectLabel = computed(() => {
206
254
  const { modelValue } = props
207
- const { fullNodeMaps } = reactData
255
+ const { fullNodeMaps } = internalData
208
256
  const labelField = computeLabelField.value
209
- return (XEUtils.isArray(modelValue) ? modelValue : [modelValue]).map(val => {
257
+ const selectVals = XEUtils.eqNull(modelValue) ? [] : (XEUtils.isArray(modelValue) ? modelValue : [modelValue])
258
+ return selectVals.map(val => {
210
259
  const cacheItem = fullNodeMaps[val]
211
260
  return cacheItem ? cacheItem.item[labelField] : val
212
261
  }).join(', ')
@@ -260,9 +309,11 @@ export default defineVxeComponent({
260
309
 
261
310
  const cacheDataMap = () => {
262
311
  const { options } = props
312
+ const treeOpts = computeTreeOpts.value
263
313
  const nodeKeyField = computeNodeKeyField.value
264
314
  const childrenField = computeChildrenField.value
265
315
  const valueField = computeValueField.value
316
+ const { transform } = treeOpts
266
317
  const nodeMaps: Record<string, {
267
318
  item: any
268
319
  index: number
@@ -271,7 +322,7 @@ export default defineVxeComponent({
271
322
  nodes: any[]
272
323
  }> = {}
273
324
  const keyMaps: Record<string, boolean> = {}
274
- XEUtils.eachTree(options, (item, index, items, path, parent, nodes) => {
325
+ const handleOptNode = (item: any, index: number, items: any[], path: string[], parent: any, nodes: any[]) => {
275
326
  let nodeid = getNodeid(item)
276
327
  if (!nodeid) {
277
328
  nodeid = getOptUniqueId()
@@ -285,9 +336,18 @@ export default defineVxeComponent({
285
336
  errLog('vxe.error.repeatKey', [valueField, value])
286
337
  }
287
338
  nodeMaps[value] = { item, index, items, parent, nodes }
288
- }, { children: childrenField })
289
- reactData.fullOptionList = options || []
290
- reactData.fullNodeMaps = nodeMaps
339
+ }
340
+ if (options) {
341
+ if (transform) {
342
+ options.forEach((item, index, items) => {
343
+ handleOptNode(item, index, items, [], null, [])
344
+ })
345
+ } else {
346
+ XEUtils.eachTree(options, handleOptNode, { children: childrenField })
347
+ }
348
+ }
349
+ internalData.fullOptionList = options || []
350
+ internalData.fullNodeMaps = nodeMaps
291
351
  }
292
352
 
293
353
  const updateZindex = () => {
@@ -318,8 +378,10 @@ export default defineVxeComponent({
318
378
  }
319
379
 
320
380
  const showOptionPanel = () => {
321
- const { loading } = props
381
+ const { loading, remote, filterable } = props
382
+ const { fullOptionList } = internalData
322
383
  const isDisabled = computeIsDisabled.value
384
+ const remoteOpts = computeRemoteOpts.value
323
385
  if (!loading && !isDisabled) {
324
386
  clearTimeout(internalData.hpTimeout)
325
387
  if (!reactData.initialized) {
@@ -327,8 +389,14 @@ export default defineVxeComponent({
327
389
  }
328
390
  reactData.isActivated = true
329
391
  reactData.isAniVisible = true
392
+ if (filterable) {
393
+ if (remote && remoteOpts.enabled && remoteOpts.autoLoad && !fullOptionList.length) {
394
+ handleSearchEvent()
395
+ }
396
+ }
330
397
  setTimeout(() => {
331
398
  reactData.visiblePanel = true
399
+ handleFocusSearch()
332
400
  }, 10)
333
401
  updateZindex()
334
402
  updatePlacement()
@@ -343,7 +411,7 @@ export default defineVxeComponent({
343
411
  }
344
412
 
345
413
  const changeEvent = (evnt: Event, selectValue: any) => {
346
- const { fullNodeMaps } = reactData
414
+ const { fullNodeMaps } = internalData
347
415
  emitModel(selectValue)
348
416
  if (selectValue !== props.modelValue) {
349
417
  const cacheItem = fullNodeMaps[selectValue]
@@ -365,6 +433,53 @@ export default defineVxeComponent({
365
433
  hideOptionPanel()
366
434
  }
367
435
 
436
+ const allCheckedPanelEvent: VxeButtonEvents.Click = (params) => {
437
+ const { $event } = params
438
+ const { multiple, autoClose } = props
439
+ const $tree = refTree.value
440
+ if (multiple) {
441
+ if ($tree) {
442
+ $tree.setAllCheckboxNode(true).then(({ checkNodeKeys }) => {
443
+ changeEvent($event, checkNodeKeys)
444
+ dispatchEvent('all-change', { value: checkNodeKeys }, $event)
445
+ if (autoClose) {
446
+ hideOptionPanel()
447
+ }
448
+ })
449
+ }
450
+ }
451
+ }
452
+
453
+ const clearCheckedPanelEvent: VxeButtonEvents.Click = (params) => {
454
+ const { $event } = params
455
+ const { multiple, autoClose } = props
456
+ const $tree = refTree.value
457
+ if ($tree) {
458
+ const value = multiple ? [] : null
459
+ $tree.clearCheckboxNode().then(() => {
460
+ if (autoClose) {
461
+ hideOptionPanel()
462
+ }
463
+ })
464
+ changeEvent($event, value)
465
+ dispatchEvent('clear', { value }, $event)
466
+ }
467
+ }
468
+
469
+ const allExpandPanelEvent: VxeButtonEvents.Click = () => {
470
+ const $tree = refTree.value
471
+ if ($tree) {
472
+ $tree.setAllExpandNode(true)
473
+ }
474
+ }
475
+
476
+ const clearExpandPanelEvent: VxeButtonEvents.Click = () => {
477
+ const $tree = refTree.value
478
+ if ($tree) {
479
+ $tree.clearAllExpandNode()
480
+ }
481
+ }
482
+
368
483
  const handleGlobalMousewheelEvent = (evnt: MouseEvent) => {
369
484
  const { visiblePanel } = reactData
370
485
  const isDisabled = computeIsDisabled.value
@@ -404,6 +519,17 @@ export default defineVxeComponent({
404
519
  }
405
520
  }
406
521
 
522
+ const handleFocusSearch = () => {
523
+ if (props.filterable) {
524
+ nextTick(() => {
525
+ const inpSearch = refInpSearch.value
526
+ if (inpSearch) {
527
+ inpSearch.focus()
528
+ }
529
+ })
530
+ }
531
+ }
532
+
407
533
  const focusEvent = (evnt: FocusEvent) => {
408
534
  const isDisabled = computeIsDisabled.value
409
535
  if (!isDisabled) {
@@ -428,6 +554,27 @@ export default defineVxeComponent({
428
554
  dispatchEvent('blur', {}, evnt)
429
555
  }
430
556
 
557
+ const modelSearchEvent = (value: string) => {
558
+ reactData.searchValue = value
559
+ }
560
+
561
+ const handleSearchEvent = () => {
562
+ const { modelValue, remote, remoteMethod } = props
563
+ const { searchValue } = reactData
564
+ const remoteOpts = computeRemoteOpts.value
565
+ const queryMethod = remoteOpts.queryMethod || remoteMethod
566
+ if (remote && queryMethod && remoteOpts.enabled) {
567
+ reactData.searchLoading = true
568
+ Promise.resolve(
569
+ queryMethod({ $treeSelect: $xeTreeSelect, searchValue, value: modelValue })
570
+ ).then(() => nextTick())
571
+ .catch(() => nextTick())
572
+ .finally(() => {
573
+ reactData.searchLoading = false
574
+ })
575
+ }
576
+ }
577
+
431
578
  const togglePanelEvent = (params: any) => {
432
579
  const { $event } = params
433
580
  $event.preventDefault()
@@ -468,8 +615,8 @@ export default defineVxeComponent({
468
615
  Object.assign($xeTreeSelect, treeSelectMethods, treeSelectPrivateMethods)
469
616
 
470
617
  const renderVN = () => {
471
- const { className, modelValue, multiple, options, loading } = props
472
- const { initialized, isActivated, isAniVisible, visiblePanel } = reactData
618
+ const { className, modelValue, multiple, options, loading, filterable, showTotalButoon, showCheckedButoon, showClearButton, showExpandButton } = props
619
+ const { initialized, isActivated, isAniVisible, visiblePanel, searchValue } = reactData
473
620
  const vSize = computeSize.value
474
621
  const isDisabled = computeIsDisabled.value
475
622
  const selectLabel = computeSelectLabel.value
@@ -491,6 +638,8 @@ export default defineVxeComponent({
491
638
  const childrenField = computeChildrenField.value
492
639
  const parentField = computeParentField.value
493
640
  const hasChildField = computeHasChildField.value
641
+ const virtualYOpts = computeVirtualYOpts.value
642
+ const filterOpts = computeFilterOpts.value
494
643
 
495
644
  if (formReadonly) {
496
645
  return h('div', {
@@ -502,10 +651,12 @@ export default defineVxeComponent({
502
651
  }, selectLabel)
503
652
  ])
504
653
  }
654
+ const selectVals = XEUtils.eqNull(modelValue) ? [] : (XEUtils.isArray(modelValue) ? modelValue : [modelValue])
505
655
  return h('div', {
506
656
  ref: refElem,
507
657
  class: ['vxe-tree-select', className ? (XEUtils.isFunction(className) ? className({ $treeSelect: $xeTreeSelect }) : className) : '', {
508
658
  [`size--${vSize}`]: vSize,
659
+ 'is--filterable': filterable,
509
660
  'is--visible': visiblePanel,
510
661
  'is--disabled': isDisabled,
511
662
  'is--loading': loading,
@@ -522,6 +673,7 @@ export default defineVxeComponent({
522
673
  prefixIcon: props.prefixIcon,
523
674
  suffixIcon: loading ? getIcon().TREE_SELECT_LOADED : (visiblePanel ? getIcon().TREE_SELECT_OPEN : getIcon().TREE_SELECT_CLOSE),
524
675
  modelValue: loading ? '' : selectLabel,
676
+ title: selectLabel,
525
677
  onClear: clearEvent,
526
678
  onClick: clickEvent,
527
679
  onFocus: focusEvent,
@@ -551,10 +703,71 @@ export default defineVxeComponent({
551
703
  h('div', {
552
704
  class: 'vxe-tree-select--panel-wrapper'
553
705
  }, [
554
- headerSlot
706
+ filterable
707
+ ? h('div', {
708
+ class: 'vxe-tree-select--panel-search'
709
+ }, [
710
+ h(VxeInputComponent, {
711
+ ref: refInpSearch,
712
+ class: 'vxe-tree-select-search--input',
713
+ modelValue: searchValue,
714
+ clearable: true,
715
+ disabled: false,
716
+ readonly: false,
717
+ placeholder: getI18n('vxe.treeSelect.search'),
718
+ prefixIcon: getIcon().INPUT_SEARCH,
719
+ 'onUpdate:modelValue': modelSearchEvent
720
+ })
721
+ ])
722
+ : renderEmptyElement($xeTreeSelect),
723
+ showTotalButoon || (showCheckedButoon && multiple) || showClearButton || showExpandButton || headerSlot
555
724
  ? h('div', {
556
725
  class: 'vxe-tree-select--panel-header'
557
- }, headerSlot({}))
726
+ }, headerSlot
727
+ ? headerSlot({})
728
+ : [
729
+ h('div', {
730
+ class: 'vxe-tree-select--header-button'
731
+ }, [
732
+ showTotalButoon
733
+ ? h('div', {
734
+ class: 'vxe-tree-select--header-total'
735
+ }, getI18n('vxe.treeSelect.total', [selectVals.length]))
736
+ : renderEmptyElement($xeTreeSelect),
737
+ h('div', {
738
+ class: 'vxe-tree-select--header-btns'
739
+ }, [
740
+ (showCheckedButoon && multiple)
741
+ ? h(VxeButtonComponent, {
742
+ content: getI18n('vxe.treeSelect.allChecked'),
743
+ mode: 'text',
744
+ onClick: allCheckedPanelEvent
745
+ })
746
+ : renderEmptyElement($xeTreeSelect),
747
+ showClearButton
748
+ ? h(VxeButtonComponent, {
749
+ content: getI18n('vxe.treeSelect.clearChecked'),
750
+ mode: 'text',
751
+ onClick: clearCheckedPanelEvent
752
+ })
753
+ : renderEmptyElement($xeTreeSelect),
754
+ showExpandButton
755
+ ? h(VxeButtonComponent, {
756
+ content: getI18n('vxe.treeSelect.allExpand'),
757
+ mode: 'text',
758
+ onClick: allExpandPanelEvent
759
+ })
760
+ : renderEmptyElement($xeTreeSelect),
761
+ showExpandButton
762
+ ? h(VxeButtonComponent, {
763
+ content: getI18n('vxe.treeSelect.clearExpand'),
764
+ mode: 'text',
765
+ onClick: clearExpandPanelEvent
766
+ })
767
+ : renderEmptyElement($xeTreeSelect)
768
+ ])
769
+ ])
770
+ ])
558
771
  : renderEmptyElement($xeTreeSelect),
559
772
  h('div', {
560
773
  class: 'vxe-tree-select--panel-body'
@@ -565,7 +778,12 @@ export default defineVxeComponent({
565
778
  style: popupWrapperStyle
566
779
  }, [
567
780
  h(VxeTreeComponent, {
781
+ ref: refTree,
568
782
  class: 'vxe-tree-select--tree',
783
+ height: popupOpts.height ? '100%' : treeOpts.height,
784
+ minHeight: treeOpts.minHeight,
785
+ maxHeight: popupOpts.height ? '' : treeOpts.maxHeight,
786
+ autoResize: true,
569
787
  data: options,
570
788
  indent: treeOpts.indent,
571
789
  showRadio: !multiple,
@@ -593,6 +811,9 @@ export default defineVxeComponent({
593
811
  iconOpen: treeOpts.iconOpen,
594
812
  iconLoaded: treeOpts.iconLoaded,
595
813
  iconClose: treeOpts.iconClose,
814
+ filterValue: searchValue,
815
+ filterConfig: filterOpts,
816
+ virtualYConfig: virtualYOpts,
596
817
  onNodeClick: nodeClickEvent,
597
818
  onRadioChange: radioChangeEvent,
598
819
  onCheckboxChange: checkboxChangeEvent,
@@ -300,7 +300,7 @@ setConfig({
300
300
  },
301
301
  virtualYConfig: {
302
302
  enabled: true,
303
- gt: 100,
303
+ gt: 50,
304
304
  oSize: 2
305
305
  }
306
306
  },
@@ -357,16 +357,32 @@ setConfig({
357
357
  isArrow: true
358
358
  },
359
359
  tree: {
360
+ // autoResize: false,
360
361
  indent: 20,
361
362
  minHeight: 60,
362
363
  radioConfig: {
363
364
  strict: true
365
+ },
366
+ virtualYConfig: {
367
+ enabled: true,
368
+ gt: 50,
369
+ oSize: 2
364
370
  }
365
371
  },
366
372
  treeSelect: {
373
+ autoClose: true,
374
+ virtualYConfig: {
375
+ enabled: true,
376
+ gt: 0,
377
+ oSize: 2
378
+ },
367
379
  treeConfig: {
380
+ maxHeight: 300,
368
381
  radioConfig: {},
369
- checkboxConfig: {}
382
+ checkboxConfig: {},
383
+ filterConfig: {
384
+ autoExpandAll: true
385
+ }
370
386
  }
371
387
  },
372
388
  upload: {
@@ -121,6 +121,16 @@ export function getAbsolutePos (elem: any) {
121
121
  return { boundingTop, top: scrollTop + boundingTop, boundingLeft, left: scrollLeft + boundingLeft, visibleHeight, visibleWidth }
122
122
  }
123
123
 
124
+ export function getPaddingTopBottomSize (elem: HTMLElement) {
125
+ if (elem) {
126
+ const computedStyle = getComputedStyle(elem)
127
+ const paddingTop = XEUtils.toNumber(computedStyle.paddingTop)
128
+ const paddingBottom = XEUtils.toNumber(computedStyle.paddingBottom)
129
+ return paddingTop + paddingBottom
130
+ }
131
+ return 0
132
+ }
133
+
124
134
  const scrollIntoViewIfNeeded = 'scrollIntoViewIfNeeded'
125
135
  const scrollIntoView = 'scrollIntoView'
126
136
 
@@ -70,6 +70,25 @@
70
70
  background-color: var(--vxe-ui-layout-background-color);
71
71
  }
72
72
 
73
+ .vxe-select--header-button {
74
+ display: flex;
75
+ flex-direction: row;
76
+ }
77
+ .vxe-select--header-total {
78
+ display: flex;
79
+ flex-direction: row;
80
+ align-items: center;
81
+ justify-content: center;
82
+ flex-shrink: 0;
83
+ padding-left: 0.8em;
84
+ }
85
+ .vxe-select--header-btns {
86
+ display: flex;
87
+ flex-direction: row;
88
+ flex-grow: 1;
89
+ justify-content: right;
90
+ }
91
+
73
92
  .vxe-select--panel-header {
74
93
  border-bottom: 1px solid var(--vxe-ui-base-popup-border-color);
75
94
  }
@@ -12,6 +12,14 @@
12
12
  cursor: pointer;
13
13
  }
14
14
  }
15
+ &.is--filterable {
16
+ .vxe-tree-select-tree--wrapper {
17
+ padding-top: 0;
18
+ }
19
+ .vxe-tree-select--panel-header {
20
+ border-top: 1px solid var(--vxe-ui-base-popup-border-color);
21
+ }
22
+ }
15
23
  &.is--disabled {
16
24
  & > .vxe-input {
17
25
  .vxe-input--inner {
@@ -57,8 +65,28 @@
57
65
  }
58
66
  }
59
67
 
68
+ .vxe-tree-select--header-button {
69
+ display: flex;
70
+ flex-direction: row;
71
+ }
72
+ .vxe-tree-select--header-total {
73
+ display: flex;
74
+ flex-direction: row;
75
+ align-items: center;
76
+ justify-content: center;
77
+ flex-shrink: 0;
78
+ padding-left: 0.8em;
79
+ }
80
+ .vxe-tree-select--header-btns {
81
+ display: flex;
82
+ flex-direction: row;
83
+ flex-grow: 1;
84
+ justify-content: right;
85
+ }
86
+
60
87
  .vxe-tree-select--panel-wrapper {
61
88
  display: inline-flex;
89
+ flex-direction: column;
62
90
  position: relative;
63
91
  border-radius: var(--vxe-ui-base-border-radius);
64
92
  border: 1px solid var(--vxe-ui-base-popup-border-color);
@@ -67,6 +95,14 @@
67
95
  pointer-events: auto;
68
96
  }
69
97
 
98
+ .vxe-tree-select--panel-search {
99
+ display: block;
100
+ padding: var(--vxe-ui-layout-padding-default);
101
+ .vxe-tree-select-search--input {
102
+ width: 100%;
103
+ }
104
+ }
105
+
70
106
  .vxe-tree-select--panel-header {
71
107
  border-bottom: 1px solid var(--vxe-ui-base-popup-border-color);
72
108
  }
@@ -84,7 +120,6 @@
84
120
  position: relative;
85
121
  overflow: auto;
86
122
  padding: var(--vxe-ui-layout-padding-default);
87
- max-height: 21em;
88
123
  width: 30em;
89
124
  outline: 0;
90
125
  }