vxe-pc-ui 3.0.1 → 3.0.2

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 (367) hide show
  1. package/README.md +23 -25
  2. package/es/calendar/index.js +12 -0
  3. package/es/calendar/src/calendar.js +1227 -0
  4. package/es/calendar/style.css +247 -0
  5. package/es/calendar/style.min.css +1 -0
  6. package/es/checkbox/src/checkbox.js +6 -1
  7. package/es/checkbox/src/group.js +6 -1
  8. package/es/collapse/index.js +12 -0
  9. package/es/collapse/src/collapse-pane.js +39 -0
  10. package/es/collapse/src/collapse.js +39 -0
  11. package/es/collapse/style.css +0 -0
  12. package/es/collapse/style.min.css +0 -0
  13. package/es/collapse-pane/index.js +12 -0
  14. package/es/collapse-pane/style.css +0 -0
  15. package/es/collapse-pane/style.min.css +0 -0
  16. package/es/components.js +27 -27
  17. package/es/date-picker/src/date-picker.js +17 -13
  18. package/es/drawer/src/drawer.js +17 -12
  19. package/es/form/index.js +13 -0
  20. package/es/form/render/index.js +461 -0
  21. package/es/form/src/form-config-item.js +201 -0
  22. package/es/form/src/form-gather.js +87 -0
  23. package/es/form/src/form-item.js +291 -0
  24. package/es/form/src/form.js +762 -0
  25. package/es/form/src/itemInfo.js +43 -0
  26. package/es/form/src/render.js +78 -0
  27. package/es/form/src/util.js +66 -0
  28. package/es/form/style.css +470 -0
  29. package/es/form/style.min.css +1 -0
  30. package/es/form-gather/index.js +12 -0
  31. package/es/form-gather/style.css +0 -0
  32. package/es/form-gather/style.min.css +0 -0
  33. package/es/form-item/index.js +12 -0
  34. package/es/form-item/style.css +0 -0
  35. package/es/form-item/style.min.css +0 -0
  36. package/es/icon/style.css +1 -1
  37. package/es/icon-picker/src/icon-picker.js +5 -1
  38. package/es/image/src/preview.js +1 -2
  39. package/es/input/src/input.js +19 -15
  40. package/es/list/index.js +12 -0
  41. package/es/list/src/list.js +373 -0
  42. package/es/list/style.css +28 -0
  43. package/es/list/style.min.css +1 -0
  44. package/es/loading/src/loading.js +5 -0
  45. package/es/menu/src/menu.js +6 -2
  46. package/es/modal/src/modal.js +7 -4
  47. package/es/number-input/src/number-input.js +11 -7
  48. package/es/pager/style.css +303 -0
  49. package/es/pager/style.min.css +1 -0
  50. package/es/password-input/src/password-input.js +7 -3
  51. package/es/pulldown/src/pulldown.js +6 -2
  52. package/es/radio/src/button.js +6 -2
  53. package/es/radio/src/group.js +6 -2
  54. package/es/radio/src/radio.js +6 -2
  55. package/es/select/src/select.js +16 -1
  56. package/es/select/src/util.js +2 -1
  57. package/es/style.css +1 -1
  58. package/es/style.min.css +1 -1
  59. package/es/switch/src/switch.js +6 -2
  60. package/es/tabs/src/tabs.js +8 -3
  61. package/es/textarea/src/textarea.js +9 -5
  62. package/es/tooltip/src/tooltip.js +6 -1
  63. package/es/tree/index.js +12 -0
  64. package/es/tree/src/tree.js +1216 -0
  65. package/es/tree/style.css +219 -0
  66. package/es/tree/style.min.css +1 -0
  67. package/es/tree-select/index.js +12 -0
  68. package/es/tree-select/src/tree-select.js +685 -0
  69. package/es/tree-select/style.css +129 -0
  70. package/es/tree-select/style.min.css +1 -0
  71. package/es/ui/index.js +1 -1
  72. package/es/ui/src/log.js +1 -1
  73. package/es/ui/src/vn.js +1 -1
  74. package/es/upload/src/upload.js +9 -5
  75. package/es/vxe-calendar/index.js +3 -0
  76. package/es/vxe-calendar/style.css +247 -0
  77. package/es/vxe-calendar/style.min.css +1 -0
  78. package/es/vxe-collapse/index.js +3 -0
  79. package/es/vxe-collapse/style.css +0 -0
  80. package/es/vxe-collapse/style.min.css +0 -0
  81. package/es/vxe-collapse-pane/index.js +3 -0
  82. package/es/vxe-collapse-pane/style.css +0 -0
  83. package/es/vxe-collapse-pane/style.min.css +0 -0
  84. package/es/vxe-form/index.js +3 -0
  85. package/es/vxe-form/style.css +470 -0
  86. package/es/vxe-form/style.min.css +1 -0
  87. package/es/vxe-form-gather/index.js +3 -0
  88. package/es/vxe-form-gather/style.css +0 -0
  89. package/es/vxe-form-gather/style.min.css +0 -0
  90. package/es/vxe-form-item/index.js +3 -0
  91. package/es/vxe-form-item/style.css +0 -0
  92. package/es/vxe-form-item/style.min.css +0 -0
  93. package/es/vxe-list/index.js +3 -0
  94. package/es/vxe-list/style.css +28 -0
  95. package/es/vxe-list/style.min.css +1 -0
  96. package/es/vxe-pager/index.js +3 -0
  97. package/es/vxe-pager/style.css +303 -0
  98. package/es/vxe-pager/style.min.css +1 -0
  99. package/es/vxe-tree/index.js +3 -0
  100. package/es/vxe-tree/style.css +219 -0
  101. package/es/vxe-tree/style.min.css +1 -0
  102. package/es/vxe-tree-select/index.js +3 -0
  103. package/es/vxe-tree-select/style.css +129 -0
  104. package/es/vxe-tree-select/style.min.css +1 -0
  105. package/lib/calendar/index.js +19 -0
  106. package/lib/calendar/index.min.js +1 -0
  107. package/lib/calendar/src/calendar.js +1286 -0
  108. package/lib/calendar/src/calendar.min.js +1 -0
  109. package/lib/calendar/style/index.js +1 -0
  110. package/lib/calendar/style/style.css +247 -0
  111. package/lib/calendar/style/style.min.css +1 -0
  112. package/lib/checkbox/src/checkbox.js +6 -1
  113. package/lib/checkbox/src/checkbox.min.js +1 -1
  114. package/lib/checkbox/src/group.js +6 -1
  115. package/lib/checkbox/src/group.min.js +1 -1
  116. package/lib/collapse/index.js +19 -0
  117. package/lib/collapse/index.min.js +1 -0
  118. package/lib/collapse/src/collapse-pane.js +48 -0
  119. package/lib/collapse/src/collapse-pane.min.js +1 -0
  120. package/lib/collapse/src/collapse.js +48 -0
  121. package/lib/collapse/src/collapse.min.js +1 -0
  122. package/lib/collapse/style/index.js +1 -0
  123. package/lib/collapse/style/style.css +0 -0
  124. package/lib/collapse/style/style.min.css +0 -0
  125. package/lib/collapse-pane/index.js +19 -0
  126. package/lib/collapse-pane/index.min.js +1 -0
  127. package/lib/collapse-pane/style/index.js +1 -0
  128. package/lib/collapse-pane/style/style.css +0 -0
  129. package/lib/collapse-pane/style/style.min.css +0 -0
  130. package/lib/components.js +114 -39
  131. package/lib/components.min.js +1 -1
  132. package/lib/date-picker/src/date-picker.js +17 -13
  133. package/lib/date-picker/src/date-picker.min.js +1 -1
  134. package/lib/drawer/src/drawer.js +17 -12
  135. package/lib/drawer/src/drawer.min.js +1 -1
  136. package/lib/form/index.js +20 -0
  137. package/lib/form/index.min.js +1 -0
  138. package/lib/form/render/index.js +509 -0
  139. package/lib/form/render/index.min.js +1 -0
  140. package/lib/form/src/form-config-item.js +210 -0
  141. package/lib/form/src/form-config-item.min.js +1 -0
  142. package/lib/form/src/form-gather.js +99 -0
  143. package/lib/form/src/form-gather.min.js +1 -0
  144. package/lib/form/src/form-item.js +299 -0
  145. package/lib/form/src/form-item.min.js +1 -0
  146. package/lib/form/src/form.js +856 -0
  147. package/lib/form/src/form.min.js +1 -0
  148. package/lib/form/src/itemInfo.js +60 -0
  149. package/lib/form/src/itemInfo.min.js +1 -0
  150. package/lib/form/src/render.js +94 -0
  151. package/lib/form/src/render.min.js +1 -0
  152. package/lib/form/src/util.js +93 -0
  153. package/lib/form/src/util.min.js +1 -0
  154. package/lib/form/style/index.js +1 -0
  155. package/lib/form/style/style.css +470 -0
  156. package/lib/form/style/style.min.css +1 -0
  157. package/lib/form-gather/index.js +19 -0
  158. package/lib/form-gather/index.min.js +1 -0
  159. package/lib/form-gather/style/index.js +1 -0
  160. package/lib/form-gather/style/style.css +0 -0
  161. package/lib/form-gather/style/style.min.css +0 -0
  162. package/lib/form-item/index.js +19 -0
  163. package/lib/form-item/index.min.js +1 -0
  164. package/lib/form-item/style/index.js +1 -0
  165. package/lib/form-item/style/style.css +0 -0
  166. package/lib/form-item/style/style.min.css +0 -0
  167. package/lib/icon/style/style.css +1 -1
  168. package/lib/icon/style/style.min.css +1 -1
  169. package/lib/icon-picker/src/icon-picker.js +5 -1
  170. package/lib/icon-picker/src/icon-picker.min.js +1 -1
  171. package/lib/image/src/preview.js +1 -2
  172. package/lib/image/src/preview.min.js +1 -1
  173. package/lib/index.umd.js +11284 -5009
  174. package/lib/index.umd.min.js +1 -1
  175. package/lib/input/src/input.js +19 -15
  176. package/lib/input/src/input.min.js +1 -1
  177. package/lib/list/index.js +19 -0
  178. package/lib/list/index.min.js +1 -0
  179. package/lib/list/src/list.js +415 -0
  180. package/lib/list/src/list.min.js +1 -0
  181. package/lib/list/style/index.js +1 -0
  182. package/lib/list/style/style.css +28 -0
  183. package/lib/list/style/style.min.css +1 -0
  184. package/lib/loading/src/loading.js +5 -0
  185. package/lib/loading/src/loading.min.js +1 -1
  186. package/lib/menu/src/menu.js +6 -2
  187. package/lib/menu/src/menu.min.js +1 -1
  188. package/lib/modal/src/modal.js +7 -4
  189. package/lib/modal/src/modal.min.js +1 -1
  190. package/lib/number-input/src/number-input.js +11 -7
  191. package/lib/number-input/src/number-input.min.js +1 -1
  192. package/lib/pager/style/index.js +1 -0
  193. package/lib/pager/style/style.css +303 -0
  194. package/lib/pager/style/style.min.css +1 -0
  195. package/lib/password-input/src/password-input.js +7 -3
  196. package/lib/password-input/src/password-input.min.js +1 -1
  197. package/lib/pulldown/src/pulldown.js +6 -2
  198. package/lib/pulldown/src/pulldown.min.js +1 -1
  199. package/lib/radio/src/button.js +6 -2
  200. package/lib/radio/src/button.min.js +1 -1
  201. package/lib/radio/src/group.js +6 -2
  202. package/lib/radio/src/group.min.js +1 -1
  203. package/lib/radio/src/radio.js +6 -2
  204. package/lib/radio/src/radio.min.js +1 -1
  205. package/lib/select/src/select.js +16 -1
  206. package/lib/select/src/select.min.js +1 -1
  207. package/lib/select/src/util.js +2 -1
  208. package/lib/style.css +1 -1
  209. package/lib/style.min.css +1 -1
  210. package/lib/switch/src/switch.js +6 -2
  211. package/lib/switch/src/switch.min.js +1 -1
  212. package/lib/tabs/src/tabs.js +8 -3
  213. package/lib/tabs/src/tabs.min.js +1 -1
  214. package/lib/textarea/src/textarea.js +9 -5
  215. package/lib/textarea/src/textarea.min.js +1 -1
  216. package/lib/tooltip/src/tooltip.js +6 -1
  217. package/lib/tooltip/src/tooltip.min.js +1 -1
  218. package/lib/tree/index.js +19 -0
  219. package/lib/tree/index.min.js +1 -0
  220. package/lib/tree/src/tree.js +1324 -0
  221. package/lib/tree/src/tree.min.js +1 -0
  222. package/lib/tree/style/index.js +1 -0
  223. package/lib/tree/style/style.css +219 -0
  224. package/lib/tree/style/style.min.css +1 -0
  225. package/lib/tree-select/index.js +19 -0
  226. package/lib/tree-select/index.min.js +1 -0
  227. package/lib/tree-select/src/tree-select.js +695 -0
  228. package/lib/tree-select/src/tree-select.min.js +1 -0
  229. package/lib/tree-select/style/index.js +1 -0
  230. package/lib/tree-select/style/style.css +129 -0
  231. package/lib/tree-select/style/style.min.css +1 -0
  232. package/lib/ui/index.js +1 -1
  233. package/lib/ui/index.min.js +1 -1
  234. package/lib/ui/src/log.js +1 -1
  235. package/lib/ui/src/log.min.js +1 -1
  236. package/lib/ui/src/vn.js +1 -1
  237. package/lib/ui/src/vn.min.js +1 -1
  238. package/lib/upload/src/upload.js +9 -5
  239. package/lib/upload/src/upload.min.js +1 -1
  240. package/lib/vxe-calendar/index.js +23 -0
  241. package/lib/vxe-calendar/index.min.js +1 -0
  242. package/lib/vxe-calendar/style/index.js +1 -0
  243. package/lib/vxe-calendar/style/style.css +247 -0
  244. package/lib/vxe-calendar/style/style.min.css +1 -0
  245. package/lib/vxe-collapse/index.js +23 -0
  246. package/lib/vxe-collapse/index.min.js +1 -0
  247. package/lib/vxe-collapse/style/index.js +1 -0
  248. package/lib/vxe-collapse/style/style.css +0 -0
  249. package/lib/vxe-collapse/style/style.min.css +0 -0
  250. package/lib/vxe-collapse-pane/index.js +23 -0
  251. package/lib/vxe-collapse-pane/index.min.js +1 -0
  252. package/lib/vxe-collapse-pane/style/index.js +1 -0
  253. package/lib/vxe-collapse-pane/style/style.css +0 -0
  254. package/lib/vxe-collapse-pane/style/style.min.css +0 -0
  255. package/lib/vxe-form/index.js +23 -0
  256. package/lib/vxe-form/index.min.js +1 -0
  257. package/lib/vxe-form/style/index.js +1 -0
  258. package/lib/vxe-form/style/style.css +470 -0
  259. package/lib/vxe-form/style/style.min.css +1 -0
  260. package/lib/vxe-form-gather/index.js +23 -0
  261. package/lib/vxe-form-gather/index.min.js +1 -0
  262. package/lib/vxe-form-gather/style/index.js +1 -0
  263. package/lib/vxe-form-gather/style/style.css +0 -0
  264. package/lib/vxe-form-gather/style/style.min.css +0 -0
  265. package/lib/vxe-form-item/index.js +23 -0
  266. package/lib/vxe-form-item/index.min.js +1 -0
  267. package/lib/vxe-form-item/style/index.js +1 -0
  268. package/lib/vxe-form-item/style/style.css +0 -0
  269. package/lib/vxe-form-item/style/style.min.css +0 -0
  270. package/lib/vxe-list/index.js +23 -0
  271. package/lib/vxe-list/index.min.js +1 -0
  272. package/lib/vxe-list/style/index.js +1 -0
  273. package/lib/vxe-list/style/style.css +28 -0
  274. package/lib/vxe-list/style/style.min.css +1 -0
  275. package/lib/vxe-pager/index.js +23 -0
  276. package/lib/vxe-pager/index.min.js +1 -0
  277. package/lib/vxe-pager/style/index.js +1 -0
  278. package/lib/vxe-pager/style/style.css +303 -0
  279. package/lib/vxe-pager/style/style.min.css +1 -0
  280. package/lib/vxe-tree/index.js +23 -0
  281. package/lib/vxe-tree/index.min.js +1 -0
  282. package/lib/vxe-tree/style/index.js +1 -0
  283. package/lib/vxe-tree/style/style.css +219 -0
  284. package/lib/vxe-tree/style/style.min.css +1 -0
  285. package/lib/vxe-tree-select/index.js +23 -0
  286. package/lib/vxe-tree-select/index.min.js +1 -0
  287. package/lib/vxe-tree-select/style/index.js +1 -0
  288. package/lib/vxe-tree-select/style/style.css +129 -0
  289. package/lib/vxe-tree-select/style/style.min.css +1 -0
  290. package/package.json +1 -1
  291. package/packages/calendar/index.ts +16 -0
  292. package/packages/calendar/src/calendar.ts +1281 -0
  293. package/packages/checkbox/src/checkbox.ts +7 -1
  294. package/packages/checkbox/src/group.ts +8 -2
  295. package/packages/collapse/index.ts +16 -0
  296. package/packages/collapse/src/collapse-pane.ts +47 -0
  297. package/packages/collapse/src/collapse.ts +47 -0
  298. package/packages/collapse-pane/index.ts +16 -0
  299. package/packages/components.ts +27 -27
  300. package/packages/date-picker/src/date-picker.ts +18 -13
  301. package/packages/drawer/src/drawer.ts +18 -12
  302. package/packages/form/index.ts +17 -0
  303. package/packages/form/render/index.ts +499 -0
  304. package/packages/form/src/form-config-item.ts +219 -0
  305. package/packages/form/src/form-gather.ts +104 -0
  306. package/packages/form/src/form-item.ts +322 -0
  307. package/packages/form/src/form.ts +809 -0
  308. package/packages/form/src/itemInfo.ts +47 -0
  309. package/packages/form/src/render.ts +98 -0
  310. package/packages/form/src/util.ts +80 -0
  311. package/packages/form-gather/index.ts +16 -0
  312. package/packages/form-item/index.ts +16 -0
  313. package/packages/icon-picker/src/icon-picker.ts +6 -1
  314. package/packages/image/src/preview.ts +1 -2
  315. package/packages/input/src/input.ts +20 -15
  316. package/packages/layout-footer/src/layout-footer.ts +1 -0
  317. package/packages/list/index.ts +16 -0
  318. package/packages/list/src/list.ts +403 -0
  319. package/packages/loading/src/loading.ts +6 -0
  320. package/packages/menu/src/menu.ts +7 -2
  321. package/packages/modal/src/modal.ts +8 -4
  322. package/packages/number-input/src/number-input.ts +12 -7
  323. package/packages/password-input/src/password-input.ts +8 -3
  324. package/packages/pulldown/src/pulldown.ts +7 -2
  325. package/packages/radio/src/button.ts +7 -2
  326. package/packages/radio/src/group.ts +7 -2
  327. package/packages/radio/src/radio.ts +7 -2
  328. package/packages/select/src/select.ts +17 -1
  329. package/packages/select/src/util.ts +4 -3
  330. package/packages/switch/src/switch.ts +7 -2
  331. package/packages/tabs/src/tabs.ts +9 -3
  332. package/packages/textarea/src/textarea.ts +10 -5
  333. package/packages/tooltip/src/tooltip.ts +7 -1
  334. package/packages/tree/index.ts +16 -0
  335. package/packages/tree/src/tree.ts +1292 -0
  336. package/packages/tree-select/index.ts +16 -0
  337. package/packages/tree-select/src/tree-select.ts +743 -0
  338. package/packages/ui/src/vn.ts +1 -1
  339. package/packages/upload/src/upload.ts +10 -5
  340. package/types/components/calendar.d.ts +6 -0
  341. package/types/components/colgroup.d.ts +1 -0
  342. package/types/components/column.d.ts +1 -0
  343. package/types/components/drawer.d.ts +11 -10
  344. package/types/components/form-item.d.ts +1 -1
  345. package/types/components/form.d.ts +8 -1
  346. package/types/components/list.d.ts +1 -0
  347. package/types/components/table.d.ts +43 -4
  348. package/types/components/toolbar.d.ts +5 -0
  349. package/types/components/tree-select.d.ts +4 -0
  350. package/types/ui/index.d.ts +0 -5
  351. package/types/ui/renderer.d.ts +37 -36
  352. package/types/handles/form-design.d.ts +0 -4
  353. package/types/handles/index.d.ts +0 -3
  354. package/types/handles/list-design.d.ts +0 -4
  355. package/types/handles/table.d.ts +0 -4
  356. /package/es/icon/style/{iconfont.1725723159302.ttf → iconfont.1725869586078.ttf} +0 -0
  357. /package/es/icon/style/{iconfont.1725723159302.woff → iconfont.1725869586078.woff} +0 -0
  358. /package/es/icon/style/{iconfont.1725723159302.woff2 → iconfont.1725869586078.woff2} +0 -0
  359. /package/es/{iconfont.1725723159302.ttf → iconfont.1725869586078.ttf} +0 -0
  360. /package/es/{iconfont.1725723159302.woff → iconfont.1725869586078.woff} +0 -0
  361. /package/es/{iconfont.1725723159302.woff2 → iconfont.1725869586078.woff2} +0 -0
  362. /package/lib/icon/style/{iconfont.1725723159302.ttf → iconfont.1725869586078.ttf} +0 -0
  363. /package/lib/icon/style/{iconfont.1725723159302.woff → iconfont.1725869586078.woff} +0 -0
  364. /package/lib/icon/style/{iconfont.1725723159302.woff2 → iconfont.1725869586078.woff2} +0 -0
  365. /package/lib/{iconfont.1725723159302.ttf → iconfont.1725869586078.ttf} +0 -0
  366. /package/lib/{iconfont.1725723159302.woff → iconfont.1725869586078.woff} +0 -0
  367. /package/lib/{iconfont.1725723159302.woff2 → iconfont.1725869586078.woff2} +0 -0
