vxe-pc-ui 4.7.4 → 4.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 +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 +918 -407
  31. package/es/tree/src/util.js +32 -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 +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 +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 +1505 -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 +1147 -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 +23 -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 +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 +146 -50
  171. package/packages/tree/src/tree.ts +941 -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 +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 +28 -39
  184. package/types/components/table.d.ts +2 -4
  185. package/types/components/tree-select.d.ts +73 -12
  186. package/types/components/tree.d.ts +125 -8
  187. /package/es/icon/{iconfont.1752133996961.ttf → iconfont.1752416456948.ttf} +0 -0
  188. /package/es/icon/{iconfont.1752133996961.woff → iconfont.1752416456948.woff} +0 -0
  189. /package/es/icon/{iconfont.1752133996961.woff2 → iconfont.1752416456948.woff2} +0 -0
  190. /package/es/{iconfont.1752133996961.ttf → iconfont.1752416456948.ttf} +0 -0
  191. /package/es/{iconfont.1752133996961.woff → iconfont.1752416456948.woff} +0 -0
  192. /package/es/{iconfont.1752133996961.woff2 → iconfont.1752416456948.woff2} +0 -0
  193. /package/lib/icon/style/{iconfont.1752133996961.ttf → iconfont.1752416456948.ttf} +0 -0
  194. /package/lib/icon/style/{iconfont.1752133996961.woff → iconfont.1752416456948.woff} +0 -0
  195. /package/lib/icon/style/{iconfont.1752133996961.woff2 → iconfont.1752416456948.woff2} +0 -0
  196. /package/lib/{iconfont.1752133996961.ttf → iconfont.1752416456948.ttf} +0 -0
  197. /package/lib/{iconfont.1752133996961.woff → iconfont.1752416456948.woff} +0 -0
  198. /package/lib/{iconfont.1752133996961.woff2 → iconfont.1752416456948.woff2} +0 -0
@@ -1,13 +1,14 @@
1
- import { h, Teleport, PropType, ref, Ref, inject, computed, provide, onUnmounted, reactive, nextTick, watch, onMounted } from 'vue'
1
+ import { h, Teleport, PropType, ref, inject, computed, provide, onUnmounted, reactive, nextTick, watch, onMounted } from 'vue'
2
2
  import { defineVxeComponent } from '../../ui/src/comp'
3
3
  import XEUtils from 'xe-utils'
4
- import { getConfig, getIcon, getI18n, globalEvents, GLOBAL_EVENT_KEYS, createEvent, useSize, renderEmptyElement } from '../../ui'
4
+ import { VxeUI, getConfig, getIcon, getI18n, globalEvents, GLOBAL_EVENT_KEYS, createEvent, useSize, renderEmptyElement } from '../../ui'
5
5
  import { getEventTargetNode, updatePanelPlacement } from '../../ui/src/dom'
6
6
  import { getLastZIndex, nextZIndex, getFuncText } from '../../ui/src/utils'
7
7
  import { getSlotVNs } from '../../ui/src/vn'
8
8
  import VxeInputComponent from '../../input/src/input'
9
+ import VxeButtonComponent from '../../button/src/button'
9
10
 
10
- import type { VxeSelectPropTypes, VxeSelectConstructor, SelectInternalData, SelectReactData, VxeSelectDefines, ValueOf, VxeSelectEmits, VxeComponentSlotType, VxeInputConstructor, SelectMethods, SelectPrivateRef, VxeSelectMethods, VxeOptgroupProps, VxeOptionProps, VxeDrawerConstructor, VxeDrawerMethods, VxeFormDefines, VxeFormConstructor, VxeFormPrivateMethods, VxeModalConstructor, VxeModalMethods, VxeInputEvents } from '../../../types'
11
+ import type { VxeSelectPropTypes, VxeSelectConstructor, SelectInternalData, SelectReactData, VxeSelectDefines, VxeButtonEvents, ValueOf, VxeSelectEmits, VxeComponentSlotType, VxeInputConstructor, SelectMethods, SelectPrivateRef, VxeSelectMethods, VxeOptionProps, VxeDrawerConstructor, VxeDrawerMethods, VxeFormDefines, VxeFormConstructor, VxeFormPrivateMethods, VxeModalConstructor, VxeModalMethods, VxeInputEvents } from '../../../types'
11
12
  import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
