bi-eleme 2.2.1 → 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 (130) 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 +65 -64
  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 +4773 -311
  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 +59 -59
  87. package/lib/time-select.js +16 -16
  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 +5 -2
  95. package/lib/utils/date.js +67 -9
  96. package/package.json +1 -1
  97. package/packages/super-date/index.js +8 -0
  98. package/packages/super-date/src/basic/date-table.vue +448 -0
  99. package/packages/super-date/src/basic/month-table.vue +278 -0
  100. package/packages/super-date/src/basic/time-spinner.vue +340 -0
  101. package/packages/super-date/src/basic/year-table.vue +144 -0
  102. package/packages/super-date/src/panel/date-range.vue +1000 -0
  103. package/packages/super-date/src/panel/date.vue +649 -0
  104. package/packages/super-date/src/panel/month-range.vue +289 -0
  105. package/packages/super-date/src/panel/time-range.vue +250 -0
  106. package/packages/super-date/src/panel/time-select.vue +195 -0
  107. package/packages/super-date/src/panel/time.vue +211 -0
  108. package/packages/super-date/src/picker/date-picker.js +29 -0
  109. package/packages/super-date/src/picker/time-picker.js +39 -0
  110. package/packages/super-date/src/picker/time-select.js +21 -0
  111. package/packages/super-date/src/picker.vue +956 -0
  112. package/packages/theme-chalk/lib/index.css +1 -1
  113. package/packages/theme-chalk/lib/super-date.css +1 -0
  114. package/packages/theme-chalk/src/index.scss +1 -0
  115. package/packages/theme-chalk/src/super-date/date-picker.scss +106 -0
  116. package/packages/theme-chalk/src/super-date/date-range-picker.scss +138 -0
  117. package/packages/theme-chalk/src/super-date/date-table.scss +154 -0
  118. package/packages/theme-chalk/src/super-date/month-table.scss +96 -0
  119. package/packages/theme-chalk/src/super-date/picker-panel.scss +130 -0
  120. package/packages/theme-chalk/src/super-date/picker.scss +204 -0
  121. package/packages/theme-chalk/src/super-date/time-picker.scss +94 -0
  122. package/packages/theme-chalk/src/super-date/time-range-picker.scss +32 -0
  123. package/packages/theme-chalk/src/super-date/time-spinner.scss +111 -0
  124. package/packages/theme-chalk/src/super-date/year-table.scss +66 -0
  125. package/packages/theme-chalk/src/super-date.scss +12 -0
  126. package/src/index.js +4 -1
  127. package/src/utils/date-util.js +3 -0
  128. package/src/utils/date.js +291 -195
  129. package/types/element-ui.d.ts +9 -5
  130. package/types/super-date.d.ts +124 -0
