vxe-pc-ui 3.7.4 → 3.7.6

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 (198) 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 +138 -41
  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 +1160 -601
  31. package/es/tree/src/util.js +31 -0
  32. package/es/tree/style.css +23 -26
  33. package/es/tree/style.min.css +1 -1
  34. package/es/tree-select/src/tree-select.js +258 -24
  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 +20 -4
  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 +23 -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 +1541 -532
  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 +145 -45
  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 +1223 -626
  125. package/lib/tree/src/tree.min.js +1 -1
  126. package/lib/tree/src/util.js +37 -0
  127. package/lib/tree/src/util.min.js +1 -0
  128. package/lib/tree/style/style.css +23 -26
  129. package/lib/tree/style/style.min.css +1 -1
  130. package/lib/tree-select/src/tree-select.js +265 -26
  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 +20 -4
  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 +23 -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 +144 -44
  171. package/packages/tree/src/tree.ts +1206 -626
  172. package/packages/tree/src/util.ts +34 -0
  173. package/packages/tree-select/src/tree-select.ts +272 -26
  174. package/packages/ui/index.ts +19 -3
  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 +28 -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 +29 -40
  184. package/types/components/table.d.ts +2 -4
  185. package/types/components/tree-select.d.ts +72 -12
  186. package/types/components/tree.d.ts +129 -8
  187. /package/es/icon/{iconfont.1752133985860.ttf → iconfont.1752416451473.ttf} +0 -0
  188. /package/es/icon/{iconfont.1752133985860.woff → iconfont.1752416451473.woff} +0 -0
  189. /package/es/icon/{iconfont.1752133985860.woff2 → iconfont.1752416451473.woff2} +0 -0
  190. /package/es/{iconfont.1752133985860.ttf → iconfont.1752416451473.ttf} +0 -0
  191. /package/es/{iconfont.1752133985860.woff → iconfont.1752416451473.woff} +0 -0
  192. /package/es/{iconfont.1752133985860.woff2 → iconfont.1752416451473.woff2} +0 -0
  193. /package/lib/icon/style/{iconfont.1752133985860.ttf → iconfont.1752416451473.ttf} +0 -0
  194. /package/lib/icon/style/{iconfont.1752133985860.woff → iconfont.1752416451473.woff} +0 -0
  195. /package/lib/icon/style/{iconfont.1752133985860.woff2 → iconfont.1752416451473.woff2} +0 -0
  196. /package/lib/{iconfont.1752133985860.ttf → iconfont.1752416451473.ttf} +0 -0
  197. /package/lib/{iconfont.1752133985860.woff → iconfont.1752416451473.woff} +0 -0
  198. /package/lib/{iconfont.1752133985860.woff2 → iconfont.1752416451473.woff2} +0 -0
