vxe-pc-ui 4.20.25 → 4.20.26

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 (626) hide show
  1. package/dist/all.esm.js +15059 -10308
  2. package/dist/style.css +1 -1
  3. package/dist/style.mini.css +1 -1
  4. package/es/alert/src/alert.js +61 -36
  5. package/es/anchor/src/anchor-link.js +39 -20
  6. package/es/anchor/src/anchor.js +74 -45
  7. package/es/avatar/src/avatar.js +47 -27
  8. package/es/backtop/src/backtop.js +65 -40
  9. package/es/badge/src/badge.js +32 -16
  10. package/es/breadcrumb/src/breadcrumb-item.js +52 -27
  11. package/es/breadcrumb/src/breadcrumb.js +11 -8
  12. package/es/button/src/button-group.js +24 -18
  13. package/es/button/src/button.js +284 -185
  14. package/es/calendar/src/calendar.js +571 -358
  15. package/es/card/src/card.js +123 -68
  16. package/es/carousel/src/carousel-item.js +14 -7
  17. package/es/carousel/src/carousel.js +174 -112
  18. package/es/cascader/src/cascader.js +526 -380
  19. package/es/checkbox/src/button.js +90 -55
  20. package/es/checkbox/src/checkbox.js +60 -40
  21. package/es/checkbox/src/group.js +34 -26
  22. package/es/collapse/src/collapse-pane.js +33 -16
  23. package/es/collapse/src/collapse.js +133 -79
  24. package/es/color-picker/src/color-picker.js +489 -350
  25. package/es/components.d.ts +3 -1
  26. package/es/components.js +3 -2
  27. package/es/context-menu/src/context-menu.js +190 -110
  28. package/es/countdown/src/countdown.js +91 -59
  29. package/es/date-panel/src/date-panel.js +760 -450
  30. package/es/date-picker/src/date-picker.js +331 -228
  31. package/es/date-range-picker/src/date-range-picker.js +366 -265
  32. package/es/divider/src/divider.js +26 -12
  33. package/es/drawer/src/drawer.js +254 -154
  34. package/es/dynamics/index.js +38 -25
  35. package/es/empty/src/empty.js +53 -29
  36. package/es/form/render/index.js +66 -41
  37. package/es/form/src/form-config-item.js +22 -16
  38. package/es/form/src/form-group.js +23 -14
  39. package/es/form/src/form-item.js +23 -17
  40. package/es/form/src/form.js +139 -95
  41. package/es/form/src/itemInfo.js +2 -1
  42. package/es/form/src/render.js +207 -127
  43. package/es/form/src/util.js +8 -4
  44. package/es/icon/src/icon.js +14 -10
  45. package/es/icon/style.css +1 -1
  46. package/es/icon/style.mini.css +1 -1
  47. package/es/icon-picker/src/icon-picker.js +250 -157
  48. package/es/image/src/group.js +26 -20
  49. package/es/image/src/image.js +33 -32
  50. package/es/image/src/preview.js +182 -122
  51. package/es/image/src/util.js +6 -3
  52. package/es/index.esm.js +9 -8
  53. package/es/index.js +9 -8
  54. package/es/input/src/input.js +820 -507
  55. package/es/layout-aside/src/layout-aside.js +54 -38
  56. package/es/layout-body/src/layout-body.js +39 -27
  57. package/es/layout-container/src/layout-container.js +16 -9
  58. package/es/layout-footer/src/layout-footer.js +16 -7
  59. package/es/layout-header/src/layout-header.js +15 -7
  60. package/es/link/src/link.js +65 -44
  61. package/es/list/src/list.js +453 -333
  62. package/es/loading/index.js +8 -5
  63. package/es/loading/src/loading.js +60 -33
  64. package/es/mention/src/mention.js +2 -1
  65. package/es/menu/src/menu.js +341 -210
  66. package/es/modal/index.js +60 -37
  67. package/es/modal/src/modal.js +303 -205
  68. package/es/notice-bar/src/notice-bar.js +64 -37
  69. package/es/number-input/src/number-input.js +249 -172
  70. package/es/pager/src/pager.js +346 -202
  71. package/es/password-input/src/password-input.js +145 -105
  72. package/es/print/src/page-break.js +2 -1
  73. package/es/print/src/print.js +184 -99
  74. package/es/pulldown/src/pulldown.js +113 -71
  75. package/es/radio/src/button.js +92 -57
  76. package/es/radio/src/group.js +33 -25
  77. package/es/radio/src/radio.js +61 -41
  78. package/es/rate/src/rate.js +48 -36
  79. package/es/result/src/result.js +67 -35
  80. package/es/row/src/col.js +30 -16
  81. package/es/row/src/row.js +21 -14
  82. package/es/scrollbar/src/scrollbar.js +177 -145
  83. package/es/segmented/src/segmented.js +93 -60
  84. package/es/select/src/optgroup.js +7 -3
  85. package/es/select/src/select.js +483 -340
  86. package/es/select/src/util.js +6 -3
  87. package/es/slider/src/slider.js +108 -80
  88. package/es/space/src/space.js +40 -23
  89. package/es/splitter/src/splitter-panel.js +50 -25
  90. package/es/splitter/src/splitter.js +219 -144
  91. package/es/steps/src/steps.js +10 -5
  92. package/es/style.css +1 -1
  93. package/es/style.mini.css +1 -1
  94. package/es/switch/src/switch.js +85 -57
  95. package/es/table-select/src/table-select.js +232 -153
  96. package/es/table-transfer/src/table-transfer.js +10 -5
  97. package/es/tabs/src/tab-pane.js +33 -16
  98. package/es/tabs/src/tabs.js +363 -230
  99. package/es/tag/src/tag.js +61 -43
  100. package/es/text/src/text.js +89 -65
  101. package/es/text-ellipsis/src/text-ellipsis.js +82 -51
  102. package/es/textarea/src/textarea.js +116 -86
  103. package/es/timeline/src/timeline-item.js +2 -1
  104. package/es/timeline/src/timeline.js +2 -1
  105. package/es/tip/src/tip.js +53 -29
  106. package/es/tooltip/src/tooltip.js +114 -74
  107. package/es/tour/src/tour.js +2 -1
  108. package/es/transfer/src/transfer.js +42 -25
  109. package/es/tree/src/tree.js +709 -492
  110. package/es/tree-select/src/tree-select.js +320 -225
  111. package/es/ui/index.d.ts +0 -1
  112. package/es/ui/index.js +46 -3
  113. package/es/ui/src/dom.js +9 -6
  114. package/es/ui/src/log.js +1 -1
  115. package/es/ui/src/utils.d.ts +1 -1
  116. package/es/upload/src/upload.js +614 -398
  117. package/es/vxe-icon/style.css +1 -1
  118. package/es/vxe-icon/style.mini.css +1 -1
  119. package/es/watermark/src/util.js +15 -12
  120. package/es/watermark/src/watermark.js +55 -25
  121. package/lib/alert/src/alert.js +62 -37
  122. package/lib/anchor/src/anchor-link.js +39 -20
  123. package/lib/anchor/src/anchor.js +75 -46
  124. package/lib/avatar/src/avatar.js +52 -32
  125. package/lib/backtop/src/backtop.js +81 -56
  126. package/lib/badge/src/badge.js +35 -19
  127. package/lib/breadcrumb/src/breadcrumb-item.js +52 -27
  128. package/lib/breadcrumb/src/breadcrumb.js +13 -10
  129. package/lib/button/src/button-group.js +27 -21
  130. package/lib/button/src/button.js +306 -207
  131. package/lib/calendar/src/calendar.js +575 -362
  132. package/lib/card/src/card.js +133 -78
  133. package/lib/carousel/src/carousel-item.js +15 -8
  134. package/lib/carousel/src/carousel.js +182 -120
  135. package/lib/cascader/src/cascader.js +555 -409
  136. package/lib/checkbox/src/button.js +93 -58
  137. package/lib/checkbox/src/checkbox.js +63 -43
  138. package/lib/checkbox/src/group.js +37 -29
  139. package/lib/collapse/src/collapse-pane.js +34 -17
  140. package/lib/collapse/src/collapse.js +139 -85
  141. package/lib/color-picker/src/color-picker.js +516 -377
  142. package/lib/components.js +3 -2
  143. package/lib/context-menu/src/context-menu.js +212 -132
  144. package/lib/countdown/src/countdown.js +95 -63
  145. package/lib/date-panel/src/date-panel.js +776 -466
  146. package/lib/date-picker/src/date-picker.js +377 -274
  147. package/lib/date-range-picker/src/date-range-picker.js +401 -300
  148. package/lib/divider/src/divider.js +31 -17
  149. package/lib/drawer/src/drawer.js +255 -155
  150. package/lib/dynamics/index.js +38 -25
  151. package/lib/empty/src/empty.js +55 -31
  152. package/lib/form/render/index.js +68 -43
  153. package/lib/form/src/form-config-item.js +24 -18
  154. package/lib/form/src/form-group.js +25 -16
  155. package/lib/form/src/form-item.js +25 -19
  156. package/lib/form/src/form.js +140 -96
  157. package/lib/form/src/itemInfo.js +4 -3
  158. package/lib/form/src/render.js +214 -134
  159. package/lib/form/src/util.js +9 -5
  160. package/lib/icon/src/icon.js +17 -13
  161. package/lib/icon/style/style.css +1 -1
  162. package/lib/icon/style/style.mini.css +1 -1
  163. package/lib/icon-picker/src/icon-picker.js +251 -158
  164. package/lib/image/src/group.js +26 -20
  165. package/lib/image/src/image.js +41 -40
  166. package/lib/image/src/preview.js +206 -146
  167. package/lib/image/src/util.js +6 -3
  168. package/lib/index.common.js +9 -8
  169. package/lib/index.js +9 -8
  170. package/lib/index.umd.js +15131 -10364
  171. package/lib/index.umd.min.js +3 -3
  172. package/lib/input/src/input.js +878 -565
  173. package/lib/layout-aside/src/layout-aside.js +61 -45
  174. package/lib/layout-body/src/layout-body.js +47 -35
  175. package/lib/layout-container/src/layout-container.js +18 -11
  176. package/lib/layout-footer/src/layout-footer.js +17 -8
  177. package/lib/layout-header/src/layout-header.js +16 -8
  178. package/lib/link/src/link.js +69 -48
  179. package/lib/list/src/list.js +456 -336
  180. package/lib/loading/index.js +8 -5
  181. package/lib/loading/src/loading.js +69 -42
  182. package/lib/mention/src/mention.js +4 -3
  183. package/lib/menu/src/menu.js +351 -220
  184. package/lib/modal/index.js +60 -37
  185. package/lib/modal/src/modal.js +306 -208
  186. package/lib/notice-bar/src/notice-bar.js +70 -43
  187. package/lib/number-input/src/number-input.js +290 -213
  188. package/lib/pager/src/pager.js +347 -203
  189. package/lib/password-input/src/password-input.js +155 -115
  190. package/lib/print/src/page-break.js +3 -2
  191. package/lib/print/src/print.js +193 -108
  192. package/lib/pulldown/src/pulldown.js +128 -86
  193. package/lib/radio/src/button.js +96 -61
  194. package/lib/radio/src/group.js +37 -29
  195. package/lib/radio/src/radio.js +65 -45
  196. package/lib/rate/src/rate.js +50 -38
  197. package/lib/result/src/result.js +68 -36
  198. package/lib/row/src/col.js +32 -18
  199. package/lib/row/src/row.js +25 -18
  200. package/lib/scrollbar/src/scrollbar.js +178 -146
  201. package/lib/segmented/src/segmented.js +97 -64
  202. package/lib/select/src/optgroup.js +7 -3
  203. package/lib/select/src/select.js +486 -343
  204. package/lib/select/src/util.js +6 -3
  205. package/lib/slider/src/slider.js +122 -94
  206. package/lib/space/src/space.js +54 -37
  207. package/lib/splitter/src/splitter-panel.js +51 -26
  208. package/lib/splitter/src/splitter.js +233 -158
  209. package/lib/steps/src/steps.js +11 -6
  210. package/lib/style.css +1 -1
  211. package/lib/style.mini.css +1 -1
  212. package/lib/switch/src/switch.js +87 -59
  213. package/lib/table-select/src/table-select.js +234 -155
  214. package/lib/table-transfer/src/table-transfer.js +12 -7
  215. package/lib/tabs/src/tab-pane.js +34 -17
  216. package/lib/tabs/src/tabs.js +365 -232
  217. package/lib/tag/src/tag.js +67 -49
  218. package/lib/text/src/text.js +100 -76
  219. package/lib/text-ellipsis/src/text-ellipsis.js +86 -55
  220. package/lib/textarea/src/textarea.js +127 -97
  221. package/lib/timeline/src/timeline-item.js +3 -2
  222. package/lib/timeline/src/timeline.js +4 -3
  223. package/lib/tip/src/tip.js +58 -34
  224. package/lib/tooltip/src/tooltip.js +116 -76
  225. package/lib/tour/src/tour.js +4 -3
  226. package/lib/transfer/src/transfer.js +44 -27
  227. package/lib/tree/src/tree.js +717 -500
  228. package/lib/tree-select/src/tree-select.js +351 -256
  229. package/lib/ui/index.js +46 -4
  230. package/lib/ui/src/dom.js +9 -6
  231. package/lib/ui/src/log.js +1 -1
  232. package/lib/upload/src/upload.js +708 -492
  233. package/lib/vxe-icon/style/style.css +1 -1
  234. package/lib/vxe-icon/style/style.mini.css +1 -1
  235. package/lib/watermark/src/util.js +15 -12
  236. package/lib/watermark/src/watermark.js +60 -30
  237. package/package.json +10 -4
  238. package/packages/alert/index.ts +16 -16
  239. package/packages/alert/src/alert.ts +148 -126
  240. package/packages/anchor/index.ts +16 -16
  241. package/packages/anchor/src/anchor-link.ts +139 -121
  242. package/packages/anchor/src/anchor.ts +266 -237
  243. package/packages/anchor/src/util.ts +23 -23
  244. package/packages/anchor-link/index.ts +16 -16
  245. package/packages/avatar/index.ts +16 -16
  246. package/packages/avatar/src/avatar.ts +166 -149
  247. package/packages/backtop/index.ts +16 -16
  248. package/packages/backtop/src/backtop.ts +337 -313
  249. package/packages/badge/index.ts +16 -16
  250. package/packages/badge/src/badge.ts +131 -118
  251. package/packages/breadcrumb/index.ts +16 -16
  252. package/packages/breadcrumb/src/breadcrumb-item.ts +129 -106
  253. package/packages/breadcrumb/src/breadcrumb.ts +94 -92
  254. package/packages/breadcrumb-item/index.ts +16 -16
  255. package/packages/button/index.ts +16 -16
  256. package/packages/button/src/button-group.ts +116 -110
  257. package/packages/button/src/button.ts +975 -855
  258. package/packages/button-group/index.ts +16 -16
  259. package/packages/calendar/index.ts +16 -16
  260. package/packages/calendar/src/calendar.ts +1566 -1352
  261. package/packages/card/index.ts +16 -16
  262. package/packages/card/src/card.ts +285 -236
  263. package/packages/carousel/index.ts +16 -16
  264. package/packages/carousel/src/carousel-item.ts +120 -102
  265. package/packages/carousel/src/carousel.ts +475 -414
  266. package/packages/carousel/src/util.ts +21 -21
  267. package/packages/carousel-item/index.ts +16 -16
  268. package/packages/cascader/index.ts +16 -16
  269. package/packages/cascader/src/cascader.ts +2074 -1896
  270. package/packages/cascader/src/util.ts +9 -9
  271. package/packages/checkbox/index.ts +16 -16
  272. package/packages/checkbox/src/button.ts +267 -221
  273. package/packages/checkbox/src/checkbox.ts +219 -199
  274. package/packages/checkbox/src/group.ts +292 -269
  275. package/packages/checkbox-button/index.ts +16 -16
  276. package/packages/checkbox-group/index.ts +16 -16
  277. package/packages/col/index.ts +16 -16
  278. package/packages/collapse/index.ts +16 -16
  279. package/packages/collapse/src/collapse-pane.ts +142 -114
  280. package/packages/collapse/src/collapse.ts +453 -384
  281. package/packages/collapse/src/util.ts +21 -21
  282. package/packages/collapse-pane/index.ts +16 -16
  283. package/packages/color-picker/index.ts +31 -31
  284. package/packages/color-picker/src/color-picker.ts +1310 -1147
  285. package/packages/color-picker/src/util.ts +436 -423
  286. package/packages/components.ts +350 -349
  287. package/packages/context-menu/index.ts +54 -54
  288. package/packages/context-menu/src/context-menu.ts +773 -681
  289. package/packages/countdown/index.ts +16 -16
  290. package/packages/countdown/src/countdown.ts +295 -262
  291. package/packages/date-panel/index.ts +16 -16
  292. package/packages/date-panel/src/date-panel.ts +2214 -1900
  293. package/packages/date-panel/src/util.ts +354 -326
  294. package/packages/date-picker/index.ts +16 -16
  295. package/packages/date-picker/src/date-picker.ts +1884 -1752
  296. package/packages/date-range-picker/index.ts +16 -16
  297. package/packages/date-range-picker/src/date-range-picker.ts +1728 -1604
  298. package/packages/divider/index.ts +16 -16
  299. package/packages/divider/src/divider.ts +105 -93
  300. package/packages/drawer/index.ts +78 -78
  301. package/packages/drawer/src/drawer.ts +920 -802
  302. package/packages/drawer/src/store.ts +3 -3
  303. package/packages/dynamics/index.ts +124 -117
  304. package/packages/empty/index.ts +16 -16
  305. package/packages/empty/src/empty.ts +124 -103
  306. package/packages/form/index.ts +16 -16
  307. package/packages/form/render/index.ts +646 -614
  308. package/packages/form/src/form-config-item.ts +85 -80
  309. package/packages/form/src/form-group.ts +96 -86
  310. package/packages/form/src/form-item.ts +181 -174
  311. package/packages/form/src/form.ts +1122 -1069
  312. package/packages/form/src/itemInfo.ts +84 -82
  313. package/packages/form/src/render.ts +470 -387
  314. package/packages/form/src/util.ts +98 -93
  315. package/packages/form-gather/index.ts +26 -26
  316. package/packages/form-group/index.ts +16 -16
  317. package/packages/form-item/index.ts +16 -16
  318. package/packages/icon/index.ts +16 -16
  319. package/packages/icon/src/icon.ts +78 -75
  320. package/packages/icon-picker/index.ts +16 -16
  321. package/packages/icon-picker/src/icon-picker.ts +922 -809
  322. package/packages/image/index.ts +16 -16
  323. package/packages/image/src/group.ts +159 -153
  324. package/packages/image/src/image.ts +298 -298
  325. package/packages/image/src/preview.ts +749 -672
  326. package/packages/image/src/util.ts +62 -59
  327. package/packages/image-group/index.ts +16 -16
  328. package/packages/image-preview/index.ts +19 -19
  329. package/packages/index.ts +20 -21
  330. package/packages/input/index.ts +16 -16
  331. package/packages/input/src/input.ts +3201 -2863
  332. package/packages/language/fr-FR.ts +15 -15
  333. package/packages/language/it-IT.ts +4 -4
  334. package/packages/language/uk-UA.ts +1 -1
  335. package/packages/language/uz-UZ.ts +13 -13
  336. package/packages/language/zh-CN.ts +907 -907
  337. package/packages/layout-aside/index.ts +16 -16
  338. package/packages/layout-aside/src/layout-aside.ts +172 -156
  339. package/packages/layout-body/index.ts +16 -16
  340. package/packages/layout-body/src/layout-body.ts +191 -181
  341. package/packages/layout-container/index.ts +16 -16
  342. package/packages/layout-container/src/layout-container.ts +108 -92
  343. package/packages/layout-footer/index.ts +16 -16
  344. package/packages/layout-footer/src/layout-footer.ts +81 -74
  345. package/packages/layout-header/index.ts +16 -16
  346. package/packages/layout-header/src/layout-header.ts +79 -73
  347. package/packages/link/index.ts +16 -16
  348. package/packages/link/src/link.ts +180 -161
  349. package/packages/list/index.ts +16 -16
  350. package/packages/list/src/list.ts +2690 -2564
  351. package/packages/list/src/store.ts +10 -10
  352. package/packages/list/src/util.ts +10 -11
  353. package/packages/loading/index.ts +39 -36
  354. package/packages/loading/src/loading.ts +179 -152
  355. package/packages/mention/index.ts +16 -16
  356. package/packages/mention/src/mention.ts +69 -71
  357. package/packages/menu/index.ts +16 -16
  358. package/packages/menu/src/menu.ts +1000 -857
  359. package/packages/modal/index.ts +164 -141
  360. package/packages/modal/src/modal.ts +1803 -1681
  361. package/packages/modal/src/store.ts +3 -3
  362. package/packages/notice-bar/index.ts +16 -16
  363. package/packages/notice-bar/src/notice-bar.ts +207 -181
  364. package/packages/number-input/index.ts +16 -16
  365. package/packages/number-input/src/number-input.ts +1322 -1242
  366. package/packages/number-input/src/util.ts +25 -25
  367. package/packages/optgroup/index.ts +16 -16
  368. package/packages/option/index.ts +16 -16
  369. package/packages/pager/index.ts +16 -16
  370. package/packages/pager/src/pager.ts +919 -775
  371. package/packages/password-input/index.ts +16 -16
  372. package/packages/password-input/src/password-input.ts +523 -482
  373. package/packages/print/index.ts +18 -18
  374. package/packages/print/src/page-break.ts +104 -92
  375. package/packages/print/src/print.ts +366 -281
  376. package/packages/print/src/util.ts +299 -304
  377. package/packages/print-page-break/index.ts +16 -16
  378. package/packages/pulldown/index.ts +16 -16
  379. package/packages/pulldown/src/pulldown.ts +505 -445
  380. package/packages/radio/index.ts +16 -16
  381. package/packages/radio/src/button.ts +290 -243
  382. package/packages/radio/src/group.ts +275 -252
  383. package/packages/radio/src/radio.ts +237 -218
  384. package/packages/radio-button/index.ts +16 -16
  385. package/packages/radio-group/index.ts +16 -16
  386. package/packages/rate/index.ts +16 -16
  387. package/packages/rate/src/rate.ts +203 -192
  388. package/packages/result/index.ts +16 -16
  389. package/packages/result/src/result.ts +141 -112
  390. package/packages/row/index.ts +16 -16
  391. package/packages/row/src/col.ts +171 -159
  392. package/packages/row/src/row.ts +143 -138
  393. package/packages/scrollbar/index.ts +16 -16
  394. package/packages/scrollbar/src/scrollbar.ts +626 -595
  395. package/packages/segmented/index.ts +16 -16
  396. package/packages/segmented/src/segmented.ts +297 -264
  397. package/packages/select/index.ts +16 -16
  398. package/packages/select/src/optgroup.ts +53 -49
  399. package/packages/select/src/option-info.ts +20 -20
  400. package/packages/select/src/option.ts +47 -47
  401. package/packages/select/src/select.ts +2390 -2214
  402. package/packages/select/src/util.ts +50 -47
  403. package/packages/slider/index.ts +16 -16
  404. package/packages/slider/src/slider.ts +547 -506
  405. package/packages/space/index.ts +16 -16
  406. package/packages/space/src/space.ts +225 -209
  407. package/packages/split/index.ts +16 -16
  408. package/packages/split-pane/index.ts +17 -17
  409. package/packages/splitter/index.ts +16 -16
  410. package/packages/splitter/src/splitter-panel.ts +199 -163
  411. package/packages/splitter/src/splitter.ts +1110 -1020
  412. package/packages/splitter/src/util.ts +21 -21
  413. package/packages/splitter-panel/index.ts +16 -16
  414. package/packages/steps/index.ts +16 -16
  415. package/packages/steps/src/steps.ts +69 -68
  416. package/packages/switch/index.ts +16 -16
  417. package/packages/switch/src/switch.ts +300 -271
  418. package/packages/tab-pane/index.ts +16 -16
  419. package/packages/table-select/index.ts +16 -16
  420. package/packages/table-select/src/table-select.ts +1103 -999
  421. package/packages/table-transfer/index.ts +16 -16
  422. package/packages/table-transfer/src/table-transfer.ts +104 -91
  423. package/packages/tabs/index.ts +16 -16
  424. package/packages/tabs/src/tab-pane.ts +132 -117
  425. package/packages/tabs/src/tabs.ts +1137 -997
  426. package/packages/tabs/src/util.ts +21 -21
  427. package/packages/tag/index.ts +16 -16
  428. package/packages/tag/src/tag.ts +204 -187
  429. package/packages/text/index.ts +16 -16
  430. package/packages/text/src/text.ts +282 -260
  431. package/packages/text-ellipsis/index.ts +16 -16
  432. package/packages/text-ellipsis/src/text-ellipsis.ts +312 -282
  433. package/packages/textarea/index.ts +16 -16
  434. package/packages/textarea/src/textarea.ts +526 -495
  435. package/packages/timeline/index.ts +16 -16
  436. package/packages/timeline/src/timeline-item.ts +65 -67
  437. package/packages/timeline/src/timeline.ts +70 -71
  438. package/packages/timeline-item/index.ts +16 -16
  439. package/packages/tip/index.ts +19 -19
  440. package/packages/tip/src/tip.ts +150 -129
  441. package/packages/tooltip/index.ts +72 -72
  442. package/packages/tooltip/src/tooltip.ts +669 -627
  443. package/packages/tour/index.ts +16 -16
  444. package/packages/tour/src/tour.ts +70 -71
  445. package/packages/transfer/index.ts +16 -16
  446. package/packages/transfer/src/transfer.ts +130 -117
  447. package/packages/tree/index.ts +16 -16
  448. package/packages/tree/src/store.ts +10 -10
  449. package/packages/tree/src/tree.ts +4077 -3852
  450. package/packages/tree/src/util.ts +51 -51
  451. package/packages/tree-select/index.ts +16 -16
  452. package/packages/tree-select/src/tree-select.ts +1217 -1094
  453. package/packages/ui/index.ts +836 -793
  454. package/packages/ui/src/anime.ts +51 -52
  455. package/packages/ui/src/comp.ts +3 -3
  456. package/packages/ui/src/dom.ts +357 -354
  457. package/packages/ui/src/log.ts +19 -19
  458. package/packages/ui/src/utils.ts +79 -79
  459. package/packages/ui/src/vn.ts +39 -39
  460. package/packages/upload/index.ts +20 -20
  461. package/packages/upload/src/upload.ts +2271 -2021
  462. package/packages/upload/src/util.ts +109 -109
  463. package/packages/watermark/index.ts +33 -33
  464. package/packages/watermark/src/util.ts +186 -180
  465. package/packages/watermark/src/watermark.ts +196 -168
  466. package/types/all.d.ts +552 -552
  467. package/types/components/alert.d.ts +83 -87
  468. package/types/components/anchor-link.d.ts +88 -91
  469. package/types/components/anchor.d.ts +97 -104
  470. package/types/components/avatar.d.ts +85 -88
  471. package/types/components/backtop.d.ts +119 -122
  472. package/types/components/badge.d.ts +77 -80
  473. package/types/components/breadcrumb-item.d.ts +77 -80
  474. package/types/components/breadcrumb.d.ts +83 -87
  475. package/types/components/button-group.d.ts +118 -120
  476. package/types/components/button.d.ts +331 -339
  477. package/types/components/calendar.d.ts +247 -264
  478. package/types/components/card.d.ts +111 -113
  479. package/types/components/carousel-item.d.ts +73 -75
  480. package/types/components/carousel.d.ts +130 -134
  481. package/types/components/cascader.d.ts +336 -386
  482. package/types/components/checkbox-button.d.ts +109 -114
  483. package/types/components/checkbox-group.d.ts +152 -154
  484. package/types/components/checkbox.d.ts +123 -128
  485. package/types/components/col.d.ts +77 -80
  486. package/types/components/colgroup.d.ts +64 -69
  487. package/types/components/collapse-pane.d.ts +86 -89
  488. package/types/components/collapse.d.ts +123 -133
  489. package/types/components/color-picker.d.ts +275 -280
  490. package/types/components/column.d.ts +834 -851
  491. package/types/components/context-menu.d.ts +282 -289
  492. package/types/components/countdown.d.ts +108 -112
  493. package/types/components/date-panel.d.ts +319 -331
  494. package/types/components/date-picker.d.ts +361 -384
  495. package/types/components/date-range-picker.d.ts +351 -371
  496. package/types/components/divider.d.ts +72 -75
  497. package/types/components/drawer.d.ts +333 -344
  498. package/types/components/empty.d.ts +75 -78
  499. package/types/components/flow-design.d.ts +73 -85
  500. package/types/components/flow-view.d.ts +73 -85
  501. package/types/components/form-design.d.ts +370 -376
  502. package/types/components/form-gather.d.ts +120 -124
  503. package/types/components/form-group.d.ts +73 -77
  504. package/types/components/form-item.d.ts +395 -413
  505. package/types/components/form-view.d.ts +179 -183
  506. package/types/components/form.d.ts +499 -495
  507. package/types/components/gantt-module/gantt-view.d.ts +195 -200
  508. package/types/components/gantt-module/index.d.ts +1 -1
  509. package/types/components/gantt-plugins/extend-gantt-chart.d.ts +137 -131
  510. package/types/components/gantt-plugins/index.d.ts +1 -1
  511. package/types/components/gantt.d.ts +1248 -1399
  512. package/types/components/grid.d.ts +1289 -1317
  513. package/types/components/icon-picker.d.ts +242 -253
  514. package/types/components/icon.d.ts +332 -87
  515. package/types/components/image-group.d.ts +124 -127
  516. package/types/components/image-preview.d.ts +167 -167
  517. package/types/components/image.d.ts +166 -173
  518. package/types/components/input.d.ts +429 -453
  519. package/types/components/layout-aside.d.ts +123 -123
  520. package/types/components/layout-body.d.ts +110 -113
  521. package/types/components/layout-container.d.ts +73 -75
  522. package/types/components/layout-footer.d.ts +71 -73
  523. package/types/components/layout-header.d.ts +67 -69
  524. package/types/components/link.d.ts +107 -111
  525. package/types/components/list-design.d.ts +189 -190
  526. package/types/components/list-view.d.ts +193 -199
  527. package/types/components/list.d.ts +678 -715
  528. package/types/components/loading.d.ts +98 -103
  529. package/types/components/mention.d.ts +70 -77
  530. package/types/components/menu.d.ts +284 -295
  531. package/types/components/modal.d.ts +567 -584
  532. package/types/components/notice-bar.d.ts +102 -106
  533. package/types/components/number-input.d.ts +359 -365
  534. package/types/components/optgroup.d.ts +85 -88
  535. package/types/components/option.d.ts +94 -103
  536. package/types/components/pager.d.ts +330 -335
  537. package/types/components/password-input.d.ts +143 -156
  538. package/types/components/print-page-break.d.ts +65 -69
  539. package/types/components/print.d.ts +243 -245
  540. package/types/components/pulldown.d.ts +231 -239
  541. package/types/components/radio-button.d.ts +113 -118
  542. package/types/components/radio-group.d.ts +151 -153
  543. package/types/components/radio.d.ts +129 -134
  544. package/types/components/rate.d.ts +83 -88
  545. package/types/components/result.d.ts +81 -84
  546. package/types/components/row.d.ts +77 -81
  547. package/types/components/scrollbar.d.ts +299 -305
  548. package/types/components/segmented.d.ts +119 -123
  549. package/types/components/select.d.ts +598 -616
  550. package/types/components/slider.d.ts +137 -151
  551. package/types/components/space.d.ts +120 -127
  552. package/types/components/split-pane.d.ts +126 -133
  553. package/types/components/split.d.ts +301 -312
  554. package/types/components/splitter-panel.d.ts +123 -130
  555. package/types/components/splitter.d.ts +290 -301
  556. package/types/components/steps.d.ts +63 -68
  557. package/types/components/switch.d.ts +127 -133
  558. package/types/components/tab-pane.d.ts +111 -114
  559. package/types/components/table-module/custom.d.ts +123 -123
  560. package/types/components/table-module/edit.d.ts +297 -276
  561. package/types/components/table-module/export.d.ts +88 -96
  562. package/types/components/table-module/filter.d.ts +144 -144
  563. package/types/components/table-module/index.d.ts +7 -7
  564. package/types/components/table-module/keyboard.d.ts +26 -26
  565. package/types/components/table-module/menu.d.ts +46 -46
  566. package/types/components/table-module/validator.d.ts +53 -53
  567. package/types/components/table-plugins/extend-cell-area.d.ts +781 -781
  568. package/types/components/table-plugins/extend-pivot-table.d.ts +59 -58
  569. package/types/components/table-plugins/filters-combination.d.ts +15 -15
  570. package/types/components/table-plugins/filters-complex-input.d.ts +9 -9
  571. package/types/components/table-plugins/index.d.ts +4 -4
  572. package/types/components/table-select.d.ts +268 -276
  573. package/types/components/table-transfer.d.ts +80 -84
  574. package/types/components/table.d.ts +7530 -8000
  575. package/types/components/tabs.d.ts +314 -352
  576. package/types/components/tag.d.ts +108 -114
  577. package/types/components/text-ellipsis.d.ts +107 -112
  578. package/types/components/text.d.ts +112 -122
  579. package/types/components/textarea.d.ts +261 -275
  580. package/types/components/timeline-item.d.ts +66 -75
  581. package/types/components/timeline.d.ts +70 -77
  582. package/types/components/tip.d.ts +81 -83
  583. package/types/components/toolbar.d.ts +327 -336
  584. package/types/components/tooltip.d.ts +250 -255
  585. package/types/components/tour.d.ts +70 -77
  586. package/types/components/transfer.d.ts +80 -84
  587. package/types/components/tree-select.d.ts +361 -376
  588. package/types/components/tree.d.ts +994 -1036
  589. package/types/components/upload.d.ts +477 -518
  590. package/types/components/watermark.d.ts +116 -120
  591. package/types/handles/form-design.d.ts +50 -50
  592. package/types/handles/index.d.ts +3 -3
  593. package/types/handles/list-design.d.ts +1 -2
  594. package/types/handles/table.d.ts +15 -15
  595. package/types/index.d.ts +8 -8
  596. package/types/ui/commands.d.ts +57 -57
  597. package/types/ui/formats.d.ts +62 -62
  598. package/types/ui/global-config.d.ts +269 -269
  599. package/types/ui/global-icon.d.ts +315 -315
  600. package/types/ui/hooks.d.ts +13 -13
  601. package/types/ui/index.d.ts +100 -100
  602. package/types/ui/interceptor.d.ts +52 -52
  603. package/types/ui/menus.d.ts +89 -89
  604. package/types/ui/renderer.d.ts +1033 -1047
  605. package/types/ui/validators.d.ts +37 -38
  606. /package/dist/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  607. /package/dist/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  608. /package/dist/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  609. /package/es/icon/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  610. /package/es/icon/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  611. /package/es/icon/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  612. /package/es/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  613. /package/es/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  614. /package/es/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  615. /package/es/vxe-icon/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  616. /package/es/vxe-icon/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  617. /package/es/vxe-icon/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  618. /package/lib/icon/style/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  619. /package/lib/icon/style/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  620. /package/lib/icon/style/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  621. /package/lib/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  622. /package/lib/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  623. /package/lib/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
  624. /package/lib/vxe-icon/style/{iconfont.1792992046297.ttf → iconfont.1793007755017.ttf} +0 -0
  625. /package/lib/vxe-icon/style/{iconfont.1792992046297.woff → iconfont.1793007755017.woff} +0 -0
  626. /package/lib/vxe-icon/style/{iconfont.1792992046297.woff2 → iconfont.1793007755017.woff2} +0 -0
