bi-eleme 2.1.2 → 2.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/lib/alert.js +4 -4
  2. package/lib/aside.js +4 -4
  3. package/lib/autocomplete.js +10 -10
  4. package/lib/avatar.js +4 -4
  5. package/lib/backtop.js +6 -6
  6. package/lib/badge.js +4 -4
  7. package/lib/breadcrumb-item.js +4 -4
  8. package/lib/breadcrumb.js +4 -4
  9. package/lib/button-group.js +4 -4
  10. package/lib/button.js +4 -4
  11. package/lib/calendar.js +15 -15
  12. package/lib/card.js +4 -4
  13. package/lib/carousel-item.js +4 -4
  14. package/lib/carousel.js +6 -6
  15. package/lib/cascader-panel.js +10 -10
  16. package/lib/cascader.js +12 -12
  17. package/lib/checkbox-button.js +4 -4
  18. package/lib/checkbox-group.js +4 -4
  19. package/lib/checkbox.js +4 -4
  20. package/lib/col.js +2 -2
  21. package/lib/collapse-item.js +6 -6
  22. package/lib/collapse.js +4 -4
  23. package/lib/color-picker.js +8 -8
  24. package/lib/container.js +4 -4
  25. package/lib/date-picker.js +131 -105
  26. package/lib/descriptions-item.js +2 -2
  27. package/lib/descriptions.js +2 -2
  28. package/lib/dialog.js +8 -8
  29. package/lib/divider.js +4 -4
  30. package/lib/drawer.js +6 -6
  31. package/lib/dropdown-item.js +4 -4
  32. package/lib/dropdown-menu.js +4 -4
  33. package/lib/dropdown.js +16 -16
  34. package/lib/element-ui.common.js +5221 -734
  35. package/lib/empty.js +4 -4
  36. package/lib/footer.js +4 -4
  37. package/lib/form-item.js +6 -6
  38. package/lib/form.js +11 -11
  39. package/lib/header.js +4 -4
  40. package/lib/icon.js +4 -4
  41. package/lib/image.js +8 -8
  42. package/lib/index.js +1 -1
  43. package/lib/infinite-scroll.js +2 -2
  44. package/lib/input-number.js +6 -6
  45. package/lib/input.js +6 -6
  46. package/lib/link.js +4 -4
  47. package/lib/loading.js +6 -6
  48. package/lib/main.js +4 -4
  49. package/lib/menu-item-group.js +4 -4
  50. package/lib/menu-item.js +6 -6
  51. package/lib/menu.js +6 -6
  52. package/lib/message-box.js +13 -13
  53. package/lib/message.js +8 -8
  54. package/lib/notification.js +8 -8
  55. package/lib/option-group.js +4 -4
  56. package/lib/option.js +4 -4
  57. package/lib/page-header.js +4 -4
  58. package/lib/pagination.js +4 -4
  59. package/lib/popconfirm.js +8 -8
  60. package/lib/popover.js +4 -4
  61. package/lib/progress.js +4 -4
  62. package/lib/radio-button.js +4 -4
  63. package/lib/radio-group.js +4 -4
  64. package/lib/radio.js +4 -4
  65. package/lib/rate.js +6 -6
  66. package/lib/result.js +4 -4
  67. package/lib/row.js +2 -2
  68. package/lib/scrollbar.js +2 -2
  69. package/lib/select.js +16 -16
  70. package/lib/skeleton-item.js +4 -4
  71. package/lib/skeleton.js +4 -4
  72. package/lib/slider.js +8 -8
  73. package/lib/spinner.js +4 -4
  74. package/lib/step.js +4 -4
  75. package/lib/steps.js +6 -6
  76. package/lib/submenu.js +6 -6
  77. package/lib/super-date.js +4833 -0
  78. package/lib/switch.js +6 -6
  79. package/lib/tab-pane.js +4 -4
  80. package/lib/table-column.js +2 -2
  81. package/lib/table.js +20 -18
  82. package/lib/tabs.js +4 -4
  83. package/lib/tag.js +4 -4
  84. package/lib/theme-chalk/index.css +1 -1
  85. package/lib/theme-chalk/super-date.css +1 -0
  86. package/lib/time-picker.js +63 -61
  87. package/lib/time-select.js +20 -18
  88. package/lib/timeline-item.js +4 -4
  89. package/lib/timeline.js +4 -4
  90. package/lib/tooltip.js +2 -2
  91. package/lib/transfer.js +8 -8
  92. package/lib/tree.js +6 -6
  93. package/lib/upload.js +15 -15
  94. package/lib/utils/date-util.js +14 -2
  95. package/lib/utils/date.js +67 -9
  96. package/package.json +1 -1
  97. package/packages/date-picker/src/basic/date-table.vue +10 -5
  98. package/packages/date-picker/src/basic/month-table.vue +9 -6
  99. package/packages/date-picker/src/basic/year-table.vue +6 -2
  100. package/packages/date-picker/src/panel/date.vue +4 -0
  101. package/packages/date-picker/src/picker.vue +2 -0
  102. package/packages/super-date/index.js +8 -0
  103. package/packages/super-date/src/basic/date-table.vue +448 -0
  104. package/packages/super-date/src/basic/month-table.vue +278 -0
  105. package/packages/super-date/src/basic/time-spinner.vue +340 -0
  106. package/packages/super-date/src/basic/year-table.vue +144 -0
  107. package/packages/super-date/src/panel/date-range.vue +1000 -0
  108. package/packages/super-date/src/panel/date.vue +649 -0
  109. package/packages/super-date/src/panel/month-range.vue +289 -0
  110. package/packages/super-date/src/panel/time-range.vue +250 -0
  111. package/packages/super-date/src/panel/time-select.vue +195 -0
  112. package/packages/super-date/src/panel/time.vue +211 -0
  113. package/packages/super-date/src/picker/date-picker.js +29 -0
  114. package/packages/super-date/src/picker/time-picker.js +39 -0
  115. package/packages/super-date/src/picker/time-select.js +21 -0
  116. package/packages/super-date/src/picker.vue +956 -0
  117. package/packages/theme-chalk/lib/index.css +1 -1
  118. package/packages/theme-chalk/lib/super-date.css +1 -0
  119. package/packages/theme-chalk/src/index.scss +1 -0
  120. package/packages/theme-chalk/src/super-date/date-picker.scss +106 -0
  121. package/packages/theme-chalk/src/super-date/date-range-picker.scss +138 -0
  122. package/packages/theme-chalk/src/super-date/date-table.scss +154 -0
  123. package/packages/theme-chalk/src/super-date/month-table.scss +96 -0
  124. package/packages/theme-chalk/src/super-date/picker-panel.scss +130 -0
  125. package/packages/theme-chalk/src/super-date/picker.scss +204 -0
  126. package/packages/theme-chalk/src/super-date/time-picker.scss +94 -0
  127. package/packages/theme-chalk/src/super-date/time-range-picker.scss +32 -0
  128. package/packages/theme-chalk/src/super-date/time-spinner.scss +111 -0
  129. package/packages/theme-chalk/src/super-date/year-table.scss +66 -0
  130. package/packages/theme-chalk/src/super-date.scss +12 -0
  131. package/src/index.js +4 -1
  132. package/src/utils/date-util.js +10 -0
  133. package/src/utils/date.js +291 -195
  134. package/types/element-ui.d.ts +9 -5
  135. package/types/super-date.d.ts +124 -0
