misp-ui-library-test 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (373) hide show
  1. package/README.md +113 -0
  2. package/dist/theme-chalk/alert/index.scss +152 -0
  3. package/dist/theme-chalk/avatar/index.scss +51 -0
  4. package/dist/theme-chalk/backtop/index.scss +38 -0
  5. package/dist/theme-chalk/badge/index.scss +63 -0
  6. package/dist/theme-chalk/breadcrumb/index.scss +36 -0
  7. package/dist/theme-chalk/breadcrumb-item/index.scss +36 -0
  8. package/dist/theme-chalk/button/index.scss +157 -0
  9. package/dist/theme-chalk/card/index.scss +38 -0
  10. package/dist/theme-chalk/chart/index.scss +21 -0
  11. package/dist/theme-chalk/checkbox/index.scss +358 -0
  12. package/dist/theme-chalk/col/index.scss +131 -0
  13. package/dist/theme-chalk/container/index.scss +40 -0
  14. package/dist/theme-chalk/css/alert.css +484 -0
  15. package/dist/theme-chalk/css/avatar.css +409 -0
  16. package/dist/theme-chalk/css/backtop.css +401 -0
  17. package/dist/theme-chalk/css/badge.css +419 -0
  18. package/dist/theme-chalk/css/breadcrumb-item.css +395 -0
  19. package/dist/theme-chalk/css/breadcrumb.css +395 -0
  20. package/dist/theme-chalk/css/button.css +587 -0
  21. package/dist/theme-chalk/css/card.css +397 -0
  22. package/dist/theme-chalk/css/chart.css +386 -0
  23. package/dist/theme-chalk/css/checkbox.css +648 -0
  24. package/dist/theme-chalk/css/col.css +2111 -0
  25. package/dist/theme-chalk/css/container.css +404 -0
  26. package/dist/theme-chalk/css/dialog.css +505 -0
  27. package/dist/theme-chalk/css/divider.css +405 -0
  28. package/dist/theme-chalk/css/drawer.css +546 -0
  29. package/dist/theme-chalk/css/empty.css +394 -0
  30. package/dist/theme-chalk/css/form.css +561 -0
  31. package/dist/theme-chalk/css/icon.css +1534 -0
  32. package/dist/theme-chalk/css/image.css +400 -0
  33. package/dist/theme-chalk/css/input-number.css +424 -0
  34. package/dist/theme-chalk/css/input.css +721 -0
  35. package/dist/theme-chalk/css/link.css +424 -0
  36. package/dist/theme-chalk/css/loading.css +483 -0
  37. package/dist/theme-chalk/css/message-box.css +479 -0
  38. package/dist/theme-chalk/css/message.css +456 -0
  39. package/dist/theme-chalk/css/no-data.css +397 -0
  40. package/dist/theme-chalk/css/notification.css +431 -0
  41. package/dist/theme-chalk/css/page-header.css +396 -0
  42. package/dist/theme-chalk/css/pagination.css +565 -0
  43. package/dist/theme-chalk/css/popover.css +421 -0
  44. package/dist/theme-chalk/css/popper.css +454 -0
  45. package/dist/theme-chalk/css/progress.css +451 -0
  46. package/dist/theme-chalk/css/radio.css +626 -0
  47. package/dist/theme-chalk/css/rate.css +414 -0
  48. package/dist/theme-chalk/css/result.css +403 -0
  49. package/dist/theme-chalk/css/row.css +433 -0
  50. package/dist/theme-chalk/css/scrollbar.css +422 -0
  51. package/dist/theme-chalk/css/select.css +1897 -0
  52. package/dist/theme-chalk/css/skeleton-item.css +407 -0
  53. package/dist/theme-chalk/css/skeleton.css +390 -0
  54. package/dist/theme-chalk/css/slider.css +460 -0
  55. package/dist/theme-chalk/css/spinner.css +403 -0
  56. package/dist/theme-chalk/css/statistic.css +396 -0
  57. package/dist/theme-chalk/css/status-timeline-chart.css +388 -0
  58. package/dist/theme-chalk/css/step.css +496 -0
  59. package/dist/theme-chalk/css/steps.css +496 -0
  60. package/dist/theme-chalk/css/switch.css +507 -0
  61. package/dist/theme-chalk/css/tab-pane.css +457 -0
  62. package/dist/theme-chalk/css/table.css +461 -0
  63. package/dist/theme-chalk/css/tabs-navigation.css +925 -0
  64. package/dist/theme-chalk/css/tabs.css +457 -0
  65. package/dist/theme-chalk/css/tag.css +599 -0
  66. package/dist/theme-chalk/css/time-picker.css +683 -0
  67. package/dist/theme-chalk/css/timeline-item.css +459 -0
  68. package/dist/theme-chalk/css/timeline.css +459 -0
  69. package/dist/theme-chalk/css/tooltip.css +485 -0
  70. package/dist/theme-chalk/css/tree.css +473 -0
  71. package/dist/theme-chalk/css/upload.css +665 -0
  72. package/dist/theme-chalk/dialog/index.scss +168 -0
  73. package/dist/theme-chalk/divider/index.scss +46 -0
  74. package/dist/theme-chalk/drawer/index.scss +172 -0
  75. package/dist/theme-chalk/empty/index.scss +36 -0
  76. package/dist/theme-chalk/fonts/element-icons.ttf +0 -0
  77. package/dist/theme-chalk/fonts/element-icons.woff +0 -0
  78. package/dist/theme-chalk/form/index.scss +220 -0
  79. package/dist/theme-chalk/icon/index.scss +1171 -0
  80. package/dist/theme-chalk/image/index.scss +39 -0
  81. package/dist/theme-chalk/index.scss +127 -0
  82. package/dist/theme-chalk/input/index.scss +363 -0
  83. package/dist/theme-chalk/input-number/index.scss +71 -0
  84. package/dist/theme-chalk/link/index.scss +75 -0
  85. package/dist/theme-chalk/loading/index.scss +131 -0
  86. package/dist/theme-chalk/message/index.scss +100 -0
  87. package/dist/theme-chalk/message-box/index.scss +131 -0
  88. package/dist/theme-chalk/mixins.scss +203 -0
  89. package/dist/theme-chalk/no-data/index.scss +36 -0
  90. package/dist/theme-chalk/notification/index.scss +76 -0
  91. package/dist/theme-chalk/page-header/index.scss +36 -0
  92. package/dist/theme-chalk/pagination/index.scss +225 -0
  93. package/dist/theme-chalk/popover/index.scss +56 -0
  94. package/dist/theme-chalk/popper/index.scss +89 -0
  95. package/dist/theme-chalk/progress/index.scss +105 -0
  96. package/dist/theme-chalk/radio/index.scss +328 -0
  97. package/dist/theme-chalk/rate/index.scss +56 -0
  98. package/dist/theme-chalk/reset.scss +262 -0
  99. package/dist/theme-chalk/result/index.scss +46 -0
  100. package/dist/theme-chalk/row/index.scss +88 -0
  101. package/dist/theme-chalk/scrollbar/index.scss +67 -0
  102. package/dist/theme-chalk/select/index.scss +223 -0
  103. package/dist/theme-chalk/skeleton/index.scss +30 -0
  104. package/dist/theme-chalk/skeleton-item/index.scss +49 -0
  105. package/dist/theme-chalk/slider/index.scss +113 -0
  106. package/dist/theme-chalk/spinner/index.scss +40 -0
  107. package/dist/theme-chalk/statistic/index.scss +38 -0
  108. package/dist/theme-chalk/status-timeline-chart/index.scss +23 -0
  109. package/dist/theme-chalk/step/index.scss +160 -0
  110. package/dist/theme-chalk/steps/index.scss +160 -0
  111. package/dist/theme-chalk/switch/index.scss +153 -0
  112. package/dist/theme-chalk/tab-pane/index.scss +112 -0
  113. package/dist/theme-chalk/table/index.scss +110 -0
  114. package/dist/theme-chalk/tabs/index.scss +112 -0
  115. package/dist/theme-chalk/tabs-navigation/index.scss +631 -0
  116. package/dist/theme-chalk/tag/index.scss +138 -0
  117. package/dist/theme-chalk/themes/blue.scss +76 -0
  118. package/dist/theme-chalk/themes/dark.scss +99 -0
  119. package/dist/theme-chalk/themes/index.scss +260 -0
  120. package/dist/theme-chalk/themes/light.scss +99 -0
  121. package/dist/theme-chalk/time-picker/index.scss +332 -0
  122. package/dist/theme-chalk/timeline/index.scss +119 -0
  123. package/dist/theme-chalk/timeline-item/index.scss +119 -0
  124. package/dist/theme-chalk/tooltip/index.scss +122 -0
  125. package/dist/theme-chalk/tree/index.scss +125 -0
  126. package/dist/theme-chalk/upload/index.scss +348 -0
  127. package/dist/theme-chalk/variables.scss +93 -0
  128. package/dist/vue2-ui-library.cjs.temp.js.map +1 -0
  129. package/dist/vue2-ui-library.common.js +28 -0
  130. package/dist/vue2-ui-library.common.js.map +1 -0
  131. package/dist/vue2-ui-library.esm.js +29 -0
  132. package/dist/vue2-ui-library.umd.js +27 -0
  133. package/package.json +161 -0
  134. package/src/directives/clickoutside/index.js +111 -0
  135. package/src/directives/init/index.js +50 -0
  136. package/src/directives/resize/index.js +69 -0
  137. package/src/index.js +174 -0
  138. package/src/mixins/emitter.js +47 -0
  139. package/src/mixins/focus.js +42 -0
  140. package/src/mixins/locale.js +24 -0
  141. package/src/mixins/migrating.js +46 -0
  142. package/src/packages/alert/index.js +12 -0
  143. package/src/packages/alert/src/main.vue +98 -0
  144. package/src/packages/aside/index.js +12 -0
  145. package/src/packages/aside/src/main.vue +20 -0
  146. package/src/packages/auto-grid-layout/index.js +18 -0
  147. package/src/packages/auto-grid-layout/prop.js +92 -0
  148. package/src/packages/auto-grid-layout/src/components/GridItem.vue +759 -0
  149. package/src/packages/auto-grid-layout/src/components/GridLayout.vue +367 -0
  150. package/src/packages/auto-grid-layout/src/main.vue +287 -0
  151. package/src/packages/auto-grid-layout/src/utils/DOM.js +46 -0
  152. package/src/packages/auto-grid-layout/src/utils/interact.js +333 -0
  153. package/src/packages/auto-grid-layout/src/utils/responsiveUtils.js +75 -0
  154. package/src/packages/auto-grid-layout/src/utils/utils.js +339 -0
  155. package/src/packages/autocomplete/index.js +12 -0
  156. package/src/packages/autocomplete/src/main.vue +170 -0
  157. package/src/packages/avatar/index.js +12 -0
  158. package/src/packages/avatar/src/main.vue +87 -0
  159. package/src/packages/backtop/index.js +12 -0
  160. package/src/packages/backtop/src/main.vue +120 -0
  161. package/src/packages/badge/index.js +12 -0
  162. package/src/packages/badge/src/main.vue +53 -0
  163. package/src/packages/breadcrumb/index.js +12 -0
  164. package/src/packages/breadcrumb/src/main.vue +34 -0
  165. package/src/packages/breadcrumb-item/index.js +12 -0
  166. package/src/packages/breadcrumb-item/src/main.vue +41 -0
  167. package/src/packages/button/index.js +13 -0
  168. package/src/packages/button/src/main.vue +106 -0
  169. package/src/packages/calendar/index.js +12 -0
  170. package/src/packages/calendar/src/main.vue +173 -0
  171. package/src/packages/card/index.js +12 -0
  172. package/src/packages/card/src/main.vue +26 -0
  173. package/src/packages/carousel/index.js +12 -0
  174. package/src/packages/carousel/src/main.vue +186 -0
  175. package/src/packages/carousel-item/index.js +12 -0
  176. package/src/packages/carousel-item/src/main.vue +34 -0
  177. package/src/packages/cascader/index.js +12 -0
  178. package/src/packages/cascader/src/main.vue +232 -0
  179. package/src/packages/chart/index.js +7 -0
  180. package/src/packages/chart/src/axis-chart.js +700 -0
  181. package/src/packages/chart/src/main.vue +828 -0
  182. package/src/packages/chart/src/utils.js +21 -0
  183. package/src/packages/checkbox/index.js +44 -0
  184. package/src/packages/checkbox/src/main.vue +312 -0
  185. package/src/packages/col/index.js +12 -0
  186. package/src/packages/col/src/main.vue +85 -0
  187. package/src/packages/collapse/index.js +12 -0
  188. package/src/packages/collapse/src/main.vue +69 -0
  189. package/src/packages/collapse-item/index.js +12 -0
  190. package/src/packages/collapse-item/src/main.vue +75 -0
  191. package/src/packages/color-picker/index.js +12 -0
  192. package/src/packages/color-picker/src/main.vue +206 -0
  193. package/src/packages/container/index.js +12 -0
  194. package/src/packages/container/src/main.vue +33 -0
  195. package/src/packages/date-picker/index.js +12 -0
  196. package/src/packages/date-picker/src/main.vue +246 -0
  197. package/src/packages/descriptions/index.js +12 -0
  198. package/src/packages/descriptions/src/main.vue +89 -0
  199. package/src/packages/descriptions-item/index.js +12 -0
  200. package/src/packages/descriptions-item/src/main.vue +26 -0
  201. package/src/packages/dialog/index.js +12 -0
  202. package/src/packages/dialog/src/main.vue +336 -0
  203. package/src/packages/divider/index.js +12 -0
  204. package/src/packages/divider/src/main.vue +37 -0
  205. package/src/packages/drawer/index.js +7 -0
  206. package/src/packages/drawer/src/main.vue +310 -0
  207. package/src/packages/dropdown/index.js +12 -0
  208. package/src/packages/dropdown/src/main.vue +82 -0
  209. package/src/packages/dropdown-menu-item/index.js +12 -0
  210. package/src/packages/dropdown-menu-item/src/main.vue +29 -0
  211. package/src/packages/empty/index.js +12 -0
  212. package/src/packages/empty/src/img-empty.vue +12 -0
  213. package/src/packages/empty/src/main.vue +49 -0
  214. package/src/packages/footer/index.js +12 -0
  215. package/src/packages/footer/src/main.vue +20 -0
  216. package/src/packages/form/index.js +13 -0
  217. package/src/packages/form/src/form-field.vue +790 -0
  218. package/src/packages/form/src/form-item.vue +464 -0
  219. package/src/packages/form/src/label-wrap.vue +127 -0
  220. package/src/packages/form/src/main.vue +442 -0
  221. package/src/packages/form-item/index.js +11 -0
  222. package/src/packages/header/index.js +12 -0
  223. package/src/packages/header/src/main.vue +20 -0
  224. package/src/packages/icon/index.js +12 -0
  225. package/src/packages/icon/src/main.vue +48 -0
  226. package/src/packages/image/index.js +12 -0
  227. package/src/packages/image/src/main.vue +224 -0
  228. package/src/packages/input/index.js +13 -0
  229. package/src/packages/input/src/calcTextareaHeight.js +123 -0
  230. package/src/packages/input/src/main.vue +510 -0
  231. package/src/packages/input-number/index.js +12 -0
  232. package/src/packages/input-number/src/main.vue +121 -0
  233. package/src/packages/link/index.js +12 -0
  234. package/src/packages/link/src/main.vue +53 -0
  235. package/src/packages/loading/index.js +17 -0
  236. package/src/packages/loading/src/directive.js +54 -0
  237. package/src/packages/loading/src/main.vue +38 -0
  238. package/src/packages/loading/src/service.js +63 -0
  239. package/src/packages/main/index.js +12 -0
  240. package/src/packages/main/src/main.vue +12 -0
  241. package/src/packages/menu/index.js +12 -0
  242. package/src/packages/menu/src/main.vue +117 -0
  243. package/src/packages/menu-item/index.js +12 -0
  244. package/src/packages/menu-item/src/main.vue +61 -0
  245. package/src/packages/message/index.js +95 -0
  246. package/src/packages/message/src/main.vue +131 -0
  247. package/src/packages/message-box/index.js +75 -0
  248. package/src/packages/message-box/src/main.vue +207 -0
  249. package/src/packages/no-data/index.js +8 -0
  250. package/src/packages/no-data/src/main.vue +23 -0
  251. package/src/packages/notification/index.js +72 -0
  252. package/src/packages/notification/src/main.vue +139 -0
  253. package/src/packages/option/index.js +13 -0
  254. package/src/packages/page-header/index.js +12 -0
  255. package/src/packages/page-header/src/main.vue +27 -0
  256. package/src/packages/pagination/index.js +12 -0
  257. package/src/packages/pagination/src/main.vue +255 -0
  258. package/src/packages/popconfirm/index.js +12 -0
  259. package/src/packages/popconfirm/src/main.vue +89 -0
  260. package/src/packages/popover/index.js +12 -0
  261. package/src/packages/popover/src/main.vue +452 -0
  262. package/src/packages/progress/index.js +12 -0
  263. package/src/packages/progress/src/main.vue +236 -0
  264. package/src/packages/radio/index.js +44 -0
  265. package/src/packages/radio/src/main.vue +291 -0
  266. package/src/packages/rate/index.js +12 -0
  267. package/src/packages/rate/src/main.vue +129 -0
  268. package/src/packages/result/index.js +12 -0
  269. package/src/packages/result/src/main.vue +52 -0
  270. package/src/packages/row/index.js +12 -0
  271. package/src/packages/row/src/main.vue +57 -0
  272. package/src/packages/scrollbar/index.js +12 -0
  273. package/src/packages/scrollbar/src/bar.vue +116 -0
  274. package/src/packages/scrollbar/src/main.vue +124 -0
  275. package/src/packages/select/index.js +15 -0
  276. package/src/packages/select/src/clickoutside.js +20 -0
  277. package/src/packages/select/src/main.vue +1055 -0
  278. package/src/packages/select/src/navigation-mixin.js +49 -0
  279. package/src/packages/select/src/option.vue +249 -0
  280. package/src/packages/select/src/select-dropdown.vue +95 -0
  281. package/src/packages/select/src/utils.js +5 -0
  282. package/src/packages/skeleton/index.js +12 -0
  283. package/src/packages/skeleton/src/main.vue +76 -0
  284. package/src/packages/skeleton-item/index.js +12 -0
  285. package/src/packages/skeleton-item/src/img-placeholder.vue +13 -0
  286. package/src/packages/skeleton-item/src/main.vue +22 -0
  287. package/src/packages/slider/index.js +12 -0
  288. package/src/packages/slider/src/main.vue +176 -0
  289. package/src/packages/spinner/index.js +12 -0
  290. package/src/packages/spinner/src/main.vue +27 -0
  291. package/src/packages/statistic/index.js +12 -0
  292. package/src/packages/statistic/src/main.vue +100 -0
  293. package/src/packages/status-timeline-chart/index.js +7 -0
  294. package/src/packages/status-timeline-chart/src/constants.js +20 -0
  295. package/src/packages/status-timeline-chart/src/main.vue +499 -0
  296. package/src/packages/status-timeline-chart/src/option-builder.js +475 -0
  297. package/src/packages/step/index.js +12 -0
  298. package/src/packages/step/src/main.vue +183 -0
  299. package/src/packages/steps/index.js +12 -0
  300. package/src/packages/steps/src/main.vue +57 -0
  301. package/src/packages/submenu/index.js +12 -0
  302. package/src/packages/submenu/src/main.vue +68 -0
  303. package/src/packages/switch/index.js +12 -0
  304. package/src/packages/switch/src/main.vue +166 -0
  305. package/src/packages/tab-pane/index.js +12 -0
  306. package/src/packages/tab-pane/src/main.vue +74 -0
  307. package/src/packages/table/index.js +8 -0
  308. package/src/packages/table/src/components/PagePagination.vue +82 -0
  309. package/src/packages/table/src/main.vue +153 -0
  310. package/src/packages/tabs/index.js +12 -0
  311. package/src/packages/tabs/src/main.vue +167 -0
  312. package/src/packages/tabs-navigation/index.js +7 -0
  313. package/src/packages/tabs-navigation/src/main.vue +462 -0
  314. package/src/packages/tag/index.js +12 -0
  315. package/src/packages/tag/src/main.vue +194 -0
  316. package/src/packages/time-picker/index.js +17 -0
  317. package/src/packages/time-picker/src/date-utils.js +455 -0
  318. package/src/packages/time-picker/src/main.vue +321 -0
  319. package/src/packages/time-picker/src/pane/date-range.vue +193 -0
  320. package/src/packages/time-picker/src/pane/date-time-range.vue +362 -0
  321. package/src/packages/time-picker/src/pane/date-time.vue +362 -0
  322. package/src/packages/time-picker/src/pane/date.vue +441 -0
  323. package/src/packages/time-picker/src/pane/time.vue +260 -0
  324. package/src/packages/time-picker/src/time-input.vue +203 -0
  325. package/src/packages/time-picker/src/time-range-input.vue +170 -0
  326. package/src/packages/timeline/index.js +12 -0
  327. package/src/packages/timeline/src/main.vue +24 -0
  328. package/src/packages/timeline-item/index.js +12 -0
  329. package/src/packages/timeline-item/src/main.vue +78 -0
  330. package/src/packages/tooltip/index.js +12 -0
  331. package/src/packages/tooltip/src/main.js +367 -0
  332. package/src/packages/transfer/index.js +8 -0
  333. package/src/packages/transfer/src/main.vue +229 -0
  334. package/src/packages/transfer/src/transfer-panel.vue +245 -0
  335. package/src/packages/transitions/collapse-transition.js +75 -0
  336. package/src/packages/tree/index.js +12 -0
  337. package/src/packages/tree/src/main.vue +322 -0
  338. package/src/packages/tree/src/model/node.js +348 -0
  339. package/src/packages/tree/src/model/tree-store.js +354 -0
  340. package/src/packages/tree/src/model/util.js +10 -0
  341. package/src/packages/tree/src/tree-node.vue +262 -0
  342. package/src/packages/upload/index.js +9 -0
  343. package/src/packages/upload/src/main.vue +415 -0
  344. package/src/playground/mixins/element.js +98 -0
  345. package/src/playground/types/element.js +197 -0
  346. package/src/playground/types/layout.js +80 -0
  347. package/src/plugins/i18n.js +125 -0
  348. package/src/styles/fonts/element-icons.ttf +0 -0
  349. package/src/styles/fonts/element-icons.woff +0 -0
  350. package/src/styles/index.scss +138 -0
  351. package/src/styles/reset.scss +257 -0
  352. package/src/styles/themes/blue.scss +75 -0
  353. package/src/styles/themes/dark.scss +98 -0
  354. package/src/styles/themes/index.scss +34 -0
  355. package/src/styles/themes/light.scss +98 -0
  356. package/src/styles/themes/variables.scss +233 -0
  357. package/src/styles/variables.scss +146 -0
  358. package/src/utils/async-validator/index.js +659 -0
  359. package/src/utils/browser/index.js +39 -0
  360. package/src/utils/color.js +76 -0
  361. package/src/utils/dom/index.js +421 -0
  362. package/src/utils/dom/scrollbar-width.js +49 -0
  363. package/src/utils/draggable/core.js +379 -0
  364. package/src/utils/draggable/draggable.js +478 -0
  365. package/src/utils/draggable/index.js +61 -0
  366. package/src/utils/draggable/sortable.js +751 -0
  367. package/src/utils/lodash/index.js +2395 -0
  368. package/src/utils/moment/index.js +909 -0
  369. package/src/utils/playground/index.js +37 -0
  370. package/src/utils/popper/index.js +308 -0
  371. package/src/utils/popper/popper.js +1132 -0
  372. package/src/utils/popper/popup-manager.js +288 -0
  373. package/src/utils/popper/popup.js +344 -0
