vxe-pc-ui 3.13.11 → 3.13.13

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 (674) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +134 -134
  3. package/es/icon/style.css +1 -1
  4. package/es/style.css +1 -1
  5. package/es/style.min.css +1 -1
  6. package/es/tag/style.css +1 -3
  7. package/es/tag/style.min.css +1 -1
  8. package/es/ui/index.js +1 -1
  9. package/es/ui/src/log.js +1 -1
  10. package/es/vxe-tag/style.css +1 -3
  11. package/es/vxe-tag/style.min.css +1 -1
  12. package/lib/components.js +2 -1
  13. package/lib/components.min.js +1 -1
  14. package/lib/drawer/index.js +2 -1
  15. package/lib/drawer/index.min.js +1 -1
  16. package/lib/icon/style/style.css +1 -1
  17. package/lib/icon/style/style.min.css +1 -1
  18. package/lib/index.common.js +2 -1
  19. package/lib/index.umd.js +7962 -8834
  20. package/lib/index.umd.min.js +1 -1
  21. package/lib/modal/index.js +2 -1
  22. package/lib/modal/index.min.js +1 -1
  23. package/lib/style.css +1 -1
  24. package/lib/style.min.css +1 -1
  25. package/lib/tag/style/style.css +1 -3
  26. package/lib/tag/style/style.min.css +1 -1
  27. package/lib/ui/index.js +1 -1
  28. package/lib/ui/index.min.js +1 -1
  29. package/lib/ui/src/log.js +1 -1
  30. package/lib/ui/src/log.min.js +1 -1
  31. package/lib/vxe-alert/index.js +2 -1
  32. package/lib/vxe-alert/index.min.js +1 -1
  33. package/lib/vxe-anchor/index.js +2 -1
  34. package/lib/vxe-anchor/index.min.js +1 -1
  35. package/lib/vxe-anchor-link/index.js +2 -1
  36. package/lib/vxe-anchor-link/index.min.js +1 -1
  37. package/lib/vxe-avatar/index.js +2 -1
  38. package/lib/vxe-avatar/index.min.js +1 -1
  39. package/lib/vxe-backtop/index.js +2 -1
  40. package/lib/vxe-backtop/index.min.js +1 -1
  41. package/lib/vxe-badge/index.js +2 -1
  42. package/lib/vxe-badge/index.min.js +1 -1
  43. package/lib/vxe-breadcrumb/index.js +2 -1
  44. package/lib/vxe-breadcrumb/index.min.js +1 -1
  45. package/lib/vxe-breadcrumb-item/index.js +2 -1
  46. package/lib/vxe-breadcrumb-item/index.min.js +1 -1
  47. package/lib/vxe-button/index.js +2 -1
  48. package/lib/vxe-button/index.min.js +1 -1
  49. package/lib/vxe-button-group/index.js +2 -1
  50. package/lib/vxe-button-group/index.min.js +1 -1
  51. package/lib/vxe-calendar/index.js +2 -1
  52. package/lib/vxe-calendar/index.min.js +1 -1
  53. package/lib/vxe-card/index.js +2 -1
  54. package/lib/vxe-card/index.min.js +1 -1
  55. package/lib/vxe-carousel/index.js +2 -1
  56. package/lib/vxe-carousel/index.min.js +1 -1
  57. package/lib/vxe-carousel-item/index.js +2 -1
  58. package/lib/vxe-carousel-item/index.min.js +1 -1
  59. package/lib/vxe-cascader/index.js +2 -1
  60. package/lib/vxe-cascader/index.min.js +1 -1
  61. package/lib/vxe-checkbox/index.js +2 -1
  62. package/lib/vxe-checkbox/index.min.js +1 -1
  63. package/lib/vxe-checkbox-button/index.js +2 -1
  64. package/lib/vxe-checkbox-button/index.min.js +1 -1
  65. package/lib/vxe-checkbox-group/index.js +2 -1
  66. package/lib/vxe-checkbox-group/index.min.js +1 -1
  67. package/lib/vxe-col/index.js +2 -1
  68. package/lib/vxe-col/index.min.js +1 -1
  69. package/lib/vxe-collapse/index.js +2 -1
  70. package/lib/vxe-collapse/index.min.js +1 -1
  71. package/lib/vxe-collapse-pane/index.js +2 -1
  72. package/lib/vxe-collapse-pane/index.min.js +1 -1
  73. package/lib/vxe-color-picker/index.js +2 -1
  74. package/lib/vxe-color-picker/index.min.js +1 -1
  75. package/lib/vxe-context-menu/index.js +2 -1
  76. package/lib/vxe-context-menu/index.min.js +1 -1
  77. package/lib/vxe-countdown/index.js +2 -1
  78. package/lib/vxe-countdown/index.min.js +1 -1
  79. package/lib/vxe-date-panel/index.js +2 -1
  80. package/lib/vxe-date-panel/index.min.js +1 -1
  81. package/lib/vxe-date-picker/index.js +2 -1
  82. package/lib/vxe-date-picker/index.min.js +1 -1
  83. package/lib/vxe-date-range-picker/index.js +2 -1
  84. package/lib/vxe-date-range-picker/index.min.js +1 -1
  85. package/lib/vxe-drawer/index.js +2 -1
  86. package/lib/vxe-drawer/index.min.js +1 -1
  87. package/lib/vxe-empty/index.js +2 -1
  88. package/lib/vxe-empty/index.min.js +1 -1
  89. package/lib/vxe-form/index.js +2 -1
  90. package/lib/vxe-form/index.min.js +1 -1
  91. package/lib/vxe-form-gather/index.js +2 -1
  92. package/lib/vxe-form-gather/index.min.js +1 -1
  93. package/lib/vxe-form-group/index.js +2 -1
  94. package/lib/vxe-form-group/index.min.js +1 -1
  95. package/lib/vxe-form-item/index.js +2 -1
  96. package/lib/vxe-form-item/index.min.js +1 -1
  97. package/lib/vxe-icon/index.js +2 -1
  98. package/lib/vxe-icon/index.min.js +1 -1
  99. package/lib/vxe-icon-picker/index.js +2 -1
  100. package/lib/vxe-icon-picker/index.min.js +1 -1
  101. package/lib/vxe-image/index.js +2 -1
  102. package/lib/vxe-image/index.min.js +1 -1
  103. package/lib/vxe-image-group/index.js +2 -1
  104. package/lib/vxe-image-group/index.min.js +1 -1
  105. package/lib/vxe-image-preview/index.js +2 -1
  106. package/lib/vxe-image-preview/index.min.js +1 -1
  107. package/lib/vxe-input/index.js +2 -1
  108. package/lib/vxe-input/index.min.js +1 -1
  109. package/lib/vxe-layout-aside/index.js +2 -1
  110. package/lib/vxe-layout-aside/index.min.js +1 -1
  111. package/lib/vxe-layout-body/index.js +2 -1
  112. package/lib/vxe-layout-body/index.min.js +1 -1
  113. package/lib/vxe-layout-container/index.js +2 -1
  114. package/lib/vxe-layout-container/index.min.js +1 -1
  115. package/lib/vxe-layout-footer/index.js +2 -1
  116. package/lib/vxe-layout-footer/index.min.js +1 -1
  117. package/lib/vxe-layout-header/index.js +2 -1
  118. package/lib/vxe-layout-header/index.min.js +1 -1
  119. package/lib/vxe-link/index.js +2 -1
  120. package/lib/vxe-link/index.min.js +1 -1
  121. package/lib/vxe-list/index.js +2 -1
  122. package/lib/vxe-list/index.min.js +1 -1
  123. package/lib/vxe-loading/index.js +2 -1
  124. package/lib/vxe-loading/index.min.js +1 -1
  125. package/lib/vxe-mention/index.js +2 -1
  126. package/lib/vxe-mention/index.min.js +1 -1
  127. package/lib/vxe-menu/index.js +2 -1
  128. package/lib/vxe-menu/index.min.js +1 -1
  129. package/lib/vxe-modal/index.js +2 -1
  130. package/lib/vxe-modal/index.min.js +1 -1
  131. package/lib/vxe-notice-bar/index.js +2 -1
  132. package/lib/vxe-notice-bar/index.min.js +1 -1
  133. package/lib/vxe-number-input/index.js +2 -1
  134. package/lib/vxe-number-input/index.min.js +1 -1
  135. package/lib/vxe-optgroup/index.js +2 -1
  136. package/lib/vxe-optgroup/index.min.js +1 -1
  137. package/lib/vxe-option/index.js +2 -1
  138. package/lib/vxe-option/index.min.js +1 -1
  139. package/lib/vxe-pager/index.js +2 -1
  140. package/lib/vxe-pager/index.min.js +1 -1
  141. package/lib/vxe-password-input/index.js +2 -1
  142. package/lib/vxe-password-input/index.min.js +1 -1
  143. package/lib/vxe-print/index.js +2 -1
  144. package/lib/vxe-print/index.min.js +1 -1
  145. package/lib/vxe-print-page-break/index.js +2 -1
  146. package/lib/vxe-print-page-break/index.min.js +1 -1
  147. package/lib/vxe-pulldown/index.js +2 -1
  148. package/lib/vxe-pulldown/index.min.js +1 -1
  149. package/lib/vxe-radio/index.js +2 -1
  150. package/lib/vxe-radio/index.min.js +1 -1
  151. package/lib/vxe-radio-button/index.js +2 -1
  152. package/lib/vxe-radio-button/index.min.js +1 -1
  153. package/lib/vxe-radio-group/index.js +2 -1
  154. package/lib/vxe-radio-group/index.min.js +1 -1
  155. package/lib/vxe-rate/index.js +2 -1
  156. package/lib/vxe-rate/index.min.js +1 -1
  157. package/lib/vxe-result/index.js +2 -1
  158. package/lib/vxe-result/index.min.js +1 -1
  159. package/lib/vxe-row/index.js +2 -1
  160. package/lib/vxe-row/index.min.js +1 -1
  161. package/lib/vxe-segmented/index.js +2 -1
  162. package/lib/vxe-segmented/index.min.js +1 -1
  163. package/lib/vxe-select/index.js +2 -1
  164. package/lib/vxe-select/index.min.js +1 -1
  165. package/lib/vxe-slider/index.js +2 -1
  166. package/lib/vxe-slider/index.min.js +1 -1
  167. package/lib/vxe-split/index.js +2 -1
  168. package/lib/vxe-split/index.min.js +1 -1
  169. package/lib/vxe-split-pane/index.js +2 -1
  170. package/lib/vxe-split-pane/index.min.js +1 -1
  171. package/lib/vxe-splitter/index.js +2 -1
  172. package/lib/vxe-splitter/index.min.js +1 -1
  173. package/lib/vxe-splitter-panel/index.js +2 -1
  174. package/lib/vxe-splitter-panel/index.min.js +1 -1
  175. package/lib/vxe-steps/index.js +2 -1
  176. package/lib/vxe-steps/index.min.js +1 -1
  177. package/lib/vxe-switch/index.js +2 -1
  178. package/lib/vxe-switch/index.min.js +1 -1
  179. package/lib/vxe-tab-pane/index.js +2 -1
  180. package/lib/vxe-tab-pane/index.min.js +1 -1
  181. package/lib/vxe-table-select/index.js +2 -1
  182. package/lib/vxe-table-select/index.min.js +1 -1
  183. package/lib/vxe-tabs/index.js +2 -1
  184. package/lib/vxe-tabs/index.min.js +1 -1
  185. package/lib/vxe-tag/index.js +2 -1
  186. package/lib/vxe-tag/index.min.js +1 -1
  187. package/lib/vxe-tag/style/style.css +1 -3
  188. package/lib/vxe-tag/style/style.min.css +1 -1
  189. package/lib/vxe-text/index.js +2 -1
  190. package/lib/vxe-text/index.min.js +1 -1
  191. package/lib/vxe-text-ellipsis/index.js +2 -1
  192. package/lib/vxe-text-ellipsis/index.min.js +1 -1
  193. package/lib/vxe-textarea/index.js +2 -1
  194. package/lib/vxe-textarea/index.min.js +1 -1
  195. package/lib/vxe-timeline/index.js +2 -1
  196. package/lib/vxe-timeline/index.min.js +1 -1
  197. package/lib/vxe-timeline-item/index.js +2 -1
  198. package/lib/vxe-timeline-item/index.min.js +1 -1
  199. package/lib/vxe-tip/index.js +2 -1
  200. package/lib/vxe-tip/index.min.js +1 -1
  201. package/lib/vxe-tooltip/index.js +2 -1
  202. package/lib/vxe-tooltip/index.min.js +1 -1
  203. package/lib/vxe-tour/index.js +2 -1
  204. package/lib/vxe-tour/index.min.js +1 -1
  205. package/lib/vxe-tree/index.js +2 -1
  206. package/lib/vxe-tree/index.min.js +1 -1
  207. package/lib/vxe-tree-select/index.js +2 -1
  208. package/lib/vxe-tree-select/index.min.js +1 -1
  209. package/lib/vxe-u-i/index.js +2 -1
  210. package/lib/vxe-u-i/index.min.js +1 -1
  211. package/lib/vxe-ui/index.js +2 -1
  212. package/lib/vxe-ui/index.min.js +1 -1
  213. package/lib/vxe-upload/index.js +2 -1
  214. package/lib/vxe-upload/index.min.js +1 -1
  215. package/lib/vxe-watermark/index.js +2 -1
  216. package/lib/vxe-watermark/index.min.js +1 -1
  217. package/package.json +89 -89
  218. package/packages/alert/index.ts +16 -16
  219. package/packages/alert/src/alert.ts +106 -106
  220. package/packages/anchor/index.ts +16 -16
  221. package/packages/anchor/src/anchor-link.ts +158 -158
  222. package/packages/anchor/src/anchor.ts +267 -267
  223. package/packages/anchor/src/util.ts +23 -23
  224. package/packages/anchor-link/index.ts +16 -16
  225. package/packages/avatar/index.ts +16 -16
  226. package/packages/avatar/src/avatar.ts +141 -141
  227. package/packages/backtop/index.ts +16 -16
  228. package/packages/backtop/src/backtop.ts +330 -330
  229. package/packages/badge/index.ts +16 -16
  230. package/packages/badge/src/badge.ts +87 -87
  231. package/packages/breadcrumb/index.ts +16 -16
  232. package/packages/breadcrumb/src/breadcrumb-item.ts +118 -118
  233. package/packages/breadcrumb/src/breadcrumb.ts +89 -89
  234. package/packages/breadcrumb-item/index.ts +16 -16
  235. package/packages/button/index.ts +16 -16
  236. package/packages/button/src/button-group.ts +113 -113
  237. package/packages/button/src/button.ts +955 -955
  238. package/packages/button-group/index.ts +16 -16
  239. package/packages/calendar/index.ts +16 -16
  240. package/packages/calendar/src/calendar.ts +1527 -1527
  241. package/packages/card/index.ts +16 -16
  242. package/packages/card/src/card.ts +162 -162
  243. package/packages/carousel/index.ts +16 -16
  244. package/packages/carousel/src/carousel-item.ts +117 -117
  245. package/packages/carousel/src/carousel.ts +460 -460
  246. package/packages/carousel/src/util.ts +21 -21
  247. package/packages/carousel-item/index.ts +16 -16
  248. package/packages/cascader/index.ts +16 -16
  249. package/packages/cascader/src/cascader.ts +941 -941
  250. package/packages/checkbox/index.ts +16 -16
  251. package/packages/checkbox/src/button.ts +185 -185
  252. package/packages/checkbox/src/checkbox.ts +189 -189
  253. package/packages/checkbox/src/group.ts +259 -259
  254. package/packages/checkbox-button/index.ts +16 -16
  255. package/packages/checkbox-group/index.ts +16 -16
  256. package/packages/col/index.ts +16 -16
  257. package/packages/collapse/index.ts +16 -16
  258. package/packages/collapse/src/collapse-pane.ts +136 -136
  259. package/packages/collapse/src/collapse.ts +259 -259
  260. package/packages/collapse/src/util.ts +21 -21
  261. package/packages/collapse-pane/index.ts +16 -16
  262. package/packages/color-picker/index.ts +16 -16
  263. package/packages/color-picker/src/color-picker.ts +1277 -1277
  264. package/packages/color-picker/src/util.ts +198 -198
  265. package/packages/components.ts +307 -307
  266. package/packages/context-menu/index.ts +54 -54
  267. package/packages/context-menu/src/context-menu.ts +709 -709
  268. package/packages/countdown/index.ts +16 -16
  269. package/packages/countdown/src/countdown.ts +276 -276
  270. package/packages/date-panel/index.ts +16 -16
  271. package/packages/date-panel/src/date-panel.ts +2024 -2024
  272. package/packages/date-panel/src/util.ts +244 -244
  273. package/packages/date-picker/index.ts +17 -17
  274. package/packages/date-picker/src/date-picker.ts +1238 -1238
  275. package/packages/date-range-picker/index.ts +16 -16
  276. package/packages/date-range-picker/src/date-range-picker.ts +1466 -1466
  277. package/packages/drawer/index.ts +87 -87
  278. package/packages/drawer/src/drawer.ts +767 -767
  279. package/packages/dynamics/index.ts +125 -125
  280. package/packages/empty/index.ts +16 -16
  281. package/packages/empty/src/empty.ts +80 -80
  282. package/packages/form/index.ts +16 -16
  283. package/packages/form/render/index.ts +617 -617
  284. package/packages/form/src/form-config-item.ts +86 -86
  285. package/packages/form/src/form-group.ts +125 -125
  286. package/packages/form/src/form-item.ts +217 -217
  287. package/packages/form/src/form.ts +1032 -1032
  288. package/packages/form/src/itemInfo.ts +80 -80
  289. package/packages/form/src/render.ts +398 -398
  290. package/packages/form/src/util.ts +92 -92
  291. package/packages/form-gather/index.ts +18 -18
  292. package/packages/form-group/index.ts +16 -16
  293. package/packages/form-item/index.ts +16 -16
  294. package/packages/icon/index.ts +16 -16
  295. package/packages/icon/src/icon.ts +75 -75
  296. package/packages/icon-picker/index.ts +16 -16
  297. package/packages/icon-picker/src/icon-picker.ts +752 -752
  298. package/packages/image/index.ts +16 -16
  299. package/packages/image/src/group.ts +162 -162
  300. package/packages/image/src/image.ts +286 -286
  301. package/packages/image/src/preview.ts +737 -737
  302. package/packages/image/src/util.ts +62 -62
  303. package/packages/image-group/index.ts +16 -16
  304. package/packages/image-preview/index.ts +19 -19
  305. package/packages/index.ts +8 -8
  306. package/packages/input/index.ts +16 -16
  307. package/packages/input/src/input.ts +3187 -3187
  308. package/packages/language/ar-EG.ts +832 -832
  309. package/packages/language/de-DE.ts +832 -832
  310. package/packages/language/en-US.ts +832 -832
  311. package/packages/language/es-ES.ts +832 -832
  312. package/packages/language/fr-FR.ts +832 -832
  313. package/packages/language/hu-HU.ts +832 -832
  314. package/packages/language/hy-AM.ts +832 -832
  315. package/packages/language/id-ID.ts +832 -832
  316. package/packages/language/it-IT.ts +832 -832
  317. package/packages/language/ja-JP.ts +832 -832
  318. package/packages/language/ko-KR.ts +832 -832
  319. package/packages/language/ms-MY.ts +832 -832
  320. package/packages/language/nb-NO.ts +832 -832
  321. package/packages/language/pt-BR.ts +832 -832
  322. package/packages/language/ru-RU.ts +832 -832
  323. package/packages/language/th-TH.ts +832 -832
  324. package/packages/language/ug-CN.ts +832 -832
  325. package/packages/language/uk-UA.ts +832 -832
  326. package/packages/language/uz-UZ.ts +832 -832
  327. package/packages/language/vi-VN.ts +832 -832
  328. package/packages/language/zh-CHT.ts +832 -832
  329. package/packages/language/zh-CN.ts +832 -832
  330. package/packages/language/zh-HK.ts +3 -3
  331. package/packages/language/zh-MO.ts +3 -3
  332. package/packages/language/zh-TC.ts +3 -3
  333. package/packages/language/zh-TW.ts +3 -3
  334. package/packages/layout-aside/index.ts +16 -16
  335. package/packages/layout-aside/src/layout-aside.ts +115 -115
  336. package/packages/layout-body/index.ts +16 -16
  337. package/packages/layout-body/src/layout-body.ts +137 -137
  338. package/packages/layout-container/index.ts +16 -16
  339. package/packages/layout-container/src/layout-container.ts +65 -65
  340. package/packages/layout-footer/index.ts +16 -16
  341. package/packages/layout-footer/src/layout-footer.ts +53 -53
  342. package/packages/layout-header/index.ts +16 -16
  343. package/packages/layout-header/src/layout-header.ts +49 -49
  344. package/packages/link/index.ts +16 -16
  345. package/packages/link/src/link.ts +153 -153
  346. package/packages/list/index.ts +16 -16
  347. package/packages/list/src/list.ts +492 -492
  348. package/packages/loading/index.ts +34 -34
  349. package/packages/loading/src/loading.ts +162 -162
  350. package/packages/mention/index.ts +16 -16
  351. package/packages/mention/src/mention.ts +54 -54
  352. package/packages/menu/index.ts +16 -16
  353. package/packages/menu/src/menu.ts +632 -632
  354. package/packages/modal/index.ts +150 -150
  355. package/packages/modal/src/modal.ts +1657 -1657
  356. package/packages/notice-bar/index.ts +16 -16
  357. package/packages/notice-bar/src/notice-bar.ts +182 -182
  358. package/packages/number-input/index.ts +16 -16
  359. package/packages/number-input/src/number-input.ts +1255 -1255
  360. package/packages/number-input/src/util.ts +12 -12
  361. package/packages/optgroup/index.ts +16 -16
  362. package/packages/option/index.ts +16 -16
  363. package/packages/pager/index.ts +16 -16
  364. package/packages/pager/src/pager.ts +913 -913
  365. package/packages/password-input/index.ts +16 -16
  366. package/packages/password-input/src/password-input.ts +466 -466
  367. package/packages/print/index.ts +18 -18
  368. package/packages/print/src/page-break.ts +78 -78
  369. package/packages/print/src/print.ts +266 -266
  370. package/packages/print/src/util.ts +284 -284
  371. package/packages/print-page-break/index.ts +14 -14
  372. package/packages/pulldown/index.ts +16 -16
  373. package/packages/pulldown/src/pulldown.ts +532 -532
  374. package/packages/radio/index.ts +16 -16
  375. package/packages/radio/src/button.ts +221 -221
  376. package/packages/radio/src/group.ts +252 -252
  377. package/packages/radio/src/radio.ts +228 -228
  378. package/packages/radio-button/index.ts +16 -16
  379. package/packages/radio-group/index.ts +16 -16
  380. package/packages/rate/index.ts +16 -16
  381. package/packages/rate/src/rate.ts +199 -199
  382. package/packages/result/index.ts +16 -16
  383. package/packages/result/src/result.ts +93 -93
  384. package/packages/row/index.ts +16 -16
  385. package/packages/row/src/col.ts +130 -130
  386. package/packages/row/src/row.ts +106 -106
  387. package/packages/segmented/index.ts +16 -16
  388. package/packages/segmented/src/segmented.ts +281 -281
  389. package/packages/select/index.ts +16 -16
  390. package/packages/select/src/optgroup.ts +107 -107
  391. package/packages/select/src/option-info.ts +20 -20
  392. package/packages/select/src/option.ts +103 -103
  393. package/packages/select/src/select.ts +2000 -2000
  394. package/packages/select/src/util.ts +47 -47
  395. package/packages/slider/index.ts +16 -16
  396. package/packages/slider/src/slider.ts +332 -332
  397. package/packages/split/index.ts +16 -16
  398. package/packages/split-pane/index.ts +17 -17
  399. package/packages/splitter/index.ts +16 -16
  400. package/packages/splitter/src/splitter-panel.ts +171 -171
  401. package/packages/splitter/src/splitter.ts +1032 -1032
  402. package/packages/splitter/src/util.ts +21 -21
  403. package/packages/splitter-panel/index.ts +16 -16
  404. package/packages/steps/index.ts +16 -16
  405. package/packages/steps/src/steps.ts +57 -57
  406. package/packages/switch/index.ts +16 -16
  407. package/packages/switch/src/switch.ts +279 -279
  408. package/packages/tab-pane/index.ts +16 -16
  409. package/packages/table-select/index.ts +16 -16
  410. package/packages/table-select/src/table-select.ts +903 -903
  411. package/packages/tabs/index.ts +16 -16
  412. package/packages/tabs/src/tab-pane.ts +137 -137
  413. package/packages/tabs/src/tabs.ts +1014 -1014
  414. package/packages/tabs/src/util.ts +21 -21
  415. package/packages/tag/index.ts +16 -16
  416. package/packages/tag/src/tag.ts +195 -195
  417. package/packages/text/index.ts +16 -16
  418. package/packages/text/src/text.ts +267 -267
  419. package/packages/text-ellipsis/index.ts +16 -16
  420. package/packages/text-ellipsis/src/text-ellipsis.ts +291 -291
  421. package/packages/textarea/index.ts +16 -16
  422. package/packages/textarea/src/textarea.ts +436 -436
  423. package/packages/timeline/index.ts +16 -16
  424. package/packages/timeline/src/timeline-item.ts +41 -41
  425. package/packages/timeline/src/timeline.ts +54 -54
  426. package/packages/timeline-item/index.ts +16 -16
  427. package/packages/tip/index.ts +19 -19
  428. package/packages/tip/src/tip.ts +112 -112
  429. package/packages/tooltip/index.ts +16 -16
  430. package/packages/tooltip/src/tooltip.ts +641 -641
  431. package/packages/tour/index.ts +16 -16
  432. package/packages/tour/src/tour.ts +54 -54
  433. package/packages/tree/index.ts +16 -16
  434. package/packages/tree/src/store.ts +15 -15
  435. package/packages/tree/src/tree.ts +3080 -3080
  436. package/packages/tree/src/util.ts +44 -44
  437. package/packages/tree-select/index.ts +16 -16
  438. package/packages/tree-select/src/tree-select.ts +1115 -1115
  439. package/packages/ui/index.ts +695 -695
  440. package/packages/ui/src/anime.ts +52 -52
  441. package/packages/ui/src/comp.ts +3 -3
  442. package/packages/ui/src/dom.ts +263 -263
  443. package/packages/ui/src/log.ts +6 -6
  444. package/packages/ui/src/utils.ts +49 -49
  445. package/packages/ui/src/vn.ts +60 -60
  446. package/packages/upload/index.ts +20 -20
  447. package/packages/upload/src/upload.ts +2127 -2127
  448. package/packages/upload/src/util.ts +109 -109
  449. package/packages/vxe-u-i/index.ts +4 -4
  450. package/packages/watermark/index.ts +31 -31
  451. package/packages/watermark/src/util.ts +176 -176
  452. package/packages/watermark/src/watermark.ts +166 -166
  453. package/styles/all.scss +90 -90
  454. package/styles/base.scss +16 -16
  455. package/styles/components/alert.scss +101 -101
  456. package/styles/components/anchor.scss +44 -44
  457. package/styles/components/avatar.scss +115 -115
  458. package/styles/components/backtop.scss +82 -82
  459. package/styles/components/badge.scss +45 -45
  460. package/styles/components/breadcrumb.scss +29 -29
  461. package/styles/components/button-group.scss +30 -30
  462. package/styles/components/button.scss +415 -415
  463. package/styles/components/calendar.scss +471 -471
  464. package/styles/components/card.scss +121 -121
  465. package/styles/components/carousel.scss +184 -184
  466. package/styles/components/cascader.scss +140 -140
  467. package/styles/components/checkbox-button.scss +57 -57
  468. package/styles/components/checkbox.scss +81 -81
  469. package/styles/components/collapse.scss +56 -56
  470. package/styles/components/color-picker.scss +409 -409
  471. package/styles/components/context-menu.scss +102 -102
  472. package/styles/components/countdown.scss +35 -35
  473. package/styles/components/date-panel.scss +505 -505
  474. package/styles/components/date-picker.scss +247 -247
  475. package/styles/components/date-range-picker.scss +252 -252
  476. package/styles/components/drawer.scss +298 -298
  477. package/styles/components/empty.scss +79 -79
  478. package/styles/components/form.scss +668 -668
  479. package/styles/components/icon-picker.scss +211 -211
  480. package/styles/components/icon.scss +1044 -1044
  481. package/styles/components/image-group.scss +2 -2
  482. package/styles/components/image-preview.scss +215 -215
  483. package/styles/components/image.scss +16 -16
  484. package/styles/components/input.scss +846 -846
  485. package/styles/components/layout-aside.scss +22 -22
  486. package/styles/components/layout-body.scss +14 -14
  487. package/styles/components/layout-container.scss +13 -13
  488. package/styles/components/layout-footer.scss +14 -14
  489. package/styles/components/layout-header.scss +11 -11
  490. package/styles/components/link.scss +115 -115
  491. package/styles/components/list.scss +40 -40
  492. package/styles/components/loading.scss +137 -137
  493. package/styles/components/menu.scss +150 -150
  494. package/styles/components/modal.scss +480 -480
  495. package/styles/components/notice-bar.scss +91 -91
  496. package/styles/components/number-input.scss +283 -283
  497. package/styles/components/old-icon.scss +4 -4
  498. package/styles/components/pager.scss +282 -282
  499. package/styles/components/password-input.scss +374 -374
  500. package/styles/components/print.scss +3 -3
  501. package/styles/components/pulldown.scss +75 -75
  502. package/styles/components/radio-button.scss +57 -57
  503. package/styles/components/radio.scss +79 -79
  504. package/styles/components/rate.scss +76 -76
  505. package/styles/components/result.scss +91 -91
  506. package/styles/components/row.scss +69 -69
  507. package/styles/components/segmented.scss +215 -215
  508. package/styles/components/select.scss +244 -244
  509. package/styles/components/slider.scss +139 -139
  510. package/styles/components/split.scss +1 -1
  511. package/styles/components/splitter.scss +318 -318
  512. package/styles/components/switch.scss +128 -128
  513. package/styles/components/table-select.scss +105 -105
  514. package/styles/components/tabs.scss +745 -745
  515. package/styles/components/tag.scss +184 -184
  516. package/styles/components/text-ellipsis.scss +130 -130
  517. package/styles/components/text.scss +123 -123
  518. package/styles/components/textarea.scss +106 -106
  519. package/styles/components/tip.scss +97 -97
  520. package/styles/components/tooltip.scss +140 -140
  521. package/styles/components/tree-select.scss +166 -166
  522. package/styles/components/tree.scss +294 -294
  523. package/styles/components/upload.scss +497 -497
  524. package/styles/components/watermark.scss +26 -26
  525. package/styles/helpers/baseMixin.scss +95 -95
  526. package/styles/helpers/baseVar.scss +3 -3
  527. package/styles/helpers/placement.scss +38 -38
  528. package/styles/theme/base.scss +214 -214
  529. package/styles/theme/dark.scss +119 -119
  530. package/styles/theme/light.scss +118 -118
  531. package/styles/variable.scss +111 -111
  532. package/types/all.d.ts +328 -328
  533. package/types/components/alert.d.ts +80 -80
  534. package/types/components/anchor-link.d.ts +84 -84
  535. package/types/components/anchor.d.ts +84 -84
  536. package/types/components/avatar.d.ts +81 -81
  537. package/types/components/backtop.d.ts +115 -115
  538. package/types/components/badge.d.ts +69 -69
  539. package/types/components/breadcrumb-item.d.ts +73 -73
  540. package/types/components/breadcrumb.d.ts +80 -80
  541. package/types/components/button-group.d.ts +113 -113
  542. package/types/components/button.d.ts +314 -314
  543. package/types/components/calendar.d.ts +254 -254
  544. package/types/components/card.d.ts +86 -86
  545. package/types/components/carousel-item.d.ts +68 -68
  546. package/types/components/carousel.d.ts +126 -126
  547. package/types/components/cascader.d.ts +242 -242
  548. package/types/components/checkbox-button.d.ts +93 -93
  549. package/types/components/checkbox-group.d.ts +135 -135
  550. package/types/components/checkbox.d.ts +115 -115
  551. package/types/components/col.d.ts +73 -73
  552. package/types/components/colgroup.d.ts +131 -131
  553. package/types/components/collapse-pane.d.ts +82 -82
  554. package/types/components/collapse.d.ts +115 -115
  555. package/types/components/color-picker.d.ts +127 -127
  556. package/types/components/column.d.ts +852 -852
  557. package/types/components/context-menu.d.ts +300 -300
  558. package/types/components/countdown.d.ts +99 -99
  559. package/types/components/date-panel.d.ts +269 -269
  560. package/types/components/date-picker.d.ts +302 -302
  561. package/types/components/date-range-picker.d.ts +316 -316
  562. package/types/components/drawer.d.ts +295 -295
  563. package/types/components/empty.d.ts +71 -71
  564. package/types/components/flow-design.d.ts +78 -78
  565. package/types/components/flow-view.d.ts +78 -78
  566. package/types/components/form-design.d.ts +364 -364
  567. package/types/components/form-gather.d.ts +72 -72
  568. package/types/components/form-group.d.ts +63 -63
  569. package/types/components/form-item.d.ts +405 -405
  570. package/types/components/form-view.d.ts +175 -175
  571. package/types/components/form.d.ts +463 -463
  572. package/types/components/gantt-module/gantt-view.d.ts +170 -170
  573. package/types/components/gantt-module/index.d.ts +1 -1
  574. package/types/components/gantt-plugins/extend-gantt-chart.d.ts +114 -114
  575. package/types/components/gantt-plugins/index.d.ts +1 -1
  576. package/types/components/gantt.d.ts +1129 -1129
  577. package/types/components/grid.d.ts +1030 -1030
  578. package/types/components/icon-picker.d.ts +181 -181
  579. package/types/components/icon.d.ts +80 -80
  580. package/types/components/image-group.d.ts +120 -120
  581. package/types/components/image-preview.d.ts +159 -159
  582. package/types/components/image.d.ts +158 -158
  583. package/types/components/input.d.ts +425 -425
  584. package/types/components/layout-aside.d.ts +73 -73
  585. package/types/components/layout-body.d.ts +84 -84
  586. package/types/components/layout-container.d.ts +66 -66
  587. package/types/components/layout-footer.d.ts +66 -66
  588. package/types/components/layout-header.d.ts +64 -64
  589. package/types/components/link.d.ts +104 -104
  590. package/types/components/list-design.d.ts +177 -177
  591. package/types/components/list-view.d.ts +190 -190
  592. package/types/components/list.d.ts +196 -196
  593. package/types/components/loading.d.ts +96 -96
  594. package/types/components/mention.d.ts +70 -70
  595. package/types/components/menu.d.ts +203 -203
  596. package/types/components/modal.d.ts +540 -540
  597. package/types/components/notice-bar.d.ts +95 -95
  598. package/types/components/number-input.d.ts +300 -300
  599. package/types/components/optgroup.d.ts +81 -81
  600. package/types/components/option.d.ts +95 -95
  601. package/types/components/pager.d.ts +322 -322
  602. package/types/components/password-input.d.ts +129 -129
  603. package/types/components/print-page-break.d.ts +62 -62
  604. package/types/components/print.d.ts +199 -199
  605. package/types/components/pulldown.d.ts +222 -222
  606. package/types/components/radio-button.d.ts +104 -104
  607. package/types/components/radio-group.d.ts +136 -136
  608. package/types/components/radio.d.ts +121 -121
  609. package/types/components/rate.d.ts +75 -75
  610. package/types/components/result.d.ts +77 -77
  611. package/types/components/row.d.ts +72 -72
  612. package/types/components/segmented.d.ts +117 -117
  613. package/types/components/select.d.ts +515 -515
  614. package/types/components/slider.d.ts +117 -117
  615. package/types/components/split-pane.d.ts +135 -135
  616. package/types/components/split.d.ts +318 -318
  617. package/types/components/splitter-panel.d.ts +98 -98
  618. package/types/components/splitter.d.ts +283 -283
  619. package/types/components/steps.d.ts +61 -61
  620. package/types/components/switch.d.ts +124 -124
  621. package/types/components/tab-pane.d.ts +107 -107
  622. package/types/components/table-module/custom.d.ts +111 -111
  623. package/types/components/table-module/edit.d.ts +244 -244
  624. package/types/components/table-module/export.d.ts +96 -96
  625. package/types/components/table-module/filter.d.ts +140 -140
  626. package/types/components/table-module/index.d.ts +7 -7
  627. package/types/components/table-module/keyboard.d.ts +26 -26
  628. package/types/components/table-module/menu.d.ts +26 -26
  629. package/types/components/table-module/validator.d.ts +53 -53
  630. package/types/components/table-plugins/extend-cell-area.d.ts +734 -734
  631. package/types/components/table-plugins/extend-pivot-table.d.ts +62 -62
  632. package/types/components/table-plugins/filters-combination.d.ts +15 -15
  633. package/types/components/table-plugins/filters-complex-input.d.ts +9 -9
  634. package/types/components/table-plugins/index.d.ts +4 -4
  635. package/types/components/table-select.d.ts +212 -212
  636. package/types/components/table.d.ts +7222 -7206
  637. package/types/components/tabs.d.ts +324 -324
  638. package/types/components/tag.d.ts +107 -107
  639. package/types/components/text-ellipsis.d.ts +105 -105
  640. package/types/components/text.d.ts +115 -115
  641. package/types/components/textarea.d.ts +237 -237
  642. package/types/components/timeline-item.d.ts +68 -68
  643. package/types/components/timeline.d.ts +70 -70
  644. package/types/components/tip.d.ts +76 -76
  645. package/types/components/toolbar.d.ts +329 -329
  646. package/types/components/tooltip.d.ts +165 -165
  647. package/types/components/tour.d.ts +70 -70
  648. package/types/components/tree-select.d.ts +295 -295
  649. package/types/components/tree.d.ts +826 -826
  650. package/types/components/upload.d.ts +432 -432
  651. package/types/components/watermark.d.ts +113 -113
  652. package/types/index.d.ts +4 -4
  653. package/types/ui/commands.d.ts +57 -57
  654. package/types/ui/formats.d.ts +62 -62
  655. package/types/ui/global-config.d.ts +254 -254
  656. package/types/ui/global-icon.d.ts +292 -292
  657. package/types/ui/hooks.d.ts +11 -11
  658. package/types/ui/index.d.ts +95 -95
  659. package/types/ui/interceptor.d.ts +54 -54
  660. package/types/ui/menus.d.ts +77 -77
  661. package/types/ui/renderer.d.ts +1042 -1042
  662. package/types/ui/validators.d.ts +38 -38
  663. /package/es/icon/{iconfont.1773972997530.ttf → iconfont.1774240783948.ttf} +0 -0
  664. /package/es/icon/{iconfont.1773972997530.woff → iconfont.1774240783948.woff} +0 -0
  665. /package/es/icon/{iconfont.1773972997530.woff2 → iconfont.1774240783948.woff2} +0 -0
  666. /package/es/{iconfont.1773972997530.ttf → iconfont.1774240783948.ttf} +0 -0
  667. /package/es/{iconfont.1773972997530.woff → iconfont.1774240783948.woff} +0 -0
  668. /package/es/{iconfont.1773972997530.woff2 → iconfont.1774240783948.woff2} +0 -0
  669. /package/lib/icon/style/{iconfont.1773972997530.ttf → iconfont.1774240783948.ttf} +0 -0
  670. /package/lib/icon/style/{iconfont.1773972997530.woff → iconfont.1774240783948.woff} +0 -0
  671. /package/lib/icon/style/{iconfont.1773972997530.woff2 → iconfont.1774240783948.woff2} +0 -0
  672. /package/lib/{iconfont.1773972997530.ttf → iconfont.1774240783948.ttf} +0 -0
  673. /package/lib/{iconfont.1773972997530.woff → iconfont.1774240783948.woff} +0 -0
  674. /package/lib/{iconfont.1773972997530.woff2 → iconfont.1774240783948.woff2} +0 -0
