vxe-pc-ui 3.0.0 → 3.0.1

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 (331) hide show
  1. package/es/button/src/button.js +3 -0
  2. package/es/carousel/index.js +12 -0
  3. package/es/carousel/src/carousel-item.js +100 -0
  4. package/es/carousel/src/carousel.js +418 -0
  5. package/es/carousel/src/util.js +17 -0
  6. package/es/carousel/style.css +185 -0
  7. package/es/carousel/style.min.css +1 -0
  8. package/es/carousel-item/index.js +12 -0
  9. package/es/carousel-item/style.css +0 -0
  10. package/es/carousel-item/style.min.css +0 -0
  11. package/es/checkbox/index.js +12 -0
  12. package/es/checkbox/src/checkbox.js +159 -0
  13. package/es/checkbox/src/group.js +154 -0
  14. package/es/checkbox/style.css +117 -0
  15. package/es/checkbox/style.min.css +1 -0
  16. package/es/checkbox-group/index.js +12 -0
  17. package/es/checkbox-group/style.css +0 -0
  18. package/es/checkbox-group/style.min.css +0 -0
  19. package/es/components.js +39 -39
  20. package/es/date-picker/src/date-picker.js +3 -0
  21. package/es/icon/style.css +1 -1
  22. package/es/icon-picker/index.js +12 -0
  23. package/es/icon-picker/src/icon-picker.js +668 -0
  24. package/es/icon-picker/style.css +207 -0
  25. package/es/icon-picker/style.min.css +1 -0
  26. package/es/input/index.js +12 -0
  27. package/es/input/src/input.js +2892 -0
  28. package/es/input/style.css +941 -0
  29. package/es/input/style.min.css +1 -0
  30. package/es/layout-footer/src/layout-footer.js +2 -1
  31. package/es/layout-header/src/layout-header.js +2 -1
  32. package/es/optgroup/index.js +12 -0
  33. package/es/optgroup/style.css +0 -0
  34. package/es/optgroup/style.min.css +0 -0
  35. package/es/option/index.js +12 -0
  36. package/es/option/style.css +0 -0
  37. package/es/option/style.min.css +0 -0
  38. package/es/pager/index.js +12 -0
  39. package/es/pager/src/pager.js +687 -0
  40. package/es/password-input/index.js +12 -0
  41. package/es/password-input/src/password-input.js +388 -0
  42. package/es/password-input/style.css +604 -0
  43. package/es/password-input/style.min.css +1 -0
  44. package/es/pulldown/src/pulldown.js +5 -1
  45. package/es/select/index.js +12 -0
  46. package/es/select/src/optgroup.js +90 -0
  47. package/es/select/src/option-info.js +16 -0
  48. package/es/select/src/option.js +86 -0
  49. package/es/select/src/select.js +1269 -0
  50. package/es/select/src/util.js +35 -0
  51. package/es/select/style.css +207 -0
  52. package/es/select/style.min.css +1 -0
  53. package/es/style.css +1 -1
  54. package/es/style.min.css +1 -1
  55. package/es/tab-pane/index.js +12 -0
  56. package/es/tab-pane/style.css +0 -0
  57. package/es/tab-pane/style.min.css +0 -0
  58. package/es/tabs/index.js +12 -0
  59. package/es/tabs/src/tab-pane.js +119 -0
  60. package/es/tabs/src/tabs.js +593 -0
  61. package/es/tabs/src/util.js +17 -0
  62. package/es/tabs/style.css +342 -0
  63. package/es/tabs/style.min.css +1 -0
  64. package/es/ui/index.js +1 -1
  65. package/es/ui/src/log.js +1 -1
  66. package/es/vxe-carousel/index.js +3 -0
  67. package/es/vxe-carousel/style.css +185 -0
  68. package/es/vxe-carousel/style.min.css +1 -0
  69. package/es/vxe-carousel-item/index.js +3 -0
  70. package/es/vxe-carousel-item/style.css +0 -0
  71. package/es/vxe-carousel-item/style.min.css +0 -0
  72. package/es/vxe-checkbox/index.js +3 -0
  73. package/es/vxe-checkbox/style.css +117 -0
  74. package/es/vxe-checkbox/style.min.css +1 -0
  75. package/es/vxe-checkbox-group/index.js +3 -0
  76. package/es/vxe-checkbox-group/style.css +0 -0
  77. package/es/vxe-checkbox-group/style.min.css +0 -0
  78. package/es/vxe-icon-picker/index.js +3 -0
  79. package/es/vxe-icon-picker/style.css +207 -0
  80. package/es/vxe-icon-picker/style.min.css +1 -0
  81. package/es/vxe-input/index.js +3 -0
  82. package/es/vxe-input/style.css +941 -0
  83. package/es/vxe-input/style.min.css +1 -0
  84. package/es/vxe-optgroup/index.js +3 -0
  85. package/es/vxe-optgroup/style.css +0 -0
  86. package/es/vxe-optgroup/style.min.css +0 -0
  87. package/es/vxe-option/index.js +3 -0
  88. package/es/vxe-option/style.css +0 -0
  89. package/es/vxe-option/style.min.css +0 -0
  90. package/es/vxe-password-input/index.js +3 -0
  91. package/es/vxe-password-input/style.css +604 -0
  92. package/es/vxe-password-input/style.min.css +1 -0
  93. package/es/vxe-select/index.js +3 -0
  94. package/es/vxe-select/style.css +207 -0
  95. package/es/vxe-select/style.min.css +1 -0
  96. package/es/vxe-tab-pane/index.js +3 -0
  97. package/es/vxe-tab-pane/style.css +0 -0
  98. package/es/vxe-tab-pane/style.min.css +0 -0
  99. package/es/vxe-tabs/index.js +3 -0
  100. package/es/vxe-tabs/style.css +342 -0
  101. package/es/vxe-tabs/style.min.css +1 -0
  102. package/lib/button/src/button.js +3 -0
  103. package/lib/button/src/button.min.js +1 -1
  104. package/lib/carousel/index.js +19 -0
  105. package/lib/carousel/index.min.js +1 -0
  106. package/lib/carousel/src/carousel-item.js +107 -0
  107. package/lib/carousel/src/carousel-item.min.js +1 -0
  108. package/lib/carousel/src/carousel.js +437 -0
  109. package/lib/carousel/src/carousel.min.js +1 -0
  110. package/lib/carousel/src/util.js +27 -0
  111. package/lib/carousel/src/util.min.js +1 -0
  112. package/lib/carousel/style/index.js +1 -0
  113. package/lib/carousel/style/style.css +185 -0
  114. package/lib/carousel/style/style.min.css +1 -0
  115. package/lib/carousel-item/index.js +19 -0
  116. package/lib/carousel-item/index.min.js +1 -0
  117. package/lib/carousel-item/style/index.js +1 -0
  118. package/lib/carousel-item/style/style.css +0 -0
  119. package/lib/carousel-item/style/style.min.css +0 -0
  120. package/lib/checkbox/index.js +19 -0
  121. package/lib/checkbox/index.min.js +1 -0
  122. package/lib/checkbox/src/checkbox.js +169 -0
  123. package/lib/checkbox/src/checkbox.min.js +1 -0
  124. package/lib/checkbox/src/group.js +164 -0
  125. package/lib/checkbox/src/group.min.js +1 -0
  126. package/lib/checkbox/style/index.js +1 -0
  127. package/lib/checkbox/style/style.css +117 -0
  128. package/lib/checkbox/style/style.min.css +1 -0
  129. package/lib/checkbox-group/index.js +19 -0
  130. package/lib/checkbox-group/index.min.js +1 -0
  131. package/lib/checkbox-group/style/index.js +1 -0
  132. package/lib/checkbox-group/style/style.css +0 -0
  133. package/lib/checkbox-group/style/style.min.css +0 -0
  134. package/lib/components.js +159 -60
  135. package/lib/components.min.js +1 -1
  136. package/lib/date-picker/src/date-picker.js +3 -0
  137. package/lib/date-picker/src/date-picker.min.js +1 -1
  138. package/lib/icon/style/style.css +1 -1
  139. package/lib/icon/style/style.min.css +1 -1
  140. package/lib/icon-picker/index.js +19 -0
  141. package/lib/icon-picker/index.min.js +1 -0
  142. package/lib/icon-picker/src/icon-picker.js +646 -0
  143. package/lib/icon-picker/src/icon-picker.min.js +1 -0
  144. package/lib/icon-picker/style/index.js +1 -0
  145. package/lib/icon-picker/style/style.css +207 -0
  146. package/lib/icon-picker/style/style.min.css +1 -0
  147. package/lib/index.umd.js +15870 -7738
  148. package/lib/index.umd.min.js +1 -1
  149. package/lib/input/index.js +19 -0
  150. package/lib/input/index.min.js +1 -0
  151. package/lib/input/src/input.js +2897 -0
  152. package/lib/input/src/input.min.js +1 -0
  153. package/lib/input/style/index.js +1 -0
  154. package/lib/input/style/style.css +941 -0
  155. package/lib/input/style/style.min.css +1 -0
  156. package/lib/layout-footer/src/layout-footer.js +2 -1
  157. package/lib/layout-header/src/layout-header.js +2 -1
  158. package/lib/optgroup/index.js +19 -0
  159. package/lib/optgroup/index.min.js +1 -0
  160. package/lib/optgroup/style/index.js +1 -0
  161. package/lib/optgroup/style/style.css +0 -0
  162. package/lib/optgroup/style/style.min.css +0 -0
  163. package/lib/option/index.js +19 -0
  164. package/lib/option/index.min.js +1 -0
  165. package/lib/option/style/index.js +1 -0
  166. package/lib/option/style/style.css +0 -0
  167. package/lib/option/style/style.min.css +0 -0
  168. package/lib/pager/index.js +19 -0
  169. package/lib/pager/index.min.js +1 -0
  170. package/lib/pager/src/pager.js +714 -0
  171. package/lib/pager/src/pager.min.js +1 -0
  172. package/lib/password-input/index.js +19 -0
  173. package/lib/password-input/index.min.js +1 -0
  174. package/lib/password-input/src/password-input.js +398 -0
  175. package/lib/password-input/src/password-input.min.js +1 -0
  176. package/lib/password-input/style/index.js +1 -0
  177. package/lib/password-input/style/style.css +604 -0
  178. package/lib/password-input/style/style.min.css +1 -0
  179. package/lib/pulldown/src/pulldown.js +5 -1
  180. package/lib/pulldown/src/pulldown.min.js +1 -1
  181. package/lib/select/index.js +19 -0
  182. package/lib/select/index.min.js +1 -0
  183. package/lib/select/src/optgroup.js +97 -0
  184. package/lib/select/src/optgroup.min.js +1 -0
  185. package/lib/select/src/option-info.js +33 -0
  186. package/lib/select/src/option-info.min.js +1 -0
  187. package/lib/select/src/option.js +93 -0
  188. package/lib/select/src/option.min.js +1 -0
  189. package/lib/select/src/select.js +1315 -0
  190. package/lib/select/src/select.min.js +1 -0
  191. package/lib/select/src/util.js +50 -0
  192. package/lib/select/src/util.min.js +1 -0
  193. package/lib/select/style/index.js +1 -0
  194. package/lib/select/style/style.css +207 -0
  195. package/lib/select/style/style.min.css +1 -0
  196. package/lib/style.css +1 -1
  197. package/lib/style.min.css +1 -1
  198. package/lib/tab-pane/index.js +19 -0
  199. package/lib/tab-pane/index.min.js +1 -0
  200. package/lib/tab-pane/style/index.js +1 -0
  201. package/lib/tab-pane/style/style.css +0 -0
  202. package/lib/tab-pane/style/style.min.css +0 -0
  203. package/lib/tabs/index.js +19 -0
  204. package/lib/tabs/index.min.js +1 -0
  205. package/lib/tabs/src/tab-pane.js +128 -0
  206. package/lib/tabs/src/tab-pane.min.js +1 -0
  207. package/lib/tabs/src/tabs.js +630 -0
  208. package/lib/tabs/src/tabs.min.js +1 -0
  209. package/lib/tabs/src/util.js +29 -0
  210. package/lib/tabs/src/util.min.js +1 -0
  211. package/lib/tabs/style/index.js +1 -0
  212. package/lib/tabs/style/style.css +342 -0
  213. package/lib/tabs/style/style.min.css +1 -0
  214. package/lib/ui/index.js +1 -1
  215. package/lib/ui/index.min.js +1 -1
  216. package/lib/ui/src/log.js +1 -1
  217. package/lib/ui/src/log.min.js +1 -1
  218. package/lib/vxe-carousel/index.js +23 -0
  219. package/lib/vxe-carousel/index.min.js +1 -0
  220. package/lib/vxe-carousel/style/index.js +1 -0
  221. package/lib/vxe-carousel/style/style.css +185 -0
  222. package/lib/vxe-carousel/style/style.min.css +1 -0
  223. package/lib/vxe-carousel-item/index.js +23 -0
  224. package/lib/vxe-carousel-item/index.min.js +1 -0
  225. package/lib/vxe-carousel-item/style/index.js +1 -0
  226. package/lib/vxe-carousel-item/style/style.css +0 -0
  227. package/lib/vxe-carousel-item/style/style.min.css +0 -0
  228. package/lib/vxe-checkbox/index.js +23 -0
  229. package/lib/vxe-checkbox/index.min.js +1 -0
  230. package/lib/vxe-checkbox/style/index.js +1 -0
  231. package/lib/vxe-checkbox/style/style.css +117 -0
  232. package/lib/vxe-checkbox/style/style.min.css +1 -0
  233. package/lib/vxe-checkbox-group/index.js +23 -0
  234. package/lib/vxe-checkbox-group/index.min.js +1 -0
  235. package/lib/vxe-checkbox-group/style/index.js +1 -0
  236. package/lib/vxe-checkbox-group/style/style.css +0 -0
  237. package/lib/vxe-checkbox-group/style/style.min.css +0 -0
  238. package/lib/vxe-icon-picker/index.js +23 -0
  239. package/lib/vxe-icon-picker/index.min.js +1 -0
  240. package/lib/vxe-icon-picker/style/index.js +1 -0
  241. package/lib/vxe-icon-picker/style/style.css +207 -0
  242. package/lib/vxe-icon-picker/style/style.min.css +1 -0
  243. package/lib/vxe-input/index.js +23 -0
  244. package/lib/vxe-input/index.min.js +1 -0
  245. package/lib/vxe-input/style/index.js +1 -0
  246. package/lib/vxe-input/style/style.css +941 -0
  247. package/lib/vxe-input/style/style.min.css +1 -0
  248. package/lib/vxe-optgroup/index.js +23 -0
  249. package/lib/vxe-optgroup/index.min.js +1 -0
  250. package/lib/vxe-optgroup/style/index.js +1 -0
  251. package/lib/vxe-optgroup/style/style.css +0 -0
  252. package/lib/vxe-optgroup/style/style.min.css +0 -0
  253. package/lib/vxe-option/index.js +23 -0
  254. package/lib/vxe-option/index.min.js +1 -0
  255. package/lib/vxe-option/style/index.js +1 -0
  256. package/lib/vxe-option/style/style.css +0 -0
  257. package/lib/vxe-option/style/style.min.css +0 -0
  258. package/lib/vxe-password-input/index.js +23 -0
  259. package/lib/vxe-password-input/index.min.js +1 -0
  260. package/lib/vxe-password-input/style/index.js +1 -0
  261. package/lib/vxe-password-input/style/style.css +604 -0
  262. package/lib/vxe-password-input/style/style.min.css +1 -0
  263. package/lib/vxe-select/index.js +23 -0
  264. package/lib/vxe-select/index.min.js +1 -0
  265. package/lib/vxe-select/style/index.js +1 -0
  266. package/lib/vxe-select/style/style.css +207 -0
  267. package/lib/vxe-select/style/style.min.css +1 -0
  268. package/lib/vxe-tab-pane/index.js +23 -0
  269. package/lib/vxe-tab-pane/index.min.js +1 -0
  270. package/lib/vxe-tab-pane/style/index.js +1 -0
  271. package/lib/vxe-tab-pane/style/style.css +0 -0
  272. package/lib/vxe-tab-pane/style/style.min.css +0 -0
  273. package/lib/vxe-tabs/index.js +23 -0
  274. package/lib/vxe-tabs/index.min.js +1 -0
  275. package/lib/vxe-tabs/style/index.js +1 -0
  276. package/lib/vxe-tabs/style/style.css +342 -0
  277. package/lib/vxe-tabs/style/style.min.css +1 -0
  278. package/package.json +1 -1
  279. package/packages/button/src/button.ts +3 -0
  280. package/packages/carousel/index.ts +16 -0
  281. package/packages/carousel/src/carousel-item.ts +114 -0
  282. package/packages/carousel/src/carousel.ts +449 -0
  283. package/packages/carousel/src/util.ts +21 -0
  284. package/packages/carousel-item/index.ts +16 -0
  285. package/packages/checkbox/index.ts +16 -0
  286. package/packages/checkbox/src/checkbox.ts +176 -0
  287. package/packages/checkbox/src/group.ts +178 -0
  288. package/packages/checkbox-group/index.ts +16 -0
  289. package/packages/components.ts +39 -39
  290. package/packages/date-picker/src/date-picker.ts +3 -0
  291. package/packages/icon-picker/index.ts +16 -0
  292. package/packages/icon-picker/src/icon-picker.ts +711 -0
  293. package/packages/input/index.ts +16 -0
  294. package/packages/input/src/input.ts +2995 -0
  295. package/packages/layout-footer/src/layout-footer.ts +4 -3
  296. package/packages/layout-header/src/layout-header.ts +2 -1
  297. package/packages/optgroup/index.ts +16 -0
  298. package/packages/option/index.ts +16 -0
  299. package/packages/pager/index.ts +16 -0
  300. package/packages/pager/src/pager.ts +743 -0
  301. package/packages/password-input/index.ts +16 -0
  302. package/packages/password-input/src/password-input.ts +427 -0
  303. package/packages/pulldown/src/pulldown.ts +5 -1
  304. package/packages/select/index.ts +16 -0
  305. package/packages/select/src/optgroup.ts +107 -0
  306. package/packages/select/src/option-info.ts +20 -0
  307. package/packages/select/src/option.ts +103 -0
  308. package/packages/select/src/select.ts +1325 -0
  309. package/packages/select/src/util.ts +46 -0
  310. package/packages/tab-pane/index.ts +16 -0
  311. package/packages/tabs/index.ts +16 -0
  312. package/packages/tabs/src/tab-pane.ts +136 -0
  313. package/packages/tabs/src/tabs.ts +630 -0
  314. package/packages/tabs/src/util.ts +21 -0
  315. package/types/components/carousel.d.ts +5 -0
  316. package/types/components/icon-picker.d.ts +4 -0
  317. package/types/components/input.d.ts +9 -1
  318. package/types/components/optgroup.d.ts +10 -4
  319. package/types/components/tabs.d.ts +4 -0
  320. /package/es/icon/style/{iconfont.1725630285930.ttf → iconfont.1725723159302.ttf} +0 -0
  321. /package/es/icon/style/{iconfont.1725630285930.woff → iconfont.1725723159302.woff} +0 -0
  322. /package/es/icon/style/{iconfont.1725630285930.woff2 → iconfont.1725723159302.woff2} +0 -0
  323. /package/es/{iconfont.1725630285930.ttf → iconfont.1725723159302.ttf} +0 -0
  324. /package/es/{iconfont.1725630285930.woff → iconfont.1725723159302.woff} +0 -0
  325. /package/es/{iconfont.1725630285930.woff2 → iconfont.1725723159302.woff2} +0 -0
  326. /package/lib/icon/style/{iconfont.1725630285930.ttf → iconfont.1725723159302.ttf} +0 -0
  327. /package/lib/icon/style/{iconfont.1725630285930.woff → iconfont.1725723159302.woff} +0 -0
  328. /package/lib/icon/style/{iconfont.1725630285930.woff2 → iconfont.1725723159302.woff2} +0 -0
  329. /package/lib/{iconfont.1725630285930.ttf → iconfont.1725723159302.ttf} +0 -0
  330. /package/lib/{iconfont.1725630285930.woff → iconfont.1725723159302.woff} +0 -0
  331. /package/lib/{iconfont.1725630285930.woff2 → iconfont.1725723159302.woff2} +0 -0
