ai.touchui-vue 1.30.2 → 1.30.4

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