@@ -1,999 +1,1103 @@
1
- import { ref, h, PropType, computed, inject, watch, provide, nextTick, Teleport, onMounted, onUnmounted, reactive } from 'vue'
2
- import { defineVxeComponent } from '../../ui/src/comp'
3
- import XEUtils from 'xe-utils'
4
- import { VxeUI } from '../../ui'
5
- import { getEventTargetNode, updatePanelPlacement, toCssUnit, getPopupContainer } from '../../ui/src/dom'
6
- import { getOnName } from '../../ui/src/vn'
7
- import { getLastZIndex, nextZIndex } from '../../ui/src/utils'
8
- import { createComponentLog } from '../../ui/src/log'
9
- import VxeInputComponent from '../../input/src/input'
10
-
11
- import type { TableSelectReactData, VxeTableSelectEmits, VxeInputConstructor, TableSelectInternalData, VxeTableSelectPropTypes, VxeFormDefines, VxeModalConstructor, VxeModalMethods, VxeDrawerConstructor, VxeDrawerMethods, TableSelectMethods, TableSelectPrivateMethods, ValueOf, TableSelectPrivateRef, VxeTableSelectPrivateComputed, VxeTableSelectConstructor, VxeTableSelectPrivateMethods, VxeFormConstructor, VxeFormPrivateMethods, VxeComponentStyleType } from '../../../types'
12
- import type { VxeTableConstructor, VxeTablePrivateMethods, VxeTablePropTypes } from '../../../types/components/table'
13
- import type { VxeGridInstance, VxeGridEvents, VxeGridPropTypes } from '../../../types/components/grid'
14
-
15
- const { getConfig, getIcon, globalEvents, getI18n, createEvent, useFns, renderEmptyElement } = VxeUI
16
-
17
- const { errLog } = createComponentLog('table-select')
18
-
19
- export function getRowUniqueId () {
20
- return XEUtils.uniqueId('row_')
21
- }
22
-
23
- function createReactData (): TableSelectReactData {
24
- return {
25
- initialized: false,
26
- searchValue: '',
27
- searchLoading: false,
28
- tableData: [],
29
- tableColumns: [],
30
- panelIndex: 0,
31
- panelStyle: {},
32
- panelPlacement: null,
33
- triggerFocusPanel: false,
34
- visiblePanel: false,
35
- isAniVisible: false,
36
- isActivated: false
37
- }
38
- }
39
-
40
- function createInternalData (): TableSelectInternalData {
41
- return {
42
- // hpTimeout: undefined,
43
- // vpTimeout: undefined,
44
- fullData: [],
45
- afterVisibleList: [],
46
- fullValMaps: {}
47
- }
48
- }
49
-
50
- export default defineVxeComponent({
51
- name: 'VxeTableSelect',
52
- props: {
53
- modelValue: [String, Number, Array] as PropType<VxeTableSelectPropTypes.ModelValue>,
54
- clearable: {
55
- type: Boolean as PropType<VxeTableSelectPropTypes.Clearable>,
56
- default: () => getConfig().tableSelect.clearable
57
- },
58
- placeholder: {
59
- type: String as PropType<VxeTableSelectPropTypes.Placeholder>,
60
- default: () => XEUtils.eqNull(getConfig().tableSelect.placeholder) ? getI18n('vxe.base.pleaseSelect') : getConfig().tableSelect.placeholder
61
- },
62
- readonly: {
63
- type: Boolean as PropType<VxeTableSelectPropTypes.Readonly>,
64
- default: null
65
- },
66
- loading: Boolean as PropType<VxeTableSelectPropTypes.Loading>,
67
- disabled: {
68
- type: Boolean as PropType<VxeTableSelectPropTypes.Disabled>,
69
- default: null
70
- },
71
- multiple: Boolean as PropType<VxeTableSelectPropTypes.Multiple>,
72
- className: [String, Function] as PropType<VxeTableSelectPropTypes.ClassName>,
73
- prefixIcon: String as PropType<VxeTableSelectPropTypes.PrefixIcon>,
74
- placement: String as PropType<VxeTableSelectPropTypes.Placement>,
75
- columns: Array as PropType<VxeTableSelectPropTypes.Columns>,
76
- options: Array as PropType<VxeTableSelectPropTypes.Options>,
77
- optionProps: Object as PropType<VxeTableSelectPropTypes.OptionProps>,
78
- lazyOptions: Array as PropType<VxeTableSelectPropTypes.LazyOptions>,
79
- filterable: {
80
- type: Boolean as PropType<VxeTableSelectPropTypes.Filterable>,
81
- default: () => getConfig().tableSelect.filterable
82
- },
83
- filterConfig: Object as PropType<VxeTableSelectPropTypes.FilterConfig>,
84
- remote: Boolean as PropType<VxeTableSelectPropTypes.Remote>,
85
- remoteConfig: Object as PropType<VxeTableSelectPropTypes.RemoteConfig>,
86
- /**
87
- * 已废弃,请使用 popupConfig.zIndex
88
- * @deprecated
89
- */
90
- zIndex: Number as PropType<VxeTableSelectPropTypes.ZIndex>,
91
- size: {
92
- type: String as PropType<VxeTableSelectPropTypes.Size>,
93
- default: () => getConfig().tableSelect.size || getConfig().size
94
- },
95
- popupConfig: Object as PropType<VxeTableSelectPropTypes.PopupConfig>,
96
- gridConfig: Object as PropType<VxeTableSelectPropTypes.GridConfig>,
97
- transfer: {
98
- type: Boolean as PropType<VxeTableSelectPropTypes.Transfer>,
99
- default: null
100
- }
101
- },
102
- emits: [
103
- 'update:modelValue',
104
- 'change',
105
- 'clear',
106
- 'blur',
107
- 'focus',
108
- 'click',
109
-
110
- 'form-submit',
111
- 'form-reset',
112
- 'form-collapse',
113
- 'page-change'
114
- ] as VxeTableSelectEmits,
115
- setup (props, context) {
116
- const { emit, slots } = context
117
-
118
- const VxeTableGridComponent = VxeUI.getComponent('vxe-grid')
119
-
120
- const $xeModal = inject<(VxeModalConstructor & VxeModalMethods)| null>('$xeModal', null)
121
- const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
122
- const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
123
- const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods) | null>('$xeForm', null)
124
- const formItemInfo = inject<VxeFormDefines.ProvideItemInfo | null>('xeFormItemInfo', null)
125
-
126
- const xID = XEUtils.uniqueId()
127
-
128
- const { computeSize } = useFns.useSize(props)
129
-
130
- const refElem = ref<HTMLDivElement>()
131
- const refInput = ref<VxeInputConstructor>()
132
- const refGridWrapper = ref<HTMLDivElement>()
133
- const refOptionPanel = ref<HTMLDivElement>()
134
- const refInpSearch = ref<VxeInputConstructor>()
135
- const refGrid = ref<VxeGridInstance>()
136
-
137
- const reactData = reactive(createReactData())
138
-
139
- const internalData = createInternalData()
140
-
141
- const refMaps: TableSelectPrivateRef = {
142
- refElem
143
- }
144
-
145
- const computeFormReadonly = computed(() => {
146
- const { readonly } = props
147
- if (readonly === null) {
148
- if ($xeForm) {
149
- return $xeForm.props.readonly
150
- }
151
- return false
152
- }
153
- return readonly
154
- })
155
-
156
- const computeIsDisabled = computed(() => {
157
- const { disabled } = props
158
- if (disabled === null) {
159
- if ($xeForm) {
160
- return $xeForm.props.disabled
161
- }
162
- return false
163
- }
164
- return disabled
165
- })
166
-
167
- const computeBtnTransfer = computed(() => {
168
- const { transfer } = props
169
- const popupOpts = computePopupOpts.value
170
- if (XEUtils.isBoolean(popupOpts.transfer)) {
171
- return popupOpts.transfer
172
- }
173
- if (transfer === null) {
174
- const globalTransfer = getConfig().tableSelect.transfer
175
- if (XEUtils.isBoolean(globalTransfer)) {
176
- return globalTransfer
177
- }
178
- if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
179
- return true
180
- }
181
- }
182
- return transfer
183
- })
184
-
185
- const computePropsOpts = computed(() => {
186
- return props.optionProps || {}
187
- })
188
-
189
- const computeCheckboxOpts = computed(() => {
190
- const { multiple } = props
191
- const gridOpts = computeGridOpts.value
192
- return Object.assign({
193
- reserve: multiple,
194
- showReserveStatus: multiple
195
- }, getConfig().table.checkboxConfig, gridOpts.checkboxConfig)
196
- })
197
-
198
- const computeRowOpts = computed<VxeTablePropTypes.RowConfig>(() => {
199
- const { multiple } = props
200
- const gridOpts = computeGridOpts.value
201
- const valueField = computeValueField.value
202
- return Object.assign({
203
- isCurrent: true
204
- }, multiple ? { keyField: valueField } : {}, getConfig().table.rowConfig, gridOpts.rowConfig)
205
- })
206
-
207
- const computeRowKeyField = computed(() => {
208
- const rowOpts = computeRowOpts.value
209
- return rowOpts.keyField || '_X_ROW_KEY'
210
- })
211
-
212
- const computeLabelField = computed(() => {
213
- const propsOpts = computePropsOpts.value
214
- return propsOpts.label || 'label'
215
- })
216
-
217
- const computeValueField = computed(() => {
218
- const propsOpts = computePropsOpts.value
219
- return propsOpts.value || 'value'
220
- })
221
-
222
- const computePopupOpts = computed(() => {
223
- return Object.assign({}, getConfig().tableSelect.popupConfig, props.popupConfig)
224
- })
225
-
226
- const computeGridOpts = computed(() => {
227
- return Object.assign({}, getConfig().tableSelect.gridConfig, props.gridConfig, {
228
- data: undefined
229
- })
230
- })
231
-
232
- const computeRemoteOpts = computed(() => {
233
- return Object.assign({}, getConfig().tableSelect.remoteConfig, props.remoteConfig)
234
- })
235
-
236
- const computeFilterOpts = computed(() => {
237
- return Object.assign({}, getConfig().tableSelect.filterConfig, props.filterConfig)
238
- })
239
-
240
- const computeSelectGridOpts = computed(() => {
241
- const gridOpts = computeGridOpts.value
242
- const checkboxOpts = computeCheckboxOpts.value
243
- const { pagerConfig, proxyConfig } = gridOpts
244
- if (proxyConfig) {
245
- const proxyAjax = proxyConfig.ajax
246
- if (proxyAjax && proxyAjax.query) {
247
- const newProxyConfig = XEUtils.clone(proxyConfig, true) as Required<VxeGridPropTypes.ProxyConfig>
248
- const ajaxMethods = proxyAjax.query
249
- if (ajaxMethods) {
250
- const resConfigs = proxyConfig.response || proxyConfig.props || {}
251
- Object.assign(newProxyConfig.ajax, {
252
- query (params: VxeGridPropTypes.ProxyAjaxQueryParams, ...args: any[]) {
253
- return Promise.resolve(ajaxMethods(params, ...args)).then(rest => {
254
- let currData = []
255
- if (pagerConfig) {
256
- const resultProp = resConfigs.result
257
- currData = (XEUtils.isFunction(resultProp) ? resultProp({ data: rest, $table: null as any, $grid: null, $gantt: null }) : XEUtils.get(rest, resultProp || 'result')) || []
258
- } else {
259
- const listProp = resConfigs.list
260
- currData = (listProp ? (XEUtils.isFunction(listProp) ? listProp({ data: rest, $table: null as any, $grid: null, $gantt: null }) : XEUtils.get(rest, listProp)) : rest) || []
261
- }
262
- cacheDataMap(currData || [])
263
- return rest
264
- })
265
- }
266
- })
267
- }
268
- return Object.assign({}, gridOpts, { checkboxConfig: checkboxOpts, proxyConfig: newProxyConfig })
269
- }
270
- }
271
- return Object.assign({}, gridOpts, { checkboxConfig: checkboxOpts })
272
- })
273
-
274
- const computeSelectLabel = computed(() => {
275
- const { modelValue, lazyOptions } = props
276
- const { fullValMaps, fullData } = internalData
277
- const valueField = computeValueField.value
278
- const labelField = computeLabelField.value
279
- if (!fullData) {
280
- return ''
281
- }
282
- return (XEUtils.isArray(modelValue) ? modelValue : [modelValue]).map(val => {
283
- const cacheItem = fullValMaps[val]
284
- if (cacheItem) {
285
- return cacheItem.item[labelField]
286
- }
287
- if (lazyOptions) {
288
- const lazyItem = lazyOptions.find(item => item[valueField] === val)
289
- if (lazyItem) {
290
- return lazyItem[labelField]
291
- }
292
- }
293
- return val
294
- }).join(', ')
295
- })
296
-
297
- const computePopupWrapperStyle = computed(() => {
298
- const popupOpts = computePopupOpts.value
299
- const { height, width } = popupOpts
300
- const stys: VxeComponentStyleType = {}
301
- if (width) {
302
- stys.width = toCssUnit(width)
303
- }
304
- if (height) {
305
- stys.height = toCssUnit(height)
306
- }
307
- return stys
308
- })
309
-
310
- const computeMaps: VxeTableSelectPrivateComputed = {
311
- }
312
-
313
- const $xeTableSelect = {
314
- xID,
315
- props,
316
- context,
317
- reactData,
318
-
319
- getRefMaps: () => refMaps,
320
- getComputeMaps: () => computeMaps
321
- } as unknown as VxeTableSelectConstructor & VxeTableSelectPrivateMethods
322
-
323
- const gridEventKeys: ValueOf<VxeTableSelectEmits>[] = [
324
- 'form-submit',
325
- 'form-reset',
326
- 'form-collapse',
327
- 'page-change'
328
- ]
329
- const gridEvents: Record<string, any> = {}
330
- gridEventKeys.forEach(name => {
331
- gridEvents[getOnName(XEUtils.camelCase(name))] = (params: any) => {
332
- dispatchEvent(name, params, params.$event)
333
- }
334
- })
335
-
336
- const dispatchEvent = (type: ValueOf<VxeTableSelectEmits>, params: Record<string, any>, evnt: Event | null) => {
337
- emit(type, createEvent(evnt, { $tableSelect: $xeTableSelect }, params))
338
- }
339
-
340
- const emitModel = (value: any) => {
341
- emit('update:modelValue', value)
342
- }
343
-
344
- const tableSelectMethods: TableSelectMethods = {
345
- dispatchEvent
346
- }
347
-
348
- const tableSelectPrivateMethods: TableSelectPrivateMethods = {
349
- }
350
-
351
- const getRowid = (option: any) => {
352
- const rowKeyField = computeRowKeyField.value
353
- const rowid = option[rowKeyField]
354
- return rowid ? encodeURIComponent(rowid) : ''
355
- }
356
-
357
- const getRowsByValue = (modelValue: VxeTableSelectPropTypes.ModelValue) => {
358
- const { fullValMaps } = internalData
359
- const checkboxOpts = computeCheckboxOpts.value
360
- const rowKeyField = computeRowKeyField.value
361
- const valueField = computeValueField.value
362
- const labelField = computeLabelField.value
363
- const rows: any[] = []
364
- const vals = XEUtils.eqNull(modelValue) ? [] : (XEUtils.isArray(modelValue) ? modelValue : [modelValue])
365
- if (checkboxOpts.reserve) {
366
- vals.forEach(val => {
367
- const cacheItem = fullValMaps[val]
368
- rows.push(cacheItem
369
- ? cacheItem.item
370
- : {
371
- [rowKeyField]: val,
372
- [valueField]: val,
373
- [labelField]: val
374
- })
375
- })
376
- } else {
377
- vals.forEach(val => {
378
- const cacheItem = fullValMaps[val]
379
- if (cacheItem) {
380
- rows.push(cacheItem.item)
381
- }
382
- })
383
- }
384
- return rows
385
- }
386
-
387
- const updateModel = (modelValue: VxeTableSelectPropTypes.ModelValue) => {
388
- const { multiple } = props
389
- nextTick(() => {
390
- const $grid = refGrid.value
391
- if ($grid) {
392
- const selectList = getRowsByValue(modelValue)
393
- if (selectList.length) {
394
- if (multiple) {
395
- $grid.setCheckboxRow(selectList, true)
396
- } else {
397
- $grid.setRadioRow(selectList[0])
398
- }
399
- }
400
- }
401
- })
402
- }
403
-
404
- const loadData = (data: any[]) => {
405
- cacheDataMap(data)
406
- handleData()
407
- }
408
-
409
- const loadColumn = (columns?: VxeTableSelectPropTypes.Columns) => {
410
- if (!columns || !columns.length) {
411
- return
412
- }
413
- const { multiple } = props
414
- const tableCols: VxeTableSelectPropTypes.Columns = []
415
- let hasRadioCol = false
416
- let hasCheckboxCol = false
417
- columns.forEach(column => {
418
- if (!hasRadioCol && column.type === 'radio') {
419
- hasRadioCol = true
420
- } else if (!hasCheckboxCol && column.type === 'checkbox') {
421
- hasCheckboxCol = true
422
- }
423
- tableCols.push(column)
424
- })
425
- if (multiple) {
426
- if (!hasCheckboxCol) {
427
- tableCols.unshift({
428
- type: 'checkbox',
429
- width: 70
430
- })
431
- }
432
- } else {
433
- if (!hasRadioCol) {
434
- tableCols.unshift({
435
- type: 'radio',
436
- width: 70
437
- })
438
- }
439
- }
440
- reactData.tableColumns = tableCols
441
- }
442
-
443
- const cacheDataMap = (dataList: any[]) => {
444
- const { options } = props
445
- const rowKeyField = computeRowKeyField.value
446
- const valueField = computeValueField.value
447
- const gridOpts = computeGridOpts.value
448
- const { treeConfig, pagerConfig } = gridOpts
449
- const rowMaps: Record<string, {
450
- item: any
451
- index: number
452
- _index: number
453
- items: any[]
454
- parent: any
455
- nodes: any[]
456
- }> = {}
457
- const keyMaps: Record<string, boolean> = {}
458
- if (treeConfig) {
459
- // 暂不支持
460
- } else {
461
- XEUtils.arrayEach(dataList || options || [], (item, index, items) => {
462
- let rowid = getRowid(item)
463
- if (!rowid) {
464
- rowid = getRowUniqueId()
465
- }
466
- if (keyMaps[rowid]) {
467
- errLog('vxe.error.repeatKey', [rowKeyField, rowid])
468
- }
469
- keyMaps[rowid] = true
470
- const value = item[valueField]
471
- if (rowMaps[value]) {
472
- errLog('vxe.error.repeatKey', [valueField, value])
473
- }
474
- rowMaps[value] = { item, index, _index: index, items, parent: null, nodes: [] }
475
- })
476
- }
477
- internalData.fullData = dataList || options || []
478
- internalData.fullValMaps = pagerConfig ? Object.assign({}, internalData.fullValMaps, rowMaps) : rowMaps
479
- handleOptList()
480
- updateModel(props.modelValue)
481
- }
482
-
483
- const handleOptList = () => {
484
- const { remote, modelValue, filterable } = props
485
- const { searchValue } = reactData
486
- const { fullData, fullValMaps } = internalData
487
- const valueField = computeValueField.value
488
- const labelField = computeLabelField.value
489
- const filterOpts = computeFilterOpts.value
490
- const frMethod = filterOpts.filterMethod
491
- const searchStr = `${searchValue || ''}`.toLowerCase()
492
- let avList: any[] = []
493
- if (remote) {
494
- avList = fullData
495
- } else {
496
- if (filterable && frMethod) {
497
- avList = searchStr
498
- ? fullData.filter(row => frMethod({
499
- $tableSelect: $xeTableSelect,
500
- row,
501
- filterValue: searchValue,
502
- value: modelValue
503
- }))
504
- : fullData
505
- } else if (filterable) {
506
- avList = searchStr ? fullData.filter(row => (`${row[labelField] || row[valueField]}`.toLowerCase().indexOf(searchStr) > -1)) : fullData
507
- } else {
508
- avList = fullData
509
- }
510
- }
511
- avList.forEach((item, index) => {
512
- const cacheItem = fullValMaps[item[valueField]]
513
- if (cacheItem) {
514
- cacheItem._index = index
515
- }
516
- })
517
- internalData.afterVisibleList = avList
518
- return nextTick()
519
- }
520
-
521
- const updateZindex = () => {
522
- const popupOpts = computePopupOpts.value
523
- const customZIndex = popupOpts.zIndex || props.zIndex
524
- if (customZIndex) {
525
- reactData.panelIndex = XEUtils.toNumber(customZIndex)
526
- } else if (reactData.panelIndex < getLastZIndex()) {
527
- reactData.panelIndex = nextZIndex()
528
- }
529
- }
530
-
531
- const updatePlacement = () => {
532
- const { placement } = props
533
- const { panelIndex } = reactData
534
- const targetElem = refElem.value
535
- const panelElem = refOptionPanel.value
536
- const btnTransfer = computeBtnTransfer.value
537
- const popupOpts = computePopupOpts.value
538
- const handleStyle = () => {
539
- const ppObj = updatePanelPlacement(targetElem, panelElem, {
540
- placement: popupOpts.placement || placement,
541
- defaultPlacement: popupOpts.defaultPlacement,
542
- appendTo: popupOpts.appendTo,
543
- teleportTo: btnTransfer
544
- })
545
- const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
546
- zIndex: panelIndex
547
- })
548
- reactData.panelStyle = panelStyle
549
- reactData.panelPlacement = ppObj.placement
550
- }
551
- handleStyle()
552
- return nextTick().then(handleStyle)
553
- }
554
-
555
- const showOptionPanel = () => {
556
- const { loading, remote, filterable } = props
557
- const { fullData } = internalData
558
- const isDisabled = computeIsDisabled.value
559
- const remoteOpts = computeRemoteOpts.value
560
- if (!loading && !isDisabled) {
561
- if (internalData.vpTimeout) {
562
- clearTimeout(internalData.vpTimeout)
563
- }
564
- if (internalData.hpTimeout) {
565
- clearTimeout(internalData.hpTimeout)
566
- }
567
- if (!reactData.initialized) {
568
- reactData.initialized = true
569
- }
570
- if (filterable) {
571
- if (remote && remoteOpts.enabled && remoteOpts.autoLoad && !fullData.length) {
572
- handleSearchEvent()
573
- }
574
- }
575
- reactData.isActivated = true
576
- reactData.isAniVisible = true
577
- internalData.vpTimeout = setTimeout(() => {
578
- reactData.visiblePanel = true
579
- updateModel(props.modelValue)
580
- internalData.vpTimeout = undefined
581
- handleFocusSearch()
582
- updatePlacement()
583
- }, 10)
584
- updateZindex()
585
- updatePlacement()
586
- }
587
- }
588
-
589
- const hideOptionPanel = () => {
590
- const { filterable } = props
591
- const filterOpts = computeFilterOpts.value
592
- reactData.visiblePanel = false
593
- if (filterable) {
594
- if (filterOpts.clearOnClose) {
595
- reactData.searchValue = ''
596
- }
597
- }
598
- if (internalData.vpTimeout) {
599
- clearTimeout(internalData.vpTimeout)
600
- }
601
- if (internalData.hpTimeout) {
602
- clearTimeout(internalData.hpTimeout)
603
- }
604
- internalData.hpTimeout = setTimeout(() => {
605
- reactData.isAniVisible = false
606
- internalData.hpTimeout = undefined
607
- }, 350)
608
- }
609
-
610
- const handleData = () => {
611
- const { afterVisibleList } = internalData
612
- reactData.tableData = afterVisibleList
613
- return nextTick()
614
- }
615
-
616
- const modelSearchEvent = (value: string) => {
617
- reactData.searchValue = value
618
- }
619
-
620
- const focusSearchEvent = () => {
621
- reactData.isActivated = true
622
- }
623
-
624
- const handleSearchEvent = () => {
625
- const { modelValue, remote } = props
626
- const { searchValue } = reactData
627
- const remoteOpts = computeRemoteOpts.value
628
- const queryMethod = remoteOpts.queryMethod
629
- if (remote && queryMethod && remoteOpts.enabled) {
630
- reactData.searchLoading = true
631
- Promise.resolve(
632
- queryMethod({ $tableSelect: $xeTableSelect, searchValue, value: modelValue })
633
- ).then(() => nextTick())
634
- .catch(() => nextTick())
635
- .finally(() => {
636
- reactData.searchLoading = false
637
- })
638
- } else {
639
- handleOptList()
640
- handleData()
641
- }
642
- }
643
-
644
- const triggerSearchEvent = XEUtils.debounce(handleSearchEvent, 350, { trailing: true })
645
-
646
- const changeEvent = (evnt: Event, selectValue: any, row: any) => {
647
- emitModel(selectValue)
648
- if (selectValue !== props.modelValue) {
649
- dispatchEvent('change', { value: selectValue, row, option: row }, evnt)
650
- // 自动更新校验状态
651
- if ($xeForm && formItemInfo) {
652
- $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, selectValue)
653
- }
654
- }
655
- }
656
-
657
- const clearValueEvent = (evnt: Event, selectValue: any) => {
658
- changeEvent(evnt, selectValue, null)
659
- dispatchEvent('clear', { value: selectValue }, evnt)
660
- }
661
-
662
- const clearEvent = (params: any, evnt: Event) => {
663
- const $grid = refGrid.value
664
- if ($grid) {
665
- $grid.clearRadioRow()
666
- $grid.clearCheckboxRow()
667
- }
668
- clearValueEvent(evnt, null)
669
- hideOptionPanel()
670
- }
671
-
672
- const handleGlobalMousedownEvent = (evnt: MouseEvent) => {
673
- const { visiblePanel } = reactData
674
- const isDisabled = computeIsDisabled.value
675
- if (!isDisabled) {
676
- const el = refElem.value
677
- const panelElem = refOptionPanel.value
678
- reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelElem).flag
679
- if (visiblePanel && !reactData.isActivated) {
680
- hideOptionPanel()
681
- }
682
- }
683
- }
684
-
685
- const handleGlobalBlurEvent = () => {
686
- const { visiblePanel, isActivated } = reactData
687
- if (visiblePanel) {
688
- hideOptionPanel()
689
- }
690
- if (isActivated) {
691
- reactData.isActivated = false
692
- }
693
- if (visiblePanel || isActivated) {
694
- const $input = refInput.value
695
- if ($input) {
696
- $input.blur()
697
- }
698
- }
699
- }
700
-
701
- const handleGlobalResizeEvent = () => {
702
- const { visiblePanel } = reactData
703
- if (visiblePanel) {
704
- updatePlacement()
705
- }
706
- }
707
-
708
- const handleGlobalScrollEvent = () => {
709
- const { visiblePanel } = reactData
710
- if (visiblePanel) {
711
- updatePlacement()
712
- }
713
- }
714
-
715
- const handleFocusSearch = () => {
716
- if (props.filterable) {
717
- nextTick(() => {
718
- const inpSearch = refInpSearch.value
719
- if (inpSearch) {
720
- inpSearch.focus()
721
- }
722
- })
723
- }
724
- }
725
-
726
- const focusEvent = (evnt: FocusEvent) => {
727
- const isDisabled = computeIsDisabled.value
728
- if (!isDisabled) {
729
- if (!reactData.visiblePanel) {
730
- reactData.triggerFocusPanel = true
731
- showOptionPanel()
732
- setTimeout(() => {
733
- reactData.triggerFocusPanel = false
734
- }, 150)
735
- }
736
- }
737
- dispatchEvent('focus', {}, evnt)
738
- }
739
-
740
- const clickEvent = (evnt: MouseEvent) => {
741
- togglePanelEvent(evnt)
742
- dispatchEvent('click', {}, evnt)
743
- }
744
-
745
- const blurEvent = (evnt: FocusEvent) => {
746
- reactData.isActivated = false
747
- dispatchEvent('blur', {}, evnt)
748
- }
749
-
750
- const togglePanelEvent = (params: any) => {
751
- const { $event } = params
752
- $event.preventDefault()
753
- if (reactData.triggerFocusPanel) {
754
- reactData.triggerFocusPanel = false
755
- } else {
756
- if (reactData.visiblePanel) {
757
- hideOptionPanel()
758
- } else {
759
- showOptionPanel()
760
- }
761
- }
762
- }
763
-
764
- const radioChangeEvent: VxeGridEvents.RadioChange = (params) => {
765
- const { $event, row } = params
766
- const valueField = computeValueField.value
767
- const value = row[valueField]
768
- changeEvent($event, value, row)
769
- hideOptionPanel()
770
- }
771
-
772
- const checkboxChangeEvent: VxeGridEvents.CheckboxChange = (params) => {
773
- const { $grid, $event, row } = params
774
- const checkboxOpts = computeCheckboxOpts.value
775
- const valueField = computeValueField.value
776
- if ($grid) {
777
- const checkboxRecords = $grid.getCheckboxRecords()
778
- if (checkboxOpts.reserve) {
779
- checkboxRecords.push(...$grid.getCheckboxReserveRecords())
780
- }
781
- const value = checkboxRecords.map(row => {
782
- return row[valueField]
783
- })
784
- changeEvent($event, value, row)
785
- }
786
- }
787
-
788
- const checkboxAllEvent: VxeGridEvents.CheckboxAll = (params) => {
789
- checkboxChangeEvent(params)
790
- }
791
-
792
- Object.assign($xeTableSelect, tableSelectMethods, tableSelectPrivateMethods)
793
-
794
- const renderVN = () => {
795
- const { className, loading, filterable, remote } = props
796
- const { initialized, isActivated, isAniVisible, visiblePanel, tableColumns, searchValue, tableData, searchLoading } = reactData
797
- const vSize = computeSize.value
798
- const isDisabled = computeIsDisabled.value
799
- const selectLabel = computeSelectLabel.value
800
- const btnTransfer = computeBtnTransfer.value
801
- const formReadonly = computeFormReadonly.value
802
- const popupOpts = computePopupOpts.value
803
- const selectGridOpts = computeSelectGridOpts.value
804
- const rowOpts = computeRowOpts.value
805
- const filterOpts = computeFilterOpts.value
806
- const popupWrapperStyle = computePopupWrapperStyle.value
807
- const { appendTo } = popupOpts
808
- const headerSlot = slots.header
809
- const footerSlot = slots.footer
810
- const prefixSlot = slots.prefix
811
- const ppClassName = popupOpts.className
812
-
813
- if (formReadonly) {
814
- return h('div', {
815
- ref: refElem,
816
- class: ['vxe-table-select--readonly', className]
817
- }, [
818
- h('span', {
819
- class: 'vxe-table-select-label'
820
- }, selectLabel)
821
- ])
822
- }
823
- return h('div', {
824
- ref: refElem,
825
- class: ['vxe-table-select', className ? (XEUtils.isFunction(className) ? className({ $tableSelect: $xeTableSelect }) : className) : '', {
826
- [`size--${vSize}`]: vSize,
827
- 'is--filterable': filterable,
828
- 'is--visible': visiblePanel,
829
- 'is--disabled': isDisabled,
830
- 'is--loading': loading,
831
- 'is--active': isActivated
832
- }]
833
- }, [
834
- h(VxeInputComponent, {
835
- ref: refInput,
836
- clearable: props.clearable,
837
- placeholder: loading ? getI18n('vxe.select.loadingText') : props.placeholder,
838
- editable: false,
839
- disabled: isDisabled,
840
- type: 'text',
841
- prefixIcon: props.prefixIcon,
842
- suffixIcon: loading ? getIcon().TABLE_SELECT_LOADED : (visiblePanel ? getIcon().TABLE_SELECT_OPEN : getIcon().TABLE_SELECT_CLOSE),
843
- modelValue: loading ? '' : selectLabel,
844
- onClear: clearEvent,
845
- onClick: clickEvent,
846
- onFocus: focusEvent,
847
- onBlur: blurEvent,
848
- onSuffixClick: togglePanelEvent
849
- }, prefixSlot
850
- ? {
851
- prefix: () => prefixSlot({})
852
- }
853
- : {}),
854
- h(Teleport, {
855
- to: getPopupContainer(appendTo),
856
- disabled: btnTransfer ? !initialized : true
857
- }, [
858
- h('div', {
859
- ref: refOptionPanel,
860
- class: ['vxe-table--ignore-clear vxe-table-select--panel', ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $tableSelect: $xeTableSelect }) : ppClassName) : '', {
861
- [`size--${vSize}`]: vSize,
862
- 'is--transfer': btnTransfer,
863
- 'ani--leave': !loading && isAniVisible,
864
- 'ani--enter': !loading && visiblePanel
865
- }],
866
- placement: reactData.panelPlacement,
867
- style: reactData.panelStyle
868
- }, initialized
869
- ? [
870
- h('div', {
871
- class: 'vxe-table-select--panel-wrapper'
872
- }, [
873
- filterable
874
- ? h('div', {
875
- class: 'vxe-table-select--panel-search'
876
- }, [
877
- h(VxeInputComponent, {
878
- ref: refInpSearch,
879
- class: 'vxe-table-select-search--input',
880
- modelValue: searchValue,
881
- clearable: true,
882
- disabled: false,
883
- readonly: false,
884
- placeholder: getI18n('vxe.treeSelect.search'),
885
- prefixIcon: getIcon().INPUT_SEARCH,
886
- 'onUpdate:modelValue': modelSearchEvent,
887
- onFocus: focusSearchEvent,
888
- onChange: triggerSearchEvent,
889
- onSearch: triggerSearchEvent
890
- })
891
- ])
892
- : renderEmptyElement($xeTableSelect),
893
- headerSlot
894
- ? h('div', {
895
- class: 'vxe-table-select--panel-header'
896
- }, headerSlot({}))
897
- : renderEmptyElement($xeTableSelect),
898
- h('div', {
899
- class: 'vxe-table-select--panel-body'
900
- }, [
901
- h('div', {
902
- ref: refGridWrapper,
903
- class: 'vxe-table-select-grid--wrapper',
904
- style: popupWrapperStyle
905
- }, [
906
- VxeTableGridComponent
907
- ? h(VxeTableGridComponent, {
908
- ...selectGridOpts,
909
- ...gridEvents,
910
- class: 'vxe-table-select--grid',
911
- ref: refGrid,
912
- loading: remote && searchLoading,
913
- rowConfig: rowOpts,
914
- data: tableData,
915
- columns: tableColumns.length ? tableColumns : selectGridOpts.columns,
916
- height: '100%',
917
- autoResize: true,
918
- onRadioChange: radioChangeEvent,
919
- onCheckboxChange: checkboxChangeEvent,
920
- onCheckboxAll: checkboxAllEvent
921
- }, Object.assign({}, slots, {
922
- header: undefined,
923
- footer: undefined,
924
- prefixSlot: undefined
925
- }))
926
- : renderEmptyElement($xeTableSelect)
927
- ])
928
- ]),
929
- footerSlot || (filterable && searchValue && !remote && filterOpts.showResultCount)
930
- ? h('div', {
931
- class: 'vxe-table-select--panel-footer'
932
- }, footerSlot
933
- ? footerSlot({})
934
- : [
935
- h('div', {
936
- class: 'vxe-table-select--search-count'
937
- }, searchLoading ? '' : getI18n('vxe.tableSelect.filterCount', [tableData.length]))
938
- ])
939
- : renderEmptyElement($xeTableSelect)
940
- ])
941
- ]
942
- : [])
943
- ])
944
- ])
945
- }
946
-
947
- watch(() => props.options, (val) => {
948
- loadData(val || [])
949
- })
950
-
951
- watch(() => props.columns, (val) => {
952
- loadColumn(val)
953
- })
954
-
955
- watch(() => props.modelValue, (val) => {
956
- updateModel(val)
957
- })
958
-
959
- loadColumn(props.columns)
960
- loadData(props.options || [])
961
-
962
- onMounted(() => {
963
- const { gridConfig } = props
964
- if (gridConfig && gridConfig.proxyConfig) {
965
- if (gridConfig.proxyConfig.autoLoad !== false) {
966
- reactData.initialized = true
967
- }
968
- }
969
- globalEvents.on($xeTableSelect, 'mousedown', handleGlobalMousedownEvent)
970
- globalEvents.on($xeTableSelect, 'blur', handleGlobalBlurEvent)
971
- globalEvents.on($xeTableSelect, 'resize', handleGlobalResizeEvent)
972
- globalEvents.on($xeTableSelect, 'scroll', handleGlobalScrollEvent)
973
- })
974
-
975
- onUnmounted(() => {
976
- globalEvents.off($xeTableSelect, 'mousedown')
977
- globalEvents.off($xeTableSelect, 'blur')
978
- globalEvents.off($xeTableSelect, 'resize')
979
- globalEvents.off($xeTableSelect, 'scroll')
980
- XEUtils.assign(reactData, createReactData())
981
- XEUtils.assign(internalData, createInternalData())
982
- })
983
-
984
- nextTick(() => {
985
- if (!VxeTableGridComponent) {
986
- errLog('vxe.error.reqComp', ['vxe-grid'])
987
- }
988
- })
989
-
990
- provide('$xeTableSelect', $xeTableSelect)
991
-
992
- $xeTableSelect.renderVN = renderVN
993
-
994
- return $xeTableSelect
995
- },
996
- render () {
997
- return this.renderVN()
998
- }
999
- })
1
+ import { ref, h, PropType, computed, inject, watch, provide, nextTick, Teleport, onMounted, onUnmounted, reactive } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import XEUtils from 'xe-utils'
4
+ import { VxeUI } from '@vxe-ui/core'
5
+ import { getEventTargetNode, updatePanelPlacement, toCssUnit, getPopupContainer } from '../../ui/src/dom'
6
+ import { getOnName } from '../../ui/src/vn'
7
+ import { getLastZIndex, nextZIndex } from '../../ui/src/utils'
8
+ import { createComponentLog } from '../../ui/src/log'
9
+ import VxeInputComponent from '../../input/src/input'
10
+
11
+ import type {
12
+ TableSelectReactData,
13
+ VxeTableSelectEmits,
14
+ VxeInputConstructor,
15
+ TableSelectInternalData,
16
+ VxeTableSelectPropTypes,
17
+ VxeFormDefines,
18
+ VxeModalConstructor,
19
+ VxeModalMethods,
20
+ VxeDrawerConstructor,
21
+ VxeDrawerMethods,
22
+ TableSelectMethods,
23
+ TableSelectPrivateMethods,
24
+ ValueOf,
25
+ TableSelectPrivateRef,
26
+ VxeTableSelectPrivateComputed,
27
+ VxeTableSelectConstructor,
28
+ VxeTableSelectPrivateMethods,
29
+ VxeFormConstructor,
30
+ VxeFormPrivateMethods,
31
+ VxeComponentStyleType
32
+ } from '../../../types'
33
+ import type { VxeTableConstructor, VxeTablePrivateMethods, VxeTablePropTypes } from '../../../types/components/table'
34
+ import type { VxeGridInstance, VxeGridEvents, VxeGridPropTypes } from '../../../types/components/grid'
35
+
36
+ const { getConfig, getIcon, globalEvents, getI18n, createEvent, useFns, renderEmptyElement } = VxeUI
37
+
38
+ const { errLog } = createComponentLog('table-select')
39
+
40
+ export function getRowUniqueId() {
41
+ return XEUtils.uniqueId('row_')
42
+ }
43
+
44
+ function createReactData(): TableSelectReactData {
45
+ return {
46
+ initialized: false,
47
+ searchValue: '',
48
+ searchLoading: false,
49
+ tableData: [],
50
+ tableColumns: [],
51
+ panelIndex: 0,
52
+ panelStyle: {},
53
+ panelPlacement: null,
54
+ triggerFocusPanel: false,
55
+ visiblePanel: false,
56
+ isAniVisible: false,
57
+ isActivated: false
58
+ }
59
+ }
60
+
61
+ function createInternalData(): TableSelectInternalData {
62
+ return {
63
+ // hpTimeout: undefined,
64
+ // vpTimeout: undefined,
65
+ fullData: [],
66
+ afterVisibleList: [],
67
+ fullValMaps: {}
68
+ }
69
+ }
70
+
71
+ export default defineVxeComponent({
72
+ name: 'VxeTableSelect',
73
+ props: {
74
+ modelValue: [String, Number, Array] as PropType<VxeTableSelectPropTypes.ModelValue>,
75
+ clearable: {
76
+ type: Boolean as PropType<VxeTableSelectPropTypes.Clearable>,
77
+ default: () => getConfig().tableSelect.clearable
78
+ },
79
+ placeholder: {
80
+ type: String as PropType<VxeTableSelectPropTypes.Placeholder>,
81
+ default: () => (XEUtils.eqNull(getConfig().tableSelect.placeholder) ? getI18n('vxe.base.pleaseSelect') : getConfig().tableSelect.placeholder)
82
+ },
83
+ readonly: {
84
+ type: Boolean as PropType<VxeTableSelectPropTypes.Readonly>,
85
+ default: null
86
+ },
87
+ loading: Boolean as PropType<VxeTableSelectPropTypes.Loading>,
88
+ disabled: {
89
+ type: Boolean as PropType<VxeTableSelectPropTypes.Disabled>,
90
+ default: null
91
+ },
92
+ multiple: Boolean as PropType<VxeTableSelectPropTypes.Multiple>,
93
+ className: [String, Function] as PropType<VxeTableSelectPropTypes.ClassName>,
94
+ prefixIcon: String as PropType<VxeTableSelectPropTypes.PrefixIcon>,
95
+ placement: String as PropType<VxeTableSelectPropTypes.Placement>,
96
+ columns: Array as PropType<VxeTableSelectPropTypes.Columns>,
97
+ options: Array as PropType<VxeTableSelectPropTypes.Options>,
98
+ optionProps: Object as PropType<VxeTableSelectPropTypes.OptionProps>,
99
+ lazyOptions: Array as PropType<VxeTableSelectPropTypes.LazyOptions>,
100
+ filterable: {
101
+ type: Boolean as PropType<VxeTableSelectPropTypes.Filterable>,
102
+ default: () => getConfig().tableSelect.filterable
103
+ },
104
+ filterConfig: Object as PropType<VxeTableSelectPropTypes.FilterConfig>,
105
+ remote: Boolean as PropType<VxeTableSelectPropTypes.Remote>,
106
+ remoteConfig: Object as PropType<VxeTableSelectPropTypes.RemoteConfig>,
107
+ /**
108
+ * 已废弃,请使用 popupConfig.zIndex
109
+ * @deprecated
110
+ */
111
+ zIndex: Number as PropType<VxeTableSelectPropTypes.ZIndex>,
112
+ size: {
113
+ type: String as PropType<VxeTableSelectPropTypes.Size>,
114
+ default: () => getConfig().tableSelect.size || getConfig().size
115
+ },
116
+ popupConfig: Object as PropType<VxeTableSelectPropTypes.PopupConfig>,
117
+ gridConfig: Object as PropType<VxeTableSelectPropTypes.GridConfig>,
118
+ transfer: {
119
+ type: Boolean as PropType<VxeTableSelectPropTypes.Transfer>,
120
+ default: null
121
+ }
122
+ },
123
+ emits: [
124
+ 'update:modelValue',
125
+ 'change',
126
+ 'clear',
127
+ 'blur',
128
+ 'focus',
129
+ 'click',
130
+
131
+ 'form-submit',
132
+ 'form-reset',
133
+ 'form-collapse',
134
+ 'page-change'
135
+ ] as VxeTableSelectEmits,
136
+ setup(props, context) {
137
+ const { emit, slots } = context
138
+
139
+ const VxeTableGridComponent = VxeUI.getComponent('vxe-grid')
140
+
141
+ const $xeModal = inject<(VxeModalConstructor & VxeModalMethods) | null>('$xeModal', null)
142
+ const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
143
+ const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
144
+ const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods) | null>('$xeForm', null)
145
+ const formItemInfo = inject<VxeFormDefines.ProvideItemInfo | null>('xeFormItemInfo', null)
146
+
147
+ const xID = XEUtils.uniqueId()
148
+
149
+ const { computeSize } = useFns.useSize(props)
150
+
151
+ const refElem = ref<HTMLDivElement>()
152
+ const refInput = ref<VxeInputConstructor>()
153
+ const refGridWrapper = ref<HTMLDivElement>()
154
+ const refOptionPanel = ref<HTMLDivElement>()
155
+ const refInpSearch = ref<VxeInputConstructor>()
156
+ const refGrid = ref<VxeGridInstance>()
157
+
158
+ const reactData = reactive(createReactData())
159
+
160
+ const internalData = createInternalData()
161
+
162
+ const refMaps: TableSelectPrivateRef = {
163
+ refElem
164
+ }
165
+
166
+ const computeFormReadonly = computed(() => {
167
+ const { readonly } = props
168
+ if (readonly === null) {
169
+ if ($xeForm) {
170
+ return $xeForm.props.readonly
171
+ }
172
+ return false
173
+ }
174
+ return readonly
175
+ })
176
+
177
+ const computeIsDisabled = computed(() => {
178
+ const { disabled } = props
179
+ if (disabled === null) {
180
+ if ($xeForm) {
181
+ return $xeForm.props.disabled
182
+ }
183
+ return false
184
+ }
185
+ return disabled
186
+ })
187
+
188
+ const computeBtnTransfer = computed(() => {
189
+ const { transfer } = props
190
+ const popupOpts = computePopupOpts.value
191
+ if (XEUtils.isBoolean(popupOpts.transfer)) {
192
+ return popupOpts.transfer
193
+ }
194
+ if (transfer === null) {
195
+ const globalTransfer = getConfig().tableSelect.transfer
196
+ if (XEUtils.isBoolean(globalTransfer)) {
197
+ return globalTransfer
198
+ }
199
+ if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
200
+ return true
201
+ }
202
+ }
203
+ return transfer
204
+ })
205
+
206
+ const computePropsOpts = computed(() => {
207
+ return props.optionProps || {}
208
+ })
209
+
210
+ const computeCheckboxOpts = computed(() => {
211
+ const { multiple } = props
212
+ const gridOpts = computeGridOpts.value
213
+ return Object.assign(
214
+ {
215
+ reserve: multiple,
216
+ showReserveStatus: multiple
217
+ },
218
+ getConfig().table.checkboxConfig,
219
+ gridOpts.checkboxConfig
220
+ )
221
+ })
222
+
223
+ const computeRowOpts = computed<VxeTablePropTypes.RowConfig>(() => {
224
+ const { multiple } = props
225
+ const gridOpts = computeGridOpts.value
226
+ const valueField = computeValueField.value
227
+ return Object.assign(
228
+ {
229
+ isCurrent: true
230
+ },
231
+ multiple ? { keyField: valueField } : {},
232
+ getConfig().table.rowConfig,
233
+ gridOpts.rowConfig
234
+ )
235
+ })
236
+
237
+ const computeRowKeyField = computed(() => {
238
+ const rowOpts = computeRowOpts.value
239
+ return rowOpts.keyField || '_X_ROW_KEY'
240
+ })
241
+
242
+ const computeLabelField = computed(() => {
243
+ const propsOpts = computePropsOpts.value
244
+ return propsOpts.label || 'label'
245
+ })
246
+
247
+ const computeValueField = computed(() => {
248
+ const propsOpts = computePropsOpts.value
249
+ return propsOpts.value || 'value'
250
+ })
251
+
252
+ const computePopupOpts = computed(() => {
253
+ return Object.assign({}, getConfig().tableSelect.popupConfig, props.popupConfig)
254
+ })
255
+
256
+ const computeGridOpts = computed(() => {
257
+ return Object.assign({}, getConfig().tableSelect.gridConfig, props.gridConfig, {
258
+ data: undefined
259
+ })
260
+ })
261
+
262
+ const computeRemoteOpts = computed(() => {
263
+ return Object.assign({}, getConfig().tableSelect.remoteConfig, props.remoteConfig)
264
+ })
265
+
266
+ const computeFilterOpts = computed(() => {
267
+ return Object.assign({}, getConfig().tableSelect.filterConfig, props.filterConfig)
268
+ })
269
+
270
+ const computeSelectGridOpts = computed(() => {
271
+ const gridOpts = computeGridOpts.value
272
+ const checkboxOpts = computeCheckboxOpts.value
273
+ const { pagerConfig, proxyConfig } = gridOpts
274
+ if (proxyConfig) {
275
+ const proxyAjax = proxyConfig.ajax
276
+ if (proxyAjax && proxyAjax.query) {
277
+ const newProxyConfig = XEUtils.clone(proxyConfig, true) as Required<VxeGridPropTypes.ProxyConfig>
278
+ const ajaxMethods = proxyAjax.query
279
+ if (ajaxMethods) {
280
+ const resConfigs = proxyConfig.response || proxyConfig.props || {}
281
+ Object.assign(newProxyConfig.ajax, {
282
+ query(params: VxeGridPropTypes.ProxyAjaxQueryParams, ...args: any[]) {
283
+ return Promise.resolve(ajaxMethods(params, ...args)).then((rest) => {
284
+ let currData = []
285
+ if (pagerConfig) {
286
+ const resultProp = resConfigs.result
287
+ currData = (XEUtils.isFunction(resultProp) ? resultProp({ data: rest, $table: null as any, $grid: null, $gantt: null }) : XEUtils.get(rest, resultProp || 'result')) || []
288
+ } else {
289
+ const listProp = resConfigs.list
290
+ currData = (listProp ? (XEUtils.isFunction(listProp) ? listProp({ data: rest, $table: null as any, $grid: null, $gantt: null }) : XEUtils.get(rest, listProp)) : rest) || []
291
+ }
292
+ cacheDataMap(currData || [])
293
+ return rest
294
+ })
295
+ }
296
+ })
297
+ }
298
+ return Object.assign({}, gridOpts, { checkboxConfig: checkboxOpts, proxyConfig: newProxyConfig })
299
+ }
300
+ }
301
+ return Object.assign({}, gridOpts, { checkboxConfig: checkboxOpts })
302
+ })
303
+
304
+ const computeSelectLabel = computed(() => {
305
+ const { modelValue, lazyOptions } = props
306
+ const { fullValMaps, fullData } = internalData
307
+ const valueField = computeValueField.value
308
+ const labelField = computeLabelField.value
309
+ if (!fullData) {
310
+ return ''
311
+ }
312
+ return (XEUtils.isArray(modelValue) ? modelValue : [modelValue])
313
+ .map((val) => {
314
+ const cacheItem = fullValMaps[val]
315
+ if (cacheItem) {
316
+ return cacheItem.item[labelField]
317
+ }
318
+ if (lazyOptions) {
319
+ const lazyItem = lazyOptions.find((item) => item[valueField] === val)
320
+ if (lazyItem) {
321
+ return lazyItem[labelField]
322
+ }
323
+ }
324
+ return val
325
+ })
326
+ .join(', ')
327
+ })
328
+
329
+ const computePopupWrapperStyle = computed(() => {
330
+ const popupOpts = computePopupOpts.value
331
+ const { height, width } = popupOpts
332
+ const stys: VxeComponentStyleType = {}
333
+ if (width) {
334
+ stys.width = toCssUnit(width)
335
+ }
336
+ if (height) {
337
+ stys.height = toCssUnit(height)
338
+ }
339
+ return stys
340
+ })
341
+
342
+ const computeMaps: VxeTableSelectPrivateComputed = {}
343
+
344
+ const $xeTableSelect = {
345
+ xID,
346
+ props,
347
+ context,
348
+ reactData,
349
+
350
+ getRefMaps: () => refMaps,
351
+ getComputeMaps: () => computeMaps
352
+ } as unknown as VxeTableSelectConstructor & VxeTableSelectPrivateMethods
353
+
354
+ const gridEventKeys: ValueOf<VxeTableSelectEmits>[] = ['form-submit', 'form-reset', 'form-collapse', 'page-change']
355
+ const gridEvents: Record<string, any> = {}
356
+ gridEventKeys.forEach((name) => {
357
+ gridEvents[getOnName(XEUtils.camelCase(name))] = (params: any) => {
358
+ dispatchEvent(name, params, params.$event)
359
+ }
360
+ })
361
+
362
+ const dispatchEvent = (type: ValueOf<VxeTableSelectEmits>, params: Record<string, any>, evnt: Event | null) => {
363
+ emit(type, createEvent(evnt, { $tableSelect: $xeTableSelect }, params))
364
+ }
365
+
366
+ const emitModel = (value: any) => {
367
+ emit('update:modelValue', value)
368
+ }
369
+
370
+ const tableSelectMethods: TableSelectMethods = {
371
+ dispatchEvent
372
+ }
373
+
374
+ const tableSelectPrivateMethods: TableSelectPrivateMethods = {}
375
+
376
+ const getRowid = (option: any) => {
377
+ const rowKeyField = computeRowKeyField.value
378
+ const rowid = option[rowKeyField]
379
+ return rowid ? encodeURIComponent(rowid) : ''
380
+ }
381
+
382
+ const getRowsByValue = (modelValue: VxeTableSelectPropTypes.ModelValue) => {
383
+ const { fullValMaps } = internalData
384
+ const checkboxOpts = computeCheckboxOpts.value
385
+ const rowKeyField = computeRowKeyField.value
386
+ const valueField = computeValueField.value
387
+ const labelField = computeLabelField.value
388
+ const rows: any[] = []
389
+ const vals = XEUtils.eqNull(modelValue) ? [] : XEUtils.isArray(modelValue) ? modelValue : [modelValue]
390
+ if (checkboxOpts.reserve) {
391
+ vals.forEach((val) => {
392
+ const cacheItem = fullValMaps[val]
393
+ rows.push(
394
+ cacheItem
395
+ ? cacheItem.item
396
+ : {
397
+ [rowKeyField]: val,
398
+ [valueField]: val,
399
+ [labelField]: val
400
+ }
401
+ )
402
+ })
403
+ } else {
404
+ vals.forEach((val) => {
405
+ const cacheItem = fullValMaps[val]
406
+ if (cacheItem) {
407
+ rows.push(cacheItem.item)
408
+ }
409
+ })
410
+ }
411
+ return rows
412
+ }
413
+
414
+ const updateModel = (modelValue: VxeTableSelectPropTypes.ModelValue) => {
415
+ const { multiple } = props
416
+ nextTick(() => {
417
+ const $grid = refGrid.value
418
+ if ($grid) {
419
+ const selectList = getRowsByValue(modelValue)
420
+ if (selectList.length) {
421
+ if (multiple) {
422
+ $grid.setCheckboxRow(selectList, true)
423
+ } else {
424
+ $grid.setRadioRow(selectList[0])
425
+ }
426
+ }
427
+ }
428
+ })
429
+ }
430
+
431
+ const loadData = (data: any[]) => {
432
+ cacheDataMap(data)
433
+ handleData()
434
+ }
435
+
436
+ const loadColumn = (columns?: VxeTableSelectPropTypes.Columns) => {
437
+ if (!columns || !columns.length) {
438
+ return
439
+ }
440
+ const { multiple } = props
441
+ const tableCols: VxeTableSelectPropTypes.Columns = []
442
+ let hasRadioCol = false
443
+ let hasCheckboxCol = false
444
+ columns.forEach((column) => {
445
+ if (!hasRadioCol && column.type === 'radio') {
446
+ hasRadioCol = true
447
+ } else if (!hasCheckboxCol && column.type === 'checkbox') {
448
+ hasCheckboxCol = true
449
+ }
450
+ tableCols.push(column)
451
+ })
452
+ if (multiple) {
453
+ if (!hasCheckboxCol) {
454
+ tableCols.unshift({
455
+ type: 'checkbox',
456
+ width: 70
457
+ })
458
+ }
459
+ } else {
460
+ if (!hasRadioCol) {
461
+ tableCols.unshift({
462
+ type: 'radio',
463
+ width: 70
464
+ })
465
+ }
466
+ }
467
+ reactData.tableColumns = tableCols
468
+ }
469
+
470
+ const cacheDataMap = (dataList: any[]) => {
471
+ const { options } = props
472
+ const rowKeyField = computeRowKeyField.value
473
+ const valueField = computeValueField.value
474
+ const gridOpts = computeGridOpts.value
475
+ const { treeConfig, pagerConfig } = gridOpts
476
+ const rowMaps: Record<
477
+ string,
478
+ {
479
+ item: any
480
+ index: number
481
+ _index: number
482
+ items: any[]
483
+ parent: any
484
+ nodes: any[]
485
+ }
486
+ > = {}
487
+ const keyMaps: Record<string, boolean> = {}
488
+ if (treeConfig) {
489
+ // 暂不支持
490
+ } else {
491
+ XEUtils.arrayEach(dataList || options || [], (item, index, items) => {
492
+ let rowid = getRowid(item)
493
+ if (!rowid) {
494
+ rowid = getRowUniqueId()
495
+ }
496
+ if (keyMaps[rowid]) {
497
+ errLog('vxe.error.repeatKey', [rowKeyField, rowid])
498
+ }
499
+ keyMaps[rowid] = true
500
+ const value = item[valueField]
501
+ if (rowMaps[value]) {
502
+ errLog('vxe.error.repeatKey', [valueField, value])
503
+ }
504
+ rowMaps[value] = { item, index, _index: index, items, parent: null, nodes: [] }
505
+ })
506
+ }
507
+ internalData.fullData = dataList || options || []
508
+ internalData.fullValMaps = pagerConfig ? Object.assign({}, internalData.fullValMaps, rowMaps) : rowMaps
509
+ handleOptList()
510
+ updateModel(props.modelValue)
511
+ }
512
+
513
+ const handleOptList = () => {
514
+ const { remote, modelValue, filterable } = props
515
+ const { searchValue } = reactData
516
+ const { fullData, fullValMaps } = internalData
517
+ const valueField = computeValueField.value
518
+ const labelField = computeLabelField.value
519
+ const filterOpts = computeFilterOpts.value
520
+ const frMethod = filterOpts.filterMethod
521
+ const searchStr = `${searchValue || ''}`.toLowerCase()
522
+ let avList: any[] = []
523
+ if (remote) {
524
+ avList = fullData
525
+ } else {
526
+ if (filterable && frMethod) {
527
+ avList = searchStr
528
+ ? fullData.filter((row) =>
529
+ frMethod({
530
+ $tableSelect: $xeTableSelect,
531
+ row,
532
+ filterValue: searchValue,
533
+ value: modelValue
534
+ })
535
+ )
536
+ : fullData
537
+ } else if (filterable) {
538
+ avList = searchStr ? fullData.filter((row) => `${row[labelField] || row[valueField]}`.toLowerCase().indexOf(searchStr) > -1) : fullData
539
+ } else {
540
+ avList = fullData
541
+ }
542
+ }
543
+ avList.forEach((item, index) => {
544
+ const cacheItem = fullValMaps[item[valueField]]
545
+ if (cacheItem) {
546
+ cacheItem._index = index
547
+ }
548
+ })
549
+ internalData.afterVisibleList = avList
550
+ return nextTick()
551
+ }
552
+
553
+ const updateZindex = () => {
554
+ const popupOpts = computePopupOpts.value
555
+ const customZIndex = popupOpts.zIndex || props.zIndex
556
+ if (customZIndex) {
557
+ reactData.panelIndex = XEUtils.toNumber(customZIndex)
558
+ } else if (reactData.panelIndex < getLastZIndex()) {
559
+ reactData.panelIndex = nextZIndex()
560
+ }
561
+ }
562
+
563
+ const updatePlacement = () => {
564
+ const { placement } = props
565
+ const { panelIndex } = reactData
566
+ const targetElem = refElem.value
567
+ const panelElem = refOptionPanel.value
568
+ const btnTransfer = computeBtnTransfer.value
569
+ const popupOpts = computePopupOpts.value
570
+ const handleStyle = () => {
571
+ const ppObj = updatePanelPlacement(targetElem, panelElem, {
572
+ placement: popupOpts.placement || placement,
573
+ defaultPlacement: popupOpts.defaultPlacement,
574
+ appendTo: popupOpts.appendTo,
575
+ teleportTo: btnTransfer
576
+ })
577
+ const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
578
+ zIndex: panelIndex
579
+ })
580
+ reactData.panelStyle = panelStyle
581
+ reactData.panelPlacement = ppObj.placement
582
+ }
583
+ handleStyle()
584
+ return nextTick().then(handleStyle)
585
+ }
586
+
587
+ const showOptionPanel = () => {
588
+ const { loading, remote, filterable } = props
589
+ const { fullData } = internalData
590
+ const isDisabled = computeIsDisabled.value
591
+ const remoteOpts = computeRemoteOpts.value
592
+ if (!loading && !isDisabled) {
593
+ if (internalData.vpTimeout) {
594
+ clearTimeout(internalData.vpTimeout)
595
+ }
596
+ if (internalData.hpTimeout) {
597
+ clearTimeout(internalData.hpTimeout)
598
+ }
599
+ if (!reactData.initialized) {
600
+ reactData.initialized = true
601
+ }
602
+ if (filterable) {
603
+ if (remote && remoteOpts.enabled && remoteOpts.autoLoad && !fullData.length) {
604
+ handleSearchEvent()
605
+ }
606
+ }
607
+ reactData.isActivated = true
608
+ reactData.isAniVisible = true
609
+ internalData.vpTimeout = setTimeout(() => {
610
+ reactData.visiblePanel = true
611
+ updateModel(props.modelValue)
612
+ internalData.vpTimeout = undefined
613
+ handleFocusSearch()
614
+ updatePlacement()
615
+ }, 10)
616
+ updateZindex()
617
+ updatePlacement()
618
+ }
619
+ }
620
+
621
+ const hideOptionPanel = () => {
622
+ const { filterable } = props
623
+ const filterOpts = computeFilterOpts.value
624
+ reactData.visiblePanel = false
625
+ if (filterable) {
626
+ if (filterOpts.clearOnClose) {
627
+ reactData.searchValue = ''
628
+ }
629
+ }
630
+ if (internalData.vpTimeout) {
631
+ clearTimeout(internalData.vpTimeout)
632
+ }
633
+ if (internalData.hpTimeout) {
634
+ clearTimeout(internalData.hpTimeout)
635
+ }
636
+ internalData.hpTimeout = setTimeout(() => {
637
+ reactData.isAniVisible = false
638
+ internalData.hpTimeout = undefined
639
+ }, 350)
640
+ }
641
+
642
+ const handleData = () => {
643
+ const { afterVisibleList } = internalData
644
+ reactData.tableData = afterVisibleList
645
+ return nextTick()
646
+ }
647
+
648
+ const modelSearchEvent = (value: string) => {
649
+ reactData.searchValue = value
650
+ }
651
+
652
+ const focusSearchEvent = () => {
653
+ reactData.isActivated = true
654
+ }
655
+
656
+ const handleSearchEvent = () => {
657
+ const { modelValue, remote } = props
658
+ const { searchValue } = reactData
659
+ const remoteOpts = computeRemoteOpts.value
660
+ const queryMethod = remoteOpts.queryMethod
661
+ if (remote && queryMethod && remoteOpts.enabled) {
662
+ reactData.searchLoading = true
663
+ Promise.resolve(queryMethod({ $tableSelect: $xeTableSelect, searchValue, value: modelValue }))
664
+ .then(() => nextTick())
665
+ .catch(() => nextTick())
666
+ .finally(() => {
667
+ reactData.searchLoading = false
668
+ })
669
+ } else {
670
+ handleOptList()
671
+ handleData()
672
+ }
673
+ }
674
+
675
+ const triggerSearchEvent = XEUtils.debounce(handleSearchEvent, 350, { trailing: true })
676
+
677
+ const changeEvent = (evnt: Event, selectValue: any, row: any) => {
678
+ emitModel(selectValue)
679
+ if (selectValue !== props.modelValue) {
680
+ dispatchEvent('change', { value: selectValue, row, option: row }, evnt)
681
+ // 自动更新校验状态
682
+ if ($xeForm && formItemInfo) {
683
+ $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, selectValue)
684
+ }
685
+ }
686
+ }
687
+
688
+ const clearValueEvent = (evnt: Event, selectValue: any) => {
689
+ changeEvent(evnt, selectValue, null)
690
+ dispatchEvent('clear', { value: selectValue }, evnt)
691
+ }
692
+
693
+ const clearEvent = (params: any, evnt: Event) => {
694
+ const $grid = refGrid.value
695
+ if ($grid) {
696
+ $grid.clearRadioRow()
697
+ $grid.clearCheckboxRow()
698
+ }
699
+ clearValueEvent(evnt, null)
700
+ hideOptionPanel()
701
+ }
702
+
703
+ const handleGlobalMousedownEvent = (evnt: MouseEvent) => {
704
+ const { visiblePanel } = reactData
705
+ const isDisabled = computeIsDisabled.value
706
+ if (!isDisabled) {
707
+ const el = refElem.value
708
+ const panelElem = refOptionPanel.value
709
+ reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelElem).flag
710
+ if (visiblePanel && !reactData.isActivated) {
711
+ hideOptionPanel()
712
+ }
713
+ }
714
+ }
715
+
716
+ const handleGlobalBlurEvent = () => {
717
+ const { visiblePanel, isActivated } = reactData
718
+ if (visiblePanel) {
719
+ hideOptionPanel()
720
+ }
721
+ if (isActivated) {
722
+ reactData.isActivated = false
723
+ }
724
+ if (visiblePanel || isActivated) {
725
+ const $input = refInput.value
726
+ if ($input) {
727
+ $input.blur()
728
+ }
729
+ }
730
+ }
731
+
732
+ const handleGlobalResizeEvent = () => {
733
+ const { visiblePanel } = reactData
734
+ if (visiblePanel) {
735
+ updatePlacement()
736
+ }
737
+ }
738
+
739
+ const handleGlobalScrollEvent = () => {
740
+ const { visiblePanel } = reactData
741
+ if (visiblePanel) {
742
+ updatePlacement()
743
+ }
744
+ }
745
+
746
+ const handleFocusSearch = () => {
747
+ if (props.filterable) {
748
+ nextTick(() => {
749
+ const inpSearch = refInpSearch.value
750
+ if (inpSearch) {
751
+ inpSearch.focus()
752
+ }
753
+ })
754
+ }
755
+ }
756
+
757
+ const focusEvent = (evnt: FocusEvent) => {
758
+ const isDisabled = computeIsDisabled.value
759
+ if (!isDisabled) {
760
+ if (!reactData.visiblePanel) {
761
+ reactData.triggerFocusPanel = true
762
+ showOptionPanel()
763
+ setTimeout(() => {
764
+ reactData.triggerFocusPanel = false
765
+ }, 150)
766
+ }
767
+ }
768
+ dispatchEvent('focus', {}, evnt)
769
+ }
770
+
771
+ const clickEvent = (evnt: MouseEvent) => {
772
+ togglePanelEvent(evnt)
773
+ dispatchEvent('click', {}, evnt)
774
+ }
775
+
776
+ const blurEvent = (evnt: FocusEvent) => {
777
+ reactData.isActivated = false
778
+ dispatchEvent('blur', {}, evnt)
779
+ }
780
+
781
+ const togglePanelEvent = (params: any) => {
782
+ const { $event } = params
783
+ $event.preventDefault()
784
+ if (reactData.triggerFocusPanel) {
785
+ reactData.triggerFocusPanel = false
786
+ } else {
787
+ if (reactData.visiblePanel) {
788
+ hideOptionPanel()
789
+ } else {
790
+ showOptionPanel()
791
+ }
792
+ }
793
+ }
794
+
795
+ const radioChangeEvent: VxeGridEvents.RadioChange = (params) => {
796
+ const { $event, row } = params
797
+ const valueField = computeValueField.value
798
+ const value = row[valueField]
799
+ changeEvent($event, value, row)
800
+ hideOptionPanel()
801
+ }
802
+
803
+ const checkboxChangeEvent: VxeGridEvents.CheckboxChange = (params) => {
804
+ const { $grid, $event, row } = params
805
+ const checkboxOpts = computeCheckboxOpts.value
806
+ const valueField = computeValueField.value
807
+ if ($grid) {
808
+ const checkboxRecords = $grid.getCheckboxRecords()
809
+ if (checkboxOpts.reserve) {
810
+ checkboxRecords.push(...$grid.getCheckboxReserveRecords())
811
+ }
812
+ const value = checkboxRecords.map((row) => {
813
+ return row[valueField]
814
+ })
815
+ changeEvent($event, value, row)
816
+ }
817
+ }
818
+
819
+ const checkboxAllEvent: VxeGridEvents.CheckboxAll = (params) => {
820
+ checkboxChangeEvent(params)
821
+ }
822
+
823
+ Object.assign($xeTableSelect, tableSelectMethods, tableSelectPrivateMethods)
824
+
825
+ const renderVN = () => {
826
+ const { className, loading, filterable, remote } = props
827
+ const { initialized, isActivated, isAniVisible, visiblePanel, tableColumns, searchValue, tableData, searchLoading } = reactData
828
+ const vSize = computeSize.value
829
+ const isDisabled = computeIsDisabled.value
830
+ const selectLabel = computeSelectLabel.value
831
+ const btnTransfer = computeBtnTransfer.value
832
+ const formReadonly = computeFormReadonly.value
833
+ const popupOpts = computePopupOpts.value
834
+ const selectGridOpts = computeSelectGridOpts.value
835
+ const rowOpts = computeRowOpts.value
836
+ const filterOpts = computeFilterOpts.value
837
+ const popupWrapperStyle = computePopupWrapperStyle.value
838
+ const { appendTo } = popupOpts
839
+ const headerSlot = slots.header
840
+ const footerSlot = slots.footer
841
+ const prefixSlot = slots.prefix
842
+ const ppClassName = popupOpts.className
843
+
844
+ if (formReadonly) {
845
+ return h(
846
+ 'div',
847
+ {
848
+ ref: refElem,
849
+ class: ['vxe-table-select--readonly', className]
850
+ },
851
+ [
852
+ h(
853
+ 'span',
854
+ {
855
+ class: 'vxe-table-select-label'
856
+ },
857
+ selectLabel
858
+ )
859
+ ]
860
+ )
861
+ }
862
+ return h(
863
+ 'div',
864
+ {
865
+ ref: refElem,
866
+ class: [
867
+ 'vxe-table-select',
868
+ className ? (XEUtils.isFunction(className) ? className({ $tableSelect: $xeTableSelect }) : className) : '',
869
+ {
870
+ [`size--${vSize}`]: vSize,
871
+ 'is--filterable': filterable,
872
+ 'is--visible': visiblePanel,
873
+ 'is--disabled': isDisabled,
874
+ 'is--loading': loading,
875
+ 'is--active': isActivated
876
+ }
877
+ ]
878
+ },
879
+ [
880
+ h(
881
+ VxeInputComponent,
882
+ {
883
+ ref: refInput,
884
+ clearable: props.clearable,
885
+ placeholder: loading ? getI18n('vxe.select.loadingText') : props.placeholder,
886
+ editable: false,
887
+ disabled: isDisabled,
888
+ type: 'text',
889
+ prefixIcon: props.prefixIcon,
890
+ suffixIcon: loading ? getIcon().TABLE_SELECT_LOADED : visiblePanel ? getIcon().TABLE_SELECT_OPEN : getIcon().TABLE_SELECT_CLOSE,
891
+ modelValue: loading ? '' : selectLabel,
892
+ onClear: clearEvent,
893
+ onClick: clickEvent,
894
+ onFocus: focusEvent,
895
+ onBlur: blurEvent,
896
+ onSuffixClick: togglePanelEvent
897
+ },
898
+ prefixSlot
899
+ ? {
900
+ prefix: () => prefixSlot({})
901
+ }
902
+ : {}
903
+ ),
904
+ h(
905
+ Teleport,
906
+ {
907
+ to: getPopupContainer(appendTo),
908
+ disabled: btnTransfer ? !initialized : true
909
+ },
910
+ [
911
+ h(
912
+ 'div',
913
+ {
914
+ ref: refOptionPanel,
915
+ class: [
916
+ 'vxe-table--ignore-clear vxe-table-select--panel',
917
+ ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $tableSelect: $xeTableSelect }) : ppClassName) : '',
918
+ {
919
+ [`size--${vSize}`]: vSize,
920
+ 'is--transfer': btnTransfer,
921
+ 'ani--leave': !loading && isAniVisible,
922
+ 'ani--enter': !loading && visiblePanel
923
+ }
924
+ ],
925
+ placement: reactData.panelPlacement,
926
+ style: reactData.panelStyle
927
+ },
928
+ initialized
929
+ ? [
930
+ h(
931
+ 'div',
932
+ {
933
+ class: 'vxe-table-select--panel-wrapper'
934
+ },
935
+ [
936
+ filterable
937
+ ? h(
938
+ 'div',
939
+ {
940
+ class: 'vxe-table-select--panel-search'
941
+ },
942
+ [
943
+ h(VxeInputComponent, {
944
+ ref: refInpSearch,
945
+ class: 'vxe-table-select-search--input',
946
+ modelValue: searchValue,
947
+ clearable: true,
948
+ disabled: false,
949
+ readonly: false,
950
+ placeholder: getI18n('vxe.treeSelect.search'),
951
+ prefixIcon: getIcon().INPUT_SEARCH,
952
+ 'onUpdate:modelValue': modelSearchEvent,
953
+ onFocus: focusSearchEvent,
954
+ onChange: triggerSearchEvent,
955
+ onSearch: triggerSearchEvent
956
+ })
957
+ ]
958
+ )
959
+ : renderEmptyElement($xeTableSelect),
960
+ headerSlot
961
+ ? h(
962
+ 'div',
963
+ {
964
+ class: 'vxe-table-select--panel-header'
965
+ },
966
+ headerSlot({})
967
+ )
968
+ : renderEmptyElement($xeTableSelect),
969
+ h(
970
+ 'div',
971
+ {
972
+ class: 'vxe-table-select--panel-body'
973
+ },
974
+ [
975
+ h(
976
+ 'div',
977
+ {
978
+ ref: refGridWrapper,
979
+ class: 'vxe-table-select-grid--wrapper',
980
+ style: popupWrapperStyle
981
+ },
982
+ [
983
+ VxeTableGridComponent
984
+ ? h(
985
+ VxeTableGridComponent,
986
+ {
987
+ ...selectGridOpts,
988
+ ...gridEvents,
989
+ class: 'vxe-table-select--grid',
990
+ ref: refGrid,
991
+ loading: remote && searchLoading,
992
+ rowConfig: rowOpts,
993
+ data: tableData,
994
+ columns: tableColumns.length ? tableColumns : selectGridOpts.columns,
995
+ height: '100%',
996
+ autoResize: true,
997
+ onRadioChange: radioChangeEvent,
998
+ onCheckboxChange: checkboxChangeEvent,
999
+ onCheckboxAll: checkboxAllEvent
1000
+ },
1001
+ Object.assign({}, slots, {
1002
+ header: undefined,
1003
+ footer: undefined,
1004
+ prefixSlot: undefined
1005
+ })
1006
+ )
1007
+ : renderEmptyElement($xeTableSelect)
1008
+ ]
1009
+ )
1010
+ ]
1011
+ ),
1012
+ footerSlot || (filterable && searchValue && !remote && filterOpts.showResultCount)
1013
+ ? h(
1014
+ 'div',
1015
+ {
1016
+ class: 'vxe-table-select--panel-footer'
1017
+ },
1018
+ footerSlot
1019
+ ? footerSlot({})
1020
+ : [
1021
+ h(
1022
+ 'div',
1023
+ {
1024
+ class: 'vxe-table-select--search-count'
1025
+ },
1026
+ searchLoading ? '' : getI18n('vxe.tableSelect.filterCount', [tableData.length])
1027
+ )
1028
+ ]
1029
+ )
1030
+ : renderEmptyElement($xeTableSelect)
1031
+ ]
1032
+ )
1033
+ ]
1034
+ : []
1035
+ )
1036
+ ]
1037
+ )
1038
+ ]
1039
+ )
1040
+ }
1041
+
1042
+ watch(
1043
+ () => props.options,
1044
+ (val) => {
1045
+ loadData(val || [])
1046
+ }
1047
+ )
1048
+
1049
+ watch(
1050
+ () => props.columns,
1051
+ (val) => {
1052
+ loadColumn(val)
1053
+ }
1054
+ )
1055
+
1056
+ watch(
1057
+ () => props.modelValue,
1058
+ (val) => {
1059
+ updateModel(val)
1060
+ }
1061
+ )
1062
+
1063
+ loadColumn(props.columns)
1064
+ loadData(props.options || [])
1065
+
1066
+ onMounted(() => {
1067
+ const { gridConfig } = props
1068
+ if (gridConfig && gridConfig.proxyConfig) {
1069
+ if (gridConfig.proxyConfig.autoLoad !== false) {
1070
+ reactData.initialized = true
1071
+ }
1072
+ }
1073
+ globalEvents.on($xeTableSelect, 'mousedown', handleGlobalMousedownEvent)
1074
+ globalEvents.on($xeTableSelect, 'blur', handleGlobalBlurEvent)
1075
+ globalEvents.on($xeTableSelect, 'resize', handleGlobalResizeEvent)
1076
+ globalEvents.on($xeTableSelect, 'scroll', handleGlobalScrollEvent)
1077
+ })
1078
+
1079
+ onUnmounted(() => {
1080
+ globalEvents.off($xeTableSelect, 'mousedown')
1081
+ globalEvents.off($xeTableSelect, 'blur')
1082
+ globalEvents.off($xeTableSelect, 'resize')
1083
+ globalEvents.off($xeTableSelect, 'scroll')
1084
+ XEUtils.assign(reactData, createReactData())
1085
+ XEUtils.assign(internalData, createInternalData())
1086
+ })
1087
+
1088
+ nextTick(() => {
1089
+ if (!VxeTableGridComponent) {
1090
+ errLog('vxe.error.reqComp', ['vxe-grid'])
1091
+ }
1092
+ })
1093
+
1094
+ provide('$xeTableSelect', $xeTableSelect)
1095
+
1096
+ $xeTableSelect.renderVN = renderVN
1097
+
1098
+ return $xeTableSelect
1099
+ },
1100
+ render() {
1101
+ return this.renderVN()
1102
+ }
1103
+ })