@@ -1,2000 +1,2000 @@
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, toCssUnit, updatePanelPlacement } from '../../ui/src/dom'
6
- import { getLastZIndex, nextZIndex, getFuncText, eqEmptyValue } from '../../ui/src/utils'
7
- import { getSlotVNs } from '../../ui/src/vn'
8
- import { errLog } from '../../ui/src/log'
9
- import VxeInputComponent from '../../input/src/input'
10
- import VxeButtonComponent from '../../button/src/button'
11
-
12
- import type { VxeSelectPropTypes, SelectInternalData, ValueOf, VxeComponentSizeType, SelectReactData, VxeSelectEmits, VxeButtonDefines, VxeInputDefines, VxeSelectDefines, VxeOptionProps, VxeDrawerConstructor, VxeDrawerMethods, VxeFormDefines, VxeFormConstructor, VxeFormPrivateMethods, VxeModalConstructor, VxeModalMethods, VxeInputConstructor, VxeComponentSlotType, VxeComponentStyleType } from '../../../types'
13
- import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
14
-
15
- function isOptionVisible (option: any) {
16
- return option.visible !== false
17
- }
18
-
19
- function getOptUniqueId () {
20
- return XEUtils.uniqueId('opt_')
21
- }
22
-
23
- function createInternalData (): SelectInternalData {
24
- return {
25
- // isLoaded: false,
26
- synchData: [],
27
- fullData: [],
28
- afterVisibleList: [],
29
- optAddMaps: {},
30
- optGroupKeyMaps: {},
31
- optFullValMaps: {},
32
- remoteValMaps: {},
33
-
34
- lastScrollLeft: 0,
35
- lastScrollTop: 0,
36
- scrollYStore: {
37
- startIndex: 0,
38
- endIndex: 0,
39
- visibleSize: 0,
40
- offsetSize: 0,
41
- rowHeight: 0
42
- },
43
-
44
- lastScrollTime: 0,
45
- hpTimeout: undefined
46
- }
47
- }
48
-
49
- export default /* define-vxe-component start */ defineVxeComponent({
50
- name: 'VxeSelect',
51
- mixins: [
52
- globalMixins.sizeMixin
53
- ],
54
- model: {
55
- prop: 'value',
56
- event: 'modelValue'
57
- },
58
- props: {
59
- value: [String, Number, Boolean, Array] as PropType<VxeSelectPropTypes.ModelValue>,
60
- defaultConfig: Object as PropType<VxeSelectPropTypes.DefaultConfig>,
61
- clearable: Boolean as PropType<VxeSelectPropTypes.Clearable>,
62
- placeholder: String as PropType<VxeSelectPropTypes.Placeholder>,
63
- readonly: {
64
- type: Boolean as PropType<VxeSelectPropTypes.Readonly>,
65
- default: null
66
- },
67
- loading: Boolean as PropType<VxeSelectPropTypes.Loading>,
68
- disabled: {
69
- type: Boolean as PropType<VxeSelectPropTypes.Disabled>,
70
- default: null
71
- },
72
- multiple: Boolean as PropType<VxeSelectPropTypes.Multiple>,
73
- multiCharOverflow: {
74
- type: [Number, String] as PropType<VxeSelectPropTypes.MultiCharOverflow>,
75
- default: () => getConfig().select.multiCharOverflow
76
- },
77
- prefixIcon: String as PropType<VxeSelectPropTypes.PrefixIcon>,
78
- allowCreate: {
79
- type: Boolean as PropType<VxeSelectPropTypes.AllowCreate>,
80
- default: () => getConfig().select.allowCreate
81
- },
82
- placement: String as PropType<VxeSelectPropTypes.Placement>,
83
- lazyOptions: Array as PropType<VxeSelectPropTypes.LazyOptions>,
84
- options: Array as PropType<VxeSelectPropTypes.Options>,
85
- optionProps: Object as PropType<VxeSelectPropTypes.OptionProps>,
86
- optionGroups: Array as PropType<VxeSelectPropTypes.OptionGroups>,
87
- optionGroupProps: Object as PropType<VxeSelectPropTypes.OptionGroupProps>,
88
- optionConfig: Object as PropType<VxeSelectPropTypes.OptionConfig>,
89
- className: [String, Function] as PropType<VxeSelectPropTypes.ClassName>,
90
- /**
91
- * 已废弃,请使用 popupConfig.className
92
- * @deprecated
93
- */
94
- popupClassName: [String, Function] as PropType<VxeSelectPropTypes.PopupClassName>,
95
- max: {
96
- type: [String, Number] as PropType<VxeSelectPropTypes.Max>,
97
- default: null
98
- },
99
- /**
100
- * 已废弃,请使用 popupConfig.zIndex
101
- * @deprecated
102
- */
103
- zIndex: Number as PropType<VxeSelectPropTypes.ZIndex>,
104
- size: {
105
- type: String as PropType<VxeSelectPropTypes.Size>,
106
- default: () => getConfig().select.size || getConfig().size
107
- },
108
- filterable: Boolean as PropType<VxeSelectPropTypes.Filterable>,
109
- /**
110
- * 已废弃,被 filter-config.filterMethod 替换
111
- * @deprecated
112
- */
113
- filterMethod: Function as PropType<VxeSelectPropTypes.FilterMethod>,
114
- filterConfig: Object as PropType<VxeSelectPropTypes.FilterConfig>,
115
- remote: Boolean as PropType<VxeSelectPropTypes.Remote>,
116
- remoteConfig: Object as PropType<VxeSelectPropTypes.RemoteConfig>,
117
- emptyText: String as PropType<VxeSelectPropTypes.EmptyText>,
118
- showTotalButoon: {
119
- type: Boolean as PropType<VxeSelectPropTypes.ShowTotalButoon>,
120
- default: () => getConfig().select.showTotalButoon
121
- },
122
- showCheckedButoon: {
123
- type: Boolean as PropType<VxeSelectPropTypes.ShowCheckedButoon>,
124
- default: () => getConfig().select.showCheckedButoon
125
- },
126
- showClearButton: {
127
- type: Boolean as PropType<VxeSelectPropTypes.ShowClearButton>,
128
- default: () => getConfig().select.showClearButton
129
- },
130
- transfer: {
131
- type: Boolean as PropType<VxeSelectPropTypes.Transfer>,
132
- default: null
133
- },
134
- popupConfig: Object as PropType<VxeSelectPropTypes.PopupConfig>,
135
- virtualYConfig: Object as PropType<VxeSelectPropTypes.VirtualYConfig>,
136
- scrollY: Object as PropType<VxeSelectPropTypes.ScrollY>,
137
-
138
- /**
139
- * 已废弃,被 remote-config.queryMethod 替换
140
- * @deprecated
141
- */
142
- remoteMethod: Function as PropType<VxeSelectPropTypes.RemoteMethod>,
143
- /**
144
- * 已废弃,被 option-config.keyField 替换
145
- * @deprecated
146
- */
147
- optionId: {
148
- type: String as PropType<VxeSelectPropTypes.OptionId>,
149
- default: () => getConfig().select.optionId
150
- },
151
- /**
152
- * 已废弃,被 option-config.useKey 替换
153
- * @deprecated
154
- */
155
- optionKey: Boolean as PropType<VxeSelectPropTypes.OptionKey>
156
- },
157
- inject: {
158
- $xeModal: {
159
- default: null
160
- },
161
- $xeDrawer: {
162
- default: null
163
- },
164
- $xeTable: {
165
- default: null
166
- },
167
- $xeForm: {
168
- default: null
169
- },
170
- formItemInfo: {
171
- from: 'xeFormItemInfo',
172
- default: null
173
- }
174
- },
175
- provide () {
176
- const $xeSelect = this
177
- return {
178
- $xeSelect
179
- }
180
- },
181
- data () {
182
- const xID = XEUtils.uniqueId()
183
- const reactData: SelectReactData = {
184
- initialized: false,
185
- scrollYLoad: false,
186
- bodyHeight: 0,
187
- topSpaceHeight: 0,
188
- optList: [],
189
- staticOptions: [],
190
- reactFlag: 1,
191
-
192
- currentOption: null,
193
- searchValue: '',
194
- searchLoading: false,
195
-
196
- panelIndex: 0,
197
- panelStyle: {},
198
- panelPlacement: null,
199
- triggerFocusPanel: false,
200
- visiblePanel: false,
201
- isAniVisible: false,
202
- isActivated: false
203
- }
204
- const internalData = createInternalData()
205
-
206
- return {
207
- xID,
208
- reactData,
209
- internalData
210
- }
211
- },
212
- computed: {
213
- ...({} as {
214
- computeSize(): VxeComponentSizeType
215
- $xeModal(): (VxeModalConstructor & VxeModalMethods) | null
216
- $xeDrawer(): (VxeDrawerConstructor & VxeDrawerMethods) | null
217
- $xeTable(): (VxeTableConstructor & VxeTablePrivateMethods) | null
218
- $xeForm(): (VxeFormConstructor & VxeFormPrivateMethods) | null
219
- formItemInfo(): VxeFormDefines.ProvideItemInfo | null
220
- }),
221
- computeFormReadonly () {
222
- const $xeSelect = this
223
- const props = $xeSelect
224
- const $xeForm = $xeSelect.$xeForm
225
-
226
- const { readonly } = props
227
- if (readonly === null) {
228
- if ($xeForm) {
229
- return $xeForm.readonly
230
- }
231
- return false
232
- }
233
- return readonly
234
- },
235
- computeIsDisabled () {
236
- const $xeSelect = this
237
- const props = $xeSelect
238
- const $xeForm = $xeSelect.$xeForm
239
-
240
- const { disabled } = props
241
- if (disabled === null) {
242
- if ($xeForm) {
243
- return $xeForm.disabled
244
- }
245
- return false
246
- }
247
- return disabled
248
- },
249
- computeBtnTransfer () {
250
- const $xeSelect = this
251
- const props = $xeSelect
252
- const $xeTable = $xeSelect.$xeTable
253
- const $xeModal = $xeSelect.$xeModal
254
- const $xeDrawer = $xeSelect.$xeDrawer
255
- const $xeForm = $xeSelect.$xeForm
256
-
257
- const { transfer } = props
258
- const popupOpts = $xeSelect.computePopupOpts as VxeSelectPropTypes.PopupConfig
259
- if (XEUtils.isBoolean(popupOpts.transfer)) {
260
- return popupOpts.transfer
261
- }
262
- if (transfer === null) {
263
- const globalTransfer = getConfig().select.transfer
264
- if (XEUtils.isBoolean(globalTransfer)) {
265
- return globalTransfer
266
- }
267
- if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
268
- return true
269
- }
270
- }
271
- return transfer
272
- },
273
- computeInpPlaceholder () {
274
- const $xeSelect = this
275
- const props = $xeSelect
276
-
277
- const { placeholder } = props
278
- if (placeholder) {
279
- return getFuncText(placeholder)
280
- }
281
- const globalPlaceholder = getConfig().select.placeholder
282
- if (globalPlaceholder) {
283
- return getFuncText(globalPlaceholder)
284
- }
285
- return getI18n('vxe.base.pleaseSelect')
286
- },
287
- computeDefaultOpts () {
288
- const $xeSelect = this
289
- const props = $xeSelect
290
-
291
- return Object.assign({}, props.defaultConfig)
292
- },
293
- computePropsOpts () {
294
- const $xeSelect = this
295
- const props = $xeSelect
296
-
297
- return Object.assign({}, props.optionProps)
298
- },
299
- computeGroupPropsOpts () {
300
- const $xeSelect = this
301
- const props = $xeSelect
302
-
303
- return Object.assign({}, props.optionGroupProps)
304
- },
305
- computeLabelField () {
306
- const $xeSelect = this
307
-
308
- const propsOpts = $xeSelect.computePropsOpts as VxeSelectPropTypes.OptionProps
309
- return propsOpts.label || 'label'
310
- },
311
- computeValueField () {
312
- const $xeSelect = this
313
-
314
- const propsOpts = $xeSelect.computePropsOpts as VxeSelectPropTypes.OptionProps
315
- return propsOpts.value || 'value'
316
- },
317
- computeGroupLabelField () {
318
- const $xeSelect = this
319
-
320
- const groupPropsOpts = $xeSelect.computeGroupPropsOpts as VxeSelectPropTypes.OptionGroupProps
321
- return groupPropsOpts.label || 'label'
322
- },
323
- computeGroupOptionsField () {
324
- const $xeSelect = this
325
-
326
- const groupPropsOpts = $xeSelect.computeGroupPropsOpts as VxeSelectPropTypes.OptionGroupProps
327
- return groupPropsOpts.options || 'options'
328
- },
329
- computeIsMaximize () {
330
- const $xeSelect = this
331
-
332
- const selectVals = $xeSelect.computeSelectVals
333
- return ($xeSelect as any).checkMaxLimit(selectVals) as boolean
334
- },
335
- computePopupOpts () {
336
- const $xeSelect = this
337
- const props = $xeSelect
338
-
339
- return Object.assign({}, getConfig().select.popupConfig, props.popupConfig)
340
- },
341
- computeVirtualYOpts () {
342
- const $xeSelect = this
343
- const props = $xeSelect
344
-
345
- return Object.assign({} as { gt: number }, getConfig().select.virtualYConfig || getConfig().select.scrollY, props.virtualYConfig || props.scrollY)
346
- },
347
- computeRemoteOpts () {
348
- const $xeSelect = this
349
- const props = $xeSelect
350
-
351
- return Object.assign({}, getConfig().select.remoteConfig, props.remoteConfig)
352
- },
353
- computeFilterOpts () {
354
- const $xeSelect = this
355
- const props = $xeSelect
356
-
357
- return Object.assign({}, getConfig().select.filterConfig, props.filterConfig)
358
- },
359
- computeOptionOpts () {
360
- const $xeSelect = this
361
- const props = $xeSelect
362
-
363
- return Object.assign({}, getConfig().select.optionConfig, props.optionConfig)
364
- },
365
- computeIsGroup (this: any) {
366
- const $xeSelect = this
367
- const reactData = $xeSelect.reactData
368
-
369
- return reactData.fullGroupList.some((item: any) => item.options && item.options.length)
370
- },
371
- computeMultiMaxCharNum () {
372
- const $xeSelect = this
373
- const props = $xeSelect
374
-
375
- return XEUtils.toNumber(props.multiCharOverflow)
376
- },
377
- computePopupWrapperStyle () {
378
- const $xeSelect = this
379
-
380
- const popupOpts = $xeSelect.computePopupOpts
381
- const { height, width } = popupOpts
382
- const stys: VxeComponentStyleType = {}
383
- if (width) {
384
- stys.width = toCssUnit(width)
385
- }
386
- if (height) {
387
- stys.height = toCssUnit(height)
388
- stys.maxHeight = toCssUnit(height)
389
- }
390
- return stys
391
- },
392
- computeSelectVals () {
393
- const $xeSelect = this
394
- const props = $xeSelect
395
-
396
- const { value: modelValue, multiple } = props
397
- let vals: (string | number | boolean)[] = []
398
- if (XEUtils.isArray(modelValue)) {
399
- vals = modelValue
400
- } else {
401
- if (multiple) {
402
- if (!eqEmptyValue(modelValue)) {
403
- vals = `${modelValue}`.indexOf(',') > -1 ? `${modelValue}`.split(',') : [modelValue] as any[]
404
- }
405
- } else {
406
- vals = modelValue === null || modelValue === undefined ? [] : [modelValue]
407
- }
408
- }
409
- return vals
410
- },
411
- computeFullLabel () {
412
- const $xeSelect = this as any
413
- const props = $xeSelect
414
- const reactData = $xeSelect.reactData
415
-
416
- const { remote } = props
417
- const { reactFlag } = reactData
418
- const selectVals = $xeSelect.computeSelectVals as string[]
419
- if (remote && reactFlag) {
420
- return selectVals.map(val => $xeSelect.getRemoteSelectLabel(val)).join(', ')
421
- }
422
- return selectVals.map((val) => $xeSelect.getSelectLabel(val)).join(', ')
423
- },
424
- computeSelectLabel () {
425
- const $xeSelect = this as any
426
- const props = $xeSelect
427
- const reactData = $xeSelect.reactData
428
-
429
- const { remote, multiple } = props
430
- const { reactFlag } = reactData
431
- const multiMaxCharNum = $xeSelect.computeMultiMaxCharNum
432
- const selectVals = $xeSelect.computeSelectVals as string[]
433
- if (remote && reactFlag) {
434
- return selectVals.map(val => $xeSelect.getRemoteSelectLabel(val)).join(', ')
435
- }
436
- const labels = selectVals.map((val) => $xeSelect.getSelectLabel(val))
437
- if (multiple && multiMaxCharNum > 0 && labels.length > multiMaxCharNum) {
438
- return `${labels.slice(0, multiMaxCharNum)}...`
439
- }
440
- return labels.join(', ')
441
- }
442
- },
443
- methods: {
444
- //
445
- // Method
446
- //
447
- dispatchEvent (type: ValueOf<VxeSelectEmits>, params: Record<string, any>, evnt: Event | null) {
448
- const $xeSelect = this
449
- $xeSelect.$emit(type, createEvent(evnt, { $select: $xeSelect }, params))
450
- },
451
- emitModel (value: any) {
452
- const $xeSelect = this
453
-
454
- const { _events } = $xeSelect as any
455
- if (_events && _events.modelValue) {
456
- $xeSelect.$emit('modelValue', value)
457
- } else {
458
- $xeSelect.$emit('model-value', value)
459
- }
460
- },
461
- emitDefaultValue (value: any) {
462
- const $xeSelect = this
463
-
464
- $xeSelect.emitModel(value)
465
- $xeSelect.dispatchEvent('default-change', { value }, null)
466
- },
467
- isPanelVisible () {
468
- const $xeSelect = this
469
- const reactData = $xeSelect.reactData
470
-
471
- return reactData.visiblePanel
472
- },
473
- togglePanel () {
474
- const $xeSelect = this
475
- const reactData = $xeSelect.reactData
476
-
477
- if (reactData.visiblePanel) {
478
- $xeSelect.hideOptionPanel()
479
- } else {
480
- $xeSelect.showOptionPanel()
481
- }
482
- return $xeSelect.$nextTick()
483
- },
484
- hidePanel () {
485
- const $xeSelect = this
486
- const reactData = $xeSelect.reactData
487
-
488
- if (reactData.visiblePanel) {
489
- $xeSelect.hideOptionPanel()
490
- }
491
- return $xeSelect.$nextTick()
492
- },
493
- showPanel () {
494
- const $xeSelect = this
495
- const reactData = $xeSelect.reactData
496
-
497
- if (!reactData.visiblePanel) {
498
- $xeSelect.showOptionPanel()
499
- }
500
- return $xeSelect.$nextTick()
501
- },
502
- focus () {
503
- const $xeSelect = this
504
- const reactData = $xeSelect.reactData
505
-
506
- const $input = $xeSelect.$refs.refInput as VxeInputConstructor
507
- if ($input) {
508
- $input.blur()
509
- }
510
- reactData.isActivated = true
511
- return $xeSelect.$nextTick()
512
- },
513
- blur () {
514
- const $xeSelect = this
515
- const reactData = $xeSelect.reactData
516
-
517
- const $input = $xeSelect.$refs.refInput as VxeInputConstructor
518
- if ($input) {
519
- $input.blur()
520
- }
521
- reactData.isActivated = false
522
- return $xeSelect.$nextTick()
523
- },
524
- callSlot (slotFunc: any, params: any, h: CreateElement) {
525
- const $xeSelect = this
526
- const slots = $xeSelect.$scopedSlots
527
-
528
- if (slotFunc) {
529
- if (XEUtils.isString(slotFunc)) {
530
- slotFunc = slots[slotFunc] || null
531
- }
532
- if (XEUtils.isFunction(slotFunc)) {
533
- return getSlotVNs(slotFunc.call($xeSelect, params, h))
534
- }
535
- }
536
- return []
537
- },
538
- getOptKey () {
539
- const $xeSelect = this
540
- const props = $xeSelect
541
-
542
- const optionOpts = $xeSelect.computeOptionOpts
543
- return optionOpts.keyField || props.optionId || '_X_OPTION_KEY'
544
- },
545
- getOptId (option: any) {
546
- const $xeSelect = this
547
-
548
- const optid = option[$xeSelect.getOptKey()]
549
- return optid ? encodeURIComponent(optid) : ''
550
- },
551
- checkMaxLimit (selectVals: VxeSelectPropTypes.ModelValue[]) {
552
- const $xeSelect = this
553
- const props = $xeSelect
554
-
555
- const { multiple, max } = props
556
- if (multiple && max) {
557
- return selectVals.length >= XEUtils.toNumber(max)
558
- }
559
- return false
560
- },
561
- getRemoteSelectLabel (value: any) {
562
- const $xeSelect = this
563
- const props = $xeSelect
564
- const internalData = $xeSelect.internalData
565
-
566
- const { lazyOptions } = props
567
- const { remoteValMaps, optFullValMaps } = internalData
568
- const valueField = $xeSelect.computeValueField
569
- const labelField = $xeSelect.computeLabelField
570
- const remoteItem = remoteValMaps[value] || optFullValMaps[value]
571
- const item = remoteItem ? remoteItem.item : null
572
- if (item) {
573
- return XEUtils.toValueString(item[labelField])
574
- }
575
- if (lazyOptions) {
576
- const lazyItem = lazyOptions.find(item => item[valueField] === value)
577
- if (lazyItem) {
578
- return lazyItem[labelField]
579
- }
580
- }
581
- return value
582
- },
583
- getSelectLabel (value: any) {
584
- const $xeSelect = this
585
- const props = $xeSelect
586
- const reactData = $xeSelect.reactData
587
- const internalData = $xeSelect.internalData
588
-
589
- const { lazyOptions } = props
590
- const { optFullValMaps } = internalData
591
- const valueField = $xeSelect.computeValueField
592
- const labelField = $xeSelect.computeLabelField
593
- const cacheItem = reactData.reactFlag ? optFullValMaps[value] : null
594
- if (cacheItem) {
595
- return cacheItem.item[labelField as 'label']
596
- }
597
- if (lazyOptions) {
598
- const lazyItem = lazyOptions.find(item => item[valueField] === value)
599
- if (lazyItem) {
600
- return lazyItem[labelField]
601
- }
602
- }
603
- return value
604
- },
605
- getOptkey () {
606
- const $xeSelect = this
607
- const props = $xeSelect
608
-
609
- const optionOpts = $xeSelect.computeOptionOpts
610
- return optionOpts.keyField || props.optionId || '_X_OPTION_KEY'
611
- },
612
- getOptid (option: any) {
613
- const $xeSelect = this
614
-
615
- const optid = option[$xeSelect.getOptkey()]
616
- return optid ? encodeURIComponent(optid) : ''
617
- },
618
- /**
619
- * 处理选项,当选项被动态显示/隐藏时可能会用到
620
- */
621
- handleOption () {
622
- const $xeSelect = this
623
- const props = $xeSelect
624
- const reactData = $xeSelect.reactData
625
- const internalData = $xeSelect.internalData
626
-
627
- const { remote, value, filterable } = props
628
- const { searchValue } = reactData
629
- const { fullData, optFullValMaps } = internalData
630
- const labelField = $xeSelect.computeLabelField
631
- const valueField = $xeSelect.computeValueField
632
- const filterOpts = $xeSelect.computeFilterOpts
633
- const frMethod = filterOpts.filterMethod || props.filterMethod
634
- const searchStr = `${searchValue || ''}`.toLowerCase()
635
- let avList: any[] = []
636
- if (remote) {
637
- avList = fullData.filter(isOptionVisible)
638
- } else {
639
- if (filterable && frMethod) {
640
- avList = fullData.filter(option => isOptionVisible(option) && frMethod({ $select: $xeSelect, group: null, option, searchValue, value }))
641
- } else if (filterable) {
642
- avList = fullData.filter(option => isOptionVisible(option) && (!searchStr || `${option[labelField] || option[valueField]}`.toLowerCase().indexOf(searchStr) > -1))
643
- } else {
644
- avList = fullData.filter(isOptionVisible)
645
- }
646
- }
647
- avList.forEach((item, index) => {
648
- const cacheItem = optFullValMaps[item[valueField]]
649
- if (cacheItem) {
650
- cacheItem._index = index
651
- }
652
- })
653
- internalData.afterVisibleList = avList
654
- return $xeSelect.$nextTick()
655
- },
656
- refreshOption () {
657
- const $xeSelect = this
658
-
659
- $xeSelect.handleOption()
660
- $xeSelect.updateYData()
661
- return $xeSelect.$nextTick()
662
- },
663
- cacheItemMap (datas: any[]) {
664
- const $xeSelect = this
665
- const reactData = $xeSelect.reactData
666
- const internalData = $xeSelect.internalData
667
-
668
- const groupOptionsField = $xeSelect.computeGroupOptionsField
669
- const valueField = $xeSelect.computeValueField
670
- const key = $xeSelect.getOptKey()
671
- const groupKeyMaps: Record<string, any> = {}
672
- const fullKeyMaps: Record<string, VxeSelectDefines.OptCacheItem> = {}
673
- const list: any[] = []
674
- const handleOptItem = (item: any) => {
675
- list.push(item)
676
- let optid = $xeSelect.getOptId(item)
677
- if (!optid) {
678
- optid = getOptUniqueId()
679
- item[key] = optid
680
- }
681
- fullKeyMaps[item[valueField]] = {
682
- key: optid,
683
- item,
684
- _index: -1
685
- }
686
- }
687
- datas.forEach((group: any) => {
688
- handleOptItem(group)
689
- if (group[groupOptionsField]) {
690
- groupKeyMaps[group[key]] = group
691
- group[groupOptionsField].forEach(handleOptItem)
692
- }
693
- })
694
- internalData.fullData = list
695
- internalData.optGroupKeyMaps = groupKeyMaps
696
- internalData.optFullValMaps = fullKeyMaps
697
- reactData.reactFlag++
698
- $xeSelect.handleOption()
699
- },
700
- setCurrentOption (option: any) {
701
- const $xeSelect = this
702
- const reactData = $xeSelect.reactData
703
-
704
- if (option) {
705
- reactData.currentOption = option
706
- }
707
- },
708
- scrollToOption (option: any, isAlignBottom?: boolean) {
709
- const $xeSelect = this
710
-
711
- return $xeSelect.$nextTick().then(() => {
712
- if (option) {
713
- const optWrapperElem = $xeSelect.$refs.refOptionWrapper as HTMLDivElement
714
- const panelElem = $xeSelect.$refs.refOptionPanel as HTMLDivElement
715
- const optElem = panelElem.querySelector(`[optid='${$xeSelect.getOptid(option)}']`) as HTMLElement
716
- if (optWrapperElem && optElem) {
717
- const wrapperHeight = optWrapperElem.offsetHeight
718
- const offsetPadding = 5
719
- if (isAlignBottom) {
720
- if (optElem.offsetTop + optElem.offsetHeight - optWrapperElem.scrollTop > wrapperHeight) {
721
- optWrapperElem.scrollTop = optElem.offsetTop + optElem.offsetHeight - wrapperHeight
722
- }
723
- } else {
724
- if (optElem.offsetTop + offsetPadding < optWrapperElem.scrollTop || optElem.offsetTop + offsetPadding > optWrapperElem.scrollTop + optWrapperElem.clientHeight) {
725
- optWrapperElem.scrollTop = optElem.offsetTop - offsetPadding
726
- }
727
- }
728
- }
729
- }
730
- })
731
- },
732
- updateZindex () {
733
- const $xeSelect = this
734
- const props = $xeSelect
735
- const reactData = $xeSelect.reactData
736
-
737
- const popupOpts = $xeSelect.computePopupOpts
738
- const customZIndex = popupOpts.zIndex || props.zIndex
739
- if (customZIndex) {
740
- reactData.panelIndex = XEUtils.toNumber(customZIndex)
741
- } else if (reactData.panelIndex < getLastZIndex()) {
742
- reactData.panelIndex = nextZIndex()
743
- }
744
- },
745
- updateZIndex () {
746
- const $xeSelect = this
747
- const reactData = $xeSelect.reactData
748
-
749
- if (reactData.panelIndex < getLastZIndex()) {
750
- reactData.panelIndex = nextZIndex()
751
- }
752
- },
753
- updatePlacement () {
754
- const $xeSelect = this
755
- const props = $xeSelect
756
- const reactData = $xeSelect.reactData
757
-
758
- const { placement } = props
759
- const { panelIndex } = reactData
760
- const targetElem = $xeSelect.$refs.refElem as HTMLElement
761
- const panelElem = $xeSelect.$refs.refOptionPanel as HTMLDivElement
762
- const btnTransfer = $xeSelect.computeBtnTransfer
763
- const popupOpts = $xeSelect.computePopupOpts
764
- const handleStyle = () => {
765
- const ppObj = updatePanelPlacement(targetElem, panelElem, {
766
- placement: popupOpts.placement || placement,
767
- teleportTo: btnTransfer
768
- })
769
- const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
770
- zIndex: panelIndex
771
- })
772
- reactData.panelStyle = panelStyle
773
- reactData.panelPlacement = ppObj.placement
774
- }
775
- handleStyle()
776
- return $xeSelect.$nextTick().then(handleStyle)
777
- },
778
- handleScrollSelect () {
779
- const $xeSelect = this
780
- const reactData = $xeSelect.reactData
781
- const internalData = $xeSelect.internalData
782
-
783
- $xeSelect.$nextTick(() => {
784
- const { isAniVisible, visiblePanel } = reactData
785
- const { optFullValMaps } = internalData
786
- const selectVals = $xeSelect.computeSelectVals
787
- if (selectVals.length && isAniVisible && visiblePanel) {
788
- const cacheItem = reactData.reactFlag ? optFullValMaps[`${selectVals[0]}`] : null
789
- if (cacheItem) {
790
- $xeSelect.handleScrollToOption(cacheItem.item)
791
- }
792
- }
793
- })
794
- },
795
- showOptionPanel () {
796
- const $xeSelect = this
797
- const props = $xeSelect
798
- const reactData = $xeSelect.reactData
799
- const internalData = $xeSelect.internalData
800
-
801
- const { loading, filterable, remote } = props
802
- const { fullData, hpTimeout } = internalData
803
- const isDisabled = $xeSelect.computeIsDisabled
804
- const remoteOpts = $xeSelect.computeRemoteOpts
805
- if (!loading && !isDisabled) {
806
- if (hpTimeout) {
807
- clearTimeout(hpTimeout)
808
- internalData.hpTimeout = undefined
809
- }
810
- if (!reactData.initialized) {
811
- reactData.initialized = true
812
- const btnTransfer = $xeSelect.computeBtnTransfer
813
- const panelElem = $xeSelect.$refs.refOptionPanel as HTMLElement
814
- if (btnTransfer) {
815
- if (panelElem) {
816
- document.body.appendChild(panelElem)
817
- }
818
- }
819
- }
820
- reactData.isActivated = true
821
- reactData.isAniVisible = true
822
- if (filterable) {
823
- if (remote && remoteOpts.enabled && ((remoteOpts.autoLoad && !fullData.length) || (fullData.length && remoteOpts.clearOnClose))) {
824
- $xeSelect.handleSearchEvent()
825
- } else {
826
- $xeSelect.handleOption()
827
- $xeSelect.updateYData()
828
- }
829
- }
830
- setTimeout(() => {
831
- reactData.visiblePanel = true
832
- $xeSelect.handleFocusSearch()
833
- $xeSelect.recalculate().then(() => {
834
- $xeSelect.handleScrollSelect()
835
- $xeSelect.refreshScroll()
836
- })
837
- $xeSelect.updatePlacement()
838
- }, 10)
839
- setTimeout(() => {
840
- $xeSelect.recalculate().then(() => $xeSelect.refreshScroll())
841
- }, 100)
842
- $xeSelect.updateZIndex()
843
- $xeSelect.updatePlacement()
844
- $xeSelect.dispatchEvent('visible-change', { visible: true }, null)
845
- }
846
- },
847
- hideOptionPanel () {
848
- const $xeSelect = this
849
- const props = $xeSelect
850
- const reactData = $xeSelect.reactData
851
- const internalData = $xeSelect.internalData
852
-
853
- const { filterable, remote } = props
854
- const filterOpts = $xeSelect.computeFilterOpts
855
- const remoteOpts = $xeSelect.computeRemoteOpts
856
- if (remote) {
857
- if (remoteOpts.clearOnClose) {
858
- reactData.searchValue = ''
859
- }
860
- } else if (filterable) {
861
- if (filterOpts.clearOnClose) {
862
- reactData.searchValue = ''
863
- }
864
- } else {
865
- reactData.searchValue = ''
866
- }
867
- reactData.searchLoading = false
868
- reactData.visiblePanel = false
869
- internalData.hpTimeout = setTimeout(() => {
870
- reactData.isAniVisible = false
871
- }, 350)
872
- $xeSelect.dispatchEvent('visible-change', { visible: false }, null)
873
- },
874
- changeEvent (evnt: Event, selectValue: any, option: any) {
875
- const $xeSelect = this
876
- const props = $xeSelect
877
- const $xeForm = $xeSelect.$xeForm
878
- const formItemInfo = $xeSelect.formItemInfo
879
-
880
- $xeSelect.emitModel(selectValue)
881
- if (selectValue !== props.value) {
882
- $xeSelect.dispatchEvent('change', { value: selectValue, option }, evnt)
883
- // 自动更新校验状态
884
- if ($xeForm && formItemInfo) {
885
- $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, selectValue)
886
- }
887
- }
888
- },
889
- clearValueEvent (evnt: Event, selectValue: any) {
890
- const $xeSelect = this
891
- const internalData = $xeSelect.internalData
892
-
893
- internalData.remoteValMaps = {}
894
- $xeSelect.changeEvent(evnt, selectValue, null)
895
- $xeSelect.dispatchEvent('clear', { value: selectValue }, evnt)
896
- },
897
- clearEvent (params: VxeInputDefines.ClearEventParams) {
898
- const $xeSelect = this
899
-
900
- const { $event } = params
901
- $xeSelect.clearValueEvent($event, null)
902
- $xeSelect.hideOptionPanel()
903
- },
904
- allCheckedPanelEvent (params: VxeButtonDefines.ClickEventParams) {
905
- const $xeSelect = this
906
- const props = $xeSelect
907
- const reactData = $xeSelect.reactData
908
-
909
- const { $event } = params
910
- const { multiple } = props
911
- const { optList } = reactData
912
- const valueField = $xeSelect.computeValueField
913
- if (multiple) {
914
- const selectVals = $xeSelect.computeSelectVals
915
- const currVlas = selectVals.slice(0)
916
- for (let i = 0; i < optList.length; i++) {
917
- const option = optList[i]
918
- const selectValue = option[valueField]
919
- // 检测是否超过最大可选数量
920
- if ($xeSelect.checkMaxLimit(currVlas)) {
921
- break
922
- }
923
- if (!currVlas.some(val => val === selectValue)) {
924
- currVlas.push(selectValue)
925
- }
926
- }
927
- $xeSelect.changeEvent($event, currVlas, optList[0])
928
- $xeSelect.dispatchEvent('all-change', { value: currVlas }, $event)
929
- }
930
- },
931
- clearCheckedPanelEvent (params: VxeButtonDefines.ClickEventParams) {
932
- const $xeSelect = this
933
-
934
- const { $event } = params
935
- $xeSelect.clearValueEvent($event, null)
936
- $xeSelect.hideOptionPanel()
937
- },
938
- changeOptionEvent (evnt: Event, option: any) {
939
- const $xeSelect = this
940
- const props = $xeSelect
941
- const reactData = $xeSelect.reactData
942
- const internalData = $xeSelect.internalData
943
-
944
- const { multiple } = props
945
- const { remoteValMaps } = internalData
946
- const valueField = $xeSelect.computeValueField
947
- const selectValue = option[valueField]
948
- const remoteItem = remoteValMaps[selectValue]
949
- if (!reactData.visiblePanel) {
950
- return
951
- }
952
- if (remoteItem) {
953
- remoteItem.item = option
954
- } else {
955
- remoteValMaps[selectValue] = {
956
- key: $xeSelect.getOptId(option),
957
- item: option,
958
- _index: -1
959
- }
960
- }
961
- if (multiple) {
962
- let multipleValue: any[] = []
963
- const selectVals = $xeSelect.computeSelectVals
964
- const index = XEUtils.findIndexOf(selectVals, val => val === selectValue)
965
- if (index === -1) {
966
- multipleValue = selectVals.concat([selectValue])
967
- } else {
968
- multipleValue = selectVals.filter((val) => val !== selectValue)
969
- }
970
- $xeSelect.changeEvent(evnt, multipleValue, option)
971
- } else {
972
- $xeSelect.changeEvent(evnt, selectValue, option)
973
- $xeSelect.hideOptionPanel()
974
- }
975
- reactData.reactFlag++
976
- },
977
- handleGlobalMousewheelEvent (evnt: MouseEvent) {
978
- const $xeSelect = this
979
- const reactData = $xeSelect.reactData
980
-
981
- const { visiblePanel } = reactData
982
- const isDisabled = $xeSelect.computeIsDisabled
983
- if (!isDisabled) {
984
- if (visiblePanel) {
985
- const panelElem = $xeSelect.$refs.refOptionPanel
986
- if (getEventTargetNode(evnt, panelElem).flag) {
987
- $xeSelect.updatePlacement()
988
- } else {
989
- $xeSelect.hideOptionPanel()
990
- }
991
- }
992
- }
993
- },
994
- handleGlobalMousedownEvent (evnt: MouseEvent) {
995
- const $xeSelect = this
996
- const reactData = $xeSelect.reactData
997
-
998
- const { visiblePanel } = reactData
999
- const isDisabled = $xeSelect.computeIsDisabled
1000
- const popupOpts = $xeSelect.computePopupOpts
1001
- const { trigger } = popupOpts
1002
- if (!isDisabled) {
1003
- const el = $xeSelect.$refs.refElem as HTMLDivElement
1004
- const panelElem = $xeSelect.$refs.refOptionPanel as HTMLDivElement
1005
- reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelElem).flag
1006
- if (visiblePanel && !reactData.isActivated) {
1007
- if (trigger !== 'manual') {
1008
- $xeSelect.hideOptionPanel()
1009
- }
1010
- }
1011
- }
1012
- },
1013
- validOffsetOption (option: any) {
1014
- const $xeSelect = this
1015
-
1016
- const isDisabled = option.disabled
1017
- const optid = $xeSelect.getOptId(option)
1018
- if (!isDisabled && !$xeSelect.hasOptGroupById(optid)) {
1019
- return true
1020
- }
1021
- return false
1022
- },
1023
- findOffsetOption (option: any, isDwArrow: boolean) {
1024
- const $xeSelect = this
1025
- const props = $xeSelect
1026
- const reactData = $xeSelect.reactData
1027
- const internalData = $xeSelect.internalData
1028
-
1029
- const { allowCreate } = props
1030
- const { optList } = reactData
1031
- const { optFullValMaps, optAddMaps, afterVisibleList } = internalData
1032
- const valueField = $xeSelect.computeValueField
1033
- let fullList = afterVisibleList
1034
- let offsetAddIndex = 0
1035
- if (allowCreate && optList.length) {
1036
- const firstItem = optList[0]
1037
- const optid = $xeSelect.getOptId(firstItem)
1038
- if (optAddMaps[optid]) {
1039
- offsetAddIndex = 1
1040
- fullList = [optAddMaps[optid]].concat(fullList)
1041
- }
1042
- }
1043
- if (!option) {
1044
- if (isDwArrow) {
1045
- for (let i = 0; i < fullList.length; i++) {
1046
- const item = fullList[i]
1047
- if ($xeSelect.validOffsetOption(item)) {
1048
- return item
1049
- }
1050
- }
1051
- } else {
1052
- for (let len = fullList.length - 1; len >= 0; len--) {
1053
- const item = fullList[len]
1054
- if ($xeSelect.validOffsetOption(item)) {
1055
- return item
1056
- }
1057
- }
1058
- }
1059
- }
1060
- let avIndex = 0
1061
- const cacheItem = option ? optFullValMaps[option[valueField]] : null
1062
- if (cacheItem) {
1063
- avIndex = cacheItem._index + offsetAddIndex
1064
- }
1065
- if (avIndex > -1) {
1066
- if (isDwArrow) {
1067
- for (let i = avIndex + 1; i <= fullList.length - 1; i++) {
1068
- const item = fullList[i]
1069
- if ($xeSelect.validOffsetOption(item)) {
1070
- return item
1071
- }
1072
- }
1073
- } else {
1074
- if (avIndex > 0) {
1075
- for (let len = avIndex - 1; len >= 0; len--) {
1076
- const item = fullList[len]
1077
- if ($xeSelect.validOffsetOption(item)) {
1078
- return item
1079
- }
1080
- }
1081
- }
1082
- }
1083
- }
1084
- return null
1085
- },
1086
- handleGlobalKeydownEvent (evnt: KeyboardEvent) {
1087
- const $xeSelect = this
1088
- const props = $xeSelect
1089
- const reactData = $xeSelect.reactData
1090
-
1091
- const { clearable } = props
1092
- const { visiblePanel, currentOption } = reactData
1093
- const isDisabled = $xeSelect.computeIsDisabled
1094
- const popupOpts = $xeSelect.computePopupOpts
1095
- const { trigger } = popupOpts
1096
- if (!isDisabled) {
1097
- const isTab = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.TAB)
1098
- const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER)
1099
- const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
1100
- const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
1101
- const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
1102
- const isDel = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.DELETE)
1103
- if (isTab) {
1104
- reactData.isActivated = false
1105
- }
1106
- if (visiblePanel) {
1107
- if (isEsc || isTab) {
1108
- if (trigger !== 'manual') {
1109
- $xeSelect.hideOptionPanel()
1110
- }
1111
- } else if (isEnter) {
1112
- if (currentOption) {
1113
- evnt.preventDefault()
1114
- evnt.stopPropagation()
1115
- $xeSelect.changeOptionEvent(evnt, currentOption)
1116
- }
1117
- } else if (isUpArrow || isDwArrow) {
1118
- evnt.preventDefault()
1119
- let offsetOption = $xeSelect.findOffsetOption(currentOption, isDwArrow)
1120
- // 如果不匹配,默认最接近一个
1121
- if (!offsetOption) {
1122
- offsetOption = $xeSelect.findOffsetOption(null, isDwArrow)
1123
- }
1124
- if (offsetOption) {
1125
- $xeSelect.setCurrentOption(offsetOption)
1126
- $xeSelect.handleScrollToOption(offsetOption, isDwArrow)
1127
- }
1128
- }
1129
- } else if ((isUpArrow || isDwArrow || isEnter) && reactData.isActivated) {
1130
- evnt.preventDefault()
1131
- $xeSelect.showOptionPanel()
1132
- }
1133
- if (reactData.isActivated) {
1134
- if (isDel && clearable) {
1135
- $xeSelect.clearValueEvent(evnt, null)
1136
- }
1137
- }
1138
- }
1139
- },
1140
- handleGlobalBlurEvent () {
1141
- const $xeSelect = this
1142
- const reactData = $xeSelect.reactData
1143
-
1144
- const { visiblePanel, isActivated } = reactData
1145
- const popupOpts = $xeSelect.computePopupOpts
1146
- const { trigger } = popupOpts
1147
- if (visiblePanel) {
1148
- if (trigger !== 'manual') {
1149
- $xeSelect.hideOptionPanel()
1150
- }
1151
- }
1152
- if (isActivated) {
1153
- reactData.isActivated = false
1154
- }
1155
- if (visiblePanel || isActivated) {
1156
- const $input = $xeSelect.$refs.refInput as VxeInputConstructor
1157
- if ($input) {
1158
- $input.blur()
1159
- }
1160
- }
1161
- },
1162
- handleGlobalResizeEvent () {
1163
- const $xeSelect = this
1164
- const reactData = $xeSelect.reactData
1165
-
1166
- const { visiblePanel } = reactData
1167
- if (visiblePanel) {
1168
- $xeSelect.updatePlacement()
1169
- }
1170
- },
1171
- handleFocusSearch () {
1172
- const $xeSelect = this
1173
- const props = $xeSelect
1174
-
1175
- if (props.filterable) {
1176
- $xeSelect.$nextTick(() => {
1177
- const inpSearch = $xeSelect.$refs.refInpSearch as VxeInputConstructor
1178
- if (inpSearch) {
1179
- inpSearch.focus()
1180
- }
1181
- })
1182
- }
1183
- },
1184
- focusEvent (evnt: FocusEvent) {
1185
- const $xeSelect = this
1186
- const reactData = $xeSelect.reactData
1187
-
1188
- const isDisabled = $xeSelect.computeIsDisabled
1189
- const popupOpts = $xeSelect.computePopupOpts
1190
- const { trigger } = popupOpts
1191
- if (!isDisabled) {
1192
- if (!reactData.visiblePanel) {
1193
- if (!trigger || trigger === 'default') {
1194
- reactData.triggerFocusPanel = true
1195
- $xeSelect.showOptionPanel()
1196
- setTimeout(() => {
1197
- reactData.triggerFocusPanel = false
1198
- }, 500)
1199
- }
1200
- }
1201
- }
1202
- $xeSelect.dispatchEvent('focus', {}, evnt)
1203
- },
1204
- clickEvent (evnt: MouseEvent) {
1205
- const $xeSelect = this
1206
- const reactData = $xeSelect.reactData
1207
-
1208
- const popupOpts = $xeSelect.computePopupOpts
1209
- const { trigger } = popupOpts
1210
- if (!trigger || trigger === 'default') {
1211
- $xeSelect.togglePanelEvent(evnt)
1212
- }
1213
- $xeSelect.dispatchEvent('click', { triggerButton: false, visible: reactData.visiblePanel }, evnt)
1214
- },
1215
- blurEvent (evnt: FocusEvent) {
1216
- const $xeSelect = this
1217
- const reactData = $xeSelect.reactData
1218
-
1219
- reactData.isActivated = false
1220
- $xeSelect.dispatchEvent('blur', {}, evnt)
1221
- },
1222
- suffixClickEvent (evnt: MouseEvent) {
1223
- const $xeSelect = this
1224
- const reactData = $xeSelect.reactData
1225
-
1226
- const popupOpts = $xeSelect.computePopupOpts
1227
- const { trigger } = popupOpts
1228
- if (!trigger || trigger === 'default' || trigger === 'icon') {
1229
- $xeSelect.togglePanelEvent(evnt)
1230
- }
1231
- $xeSelect.dispatchEvent('click', { triggerButton: true, visible: reactData.visiblePanel }, evnt)
1232
- },
1233
- modelSearchEvent (value: string) {
1234
- const $xeSelect = this
1235
- const reactData = $xeSelect.reactData
1236
-
1237
- reactData.searchValue = value
1238
- },
1239
- focusSearchEvent () {
1240
- const $xeSelect = this
1241
- const reactData = $xeSelect.reactData
1242
-
1243
- reactData.isActivated = true
1244
- },
1245
- handleSearchEvent () {
1246
- const $xeSelect = this
1247
- const props = $xeSelect
1248
- const reactData = $xeSelect.reactData
1249
-
1250
- const { value, remote } = props
1251
- const { searchValue } = reactData
1252
- const remoteOpts = $xeSelect.computeRemoteOpts
1253
- const qyMethod = remoteOpts.queryMethod || props.remoteMethod
1254
- if (remote && qyMethod && remoteOpts.enabled) {
1255
- reactData.searchLoading = true
1256
- Promise.resolve(
1257
- qyMethod({ $select: $xeSelect, searchValue, value })
1258
- ).then(() => $xeSelect.$nextTick())
1259
- .catch(() => $xeSelect.$nextTick())
1260
- .finally(() => {
1261
- reactData.searchLoading = false
1262
- $xeSelect.handleOption()
1263
- $xeSelect.updateYData()
1264
- })
1265
- } else {
1266
- $xeSelect.handleOption()
1267
- $xeSelect.updateYData()
1268
- }
1269
- },
1270
- triggerSearchEvent: XEUtils.debounce(function (this: any) {
1271
- const $xeSelect = this
1272
-
1273
- $xeSelect.handleSearchEvent()
1274
- }, 350, { trailing: true }),
1275
- togglePanelEvent (params: any) {
1276
- const $xeSelect = this
1277
- const reactData = $xeSelect.reactData
1278
-
1279
- const { $event } = params
1280
- $event.preventDefault()
1281
- if (reactData.triggerFocusPanel) {
1282
- reactData.triggerFocusPanel = false
1283
- } else {
1284
- if (reactData.visiblePanel) {
1285
- $xeSelect.hideOptionPanel()
1286
- } else {
1287
- $xeSelect.showOptionPanel()
1288
- }
1289
- }
1290
- },
1291
- checkOptionDisabled (isSelected: any, option: VxeOptionProps) {
1292
- const $xeSelect = this
1293
-
1294
- if (option.disabled) {
1295
- return true
1296
- }
1297
- const isMaximize = $xeSelect.computeIsMaximize
1298
- if (isMaximize && !isSelected) {
1299
- return true
1300
- }
1301
- return false
1302
- },
1303
- updateYSpace () {
1304
- const $xeSelect = this
1305
- const reactData = $xeSelect.reactData
1306
- const internalData = $xeSelect.internalData
1307
-
1308
- const { scrollYLoad } = reactData
1309
- const { scrollYStore, afterVisibleList } = internalData
1310
- reactData.bodyHeight = scrollYLoad ? afterVisibleList.length * scrollYStore.rowHeight : 0
1311
- reactData.topSpaceHeight = scrollYLoad ? Math.max(scrollYStore.startIndex * scrollYStore.rowHeight, 0) : 0
1312
- },
1313
- handleData () {
1314
- const $xeSelect = this
1315
- const props = $xeSelect
1316
- const reactData = $xeSelect.reactData
1317
- const internalData = $xeSelect.internalData
1318
-
1319
- const { filterable, allowCreate } = props
1320
- const { scrollYLoad, searchValue } = reactData
1321
- const { optAddMaps, scrollYStore, afterVisibleList } = internalData
1322
- const labelField = $xeSelect.computeLabelField
1323
- const valueField = $xeSelect.computeValueField
1324
- const restList = scrollYLoad ? afterVisibleList.slice(scrollYStore.startIndex, scrollYStore.endIndex) : afterVisibleList.slice(0)
1325
- if (filterable && allowCreate && searchValue) {
1326
- if (!restList.some(option => option[labelField] === searchValue)) {
1327
- const addItem = optAddMaps[searchValue] || {
1328
- [$xeSelect.getOptKey()]: searchValue,
1329
- [labelField]: searchValue,
1330
- [valueField]: searchValue
1331
- }
1332
- optAddMaps[searchValue] = addItem
1333
- restList.unshift(addItem)
1334
- }
1335
- }
1336
- reactData.optList = restList
1337
- return $xeSelect.$nextTick()
1338
- },
1339
- updateYData () {
1340
- const $xeSelect = this
1341
-
1342
- $xeSelect.handleData()
1343
- $xeSelect.updateYSpace()
1344
- },
1345
- computeScrollLoad () {
1346
- const $xeSelect = this
1347
- const reactData = $xeSelect.reactData
1348
- const internalData = $xeSelect.internalData
1349
-
1350
- return $xeSelect.$nextTick().then(() => {
1351
- const { scrollYLoad } = reactData
1352
- const { scrollYStore } = internalData
1353
- const virtualBodyElem = $xeSelect.$refs.refVirtualBody as HTMLDivElement
1354
- const virtualYOpts = $xeSelect.computeVirtualYOpts
1355
- let rowHeight = 0
1356
- let firstItemElem: HTMLElement | undefined
1357
- if (virtualBodyElem) {
1358
- if (!firstItemElem) {
1359
- firstItemElem = virtualBodyElem.children[0] as HTMLElement
1360
- }
1361
- }
1362
- if (firstItemElem) {
1363
- rowHeight = firstItemElem.offsetHeight
1364
- }
1365
- rowHeight = Math.max(20, rowHeight)
1366
- scrollYStore.rowHeight = rowHeight
1367
- // 计算 Y 逻辑
1368
- if (scrollYLoad) {
1369
- const scrollBodyElem = $xeSelect.$refs.refVirtualWrapper as HTMLDivElement
1370
- const visibleYSize = Math.max(8, scrollBodyElem ? Math.ceil(scrollBodyElem.clientHeight / rowHeight) : 0)
1371
- const offsetYSize = Math.max(0, Math.min(2, XEUtils.toNumber(virtualYOpts.oSize)))
1372
- scrollYStore.offsetSize = offsetYSize
1373
- scrollYStore.visibleSize = visibleYSize
1374
- scrollYStore.endIndex = Math.max(scrollYStore.startIndex, visibleYSize + offsetYSize, scrollYStore.endIndex)
1375
- $xeSelect.updateYData()
1376
- } else {
1377
- $xeSelect.updateYSpace()
1378
- }
1379
- })
1380
- },
1381
- handleScrollToOption (option: any, isDwArrow?: boolean) {
1382
- const $xeSelect = this
1383
- const reactData = $xeSelect.reactData
1384
- const internalData = $xeSelect.internalData
1385
-
1386
- const { scrollYLoad } = reactData
1387
- const { optFullValMaps, scrollYStore } = internalData
1388
- const valueField = $xeSelect.computeValueField
1389
- const cacheItem = optFullValMaps[option[valueField]]
1390
- if (cacheItem) {
1391
- const optid = cacheItem.key
1392
- const avIndex = cacheItem._index
1393
- if (avIndex > -1) {
1394
- const optWrapperElem = $xeSelect.$refs.refVirtualWrapper as HTMLDivElement
1395
- const panelElem = $xeSelect.$refs.refOptionPanel as HTMLDivElement
1396
- const optElem = panelElem.querySelector(`[optid='${optid}']`) as HTMLElement
1397
- if (optWrapperElem) {
1398
- if (optElem) {
1399
- const wrapperHeight = optWrapperElem.offsetHeight
1400
- const offsetPadding = 1
1401
- if (isDwArrow) {
1402
- if (optElem.offsetTop + optElem.offsetHeight - optWrapperElem.scrollTop > wrapperHeight) {
1403
- optWrapperElem.scrollTop = optElem.offsetTop + optElem.offsetHeight - wrapperHeight
1404
- } else if (optElem.offsetTop + offsetPadding < optWrapperElem.scrollTop || optElem.offsetTop + offsetPadding > optWrapperElem.scrollTop + optWrapperElem.clientHeight) {
1405
- optWrapperElem.scrollTop = optElem.offsetTop - offsetPadding
1406
- }
1407
- } else {
1408
- if (optElem.offsetTop + offsetPadding < optWrapperElem.scrollTop || optElem.offsetTop + offsetPadding > optWrapperElem.scrollTop + optWrapperElem.clientHeight) {
1409
- optWrapperElem.scrollTop = optElem.offsetTop - offsetPadding
1410
- } else if (optElem.offsetTop + optElem.offsetHeight - optWrapperElem.scrollTop > wrapperHeight) {
1411
- optWrapperElem.scrollTop = optElem.offsetTop + optElem.offsetHeight - wrapperHeight
1412
- }
1413
- }
1414
- } else if (scrollYLoad) {
1415
- if (isDwArrow) {
1416
- optWrapperElem.scrollTop = avIndex * scrollYStore.rowHeight - optWrapperElem.clientHeight + scrollYStore.rowHeight
1417
- } else {
1418
- optWrapperElem.scrollTop = avIndex * scrollYStore.rowHeight
1419
- }
1420
- }
1421
- }
1422
- }
1423
- }
1424
- },
1425
- /**
1426
- * 如果有滚动条,则滚动到对应的位置
1427
- * @param {Number} scrollLeft 左距离
1428
- * @param {Number} scrollTop 上距离
1429
- */
1430
- scrollTo (scrollLeft: number | null, scrollTop?: number | null) {
1431
- const $xeSelect = this
1432
- const reactData = $xeSelect.reactData
1433
-
1434
- const scrollBodyElem = $xeSelect.$refs.refVirtualWrapper as HTMLDivElement
1435
- if (scrollBodyElem) {
1436
- if (XEUtils.isNumber(scrollLeft)) {
1437
- scrollBodyElem.scrollLeft = scrollLeft
1438
- }
1439
- if (XEUtils.isNumber(scrollTop)) {
1440
- scrollBodyElem.scrollTop = scrollTop
1441
- }
1442
- }
1443
- if (reactData.scrollYLoad) {
1444
- return new Promise<void>(resolve => {
1445
- setTimeout(() => {
1446
- $xeSelect.$nextTick(() => {
1447
- resolve()
1448
- })
1449
- }, 50)
1450
- })
1451
- }
1452
- return $xeSelect.$nextTick()
1453
- },
1454
- /**
1455
- * 刷新滚动条
1456
- */
1457
- refreshScroll () {
1458
- const $xeSelect = this
1459
- const internalData = $xeSelect.internalData
1460
-
1461
- const { lastScrollLeft, lastScrollTop } = internalData
1462
- return $xeSelect.clearScroll().then(() => {
1463
- if (lastScrollLeft || lastScrollTop) {
1464
- internalData.lastScrollLeft = 0
1465
- internalData.lastScrollTop = 0
1466
- return $xeSelect.scrollTo(lastScrollLeft, lastScrollTop)
1467
- }
1468
- })
1469
- },
1470
- /**
1471
- * 重新计算列表
1472
- */
1473
- recalculate () {
1474
- const $xeSelect = this
1475
-
1476
- const el = $xeSelect.$refs.refElem as HTMLDivElement
1477
- if (el && el.clientWidth && el.clientHeight) {
1478
- return $xeSelect.computeScrollLoad()
1479
- }
1480
- return Promise.resolve()
1481
- },
1482
- loadYData (evnt: Event) {
1483
- const $xeSelect = this
1484
- const internalData = $xeSelect.internalData
1485
-
1486
- const { scrollYStore } = internalData
1487
- const { startIndex, endIndex, visibleSize, offsetSize, rowHeight } = scrollYStore
1488
- const scrollBodyElem = evnt.target as HTMLDivElement
1489
- const scrollTop = scrollBodyElem.scrollTop
1490
- const toVisibleIndex = Math.floor(scrollTop / rowHeight)
1491
- const offsetStartIndex = Math.max(0, toVisibleIndex - 1 - offsetSize)
1492
- const offsetEndIndex = toVisibleIndex + visibleSize + offsetSize
1493
- if (toVisibleIndex <= startIndex || toVisibleIndex >= endIndex - visibleSize - 1) {
1494
- if (startIndex !== offsetStartIndex || endIndex !== offsetEndIndex) {
1495
- scrollYStore.startIndex = offsetStartIndex
1496
- scrollYStore.endIndex = offsetEndIndex
1497
- $xeSelect.updateYData()
1498
- }
1499
- }
1500
- },
1501
- // 滚动、拖动过程中不需要触发
1502
- isVMScrollProcess () {
1503
- const $xeSelect = this
1504
- const internalData = $xeSelect.internalData
1505
-
1506
- const delayHover = 250
1507
- const { lastScrollTime } = internalData
1508
- return !!(lastScrollTime && Date.now() < lastScrollTime + delayHover)
1509
- },
1510
- scrollEvent (evnt: Event) {
1511
- const $xeSelect = this
1512
- const reactData = $xeSelect.reactData
1513
- const internalData = $xeSelect.internalData
1514
-
1515
- const scrollBodyElem = evnt.target as HTMLDivElement
1516
- const scrollTop = scrollBodyElem.scrollTop
1517
- const scrollLeft = scrollBodyElem.scrollLeft
1518
- const isX = scrollLeft !== internalData.lastScrollLeft
1519
- const isY = scrollTop !== internalData.lastScrollTop
1520
- internalData.lastScrollTop = scrollTop
1521
- internalData.lastScrollLeft = scrollLeft
1522
- if (reactData.scrollYLoad) {
1523
- $xeSelect.loadYData(evnt)
1524
- }
1525
- internalData.lastScrollTime = Date.now()
1526
- $xeSelect.dispatchEvent('scroll', { scrollLeft, scrollTop, isX, isY }, evnt)
1527
- },
1528
- /**
1529
- * 加载数据
1530
- * @param {Array} datas 数据
1531
- */
1532
- loadData (datas: any[]) {
1533
- const $xeSelect = this
1534
- const props = $xeSelect
1535
- const reactData = $xeSelect.reactData
1536
- const internalData = $xeSelect.internalData
1537
-
1538
- $xeSelect.cacheItemMap(datas || [])
1539
- const { multiple } = props
1540
- const { isLoaded, fullData, scrollYStore } = internalData
1541
- const defaultOpts = $xeSelect.computeDefaultOpts
1542
- const virtualYOpts = $xeSelect.computeVirtualYOpts
1543
- const valueField = $xeSelect.computeValueField
1544
- Object.assign(scrollYStore, {
1545
- startIndex: 0,
1546
- endIndex: 1,
1547
- visibleSize: 0
1548
- })
1549
- internalData.synchData = datas || []
1550
- // 如果gt为0,则总是启用
1551
- reactData.scrollYLoad = !!virtualYOpts.enabled && virtualYOpts.gt > -1 && (virtualYOpts.gt === 0 || virtualYOpts.gt <= fullData.length)
1552
- $xeSelect.handleData()
1553
- if (!isLoaded) {
1554
- const { selectMode } = defaultOpts
1555
- if (datas.length > 0 && XEUtils.eqNull(props.value)) {
1556
- if (selectMode === 'all') {
1557
- if (multiple) {
1558
- $xeSelect.$nextTick(() => {
1559
- $xeSelect.emitDefaultValue(datas.map(item => item[valueField]))
1560
- })
1561
- } else {
1562
- errLog('vxe.error.notConflictProp', ['default-config.selectMode=all', 'multiple=true'])
1563
- }
1564
- } else if (selectMode === 'first' || selectMode === 'last') {
1565
- const selectItem = XEUtils[selectMode](datas)
1566
- if (selectItem) {
1567
- $xeSelect.$nextTick(() => {
1568
- if (XEUtils.eqNull(props.value)) {
1569
- $xeSelect.emitDefaultValue(selectItem[valueField])
1570
- }
1571
- })
1572
- }
1573
- }
1574
- internalData.isLoaded = true
1575
- }
1576
- }
1577
- return $xeSelect.computeScrollLoad().then(() => {
1578
- $xeSelect.refreshScroll()
1579
- })
1580
- },
1581
- reloadData (datas: any[]) {
1582
- const $xeSelect = this
1583
- const internalData = $xeSelect.internalData
1584
-
1585
- internalData.isLoaded = false
1586
- $xeSelect.clearScroll()
1587
- return $xeSelect.loadData(datas)
1588
- },
1589
- clearScroll () {
1590
- const $xeSelect = this
1591
- const internalData = $xeSelect.internalData
1592
-
1593
- const scrollBodyElem = $xeSelect.$refs.refVirtualWrapper as HTMLDivElement
1594
- if (scrollBodyElem) {
1595
- scrollBodyElem.scrollTop = 0
1596
- scrollBodyElem.scrollLeft = 0
1597
- }
1598
- internalData.lastScrollTop = 0
1599
- internalData.lastScrollLeft = 0
1600
- return $xeSelect.$nextTick()
1601
- },
1602
- hasOptGroupById (optid: any) {
1603
- const $xeSelect = this
1604
- const internalData = $xeSelect.internalData
1605
-
1606
- const { optGroupKeyMaps } = internalData
1607
- return !!optGroupKeyMaps[optid]
1608
- },
1609
-
1610
- //
1611
- // Render
1612
- //
1613
- renderOption (h: CreateElement, list: VxeOptionProps[]) {
1614
- const $xeSelect = this
1615
- const props = $xeSelect
1616
- const slots = $xeSelect.$scopedSlots
1617
- const reactData = $xeSelect.reactData
1618
- const internalData = $xeSelect.internalData
1619
-
1620
- const { allowCreate, optionKey } = props
1621
- const { currentOption } = reactData
1622
- const { optAddMaps } = internalData
1623
- const optionOpts = $xeSelect.computeOptionOpts
1624
- const labelField = $xeSelect.computeLabelField
1625
- const valueField = $xeSelect.computeValueField
1626
- const groupLabelField = $xeSelect.computeGroupLabelField
1627
- const selectVals = $xeSelect.computeSelectVals
1628
- const { useKey, height } = optionOpts
1629
- const optionSlot = slots.option
1630
- return list.map((option, cIndex) => {
1631
- const { slots, className } = option
1632
- const optid = $xeSelect.getOptId(option)
1633
- const optionValue = option[valueField as 'value']
1634
- const isOptGroup = $xeSelect.hasOptGroupById(optid)
1635
- const isAdd = !!(allowCreate && optAddMaps[optid])
1636
- const isSelected = !isAdd && selectVals.indexOf(optionValue) > -1
1637
- const isVisible = isAdd || (!isOptGroup || isOptionVisible(option))
1638
- const isDisabled = !isAdd && $xeSelect.checkOptionDisabled(isSelected, option)
1639
- const defaultSlot = slots ? slots.default : null
1640
- const optParams = { option, group: isOptGroup ? option : null, $select: $xeSelect }
1641
- let optLabel = ''
1642
- let optVNs: string | VxeComponentSlotType[] = []
1643
- if (optionSlot) {
1644
- optVNs = $xeSelect.callSlot(optionSlot, optParams, h)
1645
- } else if (defaultSlot) {
1646
- optVNs = $xeSelect.callSlot(defaultSlot, optParams, h)
1647
- } else {
1648
- optLabel = getFuncText(option[(isOptGroup ? groupLabelField : labelField) as 'label'] || optionValue)
1649
- optVNs = optLabel
1650
- }
1651
-
1652
- return isVisible
1653
- ? h('div', {
1654
- key: useKey || optionKey ? optid : cIndex,
1655
- class: ['vxe-select-option', className ? (XEUtils.isFunction(className) ? className(optParams) : className) : '', {
1656
- 'vxe-select-optgroup': isOptGroup,
1657
- 'is--disabled': isDisabled,
1658
- 'is--selected': isSelected,
1659
- 'is--add': isAdd,
1660
- 'is--hover': currentOption && $xeSelect.getOptId(currentOption) === optid
1661
- }],
1662
- attrs: {
1663
- optid: optid,
1664
- title: optLabel || null
1665
- },
1666
- style: height
1667
- ? {
1668
- height: toCssUnit(height)
1669
- }
1670
- : undefined,
1671
- on: {
1672
- mousedown: (evnt: MouseEvent) => {
1673
- const isLeftBtn = evnt.button === 0
1674
- if (isLeftBtn) {
1675
- evnt.stopPropagation()
1676
- }
1677
- },
1678
- click: (evnt: MouseEvent) => {
1679
- if (!isDisabled && !isOptGroup) {
1680
- $xeSelect.changeOptionEvent(evnt, option)
1681
- }
1682
- },
1683
- mouseenter: () => {
1684
- if (!isDisabled && !isOptGroup && !$xeSelect.isVMScrollProcess()) {
1685
- $xeSelect.setCurrentOption(option)
1686
- }
1687
- }
1688
- }
1689
- }, allowCreate
1690
- ? [
1691
- h('span', {
1692
- key: 1,
1693
- class: 'vxe-select-option--label'
1694
- }, optVNs),
1695
- isAdd
1696
- ? h('span', {
1697
- key: 2,
1698
- class: 'vxe-select-option--add-icon'
1699
- }, [
1700
- h('i', {
1701
- class: getIcon().SELECT_ADD_OPTION
1702
- })
1703
- ])
1704
- : renderEmptyElement($xeSelect)
1705
- ]
1706
- : optVNs)
1707
- : renderEmptyElement($xeSelect)
1708
- })
1709
- },
1710
- renderOpts (h: CreateElement): VNode[] {
1711
- const $xeSelect = this
1712
- const props = $xeSelect
1713
- const reactData = $xeSelect.reactData
1714
-
1715
- const { optList, searchLoading } = reactData
1716
- if (searchLoading) {
1717
- return [
1718
- h('div', {
1719
- class: 'vxe-select--search-loading'
1720
- }, [
1721
- h('i', {
1722
- class: ['vxe-select--search-icon', getIcon().SELECT_LOADED]
1723
- }),
1724
- h('span', {
1725
- class: 'vxe-select--search-text'
1726
- }, getI18n('vxe.select.loadingText'))
1727
- ])
1728
- ]
1729
- }
1730
- if (optList.length) {
1731
- return $xeSelect.renderOption(h, optList)
1732
- }
1733
- return [
1734
- h('div', {
1735
- class: 'vxe-select--empty-placeholder'
1736
- }, props.emptyText || getI18n('vxe.select.emptyText'))
1737
- ]
1738
- },
1739
- renderVN (h: CreateElement): VNode {
1740
- const $xeSelect = this
1741
- const props = $xeSelect
1742
- const slots = $xeSelect.$scopedSlots
1743
- const reactData = $xeSelect.reactData
1744
-
1745
- const { className, multiple, loading, filterable, showTotalButoon, showCheckedButoon, showClearButton } = props
1746
- const { initialized, isActivated, isAniVisible, optList, visiblePanel, bodyHeight, topSpaceHeight } = reactData
1747
- const vSize = $xeSelect.computeSize
1748
- const isDisabled = $xeSelect.computeIsDisabled
1749
- const selectLabel = $xeSelect.computeSelectLabel
1750
- const fullLabel = $xeSelect.computeFullLabel
1751
- const btnTransfer = $xeSelect.computeBtnTransfer
1752
- const formReadonly = $xeSelect.computeFormReadonly
1753
- const inpPlaceholder = $xeSelect.computeInpPlaceholder
1754
- const popupOpts = $xeSelect.computePopupOpts
1755
- const popupWrapperStyle = $xeSelect.computePopupWrapperStyle
1756
- const defaultSlot = slots.default
1757
- const headerSlot = slots.header
1758
- const footerSlot = slots.footer
1759
- const prefixSlot = slots.prefix
1760
- const ppClassName = popupOpts.className || props.popupClassName
1761
- if (formReadonly) {
1762
- return h('div', {
1763
- ref: 'refElem',
1764
- class: ['vxe-select--readonly', className]
1765
- }, [
1766
- h('div', {
1767
- class: 'vxe-select-slots',
1768
- ref: 'hideOption'
1769
- }, defaultSlot ? $xeSelect.callSlot(defaultSlot, {}, h) : []),
1770
- h('span', {
1771
- class: 'vxe-select-label',
1772
- attrs: {
1773
- fullLabel
1774
- }
1775
- }, selectLabel)
1776
- ])
1777
- }
1778
- const selectVals = $xeSelect.computeSelectVals
1779
- return h('div', {
1780
- ref: 'refElem',
1781
- class: ['vxe-select', className ? (XEUtils.isFunction(className) ? className({ $select: $xeSelect }) : className) : '', {
1782
- [`size--${vSize}`]: vSize,
1783
- 'is--visible': visiblePanel,
1784
- 'is--disabled': isDisabled,
1785
- 'is--filter': filterable,
1786
- 'is--loading': loading,
1787
- 'is--active': isActivated
1788
- }]
1789
- }, [
1790
- h('div', {
1791
- class: 'vxe-select-slots',
1792
- ref: 'hideOption'
1793
- }, defaultSlot ? defaultSlot.call($xeSelect, {}) : []),
1794
- h(VxeInputComponent, {
1795
- ref: 'refInput',
1796
- props: {
1797
- clearable: props.clearable,
1798
- placeholder: inpPlaceholder,
1799
- editable: false,
1800
- disabled: isDisabled,
1801
- type: 'text',
1802
- prefixIcon: props.prefixIcon,
1803
- suffixIcon: loading ? getIcon().SELECT_LOADED : (visiblePanel ? getIcon().SELECT_OPEN : getIcon().SELECT_CLOSE),
1804
- autoFocus: false,
1805
- title: fullLabel,
1806
- value: selectLabel
1807
- },
1808
- on: {
1809
- clear: $xeSelect.clearEvent,
1810
- click: $xeSelect.clickEvent,
1811
- focus: $xeSelect.focusEvent,
1812
- blur: $xeSelect.blurEvent,
1813
- 'suffix-click': $xeSelect.suffixClickEvent
1814
- },
1815
- scopedSlots: prefixSlot
1816
- ? {
1817
- prefix: () => prefixSlot({})
1818
- }
1819
- : {}
1820
- }),
1821
- h('div', {
1822
- ref: 'refOptionPanel',
1823
- class: ['vxe-table--ignore-clear vxe-select--panel', ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $select: $xeSelect }) : ppClassName) : '', {
1824
- [`size--${vSize}`]: vSize,
1825
- 'is--transfer': btnTransfer,
1826
- 'ani--leave': !loading && isAniVisible,
1827
- 'ani--enter': !loading && visiblePanel
1828
- }],
1829
- attrs: {
1830
- placement: reactData.panelPlacement
1831
- },
1832
- style: reactData.panelStyle
1833
- }, initialized && (visiblePanel || isAniVisible)
1834
- ? [
1835
- h('div', {
1836
- class: 'vxe-select--panel-wrapper',
1837
- style: popupWrapperStyle
1838
- }, [
1839
- filterable
1840
- ? h('div', {
1841
- class: 'vxe-select--panel-search'
1842
- }, [
1843
- h(VxeInputComponent, {
1844
- ref: 'refInpSearch',
1845
- class: 'vxe-select-search--input',
1846
- props: {
1847
- value: reactData.searchValue,
1848
- type: 'text',
1849
- clearable: true,
1850
- disabled: false,
1851
- readonly: false,
1852
- placeholder: getI18n('vxe.select.search'),
1853
- prefixIcon: getIcon().INPUT_SEARCH
1854
- },
1855
- on: {
1856
- 'model-value': $xeSelect.modelSearchEvent,
1857
- focus: $xeSelect.focusSearchEvent,
1858
- change: $xeSelect.triggerSearchEvent,
1859
- search: $xeSelect.triggerSearchEvent
1860
- }
1861
- })
1862
- ])
1863
- : renderEmptyElement($xeSelect),
1864
- showTotalButoon || (showCheckedButoon && multiple) || showClearButton || headerSlot
1865
- ? h('div', {
1866
- class: 'vxe-select--panel-header'
1867
- }, headerSlot
1868
- ? $xeSelect.callSlot(headerSlot, {}, h)
1869
- : [
1870
- h('div', {
1871
- class: 'vxe-tree-select--header-button'
1872
- }, [
1873
- showTotalButoon
1874
- ? h('div', {
1875
- class: 'vxe-tree-select--header-total'
1876
- }, getI18n('vxe.select.total', [selectVals.length, optList.length]))
1877
- : renderEmptyElement($xeSelect),
1878
- h('div', {
1879
- class: 'vxe-tree-select--header-btns'
1880
- }, [
1881
- (showCheckedButoon && multiple)
1882
- ? h(VxeButtonComponent, {
1883
- props: {
1884
- content: getI18n('vxe.select.allChecked'),
1885
- mode: 'text'
1886
- },
1887
- on: {
1888
- click: $xeSelect.allCheckedPanelEvent
1889
- }
1890
- })
1891
- : renderEmptyElement($xeSelect),
1892
- showClearButton
1893
- ? h(VxeButtonComponent, {
1894
- props: {
1895
- content: getI18n('vxe.select.clear'),
1896
- mode: 'text'
1897
- },
1898
- on: {
1899
- click: $xeSelect.clearCheckedPanelEvent
1900
- }
1901
- })
1902
- : renderEmptyElement($xeSelect)
1903
- ])
1904
- ])
1905
- ])
1906
- : renderEmptyElement($xeSelect),
1907
- h('div', {
1908
- class: 'vxe-select--panel-body'
1909
- }, [
1910
- h('div', {
1911
- ref: 'refVirtualWrapper',
1912
- class: 'vxe-select-option--wrapper',
1913
- on: {
1914
- scroll: $xeSelect.scrollEvent
1915
- }
1916
- }, [
1917
- h('div', {
1918
- class: 'vxe-select--y-space',
1919
- style: {
1920
- height: bodyHeight ? `${bodyHeight}px` : ''
1921
- }
1922
- }),
1923
- h('div', {
1924
- ref: 'refVirtualBody',
1925
- class: 'vxe-select--body',
1926
- style: {
1927
- transform: `translateY(${topSpaceHeight}px)`
1928
- }
1929
- }, $xeSelect.renderOpts(h))
1930
- ])
1931
- ]),
1932
- footerSlot
1933
- ? h('div', {
1934
- class: 'vxe-select--panel-footer'
1935
- }, $xeSelect.callSlot(footerSlot, {}, h))
1936
- : renderEmptyElement($xeSelect)
1937
- ])
1938
- ]
1939
- : [])
1940
- ])
1941
- }
1942
- },
1943
- watch: {
1944
- 'reactData.staticOptions' (val: VxeSelectDefines.OptionInfo[]) {
1945
- const $xeSelect = this
1946
-
1947
- $xeSelect.loadData(val)
1948
- },
1949
- options (val) {
1950
- const $xeSelect = this
1951
-
1952
- $xeSelect.loadData(val)
1953
- },
1954
- optionGroups (val) {
1955
- const $xeSelect = this
1956
-
1957
- $xeSelect.loadData(val)
1958
- }
1959
- },
1960
- mounted () {
1961
- const $xeSelect = this
1962
- const props = $xeSelect
1963
-
1964
- $xeSelect.$nextTick(() => {
1965
- const { options, optionGroups } = props
1966
- if (optionGroups) {
1967
- $xeSelect.loadData(optionGroups)
1968
- } else if (options) {
1969
- $xeSelect.loadData(options)
1970
- }
1971
- })
1972
- globalEvents.on($xeSelect, 'mousewheel', $xeSelect.handleGlobalMousewheelEvent)
1973
- globalEvents.on($xeSelect, 'mousedown', $xeSelect.handleGlobalMousedownEvent)
1974
- globalEvents.on($xeSelect, 'keydown', $xeSelect.handleGlobalKeydownEvent)
1975
- globalEvents.on($xeSelect, 'blur', $xeSelect.handleGlobalBlurEvent)
1976
- globalEvents.on($xeSelect, 'resize', $xeSelect.handleGlobalResizeEvent)
1977
- },
1978
- beforeDestroy () {
1979
- const $xeSelect = this
1980
-
1981
- const panelElem = $xeSelect.$refs.refOptionPanel as HTMLElement | undefined
1982
- if (panelElem && panelElem.parentNode) {
1983
- panelElem.parentNode.removeChild(panelElem)
1984
- }
1985
- globalEvents.off($xeSelect, 'mousewheel')
1986
- globalEvents.off($xeSelect, 'mousedown')
1987
- globalEvents.off($xeSelect, 'keydown')
1988
- globalEvents.off($xeSelect, 'blur')
1989
- globalEvents.off($xeSelect, 'resize')
1990
- },
1991
- destroyed () {
1992
- const $xeSelect = this
1993
- const internalData = $xeSelect.internalData
1994
-
1995
- XEUtils.assign(internalData, createInternalData())
1996
- },
1997
- render (this: any, h) {
1998
- return this.renderVN(h)
1999
- }
2000
- }) /* define-vxe-component end */
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, toCssUnit, updatePanelPlacement } from '../../ui/src/dom'
6
+ import { getLastZIndex, nextZIndex, getFuncText, eqEmptyValue } from '../../ui/src/utils'
7
+ import { getSlotVNs } from '../../ui/src/vn'
8
+ import { errLog } from '../../ui/src/log'
9
+ import VxeInputComponent from '../../input/src/input'
10
+ import VxeButtonComponent from '../../button/src/button'
11
+
12
+ import type { VxeSelectPropTypes, SelectInternalData, ValueOf, VxeComponentSizeType, SelectReactData, VxeSelectEmits, VxeButtonDefines, VxeInputDefines, VxeSelectDefines, VxeOptionProps, VxeDrawerConstructor, VxeDrawerMethods, VxeFormDefines, VxeFormConstructor, VxeFormPrivateMethods, VxeModalConstructor, VxeModalMethods, VxeInputConstructor, VxeComponentSlotType, VxeComponentStyleType } from '../../../types'
13
+ import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
14
+
15
+ function isOptionVisible (option: any) {
16
+ return option.visible !== false
17
+ }
18
+
19
+ function getOptUniqueId () {
20
+ return XEUtils.uniqueId('opt_')
21
+ }
22
+
23
+ function createInternalData (): SelectInternalData {
24
+ return {
25
+ // isLoaded: false,
26
+ synchData: [],
27
+ fullData: [],
28
+ afterVisibleList: [],
29
+ optAddMaps: {},
30
+ optGroupKeyMaps: {},
31
+ optFullValMaps: {},
32
+ remoteValMaps: {},
33
+
34
+ lastScrollLeft: 0,
35
+ lastScrollTop: 0,
36
+ scrollYStore: {
37
+ startIndex: 0,
38
+ endIndex: 0,
39
+ visibleSize: 0,
40
+ offsetSize: 0,
41
+ rowHeight: 0
42
+ },
43
+
44
+ lastScrollTime: 0,
45
+ hpTimeout: undefined
46
+ }
47
+ }
48
+
49
+ export default /* define-vxe-component start */ defineVxeComponent({
50
+ name: 'VxeSelect',
51
+ mixins: [
52
+ globalMixins.sizeMixin
53
+ ],
54
+ model: {
55
+ prop: 'value',
56
+ event: 'modelValue'
57
+ },
58
+ props: {
59
+ value: [String, Number, Boolean, Array] as PropType<VxeSelectPropTypes.ModelValue>,
60
+ defaultConfig: Object as PropType<VxeSelectPropTypes.DefaultConfig>,
61
+ clearable: Boolean as PropType<VxeSelectPropTypes.Clearable>,
62
+ placeholder: String as PropType<VxeSelectPropTypes.Placeholder>,
63
+ readonly: {
64
+ type: Boolean as PropType<VxeSelectPropTypes.Readonly>,
65
+ default: null
66
+ },
67
+ loading: Boolean as PropType<VxeSelectPropTypes.Loading>,
68
+ disabled: {
69
+ type: Boolean as PropType<VxeSelectPropTypes.Disabled>,
70
+ default: null
71
+ },
72
+ multiple: Boolean as PropType<VxeSelectPropTypes.Multiple>,
73
+ multiCharOverflow: {
74
+ type: [Number, String] as PropType<VxeSelectPropTypes.MultiCharOverflow>,
75
+ default: () => getConfig().select.multiCharOverflow
76
+ },
77
+ prefixIcon: String as PropType<VxeSelectPropTypes.PrefixIcon>,
78
+ allowCreate: {
79
+ type: Boolean as PropType<VxeSelectPropTypes.AllowCreate>,
80
+ default: () => getConfig().select.allowCreate
81
+ },
82
+ placement: String as PropType<VxeSelectPropTypes.Placement>,
83
+ lazyOptions: Array as PropType<VxeSelectPropTypes.LazyOptions>,
84
+ options: Array as PropType<VxeSelectPropTypes.Options>,
85
+ optionProps: Object as PropType<VxeSelectPropTypes.OptionProps>,
86
+ optionGroups: Array as PropType<VxeSelectPropTypes.OptionGroups>,
87
+ optionGroupProps: Object as PropType<VxeSelectPropTypes.OptionGroupProps>,
88
+ optionConfig: Object as PropType<VxeSelectPropTypes.OptionConfig>,
89
+ className: [String, Function] as PropType<VxeSelectPropTypes.ClassName>,
90
+ /**
91
+ * 已废弃,请使用 popupConfig.className
92
+ * @deprecated
93
+ */
94
+ popupClassName: [String, Function] as PropType<VxeSelectPropTypes.PopupClassName>,
95
+ max: {
96
+ type: [String, Number] as PropType<VxeSelectPropTypes.Max>,
97
+ default: null
98
+ },
99
+ /**
100
+ * 已废弃,请使用 popupConfig.zIndex
101
+ * @deprecated
102
+ */
103
+ zIndex: Number as PropType<VxeSelectPropTypes.ZIndex>,
104
+ size: {
105
+ type: String as PropType<VxeSelectPropTypes.Size>,
106
+ default: () => getConfig().select.size || getConfig().size
107
+ },
108
+ filterable: Boolean as PropType<VxeSelectPropTypes.Filterable>,
109
+ /**
110
+ * 已废弃,被 filter-config.filterMethod 替换
111
+ * @deprecated
112
+ */
113
+ filterMethod: Function as PropType<VxeSelectPropTypes.FilterMethod>,
114
+ filterConfig: Object as PropType<VxeSelectPropTypes.FilterConfig>,
115
+ remote: Boolean as PropType<VxeSelectPropTypes.Remote>,
116
+ remoteConfig: Object as PropType<VxeSelectPropTypes.RemoteConfig>,
117
+ emptyText: String as PropType<VxeSelectPropTypes.EmptyText>,
118
+ showTotalButoon: {
119
+ type: Boolean as PropType<VxeSelectPropTypes.ShowTotalButoon>,
120
+ default: () => getConfig().select.showTotalButoon
121
+ },
122
+ showCheckedButoon: {
123
+ type: Boolean as PropType<VxeSelectPropTypes.ShowCheckedButoon>,
124
+ default: () => getConfig().select.showCheckedButoon
125
+ },
126
+ showClearButton: {
127
+ type: Boolean as PropType<VxeSelectPropTypes.ShowClearButton>,
128
+ default: () => getConfig().select.showClearButton
129
+ },
130
+ transfer: {
131
+ type: Boolean as PropType<VxeSelectPropTypes.Transfer>,
132
+ default: null
133
+ },
134
+ popupConfig: Object as PropType<VxeSelectPropTypes.PopupConfig>,
135
+ virtualYConfig: Object as PropType<VxeSelectPropTypes.VirtualYConfig>,
136
+ scrollY: Object as PropType<VxeSelectPropTypes.ScrollY>,
137
+
138
+ /**
139
+ * 已废弃,被 remote-config.queryMethod 替换
140
+ * @deprecated
141
+ */
142
+ remoteMethod: Function as PropType<VxeSelectPropTypes.RemoteMethod>,
143
+ /**
144
+ * 已废弃,被 option-config.keyField 替换
145
+ * @deprecated
146
+ */
147
+ optionId: {
148
+ type: String as PropType<VxeSelectPropTypes.OptionId>,
149
+ default: () => getConfig().select.optionId
150
+ },
151
+ /**
152
+ * 已废弃,被 option-config.useKey 替换
153
+ * @deprecated
154
+ */
155
+ optionKey: Boolean as PropType<VxeSelectPropTypes.OptionKey>
156
+ },
157
+ inject: {
158
+ $xeModal: {
159
+ default: null
160
+ },
161
+ $xeDrawer: {
162
+ default: null
163
+ },
164
+ $xeTable: {
165
+ default: null
166
+ },
167
+ $xeForm: {
168
+ default: null
169
+ },
170
+ formItemInfo: {
171
+ from: 'xeFormItemInfo',
172
+ default: null
173
+ }
174
+ },
175
+ provide () {
176
+ const $xeSelect = this
177
+ return {
178
+ $xeSelect
179
+ }
180
+ },
181
+ data () {
182
+ const xID = XEUtils.uniqueId()
183
+ const reactData: SelectReactData = {
184
+ initialized: false,
185
+ scrollYLoad: false,
186
+ bodyHeight: 0,
187
+ topSpaceHeight: 0,
188
+ optList: [],
189
+ staticOptions: [],
190
+ reactFlag: 1,
191
+
192
+ currentOption: null,
193
+ searchValue: '',
194
+ searchLoading: false,
195
+
196
+ panelIndex: 0,
197
+ panelStyle: {},
198
+ panelPlacement: null,
199
+ triggerFocusPanel: false,
200
+ visiblePanel: false,
201
+ isAniVisible: false,
202
+ isActivated: false
203
+ }
204
+ const internalData = createInternalData()
205
+
206
+ return {
207
+ xID,
208
+ reactData,
209
+ internalData
210
+ }
211
+ },
212
+ computed: {
213
+ ...({} as {
214
+ computeSize(): VxeComponentSizeType
215
+ $xeModal(): (VxeModalConstructor & VxeModalMethods) | null
216
+ $xeDrawer(): (VxeDrawerConstructor & VxeDrawerMethods) | null
217
+ $xeTable(): (VxeTableConstructor & VxeTablePrivateMethods) | null
218
+ $xeForm(): (VxeFormConstructor & VxeFormPrivateMethods) | null
219
+ formItemInfo(): VxeFormDefines.ProvideItemInfo | null
220
+ }),
221
+ computeFormReadonly () {
222
+ const $xeSelect = this
223
+ const props = $xeSelect
224
+ const $xeForm = $xeSelect.$xeForm
225
+
226
+ const { readonly } = props
227
+ if (readonly === null) {
228
+ if ($xeForm) {
229
+ return $xeForm.readonly
230
+ }
231
+ return false
232
+ }
233
+ return readonly
234
+ },
235
+ computeIsDisabled () {
236
+ const $xeSelect = this
237
+ const props = $xeSelect
238
+ const $xeForm = $xeSelect.$xeForm
239
+
240
+ const { disabled } = props
241
+ if (disabled === null) {
242
+ if ($xeForm) {
243
+ return $xeForm.disabled
244
+ }
245
+ return false
246
+ }
247
+ return disabled
248
+ },
249
+ computeBtnTransfer () {
250
+ const $xeSelect = this
251
+ const props = $xeSelect
252
+ const $xeTable = $xeSelect.$xeTable
253
+ const $xeModal = $xeSelect.$xeModal
254
+ const $xeDrawer = $xeSelect.$xeDrawer
255
+ const $xeForm = $xeSelect.$xeForm
256
+
257
+ const { transfer } = props
258
+ const popupOpts = $xeSelect.computePopupOpts as VxeSelectPropTypes.PopupConfig
259
+ if (XEUtils.isBoolean(popupOpts.transfer)) {
260
+ return popupOpts.transfer
261
+ }
262
+ if (transfer === null) {
263
+ const globalTransfer = getConfig().select.transfer
264
+ if (XEUtils.isBoolean(globalTransfer)) {
265
+ return globalTransfer
266
+ }
267
+ if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
268
+ return true
269
+ }
270
+ }
271
+ return transfer
272
+ },
273
+ computeInpPlaceholder () {
274
+ const $xeSelect = this
275
+ const props = $xeSelect
276
+
277
+ const { placeholder } = props
278
+ if (placeholder) {
279
+ return getFuncText(placeholder)
280
+ }
281
+ const globalPlaceholder = getConfig().select.placeholder
282
+ if (globalPlaceholder) {
283
+ return getFuncText(globalPlaceholder)
284
+ }
285
+ return getI18n('vxe.base.pleaseSelect')
286
+ },
287
+ computeDefaultOpts () {
288
+ const $xeSelect = this
289
+ const props = $xeSelect
290
+
291
+ return Object.assign({}, props.defaultConfig)
292
+ },
293
+ computePropsOpts () {
294
+ const $xeSelect = this
295
+ const props = $xeSelect
296
+
297
+ return Object.assign({}, props.optionProps)
298
+ },
299
+ computeGroupPropsOpts () {
300
+ const $xeSelect = this
301
+ const props = $xeSelect
302
+
303
+ return Object.assign({}, props.optionGroupProps)
304
+ },
305
+ computeLabelField () {
306
+ const $xeSelect = this
307
+
308
+ const propsOpts = $xeSelect.computePropsOpts as VxeSelectPropTypes.OptionProps
309
+ return propsOpts.label || 'label'
310
+ },
311
+ computeValueField () {
312
+ const $xeSelect = this
313
+
314
+ const propsOpts = $xeSelect.computePropsOpts as VxeSelectPropTypes.OptionProps
315
+ return propsOpts.value || 'value'
316
+ },
317
+ computeGroupLabelField () {
318
+ const $xeSelect = this
319
+
320
+ const groupPropsOpts = $xeSelect.computeGroupPropsOpts as VxeSelectPropTypes.OptionGroupProps
321
+ return groupPropsOpts.label || 'label'
322
+ },
323
+ computeGroupOptionsField () {
324
+ const $xeSelect = this
325
+
326
+ const groupPropsOpts = $xeSelect.computeGroupPropsOpts as VxeSelectPropTypes.OptionGroupProps
327
+ return groupPropsOpts.options || 'options'
328
+ },
329
+ computeIsMaximize () {
330
+ const $xeSelect = this
331
+
332
+ const selectVals = $xeSelect.computeSelectVals
333
+ return ($xeSelect as any).checkMaxLimit(selectVals) as boolean
334
+ },
335
+ computePopupOpts () {
336
+ const $xeSelect = this
337
+ const props = $xeSelect
338
+
339
+ return Object.assign({}, getConfig().select.popupConfig, props.popupConfig)
340
+ },
341
+ computeVirtualYOpts () {
342
+ const $xeSelect = this
343
+ const props = $xeSelect
344
+
345
+ return Object.assign({} as { gt: number }, getConfig().select.virtualYConfig || getConfig().select.scrollY, props.virtualYConfig || props.scrollY)
346
+ },
347
+ computeRemoteOpts () {
348
+ const $xeSelect = this
349
+ const props = $xeSelect
350
+
351
+ return Object.assign({}, getConfig().select.remoteConfig, props.remoteConfig)
352
+ },
353
+ computeFilterOpts () {
354
+ const $xeSelect = this
355
+ const props = $xeSelect
356
+
357
+ return Object.assign({}, getConfig().select.filterConfig, props.filterConfig)
358
+ },
359
+ computeOptionOpts () {
360
+ const $xeSelect = this
361
+ const props = $xeSelect
362
+
363
+ return Object.assign({}, getConfig().select.optionConfig, props.optionConfig)
364
+ },
365
+ computeIsGroup (this: any) {
366
+ const $xeSelect = this
367
+ const reactData = $xeSelect.reactData
368
+
369
+ return reactData.fullGroupList.some((item: any) => item.options && item.options.length)
370
+ },
371
+ computeMultiMaxCharNum () {
372
+ const $xeSelect = this
373
+ const props = $xeSelect
374
+
375
+ return XEUtils.toNumber(props.multiCharOverflow)
376
+ },
377
+ computePopupWrapperStyle () {
378
+ const $xeSelect = this
379
+
380
+ const popupOpts = $xeSelect.computePopupOpts
381
+ const { height, width } = popupOpts
382
+ const stys: VxeComponentStyleType = {}
383
+ if (width) {
384
+ stys.width = toCssUnit(width)
385
+ }
386
+ if (height) {
387
+ stys.height = toCssUnit(height)
388
+ stys.maxHeight = toCssUnit(height)
389
+ }
390
+ return stys
391
+ },
392
+ computeSelectVals () {
393
+ const $xeSelect = this
394
+ const props = $xeSelect
395
+
396
+ const { value: modelValue, multiple } = props
397
+ let vals: (string | number | boolean)[] = []
398
+ if (XEUtils.isArray(modelValue)) {
399
+ vals = modelValue
400
+ } else {
401
+ if (multiple) {
402
+ if (!eqEmptyValue(modelValue)) {
403
+ vals = `${modelValue}`.indexOf(',') > -1 ? `${modelValue}`.split(',') : [modelValue] as any[]
404
+ }
405
+ } else {
406
+ vals = modelValue === null || modelValue === undefined ? [] : [modelValue]
407
+ }
408
+ }
409
+ return vals
410
+ },
411
+ computeFullLabel () {
412
+ const $xeSelect = this as any
413
+ const props = $xeSelect
414
+ const reactData = $xeSelect.reactData
415
+
416
+ const { remote } = props
417
+ const { reactFlag } = reactData
418
+ const selectVals = $xeSelect.computeSelectVals as string[]
419
+ if (remote && reactFlag) {
420
+ return selectVals.map(val => $xeSelect.getRemoteSelectLabel(val)).join(', ')
421
+ }
422
+ return selectVals.map((val) => $xeSelect.getSelectLabel(val)).join(', ')
423
+ },
424
+ computeSelectLabel () {
425
+ const $xeSelect = this as any
426
+ const props = $xeSelect
427
+ const reactData = $xeSelect.reactData
428
+
429
+ const { remote, multiple } = props
430
+ const { reactFlag } = reactData
431
+ const multiMaxCharNum = $xeSelect.computeMultiMaxCharNum
432
+ const selectVals = $xeSelect.computeSelectVals as string[]
433
+ if (remote && reactFlag) {
434
+ return selectVals.map(val => $xeSelect.getRemoteSelectLabel(val)).join(', ')
435
+ }
436
+ const labels = selectVals.map((val) => $xeSelect.getSelectLabel(val))
437
+ if (multiple && multiMaxCharNum > 0 && labels.length > multiMaxCharNum) {
438
+ return `${labels.slice(0, multiMaxCharNum)}...`
439
+ }
440
+ return labels.join(', ')
441
+ }
442
+ },
443
+ methods: {
444
+ //
445
+ // Method
446
+ //
447
+ dispatchEvent (type: ValueOf<VxeSelectEmits>, params: Record<string, any>, evnt: Event | null) {
448
+ const $xeSelect = this
449
+ $xeSelect.$emit(type, createEvent(evnt, { $select: $xeSelect }, params))
450
+ },
451
+ emitModel (value: any) {
452
+ const $xeSelect = this
453
+
454
+ const { _events } = $xeSelect as any
455
+ if (_events && _events.modelValue) {
456
+ $xeSelect.$emit('modelValue', value)
457
+ } else {
458
+ $xeSelect.$emit('model-value', value)
459
+ }
460
+ },
461
+ emitDefaultValue (value: any) {
462
+ const $xeSelect = this
463
+
464
+ $xeSelect.emitModel(value)
465
+ $xeSelect.dispatchEvent('default-change', { value }, null)
466
+ },
467
+ isPanelVisible () {
468
+ const $xeSelect = this
469
+ const reactData = $xeSelect.reactData
470
+
471
+ return reactData.visiblePanel
472
+ },
473
+ togglePanel () {
474
+ const $xeSelect = this
475
+ const reactData = $xeSelect.reactData
476
+
477
+ if (reactData.visiblePanel) {
478
+ $xeSelect.hideOptionPanel()
479
+ } else {
480
+ $xeSelect.showOptionPanel()
481
+ }
482
+ return $xeSelect.$nextTick()
483
+ },
484
+ hidePanel () {
485
+ const $xeSelect = this
486
+ const reactData = $xeSelect.reactData
487
+
488
+ if (reactData.visiblePanel) {
489
+ $xeSelect.hideOptionPanel()
490
+ }
491
+ return $xeSelect.$nextTick()
492
+ },
493
+ showPanel () {
494
+ const $xeSelect = this
495
+ const reactData = $xeSelect.reactData
496
+
497
+ if (!reactData.visiblePanel) {
498
+ $xeSelect.showOptionPanel()
499
+ }
500
+ return $xeSelect.$nextTick()
501
+ },
502
+ focus () {
503
+ const $xeSelect = this
504
+ const reactData = $xeSelect.reactData
505
+
506
+ const $input = $xeSelect.$refs.refInput as VxeInputConstructor
507
+ if ($input) {
508
+ $input.blur()
509
+ }
510
+ reactData.isActivated = true
511
+ return $xeSelect.$nextTick()
512
+ },
513
+ blur () {
514
+ const $xeSelect = this
515
+ const reactData = $xeSelect.reactData
516
+
517
+ const $input = $xeSelect.$refs.refInput as VxeInputConstructor
518
+ if ($input) {
519
+ $input.blur()
520
+ }
521
+ reactData.isActivated = false
522
+ return $xeSelect.$nextTick()
523
+ },
524
+ callSlot (slotFunc: any, params: any, h: CreateElement) {
525
+ const $xeSelect = this
526
+ const slots = $xeSelect.$scopedSlots
527
+
528
+ if (slotFunc) {
529
+ if (XEUtils.isString(slotFunc)) {
530
+ slotFunc = slots[slotFunc] || null
531
+ }
532
+ if (XEUtils.isFunction(slotFunc)) {
533
+ return getSlotVNs(slotFunc.call($xeSelect, params, h))
534
+ }
535
+ }
536
+ return []
537
+ },
538
+ getOptKey () {
539
+ const $xeSelect = this
540
+ const props = $xeSelect
541
+
542
+ const optionOpts = $xeSelect.computeOptionOpts
543
+ return optionOpts.keyField || props.optionId || '_X_OPTION_KEY'
544
+ },
545
+ getOptId (option: any) {
546
+ const $xeSelect = this
547
+
548
+ const optid = option[$xeSelect.getOptKey()]
549
+ return optid ? encodeURIComponent(optid) : ''
550
+ },
551
+ checkMaxLimit (selectVals: VxeSelectPropTypes.ModelValue[]) {
552
+ const $xeSelect = this
553
+ const props = $xeSelect
554
+
555
+ const { multiple, max } = props
556
+ if (multiple && max) {
557
+ return selectVals.length >= XEUtils.toNumber(max)
558
+ }
559
+ return false
560
+ },
561
+ getRemoteSelectLabel (value: any) {
562
+ const $xeSelect = this
563
+ const props = $xeSelect
564
+ const internalData = $xeSelect.internalData
565
+
566
+ const { lazyOptions } = props
567
+ const { remoteValMaps, optFullValMaps } = internalData
568
+ const valueField = $xeSelect.computeValueField
569
+ const labelField = $xeSelect.computeLabelField
570
+ const remoteItem = remoteValMaps[value] || optFullValMaps[value]
571
+ const item = remoteItem ? remoteItem.item : null
572
+ if (item) {
573
+ return XEUtils.toValueString(item[labelField])
574
+ }
575
+ if (lazyOptions) {
576
+ const lazyItem = lazyOptions.find(item => item[valueField] === value)
577
+ if (lazyItem) {
578
+ return lazyItem[labelField]
579
+ }
580
+ }
581
+ return value
582
+ },
583
+ getSelectLabel (value: any) {
584
+ const $xeSelect = this
585
+ const props = $xeSelect
586
+ const reactData = $xeSelect.reactData
587
+ const internalData = $xeSelect.internalData
588
+
589
+ const { lazyOptions } = props
590
+ const { optFullValMaps } = internalData
591
+ const valueField = $xeSelect.computeValueField
592
+ const labelField = $xeSelect.computeLabelField
593
+ const cacheItem = reactData.reactFlag ? optFullValMaps[value] : null
594
+ if (cacheItem) {
595
+ return cacheItem.item[labelField as 'label']
596
+ }
597
+ if (lazyOptions) {
598
+ const lazyItem = lazyOptions.find(item => item[valueField] === value)
599
+ if (lazyItem) {
600
+ return lazyItem[labelField]
601
+ }
602
+ }
603
+ return value
604
+ },
605
+ getOptkey () {
606
+ const $xeSelect = this
607
+ const props = $xeSelect
608
+
609
+ const optionOpts = $xeSelect.computeOptionOpts
610
+ return optionOpts.keyField || props.optionId || '_X_OPTION_KEY'
611
+ },
612
+ getOptid (option: any) {
613
+ const $xeSelect = this
614
+
615
+ const optid = option[$xeSelect.getOptkey()]
616
+ return optid ? encodeURIComponent(optid) : ''
617
+ },
618
+ /**
619
+ * 处理选项,当选项被动态显示/隐藏时可能会用到
620
+ */
621
+ handleOption () {
622
+ const $xeSelect = this
623
+ const props = $xeSelect
624
+ const reactData = $xeSelect.reactData
625
+ const internalData = $xeSelect.internalData
626
+
627
+ const { remote, value, filterable } = props
628
+ const { searchValue } = reactData
629
+ const { fullData, optFullValMaps } = internalData
630
+ const labelField = $xeSelect.computeLabelField
631
+ const valueField = $xeSelect.computeValueField
632
+ const filterOpts = $xeSelect.computeFilterOpts
633
+ const frMethod = filterOpts.filterMethod || props.filterMethod
634
+ const searchStr = `${searchValue || ''}`.toLowerCase()
635
+ let avList: any[] = []
636
+ if (remote) {
637
+ avList = fullData.filter(isOptionVisible)
638
+ } else {
639
+ if (filterable && frMethod) {
640
+ avList = fullData.filter(option => isOptionVisible(option) && frMethod({ $select: $xeSelect, group: null, option, searchValue, value }))
641
+ } else if (filterable) {
642
+ avList = fullData.filter(option => isOptionVisible(option) && (!searchStr || `${option[labelField] || option[valueField]}`.toLowerCase().indexOf(searchStr) > -1))
643
+ } else {
644
+ avList = fullData.filter(isOptionVisible)
645
+ }
646
+ }
647
+ avList.forEach((item, index) => {
648
+ const cacheItem = optFullValMaps[item[valueField]]
649
+ if (cacheItem) {
650
+ cacheItem._index = index
651
+ }
652
+ })
653
+ internalData.afterVisibleList = avList
654
+ return $xeSelect.$nextTick()
655
+ },
656
+ refreshOption () {
657
+ const $xeSelect = this
658
+
659
+ $xeSelect.handleOption()
660
+ $xeSelect.updateYData()
661
+ return $xeSelect.$nextTick()
662
+ },
663
+ cacheItemMap (datas: any[]) {
664
+ const $xeSelect = this
665
+ const reactData = $xeSelect.reactData
666
+ const internalData = $xeSelect.internalData
667
+
668
+ const groupOptionsField = $xeSelect.computeGroupOptionsField
669
+ const valueField = $xeSelect.computeValueField
670
+ const key = $xeSelect.getOptKey()
671
+ const groupKeyMaps: Record<string, any> = {}
672
+ const fullKeyMaps: Record<string, VxeSelectDefines.OptCacheItem> = {}
673
+ const list: any[] = []
674
+ const handleOptItem = (item: any) => {
675
+ list.push(item)
676
+ let optid = $xeSelect.getOptId(item)
677
+ if (!optid) {
678
+ optid = getOptUniqueId()
679
+ item[key] = optid
680
+ }
681
+ fullKeyMaps[item[valueField]] = {
682
+ key: optid,
683
+ item,
684
+ _index: -1
685
+ }
686
+ }
687
+ datas.forEach((group: any) => {
688
+ handleOptItem(group)
689
+ if (group[groupOptionsField]) {
690
+ groupKeyMaps[group[key]] = group
691
+ group[groupOptionsField].forEach(handleOptItem)
692
+ }
693
+ })
694
+ internalData.fullData = list
695
+ internalData.optGroupKeyMaps = groupKeyMaps
696
+ internalData.optFullValMaps = fullKeyMaps
697
+ reactData.reactFlag++
698
+ $xeSelect.handleOption()
699
+ },
700
+ setCurrentOption (option: any) {
701
+ const $xeSelect = this
702
+ const reactData = $xeSelect.reactData
703
+
704
+ if (option) {
705
+ reactData.currentOption = option
706
+ }
707
+ },
708
+ scrollToOption (option: any, isAlignBottom?: boolean) {
709
+ const $xeSelect = this
710
+
711
+ return $xeSelect.$nextTick().then(() => {
712
+ if (option) {
713
+ const optWrapperElem = $xeSelect.$refs.refOptionWrapper as HTMLDivElement
714
+ const panelElem = $xeSelect.$refs.refOptionPanel as HTMLDivElement
715
+ const optElem = panelElem.querySelector(`[optid='${$xeSelect.getOptid(option)}']`) as HTMLElement
716
+ if (optWrapperElem && optElem) {
717
+ const wrapperHeight = optWrapperElem.offsetHeight
718
+ const offsetPadding = 5
719
+ if (isAlignBottom) {
720
+ if (optElem.offsetTop + optElem.offsetHeight - optWrapperElem.scrollTop > wrapperHeight) {
721
+ optWrapperElem.scrollTop = optElem.offsetTop + optElem.offsetHeight - wrapperHeight
722
+ }
723
+ } else {
724
+ if (optElem.offsetTop + offsetPadding < optWrapperElem.scrollTop || optElem.offsetTop + offsetPadding > optWrapperElem.scrollTop + optWrapperElem.clientHeight) {
725
+ optWrapperElem.scrollTop = optElem.offsetTop - offsetPadding
726
+ }
727
+ }
728
+ }
729
+ }
730
+ })
731
+ },
732
+ updateZindex () {
733
+ const $xeSelect = this
734
+ const props = $xeSelect
735
+ const reactData = $xeSelect.reactData
736
+
737
+ const popupOpts = $xeSelect.computePopupOpts
738
+ const customZIndex = popupOpts.zIndex || props.zIndex
739
+ if (customZIndex) {
740
+ reactData.panelIndex = XEUtils.toNumber(customZIndex)
741
+ } else if (reactData.panelIndex < getLastZIndex()) {
742
+ reactData.panelIndex = nextZIndex()
743
+ }
744
+ },
745
+ updateZIndex () {
746
+ const $xeSelect = this
747
+ const reactData = $xeSelect.reactData
748
+
749
+ if (reactData.panelIndex < getLastZIndex()) {
750
+ reactData.panelIndex = nextZIndex()
751
+ }
752
+ },
753
+ updatePlacement () {
754
+ const $xeSelect = this
755
+ const props = $xeSelect
756
+ const reactData = $xeSelect.reactData
757
+
758
+ const { placement } = props
759
+ const { panelIndex } = reactData
760
+ const targetElem = $xeSelect.$refs.refElem as HTMLElement
761
+ const panelElem = $xeSelect.$refs.refOptionPanel as HTMLDivElement
762
+ const btnTransfer = $xeSelect.computeBtnTransfer
763
+ const popupOpts = $xeSelect.computePopupOpts
764
+ const handleStyle = () => {
765
+ const ppObj = updatePanelPlacement(targetElem, panelElem, {
766
+ placement: popupOpts.placement || placement,
767
+ teleportTo: btnTransfer
768
+ })
769
+ const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
770
+ zIndex: panelIndex
771
+ })
772
+ reactData.panelStyle = panelStyle
773
+ reactData.panelPlacement = ppObj.placement
774
+ }
775
+ handleStyle()
776
+ return $xeSelect.$nextTick().then(handleStyle)
777
+ },
778
+ handleScrollSelect () {
779
+ const $xeSelect = this
780
+ const reactData = $xeSelect.reactData
781
+ const internalData = $xeSelect.internalData
782
+
783
+ $xeSelect.$nextTick(() => {
784
+ const { isAniVisible, visiblePanel } = reactData
785
+ const { optFullValMaps } = internalData
786
+ const selectVals = $xeSelect.computeSelectVals
787
+ if (selectVals.length && isAniVisible && visiblePanel) {
788
+ const cacheItem = reactData.reactFlag ? optFullValMaps[`${selectVals[0]}`] : null
789
+ if (cacheItem) {
790
+ $xeSelect.handleScrollToOption(cacheItem.item)
791
+ }
792
+ }
793
+ })
794
+ },
795
+ showOptionPanel () {
796
+ const $xeSelect = this
797
+ const props = $xeSelect
798
+ const reactData = $xeSelect.reactData
799
+ const internalData = $xeSelect.internalData
800
+
801
+ const { loading, filterable, remote } = props
802
+ const { fullData, hpTimeout } = internalData
803
+ const isDisabled = $xeSelect.computeIsDisabled
804
+ const remoteOpts = $xeSelect.computeRemoteOpts
805
+ if (!loading && !isDisabled) {
806
+ if (hpTimeout) {
807
+ clearTimeout(hpTimeout)
808
+ internalData.hpTimeout = undefined
809
+ }
810
+ if (!reactData.initialized) {
811
+ reactData.initialized = true
812
+ const btnTransfer = $xeSelect.computeBtnTransfer
813
+ const panelElem = $xeSelect.$refs.refOptionPanel as HTMLElement
814
+ if (btnTransfer) {
815
+ if (panelElem) {
816
+ document.body.appendChild(panelElem)
817
+ }
818
+ }
819
+ }
820
+ reactData.isActivated = true
821
+ reactData.isAniVisible = true
822
+ if (filterable) {
823
+ if (remote && remoteOpts.enabled && ((remoteOpts.autoLoad && !fullData.length) || (fullData.length && remoteOpts.clearOnClose))) {
824
+ $xeSelect.handleSearchEvent()
825
+ } else {
826
+ $xeSelect.handleOption()
827
+ $xeSelect.updateYData()
828
+ }
829
+ }
830
+ setTimeout(() => {
831
+ reactData.visiblePanel = true
832
+ $xeSelect.handleFocusSearch()
833
+ $xeSelect.recalculate().then(() => {
834
+ $xeSelect.handleScrollSelect()
835
+ $xeSelect.refreshScroll()
836
+ })
837
+ $xeSelect.updatePlacement()
838
+ }, 10)
839
+ setTimeout(() => {
840
+ $xeSelect.recalculate().then(() => $xeSelect.refreshScroll())
841
+ }, 100)
842
+ $xeSelect.updateZIndex()
843
+ $xeSelect.updatePlacement()
844
+ $xeSelect.dispatchEvent('visible-change', { visible: true }, null)
845
+ }
846
+ },
847
+ hideOptionPanel () {
848
+ const $xeSelect = this
849
+ const props = $xeSelect
850
+ const reactData = $xeSelect.reactData
851
+ const internalData = $xeSelect.internalData
852
+
853
+ const { filterable, remote } = props
854
+ const filterOpts = $xeSelect.computeFilterOpts
855
+ const remoteOpts = $xeSelect.computeRemoteOpts
856
+ if (remote) {
857
+ if (remoteOpts.clearOnClose) {
858
+ reactData.searchValue = ''
859
+ }
860
+ } else if (filterable) {
861
+ if (filterOpts.clearOnClose) {
862
+ reactData.searchValue = ''
863
+ }
864
+ } else {
865
+ reactData.searchValue = ''
866
+ }
867
+ reactData.searchLoading = false
868
+ reactData.visiblePanel = false
869
+ internalData.hpTimeout = setTimeout(() => {
870
+ reactData.isAniVisible = false
871
+ }, 350)
872
+ $xeSelect.dispatchEvent('visible-change', { visible: false }, null)
873
+ },
874
+ changeEvent (evnt: Event, selectValue: any, option: any) {
875
+ const $xeSelect = this
876
+ const props = $xeSelect
877
+ const $xeForm = $xeSelect.$xeForm
878
+ const formItemInfo = $xeSelect.formItemInfo
879
+
880
+ $xeSelect.emitModel(selectValue)
881
+ if (selectValue !== props.value) {
882
+ $xeSelect.dispatchEvent('change', { value: selectValue, option }, evnt)
883
+ // 自动更新校验状态
884
+ if ($xeForm && formItemInfo) {
885
+ $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, selectValue)
886
+ }
887
+ }
888
+ },
889
+ clearValueEvent (evnt: Event, selectValue: any) {
890
+ const $xeSelect = this
891
+ const internalData = $xeSelect.internalData
892
+
893
+ internalData.remoteValMaps = {}
894
+ $xeSelect.changeEvent(evnt, selectValue, null)
895
+ $xeSelect.dispatchEvent('clear', { value: selectValue }, evnt)
896
+ },
897
+ clearEvent (params: VxeInputDefines.ClearEventParams) {
898
+ const $xeSelect = this
899
+
900
+ const { $event } = params
901
+ $xeSelect.clearValueEvent($event, null)
902
+ $xeSelect.hideOptionPanel()
903
+ },
904
+ allCheckedPanelEvent (params: VxeButtonDefines.ClickEventParams) {
905
+ const $xeSelect = this
906
+ const props = $xeSelect
907
+ const reactData = $xeSelect.reactData
908
+
909
+ const { $event } = params
910
+ const { multiple } = props
911
+ const { optList } = reactData
912
+ const valueField = $xeSelect.computeValueField
913
+ if (multiple) {
914
+ const selectVals = $xeSelect.computeSelectVals
915
+ const currVlas = selectVals.slice(0)
916
+ for (let i = 0; i < optList.length; i++) {
917
+ const option = optList[i]
918
+ const selectValue = option[valueField]
919
+ // 检测是否超过最大可选数量
920
+ if ($xeSelect.checkMaxLimit(currVlas)) {
921
+ break
922
+ }
923
+ if (!currVlas.some(val => val === selectValue)) {
924
+ currVlas.push(selectValue)
925
+ }
926
+ }
927
+ $xeSelect.changeEvent($event, currVlas, optList[0])
928
+ $xeSelect.dispatchEvent('all-change', { value: currVlas }, $event)
929
+ }
930
+ },
931
+ clearCheckedPanelEvent (params: VxeButtonDefines.ClickEventParams) {
932
+ const $xeSelect = this
933
+
934
+ const { $event } = params
935
+ $xeSelect.clearValueEvent($event, null)
936
+ $xeSelect.hideOptionPanel()
937
+ },
938
+ changeOptionEvent (evnt: Event, option: any) {
939
+ const $xeSelect = this
940
+ const props = $xeSelect
941
+ const reactData = $xeSelect.reactData
942
+ const internalData = $xeSelect.internalData
943
+
944
+ const { multiple } = props
945
+ const { remoteValMaps } = internalData
946
+ const valueField = $xeSelect.computeValueField
947
+ const selectValue = option[valueField]
948
+ const remoteItem = remoteValMaps[selectValue]
949
+ if (!reactData.visiblePanel) {
950
+ return
951
+ }
952
+ if (remoteItem) {
953
+ remoteItem.item = option
954
+ } else {
955
+ remoteValMaps[selectValue] = {
956
+ key: $xeSelect.getOptId(option),
957
+ item: option,
958
+ _index: -1
959
+ }
960
+ }
961
+ if (multiple) {
962
+ let multipleValue: any[] = []
963
+ const selectVals = $xeSelect.computeSelectVals
964
+ const index = XEUtils.findIndexOf(selectVals, val => val === selectValue)
965
+ if (index === -1) {
966
+ multipleValue = selectVals.concat([selectValue])
967
+ } else {
968
+ multipleValue = selectVals.filter((val) => val !== selectValue)
969
+ }
970
+ $xeSelect.changeEvent(evnt, multipleValue, option)
971
+ } else {
972
+ $xeSelect.changeEvent(evnt, selectValue, option)
973
+ $xeSelect.hideOptionPanel()
974
+ }
975
+ reactData.reactFlag++
976
+ },
977
+ handleGlobalMousewheelEvent (evnt: MouseEvent) {
978
+ const $xeSelect = this
979
+ const reactData = $xeSelect.reactData
980
+
981
+ const { visiblePanel } = reactData
982
+ const isDisabled = $xeSelect.computeIsDisabled
983
+ if (!isDisabled) {
984
+ if (visiblePanel) {
985
+ const panelElem = $xeSelect.$refs.refOptionPanel
986
+ if (getEventTargetNode(evnt, panelElem).flag) {
987
+ $xeSelect.updatePlacement()
988
+ } else {
989
+ $xeSelect.hideOptionPanel()
990
+ }
991
+ }
992
+ }
993
+ },
994
+ handleGlobalMousedownEvent (evnt: MouseEvent) {
995
+ const $xeSelect = this
996
+ const reactData = $xeSelect.reactData
997
+
998
+ const { visiblePanel } = reactData
999
+ const isDisabled = $xeSelect.computeIsDisabled
1000
+ const popupOpts = $xeSelect.computePopupOpts
1001
+ const { trigger } = popupOpts
1002
+ if (!isDisabled) {
1003
+ const el = $xeSelect.$refs.refElem as HTMLDivElement
1004
+ const panelElem = $xeSelect.$refs.refOptionPanel as HTMLDivElement
1005
+ reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelElem).flag
1006
+ if (visiblePanel && !reactData.isActivated) {
1007
+ if (trigger !== 'manual') {
1008
+ $xeSelect.hideOptionPanel()
1009
+ }
1010
+ }
1011
+ }
1012
+ },
1013
+ validOffsetOption (option: any) {
1014
+ const $xeSelect = this
1015
+
1016
+ const isDisabled = option.disabled
1017
+ const optid = $xeSelect.getOptId(option)
1018
+ if (!isDisabled && !$xeSelect.hasOptGroupById(optid)) {
1019
+ return true
1020
+ }
1021
+ return false
1022
+ },
1023
+ findOffsetOption (option: any, isDwArrow: boolean) {
1024
+ const $xeSelect = this
1025
+ const props = $xeSelect
1026
+ const reactData = $xeSelect.reactData
1027
+ const internalData = $xeSelect.internalData
1028
+
1029
+ const { allowCreate } = props
1030
+ const { optList } = reactData
1031
+ const { optFullValMaps, optAddMaps, afterVisibleList } = internalData
1032
+ const valueField = $xeSelect.computeValueField
1033
+ let fullList = afterVisibleList
1034
+ let offsetAddIndex = 0
1035
+ if (allowCreate && optList.length) {
1036
+ const firstItem = optList[0]
1037
+ const optid = $xeSelect.getOptId(firstItem)
1038
+ if (optAddMaps[optid]) {
1039
+ offsetAddIndex = 1
1040
+ fullList = [optAddMaps[optid]].concat(fullList)
1041
+ }
1042
+ }
1043
+ if (!option) {
1044
+ if (isDwArrow) {
1045
+ for (let i = 0; i < fullList.length; i++) {
1046
+ const item = fullList[i]
1047
+ if ($xeSelect.validOffsetOption(item)) {
1048
+ return item
1049
+ }
1050
+ }
1051
+ } else {
1052
+ for (let len = fullList.length - 1; len >= 0; len--) {
1053
+ const item = fullList[len]
1054
+ if ($xeSelect.validOffsetOption(item)) {
1055
+ return item
1056
+ }
1057
+ }
1058
+ }
1059
+ }
1060
+ let avIndex = 0
1061
+ const cacheItem = option ? optFullValMaps[option[valueField]] : null
1062
+ if (cacheItem) {
1063
+ avIndex = cacheItem._index + offsetAddIndex
1064
+ }
1065
+ if (avIndex > -1) {
1066
+ if (isDwArrow) {
1067
+ for (let i = avIndex + 1; i <= fullList.length - 1; i++) {
1068
+ const item = fullList[i]
1069
+ if ($xeSelect.validOffsetOption(item)) {
1070
+ return item
1071
+ }
1072
+ }
1073
+ } else {
1074
+ if (avIndex > 0) {
1075
+ for (let len = avIndex - 1; len >= 0; len--) {
1076
+ const item = fullList[len]
1077
+ if ($xeSelect.validOffsetOption(item)) {
1078
+ return item
1079
+ }
1080
+ }
1081
+ }
1082
+ }
1083
+ }
1084
+ return null
1085
+ },
1086
+ handleGlobalKeydownEvent (evnt: KeyboardEvent) {
1087
+ const $xeSelect = this
1088
+ const props = $xeSelect
1089
+ const reactData = $xeSelect.reactData
1090
+
1091
+ const { clearable } = props
1092
+ const { visiblePanel, currentOption } = reactData
1093
+ const isDisabled = $xeSelect.computeIsDisabled
1094
+ const popupOpts = $xeSelect.computePopupOpts
1095
+ const { trigger } = popupOpts
1096
+ if (!isDisabled) {
1097
+ const isTab = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.TAB)
1098
+ const isEnter = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ENTER)
1099
+ const isEsc = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ESCAPE)
1100
+ const isUpArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_UP)
1101
+ const isDwArrow = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.ARROW_DOWN)
1102
+ const isDel = globalEvents.hasKey(evnt, GLOBAL_EVENT_KEYS.DELETE)
1103
+ if (isTab) {
1104
+ reactData.isActivated = false
1105
+ }
1106
+ if (visiblePanel) {
1107
+ if (isEsc || isTab) {
1108
+ if (trigger !== 'manual') {
1109
+ $xeSelect.hideOptionPanel()
1110
+ }
1111
+ } else if (isEnter) {
1112
+ if (currentOption) {
1113
+ evnt.preventDefault()
1114
+ evnt.stopPropagation()
1115
+ $xeSelect.changeOptionEvent(evnt, currentOption)
1116
+ }
1117
+ } else if (isUpArrow || isDwArrow) {
1118
+ evnt.preventDefault()
1119
+ let offsetOption = $xeSelect.findOffsetOption(currentOption, isDwArrow)
1120
+ // 如果不匹配,默认最接近一个
1121
+ if (!offsetOption) {
1122
+ offsetOption = $xeSelect.findOffsetOption(null, isDwArrow)
1123
+ }
1124
+ if (offsetOption) {
1125
+ $xeSelect.setCurrentOption(offsetOption)
1126
+ $xeSelect.handleScrollToOption(offsetOption, isDwArrow)
1127
+ }
1128
+ }
1129
+ } else if ((isUpArrow || isDwArrow || isEnter) && reactData.isActivated) {
1130
+ evnt.preventDefault()
1131
+ $xeSelect.showOptionPanel()
1132
+ }
1133
+ if (reactData.isActivated) {
1134
+ if (isDel && clearable) {
1135
+ $xeSelect.clearValueEvent(evnt, null)
1136
+ }
1137
+ }
1138
+ }
1139
+ },
1140
+ handleGlobalBlurEvent () {
1141
+ const $xeSelect = this
1142
+ const reactData = $xeSelect.reactData
1143
+
1144
+ const { visiblePanel, isActivated } = reactData
1145
+ const popupOpts = $xeSelect.computePopupOpts
1146
+ const { trigger } = popupOpts
1147
+ if (visiblePanel) {
1148
+ if (trigger !== 'manual') {
1149
+ $xeSelect.hideOptionPanel()
1150
+ }
1151
+ }
1152
+ if (isActivated) {
1153
+ reactData.isActivated = false
1154
+ }
1155
+ if (visiblePanel || isActivated) {
1156
+ const $input = $xeSelect.$refs.refInput as VxeInputConstructor
1157
+ if ($input) {
1158
+ $input.blur()
1159
+ }
1160
+ }
1161
+ },
1162
+ handleGlobalResizeEvent () {
1163
+ const $xeSelect = this
1164
+ const reactData = $xeSelect.reactData
1165
+
1166
+ const { visiblePanel } = reactData
1167
+ if (visiblePanel) {
1168
+ $xeSelect.updatePlacement()
1169
+ }
1170
+ },
1171
+ handleFocusSearch () {
1172
+ const $xeSelect = this
1173
+ const props = $xeSelect
1174
+
1175
+ if (props.filterable) {
1176
+ $xeSelect.$nextTick(() => {
1177
+ const inpSearch = $xeSelect.$refs.refInpSearch as VxeInputConstructor
1178
+ if (inpSearch) {
1179
+ inpSearch.focus()
1180
+ }
1181
+ })
1182
+ }
1183
+ },
1184
+ focusEvent (evnt: FocusEvent) {
1185
+ const $xeSelect = this
1186
+ const reactData = $xeSelect.reactData
1187
+
1188
+ const isDisabled = $xeSelect.computeIsDisabled
1189
+ const popupOpts = $xeSelect.computePopupOpts
1190
+ const { trigger } = popupOpts
1191
+ if (!isDisabled) {
1192
+ if (!reactData.visiblePanel) {
1193
+ if (!trigger || trigger === 'default') {
1194
+ reactData.triggerFocusPanel = true
1195
+ $xeSelect.showOptionPanel()
1196
+ setTimeout(() => {
1197
+ reactData.triggerFocusPanel = false
1198
+ }, 500)
1199
+ }
1200
+ }
1201
+ }
1202
+ $xeSelect.dispatchEvent('focus', {}, evnt)
1203
+ },
1204
+ clickEvent (evnt: MouseEvent) {
1205
+ const $xeSelect = this
1206
+ const reactData = $xeSelect.reactData
1207
+
1208
+ const popupOpts = $xeSelect.computePopupOpts
1209
+ const { trigger } = popupOpts
1210
+ if (!trigger || trigger === 'default') {
1211
+ $xeSelect.togglePanelEvent(evnt)
1212
+ }
1213
+ $xeSelect.dispatchEvent('click', { triggerButton: false, visible: reactData.visiblePanel }, evnt)
1214
+ },
1215
+ blurEvent (evnt: FocusEvent) {
1216
+ const $xeSelect = this
1217
+ const reactData = $xeSelect.reactData
1218
+
1219
+ reactData.isActivated = false
1220
+ $xeSelect.dispatchEvent('blur', {}, evnt)
1221
+ },
1222
+ suffixClickEvent (evnt: MouseEvent) {
1223
+ const $xeSelect = this
1224
+ const reactData = $xeSelect.reactData
1225
+
1226
+ const popupOpts = $xeSelect.computePopupOpts
1227
+ const { trigger } = popupOpts
1228
+ if (!trigger || trigger === 'default' || trigger === 'icon') {
1229
+ $xeSelect.togglePanelEvent(evnt)
1230
+ }
1231
+ $xeSelect.dispatchEvent('click', { triggerButton: true, visible: reactData.visiblePanel }, evnt)
1232
+ },
1233
+ modelSearchEvent (value: string) {
1234
+ const $xeSelect = this
1235
+ const reactData = $xeSelect.reactData
1236
+
1237
+ reactData.searchValue = value
1238
+ },
1239
+ focusSearchEvent () {
1240
+ const $xeSelect = this
1241
+ const reactData = $xeSelect.reactData
1242
+
1243
+ reactData.isActivated = true
1244
+ },
1245
+ handleSearchEvent () {
1246
+ const $xeSelect = this
1247
+ const props = $xeSelect
1248
+ const reactData = $xeSelect.reactData
1249
+
1250
+ const { value, remote } = props
1251
+ const { searchValue } = reactData
1252
+ const remoteOpts = $xeSelect.computeRemoteOpts
1253
+ const qyMethod = remoteOpts.queryMethod || props.remoteMethod
1254
+ if (remote && qyMethod && remoteOpts.enabled) {
1255
+ reactData.searchLoading = true
1256
+ Promise.resolve(
1257
+ qyMethod({ $select: $xeSelect, searchValue, value })
1258
+ ).then(() => $xeSelect.$nextTick())
1259
+ .catch(() => $xeSelect.$nextTick())
1260
+ .finally(() => {
1261
+ reactData.searchLoading = false
1262
+ $xeSelect.handleOption()
1263
+ $xeSelect.updateYData()
1264
+ })
1265
+ } else {
1266
+ $xeSelect.handleOption()
1267
+ $xeSelect.updateYData()
1268
+ }
1269
+ },
1270
+ triggerSearchEvent: XEUtils.debounce(function (this: any) {
1271
+ const $xeSelect = this
1272
+
1273
+ $xeSelect.handleSearchEvent()
1274
+ }, 350, { trailing: true }),
1275
+ togglePanelEvent (params: any) {
1276
+ const $xeSelect = this
1277
+ const reactData = $xeSelect.reactData
1278
+
1279
+ const { $event } = params
1280
+ $event.preventDefault()
1281
+ if (reactData.triggerFocusPanel) {
1282
+ reactData.triggerFocusPanel = false
1283
+ } else {
1284
+ if (reactData.visiblePanel) {
1285
+ $xeSelect.hideOptionPanel()
1286
+ } else {
1287
+ $xeSelect.showOptionPanel()
1288
+ }
1289
+ }
1290
+ },
1291
+ checkOptionDisabled (isSelected: any, option: VxeOptionProps) {
1292
+ const $xeSelect = this
1293
+
1294
+ if (option.disabled) {
1295
+ return true
1296
+ }
1297
+ const isMaximize = $xeSelect.computeIsMaximize
1298
+ if (isMaximize && !isSelected) {
1299
+ return true
1300
+ }
1301
+ return false
1302
+ },
1303
+ updateYSpace () {
1304
+ const $xeSelect = this
1305
+ const reactData = $xeSelect.reactData
1306
+ const internalData = $xeSelect.internalData
1307
+
1308
+ const { scrollYLoad } = reactData
1309
+ const { scrollYStore, afterVisibleList } = internalData
1310
+ reactData.bodyHeight = scrollYLoad ? afterVisibleList.length * scrollYStore.rowHeight : 0
1311
+ reactData.topSpaceHeight = scrollYLoad ? Math.max(scrollYStore.startIndex * scrollYStore.rowHeight, 0) : 0
1312
+ },
1313
+ handleData () {
1314
+ const $xeSelect = this
1315
+ const props = $xeSelect
1316
+ const reactData = $xeSelect.reactData
1317
+ const internalData = $xeSelect.internalData
1318
+
1319
+ const { filterable, allowCreate } = props
1320
+ const { scrollYLoad, searchValue } = reactData
1321
+ const { optAddMaps, scrollYStore, afterVisibleList } = internalData
1322
+ const labelField = $xeSelect.computeLabelField
1323
+ const valueField = $xeSelect.computeValueField
1324
+ const restList = scrollYLoad ? afterVisibleList.slice(scrollYStore.startIndex, scrollYStore.endIndex) : afterVisibleList.slice(0)
1325
+ if (filterable && allowCreate && searchValue) {
1326
+ if (!restList.some(option => option[labelField] === searchValue)) {
1327
+ const addItem = optAddMaps[searchValue] || {
1328
+ [$xeSelect.getOptKey()]: searchValue,
1329
+ [labelField]: searchValue,
1330
+ [valueField]: searchValue
1331
+ }
1332
+ optAddMaps[searchValue] = addItem
1333
+ restList.unshift(addItem)
1334
+ }
1335
+ }
1336
+ reactData.optList = restList
1337
+ return $xeSelect.$nextTick()
1338
+ },
1339
+ updateYData () {
1340
+ const $xeSelect = this
1341
+
1342
+ $xeSelect.handleData()
1343
+ $xeSelect.updateYSpace()
1344
+ },
1345
+ computeScrollLoad () {
1346
+ const $xeSelect = this
1347
+ const reactData = $xeSelect.reactData
1348
+ const internalData = $xeSelect.internalData
1349
+
1350
+ return $xeSelect.$nextTick().then(() => {
1351
+ const { scrollYLoad } = reactData
1352
+ const { scrollYStore } = internalData
1353
+ const virtualBodyElem = $xeSelect.$refs.refVirtualBody as HTMLDivElement
1354
+ const virtualYOpts = $xeSelect.computeVirtualYOpts
1355
+ let rowHeight = 0
1356
+ let firstItemElem: HTMLElement | undefined
1357
+ if (virtualBodyElem) {
1358
+ if (!firstItemElem) {
1359
+ firstItemElem = virtualBodyElem.children[0] as HTMLElement
1360
+ }
1361
+ }
1362
+ if (firstItemElem) {
1363
+ rowHeight = firstItemElem.offsetHeight
1364
+ }
1365
+ rowHeight = Math.max(20, rowHeight)
1366
+ scrollYStore.rowHeight = rowHeight
1367
+ // 计算 Y 逻辑
1368
+ if (scrollYLoad) {
1369
+ const scrollBodyElem = $xeSelect.$refs.refVirtualWrapper as HTMLDivElement
1370
+ const visibleYSize = Math.max(8, scrollBodyElem ? Math.ceil(scrollBodyElem.clientHeight / rowHeight) : 0)
1371
+ const offsetYSize = Math.max(0, Math.min(2, XEUtils.toNumber(virtualYOpts.oSize)))
1372
+ scrollYStore.offsetSize = offsetYSize
1373
+ scrollYStore.visibleSize = visibleYSize
1374
+ scrollYStore.endIndex = Math.max(scrollYStore.startIndex, visibleYSize + offsetYSize, scrollYStore.endIndex)
1375
+ $xeSelect.updateYData()
1376
+ } else {
1377
+ $xeSelect.updateYSpace()
1378
+ }
1379
+ })
1380
+ },
1381
+ handleScrollToOption (option: any, isDwArrow?: boolean) {
1382
+ const $xeSelect = this
1383
+ const reactData = $xeSelect.reactData
1384
+ const internalData = $xeSelect.internalData
1385
+
1386
+ const { scrollYLoad } = reactData
1387
+ const { optFullValMaps, scrollYStore } = internalData
1388
+ const valueField = $xeSelect.computeValueField
1389
+ const cacheItem = optFullValMaps[option[valueField]]
1390
+ if (cacheItem) {
1391
+ const optid = cacheItem.key
1392
+ const avIndex = cacheItem._index
1393
+ if (avIndex > -1) {
1394
+ const optWrapperElem = $xeSelect.$refs.refVirtualWrapper as HTMLDivElement
1395
+ const panelElem = $xeSelect.$refs.refOptionPanel as HTMLDivElement
1396
+ const optElem = panelElem.querySelector(`[optid='${optid}']`) as HTMLElement
1397
+ if (optWrapperElem) {
1398
+ if (optElem) {
1399
+ const wrapperHeight = optWrapperElem.offsetHeight
1400
+ const offsetPadding = 1
1401
+ if (isDwArrow) {
1402
+ if (optElem.offsetTop + optElem.offsetHeight - optWrapperElem.scrollTop > wrapperHeight) {
1403
+ optWrapperElem.scrollTop = optElem.offsetTop + optElem.offsetHeight - wrapperHeight
1404
+ } else if (optElem.offsetTop + offsetPadding < optWrapperElem.scrollTop || optElem.offsetTop + offsetPadding > optWrapperElem.scrollTop + optWrapperElem.clientHeight) {
1405
+ optWrapperElem.scrollTop = optElem.offsetTop - offsetPadding
1406
+ }
1407
+ } else {
1408
+ if (optElem.offsetTop + offsetPadding < optWrapperElem.scrollTop || optElem.offsetTop + offsetPadding > optWrapperElem.scrollTop + optWrapperElem.clientHeight) {
1409
+ optWrapperElem.scrollTop = optElem.offsetTop - offsetPadding
1410
+ } else if (optElem.offsetTop + optElem.offsetHeight - optWrapperElem.scrollTop > wrapperHeight) {
1411
+ optWrapperElem.scrollTop = optElem.offsetTop + optElem.offsetHeight - wrapperHeight
1412
+ }
1413
+ }
1414
+ } else if (scrollYLoad) {
1415
+ if (isDwArrow) {
1416
+ optWrapperElem.scrollTop = avIndex * scrollYStore.rowHeight - optWrapperElem.clientHeight + scrollYStore.rowHeight
1417
+ } else {
1418
+ optWrapperElem.scrollTop = avIndex * scrollYStore.rowHeight
1419
+ }
1420
+ }
1421
+ }
1422
+ }
1423
+ }
1424
+ },
1425
+ /**
1426
+ * 如果有滚动条,则滚动到对应的位置
1427
+ * @param {Number} scrollLeft 左距离
1428
+ * @param {Number} scrollTop 上距离
1429
+ */
1430
+ scrollTo (scrollLeft: number | null, scrollTop?: number | null) {
1431
+ const $xeSelect = this
1432
+ const reactData = $xeSelect.reactData
1433
+
1434
+ const scrollBodyElem = $xeSelect.$refs.refVirtualWrapper as HTMLDivElement
1435
+ if (scrollBodyElem) {
1436
+ if (XEUtils.isNumber(scrollLeft)) {
1437
+ scrollBodyElem.scrollLeft = scrollLeft
1438
+ }
1439
+ if (XEUtils.isNumber(scrollTop)) {
1440
+ scrollBodyElem.scrollTop = scrollTop
1441
+ }
1442
+ }
1443
+ if (reactData.scrollYLoad) {
1444
+ return new Promise<void>(resolve => {
1445
+ setTimeout(() => {
1446
+ $xeSelect.$nextTick(() => {
1447
+ resolve()
1448
+ })
1449
+ }, 50)
1450
+ })
1451
+ }
1452
+ return $xeSelect.$nextTick()
1453
+ },
1454
+ /**
1455
+ * 刷新滚动条
1456
+ */
1457
+ refreshScroll () {
1458
+ const $xeSelect = this
1459
+ const internalData = $xeSelect.internalData
1460
+
1461
+ const { lastScrollLeft, lastScrollTop } = internalData
1462
+ return $xeSelect.clearScroll().then(() => {
1463
+ if (lastScrollLeft || lastScrollTop) {
1464
+ internalData.lastScrollLeft = 0
1465
+ internalData.lastScrollTop = 0
1466
+ return $xeSelect.scrollTo(lastScrollLeft, lastScrollTop)
1467
+ }
1468
+ })
1469
+ },
1470
+ /**
1471
+ * 重新计算列表
1472
+ */
1473
+ recalculate () {
1474
+ const $xeSelect = this
1475
+
1476
+ const el = $xeSelect.$refs.refElem as HTMLDivElement
1477
+ if (el && el.clientWidth && el.clientHeight) {
1478
+ return $xeSelect.computeScrollLoad()
1479
+ }
1480
+ return Promise.resolve()
1481
+ },
1482
+ loadYData (evnt: Event) {
1483
+ const $xeSelect = this
1484
+ const internalData = $xeSelect.internalData
1485
+
1486
+ const { scrollYStore } = internalData
1487
+ const { startIndex, endIndex, visibleSize, offsetSize, rowHeight } = scrollYStore
1488
+ const scrollBodyElem = evnt.target as HTMLDivElement
1489
+ const scrollTop = scrollBodyElem.scrollTop
1490
+ const toVisibleIndex = Math.floor(scrollTop / rowHeight)
1491
+ const offsetStartIndex = Math.max(0, toVisibleIndex - 1 - offsetSize)
1492
+ const offsetEndIndex = toVisibleIndex + visibleSize + offsetSize
1493
+ if (toVisibleIndex <= startIndex || toVisibleIndex >= endIndex - visibleSize - 1) {
1494
+ if (startIndex !== offsetStartIndex || endIndex !== offsetEndIndex) {
1495
+ scrollYStore.startIndex = offsetStartIndex
1496
+ scrollYStore.endIndex = offsetEndIndex
1497
+ $xeSelect.updateYData()
1498
+ }
1499
+ }
1500
+ },
1501
+ // 滚动、拖动过程中不需要触发
1502
+ isVMScrollProcess () {
1503
+ const $xeSelect = this
1504
+ const internalData = $xeSelect.internalData
1505
+
1506
+ const delayHover = 250
1507
+ const { lastScrollTime } = internalData
1508
+ return !!(lastScrollTime && Date.now() < lastScrollTime + delayHover)
1509
+ },
1510
+ scrollEvent (evnt: Event) {
1511
+ const $xeSelect = this
1512
+ const reactData = $xeSelect.reactData
1513
+ const internalData = $xeSelect.internalData
1514
+
1515
+ const scrollBodyElem = evnt.target as HTMLDivElement
1516
+ const scrollTop = scrollBodyElem.scrollTop
1517
+ const scrollLeft = scrollBodyElem.scrollLeft
1518
+ const isX = scrollLeft !== internalData.lastScrollLeft
1519
+ const isY = scrollTop !== internalData.lastScrollTop
1520
+ internalData.lastScrollTop = scrollTop
1521
+ internalData.lastScrollLeft = scrollLeft
1522
+ if (reactData.scrollYLoad) {
1523
+ $xeSelect.loadYData(evnt)
1524
+ }
1525
+ internalData.lastScrollTime = Date.now()
1526
+ $xeSelect.dispatchEvent('scroll', { scrollLeft, scrollTop, isX, isY }, evnt)
1527
+ },
1528
+ /**
1529
+ * 加载数据
1530
+ * @param {Array} datas 数据
1531
+ */
1532
+ loadData (datas: any[]) {
1533
+ const $xeSelect = this
1534
+ const props = $xeSelect
1535
+ const reactData = $xeSelect.reactData
1536
+ const internalData = $xeSelect.internalData
1537
+
1538
+ $xeSelect.cacheItemMap(datas || [])
1539
+ const { multiple } = props
1540
+ const { isLoaded, fullData, scrollYStore } = internalData
1541
+ const defaultOpts = $xeSelect.computeDefaultOpts
1542
+ const virtualYOpts = $xeSelect.computeVirtualYOpts
1543
+ const valueField = $xeSelect.computeValueField
1544
+ Object.assign(scrollYStore, {
1545
+ startIndex: 0,
1546
+ endIndex: 1,
1547
+ visibleSize: 0
1548
+ })
1549
+ internalData.synchData = datas || []
1550
+ // 如果gt为0,则总是启用
1551
+ reactData.scrollYLoad = !!virtualYOpts.enabled && virtualYOpts.gt > -1 && (virtualYOpts.gt === 0 || virtualYOpts.gt <= fullData.length)
1552
+ $xeSelect.handleData()
1553
+ if (!isLoaded) {
1554
+ const { selectMode } = defaultOpts
1555
+ if (datas.length > 0 && XEUtils.eqNull(props.value)) {
1556
+ if (selectMode === 'all') {
1557
+ if (multiple) {
1558
+ $xeSelect.$nextTick(() => {
1559
+ $xeSelect.emitDefaultValue(datas.map(item => item[valueField]))
1560
+ })
1561
+ } else {
1562
+ errLog('vxe.error.notConflictProp', ['default-config.selectMode=all', 'multiple=true'])
1563
+ }
1564
+ } else if (selectMode === 'first' || selectMode === 'last') {
1565
+ const selectItem = XEUtils[selectMode](datas)
1566
+ if (selectItem) {
1567
+ $xeSelect.$nextTick(() => {
1568
+ if (XEUtils.eqNull(props.value)) {
1569
+ $xeSelect.emitDefaultValue(selectItem[valueField])
1570
+ }
1571
+ })
1572
+ }
1573
+ }
1574
+ internalData.isLoaded = true
1575
+ }
1576
+ }
1577
+ return $xeSelect.computeScrollLoad().then(() => {
1578
+ $xeSelect.refreshScroll()
1579
+ })
1580
+ },
1581
+ reloadData (datas: any[]) {
1582
+ const $xeSelect = this
1583
+ const internalData = $xeSelect.internalData
1584
+
1585
+ internalData.isLoaded = false
1586
+ $xeSelect.clearScroll()
1587
+ return $xeSelect.loadData(datas)
1588
+ },
1589
+ clearScroll () {
1590
+ const $xeSelect = this
1591
+ const internalData = $xeSelect.internalData
1592
+
1593
+ const scrollBodyElem = $xeSelect.$refs.refVirtualWrapper as HTMLDivElement
1594
+ if (scrollBodyElem) {
1595
+ scrollBodyElem.scrollTop = 0
1596
+ scrollBodyElem.scrollLeft = 0
1597
+ }
1598
+ internalData.lastScrollTop = 0
1599
+ internalData.lastScrollLeft = 0
1600
+ return $xeSelect.$nextTick()
1601
+ },
1602
+ hasOptGroupById (optid: any) {
1603
+ const $xeSelect = this
1604
+ const internalData = $xeSelect.internalData
1605
+
1606
+ const { optGroupKeyMaps } = internalData
1607
+ return !!optGroupKeyMaps[optid]
1608
+ },
1609
+
1610
+ //
1611
+ // Render
1612
+ //
1613
+ renderOption (h: CreateElement, list: VxeOptionProps[]) {
1614
+ const $xeSelect = this
1615
+ const props = $xeSelect
1616
+ const slots = $xeSelect.$scopedSlots
1617
+ const reactData = $xeSelect.reactData
1618
+ const internalData = $xeSelect.internalData
1619
+
1620
+ const { allowCreate, optionKey } = props
1621
+ const { currentOption } = reactData
1622
+ const { optAddMaps } = internalData
1623
+ const optionOpts = $xeSelect.computeOptionOpts
1624
+ const labelField = $xeSelect.computeLabelField
1625
+ const valueField = $xeSelect.computeValueField
1626
+ const groupLabelField = $xeSelect.computeGroupLabelField
1627
+ const selectVals = $xeSelect.computeSelectVals
1628
+ const { useKey, height } = optionOpts
1629
+ const optionSlot = slots.option
1630
+ return list.map((option, cIndex) => {
1631
+ const { slots, className } = option
1632
+ const optid = $xeSelect.getOptId(option)
1633
+ const optionValue = option[valueField as 'value']
1634
+ const isOptGroup = $xeSelect.hasOptGroupById(optid)
1635
+ const isAdd = !!(allowCreate && optAddMaps[optid])
1636
+ const isSelected = !isAdd && selectVals.indexOf(optionValue) > -1
1637
+ const isVisible = isAdd || (!isOptGroup || isOptionVisible(option))
1638
+ const isDisabled = !isAdd && $xeSelect.checkOptionDisabled(isSelected, option)
1639
+ const defaultSlot = slots ? slots.default : null
1640
+ const optParams = { option, group: isOptGroup ? option : null, $select: $xeSelect }
1641
+ let optLabel = ''
1642
+ let optVNs: string | VxeComponentSlotType[] = []
1643
+ if (optionSlot) {
1644
+ optVNs = $xeSelect.callSlot(optionSlot, optParams, h)
1645
+ } else if (defaultSlot) {
1646
+ optVNs = $xeSelect.callSlot(defaultSlot, optParams, h)
1647
+ } else {
1648
+ optLabel = getFuncText(option[(isOptGroup ? groupLabelField : labelField) as 'label'] || optionValue)
1649
+ optVNs = optLabel
1650
+ }
1651
+
1652
+ return isVisible
1653
+ ? h('div', {
1654
+ key: useKey || optionKey ? optid : cIndex,
1655
+ class: ['vxe-select-option', className ? (XEUtils.isFunction(className) ? className(optParams) : className) : '', {
1656
+ 'vxe-select-optgroup': isOptGroup,
1657
+ 'is--disabled': isDisabled,
1658
+ 'is--selected': isSelected,
1659
+ 'is--add': isAdd,
1660
+ 'is--hover': currentOption && $xeSelect.getOptId(currentOption) === optid
1661
+ }],
1662
+ attrs: {
1663
+ optid: optid,
1664
+ title: optLabel || null
1665
+ },
1666
+ style: height
1667
+ ? {
1668
+ height: toCssUnit(height)
1669
+ }
1670
+ : undefined,
1671
+ on: {
1672
+ mousedown: (evnt: MouseEvent) => {
1673
+ const isLeftBtn = evnt.button === 0
1674
+ if (isLeftBtn) {
1675
+ evnt.stopPropagation()
1676
+ }
1677
+ },
1678
+ click: (evnt: MouseEvent) => {
1679
+ if (!isDisabled && !isOptGroup) {
1680
+ $xeSelect.changeOptionEvent(evnt, option)
1681
+ }
1682
+ },
1683
+ mouseenter: () => {
1684
+ if (!isDisabled && !isOptGroup && !$xeSelect.isVMScrollProcess()) {
1685
+ $xeSelect.setCurrentOption(option)
1686
+ }
1687
+ }
1688
+ }
1689
+ }, allowCreate
1690
+ ? [
1691
+ h('span', {
1692
+ key: 1,
1693
+ class: 'vxe-select-option--label'
1694
+ }, optVNs),
1695
+ isAdd
1696
+ ? h('span', {
1697
+ key: 2,
1698
+ class: 'vxe-select-option--add-icon'
1699
+ }, [
1700
+ h('i', {
1701
+ class: getIcon().SELECT_ADD_OPTION
1702
+ })
1703
+ ])
1704
+ : renderEmptyElement($xeSelect)
1705
+ ]
1706
+ : optVNs)
1707
+ : renderEmptyElement($xeSelect)
1708
+ })
1709
+ },
1710
+ renderOpts (h: CreateElement): VNode[] {
1711
+ const $xeSelect = this
1712
+ const props = $xeSelect
1713
+ const reactData = $xeSelect.reactData
1714
+
1715
+ const { optList, searchLoading } = reactData
1716
+ if (searchLoading) {
1717
+ return [
1718
+ h('div', {
1719
+ class: 'vxe-select--search-loading'
1720
+ }, [
1721
+ h('i', {
1722
+ class: ['vxe-select--search-icon', getIcon().SELECT_LOADED]
1723
+ }),
1724
+ h('span', {
1725
+ class: 'vxe-select--search-text'
1726
+ }, getI18n('vxe.select.loadingText'))
1727
+ ])
1728
+ ]
1729
+ }
1730
+ if (optList.length) {
1731
+ return $xeSelect.renderOption(h, optList)
1732
+ }
1733
+ return [
1734
+ h('div', {
1735
+ class: 'vxe-select--empty-placeholder'
1736
+ }, props.emptyText || getI18n('vxe.select.emptyText'))
1737
+ ]
1738
+ },
1739
+ renderVN (h: CreateElement): VNode {
1740
+ const $xeSelect = this
1741
+ const props = $xeSelect
1742
+ const slots = $xeSelect.$scopedSlots
1743
+ const reactData = $xeSelect.reactData
1744
+
1745
+ const { className, multiple, loading, filterable, showTotalButoon, showCheckedButoon, showClearButton } = props
1746
+ const { initialized, isActivated, isAniVisible, optList, visiblePanel, bodyHeight, topSpaceHeight } = reactData
1747
+ const vSize = $xeSelect.computeSize
1748
+ const isDisabled = $xeSelect.computeIsDisabled
1749
+ const selectLabel = $xeSelect.computeSelectLabel
1750
+ const fullLabel = $xeSelect.computeFullLabel
1751
+ const btnTransfer = $xeSelect.computeBtnTransfer
1752
+ const formReadonly = $xeSelect.computeFormReadonly
1753
+ const inpPlaceholder = $xeSelect.computeInpPlaceholder
1754
+ const popupOpts = $xeSelect.computePopupOpts
1755
+ const popupWrapperStyle = $xeSelect.computePopupWrapperStyle
1756
+ const defaultSlot = slots.default
1757
+ const headerSlot = slots.header
1758
+ const footerSlot = slots.footer
1759
+ const prefixSlot = slots.prefix
1760
+ const ppClassName = popupOpts.className || props.popupClassName
1761
+ if (formReadonly) {
1762
+ return h('div', {
1763
+ ref: 'refElem',
1764
+ class: ['vxe-select--readonly', className]
1765
+ }, [
1766
+ h('div', {
1767
+ class: 'vxe-select-slots',
1768
+ ref: 'hideOption'
1769
+ }, defaultSlot ? $xeSelect.callSlot(defaultSlot, {}, h) : []),
1770
+ h('span', {
1771
+ class: 'vxe-select-label',
1772
+ attrs: {
1773
+ fullLabel
1774
+ }
1775
+ }, selectLabel)
1776
+ ])
1777
+ }
1778
+ const selectVals = $xeSelect.computeSelectVals
1779
+ return h('div', {
1780
+ ref: 'refElem',
1781
+ class: ['vxe-select', className ? (XEUtils.isFunction(className) ? className({ $select: $xeSelect }) : className) : '', {
1782
+ [`size--${vSize}`]: vSize,
1783
+ 'is--visible': visiblePanel,
1784
+ 'is--disabled': isDisabled,
1785
+ 'is--filter': filterable,
1786
+ 'is--loading': loading,
1787
+ 'is--active': isActivated
1788
+ }]
1789
+ }, [
1790
+ h('div', {
1791
+ class: 'vxe-select-slots',
1792
+ ref: 'hideOption'
1793
+ }, defaultSlot ? defaultSlot.call($xeSelect, {}) : []),
1794
+ h(VxeInputComponent, {
1795
+ ref: 'refInput',
1796
+ props: {
1797
+ clearable: props.clearable,
1798
+ placeholder: inpPlaceholder,
1799
+ editable: false,
1800
+ disabled: isDisabled,
1801
+ type: 'text',
1802
+ prefixIcon: props.prefixIcon,
1803
+ suffixIcon: loading ? getIcon().SELECT_LOADED : (visiblePanel ? getIcon().SELECT_OPEN : getIcon().SELECT_CLOSE),
1804
+ autoFocus: false,
1805
+ title: fullLabel,
1806
+ value: selectLabel
1807
+ },
1808
+ on: {
1809
+ clear: $xeSelect.clearEvent,
1810
+ click: $xeSelect.clickEvent,
1811
+ focus: $xeSelect.focusEvent,
1812
+ blur: $xeSelect.blurEvent,
1813
+ 'suffix-click': $xeSelect.suffixClickEvent
1814
+ },
1815
+ scopedSlots: prefixSlot
1816
+ ? {
1817
+ prefix: () => prefixSlot({})
1818
+ }
1819
+ : {}
1820
+ }),
1821
+ h('div', {
1822
+ ref: 'refOptionPanel',
1823
+ class: ['vxe-table--ignore-clear vxe-select--panel', ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $select: $xeSelect }) : ppClassName) : '', {
1824
+ [`size--${vSize}`]: vSize,
1825
+ 'is--transfer': btnTransfer,
1826
+ 'ani--leave': !loading && isAniVisible,
1827
+ 'ani--enter': !loading && visiblePanel
1828
+ }],
1829
+ attrs: {
1830
+ placement: reactData.panelPlacement
1831
+ },
1832
+ style: reactData.panelStyle
1833
+ }, initialized && (visiblePanel || isAniVisible)
1834
+ ? [
1835
+ h('div', {
1836
+ class: 'vxe-select--panel-wrapper',
1837
+ style: popupWrapperStyle
1838
+ }, [
1839
+ filterable
1840
+ ? h('div', {
1841
+ class: 'vxe-select--panel-search'
1842
+ }, [
1843
+ h(VxeInputComponent, {
1844
+ ref: 'refInpSearch',
1845
+ class: 'vxe-select-search--input',
1846
+ props: {
1847
+ value: reactData.searchValue,
1848
+ type: 'text',
1849
+ clearable: true,
1850
+ disabled: false,
1851
+ readonly: false,
1852
+ placeholder: getI18n('vxe.select.search'),
1853
+ prefixIcon: getIcon().INPUT_SEARCH
1854
+ },
1855
+ on: {
1856
+ 'model-value': $xeSelect.modelSearchEvent,
1857
+ focus: $xeSelect.focusSearchEvent,
1858
+ change: $xeSelect.triggerSearchEvent,
1859
+ search: $xeSelect.triggerSearchEvent
1860
+ }
1861
+ })
1862
+ ])
1863
+ : renderEmptyElement($xeSelect),
1864
+ showTotalButoon || (showCheckedButoon && multiple) || showClearButton || headerSlot
1865
+ ? h('div', {
1866
+ class: 'vxe-select--panel-header'
1867
+ }, headerSlot
1868
+ ? $xeSelect.callSlot(headerSlot, {}, h)
1869
+ : [
1870
+ h('div', {
1871
+ class: 'vxe-tree-select--header-button'
1872
+ }, [
1873
+ showTotalButoon
1874
+ ? h('div', {
1875
+ class: 'vxe-tree-select--header-total'
1876
+ }, getI18n('vxe.select.total', [selectVals.length, optList.length]))
1877
+ : renderEmptyElement($xeSelect),
1878
+ h('div', {
1879
+ class: 'vxe-tree-select--header-btns'
1880
+ }, [
1881
+ (showCheckedButoon && multiple)
1882
+ ? h(VxeButtonComponent, {
1883
+ props: {
1884
+ content: getI18n('vxe.select.allChecked'),
1885
+ mode: 'text'
1886
+ },
1887
+ on: {
1888
+ click: $xeSelect.allCheckedPanelEvent
1889
+ }
1890
+ })
1891
+ : renderEmptyElement($xeSelect),
1892
+ showClearButton
1893
+ ? h(VxeButtonComponent, {
1894
+ props: {
1895
+ content: getI18n('vxe.select.clear'),
1896
+ mode: 'text'
1897
+ },
1898
+ on: {
1899
+ click: $xeSelect.clearCheckedPanelEvent
1900
+ }
1901
+ })
1902
+ : renderEmptyElement($xeSelect)
1903
+ ])
1904
+ ])
1905
+ ])
1906
+ : renderEmptyElement($xeSelect),
1907
+ h('div', {
1908
+ class: 'vxe-select--panel-body'
1909
+ }, [
1910
+ h('div', {
1911
+ ref: 'refVirtualWrapper',
1912
+ class: 'vxe-select-option--wrapper',
1913
+ on: {
1914
+ scroll: $xeSelect.scrollEvent
1915
+ }
1916
+ }, [
1917
+ h('div', {
1918
+ class: 'vxe-select--y-space',
1919
+ style: {
1920
+ height: bodyHeight ? `${bodyHeight}px` : ''
1921
+ }
1922
+ }),
1923
+ h('div', {
1924
+ ref: 'refVirtualBody',
1925
+ class: 'vxe-select--body',
1926
+ style: {
1927
+ transform: `translateY(${topSpaceHeight}px)`
1928
+ }
1929
+ }, $xeSelect.renderOpts(h))
1930
+ ])
1931
+ ]),
1932
+ footerSlot
1933
+ ? h('div', {
1934
+ class: 'vxe-select--panel-footer'
1935
+ }, $xeSelect.callSlot(footerSlot, {}, h))
1936
+ : renderEmptyElement($xeSelect)
1937
+ ])
1938
+ ]
1939
+ : [])
1940
+ ])
1941
+ }
1942
+ },
1943
+ watch: {
1944
+ 'reactData.staticOptions' (val: VxeSelectDefines.OptionInfo[]) {
1945
+ const $xeSelect = this
1946
+
1947
+ $xeSelect.loadData(val)
1948
+ },
1949
+ options (val) {
1950
+ const $xeSelect = this
1951
+
1952
+ $xeSelect.loadData(val)
1953
+ },
1954
+ optionGroups (val) {
1955
+ const $xeSelect = this
1956
+
1957
+ $xeSelect.loadData(val)
1958
+ }
1959
+ },
1960
+ mounted () {
1961
+ const $xeSelect = this
1962
+ const props = $xeSelect
1963
+
1964
+ $xeSelect.$nextTick(() => {
1965
+ const { options, optionGroups } = props
1966
+ if (optionGroups) {
1967
+ $xeSelect.loadData(optionGroups)
1968
+ } else if (options) {
1969
+ $xeSelect.loadData(options)
1970
+ }
1971
+ })
1972
+ globalEvents.on($xeSelect, 'mousewheel', $xeSelect.handleGlobalMousewheelEvent)
1973
+ globalEvents.on($xeSelect, 'mousedown', $xeSelect.handleGlobalMousedownEvent)
1974
+ globalEvents.on($xeSelect, 'keydown', $xeSelect.handleGlobalKeydownEvent)
1975
+ globalEvents.on($xeSelect, 'blur', $xeSelect.handleGlobalBlurEvent)
1976
+ globalEvents.on($xeSelect, 'resize', $xeSelect.handleGlobalResizeEvent)
1977
+ },
1978
+ beforeDestroy () {
1979
+ const $xeSelect = this
1980
+
1981
+ const panelElem = $xeSelect.$refs.refOptionPanel as HTMLElement | undefined
1982
+ if (panelElem && panelElem.parentNode) {
1983
+ panelElem.parentNode.removeChild(panelElem)
1984
+ }
1985
+ globalEvents.off($xeSelect, 'mousewheel')
1986
+ globalEvents.off($xeSelect, 'mousedown')
1987
+ globalEvents.off($xeSelect, 'keydown')
1988
+ globalEvents.off($xeSelect, 'blur')
1989
+ globalEvents.off($xeSelect, 'resize')
1990
+ },
1991
+ destroyed () {
1992
+ const $xeSelect = this
1993
+ const internalData = $xeSelect.internalData
1994
+
1995
+ XEUtils.assign(internalData, createInternalData())
1996
+ },
1997
+ render (this: any, h) {
1998
+ return this.renderVN(h)
1999
+ }
2000
+ }) /* define-vxe-component end */