@@ -0,0 +1,1216 @@
1
+ import { defineVxeComponent } from '../../ui/src/comp';
2
+ import XEUtils from 'xe-utils';
3
+ import { createEvent, getIcon, getConfig, renderEmptyElement, globalMixins } from '../../ui';
4
+ import { getSlotVNs } from '../../ui/src/vn';
5
+ import { toCssUnit } from '../../ui/src/dom';
6
+ import VxeLoadingComponent from '../../loading/src/loading';
7
+ /**
8
+ * 生成节点的唯一主键
9
+ */
10
+ function getNodeUniqueId() {
11
+ return XEUtils.uniqueId('node_');
12
+ }
13
+ export default defineVxeComponent({
14
+ name: 'VxeTree',
15
+ mixins: [
16
+ globalMixins.sizeMixin
17
+ ],
18
+ props: {
19
+ data: Array,
20
+ height: [String, Number],
21
+ minHeight: {
22
+ type: [String, Number],
23
+ default: () => getConfig().tree.minHeight
24
+ },
25
+ loading: Boolean,
26
+ loadingConfig: Object,
27
+ accordion: {
28
+ type: Boolean,
29
+ default: () => getConfig().tree.accordion
30
+ },
31
+ childrenField: {
32
+ type: String,
33
+ default: () => getConfig().tree.childrenField
34
+ },
35
+ valueField: {
36
+ type: String,
37
+ default: () => getConfig().tree.valueField
38
+ },
39
+ keyField: {
40
+ type: String,
41
+ default: () => getConfig().tree.keyField
42
+ },
43
+ parentField: {
44
+ type: String,
45
+ default: () => getConfig().tree.parentField
46
+ },
47
+ titleField: {
48
+ type: String,
49
+ default: () => getConfig().tree.titleField
50
+ },
51
+ hasChildField: {
52
+ type: String,
53
+ default: () => getConfig().tree.hasChildField
54
+ },
55
+ // mapChildrenField: {
56
+ // type: String as PropType<VxeTreePropTypes.MapChildrenField>,
57
+ // default: () => getConfig().tree.mapChildrenField
58
+ // },
59
+ transform: Boolean,
60
+ // 已废弃
61
+ isCurrent: Boolean,
62
+ // 已废弃
63
+ isHover: Boolean,
64
+ showLine: {
65
+ type: Boolean,
66
+ default: () => getConfig().tree.showLine
67
+ },
68
+ trigger: String,
69
+ indent: {
70
+ type: Number,
71
+ default: () => getConfig().tree.indent
72
+ },
73
+ showRadio: {
74
+ type: Boolean,
75
+ default: () => getConfig().tree.showRadio
76
+ },
77
+ checkNodeKey: {
78
+ type: [String, Number],
79
+ default: () => getConfig().tree.checkNodeKey
80
+ },
81
+ radioConfig: Object,
82
+ showCheckbox: {
83
+ type: Boolean,
84
+ default: () => getConfig().tree.showCheckbox
85
+ },
86
+ checkNodeKeys: {
87
+ type: Array,
88
+ default: () => getConfig().tree.checkNodeKeys
89
+ },
90
+ checkboxConfig: Object,
91
+ nodeConfig: Object,
92
+ lazy: Boolean,
93
+ toggleMethod: Function,
94
+ loadMethod: Function,
95
+ showIcon: {
96
+ type: Boolean,
97
+ default: true
98
+ },
99
+ iconOpen: {
100
+ type: String,
101
+ default: () => getConfig().tree.iconOpen
102
+ },
103
+ iconClose: {
104
+ type: String,
105
+ default: () => getConfig().tree.iconClose
106
+ },
107
+ iconLoaded: {
108
+ type: String,
109
+ default: () => getConfig().tree.iconLoaded
110
+ },
111
+ size: {
112
+ type: String,
113
+ default: () => getConfig().tree.size || getConfig().size
114
+ }
115
+ },
116
+ data() {
117
+ const xID = XEUtils.uniqueId();
118
+ const reactData = {
119
+ currentNode: null,
120
+ nodeMaps: {},
121
+ selectRadioKey: null,
122
+ treeList: [],
123
+ treeExpandedMaps: {},
124
+ treeExpandLazyLoadedMaps: {},
125
+ selectCheckboxMaps: {},
126
+ indeterminateCheckboxMaps: {}
127
+ };
128
+ const internalData = {};
129
+ return {
130
+ xID,
131
+ reactData,
132
+ internalData
133
+ };
134
+ },
135
+ computed: Object.assign(Object.assign({}, {}), { computeTitleField() {
136
+ const $xeTree = this;
137
+ const props = $xeTree;
138
+ return props.titleField || 'title';
139
+ },
140
+ computeKeyField() {
141
+ const $xeTree = this;
142
+ const props = $xeTree;
143
+ return props.keyField || 'id';
144
+ },
145
+ computeValueField() {
146
+ const $xeTree = this;
147
+ const props = $xeTree;
148
+ const keyField = $xeTree.computeKeyField;
149
+ return props.valueField || keyField;
150
+ },
151
+ computeParentField() {
152
+ const $xeTree = this;
153
+ const props = $xeTree;
154
+ return props.parentField || 'parentId';
155
+ },
156
+ computeChildrenField() {
157
+ const $xeTree = this;
158
+ const props = $xeTree;
159
+ return props.childrenField || 'children';
160
+ },
161
+ computeHasChildField() {
162
+ const $xeTree = this;
163
+ const props = $xeTree;
164
+ return props.hasChildField || 'hasChild';
165
+ },
166
+ computeIsRowCurrent() {
167
+ const $xeTree = this;
168
+ const props = $xeTree;
169
+ const nodeOpts = $xeTree.computeNodeOpts;
170
+ const { isCurrent } = nodeOpts;
171
+ if (XEUtils.isBoolean(isCurrent)) {
172
+ return isCurrent;
173
+ }
174
+ return props.isCurrent;
175
+ },
176
+ computeIsRowHover() {
177
+ const $xeTree = this;
178
+ const props = $xeTree;
179
+ const nodeOpts = $xeTree.computeNodeOpts;
180
+ const { isHover } = nodeOpts;
181
+ if (XEUtils.isBoolean(isHover)) {
182
+ return isHover;
183
+ }
184
+ return props.isHover;
185
+ },
186
+ computeRadioOpts() {
187
+ const $xeTree = this;
188
+ const props = $xeTree;
189
+ return Object.assign({ showIcon: true }, getConfig().tree.radioConfig, props.radioConfig);
190
+ },
191
+ computeCheckboxOpts() {
192
+ const $xeTree = this;
193
+ const props = $xeTree;
194
+ return Object.assign({ showIcon: true }, getConfig().tree.checkboxConfig, props.checkboxConfig);
195
+ },
196
+ computeNodeOpts() {
197
+ const $xeTree = this;
198
+ const props = $xeTree;
199
+ return Object.assign({}, getConfig().tree.nodeConfig, props.nodeConfig);
200
+ },
201
+ computeLoadingOpts() {
202
+ const $xeTree = this;
203
+ const props = $xeTree;
204
+ return Object.assign({}, getConfig().tree.loadingConfig, props.loadingConfig);
205
+ },
206
+ computeTreeStyle() {
207
+ const $xeTree = this;
208
+ const props = $xeTree;
209
+ const { height, minHeight } = props;
210
+ const stys = {};
211
+ if (height) {
212
+ stys.height = toCssUnit(height);
213
+ }
214
+ if (minHeight) {
215
+ stys.minHeight = toCssUnit(minHeight);
216
+ }
217
+ return stys;
218
+ } }),
219
+ methods: {
220
+ //
221
+ // Method
222
+ //
223
+ dispatchEvent(type, params, evnt) {
224
+ const $xeTree = this;
225
+ $xeTree.$emit(type, createEvent(evnt, { $tree: $xeTree }, params));
226
+ },
227
+ clearRadioNode() {
228
+ const $xeTree = this;
229
+ const reactData = $xeTree.reactData;
230
+ reactData.selectRadioKey = null;
231
+ return $xeTree.$nextTick();
232
+ },
233
+ clearCheckboxNode() {
234
+ const $xeTree = this;
235
+ const reactData = $xeTree.reactData;
236
+ reactData.selectCheckboxMaps = {};
237
+ return $xeTree.$nextTick();
238
+ },
239
+ setAllCheckboxNode(checked) {
240
+ const $xeTree = this;
241
+ const reactData = $xeTree.reactData;
242
+ const selectMaps = Object.assign(reactData.selectCheckboxMaps);
243
+ const childrenField = $xeTree.computeChildrenField;
244
+ if (checked) {
245
+ XEUtils.eachTree(reactData.treeList, (node) => {
246
+ const nodeid = $xeTree.getNodeId(node);
247
+ selectMaps[nodeid] = true;
248
+ }, { children: childrenField });
249
+ }
250
+ reactData.selectCheckboxMaps = selectMaps;
251
+ return $xeTree.$nextTick();
252
+ },
253
+ clearExpandNode() {
254
+ const $xeTree = this;
255
+ return $xeTree.clearAllExpandNode();
256
+ },
257
+ clearAllExpandNode() {
258
+ const $xeTree = this;
259
+ const reactData = $xeTree.reactData;
260
+ XEUtils.each(reactData.nodeMaps, (nodeItem) => {
261
+ nodeItem.treeLoaded = false;
262
+ });
263
+ reactData.treeExpandedMaps = {};
264
+ return $xeTree.$nextTick();
265
+ },
266
+ setExpandByNodeId(nodeids, expanded) {
267
+ const $xeTree = this;
268
+ const reactData = $xeTree.reactData;
269
+ const expandedMaps = Object.assign(reactData.treeExpandedMaps);
270
+ if (nodeids) {
271
+ if (!XEUtils.isArray(nodeids)) {
272
+ nodeids = [nodeids];
273
+ }
274
+ nodeids.forEach((nodeid) => {
275
+ $xeTree.handleSetExpand(nodeid, expanded, expandedMaps);
276
+ });
277
+ reactData.treeExpandedMaps = expandedMaps;
278
+ }
279
+ return $xeTree.$nextTick();
280
+ },
281
+ setExpandNode(nodes, expanded) {
282
+ const $xeTree = this;
283
+ const reactData = $xeTree.reactData;
284
+ const expandedMaps = Object.assign(reactData.treeExpandedMaps);
285
+ if (nodes) {
286
+ if (!XEUtils.isArray(nodes)) {
287
+ nodes = [nodes];
288
+ }
289
+ nodes.forEach((node) => {
290
+ const nodeid = $xeTree.getNodeId(node);
291
+ $xeTree.handleSetExpand(nodeid, expanded, expandedMaps);
292
+ });
293
+ reactData.treeExpandedMaps = expandedMaps;
294
+ }
295
+ return $xeTree.$nextTick();
296
+ },
297
+ toggleExpandByNodeId(nodeids) {
298
+ const $xeTree = this;
299
+ const reactData = $xeTree.reactData;
300
+ const expandedMaps = Object.assign(reactData.treeExpandedMaps);
301
+ if (nodeids) {
302
+ if (!XEUtils.isArray(nodeids)) {
303
+ nodeids = [nodeids];
304
+ }
305
+ nodeids.forEach((nodeid) => {
306
+ $xeTree.handleSetExpand(nodeid, !expandedMaps[nodeid], expandedMaps);
307
+ });
308
+ reactData.treeExpandedMaps = expandedMaps;
309
+ }
310
+ return $xeTree.$nextTick();
311
+ },
312
+ toggleExpandNode(nodes) {
313
+ const $xeTree = this;
314
+ const reactData = $xeTree.reactData;
315
+ const expandedMaps = Object.assign(reactData.treeExpandedMaps);
316
+ if (nodes) {
317
+ if (!XEUtils.isArray(nodes)) {
318
+ nodes = [nodes];
319
+ }
320
+ nodes.forEach((node) => {
321
+ const nodeid = $xeTree.getNodeId(node);
322
+ $xeTree.handleSetExpand(nodeid, !expandedMaps[nodeid], expandedMaps);
323
+ });
324
+ reactData.treeExpandedMaps = expandedMaps;
325
+ }
326
+ return $xeTree.$nextTick();
327
+ },
328
+ setAllExpandNode() {
329
+ const $xeTree = this;
330
+ const reactData = $xeTree.reactData;
331
+ const expandedMaps = Object.assign(reactData.treeExpandedMaps);
332
+ const childrenField = $xeTree.computeChildrenField;
333
+ XEUtils.eachTree(reactData.treeList, (node) => {
334
+ const nodeid = $xeTree.getNodeId(node);
335
+ expandedMaps[nodeid] = true;
336
+ }, { children: childrenField });
337
+ reactData.treeExpandedMaps = expandedMaps;
338
+ return $xeTree.$nextTick();
339
+ },
340
+ reloadExpandNode(node) {
341
+ const $xeTree = this;
342
+ const props = $xeTree;
343
+ const { lazy } = props;
344
+ if (lazy) {
345
+ $xeTree.clearExpandLoaded(node);
346
+ return $xeTree.handleAsyncTreeExpandChilds(node);
347
+ }
348
+ return $xeTree.$nextTick();
349
+ },
350
+ clearExpandLoaded(node) {
351
+ const $xeTree = this;
352
+ const props = $xeTree;
353
+ const reactData = $xeTree.reactData;
354
+ const { lazy } = props;
355
+ const { nodeMaps } = reactData;
356
+ if (lazy) {
357
+ const nodeItem = nodeMaps[$xeTree.getNodeId(node)];
358
+ if (nodeItem) {
359
+ nodeItem.treeLoaded = false;
360
+ }
361
+ }
362
+ return $xeTree.$nextTick();
363
+ },
364
+ /**
365
+ * 用于树结构,给行数据加载子节点
366
+ */
367
+ loadChildrenNode(node, childRecords) {
368
+ const $xeTree = this;
369
+ const props = $xeTree;
370
+ const reactData = $xeTree.reactData;
371
+ const { lazy, transform } = props;
372
+ const { nodeMaps } = reactData;
373
+ if (!lazy) {
374
+ return Promise.resolve([]);
375
+ }
376
+ const childrenField = $xeTree.computeChildrenField;
377
+ const parentNodeItem = nodeMaps[$xeTree.getNodeId(node)];
378
+ const parentLevel = parentNodeItem ? parentNodeItem.level : 0;
379
+ const parentNodes = parentNodeItem ? parentNodeItem.nodes : [];
380
+ return $xeTree.createNode(childRecords).then((nodeList) => {
381
+ XEUtils.eachTree(nodeList, (childRow, index, items, path, parent, nodes) => {
382
+ const itemNodeId = $xeTree.getNodeId(childRow);
383
+ nodeMaps[itemNodeId] = {
384
+ item: node,
385
+ itemIndex: -1,
386
+ items,
387
+ parent: parent || parentNodeItem.item,
388
+ nodes: parentNodes.concat(nodes),
389
+ level: parentLevel + nodes.length,
390
+ lineCount: 0,
391
+ treeLoaded: false
392
+ };
393
+ }, { children: childrenField });
394
+ node[childrenField] = nodeList;
395
+ if (transform) {
396
+ node[childrenField] = nodeList;
397
+ }
398
+ $xeTree.updateNodeLine(node);
399
+ return nodeList;
400
+ });
401
+ },
402
+ getNodeId(node) {
403
+ const $xeTree = this;
404
+ const valueField = $xeTree.computeValueField;
405
+ const nodeid = XEUtils.get(node, valueField);
406
+ return XEUtils.eqNull(nodeid) ? '' : encodeURIComponent(nodeid);
407
+ },
408
+ isExpandByNode(node) {
409
+ const $xeTree = this;
410
+ const reactData = $xeTree.reactData;
411
+ const { treeExpandedMaps } = reactData;
412
+ const nodeid = $xeTree.getNodeId(node);
413
+ return !!treeExpandedMaps[nodeid];
414
+ },
415
+ isCheckedByRadioNodeId(nodeid) {
416
+ const $xeTree = this;
417
+ const reactData = $xeTree.reactData;
418
+ const { selectRadioKey } = reactData;
419
+ return selectRadioKey === nodeid;
420
+ },
421
+ isCheckedByRadioNode(node) {
422
+ const $xeTree = this;
423
+ return $xeTree.isCheckedByRadioNodeId($xeTree.getNodeId(node));
424
+ },
425
+ isCheckedByCheckboxNodeId(nodeid) {
426
+ const $xeTree = this;
427
+ const reactData = $xeTree.reactData;
428
+ const { selectCheckboxMaps } = reactData;
429
+ return !!selectCheckboxMaps[nodeid];
430
+ },
431
+ isCheckedByCheckboxNode(node) {
432
+ const $xeTree = this;
433
+ return $xeTree.isCheckedByCheckboxNodeId($xeTree.getNodeId(node));
434
+ },
435
+ isIndeterminateByCheckboxNodeid(nodeid) {
436
+ const $xeTree = this;
437
+ const reactData = $xeTree.reactData;
438
+ const { indeterminateCheckboxMaps } = reactData;
439
+ return !!indeterminateCheckboxMaps[nodeid];
440
+ },
441
+ isIndeterminateByCheckboxNode(node) {
442
+ const $xeTree = this;
443
+ return $xeTree.isIndeterminateByCheckboxNodeid($xeTree.getNodeId(node));
444
+ },
445
+ emitCheckboxMode(value) {
446
+ const $xeTree = this;
447
+ $xeTree.$emit('update:checkNodeKeys', value);
448
+ },
449
+ emitRadioMode(value) {
450
+ const $xeTree = this;
451
+ $xeTree.$emit('update:checkNodeKey', value);
452
+ },
453
+ setRadioNode(node, checked) {
454
+ const $xeTree = this;
455
+ const reactData = $xeTree.reactData;
456
+ if (node) {
457
+ reactData.selectRadioKey = checked ? $xeTree.getNodeId(node) : null;
458
+ }
459
+ return $xeTree.$nextTick();
460
+ },
461
+ setCheckboxNode(nodeList, checked) {
462
+ const $xeTree = this;
463
+ if (nodeList) {
464
+ if (!XEUtils.isArray(nodeList)) {
465
+ nodeList = [nodeList];
466
+ }
467
+ $xeTree.handleCheckedCheckboxNode(nodeList.map((item) => $xeTree.getNodeId(item)), checked);
468
+ }
469
+ return $xeTree.$nextTick();
470
+ },
471
+ setCheckboxByNodeId(nodeIds, checked) {
472
+ const $xeTree = this;
473
+ if (nodeIds) {
474
+ if (!XEUtils.isArray(nodeIds)) {
475
+ nodeIds = [nodeIds];
476
+ }
477
+ $xeTree.handleCheckedCheckboxNode(nodeIds, checked);
478
+ }
479
+ return $xeTree.$nextTick();
480
+ },
481
+ handleCheckedCheckboxNode(nodeIds, checked) {
482
+ const $xeTree = this;
483
+ const reactData = $xeTree.reactData;
484
+ const selectKeyMaps = Object.assign({}, reactData.selectCheckboxMaps);
485
+ nodeIds.forEach((key) => {
486
+ if (checked) {
487
+ selectKeyMaps[key] = true;
488
+ }
489
+ else if (selectKeyMaps[key]) {
490
+ delete selectKeyMaps[key];
491
+ }
492
+ });
493
+ reactData.selectCheckboxMaps = selectKeyMaps;
494
+ },
495
+ updateCheckboxChecked(nodeIds) {
496
+ const $xeTree = this;
497
+ const reactData = $xeTree.reactData;
498
+ const selectKeyMaps = {};
499
+ if (nodeIds) {
500
+ nodeIds.forEach((key) => {
501
+ selectKeyMaps[key] = true;
502
+ });
503
+ }
504
+ reactData.selectCheckboxMaps = selectKeyMaps;
505
+ },
506
+ handleSetExpand(nodeid, expanded, expandedMaps) {
507
+ if (expanded) {
508
+ if (expandedMaps[nodeid]) {
509
+ expandedMaps[nodeid] = true;
510
+ }
511
+ }
512
+ else {
513
+ if (expandedMaps[nodeid]) {
514
+ delete expandedMaps[nodeid];
515
+ }
516
+ }
517
+ },
518
+ createNode(records) {
519
+ const $xeTree = this;
520
+ const valueField = $xeTree.computeValueField;
521
+ return Promise.resolve(records.map(obj => {
522
+ const item = Object.assign({}, obj);
523
+ let nodeid = $xeTree.getNodeId(item);
524
+ if (!nodeid) {
525
+ nodeid = getNodeUniqueId();
526
+ XEUtils.set(item, valueField, nodeid);
527
+ }
528
+ return item;
529
+ }));
530
+ },
531
+ cacheNodeMap() {
532
+ const $xeTree = this;
533
+ const reactData = $xeTree.reactData;
534
+ const { treeList } = reactData;
535
+ const valueField = $xeTree.computeValueField;
536
+ const childrenField = $xeTree.computeChildrenField;
537
+ const keyMaps = {};
538
+ XEUtils.eachTree(treeList, (item, itemIndex, items, path, parent, nodes) => {
539
+ let nodeid = $xeTree.getNodeId(item);
540
+ if (!nodeid) {
541
+ nodeid = getNodeUniqueId();
542
+ XEUtils.set(item, valueField, nodeid);
543
+ }
544
+ keyMaps[nodeid] = {
545
+ item,
546
+ itemIndex,
547
+ items,
548
+ parent,
549
+ nodes,
550
+ level: nodes.length,
551
+ lineCount: 0,
552
+ treeLoaded: false
553
+ };
554
+ }, { children: childrenField });
555
+ reactData.nodeMaps = keyMaps;
556
+ },
557
+ updateData(list) {
558
+ const $xeTree = this;
559
+ const props = $xeTree;
560
+ const reactData = $xeTree.reactData;
561
+ const { transform } = props;
562
+ const keyField = $xeTree.computeKeyField;
563
+ const parentField = $xeTree.computeParentField;
564
+ const childrenField = $xeTree.computeChildrenField;
565
+ if (transform) {
566
+ reactData.treeList = XEUtils.toArrayTree(list, { key: keyField, parentKey: parentField, mapChildren: childrenField });
567
+ }
568
+ else {
569
+ reactData.treeList = list ? list.slice(0) : [];
570
+ }
571
+ $xeTree.cacheNodeMap();
572
+ },
573
+ handleCountLine(item, isRoot, nodeItem) {
574
+ const $xeTree = this;
575
+ const reactData = $xeTree.reactData;
576
+ const { treeExpandedMaps } = reactData;
577
+ const childrenField = $xeTree.computeChildrenField;
578
+ const nodeid = $xeTree.getNodeId(item);
579
+ nodeItem.lineCount++;
580
+ if (treeExpandedMaps[nodeid]) {
581
+ XEUtils.arrayEach(item[childrenField], (childItem, childIndex, childList) => {
582
+ if (!isRoot || childIndex < childList.length - 1) {
583
+ $xeTree.handleCountLine(childItem, false, nodeItem);
584
+ }
585
+ });
586
+ }
587
+ },
588
+ updateNodeLine(node) {
589
+ const $xeTree = this;
590
+ const reactData = $xeTree.reactData;
591
+ const { nodeMaps } = reactData;
592
+ if (node) {
593
+ const nodeid = $xeTree.getNodeId(node);
594
+ const nodeItem = nodeMaps[nodeid];
595
+ if (nodeItem) {
596
+ XEUtils.lastArrayEach(nodeItem.nodes, childItem => {
597
+ const nodeid = $xeTree.getNodeId(childItem);
598
+ const nodeItem = nodeMaps[nodeid];
599
+ if (nodeItem) {
600
+ nodeItem.lineCount = 0;
601
+ $xeTree.handleCountLine(childItem, true, nodeItem);
602
+ }
603
+ });
604
+ }
605
+ }
606
+ },
607
+ handleNodeClickEvent(evnt, node) {
608
+ const $xeTree = this;
609
+ const props = $xeTree;
610
+ const reactData = $xeTree.reactData;
611
+ const { showRadio, showCheckbox, trigger } = props;
612
+ const radioOpts = $xeTree.computeRadioOpts;
613
+ const checkboxOpts = $xeTree.computeCheckboxOpts;
614
+ const isRowCurrent = $xeTree.computeIsRowCurrent;
615
+ let triggerCurrent = false;
616
+ let triggerRadio = false;
617
+ let triggerCheckbox = false;
618
+ let triggerExpand = false;
619
+ if (isRowCurrent) {
620
+ triggerCurrent = true;
621
+ $xeTree.changeCurrentEvent(evnt, node);
622
+ }
623
+ else if (reactData.currentNode) {
624
+ reactData.currentNode = null;
625
+ }
626
+ if (trigger === 'node') {
627
+ triggerExpand = true;
628
+ $xeTree.toggleExpandEvent(evnt, node);
629
+ }
630
+ if (showRadio && radioOpts.trigger === 'node') {
631
+ triggerRadio = true;
632
+ $xeTree.changeRadioEvent(evnt, node);
633
+ }
634
+ if (showCheckbox && checkboxOpts.trigger === 'node') {
635
+ triggerCheckbox = true;
636
+ $xeTree.changeCheckboxEvent(evnt, node);
637
+ }
638
+ $xeTree.dispatchEvent('node-click', { node, triggerCurrent, triggerRadio, triggerCheckbox, triggerExpand }, evnt);
639
+ },
640
+ handleNodeDblclickEvent(evnt, node) {
641
+ const $xeTree = this;
642
+ $xeTree.dispatchEvent('node-dblclick', { node }, evnt);
643
+ },
644
+ handleAsyncTreeExpandChilds(node) {
645
+ const $xeTree = this;
646
+ const props = $xeTree;
647
+ const reactData = $xeTree.reactData;
648
+ const checkboxOpts = $xeTree.computeCheckboxOpts;
649
+ const { loadMethod } = props;
650
+ const { checkStrictly } = checkboxOpts;
651
+ return new Promise(resolve => {
652
+ if (loadMethod) {
653
+ const { treeExpandLazyLoadedMaps } = reactData;
654
+ const { nodeMaps } = reactData;
655
+ const nodeid = $xeTree.getNodeId(node);
656
+ const nodeItem = nodeMaps[nodeid];
657
+ treeExpandLazyLoadedMaps[nodeid] = true;
658
+ Promise.resolve(loadMethod({ $tree: $xeTree, node })).then((childRecords) => {
659
+ nodeItem.treeLoaded = true;
660
+ if (treeExpandLazyLoadedMaps[nodeid]) {
661
+ delete treeExpandLazyLoadedMaps[nodeid];
662
+ }
663
+ if (!XEUtils.isArray(childRecords)) {
664
+ childRecords = [];
665
+ }
666
+ if (childRecords) {
667
+ return $xeTree.loadChildrenNode(node, childRecords).then(childRows => {
668
+ const { treeExpandedMaps } = reactData;
669
+ if (childRows.length && !treeExpandedMaps[nodeid]) {
670
+ treeExpandedMaps[nodeid] = true;
671
+ }
672
+ // 如果当前节点已选中,则展开后子节点也被选中
673
+ if (!checkStrictly && $xeTree.isCheckedByCheckboxNodeId(nodeid)) {
674
+ $xeTree.handleCheckedCheckboxNode(childRows.map((item) => $xeTree.getNodeId(item)), true);
675
+ }
676
+ $xeTree.updateNodeLine(node);
677
+ $xeTree.dispatchEvent('load-success', { node, data: childRecords }, new Event('load-success'));
678
+ return $xeTree.$nextTick();
679
+ });
680
+ }
681
+ else {
682
+ $xeTree.updateNodeLine(node);
683
+ $xeTree.dispatchEvent('load-success', { node, data: childRecords }, new Event('load-success'));
684
+ }
685
+ }).catch((e) => {
686
+ const { treeExpandLazyLoadedMaps } = reactData;
687
+ nodeItem.treeLoaded = false;
688
+ if (treeExpandLazyLoadedMaps[nodeid]) {
689
+ delete treeExpandLazyLoadedMaps[nodeid];
690
+ }
691
+ $xeTree.updateNodeLine(node);
692
+ $xeTree.dispatchEvent('load-error', { node, data: e }, new Event('load-error'));
693
+ }).finally(() => {
694
+ return $xeTree.$nextTick();
695
+ });
696
+ }
697
+ else {
698
+ resolve();
699
+ }
700
+ });
701
+ },
702
+ /**
703
+ * 展开与收起树节点
704
+ * @param nodeList
705
+ * @param expanded
706
+ * @returns
707
+ */
708
+ handleBaseTreeExpand(nodeList, expanded) {
709
+ const $xeTree = this;
710
+ const props = $xeTree;
711
+ const reactData = $xeTree.reactData;
712
+ const { lazy, accordion, toggleMethod } = props;
713
+ const { nodeMaps, treeExpandLazyLoadedMaps } = reactData;
714
+ const tempExpandedMaps = Object.assign({}, reactData.treeExpandedMaps);
715
+ const childrenField = $xeTree.computeChildrenField;
716
+ const hasChildField = $xeTree.computeHasChildField;
717
+ const result = [];
718
+ let validNodes = toggleMethod ? nodeList.filter((node) => toggleMethod({ $tree: $xeTree, expanded, node })) : nodeList;
719
+ if (accordion) {
720
+ validNodes = validNodes.length ? [validNodes[validNodes.length - 1]] : [];
721
+ // 同一级只能展开一个
722
+ const nodeid = $xeTree.getNodeId(validNodes[0]);
723
+ const nodeItem = nodeMaps[nodeid];
724
+ if (nodeItem) {
725
+ nodeItem.items.forEach(item => {
726
+ const itemNodeId = $xeTree.getNodeId(item);
727
+ if (tempExpandedMaps[itemNodeId]) {
728
+ delete tempExpandedMaps[itemNodeId];
729
+ }
730
+ });
731
+ }
732
+ }
733
+ const expandNodes = [];
734
+ if (expanded) {
735
+ validNodes.forEach((item) => {
736
+ const itemNodeId = $xeTree.getNodeId(item);
737
+ if (!tempExpandedMaps[itemNodeId]) {
738
+ const nodeItem = nodeMaps[itemNodeId];
739
+ const isLoad = lazy && item[hasChildField] && !nodeItem.treeLoaded && !treeExpandLazyLoadedMaps[itemNodeId];
740
+ // 是否使用懒加载
741
+ if (isLoad) {
742
+ result.push($xeTree.handleAsyncTreeExpandChilds(item));
743
+ }
744
+ else {
745
+ if (item[childrenField] && item[childrenField].length) {
746
+ tempExpandedMaps[itemNodeId] = true;
747
+ expandNodes.push(item);
748
+ }
749
+ }
750
+ }
751
+ });
752
+ }
753
+ else {
754
+ validNodes.forEach(item => {
755
+ const itemNodeId = $xeTree.getNodeId(item);
756
+ if (tempExpandedMaps[itemNodeId]) {
757
+ delete tempExpandedMaps[itemNodeId];
758
+ expandNodes.push(item);
759
+ }
760
+ });
761
+ }
762
+ reactData.treeExpandedMaps = tempExpandedMaps;
763
+ expandNodes.forEach((node) => {
764
+ $xeTree.updateNodeLine(node);
765
+ });
766
+ return Promise.all(result);
767
+ },
768
+ toggleExpandEvent(evnt, node) {
769
+ const $xeTree = this;
770
+ const props = $xeTree;
771
+ const reactData = $xeTree.reactData;
772
+ const { lazy } = props;
773
+ const { treeExpandedMaps, treeExpandLazyLoadedMaps } = reactData;
774
+ const nodeid = $xeTree.getNodeId(node);
775
+ const expanded = !treeExpandedMaps[nodeid];
776
+ evnt.stopPropagation();
777
+ if (!lazy || !treeExpandLazyLoadedMaps[nodeid]) {
778
+ $xeTree.handleBaseTreeExpand([node], expanded);
779
+ }
780
+ },
781
+ handleNodeCheckboxStatus(node, selectKeyMaps, indeterminateMaps) {
782
+ const $xeTree = this;
783
+ const childrenField = $xeTree.computeChildrenField;
784
+ const childList = XEUtils.get(node, childrenField);
785
+ const nodeid = $xeTree.getNodeId(node);
786
+ if (childList && childList.length) {
787
+ let checkSome = false;
788
+ let checkSize = 0;
789
+ childList.forEach(childNode => {
790
+ const childNodeid = $xeTree.getNodeId(childNode);
791
+ const isChecked = selectKeyMaps[childNodeid];
792
+ if (isChecked || indeterminateMaps[childNodeid]) {
793
+ if (isChecked) {
794
+ checkSize++;
795
+ }
796
+ checkSome = true;
797
+ }
798
+ });
799
+ const checkAll = checkSize === childList.length;
800
+ if (checkAll) {
801
+ if (!selectKeyMaps[nodeid]) {
802
+ selectKeyMaps[nodeid] = true;
803
+ }
804
+ if (indeterminateMaps[nodeid]) {
805
+ delete indeterminateMaps[nodeid];
806
+ }
807
+ }
808
+ else {
809
+ if (selectKeyMaps[nodeid]) {
810
+ delete selectKeyMaps[nodeid];
811
+ }
812
+ indeterminateMaps[nodeid] = checkSome;
813
+ }
814
+ }
815
+ else {
816
+ if (indeterminateMaps[nodeid]) {
817
+ delete indeterminateMaps[nodeid];
818
+ }
819
+ }
820
+ },
821
+ updateCheckboxStatus() {
822
+ const $xeTree = this;
823
+ const reactData = $xeTree.reactData;
824
+ const { treeList } = reactData;
825
+ const childrenField = $xeTree.computeChildrenField;
826
+ const checkboxOpts = $xeTree.computeCheckboxOpts;
827
+ const { checkStrictly } = checkboxOpts;
828
+ if (!checkStrictly) {
829
+ const selectKeyMaps = Object.assign({}, reactData.selectCheckboxMaps);
830
+ const indeterminateMaps = {};
831
+ XEUtils.eachTree(treeList, (node, index, items, path, parent, nodes) => {
832
+ const childList = XEUtils.get(node, childrenField);
833
+ if (!childList || !childList.length) {
834
+ $xeTree.handleNodeCheckboxStatus(node, selectKeyMaps, indeterminateMaps);
835
+ }
836
+ if (index === items.length - 1) {
837
+ for (let len = nodes.length - 2; len >= 0; len--) {
838
+ const parentItem = nodes[len];
839
+ $xeTree.handleNodeCheckboxStatus(parentItem, selectKeyMaps, indeterminateMaps);
840
+ }
841
+ }
842
+ });
843
+ reactData.selectCheckboxMaps = selectKeyMaps;
844
+ reactData.indeterminateCheckboxMaps = indeterminateMaps;
845
+ }
846
+ },
847
+ changeCheckboxEvent(evnt, node) {
848
+ const $xeTree = this;
849
+ const reactData = $xeTree.reactData;
850
+ evnt.preventDefault();
851
+ evnt.stopPropagation();
852
+ const checkboxOpts = $xeTree.computeCheckboxOpts;
853
+ const { checkStrictly, checkMethod } = checkboxOpts;
854
+ let isDisabled = !!checkMethod;
855
+ if (checkMethod) {
856
+ isDisabled = !checkMethod({ node });
857
+ }
858
+ if (isDisabled) {
859
+ return;
860
+ }
861
+ const selectKeyMaps = Object.assign({}, reactData.selectCheckboxMaps);
862
+ const childrenField = $xeTree.computeChildrenField;
863
+ const nodeid = $xeTree.getNodeId(node);
864
+ let isChecked = false;
865
+ if (selectKeyMaps[nodeid]) {
866
+ delete selectKeyMaps[nodeid];
867
+ }
868
+ else {
869
+ isChecked = true;
870
+ selectKeyMaps[nodeid] = isChecked;
871
+ }
872
+ if (!checkStrictly) {
873
+ XEUtils.eachTree(XEUtils.get(node, childrenField), (childNode) => {
874
+ const childNodeid = $xeTree.getNodeId(childNode);
875
+ if (isChecked) {
876
+ if (!selectKeyMaps[childNodeid]) {
877
+ selectKeyMaps[childNodeid] = true;
878
+ }
879
+ }
880
+ else {
881
+ if (selectKeyMaps[childNodeid]) {
882
+ delete selectKeyMaps[childNodeid];
883
+ }
884
+ }
885
+ }, { children: childrenField });
886
+ }
887
+ reactData.selectCheckboxMaps = selectKeyMaps;
888
+ $xeTree.updateCheckboxStatus();
889
+ const value = Object.keys(reactData.selectCheckboxMaps);
890
+ $xeTree.emitCheckboxMode(value);
891
+ $xeTree.dispatchEvent('checkbox-change', { node, value, checked: isChecked }, evnt);
892
+ },
893
+ changeCurrentEvent(evnt, node) {
894
+ const $xeTree = this;
895
+ const reactData = $xeTree.reactData;
896
+ evnt.preventDefault();
897
+ const nodeOpts = $xeTree.computeNodeOpts;
898
+ const { currentMethod, trigger } = nodeOpts;
899
+ const childrenField = $xeTree.computeChildrenField;
900
+ const childList = XEUtils.get(node, childrenField);
901
+ const hasChild = childList && childList.length;
902
+ let isDisabled = !!currentMethod;
903
+ if (trigger === 'child') {
904
+ if (hasChild) {
905
+ return;
906
+ }
907
+ }
908
+ else if (trigger === 'parent') {
909
+ if (!hasChild) {
910
+ return;
911
+ }
912
+ }
913
+ if (currentMethod) {
914
+ isDisabled = !currentMethod({ node });
915
+ }
916
+ if (isDisabled) {
917
+ return;
918
+ }
919
+ const isChecked = true;
920
+ reactData.currentNode = node;
921
+ $xeTree.dispatchEvent('current-change', { node, checked: isChecked }, evnt);
922
+ },
923
+ changeRadioEvent(evnt, node) {
924
+ const $xeTree = this;
925
+ const reactData = $xeTree.reactData;
926
+ evnt.preventDefault();
927
+ evnt.stopPropagation();
928
+ const radioOpts = $xeTree.computeRadioOpts;
929
+ const { checkMethod } = radioOpts;
930
+ let isDisabled = !!checkMethod;
931
+ if (checkMethod) {
932
+ isDisabled = !checkMethod({ node });
933
+ }
934
+ if (isDisabled) {
935
+ return;
936
+ }
937
+ const isChecked = true;
938
+ const value = $xeTree.getNodeId(node);
939
+ reactData.selectRadioKey = value;
940
+ $xeTree.emitRadioMode(value);
941
+ $xeTree.dispatchEvent('radio-change', { node, value, checked: isChecked }, evnt);
942
+ },
943
+ //
944
+ // Render
945
+ //
946
+ renderRadio(h, node, nodeid, isChecked) {
947
+ const $xeTree = this;
948
+ const props = $xeTree;
949
+ const { showRadio } = props;
950
+ const radioOpts = $xeTree.computeRadioOpts;
951
+ const { showIcon, checkMethod, visibleMethod } = radioOpts;
952
+ const isVisible = !visibleMethod || visibleMethod({ node });
953
+ let isDisabled = !!checkMethod;
954
+ if (showRadio && showIcon && isVisible) {
955
+ if (checkMethod) {
956
+ isDisabled = !checkMethod({ node });
957
+ }
958
+ return h('div', {
959
+ class: ['vxe-tree--radio-option', {
960
+ 'is--checked': isChecked,
961
+ 'is--disabled': isDisabled
962
+ }],
963
+ on: {
964
+ click: (evnt) => {
965
+ if (!isDisabled) {
966
+ $xeTree.changeRadioEvent(evnt, node);
967
+ }
968
+ }
969
+ }
970
+ }, [
971
+ h('span', {
972
+ class: ['vxe-radio--icon', isChecked ? getIcon().RADIO_CHECKED : getIcon().RADIO_UNCHECKED]
973
+ })
974
+ ]);
975
+ }
976
+ return renderEmptyElement($xeTree);
977
+ },
978
+ renderCheckbox(h, node, nodeid, isChecked) {
979
+ const $xeTree = this;
980
+ const props = $xeTree;
981
+ const { showCheckbox } = props;
982
+ const checkboxOpts = $xeTree.computeCheckboxOpts;
983
+ const { showIcon, checkMethod, visibleMethod } = checkboxOpts;
984
+ const isIndeterminate = $xeTree.isIndeterminateByCheckboxNodeid(nodeid);
985
+ const isVisible = !visibleMethod || visibleMethod({ node });
986
+ let isDisabled = !!checkMethod;
987
+ if (showCheckbox && showIcon && isVisible) {
988
+ if (checkMethod) {
989
+ isDisabled = !checkMethod({ node });
990
+ }
991
+ return h('div', {
992
+ class: ['vxe-tree--checkbox-option', {
993
+ 'is--checked': isChecked,
994
+ 'is--indeterminate': isIndeterminate,
995
+ 'is--disabled': isDisabled
996
+ }],
997
+ on: {
998
+ click: (evnt) => {
999
+ if (!isDisabled) {
1000
+ $xeTree.changeCheckboxEvent(evnt, node);
1001
+ }
1002
+ }
1003
+ }
1004
+ }, [
1005
+ h('span', {
1006
+ class: ['vxe-checkbox--icon', isIndeterminate ? getIcon().CHECKBOX_INDETERMINATE : (isChecked ? getIcon().CHECKBOX_CHECKED : getIcon().CHECKBOX_UNCHECKED)]
1007
+ })
1008
+ ]);
1009
+ }
1010
+ return renderEmptyElement($xeTree);
1011
+ },
1012
+ renderNode(h, node) {
1013
+ const $xeTree = this;
1014
+ const props = $xeTree;
1015
+ const slots = $xeTree.$scopedSlots;
1016
+ const reactData = $xeTree.reactData;
1017
+ const { lazy, showRadio, showCheckbox, showLine, indent, iconOpen, iconClose, iconLoaded, showIcon } = props;
1018
+ const { nodeMaps, treeExpandedMaps, currentNode, selectRadioKey, treeExpandLazyLoadedMaps } = reactData;
1019
+ const childrenField = $xeTree.computeChildrenField;
1020
+ const titleField = $xeTree.computeTitleField;
1021
+ const hasChildField = $xeTree.computeHasChildField;
1022
+ const childList = XEUtils.get(node, childrenField);
1023
+ const hasChild = childList && childList.length;
1024
+ const titleSlot = slots.title;
1025
+ const extraSlot = slots.extra;
1026
+ const nodeid = $xeTree.getNodeId(node);
1027
+ const isExpand = treeExpandedMaps[nodeid];
1028
+ const nodeItem = nodeMaps[nodeid];
1029
+ const nodeValue = XEUtils.get(node, titleField);
1030
+ const childVns = [];
1031
+ if (hasChild && treeExpandedMaps[nodeid]) {
1032
+ if (showLine) {
1033
+ childVns.push(h('div', {
1034
+ key: 'line',
1035
+ class: 'vxe-tree--node-child-line',
1036
+ style: {
1037
+ height: `calc(${nodeItem.lineCount} * var(--vxe-ui-tree-node-height) - var(--vxe-ui-tree-node-height) / 2)`,
1038
+ left: `${(nodeItem.level + 1) * (indent || 1)}px`
1039
+ }
1040
+ }));
1041
+ }
1042
+ childList.forEach(childItem => {
1043
+ childVns.push($xeTree.renderNode(h, childItem));
1044
+ });
1045
+ }
1046
+ let isRadioChecked = false;
1047
+ if (showRadio) {
1048
+ // eslint-disable-next-line eqeqeq
1049
+ isRadioChecked = nodeid == selectRadioKey;
1050
+ }
1051
+ let isCheckboxChecked = false;
1052
+ if (showCheckbox) {
1053
+ isCheckboxChecked = $xeTree.isCheckedByCheckboxNodeId(nodeid);
1054
+ }
1055
+ let hasLazyChilds = false;
1056
+ let isLazyLoading = false;
1057
+ let isLazyLoaded = false;
1058
+ if (lazy) {
1059
+ isLazyLoading = !!treeExpandLazyLoadedMaps[nodeid];
1060
+ hasLazyChilds = node[hasChildField];
1061
+ isLazyLoaded = !!nodeItem.treeLoaded;
1062
+ }
1063
+ return h('div', {
1064
+ class: ['vxe-tree--node-wrapper', `node--level-${nodeItem.level}`],
1065
+ attrs: {
1066
+ nodeid
1067
+ }
1068
+ }, [
1069
+ h('div', {
1070
+ class: ['vxe-tree--node-item', {
1071
+ 'is--current': currentNode && nodeid === $xeTree.getNodeId(currentNode),
1072
+ 'is-radio--checked': isRadioChecked,
1073
+ 'is-checkbox--checked': isCheckboxChecked
1074
+ }],
1075
+ style: {
1076
+ paddingLeft: `${(nodeItem.level - 1) * (indent || 1)}px`
1077
+ },
1078
+ on: {
1079
+ click(evnt) {
1080
+ $xeTree.handleNodeClickEvent(evnt, node);
1081
+ },
1082
+ dblclick(evnt) {
1083
+ $xeTree.handleNodeDblclickEvent(evnt, node);
1084
+ }
1085
+ }
1086
+ }, [
1087
+ showIcon || showLine
1088
+ ? h('div', {
1089
+ class: 'vxe-tree--node-item-switcher'
1090
+ }, showIcon && (lazy ? (isLazyLoaded ? hasChild : hasLazyChilds) : hasChild)
1091
+ ? [
1092
+ h('div', {
1093
+ class: 'vxe-tree--node-item-icon',
1094
+ on: {
1095
+ click(evnt) {
1096
+ $xeTree.toggleExpandEvent(evnt, node);
1097
+ }
1098
+ }
1099
+ }, [
1100
+ h('i', {
1101
+ class: isLazyLoading ? (iconLoaded || getIcon().TREE_NODE_LOADED) : (isExpand ? (iconOpen || getIcon().TREE_NODE_OPEN) : (iconClose || getIcon().TREE_NODE_CLOSE))
1102
+ })
1103
+ ])
1104
+ ]
1105
+ : [])
1106
+ : renderEmptyElement($xeTree),
1107
+ $xeTree.renderRadio(h, node, nodeid, isRadioChecked),
1108
+ $xeTree.renderCheckbox(h, node, nodeid, isCheckboxChecked),
1109
+ h('div', {
1110
+ class: 'vxe-tree--node-item-inner'
1111
+ }, [
1112
+ h('div', {
1113
+ class: 'vxe-tree--node-item-title'
1114
+ }, titleSlot ? getSlotVNs(titleSlot({ node })) : `${nodeValue}`),
1115
+ extraSlot
1116
+ ? h('div', {
1117
+ class: 'vxe-tree--node-item-extra'
1118
+ }, getSlotVNs(extraSlot({ node })))
1119
+ : renderEmptyElement($xeTree)
1120
+ ])
1121
+ ]),
1122
+ hasChild && treeExpandedMaps[nodeid]
1123
+ ? h('div', {
1124
+ class: 'vxe-tree--node-child-wrapper'
1125
+ }, childVns)
1126
+ : renderEmptyElement($xeTree)
1127
+ ]);
1128
+ },
1129
+ renderNodeList(h) {
1130
+ const $xeTree = this;
1131
+ const reactData = $xeTree.reactData;
1132
+ const { treeList } = reactData;
1133
+ return h('div', {
1134
+ class: 'vxe-tree--node-list-wrapper'
1135
+ }, treeList.map(node => $xeTree.renderNode(h, node)));
1136
+ },
1137
+ renderVN(h) {
1138
+ const $xeTree = this;
1139
+ const props = $xeTree;
1140
+ const slots = $xeTree.$scopedSlots;
1141
+ const { loading, trigger, showLine } = props;
1142
+ const vSize = $xeTree.computeSize;
1143
+ const radioOpts = $xeTree.computeRadioOpts;
1144
+ const checkboxOpts = $xeTree.computeCheckboxOpts;
1145
+ const treeStyle = $xeTree.computeTreeStyle;
1146
+ const loadingOpts = $xeTree.computeLoadingOpts;
1147
+ const isRowHover = $xeTree.computeIsRowHover;
1148
+ const loadingSlot = slots.loading;
1149
+ return h('div', {
1150
+ ref: 'refElem',
1151
+ class: ['vxe-tree', {
1152
+ [`size--${vSize}`]: vSize,
1153
+ 'show--line': showLine,
1154
+ 'checkbox--highlight': checkboxOpts.highlight,
1155
+ 'radio--highlight': radioOpts.highlight,
1156
+ 'node--hover': isRowHover,
1157
+ 'node--trigger': trigger === 'node',
1158
+ 'is--loading': loading
1159
+ }],
1160
+ style: treeStyle
1161
+ }, [
1162
+ $xeTree.renderNodeList(h),
1163
+ /**
1164
+ * 加载中
1165
+ */
1166
+ h(VxeLoadingComponent, {
1167
+ class: 'vxe-tree--loading',
1168
+ props: {
1169
+ value: loading,
1170
+ icon: loadingOpts.icon,
1171
+ text: loadingOpts.text
1172
+ },
1173
+ scopedSlots: loadingSlot
1174
+ ? {
1175
+ default: () => loadingSlot({ $tree: $xeTree })
1176
+ }
1177
+ : {}
1178
+ })
1179
+ ]);
1180
+ }
1181
+ },
1182
+ watch: {
1183
+ data(val) {
1184
+ const $xeTree = this;
1185
+ $xeTree.updateData(val || []);
1186
+ },
1187
+ checkNodeKey(val) {
1188
+ const $xeTree = this;
1189
+ const reactData = $xeTree.reactData;
1190
+ reactData.selectRadioKey = val;
1191
+ },
1192
+ checkNodeKeys() {
1193
+ const $xeTree = this;
1194
+ const props = $xeTree;
1195
+ $xeTree.updateCheckboxChecked(props.checkNodeKeys || []);
1196
+ }
1197
+ },
1198
+ created() {
1199
+ const $xeTree = this;
1200
+ const props = $xeTree;
1201
+ const reactData = $xeTree.reactData;
1202
+ reactData.selectRadioKey = props.checkNodeKey || null;
1203
+ $xeTree.updateData(props.data || []);
1204
+ $xeTree.updateCheckboxChecked(props.checkNodeKeys || []);
1205
+ },
1206
+ beforeDestroy() {
1207
+ const $xeTree = this;
1208
+ const reactData = $xeTree.reactData;
1209
+ reactData.treeList = [];
1210
+ reactData.treeExpandedMaps = {};
1211
+ reactData.nodeMaps = {};
1212
+ },
1213
+ render(h) {
1214
+ return this.renderVN(h);
1215
+ }
1216
+ });