ai.touchui-vue 1.31.3 → 1.32.0

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 (753) hide show
  1. package/README.md +21 -21
  2. package/lib/ai.touchui-vue.common.js +1416 -1401
  3. package/lib/cascader.js +15 -3
  4. package/lib/chat.js +5 -5
  5. package/lib/collapse.js +1 -2
  6. package/lib/color.js +5 -5
  7. package/lib/date-picker.js +1 -2
  8. package/lib/date-range.js +16 -15
  9. package/lib/export.js +3 -3
  10. package/lib/index.js +1 -1
  11. package/lib/locale/format.js +10 -10
  12. package/lib/menu-icon.js +295 -295
  13. package/lib/mixins/migrating.js +20 -20
  14. package/lib/mixins/transition.js +14 -14
  15. package/lib/org.js +1 -2
  16. package/lib/page.js +1 -2
  17. package/lib/range.js +3 -3
  18. package/lib/scroll.js +8 -4
  19. package/lib/static/{net-mix.dc6e414.svg → net-mix.293a4b6.svg} +7 -7
  20. package/lib/tab.js +5 -5
  21. package/lib/table.js +22 -22
  22. package/lib/theme/css/theme/B-Design.css +1 -1
  23. package/lib/theme/css/theme/aiplan.css +1 -1
  24. package/lib/theme/css/theme/aiplangd.css +1 -1
  25. package/lib/theme/css/theme/chbn.css +1 -1
  26. package/lib/theme/css/theme/default.css +1 -1
  27. package/lib/theme/css/theme/dt.css +1 -1
  28. package/lib/theme/css/theme/ecloud.css +1 -1
  29. package/lib/theme/css/theme/hongkong.css +1 -1
  30. package/lib/theme/css/theme/narrow.css +1 -1
  31. package/lib/theme/css/theme/sdpf.css +1 -1
  32. package/lib/theme/css/theme/upc.css +1 -1
  33. package/lib/theme/css/theme/website.css +1 -1
  34. package/lib/theme/css/theme/zj.css +1 -1
  35. package/lib/utils/clickoutside.js +11 -11
  36. package/lib/utils/dom.js +13 -13
  37. package/lib/utils/filetransfer.js +4 -4
  38. package/lib/utils/jsencrypt/JSEncrypt.js +77 -77
  39. package/lib/utils/jsencrypt/JSEncryptRSAKey.js +115 -115
  40. package/lib/utils/jsencrypt/jselib/asn1js/asn1.js +4 -4
  41. package/lib/utils/jsencrypt/jselib/jsrsasign/asn1-1.0.js +734 -734
  42. package/lib/utils/jsencrypt/jselib/jsrsasign/yahoo.js +22 -22
  43. package/lib/utils/jsencrypt.js +260 -260
  44. package/lib/utils/md5.js +3 -3
  45. package/lib/utils/mime.js +2 -2
  46. package/lib/utils/ratio.js +53 -54
  47. package/lib/utils/sign.js +12 -12
  48. package/lib/utils/util.js +3 -3
  49. package/lib/utils/validate.js +11 -11
  50. package/package.json +159 -159
  51. package/packages/.DS_Store +0 -0
  52. package/packages/affix/index.js +8 -8
  53. package/packages/affix/src/affix.vue +139 -139
  54. package/packages/align/index.js +8 -8
  55. package/packages/align/src/directive.js +29 -29
  56. package/packages/animation/index.js +8 -8
  57. package/packages/animation/src/animation.vue +68 -68
  58. package/packages/article/.DS_Store +0 -0
  59. package/packages/article/index.js +8 -8
  60. package/packages/article/src/article.vue +23 -23
  61. package/packages/box/index.js +8 -8
  62. package/packages/box/src/box.vue +170 -170
  63. package/packages/button/index.js +8 -8
  64. package/packages/button/src/button.vue +162 -162
  65. package/packages/calendar/index.js +8 -8
  66. package/packages/calendar/src/calendar.vue +1142 -1142
  67. package/packages/card/index.js +10 -10
  68. package/packages/card/src/card-item.vue +92 -92
  69. package/packages/card/src/card.vue +175 -175
  70. package/packages/card-item/index.js +8 -8
  71. package/packages/cascader/index.js +8 -8
  72. package/packages/cascader/src/cascader.vue +818 -814
  73. package/packages/center-scroll/index.js +8 -8
  74. package/packages/center-scroll/src/center-scroll.vue +147 -147
  75. package/packages/chat/.DS_Store +0 -0
  76. package/packages/chat/index.js +12 -12
  77. package/packages/chat/src/.DS_Store +0 -0
  78. package/packages/chat/src/chat.vue +116 -116
  79. package/packages/checkbox/index.js +8 -8
  80. package/packages/checkbox/src/checkbox.vue +262 -262
  81. package/packages/checkboxes/index.js +8 -8
  82. package/packages/checkboxes/src/checkboxes.vue +97 -97
  83. package/packages/collapse/index.js +10 -10
  84. package/packages/collapse/src/collapse-item.vue +188 -188
  85. package/packages/collapse/src/collapse.vue +100 -100
  86. package/packages/color/index.js +8 -8
  87. package/packages/color/src/directive.js +42 -42
  88. package/packages/countdown/index.js +8 -8
  89. package/packages/countdown/src/countdown.vue +128 -128
  90. package/packages/date-picker/.DS_Store +0 -0
  91. package/packages/date-picker/index.js +8 -8
  92. package/packages/date-picker/src/date-picker.vue +438 -438
  93. package/packages/date-picker/src/picker.vue +342 -342
  94. package/packages/date-range/index.js +8 -8
  95. package/packages/date-range/src/date-range.vue +384 -384
  96. package/packages/dialog/index.js +8 -8
  97. package/packages/dialog/src/dialog.vue +313 -313
  98. package/packages/dis/.DS_Store +0 -0
  99. package/packages/dis/index.js +8 -8
  100. package/packages/dis/src/directive.js +42 -42
  101. package/packages/ellipsis/index.js +8 -8
  102. package/packages/ellipsis/src/ellipsis.vue +306 -306
  103. package/packages/emote/.DS_Store +0 -0
  104. package/packages/emote/index.js +8 -8
  105. package/packages/emote/src/emote.vue +38 -38
  106. package/packages/export/index.js +8 -8
  107. package/packages/export/src/ajax.js +73 -73
  108. package/packages/export/src/export.vue +289 -289
  109. package/packages/filter/.DS_Store +0 -0
  110. package/packages/filter/index.js +8 -8
  111. package/packages/filter/src/.DS_Store +0 -0
  112. package/packages/filter/src/filter.vue +245 -245
  113. package/packages/fix/index.js +8 -8
  114. package/packages/fix/src/fix.vue +221 -221
  115. package/packages/float/.DS_Store +0 -0
  116. package/packages/float/index.js +16 -16
  117. package/packages/float/src/directive.js +20 -20
  118. package/packages/float/src/main.vue +642 -642
  119. package/packages/float/src/trigger.vue +31 -31
  120. package/packages/flow/.DS_Store +0 -0
  121. package/packages/flow/index.js +8 -8
  122. package/packages/flow/src/flow.vue +234 -234
  123. package/packages/flow/src/flowItem.vue +61 -61
  124. package/packages/flow/src/flowLine.vue +168 -168
  125. package/packages/form/index.js +10 -10
  126. package/packages/form/src/form-item.vue +96 -96
  127. package/packages/form/src/form.vue +184 -184
  128. package/packages/grid/index.js +10 -10
  129. package/packages/grid/src/grid-item.vue +65 -65
  130. package/packages/grid/src/grid.vue +190 -190
  131. package/packages/grid-item/index.js +8 -8
  132. package/packages/guider/.DS_Store +0 -0
  133. package/packages/guider/index.js +8 -8
  134. package/packages/guider/src/guider.vue +168 -168
  135. package/packages/header/index.js +8 -8
  136. package/packages/header/src/header.vue +110 -110
  137. package/packages/hide/index.js +8 -8
  138. package/packages/hide/src/directive.js +57 -57
  139. package/packages/icon/index.js +8 -8
  140. package/packages/icon/src/icon.vue +79 -79
  141. package/packages/import/index.js +8 -8
  142. package/packages/import/src/import.vue +279 -279
  143. package/packages/input/index.js +8 -8
  144. package/packages/input/src/calcTextareaHeight.js +104 -104
  145. package/packages/input/src/input.vue +653 -653
  146. package/packages/ip/.DS_Store +0 -0
  147. package/packages/ip/index.js +8 -8
  148. package/packages/ip/src/ip.vue +143 -143
  149. package/packages/line/index.js +8 -8
  150. package/packages/line/src/line.vue +29 -29
  151. package/packages/loading/index.js +8 -8
  152. package/packages/loading/src/loading.js +58 -58
  153. package/packages/longtap/index.js +8 -8
  154. package/packages/longtap/src/longtap.js +95 -95
  155. package/packages/menu-icon/index.js +8 -8
  156. package/packages/menu-icon/src/menu-icon.vue +206 -206
  157. package/packages/message/index.js +8 -8
  158. package/packages/message/src/message.vue +9 -9
  159. package/packages/msg/index.js +8 -8
  160. package/packages/msg/src/msg.vue +227 -227
  161. package/packages/org/.DS_Store +0 -0
  162. package/packages/org/index.js +8 -8
  163. package/packages/org/src/org.vue +113 -113
  164. package/packages/org/src/orgItem.vue +63 -63
  165. package/packages/padding/index.js +8 -8
  166. package/packages/padding/src/padding.vue +105 -105
  167. package/packages/page/.DS_Store +0 -0
  168. package/packages/page/index.js +8 -8
  169. package/packages/page/src/.DS_Store +0 -0
  170. package/packages/page/src/page.vue +297 -297
  171. package/packages/param/index.js +8 -8
  172. package/packages/param/src/param.vue +226 -226
  173. package/packages/pic/.DS_Store +0 -0
  174. package/packages/pic/index.js +8 -8
  175. package/packages/pic/src/pic-viewer.vue +331 -331
  176. package/packages/pic/src/pic.vue +144 -144
  177. package/packages/popup/index.js +12 -12
  178. package/packages/popup/src/popup-group.vue +47 -47
  179. package/packages/popup/src/popup-item.vue +163 -163
  180. package/packages/popup/src/popup.vue +350 -350
  181. package/packages/progress/index.js +8 -8
  182. package/packages/progress/src/progress.vue +306 -306
  183. package/packages/range/index.js +8 -8
  184. package/packages/range/src/range.vue +612 -612
  185. package/packages/rate/.DS_Store +0 -0
  186. package/packages/rate/index.js +8 -8
  187. package/packages/rate/src/rate.vue +129 -129
  188. package/packages/reverser/.DS_Store +0 -0
  189. package/packages/reverser/index.js +8 -8
  190. package/packages/reverser/src/.DS_Store +0 -0
  191. package/packages/reverser/src/reverser.vue +49 -49
  192. package/packages/scroll/index.js +12 -12
  193. package/packages/scroll/src/scroll-point.vue +24 -24
  194. package/packages/scroll/src/scroll-sticky.vue +60 -60
  195. package/packages/scroll/src/scroll.vue +385 -381
  196. package/packages/segment/.DS_Store +0 -0
  197. package/packages/segment/index.js +8 -8
  198. package/packages/segment/src/segment.vue +618 -618
  199. package/packages/select/index.js +8 -8
  200. package/packages/select/src/select.vue +1445 -1445
  201. package/packages/size/index.js +8 -8
  202. package/packages/size/src/directive.js +33 -33
  203. package/packages/skeleton/index.js +8 -8
  204. package/packages/skeleton/src/skeleton.vue +179 -179
  205. package/packages/slide/.DS_Store +0 -0
  206. package/packages/slide/index.js +8 -8
  207. package/packages/slide/src/slide.vue +147 -147
  208. package/packages/space/index.js +8 -8
  209. package/packages/space/src/space.vue +53 -53
  210. package/packages/step/index.js +8 -8
  211. package/packages/step/src/step.vue +122 -122
  212. package/packages/submit/index.js +8 -8
  213. package/packages/submit/src/submit.vue +103 -103
  214. package/packages/switch/index.js +9 -9
  215. package/packages/switch/src/component.vue +131 -131
  216. package/packages/tab/.DS_Store +0 -0
  217. package/packages/tab/index.js +10 -10
  218. package/packages/tab/src/tab-item.vue +85 -85
  219. package/packages/tab/src/tab.vue +599 -599
  220. package/packages/table/.DS_Store +0 -0
  221. package/packages/table/index.js +8 -8
  222. package/packages/table/src/table-body.vue +301 -301
  223. package/packages/table/src/table-config.vue +139 -139
  224. package/packages/table/src/table-head.vue +242 -242
  225. package/packages/table/src/table.vue +1458 -1458
  226. package/packages/tag/index.js +8 -8
  227. package/packages/tag/src/tag.vue +129 -129
  228. package/packages/theme/lib/css/theme/B-Design.css +1 -1
  229. package/packages/theme/lib/css/theme/aiplan.css +1 -1
  230. package/packages/theme/lib/css/theme/aiplangd.css +1 -1
  231. package/packages/theme/lib/css/theme/chbn.css +1 -1
  232. package/packages/theme/lib/css/theme/default.css +1 -1
  233. package/packages/theme/lib/css/theme/dt.css +1 -1
  234. package/packages/theme/lib/css/theme/ecloud.css +1 -1
  235. package/packages/theme/lib/css/theme/hongkong.css +1 -1
  236. package/packages/theme/lib/css/theme/narrow.css +1 -1
  237. package/packages/theme/lib/css/theme/sdpf.css +1 -1
  238. package/packages/theme/lib/css/theme/upc.css +1 -1
  239. package/packages/theme/lib/css/theme/website.css +1 -1
  240. package/packages/theme/lib/css/theme/zj.css +1 -1
  241. package/packages/theme/package.json +33 -33
  242. package/packages/theme/src/.DS_Store +0 -0
  243. package/packages/theme/src/global/mixin.less +416 -416
  244. package/packages/theme/src/global/reset.less +27 -27
  245. package/packages/theme/src/img/.DS_Store +0 -0
  246. package/packages/theme/src/img/emote/.DS_Store +0 -0
  247. package/packages/theme/src/less/.DS_Store +0 -0
  248. package/packages/theme/src/less/component/affix.less +8 -8
  249. package/packages/theme/src/less/component/article-dark.less +6 -6
  250. package/packages/theme/src/less/component/article.less +39 -39
  251. package/packages/theme/src/less/component/box-dark.less +85 -85
  252. package/packages/theme/src/less/component/box.less +272 -272
  253. package/packages/theme/src/less/component/calendar-dark.less +111 -111
  254. package/packages/theme/src/less/component/calendar.less +282 -282
  255. package/packages/theme/src/less/component/card-dark.less +17 -17
  256. package/packages/theme/src/less/component/card.less +89 -89
  257. package/packages/theme/src/less/component/chat-dark.less +47 -47
  258. package/packages/theme/src/less/component/chat.less +71 -71
  259. package/packages/theme/src/less/component/code-dark.less +41 -41
  260. package/packages/theme/src/less/component/code.less +33 -33
  261. package/packages/theme/src/less/component/cover.less +4 -4
  262. package/packages/theme/src/less/component/dialog-dark.less +54 -54
  263. package/packages/theme/src/less/component/dialog.less +75 -75
  264. package/packages/theme/src/less/component/filter-dark.less +31 -31
  265. package/packages/theme/src/less/component/filter.less +97 -97
  266. package/packages/theme/src/less/component/float-dark.less +26 -26
  267. package/packages/theme/src/less/component/float.less +61 -61
  268. package/packages/theme/src/less/component/form-dark.less +45 -45
  269. package/packages/theme/src/less/component/form.less +322 -322
  270. package/packages/theme/src/less/component/gantt-dark.less +44 -44
  271. package/packages/theme/src/less/component/gantt.less +52 -52
  272. package/packages/theme/src/less/component/guider-dark.less +6 -6
  273. package/packages/theme/src/less/component/guider.less +15 -15
  274. package/packages/theme/src/less/component/header-dark.less +41 -41
  275. package/packages/theme/src/less/component/header.less +121 -121
  276. package/packages/theme/src/less/component/keyboard-dark.less +15 -15
  277. package/packages/theme/src/less/component/keyboard.less +21 -21
  278. package/packages/theme/src/less/component/line-dark.less +20 -20
  279. package/packages/theme/src/less/component/line.less +21 -21
  280. package/packages/theme/src/less/component/msg-dark.less +42 -42
  281. package/packages/theme/src/less/component/msg.less +102 -102
  282. package/packages/theme/src/less/component/page-dark.less +26 -26
  283. package/packages/theme/src/less/component/page.less +26 -26
  284. package/packages/theme/src/less/component/param-dark.less +31 -31
  285. package/packages/theme/src/less/component/param.less +136 -136
  286. package/packages/theme/src/less/component/popup-dark.less +20 -20
  287. package/packages/theme/src/less/component/popup.less +85 -85
  288. package/packages/theme/src/less/component/print.less +121 -121
  289. package/packages/theme/src/less/component/scroll-dark.less +19 -19
  290. package/packages/theme/src/less/component/scroll.less +47 -47
  291. package/packages/theme/src/less/component/skeleton-dark.less +29 -29
  292. package/packages/theme/src/less/component/skeleton.less +78 -78
  293. package/packages/theme/src/less/component/slide.less +70 -70
  294. package/packages/theme/src/less/component/space.less +2 -2
  295. package/packages/theme/src/less/component/step-dark.less +165 -165
  296. package/packages/theme/src/less/component/step.less +147 -147
  297. package/packages/theme/src/less/component/submit.less +40 -40
  298. package/packages/theme/src/less/component/tab-dark.less +221 -221
  299. package/packages/theme/src/less/component/tab.less +469 -462
  300. package/packages/theme/src/less/component/table-dark.less +196 -196
  301. package/packages/theme/src/less/component/table.less +435 -435
  302. package/packages/theme/src/less/component/timeline-dark.less +13 -13
  303. package/packages/theme/src/less/component/timeline.less +114 -114
  304. package/packages/theme/src/less/component/tip-dark.less +76 -76
  305. package/packages/theme/src/less/component/tip.less +139 -139
  306. package/packages/theme/src/less/component/tooltip-dark.less +105 -105
  307. package/packages/theme/src/less/component/tooltip.less +159 -159
  308. package/packages/theme/src/less/component/tree-dark.less +56 -56
  309. package/packages/theme/src/less/component/tree.less +148 -148
  310. package/packages/theme/src/less/element/align.less +32 -32
  311. package/packages/theme/src/less/element/animation.less +5 -5
  312. package/packages/theme/src/less/element/button-dark.less +29 -29
  313. package/packages/theme/src/less/element/button.less +65 -65
  314. package/packages/theme/src/less/element/center-scroll-dark.less +3 -3
  315. package/packages/theme/src/less/element/center-scroll.less +6 -6
  316. package/packages/theme/src/less/element/checkbox-dark.less +68 -68
  317. package/packages/theme/src/less/element/checkbox.less +73 -73
  318. package/packages/theme/src/less/element/color-dark.less +15 -15
  319. package/packages/theme/src/less/element/color.less +33 -33
  320. package/packages/theme/src/less/element/dis.less +9 -9
  321. package/packages/theme/src/less/element/ellipsis.less +35 -35
  322. package/packages/theme/src/less/element/emote.less +5 -5
  323. package/packages/theme/src/less/element/font-dark.less +9 -9
  324. package/packages/theme/src/less/element/font.less +8 -8
  325. package/packages/theme/src/less/element/hide-dark.less +114 -114
  326. package/packages/theme/src/less/element/hide.less +114 -114
  327. package/packages/theme/src/less/element/icon.less +297 -297
  328. package/packages/theme/src/less/element/input-dark.less +205 -205
  329. package/packages/theme/src/less/element/input.less +405 -405
  330. package/packages/theme/src/less/element/menu-icon.less +1 -1
  331. package/packages/theme/src/less/element/pic.less +18 -18
  332. package/packages/theme/src/less/element/progress-dark.less +37 -37
  333. package/packages/theme/src/less/element/progress.less +82 -82
  334. package/packages/theme/src/less/element/radio-dark.less +18 -18
  335. package/packages/theme/src/less/element/radio.less +11 -11
  336. package/packages/theme/src/less/element/range-dark.less +24 -24
  337. package/packages/theme/src/less/element/range.less +56 -56
  338. package/packages/theme/src/less/element/rate.less +17 -17
  339. package/packages/theme/src/less/element/segment-dark.less +119 -119
  340. package/packages/theme/src/less/element/segment.less +197 -197
  341. package/packages/theme/src/less/element/select-dark.less +167 -167
  342. package/packages/theme/src/less/element/select.less +431 -431
  343. package/packages/theme/src/less/element/size.less +10 -10
  344. package/packages/theme/src/less/element/switch-dark.less +7 -7
  345. package/packages/theme/src/less/element/switch.less +37 -37
  346. package/packages/theme/src/less/element/tag-dark.less +115 -115
  347. package/packages/theme/src/less/element/tag.less +159 -159
  348. package/packages/theme/src/less/element/upload-dark.less +26 -26
  349. package/packages/theme/src/less/element/upload.less +64 -64
  350. package/packages/theme/src/less/layout/fix.less +2 -2
  351. package/packages/theme/src/less/layout/flow.less +47 -47
  352. package/packages/theme/src/less/layout/grid-dark.less +28 -28
  353. package/packages/theme/src/less/layout/grid.less +172 -172
  354. package/packages/theme/src/less/layout/org-dark.less +2 -2
  355. package/packages/theme/src/less/layout/org.less +72 -72
  356. package/packages/theme/src/less/layout/padding.less +1 -1
  357. package/packages/theme/src/less/layout/reverser.less +8 -8
  358. package/packages/theme/src/less/theme/.DS_Store +0 -0
  359. package/packages/theme/src/less/theme/B-Design.less +159 -159
  360. package/packages/theme/src/less/theme/aiplan.less +159 -159
  361. package/packages/theme/src/less/theme/aiplangd.less +159 -159
  362. package/packages/theme/src/less/theme/chbn.less +159 -159
  363. package/packages/theme/src/less/theme/default.less +160 -160
  364. package/packages/theme/src/less/theme/dt.less +159 -159
  365. package/packages/theme/src/less/theme/ecloud.less +159 -159
  366. package/packages/theme/src/less/theme/hongkong.less +159 -159
  367. package/packages/theme/src/less/theme/narrow.less +160 -160
  368. package/packages/theme/src/less/theme/sdpf.less +160 -160
  369. package/packages/theme/src/less/theme/upc.less +159 -159
  370. package/packages/theme/src/less/theme/website.less +159 -159
  371. package/packages/theme/src/less/theme/zj.less +159 -159
  372. package/packages/timeline/index.js +8 -8
  373. package/packages/timeline/src/timeline.vue +84 -84
  374. package/packages/tip/index.js +8 -8
  375. package/packages/tip/src/tip.vue +226 -226
  376. package/packages/tooltip/.DS_Store +0 -0
  377. package/packages/tooltip/index.js +8 -8
  378. package/packages/tooltip/src/directive.js +180 -180
  379. package/packages/tooltip/src/tooltip.vue +467 -467
  380. package/packages/transfer/index.js +8 -8
  381. package/packages/transfer/src/transfer.vue +293 -293
  382. package/packages/tree/.DS_Store +0 -0
  383. package/packages/tree/index.js +8 -8
  384. package/packages/tree/src/tree.vue +518 -518
  385. package/packages/tree/src/treeItem.vue +443 -443
  386. package/packages/upload/.DS_Store +0 -0
  387. package/packages/upload/index.js +8 -8
  388. package/packages/upload/src/upload.vue +860 -860
  389. package/src/.DS_Store +0 -0
  390. package/src/index.js +207 -207
  391. package/src/locale/format.js +46 -46
  392. package/src/locale/index.js +48 -48
  393. package/src/locale/lang/en.js +207 -207
  394. package/src/locale/lang/zh-CN.js +207 -207
  395. package/src/mixins/blur.js +9 -9
  396. package/src/mixins/emitter.js +33 -33
  397. package/src/mixins/focus.js +9 -9
  398. package/src/mixins/locale.js +9 -9
  399. package/src/mixins/migrating.js +54 -54
  400. package/src/mixins/tip.js +10 -10
  401. package/src/mixins/transition.js +130 -130
  402. package/src/msg/index.js +107 -107
  403. package/src/svg/.DS_Store +0 -0
  404. package/src/svg/menu/.DS_Store +0 -0
  405. package/src/svg/menu/main/abnormal-mix.svg +5 -5
  406. package/src/svg/menu/main/abnormal.svg +5 -5
  407. package/src/svg/menu/main/accountManager-mix.svg +5 -5
  408. package/src/svg/menu/main/accountManager.svg +5 -5
  409. package/src/svg/menu/main/agreement-mix.svg +7 -7
  410. package/src/svg/menu/main/agreement.svg +7 -7
  411. package/src/svg/menu/main/ai-mix.svg +5 -5
  412. package/src/svg/menu/main/archives-mix.svg +6 -6
  413. package/src/svg/menu/main/arrearsReport-mix.svg +17 -17
  414. package/src/svg/menu/main/arrearsReport.svg +17 -17
  415. package/src/svg/menu/main/bill-mix.svg +13 -13
  416. package/src/svg/menu/main/bill.svg +13 -13
  417. package/src/svg/menu/main/box-mix.svg +5 -5
  418. package/src/svg/menu/main/broadband-mix.svg +4 -4
  419. package/src/svg/menu/main/broadband.svg +4 -4
  420. package/src/svg/menu/main/card-mix.svg +5 -5
  421. package/src/svg/menu/main/card.svg +5 -5
  422. package/src/svg/menu/main/cash-mix.svg +5 -5
  423. package/src/svg/menu/main/cash.svg +5 -5
  424. package/src/svg/menu/main/cloud-mix.svg +4 -4
  425. package/src/svg/menu/main/cloud.svg +4 -4
  426. package/src/svg/menu/main/clue-mix.svg +10 -10
  427. package/src/svg/menu/main/clue.svg +10 -10
  428. package/src/svg/menu/main/commonUse-mix.svg +4 -4
  429. package/src/svg/menu/main/commonUse.svg +4 -4
  430. package/src/svg/menu/main/construction-mix.svg +7 -7
  431. package/src/svg/menu/main/construction.svg +7 -7
  432. package/src/svg/menu/main/contract-mix.svg +8 -8
  433. package/src/svg/menu/main/contract.svg +8 -8
  434. package/src/svg/menu/main/credit-mix.svg +5 -5
  435. package/src/svg/menu/main/credit.svg +5 -5
  436. package/src/svg/menu/main/data-mix.svg +5 -5
  437. package/src/svg/menu/main/data.svg +5 -5
  438. package/src/svg/menu/main/date-mix.svg +7 -7
  439. package/src/svg/menu/main/deposit-mix.svg +4 -4
  440. package/src/svg/menu/main/device-mix.svg +4 -4
  441. package/src/svg/menu/main/device.svg +4 -4
  442. package/src/svg/menu/main/discrepancy-mix.svg +5 -5
  443. package/src/svg/menu/main/door-mix.svg +6 -6
  444. package/src/svg/menu/main/fault-mix.svg +12 -12
  445. package/src/svg/menu/main/fault.svg +16 -16
  446. package/src/svg/menu/main/finance-mix.svg +11 -11
  447. package/src/svg/menu/main/finance.svg +13 -13
  448. package/src/svg/menu/main/flow-mix.svg +4 -4
  449. package/src/svg/menu/main/flow.svg +4 -4
  450. package/src/svg/menu/main/folder-mix.svg +4 -4
  451. package/src/svg/menu/main/folder.svg +4 -4
  452. package/src/svg/menu/main/friendly-mix.svg +5 -5
  453. package/src/svg/menu/main/fusion-mix.svg +5 -5
  454. package/src/svg/menu/main/fusion.svg +5 -5
  455. package/src/svg/menu/main/gift-mix.svg +8 -8
  456. package/src/svg/menu/main/gift.svg +8 -8
  457. package/src/svg/menu/main/gps-mix.svg +6 -6
  458. package/src/svg/menu/main/gps.svg +6 -6
  459. package/src/svg/menu/main/grid-mix.svg +7 -7
  460. package/src/svg/menu/main/grid.svg +7 -7
  461. package/src/svg/menu/main/group-mix.svg +4 -4
  462. package/src/svg/menu/main/group.svg +4 -4
  463. package/src/svg/menu/main/home-mix.svg +5 -5
  464. package/src/svg/menu/main/home.svg +8 -8
  465. package/src/svg/menu/main/ict-mix.svg +4 -4
  466. package/src/svg/menu/main/industry-mix.svg +5 -5
  467. package/src/svg/menu/main/industry.svg +5 -5
  468. package/src/svg/menu/main/info-mix.svg +9 -9
  469. package/src/svg/menu/main/info.svg +9 -9
  470. package/src/svg/menu/main/integral-mix.svg +5 -5
  471. package/src/svg/menu/main/integral.svg +5 -5
  472. package/src/svg/menu/main/internet-mix.svg +5 -5
  473. package/src/svg/menu/main/internet.svg +5 -5
  474. package/src/svg/menu/main/inventory-mix.svg +5 -5
  475. package/src/svg/menu/main/invoice-mix.svg +6 -6
  476. package/src/svg/menu/main/invoice.svg +14 -14
  477. package/src/svg/menu/main/iot-mix.svg +5 -5
  478. package/src/svg/menu/main/iot.svg +5 -5
  479. package/src/svg/menu/main/label-mix.svg +4 -4
  480. package/src/svg/menu/main/label.svg +4 -4
  481. package/src/svg/menu/main/love-mix.svg +6 -6
  482. package/src/svg/menu/main/love.svg +13 -13
  483. package/src/svg/menu/main/m1-mix.svg +4 -4
  484. package/src/svg/menu/main/m1.svg +4 -4
  485. package/src/svg/menu/main/m2-mix.svg +12 -12
  486. package/src/svg/menu/main/m2.svg +11 -11
  487. package/src/svg/menu/main/m3-mix.svg +6 -6
  488. package/src/svg/menu/main/m3.svg +7 -7
  489. package/src/svg/menu/main/m4-mix.svg +5 -5
  490. package/src/svg/menu/main/m4.svg +7 -7
  491. package/src/svg/menu/main/m5-mix.svg +8 -8
  492. package/src/svg/menu/main/m5.svg +10 -10
  493. package/src/svg/menu/main/mail-mix.svg +5 -5
  494. package/src/svg/menu/main/manual-mix.svg +11 -11
  495. package/src/svg/menu/main/manual.svg +11 -11
  496. package/src/svg/menu/main/market-mix.svg +4 -4
  497. package/src/svg/menu/main/market.svg +4 -4
  498. package/src/svg/menu/main/member-mix.svg +6 -6
  499. package/src/svg/menu/main/member.svg +6 -6
  500. package/src/svg/menu/main/menu-mix.svg +4 -4
  501. package/src/svg/menu/main/menu.svg +4 -4
  502. package/src/svg/menu/main/message-mix.svg +11 -11
  503. package/src/svg/menu/main/message.svg +11 -11
  504. package/src/svg/menu/main/namelist-mix.svg +4 -4
  505. package/src/svg/menu/main/namelist.svg +4 -4
  506. package/src/svg/menu/main/net-mix.svg +7 -7
  507. package/src/svg/menu/main/niche-mix.svg +12 -12
  508. package/src/svg/menu/main/niche.svg +12 -12
  509. package/src/svg/menu/main/notice-mix.svg +4 -4
  510. package/src/svg/menu/main/notice.svg +4 -4
  511. package/src/svg/menu/main/number-mix.svg +6 -6
  512. package/src/svg/menu/main/operations-mix.svg +4 -4
  513. package/src/svg/menu/main/operations.svg +4 -4
  514. package/src/svg/menu/main/order-mix.svg +8 -8
  515. package/src/svg/menu/main/order.svg +8 -8
  516. package/src/svg/menu/main/person-mix.svg +6 -6
  517. package/src/svg/menu/main/person.svg +6 -6
  518. package/src/svg/menu/main/phone-mix.svg +4 -4
  519. package/src/svg/menu/main/phone.svg +4 -4
  520. package/src/svg/menu/main/phoneBill-mix.svg +6 -6
  521. package/src/svg/menu/main/phoneBill.svg +6 -6
  522. package/src/svg/menu/main/preferential-mix.svg +5 -5
  523. package/src/svg/menu/main/preferential.svg +5 -5
  524. package/src/svg/menu/main/print-mix.svg +5 -5
  525. package/src/svg/menu/main/problem-mix.svg +4 -4
  526. package/src/svg/menu/main/problem.svg +4 -4
  527. package/src/svg/menu/main/process-mix.svg +4 -4
  528. package/src/svg/menu/main/process.svg +4 -4
  529. package/src/svg/menu/main/product-mix.svg +5 -5
  530. package/src/svg/menu/main/product.svg +6 -6
  531. package/src/svg/menu/main/qrCode-mix.svg +8 -8
  532. package/src/svg/menu/main/qrCode.svg +8 -8
  533. package/src/svg/menu/main/refuelingBag-mix-mix.svg +4 -4
  534. package/src/svg/menu/main/refuelingBag-mix.svg +4 -4
  535. package/src/svg/menu/main/reportForm-mix.svg +8 -8
  536. package/src/svg/menu/main/reportForm.svg +8 -8
  537. package/src/svg/menu/main/risk-mix.svg +16 -16
  538. package/src/svg/menu/main/risk.svg +17 -17
  539. package/src/svg/menu/main/robot-mix.svg +9 -9
  540. package/src/svg/menu/main/robot.svg +9 -9
  541. package/src/svg/menu/main/satisfaction-mix.svg +4 -4
  542. package/src/svg/menu/main/satisfaction.svg +4 -4
  543. package/src/svg/menu/main/scratchCard-mix.svg +4 -4
  544. package/src/svg/menu/main/sim-mix.svg +4 -4
  545. package/src/svg/menu/main/sim.svg +4 -4
  546. package/src/svg/menu/main/staging-mix.svg +4 -4
  547. package/src/svg/menu/main/staging.svg +4 -4
  548. package/src/svg/menu/main/survey-mix.svg +5 -5
  549. package/src/svg/menu/main/survey.svg +5 -5
  550. package/src/svg/menu/main/tasks-mix.svg +8 -8
  551. package/src/svg/menu/main/tasks.svg +8 -8
  552. package/src/svg/menu/main/telephone-mix.svg +4 -4
  553. package/src/svg/menu/main/topUp-mix.svg +5 -5
  554. package/src/svg/menu/main/trajectory-mix.svg +11 -11
  555. package/src/svg/menu/main/trajectory.svg +23 -23
  556. package/src/svg/menu/main/transmit-mix.svg +5 -5
  557. package/src/svg/menu/main/tv-mix.svg +6 -6
  558. package/src/svg/menu/main/unlock-mix.svg +4 -4
  559. package/src/svg/menu/main/unlock.svg +4 -4
  560. package/src/svg/menu/main/view-mix.svg +5 -5
  561. package/src/svg/menu/main/view.svg +5 -5
  562. package/src/svg/menu/main/visits-mix.svg +19 -19
  563. package/src/svg/menu/main/visits.svg +19 -19
  564. package/src/svg/menu/main/voice-mix.svg +4 -4
  565. package/src/svg/menu/main/voice.svg +4 -4
  566. package/src/svg/menu/main/wiki-mix.svg +4 -4
  567. package/src/svg/menu/main/wiki.svg +4 -4
  568. package/src/svg/menu/main/workOrder-mix.svg +6 -6
  569. package/src/svg/menu/main/workOrder.svg +14 -14
  570. package/src/svg/menu/patch/Mo-space.svg +2 -2
  571. package/src/svg/menu/patch/Mo.svg +3 -3
  572. package/src/svg/menu/patch/add-space.svg +3 -3
  573. package/src/svg/menu/patch/add.svg +3 -3
  574. package/src/svg/menu/patch/address-space.svg +3 -3
  575. package/src/svg/menu/patch/address.svg +3 -3
  576. package/src/svg/menu/patch/approve-space.svg +3 -3
  577. package/src/svg/menu/patch/approve.svg +4 -4
  578. package/src/svg/menu/patch/avoid-space.svg +3 -3
  579. package/src/svg/menu/patch/avoid.svg +3 -3
  580. package/src/svg/menu/patch/batch-space.svg +3 -3
  581. package/src/svg/menu/patch/batch.svg +5 -5
  582. package/src/svg/menu/patch/broadband-space.svg +3 -3
  583. package/src/svg/menu/patch/broadband.svg +4 -4
  584. package/src/svg/menu/patch/cancellation-space.svg +3 -3
  585. package/src/svg/menu/patch/cancellation.svg +3 -3
  586. package/src/svg/menu/patch/center-space.svg +3 -3
  587. package/src/svg/menu/patch/center.svg +5 -5
  588. package/src/svg/menu/patch/change-space.svg +3 -3
  589. package/src/svg/menu/patch/change.svg +4 -4
  590. package/src/svg/menu/patch/click-space.svg +3 -3
  591. package/src/svg/menu/patch/click.svg +4 -4
  592. package/src/svg/menu/patch/close-1-space.svg +3 -3
  593. package/src/svg/menu/patch/close-1.svg +3 -3
  594. package/src/svg/menu/patch/close-space.svg +2 -2
  595. package/src/svg/menu/patch/close.svg +3 -3
  596. package/src/svg/menu/patch/collect-space.svg +3 -3
  597. package/src/svg/menu/patch/collect.svg +3 -3
  598. package/src/svg/menu/patch/comment-space.svg +3 -3
  599. package/src/svg/menu/patch/comment.svg +3 -3
  600. package/src/svg/menu/patch/confirm-space.svg +3 -3
  601. package/src/svg/menu/patch/confirm.svg +3 -3
  602. package/src/svg/menu/patch/contract-space.svg +3 -3
  603. package/src/svg/menu/patch/contract.svg +3 -3
  604. package/src/svg/menu/patch/credit-space.svg +3 -3
  605. package/src/svg/menu/patch/credit.svg +5 -5
  606. package/src/svg/menu/patch/dataMonitoring-space.svg +3 -3
  607. package/src/svg/menu/patch/dataMonitoring.svg +3 -3
  608. package/src/svg/menu/patch/dedicatedCircuit-space.svg +3 -3
  609. package/src/svg/menu/patch/dedicatedCircuit.svg +3 -3
  610. package/src/svg/menu/patch/detail-space.svg +3 -3
  611. package/src/svg/menu/patch/detail.svg +3 -3
  612. package/src/svg/menu/patch/disassemb-space.svg +3 -3
  613. package/src/svg/menu/patch/disassemb.svg +3 -3
  614. package/src/svg/menu/patch/earnestMoney-space.svg +3 -3
  615. package/src/svg/menu/patch/earnestMoney.svg +3 -3
  616. package/src/svg/menu/patch/empower-space.svg +3 -3
  617. package/src/svg/menu/patch/empower.svg +3 -3
  618. package/src/svg/menu/patch/entrust-space.svg +3 -3
  619. package/src/svg/menu/patch/entrust.svg +3 -3
  620. package/src/svg/menu/patch/expedite-space.svg +4 -4
  621. package/src/svg/menu/patch/expedite.svg +4 -4
  622. package/src/svg/menu/patch/flow-space.svg +3 -3
  623. package/src/svg/menu/patch/flow.svg +3 -3
  624. package/src/svg/menu/patch/folder-space.svg +3 -3
  625. package/src/svg/menu/patch/folder.svg +3 -3
  626. package/src/svg/menu/patch/forbidden-space.svg +3 -3
  627. package/src/svg/menu/patch/forbidden.svg +3 -3
  628. package/src/svg/menu/patch/forward-space.svg +3 -3
  629. package/src/svg/menu/patch/forward.svg +3 -3
  630. package/src/svg/menu/patch/fusion-space.svg +3 -3
  631. package/src/svg/menu/patch/fusion.svg +6 -6
  632. package/src/svg/menu/patch/history-space.svg +3 -3
  633. package/src/svg/menu/patch/history.svg +3 -3
  634. package/src/svg/menu/patch/information-space.svg +3 -3
  635. package/src/svg/menu/patch/information.svg +3 -3
  636. package/src/svg/menu/patch/insert-space.svg +3 -3
  637. package/src/svg/menu/patch/insert.svg +3 -3
  638. package/src/svg/menu/patch/letv-space.svg +3 -3
  639. package/src/svg/menu/patch/letv.svg +3 -3
  640. package/src/svg/menu/patch/link-space.svg +3 -3
  641. package/src/svg/menu/patch/link.svg +3 -3
  642. package/src/svg/menu/patch/location-space.svg +3 -3
  643. package/src/svg/menu/patch/location.svg +3 -3
  644. package/src/svg/menu/patch/message-space.svg +3 -3
  645. package/src/svg/menu/patch/message.svg +4 -4
  646. package/src/svg/menu/patch/minus-space.svg +3 -3
  647. package/src/svg/menu/patch/minus.svg +3 -3
  648. package/src/svg/menu/patch/mms-space.svg +3 -3
  649. package/src/svg/menu/patch/mms.svg +3 -3
  650. package/src/svg/menu/patch/monitor-space.svg +3 -3
  651. package/src/svg/menu/patch/monitor.svg +3 -3
  652. package/src/svg/menu/patch/move-space.svg +3 -3
  653. package/src/svg/menu/patch/move.svg +3 -3
  654. package/src/svg/menu/patch/negative-space.svg +2 -2
  655. package/src/svg/menu/patch/negative.svg +3 -3
  656. package/src/svg/menu/patch/net-space.svg +2 -2
  657. package/src/svg/menu/patch/net.svg +3 -3
  658. package/src/svg/menu/patch/news-space.svg +3 -3
  659. package/src/svg/menu/patch/news.svg +3 -3
  660. package/src/svg/menu/patch/notice-space.svg +4 -4
  661. package/src/svg/menu/patch/notice.svg +5 -5
  662. package/src/svg/menu/patch/officialBusiness-space.svg +3 -3
  663. package/src/svg/menu/patch/officialBusiness.svg +4 -4
  664. package/src/svg/menu/patch/pay-space.svg +3 -3
  665. package/src/svg/menu/patch/pay.svg +3 -3
  666. package/src/svg/menu/patch/phone-space.svg +3 -3
  667. package/src/svg/menu/patch/phone.svg +5 -5
  668. package/src/svg/menu/patch/print-space.svg +3 -3
  669. package/src/svg/menu/patch/print.svg +5 -5
  670. package/src/svg/menu/patch/product-space.svg +3 -3
  671. package/src/svg/menu/patch/product.svg +5 -5
  672. package/src/svg/menu/patch/reservation-space.svg +3 -3
  673. package/src/svg/menu/patch/reservation.svg +3 -3
  674. package/src/svg/menu/patch/sale-space.svg +3 -3
  675. package/src/svg/menu/patch/sale.svg +5 -5
  676. package/src/svg/menu/patch/search-space.svg +3 -3
  677. package/src/svg/menu/patch/search.svg +3 -3
  678. package/src/svg/menu/patch/secure-space.svg +3 -3
  679. package/src/svg/menu/patch/secure.svg +5 -5
  680. package/src/svg/menu/patch/setup-space.svg +3 -3
  681. package/src/svg/menu/patch/setup.svg +3 -3
  682. package/src/svg/menu/patch/shift-space.svg +3 -3
  683. package/src/svg/menu/patch/shift.svg +3 -3
  684. package/src/svg/menu/patch/situation-space.svg +3 -3
  685. package/src/svg/menu/patch/situation.svg +3 -3
  686. package/src/svg/menu/patch/special-space.svg +3 -3
  687. package/src/svg/menu/patch/special.svg +3 -3
  688. package/src/svg/menu/patch/tabulation-space.svg +3 -3
  689. package/src/svg/menu/patch/tabulation.svg +8 -8
  690. package/src/svg/menu/patch/track-space.svg +3 -3
  691. package/src/svg/menu/patch/track.svg +5 -5
  692. package/src/svg/menu/patch/transaction-space.svg +3 -3
  693. package/src/svg/menu/patch/transaction.svg +6 -6
  694. package/src/svg/menu/patch/user-space.svg +3 -3
  695. package/src/svg/menu/patch/user.svg +3 -3
  696. package/src/svg/menu/patch/visualize-space.svg +3 -3
  697. package/src/svg/menu/patch/visualize.svg +4 -4
  698. package/src/svg/menu/patch/vnet-space.svg +3 -3
  699. package/src/svg/menu/patch/vnet.svg +3 -3
  700. package/src/tip/tip.js +160 -160
  701. package/src/utils/after-leave.js +27 -27
  702. package/src/utils/ajax.js +59 -59
  703. package/src/utils/array.js +24 -24
  704. package/src/utils/clickoutside.js +105 -105
  705. package/src/utils/compare.js +16 -16
  706. package/src/utils/date.js +55 -55
  707. package/src/utils/disabledArea.js +18 -18
  708. package/src/utils/dom.js +301 -301
  709. package/src/utils/filetransfer.js +287 -287
  710. package/src/utils/isModified.js +20 -20
  711. package/src/utils/jsencrypt/JSEncrypt.js +192 -192
  712. package/src/utils/jsencrypt/JSEncryptRSAKey.js +320 -320
  713. package/src/utils/jsencrypt/index.js +3 -3
  714. package/src/utils/jsencrypt/jselib/asn1js/asn1.d.ts +51 -51
  715. package/src/utils/jsencrypt/jselib/asn1js/asn1.js +565 -565
  716. package/src/utils/jsencrypt/jselib/asn1js/base64.d.ts +5 -5
  717. package/src/utils/jsencrypt/jselib/asn1js/base64.js +88 -88
  718. package/src/utils/jsencrypt/jselib/asn1js/hex.d.ts +3 -3
  719. package/src/utils/jsencrypt/jselib/asn1js/hex.js +64 -64
  720. package/src/utils/jsencrypt/jselib/asn1js/int10.d.ts +9 -9
  721. package/src/utils/jsencrypt/jselib/asn1js/int10.js +87 -87
  722. package/src/utils/jsencrypt/jselib/asn1js/oids.d.ts +9778 -9778
  723. package/src/utils/jsencrypt/jselib/asn1js/oids.js +1962 -1962
  724. package/src/utils/jsencrypt/jselib/jsbn/base64.d.ts +3 -3
  725. package/src/utils/jsencrypt/jselib/jsbn/base64.js +76 -76
  726. package/src/utils/jsencrypt/jselib/jsbn/jsbn.d.ts +98 -98
  727. package/src/utils/jsencrypt/jselib/jsbn/jsbn.js +1754 -1754
  728. package/src/utils/jsencrypt/jselib/jsbn/prng4.d.ts +10 -10
  729. package/src/utils/jsencrypt/jselib/jsbn/prng4.js +46 -46
  730. package/src/utils/jsencrypt/jselib/jsbn/rng.d.ts +3 -3
  731. package/src/utils/jsencrypt/jselib/jsbn/rng.js +78 -78
  732. package/src/utils/jsencrypt/jselib/jsbn/rsa.d.ts +23 -23
  733. package/src/utils/jsencrypt/jselib/jsbn/rsa.js +373 -373
  734. package/src/utils/jsencrypt/jselib/jsbn/util.d.ts +7 -7
  735. package/src/utils/jsencrypt/jselib/jsbn/util.js +58 -58
  736. package/src/utils/jsencrypt/jselib/jsrsasign/asn1-1.0.js +1593 -1593
  737. package/src/utils/jsencrypt/jselib/jsrsasign/yahoo.js +63 -63
  738. package/src/utils/jsencrypt/util.js +58 -58
  739. package/src/utils/jsencrypt.js +263 -263
  740. package/src/utils/md5.js +203 -203
  741. package/src/utils/merge.js +15 -15
  742. package/src/utils/mime.js +75 -75
  743. package/src/utils/print.js +39 -39
  744. package/src/utils/ratio.js +230 -230
  745. package/src/utils/respo.js +9 -9
  746. package/src/utils/shared.js +7 -7
  747. package/src/utils/sign.js +185 -185
  748. package/src/utils/string.js +13 -13
  749. package/src/utils/theme.js +91 -91
  750. package/src/utils/types.js +40 -40
  751. package/src/utils/util.js +286 -286
  752. package/src/utils/uuid.js +12 -12
  753. package/src/utils/validate.js +373 -373