@@ -0,0 +1,289 @@
1
+ <template>
2
+ <transition
3
+ name="el-zoom-in-top"
4
+ @after-leave="$emit('dodestroy')"
5
+ >
6
+ <div
7
+ v-show="visible"
8
+ class="el-picker-panel el-date-range-picker el-popper"
9
+ :class="[{
10
+ 'has-sidebar': $slots.sidebar || shortcuts
11
+ }, popperClass]"
12
+ >
13
+ <div class="el-picker-panel__body-wrapper">
14
+ <slot
15
+ name="sidebar"
16
+ class="el-picker-panel__sidebar"
17
+ ></slot>
18
+ <div
19
+ class="el-picker-panel__sidebar"
20
+ v-if="shortcuts"
21
+ >
22
+ <button
23
+ type="button"
24
+ class="el-picker-panel__shortcut"
25
+ v-for="(shortcut, key) in shortcuts"
26
+ :key="key"
27
+ @click="handleShortcutClick(shortcut)"
28
+ >{{shortcut.text}}</button>
29
+ </div>
30
+ <div class="el-picker-panel__body">
31
+ <div class="el-picker-panel__content el-date-range-picker__content is-left">
32
+ <div class="el-date-range-picker__header">
33
+ <button
34
+ type="button"
35
+ @click="leftPrevYear"
36
+ class="el-picker-panel__icon-btn el-icon-left1"
37
+ ></button>
38
+ <button
39
+ type="button"
40
+ v-if="unlinkPanels"
41
+ @click="leftNextYear"
42
+ :disabled="!enableYearArrow"
43
+ :class="{ 'is-disabled': !enableYearArrow }"
44
+ class="el-picker-panel__icon-btn el-icon-right1-2"
45
+ ></button>
46
+ <div>{{ leftLabel }}</div>
47
+ </div>
48
+ <month-table
49
+ selection-mode="range"
50
+ :date="leftDate"
51
+ :default-value="defaultValue"
52
+ :min-date="minDate"
53
+ :max-date="maxDate"
54
+ :range-state="rangeState"
55
+ :disabled-date="disabledDate"
56
+ @changerange="handleChangeRange"
57
+ @pick="handleRangePick"
58
+ >
59
+ </month-table>
60
+ </div>
61
+ <div class="el-picker-panel__content el-date-range-picker__content is-right">
62
+ <div class="el-date-range-picker__header">
63
+ <button
64
+ type="button"
65
+ v-if="unlinkPanels"
66
+ @click="rightPrevYear"
67
+ :disabled="!enableYearArrow"
68
+ :class="{ 'is-disabled': !enableYearArrow }"
69
+ class="el-picker-panel__icon-btn el-icon-left1"
70
+ ></button>
71
+ <button
72
+ type="button"
73
+ @click="rightNextYear"
74
+ class="el-picker-panel__icon-btn el-icon-right1-2"
75
+ ></button>
76
+ <div>{{ rightLabel }}</div>
77
+ </div>
78
+ <month-table
79
+ selection-mode="range"
80
+ :date="rightDate"
81
+ :default-value="defaultValue"
82
+ :min-date="minDate"
83
+ :max-date="maxDate"
84
+ :range-state="rangeState"
85
+ :disabled-date="disabledDate"
86
+ @changerange="handleChangeRange"
87
+ @pick="handleRangePick"
88
+ >
89
+ </month-table>
90
+ </div>
91
+ </div>
92
+ </div>
93
+ </div>
94
+ </transition>
95
+ </template>
96
+
97
+ <script type="text/babel">
98
+ import { isDate, modifyWithTimeString, prevYear, nextYear, nextMonth } from 'bi-eleme/src/utils/date-util'
99
+ import Clickoutside from 'bi-eleme/src/utils/clickoutside'
100
+ import Locale from 'bi-eleme/src/mixins/locale'
101
+ import MonthTable from '../basic/month-table'
102
+ import ElInput from 'bi-eleme/packages/input'
103
+ import ElButton from 'bi-eleme/packages/button'
104
+
105
+ const calcDefaultValue = (defaultValue) => {
106
+ if (Array.isArray(defaultValue)) {
107
+ return [new Date(defaultValue[0]), new Date(defaultValue[1])]
108
+ } else if (defaultValue) {
109
+ return [new Date(defaultValue), nextMonth(new Date(defaultValue))]
110
+ } else {
111
+ return [new Date(), nextMonth(new Date())]
112
+ }
113
+ }
114
+ export default {
115
+ mixins: [Locale],
116
+
117
+ directives: { Clickoutside },
118
+
119
+ computed: {
120
+ btnDisabled() {
121
+ return !(this.minDate && this.maxDate && !this.selecting && this.isValidValue([this.minDate, this.maxDate]))
122
+ },
123
+
124
+ leftLabel() {
125
+ return this.leftDate.getFullYear() + ' ' + this.t('el.datepicker.year')
126
+ },
127
+
128
+ rightLabel() {
129
+ return this.rightDate.getFullYear() + ' ' + this.t('el.datepicker.year')
130
+ },
131
+
132
+ leftYear() {
133
+ return this.leftDate.getFullYear()
134
+ },
135
+
136
+ rightYear() {
137
+ return this.rightDate.getFullYear() === this.leftDate.getFullYear() ? this.leftDate.getFullYear() + 1 : this.rightDate.getFullYear()
138
+ },
139
+
140
+ enableYearArrow() {
141
+ return this.unlinkPanels && this.rightYear > this.leftYear + 1
142
+ }
143
+ },
144
+
145
+ data() {
146
+ return {
147
+ popperClass: '',
148
+ value: [],
149
+ defaultValue: null,
150
+ defaultTime: null,
151
+ minDate: '',
152
+ maxDate: '',
153
+ leftDate: new Date(),
154
+ rightDate: nextYear(new Date()),
155
+ rangeState: {
156
+ endDate: null,
157
+ selecting: false,
158
+ row: null,
159
+ column: null
160
+ },
161
+ shortcuts: '',
162
+ visible: '',
163
+ disabledDate: '',
164
+ format: '',
165
+ arrowControl: false,
166
+ unlinkPanels: false
167
+ }
168
+ },
169
+
170
+ watch: {
171
+ value(newVal) {
172
+ if (!newVal) {
173
+ this.minDate = null
174
+ this.maxDate = null
175
+ } else if (Array.isArray(newVal)) {
176
+ this.minDate = isDate(newVal[0]) ? new Date(newVal[0]) : null
177
+ this.maxDate = isDate(newVal[1]) ? new Date(newVal[1]) : null
178
+ if (this.minDate) {
179
+ this.leftDate = this.minDate
180
+ if (this.unlinkPanels && this.maxDate) {
181
+ const minDateYear = this.minDate.getFullYear()
182
+ const maxDateYear = this.maxDate.getFullYear()
183
+ this.rightDate = minDateYear === maxDateYear ? nextYear(this.maxDate) : this.maxDate
184
+ } else {
185
+ this.rightDate = nextYear(this.leftDate)
186
+ }
187
+ } else {
188
+ this.leftDate = calcDefaultValue(this.defaultValue)[0]
189
+ this.rightDate = nextYear(this.leftDate)
190
+ }
191
+ }
192
+ },
193
+
194
+ defaultValue(val) {
195
+ if (!Array.isArray(this.value)) {
196
+ const [left, right] = calcDefaultValue(val)
197
+ this.leftDate = left
198
+ this.rightDate = val && val[1] && left.getFullYear() !== right.getFullYear() && this.unlinkPanels ? right : nextYear(this.leftDate)
199
+ }
200
+ }
201
+ },
202
+
203
+ methods: {
204
+ handleClear() {
205
+ this.minDate = null
206
+ this.maxDate = null
207
+ this.leftDate = calcDefaultValue(this.defaultValue)[0]
208
+ this.rightDate = nextYear(this.leftDate)
209
+ this.$emit('pick', null)
210
+ },
211
+
212
+ handleChangeRange(val) {
213
+ this.minDate = val.minDate
214
+ this.maxDate = val.maxDate
215
+ this.rangeState = val.rangeState
216
+ },
217
+
218
+ handleRangePick(val, close = true) {
219
+ const defaultTime = this.defaultTime || []
220
+ const minDate = modifyWithTimeString(val.minDate, defaultTime[0])
221
+ const maxDate = modifyWithTimeString(val.maxDate, defaultTime[1])
222
+ if (this.maxDate === maxDate && this.minDate === minDate) {
223
+ return
224
+ }
225
+ this.onPick && this.onPick(val)
226
+ this.maxDate = maxDate
227
+ this.minDate = minDate
228
+
229
+ // workaround for https://github.com/ElemeFE/element/issues/7539, should remove this block when we don't have to care about Chromium 55 - 57
230
+ setTimeout(() => {
231
+ this.maxDate = maxDate
232
+ this.minDate = minDate
233
+ }, 10)
234
+ if (!close) return
235
+ this.handleConfirm()
236
+ },
237
+
238
+ handleShortcutClick(shortcut) {
239
+ if (shortcut.onClick) {
240
+ shortcut.onClick(this)
241
+ }
242
+ },
243
+
244
+ // leftPrev*, rightNext* need to take care of `unlinkPanels`
245
+ leftPrevYear() {
246
+ this.leftDate = prevYear(this.leftDate)
247
+ if (!this.unlinkPanels) {
248
+ this.rightDate = prevYear(this.rightDate)
249
+ }
250
+ },
251
+
252
+ rightNextYear() {
253
+ if (!this.unlinkPanels) {
254
+ this.leftDate = nextYear(this.leftDate)
255
+ }
256
+ this.rightDate = nextYear(this.rightDate)
257
+ },
258
+
259
+ // leftNext*, rightPrev* are called when `unlinkPanels` is true
260
+ leftNextYear() {
261
+ this.leftDate = nextYear(this.leftDate)
262
+ },
263
+
264
+ rightPrevYear() {
265
+ this.rightDate = prevYear(this.rightDate)
266
+ },
267
+
268
+ handleConfirm(visible = false) {
269
+ if (this.isValidValue([this.minDate, this.maxDate])) {
270
+ this.$emit('pick', [this.minDate, this.maxDate], visible)
271
+ }
272
+ },
273
+
274
+ isValidValue(value) {
275
+ return Array.isArray(value) && value && value[0] && value[1] && isDate(value[0]) && isDate(value[1]) && value[0].getTime() <= value[1].getTime() && (typeof this.disabledDate === 'function' ? !this.disabledDate(value[0]) && !this.disabledDate(value[1]) : true)
276
+ },
277
+
278
+ resetView() {
279
+ // NOTE: this is a hack to reset {min, max}Date on picker open.
280
+ // TODO: correct way of doing so is to refactor {min, max}Date to be dependent on value and internal selection state
281
+ // an alternative would be resetView whenever picker becomes visible, should also investigate date-panel's resetView
282
+ this.minDate = this.value && isDate(this.value[0]) ? new Date(this.value[0]) : null
283
+ this.maxDate = this.value && isDate(this.value[0]) ? new Date(this.value[1]) : null
284
+ }
285
+ },
286
+
287
+ components: { MonthTable, ElInput, ElButton }
288
+ }
289
+ </script>
@@ -0,0 +1,250 @@
1
+ <template>
2
+ <transition
3
+ name="el-zoom-in-top"
4
+ @after-leave="$emit('dodestroy')"
5
+ >
6
+ <div
7
+ v-show="visible"
8
+ class="el-time-range-picker el-picker-panel el-popper"
9
+ :class="popperClass"
10
+ >
11
+ <div class="el-time-range-picker__content">
12
+ <div class="el-time-range-picker__cell">
13
+ <div class="el-time-range-picker__header">{{ t('el.datepicker.startTime') }}</div>
14
+ <div
15
+ :class="{ 'has-seconds': showSeconds, 'is-arrow': arrowControl }"
16
+ class="el-time-range-picker__body el-time-panel__content"
17
+ >
18
+ <time-spinner
19
+ ref="minSpinner"
20
+ :show-seconds="showSeconds"
21
+ :am-pm-mode="amPmMode"
22
+ @change="handleMinChange"
23
+ :arrow-control="arrowControl"
24
+ @select-range="setMinSelectionRange"
25
+ :date="minDate"
26
+ >
27
+ </time-spinner>
28
+ </div>
29
+ </div>
30
+ <div class="el-time-range-picker__cell">
31
+ <div class="el-time-range-picker__header">{{ t('el.datepicker.endTime') }}</div>
32
+ <div
33
+ :class="{ 'has-seconds': showSeconds, 'is-arrow': arrowControl }"
34
+ class="el-time-range-picker__body el-time-panel__content"
35
+ >
36
+ <time-spinner
37
+ ref="maxSpinner"
38
+ :show-seconds="showSeconds"
39
+ :am-pm-mode="amPmMode"
40
+ @change="handleMaxChange"
41
+ :arrow-control="arrowControl"
42
+ @select-range="setMaxSelectionRange"
43
+ :date="maxDate"
44
+ >
45
+ </time-spinner>
46
+ </div>
47
+ </div>
48
+ </div>
49
+ <div class="el-time-panel__footer">
50
+ <el-button
51
+ type="text"
52
+ size="mini"
53
+ class="el-time-panel__btn cancel"
54
+ @click="handleCancel()"
55
+ >{{ t('el.datepicker.cancel') }}</el-button>
56
+ <el-button
57
+ type="primary"
58
+ size="mini"
59
+ class="el-time-panel__btn confirm"
60
+ @click="handleConfirm()"
61
+ :disabled="btnDisabled"
62
+ >{{ t('el.datepicker.confirm') }}</el-button>
63
+ </div>
64
+ </div>
65
+ </transition>
66
+ </template>
67
+
68
+ <script type="text/babel">
69
+ import { parseDate, limitTimeRange, modifyDate, clearMilliseconds, timeWithinRange } from 'bi-eleme/src/utils/date-util'
70
+ import Locale from 'bi-eleme/src/mixins/locale'
71
+ import TimeSpinner from '../basic/time-spinner'
72
+
73
+ const MIN_TIME = parseDate('00:00:00', 'HH:mm:ss')
74
+ const MAX_TIME = parseDate('23:59:59', 'HH:mm:ss')
75
+
76
+ const minTimeOfDay = function (date) {
77
+ return modifyDate(MIN_TIME, date.getFullYear(), date.getMonth(), date.getDate())
78
+ }
79
+
80
+ const maxTimeOfDay = function (date) {
81
+ return modifyDate(MAX_TIME, date.getFullYear(), date.getMonth(), date.getDate())
82
+ }
83
+
84
+ // increase time by amount of milliseconds, but within the range of day
85
+ const advanceTime = function (date, amount) {
86
+ return new Date(Math.min(date.getTime() + amount, maxTimeOfDay(date).getTime()))
87
+ }
88
+
89
+ export default {
90
+ mixins: [Locale],
91
+
92
+ components: { TimeSpinner },
93
+
94
+ computed: {
95
+ showSeconds() {
96
+ return (this.format || '').indexOf('ss') !== -1
97
+ },
98
+
99
+ offset() {
100
+ return this.showSeconds ? 11 : 8
101
+ },
102
+
103
+ spinner() {
104
+ return this.selectionRange[0] < this.offset ? this.$refs.minSpinner : this.$refs.maxSpinner
105
+ },
106
+
107
+ btnDisabled() {
108
+ return this.minDate.getTime() > this.maxDate.getTime()
109
+ },
110
+ amPmMode() {
111
+ if ((this.format || '').indexOf('A') !== -1) return 'A'
112
+ if ((this.format || '').indexOf('a') !== -1) return 'a'
113
+ return ''
114
+ }
115
+ },
116
+
117
+ data() {
118
+ return {
119
+ popperClass: '',
120
+ minDate: new Date(),
121
+ maxDate: new Date(),
122
+ value: [],
123
+ oldValue: [new Date(), new Date()],
124
+ defaultValue: null,
125
+ format: 'HH:mm:ss',
126
+ visible: false,
127
+ selectionRange: [0, 2],
128
+ arrowControl: false
129
+ }
130
+ },
131
+
132
+ watch: {
133
+ value(value) {
134
+ if (Array.isArray(value)) {
135
+ this.minDate = new Date(value[0])
136
+ this.maxDate = new Date(value[1])
137
+ } else {
138
+ if (Array.isArray(this.defaultValue)) {
139
+ this.minDate = new Date(this.defaultValue[0])
140
+ this.maxDate = new Date(this.defaultValue[1])
141
+ } else if (this.defaultValue) {
142
+ this.minDate = new Date(this.defaultValue)
143
+ this.maxDate = advanceTime(new Date(this.defaultValue), 60 * 60 * 1000)
144
+ } else {
145
+ this.minDate = new Date()
146
+ this.maxDate = advanceTime(new Date(), 60 * 60 * 1000)
147
+ }
148
+ }
149
+ },
150
+
151
+ visible(val) {
152
+ if (val) {
153
+ this.oldValue = this.value
154
+ this.$nextTick(() => this.$refs.minSpinner.emitSelectRange('hours'))
155
+ }
156
+ }
157
+ },
158
+
159
+ methods: {
160
+ handleClear() {
161
+ this.$emit('pick', null)
162
+ },
163
+
164
+ handleCancel() {
165
+ this.$emit('pick', this.oldValue)
166
+ },
167
+
168
+ handleMinChange(date) {
169
+ this.minDate = clearMilliseconds(date)
170
+ this.handleChange()
171
+ },
172
+
173
+ handleMaxChange(date) {
174
+ this.maxDate = clearMilliseconds(date)
175
+ this.handleChange()
176
+ },
177
+
178
+ handleChange() {
179
+ if (this.isValidValue([this.minDate, this.maxDate])) {
180
+ this.$refs.minSpinner.selectableRange = [[minTimeOfDay(this.minDate), this.maxDate]]
181
+ this.$refs.maxSpinner.selectableRange = [[this.minDate, maxTimeOfDay(this.maxDate)]]
182
+ this.$emit('pick', [this.minDate, this.maxDate], true)
183
+ }
184
+ },
185
+
186
+ setMinSelectionRange(start, end) {
187
+ this.$emit('select-range', start, end, 'min')
188
+ this.selectionRange = [start, end]
189
+ },
190
+
191
+ setMaxSelectionRange(start, end) {
192
+ this.$emit('select-range', start, end, 'max')
193
+ this.selectionRange = [start + this.offset, end + this.offset]
194
+ },
195
+
196
+ handleConfirm(visible = false) {
197
+ const minSelectableRange = this.$refs.minSpinner.selectableRange
198
+ const maxSelectableRange = this.$refs.maxSpinner.selectableRange
199
+
200
+ this.minDate = limitTimeRange(this.minDate, minSelectableRange, this.format)
201
+ this.maxDate = limitTimeRange(this.maxDate, maxSelectableRange, this.format)
202
+
203
+ this.$emit('pick', [this.minDate, this.maxDate], visible)
204
+ },
205
+
206
+ adjustSpinners() {
207
+ this.$refs.minSpinner.adjustSpinners()
208
+ this.$refs.maxSpinner.adjustSpinners()
209
+ },
210
+
211
+ changeSelectionRange(step) {
212
+ const list = this.showSeconds ? [0, 3, 6, 11, 14, 17] : [0, 3, 8, 11]
213
+ const mapping = ['hours', 'minutes'].concat(this.showSeconds ? ['seconds'] : [])
214
+ const index = list.indexOf(this.selectionRange[0])
215
+ const next = (index + step + list.length) % list.length
216
+ const half = list.length / 2
217
+ if (next < half) {
218
+ this.$refs.minSpinner.emitSelectRange(mapping[next])
219
+ } else {
220
+ this.$refs.maxSpinner.emitSelectRange(mapping[next - half])
221
+ }
222
+ },
223
+
224
+ isValidValue(date) {
225
+ return Array.isArray(date) && timeWithinRange(this.minDate, this.$refs.minSpinner.selectableRange) && timeWithinRange(this.maxDate, this.$refs.maxSpinner.selectableRange)
226
+ },
227
+
228
+ handleKeydown(event) {
229
+ const keyCode = event.keyCode
230
+ const mapping = { 38: -1, 40: 1, 37: -1, 39: 1 }
231
+
232
+ // Left or Right
233
+ if (keyCode === 37 || keyCode === 39) {
234
+ const step = mapping[keyCode]
235
+ this.changeSelectionRange(step)
236
+ event.preventDefault()
237
+ return
238
+ }
239
+
240
+ // Up or Down
241
+ if (keyCode === 38 || keyCode === 40) {
242
+ const step = mapping[keyCode]
243
+ this.spinner.scrollDown(step)
244
+ event.preventDefault()
245
+ return
246
+ }
247
+ }
248
+ }
249
+ }
250
+ </script>