@@ -0,0 +1,649 @@
1
+ <template>
2
+ <transition
3
+ name="el-zoom-in-top"
4
+ @after-enter="handleEnter"
5
+ @after-leave="handleLeave"
6
+ >
7
+ <div
8
+ v-show="visible"
9
+ class="el-picker-panel el-date-picker el-popper"
10
+ :class="[{
11
+ 'has-sidebar': $slots.sidebar || shortcuts,
12
+ 'has-time': showTime
13
+ }, popperClass]"
14
+ >
15
+ <div class="el-picker-panel__body-wrapper">
16
+ <slot
17
+ name="sidebar"
18
+ class="el-picker-panel__sidebar"
19
+ ></slot>
20
+ <div
21
+ class="el-picker-panel__sidebar"
22
+ v-if="shortcuts"
23
+ >
24
+ <button
25
+ type="button"
26
+ class="el-picker-panel__shortcut"
27
+ v-for="(shortcut, key) in shortcuts"
28
+ :key="key"
29
+ @click="handleShortcutClick(shortcut)"
30
+ >{{ shortcut.text }}</button>
31
+ </div>
32
+ <div class="el-picker-panel__body">
33
+ <div
34
+ class="el-date-picker__time-header"
35
+ v-if="showTime"
36
+ >
37
+ <span class="el-date-picker__editor-wrap">
38
+ <el-input
39
+ :placeholder="t('el.datepicker.selectDate')"
40
+ :value="visibleDate"
41
+ size="small"
42
+ @input="val => userInputDate = val"
43
+ @change="handleVisibleDateChange"
44
+ />
45
+ </span>
46
+ <span
47
+ class="el-date-picker__editor-wrap"
48
+ v-clickoutside="handleTimePickClose"
49
+ >
50
+ <el-input
51
+ ref="input"
52
+ @focus="timePickerVisible = true"
53
+ :placeholder="t('el.datepicker.selectTime')"
54
+ :value="visibleTime"
55
+ size="small"
56
+ @input="val => userInputTime = val"
57
+ @change="handleVisibleTimeChange"
58
+ />
59
+ <time-picker
60
+ ref="timepicker"
61
+ :time-arrow-control="arrowControl"
62
+ @pick="handleTimePick"
63
+ :visible="timePickerVisible"
64
+ @mounted="proxyTimePickerDataProperties"
65
+ >
66
+ </time-picker>
67
+ </span>
68
+ </div>
69
+ <div
70
+ class="el-date-picker__header"
71
+ :class="{ 'el-date-picker__header--bordered': currentView === 'year' || currentView === 'month' }"
72
+ v-show="currentView !== 'time'"
73
+ >
74
+ <button
75
+ type="button"
76
+ @click="prevYear"
77
+ :aria-label="t(`el.datepicker.prevYear`)"
78
+ class="el-picker-panel__icon-btn el-date-picker__prev-btn el-icon-left1"
79
+ >
80
+ </button>
81
+ <button
82
+ type="button"
83
+ @click="prevMonth"
84
+ v-show="currentView === 'date'"
85
+ :aria-label="t(`el.datepicker.prevMonth`)"
86
+ class="el-picker-panel__icon-btn el-date-picker__prev-btn el-icon-left"
87
+ >
88
+ </button>
89
+ <div class="el-date-picker__header-label-warp">
90
+ <span
91
+ @click="showYearPicker"
92
+ role="button"
93
+ class="el-date-picker__header-label"
94
+ >{{ yearLabel }}</span>
95
+ <span
96
+ @click="showMonthPicker"
97
+ v-show="currentView === 'date'"
98
+ role="button"
99
+ class="el-date-picker__header-label"
100
+ :class="{ active: currentView === 'month' }"
101
+ >{{t(`el.datepicker.month${ month + 1 }`)}}</span>
102
+ </div>
103
+ <button
104
+ type="button"
105
+ @click="nextYear"
106
+ :aria-label="t(`el.datepicker.nextYear`)"
107
+ class="el-picker-panel__icon-btn el-date-picker__next-btn el-icon-right1-2"
108
+ >
109
+ </button>
110
+ <button
111
+ type="button"
112
+ @click="nextMonth"
113
+ v-show="currentView === 'date'"
114
+ :aria-label="t(`el.datepicker.nextMonth`)"
115
+ class="el-picker-panel__icon-btn el-date-picker__next-btn el-icon-right"
116
+ >
117
+ </button>
118
+ </div>
119
+
120
+ <div class="el-picker-panel__content">
121
+ <date-table
122
+ v-show="currentView === 'date'"
123
+ @pick="handleDatePick"
124
+ :selection-mode="selectionMode"
125
+ :first-day-of-week="firstDayOfWeek"
126
+ :value="value"
127
+ :default-value="defaultValue ? new Date(defaultValue) : null"
128
+ :date="date"
129
+ :cell-class-name="cellClassName"
130
+ :disabled-date="disabledDate"
131
+ :utc="utc"
132
+ >
133
+ </date-table>
134
+ <year-table
135
+ v-show="currentView === 'year'"
136
+ @pick="handleYearPick"
137
+ :selection-mode="selectionMode"
138
+ :value="value"
139
+ :default-value="defaultValue ? new Date(defaultValue) : null"
140
+ :date="date"
141
+ :disabled-date="disabledDate"
142
+ :utc="utc"
143
+ >
144
+ </year-table>
145
+ <month-table
146
+ v-show="currentView === 'month'"
147
+ @pick="handleMonthPick"
148
+ :selection-mode="selectionMode"
149
+ :value="value"
150
+ :default-value="defaultValue ? new Date(defaultValue) : null"
151
+ :date="date"
152
+ :disabled-date="disabledDate"
153
+ :utc="utc"
154
+ >
155
+ </month-table>
156
+ </div>
157
+ </div>
158
+ </div>
159
+
160
+ <div
161
+ class="el-picker-panel__footer"
162
+ v-show="footerVisible && (currentView === 'date' || currentView === 'month' || currentView === 'year')"
163
+ >
164
+ <el-button
165
+ size="mini"
166
+ type="text"
167
+ class="el-picker-panel__link-btn"
168
+ @click="changeToNow"
169
+ v-show="selectionMode !== 'dates' && selectionMode !== 'months' && selectionMode !== 'years'"
170
+ >
171
+ {{ t('el.datepicker.now') }}
172
+ </el-button>
173
+ <el-button
174
+ type="primary"
175
+ size="mini"
176
+ class="el-picker-panel__link-btn"
177
+ @click="confirm"
178
+ >
179
+ {{ t('el.datepicker.confirm') }}
180
+ </el-button>
181
+ </div>
182
+ </div>
183
+ </transition>
184
+ </template>
185
+
186
+ <script type="text/babel">
187
+ import { formatDate, parseDate, getWeekNumber, isDate, modifyDate, modifyTime, modifyWithTimeString, clearMilliseconds, clearTime, prevYear, nextYear, prevMonth, nextMonth, changeYearMonthAndClampDate, extractDateFormat, extractTimeFormat, timeWithinRange } from 'bi-eleme/src/utils/date-util'
188
+ import Clickoutside from 'bi-eleme/src/utils/clickoutside'
189
+ import Locale from 'bi-eleme/src/mixins/locale'
190
+ import ElInput from 'bi-eleme/packages/input'
191
+ import ElButton from 'bi-eleme/packages/button'
192
+ import TimePicker from './time'
193
+ import YearTable from '../basic/year-table'
194
+ import MonthTable from '../basic/month-table'
195
+ import DateTable from '../basic/date-table'
196
+
197
+ export default {
198
+ mixins: [Locale],
199
+
200
+ directives: { Clickoutside },
201
+
202
+ watch: {
203
+ showTime(val) {
204
+ /* istanbul ignore if */
205
+ if (!val) return
206
+ this.$nextTick((_) => {
207
+ const inputElm = this.$refs.input.$el
208
+ if (inputElm) {
209
+ this.pickerWidth = inputElm.getBoundingClientRect().width + 10
210
+ }
211
+ })
212
+ },
213
+
214
+ value(val) {
215
+ if (this.selectionMode === 'dates' && this.value) return
216
+ if (this.selectionMode === 'months' && this.value) return
217
+ if (this.selectionMode === 'years' && this.value) return
218
+ if (isDate(val)) {
219
+ this.date = new Date(val)
220
+ } else {
221
+ this.date = this.getDefaultValue()
222
+ }
223
+ },
224
+
225
+ defaultValue(val) {
226
+ if (!isDate(this.value)) {
227
+ this.date = val ? new Date(val) : new Date()
228
+ }
229
+ },
230
+
231
+ timePickerVisible(val) {
232
+ if (val) this.$nextTick(() => this.$refs.timepicker.adjustSpinners())
233
+ },
234
+
235
+ selectionMode(newVal) {
236
+ if (newVal === 'month') {
237
+ /* istanbul ignore next */
238
+ if (this.currentView !== 'year' || this.currentView !== 'month') {
239
+ this.currentView = 'month'
240
+ }
241
+ } else if (newVal === 'dates') {
242
+ this.currentView = 'date'
243
+ } else if (newVal === 'years') {
244
+ this.currentView = 'year'
245
+ } else if (newVal === 'months') {
246
+ this.currentView = 'month'
247
+ }
248
+ }
249
+ },
250
+
251
+ methods: {
252
+ proxyTimePickerDataProperties() {
253
+ const format = (timeFormat) => {
254
+ this.$refs.timepicker.format = timeFormat
255
+ }
256
+ const value = (value) => {
257
+ this.$refs.timepicker.value = value
258
+ }
259
+ const date = (date) => {
260
+ this.$refs.timepicker.date = date
261
+ }
262
+ const selectableRange = (selectableRange) => {
263
+ this.$refs.timepicker.selectableRange = selectableRange
264
+ }
265
+
266
+ this.$watch('value', value)
267
+ this.$watch('date', date)
268
+ this.$watch('selectableRange', selectableRange)
269
+
270
+ format(this.timeFormat)
271
+ value(this.value)
272
+ date(this.date)
273
+ selectableRange(this.selectableRange)
274
+ },
275
+
276
+ handleClear() {
277
+ this.date = this.getDefaultValue()
278
+ this.$emit('pick', null)
279
+ },
280
+
281
+ emit(value, ...args) {
282
+ if (!value) {
283
+ this.$emit('pick', value, ...args)
284
+ } else if (Array.isArray(value)) {
285
+ const dates = value.map((date) => (this.showTime ? clearMilliseconds(date) : clearTime(date)))
286
+ this.$emit('pick', dates, ...args)
287
+ } else {
288
+ this.$emit('pick', this.showTime ? clearMilliseconds(value) : clearTime(value), ...args)
289
+ }
290
+ this.userInputDate = null
291
+ this.userInputTime = null
292
+ },
293
+
294
+ // resetDate() {
295
+ // this.date = new Date(this.date);
296
+ // },
297
+
298
+ showMonthPicker() {
299
+ this.currentView = 'month'
300
+ },
301
+
302
+ showYearPicker() {
303
+ this.currentView = 'year'
304
+ },
305
+
306
+ // XXX: 没用到
307
+ // handleLabelClick() {
308
+ // if (this.currentView === 'date') {
309
+ // this.showMonthPicker();
310
+ // } else if (this.currentView === 'month') {
311
+ // this.showYearPicker();
312
+ // }
313
+ // },
314
+
315
+ prevMonth() {
316
+ this.date = prevMonth(this.date)
317
+ },
318
+
319
+ nextMonth() {
320
+ this.date = nextMonth(this.date)
321
+ },
322
+
323
+ prevYear() {
324
+ if (this.currentView === 'year') {
325
+ this.date = prevYear(this.date, 10)
326
+ } else {
327
+ this.date = prevYear(this.date)
328
+ }
329
+ },
330
+
331
+ nextYear() {
332
+ if (this.currentView === 'year') {
333
+ this.date = nextYear(this.date, 10)
334
+ } else {
335
+ this.date = nextYear(this.date)
336
+ }
337
+ },
338
+
339
+ handleShortcutClick(shortcut) {
340
+ if (shortcut.onClick) {
341
+ shortcut.onClick(this)
342
+ }
343
+ },
344
+
345
+ handleTimePick(value, visible, first) {
346
+ if (isDate(value)) {
347
+ const newDate = this.value ? modifyTime(this.value, value.getHours(), value.getMinutes(), value.getSeconds()) : modifyWithTimeString(this.getDefaultValue(), this.defaultTime)
348
+ this.date = newDate
349
+ this.emit(this.date, true)
350
+ } else {
351
+ this.emit(value, true)
352
+ }
353
+ if (!first) {
354
+ this.timePickerVisible = visible
355
+ }
356
+ },
357
+
358
+ handleTimePickClose() {
359
+ this.timePickerVisible = false
360
+ },
361
+
362
+ handleMonthPick(month) {
363
+ if (this.selectionMode === 'month') {
364
+ this.date = modifyDate(this.date, this.year, month, 1)
365
+ this.emit(this.date)
366
+ } else if (this.selectionMode === 'months') {
367
+ this.emit(month, true)
368
+ } else {
369
+ this.date = changeYearMonthAndClampDate(this.date, this.year, month)
370
+ // TODO: should emit intermediate value ??
371
+ // this.emit(this.date);
372
+ this.currentView = 'date'
373
+ }
374
+ },
375
+
376
+ handleDatePick(value) {
377
+ if (this.selectionMode === 'day') {
378
+ let newDate = this.value ? modifyDate(this.value, value.getFullYear(), value.getMonth(), value.getDate()) : modifyWithTimeString(value, this.defaultTime)
379
+ // change default time while out of selectableRange
380
+ if (!this.checkDateWithinRange(newDate)) {
381
+ newDate = modifyDate(this.selectableRange[0][0], value.getFullYear(), value.getMonth(), value.getDate())
382
+ }
383
+ this.date = newDate
384
+ this.emit(this.date, this.showTime)
385
+ } else if (this.selectionMode === 'week') {
386
+ this.emit(value.date)
387
+ } else if (this.selectionMode === 'dates') {
388
+ this.emit(value, true) // set false to keep panel open
389
+ }
390
+ },
391
+
392
+ handleYearPick(year) {
393
+ if (this.selectionMode === 'year') {
394
+ this.date = modifyDate(this.date, year, 0, 1)
395
+ this.emit(this.date)
396
+ } else if (this.selectionMode === 'years') {
397
+ this.emit(year, true)
398
+ } else {
399
+ this.date = changeYearMonthAndClampDate(this.date, year, this.month)
400
+ // TODO: should emit intermediate value ??
401
+ // this.emit(this.date, true);
402
+ this.currentView = 'month'
403
+ }
404
+ },
405
+
406
+ changeToNow() {
407
+ // NOTE: not a permanent solution
408
+ // consider disable "now" button in the future
409
+ if ((!this.disabledDate || !this.disabledDate(new Date())) && this.checkDateWithinRange(new Date())) {
410
+ this.date = new Date()
411
+ this.emit(this.date)
412
+ }
413
+ },
414
+
415
+ confirm() {
416
+ if (this.selectionMode === 'dates' || this.selectionMode === 'months' || this.selectionMode === 'years') {
417
+ this.emit(this.value)
418
+ } else {
419
+ // value were emitted in handle{Date,Time}Pick, nothing to update here
420
+ // deal with the scenario where: user opens the picker, then confirm without doing anything
421
+ const value = this.value ? this.value : modifyWithTimeString(this.getDefaultValue(), this.defaultTime)
422
+ this.date = new Date(value) // refresh date
423
+ this.emit(value)
424
+ }
425
+ },
426
+
427
+ resetView() {
428
+ if (this.selectionMode === 'month' || this.selectionMode === 'months') {
429
+ this.currentView = 'month'
430
+ } else if (this.selectionMode === 'year' || this.selectionMode === 'years') {
431
+ this.currentView = 'year'
432
+ } else {
433
+ this.currentView = 'date'
434
+ }
435
+ },
436
+
437
+ handleEnter() {
438
+ document.body.addEventListener('keydown', this.handleKeydown)
439
+ },
440
+
441
+ handleLeave() {
442
+ this.$emit('dodestroy')
443
+ document.body.removeEventListener('keydown', this.handleKeydown)
444
+ },
445
+
446
+ handleKeydown(event) {
447
+ const keyCode = event.keyCode
448
+ const list = [38, 40, 37, 39]
449
+ if (this.visible && !this.timePickerVisible) {
450
+ if (list.indexOf(keyCode) !== -1) {
451
+ this.handleKeyControl(keyCode)
452
+ event.stopPropagation()
453
+ event.preventDefault()
454
+ }
455
+ if (keyCode === 13 && this.userInputDate === null && this.userInputTime === null) {
456
+ // Enter
457
+ this.emit(this.date, false)
458
+ }
459
+ }
460
+ },
461
+
462
+ handleKeyControl(keyCode) {
463
+ const mapping = {
464
+ year: {
465
+ 38: -4,
466
+ 40: 4,
467
+ 37: -1,
468
+ 39: 1,
469
+ offset: (date, step) => date.setFullYear(date.getFullYear() + step)
470
+ },
471
+ month: {
472
+ 38: -4,
473
+ 40: 4,
474
+ 37: -1,
475
+ 39: 1,
476
+ offset: (date, step) => date.setMonth(date.getMonth() + step)
477
+ },
478
+ week: {
479
+ 38: -1,
480
+ 40: 1,
481
+ 37: -1,
482
+ 39: 1,
483
+ offset: (date, step) => date.setDate(date.getDate() + step * 7)
484
+ },
485
+ day: {
486
+ 38: -7,
487
+ 40: 7,
488
+ 37: -1,
489
+ 39: 1,
490
+ offset: (date, step) => date.setDate(date.getDate() + step)
491
+ }
492
+ }
493
+ const mode = this.selectionMode
494
+ const year = 3.1536e10
495
+ const now = this.date.getTime()
496
+ const newDate = new Date(this.date.getTime())
497
+ while (Math.abs(now - newDate.getTime()) <= year) {
498
+ const map = mapping[mode]
499
+ map.offset(newDate, map[keyCode])
500
+ if (typeof this.disabledDate === 'function' && this.disabledDate(newDate)) {
501
+ continue
502
+ }
503
+ this.date = newDate
504
+ this.$emit('pick', newDate, true)
505
+ break
506
+ }
507
+ },
508
+
509
+ handleVisibleTimeChange(value) {
510
+ const time = parseDate(value, this.timeFormat)
511
+ if (time && this.checkDateWithinRange(time)) {
512
+ this.date = modifyDate(time, this.year, this.month, this.monthDate)
513
+ this.userInputTime = null
514
+ this.$refs.timepicker.value = this.date
515
+ this.timePickerVisible = false
516
+ this.emit(this.date, true)
517
+ }
518
+ },
519
+
520
+ handleVisibleDateChange(value) {
521
+ const date = parseDate(value, this.dateFormat)
522
+ if (date) {
523
+ if (typeof this.disabledDate === 'function' && this.disabledDate(date)) {
524
+ return
525
+ }
526
+ this.date = modifyTime(date, this.date.getHours(), this.date.getMinutes(), this.date.getSeconds())
527
+ this.userInputDate = null
528
+ this.resetView()
529
+ this.emit(this.date, true)
530
+ }
531
+ },
532
+
533
+ isValidValue(value) {
534
+ return value && !isNaN(value) && (typeof this.disabledDate === 'function' ? !this.disabledDate(value) : true) && this.checkDateWithinRange(value)
535
+ },
536
+
537
+ getDefaultValue() {
538
+ // if default-value is set, return it
539
+ // otherwise, return now (the moment this method gets called)
540
+ return this.defaultValue ? new Date(this.defaultValue) : new Date()
541
+ },
542
+
543
+ checkDateWithinRange(date) {
544
+ return this.selectableRange.length > 0 ? timeWithinRange(date, this.selectableRange, this.format || 'HH:mm:ss') : true
545
+ }
546
+ },
547
+
548
+ components: {
549
+ TimePicker,
550
+ YearTable,
551
+ MonthTable,
552
+ DateTable,
553
+ ElInput,
554
+ ElButton
555
+ },
556
+
557
+ data() {
558
+ return {
559
+ popperClass: '',
560
+ date: new Date(),
561
+ value: '',
562
+ utc: 8,
563
+ defaultValue: null, // use getDefaultValue() for time computation
564
+ defaultTime: null,
565
+ showTime: false,
566
+ selectionMode: 'day',
567
+ shortcuts: '',
568
+ visible: false,
569
+ currentView: 'date',
570
+ disabledDate: '',
571
+ cellClassName: '',
572
+ selectableRange: [],
573
+ firstDayOfWeek: 7,
574
+ showWeekNumber: false,
575
+ timePickerVisible: false,
576
+ format: '',
577
+ arrowControl: false,
578
+ userInputDate: null,
579
+ userInputTime: null
580
+ }
581
+ },
582
+
583
+ computed: {
584
+ year() {
585
+ return this.date.getFullYear()
586
+ },
587
+
588
+ month() {
589
+ return this.date.getMonth()
590
+ },
591
+
592
+ week() {
593
+ return getWeekNumber(this.date)
594
+ },
595
+
596
+ monthDate() {
597
+ return this.date.getDate()
598
+ },
599
+
600
+ footerVisible() {
601
+ return this.showTime || this.selectionMode === 'dates' || this.selectionMode === 'months' || this.selectionMode === 'years'
602
+ },
603
+
604
+ visibleTime() {
605
+ if (this.userInputTime !== null) {
606
+ return this.userInputTime
607
+ } else {
608
+ return formatDate(this.value || this.defaultValue, this.timeFormat)
609
+ }
610
+ },
611
+
612
+ visibleDate() {
613
+ if (this.userInputDate !== null) {
614
+ return this.userInputDate
615
+ } else {
616
+ return formatDate(this.value || this.defaultValue, this.dateFormat)
617
+ }
618
+ },
619
+
620
+ yearLabel() {
621
+ const yearTranslation = this.t('el.datepicker.year')
622
+ if (this.currentView === 'year') {
623
+ const startYear = Math.floor(this.year / 10) * 10
624
+ if (yearTranslation) {
625
+ return startYear + ' ' + yearTranslation + ' - ' + (startYear + 9) + ' ' + yearTranslation
626
+ }
627
+ return startYear + ' - ' + (startYear + 9)
628
+ }
629
+ return this.year + ' ' + yearTranslation
630
+ },
631
+
632
+ timeFormat() {
633
+ if (this.format) {
634
+ return extractTimeFormat(this.format)
635
+ } else {
636
+ return 'HH:mm:ss'
637
+ }
638
+ },
639
+
640
+ dateFormat() {
641
+ if (this.format) {
642
+ return extractDateFormat(this.format)
643
+ } else {
644
+ return 'yyyy-MM-dd'
645
+ }
646
+ }
647
+ }
648
+ }
649
+ </script>