@penggy/element-ui 2.4.11 → 2.4.12

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 (334) hide show
  1. package/lib/autocomplete.js +8 -8
  2. package/lib/carousel.js +1 -1
  3. package/lib/cascader.js +9 -9
  4. package/lib/checkbox-button.js +1 -1
  5. package/lib/checkbox-group.js +1 -1
  6. package/lib/checkbox.js +1 -1
  7. package/lib/collapse-item.js +3 -3
  8. package/lib/color-picker.js +6 -6
  9. package/lib/date-picker.js +17 -17
  10. package/lib/dialog.js +3 -3
  11. package/lib/directives/repeat-click.js +1 -1
  12. package/lib/dropdown-item.js +1 -1
  13. package/lib/dropdown-menu.js +1 -1
  14. package/lib/dropdown.js +6 -6
  15. package/lib/element-ui.common.js +443 -91
  16. package/lib/form-item.js +3 -3
  17. package/lib/form.js +1 -1
  18. package/lib/index.js +1 -1
  19. package/lib/input-number.js +3 -3
  20. package/lib/input.js +4 -4
  21. package/lib/loading.js +4 -4
  22. package/lib/locale/format.js +11 -11
  23. package/lib/locale/index.js +1 -1
  24. package/lib/menu-item.js +2 -2
  25. package/lib/menu.js +28 -28
  26. package/lib/message-box.js +9 -9
  27. package/lib/message.js +2 -2
  28. package/lib/mixins/locale.js +1 -1
  29. package/lib/mixins/migrating.js +20 -20
  30. package/lib/notification.js +2 -2
  31. package/lib/option-group.js +1 -1
  32. package/lib/option.js +2 -2
  33. package/lib/pagination.js +5 -5
  34. package/lib/popover.js +3 -3
  35. package/lib/radio-button.js +1 -1
  36. package/lib/radio-group.js +1 -1
  37. package/lib/radio.js +1 -1
  38. package/lib/rate.js +2 -2
  39. package/lib/scrollbar.js +4 -4
  40. package/lib/select.js +13 -13
  41. package/lib/slider.js +3 -3
  42. package/lib/steps.js +1 -1
  43. package/lib/submenu.js +3 -3
  44. package/lib/switch.js +2 -2
  45. package/lib/table-column.js +4 -4
  46. package/lib/table.js +14 -14
  47. package/lib/tabs.js +1 -1
  48. package/lib/time-picker.js +15 -15
  49. package/lib/time-select.js +14 -14
  50. package/lib/tooltip.js +4 -4
  51. package/lib/transfer.js +7 -7
  52. package/lib/transitions/collapse-transition.js +1 -1
  53. package/lib/tree.js +6 -6
  54. package/lib/upload.js +3 -3
  55. package/lib/utils/after-leave.js +7 -7
  56. package/lib/utils/aria-dialog.js +16 -16
  57. package/lib/utils/aria-utils.js +25 -25
  58. package/lib/utils/clickoutside.js +8 -8
  59. package/lib/utils/date.js +37 -37
  60. package/lib/utils/popper.js +321 -321
  61. package/lib/utils/popup/index.js +2 -2
  62. package/lib/utils/popup/popup-manager.js +1 -1
  63. package/lib/utils/vdom.js +1 -1
  64. package/lib/utils/vue-popper.js +8 -8
  65. package/package.json +1 -1
  66. package/packages/alert/index.js +8 -8
  67. package/packages/alert/src/main.vue +88 -88
  68. package/packages/aside/index.js +8 -8
  69. package/packages/aside/src/main.vue +20 -20
  70. package/packages/autocomplete/index.js +8 -8
  71. package/packages/autocomplete/src/autocomplete-suggestions.vue +76 -76
  72. package/packages/autocomplete/src/autocomplete.vue +269 -269
  73. package/packages/badge/index.js +8 -8
  74. package/packages/badge/src/main.vue +53 -53
  75. package/packages/breadcrumb/index.js +8 -8
  76. package/packages/breadcrumb/src/breadcrumb-item.vue +41 -41
  77. package/packages/breadcrumb/src/breadcrumb.vue +34 -34
  78. package/packages/breadcrumb-item/index.js +8 -8
  79. package/packages/button/index.js +8 -8
  80. package/packages/button/src/button-group.vue +10 -10
  81. package/packages/button/src/button.vue +78 -78
  82. package/packages/button-group/index.js +8 -8
  83. package/packages/card/index.js +8 -8
  84. package/packages/card/src/main.vue +23 -23
  85. package/packages/carousel/index.js +8 -8
  86. package/packages/carousel/src/item.vue +114 -114
  87. package/packages/carousel/src/main.vue +262 -262
  88. package/packages/carousel-item/index.js +8 -8
  89. package/packages/cascader/index.js +8 -8
  90. package/packages/cascader/src/main.vue +456 -456
  91. package/packages/cascader/src/menu.vue +376 -376
  92. package/packages/checkbox/index.js +8 -8
  93. package/packages/checkbox/src/checkbox-button.vue +191 -191
  94. package/packages/checkbox/src/checkbox-group.vue +48 -48
  95. package/packages/checkbox/src/checkbox.vue +219 -219
  96. package/packages/checkbox-button/index.js +8 -8
  97. package/packages/checkbox-group/index.js +8 -8
  98. package/packages/col/index.js +9 -9
  99. package/packages/col/src/col.js +71 -71
  100. package/packages/collapse/index.js +9 -9
  101. package/packages/collapse/src/collapse-item.vue +113 -113
  102. package/packages/collapse/src/collapse.vue +73 -73
  103. package/packages/collapse-item/index.js +8 -8
  104. package/packages/color-picker/index.js +8 -8
  105. package/packages/color-picker/src/color.js +316 -316
  106. package/packages/color-picker/src/components/alpha-slider.vue +132 -132
  107. package/packages/color-picker/src/components/hue-slider.vue +123 -123
  108. package/packages/color-picker/src/components/picker-dropdown.vue +121 -121
  109. package/packages/color-picker/src/components/predefine.vue +60 -60
  110. package/packages/color-picker/src/components/sv-panel.vue +100 -100
  111. package/packages/color-picker/src/draggable.js +36 -36
  112. package/packages/color-picker/src/main.vue +188 -188
  113. package/packages/container/index.js +8 -8
  114. package/packages/container/src/main.vue +33 -33
  115. package/packages/date-picker/index.js +8 -8
  116. package/packages/date-picker/src/basic/date-table.vue +437 -437
  117. package/packages/date-picker/src/basic/month-table.vue +105 -105
  118. package/packages/date-picker/src/basic/time-spinner.vue +301 -301
  119. package/packages/date-picker/src/basic/year-table.vue +101 -101
  120. package/packages/date-picker/src/panel/date-range.vue +640 -640
  121. package/packages/date-picker/src/panel/date.vue +579 -579
  122. package/packages/date-picker/src/panel/time-range.vue +248 -248
  123. package/packages/date-picker/src/panel/time-select.vue +177 -177
  124. package/packages/date-picker/src/panel/time.vue +186 -186
  125. package/packages/date-picker/src/picker/date-picker.js +40 -40
  126. package/packages/date-picker/src/picker/time-picker.js +39 -39
  127. package/packages/date-picker/src/picker/time-select.js +21 -21
  128. package/packages/date-picker/src/picker.vue +924 -924
  129. package/packages/date-picker/src/util/index.js +273 -273
  130. package/packages/dialog/index.js +8 -8
  131. package/packages/dialog/src/component.vue +201 -201
  132. package/packages/dropdown/index.js +8 -8
  133. package/packages/dropdown/src/dropdown-item.vue +35 -35
  134. package/packages/dropdown/src/dropdown-menu.vue +60 -60
  135. package/packages/dropdown/src/dropdown.vue +271 -271
  136. package/packages/dropdown-item/index.js +8 -8
  137. package/packages/dropdown-menu/index.js +8 -8
  138. package/packages/footer/index.js +8 -8
  139. package/packages/footer/src/main.vue +20 -20
  140. package/packages/form/index.js +8 -8
  141. package/packages/form/src/form-item.vue +290 -290
  142. package/packages/form/src/form.vue +148 -148
  143. package/packages/form-item/index.js +8 -8
  144. package/packages/header/index.js +8 -8
  145. package/packages/header/src/main.vue +20 -20
  146. package/packages/icon/index.js +8 -8
  147. package/packages/icon/src/icon.vue +13 -13
  148. package/packages/input/index.js +8 -8
  149. package/packages/input/src/calcTextareaHeight.js +104 -104
  150. package/packages/input/src/input.vue +349 -349
  151. package/packages/input-number/index.js +8 -8
  152. package/packages/input-number/src/input-number.vue +255 -255
  153. package/packages/loading/index.js +11 -11
  154. package/packages/loading/src/directive.js +128 -128
  155. package/packages/loading/src/index.js +106 -106
  156. package/packages/loading/src/loading.vue +41 -41
  157. package/packages/main/index.js +8 -8
  158. package/packages/main/src/main.vue +12 -12
  159. package/packages/menu/index.js +8 -8
  160. package/packages/menu/src/menu-item-group.vue +45 -45
  161. package/packages/menu/src/menu-item.vue +112 -112
  162. package/packages/menu/src/menu-mixin.js +44 -44
  163. package/packages/menu/src/menu.vue +311 -311
  164. package/packages/menu/src/submenu.vue +335 -335
  165. package/packages/menu-item/index.js +8 -8
  166. package/packages/menu-item-group/index.js +8 -8
  167. package/packages/message/index.js +2 -2
  168. package/packages/message/src/main.js +72 -72
  169. package/packages/message/src/main.vue +112 -112
  170. package/packages/message-box/index.js +2 -2
  171. package/packages/message-box/src/main.js +216 -216
  172. package/packages/message-box/src/main.vue +327 -327
  173. package/packages/notification/index.js +2 -2
  174. package/packages/notification/src/main.js +93 -93
  175. package/packages/notification/src/main.vue +152 -152
  176. package/packages/option/index.js +8 -8
  177. package/packages/option-group/index.js +8 -8
  178. package/packages/pagination/index.js +8 -8
  179. package/packages/pagination/src/pager.vue +163 -163
  180. package/packages/pagination/src/pagination.js +430 -430
  181. package/packages/popover/index.js +14 -14
  182. package/packages/popover/src/directive.js +20 -20
  183. package/packages/popover/src/main.vue +207 -207
  184. package/packages/progress/index.js +8 -8
  185. package/packages/progress/src/progress.vue +138 -138
  186. package/packages/radio/index.js +8 -8
  187. package/packages/radio/src/radio-button.vue +114 -114
  188. package/packages/radio/src/radio-group.vue +100 -100
  189. package/packages/radio/src/radio.vue +126 -126
  190. package/packages/radio-button/index.js +8 -8
  191. package/packages/radio-group/index.js +8 -8
  192. package/packages/rate/index.js +8 -8
  193. package/packages/rate/src/main.vue +350 -350
  194. package/packages/row/index.js +9 -9
  195. package/packages/row/src/row.js +47 -47
  196. package/packages/scrollbar/index.js +8 -8
  197. package/packages/scrollbar/src/bar.js +88 -88
  198. package/packages/scrollbar/src/main.js +130 -130
  199. package/packages/scrollbar/src/util.js +34 -34
  200. package/packages/select/index.js +8 -8
  201. package/packages/select/src/navigation-mixin.js +54 -54
  202. package/packages/select/src/option-group.vue +60 -60
  203. package/packages/select/src/option.vue +159 -159
  204. package/packages/select/src/select-dropdown.vue +74 -74
  205. package/packages/select/src/select.vue +878 -878
  206. package/packages/slider/index.js +8 -8
  207. package/packages/slider/src/button.vue +235 -235
  208. package/packages/slider/src/main.vue +385 -385
  209. package/packages/spinner/index.js +8 -8
  210. package/packages/spinner/src/spinner.vue +27 -27
  211. package/packages/step/index.js +8 -8
  212. package/packages/steps/index.js +8 -8
  213. package/packages/steps/src/step.vue +180 -180
  214. package/packages/steps/src/steps.vue +68 -68
  215. package/packages/submenu/index.js +8 -8
  216. package/packages/switch/index.js +9 -9
  217. package/packages/switch/src/component.vue +163 -163
  218. package/packages/tab-pane/index.js +8 -8
  219. package/packages/table/index.js +8 -8
  220. package/packages/table/src/dropdown.js +28 -28
  221. package/packages/table/src/filter-panel.vue +203 -203
  222. package/packages/table/src/layout-observer.js +68 -68
  223. package/packages/table/src/table-body.js +392 -392
  224. package/packages/table/src/table-column.js +462 -462
  225. package/packages/table/src/table-footer.js +147 -147
  226. package/packages/table/src/table-header.js +522 -522
  227. package/packages/table/src/table-layout.js +231 -231
  228. package/packages/table/src/table-store.js +657 -657
  229. package/packages/table/src/table.vue +660 -660
  230. package/packages/table/src/util.js +122 -122
  231. package/packages/table-column/index.js +8 -8
  232. package/packages/tabs/index.js +8 -8
  233. package/packages/tabs/src/tab-bar.vue +57 -57
  234. package/packages/tabs/src/tab-nav.vue +280 -280
  235. package/packages/tabs/src/tab-pane.vue +58 -58
  236. package/packages/tabs/src/tabs.vue +185 -185
  237. package/packages/tag/index.js +8 -8
  238. package/packages/tag/src/tag.vue +39 -39
  239. package/packages/time-picker/index.js +8 -8
  240. package/packages/time-select/index.js +8 -8
  241. package/packages/tooltip/index.js +8 -8
  242. package/packages/tooltip/src/main.js +216 -216
  243. package/packages/transfer/index.js +8 -8
  244. package/packages/transfer/src/main.vue +231 -231
  245. package/packages/transfer/src/transfer-panel.vue +251 -251
  246. package/packages/tree/index.js +8 -8
  247. package/packages/tree/src/model/node.js +481 -481
  248. package/packages/tree/src/model/tree-store.js +333 -333
  249. package/packages/tree/src/model/util.js +27 -27
  250. package/packages/tree/src/tree-node.vue +277 -277
  251. package/packages/tree/src/tree.vue +495 -495
  252. package/packages/upload/index.js +8 -8
  253. package/packages/upload/src/ajax.js +85 -85
  254. package/packages/upload/src/index.vue +315 -315
  255. package/packages/upload/src/upload-dragger.vue +70 -70
  256. package/packages/upload/src/upload-list.vue +103 -103
  257. package/packages/upload/src/upload.vue +211 -211
  258. package/src/directives/mousewheel.js +18 -18
  259. package/src/directives/repeat-click.js +24 -24
  260. package/src/index.js +1 -1
  261. package/src/locale/format.js +46 -46
  262. package/src/locale/index.js +48 -48
  263. package/src/locale/lang/af-ZA.js +109 -109
  264. package/src/locale/lang/ar.js +108 -108
  265. package/src/locale/lang/bg.js +109 -109
  266. package/src/locale/lang/ca.js +108 -108
  267. package/src/locale/lang/cs-CZ.js +111 -111
  268. package/src/locale/lang/da.js +108 -108
  269. package/src/locale/lang/de.js +110 -110
  270. package/src/locale/lang/ee.js +109 -109
  271. package/src/locale/lang/el.js +109 -109
  272. package/src/locale/lang/en.js +109 -109
  273. package/src/locale/lang/es.js +108 -108
  274. package/src/locale/lang/eu.js +109 -109
  275. package/src/locale/lang/fa.js +109 -109
  276. package/src/locale/lang/fi.js +109 -109
  277. package/src/locale/lang/fr.js +108 -108
  278. package/src/locale/lang/he.js +109 -109
  279. package/src/locale/lang/hu.js +108 -108
  280. package/src/locale/lang/id.js +109 -109
  281. package/src/locale/lang/it.js +108 -108
  282. package/src/locale/lang/ja.js +109 -109
  283. package/src/locale/lang/km.js +109 -109
  284. package/src/locale/lang/ko.js +109 -109
  285. package/src/locale/lang/ku.js +109 -109
  286. package/src/locale/lang/kz.js +109 -109
  287. package/src/locale/lang/lt.js +109 -109
  288. package/src/locale/lang/lv.js +109 -109
  289. package/src/locale/lang/mn.js +109 -109
  290. package/src/locale/lang/nb-NO.js +108 -108
  291. package/src/locale/lang/nl.js +109 -109
  292. package/src/locale/lang/pl.js +109 -109
  293. package/src/locale/lang/pt-br.js +109 -109
  294. package/src/locale/lang/pt.js +109 -109
  295. package/src/locale/lang/ro.js +109 -109
  296. package/src/locale/lang/ru-RU.js +109 -109
  297. package/src/locale/lang/sk.js +111 -111
  298. package/src/locale/lang/sl.js +109 -109
  299. package/src/locale/lang/sr.js +109 -109
  300. package/src/locale/lang/sv-SE.js +109 -109
  301. package/src/locale/lang/ta.js +108 -108
  302. package/src/locale/lang/th.js +109 -109
  303. package/src/locale/lang/tk.js +109 -109
  304. package/src/locale/lang/tr-TR.js +109 -109
  305. package/src/locale/lang/ua.js +109 -109
  306. package/src/locale/lang/ug-CN.js +109 -109
  307. package/src/locale/lang/vi.js +109 -109
  308. package/src/locale/lang/zh-CN.js +109 -109
  309. package/src/locale/lang/zh-TW.js +109 -109
  310. package/src/mixins/emitter.js +33 -33
  311. package/src/mixins/focus.js +9 -9
  312. package/src/mixins/locale.js +9 -9
  313. package/src/mixins/migrating.js +51 -51
  314. package/src/transitions/collapse-transition.js +77 -77
  315. package/src/utils/after-leave.js +27 -27
  316. package/src/utils/aria-dialog.js +90 -90
  317. package/src/utils/aria-utils.js +121 -121
  318. package/src/utils/clickoutside.js +76 -76
  319. package/src/utils/date.js +344 -344
  320. package/src/utils/dom.js +174 -174
  321. package/src/utils/menu/aria-menubar.js +14 -14
  322. package/src/utils/menu/aria-menuitem.js +49 -49
  323. package/src/utils/menu/aria-submenu.js +59 -59
  324. package/src/utils/merge.js +15 -15
  325. package/src/utils/popper.js +1276 -1276
  326. package/src/utils/popup/index.js +226 -226
  327. package/src/utils/popup/popup-manager.js +194 -194
  328. package/src/utils/resize-event.js +35 -35
  329. package/src/utils/scroll-into-view.js +27 -27
  330. package/src/utils/scrollbar-width.js +29 -29
  331. package/src/utils/shared.js +7 -7
  332. package/src/utils/util.js +122 -122
  333. package/src/utils/vdom.js +9 -9
  334. package/src/utils/vue-popper.js +200 -200
