element-sim 1.1.7 → 1.1.9

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 (697) 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 +27 -22
  5. package/LICENSE +21 -21
  6. package/README.md +148 -148
  7. package/lib/cascader-panel.js +2 -2
  8. package/lib/cascader.js +2 -2
  9. package/lib/date-picker.js +5 -5
  10. package/lib/element-sim.common.js +62 -51
  11. package/lib/index.js +1 -1
  12. package/lib/input.js +14 -3
  13. package/lib/locale/format.js +10 -10
  14. package/lib/menu.js +25 -25
  15. package/lib/mixins/migrating.js +20 -20
  16. package/lib/result.js +8 -8
  17. package/lib/theme-chalk/alert.css +1 -1
  18. package/lib/theme-chalk/autocomplete.css +1 -1
  19. package/lib/theme-chalk/backtop.css +1 -1
  20. package/lib/theme-chalk/badge.css +1 -1
  21. package/lib/theme-chalk/base.css +1 -1
  22. package/lib/theme-chalk/breadcrumb.css +1 -1
  23. package/lib/theme-chalk/button.css +1 -1
  24. package/lib/theme-chalk/calendar.css +1 -1
  25. package/lib/theme-chalk/card.css +1 -1
  26. package/lib/theme-chalk/carousel.css +1 -1
  27. package/lib/theme-chalk/cascader-panel.css +1 -1
  28. package/lib/theme-chalk/cascader.css +1 -1
  29. package/lib/theme-chalk/checkbox.css +1 -1
  30. package/lib/theme-chalk/collapse.css +1 -1
  31. package/lib/theme-chalk/color-picker.css +1 -1
  32. package/lib/theme-chalk/date-picker.css +1 -1
  33. package/lib/theme-chalk/descriptions-item.css +1 -1
  34. package/lib/theme-chalk/descriptions.css +1 -1
  35. package/lib/theme-chalk/dialog.css +1 -1
  36. package/lib/theme-chalk/divider.css +1 -1
  37. package/lib/theme-chalk/dropdown.css +1 -1
  38. package/lib/theme-chalk/empty.css +1 -1
  39. package/lib/theme-chalk/form.css +1 -1
  40. package/lib/theme-chalk/icon.css +1 -1
  41. package/lib/theme-chalk/image.css +1 -1
  42. package/lib/theme-chalk/index.css +1 -1
  43. package/lib/theme-chalk/input-number.css +1 -1
  44. package/lib/theme-chalk/input.css +1 -1
  45. package/lib/theme-chalk/link.css +1 -1
  46. package/lib/theme-chalk/loading.css +1 -1
  47. package/lib/theme-chalk/menu.css +1 -1
  48. package/lib/theme-chalk/message-box.css +1 -1
  49. package/lib/theme-chalk/message.css +1 -1
  50. package/lib/theme-chalk/notification.css +1 -1
  51. package/lib/theme-chalk/option-group.css +1 -1
  52. package/lib/theme-chalk/option.css +1 -1
  53. package/lib/theme-chalk/page-header.css +1 -1
  54. package/lib/theme-chalk/pagination.css +1 -1
  55. package/lib/theme-chalk/popover.css +1 -1
  56. package/lib/theme-chalk/popper.css +1 -1
  57. package/lib/theme-chalk/progress.css +1 -1
  58. package/lib/theme-chalk/radio-button.css +1 -1
  59. package/lib/theme-chalk/radio.css +1 -1
  60. package/lib/theme-chalk/rate.css +1 -1
  61. package/lib/theme-chalk/reset.css +1 -1
  62. package/lib/theme-chalk/result.css +1 -1
  63. package/lib/theme-chalk/scrollbar.css +1 -1
  64. package/lib/theme-chalk/select-dropdown.css +1 -1
  65. package/lib/theme-chalk/select.css +1 -1
  66. package/lib/theme-chalk/slider.css +1 -1
  67. package/lib/theme-chalk/statistic.css +1 -1
  68. package/lib/theme-chalk/step.css +1 -1
  69. package/lib/theme-chalk/switch.css +1 -1
  70. package/lib/theme-chalk/table-column.css +1 -1
  71. package/lib/theme-chalk/table.css +1 -1
  72. package/lib/theme-chalk/tabs.css +1 -1
  73. package/lib/theme-chalk/tag.css +1 -1
  74. package/lib/theme-chalk/time-picker.css +1 -1
  75. package/lib/theme-chalk/time-select.css +1 -1
  76. package/lib/theme-chalk/timeline-item.css +1 -1
  77. package/lib/theme-chalk/tooltip.css +1 -1
  78. package/lib/theme-chalk/transfer.css +1 -1
  79. package/lib/theme-chalk/tree.css +1 -1
  80. package/lib/theme-chalk/upload.css +1 -1
  81. package/lib/time-picker.js +5 -5
  82. package/lib/time-select.js +5 -5
  83. package/lib/utils/after-leave.js +7 -7
  84. package/lib/utils/aria-dialog.js +16 -16
  85. package/lib/utils/aria-utils.js +25 -25
  86. package/lib/utils/clickoutside.js +7 -7
  87. package/lib/utils/date.js +37 -37
  88. package/lib/utils/lodash.js +9292 -9292
  89. package/lib/utils/popper.js +321 -321
  90. package/lib/utils/types.js +3 -3
  91. package/lib/utils/vue-popper.js +7 -7
  92. package/package.json +151 -151
  93. package/packages/alert/index.js +8 -8
  94. package/packages/alert/src/main.vue +94 -94
  95. package/packages/aside/index.js +8 -8
  96. package/packages/aside/src/main.vue +20 -20
  97. package/packages/autocomplete/index.js +8 -8
  98. package/packages/autocomplete/src/autocomplete-suggestions.vue +76 -76
  99. package/packages/autocomplete/src/autocomplete.vue +285 -285
  100. package/packages/avatar/index.js +8 -8
  101. package/packages/avatar/src/main.vue +107 -107
  102. package/packages/backtop/index.js +8 -8
  103. package/packages/backtop/src/main.vue +110 -110
  104. package/packages/badge/index.js +8 -8
  105. package/packages/badge/src/main.vue +53 -53
  106. package/packages/breadcrumb/index.js +8 -8
  107. package/packages/breadcrumb/src/breadcrumb-item.vue +41 -41
  108. package/packages/breadcrumb/src/breadcrumb.vue +34 -34
  109. package/packages/breadcrumb-item/index.js +8 -8
  110. package/packages/button/index.js +8 -8
  111. package/packages/button/src/button-group.vue +10 -10
  112. package/packages/button/src/button.vue +78 -78
  113. package/packages/button-group/index.js +8 -8
  114. package/packages/calendar/index.js +8 -8
  115. package/packages/calendar/src/date-table.vue +200 -200
  116. package/packages/calendar/src/main.vue +280 -280
  117. package/packages/card/index.js +8 -8
  118. package/packages/card/src/main.vue +23 -23
  119. package/packages/carousel/index.js +8 -8
  120. package/packages/carousel/src/item.vue +138 -138
  121. package/packages/carousel/src/main.vue +315 -315
  122. package/packages/carousel-item/index.js +8 -8
  123. package/packages/cascader/index.js +8 -8
  124. package/packages/cascader/src/cascader.vue +663 -663
  125. package/packages/cascader-panel/index.js +8 -8
  126. package/packages/cascader-panel/src/cascader-menu.vue +138 -138
  127. package/packages/cascader-panel/src/cascader-node.vue +246 -246
  128. package/packages/cascader-panel/src/cascader-panel.vue +391 -391
  129. package/packages/cascader-panel/src/node.js +166 -166
  130. package/packages/cascader-panel/src/store.js +58 -58
  131. package/packages/checkbox/index.js +8 -8
  132. package/packages/checkbox/src/checkbox-button.vue +199 -199
  133. package/packages/checkbox/src/checkbox-group.vue +48 -48
  134. package/packages/checkbox/src/checkbox.vue +222 -222
  135. package/packages/checkbox-button/index.js +8 -8
  136. package/packages/checkbox-group/index.js +8 -8
  137. package/packages/col/index.js +9 -9
  138. package/packages/col/src/col.js +71 -71
  139. package/packages/collapse/index.js +9 -9
  140. package/packages/collapse/src/collapse-item.vue +114 -114
  141. package/packages/collapse/src/collapse.vue +73 -73
  142. package/packages/collapse-item/index.js +8 -8
  143. package/packages/color-picker/index.js +8 -8
  144. package/packages/color-picker/src/color.js +317 -317
  145. package/packages/color-picker/src/components/alpha-slider.vue +132 -132
  146. package/packages/color-picker/src/components/hue-slider.vue +123 -123
  147. package/packages/color-picker/src/components/picker-dropdown.vue +121 -121
  148. package/packages/color-picker/src/components/predefine.vue +60 -60
  149. package/packages/color-picker/src/components/sv-panel.vue +100 -100
  150. package/packages/color-picker/src/draggable.js +36 -36
  151. package/packages/color-picker/src/main.vue +188 -188
  152. package/packages/container/index.js +8 -8
  153. package/packages/container/src/main.vue +33 -33
  154. package/packages/date-picker/index.js +8 -8
  155. package/packages/date-picker/src/basic/date-table.vue +441 -441
  156. package/packages/date-picker/src/basic/month-table.vue +269 -269
  157. package/packages/date-picker/src/basic/time-spinner.vue +304 -304
  158. package/packages/date-picker/src/basic/year-table.vue +111 -111
  159. package/packages/date-picker/src/panel/date-range.vue +680 -680
  160. package/packages/date-picker/src/panel/date.vue +609 -609
  161. package/packages/date-picker/src/panel/month-range.vue +289 -289
  162. package/packages/date-picker/src/panel/time-range.vue +248 -248
  163. package/packages/date-picker/src/panel/time-select.vue +178 -178
  164. package/packages/date-picker/src/panel/time.vue +186 -186
  165. package/packages/date-picker/src/picker/date-picker.js +43 -43
  166. package/packages/date-picker/src/picker/time-picker.js +39 -39
  167. package/packages/date-picker/src/picker/time-select.js +21 -21
  168. package/packages/date-picker/src/picker.vue +956 -956
  169. package/packages/descriptions/index.js +8 -8
  170. package/packages/descriptions/src/descriptions-item.js +30 -30
  171. package/packages/descriptions/src/descriptions-row.js +116 -116
  172. package/packages/descriptions/src/index.js +180 -180
  173. package/packages/descriptions-item/index.js +8 -8
  174. package/packages/dialog/index.js +8 -8
  175. package/packages/dialog/src/component.vue +212 -212
  176. package/packages/divider/index.js +8 -8
  177. package/packages/divider/src/main.vue +37 -37
  178. package/packages/drawer/index.js +8 -8
  179. package/packages/drawer/src/main.vue +208 -208
  180. package/packages/dropdown/index.js +8 -8
  181. package/packages/dropdown/src/dropdown-item.vue +37 -37
  182. package/packages/dropdown/src/dropdown-menu.vue +63 -63
  183. package/packages/dropdown/src/dropdown.vue +293 -293
  184. package/packages/dropdown-item/index.js +8 -8
  185. package/packages/dropdown-menu/index.js +8 -8
  186. package/packages/empty/index.js +7 -7
  187. package/packages/empty/src/img-empty.vue +132 -132
  188. package/packages/empty/src/index.vue +50 -50
  189. package/packages/footer/index.js +8 -8
  190. package/packages/footer/src/main.vue +20 -20
  191. package/packages/form/index.js +8 -8
  192. package/packages/form/src/form-item.vue +324 -324
  193. package/packages/form/src/form.vue +182 -182
  194. package/packages/form/src/label-wrap.vue +78 -78
  195. package/packages/form-item/index.js +8 -8
  196. package/packages/header/index.js +8 -8
  197. package/packages/header/src/main.vue +20 -20
  198. package/packages/icon/index.js +8 -8
  199. package/packages/icon/src/icon.vue +13 -13
  200. package/packages/image/index.js +8 -8
  201. package/packages/image/src/image-viewer.vue +330 -330
  202. package/packages/image/src/main.vue +249 -249
  203. package/packages/infinite-scroll/index.js +8 -8
  204. package/packages/infinite-scroll/src/main.js +150 -150
  205. package/packages/input/index.js +8 -8
  206. package/packages/input/src/calcTextareaHeight.js +104 -104
  207. package/packages/input/src/input.vue +444 -440
  208. package/packages/input-number/index.js +8 -8
  209. package/packages/input-number/src/input-number.vue +283 -283
  210. package/packages/link/index.js +8 -8
  211. package/packages/link/src/main.vue +53 -53
  212. package/packages/loading/index.js +11 -11
  213. package/packages/loading/src/directive.js +133 -133
  214. package/packages/loading/src/index.js +106 -106
  215. package/packages/loading/src/loading.vue +41 -41
  216. package/packages/main/index.js +8 -8
  217. package/packages/main/src/main.vue +12 -12
  218. package/packages/menu/index.js +8 -8
  219. package/packages/menu/src/menu-item-group.vue +45 -45
  220. package/packages/menu/src/menu-item.vue +112 -112
  221. package/packages/menu/src/menu-mixin.js +44 -44
  222. package/packages/menu/src/menu.vue +325 -325
  223. package/packages/menu/src/submenu.vue +349 -349
  224. package/packages/menu-item/index.js +8 -8
  225. package/packages/menu-item-group/index.js +8 -8
  226. package/packages/message/index.js +2 -2
  227. package/packages/message/src/main.js +91 -91
  228. package/packages/message/src/main.vue +117 -117
  229. package/packages/message-box/index.js +2 -2
  230. package/packages/message-box/src/main.js +216 -216
  231. package/packages/message-box/src/main.vue +332 -332
  232. package/packages/notification/index.js +2 -2
  233. package/packages/notification/src/main.js +94 -94
  234. package/packages/notification/src/main.vue +152 -152
  235. package/packages/option/index.js +8 -8
  236. package/packages/option-group/index.js +8 -8
  237. package/packages/page-header/index.js +8 -8
  238. package/packages/page-header/src/main.vue +30 -30
  239. package/packages/pagination/index.js +8 -8
  240. package/packages/pagination/src/pager.vue +163 -163
  241. package/packages/pagination/src/pagination.js +386 -386
  242. package/packages/popconfirm/index.js +8 -8
  243. package/packages/popconfirm/src/main.vue +104 -104
  244. package/packages/popover/index.js +14 -14
  245. package/packages/popover/src/directive.js +20 -20
  246. package/packages/popover/src/main.vue +237 -237
  247. package/packages/progress/index.js +8 -8
  248. package/packages/progress/src/progress.vue +235 -235
  249. package/packages/radio/index.js +8 -8
  250. package/packages/radio/src/radio-button.vue +115 -115
  251. package/packages/radio/src/radio-group.vue +113 -113
  252. package/packages/radio/src/radio.vue +134 -134
  253. package/packages/radio-button/index.js +8 -8
  254. package/packages/radio-group/index.js +8 -8
  255. package/packages/rate/index.js +8 -8
  256. package/packages/rate/src/main.vue +348 -348
  257. package/packages/result/index.js +8 -8
  258. package/packages/result/src/icon-error.vue +13 -13
  259. package/packages/result/src/icon-info.vue +13 -13
  260. package/packages/result/src/icon-success.vue +13 -13
  261. package/packages/result/src/icon-warning.vue +13 -13
  262. package/packages/result/src/index.vue +65 -65
  263. package/packages/row/index.js +9 -9
  264. package/packages/row/src/row.js +44 -44
  265. package/packages/scrollbar/index.js +8 -8
  266. package/packages/scrollbar/src/bar.js +92 -92
  267. package/packages/scrollbar/src/main.js +130 -130
  268. package/packages/scrollbar/src/util.js +34 -34
  269. package/packages/select/index.js +8 -8
  270. package/packages/select/src/navigation-mixin.js +54 -54
  271. package/packages/select/src/option-group.vue +60 -60
  272. package/packages/select/src/option.vue +168 -168
  273. package/packages/select/src/select-dropdown.vue +74 -74
  274. package/packages/select/src/select.vue +900 -900
  275. package/packages/skeleton/index.js +8 -8
  276. package/packages/skeleton/src/img-placeholder.vue +16 -16
  277. package/packages/skeleton/src/index.vue +76 -76
  278. package/packages/skeleton/src/item.vue +21 -21
  279. package/packages/skeleton-item/index.js +8 -8
  280. package/packages/slider/index.js +8 -8
  281. package/packages/slider/src/button.vue +238 -238
  282. package/packages/slider/src/main.vue +427 -427
  283. package/packages/slider/src/marker.js +18 -18
  284. package/packages/spinner/index.js +8 -8
  285. package/packages/spinner/src/spinner.vue +27 -27
  286. package/packages/statistic/index.js +8 -8
  287. package/packages/statistic/src/main.vue +204 -204
  288. package/packages/step/index.js +8 -8
  289. package/packages/steps/README.md +69 -69
  290. package/packages/steps/index.js +8 -8
  291. package/packages/steps/src/step.vue +184 -184
  292. package/packages/steps/src/steps.vue +68 -68
  293. package/packages/submenu/index.js +8 -8
  294. package/packages/switch/index.js +9 -9
  295. package/packages/switch/src/component.vue +174 -174
  296. package/packages/tab-pane/index.js +8 -8
  297. package/packages/table/index.js +8 -8
  298. package/packages/table/src/config.js +124 -124
  299. package/packages/table/src/dropdown.js +28 -28
  300. package/packages/table/src/filter-panel.vue +194 -194
  301. package/packages/table/src/layout-observer.js +68 -68
  302. package/packages/table/src/store/current.js +76 -76
  303. package/packages/table/src/store/expand.js +65 -65
  304. package/packages/table/src/store/helper.js +41 -41
  305. package/packages/table/src/store/index.js +147 -147
  306. package/packages/table/src/store/tree.js +209 -209
  307. package/packages/table/src/store/watcher.js +381 -381
  308. package/packages/table/src/table-body.js +469 -469
  309. package/packages/table/src/table-column.js +319 -319
  310. package/packages/table/src/table-footer.js +153 -153
  311. package/packages/table/src/table-header.js +511 -511
  312. package/packages/table/src/table-layout.js +249 -249
  313. package/packages/table/src/table-row.js +101 -101
  314. package/packages/table/src/table.vue +712 -712
  315. package/packages/table/src/util.js +273 -273
  316. package/packages/table-column/index.js +8 -8
  317. package/packages/tabs/index.js +8 -8
  318. package/packages/tabs/src/tab-bar.vue +57 -57
  319. package/packages/tabs/src/tab-nav.vue +294 -294
  320. package/packages/tabs/src/tab-pane.vue +56 -56
  321. package/packages/tabs/src/tabs.vue +191 -191
  322. package/packages/tag/index.js +8 -8
  323. package/packages/tag/src/tag.vue +58 -58
  324. package/packages/theme-chalk/README.md +33 -33
  325. package/packages/theme-chalk/lib/alert.css +1 -1
  326. package/packages/theme-chalk/lib/autocomplete.css +1 -1
  327. package/packages/theme-chalk/lib/backtop.css +1 -1
  328. package/packages/theme-chalk/lib/badge.css +1 -1
  329. package/packages/theme-chalk/lib/base.css +1 -1
  330. package/packages/theme-chalk/lib/breadcrumb.css +1 -1
  331. package/packages/theme-chalk/lib/button.css +1 -1
  332. package/packages/theme-chalk/lib/calendar.css +1 -1
  333. package/packages/theme-chalk/lib/card.css +1 -1
  334. package/packages/theme-chalk/lib/carousel.css +1 -1
  335. package/packages/theme-chalk/lib/cascader-panel.css +1 -1
  336. package/packages/theme-chalk/lib/cascader.css +1 -1
  337. package/packages/theme-chalk/lib/checkbox.css +1 -1
  338. package/packages/theme-chalk/lib/collapse.css +1 -1
  339. package/packages/theme-chalk/lib/color-picker.css +1 -1
  340. package/packages/theme-chalk/lib/date-picker.css +1 -1
  341. package/packages/theme-chalk/lib/descriptions-item.css +1 -1
  342. package/packages/theme-chalk/lib/descriptions.css +1 -1
  343. package/packages/theme-chalk/lib/dialog.css +1 -1
  344. package/packages/theme-chalk/lib/divider.css +1 -1
  345. package/packages/theme-chalk/lib/dropdown.css +1 -1
  346. package/packages/theme-chalk/lib/empty.css +1 -1
  347. package/packages/theme-chalk/lib/form.css +1 -1
  348. package/packages/theme-chalk/lib/icon.css +1 -1
  349. package/packages/theme-chalk/lib/image.css +1 -1
  350. package/packages/theme-chalk/lib/index.css +1 -1
  351. package/packages/theme-chalk/lib/input-number.css +1 -1
  352. package/packages/theme-chalk/lib/input.css +1 -1
  353. package/packages/theme-chalk/lib/link.css +1 -1
  354. package/packages/theme-chalk/lib/loading.css +1 -1
  355. package/packages/theme-chalk/lib/menu.css +1 -1
  356. package/packages/theme-chalk/lib/message-box.css +1 -1
  357. package/packages/theme-chalk/lib/message.css +1 -1
  358. package/packages/theme-chalk/lib/notification.css +1 -1
  359. package/packages/theme-chalk/lib/option-group.css +1 -1
  360. package/packages/theme-chalk/lib/option.css +1 -1
  361. package/packages/theme-chalk/lib/page-header.css +1 -1
  362. package/packages/theme-chalk/lib/pagination.css +1 -1
  363. package/packages/theme-chalk/lib/popover.css +1 -1
  364. package/packages/theme-chalk/lib/popper.css +1 -1
  365. package/packages/theme-chalk/lib/progress.css +1 -1
  366. package/packages/theme-chalk/lib/radio-button.css +1 -1
  367. package/packages/theme-chalk/lib/radio.css +1 -1
  368. package/packages/theme-chalk/lib/rate.css +1 -1
  369. package/packages/theme-chalk/lib/reset.css +1 -1
  370. package/packages/theme-chalk/lib/result.css +1 -1
  371. package/packages/theme-chalk/lib/scrollbar.css +1 -1
  372. package/packages/theme-chalk/lib/select-dropdown.css +1 -1
  373. package/packages/theme-chalk/lib/select.css +1 -1
  374. package/packages/theme-chalk/lib/slider.css +1 -1
  375. package/packages/theme-chalk/lib/statistic.css +1 -1
  376. package/packages/theme-chalk/lib/step.css +1 -1
  377. package/packages/theme-chalk/lib/switch.css +1 -1
  378. package/packages/theme-chalk/lib/table-column.css +1 -1
  379. package/packages/theme-chalk/lib/table.css +1 -1
  380. package/packages/theme-chalk/lib/tabs.css +1 -1
  381. package/packages/theme-chalk/lib/tag.css +1 -1
  382. package/packages/theme-chalk/lib/time-picker.css +1 -1
  383. package/packages/theme-chalk/lib/time-select.css +1 -1
  384. package/packages/theme-chalk/lib/timeline-item.css +1 -1
  385. package/packages/theme-chalk/lib/tooltip.css +1 -1
  386. package/packages/theme-chalk/lib/transfer.css +1 -1
  387. package/packages/theme-chalk/lib/tree.css +1 -1
  388. package/packages/theme-chalk/lib/upload.css +1 -1
  389. package/packages/theme-chalk/package.json +35 -35
  390. package/packages/theme-chalk/src/.DS_Store +0 -0
  391. package/packages/theme-chalk/src/alert.scss +147 -147
  392. package/packages/theme-chalk/src/aside.scss +7 -7
  393. package/packages/theme-chalk/src/autocomplete.scss +80 -80
  394. package/packages/theme-chalk/src/avatar.scss +51 -51
  395. package/packages/theme-chalk/src/backtop.scss +22 -22
  396. package/packages/theme-chalk/src/badge.scss +57 -57
  397. package/packages/theme-chalk/src/base.scss +2 -2
  398. package/packages/theme-chalk/src/breadcrumb.scss +55 -55
  399. package/packages/theme-chalk/src/button.scss +262 -262
  400. package/packages/theme-chalk/src/calendar.scss +79 -79
  401. package/packages/theme-chalk/src/card.scss +32 -32
  402. package/packages/theme-chalk/src/carousel-item.scss +49 -49
  403. package/packages/theme-chalk/src/carousel.scss +161 -161
  404. package/packages/theme-chalk/src/cascader-panel.scss +120 -120
  405. package/packages/theme-chalk/src/cascader.scss +182 -182
  406. package/packages/theme-chalk/src/checkbox.scss +359 -359
  407. package/packages/theme-chalk/src/col.scss +155 -155
  408. package/packages/theme-chalk/src/collapse.scss +63 -63
  409. package/packages/theme-chalk/src/color-picker.scss +384 -384
  410. package/packages/theme-chalk/src/common/popup.scss +42 -42
  411. package/packages/theme-chalk/src/common/transition.scss +98 -98
  412. package/packages/theme-chalk/src/common/var.scss +1030 -1030
  413. package/packages/theme-chalk/src/container.scss +14 -14
  414. package/packages/theme-chalk/src/date-picker/date-picker.scss +97 -97
  415. package/packages/theme-chalk/src/date-picker/date-range-picker.scss +101 -101
  416. package/packages/theme-chalk/src/date-picker/date-table.scss +151 -151
  417. package/packages/theme-chalk/src/date-picker/month-table.scss +82 -82
  418. package/packages/theme-chalk/src/date-picker/picker-panel.scss +117 -117
  419. package/packages/theme-chalk/src/date-picker/picker.scss +197 -197
  420. package/packages/theme-chalk/src/date-picker/time-picker.scss +85 -85
  421. package/packages/theme-chalk/src/date-picker/time-range-picker.scss +31 -31
  422. package/packages/theme-chalk/src/date-picker/time-spinner.scss +110 -110
  423. package/packages/theme-chalk/src/date-picker/year-table.scss +51 -51
  424. package/packages/theme-chalk/src/date-picker.scss +11 -11
  425. package/packages/theme-chalk/src/descriptions-item.scss +42 -42
  426. package/packages/theme-chalk/src/descriptions.scss +111 -111
  427. package/packages/theme-chalk/src/dialog.scss +123 -123
  428. package/packages/theme-chalk/src/display.scss +12 -12
  429. package/packages/theme-chalk/src/divider.scss +46 -46
  430. package/packages/theme-chalk/src/drawer.scss +219 -219
  431. package/packages/theme-chalk/src/dropdown.scss +182 -182
  432. package/packages/theme-chalk/src/empty.scss +45 -45
  433. package/packages/theme-chalk/src/footer.scss +8 -8
  434. package/packages/theme-chalk/src/form.scss +167 -167
  435. package/packages/theme-chalk/src/header.scss +8 -8
  436. package/packages/theme-chalk/src/icon.scss +1342 -1167
  437. package/packages/theme-chalk/src/image.scss +179 -179
  438. package/packages/theme-chalk/src/input-number.scss +180 -180
  439. package/packages/theme-chalk/src/input.scss +360 -360
  440. package/packages/theme-chalk/src/link.scss +81 -81
  441. package/packages/theme-chalk/src/loading.scss +96 -96
  442. package/packages/theme-chalk/src/main.scss +12 -12
  443. package/packages/theme-chalk/src/menu.scss +289 -289
  444. package/packages/theme-chalk/src/message-box.scss +226 -226
  445. package/packages/theme-chalk/src/message.scss +120 -120
  446. package/packages/theme-chalk/src/mixins/_button.scss +81 -81
  447. package/packages/theme-chalk/src/mixins/config.scss +4 -4
  448. package/packages/theme-chalk/src/mixins/function.scss +44 -44
  449. package/packages/theme-chalk/src/mixins/mixins.scss +190 -190
  450. package/packages/theme-chalk/src/mixins/utils.scss +38 -38
  451. package/packages/theme-chalk/src/notification.scss +99 -99
  452. package/packages/theme-chalk/src/option-group.scss +42 -42
  453. package/packages/theme-chalk/src/option.scss +36 -36
  454. package/packages/theme-chalk/src/page-header.scss +41 -41
  455. package/packages/theme-chalk/src/pagination.scss +295 -295
  456. package/packages/theme-chalk/src/popconfirm.scss +16 -16
  457. package/packages/theme-chalk/src/popover.scss +40 -40
  458. package/packages/theme-chalk/src/popper.scss +100 -100
  459. package/packages/theme-chalk/src/progress.scss +141 -141
  460. package/packages/theme-chalk/src/radio-button.scss +113 -113
  461. package/packages/theme-chalk/src/radio-group.scss +9 -9
  462. package/packages/theme-chalk/src/radio.scss +199 -199
  463. package/packages/theme-chalk/src/rate.scss +49 -49
  464. package/packages/theme-chalk/src/reset.scss +79 -79
  465. package/packages/theme-chalk/src/result.scss +61 -61
  466. package/packages/theme-chalk/src/row.scss +43 -43
  467. package/packages/theme-chalk/src/scrollbar.scss +72 -72
  468. package/packages/theme-chalk/src/select-dropdown.scss +62 -62
  469. package/packages/theme-chalk/src/select.scss +152 -152
  470. package/packages/theme-chalk/src/skeleton-item.scss +84 -84
  471. package/packages/theme-chalk/src/skeleton.scss +40 -40
  472. package/packages/theme-chalk/src/slider.scss +250 -250
  473. package/packages/theme-chalk/src/spinner.scss +44 -44
  474. package/packages/theme-chalk/src/statistic.scss +38 -38
  475. package/packages/theme-chalk/src/step.scss +317 -317
  476. package/packages/theme-chalk/src/steps.scss +20 -20
  477. package/packages/theme-chalk/src/switch.scss +116 -116
  478. package/packages/theme-chalk/src/table-column.scss +96 -96
  479. package/packages/theme-chalk/src/table.scss +564 -564
  480. package/packages/theme-chalk/src/tabs.scss +602 -602
  481. package/packages/theme-chalk/src/tag.scss +163 -163
  482. package/packages/theme-chalk/src/time-picker.scss +8 -8
  483. package/packages/theme-chalk/src/time-select.scss +37 -37
  484. package/packages/theme-chalk/src/timeline-item.scss +86 -86
  485. package/packages/theme-chalk/src/timeline.scss +14 -14
  486. package/packages/theme-chalk/src/tooltip.scss +141 -141
  487. package/packages/theme-chalk/src/transfer.scss +227 -227
  488. package/packages/theme-chalk/src/tree.scss +123 -123
  489. package/packages/theme-chalk/src/upload.scss +603 -603
  490. package/packages/time-picker/index.js +8 -8
  491. package/packages/time-select/index.js +8 -8
  492. package/packages/timeline/index.js +8 -8
  493. package/packages/timeline/src/item.vue +73 -73
  494. package/packages/timeline/src/main.vue +33 -33
  495. package/packages/timeline-item/index.js +8 -8
  496. package/packages/tooltip/index.js +8 -8
  497. package/packages/tooltip/src/main.js +242 -242
  498. package/packages/transfer/index.js +8 -8
  499. package/packages/transfer/src/main.vue +231 -231
  500. package/packages/transfer/src/transfer-panel.vue +251 -251
  501. package/packages/tree/index.js +8 -8
  502. package/packages/tree/src/model/node.js +484 -484
  503. package/packages/tree/src/model/tree-store.js +340 -340
  504. package/packages/tree/src/model/util.js +27 -27
  505. package/packages/tree/src/tree-node.vue +279 -279
  506. package/packages/tree/src/tree.vue +496 -496
  507. package/packages/upload/index.js +8 -8
  508. package/packages/upload/src/ajax.js +85 -85
  509. package/packages/upload/src/index.vue +338 -338
  510. package/packages/upload/src/upload-dragger.vue +70 -70
  511. package/packages/upload/src/upload-list.vue +105 -105
  512. package/packages/upload/src/upload.vue +211 -211
  513. package/src/directives/mousewheel.js +18 -18
  514. package/src/directives/repeat-click.js +26 -26
  515. package/src/index.js +259 -259
  516. package/src/locale/format.js +46 -46
  517. package/src/locale/index.js +48 -48
  518. package/src/locale/lang/af-ZA.js +123 -123
  519. package/src/locale/lang/ar.js +122 -122
  520. package/src/locale/lang/az.js +126 -126
  521. package/src/locale/lang/bg.js +123 -123
  522. package/src/locale/lang/bn.js +126 -126
  523. package/src/locale/lang/ca.js +122 -122
  524. package/src/locale/lang/cs-CZ.js +125 -125
  525. package/src/locale/lang/da.js +122 -122
  526. package/src/locale/lang/de.js +124 -124
  527. package/src/locale/lang/ee.js +123 -123
  528. package/src/locale/lang/el.js +123 -123
  529. package/src/locale/lang/en.js +123 -123
  530. package/src/locale/lang/eo.js +123 -123
  531. package/src/locale/lang/es.js +122 -122
  532. package/src/locale/lang/eu.js +123 -123
  533. package/src/locale/lang/fa.js +123 -123
  534. package/src/locale/lang/fi.js +123 -123
  535. package/src/locale/lang/fr.js +122 -122
  536. package/src/locale/lang/he.js +123 -123
  537. package/src/locale/lang/hr.js +123 -123
  538. package/src/locale/lang/hu.js +122 -122
  539. package/src/locale/lang/hy-AM.js +123 -123
  540. package/src/locale/lang/id.js +123 -123
  541. package/src/locale/lang/is.js +124 -124
  542. package/src/locale/lang/it.js +122 -122
  543. package/src/locale/lang/ja.js +123 -123
  544. package/src/locale/lang/kg.js +123 -123
  545. package/src/locale/lang/km.js +123 -123
  546. package/src/locale/lang/ko.js +123 -123
  547. package/src/locale/lang/ku.js +123 -123
  548. package/src/locale/lang/kz.js +123 -123
  549. package/src/locale/lang/lo-LA.js +126 -126
  550. package/src/locale/lang/lt.js +123 -123
  551. package/src/locale/lang/lv.js +123 -123
  552. package/src/locale/lang/mn.js +123 -123
  553. package/src/locale/lang/ms.js +122 -122
  554. package/src/locale/lang/nb-NO.js +122 -122
  555. package/src/locale/lang/nl.js +123 -123
  556. package/src/locale/lang/pl.js +123 -123
  557. package/src/locale/lang/pt-br.js +123 -123
  558. package/src/locale/lang/pt.js +123 -123
  559. package/src/locale/lang/ro.js +123 -123
  560. package/src/locale/lang/ru-RU.js +123 -123
  561. package/src/locale/lang/si.js +123 -123
  562. package/src/locale/lang/sk.js +125 -125
  563. package/src/locale/lang/sl.js +123 -123
  564. package/src/locale/lang/sr-Latn.js +123 -123
  565. package/src/locale/lang/sr.js +123 -123
  566. package/src/locale/lang/sv-SE.js +123 -123
  567. package/src/locale/lang/sw.js +123 -123
  568. package/src/locale/lang/ta.js +122 -122
  569. package/src/locale/lang/th.js +123 -123
  570. package/src/locale/lang/tk.js +123 -123
  571. package/src/locale/lang/tr-TR.js +123 -123
  572. package/src/locale/lang/ua.js +123 -123
  573. package/src/locale/lang/ug-CN.js +123 -123
  574. package/src/locale/lang/uz-UZ.js +123 -123
  575. package/src/locale/lang/vi.js +123 -123
  576. package/src/locale/lang/zh-CN.js +123 -123
  577. package/src/locale/lang/zh-TW.js +123 -123
  578. package/src/mixins/emitter.js +33 -33
  579. package/src/mixins/focus.js +9 -9
  580. package/src/mixins/locale.js +9 -9
  581. package/src/mixins/migrating.js +54 -54
  582. package/src/transitions/collapse-transition.js +77 -77
  583. package/src/utils/after-leave.js +27 -27
  584. package/src/utils/aria-dialog.js +90 -90
  585. package/src/utils/aria-utils.js +122 -122
  586. package/src/utils/clickoutside.js +76 -76
  587. package/src/utils/date-util.js +282 -282
  588. package/src/utils/date.js +368 -368
  589. package/src/utils/dom.js +227 -227
  590. package/src/utils/lodash.js +18075 -18075
  591. package/src/utils/menu/aria-menubar.js +14 -14
  592. package/src/utils/menu/aria-menuitem.js +49 -49
  593. package/src/utils/menu/aria-submenu.js +59 -59
  594. package/src/utils/merge.js +15 -15
  595. package/src/utils/popper.js +1276 -1276
  596. package/src/utils/popup/index.js +218 -218
  597. package/src/utils/popup/popup-manager.js +194 -194
  598. package/src/utils/resize-event.js +36 -36
  599. package/src/utils/scroll-into-view.js +27 -27
  600. package/src/utils/scrollbar-width.js +29 -29
  601. package/src/utils/shared.js +7 -7
  602. package/src/utils/types.js +40 -40
  603. package/src/utils/util.js +245 -245
  604. package/src/utils/vdom.js +5 -5
  605. package/src/utils/vue-popper.js +198 -198
  606. package/types/alert.d.ts +31 -31
  607. package/types/aside.d.ts +7 -7
  608. package/types/autocomplete.d.ts +78 -78
  609. package/types/avatar.d.ts +20 -20
  610. package/types/backtop.d.ts +16 -16
  611. package/types/badge.d.ts +16 -16
  612. package/types/breadcrumb-item.d.ts +10 -10
  613. package/types/breadcrumb.d.ts +10 -10
  614. package/types/button-group.d.ts +4 -4
  615. package/types/button.d.ts +37 -37
  616. package/types/calendar.d.ts +15 -15
  617. package/types/card.d.ts +26 -26
  618. package/types/carousel-item.d.ts +10 -10
  619. package/types/carousel.d.ts +57 -57
  620. package/types/cascader-panel.d.ts +72 -72
  621. package/types/cascader.d.ts +65 -65
  622. package/types/checkbox-button.d.ts +22 -22
  623. package/types/checkbox-group.d.ts +22 -22
  624. package/types/checkbox.d.ts +34 -34
  625. package/types/col.d.ts +46 -46
  626. package/types/collapse-item.d.ts +26 -26
  627. package/types/collapse.d.ts +10 -10
  628. package/types/color-picker.d.ts +21 -21
  629. package/types/component.d.ts +13 -13
  630. package/types/container.d.ts +7 -7
  631. package/types/date-picker.d.ts +124 -124
  632. package/types/descriptions-item.d.ts +37 -37
  633. package/types/descriptions.d.ts +52 -52
  634. package/types/dialog.d.ts +62 -62
  635. package/types/divider.d.ts +12 -12
  636. package/types/drawer.d.ts +63 -63
  637. package/types/dropdown-item.d.ts +16 -16
  638. package/types/dropdown-menu.d.ts +4 -4
  639. package/types/dropdown.d.ts +38 -38
  640. package/types/element-ui.d.ts +381 -381
  641. package/types/empty.d.ts +31 -31
  642. package/types/footer.d.ts +7 -7
  643. package/types/form-item.d.ts +37 -37
  644. package/types/form.d.ts +82 -82
  645. package/types/header.d.ts +7 -7
  646. package/types/icon.d.ts +7 -7
  647. package/types/image.d.ts +43 -43
  648. package/types/index.d.ts +4 -4
  649. package/types/infinite-scroll.d.ts +5 -5
  650. package/types/input-number.d.ts +47 -47
  651. package/types/input.d.ts +107 -107
  652. package/types/link.d.ts +25 -25
  653. package/types/loading.d.ts +62 -62
  654. package/types/main.d.ts +4 -4
  655. package/types/menu-item-group.d.ts +7 -7
  656. package/types/menu-item.d.ts +10 -10
  657. package/types/menu.d.ts +46 -46
  658. package/types/message-box.d.ts +176 -176
  659. package/types/message.d.ts +90 -90
  660. package/types/notification.d.ts +84 -84
  661. package/types/option-group.d.ts +10 -10
  662. package/types/option.d.ts +13 -13
  663. package/types/page-header.d.ts +10 -10
  664. package/types/pagination.d.ts +43 -43
  665. package/types/popconfirm.d.ts +29 -29
  666. package/types/popover.d.ts +71 -71
  667. package/types/progress.d.ts +37 -37
  668. package/types/radio-button.d.ts +16 -16
  669. package/types/radio-group.d.ts +18 -18
  670. package/types/radio.d.ts +19 -19
  671. package/types/rate.d.ts +64 -64
  672. package/types/result.d.ts +33 -33
  673. package/types/row.d.ts +25 -25
  674. package/types/select.d.ts +90 -90
  675. package/types/skeleton-item.d.ts +7 -7
  676. package/types/skeleton.d.ts +33 -33
  677. package/types/slider.d.ts +68 -68
  678. package/types/spinner.d.ts +16 -16
  679. package/types/statistic.d.ts +37 -37
  680. package/types/step.d.ts +34 -34
  681. package/types/steps.d.ts +28 -28
  682. package/types/submenu.d.ts +22 -22
  683. package/types/switch.d.ts +43 -43
  684. package/types/tab-pane.d.ts +19 -19
  685. package/types/table-column.d.ts +117 -117
  686. package/types/table.d.ts +177 -177
  687. package/types/tabs.d.ts +31 -31
  688. package/types/tag.d.ts +28 -28
  689. package/types/time-picker.d.ts +63 -63
  690. package/types/time-select.d.ts +56 -56
  691. package/types/timeline-item.d.ts +20 -20
  692. package/types/timeline.d.ts +6 -6
  693. package/types/tooltip.d.ts +52 -52
  694. package/types/transfer.d.ts +73 -73
  695. package/types/tree.d.ts +266 -266
  696. package/types/upload.d.ts +124 -124
  697. 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-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>
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>