@@ -0,0 +1,34 @@
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
9
+ const { transform } = props
10
+ const reactData = $xeTree.reactData
11
+ const { updateExpandedFlag } = reactData
12
+ const internalData = $xeTree.internalData
13
+ const { treeExpandedMaps } = internalData
14
+ const childrenField = $xeTree.computeChildrenField
15
+ const mapChildrenField = $xeTree.computeMapChildrenField
16
+ const nodeChildren = prevNode[transform ? mapChildrenField : childrenField]
17
+ if (nodeChildren && updateExpandedFlag && treeExpandedMaps[$xeTree.getNodeId(prevNode)]) {
18
+ for (let index = 0; index < nodeChildren.length; index++) {
19
+ count += countTreeExpand($xeTree, nodeChildren[index])
20
+ }
21
+ }
22
+ return count
23
+ }
24
+
25
+ export function calcTreeLine ($xeTree: VxeTreeConstructor, node: any, prevNode: any) {
26
+ const internalData = $xeTree.internalData
27
+ const { scrollYStore } = internalData
28
+ const { rowHeight } = scrollYStore
29
+ let expandSize = 1
30
+ if (prevNode) {
31
+ expandSize = countTreeExpand($xeTree, prevNode)
32
+ }
33
+ return (rowHeight || 28) * expandSize - (prevNode ? 1 : 12)
34
+ }
@@ -5,11 +5,11 @@ import { getConfig, getI18n, getIcon, globalEvents, createEvent, globalMixins, r
5
5
  import { getEventTargetNode, updatePanelPlacement, toCssUnit } from '../../ui/src/dom'
6
6
  import { getLastZIndex, nextZIndex } from '../../ui/src/utils'
7
7
  import { errLog } from '../../ui/src/log'
8
-
9
8
  import VxeInputComponent from '../../input/src/input'
9
+ import VxeButtonComponent from '../../button/src/button'
10
10
  import VxeTreeComponent from '../../tree/src/tree'
11
11
 
12
- import type { TreeSelectReactData, VxeTreeSelectEmits, TreeSelectInternalData, VxeComponentSizeType, ValueOf, VxeComponentStyleType, VxeTreeSelectPropTypes, VxeFormDefines, VxeDrawerConstructor, VxeDrawerMethods, VxeFormConstructor, VxeFormPrivateMethods, VxeModalConstructor, VxeModalMethods } from '../../../types'
12
+ import type { TreeSelectReactData, VxeTreeSelectEmits, TreeSelectInternalData, VxeComponentSizeType, VxeButtonDefines, ValueOf, VxeComponentStyleType, VxeTreeSelectPropTypes, VxeFormDefines, VxeDrawerConstructor, VxeDrawerMethods, VxeFormConstructor, VxeFormPrivateMethods, VxeModalConstructor, VxeModalMethods, VxeInputConstructor, VxeTreeConstructor } from '../../../types'
13
13
  import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
14
14
 
15
15
  function getOptUniqueId () {
@@ -41,6 +41,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
41
41
  type: Boolean as PropType<VxeTreeSelectPropTypes.Disabled>,
42
42
  default: null
43
43
  },
44
+ filterable: Boolean as PropType<VxeTreeSelectPropTypes.Filterable>,
45
+ filterConfig: Object as PropType<VxeTreeSelectPropTypes.FilterConfig>,
44
46
  multiple: Boolean as PropType<VxeTreeSelectPropTypes.Multiple>,
45
47
  className: [String, Function] as PropType<VxeTreeSelectPropTypes.ClassName>,
46
48
  popupClassName: [String, Function] as PropType<VxeTreeSelectPropTypes.PopupClassName>,
@@ -50,16 +52,43 @@ export default /* define-vxe-component start */ defineVxeComponent({
50
52
  optionProps: Object as PropType<VxeTreeSelectPropTypes.OptionProps>,
51
53
  size: {
52
54
  type: String as PropType<VxeTreeSelectPropTypes.Size>,
53
- default: () => getConfig().select.size || getConfig().size
55
+ default: () => getConfig().treeSelect.size || getConfig().size
54
56
  },
55
57
  remote: Boolean as PropType<VxeTreeSelectPropTypes.Remote>,
56
- remoteMethod: Function as PropType<VxeTreeSelectPropTypes.RemoteMethod>,
58
+ remoteConfig: Function as PropType<VxeTreeSelectPropTypes.RemoteConfig>,
57
59
  popupConfig: Object as PropType<VxeTreeSelectPropTypes.PopupConfig>,
58
60
  treeConfig: Object as PropType<VxeTreeSelectPropTypes.TreeConfig>,
61
+ virtualYConfig: Object as PropType<VxeTreeSelectPropTypes.VirtualYConfig>,
62
+ autoClose: {
63
+ type: Boolean as PropType<VxeTreeSelectPropTypes.AutoClose>,
64
+ default: () => getConfig().treeSelect.autoClose
65
+ },
66
+ showTotalButoon: {
67
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowTotalButoon>,
68
+ default: () => getConfig().treeSelect.showTotalButoon
69
+ },
70
+ showCheckedButoon: {
71
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowCheckedButoon>,
72
+ default: () => getConfig().treeSelect.showCheckedButoon
73
+ },
74
+ showClearButton: {
75
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowClearButton>,
76
+ default: () => getConfig().treeSelect.showClearButton
77
+ },
78
+ showExpandButton: {
79
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowExpandButton>,
80
+ default: () => getConfig().treeSelect.showExpandButton
81
+ },
59
82
  transfer: {
60
83
  type: Boolean as PropType<VxeTreeSelectPropTypes.Transfer>,
61
84
  default: null
62
- }
85
+ },
86
+
87
+ /**
88
+ * 已废弃,被 remote-config.queryMethod 替换
89
+ * @deprecated
90
+ */
91
+ remoteMethod: Function as PropType<VxeTreeSelectPropTypes.RemoteMethod>
63
92
  },
64
93
  inject: {
65
94
  $xeModal: {
@@ -89,8 +118,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
89
118
  const xID = XEUtils.uniqueId()
90
119
  const reactData: TreeSelectReactData = {
91
120
  initialized: false,
92
- fullOptionList: [],
93
- fullNodeMaps: {},
121
+ searchValue: '',
122
+ searchLoading: false,
94
123
  panelIndex: 0,
95
124
  panelStyle: {},
96
125
  panelPlacement: null,
@@ -100,7 +129,9 @@ export default /* define-vxe-component start */ defineVxeComponent({
100
129
  isActivated: false
101
130
  }
102
131
  const internalData: TreeSelectInternalData = {
103
- hpTimeout: undefined
132
+ // hpTimeout: undefined,
133
+ fullOptionList: [],
134
+ fullNodeMaps: {}
104
135
  }
105
136
  return {
106
137
  xID,
@@ -245,15 +276,35 @@ export default /* define-vxe-component start */ defineVxeComponent({
245
276
  const propsOpts = $xeTreeSelect.computePropsOpts as VxeTreeSelectPropTypes.OptionProps
246
277
  return propsOpts.hasChild || 'hasChild'
247
278
  },
279
+ computeVirtualYOpts () {
280
+ const $xeTreeSelect = this
281
+ const props = $xeTreeSelect
282
+
283
+ return Object.assign({} as { gt: number }, getConfig().treeSelect.virtualYConfig, props.virtualYConfig)
284
+ },
285
+ computeRemoteOpts () {
286
+ const $xeTreeSelect = this
287
+ const props = $xeTreeSelect
288
+
289
+ return Object.assign({}, getConfig().treeSelect.remoteConfig, props.remoteConfig)
290
+ },
291
+ computeFilterOpts () {
292
+ const $xeTreeSelect = this
293
+ const props = $xeTreeSelect
294
+
295
+ const treeOpts = $xeTreeSelect.computeTreeOpts as VxeTreeSelectPropTypes.TreeConfig
296
+ return Object.assign({}, treeOpts.filterConfig, props.filterConfig)
297
+ },
248
298
  computeSelectLabel () {
249
299
  const $xeTreeSelect = this
250
300
  const props = $xeTreeSelect
251
- const reactData = ($xeTreeSelect as any).reactData as TreeSelectReactData
301
+ const internalData = ($xeTreeSelect as any).internalData as TreeSelectInternalData
252
302
 
253
- const { value } = props
254
- const { fullNodeMaps } = reactData
303
+ const { value: modelValue } = props
304
+ const { fullNodeMaps } = internalData
255
305
  const labelField = $xeTreeSelect.computeLabelField as string
256
- return (XEUtils.isArray(value) ? value : [value]).map(val => {
306
+ const selectVals = XEUtils.eqNull(modelValue) ? [] : (XEUtils.isArray(modelValue) ? modelValue : [modelValue])
307
+ return selectVals.map(val => {
257
308
  const cacheItem = fullNodeMaps[val]
258
309
  return cacheItem ? cacheItem.item[labelField] : val
259
310
  }).join(', ')
@@ -302,7 +353,7 @@ export default /* define-vxe-component start */ defineVxeComponent({
302
353
  cacheDataMap () {
303
354
  const $xeTreeSelect = this
304
355
  const props = $xeTreeSelect
305
- const reactData = $xeTreeSelect.reactData
356
+ const internalData = $xeTreeSelect.internalData
306
357
 
307
358
  const { options } = props
308
359
  const nodeKeyField = $xeTreeSelect.computeNodeKeyField
@@ -331,8 +382,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
331
382
  }
332
383
  nodeMaps[value] = { item, index, items, parent, nodes }
333
384
  }, { children: childrenField })
334
- reactData.fullOptionList = options || []
335
- reactData.fullNodeMaps = nodeMaps
385
+ internalData.fullOptionList = options || []
386
+ internalData.fullNodeMaps = nodeMaps
336
387
  },
337
388
  updateZindex () {
338
389
  const $xeTreeSelect = this
@@ -372,8 +423,10 @@ export default /* define-vxe-component start */ defineVxeComponent({
372
423
  const reactData = $xeTreeSelect.reactData
373
424
  const internalData = $xeTreeSelect.internalData
374
425
 
375
- const { loading } = props
426
+ const { loading, remote, filterable } = props
427
+ const { fullOptionList } = internalData
376
428
  const isDisabled = $xeTreeSelect.computeIsDisabled
429
+ const remoteOpts = $xeTreeSelect.computeRemoteOpts
377
430
  if (!loading && !isDisabled) {
378
431
  if (internalData.hpTimeout) {
379
432
  clearTimeout(internalData.hpTimeout)
@@ -390,8 +443,14 @@ export default /* define-vxe-component start */ defineVxeComponent({
390
443
  }
391
444
  reactData.isActivated = true
392
445
  reactData.isAniVisible = true
446
+ if (filterable) {
447
+ if (remote && remoteOpts.enabled && remoteOpts.autoLoad && !fullOptionList.length) {
448
+ $xeTreeSelect.handleSearchEvent()
449
+ }
450
+ }
393
451
  setTimeout(() => {
394
452
  reactData.visiblePanel = true
453
+ $xeTreeSelect.handleFocusSearch()
395
454
  }, 10)
396
455
  $xeTreeSelect.updateZindex()
397
456
  $xeTreeSelect.updatePlacement()
@@ -410,11 +469,11 @@ export default /* define-vxe-component start */ defineVxeComponent({
410
469
  changeEvent (evnt: Event, selectValue: any) {
411
470
  const $xeTreeSelect = this
412
471
  const props = $xeTreeSelect
413
- const reactData = $xeTreeSelect.reactData
472
+ const internalData = $xeTreeSelect.internalData
414
473
  const $xeForm = $xeTreeSelect.$xeForm
415
474
  const formItemInfo = $xeTreeSelect.formItemInfo
416
475
 
417
- const { fullNodeMaps } = reactData
476
+ const { fullNodeMaps } = internalData
418
477
  $xeTreeSelect.emitModel(selectValue)
419
478
  if (selectValue !== props.value) {
420
479
  const cacheItem = fullNodeMaps[selectValue]
@@ -437,6 +496,59 @@ export default /* define-vxe-component start */ defineVxeComponent({
437
496
  $xeTreeSelect.clearValueEvent(evnt, null)
438
497
  $xeTreeSelect.hideOptionPanel()
439
498
  },
499
+ allCheckedPanelEvent (params: VxeButtonDefines.ClickEventParams) {
500
+ const $xeTreeSelect = this
501
+ const props = $xeTreeSelect
502
+
503
+ const { $event } = params
504
+ const { multiple, autoClose } = props
505
+ const $tree = $xeTreeSelect.$refs.refTree as VxeTreeConstructor
506
+ if (multiple) {
507
+ if ($tree) {
508
+ $tree.setAllCheckboxNode(true).then(({ checkNodeKeys }) => {
509
+ $xeTreeSelect.changeEvent($event, checkNodeKeys)
510
+ $xeTreeSelect.dispatchEvent('all-change', { value: checkNodeKeys }, $event)
511
+ if (autoClose) {
512
+ $xeTreeSelect.hideOptionPanel()
513
+ }
514
+ })
515
+ }
516
+ }
517
+ },
518
+ clearCheckedPanelEvent (params: VxeButtonDefines.ClickEventParams) {
519
+ const $xeTreeSelect = this
520
+ const props = $xeTreeSelect
521
+
522
+ const { $event } = params
523
+ const { multiple, autoClose } = props
524
+ const $tree = $xeTreeSelect.$refs.refTree as VxeTreeConstructor
525
+ if ($tree) {
526
+ const value = multiple ? [] : null
527
+ $tree.clearCheckboxNode().then(() => {
528
+ if (autoClose) {
529
+ $xeTreeSelect.hideOptionPanel()
530
+ }
531
+ })
532
+ $xeTreeSelect.changeEvent($event, value)
533
+ $xeTreeSelect.dispatchEvent('clear', { value }, $event)
534
+ }
535
+ },
536
+ allExpandPanelEvent () {
537
+ const $xeTreeSelect = this
538
+
539
+ const $tree = $xeTreeSelect.$refs.refTree as VxeTreeConstructor
540
+ if ($tree) {
541
+ $tree.setAllExpandNode(true)
542
+ }
543
+ },
544
+ clearExpandPanelEvent () {
545
+ const $xeTreeSelect = this
546
+
547
+ const $tree = $xeTreeSelect.$refs.refTree as VxeTreeConstructor
548
+ if ($tree) {
549
+ $tree.clearAllExpandNode()
550
+ }
551
+ },
440
552
  handleGlobalMousewheelEvent (evnt: MouseEvent) {
441
553
  const $xeTreeSelect = this
442
554
  const reactData = $xeTreeSelect.reactData
@@ -483,6 +595,19 @@ export default /* define-vxe-component start */ defineVxeComponent({
483
595
  $xeTreeSelect.updatePlacement()
484
596
  }
485
597
  },
598
+ handleFocusSearch () {
599
+ const $xeSelect = this
600
+ const props = $xeSelect
601
+
602
+ if (props.filterable) {
603
+ $xeSelect.$nextTick(() => {
604
+ const inpSearch = $xeSelect.$refs.refInpSearch as VxeInputConstructor
605
+ if (inpSearch) {
606
+ inpSearch.focus()
607
+ }
608
+ })
609
+ }
610
+ },
486
611
  focusEvent (evnt: FocusEvent) {
487
612
  const $xeTreeSelect = this
488
613
  const reactData = $xeTreeSelect.reactData
@@ -512,6 +637,32 @@ export default /* define-vxe-component start */ defineVxeComponent({
512
637
  reactData.isActivated = false
513
638
  $xeTreeSelect.dispatchEvent('blur', {}, evnt)
514
639
  },
640
+ modelSearchEvent (value: string) {
641
+ const $xeTreeSelect = this
642
+ const reactData = $xeTreeSelect.reactData
643
+
644
+ reactData.searchValue = value
645
+ },
646
+ handleSearchEvent () {
647
+ const $xeTreeSelect = this
648
+ const props = $xeTreeSelect
649
+ const reactData = $xeTreeSelect.reactData
650
+
651
+ const { value: modelValue, remote, remoteMethod } = props
652
+ const { searchValue } = reactData
653
+ const remoteOpts = $xeTreeSelect.computeRemoteOpts
654
+ const queryMethod = remoteOpts.queryMethod || remoteMethod
655
+ if (remote && queryMethod && remoteOpts.enabled) {
656
+ reactData.searchLoading = true
657
+ Promise.resolve(
658
+ queryMethod({ $treeSelect: $xeTreeSelect, searchValue, value: modelValue })
659
+ ).then(() => $xeTreeSelect.$nextTick())
660
+ .catch(() => $xeTreeSelect.$nextTick())
661
+ .finally(() => {
662
+ reactData.searchLoading = false
663
+ })
664
+ }
665
+ },
515
666
  togglePanelEvent (params: any) {
516
667
  const $xeTreeSelect = this
517
668
  const reactData = $xeTreeSelect.reactData
@@ -562,8 +713,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
562
713
  const slots = $xeTreeSelect.$scopedSlots
563
714
  const reactData = $xeTreeSelect.reactData
564
715
 
565
- const { className, value, multiple, options, loading } = props
566
- const { initialized, isActivated, isAniVisible, visiblePanel } = reactData
716
+ const { className, value: modelValue, multiple, options, loading, filterable, showTotalButoon, showCheckedButoon, showClearButton, showExpandButton } = props
717
+ const { initialized, isActivated, isAniVisible, visiblePanel, searchValue } = reactData
567
718
  const vSize = $xeTreeSelect.computeSize
568
719
  const isDisabled = $xeTreeSelect.computeIsDisabled
569
720
  const selectLabel = $xeTreeSelect.computeSelectLabel
@@ -585,6 +736,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
585
736
  const childrenField = $xeTreeSelect.computeChildrenField
586
737
  const parentField = $xeTreeSelect.computeParentField
587
738
  const hasChildField = $xeTreeSelect.computeHasChildField
739
+ const virtualYOpts = $xeTreeSelect.computeVirtualYOpts
740
+ const filterOpts = $xeTreeSelect.computeFilterOpts
588
741
 
589
742
  if (formReadonly) {
590
743
  return h('div', {
@@ -596,10 +749,12 @@ export default /* define-vxe-component start */ defineVxeComponent({
596
749
  }, selectLabel)
597
750
  ])
598
751
  }
752
+ const selectVals = XEUtils.eqNull(modelValue) ? [] : (XEUtils.isArray(modelValue) ? modelValue : [modelValue])
599
753
  return h('div', {
600
754
  ref: 'refElem',
601
755
  class: ['vxe-tree-select', className ? (XEUtils.isFunction(className) ? className({ $treeSelect: $xeTreeSelect }) : className) : '', {
602
756
  [`size--${vSize}`]: vSize,
757
+ 'is--filterable': filterable,
603
758
  'is--visible': visiblePanel,
604
759
  'is--disabled': isDisabled,
605
760
  'is--loading': loading,
@@ -616,7 +771,8 @@ export default /* define-vxe-component start */ defineVxeComponent({
616
771
  type: 'text',
617
772
  prefixIcon: props.prefixIcon,
618
773
  suffixIcon: loading ? getIcon().TREE_SELECT_LOADED : (visiblePanel ? getIcon().TREE_SELECT_OPEN : getIcon().TREE_SELECT_CLOSE),
619
- value: loading ? getI18n('vxe.select.loadingText') : selectLabel
774
+ value: loading ? getI18n('vxe.select.loadingText') : selectLabel,
775
+ title: selectLabel
620
776
  },
621
777
  on: {
622
778
  clear: $xeTreeSelect.clearEvent,
@@ -648,10 +804,92 @@ export default /* define-vxe-component start */ defineVxeComponent({
648
804
  h('div', {
649
805
  class: 'vxe-tree-select--panel-wrapper'
650
806
  }, [
651
- headerSlot
807
+ filterable
808
+ ? h('div', {
809
+ class: 'vxe-tree-select--panel-search'
810
+ }, [
811
+ h(VxeInputComponent, {
812
+ ref: 'refInpSearch',
813
+ class: 'vxe-tree-select-search--input',
814
+ props: {
815
+ value: searchValue,
816
+ title: selectLabel,
817
+ clearable: true,
818
+ disabled: false,
819
+ readonly: false,
820
+ placeholder: getI18n('vxe.treeSelect.search'),
821
+ prefixIcon: getIcon().INPUT_SEARCH
822
+ },
823
+ on: {
824
+ 'model-value': $xeTreeSelect.modelSearchEvent
825
+ }
826
+ })
827
+ ])
828
+ : renderEmptyElement($xeTreeSelect),
829
+ showTotalButoon || (showCheckedButoon && multiple) || showClearButton || showExpandButton || headerSlot
652
830
  ? h('div', {
653
831
  class: 'vxe-tree-select--panel-header'
654
- }, headerSlot({}))
832
+ }, headerSlot
833
+ ? headerSlot({})
834
+ : [
835
+ h('div', {
836
+ class: 'vxe-tree-select--header-button'
837
+ }, [
838
+ showTotalButoon
839
+ ? h('div', {
840
+ class: 'vxe-tree-select--header-total'
841
+ }, getI18n('vxe.treeSelect.total', [selectVals.length]))
842
+ : renderEmptyElement($xeTreeSelect),
843
+ h('div', {
844
+ class: 'vxe-tree-select--header-btns'
845
+ }, [
846
+ (showCheckedButoon && multiple)
847
+ ? h(VxeButtonComponent, {
848
+ props: {
849
+ content: getI18n('vxe.treeSelect.allChecked'),
850
+ mode: 'text'
851
+ },
852
+ on: {
853
+ click: $xeTreeSelect.allCheckedPanelEvent
854
+ }
855
+ })
856
+ : renderEmptyElement($xeTreeSelect),
857
+ showClearButton
858
+ ? h(VxeButtonComponent, {
859
+ props: {
860
+ content: getI18n('vxe.treeSelect.clearChecked'),
861
+ mode: 'text'
862
+ },
863
+ on: {
864
+ click: $xeTreeSelect.clearCheckedPanelEvent
865
+ }
866
+ })
867
+ : renderEmptyElement($xeTreeSelect),
868
+ showExpandButton
869
+ ? h(VxeButtonComponent, {
870
+ props: {
871
+ content: getI18n('vxe.treeSelect.allExpand'),
872
+ mode: 'text'
873
+ },
874
+ on: {
875
+ click: $xeTreeSelect.allExpandPanelEvent
876
+ }
877
+ })
878
+ : renderEmptyElement($xeTreeSelect),
879
+ showExpandButton
880
+ ? h(VxeButtonComponent, {
881
+ props: {
882
+ content: getI18n('vxe.treeSelect.clearExpand'),
883
+ mode: 'text'
884
+ },
885
+ on: {
886
+ click: $xeTreeSelect.clearExpandPanelEvent
887
+ }
888
+ })
889
+ : renderEmptyElement($xeTreeSelect)
890
+ ])
891
+ ])
892
+ ])
655
893
  : renderEmptyElement($xeTreeSelect),
656
894
  h('div', {
657
895
  class: 'vxe-tree-select--panel-body'
@@ -662,15 +900,20 @@ export default /* define-vxe-component start */ defineVxeComponent({
662
900
  style: popupWrapperStyle
663
901
  }, [
664
902
  h(VxeTreeComponent, {
903
+ ref: 'refTree',
665
904
  class: 'vxe-tree-select--tree',
666
905
  props: {
667
906
  data: options,
907
+ height: popupOpts.height ? '100%' : treeOpts.height,
908
+ minHeight: treeOpts.minHeight,
909
+ maxHeight: popupOpts.height ? '' : treeOpts.maxHeight,
910
+ autoResize: true,
668
911
  indent: treeOpts.indent,
669
912
  showRadio: !multiple,
670
913
  radioConfig: treeRadioOpts,
671
- checkNodeKey: multiple ? null : value,
914
+ checkNodeKey: multiple ? null : modelValue,
672
915
  showCheckbox: !!multiple,
673
- checkNodeKeys: multiple ? value : null,
916
+ checkNodeKeys: multiple ? modelValue : null,
674
917
  checkboxConfig: treeCheckboxOpts,
675
918
  titleField: labelField,
676
919
  valueField: valueField,
@@ -690,7 +933,10 @@ export default /* define-vxe-component start */ defineVxeComponent({
690
933
  showLine: treeOpts.showLine,
691
934
  iconOpen: treeOpts.iconOpen,
692
935
  iconLoaded: treeOpts.iconLoaded,
693
- iconClose: treeOpts.iconClose
936
+ iconClose: treeOpts.iconClose,
937
+ filterValue: searchValue,
938
+ filterConfig: filterOpts,
939
+ virtualYConfig: virtualYOpts
694
940
  },
695
941
  on: {
696
942
  'node-click': $xeTreeSelect.nodeClickEvent,
@@ -203,7 +203,7 @@ setConfig({
203
203
  // size: null,
204
204
  virtualYConfig: {
205
205
  enabled: true,
206
- gt: 100
206
+ gt: 60
207
207
  // oSize: 0
208
208
  }
209
209
  },
@@ -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
  }