ai.touchui-vue 1.31.0 → 1.31.1

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