12
13
 
13
14
  function isOptionVisible (option: any) {
@@ -63,10 +64,20 @@ export default defineVxeComponent({
63
64
  filterable: Boolean as PropType<VxeSelectPropTypes.Filterable>,
64
65
  filterMethod: Function as PropType<VxeSelectPropTypes.FilterMethod>,
65
66
  remote: Boolean as PropType<VxeSelectPropTypes.Remote>,
66
- // 已废弃,被 remote-config.queryMethod 替换
67
- remoteMethod: Function as PropType<VxeSelectPropTypes.RemoteMethod>,
68
67
  remoteConfig: Object as PropType<VxeSelectPropTypes.RemoteConfig>,
69
68
  emptyText: String as PropType<VxeSelectPropTypes.EmptyText>,
69
+ showTotalButoon: {
70
+ type: Boolean as PropType<VxeSelectPropTypes.ShowTotalButoon>,
71
+ default: () => getConfig().select.showTotalButoon
72
+ },
73
+ showCheckedButoon: {
74
+ type: Boolean as PropType<VxeSelectPropTypes.ShowCheckedButoon>,
75
+ default: () => getConfig().select.showCheckedButoon
76
+ },
77
+ showClearButton: {
78
+ type: Boolean as PropType<VxeSelectPropTypes.ShowClearButton>,
79
+ default: () => getConfig().select.showClearButton
80
+ },
70
81
  transfer: {
71
82
  type: Boolean as PropType<VxeSelectPropTypes.Transfer>,
72
83
  default: null
@@ -74,17 +85,29 @@ export default defineVxeComponent({
74
85
  virtualYConfig: Object as PropType<VxeSelectPropTypes.VirtualYConfig>,
75
86
  scrollY: Object as PropType<VxeSelectPropTypes.ScrollY>,
76
87
 
77
- // 已废弃,被 option-config.keyField 替换
88
+ /**
89
+ * 已废弃,被 remote-config.queryMethod 替换
90
+ * @deprecated
91
+ */
92
+ remoteMethod: Function as PropType<VxeSelectPropTypes.RemoteMethod>,
93
+ /**
94
+ * 已废弃,被 option-config.keyField 替换
95
+ * @deprecated
96
+ */
78
97
  optionId: {
79
98
  type: String as PropType<VxeSelectPropTypes.OptionId>,
80
99
  default: () => getConfig().select.optionId
81
100
  },
82
- // 已废弃,被 option-config.useKey 替换
101
+ /**
102
+ * 已废弃,被 option-config.useKey 替换
103
+ * @deprecated
104
+ */
83
105
  optionKey: Boolean as PropType<VxeSelectPropTypes.OptionKey>
84
106
  },
85
107
  emits: [
86
108
  'update:modelValue',
87
109
  'change',
110
+ 'all-change',
88
111
  'clear',
89
112
  'blur',
90
113
  'focus',
@@ -103,12 +126,12 @@ export default defineVxeComponent({
103
126
 
104
127
  const xID = XEUtils.uniqueId()
105
128
 
106
- const refElem = ref() as Ref<HTMLDivElement>
107
- const refInput = ref() as Ref<VxeInputConstructor>
108
- const refInpSearch = ref() as Ref<VxeInputConstructor>
109
- const refVirtualWrapper = ref() as Ref<HTMLDivElement>
110
- const refOptionPanel = ref() as Ref<HTMLDivElement>
111
- const refVirtualBody = ref() as Ref<HTMLDivElement>
129
+ const refElem = ref<HTMLDivElement>()
130
+ const refInput = ref<VxeInputConstructor>()
131
+ const refInpSearch = ref<VxeInputConstructor>()
132
+ const refVirtualWrapper = ref<HTMLDivElement>()
133
+ const refOptionPanel = ref<HTMLDivElement>()
134
+ const refVirtualBody = ref<HTMLDivElement>()
112
135
 
113
136
  const { computeSize } = useSize(props)
114
137
 
@@ -118,7 +141,6 @@ export default defineVxeComponent({
118
141
  bodyHeight: 0,
119
142
  topSpaceHeight: 0,
120
143
  optList: [],
121
- afterVisibleList: [],
122
144
  staticOptions: [],
123
145
  reactFlag: 0,
124
146
 
@@ -138,6 +160,7 @@ export default defineVxeComponent({
138
160
  const internalData: SelectInternalData = {
139
161
  synchData: [],
140
162
  fullData: [],
163
+ afterVisibleList: [],
141
164
  optAddMaps: {},
142
165
  optGroupKeyMaps: {},
143
166
  optFullValMaps: {},
@@ -250,14 +273,11 @@ export default defineVxeComponent({
250
273
  })
251
274
 
252
275
  const computeIsMaximize = computed(() => {
253
- const { modelValue, multiple, max } = props
254
- if (multiple && max) {
255
- return (XEUtils.isArray(modelValue) ? modelValue.length : (XEUtils.eqNull(modelValue) ? 0 : 1)) >= XEUtils.toNumber(max)
256
- }
257
- return false
276
+ const { modelValue } = props
277
+ return checkMaxLimit(modelValue)
258
278
  })
259
279
 
260
- const computeSYOpts = computed(() => {
280
+ const computeVirtualYOpts = computed(() => {
261
281
  return Object.assign({} as { gt: number }, getConfig().select.virtualYConfig || getConfig().select.scrollY, props.virtualYConfig || props.scrollY)
262
282
  })
263
283
 
@@ -323,6 +343,14 @@ export default defineVxeComponent({
323
343
  return optid ? encodeURIComponent(optid) : ''
324
344
  }
325
345
 
346
+ const checkMaxLimit = (selectVals: VxeSelectPropTypes.ModelValue | undefined) => {
347
+ const { multiple, max } = props
348
+ if (multiple && max) {
349
+ return (XEUtils.isArray(selectVals) ? selectVals.length : (XEUtils.eqNull(selectVals) ? 0 : 1)) >= XEUtils.toNumber(max)
350
+ }
351
+ return false
352
+ }
353
+
326
354
  const getRemoteSelectLabel = (value: any) => {
327
355
  const { remoteValMaps, optFullValMaps } = internalData
328
356
  const labelField = computeLabelField.value
@@ -396,7 +424,7 @@ export default defineVxeComponent({
396
424
  cacheItem._index = index
397
425
  }
398
426
  })
399
- reactData.afterVisibleList = avList
427
+ internalData.afterVisibleList = avList
400
428
  return nextTick()
401
429
  }
402
430
 
@@ -450,7 +478,7 @@ export default defineVxeComponent({
450
478
  reactData.isAniVisible = true
451
479
  if (filterable) {
452
480
  if (remote && remoteOpts.enabled && remoteOpts.autoLoad && !fullData.length) {
453
- triggerSearchEvent()
481
+ handleSearchEvent()
454
482
  } else {
455
483
  handleOption()
456
484
  updateYData()
@@ -503,6 +531,42 @@ export default defineVxeComponent({
503
531
  hideOptionPanel()
504
532
  }
505
533
 
534
+ const allCheckedPanelEvent: VxeButtonEvents.Click = (params) => {
535
+ const { $event } = params
536
+ const { modelValue, multiple, max } = props
537
+ const { optList } = reactData
538
+ const valueField = computeValueField.value
539
+ if (multiple) {
540
+ const multipleValue: any[] = XEUtils.eqNull(modelValue) ? [] : (XEUtils.isArray(modelValue) ? modelValue : [modelValue])
541
+ for (let i = 0; i < optList.length; i++) {
542
+ const option = optList[i]
543
+ const selectValue = option[valueField]
544
+ // 检测是否超过最大可选数量
545
+ if (checkMaxLimit(multipleValue)) {
546
+ if (VxeUI) {
547
+ VxeUI.modal.message({
548
+ content: getI18n('vxe.select.overSizeErr', [max]),
549
+ status: 'warning'
550
+ })
551
+ }
552
+ break
553
+ }
554
+ if (!multipleValue.some(val => val === selectValue)) {
555
+ multipleValue.push(selectValue)
556
+ }
557
+ }
558
+ changeEvent($event, multipleValue)
559
+ dispatchEvent('all-change', { value: multipleValue }, $event)
560
+ hideOptionPanel()
561
+ }
562
+ }
563
+
564
+ const clearCheckedPanelEvent: VxeButtonEvents.Click = (params) => {
565
+ const { $event } = params
566
+ clearValueEvent($event, null)
567
+ hideOptionPanel()
568
+ }
569
+
506
570
  const changeOptionEvent = (evnt: Event, option: any) => {
507
571
  const { modelValue, multiple } = props
508
572
  const { remoteValMaps } = internalData
@@ -577,8 +641,8 @@ export default defineVxeComponent({
577
641
 
578
642
  const findOffsetOption = (option: any, isDwArrow: boolean) => {
579
643
  const { allowCreate } = props
580
- const { afterVisibleList, optList } = reactData
581
- const { optFullValMaps, optAddMaps } = internalData
644
+ const { optList } = reactData
645
+ const { optFullValMaps, optAddMaps, afterVisibleList } = internalData
582
646
  const valueField = computeValueField.value
583
647
  let fullList = afterVisibleList
584
648
  let offsetAddIndex = 0
@@ -781,13 +845,10 @@ export default defineVxeComponent({
781
845
  }
782
846
  }
783
847
 
784
- const checkOptionDisabled = (isSelected: any, option: VxeOptionProps, group?: VxeOptgroupProps) => {
848
+ const checkOptionDisabled = (isSelected: any, option: VxeOptionProps) => {
785
849
  if (option.disabled) {
786
850
  return true
787
851
  }
788
- if (group && group.disabled) {
789
- return true
790
- }
791
852
  const isMaximize = computeIsMaximize.value
792
853
  if (isMaximize && !isSelected) {
793
854
  return true
@@ -796,16 +857,16 @@ export default defineVxeComponent({
796
857
  }
797
858
 
798
859
  const updateYSpace = () => {
799
- const { scrollYLoad, afterVisibleList } = reactData
800
- const { scrollYStore } = internalData
860
+ const { scrollYLoad } = reactData
861
+ const { scrollYStore, afterVisibleList } = internalData
801
862
  reactData.bodyHeight = scrollYLoad ? afterVisibleList.length * scrollYStore.rowHeight : 0
802
863
  reactData.topSpaceHeight = scrollYLoad ? Math.max(scrollYStore.startIndex * scrollYStore.rowHeight, 0) : 0
803
864
  }
804
865
 
805
866
  const handleData = () => {
806
867
  const { filterable, allowCreate } = props
807
- const { scrollYLoad, afterVisibleList, searchValue } = reactData
808
- const { optAddMaps, scrollYStore } = internalData
868
+ const { scrollYLoad, searchValue } = reactData
869
+ const { optAddMaps, scrollYStore, afterVisibleList } = internalData
809
870
  const labelField = computeLabelField.value
810
871
  const valueField = computeValueField.value
811
872
  const restList = scrollYLoad ? afterVisibleList.slice(scrollYStore.startIndex, scrollYStore.endIndex) : afterVisibleList.slice(0)
@@ -834,13 +895,10 @@ export default defineVxeComponent({
834
895
  const { scrollYLoad } = reactData
835
896
  const { scrollYStore } = internalData
836
897
  const virtualBodyElem = refVirtualBody.value
837
- const sYOpts = computeSYOpts.value
898
+ const virtualYOpts = computeVirtualYOpts.value
838
899
  let rowHeight = 0
839
900
  let firstItemElem: HTMLElement | undefined
840
901
  if (virtualBodyElem) {
841
- if (sYOpts.sItem) {
842
- firstItemElem = virtualBodyElem.querySelector(sYOpts.sItem) as HTMLElement
843
- }
844
902
  if (!firstItemElem) {
845
903
  firstItemElem = virtualBodyElem.children[0] as HTMLElement
846
904
  }
@@ -854,7 +912,7 @@ export default defineVxeComponent({
854
912
  if (scrollYLoad) {
855
913
  const scrollBodyElem = refVirtualWrapper.value
856
914
  const visibleYSize = Math.max(8, scrollBodyElem ? Math.ceil(scrollBodyElem.clientHeight / rowHeight) : 0)
857
- const offsetYSize = Math.max(0, Math.min(2, XEUtils.toNumber(sYOpts.oSize)))
915
+ const offsetYSize = Math.max(0, Math.min(2, XEUtils.toNumber(virtualYOpts.oSize)))
858
916
  scrollYStore.offsetSize = offsetYSize
859
917
  scrollYStore.visibleSize = visibleYSize
860
918
  scrollYStore.endIndex = Math.max(scrollYStore.startIndex, visibleYSize + offsetYSize, scrollYStore.endIndex)
@@ -876,6 +934,9 @@ export default defineVxeComponent({
876
934
  if (avIndex > -1) {
877
935
  const optWrapperElem = refVirtualWrapper.value
878
936
  const panelElem = refOptionPanel.value
937
+ if (!panelElem) {
938
+ return
939
+ }
879
940
  const optElem = panelElem.querySelector(`[optid='${optid}']`) as HTMLElement
880
941
  if (optWrapperElem) {
881
942
  if (optElem) {
@@ -1005,7 +1066,7 @@ export default defineVxeComponent({
1005
1066
  cacheItemMap(datas || [])
1006
1067
  const { isLoaded, fullData, scrollYStore } = internalData
1007
1068
  const defaultOpts = computeDefaultOpts.value
1008
- const sYOpts = computeSYOpts.value
1069
+ const virtualYOpts = computeVirtualYOpts.value
1009
1070
  const valueField = computeValueField.value
1010
1071
  Object.assign(scrollYStore, {
1011
1072
  startIndex: 0,
@@ -1014,7 +1075,7 @@ export default defineVxeComponent({
1014
1075
  })
1015
1076
  internalData.synchData = datas || []
1016
1077
  // 如果gt为0,则总是启用
1017
- reactData.scrollYLoad = !!sYOpts.enabled && sYOpts.gt > -1 && (sYOpts.gt === 0 || sYOpts.gt <= fullData.length)
1078
+ reactData.scrollYLoad = !!virtualYOpts.enabled && virtualYOpts.gt > -1 && (virtualYOpts.gt === 0 || virtualYOpts.gt <= fullData.length)
1018
1079
  handleData()
1019
1080
  if (!isLoaded) {
1020
1081
  const { selectMode } = defaultOpts
@@ -1091,13 +1152,17 @@ export default defineVxeComponent({
1091
1152
  },
1092
1153
  focus () {
1093
1154
  const $input = refInput.value
1155
+ if ($input) {
1156
+ $input.blur()
1157
+ }
1094
1158
  reactData.isActivated = true
1095
- $input.blur()
1096
1159
  return nextTick()
1097
1160
  },
1098
1161
  blur () {
1099
1162
  const $input = refInput.value
1100
- $input.blur()
1163
+ if ($input) {
1164
+ $input.blur()
1165
+ }
1101
1166
  reactData.isActivated = false
1102
1167
  return nextTick()
1103
1168
  },
@@ -1107,7 +1172,7 @@ export default defineVxeComponent({
1107
1172
 
1108
1173
  Object.assign($xeSelect, selectMethods)
1109
1174
 
1110
- const renderOption = (list: VxeOptionProps[], group?: VxeOptgroupProps) => {
1175
+ const renderOption = (list: VxeOptionProps[]) => {
1111
1176
  const { allowCreate, optionKey, modelValue } = props
1112
1177
  const { currentOption } = reactData
1113
1178
  const { optAddMaps } = internalData
@@ -1125,9 +1190,9 @@ export default defineVxeComponent({
1125
1190
  const isAdd = !!(allowCreate && optAddMaps[optid])
1126
1191
  const isSelected = !isAdd && (XEUtils.isArray(modelValue) ? modelValue.indexOf(optionValue) > -1 : modelValue === optionValue)
1127
1192
  const isVisible = isAdd || (!isOptGroup || isOptionVisible(option))
1128
- const isDisabled = !isAdd && checkOptionDisabled(isSelected, option, group)
1193
+ const isDisabled = !isAdd && checkOptionDisabled(isSelected, option)
1129
1194
  const defaultSlot = slots ? slots.default : null
1130
- const optParams = { option, group: null, $select: $xeSelect }
1195
+ const optParams = { option, group: isOptGroup ? option : null, $select: $xeSelect }
1131
1196
  let optLabel = ''
1132
1197
  let optVNs: string | VxeComponentSlotType[] = []
1133
1198
  if (optionSlot) {
@@ -1216,8 +1281,8 @@ export default defineVxeComponent({
1216
1281
  }
1217
1282
 
1218
1283
  const renderVN = () => {
1219
- const { className, popupClassName, loading, filterable } = props
1220
- const { initialized, isActivated, isAniVisible, visiblePanel, bodyHeight, topSpaceHeight } = reactData
1284
+ const { modelValue, className, popupClassName, multiple, loading, filterable, showTotalButoon, showCheckedButoon, showClearButton } = props
1285
+ const { initialized, isActivated, isAniVisible, optList, visiblePanel, bodyHeight, topSpaceHeight } = reactData
1221
1286
  const vSize = computeSize.value
1222
1287
  const isDisabled = computeIsDisabled.value
1223
1288
  const selectLabel = computeSelectLabel.value
@@ -1242,6 +1307,7 @@ export default defineVxeComponent({
1242
1307
  }, selectLabel)
1243
1308
  ])
1244
1309
  }
1310
+ const selectVals = XEUtils.eqNull(modelValue) ? [] : (XEUtils.isArray(modelValue) ? modelValue : [modelValue])
1245
1311
  return h('div', {
1246
1312
  ref: refElem,
1247
1313
  class: ['vxe-select', className ? (XEUtils.isFunction(className) ? className({ $select: $xeSelect }) : className) : '', {
@@ -1318,10 +1384,40 @@ export default defineVxeComponent({
1318
1384
  })
1319
1385
  ])
1320
1386
  : renderEmptyElement($xeSelect),
1321
- headerSlot
1387
+ showTotalButoon || (showCheckedButoon && multiple) || showClearButton || headerSlot
1322
1388
  ? h('div', {
1323
1389
  class: 'vxe-select--panel-header'
1324
- }, headerSlot({}))
1390
+ }, headerSlot
1391
+ ? callSlot(headerSlot, {})
1392
+ : [
1393
+ h('div', {
1394
+ class: 'vxe-select--header-button'
1395
+ }, [
1396
+ showTotalButoon
1397
+ ? h('div', {
1398
+ class: 'vxe-select--header-total'
1399
+ }, getI18n('vxe.select.total', [selectVals.length, optList.length]))
1400
+ : renderEmptyElement($xeSelect),
1401
+ h('div', {
1402
+ class: 'vxe-select--header-btns'
1403
+ }, [
1404
+ (showCheckedButoon && multiple)
1405
+ ? h(VxeButtonComponent, {
1406
+ content: getI18n('vxe.select.allChecked'),
1407
+ mode: 'text',
1408
+ onClick: allCheckedPanelEvent
1409
+ })
1410
+ : renderEmptyElement($xeSelect),
1411
+ showClearButton
1412
+ ? h(VxeButtonComponent, {
1413
+ content: getI18n('vxe.select.clear'),
1414
+ mode: 'text',
1415
+ onClick: clearCheckedPanelEvent
1416
+ })
1417
+ : renderEmptyElement($xeSelect)
1418
+ ])
1419
+ ])
1420
+ ])
1325
1421
  : renderEmptyElement($xeSelect),
1326
1422
  h('div', {
1327
1423
  class: 'vxe-select--panel-body'
@@ -1341,7 +1437,7 @@ export default defineVxeComponent({
1341
1437
  ref: refVirtualBody,
1342
1438
  class: 'vxe-select--body',
1343
1439
  style: {
1344
- marginTop: topSpaceHeight ? `${topSpaceHeight}px` : ''
1440
+ transform: `translateY(${topSpaceHeight}px)`
1345
1441
  }
1346
1442
  }, renderOpts())
1347
1443
  ])
@@ -1349,7 +1445,7 @@ export default defineVxeComponent({
1349
1445
  footerSlot
1350
1446
  ? h('div', {
1351
1447
  class: 'vxe-select--panel-footer'
1352
- }, footerSlot({}))
1448
+ }, callSlot(footerSlot, {}))
1353
1449
  : renderEmptyElement($xeSelect)
1354
1450
  ])
1355
1451
  ]