@@ -0,0 +1,367 @@
1
+ import Vue from 'vue'
2
+ import Popper from '../../../utils/popper/index.js'
3
+ import { addClass, removeClass, on, off, getTextWidth, getStyle } from '../../../utils/dom/index.js'
4
+ import { debounce } from '../../../utils/lodash/index.js'
5
+
6
+ const generateId = () => Math.floor(Math.random() * 10000)
7
+
8
+ /**
9
+ * UiTooltip 文字提示组件
10
+ * 常用于展示鼠标 hover 时的提示信息。
11
+ * @component
12
+ */
13
+ export default {
14
+ name: 'UiTooltip',
15
+ mixins: [Popper],
16
+ props: {
17
+ /**
18
+ * 显示的内容,也可以通过 slot#content 传入 DOM
19
+ * @type {string}
20
+ */
21
+ content: String,
22
+
23
+ /**
24
+ * 鼠标进入后是否允许操作 tooltip 内部内容
25
+ * @type {boolean}
26
+ * @default true
27
+ */
28
+ enterable: { type: Boolean, default: true },
29
+
30
+ /**
31
+ * Tooltip 是否可用
32
+ * @type {boolean}
33
+ * @default false
34
+ */
35
+ disabled: Boolean,
36
+
37
+ /**
38
+ * 是否手动控制 Tooltip 的显示与隐藏
39
+ * @type {boolean}
40
+ * @default false
41
+ */
42
+ manual: Boolean,
43
+
44
+ /**
45
+ * 是否启用文本溢出检测,在文本溢出时展示悬浮窗,不溢出时不展示,仅在配置了 content 文本且没有传入插槽时生效
46
+ * @type {boolean}
47
+ * @default false
48
+ */
49
+ overflowCheck: { type: Boolean, default: false },
50
+
51
+ /**
52
+ * 主题风格
53
+ * @type {'dark' | 'light'}
54
+ * @default 'dark'
55
+ */
56
+ effect: { type: String, default: 'dark' },
57
+
58
+ /**
59
+ * Tooltip 的类名
60
+ * @type {string}
61
+ */
62
+ popperClass: String,
63
+
64
+ /**
65
+ * 箭头的偏移量
66
+ * @type {number}
67
+ * @default 0
68
+ */
69
+ arrowOffset: { type: Number, default: 0 },
70
+
71
+ /**
72
+ * 延迟出现的时间,单位毫秒
73
+ * @type {number}
74
+ * @default 0
75
+ */
76
+ openDelay: { type: Number, default: 0 },
77
+
78
+ /**
79
+ * 在多少毫秒后自动隐藏 Tooltip
80
+ * @type {number}
81
+ * @default 0
82
+ */
83
+ hideAfter: { type: Number, default: 0 },
84
+
85
+ /**
86
+ * 是否显示箭头
87
+ * @type {boolean}
88
+ * @default true
89
+ */
90
+ visibleArrow: { default: true },
91
+
92
+ /**
93
+ * 显示隐藏的过渡动画类名
94
+ * @type {string}
95
+ * @default 'ui-fade-in-linear'
96
+ */
97
+ transition: { type: String, default: 'ui-fade-in-linear' },
98
+
99
+ /**
100
+ * popper.js 的配置项
101
+ * @type {object}
102
+ * @default { boundariesPadding: 10, gpuAcceleration: false }
103
+ */
104
+ popperOptions: { default: () => ({ boundariesPadding: 10, gpuAcceleration: false }) },
105
+
106
+ /**
107
+ * 触发元素的 tabindex 属性值
108
+ * @type {number}
109
+ * @default 0
110
+ */
111
+ tabindex: { type: Number, default: 0 },
112
+ },
113
+ data: () => ({
114
+ /**
115
+ * Tooltip 的唯一 ID,用于无障碍访问
116
+ * @type {string}
117
+ */
118
+ tooltipId: `ui-tooltip-${generateId()}`,
119
+
120
+ /**
121
+ * 延时隐藏的定时器 ID
122
+ * @type {number|null}
123
+ */
124
+ timeoutPending: null,
125
+
126
+ /**
127
+ * 当前是否处于聚焦状态
128
+ * @type {boolean}
129
+ */
130
+ focusing: false,
131
+
132
+ /**
133
+ *
134
+ */
135
+ onlyContent: false,
136
+ }),
137
+ computed: {
138
+ textOverflowWrapperStyle() {
139
+ return { width: '100%', overflow: 'hidden', textOverflow: 'ellipsis' }
140
+ }
141
+ },
142
+ watch: {
143
+ /**
144
+ * 监听聚焦状态变化,动态添加/移除 focusing 类名
145
+ * @param {boolean} val - 新的聚焦状态
146
+ */
147
+ focusing(val) {
148
+ val ? addClass(this.referenceElm, 'focusing') : removeClass(this.referenceElm, 'focusing')
149
+ },
150
+ },
151
+ beforeCreate() {
152
+ if (this.$isServer) return
153
+ // 创建独立的 Vue 实例用于渲染 popper 内容,避免受父组件渲染影响
154
+ this.popperVM = new Vue({
155
+ data: { node: '' },
156
+ render(h) { return this.node },
157
+ }).$mount()
158
+ // 初始化防抖关闭函数
159
+ this.debounceClose = debounce(() => this.handleClosePopper(), 200)
160
+ },
161
+ mounted() {
162
+ // 获取触发元素引用
163
+ this.referenceElm = this.$el
164
+ if (this.$el.nodeType === 1) {
165
+ // 设置无障碍属性
166
+ this.$el.setAttribute('aria-describedby', this.tooltipId)
167
+ this.$el.setAttribute('tabindex', this.tabindex)
168
+
169
+ // 绑定鼠标事件
170
+ on(this.$el, 'mouseenter', this.show)
171
+ on(this.$el, 'mouseleave', this.hide)
172
+
173
+ // 绑定焦点事件
174
+ on(this.$el, 'focus', () => {
175
+ if (!this.$slots.default || !this.$slots.default.length) {
176
+ this.handleFocus()
177
+ return
178
+ }
179
+ const instance = this.$slots.default[0].componentInstance
180
+ if (instance && instance.focus) {
181
+ instance.focus()
182
+ } else {
183
+ this.handleFocus()
184
+ }
185
+ })
186
+ on(this.$el, 'blur', this.handleBlur)
187
+ on(this.$el, 'click', this.removeFocusing)
188
+ }
189
+
190
+ // 如果初始值为真,则更新 popper 位置
191
+ this.value &&
192
+ this.popperVM &&
193
+ this.popperVM.$nextTick(() => {
194
+ this.value && this.updatePopper()
195
+ })
196
+ },
197
+ beforeDestroy() {
198
+ // 销毁 popper VM 实例
199
+ this.popperVM && this.popperVM.$destroy();
200
+ },
201
+ destroyed() {
202
+ // 解绑所有事件监听器
203
+ const reference = this.referenceElm;
204
+ if (reference.nodeType === 1) {
205
+ off(reference, 'mouseenter', this.show);
206
+ off(reference, 'mouseleave', this.hide);
207
+ off(reference, 'focus', this.handleFocus);
208
+ off(reference, 'blur', this.handleBlur);
209
+ off(reference, 'click', this.removeFocusing);
210
+ }
211
+ },
212
+ render(h) {
213
+ // 渲染 popper 气泡框内容
214
+ if (this.popperVM) {
215
+ this.popperVM.node = (
216
+ <transition name={this.transition} onAfterLeave={this.doDestroy}>
217
+ <div
218
+ onMouseleave={() => {
219
+ this.setExpectedState(false)
220
+ this.debounceClose()
221
+ }}
222
+ onMouseenter={() => {
223
+ this.setExpectedState(true)
224
+ }}
225
+ ref="popper"
226
+ role="tooltip"
227
+ id={this.tooltipId}
228
+ aria-hidden={this.disabled || !this.showPopper ? 'true' : 'false'}
229
+ v-show={!this.disabled && this.showPopper}
230
+ class={['ui-tooltip__popper', 'is-' + this.effect, this.popperClass]}
231
+ >
232
+ {this.$slots.content || this.content}
233
+ </div>
234
+ </transition>
235
+ )
236
+ }
237
+
238
+ // 获取默认插槽的第一个元素作为触发元素
239
+ let firstElement = this.getFirstElement()
240
+ // 如果没有传入插槽,则以 content 文本生成一个 span 元素作为触发元素
241
+ if (!firstElement && this.content) {
242
+ this.onlyContent = true
243
+ firstElement = h('div', { class: 'ui-tooltip__default' }, [this.content])
244
+ } else {
245
+ this.onlyContent = false
246
+ }
247
+
248
+ // 修改触发元素的类名,注入 tooltip 相关样式
249
+ const data = (firstElement.data = firstElement.data || {})
250
+ data.staticClass = this.addTooltipClass(data.staticClass)
251
+
252
+ return firstElement
253
+ },
254
+ methods: {
255
+ /**
256
+ * 显示 Tooltip
257
+ */
258
+ show() {
259
+ if (this.overflowCheck && this.onlyContent) {
260
+ const visialWidthStr = getStyle(this.referenceElm, 'width')
261
+ // 可视容器宽度
262
+ const visialWidth = Number(visialWidthStr.replace('px', ''))
263
+ // 文本全量展示所需宽度
264
+ const contentWidth = getTextWidth(this.content, getStyle(this.referenceElm, 'font'))
265
+ // 文本全量宽度小于容器宽度时,不展示tooltip
266
+ if (visialWidth > contentWidth) return;
267
+ }
268
+
269
+ this.setExpectedState(true)
270
+ this.handleShowPopper()
271
+ },
272
+
273
+ /**
274
+ * 隐藏 Tooltip
275
+ */
276
+ hide() {
277
+ this.setExpectedState(false)
278
+ this.debounceClose()
279
+ },
280
+
281
+ /**
282
+ * 处理焦点获取事件
283
+ */
284
+ handleFocus() {
285
+ this.focusing = true
286
+ this.show()
287
+ },
288
+
289
+ /**
290
+ * 处理焦点丢失事件
291
+ */
292
+ handleBlur() {
293
+ this.focusing = false
294
+ this.hide()
295
+ },
296
+
297
+ /**
298
+ * 移除聚焦状态标记
299
+ */
300
+ removeFocusing() {
301
+ this.focusing = false
302
+ },
303
+
304
+ /**
305
+ * 添加工具提示特定的类名
306
+ * @param {string} prev - 原有的类名字符串
307
+ * @returns {string} 合并后的类名字符串
308
+ */
309
+ addTooltipClass(prev) {
310
+ return 'ui-tooltip ' + (prev ? prev.replace('ui-tooltip', '') : '')
311
+ },
312
+
313
+ /**
314
+ * 处理显示 Popper 的逻辑(包含延迟显示和自动隐藏)
315
+ */
316
+ handleShowPopper() {
317
+ if (!this.expectedState || this.manual) return
318
+ clearTimeout(this.timeout)
319
+ this.timeout = setTimeout(() => {
320
+ this.showPopper = true
321
+ }, this.openDelay)
322
+
323
+ if (this.hideAfter > 0) {
324
+ this.timeoutPending = setTimeout(() => {
325
+ this.showPopper = false
326
+ }, this.hideAfter)
327
+ }
328
+ },
329
+
330
+ /**
331
+ * 处理关闭 Popper 的逻辑(包含防抖和状态检查)
332
+ */
333
+ handleClosePopper() {
334
+ if ((this.enterable && this.expectedState) || this.manual) return;
335
+ clearTimeout(this.timeout)
336
+ this.timeoutPending && clearTimeout(this.timeoutPending)
337
+ this.showPopper = false
338
+ this.disabled && this.doDestroy()
339
+ },
340
+
341
+ /**
342
+ * 设置期望的状态(用于判断鼠标是否仍在目标区域或 tooltip 区域内)
343
+ * @param {boolean} expectedState - 期望的状态
344
+ */
345
+ setExpectedState(expectedState) {
346
+ !expectedState && clearTimeout(this.timeoutPending)
347
+ this.expectedState = expectedState
348
+ },
349
+
350
+ /**
351
+ * 获取默认插槽中的第一个有效元素节点
352
+ * @returns {VNode|null} 第一个包含 tag 的 VNode,否则返回 null
353
+ */
354
+ getFirstElement() {
355
+ const slots = this.$slots.default
356
+ if (!Array.isArray(slots)) return null
357
+ let element = null
358
+ for (let index = 0; index < slots.length; index++) {
359
+ if (slots[index] && slots[index].tag) {
360
+ element = slots[index]
361
+ break
362
+ }
363
+ }
364
+ return element
365
+ },
366
+ },
367
+ }
@@ -0,0 +1,8 @@
1
+ import Transfer from './src/main.vue';
2
+
3
+ /* istanbul ignore next */
4
+ Transfer.install = function(Vue) {
5
+ Vue.component(Transfer.name, Transfer);
6
+ };
7
+
8
+ export default Transfer;
@@ -0,0 +1,229 @@
1
+ <template>
2
+ <div class="ui-transfer">
3
+ <transfer-panel
4
+ v-bind="$props"
5
+ ref="leftPanel"
6
+ :data="sourceData"
7
+ :title="titles[0] || leftTitle"
8
+ :default-checked="leftDefaultChecked"
9
+ :placeholder="filterPlaceholder"
10
+ @checked-change="onSourceCheckedChange">
11
+ <slot name="left-footer"></slot>
12
+ </transfer-panel>
13
+ <div class="ui-transfer__buttons">
14
+ <ui-button
15
+ type="primary"
16
+ :class="['ui-transfer__button', hasButtonTexts ? 'is-with-texts' : '']"
17
+ @click="addToLeft"
18
+ :disabled="rightChecked.length === 0">
19
+ <i class="ui-icon-arrow-left"></i>
20
+ <span v-if="buttonTexts[0] !== undefined">{{ buttonTexts[0] }}</span>
21
+ </ui-button>
22
+ <ui-button
23
+ type="primary"
24
+ :class="['ui-transfer__button', hasButtonTexts ? 'is-with-texts' : '']"
25
+ @click="addToRight"
26
+ :disabled="leftChecked.length === 0">
27
+ <span v-if="buttonTexts[1] !== undefined">{{ buttonTexts[1] }}</span>
28
+ <i class="ui-icon-arrow-right"></i>
29
+ </ui-button>
30
+ </div>
31
+ <transfer-panel
32
+ v-bind="$props"
33
+ ref="rightPanel"
34
+ :data="targetData"
35
+ :title="titles[1] || rightTitle"
36
+ :default-checked="rightDefaultChecked"
37
+ :placeholder="filterPlaceholder"
38
+ @checked-change="onTargetCheckedChange">
39
+ <slot name="right-footer"></slot>
40
+ </transfer-panel>
41
+ </div>
42
+ </template>
43
+
44
+ <script>
45
+ import UiButton from '../../button';
46
+ import TransferPanel from './transfer-panel.vue';
47
+
48
+ export default {
49
+ name: 'UiTransfer',
50
+
51
+ components: {
52
+ TransferPanel,
53
+ UiButton
54
+ },
55
+
56
+ props: {
57
+ data: {
58
+ type: Array,
59
+ default() {
60
+ return [];
61
+ }
62
+ },
63
+ titles: {
64
+ type: Array,
65
+ default() {
66
+ return [];
67
+ }
68
+ },
69
+ buttonTexts: {
70
+ type: Array,
71
+ default() {
72
+ return [];
73
+ }
74
+ },
75
+ filterPlaceholder: {
76
+ type: String,
77
+ default: '请输入搜索内容'
78
+ },
79
+ filterMethod: Function,
80
+ leftDefaultChecked: {
81
+ type: Array,
82
+ default() {
83
+ return [];
84
+ }
85
+ },
86
+ rightDefaultChecked: {
87
+ type: Array,
88
+ default() {
89
+ return [];
90
+ }
91
+ },
92
+ renderContent: Function,
93
+ value: {
94
+ type: Array,
95
+ default() {
96
+ return [];
97
+ }
98
+ },
99
+ format: {
100
+ type: Object,
101
+ default() {
102
+ return {
103
+ noChecked: '${total} 项',
104
+ hasChecked: '已选 ${checked}/${total} 项'
105
+ };
106
+ }
107
+ },
108
+ filterable: Boolean,
109
+ props: {
110
+ type: Object,
111
+ default() {
112
+ return {
113
+ label: 'label',
114
+ key: 'key',
115
+ disabled: 'disabled'
116
+ };
117
+ }
118
+ },
119
+ targetOrder: {
120
+ type: String,
121
+ default: 'original'
122
+ }
123
+ },
124
+
125
+ data() {
126
+ return {
127
+ leftChecked: [],
128
+ rightChecked: []
129
+ };
130
+ },
131
+
132
+ computed: {
133
+ dataObj() {
134
+ const key = this.props.key;
135
+ return this.data.reduce((o, cur) => (o[cur[key]] = cur) && o, {});
136
+ },
137
+
138
+ sourceData() {
139
+ return this.data.filter(item => this.value.indexOf(item[this.props.key]) === -1);
140
+ },
141
+
142
+ targetData() {
143
+ if (this.targetOrder === 'original') {
144
+ return this.data.filter(item => this.value.indexOf(item[this.props.key]) > -1);
145
+ } else {
146
+ return this.value.reduce((arr, cur) => {
147
+ const val = this.dataObj[cur];
148
+ if (val) {
149
+ arr.push(val);
150
+ }
151
+ return arr;
152
+ }, []);
153
+ }
154
+ },
155
+
156
+ hasButtonTexts() {
157
+ return this.buttonTexts.length === 2;
158
+ },
159
+
160
+ leftTitle() {
161
+ return '列表一';
162
+ },
163
+
164
+ rightTitle() {
165
+ return '列表二';
166
+ }
167
+ },
168
+
169
+ watch: {
170
+ value(val) {
171
+ this.$emit('change', val);
172
+ }
173
+ },
174
+
175
+ methods: {
176
+ onSourceCheckedChange(val, movedKeys) {
177
+ this.leftChecked = val;
178
+ if (movedKeys === undefined) return;
179
+ this.$emit('left-check-change', val, movedKeys);
180
+ },
181
+
182
+ onTargetCheckedChange(val, movedKeys) {
183
+ this.rightChecked = val;
184
+ if (movedKeys === undefined) return;
185
+ this.$emit('right-check-change', val, movedKeys);
186
+ },
187
+
188
+ addToLeft() {
189
+ let currentValue = this.value.slice();
190
+ this.rightChecked.forEach(item => {
191
+ const index = currentValue.indexOf(item);
192
+ if (index > -1) {
193
+ currentValue.splice(index, 1);
194
+ }
195
+ });
196
+ this.$emit('input', currentValue);
197
+ this.$emit('change', currentValue, 'left', this.rightChecked);
198
+ },
199
+
200
+ addToRight() {
201
+ let currentValue = this.value.slice();
202
+ const itemsToBeMoved = [];
203
+ const key = this.props.key;
204
+ this.data.forEach(item => {
205
+ const itemKey = item[key];
206
+ if (
207
+ this.leftChecked.indexOf(itemKey) > -1 &&
208
+ this.value.indexOf(itemKey) === -1
209
+ ) {
210
+ itemsToBeMoved.push(itemKey);
211
+ }
212
+ });
213
+ currentValue = this.targetOrder === 'unshift'
214
+ ? itemsToBeMoved.concat(currentValue)
215
+ : currentValue.concat(itemsToBeMoved);
216
+ this.$emit('input', currentValue);
217
+ this.$emit('change', currentValue, 'right', this.leftChecked);
218
+ },
219
+
220
+ clearQuery(which) {
221
+ if (which === 'left') {
222
+ this.$refs.leftPanel.query = '';
223
+ } else if (which === 'right') {
224
+ this.$refs.rightPanel.query = '';
225
+ }
226
+ }
227
+ }
228
+ };
229
+ </script>