@@ -0,0 +1,1325 @@
1
+ import { PropType, CreateElement, VNode } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import XEUtils from 'xe-utils'
4
+ import { getConfig, getIcon, getI18n, globalEvents, GLOBAL_EVENT_KEYS, createEvent, globalMixins, renderEmptyElement } from '../../ui'
5
+ import { getEventTargetNode, getAbsolutePos } from '../../ui/src/dom'
6
+ import { getLastZIndex, nextZIndex, getFuncText } from '../../ui/src/utils'
7
+ import VxeInputComponent from '../../input/src/input'
8
+ import { getSlotVNs } from '../../ui/src/vn'
9
+
10
+ import type { VxeSelectPropTypes, SelectInternalData, ValueOf, VxeComponentSizeType, SelectReactData, VxeSelectEmits, VxeSelectDefines, VxeOptgroupProps, VxeOptionProps, VxeTableConstructor, VxeDrawerConstructor, VxeDrawerMethods, VxeTablePrivateMethods, VxeFormDefines, VxeFormConstructor, VxeFormPrivateMethods, VxeModalConstructor, VxeModalMethods, VxeInputConstructor } from '../../../types'
11
+
12
+ function isOptionVisible (option: any) {
13
+ return option.visible !== false
14
+ }
15
+
16
+ function getOptUniqueId () {
17
+ return XEUtils.uniqueId('opt_')
18
+ }
19
+
20
+ export default defineVxeComponent({
21
+ name: 'VxeSelect',
22
+ mixins: [
23
+ globalMixins.sizeMixin
24
+ ],
25
+ model: {
26
+ prop: 'value',
27
+ event: 'modelValue'
28
+ },
29
+ props: {
30
+ value: [String, Number, Boolean, Array] as PropType<VxeSelectPropTypes.ModelValue>,
31
+ clearable: Boolean as PropType<VxeSelectPropTypes.Clearable>,
32
+ placeholder: String as PropType<VxeSelectPropTypes.Placeholder>,
33
+ readonly: {
34
+ type: Boolean as PropType<VxeSelectPropTypes.Readonly>,
35
+ default: null
36
+ },
37
+ loading: Boolean as PropType<VxeSelectPropTypes.Loading>,
38
+ disabled: {
39
+ type: Boolean as PropType<VxeSelectPropTypes.Disabled>,
40
+ default: null
41
+ },
42
+ multiple: Boolean as PropType<VxeSelectPropTypes.Multiple>,
43
+ multiCharOverflow: {
44
+ type: [Number, String] as PropType<VxeSelectPropTypes.MultiCharOverflow>,
45
+ default: () => getConfig().select.multiCharOverflow
46
+ },
47
+ prefixIcon: String as PropType<VxeSelectPropTypes.PrefixIcon>,
48
+ placement: String as PropType<VxeSelectPropTypes.Placement>,
49
+ options: Array as PropType<VxeSelectPropTypes.Options>,
50
+ optionProps: Object as PropType<VxeSelectPropTypes.OptionProps>,
51
+ optionGroups: Array as PropType<VxeSelectPropTypes.OptionGroups>,
52
+ optionGroupProps: Object as PropType<VxeSelectPropTypes.OptionGroupProps>,
53
+ optionConfig: Object as PropType<VxeSelectPropTypes.OptionConfig>,
54
+ className: [String, Function] as PropType<VxeSelectPropTypes.ClassName>,
55
+ popupClassName: [String, Function] as PropType<VxeSelectPropTypes.PopupClassName>,
56
+ max: {
57
+ type: [String, Number] as PropType<VxeSelectPropTypes.Max>,
58
+ default: null
59
+ },
60
+ size: {
61
+ type: String as PropType<VxeSelectPropTypes.Size>,
62
+ default: () => getConfig().select.size || getConfig().size
63
+ },
64
+ filterable: Boolean as PropType<VxeSelectPropTypes.Filterable>,
65
+ filterMethod: Function as PropType<VxeSelectPropTypes.FilterMethod>,
66
+ remote: Boolean as PropType<VxeSelectPropTypes.Remote>,
67
+ remoteMethod: Function as PropType<VxeSelectPropTypes.RemoteMethod>,
68
+ emptyText: String as PropType<VxeSelectPropTypes.EmptyText>,
69
+ transfer: {
70
+ type: Boolean as PropType<VxeSelectPropTypes.Transfer>,
71
+ default: null
72
+ },
73
+
74
+ // 已废弃,被 option-config.keyField 替换
75
+ optionId: {
76
+ type: String as PropType<VxeSelectPropTypes.OptionId>,
77
+ default: () => getConfig().select.optionId
78
+ },
79
+ // 已废弃,被 option-config.useKey 替换
80
+ optionKey: Boolean as PropType<VxeSelectPropTypes.OptionKey>
81
+ },
82
+ inject: {
83
+ $xeModal: {
84
+ default: null
85
+ },
86
+ $xeDrawer: {
87
+ default: null
88
+ },
89
+ $xeTable: {
90
+ default: null
91
+ },
92
+ $xeForm: {
93
+ default: null
94
+ },
95
+ formItemInfo: {
96
+ from: 'xeFormItemInfo',
97
+ default: null
98
+ }
99
+ },
100
+ provide () {
101
+ const $xeSelect = this
102
+ return {
103
+ $xeSelect
104
+ }
105
+ },
106
+ data () {
107
+ const xID = XEUtils.uniqueId()
108
+ const reactData: SelectReactData = {
109
+ initialized: false,
110
+ staticOptions: [],
111
+ fullGroupList: [],
112
+ fullOptionList: [],
113
+ visibleGroupList: [],
114
+ visibleOptionList: [],
115
+ remoteValueList: [],
116
+ panelIndex: 0,
117
+ panelStyle: {},
118
+ panelPlacement: null,
119
+ currentOption: null,
120
+ currentValue: null,
121
+ triggerFocusPanel: false,
122
+ visiblePanel: false,
123
+ isAniVisible: false,
124
+ isActivated: false,
125
+ searchValue: '',
126
+ searchLoading: false
127
+ }
128
+ const internalData: SelectInternalData = {
129
+ hpTimeout: undefined
130
+ }
131
+ return {
132
+ xID,
133
+ reactData,
134
+ internalData
135
+ }
136
+ },
137
+ computed: {
138
+ ...({} as {
139
+ computeSize(): VxeComponentSizeType
140
+ $xeModal(): (VxeModalConstructor & VxeModalMethods) | null
141
+ $xeDrawer(): (VxeDrawerConstructor & VxeDrawerMethods) | null
142
+ $xeTable(): (VxeTableConstructor & VxeTablePrivateMethods) | null
143
+ $xeForm(): (VxeFormConstructor & VxeFormPrivateMethods) | null
144
+ formItemInfo(): VxeFormDefines.ProvideItemInfo | null
145
+ }),
146
+ computeFormReadonly () {
147
+ const $xeSelect = this
148
+ const props = $xeSelect
149
+ const $xeForm = $xeSelect.$xeForm
150
+
151
+ const { readonly } = props
152
+ if (readonly === null) {
153
+ if ($xeForm) {
154
+ return $xeForm.readonly
155
+ }
156
+ return false
157
+ }
158
+ return readonly
159
+ },
160
+ computeIsDisabled () {
161
+ const $xeSelect = this
162
+ const props = $xeSelect
163
+ const $xeForm = $xeSelect.$xeForm
164
+
165
+ const { disabled } = props
166
+ if (disabled === null) {
167
+ if ($xeForm) {
168
+ return $xeForm.disabled
169
+ }
170
+ return false
171
+ }
172
+ return disabled
173
+ },
174
+ computeBtnTransfer () {
175
+ const $xeSelect = this
176
+ const props = $xeSelect
177
+ const $xeTable = $xeSelect.$xeTable
178
+ const $xeModal = $xeSelect.$xeModal
179
+ const $xeDrawer = $xeSelect.$xeDrawer
180
+ const $xeForm = $xeSelect.$xeForm
181
+
182
+ const { transfer } = props
183
+ if (transfer === null) {
184
+ const globalTransfer = getConfig().select.transfer
185
+ if (XEUtils.isBoolean(globalTransfer)) {
186
+ return globalTransfer
187
+ }
188
+ if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
189
+ return true
190
+ }
191
+ }
192
+ return transfer
193
+ },
194
+ computeInpPlaceholder () {
195
+ const $xeSelect = this
196
+ const props = $xeSelect
197
+
198
+ const { placeholder } = props
199
+ if (placeholder) {
200
+ return getFuncText(placeholder)
201
+ }
202
+ const globalPlaceholder = getConfig().select.placeholder
203
+ if (globalPlaceholder) {
204
+ return getFuncText(globalPlaceholder)
205
+ }
206
+ return getI18n('vxe.base.pleaseSelect')
207
+ },
208
+ computePropsOpts () {
209
+ const $xeSelect = this
210
+ const props = $xeSelect
211
+
212
+ return Object.assign({}, props.optionProps)
213
+ },
214
+ computeGroupPropsOpts () {
215
+ const $xeSelect = this
216
+ const props = $xeSelect
217
+
218
+ return Object.assign({}, props.optionGroupProps)
219
+ },
220
+ computeLabelField () {
221
+ const $xeSelect = this
222
+
223
+ const propsOpts = $xeSelect.computePropsOpts as VxeSelectPropTypes.OptionProps
224
+ return propsOpts.label || 'label'
225
+ },
226
+ computeValueField () {
227
+ const $xeSelect = this
228
+
229
+ const propsOpts = $xeSelect.computePropsOpts as VxeSelectPropTypes.OptionProps
230
+ return propsOpts.value || 'value'
231
+ },
232
+ computeGroupLabelField () {
233
+ const $xeSelect = this
234
+
235
+ const groupPropsOpts = $xeSelect.computeGroupPropsOpts as VxeSelectPropTypes.OptionGroupProps
236
+ return groupPropsOpts.label || 'label'
237
+ },
238
+ computeGroupOptionsField () {
239
+ const $xeSelect = this
240
+
241
+ const groupPropsOpts = $xeSelect.computeGroupPropsOpts as VxeSelectPropTypes.OptionGroupProps
242
+ return groupPropsOpts.options || 'options'
243
+ },
244
+ computeIsMaximize () {
245
+ const $xeSelect = this
246
+ const props = $xeSelect
247
+
248
+ const { value, multiple, max } = props
249
+ if (multiple && max) {
250
+ return (XEUtils.isArray(value) ? value.length : (XEUtils.eqNull(value) ? 0 : 1)) >= XEUtils.toNumber(max)
251
+ }
252
+ return false
253
+ },
254
+ computeOptionOpts () {
255
+ const $xeSelect = this
256
+ const props = $xeSelect
257
+
258
+ return Object.assign({}, getConfig().select.optionConfig, props.optionConfig)
259
+ },
260
+ computeIsGroup (this: any) {
261
+ const $xeSelect = this
262
+ const reactData = $xeSelect.reactData
263
+
264
+ return reactData.fullGroupList.some((item: any) => item.options && item.options.length)
265
+ },
266
+ computeMultiMaxCharNum () {
267
+ const $xeSelect = this
268
+ const props = $xeSelect
269
+
270
+ return XEUtils.toNumber(props.multiCharOverflow)
271
+ },
272
+ computeSelectLabel (this: any) {
273
+ const $xeSelect = this
274
+ const props = $xeSelect
275
+
276
+ const { value, multiple, remote } = props
277
+ const multiMaxCharNum = $xeSelect.computeMultiMaxCharNum
278
+ if (value && multiple) {
279
+ const vals = XEUtils.isArray(value) ? value : [value]
280
+ if (remote) {
281
+ return vals.map(val => $xeSelect.getRemoteSelectLabel(val)).join(', ')
282
+ }
283
+ return vals.map((val) => {
284
+ const label = $xeSelect.getSelectLabel(val)
285
+ if (multiMaxCharNum > 0 && label.length > multiMaxCharNum) {
286
+ return `${label.substring(0, multiMaxCharNum)}...`
287
+ }
288
+ return label
289
+ }).join(', ')
290
+ }
291
+ if (remote) {
292
+ return $xeSelect.getRemoteSelectLabel(value)
293
+ }
294
+ return $xeSelect.getSelectLabel(value)
295
+ }
296
+ },
297
+ methods: {
298
+ //
299
+ // Method
300
+ //
301
+ dispatchEvent (type: ValueOf<VxeSelectEmits>, params: Record<string, any>, evnt: Event | null) {
302
+ const $xeSelect = this
303
+ $xeSelect.$emit(type, createEvent(evnt, { $select: $xeSelect }, params))
304
+ },
305
+ isPanelVisible () {
306
+ const $xeSelect = this
307
+ const reactData = $xeSelect.reactData
308
+
309
+ return reactData.visiblePanel
310
+ },
311
+ togglePanel () {
312
+ const $xeSelect = this
313
+ const reactData = $xeSelect.reactData
314
+
315
+ if (reactData.visiblePanel) {
316
+ $xeSelect.hideOptionPanel()
317
+ } else {
318
+ $xeSelect.showOptionPanel()
319
+ }
320
+ return $xeSelect.$nextTick()
321
+ },
322
+ hidePanel () {
323
+ const $xeSelect = this
324
+ const reactData = $xeSelect.reactData
325
+
326
+ if (reactData.visiblePanel) {
327
+ $xeSelect.hideOptionPanel()
328
+ }
329
+ return $xeSelect.$nextTick()
330
+ },
331
+ showPanel () {
332
+ const $xeSelect = this
333
+ const reactData = $xeSelect.reactData
334
+
335
+ if (!reactData.visiblePanel) {
336
+ $xeSelect.showOptionPanel()
337
+ }
338
+ return $xeSelect.$nextTick()
339
+ },
340
+ focus () {
341
+ const $xeSelect = this
342
+ const reactData = $xeSelect.reactData
343
+
344
+ const $input = $xeSelect.$refs.refInput as VxeInputConstructor
345
+ reactData.isActivated = true
346
+ $input.blur()
347
+ return $xeSelect.$nextTick()
348
+ },
349
+ blur () {
350
+ const $xeSelect = this
351
+ const reactData = $xeSelect.reactData
352
+
353
+ const $input = $xeSelect.$refs.refInput as VxeInputConstructor
354
+ $input.blur()
355
+ reactData.isActivated = false
356
+ return $xeSelect.$nextTick()
357
+ },
358
+ callSlot (slotFunc: any, params: any) {
359
+ const $xeSelect = this
360
+ const slots = $xeSelect.$scopedSlots
361
+
362
+ if (slotFunc) {
363
+ if (XEUtils.isString(slotFunc)) {
364
+ slotFunc = slots[slotFunc] || null
365
+ }
366
+ if (XEUtils.isFunction(slotFunc)) {
367
+ return getSlotVNs(slotFunc(params))
368
+ }
369
+ }
370
+ return []
371
+ },
372
+ findOption (optionValue: any) {
373
+ const $xeSelect = this
374
+ const reactData = $xeSelect.reactData
375
+
376
+ const { fullOptionList, fullGroupList } = reactData
377
+ const isGroup = $xeSelect.computeIsGroup
378
+ const valueField = $xeSelect.computeValueField as 'value'
379
+ if (isGroup) {
380
+ for (let gIndex = 0; gIndex < fullGroupList.length; gIndex++) {
381
+ const group = fullGroupList[gIndex]
382
+ if (group.options) {
383
+ for (let index = 0; index < group.options.length; index++) {
384
+ const option = group.options[index]
385
+ if (optionValue === option[valueField]) {
386
+ return option
387
+ }
388
+ }
389
+ }
390
+ }
391
+ }
392
+ return fullOptionList.find((item) => optionValue === item[valueField])
393
+ },
394
+ findVisibleOption (optionValue: any) {
395
+ const $xeSelect = this
396
+ const reactData = $xeSelect.reactData
397
+
398
+ const { visibleOptionList, visibleGroupList } = reactData
399
+ const isGroup = $xeSelect.computeIsGroup
400
+ const valueField = $xeSelect.computeValueField as 'value'
401
+ if (isGroup) {
402
+ for (let gIndex = 0; gIndex < visibleGroupList.length; gIndex++) {
403
+ const group = visibleGroupList[gIndex]
404
+ if (group.options) {
405
+ for (let index = 0; index < group.options.length; index++) {
406
+ const option = group.options[index]
407
+ if (optionValue === option[valueField]) {
408
+ return option
409
+ }
410
+ }
411
+ }
412
+ }
413
+ }
414
+ return visibleOptionList.find((item) => optionValue === item[valueField])
415
+ },
416
+ getRemoteSelectLabel (value: any) {
417
+ const $xeSelect = this
418
+ const reactData = $xeSelect.reactData
419
+
420
+ const { remoteValueList } = reactData
421
+ const labelField = $xeSelect.computeLabelField
422
+ const remoteItem = remoteValueList.find(item => value === item.key)
423
+ const item = remoteItem ? remoteItem.result : null
424
+ return XEUtils.toValueString(item ? item[labelField] : value)
425
+ },
426
+ getSelectLabel (value: any) {
427
+ const $xeSelect = this
428
+
429
+ const labelField = $xeSelect.computeLabelField
430
+ const item = $xeSelect.findOption(value)
431
+ return XEUtils.toValueString(item ? item[labelField as 'label'] : value)
432
+ },
433
+ getOptkey () {
434
+ const $xeSelect = this
435
+ const props = $xeSelect
436
+
437
+ const optionOpts = $xeSelect.computeOptionOpts
438
+ return optionOpts.keyField || props.optionId || '_X_OPTION_KEY'
439
+ },
440
+ getOptid (option: any) {
441
+ const $xeSelect = this
442
+
443
+ const optid = option[$xeSelect.getOptkey()]
444
+ return optid ? encodeURIComponent(optid) : ''
445
+ },
446
+ /**
447
+ * 刷新选项,当选项被动态显示/隐藏时可能会用到
448
+ */
449
+ refreshOption () {
450
+ const $xeSelect = this
451
+ const props = $xeSelect
452
+ const reactData = $xeSelect.reactData
453
+
454
+ const { filterable, filterMethod } = props
455
+ const { fullOptionList, fullGroupList, searchValue } = reactData
456
+ const isGroup = $xeSelect.computeIsGroup
457
+ const groupLabelField = $xeSelect.computeGroupLabelField
458
+ const labelField = $xeSelect.computeLabelField
459
+ const searchStr = `${searchValue || ''}`.toLowerCase()
460
+ if (isGroup) {
461
+ if (filterable && filterMethod) {
462
+ reactData.visibleGroupList = fullGroupList.filter(group => isOptionVisible(group) && filterMethod({ group, option: null, searchValue: searchStr }))
463
+ } else if (filterable) {
464
+ reactData.visibleGroupList = fullGroupList.filter(group => isOptionVisible(group) && (!searchStr || `${group[groupLabelField]}`.toLowerCase().indexOf(searchStr) > -1))
465
+ } else {
466
+ reactData.visibleGroupList = fullGroupList.filter(isOptionVisible)
467
+ }
468
+ } else {
469
+ if (filterable && filterMethod) {
470
+ reactData.visibleOptionList = fullOptionList.filter(option => isOptionVisible(option) && filterMethod({ group: null, option, searchValue: searchStr }))
471
+ } else if (filterable) {
472
+ reactData.visibleOptionList = fullOptionList.filter(option => isOptionVisible(option) && (!searchStr || `${option[labelField]}`.toLowerCase().indexOf(searchStr) > -1))
473
+ } else {
474
+ reactData.visibleOptionList = fullOptionList.filter(isOptionVisible)
475
+ }
476
+ }
477
+ return $xeSelect.$nextTick()
478
+ },
479
+ cacheItemMap () {
480
+ const $xeSelect = this
481
+ const reactData = $xeSelect.reactData
482
+
483
+ const { fullOptionList, fullGroupList } = reactData
484
+ const groupOptionsField = $xeSelect.computeGroupOptionsField
485
+ const key = $xeSelect.getOptkey()
486
+ const handleOptis = (item: any) => {
487
+ if (!$xeSelect.getOptid(item)) {
488
+ item[key] = getOptUniqueId()
489
+ }
490
+ }
491
+ if (fullGroupList.length) {
492
+ fullGroupList.forEach((group: any) => {
493
+ handleOptis(group)
494
+ if (group[groupOptionsField]) {
495
+ group[groupOptionsField].forEach(handleOptis)
496
+ }
497
+ })
498
+ } else if (fullOptionList.length) {
499
+ fullOptionList.forEach(handleOptis)
500
+ }
501
+ $xeSelect.refreshOption()
502
+ },
503
+ setCurrentOption (option: any) {
504
+ const $xeSelect = this
505
+ const reactData = $xeSelect.reactData
506
+
507
+ const valueField = $xeSelect.computeValueField
508
+ if (option) {
509
+ reactData.currentOption = option
510
+ reactData.currentValue = option[valueField]
511
+ }
512
+ },
513
+ scrollToOption (option: any, isAlignBottom?: boolean) {
514
+ const $xeSelect = this
515
+
516
+ return $xeSelect.$nextTick().then(() => {
517
+ if (option) {
518
+ const optWrapperElem = $xeSelect.$refs.refOptionWrapper as HTMLDivElement
519
+ const panelElem = $xeSelect.$refs.refOptionPanel as HTMLDivElement
520
+ const optElem = panelElem.querySelector(`[optid='${$xeSelect.getOptid(option)}']`) as HTMLElement
521
+ if (optWrapperElem && optElem) {
522
+ const wrapperHeight = optWrapperElem.offsetHeight
523
+ const offsetPadding = 5
524
+ if (isAlignBottom) {
525
+ if (optElem.offsetTop + optElem.offsetHeight - optWrapperElem.scrollTop > wrapperHeight) {
526
+ optWrapperElem.scrollTop = optElem.offsetTop + optElem.offsetHeight - wrapperHeight
527
+ }
528
+ } else {
529
+ if (optElem.offsetTop + offsetPadding < optWrapperElem.scrollTop || optElem.offsetTop + offsetPadding > optWrapperElem.scrollTop + optWrapperElem.clientHeight) {
530
+ optWrapperElem.scrollTop = optElem.offsetTop - offsetPadding
531
+ }
532
+ }
533
+ }
534
+ }
535
+ })
536
+ },
537
+ updateZindex () {
538
+ const $xeSelect = this
539
+ const reactData = $xeSelect.reactData
540
+
541
+ if (reactData.panelIndex < getLastZIndex()) {
542
+ reactData.panelIndex = nextZIndex()
543
+ }
544
+ },
545
+ updatePlacement () {
546
+ const $xeSelect = this
547
+ const props = $xeSelect
548
+ const reactData = $xeSelect.reactData
549
+
550
+ return $xeSelect.$nextTick().then(() => {
551
+ const { placement } = props
552
+ const { panelIndex } = reactData
553
+ const el = $xeSelect.$refs.refElem as HTMLDivElement
554
+ const panelElem = $xeSelect.$refs.refOptionPanel as HTMLDivElement
555
+ const btnTransfer = $xeSelect.computeBtnTransfer
556
+ if (panelElem && el) {
557
+ const targetHeight = el.offsetHeight
558
+ const targetWidth = el.offsetWidth
559
+ const panelHeight = panelElem.offsetHeight
560
+ const panelWidth = panelElem.offsetWidth
561
+ const marginSize = 5
562
+ const panelStyle: { [key: string]: any } = {
563
+ zIndex: panelIndex
564
+ }
565
+ const { boundingTop, boundingLeft, visibleHeight, visibleWidth } = getAbsolutePos(el)
566
+ let panelPlacement = 'bottom'
567
+ if (btnTransfer) {
568
+ let left = boundingLeft
569
+ let top = boundingTop + targetHeight
570
+ if (placement === 'top') {
571
+ panelPlacement = 'top'
572
+ top = boundingTop - panelHeight
573
+ } else if (!placement) {
574
+ // 如果下面不够放,则向上
575
+ if (top + panelHeight + marginSize > visibleHeight) {
576
+ panelPlacement = 'top'
577
+ top = boundingTop - panelHeight
578
+ }
579
+ // 如果上面不够放,则向下(优先)
580
+ if (top < marginSize) {
581
+ panelPlacement = 'bottom'
582
+ top = boundingTop + targetHeight
583
+ }
584
+ }
585
+ // 如果溢出右边
586
+ if (left + panelWidth + marginSize > visibleWidth) {
587
+ left -= left + panelWidth + marginSize - visibleWidth
588
+ }
589
+ // 如果溢出左边
590
+ if (left < marginSize) {
591
+ left = marginSize
592
+ }
593
+ Object.assign(panelStyle, {
594
+ left: `${left}px`,
595
+ top: `${top}px`,
596
+ minWidth: `${targetWidth}px`
597
+ })
598
+ } else {
599
+ if (placement === 'top') {
600
+ panelPlacement = 'top'
601
+ panelStyle.bottom = `${targetHeight}px`
602
+ } else if (!placement) {
603
+ // 如果下面不够放,则向上
604
+ if (boundingTop + targetHeight + panelHeight > visibleHeight) {
605
+ // 如果上面不够放,则向下(优先)
606
+ if (boundingTop - targetHeight - panelHeight > marginSize) {
607
+ panelPlacement = 'top'
608
+ panelStyle.bottom = `${targetHeight}px`
609
+ }
610
+ }
611
+ }
612
+ }
613
+ reactData.panelStyle = panelStyle
614
+ reactData.panelPlacement = panelPlacement
615
+ return $xeSelect.$nextTick()
616
+ }
617
+ })
618
+ },
619
+ showOptionPanel () {
620
+ const $xeSelect = this
621
+ const props = $xeSelect
622
+ const reactData = $xeSelect.reactData
623
+ const internalData = $xeSelect.internalData
624
+
625
+ const { loading, filterable } = props
626
+ const { hpTimeout } = internalData
627
+ const isDisabled = $xeSelect.computeIsDisabled
628
+ if (!loading && !isDisabled) {
629
+ if (hpTimeout) {
630
+ clearTimeout(hpTimeout)
631
+ internalData.hpTimeout = undefined
632
+ }
633
+ if (!reactData.initialized) {
634
+ reactData.initialized = true
635
+ }
636
+ reactData.isActivated = true
637
+ reactData.isAniVisible = true
638
+ if (filterable) {
639
+ $xeSelect.refreshOption()
640
+ }
641
+ setTimeout(() => {
642
+ const { value } = props
643
+ const currOption = $xeSelect.findOption(XEUtils.isArray(value) ? value[0] : value)
644
+ reactData.visiblePanel = true
645
+ if (currOption) {
646
+ $xeSelect.setCurrentOption(currOption)
647
+ $xeSelect.scrollToOption(currOption)
648
+ }
649
+ $xeSelect.handleFocusSearch()
650
+ }, 10)
651
+ $xeSelect.updateZindex()
652
+ $xeSelect.updatePlacement()
653
+ }
654
+ },
655
+ hideOptionPanel () {
656
+ const $xeSelect = this
657
+ const reactData = $xeSelect.reactData
658
+ const internalData = $xeSelect.internalData
659
+
660
+ reactData.searchValue = ''
661
+ reactData.searchLoading = false
662
+ reactData.visiblePanel = false
663
+ internalData.hpTimeout = window.setTimeout(() => {
664
+ reactData.isAniVisible = false
665
+ }, 350)
666
+ },
667
+ changeEvent (evnt: Event, selectValue: any) {
668
+ const $xeSelect = this
669
+ const props = $xeSelect
670
+ const $xeForm = $xeSelect.$xeForm
671
+ const formItemInfo = $xeSelect.formItemInfo
672
+
673
+ if (selectValue !== props.value) {
674
+ $xeSelect.$emit('modelValue', selectValue)
675
+ $xeSelect.dispatchEvent('change', { value: selectValue }, evnt)
676
+ // 自动更新校验状态
677
+ if ($xeForm && formItemInfo) {
678
+ $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, selectValue)
679
+ }
680
+ }
681
+ },
682
+ clearValueEvent (evnt: Event, selectValue: any) {
683
+ const $xeSelect = this
684
+ const reactData = $xeSelect.reactData
685
+
686
+ reactData.remoteValueList = []
687
+ $xeSelect.changeEvent(evnt, selectValue)
688
+ $xeSelect.dispatchEvent('clear', { value: selectValue }, evnt)
689
+ },
690
+ clearEvent (params: any, evnt: Event) {
691
+ const $xeSelect = this
692
+
693
+ $xeSelect.clearValueEvent(evnt, null)
694
+ $xeSelect.hideOptionPanel()
695
+ },
696
+ changeOptionEvent (evnt: Event, selectValue: any, option: any) {
697
+ const $xeSelect = this
698
+ const props = $xeSelect
699
+ const reactData = $xeSelect.reactData
700
+
701
+ const { value, multiple } = props
702
+ const { remoteValueList } = reactData
703
+ if (multiple) {
704
+ let multipleValue: any[] = []
705
+ const selectVals = XEUtils.eqNull(value) ? [] : (XEUtils.isArray(value) ? value : [value])
706
+ const index = XEUtils.findIndexOf(selectVals, val => val === selectValue)
707
+ if (index === -1) {
708
+ multipleValue = selectVals.concat([selectValue])
709
+ } else {
710
+ multipleValue = selectVals.filter((val) => val !== selectValue)
711
+ }
712
+ const remoteItem = remoteValueList.find(item => item.key === selectValue)
713
+ if (remoteItem) {
714
+ remoteItem.result = option
715
+ } else {
716
+ remoteValueList.push({ key: selectValue, result: option })
717
+ }
718
+ $xeSelect.changeEvent(evnt, multipleValue)
719
+ } else {
720
+ reactData.remoteValueList = [{ key: selectValue, result: option }]
721
+ $xeSelect.changeEvent(evnt, selectValue)
722
+ $xeSelect.hideOptionPanel()
723
+ }
724
+ },
725
+ handleGlobalMousewheelEvent (evnt: MouseEvent) {
726
+ const $xeSelect = this
727
+ const reactData = $xeSelect.reactData
728
+
729
+ const { visiblePanel } = reactData
730
+ const isDisabled = $xeSelect.computeIsDisabled
731
+ if (!isDisabled) {
732
+ if (visiblePanel) {
733
+ const panelElem = $xeSelect.$refs.refOptionPanel as HTMLDivElement
734
+ if (getEventTargetNode(evnt, panelElem).flag) {
735
+ $xeSelect.updatePlacement()
736
+ } else {
737
+ $xeSelect.hideOptionPanel()
738
+ }
739
+ }
740
+ }
741
+ },
742
+ handleGlobalMousedownEvent (evnt: MouseEvent) {
743
+ const $xeSelect = this
744
+ const reactData = $xeSelect.reactData
745
+
746
+ const { visiblePanel } = reactData
747
+ const isDisabled = $xeSelect.computeIsDisabled
748
+ if (!isDisabled) {
749
+ const el = $xeSelect.$refs.refElem as HTMLDivElement
750
+ const panelElem = $xeSelect.$refs.refOptionPanel as HTMLDivElement
751
+ reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelElem).flag
752
+ if (visiblePanel && !reactData.isActivated) {
753
+ $xeSelect.hideOptionPanel()
754
+ }
755
+ }
756
+ },
757
+ findOffsetOption (optionValue: any, isUpArrow: boolean) {
758
+ const $xeSelect = this
759
+ const reactData = $xeSelect.reactData
760
+
761
+ const { visibleOptionList, visibleGroupList } = reactData
762
+ const isGroup = $xeSelect.computeIsGroup
763
+ const valueField = $xeSelect.computeValueField as 'value'
764
+ const groupOptionsField = $xeSelect.computeGroupOptionsField as 'options'
765
+ let firstOption
766
+ let prevOption
767
+ let nextOption
768
+ let currOption
769
+ if (isGroup) {
770
+ for (let gIndex = 0; gIndex < visibleGroupList.length; gIndex++) {
771
+ const group = visibleGroupList[gIndex]
772
+ const groupOptionList = group[groupOptionsField]
773
+ const isGroupDisabled = group.disabled
774
+ if (groupOptionList) {
775
+ for (let index = 0; index < groupOptionList.length; index++) {
776
+ const option = groupOptionList[index]
777
+ const isVisible = isOptionVisible(option)
778
+ const isDisabled = isGroupDisabled || option.disabled
779
+ if (!firstOption && !isDisabled) {
780
+ firstOption = option
781
+ }
782
+ if (currOption) {
783
+ if (isVisible && !isDisabled) {
784
+ nextOption = option
785
+ if (!isUpArrow) {
786
+ return { offsetOption: nextOption }
787
+ }
788
+ }
789
+ }
790
+ if (optionValue === option[valueField]) {
791
+ currOption = option
792
+ if (isUpArrow) {
793
+ return { offsetOption: prevOption }
794
+ }
795
+ } else {
796
+ if (isVisible && !isDisabled) {
797
+ prevOption = option
798
+ }
799
+ }
800
+ }
801
+ }
802
+ }
803
+ } else {
804
+ for (let index = 0; index < visibleOptionList.length; index++) {
805
+ const option = visibleOptionList[index]
806
+ const isDisabled = option.disabled
807
+ if (!firstOption && !isDisabled) {
808
+ firstOption = option
809
+ }
810
+ if (currOption) {
811
+ if (!isDisabled) {
812
+ nextOption = option
813
+ if (!isUpArrow) {
814
+ return { offsetOption: nextOption }
815
+ }
816
+ }
817
+ }
818
+ if (optionValue === option[valueField]) {
819
+ currOption = option
820
+ if (isUpArrow) {
821
+ return { offsetOption: prevOption }
822
+ }
823
+ } else {
824
+ if (!isDisabled) {
825
+ prevOption = option
826
+ }
827
+ }
828
+ }
829
+ }
830
+ return { firstOption }
831
+ },
832
+ handleGlobalKeydownEvent (evnt: KeyboardEvent) {
833
+ const $xeSelect = this
834
+ const props = $xeSelect
835
+ const reactData = $xeSelect.reactData
836
+
837
+ const { clearable } = props
838
+ const { visiblePanel, currentValue, currentOption } = reactData
839
+ const isDisabled = $xeSelect.computeIsDisabled
840
+ if (!isDisabled) {
841
+ const isTab = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.TAB)
842
+ const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER)
843
+ const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
844
+ const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
845
+ const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
846
+ const isDel = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.DELETE)
847
+ const isSpacebar = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.SPACEBAR)
848
+ if (isTab) {
849
+ reactData.isActivated = false
850
+ }
851
+ if (visiblePanel) {
852
+ if (isEsc || isTab) {
853
+ $xeSelect.hideOptionPanel()
854
+ } else if (isEnter) {
855
+ evnt.preventDefault()
856
+ evnt.stopPropagation()
857
+ $xeSelect.changeOptionEvent(evnt, currentValue, currentOption)
858
+ } else if (isUpArrow || isDwArrow) {
859
+ evnt.preventDefault()
860
+ let { firstOption, offsetOption } = $xeSelect.findOffsetOption(currentValue, isUpArrow)
861
+ if (!offsetOption && !$xeSelect.findVisibleOption(currentValue)) {
862
+ offsetOption = firstOption
863
+ }
864
+ $xeSelect.setCurrentOption(offsetOption)
865
+ $xeSelect.scrollToOption(offsetOption, isDwArrow)
866
+ } else if (isSpacebar) {
867
+ evnt.preventDefault()
868
+ }
869
+ } else if ((isUpArrow || isDwArrow || isEnter || isSpacebar) && reactData.isActivated) {
870
+ evnt.preventDefault()
871
+ $xeSelect.showOptionPanel()
872
+ }
873
+ if (reactData.isActivated) {
874
+ if (isDel && clearable) {
875
+ $xeSelect.clearValueEvent(evnt, null)
876
+ }
877
+ }
878
+ }
879
+ },
880
+ handleGlobalBlurEvent () {
881
+ const $xeSelect = this
882
+
883
+ $xeSelect.hideOptionPanel()
884
+ },
885
+ handleFocusSearch () {
886
+ const $xeSelect = this
887
+ const props = $xeSelect
888
+
889
+ if (props.filterable) {
890
+ $xeSelect.$nextTick(() => {
891
+ const inpSearch = $xeSelect.$refs.refInpSearch as VxeInputConstructor
892
+ if (inpSearch) {
893
+ inpSearch.focus()
894
+ }
895
+ })
896
+ }
897
+ },
898
+ focusEvent (evnt: FocusEvent) {
899
+ const $xeSelect = this
900
+ const reactData = $xeSelect.reactData
901
+
902
+ const isDisabled = $xeSelect.computeIsDisabled
903
+ if (!isDisabled) {
904
+ if (!reactData.visiblePanel) {
905
+ reactData.triggerFocusPanel = true
906
+ $xeSelect.showOptionPanel()
907
+ setTimeout(() => {
908
+ reactData.triggerFocusPanel = false
909
+ }, 150)
910
+ }
911
+ }
912
+ $xeSelect.dispatchEvent('focus', {}, evnt)
913
+ },
914
+ clickEvent (evnt: MouseEvent) {
915
+ const $xeSelect = this
916
+
917
+ $xeSelect.togglePanelEvent(evnt)
918
+ $xeSelect.dispatchEvent('click', {}, evnt)
919
+ },
920
+ blurEvent (evnt: FocusEvent) {
921
+ const $xeSelect = this
922
+ const reactData = $xeSelect.reactData
923
+
924
+ reactData.isActivated = false
925
+ $xeSelect.dispatchEvent('blur', {}, evnt)
926
+ },
927
+ modelSearchEvent (value: string) {
928
+ const $xeSelect = this
929
+ const reactData = $xeSelect.reactData
930
+
931
+ reactData.searchValue = value
932
+ },
933
+ focusSearchEvent () {
934
+ const $xeSelect = this
935
+ const reactData = $xeSelect.reactData
936
+
937
+ reactData.isActivated = true
938
+ },
939
+ handleSearchEvent () {
940
+ const $xeSelect = this
941
+ const props = $xeSelect
942
+ const reactData = $xeSelect.reactData
943
+
944
+ const { remote, remoteMethod } = props
945
+ const { searchValue } = reactData
946
+ if (remote && remoteMethod) {
947
+ reactData.searchLoading = true
948
+ Promise.resolve(
949
+ remoteMethod({ searchValue })
950
+ ).then(() => $xeSelect.$nextTick())
951
+ .catch(() => $xeSelect.$nextTick())
952
+ .finally(() => {
953
+ reactData.searchLoading = false
954
+ $xeSelect.refreshOption()
955
+ })
956
+ } else {
957
+ $xeSelect.refreshOption()
958
+ }
959
+ },
960
+ triggerSearchEvent: XEUtils.debounce(function (this: any) {
961
+ const $xeSelect = this
962
+
963
+ $xeSelect.handleSearchEvent()
964
+ }, 350, { trailing: true }),
965
+ togglePanelEvent (params: any) {
966
+ const $xeSelect = this
967
+ const reactData = $xeSelect.reactData
968
+
969
+ const { $event } = params
970
+ $event.preventDefault()
971
+ if (reactData.triggerFocusPanel) {
972
+ reactData.triggerFocusPanel = false
973
+ } else {
974
+ if (reactData.visiblePanel) {
975
+ $xeSelect.hideOptionPanel()
976
+ } else {
977
+ $xeSelect.showOptionPanel()
978
+ }
979
+ }
980
+ },
981
+ checkOptionDisabled (isSelected: any, option: VxeOptionProps, group?: VxeOptgroupProps) {
982
+ const $xeSelect = this
983
+
984
+ if (option.disabled) {
985
+ return true
986
+ }
987
+ if (group && group.disabled) {
988
+ return true
989
+ }
990
+ const isMaximize = $xeSelect.computeIsMaximize
991
+ if (isMaximize && !isSelected) {
992
+ return true
993
+ }
994
+ return false
995
+ },
996
+
997
+ //
998
+ // Render
999
+ //
1000
+ renderOption (h: CreateElement, list: VxeOptionProps[], group?: VxeOptgroupProps) {
1001
+ const $xeSelect = this
1002
+ const props = $xeSelect
1003
+ const slots = $xeSelect.$scopedSlots
1004
+ const reactData = $xeSelect.reactData
1005
+
1006
+ const { optionKey, value } = props
1007
+ const { currentValue } = reactData
1008
+ const optionOpts = $xeSelect.computeOptionOpts
1009
+ const labelField = $xeSelect.computeLabelField
1010
+ const valueField = $xeSelect.computeValueField
1011
+ const isGroup = $xeSelect.computeIsGroup
1012
+ const { useKey } = optionOpts
1013
+ const optionSlot = slots.option
1014
+ return list.map((option, cIndex) => {
1015
+ const { slots, className } = option
1016
+ const optionValue = option[valueField as 'value']
1017
+ const isSelected = XEUtils.isArray(value) ? value.indexOf(optionValue) > -1 : value === optionValue
1018
+ const isVisible = !isGroup || isOptionVisible(option)
1019
+ const isDisabled = $xeSelect.checkOptionDisabled(isSelected, option, group)
1020
+ const optid = $xeSelect.getOptid(option)
1021
+ const defaultSlot = slots ? slots.default : null
1022
+ const optParams = { option, group: null, $select: $xeSelect }
1023
+ return isVisible
1024
+ ? h('div', {
1025
+ key: useKey || optionKey ? optid : cIndex,
1026
+ class: ['vxe-select-option', className ? (XEUtils.isFunction(className) ? className(optParams) : className) : '', {
1027
+ 'is--disabled': isDisabled,
1028
+ 'is--selected': isSelected,
1029
+ 'is--hover': currentValue === optionValue
1030
+ }],
1031
+ attrs: {
1032
+ optid: optid
1033
+ },
1034
+ on: {
1035
+ mousedown: (evnt: MouseEvent) => {
1036
+ const isLeftBtn = evnt.button === 0
1037
+ if (isLeftBtn) {
1038
+ evnt.stopPropagation()
1039
+ }
1040
+ },
1041
+ click: (evnt: MouseEvent) => {
1042
+ if (!isDisabled) {
1043
+ $xeSelect.changeOptionEvent(evnt, optionValue, option)
1044
+ }
1045
+ },
1046
+ mouseenter: () => {
1047
+ if (!isDisabled) {
1048
+ $xeSelect.setCurrentOption(option)
1049
+ }
1050
+ }
1051
+ }
1052
+ }, optionSlot ? $xeSelect.callSlot(optionSlot, optParams) : (defaultSlot ? $xeSelect.callSlot(defaultSlot, optParams) : getFuncText(option[labelField as 'label'])))
1053
+ : renderEmptyElement($xeSelect)
1054
+ })
1055
+ },
1056
+ renderOptgroup (h: CreateElement) {
1057
+ const $xeSelect = this
1058
+ const props = $xeSelect
1059
+ const slots = $xeSelect.$scopedSlots
1060
+ const reactData = $xeSelect.reactData
1061
+
1062
+ const { optionKey } = props
1063
+ const { visibleGroupList } = reactData
1064
+ const optionOpts = $xeSelect.computeOptionOpts
1065
+ const groupLabelField = $xeSelect.computeGroupLabelField
1066
+ const groupOptionsField = $xeSelect.computeGroupOptionsField
1067
+ const { useKey } = optionOpts
1068
+ const optionSlot = slots.option
1069
+ return visibleGroupList.map((group, gIndex) => {
1070
+ const { slots, className } = group
1071
+ const optid = $xeSelect.getOptid(group)
1072
+ const isGroupDisabled = group.disabled
1073
+ const defaultSlot = slots ? slots.default : null
1074
+ const optParams = { option: group, group, $select: $xeSelect }
1075
+ return h('div', {
1076
+ key: useKey || optionKey ? optid : gIndex,
1077
+ class: ['vxe-optgroup', className ? (XEUtils.isFunction(className) ? className(optParams) : className) : '', {
1078
+ 'is--disabled': isGroupDisabled
1079
+ }],
1080
+ attrs: {
1081
+ optid: optid
1082
+ }
1083
+ }, [
1084
+ h('div', {
1085
+ class: 'vxe-optgroup--title'
1086
+ }, optionSlot ? $xeSelect.callSlot(optionSlot, optParams) : (defaultSlot ? $xeSelect.callSlot(defaultSlot, optParams) : getFuncText(group[groupLabelField as 'label']))),
1087
+ h('div', {
1088
+ class: 'vxe-optgroup--wrapper'
1089
+ }, $xeSelect.renderOption(h, group[groupOptionsField as 'options'] || [], group))
1090
+ ])
1091
+ })
1092
+ },
1093
+ renderOpts (h: CreateElement): VNode[] {
1094
+ const $xeSelect = this
1095
+ const props = $xeSelect
1096
+ const reactData = $xeSelect.reactData
1097
+
1098
+ const { visibleGroupList, visibleOptionList, searchLoading } = reactData
1099
+ const isGroup = $xeSelect.computeIsGroup
1100
+ if (searchLoading) {
1101
+ return [
1102
+ h('div', {
1103
+ class: 'vxe-select--search-loading'
1104
+ }, [
1105
+ h('i', {
1106
+ class: ['vxe-select--search-icon', getIcon().SELECT_LOADED]
1107
+ }),
1108
+ h('span', {
1109
+ class: 'vxe-select--search-text'
1110
+ }, getI18n('vxe.select.loadingText'))
1111
+ ])
1112
+ ]
1113
+ }
1114
+ if (isGroup) {
1115
+ if (visibleGroupList.length) {
1116
+ return $xeSelect.renderOptgroup(h)
1117
+ }
1118
+ } else {
1119
+ if (visibleOptionList.length) {
1120
+ return $xeSelect.renderOption(h, visibleOptionList)
1121
+ }
1122
+ }
1123
+ return [
1124
+ h('div', {
1125
+ class: 'vxe-select--empty-placeholder'
1126
+ }, props.emptyText || getI18n('vxe.select.emptyText'))
1127
+ ]
1128
+ },
1129
+ renderVN (h: CreateElement): VNode {
1130
+ const $xeSelect = this
1131
+ const props = $xeSelect
1132
+ const slots = $xeSelect.$scopedSlots
1133
+ const reactData = $xeSelect.reactData
1134
+
1135
+ const { className, popupClassName, loading, filterable } = props
1136
+ const { initialized, isActivated, visiblePanel } = reactData
1137
+ const vSize = $xeSelect.computeSize
1138
+ const isDisabled = $xeSelect.computeIsDisabled
1139
+ const selectLabel = $xeSelect.computeSelectLabel
1140
+ const btnTransfer = $xeSelect.computeBtnTransfer
1141
+ const formReadonly = $xeSelect.computeFormReadonly
1142
+ const inpPlaceholder = $xeSelect.computeInpPlaceholder
1143
+ const defaultSlot = slots.default
1144
+ const headerSlot = slots.header
1145
+ const footerSlot = slots.footer
1146
+ const prefixSlot = slots.prefix
1147
+ if (formReadonly) {
1148
+ return h('div', {
1149
+ ref: 'refElem',
1150
+ class: ['vxe-select--readonly', className]
1151
+ }, [
1152
+ h('div', {
1153
+ class: 'vxe-select-slots',
1154
+ ref: 'hideOption'
1155
+ }, defaultSlot ? defaultSlot({}) : []),
1156
+ h('span', {
1157
+ class: 'vxe-select-label'
1158
+ }, [selectLabel])
1159
+ ])
1160
+ }
1161
+ return h('div', {
1162
+ ref: 'refElem',
1163
+ class: ['vxe-select', className ? (XEUtils.isFunction(className) ? className({ $select: $xeSelect }) : className) : '', {
1164
+ [`size--${vSize}`]: vSize,
1165
+ 'is--visible': visiblePanel,
1166
+ 'is--disabled': isDisabled,
1167
+ 'is--filter': filterable,
1168
+ 'is--loading': loading,
1169
+ 'is--active': isActivated
1170
+ }]
1171
+ }, [
1172
+ h('div', {
1173
+ class: 'vxe-select-slots',
1174
+ ref: 'hideOption'
1175
+ }, defaultSlot ? defaultSlot({}) : []),
1176
+ h(VxeInputComponent, {
1177
+ ref: 'refInput',
1178
+ props: {
1179
+ clearable: props.clearable,
1180
+ placeholder: inpPlaceholder,
1181
+ readonly: true,
1182
+ disabled: isDisabled,
1183
+ type: 'text',
1184
+ prefixIcon: props.prefixIcon,
1185
+ suffixIcon: loading ? getIcon().SELECT_LOADED : (visiblePanel ? getIcon().SELECT_OPEN : getIcon().SELECT_CLOSE),
1186
+ value: selectLabel
1187
+ },
1188
+ on: {
1189
+ clear: $xeSelect.clearEvent,
1190
+ click: $xeSelect.clickEvent,
1191
+ focus: $xeSelect.focusEvent,
1192
+ blur: $xeSelect.blurEvent,
1193
+ suffixClick: $xeSelect.togglePanelEvent
1194
+ },
1195
+ scopedSlots: prefixSlot
1196
+ ? {
1197
+ prefix: () => prefixSlot({})
1198
+ }
1199
+ : {}
1200
+ }),
1201
+ h('div', {
1202
+ ref: 'refOptionPanel',
1203
+ class: ['vxe-table--ignore-clear vxe-select--panel', popupClassName ? (XEUtils.isFunction(popupClassName) ? popupClassName({ $select: $xeSelect }) : popupClassName) : '', {
1204
+ [`size--${vSize}`]: vSize,
1205
+ 'is--transfer': btnTransfer,
1206
+ 'ani--leave': !loading && reactData.isAniVisible,
1207
+ 'ani--enter': !loading && visiblePanel
1208
+ }],
1209
+ attrs: {
1210
+ placement: reactData.panelPlacement
1211
+ },
1212
+ style: reactData.panelStyle
1213
+ }, initialized
1214
+ ? [
1215
+ filterable
1216
+ ? h('div', {
1217
+ class: 'vxe-select--panel-search'
1218
+ }, [
1219
+ h(VxeInputComponent, {
1220
+ ref: 'refInpSearch',
1221
+ class: 'vxe-select-search--input',
1222
+ props: {
1223
+ value: reactData.searchValue,
1224
+ clearable: true,
1225
+ placeholder: getI18n('vxe.select.search'),
1226
+ prefixIcon: getIcon().INPUT_SEARCH
1227
+ },
1228
+ on: {
1229
+ modelValue: $xeSelect.modelSearchEvent,
1230
+ focus: $xeSelect.focusSearchEvent,
1231
+ change: $xeSelect.triggerSearchEvent,
1232
+ search: $xeSelect.triggerSearchEvent
1233
+ }
1234
+ })
1235
+ ])
1236
+ : renderEmptyElement($xeSelect),
1237
+ h('div', {
1238
+ class: 'vxe-select--panel-wrapper'
1239
+ }, [
1240
+ headerSlot
1241
+ ? h('div', {
1242
+ class: 'vxe-select--panel-header'
1243
+ }, headerSlot({}))
1244
+ : renderEmptyElement($xeSelect),
1245
+ h('div', {
1246
+ class: 'vxe-select--panel-body'
1247
+ }, [
1248
+ h('div', {
1249
+ ref: 'refOptionWrapper',
1250
+ class: 'vxe-select-option--wrapper'
1251
+ }, $xeSelect.renderOpts(h))
1252
+ ]),
1253
+ footerSlot
1254
+ ? h('div', {
1255
+ class: 'vxe-select--panel-footer'
1256
+ }, footerSlot({}))
1257
+ : renderEmptyElement($xeSelect)
1258
+ ])
1259
+ ]
1260
+ : [])
1261
+ ])
1262
+ }
1263
+ },
1264
+ watch: {
1265
+ 'reactData.staticOptions' (val: VxeSelectDefines.OptionInfo[]) {
1266
+ const $xeSelect = this
1267
+ const reactData = $xeSelect.reactData
1268
+
1269
+ if (val.some((item) => item.options && item.options.length)) {
1270
+ reactData.fullOptionList = []
1271
+ reactData.fullGroupList = val
1272
+ } else {
1273
+ reactData.fullGroupList = []
1274
+ reactData.fullOptionList = val || []
1275
+ }
1276
+ $xeSelect.cacheItemMap()
1277
+ },
1278
+ options (val) {
1279
+ const $xeSelect = this
1280
+ const reactData = $xeSelect.reactData
1281
+
1282
+ reactData.fullGroupList = []
1283
+ reactData.fullOptionList = val || []
1284
+ $xeSelect.cacheItemMap()
1285
+ },
1286
+ optionGroups (val) {
1287
+ const $xeSelect = this
1288
+ const reactData = $xeSelect.reactData
1289
+
1290
+ reactData.fullOptionList = []
1291
+ reactData.fullGroupList = val || []
1292
+ $xeSelect.cacheItemMap()
1293
+ }
1294
+ },
1295
+ mounted () {
1296
+ const $xeSelect = this
1297
+ const props = $xeSelect
1298
+ const reactData = $xeSelect.reactData
1299
+
1300
+ $xeSelect.$nextTick(() => {
1301
+ const { options, optionGroups } = props
1302
+ if (optionGroups) {
1303
+ reactData.fullGroupList = optionGroups
1304
+ } else if (options) {
1305
+ reactData.fullOptionList = options
1306
+ }
1307
+ $xeSelect.cacheItemMap()
1308
+ })
1309
+ globalEvents.on($xeSelect, 'mousewheel', $xeSelect.handleGlobalMousewheelEvent)
1310
+ globalEvents.on($xeSelect, 'mousedown', $xeSelect.handleGlobalMousedownEvent)
1311
+ globalEvents.on($xeSelect, 'keydown', $xeSelect.handleGlobalKeydownEvent)
1312
+ globalEvents.on($xeSelect, 'blur', $xeSelect.handleGlobalBlurEvent)
1313
+ },
1314
+ beforeDestroy () {
1315
+ const $xeSelect = this
1316
+
1317
+ globalEvents.off($xeSelect, 'mousewheel')
1318
+ globalEvents.off($xeSelect, 'mousedown')
1319
+ globalEvents.off($xeSelect, 'keydown')
1320
+ globalEvents.off($xeSelect, 'blur')
1321
+ },
1322
+ render (this: any, h) {
1323
+ return this.renderVN(h)
1324
+ }
1325
+ })