@@ -1,640 +1,640 @@
1
- <template>
2
- <transition name="el-zoom-in-top" @after-leave="$emit('dodestroy')">
3
- <div
4
- v-show="visible"
5
- class="el-picker-panel el-date-range-picker el-popper"
6
- :class="[{
7
- 'has-sidebar': $slots.sidebar || shortcuts,
8
- 'has-time': showTime
9
- }, popperClass]">
10
- <div class="el-picker-panel__body-wrapper">
11
- <slot name="sidebar" class="el-picker-panel__sidebar"></slot>
12
- <div class="el-picker-panel__sidebar" v-if="shortcuts">
13
- <button
14
- type="button"
15
- class="el-picker-panel__shortcut"
16
- v-for="(shortcut, key) in shortcuts"
17
- :key="key"
18
- @click="handleShortcutClick(shortcut)">{{shortcut.text}}</button>
19
- </div>
20
- <div class="el-picker-panel__body">
21
- <div class="el-date-range-picker__time-header" v-if="showTime">
22
- <span class="el-date-range-picker__editors-wrap">
23
- <span class="el-date-range-picker__time-picker-wrap">
24
- <el-input
25
- size="small"
26
- :disabled="rangeState.selecting"
27
- ref="minInput"
28
- :placeholder="t('el.datepicker.startDate')"
29
- class="el-date-range-picker__editor"
30
- :value="minVisibleDate"
31
- @input.native="handleDateInput($event, 'min')"
32
- @change.native="handleDateChange($event, 'min')" />
33
- </span>
34
- <span class="el-date-range-picker__time-picker-wrap" v-clickoutside="handleMinTimeClose">
35
- <el-input
36
- size="small"
37
- :disabled="rangeState.selecting"
38
- :placeholder="t('el.datepicker.startTime')"
39
- class="el-date-range-picker__editor"
40
- :value="minVisibleTime"
41
- @focus="minTimePickerVisible = true"
42
- @change.native="handleTimeChange($event, 'min')" />
43
- <time-picker
44
- ref="minTimePicker"
45
- @pick="handleMinTimePick"
46
- :time-arrow-control="arrowControl"
47
- :visible="minTimePickerVisible"
48
- @mounted="$refs.minTimePicker.format=timeFormat">
49
- </time-picker>
50
- </span>
51
- </span>
52
- <span class="el-icon-arrow-right"></span>
53
- <span class="el-date-range-picker__editors-wrap is-right">
54
- <span class="el-date-range-picker__time-picker-wrap">
55
- <el-input
56
- size="small"
57
- :disabled="rangeState.selecting"
58
- :placeholder="t('el.datepicker.endDate')"
59
- class="el-date-range-picker__editor"
60
- :value="maxVisibleDate"
61
- :readonly="!minDate"
62
- @input.native="handleDateInput($event, 'max')"
63
- @change.native="handleDateChange($event, 'max')" />
64
- </span>
65
- <span class="el-date-range-picker__time-picker-wrap" v-clickoutside="handleMaxTimeClose">
66
- <el-input
67
- size="small"
68
- :disabled="rangeState.selecting"
69
- ref="maxInput"
70
- :placeholder="t('el.datepicker.endTime')"
71
- class="el-date-range-picker__editor"
72
- :value="maxVisibleTime"
73
- @focus="minDate && (maxTimePickerVisible = true)"
74
- :readonly="!minDate"
75
- @change.native="handleTimeChange($event, 'max')" />
76
- <time-picker
77
- ref="maxTimePicker"
78
- @pick="handleMaxTimePick"
79
- :time-arrow-control="arrowControl"
80
- :visible="maxTimePickerVisible"
81
- @mounted="$refs.maxTimePicker.format=timeFormat">
82
- </time-picker>
83
- </span>
84
- </span>
85
- </div>
86
- <div class="el-picker-panel__content el-date-range-picker__content is-left">
87
- <div class="el-date-range-picker__header">
88
- <button
89
- type="button"
90
- @click="leftPrevYear"
91
- class="el-picker-panel__icon-btn el-icon-d-arrow-left"></button>
92
- <button
93
- type="button"
94
- @click="leftPrevMonth"
95
- class="el-picker-panel__icon-btn el-icon-arrow-left"></button>
96
- <button
97
- type="button"
98
- @click="leftNextYear"
99
- v-if="unlinkPanels"
100
- :disabled="!enableYearArrow"
101
- :class="{ 'is-disabled': !enableYearArrow }"
102
- class="el-picker-panel__icon-btn el-icon-d-arrow-right"></button>
103
- <button
104
- type="button"
105
- @click="leftNextMonth"
106
- v-if="unlinkPanels"
107
- :disabled="!enableMonthArrow"
108
- :class="{ 'is-disabled': !enableMonthArrow }"
109
- class="el-picker-panel__icon-btn el-icon-arrow-right"></button>
110
- <div>{{ leftLabel }}</div>
111
- </div>
112
- <date-table
113
- selection-mode="range"
114
- :date="leftDate"
115
- :default-value="defaultValue"
116
- :min-date="minDate"
117
- :max-date="maxDate"
118
- :range-state="rangeState"
119
- :disabled-date="disabledDate"
120
- @changerange="handleChangeRange"
121
- :first-day-of-week="firstDayOfWeek"
122
- @pick="handleRangePick">
123
- </date-table>
124
- </div>
125
- <div class="el-picker-panel__content el-date-range-picker__content is-right">
126
- <div class="el-date-range-picker__header">
127
- <button
128
- type="button"
129
- @click="rightPrevYear"
130
- v-if="unlinkPanels"
131
- :disabled="!enableYearArrow"
132
- :class="{ 'is-disabled': !enableYearArrow }"
133
- class="el-picker-panel__icon-btn el-icon-d-arrow-left"></button>
134
- <button
135
- type="button"
136
- @click="rightPrevMonth"
137
- v-if="unlinkPanels"
138
- :disabled="!enableMonthArrow"
139
- :class="{ 'is-disabled': !enableMonthArrow }"
140
- class="el-picker-panel__icon-btn el-icon-arrow-left"></button>
141
- <button
142
- type="button"
143
- @click="rightNextYear"
144
- class="el-picker-panel__icon-btn el-icon-d-arrow-right"></button>
145
- <button
146
- type="button"
147
- @click="rightNextMonth"
148
- class="el-picker-panel__icon-btn el-icon-arrow-right"></button>
149
- <div>{{ rightLabel }}</div>
150
- </div>
151
- <date-table
152
- selection-mode="range"
153
- :date="rightDate"
154
- :default-value="defaultValue"
155
- :min-date="minDate"
156
- :max-date="maxDate"
157
- :range-state="rangeState"
158
- :disabled-date="disabledDate"
159
- @changerange="handleChangeRange"
160
- :first-day-of-week="firstDayOfWeek"
161
- @pick="handleRangePick">
162
- </date-table>
163
- </div>
164
- </div>
165
- </div>
166
- <div class="el-picker-panel__footer" v-if="showTime">
167
- <el-button
168
- size="mini"
169
- type="text"
170
- class="el-picker-panel__link-btn"
171
- @click="handleClear">
172
- {{ t('el.datepicker.clear') }}
173
- </el-button>
174
- <el-button
175
- plain
176
- size="mini"
177
- class="el-picker-panel__link-btn"
178
- :disabled="btnDisabled"
179
- @click="handleConfirm(false)">
180
- {{ t('el.datepicker.confirm') }}
181
- </el-button>
182
- </div>
183
- </div>
184
- </transition>
185
- </template>
186
-
187
- <script type="text/babel">
188
- import {
189
- formatDate,
190
- parseDate,
191
- isDate,
192
- modifyDate,
193
- modifyTime,
194
- modifyWithTimeString,
195
- prevYear,
196
- nextYear,
197
- prevMonth,
198
- nextMonth,
199
- extractDateFormat,
200
- extractTimeFormat
201
- } from '../util';
202
- import Clickoutside from 'element-ui/src/utils/clickoutside';
203
- import Locale from 'element-ui/src/mixins/locale';
204
- import TimePicker from './time';
205
- import DateTable from '../basic/date-table';
206
- import ElInput from 'element-ui/packages/input';
207
- import ElButton from 'element-ui/packages/button';
208
-
209
- const advanceDate = (date, amount) => {
210
- return new Date(new Date(date).getTime() + amount);
211
- };
212
-
213
- const calcDefaultValue = (defaultValue) => {
214
- if (Array.isArray(defaultValue)) {
215
- return [new Date(defaultValue[0]), new Date(defaultValue[1])];
216
- } else if (defaultValue) {
217
- return [new Date(defaultValue), advanceDate(defaultValue, 24 * 60 * 60 * 1000)];
218
- } else {
219
- return [new Date(), advanceDate(Date.now(), 24 * 60 * 60 * 1000)];
220
- }
221
- };
222
-
223
- export default {
224
- mixins: [Locale],
225
-
226
- directives: { Clickoutside },
227
-
228
- computed: {
229
- btnDisabled() {
230
- return !(this.minDate && this.maxDate && !this.selecting && this.isValidValue([this.minDate, this.maxDate]));
231
- },
232
-
233
- leftLabel() {
234
- return this.leftDate.getFullYear() + ' ' + this.t('el.datepicker.year') + ' ' + this.t(`el.datepicker.month${ this.leftDate.getMonth() + 1 }`);
235
- },
236
-
237
- rightLabel() {
238
- return this.rightDate.getFullYear() + ' ' + this.t('el.datepicker.year') + ' ' + this.t(`el.datepicker.month${ this.rightDate.getMonth() + 1 }`);
239
- },
240
-
241
- leftYear() {
242
- return this.leftDate.getFullYear();
243
- },
244
-
245
- leftMonth() {
246
- return this.leftDate.getMonth();
247
- },
248
-
249
- leftMonthDate() {
250
- return this.leftDate.getDate();
251
- },
252
-
253
- rightYear() {
254
- return this.rightDate.getFullYear();
255
- },
256
-
257
- rightMonth() {
258
- return this.rightDate.getMonth();
259
- },
260
-
261
- rightMonthDate() {
262
- return this.rightDate.getDate();
263
- },
264
-
265
- minVisibleDate() {
266
- return this.minDate ? formatDate(this.minDate, this.dateFormat) : '';
267
- },
268
-
269
- maxVisibleDate() {
270
- return (this.maxDate || this.minDate) ? formatDate(this.maxDate || this.minDate, this.dateFormat) : '';
271
- },
272
-
273
- minVisibleTime() {
274
- return this.minDate ? formatDate(this.minDate, this.timeFormat) : '';
275
- },
276
-
277
- maxVisibleTime() {
278
- return (this.maxDate || this.minDate) ? formatDate(this.maxDate || this.minDate, this.timeFormat) : '';
279
- },
280
-
281
- timeFormat() {
282
- if (this.format) {
283
- return extractTimeFormat(this.format);
284
- } else {
285
- return 'HH:mm:ss';
286
- }
287
- },
288
-
289
- dateFormat() {
290
- if (this.format) {
291
- return extractDateFormat(this.format);
292
- } else {
293
- return 'yyyy-MM-dd';
294
- }
295
- },
296
-
297
- enableMonthArrow() {
298
- const nextMonth = (this.leftMonth + 1) % 12;
299
- const yearOffset = this.leftMonth + 1 >= 12 ? 1 : 0;
300
- return this.unlinkPanels && new Date(this.leftYear + yearOffset, nextMonth) < new Date(this.rightYear, this.rightMonth);
301
- },
302
-
303
- enableYearArrow() {
304
- return this.unlinkPanels && this.rightYear * 12 + this.rightMonth - (this.leftYear * 12 + this.leftMonth + 1) >= 12;
305
- }
306
- },
307
-
308
- data() {
309
- return {
310
- popperClass: '',
311
- value: [],
312
- defaultValue: null,
313
- defaultTime: null,
314
- minDate: '',
315
- maxDate: '',
316
- leftDate: new Date(),
317
- rightDate: nextMonth(new Date()),
318
- rangeState: {
319
- endDate: null,
320
- selecting: false,
321
- row: null,
322
- column: null
323
- },
324
- showTime: false,
325
- shortcuts: '',
326
- visible: '',
327
- disabledDate: '',
328
- firstDayOfWeek: 7,
329
- minTimePickerVisible: false,
330
- maxTimePickerVisible: false,
331
- format: '',
332
- arrowControl: false,
333
- unlinkPanels: false
334
- };
335
- },
336
-
337
- watch: {
338
- minDate(val) {
339
- this.$nextTick(() => {
340
- if (this.$refs.maxTimePicker && this.maxDate && this.maxDate < this.minDate) {
341
- const format = 'HH:mm:ss';
342
- this.$refs.maxTimePicker.selectableRange = [
343
- [
344
- parseDate(formatDate(this.minDate, format), format),
345
- parseDate('23:59:59', format)
346
- ]
347
- ];
348
- }
349
- });
350
- if (val && this.$refs.minTimePicker) {
351
- this.$refs.minTimePicker.date = val;
352
- this.$refs.minTimePicker.value = val;
353
- }
354
- },
355
-
356
- maxDate(val) {
357
- if (val && this.$refs.maxTimePicker) {
358
- this.$refs.maxTimePicker.date = val;
359
- this.$refs.maxTimePicker.value = val;
360
- }
361
- },
362
-
363
- minTimePickerVisible(val) {
364
- if (val) {
365
- this.$nextTick(() => {
366
- this.$refs.minTimePicker.date = this.minDate;
367
- this.$refs.minTimePicker.value = this.minDate;
368
- this.$refs.minTimePicker.adjustSpinners();
369
- });
370
- }
371
- },
372
-
373
- maxTimePickerVisible(val) {
374
- if (val) {
375
- this.$nextTick(() => {
376
- this.$refs.maxTimePicker.date = this.maxDate;
377
- this.$refs.maxTimePicker.value = this.maxDate;
378
- this.$refs.maxTimePicker.adjustSpinners();
379
- });
380
- }
381
- },
382
-
383
- value(newVal) {
384
- if (!newVal) {
385
- this.minDate = null;
386
- this.maxDate = null;
387
- } else if (Array.isArray(newVal)) {
388
- this.minDate = isDate(newVal[0]) ? new Date(newVal[0]) : null;
389
- this.maxDate = isDate(newVal[1]) ? new Date(newVal[1]) : null;
390
- if (this.minDate) {
391
- this.leftDate = this.minDate;
392
- if (this.unlinkPanels && this.maxDate) {
393
- const minDateYear = this.minDate.getFullYear();
394
- const minDateMonth = this.minDate.getMonth();
395
- const maxDateYear = this.maxDate.getFullYear();
396
- const maxDateMonth = this.maxDate.getMonth();
397
- this.rightDate = minDateYear === maxDateYear && minDateMonth === maxDateMonth
398
- ? nextMonth(this.maxDate)
399
- : this.maxDate;
400
- } else {
401
- this.rightDate = nextMonth(this.leftDate);
402
- }
403
- } else {
404
- this.leftDate = calcDefaultValue(this.defaultValue)[0];
405
- this.rightDate = nextMonth(this.leftDate);
406
- }
407
- }
408
- },
409
-
410
- defaultValue(val) {
411
- if (!Array.isArray(this.value)) {
412
- const [left, right] = calcDefaultValue(val);
413
- this.leftDate = left;
414
- this.rightDate = val && val[1] && this.unlinkPanels
415
- ? right
416
- : nextMonth(this.leftDate);
417
- }
418
- }
419
- },
420
-
421
- methods: {
422
- handleClear() {
423
- this.minDate = null;
424
- this.maxDate = null;
425
- this.leftDate = calcDefaultValue(this.defaultValue)[0];
426
- this.rightDate = nextMonth(this.leftDate);
427
- this.$emit('pick', null);
428
- },
429
-
430
- handleChangeRange(val) {
431
- this.minDate = val.minDate;
432
- this.maxDate = val.maxDate;
433
- this.rangeState = val.rangeState;
434
- },
435
-
436
- handleDateInput(event, type) {
437
- const value = event.target.value;
438
- if (value.length !== this.dateFormat.length) return;
439
- const parsedValue = parseDate(value, this.dateFormat);
440
-
441
- if (parsedValue) {
442
- if (typeof this.disabledDate === 'function' &&
443
- this.disabledDate(new Date(parsedValue))) {
444
- return;
445
- }
446
- if (type === 'min') {
447
- this.minDate = new Date(parsedValue);
448
- this.leftDate = new Date(parsedValue);
449
- this.rightDate = nextMonth(this.leftDate);
450
- } else {
451
- this.maxDate = new Date(parsedValue);
452
- this.leftDate = prevMonth(parsedValue);
453
- this.rightDate = new Date(parsedValue);
454
- }
455
- }
456
- },
457
-
458
- handleDateChange(event, type) {
459
- const value = event.target.value;
460
- const parsedValue = parseDate(value, this.dateFormat);
461
- if (parsedValue) {
462
- if (type === 'min') {
463
- this.minDate = modifyDate(this.minDate, parsedValue.getFullYear(), parsedValue.getMonth(), parsedValue.getDate());
464
- if (this.minDate > this.maxDate) {
465
- this.maxDate = this.minDate;
466
- }
467
- } else {
468
- this.maxDate = modifyDate(this.maxDate, parsedValue.getFullYear(), parsedValue.getMonth(), parsedValue.getDate());
469
- if (this.maxDate < this.minDate) {
470
- this.minDate = this.maxDate;
471
- }
472
- }
473
- }
474
- },
475
-
476
- handleTimeChange(event, type) {
477
- const value = event.target.value;
478
- const parsedValue = parseDate(value, this.timeFormat);
479
- if (parsedValue) {
480
- if (type === 'min') {
481
- this.minDate = modifyTime(this.minDate, parsedValue.getHours(), parsedValue.getMinutes(), parsedValue.getSeconds());
482
- if (this.minDate > this.maxDate) {
483
- this.maxDate = this.minDate;
484
- }
485
- this.$refs.minTimePicker.value = this.minDate;
486
- this.minTimePickerVisible = false;
487
- } else {
488
- this.maxDate = modifyTime(this.maxDate, parsedValue.getHours(), parsedValue.getMinutes(), parsedValue.getSeconds());
489
- if (this.maxDate < this.minDate) {
490
- this.minDate = this.maxDate;
491
- }
492
- this.$refs.maxTimePicker.value = this.minDate;
493
- this.maxTimePickerVisible = false;
494
- }
495
- }
496
- },
497
-
498
- handleRangePick(val, close = true) {
499
- const defaultTime = this.defaultTime || [];
500
- const minDate = modifyWithTimeString(val.minDate, defaultTime[0]);
501
- const maxDate = modifyWithTimeString(val.maxDate, defaultTime[1]);
502
-
503
- if (this.maxDate === maxDate && this.minDate === minDate) {
504
- return;
505
- }
506
- this.onPick && this.onPick(val);
507
- this.maxDate = maxDate;
508
- this.minDate = minDate;
509
-
510
- // workaround for https://github.com/ElemeFE/element/issues/7539, should remove this block when we don't have to care about Chromium 55 - 57
511
- setTimeout(() => {
512
- this.maxDate = maxDate;
513
- this.minDate = minDate;
514
- }, 10);
515
- if (!close || this.showTime) return;
516
- this.handleConfirm();
517
- },
518
-
519
- handleShortcutClick(shortcut) {
520
- if (shortcut.onClick) {
521
- shortcut.onClick(this);
522
- }
523
- },
524
-
525
- handleMinTimePick(value, visible, first) {
526
- this.minDate = this.minDate || new Date();
527
- if (value) {
528
- this.minDate = modifyTime(this.minDate, value.getHours(), value.getMinutes(), value.getSeconds());
529
- }
530
-
531
- if (!first) {
532
- this.minTimePickerVisible = visible;
533
- }
534
-
535
- if (!this.maxDate || this.maxDate && this.maxDate.getTime() < this.minDate.getTime()) {
536
- this.maxDate = new Date(this.minDate);
537
- }
538
- },
539
-
540
- handleMinTimeClose() {
541
- this.minTimePickerVisible = false;
542
- },
543
-
544
- handleMaxTimePick(value, visible, first) {
545
- if (this.maxDate && value) {
546
- this.maxDate = modifyTime(this.maxDate, value.getHours(), value.getMinutes(), value.getSeconds());
547
- }
548
-
549
- if (!first) {
550
- this.maxTimePickerVisible = visible;
551
- }
552
-
553
- if (this.maxDate && this.minDate && this.minDate.getTime() > this.maxDate.getTime()) {
554
- this.minDate = new Date(this.maxDate);
555
- }
556
- },
557
-
558
- handleMaxTimeClose() {
559
- this.maxTimePickerVisible = false;
560
- },
561
-
562
- // leftPrev*, rightNext* need to take care of `unlinkPanels`
563
- leftPrevYear() {
564
- this.leftDate = prevYear(this.leftDate);
565
- if (!this.unlinkPanels) {
566
- this.rightDate = nextMonth(this.leftDate);
567
- }
568
- },
569
-
570
- leftPrevMonth() {
571
- this.leftDate = prevMonth(this.leftDate);
572
- if (!this.unlinkPanels) {
573
- this.rightDate = nextMonth(this.leftDate);
574
- }
575
- },
576
-
577
- rightNextYear() {
578
- if (!this.unlinkPanels) {
579
- this.leftDate = nextYear(this.leftDate);
580
- this.rightDate = nextMonth(this.leftDate);
581
- } else {
582
- this.rightDate = nextYear(this.rightDate);
583
- }
584
- },
585
-
586
- rightNextMonth() {
587
- if (!this.unlinkPanels) {
588
- this.leftDate = nextMonth(this.leftDate);
589
- this.rightDate = nextMonth(this.leftDate);
590
- } else {
591
- this.rightDate = nextMonth(this.rightDate);
592
- }
593
- },
594
-
595
- // leftNext*, rightPrev* are called when `unlinkPanels` is true
596
- leftNextYear() {
597
- this.leftDate = nextYear(this.leftDate);
598
- },
599
-
600
- leftNextMonth() {
601
- this.leftDate = nextMonth(this.leftDate);
602
- },
603
-
604
- rightPrevYear() {
605
- this.rightDate = prevYear(this.rightDate);
606
- },
607
-
608
- rightPrevMonth() {
609
- this.rightDate = prevMonth(this.rightDate);
610
- },
611
-
612
- handleConfirm(visible = false) {
613
- if (this.isValidValue([this.minDate, this.maxDate])) {
614
- this.$emit('pick', [this.minDate, this.maxDate], visible);
615
- }
616
- },
617
-
618
- isValidValue(value) {
619
- return Array.isArray(value) &&
620
- value && value[0] && value[1] &&
621
- isDate(value[0]) && isDate(value[1]) &&
622
- value[0].getTime() <= value[1].getTime() && (
623
- typeof this.disabledDate === 'function'
624
- ? !this.disabledDate(value[0]) && !this.disabledDate(value[1])
625
- : true
626
- );
627
- },
628
-
629
- resetView() {
630
- // NOTE: this is a hack to reset {min, max}Date on picker open.
631
- // TODO: correct way of doing so is to refactor {min, max}Date to be dependent on value and internal selection state
632
- // an alternative would be resetView whenever picker becomes visible, should also investigate date-panel's resetView
633
- this.minDate = this.value && isDate(this.value[0]) ? new Date(this.value[0]) : null;
634
- this.maxDate = this.value && isDate(this.value[0]) ? new Date(this.value[1]) : null;
635
- }
636
- },
637
-
638
- components: { TimePicker, DateTable, ElInput, ElButton }
639
- };
640
- </script>
1
+ <template>
2
+ <transition name="el-zoom-in-top" @after-leave="$emit('dodestroy')">
3
+ <div
4
+ v-show="visible"
5
+ class="el-picker-panel el-date-range-picker el-popper"
6
+ :class="[{
7
+ 'has-sidebar': $slots.sidebar || shortcuts,
8
+ 'has-time': showTime
9
+ }, popperClass]">
10
+ <div class="el-picker-panel__body-wrapper">
11
+ <slot name="sidebar" class="el-picker-panel__sidebar"></slot>
12
+ <div class="el-picker-panel__sidebar" v-if="shortcuts">
13
+ <button
14
+ type="button"
15
+ class="el-picker-panel__shortcut"
16
+ v-for="(shortcut, key) in shortcuts"
17
+ :key="key"
18
+ @click="handleShortcutClick(shortcut)">{{shortcut.text}}</button>
19
+ </div>
20
+ <div class="el-picker-panel__body">
21
+ <div class="el-date-range-picker__time-header" v-if="showTime">
22
+ <span class="el-date-range-picker__editors-wrap">
23
+ <span class="el-date-range-picker__time-picker-wrap">
24
+ <el-input
25
+ size="small"
26
+ :disabled="rangeState.selecting"
27
+ ref="minInput"
28
+ :placeholder="t('el.datepicker.startDate')"
29
+ class="el-date-range-picker__editor"
30
+ :value="minVisibleDate"
31
+ @input.native="handleDateInput($event, 'min')"
32
+ @change.native="handleDateChange($event, 'min')" />
33
+ </span>
34
+ <span class="el-date-range-picker__time-picker-wrap" v-clickoutside="handleMinTimeClose">
35
+ <el-input
36
+ size="small"
37
+ :disabled="rangeState.selecting"
38
+ :placeholder="t('el.datepicker.startTime')"
39
+ class="el-date-range-picker__editor"
40
+ :value="minVisibleTime"
41
+ @focus="minTimePickerVisible = true"
42
+ @change.native="handleTimeChange($event, 'min')" />
43
+ <time-picker
44
+ ref="minTimePicker"
45
+ @pick="handleMinTimePick"
46
+ :time-arrow-control="arrowControl"
47
+ :visible="minTimePickerVisible"
48
+ @mounted="$refs.minTimePicker.format=timeFormat">
49
+ </time-picker>
50
+ </span>
51
+ </span>
52
+ <span class="el-icon-arrow-right"></span>
53
+ <span class="el-date-range-picker__editors-wrap is-right">
54
+ <span class="el-date-range-picker__time-picker-wrap">
55
+ <el-input
56
+ size="small"
57
+ :disabled="rangeState.selecting"
58
+ :placeholder="t('el.datepicker.endDate')"
59
+ class="el-date-range-picker__editor"
60
+ :value="maxVisibleDate"
61
+ :readonly="!minDate"
62
+ @input.native="handleDateInput($event, 'max')"
63
+ @change.native="handleDateChange($event, 'max')" />
64
+ </span>
65
+ <span class="el-date-range-picker__time-picker-wrap" v-clickoutside="handleMaxTimeClose">
66
+ <el-input
67
+ size="small"
68
+ :disabled="rangeState.selecting"
69
+ ref="maxInput"
70
+ :placeholder="t('el.datepicker.endTime')"
71
+ class="el-date-range-picker__editor"
72
+ :value="maxVisibleTime"
73
+ @focus="minDate && (maxTimePickerVisible = true)"
74
+ :readonly="!minDate"
75
+ @change.native="handleTimeChange($event, 'max')" />
76
+ <time-picker
77
+ ref="maxTimePicker"
78
+ @pick="handleMaxTimePick"
79
+ :time-arrow-control="arrowControl"
80
+ :visible="maxTimePickerVisible"
81
+ @mounted="$refs.maxTimePicker.format=timeFormat">
82
+ </time-picker>
83
+ </span>
84
+ </span>
85
+ </div>
86
+ <div class="el-picker-panel__content el-date-range-picker__content is-left">
87
+ <div class="el-date-range-picker__header">
88
+ <button
89
+ type="button"
90
+ @click="leftPrevYear"
91
+ class="el-picker-panel__icon-btn el-icon-d-arrow-left"></button>
92
+ <button
93
+ type="button"
94
+ @click="leftPrevMonth"
95
+ class="el-picker-panel__icon-btn el-icon-arrow-left"></button>
96
+ <button
97
+ type="button"
98
+ @click="leftNextYear"
99
+ v-if="unlinkPanels"
100
+ :disabled="!enableYearArrow"
101
+ :class="{ 'is-disabled': !enableYearArrow }"
102
+ class="el-picker-panel__icon-btn el-icon-d-arrow-right"></button>
103
+ <button
104
+ type="button"
105
+ @click="leftNextMonth"
106
+ v-if="unlinkPanels"
107
+ :disabled="!enableMonthArrow"
108
+ :class="{ 'is-disabled': !enableMonthArrow }"
109
+ class="el-picker-panel__icon-btn el-icon-arrow-right"></button>
110
+ <div>{{ leftLabel }}</div>
111
+ </div>
112
+ <date-table
113
+ selection-mode="range"
114
+ :date="leftDate"
115
+ :default-value="defaultValue"
116
+ :min-date="minDate"
117
+ :max-date="maxDate"
118
+ :range-state="rangeState"
119
+ :disabled-date="disabledDate"
120
+ @changerange="handleChangeRange"
121
+ :first-day-of-week="firstDayOfWeek"
122
+ @pick="handleRangePick">
123
+ </date-table>
124
+ </div>
125
+ <div class="el-picker-panel__content el-date-range-picker__content is-right">
126
+ <div class="el-date-range-picker__header">
127
+ <button
128
+ type="button"
129
+ @click="rightPrevYear"
130
+ v-if="unlinkPanels"
131
+ :disabled="!enableYearArrow"
132
+ :class="{ 'is-disabled': !enableYearArrow }"
133
+ class="el-picker-panel__icon-btn el-icon-d-arrow-left"></button>
134
+ <button
135
+ type="button"
136
+ @click="rightPrevMonth"
137
+ v-if="unlinkPanels"
138
+ :disabled="!enableMonthArrow"
139
+ :class="{ 'is-disabled': !enableMonthArrow }"
140
+ class="el-picker-panel__icon-btn el-icon-arrow-left"></button>
141
+ <button
142
+ type="button"
143
+ @click="rightNextYear"
144
+ class="el-picker-panel__icon-btn el-icon-d-arrow-right"></button>
145
+ <button
146
+ type="button"
147
+ @click="rightNextMonth"
148
+ class="el-picker-panel__icon-btn el-icon-arrow-right"></button>
149
+ <div>{{ rightLabel }}</div>
150
+ </div>
151
+ <date-table
152
+ selection-mode="range"
153
+ :date="rightDate"
154
+ :default-value="defaultValue"
155
+ :min-date="minDate"
156
+ :max-date="maxDate"
157
+ :range-state="rangeState"
158
+ :disabled-date="disabledDate"
159
+ @changerange="handleChangeRange"
160
+ :first-day-of-week="firstDayOfWeek"
161
+ @pick="handleRangePick">
162
+ </date-table>
163
+ </div>
164
+ </div>
165
+ </div>
166
+ <div class="el-picker-panel__footer" v-if="showTime">
167
+ <el-button
168
+ size="mini"
169
+ type="text"
170
+ class="el-picker-panel__link-btn"
171
+ @click="handleClear">
172
+ {{ t('el.datepicker.clear') }}
173
+ </el-button>
174
+ <el-button
175
+ plain
176
+ size="mini"
177
+ class="el-picker-panel__link-btn"
178
+ :disabled="btnDisabled"
179
+ @click="handleConfirm(false)">
180
+ {{ t('el.datepicker.confirm') }}
181
+ </el-button>
182
+ </div>
183
+ </div>
184
+ </transition>
185
+ </template>
186
+
187
+ <script type="text/babel">
188
+ import {
189
+ formatDate,
190
+ parseDate,
191
+ isDate,
192
+ modifyDate,
193
+ modifyTime,
194
+ modifyWithTimeString,
195
+ prevYear,
196
+ nextYear,
197
+ prevMonth,
198
+ nextMonth,
199
+ extractDateFormat,
200
+ extractTimeFormat
201
+ } from '../util';
202
+ import Clickoutside from '@penggy/element-ui/src/utils/clickoutside';
203
+ import Locale from '@penggy/element-ui/src/mixins/locale';
204
+ import TimePicker from './time';
205
+ import DateTable from '../basic/date-table';
206
+ import ElInput from '@penggy/element-ui/packages/input';
207
+ import ElButton from '@penggy/element-ui/packages/button';
208
+
209
+ const advanceDate = (date, amount) => {
210
+ return new Date(new Date(date).getTime() + amount);
211
+ };
212
+
213
+ const calcDefaultValue = (defaultValue) => {
214
+ if (Array.isArray(defaultValue)) {
215
+ return [new Date(defaultValue[0]), new Date(defaultValue[1])];
216
+ } else if (defaultValue) {
217
+ return [new Date(defaultValue), advanceDate(defaultValue, 24 * 60 * 60 * 1000)];
218
+ } else {
219
+ return [new Date(), advanceDate(Date.now(), 24 * 60 * 60 * 1000)];
220
+ }
221
+ };
222
+
223
+ export default {
224
+ mixins: [Locale],
225
+
226
+ directives: { Clickoutside },
227
+
228
+ computed: {
229
+ btnDisabled() {
230
+ return !(this.minDate && this.maxDate && !this.selecting && this.isValidValue([this.minDate, this.maxDate]));
231
+ },
232
+
233
+ leftLabel() {
234
+ return this.leftDate.getFullYear() + ' ' + this.t('el.datepicker.year') + ' ' + this.t(`el.datepicker.month${ this.leftDate.getMonth() + 1 }`);
235
+ },
236
+
237
+ rightLabel() {
238
+ return this.rightDate.getFullYear() + ' ' + this.t('el.datepicker.year') + ' ' + this.t(`el.datepicker.month${ this.rightDate.getMonth() + 1 }`);
239
+ },
240
+
241
+ leftYear() {
242
+ return this.leftDate.getFullYear();
243
+ },
244
+
245
+ leftMonth() {
246
+ return this.leftDate.getMonth();
247
+ },
248
+
249
+ leftMonthDate() {
250
+ return this.leftDate.getDate();
251
+ },
252
+
253
+ rightYear() {
254
+ return this.rightDate.getFullYear();
255
+ },
256
+
257
+ rightMonth() {
258
+ return this.rightDate.getMonth();
259
+ },
260
+
261
+ rightMonthDate() {
262
+ return this.rightDate.getDate();
263
+ },
264
+
265
+ minVisibleDate() {
266
+ return this.minDate ? formatDate(this.minDate, this.dateFormat) : '';
267
+ },
268
+
269
+ maxVisibleDate() {
270
+ return (this.maxDate || this.minDate) ? formatDate(this.maxDate || this.minDate, this.dateFormat) : '';
271
+ },
272
+
273
+ minVisibleTime() {
274
+ return this.minDate ? formatDate(this.minDate, this.timeFormat) : '';
275
+ },
276
+
277
+ maxVisibleTime() {
278
+ return (this.maxDate || this.minDate) ? formatDate(this.maxDate || this.minDate, this.timeFormat) : '';
279
+ },
280
+
281
+ timeFormat() {
282
+ if (this.format) {
283
+ return extractTimeFormat(this.format);
284
+ } else {
285
+ return 'HH:mm:ss';
286
+ }
287
+ },
288
+
289
+ dateFormat() {
290
+ if (this.format) {
291
+ return extractDateFormat(this.format);
292
+ } else {
293
+ return 'yyyy-MM-dd';
294
+ }
295
+ },
296
+
297
+ enableMonthArrow() {
298
+ const nextMonth = (this.leftMonth + 1) % 12;
299
+ const yearOffset = this.leftMonth + 1 >= 12 ? 1 : 0;
300
+ return this.unlinkPanels && new Date(this.leftYear + yearOffset, nextMonth) < new Date(this.rightYear, this.rightMonth);
301
+ },
302
+
303
+ enableYearArrow() {
304
+ return this.unlinkPanels && this.rightYear * 12 + this.rightMonth - (this.leftYear * 12 + this.leftMonth + 1) >= 12;
305
+ }
306
+ },
307
+
308
+ data() {
309
+ return {
310
+ popperClass: '',
311
+ value: [],
312
+ defaultValue: null,
313
+ defaultTime: null,
314
+ minDate: '',
315
+ maxDate: '',
316
+ leftDate: new Date(),
317
+ rightDate: nextMonth(new Date()),
318
+ rangeState: {
319
+ endDate: null,
320
+ selecting: false,
321
+ row: null,
322
+ column: null
323
+ },
324
+ showTime: false,
325
+ shortcuts: '',
326
+ visible: '',
327
+ disabledDate: '',
328
+ firstDayOfWeek: 7,
329
+ minTimePickerVisible: false,
330
+ maxTimePickerVisible: false,
331
+ format: '',
332
+ arrowControl: false,
333
+ unlinkPanels: false
334
+ };
335
+ },
336
+
337
+ watch: {
338
+ minDate(val) {
339
+ this.$nextTick(() => {
340
+ if (this.$refs.maxTimePicker && this.maxDate && this.maxDate < this.minDate) {
341
+ const format = 'HH:mm:ss';
342
+ this.$refs.maxTimePicker.selectableRange = [
343
+ [
344
+ parseDate(formatDate(this.minDate, format), format),
345
+ parseDate('23:59:59', format)
346
+ ]
347
+ ];
348
+ }
349
+ });
350
+ if (val && this.$refs.minTimePicker) {
351
+ this.$refs.minTimePicker.date = val;
352
+ this.$refs.minTimePicker.value = val;
353
+ }
354
+ },
355
+
356
+ maxDate(val) {
357
+ if (val && this.$refs.maxTimePicker) {
358
+ this.$refs.maxTimePicker.date = val;
359
+ this.$refs.maxTimePicker.value = val;
360
+ }
361
+ },
362
+
363
+ minTimePickerVisible(val) {
364
+ if (val) {
365
+ this.$nextTick(() => {
366
+ this.$refs.minTimePicker.date = this.minDate;
367
+ this.$refs.minTimePicker.value = this.minDate;
368
+ this.$refs.minTimePicker.adjustSpinners();
369
+ });
370
+ }
371
+ },
372
+
373
+ maxTimePickerVisible(val) {
374
+ if (val) {
375
+ this.$nextTick(() => {
376
+ this.$refs.maxTimePicker.date = this.maxDate;
377
+ this.$refs.maxTimePicker.value = this.maxDate;
378
+ this.$refs.maxTimePicker.adjustSpinners();
379
+ });
380
+ }
381
+ },
382
+
383
+ value(newVal) {
384
+ if (!newVal) {
385
+ this.minDate = null;
386
+ this.maxDate = null;
387
+ } else if (Array.isArray(newVal)) {
388
+ this.minDate = isDate(newVal[0]) ? new Date(newVal[0]) : null;
389
+ this.maxDate = isDate(newVal[1]) ? new Date(newVal[1]) : null;
390
+ if (this.minDate) {
391
+ this.leftDate = this.minDate;
392
+ if (this.unlinkPanels && this.maxDate) {
393
+ const minDateYear = this.minDate.getFullYear();
394
+ const minDateMonth = this.minDate.getMonth();
395
+ const maxDateYear = this.maxDate.getFullYear();
396
+ const maxDateMonth = this.maxDate.getMonth();
397
+ this.rightDate = minDateYear === maxDateYear && minDateMonth === maxDateMonth
398
+ ? nextMonth(this.maxDate)
399
+ : this.maxDate;
400
+ } else {
401
+ this.rightDate = nextMonth(this.leftDate);
402
+ }
403
+ } else {
404
+ this.leftDate = calcDefaultValue(this.defaultValue)[0];
405
+ this.rightDate = nextMonth(this.leftDate);
406
+ }
407
+ }
408
+ },
409
+
410
+ defaultValue(val) {
411
+ if (!Array.isArray(this.value)) {
412
+ const [left, right] = calcDefaultValue(val);
413
+ this.leftDate = left;
414
+ this.rightDate = val && val[1] && this.unlinkPanels
415
+ ? right
416
+ : nextMonth(this.leftDate);
417
+ }
418
+ }
419
+ },
420
+
421
+ methods: {
422
+ handleClear() {
423
+ this.minDate = null;
424
+ this.maxDate = null;
425
+ this.leftDate = calcDefaultValue(this.defaultValue)[0];
426
+ this.rightDate = nextMonth(this.leftDate);
427
+ this.$emit('pick', null);
428
+ },
429
+
430
+ handleChangeRange(val) {
431
+ this.minDate = val.minDate;
432
+ this.maxDate = val.maxDate;
433
+ this.rangeState = val.rangeState;
434
+ },
435
+
436
+ handleDateInput(event, type) {
437
+ const value = event.target.value;
438
+ if (value.length !== this.dateFormat.length) return;
439
+ const parsedValue = parseDate(value, this.dateFormat);
440
+
441
+ if (parsedValue) {
442
+ if (typeof this.disabledDate === 'function' &&
443
+ this.disabledDate(new Date(parsedValue))) {
444
+ return;
445
+ }
446
+ if (type === 'min') {
447
+ this.minDate = new Date(parsedValue);
448
+ this.leftDate = new Date(parsedValue);
449
+ this.rightDate = nextMonth(this.leftDate);
450
+ } else {
451
+ this.maxDate = new Date(parsedValue);
452
+ this.leftDate = prevMonth(parsedValue);
453
+ this.rightDate = new Date(parsedValue);
454
+ }
455
+ }
456
+ },
457
+
458
+ handleDateChange(event, type) {
459
+ const value = event.target.value;
460
+ const parsedValue = parseDate(value, this.dateFormat);
461
+ if (parsedValue) {
462
+ if (type === 'min') {
463
+ this.minDate = modifyDate(this.minDate, parsedValue.getFullYear(), parsedValue.getMonth(), parsedValue.getDate());
464
+ if (this.minDate > this.maxDate) {
465
+ this.maxDate = this.minDate;
466
+ }
467
+ } else {
468
+ this.maxDate = modifyDate(this.maxDate, parsedValue.getFullYear(), parsedValue.getMonth(), parsedValue.getDate());
469
+ if (this.maxDate < this.minDate) {
470
+ this.minDate = this.maxDate;
471
+ }
472
+ }
473
+ }
474
+ },
475
+
476
+ handleTimeChange(event, type) {
477
+ const value = event.target.value;
478
+ const parsedValue = parseDate(value, this.timeFormat);
479
+ if (parsedValue) {
480
+ if (type === 'min') {
481
+ this.minDate = modifyTime(this.minDate, parsedValue.getHours(), parsedValue.getMinutes(), parsedValue.getSeconds());
482
+ if (this.minDate > this.maxDate) {
483
+ this.maxDate = this.minDate;
484
+ }
485
+ this.$refs.minTimePicker.value = this.minDate;
486
+ this.minTimePickerVisible = false;
487
+ } else {
488
+ this.maxDate = modifyTime(this.maxDate, parsedValue.getHours(), parsedValue.getMinutes(), parsedValue.getSeconds());
489
+ if (this.maxDate < this.minDate) {
490
+ this.minDate = this.maxDate;
491
+ }
492
+ this.$refs.maxTimePicker.value = this.minDate;
493
+ this.maxTimePickerVisible = false;
494
+ }
495
+ }
496
+ },
497
+
498
+ handleRangePick(val, close = true) {
499
+ const defaultTime = this.defaultTime || [];
500
+ const minDate = modifyWithTimeString(val.minDate, defaultTime[0]);
501
+ const maxDate = modifyWithTimeString(val.maxDate, defaultTime[1]);
502
+
503
+ if (this.maxDate === maxDate && this.minDate === minDate) {
504
+ return;
505
+ }
506
+ this.onPick && this.onPick(val);
507
+ this.maxDate = maxDate;
508
+ this.minDate = minDate;
509
+
510
+ // workaround for https://github.com/ElemeFE/element/issues/7539, should remove this block when we don't have to care about Chromium 55 - 57
511
+ setTimeout(() => {
512
+ this.maxDate = maxDate;
513
+ this.minDate = minDate;
514
+ }, 10);
515
+ if (!close || this.showTime) return;
516
+ this.handleConfirm();
517
+ },
518
+
519
+ handleShortcutClick(shortcut) {
520
+ if (shortcut.onClick) {
521
+ shortcut.onClick(this);
522
+ }
523
+ },
524
+
525
+ handleMinTimePick(value, visible, first) {
526
+ this.minDate = this.minDate || new Date();
527
+ if (value) {
528
+ this.minDate = modifyTime(this.minDate, value.getHours(), value.getMinutes(), value.getSeconds());
529
+ }
530
+
531
+ if (!first) {
532
+ this.minTimePickerVisible = visible;
533
+ }
534
+
535
+ if (!this.maxDate || this.maxDate && this.maxDate.getTime() < this.minDate.getTime()) {
536
+ this.maxDate = new Date(this.minDate);
537
+ }
538
+ },
539
+
540
+ handleMinTimeClose() {
541
+ this.minTimePickerVisible = false;
542
+ },
543
+
544
+ handleMaxTimePick(value, visible, first) {
545
+ if (this.maxDate && value) {
546
+ this.maxDate = modifyTime(this.maxDate, value.getHours(), value.getMinutes(), value.getSeconds());
547
+ }
548
+
549
+ if (!first) {
550
+ this.maxTimePickerVisible = visible;
551
+ }
552
+
553
+ if (this.maxDate && this.minDate && this.minDate.getTime() > this.maxDate.getTime()) {
554
+ this.minDate = new Date(this.maxDate);
555
+ }
556
+ },
557
+
558
+ handleMaxTimeClose() {
559
+ this.maxTimePickerVisible = false;
560
+ },
561
+
562
+ // leftPrev*, rightNext* need to take care of `unlinkPanels`
563
+ leftPrevYear() {
564
+ this.leftDate = prevYear(this.leftDate);
565
+ if (!this.unlinkPanels) {
566
+ this.rightDate = nextMonth(this.leftDate);
567
+ }
568
+ },
569
+
570
+ leftPrevMonth() {
571
+ this.leftDate = prevMonth(this.leftDate);
572
+ if (!this.unlinkPanels) {
573
+ this.rightDate = nextMonth(this.leftDate);
574
+ }
575
+ },
576
+
577
+ rightNextYear() {
578
+ if (!this.unlinkPanels) {
579
+ this.leftDate = nextYear(this.leftDate);
580
+ this.rightDate = nextMonth(this.leftDate);
581
+ } else {
582
+ this.rightDate = nextYear(this.rightDate);
583
+ }
584
+ },
585
+
586
+ rightNextMonth() {
587
+ if (!this.unlinkPanels) {
588
+ this.leftDate = nextMonth(this.leftDate);
589
+ this.rightDate = nextMonth(this.leftDate);
590
+ } else {
591
+ this.rightDate = nextMonth(this.rightDate);
592
+ }
593
+ },
594
+
595
+ // leftNext*, rightPrev* are called when `unlinkPanels` is true
596
+ leftNextYear() {
597
+ this.leftDate = nextYear(this.leftDate);
598
+ },
599
+
600
+ leftNextMonth() {
601
+ this.leftDate = nextMonth(this.leftDate);
602
+ },
603
+
604
+ rightPrevYear() {
605
+ this.rightDate = prevYear(this.rightDate);
606
+ },
607
+
608
+ rightPrevMonth() {
609
+ this.rightDate = prevMonth(this.rightDate);
610
+ },
611
+
612
+ handleConfirm(visible = false) {
613
+ if (this.isValidValue([this.minDate, this.maxDate])) {
614
+ this.$emit('pick', [this.minDate, this.maxDate], visible);
615
+ }
616
+ },
617
+
618
+ isValidValue(value) {
619
+ return Array.isArray(value) &&
620
+ value && value[0] && value[1] &&
621
+ isDate(value[0]) && isDate(value[1]) &&
622
+ value[0].getTime() <= value[1].getTime() && (
623
+ typeof this.disabledDate === 'function'
624
+ ? !this.disabledDate(value[0]) && !this.disabledDate(value[1])
625
+ : true
626
+ );
627
+ },
628
+
629
+ resetView() {
630
+ // NOTE: this is a hack to reset {min, max}Date on picker open.
631
+ // TODO: correct way of doing so is to refactor {min, max}Date to be dependent on value and internal selection state
632
+ // an alternative would be resetView whenever picker becomes visible, should also investigate date-panel's resetView
633
+ this.minDate = this.value && isDate(this.value[0]) ? new Date(this.value[0]) : null;
634
+ this.maxDate = this.value && isDate(this.value[0]) ? new Date(this.value[1]) : null;
635
+ }
636
+ },
637
+
638
+ components: { TimePicker, DateTable, ElInput, ElButton }
639
+ };
640
+ </script>