@@ -1,1458 +1,1458 @@
1
- <template>
2
- <div class="to-table" :class="setClass" :style="setStyle">
3
- <template v-if="columns_ && columns_.length > 0">
4
- <div v-if="Number(fixTop) > 0 && type !== 'v'" ref="top" class="top">
5
- <table ref="topTable">
6
- <table-head ref="topHead" :data="columns_" :configurable="configurable && !(Number(fixRight) > 0)" @select-all="handleSelectionAllChange" @column-change="columnChangeHandle">
7
- <template v-for="columnx in columns_" :slot="columnx.prop + '_th'" slot-scope="{column,index}">
8
- <slot :name="columnx.prop + '_th'" :column="column" :index="index"></slot>
9
- </template>
10
- </table-head>
11
- </table>
12
- </div>
13
-
14
- <div v-if="Number(fixLeft) > 0 && type !== 'v'" ref="left" class="left">
15
- <table ref="leftTable">
16
- <table-head ref="leftHead" name="leftHead" :data="columns_.slice(0, Number(fixLeft))" @select-all="handleSelectionAllChange" @column-change="columnChangeHandle">
17
- <template v-for="columnx in columns_" :slot="columnx.prop + '_th'" slot-scope="{column,index}">
18
- <slot :name="columnx.prop + '_th'" :column="column" :index="index"></slot>
19
- </template>
20
- </table-head>
21
- <table-body ref="leftBody" :data="iData" :column-data="columns_.slice(0, Number(fixLeft))">
22
- <template v-for="columnx in flatColumns" :slot="columnx.prop" slot-scope="{row,column,index}">
23
- <slot :name="columnx.prop" :row="row" :column="column" :index="index"></slot>
24
- </template>
25
- </table-body>
26
- </table>
27
- </div>
28
-
29
- <div v-if="Number(fixTop) > 0 && Number(fixLeft) > 0 && type !== 'v'" ref="leftTop" class="leftTop">
30
- <table>
31
- <table-head ref="leftTopHead" :data="columns_.slice(0, Number(fixLeft))" @column-change="columnChangeHandle" @select-all="handleSelectionAllChange">
32
- <template v-for="columnx in columns_" :slot="columnx.prop + '_th'" slot-scope="{column,index}">
33
- <slot :name="columnx.prop + '_th'" :column="column" :index="index"></slot>
34
- </template>
35
- </table-head>
36
- </table>
37
- </div>
38
- <div v-if="Number(fixRight) > 0 && type !== 'v'" ref="right" class="right">
39
- <table ref="rightTable">
40
- <table-head ref="rightHead" :data="columns_.slice(columns_.length - Number(fixRight), columns_.length)" :configurable="configurable && !(Number(fixTop) > 0)" @column-change="columnChangeHandle" @select-all="handleSelectionAllChange">
41
- <template v-for="columnx in columns_" :slot="columnx.prop + '_th'" slot-scope="{column,index}">
42
- <slot :name="columnx.prop + '_th'" :column="column" :index="index"></slot>
43
- </template>
44
- </table-head>
45
- <table-body ref="rightBody" :data="iData" :column-data="columns_.slice(columns_.length - Number(fixRight), columns_.length)">
46
- <template v-for="columnx in flatColumns" :slot="columnx.prop" slot-scope="{row,column,index}">
47
- <slot :name="columnx.prop" :row="row" :column="column" :index="index"></slot>
48
- </template>
49
- </table-body>
50
- </table>
51
- </div>
52
- <div v-if="Number(fixTop) > 0 && Number(fixRight) > 0 && type !== 'v'" ref="rightTop" class="rightTop">
53
- <table>
54
- <table-head ref="rightTopHead" :data="columns_.slice(columns_.length - Number(fixRight), columns_.length)" :configurable="configurable" @column-change="columnChangeHandle" @select-all="handleSelectionAllChange">
55
- <template v-for="columnx in columns_" :slot="columnx.prop + '_th'" slot-scope="{column,index}">
56
- <slot :name="columnx.prop + '_th'" :column="column" :index="index"></slot>
57
- </template>
58
- </table-head>
59
- </table>
60
- </div>
61
- <div ref="body" class="body" @scroll="scrollHandle">
62
- <table ref="table">
63
- <colgroup>
64
- <col v-for="(item, index) in columns_" :key="index" :style="columnStyle(item)" />
65
- </colgroup>
66
- <table-head ref="thead" name="body" :data="columns_" :configurable="configurable && (!Number(fixTop) > 0) && (!Number(fixRight) > 0)" @select-all="handleSelectionAllChange" @column-change="columnChangeHandle">
67
- <template v-for="columnx in columns_" :slot="columnx.prop + '_th'" slot-scope="{column,index}">
68
- <slot :name="columnx.prop + '_th'" :column="column" :index="index"></slot>
69
- </template>
70
- </table-head>
71
- <table-body ref="tbody" :data="iData" :column-data="columns_">
72
- <template slot="toTitle" slot-scope="{row,index}">
73
- <slot name="toTitle" :row="row" :index="index"></slot>
74
- </template>
75
- <template v-for="columnx in flatColumns" :slot="columnx.prop" slot-scope="{row,column,index}">
76
- <slot :name="columnx.prop" :row="row" :column="column" :index="index"></slot>
77
- </template>
78
- </table-body>
79
- </table>
80
- </div>
81
- <to-msg v-if="nodata && !loading" :style="setMsgTopStyle" :pic="emptyPic" position="full" :title="emptyText || emptyTitle" :content="emptyContent" show></to-msg>
82
- <to-msg v-if="loading" :style="setMsgTopStyle" pic="loading" position="full" show></to-msg>
83
- </template>
84
- <!-- 兼容旧版本 heads 配置 或 slot配置 -->
85
- <template v-else>
86
- <div class="body">
87
- <table ref="table">
88
- <thead ref="thead">
89
- <tr>
90
- <th v-for="(item, index) in iHeads" :key="index">{{ item }}</th>
91
- </tr>
92
- </thead>
93
- <tbody ref="tbody" @click="handleTableClick">
94
- <slot></slot>
95
- </tbody>
96
- </table>
97
- </div>
98
- <to-msg v-if="nodata && !loading" position="full" :title="emptyText || emptyTitle" :content="emptyContent" show></to-msg>
99
- <to-msg v-if="loading" pic="loading" position="full" show></to-msg>
100
- </template>
101
- <to-float ref="action" :width="$phone?'full':actionLayerWidth" :slide="$phone" position="bottom" class="to-table-actionLayer" @click.native="$refs.action.close()">
102
- <div class="to-table-actionLayerWrapper">
103
- <slot v-if="current && contextAction" name="action" :row="current" :index="currentIndex"></slot>
104
- <template v-if="contextSelection !== null">
105
- <to-button v-if="!contextSelection" mode="text" @click="startBatch">多选</to-button>
106
- <to-button v-else mode="text" @click="$emit('update:contextSelection',false); $refs.action.close();">取消多选</to-button>
107
- </template>
108
- </div>
109
- </to-float>
110
- <to-float ref="detail" slide :position="$phone?'bottom':'right'" :width="$phone?'full':'31.25'" class="to-table-detail">
111
- <to-padding v-if="current" :value="1.5">
112
- <to-grid :space="1.5">
113
- <to-grid-item v-if="columns_.some(column => column.type === 'icon')" side>
114
- <slot :detail="true" :name="columns_.find(column => column.type === 'icon').prop" :row="current" :index="currentIndex">
115
- <to-icon v-size="iconSize" :value="current[columns_.find(column => column.type === 'icon').prop] || icon" v-bind="iconProps"></to-icon>
116
- </slot>
117
- </to-grid-item>
118
- <to-grid-item>
119
- <to-card padding="0">
120
- <to-card-item main align="center">
121
- <template v-if="columns_.some(column => column.type === 'key')" slot="title">
122
- <slot :detail="true" :name="columns_.find(column => column.type === 'key').prop" :row="current" :index="currentIndex">
123
- {{ current[columns_.find(column => column.type === 'key').prop] }}
124
- </slot>
125
- </template>
126
- <template v-if="columns_.some(column => column.type === 'desc')" slot="content">
127
- <slot :detail="true" :name="columns_.find(column => column.type === 'desc').prop" :row="current" :index="currentIndex">
128
- {{ current[columns_.find(column => column.type === 'desc').prop] }}
129
- </slot>
130
- </template>
131
- </to-card-item>
132
- <to-card-item v-if="columns_.some(column => column.type === 'state')">
133
- <slot :detail="true" :name="columns_.find(column => column.type === 'state').prop" :row="current" :index="currentIndex">
134
- <to-tag mode="plain" color="primary" fillet="pill">
135
- {{ current[columns_.find(column => column.type === 'state').prop] }}
136
- </to-tag>
137
- </slot>
138
- </to-card-item>
139
- </to-card>
140
- <to-space v-if="hasKey"></to-space>
141
- <to-param>
142
- <template v-for="(column, index) in columns_">
143
- <li v-if="(!['key', 'desc', 'icon', 'state', 'selection', 'radio', 'action'].includes(column.type) && column.show !== false) || column.detail" :key="index">
144
- <div class="label">{{ column.label }}</div>
145
- <div class="value">
146
- <slot :detail="true" :name="column.prop" :row="current" :index="currentIndex">
147
- {{ current[column.prop] }}
148
- </slot>
149
- </div>
150
- </li>
151
- </template>
152
- </to-param>
153
- </to-grid-item>
154
- </to-grid>
155
- </to-padding>
156
- </to-float>
157
- <template v-if="!hasAction && configurable">
158
- <table-config :data="columns" @change="columnChangeHandle"></table-config>
159
- </template>
160
- </div>
161
- </template>
162
- <script>
163
- import { getEventPath, getDataSet } from '../../../src/utils/dom.js'
164
- import tableHead from './table-head'
165
- import tableBody from './table-body'
166
- import tableConfig from './table-config'
167
- import { unique } from '../../../src/utils/array.js'
168
- import { t } from 'ai.touchui-vue/src/locale';
169
- function db(fn, wait = 50) {
170
- // 通过闭包缓存一个定时器 id
171
- let timer = null
172
- // 将 debounce 处理结果当作函数返回
173
- // 触发事件回调时执行这个返回函数
174
- return function(...args) {
175
- // 如果已经设定过定时器就清空上一次的定时器
176
- if (timer) clearTimeout(timer)
177
- // 开始设定一个新的定时器,定时器结束后执行传入的函数 fn
178
- timer = setTimeout(() => {
179
- fn.apply(this, args)
180
-
181
- clearTimeout(timer)
182
- timer = null
183
- }, wait)
184
- }
185
- }
186
- export default {
187
- name: 'ToTable',
188
- componentName: 'ToTable',
189
- components: {
190
- tableHead,
191
- tableBody,
192
- tableConfig
193
- },
194
- provide() {
195
- return {
196
- ToTable: this
197
- };
198
- },
199
- props: {
200
- // 固定列时同步 tr 的高度
201
- syncHeight: Boolean,
202
- loading: Boolean,
203
- autoDetail: Boolean,
204
- // 数据
205
- data: {
206
- type: Array,
207
- default() {
208
- return [];
209
- }
210
- },
211
- // 高度
212
- height: {
213
- type: [Number, String],
214
- default: ''
215
- },
216
- // 分割线位置
217
- linePosition: {
218
- type: String,
219
- default: ''
220
- },
221
- // table列配置
222
- columns: {
223
- type: Array,
224
- default: () => []
225
- },
226
- // 序号列的名称
227
- indexColumnName: {
228
- type: String,
229
- default: () => t('to.common.index')
230
- },
231
- // table 无数据时显示文字
232
- emptyText: {
233
- type: String,
234
- default: () => t('to.common.noData')
235
- },
236
- emptyTitle: {
237
- type: String,
238
- default: ''
239
- },
240
- emptyContent: {
241
- type: String,
242
- default: ''
243
- },
244
- emptyPic: {
245
- type: String,
246
- default: 'empty'
247
- },
248
- // 是否要高亮当前行 false
249
- highlightCurrentRow: Boolean,
250
- // 可选设定
251
- selectable: Boolean,
252
- rowSelectable: Boolean,
253
- cellSelectable: Boolean,
254
- remember: Boolean,
255
- // 特殊行设置
256
- even: Boolean,
257
- // 排序方法
258
- sortFunction: {
259
- type: Function,
260
- default: null
261
- },
262
- heads: {
263
- type: String,
264
- default: ''
265
- },
266
- // 固定表头/表列设置
267
- fixLeft: {
268
- type: [Number, String],
269
- default: 0
270
- },
271
- fixRight: {
272
- type: [Number, String],
273
- default: 0
274
- },
275
- fixTop: {
276
- type: [Number, String],
277
- default: 0
278
- },
279
- // 外观设置
280
- border: {
281
- type: Boolean,
282
- default: true
283
- },
284
- type: {
285
- type: String,
286
- default: ''
287
- },
288
- showColumns: {
289
- type: [Number, String],
290
- default: ''
291
- },
292
- space: {
293
- type: [Number, String],
294
- default: 0
295
- },
296
- itemFillet: {
297
- type: String,
298
- default: 'none'
299
- },
300
- icon: {
301
- type: String,
302
- default: ''
303
- },
304
- iconSize: {
305
- type: [String, Number],
306
- default: 2
307
- },
308
- iconProps: {
309
- type: Object,
310
- default() {
311
- return {
312
- mode: 'plain',
313
- color: 'primary',
314
- fillet: 'round'
315
- }
316
- }
317
- },
318
- contextSelection: {
319
- type: Boolean,
320
- default() {
321
- return null
322
- }
323
- },
324
- contextAction: Boolean,
325
- configurable: Boolean,
326
- actionLayerWidth: {
327
- type: [Number, String],
328
- default() {
329
- return 10
330
- }
331
- },
332
- isNeedSelectAll: { // 是否需要表头的全选按钮
333
- type: Boolean,
334
- default: true
335
- },
336
- expand: Boolean,
337
- clearable: Boolean,
338
- msgTop: {
339
- type: [Number, String],
340
- default: function _default() {
341
- return this.height && !this.fixTop ? '0r' : '1r'
342
- }
343
- }
344
- },
345
- data() {
346
- return {
347
- current: null,
348
- currentIndex: 0,
349
- random: Math.floor(Math.random() * 100000000),
350
- checkedRadio: '',
351
- checkedRadioCache: '',
352
- checkedCache: [],
353
- preventAdjust: false,
354
- nodata: false,
355
- notfull: false,
356
- observer: null,
357
- initData: [],
358
- lastSelectedRow: null,
359
- isSelectAll: false,
360
- changeType: 'default',
361
- changeIDataType: 'default',
362
- radioValue: '',
363
- iData: [],
364
- iHeads: [],
365
- fixed: false,
366
- isStartLongtap: false,
367
- longtapTimer: null,
368
- stopClick: false
369
- };
370
- },
371
- computed: {
372
-
373
- hasAction() {
374
- return this.columns.some(column => column.type === 'action')
375
- },
376
-
377
- // 普通列
378
- normalColumn() {
379
- if (this.type === 'v') {
380
- return this.columns_.filter(column => !['key', 'desc', 'icon', 'state', 'selection', 'radio', 'action'].includes(column.type))
381
- } else {
382
- return this.columns_.filter(column => !['icon', 'selection', 'radio'].includes(column.type))
383
- }
384
- },
385
-
386
- // 自动支持显示详情
387
- // 当默认显示的普通列数小于全部的列数时可点击当前行弹出全部列数信息作为详情
388
- autoShowDetail() {
389
- if (this.showColumns && this.autoDetail) {
390
- if (!isNaN(this.showColumns)) {
391
- if (this.showColumns < this.normalColumn.length) {
392
- return true
393
- } else {
394
- return false
395
- }
396
- } else {
397
- if (this.showColumns.split(',').length < this.normalColumn.length) {
398
- return true
399
- } else {
400
- return false
401
- }
402
- }
403
- } else {
404
- return false
405
- }
406
- },
407
-
408
- // 支持长按显示 action
409
- longTapAction() {
410
- if (this.contextAction || (this.contextSelection !== null && this.type === 'v')) {
411
- let flag = false
412
- this.columns.map(item => {
413
- if (item.type === 'action') {
414
- flag = true
415
- }
416
- })
417
- return flag
418
- } else {
419
- return false
420
- }
421
- },
422
- hasKey() {
423
- let flag = false
424
- this.columns.map(item => {
425
- if (item.type === 'key') {
426
- flag = true
427
- }
428
- })
429
- return flag
430
- },
431
- hasRadio() {
432
- let flag = false
433
- this.columns.map(item => {
434
- if (item.type === 'radio') {
435
- flag = true
436
- }
437
- })
438
- return flag
439
- },
440
- hasSelection() {
441
- let flag = false
442
- this.columns.map(item => {
443
- if (item.type === 'selection') {
444
- flag = true
445
- }
446
- })
447
- return flag
448
- },
449
- checked() {
450
- let arr = []
451
- this.iData.map(item => {
452
- if (item._checked) {
453
- const obj = JSON.parse(JSON.stringify(item))
454
- delete obj._index
455
- delete obj._checked
456
- delete obj._level
457
- delete obj._show
458
- delete obj._hover
459
- delete obj._active
460
- arr.push(obj)
461
- }
462
- })
463
- if (this.remember) {
464
- return unique(arr.concat(this.checkedCache))
465
- } else {
466
- return arr
467
- }
468
- },
469
- // 是否是按行设置的高度
470
- isRowHeight() {
471
- return String(this.height).charAt(this.height.length - 1) === 'r'
472
- },
473
- // msg是否是按行设置的高度
474
- isMsgTopRowHeight() {
475
- return String(this.msgTop).charAt(this.msgTop.length - 1) === 'r'
476
- },
477
- columns_() {
478
- let columns = this.columns
479
- for (let i = 0; i < columns.length; i++) {
480
- const el = columns[i]
481
- if (['action', 'selection', 'radio', 'index'].includes(el.type)) {
482
- continue
483
- } else {
484
- el._isFirst = true
485
- break
486
- }
487
- }
488
- return columns
489
- },
490
- flatColumns() {
491
-
492
- // 打平多级 columns 数组,用于 slot 遍历
493
- let arr = []
494
- function setArr(data) {
495
- data.map(column => {
496
- let tempColumn = JSON.parse(JSON.stringify(column))
497
- if (tempColumn.children) {
498
- delete tempColumn.children
499
- }
500
- arr.push(tempColumn)
501
- if (column.children) {
502
- setArr(column.children)
503
- }
504
- })
505
- }
506
- setArr(this.columns)
507
- return arr
508
- },
509
- setClass() {
510
- let arr = [];
511
- if (this.border) {
512
- arr.push('to-table-border');
513
- }
514
- if (this.even) {
515
- arr.push('to-table-even');
516
- }
517
- if (this.type) {
518
- arr.push('to-table-type-' + this.type);
519
- }
520
- if (this.nodata) {
521
- arr.push('to-table-nodata');
522
- }
523
- if (this.linePosition) {
524
- arr.push('to-table-line-position-' + this.linePosition);
525
- }
526
- if (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction) {
527
- arr.push('to-table-row-selectable');
528
- }
529
- if (this.height && this.isRowHeight) {
530
- arr.push(`to-table-height-${this.height}`)
531
- }
532
- if (this.notfull) {
533
- arr.push('to-table-notfull')
534
- }
535
- if (this.height && this.height === 'full') {
536
- arr.push('to-table-height-full')
537
- }
538
- if (this.fixed) {
539
- arr.push('to-table-fixed')
540
- }
541
- if (this.msgTop && this.isMsgTopRowHeight) {
542
- arr.push(`to-table-msg-top-${this.msgTop}`)
543
- }
544
- if (this.itemFillet) {
545
- arr.push(`to-table-item-fillet-${this.itemFillet}`)
546
- }
547
- return arr;
548
- },
549
- setStyle() {
550
- let obj = {}
551
- if (this.height && !this.isRowHeight) {
552
- if (this.height !== 'full' || this.height === 0) {
553
- obj.height = this.height + 'em'
554
- }
555
- }
556
- return obj
557
- },
558
- setMsgTopStyle() {
559
- let obj = {}
560
- if (this.msgTop && !this.isMsgTopRowHeight) {
561
- obj.top = this.msgTop + 'em'
562
- }
563
- return obj
564
- }
565
- },
566
- watch: {
567
- contextSelection(val) {
568
- if (!val) {
569
- this.iData.map(item => {
570
- item._checked = false
571
- })
572
- this.checkedCache = []
573
- }
574
- },
575
- loading: {
576
- handler() {
577
- if (this.$refs.loading) {
578
- if (this.loading) {
579
- this.$refs.loading.open()
580
- } else {
581
- this.$refs.loading.close()
582
- }
583
- }
584
- },
585
- immediate: true
586
- },
587
- heads: {
588
- handler(heads) {
589
- heads && (this.iHeads = heads.split(','))
590
- },
591
- immediate: true
592
- },
593
- iData: {
594
- handler() {
595
- if (this.changeIDataType === 'default') {
596
- this.changeType = 'update'
597
- this.formatData(this.iData)
598
- this.$emit('update:data', this.iData)
599
- this.$nextTick(()=>{
600
- this.changeType = 'default'
601
- })
602
- }
603
- },
604
- deep: true
605
- },
606
- data: {
607
- handler(data = []) {
608
- if (this.changeType === 'default') {
609
- if (this.remember) {
610
-
611
- // 页面切换 idata 变化之前记住勾选了哪些
612
- if (this.hasRadio) {
613
- if (this.checkedRadio) {
614
- let obj = JSON.parse(JSON.stringify(this.iData[Number(this.checkedRadio)]))
615
- delete obj._index
616
- delete obj._checked
617
- delete obj._level
618
- delete obj._show
619
- delete obj._hover
620
- delete obj._active
621
- this.checkedRadioCache = JSON.stringify(obj)
622
- }
623
- } else if (this.hasSelection) {
624
- this.iData.map(item => {
625
- if (item._checked) {
626
- delete item._index
627
- delete item._checked
628
- delete item._level
629
- delete item._show
630
- delete item._hover
631
- delete item._active
632
- this.checkedCache.push(JSON.parse(JSON.stringify(item)))
633
- }
634
- })
635
- this.checkedCache = unique(this.checkedCache)
636
- }
637
-
638
- // 页面切换 idata 变化之后
639
- this.$nextTick(()=>{
640
-
641
- // 单选
642
- this.formatData(data)
643
- if (this.hasRadio) {
644
- this.checkedRadio = ''
645
- this.iData.map((data, index)=> {
646
- let _data = JSON.parse(JSON.stringify(data))
647
- delete _data._checked
648
- delete _data._hover
649
- delete _data._active
650
- delete _data._on
651
- if (this.checkedRadioCache === JSON.stringify(_data)) {
652
- this.iData[index]._checked = true
653
- this.checkedRadio = String(index)
654
- }
655
- })
656
- } else if (this.hasSelection) {
657
- this.checked.map((item)=>{
658
- this.iData.map((data, index)=> {
659
- let _item = JSON.parse(JSON.stringify(item))
660
- let _data = JSON.parse(JSON.stringify(data))
661
- delete _item._index
662
- delete _item._checked
663
- delete _item._level
664
- delete _item._show
665
- delete _item._hover
666
- delete _item._active
667
- delete _data._index
668
- delete _data._checked
669
- delete _data._level
670
- delete _data._show
671
- delete _data._hover
672
- delete _data._active
673
- if (JSON.stringify(_item) === JSON.stringify(_data)) {
674
- this.iData[index]._checked = true
675
- }
676
- })
677
- })
678
- }
679
- this.setSelectAll()
680
- this.adjust()
681
- })
682
-
683
- } else {
684
- this.checkedRadio = ''
685
- this.formatData(data)
686
- this.setSelectAll()
687
- this.adjust()
688
- }
689
- this.$nextTick(()=>{
690
- if (this.hasRadio) {
691
- this.iData.map((item, index) => {
692
- if (item._checked) {
693
- this.checkedRadio = String(index)
694
- }
695
- })
696
- }
697
- })
698
- } else {
699
- this.formatData(data)
700
- this.setSelectAll()
701
- this.adjust()
702
- }
703
- },
704
- immediate: true,
705
- deep: true
706
- }
707
- },
708
- mounted() {
709
- this.init()
710
- },
711
- activated() {
712
- this.init()
713
- },
714
- deactivated() {
715
- this.destroy()
716
- },
717
- beforeDestroy() {
718
- this.destroy()
719
- },
720
- methods: {
721
- init() {
722
- if (this.$refs && this.$refs.tbody) {
723
- // 监听 slot 中的 DOM 变化
724
- let tbody = this.$refs.tbody.$el || this.$refs.tbody
725
- const observer = new MutationObserver(this.adjust)
726
- observer.observe(tbody, {
727
- childList: true,
728
- subtree: true
729
- })
730
- this.observer = observer
731
- }
732
- window.addEventListener('resize', this.dbSetFix)
733
- window.addEventListener('touchend', this.restoreClick)
734
- },
735
- destroy() {
736
- // 停止监听 slot 中的 DOM 变化
737
- if (this.heads && this.$refs.tbody) {
738
- this.observer.disconnect()
739
- }
740
- window.removeEventListener('resize', this.dbSetFix)
741
- window.removeEventListener('touchend', this.restoreClick)
742
- },
743
- startBatch() {
744
- this.$emit('update:contextSelection', true)
745
- this.current._checked = true
746
- this.$refs.action.close()
747
- },
748
- restoreClick() {
749
- setTimeout(() => {
750
- this.stopClick = false
751
- }, 300);
752
- },
753
- hasVScroll() {
754
- return this.$refs.table.offsetHeight > this.$el.offsetHeight
755
- },
756
- hasHScroll() {
757
- return this.$refs.table.offsetWidth > this.$el.offsetWidth
758
- },
759
- getBarWidth() {
760
- var scrollTester = document.createElement('div')
761
- scrollTester.id = 'scrollTester'
762
- scrollTester.style.width = '200px'
763
- scrollTester.style.height = '200px'
764
- scrollTester.style.position = 'absolute'
765
- scrollTester.style.visibility = 'hidden'
766
- scrollTester.style.overflow = 'scroll'
767
- document.body.appendChild(scrollTester)
768
- var barWidth = document.getElementById('scrollTester').offsetWidth - document.getElementById('scrollTester').scrollWidth;
769
- document.body.removeChild(scrollTester)
770
- scrollTester = null;
771
- return barWidth
772
- },
773
- adjust() {
774
- (db(()=>{
775
- this.setBottomLine()
776
- this.setNodata()
777
- this.setFix()
778
- }, 200))()
779
- },
780
- dbSetFix() {
781
- (db(()=>{
782
- this.setFix()
783
- }, 200))()
784
- },
785
- setFix() {
786
- if (this.type === 'v') {
787
- return
788
- }
789
- setTimeout(() => {
790
- this.setFixDiv()
791
- this.syncThWidth()
792
- this.syncTrHeight()
793
- }, 200);
794
- },
795
- syncTrHeight() {
796
- if (this.type === 'v' || !this.syncHeight) { return }
797
- if (this.$refs.tbody && this.$refs.tbody.$el.children.length) {
798
- for (let i = 0; i < this.$refs.tbody.$el.children.length; i++) {
799
- const tr = this.$refs.tbody.$el.children[i];
800
- if (Number(this.fixRight) > 0 && this.$refs.rightBody) {
801
- this.$refs.rightBody.$el.children[i].style.height = tr.getBoundingClientRect().height + 'px'
802
- }
803
- if (Number(this.fixLeft) > 0 && this.$refs.leftBody) {
804
- this.$refs.leftBody.$el.children[i].style.height = tr.getBoundingClientRect().height + 'px'
805
- }
806
- }
807
- }
808
- },
809
- syncThWidth() {
810
- if (this.columns.length > 0) {
811
- if (!(this.$refs && this.$refs.thead && this.$refs.thead.$refs && this.$refs.thead.$refs.row)) {
812
- return
813
- }
814
- const trs = this.$refs.thead.$refs.row.children
815
- if (Number(this.fixTop) > 0 && this.$refs.topHead) {
816
- const topTrs = this.$refs.topHead.$refs.row.children
817
- for (let i = 0; i < topTrs.length; i++) {
818
- const ths = trs[i].children
819
- const topThs = topTrs[i].children
820
- for (let j = 0; j < ths.length; j++) {
821
- const th = ths[j];
822
- const topTh = topThs[j];
823
- topTh.style.width = th.getBoundingClientRect().width + 'px'
824
- }
825
- }
826
- }
827
- if (Number(this.fixRight) > 0 && this.$refs.rightHead) {
828
- const rightTrs = this.$refs.rightHead.$refs.row.children
829
- for (let i = 0; i < rightTrs.length; i++) {
830
- const ths = trs[i].children
831
- const rightThs = rightTrs[i].children
832
- if (rightThs.length > 0) {
833
- for (let j = ths.length - rightThs.length; j < ths.length; j++) {
834
- const th = ths[j]
835
- const rightTh = rightThs[j - ths.length + rightThs.length]
836
- rightTh.style.width = th.getBoundingClientRect().width + 'px'
837
- rightTh.style.height = th.getBoundingClientRect().height + 'px'
838
- }
839
- }
840
- }
841
- if (Number(this.fixTop) > 0 && this.$refs.rightTopHead) {
842
- const rightTopTrs = this.$refs.rightTopHead.$refs.row.children
843
- for (let i = 0; i < rightTopTrs.length; i++) {
844
- const ths = trs[i].children
845
- const rightTopThs = rightTopTrs[i].children
846
- if (rightTopThs.length > 0) {
847
- for (let i = ths.length - rightTopThs.length; i < ths.length; i++) {
848
- const th = ths[i]
849
- const rightTopTh = rightTopThs[i - ths.length + rightTopThs.length]
850
- rightTopTh.style.width = th.getBoundingClientRect().width + 'px'
851
- rightTopTh.style.height = th.getBoundingClientRect().height + 'px'
852
- }
853
- }
854
- }
855
- }
856
- }
857
- if (Number(this.fixLeft) > 0 && this.$refs.leftHead) {
858
- const leftTrs = this.$refs.leftHead.$refs.row.children
859
- for (let i = 0; i < leftTrs.length; i++) {
860
- const ths = trs[i].children
861
- const leftThs = leftTrs[i].children
862
- if (leftThs.length > 0) {
863
- for (let j = 0; j < leftThs.length; j++) {
864
- const th = ths[j]
865
- const leftTh = leftThs[i]
866
- leftTh.style.width = th.getBoundingClientRect().width + 'px'
867
- leftTh.style.height = th.getBoundingClientRect().height + 'px'
868
- }
869
- }
870
- }
871
- if (Number(this.fixTop) > 0 && this.$refs.leftTopHead) {
872
- const leftTopTrs = this.$refs.leftTopHead.$refs.row.children
873
- for (let i = 0; i < leftTopTrs.length; i++) {
874
- const ths = trs[i].children
875
- const leftTopThs = leftTopTrs[i].children
876
- if (leftTopThs.length > 0) {
877
- for (let i = 0; i < leftTopThs.length; i++) {
878
- const th = ths[i]
879
- const leftTopTh = leftTopThs[i]
880
- leftTopTh.style.width = th.getBoundingClientRect().width + 'px'
881
- leftTopTh.style.height = th.getBoundingClientRect().height + 'px'
882
- }
883
- }
884
- }
885
- }
886
- }
887
- }
888
- },
889
- setFixDiv() {
890
- if (Number(this.fixTop) > 0 && this.$refs.top && this.$refs.topTable) {
891
- if (this.hasVScroll()) {
892
- this.$refs.top.style.width = this.$refs.body.offsetWidth - this.getBarWidth() + 'px'
893
- }
894
- this.$refs.topTable.style.width = this.$refs.table.offsetWidth + 'px'
895
- this.$refs.table.style.width = this.$refs.table.offsetWidth + 'px'
896
- }
897
- if (Number(this.fixRight) > 0 && this.$refs.right && this.$el) {
898
- if (this.hasHScroll()) {
899
- this.$refs.right.style.height = this.$el.offsetHeight - this.getBarWidth() + 'px'
900
- }
901
- if (this.hasVScroll()) {
902
- this.$refs.right.style.right = this.getBarWidth() + 'px'
903
- if (Number(this.fixTop) > 0) {
904
- this.$refs.rightTop.style.right = this.getBarWidth() + 'px'
905
- }
906
- }
907
- }
908
- if (Number(this.fixLeft) > 0 && this.$refs.left && this.$el) {
909
- if (this.hasHScroll()) {
910
- this.$refs.left.style.height = this.$el.offsetHeight - this.getBarWidth() + 'px'
911
- }
912
- }
913
- },
914
- setNodata() {
915
- if (!this.$refs.tbody) return
916
- let tbody = this.$refs.tbody.$el || this.$refs.tbody
917
- if (tbody.children.length === 0) {
918
- this.nodata = true
919
- } else {
920
- this.nodata = false
921
- }
922
- },
923
- setBottomLine() {
924
- if (this.height && this.$refs.table.offsetHeight < this.$el.offsetHeight - 3 && this.linePosition !== 'none' && this.linePosition !== 'v') {
925
- this.notfull = true
926
- } else {
927
- this.notfull = false
928
- }
929
- },
930
- formatData(data = []) {
931
- this.changeIDataType = 'change'
932
- let that = this
933
- var dataTemp = JSON.parse(JSON.stringify(data))
934
-
935
- // 初始化级别为 1
936
- let level = 1
937
-
938
- // 初始化一个数组,用于存储最后生成的 data
939
- let arr = []
940
-
941
- // 递归生成 data,计算出表格树每一行的 level,并标识其是否具有子对象
942
- function setData(data) {
943
- data.map((dataItem, dataIndex) => {
944
- if (dataItem._index === undefined) {
945
- that.$set(dataItem, '_index', dataItem._index || dataIndex + 1)
946
- }
947
- if (dataItem._checked === undefined) {
948
- that.$set(dataItem, '_checked', dataItem._checked !== undefined ? dataItem._checked : false)
949
- }
950
- if (dataItem._level === undefined) {
951
- that.$set(dataItem, '_level', level)
952
- }
953
- if (dataItem._show === undefined) {
954
- if (level === 1 || that.expand) {
955
- that.$set(dataItem, '_show', true)
956
- } else {
957
- that.$set(dataItem, '_show', false)
958
- }
959
- }
960
- if (that.expand && dataItem._showChild === undefined) {
961
- that.$set(dataItem, '_showChild', true)
962
- }
963
- arr.push(dataItem)
964
- if (dataItem.children && (dataItem._hasChild === undefined || dataItem._hasChild === true)) {
965
- that.$set(dataItem, '_hasChild', true)
966
- level++
967
- setData(dataItem.children)
968
- }
969
- delete dataItem.children
970
- })
971
- level--
972
- }
973
- setData(dataTemp)
974
- this.iData = arr
975
- setTimeout(() => {
976
- this.changeIDataType = 'default'
977
- }, 100);
978
- },
979
- // 设置全选或者不全选
980
- toggleAllSelection(checked) {
981
- this.iData.map(item => {
982
- if (!item.disabled) {
983
- this.$set(item, '_checked', checked)
984
- }
985
- })
986
- },
987
- // 全选中事件
988
- handleSelectionAllChange(checked) {
989
- this.isSelectAll = checked
990
- this.toggleAllSelection(checked)
991
- this.iData.map(item => {
992
- if (!item._checked) {
993
- this.removeFromCache(item)
994
- }
995
- })
996
- this.$emit('change', this.checked, checked)
997
- this.$emit('selectionChange', this.checked)
998
- this.$emit('selection-change', this.checked)
999
- },
1000
- // 根据 checkbox 计算是否全选
1001
- setSelectAll() {
1002
- let isAll = true
1003
- this.iData.map(item=>{
1004
- if (!item._checked) {
1005
- isAll = false
1006
- }
1007
- })
1008
- this.isSelectAll = isAll
1009
- },
1010
- // 行勾选事件
1011
- handleTableRowChecked(checked, dataIndex) {
1012
- const current = this.iData[dataIndex]
1013
- if (!checked) {
1014
- this.removeFromCache(this.iData[dataIndex])
1015
- }
1016
- this.setSelectAll()
1017
- this.$emit('change', this.checked, checked, current)
1018
- this.$emit('selectionChange', this.checked, current)
1019
- this.$emit('selection-change', this.checked, current)
1020
- },
1021
- // 从记录中移除
1022
- removeFromCache(rowData) {
1023
- for (let i = 0; i < this.checkedCache.length; i++) {
1024
- let _item = JSON.parse(JSON.stringify(rowData))
1025
- let _data = JSON.parse(JSON.stringify(this.checkedCache[i]))
1026
- delete _item._index
1027
- delete _item._checked
1028
- delete _item._level
1029
- delete _item._show
1030
- delete _item._hover
1031
- delete _item._active
1032
- delete _data._index
1033
- delete _data._checked
1034
- delete _data._level
1035
- delete _data._show
1036
- delete _data._hover
1037
- delete _data._active
1038
- if (JSON.stringify(_item) === JSON.stringify(_data)) {
1039
- this.checkedCache.splice(i, 1)
1040
- i--
1041
- }
1042
- }
1043
- },
1044
- // 单选框点击
1045
- handleTableRowRadio(current) {
1046
- this.$emit('change', current, true)
1047
- this.$emit('radioChange', current, true)
1048
- this.$emit('radio-change', current, true)
1049
- },
1050
- // table 点击事件
1051
- handleTableClick(event, eventPath) {
1052
- if (this.stopClick) { return}
1053
- if (this.rowSelectable || this.selectable || this.cellSelectable || this.autoShowDetail || this.longTapAction) {
1054
- const composedPath = eventPath ? eventPath : getEventPath(event)
1055
- for (let i = 0; i < composedPath.length; i++) {
1056
- const dom = composedPath[i]
1057
- if (String(dom.tagName).toLowerCase() === 'tr') {
1058
-
1059
- this.lastSelectedRow = dom
1060
- const rowIndex = Number(getDataSet(dom).index)
1061
-
1062
- if (this.rowSelectable || this.selectable) {
1063
-
1064
- // 行点击事件
1065
- this.$emit('row-click', this.iData[rowIndex], rowIndex, event)
1066
- if (this.highlightCurrentRow) {
1067
- this.iData.map((item, index) => {
1068
- if (index === rowIndex) {
1069
- if (this.clearable) {
1070
- if (item._on) {
1071
- item._on = false
1072
- } else {
1073
- this.$set(item, '_on', true)
1074
- }
1075
- } else {
1076
- this.$set(item, '_on', true)
1077
- }
1078
- } else {
1079
- this.$set(item, '_on', false)
1080
- }
1081
- })
1082
- }
1083
-
1084
- // 多选联动
1085
- if (this.hasSelection && !this.iData[rowIndex].disabled) {
1086
- this.iData[rowIndex]._checked = !this.iData[rowIndex]._checked
1087
- this.handleTableRowChecked(this.iData[rowIndex]._checked, rowIndex)
1088
- }
1089
-
1090
- // 单选联动
1091
- if (this.hasRadio && !this.iData[rowIndex].disabled) {
1092
- if (this.clickRadio(this.iData[rowIndex], rowIndex)) {
1093
- this.selectRadio(rowIndex)
1094
- }
1095
- }
1096
- }
1097
-
1098
- if (this.autoShowDetail) {
1099
- this.current = this.iData[rowIndex]
1100
- this.currentIndex = rowIndex
1101
- this.$refs.detail.open()
1102
- }
1103
-
1104
- } else if (String(dom.tagName).toLowerCase() === 'td' && (this.cellSelectable || this.selectable)) {
1105
- // 单元格点击事件
1106
- const cellIndex = getDataSet(dom).index || -1
1107
- cellIndex > -1 && this.$emit('cell-click', this.iData[cellIndex], this.columns_, dom, event)
1108
- }
1109
- }
1110
- }
1111
- },
1112
- // table 双击事件
1113
- handleTableDblClick(event) {
1114
- if (this.stopClick) { return}
1115
- if (this.$listeners['row-dblclick'] || this.$listeners['cell-dblclick']) {
1116
- const composedPath = getEventPath(event)
1117
- for (let i = 0; i < composedPath.length; i++) {
1118
- const dom = composedPath[i]
1119
- if (String(dom.tagName).toLowerCase() === 'tr') {
1120
- // 行点击事件
1121
- this.lastSelectedRow = dom
1122
- const rowIndex = Number(getDataSet(dom).index)
1123
- this.$emit('row-dblclick', this.iData[rowIndex], this.columns_, event)
1124
-
1125
- } else if (String(dom.tagName).toLowerCase() === 'td') {
1126
- // 单元格点击事件
1127
- const cellIndex = Number(getDataSet(dom).index) || -1
1128
- cellIndex > -1 && this.$emit('cell-dblclick', this.iData[cellIndex], cellIndex, dom, event)
1129
- }
1130
- }
1131
- }
1132
- },
1133
- // table鼠标悬移事件
1134
- handleTableMouseover(event) {
1135
- if (!this.$pc) return
1136
- if (this.rowSelectable || this.selectable) {
1137
- const composedPath = getEventPath(event)
1138
- for (let i = 0; i < composedPath.length; i++) {
1139
- const dom = composedPath[i]
1140
- if (String(dom.tagName).toLowerCase() === 'tr' && (this.rowSelectable || this.selectable)) {
1141
- this.lastSelectedRow = dom
1142
- const rowIndex = Number(getDataSet(dom).index)
1143
- this.iData.map((item, index) => {
1144
- if (index === rowIndex) {
1145
- this.$set(item, '_hover', true)
1146
- }
1147
- })
1148
- }
1149
- }
1150
- }
1151
- },
1152
- // table鼠标悬移事件
1153
- handleTableMouseout(event) {
1154
- if (!this.$pc) return
1155
- if (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction) {
1156
- const composedPath = getEventPath(event)
1157
- for (let i = 0; i < composedPath.length; i++) {
1158
- const dom = composedPath[i]
1159
- if (String(dom.tagName).toLowerCase() === 'tr' && (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction)) {
1160
- this.lastSelectedRow = dom
1161
- const rowIndex = Number(getDataSet(dom).index)
1162
- this.changeIDataType = 'change'
1163
- this.iData.map((item, index) => {
1164
- if (index === rowIndex) {
1165
- this.$set(item, '_hover', false)
1166
- this.$set(item, '_active', false)
1167
- }
1168
- })
1169
- this.$nextTick(()=>{
1170
- this.changeIDataType = 'default'
1171
- })
1172
- }
1173
- }
1174
- }
1175
- },
1176
- // table鼠标按下事件
1177
- handleTableMousedown(event) {
1178
- if (((this.$pad || this.$phone) && event.type === 'touchstart') || (this.$pc && event.type === 'mousedown')) {
1179
- if (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction) {
1180
- const composedPath = getEventPath(event)
1181
- for (let i = 0; i < composedPath.length; i++) {
1182
- const dom = composedPath[i]
1183
- if (String(dom.tagName).toLowerCase() === 'tr' && (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction)) {
1184
- this.lastSelectedRow = dom
1185
- const rowIndex = Number(getDataSet(dom).index)
1186
- if (this.$phone) {
1187
- this.isStartLongtap = true
1188
- this.longtapTimer = setTimeout(() => {
1189
- if (this.isStartLongtap) {
1190
- event.preventDefault()
1191
- this.$emit('contextmenu', this.iData[rowIndex], rowIndex, event)
1192
- this.stopClick = true
1193
-
1194
- this.changeIDataType = 'change'
1195
- this.iData.map((item, index) => {
1196
- if (index === rowIndex) {
1197
- this.$set(item, '_active', false)
1198
- }
1199
- })
1200
- this.$nextTick(()=>{
1201
- this.changeIDataType = 'default'
1202
- })
1203
-
1204
- // 弹出功能列表
1205
- if (this.type === 'v' && ((this.columns.some(item => item.type === 'action') && this.contextAction) || this.contextSelection !== null)) {
1206
- this.current = this.iData[rowIndex]
1207
- this.currentIndex = rowIndex
1208
- this.$refs.action.open()
1209
- }
1210
- }
1211
- this.isStartLongtap = false
1212
- }, 300);
1213
- }
1214
- this.changeIDataType = 'change'
1215
- if (this.rowSelectable || this.selectable || this.autoShowDetail) {
1216
- this.iData.map((item, index) => {
1217
- if (index === rowIndex) {
1218
- this.$set(item, '_active', true)
1219
- }
1220
- })
1221
- }
1222
- this.$nextTick(()=>{
1223
- this.changeIDataType = 'default'
1224
- })
1225
- }
1226
- }
1227
- }
1228
- }
1229
- },
1230
- // table鼠标松开事件
1231
- handleTableMouseup(event) {
1232
- if (((this.$pad || this.$phone) && event.type === 'touchend') || (this.$pc && event.type === 'mouseup')) {
1233
- if (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction) {
1234
- const composedPath = getEventPath(event)
1235
- for (let i = 0; i < composedPath.length; i++) {
1236
- const dom = composedPath[i]
1237
- if (String(dom.tagName).toLowerCase() === 'tr' && (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction)) {
1238
- this.lastSelectedRow = dom
1239
- const rowIndex = Number(getDataSet(dom).index)
1240
- this.changeIDataType = 'change'
1241
- this.iData.map((item, index) => {
1242
- if (index === rowIndex) {
1243
- this.$set(item, '_active', false)
1244
- }
1245
- })
1246
- this.$nextTick(()=>{
1247
- this.changeIDataType = 'default'
1248
- })
1249
- if (this.$phone) {
1250
- this.isStartLongtap = false
1251
- clearInterval(this.longtapTimer)
1252
- }
1253
- }
1254
- }
1255
- }
1256
- }
1257
- },
1258
- // table鼠标移动事件
1259
- handleTableMousemove(event) {
1260
- this.isStartLongtap = false
1261
- if (this.rowSelectable || this.selectable || this.autoShowDetail) {
1262
- const composedPath = getEventPath(event)
1263
- for (let i = 0; i < composedPath.length; i++) {
1264
- const dom = composedPath[i]
1265
- if (String(dom.tagName).toLowerCase() === 'tr' && (this.rowSelectable || this.selectable || this.autoShowDetail)) {
1266
- this.lastSelectedRow = dom
1267
- const rowIndex = Number(getDataSet(dom).index)
1268
- this.changeIDataType = 'change'
1269
- this.iData.map((item, index) => {
1270
- if (index === rowIndex) {
1271
- this.$set(item, '_active', false)
1272
- }
1273
- })
1274
- this.$nextTick(()=>{
1275
- this.changeIDataType = 'default'
1276
- })
1277
- }
1278
- if (this.$phone) {
1279
- this.isStartLongtap = false
1280
- clearInterval(this.longtapTimer)
1281
- }
1282
- }
1283
- }
1284
- },
1285
- // table右击事件
1286
- handleTableRowRightClick(item, index, event) {
1287
- if (this.$pc) {
1288
- event.preventDefault()
1289
- this.$emit('contextmenu', item, index, event)
1290
- this.$emit('row-right-click', item, index, event)
1291
- if (this.longTapAction) {
1292
- this.current = item
1293
- this.$refs.action.open(event)
1294
- }
1295
- }
1296
- },
1297
- handleTableHeadCellClick(item, index, event, propKey) {
1298
- if (item.sortable) {
1299
- this.handleSortClick(item, index);
1300
- } else {
1301
- this.$emit('head-cell-click', item, index, event);
1302
- }
1303
- },
1304
- handleSortClick(item, index) {
1305
- const orderType = item.orderType
1306
- this.columns.map((column, columnIndex) => {
1307
- if (columnIndex === index) {
1308
- if (!orderType) {
1309
- this.$set(column, 'orderType', 'asc')
1310
- } else if (orderType === 'asc') {
1311
- this.$set(column, 'orderType', 'desc')
1312
- } else if (orderType === 'desc') {
1313
- this.$set(column, 'orderType', '')
1314
- }
1315
- } else {
1316
- if (column.sortable) {
1317
- this.$set(column, 'orderType', '')
1318
- }
1319
- }
1320
- })
1321
- if (this.initData.length === 0) {
1322
- this.initData = JSON.parse(JSON.stringify(this.data))
1323
- }
1324
- if (this.sortFunction) {
1325
- this.sortFunction(index, item.orderType)
1326
- } else {
1327
- this.processOrder(index, item.orderType)
1328
- }
1329
- },
1330
- processOrder(index, orderType) {
1331
- let property = this.columns[index].prop
1332
- if (orderType === '') {
1333
- for (let i = 0; i < this.initData.length; i++) {
1334
- this.$set(this.data, i, this.initData[i])
1335
- }
1336
- this.initData = []
1337
- return
1338
- }
1339
- this.data.sort((a, b)=>{
1340
- if (orderType === 'asc') {
1341
- return String(a[property]).localeCompare(String(b[property]));
1342
- } else if (orderType === 'desc') {
1343
- return String(b[property]).localeCompare(String(a[property]));
1344
- }
1345
- })
1346
- },
1347
- scrollHandle() {
1348
- var scrollLeft = this.$refs.body.scrollLeft;
1349
- var scrollTop = this.$refs.body.scrollTop;
1350
- if (typeof scrollLeft !== 'undefined') {
1351
- if (this.fixTop && this.$refs.topTable) {
1352
- this.$refs.topTable.style.left = 0 - scrollLeft + 'px';
1353
- }
1354
- if (this.fixRight && this.$refs.rightTable) {
1355
- this.$refs.rightTable.style.top = 0 - scrollTop + 'px';
1356
- }
1357
- if (this.fixLeft && this.$refs.leftTable) {
1358
- this.$refs.leftTable.style.top = 0 - scrollTop + 'px';
1359
- }
1360
- }
1361
- },
1362
- columnStyle(column) {
1363
- var obj = {};
1364
- if (column.width) {
1365
- if (!isNaN(column.width)) {
1366
- obj.width = column.width + 'em';
1367
- } else {
1368
- obj.width = column.width;
1369
- }
1370
- }
1371
- return obj;
1372
- },
1373
- checkedRadioHandle(item, dataIndex) {
1374
- if (this.clickRadio(item, dataIndex)) {
1375
- this.selectRadio(dataIndex)
1376
- }
1377
- },
1378
- clickRadio(item, dataIndex) {
1379
- if (this.checkedRadio === String(dataIndex) && this.clearable) {
1380
- this.checkedRadio = ''
1381
- this.$set(item, '_checked', false)
1382
- this.$emit('change', item, false)
1383
- this.$emit('radioChange', item, false)
1384
- this.$emit('radio-change', item, false)
1385
- return false
1386
- } else {
1387
- return true
1388
- }
1389
- },
1390
- selectRadio(rowIndex) {
1391
- // 先将所有单选都设为 false ,再选中
1392
- this.iData.forEach(item => {
1393
- item._checked = false
1394
- })
1395
-
1396
- this.$set(this.iData[rowIndex], '_checked', true)
1397
-
1398
- this.checkedRadio = String(rowIndex)
1399
- if (this.remember) {
1400
- let obj = JSON.parse(JSON.stringify(this.iData[rowIndex]))
1401
- delete obj._on
1402
- delete obj._active
1403
- delete obj._hover
1404
- delete obj._checked
1405
- this.checkedRadioCache = JSON.stringify(obj)
1406
- }
1407
-
1408
- this.$emit('change', this.iData[rowIndex], true)
1409
- this.$emit('radioChange', this.iData[rowIndex], true)
1410
- this.$emit('radio-change', this.iData[rowIndex], true)
1411
- },
1412
- clear() {
1413
- this.iData.map(item => {item._checked = false})
1414
- if (this.remember) {
1415
- this.checkedCache = []
1416
- }
1417
- if (this.hasRadio) {
1418
- this.checkedRadio = ''
1419
- this.$emit('change', {}, false)
1420
- }
1421
- },
1422
- select(row) {
1423
- let targetIndex = this.iData.findIndex(item =>
1424
- Object.entries(row)
1425
- .filter(([key]) => !key.startsWith('_')) // 过滤掉 "_" 开头的键
1426
- .every(([key, value]) => item[key] === value) // 确保所有属性都匹配
1427
- )
1428
- let target = this.iData[targetIndex]
1429
- if (this.hasSelection) {
1430
- target._checked = true
1431
- this.$emit('change', this.checked, true, target)
1432
- }
1433
- if (this.hasRadio) {
1434
- this.selectRadio(targetIndex)
1435
- }
1436
- },
1437
- unselect(row) {
1438
- let target = this.iData.find(item =>
1439
- Object.entries(row)
1440
- .filter(([key]) => !key.startsWith('_')) // 过滤掉 "_" 开头的键
1441
- .every(([key, value]) => item[key] === value) // 确保所有属性都匹配
1442
- )
1443
- if (this.hasSelection) {
1444
- target._checked = false
1445
- this.$emit('change', this.checked, false, target)
1446
- }
1447
- if (this.hasRadio) {
1448
- if (target._checked) {
1449
- this.clear()
1450
- }
1451
- }
1452
- },
1453
- columnChangeHandle(data) {
1454
- this.$emit('update:columns', data)
1455
- }
1456
- }
1457
- }
1458
- </script>
1
+ <template>
2
+ <div class="to-table" :class="setClass" :style="setStyle">
3
+ <template v-if="columns_ && columns_.length > 0">
4
+ <div v-if="Number(fixTop) > 0 && type !== 'v'" ref="top" class="top">
5
+ <table ref="topTable">
6
+ <table-head ref="topHead" :data="columns_" :configurable="configurable && !(Number(fixRight) > 0)" @select-all="handleSelectionAllChange" @column-change="columnChangeHandle">
7
+ <template v-for="columnx in columns_" :slot="columnx.prop + '_th'" slot-scope="{column,index}">
8
+ <slot :name="columnx.prop + '_th'" :column="column" :index="index"></slot>
9
+ </template>
10
+ </table-head>
11
+ </table>
12
+ </div>
13
+
14
+ <div v-if="Number(fixLeft) > 0 && type !== 'v'" ref="left" class="left">
15
+ <table ref="leftTable">
16
+ <table-head ref="leftHead" name="leftHead" :data="columns_.slice(0, Number(fixLeft))" @select-all="handleSelectionAllChange" @column-change="columnChangeHandle">
17
+ <template v-for="columnx in columns_" :slot="columnx.prop + '_th'" slot-scope="{column,index}">
18
+ <slot :name="columnx.prop + '_th'" :column="column" :index="index"></slot>
19
+ </template>
20
+ </table-head>
21
+ <table-body ref="leftBody" :data="iData" :column-data="columns_.slice(0, Number(fixLeft))">
22
+ <template v-for="columnx in flatColumns" :slot="columnx.prop" slot-scope="{row,column,index}">
23
+ <slot :name="columnx.prop" :row="row" :column="column" :index="index"></slot>
24
+ </template>
25
+ </table-body>
26
+ </table>
27
+ </div>
28
+
29
+ <div v-if="Number(fixTop) > 0 && Number(fixLeft) > 0 && type !== 'v'" ref="leftTop" class="leftTop">
30
+ <table>
31
+ <table-head ref="leftTopHead" :data="columns_.slice(0, Number(fixLeft))" @column-change="columnChangeHandle" @select-all="handleSelectionAllChange">
32
+ <template v-for="columnx in columns_" :slot="columnx.prop + '_th'" slot-scope="{column,index}">
33
+ <slot :name="columnx.prop + '_th'" :column="column" :index="index"></slot>
34
+ </template>
35
+ </table-head>
36
+ </table>
37
+ </div>
38
+ <div v-if="Number(fixRight) > 0 && type !== 'v'" ref="right" class="right">
39
+ <table ref="rightTable">
40
+ <table-head ref="rightHead" :data="columns_.slice(columns_.length - Number(fixRight), columns_.length)" :configurable="configurable && !(Number(fixTop) > 0)" @column-change="columnChangeHandle" @select-all="handleSelectionAllChange">
41
+ <template v-for="columnx in columns_" :slot="columnx.prop + '_th'" slot-scope="{column,index}">
42
+ <slot :name="columnx.prop + '_th'" :column="column" :index="index"></slot>
43
+ </template>
44
+ </table-head>
45
+ <table-body ref="rightBody" :data="iData" :column-data="columns_.slice(columns_.length - Number(fixRight), columns_.length)">
46
+ <template v-for="columnx in flatColumns" :slot="columnx.prop" slot-scope="{row,column,index}">
47
+ <slot :name="columnx.prop" :row="row" :column="column" :index="index"></slot>
48
+ </template>
49
+ </table-body>
50
+ </table>
51
+ </div>
52
+ <div v-if="Number(fixTop) > 0 && Number(fixRight) > 0 && type !== 'v'" ref="rightTop" class="rightTop">
53
+ <table>
54
+ <table-head ref="rightTopHead" :data="columns_.slice(columns_.length - Number(fixRight), columns_.length)" :configurable="configurable" @column-change="columnChangeHandle" @select-all="handleSelectionAllChange">
55
+ <template v-for="columnx in columns_" :slot="columnx.prop + '_th'" slot-scope="{column,index}">
56
+ <slot :name="columnx.prop + '_th'" :column="column" :index="index"></slot>
57
+ </template>
58
+ </table-head>
59
+ </table>
60
+ </div>
61
+ <div ref="body" class="body" @scroll="scrollHandle">
62
+ <table ref="table">
63
+ <colgroup>
64
+ <col v-for="(item, index) in columns_" :key="index" :style="columnStyle(item)" />
65
+ </colgroup>
66
+ <table-head ref="thead" name="body" :data="columns_" :configurable="configurable && (!Number(fixTop) > 0) && (!Number(fixRight) > 0)" @select-all="handleSelectionAllChange" @column-change="columnChangeHandle">
67
+ <template v-for="columnx in columns_" :slot="columnx.prop + '_th'" slot-scope="{column,index}">
68
+ <slot :name="columnx.prop + '_th'" :column="column" :index="index"></slot>
69
+ </template>
70
+ </table-head>
71
+ <table-body ref="tbody" :data="iData" :column-data="columns_">
72
+ <template slot="toTitle" slot-scope="{row,index}">
73
+ <slot name="toTitle" :row="row" :index="index"></slot>
74
+ </template>
75
+ <template v-for="columnx in flatColumns" :slot="columnx.prop" slot-scope="{row,column,index}">
76
+ <slot :name="columnx.prop" :row="row" :column="column" :index="index"></slot>
77
+ </template>
78
+ </table-body>
79
+ </table>
80
+ </div>
81
+ <to-msg v-if="nodata && !loading" :style="setMsgTopStyle" :pic="emptyPic" position="full" :title="emptyText || emptyTitle" :content="emptyContent" show></to-msg>
82
+ <to-msg v-if="loading" :style="setMsgTopStyle" pic="loading" position="full" show></to-msg>
83
+ </template>
84
+ <!-- 兼容旧版本 heads 配置 或 slot配置 -->
85
+ <template v-else>
86
+ <div class="body">
87
+ <table ref="table">
88
+ <thead ref="thead">
89
+ <tr>
90
+ <th v-for="(item, index) in iHeads" :key="index">{{ item }}</th>
91
+ </tr>
92
+ </thead>
93
+ <tbody ref="tbody" @click="handleTableClick">
94
+ <slot></slot>
95
+ </tbody>
96
+ </table>
97
+ </div>
98
+ <to-msg v-if="nodata && !loading" position="full" :title="emptyText || emptyTitle" :content="emptyContent" show></to-msg>
99
+ <to-msg v-if="loading" pic="loading" position="full" show></to-msg>
100
+ </template>
101
+ <to-float ref="action" :width="$phone?'full':actionLayerWidth" :slide="$phone" position="bottom" class="to-table-actionLayer" @click.native="$refs.action.close()">
102
+ <div class="to-table-actionLayerWrapper">
103
+ <slot v-if="current && contextAction" name="action" :row="current" :index="currentIndex"></slot>
104
+ <template v-if="contextSelection !== null">
105
+ <to-button v-if="!contextSelection" mode="text" @click="startBatch">多选</to-button>
106
+ <to-button v-else mode="text" @click="$emit('update:contextSelection',false); $refs.action.close();">取消多选</to-button>
107
+ </template>
108
+ </div>
109
+ </to-float>
110
+ <to-float ref="detail" slide :position="$phone?'bottom':'right'" :width="$phone?'full':'31.25'" class="to-table-detail">
111
+ <to-padding v-if="current" :value="1.5">
112
+ <to-grid :space="1.5">
113
+ <to-grid-item v-if="columns_.some(column => column.type === 'icon')" side>
114
+ <slot :detail="true" :name="columns_.find(column => column.type === 'icon').prop" :row="current" :index="currentIndex">
115
+ <to-icon v-size="iconSize" :value="current[columns_.find(column => column.type === 'icon').prop] || icon" v-bind="iconProps"></to-icon>
116
+ </slot>
117
+ </to-grid-item>
118
+ <to-grid-item>
119
+ <to-card padding="0">
120
+ <to-card-item main align="center">
121
+ <template v-if="columns_.some(column => column.type === 'key')" slot="title">
122
+ <slot :detail="true" :name="columns_.find(column => column.type === 'key').prop" :row="current" :index="currentIndex">
123
+ {{ current[columns_.find(column => column.type === 'key').prop] }}
124
+ </slot>
125
+ </template>
126
+ <template v-if="columns_.some(column => column.type === 'desc')" slot="content">
127
+ <slot :detail="true" :name="columns_.find(column => column.type === 'desc').prop" :row="current" :index="currentIndex">
128
+ {{ current[columns_.find(column => column.type === 'desc').prop] }}
129
+ </slot>
130
+ </template>
131
+ </to-card-item>
132
+ <to-card-item v-if="columns_.some(column => column.type === 'state')">
133
+ <slot :detail="true" :name="columns_.find(column => column.type === 'state').prop" :row="current" :index="currentIndex">
134
+ <to-tag mode="plain" color="primary" fillet="pill">
135
+ {{ current[columns_.find(column => column.type === 'state').prop] }}
136
+ </to-tag>
137
+ </slot>
138
+ </to-card-item>
139
+ </to-card>
140
+ <to-space v-if="hasKey"></to-space>
141
+ <to-param>
142
+ <template v-for="(column, index) in columns_">
143
+ <li v-if="(!['key', 'desc', 'icon', 'state', 'selection', 'radio', 'action'].includes(column.type) && column.show !== false) || column.detail" :key="index">
144
+ <div class="label">{{ column.label }}</div>
145
+ <div class="value">
146
+ <slot :detail="true" :name="column.prop" :row="current" :index="currentIndex">
147
+ {{ current[column.prop] }}
148
+ </slot>
149
+ </div>
150
+ </li>
151
+ </template>
152
+ </to-param>
153
+ </to-grid-item>
154
+ </to-grid>
155
+ </to-padding>
156
+ </to-float>
157
+ <template v-if="!hasAction && configurable">
158
+ <table-config :data="columns" @change="columnChangeHandle"></table-config>
159
+ </template>
160
+ </div>
161
+ </template>
162
+ <script>
163
+ import { getEventPath, getDataSet } from '../../../src/utils/dom.js'
164
+ import tableHead from './table-head'
165
+ import tableBody from './table-body'
166
+ import tableConfig from './table-config'
167
+ import { unique } from '../../../src/utils/array.js'
168
+ import { t } from 'ai.touchui-vue/src/locale';
169
+ function db(fn, wait = 50) {
170
+ // 通过闭包缓存一个定时器 id
171
+ let timer = null
172
+ // 将 debounce 处理结果当作函数返回
173
+ // 触发事件回调时执行这个返回函数
174
+ return function(...args) {
175
+ // 如果已经设定过定时器就清空上一次的定时器
176
+ if (timer) clearTimeout(timer)
177
+ // 开始设定一个新的定时器,定时器结束后执行传入的函数 fn
178
+ timer = setTimeout(() => {
179
+ fn.apply(this, args)
180
+
181
+ clearTimeout(timer)
182
+ timer = null
183
+ }, wait)
184
+ }
185
+ }
186
+ export default {
187
+ name: 'ToTable',
188
+ componentName: 'ToTable',
189
+ components: {
190
+ tableHead,
191
+ tableBody,
192
+ tableConfig
193
+ },
194
+ provide() {
195
+ return {
196
+ ToTable: this
197
+ };
198
+ },
199
+ props: {
200
+ // 固定列时同步 tr 的高度
201
+ syncHeight: Boolean,
202
+ loading: Boolean,
203
+ autoDetail: Boolean,
204
+ // 数据
205
+ data: {
206
+ type: Array,
207
+ default() {
208
+ return [];
209
+ }
210
+ },
211
+ // 高度
212
+ height: {
213
+ type: [Number, String],
214
+ default: ''
215
+ },
216
+ // 分割线位置
217
+ linePosition: {
218
+ type: String,
219
+ default: ''
220
+ },
221
+ // table列配置
222
+ columns: {
223
+ type: Array,
224
+ default: () => []
225
+ },
226
+ // 序号列的名称
227
+ indexColumnName: {
228
+ type: String,
229
+ default: () => t('to.common.index')
230
+ },
231
+ // table 无数据时显示文字
232
+ emptyText: {
233
+ type: String,
234
+ default: () => t('to.common.noData')
235
+ },
236
+ emptyTitle: {
237
+ type: String,
238
+ default: ''
239
+ },
240
+ emptyContent: {
241
+ type: String,
242
+ default: ''
243
+ },
244
+ emptyPic: {
245
+ type: String,
246
+ default: 'empty'
247
+ },
248
+ // 是否要高亮当前行 false
249
+ highlightCurrentRow: Boolean,
250
+ // 可选设定
251
+ selectable: Boolean,
252
+ rowSelectable: Boolean,
253
+ cellSelectable: Boolean,
254
+ remember: Boolean,
255
+ // 特殊行设置
256
+ even: Boolean,
257
+ // 排序方法
258
+ sortFunction: {
259
+ type: Function,
260
+ default: null
261
+ },
262
+ heads: {
263
+ type: String,
264
+ default: ''
265
+ },
266
+ // 固定表头/表列设置
267
+ fixLeft: {
268
+ type: [Number, String],
269
+ default: 0
270
+ },
271
+ fixRight: {
272
+ type: [Number, String],
273
+ default: 0
274
+ },
275
+ fixTop: {
276
+ type: [Number, String],
277
+ default: 0
278
+ },
279
+ // 外观设置
280
+ border: {
281
+ type: Boolean,
282
+ default: true
283
+ },
284
+ type: {
285
+ type: String,
286
+ default: ''
287
+ },
288
+ showColumns: {
289
+ type: [Number, String],
290
+ default: ''
291
+ },
292
+ space: {
293
+ type: [Number, String],
294
+ default: 0
295
+ },
296
+ itemFillet: {
297
+ type: String,
298
+ default: 'none'
299
+ },
300
+ icon: {
301
+ type: String,
302
+ default: ''
303
+ },
304
+ iconSize: {
305
+ type: [String, Number],
306
+ default: 2
307
+ },
308
+ iconProps: {
309
+ type: Object,
310
+ default() {
311
+ return {
312
+ mode: 'plain',
313
+ color: 'primary',
314
+ fillet: 'round'
315
+ }
316
+ }
317
+ },
318
+ contextSelection: {
319
+ type: Boolean,
320
+ default() {
321
+ return null
322
+ }
323
+ },
324
+ contextAction: Boolean,
325
+ configurable: Boolean,
326
+ actionLayerWidth: {
327
+ type: [Number, String],
328
+ default() {
329
+ return 10
330
+ }
331
+ },
332
+ isNeedSelectAll: { // 是否需要表头的全选按钮
333
+ type: Boolean,
334
+ default: true
335
+ },
336
+ expand: Boolean,
337
+ clearable: Boolean,
338
+ msgTop: {
339
+ type: [Number, String],
340
+ default: function _default() {
341
+ return this.height && !this.fixTop ? '0r' : '1r'
342
+ }
343
+ }
344
+ },
345
+ data() {
346
+ return {
347
+ current: null,
348
+ currentIndex: 0,
349
+ random: Math.floor(Math.random() * 100000000),
350
+ checkedRadio: '',
351
+ checkedRadioCache: '',
352
+ checkedCache: [],
353
+ preventAdjust: false,
354
+ nodata: false,
355
+ notfull: false,
356
+ observer: null,
357
+ initData: [],
358
+ lastSelectedRow: null,
359
+ isSelectAll: false,
360
+ changeType: 'default',
361
+ changeIDataType: 'default',
362
+ radioValue: '',
363
+ iData: [],
364
+ iHeads: [],
365
+ fixed: false,
366
+ isStartLongtap: false,
367
+ longtapTimer: null,
368
+ stopClick: false
369
+ };
370
+ },
371
+ computed: {
372
+
373
+ hasAction() {
374
+ return this.columns.some(column => column.type === 'action')
375
+ },
376
+
377
+ // 普通列
378
+ normalColumn() {
379
+ if (this.type === 'v') {
380
+ return this.columns_.filter(column => !['key', 'desc', 'icon', 'state', 'selection', 'radio', 'action'].includes(column.type))
381
+ } else {
382
+ return this.columns_.filter(column => !['icon', 'selection', 'radio'].includes(column.type))
383
+ }
384
+ },
385
+
386
+ // 自动支持显示详情
387
+ // 当默认显示的普通列数小于全部的列数时可点击当前行弹出全部列数信息作为详情
388
+ autoShowDetail() {
389
+ if (this.showColumns && this.autoDetail) {
390
+ if (!isNaN(this.showColumns)) {
391
+ if (this.showColumns < this.normalColumn.length) {
392
+ return true
393
+ } else {
394
+ return false
395
+ }
396
+ } else {
397
+ if (this.showColumns.split(',').length < this.normalColumn.length) {
398
+ return true
399
+ } else {
400
+ return false
401
+ }
402
+ }
403
+ } else {
404
+ return false
405
+ }
406
+ },
407
+
408
+ // 支持长按显示 action
409
+ longTapAction() {
410
+ if (this.contextAction || (this.contextSelection !== null && this.type === 'v')) {
411
+ let flag = false
412
+ this.columns.map(item => {
413
+ if (item.type === 'action') {
414
+ flag = true
415
+ }
416
+ })
417
+ return flag
418
+ } else {
419
+ return false
420
+ }
421
+ },
422
+ hasKey() {
423
+ let flag = false
424
+ this.columns.map(item => {
425
+ if (item.type === 'key') {
426
+ flag = true
427
+ }
428
+ })
429
+ return flag
430
+ },
431
+ hasRadio() {
432
+ let flag = false
433
+ this.columns.map(item => {
434
+ if (item.type === 'radio') {
435
+ flag = true
436
+ }
437
+ })
438
+ return flag
439
+ },
440
+ hasSelection() {
441
+ let flag = false
442
+ this.columns.map(item => {
443
+ if (item.type === 'selection') {
444
+ flag = true
445
+ }
446
+ })
447
+ return flag
448
+ },
449
+ checked() {
450
+ let arr = []
451
+ this.iData.map(item => {
452
+ if (item._checked) {
453
+ const obj = JSON.parse(JSON.stringify(item))
454
+ delete obj._index
455
+ delete obj._checked
456
+ delete obj._level
457
+ delete obj._show
458
+ delete obj._hover
459
+ delete obj._active
460
+ arr.push(obj)
461
+ }
462
+ })
463
+ if (this.remember) {
464
+ return unique(arr.concat(this.checkedCache))
465
+ } else {
466
+ return arr
467
+ }
468
+ },
469
+ // 是否是按行设置的高度
470
+ isRowHeight() {
471
+ return String(this.height).charAt(this.height.length - 1) === 'r'
472
+ },
473
+ // msg是否是按行设置的高度
474
+ isMsgTopRowHeight() {
475
+ return String(this.msgTop).charAt(this.msgTop.length - 1) === 'r'
476
+ },
477
+ columns_() {
478
+ let columns = this.columns
479
+ for (let i = 0; i < columns.length; i++) {
480
+ const el = columns[i]
481
+ if (['action', 'selection', 'radio', 'index'].includes(el.type)) {
482
+ continue
483
+ } else {
484
+ el._isFirst = true
485
+ break
486
+ }
487
+ }
488
+ return columns
489
+ },
490
+ flatColumns() {
491
+
492
+ // 打平多级 columns 数组,用于 slot 遍历
493
+ let arr = []
494
+ function setArr(data) {
495
+ data.map(column => {
496
+ let tempColumn = JSON.parse(JSON.stringify(column))
497
+ if (tempColumn.children) {
498
+ delete tempColumn.children
499
+ }
500
+ arr.push(tempColumn)
501
+ if (column.children) {
502
+ setArr(column.children)
503
+ }
504
+ })
505
+ }
506
+ setArr(this.columns)
507
+ return arr
508
+ },
509
+ setClass() {
510
+ let arr = [];
511
+ if (this.border) {
512
+ arr.push('to-table-border');
513
+ }
514
+ if (this.even) {
515
+ arr.push('to-table-even');
516
+ }
517
+ if (this.type) {
518
+ arr.push('to-table-type-' + this.type);
519
+ }
520
+ if (this.nodata) {
521
+ arr.push('to-table-nodata');
522
+ }
523
+ if (this.linePosition) {
524
+ arr.push('to-table-line-position-' + this.linePosition);
525
+ }
526
+ if (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction) {
527
+ arr.push('to-table-row-selectable');
528
+ }
529
+ if (this.height && this.isRowHeight) {
530
+ arr.push(`to-table-height-${this.height}`)
531
+ }
532
+ if (this.notfull) {
533
+ arr.push('to-table-notfull')
534
+ }
535
+ if (this.height && this.height === 'full') {
536
+ arr.push('to-table-height-full')
537
+ }
538
+ if (this.fixed) {
539
+ arr.push('to-table-fixed')
540
+ }
541
+ if (this.msgTop && this.isMsgTopRowHeight) {
542
+ arr.push(`to-table-msg-top-${this.msgTop}`)
543
+ }
544
+ if (this.itemFillet) {
545
+ arr.push(`to-table-item-fillet-${this.itemFillet}`)
546
+ }
547
+ return arr;
548
+ },
549
+ setStyle() {
550
+ let obj = {}
551
+ if (this.height && !this.isRowHeight) {
552
+ if (this.height !== 'full' || this.height === 0) {
553
+ obj.height = this.height + 'em'
554
+ }
555
+ }
556
+ return obj
557
+ },
558
+ setMsgTopStyle() {
559
+ let obj = {}
560
+ if (this.msgTop && !this.isMsgTopRowHeight) {
561
+ obj.top = this.msgTop + 'em'
562
+ }
563
+ return obj
564
+ }
565
+ },
566
+ watch: {
567
+ contextSelection(val) {
568
+ if (!val) {
569
+ this.iData.map(item => {
570
+ item._checked = false
571
+ })
572
+ this.checkedCache = []
573
+ }
574
+ },
575
+ loading: {
576
+ handler() {
577
+ if (this.$refs.loading) {
578
+ if (this.loading) {
579
+ this.$refs.loading.open()
580
+ } else {
581
+ this.$refs.loading.close()
582
+ }
583
+ }
584
+ },
585
+ immediate: true
586
+ },
587
+ heads: {
588
+ handler(heads) {
589
+ heads && (this.iHeads = heads.split(','))
590
+ },
591
+ immediate: true
592
+ },
593
+ iData: {
594
+ handler() {
595
+ if (this.changeIDataType === 'default') {
596
+ this.changeType = 'update'
597
+ this.formatData(this.iData)
598
+ this.$emit('update:data', this.iData)
599
+ this.$nextTick(()=>{
600
+ this.changeType = 'default'
601
+ })
602
+ }
603
+ },
604
+ deep: true
605
+ },
606
+ data: {
607
+ handler(data = []) {
608
+ if (this.changeType === 'default') {
609
+ if (this.remember) {
610
+
611
+ // 页面切换 idata 变化之前记住勾选了哪些
612
+ if (this.hasRadio) {
613
+ if (this.checkedRadio) {
614
+ let obj = JSON.parse(JSON.stringify(this.iData[Number(this.checkedRadio)]))
615
+ delete obj._index
616
+ delete obj._checked
617
+ delete obj._level
618
+ delete obj._show
619
+ delete obj._hover
620
+ delete obj._active
621
+ this.checkedRadioCache = JSON.stringify(obj)
622
+ }
623
+ } else if (this.hasSelection) {
624
+ this.iData.map(item => {
625
+ if (item._checked) {
626
+ delete item._index
627
+ delete item._checked
628
+ delete item._level
629
+ delete item._show
630
+ delete item._hover
631
+ delete item._active
632
+ this.checkedCache.push(JSON.parse(JSON.stringify(item)))
633
+ }
634
+ })
635
+ this.checkedCache = unique(this.checkedCache)
636
+ }
637
+
638
+ // 页面切换 idata 变化之后
639
+ this.$nextTick(()=>{
640
+
641
+ // 单选
642
+ this.formatData(data)
643
+ if (this.hasRadio) {
644
+ this.checkedRadio = ''
645
+ this.iData.map((data, index)=> {
646
+ let _data = JSON.parse(JSON.stringify(data))
647
+ delete _data._checked
648
+ delete _data._hover
649
+ delete _data._active
650
+ delete _data._on
651
+ if (this.checkedRadioCache === JSON.stringify(_data)) {
652
+ this.iData[index]._checked = true
653
+ this.checkedRadio = String(index)
654
+ }
655
+ })
656
+ } else if (this.hasSelection) {
657
+ this.checked.map((item)=>{
658
+ this.iData.map((data, index)=> {
659
+ let _item = JSON.parse(JSON.stringify(item))
660
+ let _data = JSON.parse(JSON.stringify(data))
661
+ delete _item._index
662
+ delete _item._checked
663
+ delete _item._level
664
+ delete _item._show
665
+ delete _item._hover
666
+ delete _item._active
667
+ delete _data._index
668
+ delete _data._checked
669
+ delete _data._level
670
+ delete _data._show
671
+ delete _data._hover
672
+ delete _data._active
673
+ if (JSON.stringify(_item) === JSON.stringify(_data)) {
674
+ this.iData[index]._checked = true
675
+ }
676
+ })
677
+ })
678
+ }
679
+ this.setSelectAll()
680
+ this.adjust()
681
+ })
682
+
683
+ } else {
684
+ this.checkedRadio = ''
685
+ this.formatData(data)
686
+ this.setSelectAll()
687
+ this.adjust()
688
+ }
689
+ this.$nextTick(()=>{
690
+ if (this.hasRadio) {
691
+ this.iData.map((item, index) => {
692
+ if (item._checked) {
693
+ this.checkedRadio = String(index)
694
+ }
695
+ })
696
+ }
697
+ })
698
+ } else {
699
+ this.formatData(data)
700
+ this.setSelectAll()
701
+ this.adjust()
702
+ }
703
+ },
704
+ immediate: true,
705
+ deep: true
706
+ }
707
+ },
708
+ mounted() {
709
+ this.init()
710
+ },
711
+ activated() {
712
+ this.init()
713
+ },
714
+ deactivated() {
715
+ this.destroy()
716
+ },
717
+ beforeDestroy() {
718
+ this.destroy()
719
+ },
720
+ methods: {
721
+ init() {
722
+ if (this.$refs && this.$refs.tbody) {
723
+ // 监听 slot 中的 DOM 变化
724
+ let tbody = this.$refs.tbody.$el || this.$refs.tbody
725
+ const observer = new MutationObserver(this.adjust)
726
+ observer.observe(tbody, {
727
+ childList: true,
728
+ subtree: true
729
+ })
730
+ this.observer = observer
731
+ }
732
+ window.addEventListener('resize', this.dbSetFix)
733
+ window.addEventListener('touchend', this.restoreClick)
734
+ },
735
+ destroy() {
736
+ // 停止监听 slot 中的 DOM 变化
737
+ if (this.heads && this.$refs.tbody) {
738
+ this.observer.disconnect()
739
+ }
740
+ window.removeEventListener('resize', this.dbSetFix)
741
+ window.removeEventListener('touchend', this.restoreClick)
742
+ },
743
+ startBatch() {
744
+ this.$emit('update:contextSelection', true)
745
+ this.current._checked = true
746
+ this.$refs.action.close()
747
+ },
748
+ restoreClick() {
749
+ setTimeout(() => {
750
+ this.stopClick = false
751
+ }, 300);
752
+ },
753
+ hasVScroll() {
754
+ return this.$refs.table.offsetHeight > this.$el.offsetHeight
755
+ },
756
+ hasHScroll() {
757
+ return this.$refs.table.offsetWidth > this.$el.offsetWidth
758
+ },
759
+ getBarWidth() {
760
+ var scrollTester = document.createElement('div')
761
+ scrollTester.id = 'scrollTester'
762
+ scrollTester.style.width = '200px'
763
+ scrollTester.style.height = '200px'
764
+ scrollTester.style.position = 'absolute'
765
+ scrollTester.style.visibility = 'hidden'
766
+ scrollTester.style.overflow = 'scroll'
767
+ document.body.appendChild(scrollTester)
768
+ var barWidth = document.getElementById('scrollTester').offsetWidth - document.getElementById('scrollTester').scrollWidth;
769
+ document.body.removeChild(scrollTester)
770
+ scrollTester = null;
771
+ return barWidth
772
+ },
773
+ adjust() {
774
+ (db(()=>{
775
+ this.setBottomLine()
776
+ this.setNodata()
777
+ this.setFix()
778
+ }, 200))()
779
+ },
780
+ dbSetFix() {
781
+ (db(()=>{
782
+ this.setFix()
783
+ }, 200))()
784
+ },
785
+ setFix() {
786
+ if (this.type === 'v') {
787
+ return
788
+ }
789
+ setTimeout(() => {
790
+ this.setFixDiv()
791
+ this.syncThWidth()
792
+ this.syncTrHeight()
793
+ }, 200);
794
+ },
795
+ syncTrHeight() {
796
+ if (this.type === 'v' || !this.syncHeight) { return }
797
+ if (this.$refs.tbody && this.$refs.tbody.$el.children.length) {
798
+ for (let i = 0; i < this.$refs.tbody.$el.children.length; i++) {
799
+ const tr = this.$refs.tbody.$el.children[i];
800
+ if (Number(this.fixRight) > 0 && this.$refs.rightBody) {
801
+ this.$refs.rightBody.$el.children[i].style.height = tr.getBoundingClientRect().height + 'px'
802
+ }
803
+ if (Number(this.fixLeft) > 0 && this.$refs.leftBody) {
804
+ this.$refs.leftBody.$el.children[i].style.height = tr.getBoundingClientRect().height + 'px'
805
+ }
806
+ }
807
+ }
808
+ },
809
+ syncThWidth() {
810
+ if (this.columns.length > 0) {
811
+ if (!(this.$refs && this.$refs.thead && this.$refs.thead.$refs && this.$refs.thead.$refs.row)) {
812
+ return
813
+ }
814
+ const trs = this.$refs.thead.$refs.row.children
815
+ if (Number(this.fixTop) > 0 && this.$refs.topHead) {
816
+ const topTrs = this.$refs.topHead.$refs.row.children
817
+ for (let i = 0; i < topTrs.length; i++) {
818
+ const ths = trs[i].children
819
+ const topThs = topTrs[i].children
820
+ for (let j = 0; j < ths.length; j++) {
821
+ const th = ths[j];
822
+ const topTh = topThs[j];
823
+ topTh.style.width = th.getBoundingClientRect().width + 'px'
824
+ }
825
+ }
826
+ }
827
+ if (Number(this.fixRight) > 0 && this.$refs.rightHead) {
828
+ const rightTrs = this.$refs.rightHead.$refs.row.children
829
+ for (let i = 0; i < rightTrs.length; i++) {
830
+ const ths = trs[i].children
831
+ const rightThs = rightTrs[i].children
832
+ if (rightThs.length > 0) {
833
+ for (let j = ths.length - rightThs.length; j < ths.length; j++) {
834
+ const th = ths[j]
835
+ const rightTh = rightThs[j - ths.length + rightThs.length]
836
+ rightTh.style.width = th.getBoundingClientRect().width + 'px'
837
+ rightTh.style.height = th.getBoundingClientRect().height + 'px'
838
+ }
839
+ }
840
+ }
841
+ if (Number(this.fixTop) > 0 && this.$refs.rightTopHead) {
842
+ const rightTopTrs = this.$refs.rightTopHead.$refs.row.children
843
+ for (let i = 0; i < rightTopTrs.length; i++) {
844
+ const ths = trs[i].children
845
+ const rightTopThs = rightTopTrs[i].children
846
+ if (rightTopThs.length > 0) {
847
+ for (let i = ths.length - rightTopThs.length; i < ths.length; i++) {
848
+ const th = ths[i]
849
+ const rightTopTh = rightTopThs[i - ths.length + rightTopThs.length]
850
+ rightTopTh.style.width = th.getBoundingClientRect().width + 'px'
851
+ rightTopTh.style.height = th.getBoundingClientRect().height + 'px'
852
+ }
853
+ }
854
+ }
855
+ }
856
+ }
857
+ if (Number(this.fixLeft) > 0 && this.$refs.leftHead) {
858
+ const leftTrs = this.$refs.leftHead.$refs.row.children
859
+ for (let i = 0; i < leftTrs.length; i++) {
860
+ const ths = trs[i].children
861
+ const leftThs = leftTrs[i].children
862
+ if (leftThs.length > 0) {
863
+ for (let j = 0; j < leftThs.length; j++) {
864
+ const th = ths[j]
865
+ const leftTh = leftThs[i]
866
+ leftTh.style.width = th.getBoundingClientRect().width + 'px'
867
+ leftTh.style.height = th.getBoundingClientRect().height + 'px'
868
+ }
869
+ }
870
+ }
871
+ if (Number(this.fixTop) > 0 && this.$refs.leftTopHead) {
872
+ const leftTopTrs = this.$refs.leftTopHead.$refs.row.children
873
+ for (let i = 0; i < leftTopTrs.length; i++) {
874
+ const ths = trs[i].children
875
+ const leftTopThs = leftTopTrs[i].children
876
+ if (leftTopThs.length > 0) {
877
+ for (let i = 0; i < leftTopThs.length; i++) {
878
+ const th = ths[i]
879
+ const leftTopTh = leftTopThs[i]
880
+ leftTopTh.style.width = th.getBoundingClientRect().width + 'px'
881
+ leftTopTh.style.height = th.getBoundingClientRect().height + 'px'
882
+ }
883
+ }
884
+ }
885
+ }
886
+ }
887
+ }
888
+ },
889
+ setFixDiv() {
890
+ if (Number(this.fixTop) > 0 && this.$refs.top && this.$refs.topTable) {
891
+ if (this.hasVScroll()) {
892
+ this.$refs.top.style.width = this.$refs.body.offsetWidth - this.getBarWidth() + 'px'
893
+ }
894
+ this.$refs.topTable.style.width = this.$refs.table.offsetWidth + 'px'
895
+ this.$refs.table.style.width = this.$refs.table.offsetWidth + 'px'
896
+ }
897
+ if (Number(this.fixRight) > 0 && this.$refs.right && this.$el) {
898
+ if (this.hasHScroll()) {
899
+ this.$refs.right.style.height = this.$el.offsetHeight - this.getBarWidth() + 'px'
900
+ }
901
+ if (this.hasVScroll()) {
902
+ this.$refs.right.style.right = this.getBarWidth() + 'px'
903
+ if (Number(this.fixTop) > 0) {
904
+ this.$refs.rightTop.style.right = this.getBarWidth() + 'px'
905
+ }
906
+ }
907
+ }
908
+ if (Number(this.fixLeft) > 0 && this.$refs.left && this.$el) {
909
+ if (this.hasHScroll()) {
910
+ this.$refs.left.style.height = this.$el.offsetHeight - this.getBarWidth() + 'px'
911
+ }
912
+ }
913
+ },
914
+ setNodata() {
915
+ if (!this.$refs.tbody) return
916
+ let tbody = this.$refs.tbody.$el || this.$refs.tbody
917
+ if (tbody.children.length === 0) {
918
+ this.nodata = true
919
+ } else {
920
+ this.nodata = false
921
+ }
922
+ },
923
+ setBottomLine() {
924
+ if (this.height && this.$refs.table.offsetHeight < this.$el.offsetHeight - 3 && this.linePosition !== 'none' && this.linePosition !== 'v') {
925
+ this.notfull = true
926
+ } else {
927
+ this.notfull = false
928
+ }
929
+ },
930
+ formatData(data = []) {
931
+ this.changeIDataType = 'change'
932
+ let that = this
933
+ var dataTemp = JSON.parse(JSON.stringify(data))
934
+
935
+ // 初始化级别为 1
936
+ let level = 1
937
+
938
+ // 初始化一个数组,用于存储最后生成的 data
939
+ let arr = []
940
+
941
+ // 递归生成 data,计算出表格树每一行的 level,并标识其是否具有子对象
942
+ function setData(data) {
943
+ data.map((dataItem, dataIndex) => {
944
+ if (dataItem._index === undefined) {
945
+ that.$set(dataItem, '_index', dataItem._index || dataIndex + 1)
946
+ }
947
+ if (dataItem._checked === undefined) {
948
+ that.$set(dataItem, '_checked', dataItem._checked !== undefined ? dataItem._checked : false)
949
+ }
950
+ if (dataItem._level === undefined) {
951
+ that.$set(dataItem, '_level', level)
952
+ }
953
+ if (dataItem._show === undefined) {
954
+ if (level === 1 || that.expand) {
955
+ that.$set(dataItem, '_show', true)
956
+ } else {
957
+ that.$set(dataItem, '_show', false)
958
+ }
959
+ }
960
+ if (that.expand && dataItem._showChild === undefined) {
961
+ that.$set(dataItem, '_showChild', true)
962
+ }
963
+ arr.push(dataItem)
964
+ if (dataItem.children && (dataItem._hasChild === undefined || dataItem._hasChild === true)) {
965
+ that.$set(dataItem, '_hasChild', true)
966
+ level++
967
+ setData(dataItem.children)
968
+ }
969
+ delete dataItem.children
970
+ })
971
+ level--
972
+ }
973
+ setData(dataTemp)
974
+ this.iData = arr
975
+ setTimeout(() => {
976
+ this.changeIDataType = 'default'
977
+ }, 100);
978
+ },
979
+ // 设置全选或者不全选
980
+ toggleAllSelection(checked) {
981
+ this.iData.map(item => {
982
+ if (!item.disabled) {
983
+ this.$set(item, '_checked', checked)
984
+ }
985
+ })
986
+ },
987
+ // 全选中事件
988
+ handleSelectionAllChange(checked) {
989
+ this.isSelectAll = checked
990
+ this.toggleAllSelection(checked)
991
+ this.iData.map(item => {
992
+ if (!item._checked) {
993
+ this.removeFromCache(item)
994
+ }
995
+ })
996
+ this.$emit('change', this.checked, checked)
997
+ this.$emit('selectionChange', this.checked)
998
+ this.$emit('selection-change', this.checked)
999
+ },
1000
+ // 根据 checkbox 计算是否全选
1001
+ setSelectAll() {
1002
+ let isAll = true
1003
+ this.iData.map(item=>{
1004
+ if (!item._checked) {
1005
+ isAll = false
1006
+ }
1007
+ })
1008
+ this.isSelectAll = isAll
1009
+ },
1010
+ // 行勾选事件
1011
+ handleTableRowChecked(checked, dataIndex) {
1012
+ const current = this.iData[dataIndex]
1013
+ if (!checked) {
1014
+ this.removeFromCache(this.iData[dataIndex])
1015
+ }
1016
+ this.setSelectAll()
1017
+ this.$emit('change', this.checked, checked, current)
1018
+ this.$emit('selectionChange', this.checked, current)
1019
+ this.$emit('selection-change', this.checked, current)
1020
+ },
1021
+ // 从记录中移除
1022
+ removeFromCache(rowData) {
1023
+ for (let i = 0; i < this.checkedCache.length; i++) {
1024
+ let _item = JSON.parse(JSON.stringify(rowData))
1025
+ let _data = JSON.parse(JSON.stringify(this.checkedCache[i]))
1026
+ delete _item._index
1027
+ delete _item._checked
1028
+ delete _item._level
1029
+ delete _item._show
1030
+ delete _item._hover
1031
+ delete _item._active
1032
+ delete _data._index
1033
+ delete _data._checked
1034
+ delete _data._level
1035
+ delete _data._show
1036
+ delete _data._hover
1037
+ delete _data._active
1038
+ if (JSON.stringify(_item) === JSON.stringify(_data)) {
1039
+ this.checkedCache.splice(i, 1)
1040
+ i--
1041
+ }
1042
+ }
1043
+ },
1044
+ // 单选框点击
1045
+ handleTableRowRadio(current) {
1046
+ this.$emit('change', current, true)
1047
+ this.$emit('radioChange', current, true)
1048
+ this.$emit('radio-change', current, true)
1049
+ },
1050
+ // table 点击事件
1051
+ handleTableClick(event, eventPath) {
1052
+ if (this.stopClick) { return}
1053
+ if (this.rowSelectable || this.selectable || this.cellSelectable || this.autoShowDetail || this.longTapAction) {
1054
+ const composedPath = eventPath ? eventPath : getEventPath(event)
1055
+ for (let i = 0; i < composedPath.length; i++) {
1056
+ const dom = composedPath[i]
1057
+ if (String(dom.tagName).toLowerCase() === 'tr') {
1058
+
1059
+ this.lastSelectedRow = dom
1060
+ const rowIndex = Number(getDataSet(dom).index)
1061
+
1062
+ if (this.rowSelectable || this.selectable) {
1063
+
1064
+ // 行点击事件
1065
+ this.$emit('row-click', this.iData[rowIndex], rowIndex, event)
1066
+ if (this.highlightCurrentRow) {
1067
+ this.iData.map((item, index) => {
1068
+ if (index === rowIndex) {
1069
+ if (this.clearable) {
1070
+ if (item._on) {
1071
+ item._on = false
1072
+ } else {
1073
+ this.$set(item, '_on', true)
1074
+ }
1075
+ } else {
1076
+ this.$set(item, '_on', true)
1077
+ }
1078
+ } else {
1079
+ this.$set(item, '_on', false)
1080
+ }
1081
+ })
1082
+ }
1083
+
1084
+ // 多选联动
1085
+ if (this.hasSelection && !this.iData[rowIndex].disabled) {
1086
+ this.iData[rowIndex]._checked = !this.iData[rowIndex]._checked
1087
+ this.handleTableRowChecked(this.iData[rowIndex]._checked, rowIndex)
1088
+ }
1089
+
1090
+ // 单选联动
1091
+ if (this.hasRadio && !this.iData[rowIndex].disabled) {
1092
+ if (this.clickRadio(this.iData[rowIndex], rowIndex)) {
1093
+ this.selectRadio(rowIndex)
1094
+ }
1095
+ }
1096
+ }
1097
+
1098
+ if (this.autoShowDetail) {
1099
+ this.current = this.iData[rowIndex]
1100
+ this.currentIndex = rowIndex
1101
+ this.$refs.detail.open()
1102
+ }
1103
+
1104
+ } else if (String(dom.tagName).toLowerCase() === 'td' && (this.cellSelectable || this.selectable)) {
1105
+ // 单元格点击事件
1106
+ const cellIndex = getDataSet(dom).index || -1
1107
+ cellIndex > -1 && this.$emit('cell-click', this.iData[cellIndex], this.columns_, dom, event)
1108
+ }
1109
+ }
1110
+ }
1111
+ },
1112
+ // table 双击事件
1113
+ handleTableDblClick(event) {
1114
+ if (this.stopClick) { return}
1115
+ if (this.$listeners['row-dblclick'] || this.$listeners['cell-dblclick']) {
1116
+ const composedPath = getEventPath(event)
1117
+ for (let i = 0; i < composedPath.length; i++) {
1118
+ const dom = composedPath[i]
1119
+ if (String(dom.tagName).toLowerCase() === 'tr') {
1120
+ // 行点击事件
1121
+ this.lastSelectedRow = dom
1122
+ const rowIndex = Number(getDataSet(dom).index)
1123
+ this.$emit('row-dblclick', this.iData[rowIndex], this.columns_, event)
1124
+
1125
+ } else if (String(dom.tagName).toLowerCase() === 'td') {
1126
+ // 单元格点击事件
1127
+ const cellIndex = Number(getDataSet(dom).index) || -1
1128
+ cellIndex > -1 && this.$emit('cell-dblclick', this.iData[cellIndex], cellIndex, dom, event)
1129
+ }
1130
+ }
1131
+ }
1132
+ },
1133
+ // table鼠标悬移事件
1134
+ handleTableMouseover(event) {
1135
+ if (!this.$pc) return
1136
+ if (this.rowSelectable || this.selectable) {
1137
+ const composedPath = getEventPath(event)
1138
+ for (let i = 0; i < composedPath.length; i++) {
1139
+ const dom = composedPath[i]
1140
+ if (String(dom.tagName).toLowerCase() === 'tr' && (this.rowSelectable || this.selectable)) {
1141
+ this.lastSelectedRow = dom
1142
+ const rowIndex = Number(getDataSet(dom).index)
1143
+ this.iData.map((item, index) => {
1144
+ if (index === rowIndex) {
1145
+ this.$set(item, '_hover', true)
1146
+ }
1147
+ })
1148
+ }
1149
+ }
1150
+ }
1151
+ },
1152
+ // table鼠标悬移事件
1153
+ handleTableMouseout(event) {
1154
+ if (!this.$pc) return
1155
+ if (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction) {
1156
+ const composedPath = getEventPath(event)
1157
+ for (let i = 0; i < composedPath.length; i++) {
1158
+ const dom = composedPath[i]
1159
+ if (String(dom.tagName).toLowerCase() === 'tr' && (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction)) {
1160
+ this.lastSelectedRow = dom
1161
+ const rowIndex = Number(getDataSet(dom).index)
1162
+ this.changeIDataType = 'change'
1163
+ this.iData.map((item, index) => {
1164
+ if (index === rowIndex) {
1165
+ this.$set(item, '_hover', false)
1166
+ this.$set(item, '_active', false)
1167
+ }
1168
+ })
1169
+ this.$nextTick(()=>{
1170
+ this.changeIDataType = 'default'
1171
+ })
1172
+ }
1173
+ }
1174
+ }
1175
+ },
1176
+ // table鼠标按下事件
1177
+ handleTableMousedown(event) {
1178
+ if (((this.$pad || this.$phone) && event.type === 'touchstart') || (this.$pc && event.type === 'mousedown')) {
1179
+ if (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction) {
1180
+ const composedPath = getEventPath(event)
1181
+ for (let i = 0; i < composedPath.length; i++) {
1182
+ const dom = composedPath[i]
1183
+ if (String(dom.tagName).toLowerCase() === 'tr' && (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction)) {
1184
+ this.lastSelectedRow = dom
1185
+ const rowIndex = Number(getDataSet(dom).index)
1186
+ if (this.$phone) {
1187
+ this.isStartLongtap = true
1188
+ this.longtapTimer = setTimeout(() => {
1189
+ if (this.isStartLongtap) {
1190
+ event.preventDefault()
1191
+ this.$emit('contextmenu', this.iData[rowIndex], rowIndex, event)
1192
+ this.stopClick = true
1193
+
1194
+ this.changeIDataType = 'change'
1195
+ this.iData.map((item, index) => {
1196
+ if (index === rowIndex) {
1197
+ this.$set(item, '_active', false)
1198
+ }
1199
+ })
1200
+ this.$nextTick(()=>{
1201
+ this.changeIDataType = 'default'
1202
+ })
1203
+
1204
+ // 弹出功能列表
1205
+ if (this.type === 'v' && ((this.columns.some(item => item.type === 'action') && this.contextAction) || this.contextSelection !== null)) {
1206
+ this.current = this.iData[rowIndex]
1207
+ this.currentIndex = rowIndex
1208
+ this.$refs.action.open()
1209
+ }
1210
+ }
1211
+ this.isStartLongtap = false
1212
+ }, 300);
1213
+ }
1214
+ this.changeIDataType = 'change'
1215
+ if (this.rowSelectable || this.selectable || this.autoShowDetail) {
1216
+ this.iData.map((item, index) => {
1217
+ if (index === rowIndex) {
1218
+ this.$set(item, '_active', true)
1219
+ }
1220
+ })
1221
+ }
1222
+ this.$nextTick(()=>{
1223
+ this.changeIDataType = 'default'
1224
+ })
1225
+ }
1226
+ }
1227
+ }
1228
+ }
1229
+ },
1230
+ // table鼠标松开事件
1231
+ handleTableMouseup(event) {
1232
+ if (((this.$pad || this.$phone) && event.type === 'touchend') || (this.$pc && event.type === 'mouseup')) {
1233
+ if (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction) {
1234
+ const composedPath = getEventPath(event)
1235
+ for (let i = 0; i < composedPath.length; i++) {
1236
+ const dom = composedPath[i]
1237
+ if (String(dom.tagName).toLowerCase() === 'tr' && (this.rowSelectable || this.selectable || this.autoShowDetail || this.longTapAction)) {
1238
+ this.lastSelectedRow = dom
1239
+ const rowIndex = Number(getDataSet(dom).index)
1240
+ this.changeIDataType = 'change'
1241
+ this.iData.map((item, index) => {
1242
+ if (index === rowIndex) {
1243
+ this.$set(item, '_active', false)
1244
+ }
1245
+ })
1246
+ this.$nextTick(()=>{
1247
+ this.changeIDataType = 'default'
1248
+ })
1249
+ if (this.$phone) {
1250
+ this.isStartLongtap = false
1251
+ clearInterval(this.longtapTimer)
1252
+ }
1253
+ }
1254
+ }
1255
+ }
1256
+ }
1257
+ },
1258
+ // table鼠标移动事件
1259
+ handleTableMousemove(event) {
1260
+ this.isStartLongtap = false
1261
+ if (this.rowSelectable || this.selectable || this.autoShowDetail) {
1262
+ const composedPath = getEventPath(event)
1263
+ for (let i = 0; i < composedPath.length; i++) {
1264
+ const dom = composedPath[i]
1265
+ if (String(dom.tagName).toLowerCase() === 'tr' && (this.rowSelectable || this.selectable || this.autoShowDetail)) {
1266
+ this.lastSelectedRow = dom
1267
+ const rowIndex = Number(getDataSet(dom).index)
1268
+ this.changeIDataType = 'change'
1269
+ this.iData.map((item, index) => {
1270
+ if (index === rowIndex) {
1271
+ this.$set(item, '_active', false)
1272
+ }
1273
+ })
1274
+ this.$nextTick(()=>{
1275
+ this.changeIDataType = 'default'
1276
+ })
1277
+ }
1278
+ if (this.$phone) {
1279
+ this.isStartLongtap = false
1280
+ clearInterval(this.longtapTimer)
1281
+ }
1282
+ }
1283
+ }
1284
+ },
1285
+ // table右击事件
1286
+ handleTableRowRightClick(item, index, event) {
1287
+ if (this.$pc) {
1288
+ event.preventDefault()
1289
+ this.$emit('contextmenu', item, index, event)
1290
+ this.$emit('row-right-click', item, index, event)
1291
+ if (this.longTapAction) {
1292
+ this.current = item
1293
+ this.$refs.action.open(event)
1294
+ }
1295
+ }
1296
+ },
1297
+ handleTableHeadCellClick(item, index, event, propKey) {
1298
+ if (item.sortable) {
1299
+ this.handleSortClick(item, index);
1300
+ } else {
1301
+ this.$emit('head-cell-click', item, index, event);
1302
+ }
1303
+ },
1304
+ handleSortClick(item, index) {
1305
+ const orderType = item.orderType
1306
+ this.columns.map((column, columnIndex) => {
1307
+ if (columnIndex === index) {
1308
+ if (!orderType) {
1309
+ this.$set(column, 'orderType', 'asc')
1310
+ } else if (orderType === 'asc') {
1311
+ this.$set(column, 'orderType', 'desc')
1312
+ } else if (orderType === 'desc') {
1313
+ this.$set(column, 'orderType', '')
1314
+ }
1315
+ } else {
1316
+ if (column.sortable) {
1317
+ this.$set(column, 'orderType', '')
1318
+ }
1319
+ }
1320
+ })
1321
+ if (this.initData.length === 0) {
1322
+ this.initData = JSON.parse(JSON.stringify(this.data))
1323
+ }
1324
+ if (this.sortFunction) {
1325
+ this.sortFunction(index, item.orderType)
1326
+ } else {
1327
+ this.processOrder(index, item.orderType)
1328
+ }
1329
+ },
1330
+ processOrder(index, orderType) {
1331
+ let property = this.columns[index].prop
1332
+ if (orderType === '') {
1333
+ for (let i = 0; i < this.initData.length; i++) {
1334
+ this.$set(this.data, i, this.initData[i])
1335
+ }
1336
+ this.initData = []
1337
+ return
1338
+ }
1339
+ this.data.sort((a, b)=>{
1340
+ if (orderType === 'asc') {
1341
+ return String(a[property]).localeCompare(String(b[property]));
1342
+ } else if (orderType === 'desc') {
1343
+ return String(b[property]).localeCompare(String(a[property]));
1344
+ }
1345
+ })
1346
+ },
1347
+ scrollHandle() {
1348
+ var scrollLeft = this.$refs.body.scrollLeft;
1349
+ var scrollTop = this.$refs.body.scrollTop;
1350
+ if (typeof scrollLeft !== 'undefined') {
1351
+ if (this.fixTop && this.$refs.topTable) {
1352
+ this.$refs.topTable.style.left = 0 - scrollLeft + 'px';
1353
+ }
1354
+ if (this.fixRight && this.$refs.rightTable) {
1355
+ this.$refs.rightTable.style.top = 0 - scrollTop + 'px';
1356
+ }
1357
+ if (this.fixLeft && this.$refs.leftTable) {
1358
+ this.$refs.leftTable.style.top = 0 - scrollTop + 'px';
1359
+ }
1360
+ }
1361
+ },
1362
+ columnStyle(column) {
1363
+ var obj = {};
1364
+ if (column.width) {
1365
+ if (!isNaN(column.width)) {
1366
+ obj.width = column.width + 'em';
1367
+ } else {
1368
+ obj.width = column.width;
1369
+ }
1370
+ }
1371
+ return obj;
1372
+ },
1373
+ checkedRadioHandle(item, dataIndex) {
1374
+ if (this.clickRadio(item, dataIndex)) {
1375
+ this.selectRadio(dataIndex)
1376
+ }
1377
+ },
1378
+ clickRadio(item, dataIndex) {
1379
+ if (this.checkedRadio === String(dataIndex) && this.clearable) {
1380
+ this.checkedRadio = ''
1381
+ this.$set(item, '_checked', false)
1382
+ this.$emit('change', item, false)
1383
+ this.$emit('radioChange', item, false)
1384
+ this.$emit('radio-change', item, false)
1385
+ return false
1386
+ } else {
1387
+ return true
1388
+ }
1389
+ },
1390
+ selectRadio(rowIndex) {
1391
+ // 先将所有单选都设为 false ,再选中
1392
+ this.iData.forEach(item => {
1393
+ item._checked = false
1394
+ })
1395
+
1396
+ this.$set(this.iData[rowIndex], '_checked', true)
1397
+
1398
+ this.checkedRadio = String(rowIndex)
1399
+ if (this.remember) {
1400
+ let obj = JSON.parse(JSON.stringify(this.iData[rowIndex]))
1401
+ delete obj._on
1402
+ delete obj._active
1403
+ delete obj._hover
1404
+ delete obj._checked
1405
+ this.checkedRadioCache = JSON.stringify(obj)
1406
+ }
1407
+
1408
+ this.$emit('change', this.iData[rowIndex], true)
1409
+ this.$emit('radioChange', this.iData[rowIndex], true)
1410
+ this.$emit('radio-change', this.iData[rowIndex], true)
1411
+ },
1412
+ clear() {
1413
+ this.iData.map(item => {item._checked = false})
1414
+ if (this.remember) {
1415
+ this.checkedCache = []
1416
+ }
1417
+ if (this.hasRadio) {
1418
+ this.checkedRadio = ''
1419
+ this.$emit('change', {}, false)
1420
+ }
1421
+ },
1422
+ select(row) {
1423
+ let targetIndex = this.iData.findIndex(item =>
1424
+ Object.entries(row)
1425
+ .filter(([key]) => !key.startsWith('_')) // 过滤掉 "_" 开头的键
1426
+ .every(([key, value]) => item[key] === value) // 确保所有属性都匹配
1427
+ )
1428
+ let target = this.iData[targetIndex]
1429
+ if (this.hasSelection) {
1430
+ target._checked = true
1431
+ this.$emit('change', this.checked, true, target)
1432
+ }
1433
+ if (this.hasRadio) {
1434
+ this.selectRadio(targetIndex)
1435
+ }
1436
+ },
1437
+ unselect(row) {
1438
+ let target = this.iData.find(item =>
1439
+ Object.entries(row)
1440
+ .filter(([key]) => !key.startsWith('_')) // 过滤掉 "_" 开头的键
1441
+ .every(([key, value]) => item[key] === value) // 确保所有属性都匹配
1442
+ )
1443
+ if (this.hasSelection) {
1444
+ target._checked = false
1445
+ this.$emit('change', this.checked, false, target)
1446
+ }
1447
+ if (this.hasRadio) {
1448
+ if (target._checked) {
1449
+ this.clear()
1450
+ }
1451
+ }
1452
+ },
1453
+ columnChangeHandle(data) {
1454
+ this.$emit('update:columns', data)
1455
+ }
1456
+ }
1457
+ }
1458
+ </script>