element-sim 1.1.5 → 1.1.7

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 (627) hide show
  1. package/CHANGELOG.en-US.md +2085 -2085
  2. package/CHANGELOG.es.md +2092 -2092
  3. package/CHANGELOG.fr-FR.md +2085 -2085
  4. package/CHANGELOG.zh-CN.md +22 -22
  5. package/LICENSE +21 -21
  6. package/README.md +148 -148
  7. package/lib/autocomplete.js +25 -25
  8. package/lib/calendar.js +12 -12
  9. package/lib/carousel-item.js +4 -4
  10. package/lib/carousel.js +4 -4
  11. package/lib/cascader-panel.js +25 -25
  12. package/lib/cascader.js +34 -34
  13. package/lib/checkbox-button.js +4 -4
  14. package/lib/checkbox-group.js +4 -4
  15. package/lib/checkbox.js +4 -4
  16. package/lib/collapse-item.js +8 -8
  17. package/lib/color-picker.js +21 -21
  18. package/lib/date-picker.js +83 -83
  19. package/lib/descriptions.js +2 -2
  20. package/lib/dialog.js +8 -8
  21. package/lib/directives/repeat-click.js +2 -2
  22. package/lib/drawer.js +6 -6
  23. package/lib/dropdown-item.js +4 -4
  24. package/lib/dropdown-menu.js +4 -4
  25. package/lib/dropdown.js +12 -12
  26. package/lib/{element-ui.common.js → element-sim.common.js} +548 -548
  27. package/lib/empty.js +4 -4
  28. package/lib/form-item.js +8 -8
  29. package/lib/form.js +4 -4
  30. package/lib/image.js +19 -19
  31. package/lib/index.js +1 -1
  32. package/lib/infinite-scroll.js +4 -4
  33. package/lib/input-number.js +15 -15
  34. package/lib/input.js +10 -10
  35. package/lib/loading.js +8 -8
  36. package/lib/locale/format.js +11 -11
  37. package/lib/locale/index.js +1 -1
  38. package/lib/menu-item.js +6 -6
  39. package/lib/menu.js +31 -31
  40. package/lib/message-box.js +20 -20
  41. package/lib/message.js +6 -6
  42. package/lib/mixins/locale.js +1 -1
  43. package/lib/mixins/migrating.js +21 -21
  44. package/lib/notification.js +6 -6
  45. package/lib/option-group.js +4 -4
  46. package/lib/option.js +6 -6
  47. package/lib/page-header.js +4 -4
  48. package/lib/pagination.js +10 -10
  49. package/lib/popconfirm.js +8 -8
  50. package/lib/popover.js +8 -8
  51. package/lib/radio-button.js +4 -4
  52. package/lib/radio-group.js +4 -4
  53. package/lib/radio.js +4 -4
  54. package/lib/rate.js +8 -8
  55. package/lib/result.js +8 -8
  56. package/lib/scrollbar.js +8 -8
  57. package/lib/select.js +37 -37
  58. package/lib/slider.js +15 -15
  59. package/lib/statistic.js +4 -4
  60. package/lib/steps.js +4 -4
  61. package/lib/submenu.js +6 -6
  62. package/lib/switch.js +8 -8
  63. package/lib/table-column.js +8 -8
  64. package/lib/table.js +41 -41
  65. package/lib/tabs.js +6 -6
  66. package/lib/time-picker.js +42 -42
  67. package/lib/time-select.js +25 -25
  68. package/lib/tooltip.js +6 -6
  69. package/lib/transfer.js +23 -23
  70. package/lib/transitions/collapse-transition.js +1 -1
  71. package/lib/tree.js +23 -23
  72. package/lib/upload.js +11 -11
  73. package/lib/utils/after-leave.js +7 -7
  74. package/lib/utils/aria-dialog.js +16 -16
  75. package/lib/utils/aria-utils.js +25 -25
  76. package/lib/utils/clickoutside.js +8 -8
  77. package/lib/utils/date-util.js +2 -2
  78. package/lib/utils/date.js +37 -37
  79. package/lib/utils/lodash.js +9292 -9292
  80. package/lib/utils/popper.js +321 -321
  81. package/lib/utils/popup/index.js +2 -2
  82. package/lib/utils/popup/popup-manager.js +1 -1
  83. package/lib/utils/types.js +3 -3
  84. package/lib/utils/util.js +1 -1
  85. package/lib/utils/vdom.js +1 -1
  86. package/lib/utils/vue-popper.js +8 -8
  87. package/package.json +151 -151
  88. package/packages/alert/index.js +8 -8
  89. package/packages/alert/src/main.vue +94 -94
  90. package/packages/aside/index.js +8 -8
  91. package/packages/aside/src/main.vue +20 -20
  92. package/packages/autocomplete/index.js +8 -8
  93. package/packages/autocomplete/src/autocomplete-suggestions.vue +76 -76
  94. package/packages/autocomplete/src/autocomplete.vue +285 -285
  95. package/packages/avatar/index.js +8 -8
  96. package/packages/avatar/src/main.vue +107 -107
  97. package/packages/backtop/index.js +8 -8
  98. package/packages/backtop/src/main.vue +110 -110
  99. package/packages/badge/index.js +8 -8
  100. package/packages/badge/src/main.vue +53 -53
  101. package/packages/breadcrumb/index.js +8 -8
  102. package/packages/breadcrumb/src/breadcrumb-item.vue +41 -41
  103. package/packages/breadcrumb/src/breadcrumb.vue +34 -34
  104. package/packages/breadcrumb-item/index.js +8 -8
  105. package/packages/button/index.js +8 -8
  106. package/packages/button/src/button-group.vue +10 -10
  107. package/packages/button/src/button.vue +78 -78
  108. package/packages/button-group/index.js +8 -8
  109. package/packages/calendar/index.js +8 -8
  110. package/packages/calendar/src/date-table.vue +200 -200
  111. package/packages/calendar/src/main.vue +280 -280
  112. package/packages/card/index.js +8 -8
  113. package/packages/card/src/main.vue +23 -23
  114. package/packages/carousel/index.js +8 -8
  115. package/packages/carousel/src/item.vue +138 -138
  116. package/packages/carousel/src/main.vue +315 -315
  117. package/packages/carousel-item/index.js +8 -8
  118. package/packages/cascader/index.js +8 -8
  119. package/packages/cascader/src/cascader.vue +663 -663
  120. package/packages/cascader-panel/index.js +8 -8
  121. package/packages/cascader-panel/src/cascader-menu.vue +138 -138
  122. package/packages/cascader-panel/src/cascader-node.vue +246 -246
  123. package/packages/cascader-panel/src/cascader-panel.vue +391 -391
  124. package/packages/cascader-panel/src/node.js +166 -166
  125. package/packages/cascader-panel/src/store.js +58 -58
  126. package/packages/checkbox/index.js +8 -8
  127. package/packages/checkbox/src/checkbox-button.vue +199 -199
  128. package/packages/checkbox/src/checkbox-group.vue +48 -48
  129. package/packages/checkbox/src/checkbox.vue +222 -222
  130. package/packages/checkbox-button/index.js +8 -8
  131. package/packages/checkbox-group/index.js +8 -8
  132. package/packages/col/index.js +9 -9
  133. package/packages/col/src/col.js +71 -71
  134. package/packages/collapse/index.js +9 -9
  135. package/packages/collapse/src/collapse-item.vue +114 -114
  136. package/packages/collapse/src/collapse.vue +73 -73
  137. package/packages/collapse-item/index.js +8 -8
  138. package/packages/color-picker/index.js +8 -8
  139. package/packages/color-picker/src/color.js +317 -317
  140. package/packages/color-picker/src/components/alpha-slider.vue +132 -132
  141. package/packages/color-picker/src/components/hue-slider.vue +123 -123
  142. package/packages/color-picker/src/components/picker-dropdown.vue +121 -121
  143. package/packages/color-picker/src/components/predefine.vue +60 -60
  144. package/packages/color-picker/src/components/sv-panel.vue +100 -100
  145. package/packages/color-picker/src/draggable.js +36 -36
  146. package/packages/color-picker/src/main.vue +188 -188
  147. package/packages/container/index.js +8 -8
  148. package/packages/container/src/main.vue +33 -33
  149. package/packages/date-picker/index.js +8 -8
  150. package/packages/date-picker/src/basic/date-table.vue +441 -441
  151. package/packages/date-picker/src/basic/month-table.vue +269 -269
  152. package/packages/date-picker/src/basic/time-spinner.vue +304 -304
  153. package/packages/date-picker/src/basic/year-table.vue +111 -111
  154. package/packages/date-picker/src/panel/date-range.vue +680 -680
  155. package/packages/date-picker/src/panel/date.vue +609 -609
  156. package/packages/date-picker/src/panel/month-range.vue +289 -289
  157. package/packages/date-picker/src/panel/time-range.vue +248 -248
  158. package/packages/date-picker/src/panel/time-select.vue +178 -178
  159. package/packages/date-picker/src/panel/time.vue +186 -186
  160. package/packages/date-picker/src/picker/date-picker.js +43 -43
  161. package/packages/date-picker/src/picker/time-picker.js +39 -39
  162. package/packages/date-picker/src/picker/time-select.js +21 -21
  163. package/packages/date-picker/src/picker.vue +956 -956
  164. package/packages/descriptions/index.js +8 -8
  165. package/packages/descriptions/src/descriptions-item.js +30 -30
  166. package/packages/descriptions/src/descriptions-row.js +116 -116
  167. package/packages/descriptions/src/index.js +180 -180
  168. package/packages/descriptions-item/index.js +8 -8
  169. package/packages/dialog/index.js +8 -8
  170. package/packages/dialog/src/component.vue +212 -212
  171. package/packages/divider/index.js +8 -8
  172. package/packages/divider/src/main.vue +37 -37
  173. package/packages/drawer/index.js +8 -8
  174. package/packages/drawer/src/main.vue +208 -208
  175. package/packages/dropdown/index.js +8 -8
  176. package/packages/dropdown/src/dropdown-item.vue +37 -37
  177. package/packages/dropdown/src/dropdown-menu.vue +63 -63
  178. package/packages/dropdown/src/dropdown.vue +293 -293
  179. package/packages/dropdown-item/index.js +8 -8
  180. package/packages/dropdown-menu/index.js +8 -8
  181. package/packages/empty/index.js +7 -7
  182. package/packages/empty/src/img-empty.vue +132 -132
  183. package/packages/empty/src/index.vue +50 -50
  184. package/packages/footer/index.js +8 -8
  185. package/packages/footer/src/main.vue +20 -20
  186. package/packages/form/index.js +8 -8
  187. package/packages/form/src/form-item.vue +324 -324
  188. package/packages/form/src/form.vue +182 -182
  189. package/packages/form/src/label-wrap.vue +78 -78
  190. package/packages/form-item/index.js +8 -8
  191. package/packages/header/index.js +8 -8
  192. package/packages/header/src/main.vue +20 -20
  193. package/packages/icon/index.js +8 -8
  194. package/packages/icon/src/icon.vue +13 -13
  195. package/packages/image/index.js +8 -8
  196. package/packages/image/src/image-viewer.vue +330 -330
  197. package/packages/image/src/main.vue +249 -249
  198. package/packages/infinite-scroll/index.js +8 -8
  199. package/packages/infinite-scroll/src/main.js +150 -150
  200. package/packages/input/index.js +8 -8
  201. package/packages/input/src/calcTextareaHeight.js +104 -104
  202. package/packages/input/src/input.vue +440 -440
  203. package/packages/input-number/index.js +8 -8
  204. package/packages/input-number/src/input-number.vue +283 -283
  205. package/packages/link/index.js +8 -8
  206. package/packages/link/src/main.vue +53 -53
  207. package/packages/loading/index.js +11 -11
  208. package/packages/loading/src/directive.js +133 -133
  209. package/packages/loading/src/index.js +106 -106
  210. package/packages/loading/src/loading.vue +41 -41
  211. package/packages/main/index.js +8 -8
  212. package/packages/main/src/main.vue +12 -12
  213. package/packages/menu/index.js +8 -8
  214. package/packages/menu/src/menu-item-group.vue +45 -45
  215. package/packages/menu/src/menu-item.vue +112 -112
  216. package/packages/menu/src/menu-mixin.js +44 -44
  217. package/packages/menu/src/menu.vue +325 -325
  218. package/packages/menu/src/submenu.vue +349 -349
  219. package/packages/menu-item/index.js +8 -8
  220. package/packages/menu-item-group/index.js +8 -8
  221. package/packages/message/index.js +2 -2
  222. package/packages/message/src/main.js +91 -91
  223. package/packages/message/src/main.vue +117 -117
  224. package/packages/message-box/index.js +2 -2
  225. package/packages/message-box/src/main.js +216 -216
  226. package/packages/message-box/src/main.vue +332 -332
  227. package/packages/notification/index.js +2 -2
  228. package/packages/notification/src/main.js +94 -94
  229. package/packages/notification/src/main.vue +152 -152
  230. package/packages/option/index.js +8 -8
  231. package/packages/option-group/index.js +8 -8
  232. package/packages/page-header/index.js +8 -8
  233. package/packages/page-header/src/main.vue +30 -30
  234. package/packages/pagination/index.js +8 -8
  235. package/packages/pagination/src/pager.vue +163 -163
  236. package/packages/pagination/src/pagination.js +386 -386
  237. package/packages/popconfirm/index.js +8 -8
  238. package/packages/popconfirm/src/main.vue +104 -104
  239. package/packages/popover/index.js +14 -14
  240. package/packages/popover/src/directive.js +20 -20
  241. package/packages/popover/src/main.vue +237 -237
  242. package/packages/progress/index.js +8 -8
  243. package/packages/progress/src/progress.vue +235 -235
  244. package/packages/radio/index.js +8 -8
  245. package/packages/radio/src/radio-button.vue +115 -115
  246. package/packages/radio/src/radio-group.vue +113 -113
  247. package/packages/radio/src/radio.vue +134 -134
  248. package/packages/radio-button/index.js +8 -8
  249. package/packages/radio-group/index.js +8 -8
  250. package/packages/rate/index.js +8 -8
  251. package/packages/rate/src/main.vue +348 -348
  252. package/packages/result/index.js +8 -8
  253. package/packages/result/src/icon-error.vue +13 -13
  254. package/packages/result/src/icon-info.vue +13 -13
  255. package/packages/result/src/icon-success.vue +13 -13
  256. package/packages/result/src/icon-warning.vue +13 -13
  257. package/packages/result/src/index.vue +65 -65
  258. package/packages/row/index.js +9 -9
  259. package/packages/row/src/row.js +44 -44
  260. package/packages/scrollbar/index.js +8 -8
  261. package/packages/scrollbar/src/bar.js +92 -92
  262. package/packages/scrollbar/src/main.js +130 -130
  263. package/packages/scrollbar/src/util.js +34 -34
  264. package/packages/select/index.js +8 -8
  265. package/packages/select/src/navigation-mixin.js +54 -54
  266. package/packages/select/src/option-group.vue +60 -60
  267. package/packages/select/src/option.vue +168 -168
  268. package/packages/select/src/select-dropdown.vue +74 -74
  269. package/packages/select/src/select.vue +900 -900
  270. package/packages/skeleton/index.js +8 -8
  271. package/packages/skeleton/src/img-placeholder.vue +16 -16
  272. package/packages/skeleton/src/index.vue +76 -76
  273. package/packages/skeleton/src/item.vue +21 -21
  274. package/packages/skeleton-item/index.js +8 -8
  275. package/packages/slider/index.js +8 -8
  276. package/packages/slider/src/button.vue +238 -238
  277. package/packages/slider/src/main.vue +427 -427
  278. package/packages/slider/src/marker.js +18 -18
  279. package/packages/spinner/index.js +8 -8
  280. package/packages/spinner/src/spinner.vue +27 -27
  281. package/packages/statistic/index.js +8 -8
  282. package/packages/statistic/src/main.vue +204 -204
  283. package/packages/step/index.js +8 -8
  284. package/packages/steps/README.md +69 -69
  285. package/packages/steps/index.js +8 -8
  286. package/packages/steps/src/step.vue +184 -184
  287. package/packages/steps/src/steps.vue +68 -68
  288. package/packages/submenu/index.js +8 -8
  289. package/packages/switch/index.js +9 -9
  290. package/packages/switch/src/component.vue +174 -174
  291. package/packages/tab-pane/index.js +8 -8
  292. package/packages/table/index.js +8 -8
  293. package/packages/table/src/config.js +124 -124
  294. package/packages/table/src/dropdown.js +28 -28
  295. package/packages/table/src/filter-panel.vue +194 -194
  296. package/packages/table/src/layout-observer.js +68 -68
  297. package/packages/table/src/store/current.js +76 -76
  298. package/packages/table/src/store/expand.js +65 -65
  299. package/packages/table/src/store/helper.js +41 -41
  300. package/packages/table/src/store/index.js +147 -147
  301. package/packages/table/src/store/tree.js +209 -209
  302. package/packages/table/src/store/watcher.js +381 -381
  303. package/packages/table/src/table-body.js +469 -469
  304. package/packages/table/src/table-column.js +319 -319
  305. package/packages/table/src/table-footer.js +153 -153
  306. package/packages/table/src/table-header.js +511 -511
  307. package/packages/table/src/table-layout.js +249 -249
  308. package/packages/table/src/table-row.js +101 -101
  309. package/packages/table/src/table.vue +712 -712
  310. package/packages/table/src/util.js +273 -273
  311. package/packages/table-column/index.js +8 -8
  312. package/packages/tabs/index.js +8 -8
  313. package/packages/tabs/src/tab-bar.vue +57 -57
  314. package/packages/tabs/src/tab-nav.vue +294 -294
  315. package/packages/tabs/src/tab-pane.vue +56 -56
  316. package/packages/tabs/src/tabs.vue +191 -191
  317. package/packages/tag/index.js +8 -8
  318. package/packages/tag/src/tag.vue +58 -58
  319. package/packages/theme-chalk/README.md +33 -33
  320. package/packages/theme-chalk/package.json +35 -35
  321. package/packages/theme-chalk/src/alert.scss +147 -147
  322. package/packages/theme-chalk/src/aside.scss +7 -7
  323. package/packages/theme-chalk/src/autocomplete.scss +80 -80
  324. package/packages/theme-chalk/src/avatar.scss +51 -51
  325. package/packages/theme-chalk/src/backtop.scss +22 -22
  326. package/packages/theme-chalk/src/badge.scss +57 -57
  327. package/packages/theme-chalk/src/base.scss +2 -2
  328. package/packages/theme-chalk/src/breadcrumb.scss +55 -55
  329. package/packages/theme-chalk/src/button.scss +262 -262
  330. package/packages/theme-chalk/src/calendar.scss +79 -79
  331. package/packages/theme-chalk/src/card.scss +32 -32
  332. package/packages/theme-chalk/src/carousel-item.scss +49 -49
  333. package/packages/theme-chalk/src/carousel.scss +161 -161
  334. package/packages/theme-chalk/src/cascader-panel.scss +120 -120
  335. package/packages/theme-chalk/src/cascader.scss +182 -182
  336. package/packages/theme-chalk/src/checkbox.scss +359 -359
  337. package/packages/theme-chalk/src/col.scss +155 -155
  338. package/packages/theme-chalk/src/collapse.scss +63 -63
  339. package/packages/theme-chalk/src/color-picker.scss +384 -384
  340. package/packages/theme-chalk/src/common/popup.scss +42 -42
  341. package/packages/theme-chalk/src/common/transition.scss +98 -98
  342. package/packages/theme-chalk/src/common/var.scss +1030 -1028
  343. package/packages/theme-chalk/src/container.scss +14 -14
  344. package/packages/theme-chalk/src/date-picker/date-picker.scss +97 -97
  345. package/packages/theme-chalk/src/date-picker/date-range-picker.scss +101 -101
  346. package/packages/theme-chalk/src/date-picker/date-table.scss +151 -151
  347. package/packages/theme-chalk/src/date-picker/month-table.scss +82 -82
  348. package/packages/theme-chalk/src/date-picker/picker-panel.scss +117 -117
  349. package/packages/theme-chalk/src/date-picker/picker.scss +197 -197
  350. package/packages/theme-chalk/src/date-picker/time-picker.scss +85 -85
  351. package/packages/theme-chalk/src/date-picker/time-range-picker.scss +31 -31
  352. package/packages/theme-chalk/src/date-picker/time-spinner.scss +110 -110
  353. package/packages/theme-chalk/src/date-picker/year-table.scss +51 -51
  354. package/packages/theme-chalk/src/date-picker.scss +11 -11
  355. package/packages/theme-chalk/src/descriptions-item.scss +42 -42
  356. package/packages/theme-chalk/src/descriptions.scss +111 -111
  357. package/packages/theme-chalk/src/dialog.scss +123 -123
  358. package/packages/theme-chalk/src/display.scss +12 -12
  359. package/packages/theme-chalk/src/divider.scss +46 -46
  360. package/packages/theme-chalk/src/drawer.scss +219 -219
  361. package/packages/theme-chalk/src/dropdown.scss +182 -182
  362. package/packages/theme-chalk/src/empty.scss +45 -45
  363. package/packages/theme-chalk/src/footer.scss +8 -8
  364. package/packages/theme-chalk/src/form.scss +167 -167
  365. package/packages/theme-chalk/src/header.scss +8 -8
  366. package/packages/theme-chalk/src/icon.scss +1167 -1167
  367. package/packages/theme-chalk/src/image.scss +179 -179
  368. package/packages/theme-chalk/src/input-number.scss +180 -180
  369. package/packages/theme-chalk/src/input.scss +360 -360
  370. package/packages/theme-chalk/src/link.scss +81 -81
  371. package/packages/theme-chalk/src/loading.scss +96 -96
  372. package/packages/theme-chalk/src/main.scss +12 -12
  373. package/packages/theme-chalk/src/menu.scss +289 -289
  374. package/packages/theme-chalk/src/message-box.scss +226 -226
  375. package/packages/theme-chalk/src/message.scss +120 -120
  376. package/packages/theme-chalk/src/mixins/_button.scss +81 -81
  377. package/packages/theme-chalk/src/mixins/config.scss +4 -4
  378. package/packages/theme-chalk/src/mixins/function.scss +44 -44
  379. package/packages/theme-chalk/src/mixins/mixins.scss +190 -190
  380. package/packages/theme-chalk/src/mixins/utils.scss +38 -38
  381. package/packages/theme-chalk/src/notification.scss +99 -99
  382. package/packages/theme-chalk/src/option-group.scss +42 -42
  383. package/packages/theme-chalk/src/option.scss +36 -36
  384. package/packages/theme-chalk/src/page-header.scss +41 -41
  385. package/packages/theme-chalk/src/pagination.scss +295 -295
  386. package/packages/theme-chalk/src/popconfirm.scss +16 -16
  387. package/packages/theme-chalk/src/popover.scss +40 -40
  388. package/packages/theme-chalk/src/popper.scss +100 -100
  389. package/packages/theme-chalk/src/progress.scss +141 -141
  390. package/packages/theme-chalk/src/radio-button.scss +113 -113
  391. package/packages/theme-chalk/src/radio-group.scss +9 -9
  392. package/packages/theme-chalk/src/radio.scss +199 -199
  393. package/packages/theme-chalk/src/rate.scss +49 -49
  394. package/packages/theme-chalk/src/reset.scss +79 -79
  395. package/packages/theme-chalk/src/result.scss +61 -61
  396. package/packages/theme-chalk/src/row.scss +43 -43
  397. package/packages/theme-chalk/src/scrollbar.scss +72 -72
  398. package/packages/theme-chalk/src/select-dropdown.scss +62 -62
  399. package/packages/theme-chalk/src/select.scss +152 -152
  400. package/packages/theme-chalk/src/skeleton-item.scss +84 -84
  401. package/packages/theme-chalk/src/skeleton.scss +40 -40
  402. package/packages/theme-chalk/src/slider.scss +250 -250
  403. package/packages/theme-chalk/src/spinner.scss +44 -44
  404. package/packages/theme-chalk/src/statistic.scss +38 -38
  405. package/packages/theme-chalk/src/step.scss +317 -317
  406. package/packages/theme-chalk/src/steps.scss +20 -20
  407. package/packages/theme-chalk/src/switch.scss +116 -116
  408. package/packages/theme-chalk/src/table-column.scss +96 -96
  409. package/packages/theme-chalk/src/table.scss +564 -564
  410. package/packages/theme-chalk/src/tabs.scss +602 -602
  411. package/packages/theme-chalk/src/tag.scss +163 -163
  412. package/packages/theme-chalk/src/time-picker.scss +8 -8
  413. package/packages/theme-chalk/src/time-select.scss +37 -37
  414. package/packages/theme-chalk/src/timeline-item.scss +86 -86
  415. package/packages/theme-chalk/src/timeline.scss +14 -14
  416. package/packages/theme-chalk/src/tooltip.scss +141 -141
  417. package/packages/theme-chalk/src/transfer.scss +227 -227
  418. package/packages/theme-chalk/src/tree.scss +123 -123
  419. package/packages/theme-chalk/src/upload.scss +603 -603
  420. package/packages/time-picker/index.js +8 -8
  421. package/packages/time-select/index.js +8 -8
  422. package/packages/timeline/index.js +8 -8
  423. package/packages/timeline/src/item.vue +73 -73
  424. package/packages/timeline/src/main.vue +33 -33
  425. package/packages/timeline-item/index.js +8 -8
  426. package/packages/tooltip/index.js +8 -8
  427. package/packages/tooltip/src/main.js +242 -242
  428. package/packages/transfer/index.js +8 -8
  429. package/packages/transfer/src/main.vue +231 -231
  430. package/packages/transfer/src/transfer-panel.vue +251 -251
  431. package/packages/tree/index.js +8 -8
  432. package/packages/tree/src/model/node.js +484 -484
  433. package/packages/tree/src/model/tree-store.js +340 -340
  434. package/packages/tree/src/model/util.js +27 -27
  435. package/packages/tree/src/tree-node.vue +279 -279
  436. package/packages/tree/src/tree.vue +496 -496
  437. package/packages/upload/index.js +8 -8
  438. package/packages/upload/src/ajax.js +85 -85
  439. package/packages/upload/src/index.vue +338 -338
  440. package/packages/upload/src/upload-dragger.vue +70 -70
  441. package/packages/upload/src/upload-list.vue +105 -105
  442. package/packages/upload/src/upload.vue +211 -211
  443. package/src/directives/mousewheel.js +18 -18
  444. package/src/directives/repeat-click.js +26 -26
  445. package/src/index.js +261 -261
  446. package/src/locale/format.js +46 -46
  447. package/src/locale/index.js +48 -48
  448. package/src/locale/lang/af-ZA.js +123 -123
  449. package/src/locale/lang/ar.js +122 -122
  450. package/src/locale/lang/az.js +126 -126
  451. package/src/locale/lang/bg.js +123 -123
  452. package/src/locale/lang/bn.js +126 -126
  453. package/src/locale/lang/ca.js +122 -122
  454. package/src/locale/lang/cs-CZ.js +125 -125
  455. package/src/locale/lang/da.js +122 -122
  456. package/src/locale/lang/de.js +124 -124
  457. package/src/locale/lang/ee.js +123 -123
  458. package/src/locale/lang/el.js +123 -123
  459. package/src/locale/lang/en.js +123 -123
  460. package/src/locale/lang/eo.js +123 -123
  461. package/src/locale/lang/es.js +122 -122
  462. package/src/locale/lang/eu.js +123 -123
  463. package/src/locale/lang/fa.js +123 -123
  464. package/src/locale/lang/fi.js +123 -123
  465. package/src/locale/lang/fr.js +122 -122
  466. package/src/locale/lang/he.js +123 -123
  467. package/src/locale/lang/hr.js +123 -123
  468. package/src/locale/lang/hu.js +122 -122
  469. package/src/locale/lang/hy-AM.js +123 -123
  470. package/src/locale/lang/id.js +123 -123
  471. package/src/locale/lang/is.js +124 -124
  472. package/src/locale/lang/it.js +122 -122
  473. package/src/locale/lang/ja.js +123 -123
  474. package/src/locale/lang/kg.js +123 -123
  475. package/src/locale/lang/km.js +123 -123
  476. package/src/locale/lang/ko.js +123 -123
  477. package/src/locale/lang/ku.js +123 -123
  478. package/src/locale/lang/kz.js +123 -123
  479. package/src/locale/lang/lo-LA.js +126 -126
  480. package/src/locale/lang/lt.js +123 -123
  481. package/src/locale/lang/lv.js +123 -123
  482. package/src/locale/lang/mn.js +123 -123
  483. package/src/locale/lang/ms.js +122 -122
  484. package/src/locale/lang/nb-NO.js +122 -122
  485. package/src/locale/lang/nl.js +123 -123
  486. package/src/locale/lang/pl.js +123 -123
  487. package/src/locale/lang/pt-br.js +123 -123
  488. package/src/locale/lang/pt.js +123 -123
  489. package/src/locale/lang/ro.js +123 -123
  490. package/src/locale/lang/ru-RU.js +123 -123
  491. package/src/locale/lang/si.js +123 -123
  492. package/src/locale/lang/sk.js +125 -125
  493. package/src/locale/lang/sl.js +123 -123
  494. package/src/locale/lang/sr-Latn.js +123 -123
  495. package/src/locale/lang/sr.js +123 -123
  496. package/src/locale/lang/sv-SE.js +123 -123
  497. package/src/locale/lang/sw.js +123 -123
  498. package/src/locale/lang/ta.js +122 -122
  499. package/src/locale/lang/th.js +123 -123
  500. package/src/locale/lang/tk.js +123 -123
  501. package/src/locale/lang/tr-TR.js +123 -123
  502. package/src/locale/lang/ua.js +123 -123
  503. package/src/locale/lang/ug-CN.js +123 -123
  504. package/src/locale/lang/uz-UZ.js +123 -123
  505. package/src/locale/lang/vi.js +123 -123
  506. package/src/locale/lang/zh-CN.js +123 -123
  507. package/src/locale/lang/zh-TW.js +123 -123
  508. package/src/mixins/emitter.js +33 -33
  509. package/src/mixins/focus.js +9 -9
  510. package/src/mixins/locale.js +9 -9
  511. package/src/mixins/migrating.js +54 -54
  512. package/src/transitions/collapse-transition.js +77 -77
  513. package/src/utils/after-leave.js +27 -27
  514. package/src/utils/aria-dialog.js +90 -90
  515. package/src/utils/aria-utils.js +122 -122
  516. package/src/utils/clickoutside.js +76 -76
  517. package/src/utils/date-util.js +282 -282
  518. package/src/utils/date.js +368 -368
  519. package/src/utils/dom.js +227 -227
  520. package/src/utils/lodash.js +18075 -18075
  521. package/src/utils/menu/aria-menubar.js +14 -14
  522. package/src/utils/menu/aria-menuitem.js +49 -49
  523. package/src/utils/menu/aria-submenu.js +59 -59
  524. package/src/utils/merge.js +15 -15
  525. package/src/utils/popper.js +1276 -1276
  526. package/src/utils/popup/index.js +218 -218
  527. package/src/utils/popup/popup-manager.js +194 -194
  528. package/src/utils/resize-event.js +36 -36
  529. package/src/utils/scroll-into-view.js +27 -27
  530. package/src/utils/scrollbar-width.js +29 -29
  531. package/src/utils/shared.js +7 -7
  532. package/src/utils/types.js +40 -40
  533. package/src/utils/util.js +245 -245
  534. package/src/utils/vdom.js +5 -5
  535. package/src/utils/vue-popper.js +198 -198
  536. package/types/alert.d.ts +31 -31
  537. package/types/aside.d.ts +7 -7
  538. package/types/autocomplete.d.ts +78 -78
  539. package/types/avatar.d.ts +20 -20
  540. package/types/backtop.d.ts +16 -16
  541. package/types/badge.d.ts +16 -16
  542. package/types/breadcrumb-item.d.ts +10 -10
  543. package/types/breadcrumb.d.ts +10 -10
  544. package/types/button-group.d.ts +4 -4
  545. package/types/button.d.ts +37 -37
  546. package/types/calendar.d.ts +15 -15
  547. package/types/card.d.ts +26 -26
  548. package/types/carousel-item.d.ts +10 -10
  549. package/types/carousel.d.ts +57 -57
  550. package/types/cascader-panel.d.ts +72 -72
  551. package/types/cascader.d.ts +65 -65
  552. package/types/checkbox-button.d.ts +22 -22
  553. package/types/checkbox-group.d.ts +22 -22
  554. package/types/checkbox.d.ts +34 -34
  555. package/types/col.d.ts +46 -46
  556. package/types/collapse-item.d.ts +26 -26
  557. package/types/collapse.d.ts +10 -10
  558. package/types/color-picker.d.ts +21 -21
  559. package/types/component.d.ts +13 -13
  560. package/types/container.d.ts +7 -7
  561. package/types/date-picker.d.ts +124 -124
  562. package/types/descriptions-item.d.ts +37 -37
  563. package/types/descriptions.d.ts +52 -52
  564. package/types/dialog.d.ts +62 -62
  565. package/types/divider.d.ts +12 -12
  566. package/types/drawer.d.ts +63 -63
  567. package/types/dropdown-item.d.ts +16 -16
  568. package/types/dropdown-menu.d.ts +4 -4
  569. package/types/dropdown.d.ts +38 -38
  570. package/types/element-ui.d.ts +381 -381
  571. package/types/empty.d.ts +31 -31
  572. package/types/footer.d.ts +7 -7
  573. package/types/form-item.d.ts +37 -37
  574. package/types/form.d.ts +82 -82
  575. package/types/header.d.ts +7 -7
  576. package/types/icon.d.ts +7 -7
  577. package/types/image.d.ts +43 -43
  578. package/types/index.d.ts +4 -4
  579. package/types/infinite-scroll.d.ts +5 -5
  580. package/types/input-number.d.ts +47 -47
  581. package/types/input.d.ts +107 -107
  582. package/types/link.d.ts +25 -25
  583. package/types/loading.d.ts +62 -62
  584. package/types/main.d.ts +4 -4
  585. package/types/menu-item-group.d.ts +7 -7
  586. package/types/menu-item.d.ts +10 -10
  587. package/types/menu.d.ts +46 -46
  588. package/types/message-box.d.ts +176 -176
  589. package/types/message.d.ts +90 -90
  590. package/types/notification.d.ts +84 -84
  591. package/types/option-group.d.ts +10 -10
  592. package/types/option.d.ts +13 -13
  593. package/types/page-header.d.ts +10 -10
  594. package/types/pagination.d.ts +43 -43
  595. package/types/popconfirm.d.ts +29 -29
  596. package/types/popover.d.ts +71 -71
  597. package/types/progress.d.ts +37 -37
  598. package/types/radio-button.d.ts +16 -16
  599. package/types/radio-group.d.ts +18 -18
  600. package/types/radio.d.ts +19 -19
  601. package/types/rate.d.ts +64 -64
  602. package/types/result.d.ts +33 -33
  603. package/types/row.d.ts +25 -25
  604. package/types/select.d.ts +90 -90
  605. package/types/skeleton-item.d.ts +7 -7
  606. package/types/skeleton.d.ts +33 -33
  607. package/types/slider.d.ts +68 -68
  608. package/types/spinner.d.ts +16 -16
  609. package/types/statistic.d.ts +37 -37
  610. package/types/step.d.ts +34 -34
  611. package/types/steps.d.ts +28 -28
  612. package/types/submenu.d.ts +22 -22
  613. package/types/switch.d.ts +43 -43
  614. package/types/tab-pane.d.ts +19 -19
  615. package/types/table-column.d.ts +117 -117
  616. package/types/table.d.ts +177 -177
  617. package/types/tabs.d.ts +31 -31
  618. package/types/tag.d.ts +28 -28
  619. package/types/time-picker.d.ts +63 -63
  620. package/types/time-select.d.ts +56 -56
  621. package/types/timeline-item.d.ts +20 -20
  622. package/types/timeline.d.ts +6 -6
  623. package/types/tooltip.d.ts +52 -52
  624. package/types/transfer.d.ts +73 -73
  625. package/types/tree.d.ts +266 -266
  626. package/types/upload.d.ts +124 -124
  627. package/web-types.json +4195 -4195
