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,1094 +1,1217 @@
1
- import { ref, computed, h, PropType, nextTick, inject, provide, reactive, Teleport, onMounted, onBeforeUnmount, watch, VNode } from 'vue'
2
- import { defineVxeComponent } from '../../ui/src/comp'
3
- import { getConfig, getI18n, getIcon, globalEvents, createEvent, useSize, renderEmptyElement } from '../../ui'
4
- import { getEventTargetNode, updatePanelPlacement, toCssUnit, getPopupContainer } from '../../ui/src/dom'
5
- import { getLastZIndex, nextZIndex, deModelValue } from '../../ui/src/utils'
6
- import { createComponentLog } from '../../ui/src/log'
7
- import { getSlotVNs } from '../../ui/src/vn'
8
- import XEUtils from 'xe-utils'
9
- import VxeInputComponent from '../../input'
10
- import VxeButtonComponent from '../../button'
11
- import VxeTreeComponent from '../../tree'
12
-
13
- import type { TreeSelectReactData, VxeTreeSelectEmits, TreeSelectInternalData, VxeButtonEvents, VxeInputEvents, ValueOf, VxeComponentStyleType, TreeSelectPrivateRef, TreeSelectPrivateMethods, TreeSelectMethods, VxeTreeSelectPrivateComputed, VxeTreeSelectPropTypes, VxeTreeSelectConstructor, VxeFormDefines, VxeDrawerConstructor, VxeDrawerMethods, VxeTreeSelectPrivateMethods, VxeFormConstructor, VxeFormPrivateMethods, VxeInputConstructor, VxeModalConstructor, VxeModalMethods, VxeTreeConstructor, VxeTreeEvents, VxeTreeSelectDefines } from '../../../types'
14
- import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
15
-
16
- const { warnLog, errLog } = createComponentLog('tree-select')
17
-
18
- function getOptUniqueId () {
19
- return XEUtils.uniqueId('node_')
20
- }
21
-
22
- function createReactData (): TreeSelectReactData {
23
- return {
24
- initialized: false,
25
- searchValue: '',
26
- searchLoading: false,
27
- panelIndex: 0,
28
- panelStyle: {},
29
- panelPlacement: null,
30
- triggerFocusPanel: false,
31
- visiblePanel: false,
32
- isAniVisible: false,
33
- isActivated: false,
34
- fullOptFlag: 1,
35
- lazyOptFlag: 1
36
- }
37
- }
38
-
39
- function createInternalData (): TreeSelectInternalData {
40
- return {
41
- // hpTimeout: undefined,
42
- fullOptionList: [],
43
- fullNodeMaps: {},
44
- lazyNodeMaps: {}
45
- }
46
- }
47
-
48
- export default defineVxeComponent({
49
- name: 'VxeTreeSelect',
50
- props: {
51
- modelValue: [String, Number, Array] as PropType<VxeTreeSelectPropTypes.ModelValue>,
52
- clearable: {
53
- type: Boolean as PropType<VxeTreeSelectPropTypes.Clearable>,
54
- default: () => getConfig().treeSelect.clearable
55
- },
56
- placeholder: {
57
- type: String as PropType<VxeTreeSelectPropTypes.Placeholder>,
58
- default: () => XEUtils.eqNull(getConfig().treeSelect.placeholder) ? getI18n('vxe.base.pleaseSelect') : getConfig().treeSelect.placeholder
59
- },
60
- readonly: {
61
- type: Boolean as PropType<VxeTreeSelectPropTypes.Readonly>,
62
- default: null
63
- },
64
- loading: Boolean as PropType<VxeTreeSelectPropTypes.Loading>,
65
- disabled: {
66
- type: Boolean as PropType<VxeTreeSelectPropTypes.Disabled>,
67
- default: null
68
- },
69
- showFullLabel: {
70
- type: Boolean as PropType<VxeTreeSelectPropTypes.ShowFullLabel>,
71
- default: () => getConfig().treeSelect.showFullLabel
72
- },
73
- separator: {
74
- type: String as PropType<VxeTreeSelectPropTypes.Separator>,
75
- default: () => getConfig().treeSelect.separator
76
- },
77
- filterable: Boolean as PropType<VxeTreeSelectPropTypes.Filterable>,
78
- filterConfig: Object as PropType<VxeTreeSelectPropTypes.FilterConfig>,
79
- multiple: Boolean as PropType<VxeTreeSelectPropTypes.Multiple>,
80
- className: [String, Function] as PropType<VxeTreeSelectPropTypes.ClassName>,
81
- /**
82
- * 已废弃,请使用 popupConfig.className
83
- * @deprecated
84
- */
85
- popupClassName: [String, Function] as PropType<VxeTreeSelectPropTypes.PopupClassName>,
86
- prefixIcon: String as PropType<VxeTreeSelectPropTypes.PrefixIcon>,
87
- placement: String as PropType<VxeTreeSelectPropTypes.Placement>,
88
- lazyOptions: Array as PropType<VxeTreeSelectPropTypes.LazyOptions>,
89
- options: Array as PropType<VxeTreeSelectPropTypes.Options>,
90
- optionProps: Object as PropType<VxeTreeSelectPropTypes.OptionProps>,
91
- /**
92
- * 已废弃,请使用 popupConfig.zIndex
93
- * @deprecated
94
- */
95
- zIndex: Number as PropType<VxeTreeSelectPropTypes.ZIndex>,
96
- size: {
97
- type: String as PropType<VxeTreeSelectPropTypes.Size>,
98
- default: () => getConfig().treeSelect.size || getConfig().size
99
- },
100
- remote: Boolean as PropType<VxeTreeSelectPropTypes.Remote>,
101
- remoteConfig: Object as PropType<VxeTreeSelectPropTypes.RemoteConfig>,
102
- showRadio: {
103
- type: Boolean as PropType<VxeTreeSelectPropTypes.ShowRadio>,
104
- default: () => getConfig().treeSelect.showRadio
105
- },
106
- radioConfig: Object as PropType<VxeTreeSelectPropTypes.RadioConfig>,
107
- showCheckbox: {
108
- type: Boolean as PropType<VxeTreeSelectPropTypes.ShowCheckbox>,
109
- default: () => getConfig().treeSelect.showCheckbox
110
- },
111
- checkboxConfig: Object as PropType<VxeTreeSelectPropTypes.CheckboxConfig>,
112
- popupConfig: Object as PropType<VxeTreeSelectPropTypes.PopupConfig>,
113
- treeConfig: Object as PropType<VxeTreeSelectPropTypes.TreeConfig>,
114
- menuConfig: Object as PropType<VxeTreeSelectPropTypes.MenuConfig>,
115
- virtualYConfig: Object as PropType<VxeTreeSelectPropTypes.VirtualYConfig>,
116
- /**
117
- * 已废弃,被 checked-closable, clear-closable 替换
118
- * @deprecated
119
- */
120
- autoClose: {
121
- type: Boolean as PropType<VxeTreeSelectPropTypes.AutoClose>,
122
- default: () => getConfig().treeSelect.autoClose
123
- },
124
- checkedClosable: {
125
- type: Boolean as PropType<VxeTreeSelectPropTypes.CheckedClosable>,
126
- default: () => getConfig().treeSelect.checkedClosable
127
- },
128
- clearClosable: {
129
- type: Boolean as PropType<VxeTreeSelectPropTypes.ClearClosable>,
130
- default: () => getConfig().treeSelect.clearClosable
131
- },
132
- showCloseButton: {
133
- type: Boolean as PropType<VxeTreeSelectPropTypes.ShowCloseButton>,
134
- default: () => getConfig().treeSelect.showCloseButton
135
- },
136
- showTotalButton: {
137
- type: Boolean as PropType<VxeTreeSelectPropTypes.ShowTotalButton>,
138
- default: () => getConfig().treeSelect.showTotalButton
139
- },
140
- showCheckedButton: {
141
- type: Boolean as PropType<VxeTreeSelectPropTypes.ShowCheckedButton>,
142
- default: () => getConfig().treeSelect.showCheckedButton
143
- },
144
- showClearButton: {
145
- type: Boolean as PropType<VxeTreeSelectPropTypes.ShowClearButton>,
146
- default: () => getConfig().treeSelect.showClearButton
147
- },
148
- showExpandButton: {
149
- type: Boolean as PropType<VxeTreeSelectPropTypes.ShowExpandButton>,
150
- default: () => getConfig().treeSelect.showExpandButton
151
- },
152
- transfer: {
153
- type: Boolean as PropType<VxeTreeSelectPropTypes.Transfer>,
154
- default: null
155
- },
156
-
157
- /**
158
- * 已废弃,被 remote-config.queryMethod 替换
159
- * @deprecated
160
- */
161
- remoteMethod: Function as PropType<VxeTreeSelectPropTypes.RemoteMethod>
162
- },
163
- emits: [
164
- 'update:modelValue',
165
- 'change',
166
- 'all-change',
167
- 'clear',
168
- 'blur',
169
- 'focus',
170
- 'click',
171
- 'node-click',
172
- 'visible-change'
173
- ] as VxeTreeSelectEmits,
174
- setup (props, context) {
175
- const { emit, slots } = context
176
-
177
- const $xeModal = inject<(VxeModalConstructor & VxeModalMethods)| null>('$xeModal', null)
178
- const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
179
- const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
180
- const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods) | null>('$xeForm', null)
181
- const formItemInfo = inject<VxeFormDefines.ProvideItemInfo | null>('xeFormItemInfo', null)
182
-
183
- const xID = XEUtils.uniqueId()
184
-
185
- const { computeSize } = useSize(props)
186
-
187
- const refElem = ref<HTMLDivElement>()
188
- const refInput = ref<VxeInputConstructor>()
189
- const refInpSearch = ref<VxeInputConstructor>()
190
- const refTreeWrapper = ref<HTMLDivElement>()
191
- const refOptionPanel = ref<HTMLDivElement>()
192
- const refTree = ref<VxeTreeConstructor>()
193
-
194
- const reactData = reactive(createReactData())
195
-
196
- const internalData = createInternalData()
197
-
198
- const refMaps: TreeSelectPrivateRef = {
199
- refElem
200
- }
201
-
202
- const computeFormReadonly = computed(() => {
203
- const { readonly } = props
204
- if (readonly === null) {
205
- if ($xeForm) {
206
- return $xeForm.props.readonly
207
- }
208
- return false
209
- }
210
- return readonly
211
- })
212
-
213
- const computeIsDisabled = computed(() => {
214
- const { disabled } = props
215
- if (disabled === null) {
216
- if ($xeForm) {
217
- return $xeForm.props.disabled
218
- }
219
- return false
220
- }
221
- return disabled
222
- })
223
-
224
- const computeBtnTransfer = computed(() => {
225
- const popupOpts = computePopupOpts.value
226
- const { transfer } = popupOpts
227
- if (XEUtils.isBoolean(transfer)) {
228
- return transfer
229
- }
230
- if (props.transfer === null) {
231
- const globalTransfer = getConfig().treeSelect.transfer
232
- if (XEUtils.isBoolean(globalTransfer)) {
233
- return globalTransfer
234
- }
235
- if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
236
- return true
237
- }
238
- }
239
- return props.transfer
240
- })
241
-
242
- const computePopupOpts = computed(() => {
243
- return Object.assign({}, getConfig().treeSelect.popupConfig, props.popupConfig)
244
- })
245
-
246
- const computeTreeOpts = computed(() => {
247
- return Object.assign({}, getConfig().treeSelect.treeConfig, props.treeConfig, { data: undefined })
248
- })
249
-
250
- const computeMenuOpts = computed(() => {
251
- return Object.assign({}, getConfig().treeSelect.menuConfig, props.menuConfig)
252
- })
253
-
254
- const computeTreeNodeOpts = computed(() => {
255
- const treeOpts = computeTreeOpts.value
256
- return Object.assign({ isHover: true }, treeOpts.nodeConfig)
257
- })
258
-
259
- const computeTreeCheckboxOpts = computed(() => {
260
- const { showCheckbox, checkboxConfig } = props
261
- const treeOpts = computeTreeOpts.value
262
- return Object.assign({
263
- showIcon: XEUtils.isBoolean(showCheckbox) ? showCheckbox : !!treeOpts.showCheckbox
264
- }, treeOpts.checkboxConfig, checkboxConfig, {
265
- trigger: 'node'
266
- })
267
- })
268
-
269
- const computeTreeRadioOpts = computed(() => {
270
- const { showRadio, radioConfig } = props
271
- const treeOpts = computeTreeOpts.value
272
- return Object.assign({
273
- showIcon: XEUtils.isBoolean(showRadio) ? showRadio : !!treeOpts.showRadio
274
- }, treeOpts.radioConfig, radioConfig, {
275
- trigger: 'node'
276
- })
277
- })
278
-
279
- const computePropsOpts = computed(() => {
280
- return Object.assign({}, getConfig().treeSelect.optionProps, props.optionProps)
281
- })
282
-
283
- const computeNodeKeyField = computed(() => {
284
- const treeOpts = computeTreeOpts.value
285
- return treeOpts.keyField || 'id'
286
- })
287
-
288
- const computeLabelField = computed(() => {
289
- const propsOpts = computePropsOpts.value
290
- return propsOpts.label || 'label'
291
- })
292
-
293
- const computeValueField = computed(() => {
294
- const propsOpts = computePropsOpts.value
295
- return propsOpts.value || 'value'
296
- })
297
-
298
- const computeChildrenField = computed(() => {
299
- const propsOpts = computePropsOpts.value
300
- return propsOpts.children || 'children'
301
- })
302
-
303
- const computeNodeParentField = computed(() => {
304
- const propsOpts = computePropsOpts.value
305
- const treeOpts = computeTreeOpts.value
306
- return propsOpts.parent || treeOpts.parentField || 'parentId'
307
- })
308
-
309
- const computeHasChildField = computed(() => {
310
- const propsOpts = computePropsOpts.value
311
- return propsOpts.hasChild || 'hasChild'
312
- })
313
-
314
- const computeVirtualYOpts = computed(() => {
315
- return Object.assign({} as { gt: number }, getConfig().treeSelect.virtualYConfig, props.virtualYConfig)
316
- })
317
-
318
- const computeRemoteOpts = computed(() => {
319
- return Object.assign({}, getConfig().treeSelect.remoteConfig, props.remoteConfig)
320
- })
321
-
322
- const computeFilterOpts = computed(() => {
323
- const treeOpts = computeTreeOpts.value
324
- return Object.assign({}, treeOpts.filterConfig, props.filterConfig)
325
- })
326
-
327
- const computeSelectVals = computed(() => {
328
- const { modelValue } = props
329
- return XEUtils.eqNull(modelValue) ? [] : (XEUtils.isArray(modelValue) ? modelValue : [modelValue])
330
- })
331
-
332
- const computeSelectLabel = computed(() => {
333
- const { showFullLabel } = props
334
- const { fullOptFlag, lazyOptFlag } = reactData
335
- const { fullNodeMaps, lazyNodeMaps } = internalData
336
- const labelField = computeLabelField.value
337
- const selectVals = computeSelectVals.value
338
- return selectVals.map(val => {
339
- const cacheItem = fullNodeMaps[val]
340
- if (fullOptFlag && cacheItem) {
341
- return showFullLabel ? cacheItem.fullLabel : cacheItem.item[labelField]
342
- }
343
- if (lazyOptFlag) {
344
- const lazyCacheItem = lazyNodeMaps[val]
345
- if (lazyCacheItem) {
346
- return showFullLabel ? lazyCacheItem.fullLabel : lazyCacheItem.item[labelField]
347
- }
348
- }
349
- return val
350
- }).join(', ')
351
- })
352
-
353
- const computePopupWrapperStyle = computed(() => {
354
- const popupOpts = computePopupOpts.value
355
- const { height, width } = popupOpts
356
- const stys: VxeComponentStyleType = {}
357
- if (width) {
358
- stys.width = toCssUnit(width)
359
- }
360
- if (height) {
361
- stys.height = toCssUnit(height)
362
- stys.maxHeight = toCssUnit(height)
363
- }
364
- return stys
365
- })
366
-
367
- const computeMaps: VxeTreeSelectPrivateComputed = {
368
- }
369
-
370
- const $xeTreeSelect = {
371
- xID,
372
- props,
373
- context,
374
- reactData,
375
- internalData,
376
-
377
- getRefMaps: () => refMaps,
378
- getComputeMaps: () => computeMaps
379
- } as unknown as VxeTreeSelectConstructor & VxeTreeSelectPrivateMethods
380
-
381
- const dispatchEvent = (type: ValueOf<VxeTreeSelectEmits>, params: Record<string, any>, evnt: Event | null) => {
382
- emit(type, createEvent(evnt, { $treeSelect: $xeTreeSelect }, params))
383
- }
384
-
385
- const emitModel = (value: any) => {
386
- emit('update:modelValue', value)
387
- }
388
-
389
- const callSlot = (slotFunc: ((params: any) => any) | string | null, params: any) => {
390
- if (slotFunc) {
391
- if (XEUtils.isString(slotFunc)) {
392
- slotFunc = slots[slotFunc] || null
393
- }
394
- if (XEUtils.isFunction(slotFunc)) {
395
- return getSlotVNs(slotFunc(params))
396
- }
397
- }
398
- return []
399
- }
400
-
401
- const treeSelectMethods: TreeSelectMethods = {
402
- dispatchEvent
403
- }
404
-
405
- const getNodeid = (option: any) => {
406
- const nodeKeyField = computeNodeKeyField.value
407
- const nodeid = option[nodeKeyField]
408
- return nodeid ? encodeURIComponent(nodeid) : ''
409
- }
410
-
411
- const handleCacheMap = (optList: VxeTreeSelectPropTypes.Options) => {
412
- const { separator } = props
413
- const treeOpts = computeTreeOpts.value
414
- const nodeKeyField = computeNodeKeyField.value
415
- const nodeParentField = computeNodeParentField.value
416
- const childrenField = computeChildrenField.value
417
- const valueField = computeValueField.value
418
- const labelField = computeLabelField.value
419
- const { transform } = treeOpts
420
- const nodeMaps: Record<string, VxeTreeSelectDefines.NodeCacheObj> = {}
421
- const keyMaps: Record<string, boolean> = {}
422
- const handleOptNode = (item: any, index: number, items: any[], path: string[], parentItem: any, nodes: any[]) => {
423
- let nodeid = getNodeid(item)
424
- if (!nodeid) {
425
- nodeid = getOptUniqueId()
426
- }
427
- if (keyMaps[nodeid]) {
428
- errLog('vxe.error.repeatKey', [nodeKeyField, nodeid])
429
- }
430
- keyMaps[nodeid] = true
431
- const value = item[valueField]
432
- if (nodeMaps[value]) {
433
- errLog('vxe.error.repeatKey', [valueField, value])
434
- }
435
- nodeMaps[value] = {
436
- item,
437
- index,
438
- items,
439
- parent: parentItem,
440
- nodes,
441
- fullLabel: nodes.map(item => item[labelField]).join((separator || ' / '))
442
- }
443
- }
444
- if (optList) {
445
- if (transform) {
446
- // if (showFullLabel) {
447
- const treeList = XEUtils.toArrayTree(optList, {
448
- key: nodeKeyField,
449
- parentKey: nodeParentField,
450
- mapChildren: childrenField,
451
- rootParentValue: treeOpts.rootParentValue,
452
- rootValues: treeOpts.rootValues
453
- })
454
- XEUtils.eachTree(treeList, handleOptNode, { children: childrenField })
455
- // } else {
456
- // optList.forEach((item, index, items) => {
457
- // handleOptNode(item, index, items, [], null, [])
458
- // })
459
- // }
460
- } else {
461
- XEUtils.eachTree(optList, handleOptNode, { children: childrenField })
462
- }
463
- }
464
- return nodeMaps
465
- }
466
-
467
- const cacheDataMap = () => {
468
- const { options } = props
469
- internalData.fullNodeMaps = handleCacheMap(options || [])
470
- internalData.fullOptionList = options || []
471
- reactData.fullOptFlag++
472
- }
473
-
474
- const cacheLazyDataMap = () => {
475
- const { lazyOptions } = props
476
- internalData.lazyNodeMaps = handleCacheMap(lazyOptions || [])
477
- reactData.lazyOptFlag++
478
- }
479
-
480
- const updateZindex = () => {
481
- const popupOpts = computePopupOpts.value
482
- const customZIndex = popupOpts.zIndex || props.zIndex
483
- if (customZIndex) {
484
- reactData.panelIndex = XEUtils.toNumber(customZIndex)
485
- } else if (reactData.panelIndex < getLastZIndex()) {
486
- reactData.panelIndex = nextZIndex()
487
- }
488
- }
489
-
490
- const updatePlacement = () => {
491
- const { placement } = props
492
- const { panelIndex } = reactData
493
- const targetElem = refElem.value
494
- const panelElem = refOptionPanel.value
495
- const btnTransfer = computeBtnTransfer.value
496
- const popupOpts = computePopupOpts.value
497
- const handleStyle = () => {
498
- const ppObj = updatePanelPlacement(targetElem, panelElem, {
499
- isMinWidth: !popupOpts.width,
500
- placement: popupOpts.placement || placement,
501
- defaultPlacement: popupOpts.defaultPlacement,
502
- appendTo: popupOpts.appendTo,
503
- teleportTo: btnTransfer
504
- })
505
- const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
506
- zIndex: panelIndex
507
- })
508
- reactData.panelStyle = panelStyle
509
- reactData.panelPlacement = ppObj.placement
510
- }
511
- handleStyle()
512
- return nextTick().then(handleStyle)
513
- }
514
-
515
- const showOptionPanel = (evnt?: Event) => {
516
- const { loading, remote, filterable } = props
517
- const { fullOptionList } = internalData
518
- const isDisabled = computeIsDisabled.value
519
- const remoteOpts = computeRemoteOpts.value
520
- if (!loading && !isDisabled) {
521
- clearTimeout(internalData.hpTimeout)
522
- if (!reactData.initialized) {
523
- reactData.initialized = true
524
- }
525
- reactData.isActivated = true
526
- reactData.isAniVisible = true
527
- if (filterable) {
528
- if (remote && remoteOpts.enabled && remoteOpts.autoLoad && !fullOptionList.length) {
529
- handleSearchEvent()
530
- }
531
- }
532
- setTimeout(() => {
533
- reactData.visiblePanel = true
534
- handleFocusSearch()
535
- updatePlacement()
536
- }, 10)
537
- updateZindex()
538
- updatePlacement()
539
- dispatchEvent('visible-change', { visible: true }, evnt || null)
540
- }
541
- }
542
-
543
- const hideOptionPanel = (evnt?: Event) => {
544
- const { filterable } = props
545
- const filterOpts = computeFilterOpts.value
546
- if (filterable) {
547
- if (filterOpts.clearOnClose) {
548
- reactData.searchValue = ''
549
- }
550
- }
551
- reactData.visiblePanel = false
552
- internalData.hpTimeout = setTimeout(() => {
553
- reactData.isAniVisible = false
554
- }, 350)
555
- dispatchEvent('visible-change', { visible: false }, evnt || null)
556
- }
557
-
558
- const changeEvent = (evnt: Event, selectValue: any, node: any) => {
559
- const value = XEUtils.isArray(selectValue) ? selectValue.map(deModelValue) : deModelValue(selectValue)
560
- emitModel(value)
561
- if (value !== props.modelValue) {
562
- dispatchEvent('change', { value, node, option: node }, evnt)
563
- // 自动更新校验状态
564
- if ($xeForm && formItemInfo) {
565
- $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
566
- }
567
- }
568
- }
569
-
570
- const clearValueEvent = (evnt: Event, selectValue: any) => {
571
- changeEvent(evnt, selectValue, null)
572
- dispatchEvent('clear', { value: selectValue }, evnt)
573
- }
574
-
575
- const clearEvent: VxeInputEvents.Clear = (params) => {
576
- const { $event } = params
577
- clearValueEvent($event, null)
578
- hideOptionPanel($event)
579
- }
580
-
581
- const allCheckedPanelEvent: VxeButtonEvents.Click = (params) => {
582
- const { $event } = params
583
- const { multiple, autoClose, checkedClosable } = props
584
- const $tree = refTree.value
585
- if (multiple) {
586
- if ($tree) {
587
- $tree.setAllCheckboxNode(true).then(({ checkNodeKeys, checkNodes }) => {
588
- changeEvent($event, checkNodeKeys, checkNodes[0])
589
- dispatchEvent('all-change', { value: checkNodeKeys }, $event)
590
- if (XEUtils.isBoolean(checkedClosable) ? checkedClosable : autoClose) {
591
- hideOptionPanel($event)
592
- }
593
- })
594
- }
595
- }
596
- }
597
-
598
- const clearCheckedPanelEvent: VxeButtonEvents.Click = (params) => {
599
- const { $event } = params
600
- const { multiple, autoClose, clearClosable } = props
601
- const $tree = refTree.value
602
- if ($tree) {
603
- const value = multiple ? [] : null
604
- $tree.clearCheckboxNode().then(() => {
605
- if (XEUtils.isBoolean(clearClosable) ? clearClosable : autoClose) {
606
- hideOptionPanel($event)
607
- }
608
- })
609
- changeEvent($event, value, null)
610
- dispatchEvent('clear', { value }, $event)
611
- }
612
- }
613
-
614
- const closePanelEvent: VxeButtonEvents.Click = (params) => {
615
- const { $event } = params
616
- hideOptionPanel($event)
617
- }
618
-
619
- const allExpandPanelEvent: VxeButtonEvents.Click = () => {
620
- const $tree = refTree.value
621
- if ($tree) {
622
- $tree.setAllExpandNode(true)
623
- }
624
- }
625
-
626
- const clearExpandPanelEvent: VxeButtonEvents.Click = () => {
627
- const $tree = refTree.value
628
- if ($tree) {
629
- $tree.clearAllExpandNode()
630
- }
631
- }
632
-
633
- const handleGlobalMousedownEvent = (evnt: MouseEvent) => {
634
- const { visiblePanel } = reactData
635
- const isDisabled = computeIsDisabled.value
636
- if (!isDisabled) {
637
- const el = refElem.value
638
- const panelElem = refOptionPanel.value
639
- reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelElem).flag
640
- if (visiblePanel && !reactData.isActivated) {
641
- hideOptionPanel(evnt)
642
- }
643
- }
644
- }
645
-
646
- const handleGlobalBlurEvent = (evnt: Event) => {
647
- const { visiblePanel, isActivated } = reactData
648
- if (visiblePanel) {
649
- hideOptionPanel(evnt)
650
- }
651
- if (isActivated) {
652
- reactData.isActivated = false
653
- }
654
- if (visiblePanel || isActivated) {
655
- const $input = refInput.value
656
- if ($input) {
657
- $input.blur()
658
- }
659
- }
660
- }
661
-
662
- const handleGlobalResizeEvent = () => {
663
- const { visiblePanel } = reactData
664
- if (visiblePanel) {
665
- updatePlacement()
666
- }
667
- }
668
-
669
- const handleGlobalScrollEvent = () => {
670
- const { visiblePanel } = reactData
671
- if (visiblePanel) {
672
- updatePlacement()
673
- }
674
- }
675
-
676
- const handleFocusSearch = () => {
677
- if (props.filterable) {
678
- nextTick(() => {
679
- const inpSearch = refInpSearch.value
680
- if (inpSearch) {
681
- inpSearch.focus()
682
- }
683
- })
684
- }
685
- }
686
-
687
- const focusEvent = (evnt: FocusEvent) => {
688
- const isDisabled = computeIsDisabled.value
689
- if (!isDisabled) {
690
- if (!reactData.visiblePanel) {
691
- reactData.triggerFocusPanel = true
692
- showOptionPanel(evnt)
693
- setTimeout(() => {
694
- reactData.triggerFocusPanel = false
695
- }, 150)
696
- }
697
- }
698
- dispatchEvent('focus', {}, evnt)
699
- }
700
-
701
- const clickEvent = (evnt: MouseEvent) => {
702
- togglePanelEvent(evnt)
703
- dispatchEvent('click', {}, evnt)
704
- }
705
-
706
- const blurEvent = (evnt: FocusEvent) => {
707
- reactData.isActivated = false
708
- dispatchEvent('blur', {}, evnt)
709
- }
710
-
711
- const modelSearchEvent = (value: string) => {
712
- reactData.searchValue = value
713
- }
714
-
715
- const handleSearchEvent = () => {
716
- const { modelValue, remote, remoteMethod } = props
717
- const { searchValue } = reactData
718
- const remoteOpts = computeRemoteOpts.value
719
- const queryMethod = remoteOpts.queryMethod || remoteMethod
720
- if (remote && queryMethod && remoteOpts.enabled) {
721
- reactData.searchLoading = true
722
- Promise.resolve(
723
- queryMethod({ $treeSelect: $xeTreeSelect, searchValue, value: modelValue })
724
- ).then(() => nextTick())
725
- .catch(() => nextTick())
726
- .finally(() => {
727
- reactData.searchLoading = false
728
- })
729
- }
730
- }
731
-
732
- const togglePanelEvent = (params: any) => {
733
- const { $event } = params
734
- $event.preventDefault()
735
- if (reactData.triggerFocusPanel) {
736
- reactData.triggerFocusPanel = false
737
- } else {
738
- if (reactData.visiblePanel) {
739
- hideOptionPanel($event)
740
- } else {
741
- showOptionPanel($event)
742
- }
743
- }
744
- }
745
-
746
- const nodeExpandEvent = () => {
747
- updatePlacement()
748
- }
749
-
750
- const nodeClickEvent: VxeTreeEvents.NodeClick = (params) => {
751
- const { $event } = params
752
- dispatchEvent('node-click', params, $event)
753
- }
754
-
755
- const radioChangeEvent: VxeTreeEvents.RadioChange = (params) => {
756
- const { value, $event, node } = params
757
- changeEvent($event, value, node)
758
- hideOptionPanel($event)
759
- }
760
-
761
- const checkboxChangeEvent: VxeTreeEvents.CheckboxChange = (params) => {
762
- const { value, $event, node } = params
763
- changeEvent($event, value, node)
764
- }
765
-
766
- const loadSuccessEvent = () => {
767
- cacheDataMap()
768
- }
769
-
770
- const treeSelectPrivateMethods: TreeSelectPrivateMethods = {
771
- }
772
-
773
- Object.assign($xeTreeSelect, treeSelectMethods, treeSelectPrivateMethods)
774
-
775
- const renderVN = () => {
776
- const { className, modelValue, multiple, options, loading, menuConfig, filterable, showTotalButton, showCheckedButton, showClearButton, showExpandButton, showCloseButton } = props
777
- const { initialized, isActivated, isAniVisible, visiblePanel, searchValue } = reactData
778
- const vSize = computeSize.value
779
- const isDisabled = computeIsDisabled.value
780
- const selectLabel = computeSelectLabel.value
781
- const btnTransfer = computeBtnTransfer.value
782
- const formReadonly = computeFormReadonly.value
783
- const popupWrapperStyle = computePopupWrapperStyle.value
784
- const headerSlot = slots.header
785
- const footerSlot = slots.footer
786
- const prefixSlot = slots.prefix
787
- const popupOpts = computePopupOpts.value
788
- const { appendTo } = popupOpts
789
- const ppClassName = popupOpts.className || props.popupClassName
790
-
791
- if (formReadonly) {
792
- return h('div', {
793
- ref: refElem,
794
- class: ['vxe-tree-select--readonly', className]
795
- }, [
796
- h('span', {
797
- class: 'vxe-tree-select-label'
798
- }, selectLabel)
799
- ])
800
- }
801
- const treeOpts = computeTreeOpts.value
802
- const menuOpts = computeMenuOpts.value
803
- const treeNodeOpts = computeTreeNodeOpts.value
804
- const treeCheckboxOpts = computeTreeCheckboxOpts.value
805
- const treeRadioOpts = computeTreeRadioOpts.value
806
- const nodeKeyField = computeNodeKeyField.value
807
- const labelField = computeLabelField.value
808
- const valueField = computeValueField.value
809
- const childrenField = computeChildrenField.value
810
- const nodeParentField = computeNodeParentField.value
811
- const hasChildField = computeHasChildField.value
812
- const virtualYOpts = computeVirtualYOpts.value
813
- const filterOpts = computeFilterOpts.value
814
- const { slots: treeSlots } = treeOpts
815
- const selectVals = XEUtils.eqNull(modelValue) ? [] : (XEUtils.isArray(modelValue) ? modelValue : [modelValue])
816
- const treeScopedSlots: {
817
- icon?: (params: any) => VNode[]
818
- title?: (params: any) => VNode[]
819
- extra?: (params: any) => VNode[]
820
- } = {}
821
- if (treeSlots) {
822
- const { icon: treeIconSlot, title: treeTitleSlot, extra: treeExtraSlot } = treeSlots
823
- if (treeIconSlot) {
824
- treeScopedSlots.icon = (slotParams) => callSlot(treeIconSlot, slotParams) as VNode[]
825
- }
826
- if (treeTitleSlot) {
827
- treeScopedSlots.title = (slotParams) => callSlot(treeTitleSlot, slotParams) as VNode[]
828
- }
829
- if (treeExtraSlot) {
830
- treeScopedSlots.extra = (slotParams) => callSlot(treeExtraSlot, slotParams) as VNode[]
831
- }
832
- }
833
- return h('div', {
834
- ref: refElem,
835
- class: ['vxe-tree-select', className ? (XEUtils.isFunction(className) ? className({ $treeSelect: $xeTreeSelect }) : className) : '', {
836
- [`size--${vSize}`]: vSize,
837
- 'is--filterable': filterable,
838
- 'is--visible': visiblePanel,
839
- 'is--disabled': isDisabled,
840
- 'is--loading': loading,
841
- 'is--active': isActivated
842
- }]
843
- }, [
844
- h(VxeInputComponent, {
845
- ref: refInput,
846
- clearable: props.clearable,
847
- placeholder: loading ? getI18n('vxe.select.loadingText') : props.placeholder,
848
- editable: false,
849
- disabled: isDisabled,
850
- type: 'text',
851
- prefixIcon: props.prefixIcon,
852
- suffixIcon: loading ? getIcon().TREE_SELECT_LOADED : (visiblePanel ? getIcon().TREE_SELECT_OPEN : getIcon().TREE_SELECT_CLOSE),
853
- modelValue: loading ? '' : selectLabel,
854
- title: selectLabel,
855
- onClear: clearEvent,
856
- onClick: clickEvent,
857
- onFocus: focusEvent,
858
- onBlur: blurEvent,
859
- onSuffixClick: togglePanelEvent
860
- }, prefixSlot
861
- ? {
862
- prefix: () => prefixSlot({})
863
- }
864
- : {}),
865
- h(Teleport, {
866
- to: getPopupContainer(appendTo),
867
- disabled: btnTransfer ? !initialized : true
868
- }, [
869
- h('div', {
870
- ref: refOptionPanel,
871
- class: ['vxe-table--ignore-clear vxe-tree-select--panel', ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $treeSelect: $xeTreeSelect }) : ppClassName) : '', {
872
- [`size--${vSize}`]: vSize,
873
- 'is--transfer': btnTransfer,
874
- 'ani--leave': !loading && isAniVisible,
875
- 'ani--enter': !loading && visiblePanel
876
- }],
877
- placement: reactData.panelPlacement,
878
- style: reactData.panelStyle
879
- }, initialized
880
- ? [
881
- h('div', {
882
- class: 'vxe-tree-select--panel-wrapper'
883
- }, [
884
- filterable
885
- ? h('div', {
886
- class: 'vxe-tree-select--panel-search'
887
- }, [
888
- h(VxeInputComponent, {
889
- ref: refInpSearch,
890
- class: 'vxe-tree-select-search--input',
891
- modelValue: searchValue,
892
- clearable: true,
893
- disabled: false,
894
- readonly: false,
895
- placeholder: getI18n('vxe.treeSelect.search'),
896
- prefixIcon: getIcon().INPUT_SEARCH,
897
- 'onUpdate:modelValue': modelSearchEvent
898
- })
899
- ])
900
- : renderEmptyElement($xeTreeSelect),
901
- (showCheckedButton && multiple) || showClearButton || showExpandButton || headerSlot
902
- ? h('div', {
903
- class: 'vxe-tree-select--panel-header'
904
- }, headerSlot
905
- ? headerSlot({})
906
- : [
907
- h('div', {
908
- class: 'vxe-tree-select--header-button'
909
- }, [
910
- (showCheckedButton && multiple) || showClearButton
911
- ? h('div', {
912
- class: 'vxe-tree-select--selected-btns'
913
- }, [
914
- (showCheckedButton && multiple)
915
- ? h(VxeButtonComponent, {
916
- content: getI18n('vxe.treeSelect.allChecked'),
917
- mode: 'text',
918
- onClick: allCheckedPanelEvent
919
- })
920
- : renderEmptyElement($xeTreeSelect),
921
- showClearButton
922
- ? h(VxeButtonComponent, {
923
- content: getI18n('vxe.treeSelect.clearChecked'),
924
- mode: 'text',
925
- onClick: clearCheckedPanelEvent
926
- })
927
- : renderEmptyElement($xeTreeSelect)
928
- ])
929
- : renderEmptyElement($xeTreeSelect),
930
- showExpandButton
931
- ? h('div', {
932
- class: 'vxe-tree-select--expand-btns'
933
- }, [
934
- h(VxeButtonComponent, {
935
- content: getI18n('vxe.treeSelect.allExpand'),
936
- mode: 'text',
937
- onClick: allExpandPanelEvent
938
- }),
939
- h(VxeButtonComponent, {
940
- content: getI18n('vxe.treeSelect.clearExpand'),
941
- mode: 'text',
942
- onClick: clearExpandPanelEvent
943
- })
944
- ])
945
- : renderEmptyElement($xeTreeSelect)
946
- ])
947
- ])
948
- : renderEmptyElement($xeTreeSelect),
949
- h('div', {
950
- class: 'vxe-tree-select--panel-body'
951
- }, [
952
- h('div', {
953
- ref: refTreeWrapper,
954
- class: 'vxe-tree-select-tree--wrapper',
955
- style: popupWrapperStyle
956
- }, [
957
- h(VxeTreeComponent, {
958
- ref: refTree,
959
- class: 'vxe-tree-select--tree',
960
- height: popupOpts.height ? '100%' : treeOpts.height,
961
- minHeight: treeOpts.minHeight,
962
- maxHeight: popupOpts.height ? '' : treeOpts.maxHeight,
963
- autoResize: true,
964
- data: options,
965
- indent: treeOpts.indent,
966
- showRadio: !multiple,
967
- radioConfig: treeRadioOpts,
968
- checkNodeKey: multiple ? null : modelValue,
969
- showCheckbox: !!multiple,
970
- checkNodeKeys: multiple ? modelValue : null,
971
- checkboxConfig: treeCheckboxOpts,
972
- titleField: labelField,
973
- valueField: valueField,
974
- keyField: nodeKeyField,
975
- childrenField: treeOpts.childrenField || childrenField,
976
- parentField: nodeParentField,
977
- hasChildField: treeOpts.hasChildField || hasChildField,
978
- accordion: treeOpts.accordion,
979
- expandAll: treeOpts.expandAll,
980
- expandNodeKeys: treeOpts.expandNodeKeys,
981
- nodeConfig: treeNodeOpts,
982
- lazy: treeOpts.lazy,
983
- loadMethod: treeOpts.loadMethod,
984
- toggleMethod: treeOpts.toggleMethod,
985
- transform: treeOpts.transform,
986
- rootParentValue: treeOpts.rootParentValue,
987
- rootValues: treeOpts.rootValues,
988
- trigger: treeOpts.trigger,
989
- showIcon: treeOpts.showIcon,
990
- showLine: treeOpts.showLine,
991
- iconOpen: treeOpts.iconOpen,
992
- iconLoaded: treeOpts.iconLoaded,
993
- iconClose: treeOpts.iconClose,
994
- filterValue: searchValue,
995
- filterConfig: filterOpts,
996
- menuConfig: menuConfig ? menuOpts : undefined,
997
- virtualYConfig: virtualYOpts,
998
- onNodeExpand: nodeExpandEvent,
999
- onNodeClick: nodeClickEvent,
1000
- onRadioChange: radioChangeEvent,
1001
- onCheckboxChange: checkboxChangeEvent,
1002
- onLoadSuccess: loadSuccessEvent
1003
- }, treeScopedSlots)
1004
- ])
1005
- ]),
1006
- footerSlot || showTotalButton || showCloseButton
1007
- ? h('div', {
1008
- class: 'vxe-tree-select--panel-footer'
1009
- }, footerSlot
1010
- ? footerSlot({})
1011
- : [
1012
- h('div', {
1013
- class: 'vxe-tree-select--footer-button'
1014
- }, [
1015
- showTotalButton
1016
- ? h('div', {
1017
- class: 'vxe-tree-select--total-btns'
1018
- }, getI18n('vxe.treeSelect.total', [selectVals.length]))
1019
- : renderEmptyElement($xeTreeSelect),
1020
- showCloseButton
1021
- ? h('div', {
1022
- class: 'vxe-tree-select--oper-btns'
1023
- }, [
1024
- h(VxeButtonComponent, {
1025
- content: getI18n('vxe.select.close'),
1026
- mode: 'text',
1027
- onClick: closePanelEvent
1028
- })
1029
- ])
1030
- : renderEmptyElement($xeTreeSelect)
1031
- ])
1032
- ])
1033
- : renderEmptyElement($xeTreeSelect)
1034
- ])
1035
- ]
1036
- : [])
1037
- ])
1038
- ])
1039
- }
1040
-
1041
- const optFlag = ref(0)
1042
- watch(() => props.options ? props.options.length : -1, () => {
1043
- optFlag.value++
1044
- })
1045
- watch(() => props.options, () => {
1046
- optFlag.value++
1047
- })
1048
- watch(optFlag, () => {
1049
- cacheDataMap()
1050
- })
1051
-
1052
- const lazyOptFlag = ref(0)
1053
- watch(() => props.lazyOptions ? props.lazyOptions.length : -1, () => {
1054
- lazyOptFlag.value++
1055
- })
1056
- watch(() => props.lazyOptions, () => {
1057
- lazyOptFlag.value++
1058
- })
1059
- watch(lazyOptFlag, () => {
1060
- cacheLazyDataMap()
1061
- })
1062
-
1063
- cacheDataMap()
1064
- cacheLazyDataMap()
1065
-
1066
- onMounted(() => {
1067
- if (XEUtils.isBoolean(props.autoClose)) {
1068
- warnLog('vxe.error.delProp', ['auto-close', 'checked-closable | clear-closable'])
1069
- }
1070
- globalEvents.on($xeTreeSelect, 'mousedown', handleGlobalMousedownEvent)
1071
- globalEvents.on($xeTreeSelect, 'blur', handleGlobalBlurEvent)
1072
- globalEvents.on($xeTreeSelect, 'resize', handleGlobalResizeEvent)
1073
- globalEvents.on($xeTreeSelect, 'scroll', handleGlobalScrollEvent)
1074
- })
1075
-
1076
- onBeforeUnmount(() => {
1077
- globalEvents.off($xeTreeSelect, 'mousedown')
1078
- globalEvents.off($xeTreeSelect, 'blur')
1079
- globalEvents.off($xeTreeSelect, 'resize')
1080
- globalEvents.off($xeTreeSelect, 'scroll')
1081
- XEUtils.assign(reactData, createReactData())
1082
- XEUtils.assign(internalData, createInternalData())
1083
- })
1084
-
1085
- provide('$xeTreeSelect', $xeTreeSelect)
1086
-
1087
- $xeTreeSelect.renderVN = renderVN
1088
-
1089
- return $xeTreeSelect
1090
- },
1091
- render () {
1092
- return this.renderVN()
1093
- }
1094
- })
1
+ import { ref, computed, h, PropType, nextTick, inject, provide, reactive, Teleport, onMounted, onBeforeUnmount, watch, VNode } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import { VxeUI } from '@vxe-ui/core'
4
+ import { getEventTargetNode, updatePanelPlacement, toCssUnit, getPopupContainer } from '../../ui/src/dom'
5
+ import { getLastZIndex, nextZIndex, deModelValue } from '../../ui/src/utils'
6
+ import { createComponentLog } from '../../ui/src/log'
7
+ import { getSlotVNs } from '../../ui/src/vn'
8
+ import XEUtils from 'xe-utils'
9
+ import VxeInputComponent from '../../input'
10
+ import VxeButtonComponent from '../../button'
11
+ import VxeTreeComponent from '../../tree'
12
+
13
+ import type {
14
+ TreeSelectReactData,
15
+ VxeTreeSelectEmits,
16
+ TreeSelectInternalData,
17
+ VxeButtonEvents,
18
+ VxeInputEvents,
19
+ ValueOf,
20
+ VxeComponentStyleType,
21
+ TreeSelectPrivateRef,
22
+ TreeSelectPrivateMethods,
23
+ TreeSelectMethods,
24
+ VxeTreeSelectPrivateComputed,
25
+ VxeTreeSelectPropTypes,
26
+ VxeTreeSelectConstructor,
27
+ VxeFormDefines,
28
+ VxeDrawerConstructor,
29
+ VxeDrawerMethods,
30
+ VxeTreeSelectPrivateMethods,
31
+ VxeFormConstructor,
32
+ VxeFormPrivateMethods,
33
+ VxeInputConstructor,
34
+ VxeModalConstructor,
35
+ VxeModalMethods,
36
+ VxeTreeConstructor,
37
+ VxeTreeEvents,
38
+ VxeTreeSelectDefines
39
+ } from '../../../types'
40
+ import type { VxeTableConstructor, VxeTablePrivateMethods } from '../../../types/components/table'
41
+
42
+ const { getConfig, getI18n, getIcon, globalEvents, createEvent, useFns, renderEmptyElement } = VxeUI
43
+
44
+ const { warnLog, errLog } = createComponentLog('tree-select')
45
+
46
+ function getOptUniqueId() {
47
+ return XEUtils.uniqueId('node_')
48
+ }
49
+
50
+ function createReactData(): TreeSelectReactData {
51
+ return {
52
+ initialized: false,
53
+ searchValue: '',
54
+ searchLoading: false,
55
+ panelIndex: 0,
56
+ panelStyle: {},
57
+ panelPlacement: null,
58
+ triggerFocusPanel: false,
59
+ visiblePanel: false,
60
+ isAniVisible: false,
61
+ isActivated: false,
62
+ fullOptFlag: 1,
63
+ lazyOptFlag: 1
64
+ }
65
+ }
66
+
67
+ function createInternalData(): TreeSelectInternalData {
68
+ return {
69
+ // hpTimeout: undefined,
70
+ fullOptionList: [],
71
+ fullNodeMaps: {},
72
+ lazyNodeMaps: {}
73
+ }
74
+ }
75
+
76
+ export default defineVxeComponent({
77
+ name: 'VxeTreeSelect',
78
+ props: {
79
+ modelValue: [String, Number, Array] as PropType<VxeTreeSelectPropTypes.ModelValue>,
80
+ clearable: {
81
+ type: Boolean as PropType<VxeTreeSelectPropTypes.Clearable>,
82
+ default: () => getConfig().treeSelect.clearable
83
+ },
84
+ placeholder: {
85
+ type: String as PropType<VxeTreeSelectPropTypes.Placeholder>,
86
+ default: () => (XEUtils.eqNull(getConfig().treeSelect.placeholder) ? getI18n('vxe.base.pleaseSelect') : getConfig().treeSelect.placeholder)
87
+ },
88
+ readonly: {
89
+ type: Boolean as PropType<VxeTreeSelectPropTypes.Readonly>,
90
+ default: null
91
+ },
92
+ loading: Boolean as PropType<VxeTreeSelectPropTypes.Loading>,
93
+ disabled: {
94
+ type: Boolean as PropType<VxeTreeSelectPropTypes.Disabled>,
95
+ default: null
96
+ },
97
+ showFullLabel: {
98
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowFullLabel>,
99
+ default: () => getConfig().treeSelect.showFullLabel
100
+ },
101
+ separator: {
102
+ type: String as PropType<VxeTreeSelectPropTypes.Separator>,
103
+ default: () => getConfig().treeSelect.separator
104
+ },
105
+ filterable: Boolean as PropType<VxeTreeSelectPropTypes.Filterable>,
106
+ filterConfig: Object as PropType<VxeTreeSelectPropTypes.FilterConfig>,
107
+ multiple: Boolean as PropType<VxeTreeSelectPropTypes.Multiple>,
108
+ className: [String, Function] as PropType<VxeTreeSelectPropTypes.ClassName>,
109
+ /**
110
+ * 已废弃,请使用 popupConfig.className
111
+ * @deprecated
112
+ */
113
+ popupClassName: [String, Function] as PropType<VxeTreeSelectPropTypes.PopupClassName>,
114
+ prefixIcon: String as PropType<VxeTreeSelectPropTypes.PrefixIcon>,
115
+ placement: String as PropType<VxeTreeSelectPropTypes.Placement>,
116
+ lazyOptions: Array as PropType<VxeTreeSelectPropTypes.LazyOptions>,
117
+ options: Array as PropType<VxeTreeSelectPropTypes.Options>,
118
+ optionProps: Object as PropType<VxeTreeSelectPropTypes.OptionProps>,
119
+ /**
120
+ * 已废弃,请使用 popupConfig.zIndex
121
+ * @deprecated
122
+ */
123
+ zIndex: Number as PropType<VxeTreeSelectPropTypes.ZIndex>,
124
+ size: {
125
+ type: String as PropType<VxeTreeSelectPropTypes.Size>,
126
+ default: () => getConfig().treeSelect.size || getConfig().size
127
+ },
128
+ remote: Boolean as PropType<VxeTreeSelectPropTypes.Remote>,
129
+ remoteConfig: Object as PropType<VxeTreeSelectPropTypes.RemoteConfig>,
130
+ showRadio: {
131
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowRadio>,
132
+ default: () => getConfig().treeSelect.showRadio
133
+ },
134
+ radioConfig: Object as PropType<VxeTreeSelectPropTypes.RadioConfig>,
135
+ showCheckbox: {
136
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowCheckbox>,
137
+ default: () => getConfig().treeSelect.showCheckbox
138
+ },
139
+ checkboxConfig: Object as PropType<VxeTreeSelectPropTypes.CheckboxConfig>,
140
+ popupConfig: Object as PropType<VxeTreeSelectPropTypes.PopupConfig>,
141
+ treeConfig: Object as PropType<VxeTreeSelectPropTypes.TreeConfig>,
142
+ menuConfig: Object as PropType<VxeTreeSelectPropTypes.MenuConfig>,
143
+ virtualYConfig: Object as PropType<VxeTreeSelectPropTypes.VirtualYConfig>,
144
+ /**
145
+ * 已废弃,被 checked-closable, clear-closable 替换
146
+ * @deprecated
147
+ */
148
+ autoClose: {
149
+ type: Boolean as PropType<VxeTreeSelectPropTypes.AutoClose>,
150
+ default: () => getConfig().treeSelect.autoClose
151
+ },
152
+ checkedClosable: {
153
+ type: Boolean as PropType<VxeTreeSelectPropTypes.CheckedClosable>,
154
+ default: () => getConfig().treeSelect.checkedClosable
155
+ },
156
+ clearClosable: {
157
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ClearClosable>,
158
+ default: () => getConfig().treeSelect.clearClosable
159
+ },
160
+ showCloseButton: {
161
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowCloseButton>,
162
+ default: () => getConfig().treeSelect.showCloseButton
163
+ },
164
+ showTotalButton: {
165
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowTotalButton>,
166
+ default: () => getConfig().treeSelect.showTotalButton
167
+ },
168
+ showCheckedButton: {
169
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowCheckedButton>,
170
+ default: () => getConfig().treeSelect.showCheckedButton
171
+ },
172
+ showClearButton: {
173
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowClearButton>,
174
+ default: () => getConfig().treeSelect.showClearButton
175
+ },
176
+ showExpandButton: {
177
+ type: Boolean as PropType<VxeTreeSelectPropTypes.ShowExpandButton>,
178
+ default: () => getConfig().treeSelect.showExpandButton
179
+ },
180
+ transfer: {
181
+ type: Boolean as PropType<VxeTreeSelectPropTypes.Transfer>,
182
+ default: null
183
+ },
184
+
185
+ /**
186
+ * 已废弃,被 remote-config.queryMethod 替换
187
+ * @deprecated
188
+ */
189
+ remoteMethod: Function as PropType<VxeTreeSelectPropTypes.RemoteMethod>
190
+ },
191
+ emits: ['update:modelValue', 'change', 'all-change', 'clear', 'blur', 'focus', 'click', 'node-click', 'visible-change'] as VxeTreeSelectEmits,
192
+ setup(props, context) {
193
+ const { emit, slots } = context
194
+
195
+ const $xeModal = inject<(VxeModalConstructor & VxeModalMethods) | null>('$xeModal', null)
196
+ const $xeDrawer = inject<(VxeDrawerConstructor & VxeDrawerMethods) | null>('$xeDrawer', null)
197
+ const $xeTable = inject<(VxeTableConstructor & VxeTablePrivateMethods) | null>('$xeTable', null)
198
+ const $xeForm = inject<(VxeFormConstructor & VxeFormPrivateMethods) | null>('$xeForm', null)
199
+ const formItemInfo = inject<VxeFormDefines.ProvideItemInfo | null>('xeFormItemInfo', null)
200
+
201
+ const xID = XEUtils.uniqueId()
202
+
203
+ const { computeSize } = useFns.useSize(props)
204
+
205
+ const refElem = ref<HTMLDivElement>()
206
+ const refInput = ref<VxeInputConstructor>()
207
+ const refInpSearch = ref<VxeInputConstructor>()
208
+ const refTreeWrapper = ref<HTMLDivElement>()
209
+ const refOptionPanel = ref<HTMLDivElement>()
210
+ const refTree = ref<VxeTreeConstructor>()
211
+
212
+ const reactData = reactive(createReactData())
213
+
214
+ const internalData = createInternalData()
215
+
216
+ const refMaps: TreeSelectPrivateRef = {
217
+ refElem
218
+ }
219
+
220
+ const computeFormReadonly = computed(() => {
221
+ const { readonly } = props
222
+ if (readonly === null) {
223
+ if ($xeForm) {
224
+ return $xeForm.props.readonly
225
+ }
226
+ return false
227
+ }
228
+ return readonly
229
+ })
230
+
231
+ const computeIsDisabled = computed(() => {
232
+ const { disabled } = props
233
+ if (disabled === null) {
234
+ if ($xeForm) {
235
+ return $xeForm.props.disabled
236
+ }
237
+ return false
238
+ }
239
+ return disabled
240
+ })
241
+
242
+ const computeBtnTransfer = computed(() => {
243
+ const popupOpts = computePopupOpts.value
244
+ const { transfer } = popupOpts
245
+ if (XEUtils.isBoolean(transfer)) {
246
+ return transfer
247
+ }
248
+ if (props.transfer === null) {
249
+ const globalTransfer = getConfig().treeSelect.transfer
250
+ if (XEUtils.isBoolean(globalTransfer)) {
251
+ return globalTransfer
252
+ }
253
+ if ($xeTable || $xeModal || $xeDrawer || $xeForm) {
254
+ return true
255
+ }
256
+ }
257
+ return props.transfer
258
+ })
259
+
260
+ const computePopupOpts = computed(() => {
261
+ return Object.assign({}, getConfig().treeSelect.popupConfig, props.popupConfig)
262
+ })
263
+
264
+ const computeTreeOpts = computed(() => {
265
+ return Object.assign({}, getConfig().treeSelect.treeConfig, props.treeConfig, { data: undefined })
266
+ })
267
+
268
+ const computeMenuOpts = computed(() => {
269
+ return Object.assign({}, getConfig().treeSelect.menuConfig, props.menuConfig)
270
+ })
271
+
272
+ const computeTreeNodeOpts = computed(() => {
273
+ const treeOpts = computeTreeOpts.value
274
+ return Object.assign({ isHover: true }, treeOpts.nodeConfig)
275
+ })
276
+
277
+ const computeTreeCheckboxOpts = computed(() => {
278
+ const { showCheckbox, checkboxConfig } = props
279
+ const treeOpts = computeTreeOpts.value
280
+ return Object.assign(
281
+ {
282
+ showIcon: XEUtils.isBoolean(showCheckbox) ? showCheckbox : !!treeOpts.showCheckbox
283
+ },
284
+ treeOpts.checkboxConfig,
285
+ checkboxConfig,
286
+ {
287
+ trigger: 'node'
288
+ }
289
+ )
290
+ })
291
+
292
+ const computeTreeRadioOpts = computed(() => {
293
+ const { showRadio, radioConfig } = props
294
+ const treeOpts = computeTreeOpts.value
295
+ return Object.assign(
296
+ {
297
+ showIcon: XEUtils.isBoolean(showRadio) ? showRadio : !!treeOpts.showRadio
298
+ },
299
+ treeOpts.radioConfig,
300
+ radioConfig,
301
+ {
302
+ trigger: 'node'
303
+ }
304
+ )
305
+ })
306
+
307
+ const computePropsOpts = computed(() => {
308
+ return Object.assign({}, getConfig().treeSelect.optionProps, props.optionProps)
309
+ })
310
+
311
+ const computeNodeKeyField = computed(() => {
312
+ const treeOpts = computeTreeOpts.value
313
+ return treeOpts.keyField || 'id'
314
+ })
315
+
316
+ const computeLabelField = computed(() => {
317
+ const propsOpts = computePropsOpts.value
318
+ return propsOpts.label || 'label'
319
+ })
320
+
321
+ const computeValueField = computed(() => {
322
+ const propsOpts = computePropsOpts.value
323
+ return propsOpts.value || 'value'
324
+ })
325
+
326
+ const computeChildrenField = computed(() => {
327
+ const propsOpts = computePropsOpts.value
328
+ return propsOpts.children || 'children'
329
+ })
330
+
331
+ const computeNodeParentField = computed(() => {
332
+ const propsOpts = computePropsOpts.value
333
+ const treeOpts = computeTreeOpts.value
334
+ return propsOpts.parent || treeOpts.parentField || 'parentId'
335
+ })
336
+
337
+ const computeHasChildField = computed(() => {
338
+ const propsOpts = computePropsOpts.value
339
+ return propsOpts.hasChild || 'hasChild'
340
+ })
341
+
342
+ const computeVirtualYOpts = computed(() => {
343
+ return Object.assign({} as { gt: number }, getConfig().treeSelect.virtualYConfig, props.virtualYConfig)
344
+ })
345
+
346
+ const computeRemoteOpts = computed(() => {
347
+ return Object.assign({}, getConfig().treeSelect.remoteConfig, props.remoteConfig)
348
+ })
349
+
350
+ const computeFilterOpts = computed(() => {
351
+ const treeOpts = computeTreeOpts.value
352
+ return Object.assign({}, treeOpts.filterConfig, props.filterConfig)
353
+ })
354
+
355
+ const computeSelectVals = computed(() => {
356
+ const { modelValue } = props
357
+ return XEUtils.eqNull(modelValue) ? [] : XEUtils.isArray(modelValue) ? modelValue : [modelValue]
358
+ })
359
+
360
+ const computeSelectLabel = computed(() => {
361
+ const { showFullLabel } = props
362
+ const { fullOptFlag, lazyOptFlag } = reactData
363
+ const { fullNodeMaps, lazyNodeMaps } = internalData
364
+ const labelField = computeLabelField.value
365
+ const selectVals = computeSelectVals.value
366
+ return selectVals
367
+ .map((val) => {
368
+ const cacheItem = fullNodeMaps[val]
369
+ if (fullOptFlag && cacheItem) {
370
+ return showFullLabel ? cacheItem.fullLabel : cacheItem.item[labelField]
371
+ }
372
+ if (lazyOptFlag) {
373
+ const lazyCacheItem = lazyNodeMaps[val]
374
+ if (lazyCacheItem) {
375
+ return showFullLabel ? lazyCacheItem.fullLabel : lazyCacheItem.item[labelField]
376
+ }
377
+ }
378
+ return val
379
+ })
380
+ .join(', ')
381
+ })
382
+
383
+ const computePopupWrapperStyle = computed(() => {
384
+ const popupOpts = computePopupOpts.value
385
+ const { height, width } = popupOpts
386
+ const stys: VxeComponentStyleType = {}
387
+ if (width) {
388
+ stys.width = toCssUnit(width)
389
+ }
390
+ if (height) {
391
+ stys.height = toCssUnit(height)
392
+ stys.maxHeight = toCssUnit(height)
393
+ }
394
+ return stys
395
+ })
396
+
397
+ const computeMaps: VxeTreeSelectPrivateComputed = {}
398
+
399
+ const $xeTreeSelect = {
400
+ xID,
401
+ props,
402
+ context,
403
+ reactData,
404
+ internalData,
405
+
406
+ getRefMaps: () => refMaps,
407
+ getComputeMaps: () => computeMaps
408
+ } as unknown as VxeTreeSelectConstructor & VxeTreeSelectPrivateMethods
409
+
410
+ const dispatchEvent = (type: ValueOf<VxeTreeSelectEmits>, params: Record<string, any>, evnt: Event | null) => {
411
+ emit(type, createEvent(evnt, { $treeSelect: $xeTreeSelect }, params))
412
+ }
413
+
414
+ const emitModel = (value: any) => {
415
+ emit('update:modelValue', value)
416
+ }
417
+
418
+ const callSlot = (slotFunc: ((params: any) => any) | string | null, params: any) => {
419
+ if (slotFunc) {
420
+ if (XEUtils.isString(slotFunc)) {
421
+ slotFunc = slots[slotFunc] || null
422
+ }
423
+ if (XEUtils.isFunction(slotFunc)) {
424
+ return getSlotVNs(slotFunc(params))
425
+ }
426
+ }
427
+ return []
428
+ }
429
+
430
+ const treeSelectMethods: TreeSelectMethods = {
431
+ dispatchEvent
432
+ }
433
+
434
+ const getNodeid = (option: any) => {
435
+ const nodeKeyField = computeNodeKeyField.value
436
+ const nodeid = option[nodeKeyField]
437
+ return nodeid ? encodeURIComponent(nodeid) : ''
438
+ }
439
+
440
+ const handleCacheMap = (optList: VxeTreeSelectPropTypes.Options) => {
441
+ const { separator } = props
442
+ const treeOpts = computeTreeOpts.value
443
+ const nodeKeyField = computeNodeKeyField.value
444
+ const nodeParentField = computeNodeParentField.value
445
+ const childrenField = computeChildrenField.value
446
+ const valueField = computeValueField.value
447
+ const labelField = computeLabelField.value
448
+ const { transform } = treeOpts
449
+ const nodeMaps: Record<string, VxeTreeSelectDefines.NodeCacheObj> = {}
450
+ const keyMaps: Record<string, boolean> = {}
451
+ const handleOptNode = (item: any, index: number, items: any[], path: string[], parentItem: any, nodes: any[]) => {
452
+ let nodeid = getNodeid(item)
453
+ if (!nodeid) {
454
+ nodeid = getOptUniqueId()
455
+ }
456
+ if (keyMaps[nodeid]) {
457
+ errLog('vxe.error.repeatKey', [nodeKeyField, nodeid])
458
+ }
459
+ keyMaps[nodeid] = true
460
+ const value = item[valueField]
461
+ if (nodeMaps[value]) {
462
+ errLog('vxe.error.repeatKey', [valueField, value])
463
+ }
464
+ nodeMaps[value] = {
465
+ item,
466
+ index,
467
+ items,
468
+ parent: parentItem,
469
+ nodes,
470
+ fullLabel: nodes.map((item) => item[labelField]).join(separator || ' / ')
471
+ }
472
+ }
473
+ if (optList) {
474
+ if (transform) {
475
+ // if (showFullLabel) {
476
+ const treeList = XEUtils.toArrayTree(optList, {
477
+ key: nodeKeyField,
478
+ parentKey: nodeParentField,
479
+ mapChildren: childrenField,
480
+ rootParentValue: treeOpts.rootParentValue,
481
+ rootValues: treeOpts.rootValues
482
+ })
483
+ XEUtils.eachTree(treeList, handleOptNode, { children: childrenField })
484
+ // } else {
485
+ // optList.forEach((item, index, items) => {
486
+ // handleOptNode(item, index, items, [], null, [])
487
+ // })
488
+ // }
489
+ } else {
490
+ XEUtils.eachTree(optList, handleOptNode, { children: childrenField })
491
+ }
492
+ }
493
+ return nodeMaps
494
+ }
495
+
496
+ const cacheDataMap = () => {
497
+ const { options } = props
498
+ internalData.fullNodeMaps = handleCacheMap(options || [])
499
+ internalData.fullOptionList = options || []
500
+ reactData.fullOptFlag++
501
+ }
502
+
503
+ const cacheLazyDataMap = () => {
504
+ const { lazyOptions } = props
505
+ internalData.lazyNodeMaps = handleCacheMap(lazyOptions || [])
506
+ reactData.lazyOptFlag++
507
+ }
508
+
509
+ const updateZindex = () => {
510
+ const popupOpts = computePopupOpts.value
511
+ const customZIndex = popupOpts.zIndex || props.zIndex
512
+ if (customZIndex) {
513
+ reactData.panelIndex = XEUtils.toNumber(customZIndex)
514
+ } else if (reactData.panelIndex < getLastZIndex()) {
515
+ reactData.panelIndex = nextZIndex()
516
+ }
517
+ }
518
+
519
+ const updatePlacement = () => {
520
+ const { placement } = props
521
+ const { panelIndex } = reactData
522
+ const targetElem = refElem.value
523
+ const panelElem = refOptionPanel.value
524
+ const btnTransfer = computeBtnTransfer.value
525
+ const popupOpts = computePopupOpts.value
526
+ const handleStyle = () => {
527
+ const ppObj = updatePanelPlacement(targetElem, panelElem, {
528
+ isMinWidth: !popupOpts.width,
529
+ placement: popupOpts.placement || placement,
530
+ defaultPlacement: popupOpts.defaultPlacement,
531
+ appendTo: popupOpts.appendTo,
532
+ teleportTo: btnTransfer
533
+ })
534
+ const panelStyle: { [key: string]: string | number } = Object.assign(ppObj.style, {
535
+ zIndex: panelIndex
536
+ })
537
+ reactData.panelStyle = panelStyle
538
+ reactData.panelPlacement = ppObj.placement
539
+ }
540
+ handleStyle()
541
+ return nextTick().then(handleStyle)
542
+ }
543
+
544
+ const showOptionPanel = (evnt?: Event) => {
545
+ const { loading, remote, filterable } = props
546
+ const { fullOptionList } = internalData
547
+ const isDisabled = computeIsDisabled.value
548
+ const remoteOpts = computeRemoteOpts.value
549
+ if (!loading && !isDisabled) {
550
+ clearTimeout(internalData.hpTimeout)
551
+ if (!reactData.initialized) {
552
+ reactData.initialized = true
553
+ }
554
+ reactData.isActivated = true
555
+ reactData.isAniVisible = true
556
+ if (filterable) {
557
+ if (remote && remoteOpts.enabled && remoteOpts.autoLoad && !fullOptionList.length) {
558
+ handleSearchEvent()
559
+ }
560
+ }
561
+ setTimeout(() => {
562
+ reactData.visiblePanel = true
563
+ handleFocusSearch()
564
+ updatePlacement()
565
+ }, 10)
566
+ updateZindex()
567
+ updatePlacement()
568
+ dispatchEvent('visible-change', { visible: true }, evnt || null)
569
+ }
570
+ }
571
+
572
+ const hideOptionPanel = (evnt?: Event) => {
573
+ const { filterable } = props
574
+ const filterOpts = computeFilterOpts.value
575
+ if (filterable) {
576
+ if (filterOpts.clearOnClose) {
577
+ reactData.searchValue = ''
578
+ }
579
+ }
580
+ reactData.visiblePanel = false
581
+ internalData.hpTimeout = setTimeout(() => {
582
+ reactData.isAniVisible = false
583
+ }, 350)
584
+ dispatchEvent('visible-change', { visible: false }, evnt || null)
585
+ }
586
+
587
+ const changeEvent = (evnt: Event, selectValue: any, node: any) => {
588
+ const value = XEUtils.isArray(selectValue) ? selectValue.map(deModelValue) : deModelValue(selectValue)
589
+ emitModel(value)
590
+ if (value !== props.modelValue) {
591
+ dispatchEvent('change', { value, node, option: node }, evnt)
592
+ // 自动更新校验状态
593
+ if ($xeForm && formItemInfo) {
594
+ $xeForm.triggerItemEvent(evnt, formItemInfo.itemConfig.field, value)
595
+ }
596
+ }
597
+ }
598
+
599
+ const clearValueEvent = (evnt: Event, selectValue: any) => {
600
+ changeEvent(evnt, selectValue, null)
601
+ dispatchEvent('clear', { value: selectValue }, evnt)
602
+ }
603
+
604
+ const clearEvent: VxeInputEvents.Clear = (params) => {
605
+ const { $event } = params
606
+ clearValueEvent($event, null)
607
+ hideOptionPanel($event)
608
+ }
609
+
610
+ const allCheckedPanelEvent: VxeButtonEvents.Click = (params) => {
611
+ const { $event } = params
612
+ const { multiple, autoClose, checkedClosable } = props
613
+ const $tree = refTree.value
614
+ if (multiple) {
615
+ if ($tree) {
616
+ $tree.setAllCheckboxNode(true).then(({ checkNodeKeys, checkNodes }) => {
617
+ changeEvent($event, checkNodeKeys, checkNodes[0])
618
+ dispatchEvent('all-change', { value: checkNodeKeys }, $event)
619
+ if (XEUtils.isBoolean(checkedClosable) ? checkedClosable : autoClose) {
620
+ hideOptionPanel($event)
621
+ }
622
+ })
623
+ }
624
+ }
625
+ }
626
+
627
+ const clearCheckedPanelEvent: VxeButtonEvents.Click = (params) => {
628
+ const { $event } = params
629
+ const { multiple, autoClose, clearClosable } = props
630
+ const $tree = refTree.value
631
+ if ($tree) {
632
+ const value = multiple ? [] : null
633
+ $tree.clearCheckboxNode().then(() => {
634
+ if (XEUtils.isBoolean(clearClosable) ? clearClosable : autoClose) {
635
+ hideOptionPanel($event)
636
+ }
637
+ })
638
+ changeEvent($event, value, null)
639
+ dispatchEvent('clear', { value }, $event)
640
+ }
641
+ }
642
+
643
+ const closePanelEvent: VxeButtonEvents.Click = (params) => {
644
+ const { $event } = params
645
+ hideOptionPanel($event)
646
+ }
647
+
648
+ const allExpandPanelEvent: VxeButtonEvents.Click = () => {
649
+ const $tree = refTree.value
650
+ if ($tree) {
651
+ $tree.setAllExpandNode(true)
652
+ }
653
+ }
654
+
655
+ const clearExpandPanelEvent: VxeButtonEvents.Click = () => {
656
+ const $tree = refTree.value
657
+ if ($tree) {
658
+ $tree.clearAllExpandNode()
659
+ }
660
+ }
661
+
662
+ const handleGlobalMousedownEvent = (evnt: MouseEvent) => {
663
+ const { visiblePanel } = reactData
664
+ const isDisabled = computeIsDisabled.value
665
+ if (!isDisabled) {
666
+ const el = refElem.value
667
+ const panelElem = refOptionPanel.value
668
+ reactData.isActivated = getEventTargetNode(evnt, el).flag || getEventTargetNode(evnt, panelElem).flag
669
+ if (visiblePanel && !reactData.isActivated) {
670
+ hideOptionPanel(evnt)
671
+ }
672
+ }
673
+ }
674
+
675
+ const handleGlobalBlurEvent = (evnt: Event) => {
676
+ const { visiblePanel, isActivated } = reactData
677
+ if (visiblePanel) {
678
+ hideOptionPanel(evnt)
679
+ }
680
+ if (isActivated) {
681
+ reactData.isActivated = false
682
+ }
683
+ if (visiblePanel || isActivated) {
684
+ const $input = refInput.value
685
+ if ($input) {
686
+ $input.blur()
687
+ }
688
+ }
689
+ }
690
+
691
+ const handleGlobalResizeEvent = () => {
692
+ const { visiblePanel } = reactData
693
+ if (visiblePanel) {
694
+ updatePlacement()
695
+ }
696
+ }
697
+
698
+ const handleGlobalScrollEvent = () => {
699
+ const { visiblePanel } = reactData
700
+ if (visiblePanel) {
701
+ updatePlacement()
702
+ }
703
+ }
704
+
705
+ const handleFocusSearch = () => {
706
+ if (props.filterable) {
707
+ nextTick(() => {
708
+ const inpSearch = refInpSearch.value
709
+ if (inpSearch) {
710
+ inpSearch.focus()
711
+ }
712
+ })
713
+ }
714
+ }
715
+
716
+ const focusEvent = (evnt: FocusEvent) => {
717
+ const isDisabled = computeIsDisabled.value
718
+ if (!isDisabled) {
719
+ if (!reactData.visiblePanel) {
720
+ reactData.triggerFocusPanel = true
721
+ showOptionPanel(evnt)
722
+ setTimeout(() => {
723
+ reactData.triggerFocusPanel = false
724
+ }, 150)
725
+ }
726
+ }
727
+ dispatchEvent('focus', {}, evnt)
728
+ }
729
+
730
+ const clickEvent = (evnt: MouseEvent) => {
731
+ togglePanelEvent(evnt)
732
+ dispatchEvent('click', {}, evnt)
733
+ }
734
+
735
+ const blurEvent = (evnt: FocusEvent) => {
736
+ reactData.isActivated = false
737
+ dispatchEvent('blur', {}, evnt)
738
+ }
739
+
740
+ const modelSearchEvent = (value: string) => {
741
+ reactData.searchValue = value
742
+ }
743
+
744
+ const handleSearchEvent = () => {
745
+ const { modelValue, remote, remoteMethod } = props
746
+ const { searchValue } = reactData
747
+ const remoteOpts = computeRemoteOpts.value
748
+ const queryMethod = remoteOpts.queryMethod || remoteMethod
749
+ if (remote && queryMethod && remoteOpts.enabled) {
750
+ reactData.searchLoading = true
751
+ Promise.resolve(queryMethod({ $treeSelect: $xeTreeSelect, searchValue, value: modelValue }))
752
+ .then(() => nextTick())
753
+ .catch(() => nextTick())
754
+ .finally(() => {
755
+ reactData.searchLoading = false
756
+ })
757
+ }
758
+ }
759
+
760
+ const togglePanelEvent = (params: any) => {
761
+ const { $event } = params
762
+ $event.preventDefault()
763
+ if (reactData.triggerFocusPanel) {
764
+ reactData.triggerFocusPanel = false
765
+ } else {
766
+ if (reactData.visiblePanel) {
767
+ hideOptionPanel($event)
768
+ } else {
769
+ showOptionPanel($event)
770
+ }
771
+ }
772
+ }
773
+
774
+ const nodeExpandEvent = () => {
775
+ updatePlacement()
776
+ }
777
+
778
+ const nodeClickEvent: VxeTreeEvents.NodeClick = (params) => {
779
+ const { $event } = params
780
+ dispatchEvent('node-click', params, $event)
781
+ }
782
+
783
+ const radioChangeEvent: VxeTreeEvents.RadioChange = (params) => {
784
+ const { value, $event, node } = params
785
+ changeEvent($event, value, node)
786
+ hideOptionPanel($event)
787
+ }
788
+
789
+ const checkboxChangeEvent: VxeTreeEvents.CheckboxChange = (params) => {
790
+ const { value, $event, node } = params
791
+ changeEvent($event, value, node)
792
+ }
793
+
794
+ const loadSuccessEvent = () => {
795
+ cacheDataMap()
796
+ }
797
+
798
+ const treeSelectPrivateMethods: TreeSelectPrivateMethods = {}
799
+
800
+ Object.assign($xeTreeSelect, treeSelectMethods, treeSelectPrivateMethods)
801
+
802
+ const renderVN = () => {
803
+ const { className, modelValue, multiple, options, loading, menuConfig, filterable, showTotalButton, showCheckedButton, showClearButton, showExpandButton, showCloseButton } = props
804
+ const { initialized, isActivated, isAniVisible, visiblePanel, searchValue } = reactData
805
+ const vSize = computeSize.value
806
+ const isDisabled = computeIsDisabled.value
807
+ const selectLabel = computeSelectLabel.value
808
+ const btnTransfer = computeBtnTransfer.value
809
+ const formReadonly = computeFormReadonly.value
810
+ const popupWrapperStyle = computePopupWrapperStyle.value
811
+ const headerSlot = slots.header
812
+ const footerSlot = slots.footer
813
+ const prefixSlot = slots.prefix
814
+ const popupOpts = computePopupOpts.value
815
+ const { appendTo } = popupOpts
816
+ const ppClassName = popupOpts.className || props.popupClassName
817
+
818
+ if (formReadonly) {
819
+ return h(
820
+ 'div',
821
+ {
822
+ ref: refElem,
823
+ class: ['vxe-tree-select--readonly', className]
824
+ },
825
+ [
826
+ h(
827
+ 'span',
828
+ {
829
+ class: 'vxe-tree-select-label'
830
+ },
831
+ selectLabel
832
+ )
833
+ ]
834
+ )
835
+ }
836
+ const treeOpts = computeTreeOpts.value
837
+ const menuOpts = computeMenuOpts.value
838
+ const treeNodeOpts = computeTreeNodeOpts.value
839
+ const treeCheckboxOpts = computeTreeCheckboxOpts.value
840
+ const treeRadioOpts = computeTreeRadioOpts.value
841
+ const nodeKeyField = computeNodeKeyField.value
842
+ const labelField = computeLabelField.value
843
+ const valueField = computeValueField.value
844
+ const childrenField = computeChildrenField.value
845
+ const nodeParentField = computeNodeParentField.value
846
+ const hasChildField = computeHasChildField.value
847
+ const virtualYOpts = computeVirtualYOpts.value
848
+ const filterOpts = computeFilterOpts.value
849
+ const { slots: treeSlots } = treeOpts
850
+ const selectVals = XEUtils.eqNull(modelValue) ? [] : XEUtils.isArray(modelValue) ? modelValue : [modelValue]
851
+ const treeScopedSlots: {
852
+ icon?: (params: any) => VNode[]
853
+ title?: (params: any) => VNode[]
854
+ extra?: (params: any) => VNode[]
855
+ } = {}
856
+ if (treeSlots) {
857
+ const { icon: treeIconSlot, title: treeTitleSlot, extra: treeExtraSlot } = treeSlots
858
+ if (treeIconSlot) {
859
+ treeScopedSlots.icon = (slotParams) => callSlot(treeIconSlot, slotParams) as VNode[]
860
+ }
861
+ if (treeTitleSlot) {
862
+ treeScopedSlots.title = (slotParams) => callSlot(treeTitleSlot, slotParams) as VNode[]
863
+ }
864
+ if (treeExtraSlot) {
865
+ treeScopedSlots.extra = (slotParams) => callSlot(treeExtraSlot, slotParams) as VNode[]
866
+ }
867
+ }
868
+ return h(
869
+ 'div',
870
+ {
871
+ ref: refElem,
872
+ class: [
873
+ 'vxe-tree-select',
874
+ className ? (XEUtils.isFunction(className) ? className({ $treeSelect: $xeTreeSelect }) : className) : '',
875
+ {
876
+ [`size--${vSize}`]: vSize,
877
+ 'is--filterable': filterable,
878
+ 'is--visible': visiblePanel,
879
+ 'is--disabled': isDisabled,
880
+ 'is--loading': loading,
881
+ 'is--active': isActivated
882
+ }
883
+ ]
884
+ },
885
+ [
886
+ h(
887
+ VxeInputComponent,
888
+ {
889
+ ref: refInput,
890
+ clearable: props.clearable,
891
+ placeholder: loading ? getI18n('vxe.select.loadingText') : props.placeholder,
892
+ editable: false,
893
+ disabled: isDisabled,
894
+ type: 'text',
895
+ prefixIcon: props.prefixIcon,
896
+ suffixIcon: loading ? getIcon().TREE_SELECT_LOADED : visiblePanel ? getIcon().TREE_SELECT_OPEN : getIcon().TREE_SELECT_CLOSE,
897
+ modelValue: loading ? '' : selectLabel,
898
+ title: selectLabel,
899
+ onClear: clearEvent,
900
+ onClick: clickEvent,
901
+ onFocus: focusEvent,
902
+ onBlur: blurEvent,
903
+ onSuffixClick: togglePanelEvent
904
+ },
905
+ prefixSlot
906
+ ? {
907
+ prefix: () => prefixSlot({})
908
+ }
909
+ : {}
910
+ ),
911
+ h(
912
+ Teleport,
913
+ {
914
+ to: getPopupContainer(appendTo),
915
+ disabled: btnTransfer ? !initialized : true
916
+ },
917
+ [
918
+ h(
919
+ 'div',
920
+ {
921
+ ref: refOptionPanel,
922
+ class: [
923
+ 'vxe-table--ignore-clear vxe-tree-select--panel',
924
+ ppClassName ? (XEUtils.isFunction(ppClassName) ? ppClassName({ $treeSelect: $xeTreeSelect }) : ppClassName) : '',
925
+ {
926
+ [`size--${vSize}`]: vSize,
927
+ 'is--transfer': btnTransfer,
928
+ 'ani--leave': !loading && isAniVisible,
929
+ 'ani--enter': !loading && visiblePanel
930
+ }
931
+ ],
932
+ placement: reactData.panelPlacement,
933
+ style: reactData.panelStyle
934
+ },
935
+ initialized
936
+ ? [
937
+ h(
938
+ 'div',
939
+ {
940
+ class: 'vxe-tree-select--panel-wrapper'
941
+ },
942
+ [
943
+ filterable
944
+ ? h(
945
+ 'div',
946
+ {
947
+ class: 'vxe-tree-select--panel-search'
948
+ },
949
+ [
950
+ h(VxeInputComponent, {
951
+ ref: refInpSearch,
952
+ class: 'vxe-tree-select-search--input',
953
+ modelValue: searchValue,
954
+ clearable: true,
955
+ disabled: false,
956
+ readonly: false,
957
+ placeholder: getI18n('vxe.treeSelect.search'),
958
+ prefixIcon: getIcon().INPUT_SEARCH,
959
+ 'onUpdate:modelValue': modelSearchEvent
960
+ })
961
+ ]
962
+ )
963
+ : renderEmptyElement($xeTreeSelect),
964
+ (showCheckedButton && multiple) || showClearButton || showExpandButton || headerSlot
965
+ ? h(
966
+ 'div',
967
+ {
968
+ class: 'vxe-tree-select--panel-header'
969
+ },
970
+ headerSlot
971
+ ? headerSlot({})
972
+ : [
973
+ h(
974
+ 'div',
975
+ {
976
+ class: 'vxe-tree-select--header-button'
977
+ },
978
+ [
979
+ (showCheckedButton && multiple) || showClearButton
980
+ ? h(
981
+ 'div',
982
+ {
983
+ class: 'vxe-tree-select--selected-btns'
984
+ },
985
+ [
986
+ showCheckedButton && multiple
987
+ ? h(VxeButtonComponent, {
988
+ content: getI18n('vxe.treeSelect.allChecked'),
989
+ mode: 'text',
990
+ onClick: allCheckedPanelEvent
991
+ })
992
+ : renderEmptyElement($xeTreeSelect),
993
+ showClearButton
994
+ ? h(VxeButtonComponent, {
995
+ content: getI18n('vxe.treeSelect.clearChecked'),
996
+ mode: 'text',
997
+ onClick: clearCheckedPanelEvent
998
+ })
999
+ : renderEmptyElement($xeTreeSelect)
1000
+ ]
1001
+ )
1002
+ : renderEmptyElement($xeTreeSelect),
1003
+ showExpandButton
1004
+ ? h(
1005
+ 'div',
1006
+ {
1007
+ class: 'vxe-tree-select--expand-btns'
1008
+ },
1009
+ [
1010
+ h(VxeButtonComponent, {
1011
+ content: getI18n('vxe.treeSelect.allExpand'),
1012
+ mode: 'text',
1013
+ onClick: allExpandPanelEvent
1014
+ }),
1015
+ h(VxeButtonComponent, {
1016
+ content: getI18n('vxe.treeSelect.clearExpand'),
1017
+ mode: 'text',
1018
+ onClick: clearExpandPanelEvent
1019
+ })
1020
+ ]
1021
+ )
1022
+ : renderEmptyElement($xeTreeSelect)
1023
+ ]
1024
+ )
1025
+ ]
1026
+ )
1027
+ : renderEmptyElement($xeTreeSelect),
1028
+ h(
1029
+ 'div',
1030
+ {
1031
+ class: 'vxe-tree-select--panel-body'
1032
+ },
1033
+ [
1034
+ h(
1035
+ 'div',
1036
+ {
1037
+ ref: refTreeWrapper,
1038
+ class: 'vxe-tree-select-tree--wrapper',
1039
+ style: popupWrapperStyle
1040
+ },
1041
+ [
1042
+ h(
1043
+ VxeTreeComponent,
1044
+ {
1045
+ ref: refTree,
1046
+ class: 'vxe-tree-select--tree',
1047
+ height: popupOpts.height ? '100%' : treeOpts.height,
1048
+ minHeight: treeOpts.minHeight,
1049
+ maxHeight: popupOpts.height ? '' : treeOpts.maxHeight,
1050
+ autoResize: true,
1051
+ data: options,
1052
+ indent: treeOpts.indent,
1053
+ showRadio: !multiple,
1054
+ radioConfig: treeRadioOpts,
1055
+ checkNodeKey: multiple ? null : modelValue,
1056
+ showCheckbox: !!multiple,
1057
+ checkNodeKeys: multiple ? modelValue : null,
1058
+ checkboxConfig: treeCheckboxOpts,
1059
+ titleField: labelField,
1060
+ valueField: valueField,
1061
+ keyField: nodeKeyField,
1062
+ childrenField: treeOpts.childrenField || childrenField,
1063
+ parentField: nodeParentField,
1064
+ hasChildField: treeOpts.hasChildField || hasChildField,
1065
+ accordion: treeOpts.accordion,
1066
+ expandAll: treeOpts.expandAll,
1067
+ expandNodeKeys: treeOpts.expandNodeKeys,
1068
+ nodeConfig: treeNodeOpts,
1069
+ lazy: treeOpts.lazy,
1070
+ loadMethod: treeOpts.loadMethod,
1071
+ toggleMethod: treeOpts.toggleMethod,
1072
+ transform: treeOpts.transform,
1073
+ rootParentValue: treeOpts.rootParentValue,
1074
+ rootValues: treeOpts.rootValues,
1075
+ trigger: treeOpts.trigger,
1076
+ showIcon: treeOpts.showIcon,
1077
+ showLine: treeOpts.showLine,
1078
+ iconOpen: treeOpts.iconOpen,
1079
+ iconLoaded: treeOpts.iconLoaded,
1080
+ iconClose: treeOpts.iconClose,
1081
+ filterValue: searchValue,
1082
+ filterConfig: filterOpts,
1083
+ menuConfig: menuConfig ? menuOpts : undefined,
1084
+ virtualYConfig: virtualYOpts,
1085
+ onNodeExpand: nodeExpandEvent,
1086
+ onNodeClick: nodeClickEvent,
1087
+ onRadioChange: radioChangeEvent,
1088
+ onCheckboxChange: checkboxChangeEvent,
1089
+ onLoadSuccess: loadSuccessEvent
1090
+ },
1091
+ treeScopedSlots
1092
+ )
1093
+ ]
1094
+ )
1095
+ ]
1096
+ ),
1097
+ footerSlot || showTotalButton || showCloseButton
1098
+ ? h(
1099
+ 'div',
1100
+ {
1101
+ class: 'vxe-tree-select--panel-footer'
1102
+ },
1103
+ footerSlot
1104
+ ? footerSlot({})
1105
+ : [
1106
+ h(
1107
+ 'div',
1108
+ {
1109
+ class: 'vxe-tree-select--footer-button'
1110
+ },
1111
+ [
1112
+ showTotalButton
1113
+ ? h(
1114
+ 'div',
1115
+ {
1116
+ class: 'vxe-tree-select--total-btns'
1117
+ },
1118
+ getI18n('vxe.treeSelect.total', [selectVals.length])
1119
+ )
1120
+ : renderEmptyElement($xeTreeSelect),
1121
+ showCloseButton
1122
+ ? h(
1123
+ 'div',
1124
+ {
1125
+ class: 'vxe-tree-select--oper-btns'
1126
+ },
1127
+ [
1128
+ h(VxeButtonComponent, {
1129
+ content: getI18n('vxe.select.close'),
1130
+ mode: 'text',
1131
+ onClick: closePanelEvent
1132
+ })
1133
+ ]
1134
+ )
1135
+ : renderEmptyElement($xeTreeSelect)
1136
+ ]
1137
+ )
1138
+ ]
1139
+ )
1140
+ : renderEmptyElement($xeTreeSelect)
1141
+ ]
1142
+ )
1143
+ ]
1144
+ : []
1145
+ )
1146
+ ]
1147
+ )
1148
+ ]
1149
+ )
1150
+ }
1151
+
1152
+ const optFlag = ref(0)
1153
+ watch(
1154
+ () => (props.options ? props.options.length : -1),
1155
+ () => {
1156
+ optFlag.value++
1157
+ }
1158
+ )
1159
+ watch(
1160
+ () => props.options,
1161
+ () => {
1162
+ optFlag.value++
1163
+ }
1164
+ )
1165
+ watch(optFlag, () => {
1166
+ cacheDataMap()
1167
+ })
1168
+
1169
+ const lazyOptFlag = ref(0)
1170
+ watch(
1171
+ () => (props.lazyOptions ? props.lazyOptions.length : -1),
1172
+ () => {
1173
+ lazyOptFlag.value++
1174
+ }
1175
+ )
1176
+ watch(
1177
+ () => props.lazyOptions,
1178
+ () => {
1179
+ lazyOptFlag.value++
1180
+ }
1181
+ )
1182
+ watch(lazyOptFlag, () => {
1183
+ cacheLazyDataMap()
1184
+ })
1185
+
1186
+ cacheDataMap()
1187
+ cacheLazyDataMap()
1188
+
1189
+ onMounted(() => {
1190
+ if (XEUtils.isBoolean(props.autoClose)) {
1191
+ warnLog('vxe.error.delProp', ['auto-close', 'checked-closable | clear-closable'])
1192
+ }
1193
+ globalEvents.on($xeTreeSelect, 'mousedown', handleGlobalMousedownEvent)
1194
+ globalEvents.on($xeTreeSelect, 'blur', handleGlobalBlurEvent)
1195
+ globalEvents.on($xeTreeSelect, 'resize', handleGlobalResizeEvent)
1196
+ globalEvents.on($xeTreeSelect, 'scroll', handleGlobalScrollEvent)
1197
+ })
1198
+
1199
+ onBeforeUnmount(() => {
1200
+ globalEvents.off($xeTreeSelect, 'mousedown')
1201
+ globalEvents.off($xeTreeSelect, 'blur')
1202
+ globalEvents.off($xeTreeSelect, 'resize')
1203
+ globalEvents.off($xeTreeSelect, 'scroll')
1204
+ XEUtils.assign(reactData, createReactData())
1205
+ XEUtils.assign(internalData, createInternalData())
1206
+ })
1207
+
1208
+ provide('$xeTreeSelect', $xeTreeSelect)
1209
+
1210
+ $xeTreeSelect.renderVN = renderVN
1211
+
1212
+ return $xeTreeSelect
1213
+ },
1214
+ render() {
1215
+ return this.renderVN()
1216
+ }
1217
+ })