@@ -1,956 +1,956 @@
1
- <template>
2
- <el-input
3
- class="el-date-editor"
4
- :class="'el-date-editor--' + type"
5
- :readonly="!editable || readonly || type === 'dates' || type === 'week' || type === 'years' || type === 'months'"
6
- :disabled="pickerDisabled"
7
- :size="pickerSize"
8
- :name="name"
9
- v-bind="firstInputId"
10
- v-if="!ranged"
11
- v-clickoutside="handleClose"
12
- :placeholder="placeholder"
13
- @focus="handleFocus"
14
- @keydown.native="handleKeydown"
15
- :value="displayValue"
16
- @input="value => userInput = value"
17
- @change="handleChange"
18
- @mouseenter.native="handleMouseEnter"
19
- @mouseleave.native="showClose = false"
20
- :validateEvent="false"
21
- ref="reference">
22
- <i slot="prefix"
23
- class="el-input__icon"
24
- :class="triggerClass"
25
- @click="handleFocus">
26
- </i>
27
- <i slot="suffix"
28
- class="el-input__icon"
29
- @click="handleClickIcon"
30
- :class="[showClose ? '' + clearIcon : '']"
31
- v-if="haveTrigger">
32
- </i>
33
- </el-input>
34
- <div
35
- class="el-date-editor el-range-editor el-input__inner"
36
- :class="[
37
- 'el-date-editor--' + type,
38
- pickerSize ? `el-range-editor--${ pickerSize }` : '',
39
- pickerDisabled ? 'is-disabled' : '',
40
- pickerVisible ? 'is-active' : ''
41
- ]"
42
- @click="handleRangeClick"
43
- @mouseenter="handleMouseEnter"
44
- @mouseleave="showClose = false"
45
- @keydown="handleKeydown"
46
- ref="reference"
47
- v-clickoutside="handleClose"
48
- v-else>
49
- <i :class="['el-input__icon', 'el-range__icon', triggerClass]"></i>
50
- <input
51
- autocomplete="off"
52
- :placeholder="startPlaceholder"
53
- :value="displayValue && displayValue[0]"
54
- :disabled="pickerDisabled"
55
- v-bind="firstInputId"
56
- :readonly="!editable || readonly"
57
- :name="name && name[0]"
58
- @input="handleStartInput"
59
- @change="handleStartChange"
60
- @focus="handleFocus"
61
- class="el-range-input">
62
- <slot name="range-separator">
63
- <span class="el-range-separator">{{ rangeSeparator }}</span>
64
- </slot>
65
- <input
66
- autocomplete="off"
67
- :placeholder="endPlaceholder"
68
- :value="displayValue && displayValue[1]"
69
- :disabled="pickerDisabled"
70
- v-bind="secondInputId"
71
- :readonly="!editable || readonly"
72
- :name="name && name[1]"
73
- @input="handleEndInput"
74
- @change="handleEndChange"
75
- @focus="handleFocus"
76
- class="el-range-input">
77
- <i
78
- @click="handleClickIcon"
79
- v-if="haveTrigger"
80
- :class="[showClose ? '' + clearIcon : '']"
81
- class="el-input__icon el-range__close-icon">
82
- </i>
83
- </div>
84
- </template>
85
-
86
- <script>
87
- import Vue from 'vue';
88
- import Clickoutside from 'element-ui/src/utils/clickoutside';
89
- import { formatDate, parseDate, isDateObject, getWeekNumber } from 'element-ui/src/utils/date-util';
90
- import Popper from 'element-ui/src/utils/vue-popper';
91
- import Emitter from 'element-ui/src/mixins/emitter';
92
- import ElInput from 'element-ui/packages/input';
93
- import merge from 'element-ui/src/utils/merge';
94
-
95
- const NewPopper = {
96
- props: {
97
- appendToBody: Popper.props.appendToBody,
98
- offset: Popper.props.offset,
99
- boundariesPadding: Popper.props.boundariesPadding,
100
- arrowOffset: Popper.props.arrowOffset,
101
- transformOrigin: Popper.props.transformOrigin
102
- },
103
- methods: Popper.methods,
104
- data() {
105
- return merge({ visibleArrow: true }, Popper.data);
106
- },
107
- beforeDestroy: Popper.beforeDestroy
108
- };
109
-
110
- const DEFAULT_FORMATS = {
111
- date: 'yyyy-MM-dd',
112
- month: 'yyyy-MM',
113
- months: 'yyyy-MM',
114
- datetime: 'yyyy-MM-dd HH:mm:ss',
115
- time: 'HH:mm:ss',
116
- week: 'yyyywWW',
117
- timerange: 'HH:mm:ss',
118
- daterange: 'yyyy-MM-dd',
119
- monthrange: 'yyyy-MM',
120
- datetimerange: 'yyyy-MM-dd HH:mm:ss',
121
- year: 'yyyy',
122
- years: 'yyyy'
123
- };
124
- const HAVE_TRIGGER_TYPES = [
125
- 'date',
126
- 'datetime',
127
- 'time',
128
- 'time-select',
129
- 'week',
130
- 'month',
131
- 'year',
132
- 'daterange',
133
- 'monthrange',
134
- 'timerange',
135
- 'datetimerange',
136
- 'dates',
137
- 'months',
138
- 'years'
139
- ];
140
- const DATE_FORMATTER = function(value, format) {
141
- if (format === 'timestamp') return value.getTime();
142
- return formatDate(value, format);
143
- };
144
- const DATE_PARSER = function(text, format) {
145
- if (format === 'timestamp') return new Date(Number(text));
146
- return parseDate(text, format);
147
- };
148
- const RANGE_FORMATTER = function(value, format) {
149
- if (Array.isArray(value) && value.length === 2) {
150
- const start = value[0];
151
- const end = value[1];
152
-
153
- if (start && end) {
154
- return [DATE_FORMATTER(start, format), DATE_FORMATTER(end, format)];
155
- }
156
- }
157
- return '';
158
- };
159
- const RANGE_PARSER = function(array, format, separator) {
160
- if (!Array.isArray(array)) {
161
- array = array.split(separator);
162
- }
163
- if (array.length === 2) {
164
- const range1 = array[0];
165
- const range2 = array[1];
166
-
167
- return [DATE_PARSER(range1, format), DATE_PARSER(range2, format)];
168
- }
169
- return [];
170
- };
171
- const TYPE_VALUE_RESOLVER_MAP = {
172
- default: {
173
- formatter(value) {
174
- if (!value) return '';
175
- return '' + value;
176
- },
177
- parser(text) {
178
- if (text === undefined || text === '') return null;
179
- return text;
180
- }
181
- },
182
- week: {
183
- formatter(value, format) {
184
- let week = getWeekNumber(value);
185
- let month = value.getMonth();
186
- const trueDate = new Date(value);
187
- if (week === 1 && month === 11) {
188
- trueDate.setHours(0, 0, 0, 0);
189
- trueDate.setDate(trueDate.getDate() + 3 - (trueDate.getDay() + 6) % 7);
190
- }
191
- let date = formatDate(trueDate, format);
192
-
193
- date = /WW/.test(date)
194
- ? date.replace(/WW/, week < 10 ? '0' + week : week)
195
- : date.replace(/W/, week);
196
- return date;
197
- },
198
- parser(text, format) {
199
- // parse as if a normal date
200
- return TYPE_VALUE_RESOLVER_MAP.date.parser(text, format);
201
- }
202
- },
203
- date: {
204
- formatter: DATE_FORMATTER,
205
- parser: DATE_PARSER
206
- },
207
- datetime: {
208
- formatter: DATE_FORMATTER,
209
- parser: DATE_PARSER
210
- },
211
- daterange: {
212
- formatter: RANGE_FORMATTER,
213
- parser: RANGE_PARSER
214
- },
215
- monthrange: {
216
- formatter: RANGE_FORMATTER,
217
- parser: RANGE_PARSER
218
- },
219
- datetimerange: {
220
- formatter: RANGE_FORMATTER,
221
- parser: RANGE_PARSER
222
- },
223
- timerange: {
224
- formatter: RANGE_FORMATTER,
225
- parser: RANGE_PARSER
226
- },
227
- time: {
228
- formatter: DATE_FORMATTER,
229
- parser: DATE_PARSER
230
- },
231
- month: {
232
- formatter: DATE_FORMATTER,
233
- parser: DATE_PARSER
234
- },
235
- year: {
236
- formatter: DATE_FORMATTER,
237
- parser: DATE_PARSER
238
- },
239
- number: {
240
- formatter(value) {
241
- if (!value) return '';
242
- return '' + value;
243
- },
244
- parser(text) {
245
- let result = Number(text);
246
-
247
- if (!isNaN(text)) {
248
- return result;
249
- } else {
250
- return null;
251
- }
252
- }
253
- },
254
- dates: {
255
- formatter(value, format) {
256
- return value.map(date => DATE_FORMATTER(date, format));
257
- },
258
- parser(value, format) {
259
- return (typeof value === 'string' ? value.split(', ') : value)
260
- .map(date => date instanceof Date ? date : DATE_PARSER(date, format));
261
- }
262
- },
263
- months: {
264
- formatter(value, format) {
265
- return value.map(date => DATE_FORMATTER(date, format));
266
- },
267
- parser(value, format) {
268
- return (typeof value === 'string' ? value.split(', ') : value)
269
- .map(date => date instanceof Date ? date : DATE_PARSER(date, format));
270
- }
271
- },
272
- years: {
273
- formatter(value, format) {
274
- return value.map(date => DATE_FORMATTER(date, format));
275
- },
276
- parser(value, format) {
277
- return (typeof value === 'string' ? value.split(', ') : value)
278
- .map(date => date instanceof Date ? date : DATE_PARSER(date, format));
279
- }
280
- }
281
- };
282
- const PLACEMENT_MAP = {
283
- left: 'bottom-start',
284
- center: 'bottom',
285
- right: 'bottom-end'
286
- };
287
-
288
- const parseAsFormatAndType = (value, customFormat, type, rangeSeparator = '-') => {
289
- if (!value) return null;
290
- const parser = (
291
- TYPE_VALUE_RESOLVER_MAP[type] ||
292
- TYPE_VALUE_RESOLVER_MAP['default']
293
- ).parser;
294
- const format = customFormat || DEFAULT_FORMATS[type];
295
- return parser(value, format, rangeSeparator);
296
- };
297
-
298
- const formatAsFormatAndType = (value, customFormat, type) => {
299
- if (!value) return null;
300
- const formatter = (
301
- TYPE_VALUE_RESOLVER_MAP[type] ||
302
- TYPE_VALUE_RESOLVER_MAP['default']
303
- ).formatter;
304
- const format = customFormat || DEFAULT_FORMATS[type];
305
- return formatter(value, format);
306
- };
307
-
308
- /*
309
- * Considers:
310
- * 1. Date object
311
- * 2. date string
312
- * 3. array of 1 or 2
313
- */
314
- const valueEquals = function(a, b) {
315
- // considers Date object and string
316
- const dateEquals = function(a, b) {
317
- const aIsDate = a instanceof Date;
318
- const bIsDate = b instanceof Date;
319
- if (aIsDate && bIsDate) {
320
- return a.getTime() === b.getTime();
321
- }
322
- if (!aIsDate && !bIsDate) {
323
- return a === b;
324
- }
325
- return false;
326
- };
327
-
328
- const aIsArray = a instanceof Array;
329
- const bIsArray = b instanceof Array;
330
- if (aIsArray && bIsArray) {
331
- if (a.length !== b.length) {
332
- return false;
333
- }
334
- return a.every((item, index) => dateEquals(item, b[index]));
335
- }
336
- if (!aIsArray && !bIsArray) {
337
- return dateEquals(a, b);
338
- }
339
- return false;
340
- };
341
-
342
- const isString = function(val) {
343
- return typeof val === 'string' || val instanceof String;
344
- };
345
-
346
- const validator = function(val) {
347
- // either: String, Array of String, null / undefined
348
- return (
349
- val === null ||
350
- val === undefined ||
351
- isString(val) ||
352
- (Array.isArray(val) && val.length === 2 && val.every(isString))
353
- );
354
- };
355
-
356
- export default {
357
- mixins: [Emitter, NewPopper],
358
-
359
- inject: {
360
- elForm: {
361
- default: ''
362
- },
363
- elFormItem: {
364
- default: ''
365
- }
366
- },
367
-
368
- props: {
369
- size: String,
370
- format: String,
371
- valueFormat: String,
372
- readonly: Boolean,
373
- placeholder: String,
374
- startPlaceholder: String,
375
- endPlaceholder: String,
376
- prefixIcon: String,
377
- clearIcon: {
378
- type: String,
379
- default: 'el-icon-circle-close'
380
- },
381
- name: {
382
- default: '',
383
- validator
384
- },
385
- disabled: Boolean,
386
- clearable: {
387
- type: Boolean,
388
- default: true
389
- },
390
- id: {
391
- default: '',
392
- validator
393
- },
394
- popperClass: String,
395
- editable: {
396
- type: Boolean,
397
- default: true
398
- },
399
- align: {
400
- type: String,
401
- default: 'left'
402
- },
403
- value: {},
404
- defaultValue: {},
405
- defaultTime: {},
406
- rangeSeparator: {
407
- default: '-'
408
- },
409
- pickerOptions: {},
410
- unlinkPanels: Boolean,
411
- validateEvent: {
412
- type: Boolean,
413
- default: true
414
- }
415
- },
416
-
417
- components: { ElInput },
418
-
419
- directives: { Clickoutside },
420
-
421
- data() {
422
- return {
423
- pickerVisible: false,
424
- showClose: false,
425
- userInput: null,
426
- valueOnOpen: null, // value when picker opens, used to determine whether to emit change
427
- unwatchPickerOptions: null
428
- };
429
- },
430
-
431
- watch: {
432
- pickerVisible(val) {
433
- if (this.readonly || this.pickerDisabled) return;
434
- if (val) {
435
- this.showPicker();
436
- this.valueOnOpen = Array.isArray(this.value) ? [...this.value] : this.value;
437
- } else {
438
- this.hidePicker();
439
- this.emitChange(this.value);
440
- this.userInput = null;
441
- if (this.validateEvent) {
442
- this.dispatch('ElFormItem', 'el.form.blur');
443
- }
444
- this.$emit('blur', this);
445
- this.blur();
446
- }
447
- },
448
- parsedValue: {
449
- immediate: true,
450
- handler(val) {
451
- if (this.picker) {
452
- this.picker.value = val;
453
- }
454
- }
455
- },
456
- defaultValue(val) {
457
- // NOTE: should eventually move to jsx style picker + panel ?
458
- if (this.picker) {
459
- this.picker.defaultValue = val;
460
- }
461
- },
462
- value(val, oldVal) {
463
- if (!valueEquals(val, oldVal) && !this.pickerVisible && this.validateEvent) {
464
- this.dispatch('ElFormItem', 'el.form.change', val);
465
- }
466
- }
467
- },
468
-
469
- computed: {
470
- ranged() {
471
- return this.type.indexOf('range') > -1;
472
- },
473
-
474
- reference() {
475
- const reference = this.$refs.reference;
476
- return reference.$el || reference;
477
- },
478
-
479
- refInput() {
480
- if (this.reference) {
481
- return [].slice.call(this.reference.querySelectorAll('input'));
482
- }
483
- return [];
484
- },
485
-
486
- valueIsEmpty() {
487
- const val = this.value;
488
- if (Array.isArray(val)) {
489
- for (let i = 0, len = val.length; i < len; i++) {
490
- if (val[i]) {
491
- return false;
492
- }
493
- }
494
- } else {
495
- if (val) {
496
- return false;
497
- }
498
- }
499
- return true;
500
- },
501
-
502
- triggerClass() {
503
- return this.prefixIcon || (this.type.indexOf('time') !== -1 ? 'el-icon-time' : 'el-icon-date');
504
- },
505
-
506
- selectionMode() {
507
- if (this.type === 'week') {
508
- return 'week';
509
- } else if (this.type === 'month') {
510
- return 'month';
511
- } else if (this.type === 'year') {
512
- return 'year';
513
- } else if (this.type === 'dates') {
514
- return 'dates';
515
- } else if (this.type === 'months') {
516
- return 'months';
517
- } else if (this.type === 'years') {
518
- return 'years';
519
- }
520
-
521
- return 'day';
522
- },
523
-
524
- haveTrigger() {
525
- if (typeof this.showTrigger !== 'undefined') {
526
- return this.showTrigger;
527
- }
528
- return HAVE_TRIGGER_TYPES.indexOf(this.type) !== -1;
529
- },
530
-
531
- displayValue() {
532
- const formattedValue = formatAsFormatAndType(this.parsedValue, this.format, this.type, this.rangeSeparator);
533
- if (Array.isArray(this.userInput)) {
534
- return [
535
- this.userInput[0] || (formattedValue && formattedValue[0]) || '',
536
- this.userInput[1] || (formattedValue && formattedValue[1]) || ''
537
- ];
538
- } else if (this.userInput !== null) {
539
- return this.userInput;
540
- } else if (formattedValue) {
541
- return (this.type === 'dates' || this.type === 'years' || this.type === 'months')
542
- ? formattedValue.join(', ')
543
- : formattedValue;
544
- } else {
545
- return '';
546
- }
547
- },
548
-
549
- parsedValue() {
550
- if (!this.value) return this.value; // component value is not set
551
- if (this.type === 'time-select') return this.value; // time-select does not require parsing, this might change in next major version
552
-
553
- const valueIsDateObject = isDateObject(this.value) || (Array.isArray(this.value) && this.value.every(isDateObject));
554
- if (valueIsDateObject) {
555
- return this.value;
556
- }
557
-
558
- if (this.valueFormat) {
559
- return parseAsFormatAndType(this.value, this.valueFormat, this.type, this.rangeSeparator) || this.value;
560
- }
561
-
562
- // NOTE: deal with common but incorrect usage, should remove in next major version
563
- // user might provide string / timestamp without value-format, coerce them into date (or array of date)
564
- return Array.isArray(this.value) ? this.value.map(val => new Date(val)) : new Date(this.value);
565
- },
566
-
567
- _elFormItemSize() {
568
- return (this.elFormItem || {}).elFormItemSize;
569
- },
570
-
571
- pickerSize() {
572
- return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
573
- },
574
-
575
- pickerDisabled() {
576
- return this.disabled || (this.elForm || {}).disabled;
577
- },
578
-
579
- firstInputId() {
580
- const obj = {};
581
- let id;
582
- if (this.ranged) {
583
- id = this.id && this.id[0];
584
- } else {
585
- id = this.id;
586
- }
587
- if (id) obj.id = id;
588
- return obj;
589
- },
590
-
591
- secondInputId() {
592
- const obj = {};
593
- let id;
594
- if (this.ranged) {
595
- id = this.id && this.id[1];
596
- }
597
- if (id) obj.id = id;
598
- return obj;
599
- }
600
- },
601
-
602
- created() {
603
- // vue-popper
604
- this.popperOptions = {
605
- boundariesPadding: 0,
606
- gpuAcceleration: false
607
- };
608
- this.placement = PLACEMENT_MAP[this.align] || PLACEMENT_MAP.left;
609
-
610
- this.$on('fieldReset', this.handleFieldReset);
611
- },
612
-
613
- methods: {
614
- focus() {
615
- if (!this.ranged) {
616
- this.$refs.reference.focus();
617
- } else {
618
- this.handleFocus();
619
- }
620
- },
621
-
622
- blur() {
623
- this.refInput.forEach(input => input.blur());
624
- },
625
-
626
- // {parse, formatTo} Value deals maps component value with internal Date
627
- parseValue(value) {
628
- const isParsed = isDateObject(value) || (Array.isArray(value) && value.every(isDateObject));
629
- if (this.valueFormat && !isParsed) {
630
- return parseAsFormatAndType(value, this.valueFormat, this.type, this.rangeSeparator) || value;
631
- } else {
632
- return value;
633
- }
634
- },
635
-
636
- formatToValue(date) {
637
- const isFormattable = isDateObject(date) || (Array.isArray(date) && date.every(isDateObject));
638
- if (this.valueFormat && isFormattable) {
639
- return formatAsFormatAndType(date, this.valueFormat, this.type, this.rangeSeparator);
640
- } else {
641
- return date;
642
- }
643
- },
644
-
645
- // {parse, formatTo} String deals with user input
646
- parseString(value) {
647
- const type = Array.isArray(value) ? this.type : this.type.replace('range', '');
648
- return parseAsFormatAndType(value, this.format, type);
649
- },
650
-
651
- formatToString(value) {
652
- const type = Array.isArray(value) ? this.type : this.type.replace('range', '');
653
- return formatAsFormatAndType(value, this.format, type);
654
- },
655
-
656
- handleMouseEnter() {
657
- if (this.readonly || this.pickerDisabled) return;
658
- if (!this.valueIsEmpty && this.clearable) {
659
- this.showClose = true;
660
- }
661
- },
662
-
663
- handleChange() {
664
- if (this.userInput) {
665
- const value = this.parseString(this.displayValue);
666
- if (value) {
667
- this.picker.value = value;
668
- if (this.isValidValue(value)) {
669
- this.emitInput(value);
670
- this.userInput = null;
671
- }
672
- }
673
- }
674
- if (this.userInput === '') {
675
- this.emitInput(null);
676
- this.emitChange(null);
677
- this.userInput = null;
678
- }
679
- },
680
-
681
- handleStartInput(event) {
682
- if (this.userInput) {
683
- this.userInput = [event.target.value, this.userInput[1]];
684
- } else {
685
- this.userInput = [event.target.value, null];
686
- }
687
- },
688
-
689
- handleEndInput(event) {
690
- if (this.userInput) {
691
- this.userInput = [this.userInput[0], event.target.value];
692
- } else {
693
- this.userInput = [null, event.target.value];
694
- }
695
- },
696
-
697
- handleStartChange(event) {
698
- const value = this.parseString(this.userInput && this.userInput[0]);
699
- if (value) {
700
- this.userInput = [this.formatToString(value), this.displayValue[1]];
701
- const newValue = [value, this.picker.value && this.picker.value[1]];
702
- this.picker.value = newValue;
703
- if (this.isValidValue(newValue)) {
704
- this.emitInput(newValue);
705
- this.userInput = null;
706
- }
707
- }
708
- },
709
-
710
- handleEndChange(event) {
711
- const value = this.parseString(this.userInput && this.userInput[1]);
712
- if (value) {
713
- this.userInput = [this.displayValue[0], this.formatToString(value)];
714
- const newValue = [this.picker.value && this.picker.value[0], value];
715
- this.picker.value = newValue;
716
- if (this.isValidValue(newValue)) {
717
- this.emitInput(newValue);
718
- this.userInput = null;
719
- }
720
- }
721
- },
722
-
723
- handleClickIcon(event) {
724
- if (this.readonly || this.pickerDisabled) return;
725
- if (this.showClose) {
726
- this.valueOnOpen = this.value;
727
- event.stopPropagation();
728
- this.emitInput(null);
729
- this.emitChange(null);
730
- this.showClose = false;
731
- if (this.picker && typeof this.picker.handleClear === 'function') {
732
- this.picker.handleClear();
733
- }
734
- } else {
735
- this.pickerVisible = !this.pickerVisible;
736
- }
737
- },
738
-
739
- handleClose() {
740
- if (!this.pickerVisible) return;
741
- this.pickerVisible = false;
742
-
743
- if (this.type === 'dates' || this.type === 'years' || this.type === 'months') {
744
- // restore to former value
745
- const oldValue = parseAsFormatAndType(this.valueOnOpen, this.valueFormat, this.type, this.rangeSeparator) || this.valueOnOpen;
746
- this.emitInput(oldValue);
747
- }
748
- },
749
-
750
- handleFieldReset(initialValue) {
751
- this.userInput = initialValue === '' ? null : initialValue;
752
- },
753
-
754
- handleFocus() {
755
- const type = this.type;
756
-
757
- if (HAVE_TRIGGER_TYPES.indexOf(type) !== -1 && !this.pickerVisible) {
758
- this.pickerVisible = true;
759
- }
760
- this.$emit('focus', this);
761
- },
762
-
763
- handleKeydown(event) {
764
- const keyCode = event.keyCode;
765
-
766
- // ESC
767
- if (keyCode === 27) {
768
- this.pickerVisible = false;
769
- event.stopPropagation();
770
- return;
771
- }
772
-
773
- // Tab
774
- if (keyCode === 9) {
775
- if (!this.ranged) {
776
- this.handleChange();
777
- this.pickerVisible = this.picker.visible = false;
778
- this.blur();
779
- event.stopPropagation();
780
- } else {
781
- // user may change focus between two input
782
- setTimeout(() => {
783
- if (this.refInput.indexOf(document.activeElement) === -1) {
784
- this.pickerVisible = false;
785
- this.blur();
786
- event.stopPropagation();
787
- }
788
- }, 0);
789
- }
790
- return;
791
- }
792
-
793
- // Enter
794
- if (keyCode === 13) {
795
- if (this.userInput === '' || this.isValidValue(this.parseString(this.displayValue))) {
796
- this.handleChange();
797
- this.pickerVisible = this.picker.visible = false;
798
- this.blur();
799
- }
800
- event.stopPropagation();
801
- return;
802
- }
803
-
804
- // if user is typing, do not let picker handle key input
805
- if (this.userInput) {
806
- event.stopPropagation();
807
- return;
808
- }
809
-
810
- // delegate other keys to panel
811
- if (this.picker && this.picker.handleKeydown) {
812
- this.picker.handleKeydown(event);
813
- }
814
- },
815
-
816
- handleRangeClick() {
817
- const type = this.type;
818
-
819
- if (HAVE_TRIGGER_TYPES.indexOf(type) !== -1 && !this.pickerVisible) {
820
- this.pickerVisible = true;
821
- }
822
- this.$emit('focus', this);
823
- },
824
-
825
- hidePicker() {
826
- if (this.picker) {
827
- this.picker.resetView && this.picker.resetView();
828
- this.pickerVisible = this.picker.visible = false;
829
- this.destroyPopper();
830
- }
831
- },
832
-
833
- showPicker() {
834
- if (this.$isServer) return;
835
- if (!this.picker) {
836
- this.mountPicker();
837
- }
838
- this.pickerVisible = this.picker.visible = true;
839
-
840
- this.updatePopper();
841
-
842
- this.picker.value = this.parsedValue;
843
- this.picker.resetView && this.picker.resetView();
844
-
845
- this.$nextTick(() => {
846
- this.picker.adjustSpinners && this.picker.adjustSpinners();
847
- });
848
- },
849
-
850
- mountPicker() {
851
- this.picker = new Vue(this.panel).$mount();
852
- this.picker.defaultValue = this.defaultValue;
853
- this.picker.defaultTime = this.defaultTime;
854
- this.picker.popperClass = this.popperClass;
855
- this.popperElm = this.picker.$el;
856
- this.picker.width = this.reference.getBoundingClientRect().width;
857
- this.picker.showTime = this.type === 'datetime' || this.type === 'datetimerange';
858
- this.picker.selectionMode = this.selectionMode;
859
- this.picker.unlinkPanels = this.unlinkPanels;
860
- this.picker.arrowControl = this.arrowControl || this.timeArrowControl || false;
861
- this.$watch('format', (format) => {
862
- this.picker.format = format;
863
- });
864
-
865
- const updateOptions = () => {
866
- const options = this.pickerOptions;
867
-
868
- if (options && options.selectableRange) {
869
- let ranges = options.selectableRange;
870
- const parser = TYPE_VALUE_RESOLVER_MAP.datetimerange.parser;
871
- const format = DEFAULT_FORMATS.timerange;
872
-
873
- ranges = Array.isArray(ranges) ? ranges : [ranges];
874
- this.picker.selectableRange = ranges.map(range => parser(range, format, this.rangeSeparator));
875
- }
876
-
877
- for (const option in options) {
878
- if (options.hasOwnProperty(option) &&
879
- // 忽略 time-picker 的该配置项
880
- option !== 'selectableRange') {
881
- this.picker[option] = options[option];
882
- }
883
- }
884
-
885
- // main format must prevail over undocumented pickerOptions.format
886
- if (this.format) {
887
- this.picker.format = this.format;
888
- }
889
- };
890
- updateOptions();
891
- this.unwatchPickerOptions = this.$watch('pickerOptions', () => updateOptions(), { deep: true });
892
- this.$el.appendChild(this.picker.$el);
893
- this.picker.resetView && this.picker.resetView();
894
-
895
- this.picker.$on('dodestroy', this.doDestroy);
896
- this.picker.$on('pick', (date = '', visible = false) => {
897
- this.userInput = null;
898
- this.pickerVisible = this.picker.visible = visible;
899
- this.emitInput(date);
900
- this.picker.resetView && this.picker.resetView();
901
- });
902
-
903
- this.picker.$on('select-range', (start, end, pos) => {
904
- if (this.refInput.length === 0) return;
905
- if (!pos || pos === 'min') {
906
- this.refInput[0].setSelectionRange(start, end);
907
- this.refInput[0].focus();
908
- } else if (pos === 'max') {
909
- this.refInput[1].setSelectionRange(start, end);
910
- this.refInput[1].focus();
911
- }
912
- });
913
- },
914
-
915
- unmountPicker() {
916
- if (this.picker) {
917
- this.picker.$destroy();
918
- this.picker.$off();
919
- if (typeof this.unwatchPickerOptions === 'function') {
920
- this.unwatchPickerOptions();
921
- }
922
- this.picker.$el.parentNode.removeChild(this.picker.$el);
923
- }
924
- },
925
-
926
- emitChange(val) {
927
- // determine user real change only
928
- if (!valueEquals(val, this.valueOnOpen)) {
929
- this.$emit('change', val);
930
- this.valueOnOpen = val;
931
- if (this.validateEvent) {
932
- this.dispatch('ElFormItem', 'el.form.change', val);
933
- }
934
- }
935
- },
936
-
937
- emitInput(val) {
938
- const formatted = this.formatToValue(val);
939
- if (!valueEquals(this.value, formatted)) {
940
- this.$emit('input', formatted);
941
- }
942
- },
943
-
944
- isValidValue(value) {
945
- if (!this.picker) {
946
- this.mountPicker();
947
- }
948
- if (this.picker.isValidValue) {
949
- return value && this.picker.isValidValue(value);
950
- } else {
951
- return true;
952
- }
953
- }
954
- }
955
- };
956
- </script>
1
+ <template>
2
+ <el-input
3
+ class="el-date-editor"
4
+ :class="'el-date-editor--' + type"
5
+ :readonly="!editable || readonly || type === 'dates' || type === 'week' || type === 'years' || type === 'months'"
6
+ :disabled="pickerDisabled"
7
+ :size="pickerSize"
8
+ :name="name"
9
+ v-bind="firstInputId"
10
+ v-if="!ranged"
11
+ v-clickoutside="handleClose"
12
+ :placeholder="placeholder"
13
+ @focus="handleFocus"
14
+ @keydown.native="handleKeydown"
15
+ :value="displayValue"
16
+ @input="value => userInput = value"
17
+ @change="handleChange"
18
+ @mouseenter.native="handleMouseEnter"
19
+ @mouseleave.native="showClose = false"
20
+ :validateEvent="false"
21
+ ref="reference">
22
+ <i slot="prefix"
23
+ class="el-input__icon"
24
+ :class="triggerClass"
25
+ @click="handleFocus">
26
+ </i>
27
+ <i slot="suffix"
28
+ class="el-input__icon"
29
+ @click="handleClickIcon"
30
+ :class="[showClose ? '' + clearIcon : '']"
31
+ v-if="haveTrigger">
32
+ </i>
33
+ </el-input>
34
+ <div
35
+ class="el-date-editor el-range-editor el-input__inner"
36
+ :class="[
37
+ 'el-date-editor--' + type,
38
+ pickerSize ? `el-range-editor--${ pickerSize }` : '',
39
+ pickerDisabled ? 'is-disabled' : '',
40
+ pickerVisible ? 'is-active' : ''
41
+ ]"
42
+ @click="handleRangeClick"
43
+ @mouseenter="handleMouseEnter"
44
+ @mouseleave="showClose = false"
45
+ @keydown="handleKeydown"
46
+ ref="reference"
47
+ v-clickoutside="handleClose"
48
+ v-else>
49
+ <i :class="['el-input__icon', 'el-range__icon', triggerClass]"></i>
50
+ <input
51
+ autocomplete="off"
52
+ :placeholder="startPlaceholder"
53
+ :value="displayValue && displayValue[0]"
54
+ :disabled="pickerDisabled"
55
+ v-bind="firstInputId"
56
+ :readonly="!editable || readonly"
57
+ :name="name && name[0]"
58
+ @input="handleStartInput"
59
+ @change="handleStartChange"
60
+ @focus="handleFocus"
61
+ class="el-range-input">
62
+ <slot name="range-separator">
63
+ <span class="el-range-separator">{{ rangeSeparator }}</span>
64
+ </slot>
65
+ <input
66
+ autocomplete="off"
67
+ :placeholder="endPlaceholder"
68
+ :value="displayValue && displayValue[1]"
69
+ :disabled="pickerDisabled"
70
+ v-bind="secondInputId"
71
+ :readonly="!editable || readonly"
72
+ :name="name && name[1]"
73
+ @input="handleEndInput"
74
+ @change="handleEndChange"
75
+ @focus="handleFocus"
76
+ class="el-range-input">
77
+ <i
78
+ @click="handleClickIcon"
79
+ v-if="haveTrigger"
80
+ :class="[showClose ? '' + clearIcon : '']"
81
+ class="el-input__icon el-range__close-icon">
82
+ </i>
83
+ </div>
84
+ </template>
85
+
86
+ <script>
87
+ import Vue from 'vue';
88
+ import Clickoutside from 'element-sim/src/utils/clickoutside';
89
+ import { formatDate, parseDate, isDateObject, getWeekNumber } from 'element-sim/src/utils/date-util';
90
+ import Popper from 'element-sim/src/utils/vue-popper';
91
+ import Emitter from 'element-sim/src/mixins/emitter';
92
+ import ElInput from 'element-sim/packages/input';
93
+ import merge from 'element-sim/src/utils/merge';
94
+
95
+ const NewPopper = {
96
+ props: {
97
+ appendToBody: Popper.props.appendToBody,
98
+ offset: Popper.props.offset,
99
+ boundariesPadding: Popper.props.boundariesPadding,
100
+ arrowOffset: Popper.props.arrowOffset,
101
+ transformOrigin: Popper.props.transformOrigin
102
+ },
103
+ methods: Popper.methods,
104
+ data() {
105
+ return merge({ visibleArrow: true }, Popper.data);
106
+ },
107
+ beforeDestroy: Popper.beforeDestroy
108
+ };
109
+
110
+ const DEFAULT_FORMATS = {
111
+ date: 'yyyy-MM-dd',
112
+ month: 'yyyy-MM',
113
+ months: 'yyyy-MM',
114
+ datetime: 'yyyy-MM-dd HH:mm:ss',
115
+ time: 'HH:mm:ss',
116
+ week: 'yyyywWW',
117
+ timerange: 'HH:mm:ss',
118
+ daterange: 'yyyy-MM-dd',
119
+ monthrange: 'yyyy-MM',
120
+ datetimerange: 'yyyy-MM-dd HH:mm:ss',
121
+ year: 'yyyy',
122
+ years: 'yyyy'
123
+ };
124
+ const HAVE_TRIGGER_TYPES = [
125
+ 'date',
126
+ 'datetime',
127
+ 'time',
128
+ 'time-select',
129
+ 'week',
130
+ 'month',
131
+ 'year',
132
+ 'daterange',
133
+ 'monthrange',
134
+ 'timerange',
135
+ 'datetimerange',
136
+ 'dates',
137
+ 'months',
138
+ 'years'
139
+ ];
140
+ const DATE_FORMATTER = function(value, format) {
141
+ if (format === 'timestamp') return value.getTime();
142
+ return formatDate(value, format);
143
+ };
144
+ const DATE_PARSER = function(text, format) {
145
+ if (format === 'timestamp') return new Date(Number(text));
146
+ return parseDate(text, format);
147
+ };
148
+ const RANGE_FORMATTER = function(value, format) {
149
+ if (Array.isArray(value) && value.length === 2) {
150
+ const start = value[0];
151
+ const end = value[1];
152
+
153
+ if (start && end) {
154
+ return [DATE_FORMATTER(start, format), DATE_FORMATTER(end, format)];
155
+ }
156
+ }
157
+ return '';
158
+ };
159
+ const RANGE_PARSER = function(array, format, separator) {
160
+ if (!Array.isArray(array)) {
161
+ array = array.split(separator);
162
+ }
163
+ if (array.length === 2) {
164
+ const range1 = array[0];
165
+ const range2 = array[1];
166
+
167
+ return [DATE_PARSER(range1, format), DATE_PARSER(range2, format)];
168
+ }
169
+ return [];
170
+ };
171
+ const TYPE_VALUE_RESOLVER_MAP = {
172
+ default: {
173
+ formatter(value) {
174
+ if (!value) return '';
175
+ return '' + value;
176
+ },
177
+ parser(text) {
178
+ if (text === undefined || text === '') return null;
179
+ return text;
180
+ }
181
+ },
182
+ week: {
183
+ formatter(value, format) {
184
+ let week = getWeekNumber(value);
185
+ let month = value.getMonth();
186
+ const trueDate = new Date(value);
187
+ if (week === 1 && month === 11) {
188
+ trueDate.setHours(0, 0, 0, 0);
189
+ trueDate.setDate(trueDate.getDate() + 3 - (trueDate.getDay() + 6) % 7);
190
+ }
191
+ let date = formatDate(trueDate, format);
192
+
193
+ date = /WW/.test(date)
194
+ ? date.replace(/WW/, week < 10 ? '0' + week : week)
195
+ : date.replace(/W/, week);
196
+ return date;
197
+ },
198
+ parser(text, format) {
199
+ // parse as if a normal date
200
+ return TYPE_VALUE_RESOLVER_MAP.date.parser(text, format);
201
+ }
202
+ },
203
+ date: {
204
+ formatter: DATE_FORMATTER,
205
+ parser: DATE_PARSER
206
+ },
207
+ datetime: {
208
+ formatter: DATE_FORMATTER,
209
+ parser: DATE_PARSER
210
+ },
211
+ daterange: {
212
+ formatter: RANGE_FORMATTER,
213
+ parser: RANGE_PARSER
214
+ },
215
+ monthrange: {
216
+ formatter: RANGE_FORMATTER,
217
+ parser: RANGE_PARSER
218
+ },
219
+ datetimerange: {
220
+ formatter: RANGE_FORMATTER,
221
+ parser: RANGE_PARSER
222
+ },
223
+ timerange: {
224
+ formatter: RANGE_FORMATTER,
225
+ parser: RANGE_PARSER
226
+ },
227
+ time: {
228
+ formatter: DATE_FORMATTER,
229
+ parser: DATE_PARSER
230
+ },
231
+ month: {
232
+ formatter: DATE_FORMATTER,
233
+ parser: DATE_PARSER
234
+ },
235
+ year: {
236
+ formatter: DATE_FORMATTER,
237
+ parser: DATE_PARSER
238
+ },
239
+ number: {
240
+ formatter(value) {
241
+ if (!value) return '';
242
+ return '' + value;
243
+ },
244
+ parser(text) {
245
+ let result = Number(text);
246
+
247
+ if (!isNaN(text)) {
248
+ return result;
249
+ } else {
250
+ return null;
251
+ }
252
+ }
253
+ },
254
+ dates: {
255
+ formatter(value, format) {
256
+ return value.map(date => DATE_FORMATTER(date, format));
257
+ },
258
+ parser(value, format) {
259
+ return (typeof value === 'string' ? value.split(', ') : value)
260
+ .map(date => date instanceof Date ? date : DATE_PARSER(date, format));
261
+ }
262
+ },
263
+ months: {
264
+ formatter(value, format) {
265
+ return value.map(date => DATE_FORMATTER(date, format));
266
+ },
267
+ parser(value, format) {
268
+ return (typeof value === 'string' ? value.split(', ') : value)
269
+ .map(date => date instanceof Date ? date : DATE_PARSER(date, format));
270
+ }
271
+ },
272
+ years: {
273
+ formatter(value, format) {
274
+ return value.map(date => DATE_FORMATTER(date, format));
275
+ },
276
+ parser(value, format) {
277
+ return (typeof value === 'string' ? value.split(', ') : value)
278
+ .map(date => date instanceof Date ? date : DATE_PARSER(date, format));
279
+ }
280
+ }
281
+ };
282
+ const PLACEMENT_MAP = {
283
+ left: 'bottom-start',
284
+ center: 'bottom',
285
+ right: 'bottom-end'
286
+ };
287
+
288
+ const parseAsFormatAndType = (value, customFormat, type, rangeSeparator = '-') => {
289
+ if (!value) return null;
290
+ const parser = (
291
+ TYPE_VALUE_RESOLVER_MAP[type] ||
292
+ TYPE_VALUE_RESOLVER_MAP['default']
293
+ ).parser;
294
+ const format = customFormat || DEFAULT_FORMATS[type];
295
+ return parser(value, format, rangeSeparator);
296
+ };
297
+
298
+ const formatAsFormatAndType = (value, customFormat, type) => {
299
+ if (!value) return null;
300
+ const formatter = (
301
+ TYPE_VALUE_RESOLVER_MAP[type] ||
302
+ TYPE_VALUE_RESOLVER_MAP['default']
303
+ ).formatter;
304
+ const format = customFormat || DEFAULT_FORMATS[type];
305
+ return formatter(value, format);
306
+ };
307
+
308
+ /*
309
+ * Considers:
310
+ * 1. Date object
311
+ * 2. date string
312
+ * 3. array of 1 or 2
313
+ */
314
+ const valueEquals = function(a, b) {
315
+ // considers Date object and string
316
+ const dateEquals = function(a, b) {
317
+ const aIsDate = a instanceof Date;
318
+ const bIsDate = b instanceof Date;
319
+ if (aIsDate && bIsDate) {
320
+ return a.getTime() === b.getTime();
321
+ }
322
+ if (!aIsDate && !bIsDate) {
323
+ return a === b;
324
+ }
325
+ return false;
326
+ };
327
+
328
+ const aIsArray = a instanceof Array;
329
+ const bIsArray = b instanceof Array;
330
+ if (aIsArray && bIsArray) {
331
+ if (a.length !== b.length) {
332
+ return false;
333
+ }
334
+ return a.every((item, index) => dateEquals(item, b[index]));
335
+ }
336
+ if (!aIsArray && !bIsArray) {
337
+ return dateEquals(a, b);
338
+ }
339
+ return false;
340
+ };
341
+
342
+ const isString = function(val) {
343
+ return typeof val === 'string' || val instanceof String;
344
+ };
345
+
346
+ const validator = function(val) {
347
+ // either: String, Array of String, null / undefined
348
+ return (
349
+ val === null ||
350
+ val === undefined ||
351
+ isString(val) ||
352
+ (Array.isArray(val) && val.length === 2 && val.every(isString))
353
+ );
354
+ };
355
+
356
+ export default {
357
+ mixins: [Emitter, NewPopper],
358
+
359
+ inject: {
360
+ elForm: {
361
+ default: ''
362
+ },
363
+ elFormItem: {
364
+ default: ''
365
+ }
366
+ },
367
+
368
+ props: {
369
+ size: String,
370
+ format: String,
371
+ valueFormat: String,
372
+ readonly: Boolean,
373
+ placeholder: String,
374
+ startPlaceholder: String,
375
+ endPlaceholder: String,
376
+ prefixIcon: String,
377
+ clearIcon: {
378
+ type: String,
379
+ default: 'el-icon-circle-close'
380
+ },
381
+ name: {
382
+ default: '',
383
+ validator
384
+ },
385
+ disabled: Boolean,
386
+ clearable: {
387
+ type: Boolean,
388
+ default: true
389
+ },
390
+ id: {
391
+ default: '',
392
+ validator
393
+ },
394
+ popperClass: String,
395
+ editable: {
396
+ type: Boolean,
397
+ default: true
398
+ },
399
+ align: {
400
+ type: String,
401
+ default: 'left'
402
+ },
403
+ value: {},
404
+ defaultValue: {},
405
+ defaultTime: {},
406
+ rangeSeparator: {
407
+ default: '-'
408
+ },
409
+ pickerOptions: {},
410
+ unlinkPanels: Boolean,
411
+ validateEvent: {
412
+ type: Boolean,
413
+ default: true
414
+ }
415
+ },
416
+
417
+ components: { ElInput },
418
+
419
+ directives: { Clickoutside },
420
+
421
+ data() {
422
+ return {
423
+ pickerVisible: false,
424
+ showClose: false,
425
+ userInput: null,
426
+ valueOnOpen: null, // value when picker opens, used to determine whether to emit change
427
+ unwatchPickerOptions: null
428
+ };
429
+ },
430
+
431
+ watch: {
432
+ pickerVisible(val) {
433
+ if (this.readonly || this.pickerDisabled) return;
434
+ if (val) {
435
+ this.showPicker();
436
+ this.valueOnOpen = Array.isArray(this.value) ? [...this.value] : this.value;
437
+ } else {
438
+ this.hidePicker();
439
+ this.emitChange(this.value);
440
+ this.userInput = null;
441
+ if (this.validateEvent) {
442
+ this.dispatch('ElFormItem', 'el.form.blur');
443
+ }
444
+ this.$emit('blur', this);
445
+ this.blur();
446
+ }
447
+ },
448
+ parsedValue: {
449
+ immediate: true,
450
+ handler(val) {
451
+ if (this.picker) {
452
+ this.picker.value = val;
453
+ }
454
+ }
455
+ },
456
+ defaultValue(val) {
457
+ // NOTE: should eventually move to jsx style picker + panel ?
458
+ if (this.picker) {
459
+ this.picker.defaultValue = val;
460
+ }
461
+ },
462
+ value(val, oldVal) {
463
+ if (!valueEquals(val, oldVal) && !this.pickerVisible && this.validateEvent) {
464
+ this.dispatch('ElFormItem', 'el.form.change', val);
465
+ }
466
+ }
467
+ },
468
+
469
+ computed: {
470
+ ranged() {
471
+ return this.type.indexOf('range') > -1;
472
+ },
473
+
474
+ reference() {
475
+ const reference = this.$refs.reference;
476
+ return reference.$el || reference;
477
+ },
478
+
479
+ refInput() {
480
+ if (this.reference) {
481
+ return [].slice.call(this.reference.querySelectorAll('input'));
482
+ }
483
+ return [];
484
+ },
485
+
486
+ valueIsEmpty() {
487
+ const val = this.value;
488
+ if (Array.isArray(val)) {
489
+ for (let i = 0, len = val.length; i < len; i++) {
490
+ if (val[i]) {
491
+ return false;
492
+ }
493
+ }
494
+ } else {
495
+ if (val) {
496
+ return false;
497
+ }
498
+ }
499
+ return true;
500
+ },
501
+
502
+ triggerClass() {
503
+ return this.prefixIcon || (this.type.indexOf('time') !== -1 ? 'el-icon-time' : 'el-icon-date');
504
+ },
505
+
506
+ selectionMode() {
507
+ if (this.type === 'week') {
508
+ return 'week';
509
+ } else if (this.type === 'month') {
510
+ return 'month';
511
+ } else if (this.type === 'year') {
512
+ return 'year';
513
+ } else if (this.type === 'dates') {
514
+ return 'dates';
515
+ } else if (this.type === 'months') {
516
+ return 'months';
517
+ } else if (this.type === 'years') {
518
+ return 'years';
519
+ }
520
+
521
+ return 'day';
522
+ },
523
+
524
+ haveTrigger() {
525
+ if (typeof this.showTrigger !== 'undefined') {
526
+ return this.showTrigger;
527
+ }
528
+ return HAVE_TRIGGER_TYPES.indexOf(this.type) !== -1;
529
+ },
530
+
531
+ displayValue() {
532
+ const formattedValue = formatAsFormatAndType(this.parsedValue, this.format, this.type, this.rangeSeparator);
533
+ if (Array.isArray(this.userInput)) {
534
+ return [
535
+ this.userInput[0] || (formattedValue && formattedValue[0]) || '',
536
+ this.userInput[1] || (formattedValue && formattedValue[1]) || ''
537
+ ];
538
+ } else if (this.userInput !== null) {
539
+ return this.userInput;
540
+ } else if (formattedValue) {
541
+ return (this.type === 'dates' || this.type === 'years' || this.type === 'months')
542
+ ? formattedValue.join(', ')
543
+ : formattedValue;
544
+ } else {
545
+ return '';
546
+ }
547
+ },
548
+
549
+ parsedValue() {
550
+ if (!this.value) return this.value; // component value is not set
551
+ if (this.type === 'time-select') return this.value; // time-select does not require parsing, this might change in next major version
552
+
553
+ const valueIsDateObject = isDateObject(this.value) || (Array.isArray(this.value) && this.value.every(isDateObject));
554
+ if (valueIsDateObject) {
555
+ return this.value;
556
+ }
557
+
558
+ if (this.valueFormat) {
559
+ return parseAsFormatAndType(this.value, this.valueFormat, this.type, this.rangeSeparator) || this.value;
560
+ }
561
+
562
+ // NOTE: deal with common but incorrect usage, should remove in next major version
563
+ // user might provide string / timestamp without value-format, coerce them into date (or array of date)
564
+ return Array.isArray(this.value) ? this.value.map(val => new Date(val)) : new Date(this.value);
565
+ },
566
+
567
+ _elFormItemSize() {
568
+ return (this.elFormItem || {}).elFormItemSize;
569
+ },
570
+
571
+ pickerSize() {
572
+ return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
573
+ },
574
+
575
+ pickerDisabled() {
576
+ return this.disabled || (this.elForm || {}).disabled;
577
+ },
578
+
579
+ firstInputId() {
580
+ const obj = {};
581
+ let id;
582
+ if (this.ranged) {
583
+ id = this.id && this.id[0];
584
+ } else {
585
+ id = this.id;
586
+ }
587
+ if (id) obj.id = id;
588
+ return obj;
589
+ },
590
+
591
+ secondInputId() {
592
+ const obj = {};
593
+ let id;
594
+ if (this.ranged) {
595
+ id = this.id && this.id[1];
596
+ }
597
+ if (id) obj.id = id;
598
+ return obj;
599
+ }
600
+ },
601
+
602
+ created() {
603
+ // vue-popper
604
+ this.popperOptions = {
605
+ boundariesPadding: 0,
606
+ gpuAcceleration: false
607
+ };
608
+ this.placement = PLACEMENT_MAP[this.align] || PLACEMENT_MAP.left;
609
+
610
+ this.$on('fieldReset', this.handleFieldReset);
611
+ },
612
+
613
+ methods: {
614
+ focus() {
615
+ if (!this.ranged) {
616
+ this.$refs.reference.focus();
617
+ } else {
618
+ this.handleFocus();
619
+ }
620
+ },
621
+
622
+ blur() {
623
+ this.refInput.forEach(input => input.blur());
624
+ },
625
+
626
+ // {parse, formatTo} Value deals maps component value with internal Date
627
+ parseValue(value) {
628
+ const isParsed = isDateObject(value) || (Array.isArray(value) && value.every(isDateObject));
629
+ if (this.valueFormat && !isParsed) {
630
+ return parseAsFormatAndType(value, this.valueFormat, this.type, this.rangeSeparator) || value;
631
+ } else {
632
+ return value;
633
+ }
634
+ },
635
+
636
+ formatToValue(date) {
637
+ const isFormattable = isDateObject(date) || (Array.isArray(date) && date.every(isDateObject));
638
+ if (this.valueFormat && isFormattable) {
639
+ return formatAsFormatAndType(date, this.valueFormat, this.type, this.rangeSeparator);
640
+ } else {
641
+ return date;
642
+ }
643
+ },
644
+
645
+ // {parse, formatTo} String deals with user input
646
+ parseString(value) {
647
+ const type = Array.isArray(value) ? this.type : this.type.replace('range', '');
648
+ return parseAsFormatAndType(value, this.format, type);
649
+ },
650
+
651
+ formatToString(value) {
652
+ const type = Array.isArray(value) ? this.type : this.type.replace('range', '');
653
+ return formatAsFormatAndType(value, this.format, type);
654
+ },
655
+
656
+ handleMouseEnter() {
657
+ if (this.readonly || this.pickerDisabled) return;
658
+ if (!this.valueIsEmpty && this.clearable) {
659
+ this.showClose = true;
660
+ }
661
+ },
662
+
663
+ handleChange() {
664
+ if (this.userInput) {
665
+ const value = this.parseString(this.displayValue);
666
+ if (value) {
667
+ this.picker.value = value;
668
+ if (this.isValidValue(value)) {
669
+ this.emitInput(value);
670
+ this.userInput = null;
671
+ }
672
+ }
673
+ }
674
+ if (this.userInput === '') {
675
+ this.emitInput(null);
676
+ this.emitChange(null);
677
+ this.userInput = null;
678
+ }
679
+ },
680
+
681
+ handleStartInput(event) {
682
+ if (this.userInput) {
683
+ this.userInput = [event.target.value, this.userInput[1]];
684
+ } else {
685
+ this.userInput = [event.target.value, null];
686
+ }
687
+ },
688
+
689
+ handleEndInput(event) {
690
+ if (this.userInput) {
691
+ this.userInput = [this.userInput[0], event.target.value];
692
+ } else {
693
+ this.userInput = [null, event.target.value];
694
+ }
695
+ },
696
+
697
+ handleStartChange(event) {
698
+ const value = this.parseString(this.userInput && this.userInput[0]);
699
+ if (value) {
700
+ this.userInput = [this.formatToString(value), this.displayValue[1]];
701
+ const newValue = [value, this.picker.value && this.picker.value[1]];
702
+ this.picker.value = newValue;
703
+ if (this.isValidValue(newValue)) {
704
+ this.emitInput(newValue);
705
+ this.userInput = null;
706
+ }
707
+ }
708
+ },
709
+
710
+ handleEndChange(event) {
711
+ const value = this.parseString(this.userInput && this.userInput[1]);
712
+ if (value) {
713
+ this.userInput = [this.displayValue[0], this.formatToString(value)];
714
+ const newValue = [this.picker.value && this.picker.value[0], value];
715
+ this.picker.value = newValue;
716
+ if (this.isValidValue(newValue)) {
717
+ this.emitInput(newValue);
718
+ this.userInput = null;
719
+ }
720
+ }
721
+ },
722
+
723
+ handleClickIcon(event) {
724
+ if (this.readonly || this.pickerDisabled) return;
725
+ if (this.showClose) {
726
+ this.valueOnOpen = this.value;
727
+ event.stopPropagation();
728
+ this.emitInput(null);
729
+ this.emitChange(null);
730
+ this.showClose = false;
731
+ if (this.picker && typeof this.picker.handleClear === 'function') {
732
+ this.picker.handleClear();
733
+ }
734
+ } else {
735
+ this.pickerVisible = !this.pickerVisible;
736
+ }
737
+ },
738
+
739
+ handleClose() {
740
+ if (!this.pickerVisible) return;
741
+ this.pickerVisible = false;
742
+
743
+ if (this.type === 'dates' || this.type === 'years' || this.type === 'months') {
744
+ // restore to former value
745
+ const oldValue = parseAsFormatAndType(this.valueOnOpen, this.valueFormat, this.type, this.rangeSeparator) || this.valueOnOpen;
746
+ this.emitInput(oldValue);
747
+ }
748
+ },
749
+
750
+ handleFieldReset(initialValue) {
751
+ this.userInput = initialValue === '' ? null : initialValue;
752
+ },
753
+
754
+ handleFocus() {
755
+ const type = this.type;
756
+
757
+ if (HAVE_TRIGGER_TYPES.indexOf(type) !== -1 && !this.pickerVisible) {
758
+ this.pickerVisible = true;
759
+ }
760
+ this.$emit('focus', this);
761
+ },
762
+
763
+ handleKeydown(event) {
764
+ const keyCode = event.keyCode;
765
+
766
+ // ESC
767
+ if (keyCode === 27) {
768
+ this.pickerVisible = false;
769
+ event.stopPropagation();
770
+ return;
771
+ }
772
+
773
+ // Tab
774
+ if (keyCode === 9) {
775
+ if (!this.ranged) {
776
+ this.handleChange();
777
+ this.pickerVisible = this.picker.visible = false;
778
+ this.blur();
779
+ event.stopPropagation();
780
+ } else {
781
+ // user may change focus between two input
782
+ setTimeout(() => {
783
+ if (this.refInput.indexOf(document.activeElement) === -1) {
784
+ this.pickerVisible = false;
785
+ this.blur();
786
+ event.stopPropagation();
787
+ }
788
+ }, 0);
789
+ }
790
+ return;
791
+ }
792
+
793
+ // Enter
794
+ if (keyCode === 13) {
795
+ if (this.userInput === '' || this.isValidValue(this.parseString(this.displayValue))) {
796
+ this.handleChange();
797
+ this.pickerVisible = this.picker.visible = false;
798
+ this.blur();
799
+ }
800
+ event.stopPropagation();
801
+ return;
802
+ }
803
+
804
+ // if user is typing, do not let picker handle key input
805
+ if (this.userInput) {
806
+ event.stopPropagation();
807
+ return;
808
+ }
809
+
810
+ // delegate other keys to panel
811
+ if (this.picker && this.picker.handleKeydown) {
812
+ this.picker.handleKeydown(event);
813
+ }
814
+ },
815
+
816
+ handleRangeClick() {
817
+ const type = this.type;
818
+
819
+ if (HAVE_TRIGGER_TYPES.indexOf(type) !== -1 && !this.pickerVisible) {
820
+ this.pickerVisible = true;
821
+ }
822
+ this.$emit('focus', this);
823
+ },
824
+
825
+ hidePicker() {
826
+ if (this.picker) {
827
+ this.picker.resetView && this.picker.resetView();
828
+ this.pickerVisible = this.picker.visible = false;
829
+ this.destroyPopper();
830
+ }
831
+ },
832
+
833
+ showPicker() {
834
+ if (this.$isServer) return;
835
+ if (!this.picker) {
836
+ this.mountPicker();
837
+ }
838
+ this.pickerVisible = this.picker.visible = true;
839
+
840
+ this.updatePopper();
841
+
842
+ this.picker.value = this.parsedValue;
843
+ this.picker.resetView && this.picker.resetView();
844
+
845
+ this.$nextTick(() => {
846
+ this.picker.adjustSpinners && this.picker.adjustSpinners();
847
+ });
848
+ },
849
+
850
+ mountPicker() {
851
+ this.picker = new Vue(this.panel).$mount();
852
+ this.picker.defaultValue = this.defaultValue;
853
+ this.picker.defaultTime = this.defaultTime;
854
+ this.picker.popperClass = this.popperClass;
855
+ this.popperElm = this.picker.$el;
856
+ this.picker.width = this.reference.getBoundingClientRect().width;
857
+ this.picker.showTime = this.type === 'datetime' || this.type === 'datetimerange';
858
+ this.picker.selectionMode = this.selectionMode;
859
+ this.picker.unlinkPanels = this.unlinkPanels;
860
+ this.picker.arrowControl = this.arrowControl || this.timeArrowControl || false;
861
+ this.$watch('format', (format) => {
862
+ this.picker.format = format;
863
+ });
864
+
865
+ const updateOptions = () => {
866
+ const options = this.pickerOptions;
867
+
868
+ if (options && options.selectableRange) {
869
+ let ranges = options.selectableRange;
870
+ const parser = TYPE_VALUE_RESOLVER_MAP.datetimerange.parser;
871
+ const format = DEFAULT_FORMATS.timerange;
872
+
873
+ ranges = Array.isArray(ranges) ? ranges : [ranges];
874
+ this.picker.selectableRange = ranges.map(range => parser(range, format, this.rangeSeparator));
875
+ }
876
+
877
+ for (const option in options) {
878
+ if (options.hasOwnProperty(option) &&
879
+ // 忽略 time-picker 的该配置项
880
+ option !== 'selectableRange') {
881
+ this.picker[option] = options[option];
882
+ }
883
+ }
884
+
885
+ // main format must prevail over undocumented pickerOptions.format
886
+ if (this.format) {
887
+ this.picker.format = this.format;
888
+ }
889
+ };
890
+ updateOptions();
891
+ this.unwatchPickerOptions = this.$watch('pickerOptions', () => updateOptions(), { deep: true });
892
+ this.$el.appendChild(this.picker.$el);
893
+ this.picker.resetView && this.picker.resetView();
894
+
895
+ this.picker.$on('dodestroy', this.doDestroy);
896
+ this.picker.$on('pick', (date = '', visible = false) => {
897
+ this.userInput = null;
898
+ this.pickerVisible = this.picker.visible = visible;
899
+ this.emitInput(date);
900
+ this.picker.resetView && this.picker.resetView();
901
+ });
902
+
903
+ this.picker.$on('select-range', (start, end, pos) => {
904
+ if (this.refInput.length === 0) return;
905
+ if (!pos || pos === 'min') {
906
+ this.refInput[0].setSelectionRange(start, end);
907
+ this.refInput[0].focus();
908
+ } else if (pos === 'max') {
909
+ this.refInput[1].setSelectionRange(start, end);
910
+ this.refInput[1].focus();
911
+ }
912
+ });
913
+ },
914
+
915
+ unmountPicker() {
916
+ if (this.picker) {
917
+ this.picker.$destroy();
918
+ this.picker.$off();
919
+ if (typeof this.unwatchPickerOptions === 'function') {
920
+ this.unwatchPickerOptions();
921
+ }
922
+ this.picker.$el.parentNode.removeChild(this.picker.$el);
923
+ }
924
+ },
925
+
926
+ emitChange(val) {
927
+ // determine user real change only
928
+ if (!valueEquals(val, this.valueOnOpen)) {
929
+ this.$emit('change', val);
930
+ this.valueOnOpen = val;
931
+ if (this.validateEvent) {
932
+ this.dispatch('ElFormItem', 'el.form.change', val);
933
+ }
934
+ }
935
+ },
936
+
937
+ emitInput(val) {
938
+ const formatted = this.formatToValue(val);
939
+ if (!valueEquals(this.value, formatted)) {
940
+ this.$emit('input', formatted);
941
+ }
942
+ },
943
+
944
+ isValidValue(value) {
945
+ if (!this.picker) {
946
+ this.mountPicker();
947
+ }
948
+ if (this.picker.isValidValue) {
949
+ return value && this.picker.isValidValue(value);
950
+ } else {
951
+ return true;
952
+ }
953
+ }
954
+ }
955
+ };
956
+ </script>