Commit ca8e830cc36301f2347c63a635f8733af88d3da4
1 parent
c4e3fe33
move files to subfolders
Showing
7 changed files
with
183 additions
and
271 deletions
Show diff stats
src/components/date-picker/base/month-table.vue deleted
| 1 | -<template> | |
| 2 | - <div :class="classes" @click="handleClick"> | |
| 3 | - <span :class="getCellCls(cell)" v-for="(cell, index) in cells"><em :index="index">{{ tCell(cell.text) }}</em></span> | |
| 4 | - </div> | |
| 5 | -</template> | |
| 6 | -<script> | |
| 7 | - import { deepCopy } from '../../../utils/assist'; | |
| 8 | - import Locale from '../../../mixins/locale'; | |
| 9 | - const prefixCls = 'ivu-date-picker-cells'; | |
| 10 | - | |
| 11 | - export default { | |
| 12 | - mixins: [ Locale ], | |
| 13 | - props: { | |
| 14 | - date: {}, | |
| 15 | - month: { | |
| 16 | - type: Number | |
| 17 | - }, | |
| 18 | - disabledDate: {}, | |
| 19 | - selectionMode: { | |
| 20 | - default: 'month' | |
| 21 | - } | |
| 22 | - }, | |
| 23 | - computed: { | |
| 24 | - classes () { | |
| 25 | - return [ | |
| 26 | - `${prefixCls}`, | |
| 27 | - `${prefixCls}-month` | |
| 28 | - ]; | |
| 29 | - }, | |
| 30 | - cells () { | |
| 31 | - let cells = []; | |
| 32 | - const cell_tmpl = { | |
| 33 | - text: '', | |
| 34 | - selected: false, | |
| 35 | - disabled: false | |
| 36 | - }; | |
| 37 | - | |
| 38 | - for (let i = 0; i < 12; i++) { | |
| 39 | - const cell = deepCopy(cell_tmpl); | |
| 40 | - cell.text = i + 1; | |
| 41 | - | |
| 42 | - const date = new Date(this.date); | |
| 43 | - date.setMonth(i); | |
| 44 | - cell.disabled = typeof this.disabledDate === 'function' && this.disabledDate(date) && this.selectionMode === 'month'; | |
| 45 | - | |
| 46 | - cell.selected = Number(this.month) === i; | |
| 47 | - cells.push(cell); | |
| 48 | - } | |
| 49 | - | |
| 50 | - return cells; | |
| 51 | - } | |
| 52 | - }, | |
| 53 | - methods: { | |
| 54 | - getCellCls (cell) { | |
| 55 | - return [ | |
| 56 | - `${prefixCls}-cell`, | |
| 57 | - { | |
| 58 | - [`${prefixCls}-cell-selected`]: cell.selected, | |
| 59 | - [`${prefixCls}-cell-disabled`]: cell.disabled | |
| 60 | - } | |
| 61 | - ]; | |
| 62 | - }, | |
| 63 | - handleClick (event) { | |
| 64 | - const target = event.target; | |
| 65 | - if (target.tagName === 'EM') { | |
| 66 | - const index = parseInt(event.target.getAttribute('index')); | |
| 67 | - const cell = this.cells[index]; | |
| 68 | - if (cell.disabled) return; | |
| 69 | - | |
| 70 | - this.$emit('on-pick', index); | |
| 71 | - } | |
| 72 | - this.$emit('on-pick-click'); | |
| 73 | - }, | |
| 74 | - tCell (cell) { | |
| 75 | - return this.t(`i.datepicker.months.m${cell}`); | |
| 76 | - } | |
| 77 | - } | |
| 78 | - }; | |
| 79 | -</script> |
src/components/date-picker/base/year-table.vue
| 1 | 1 | <template> |
| 2 | - <div :class="classes" @click="handleClick"> | |
| 3 | - <span :class="getCellCls(cell)" v-for="(cell, index) in cells"><em :index="index">{{ cell.text }}</em></span> | |
| 2 | + <div :class="classes"> | |
| 3 | + <span | |
| 4 | + :class="getCellCls(cell)" | |
| 5 | + v-for="cell in cells" | |
| 6 | + @click="handleClick(cell)" | |
| 7 | + @mouseenter="handleMouseMove(cell)" | |
| 8 | + > | |
| 9 | + <em>{{ cell.date.getFullYear() }}</em> | |
| 10 | + </span> | |
| 4 | 11 | </div> |
| 5 | 12 | </template> |
| 6 | 13 | <script> |
| 14 | + import { clearHours, isInRange } from '../util'; | |
| 7 | 15 | import { deepCopy } from '../../../utils/assist'; |
| 8 | - const prefixCls = 'ivu-date-picker-cells'; | |
| 16 | + import mixin from './mixin'; | |
| 17 | + import prefixCls from './prefixCls'; | |
| 9 | 18 | |
| 10 | 19 | export default { |
| 11 | - props: { | |
| 12 | - date: {}, | |
| 13 | - year: {}, | |
| 14 | - disabledDate: {}, | |
| 15 | - selectionMode: { | |
| 16 | - default: 'year' | |
| 17 | - } | |
| 18 | - }, | |
| 20 | + mixins: [ mixin ], | |
| 21 | + | |
| 22 | + props: {/* in mixin */}, | |
| 19 | 23 | computed: { |
| 20 | - classes () { | |
| 24 | + classes() { | |
| 21 | 25 | return [ |
| 22 | 26 | `${prefixCls}`, |
| 23 | 27 | `${prefixCls}-year` |
| 24 | 28 | ]; |
| 25 | 29 | }, |
| 26 | 30 | startYear() { |
| 27 | - return Math.floor(this.year / 10) * 10; | |
| 31 | + return Math.floor(this.tableDate.getFullYear() / 10) * 10; | |
| 28 | 32 | }, |
| 29 | 33 | cells () { |
| 30 | 34 | let cells = []; |
| ... | ... | @@ -34,15 +38,18 @@ |
| 34 | 38 | disabled: false |
| 35 | 39 | }; |
| 36 | 40 | |
| 37 | - for (let i = 0; i < 10; i++) { | |
| 38 | - const cell = deepCopy(cell_tmpl); | |
| 39 | - cell.text = this.startYear + i; | |
| 41 | + const rangeStart = this.rangeState.from && clearHours(new Date(this.rangeState.from.getFullYear(), 0, 1)); | |
| 42 | + const rangeEnd = this.rangeState.to && clearHours(new Date(this.rangeState.to.getFullYear(), 0, 1)); | |
| 43 | + const selectedDays = this.dates.filter(Boolean).map(date => clearHours(new Date(date.getFullYear(), 0, 1))); | |
| 40 | 44 | |
| 41 | - const date = new Date(this.date); | |
| 42 | - date.setFullYear(cell.text); | |
| 43 | - cell.disabled = typeof this.disabledDate === 'function' && this.disabledDate(date) && this.selectionMode === 'year'; | |
| 44 | 45 | |
| 45 | - cell.selected = Number(this.year) === cell.text; | |
| 46 | + for (let i = 0; i < 10; i++) { | |
| 47 | + const cell = deepCopy(cell_tmpl); | |
| 48 | + cell.date = new Date(this.startYear + i, 0, 1); | |
| 49 | + cell.disabled = typeof this.disabledDate === 'function' && this.disabledDate(cell.date) && this.selectionMode === 'year'; | |
| 50 | + const time = clearHours(cell.date); | |
| 51 | + cell.range = isInRange(time, rangeStart, rangeEnd); | |
| 52 | + cell.selected = selectedDays.includes(time); | |
| 46 | 53 | cells.push(cell); |
| 47 | 54 | } |
| 48 | 55 | |
| ... | ... | @@ -55,26 +62,11 @@ |
| 55 | 62 | `${prefixCls}-cell`, |
| 56 | 63 | { |
| 57 | 64 | [`${prefixCls}-cell-selected`]: cell.selected, |
| 58 | - [`${prefixCls}-cell-disabled`]: cell.disabled | |
| 65 | + [`${prefixCls}-cell-disabled`]: cell.disabled, | |
| 66 | + [`${prefixCls}-cell-range`]: cell.range && !cell.start && !cell.end | |
| 59 | 67 | } |
| 60 | 68 | ]; |
| 61 | 69 | }, |
| 62 | - nextTenYear() { | |
| 63 | - this.$emit('on-pick', Number(this.year) + 10, false); | |
| 64 | - }, | |
| 65 | - prevTenYear() { | |
| 66 | - this.$emit('on-pick', Number(this.year) - 10, false); | |
| 67 | - }, | |
| 68 | - handleClick (event) { | |
| 69 | - const target = event.target; | |
| 70 | - if (target.tagName === 'EM') { | |
| 71 | - const cell = this.cells[parseInt(event.target.getAttribute('index'))]; | |
| 72 | - if (cell.disabled) return; | |
| 73 | - | |
| 74 | - this.$emit('on-pick', cell.text); | |
| 75 | - } | |
| 76 | - this.$emit('on-pick-click'); | |
| 77 | - } | |
| 78 | 70 | } |
| 79 | 71 | }; |
| 80 | 72 | </script> | ... | ... |
src/components/date-picker/panel/date-panel-label.vue renamed to src/components/date-picker/panel/Date/date-panel-label.vue
src/components/date-picker/panel/Date/date-panel-mixin.js
0 โ 100644
| 1 | + | |
| 2 | +import { oneOf } from '../../../../utils/assist'; | |
| 3 | +import {initTimeDate } from '../../util'; | |
| 4 | + | |
| 5 | + | |
| 6 | +export default { | |
| 7 | + props: { | |
| 8 | + confirm: { | |
| 9 | + type: Boolean, | |
| 10 | + default: false | |
| 11 | + }, | |
| 12 | + showTime: { | |
| 13 | + type: Boolean, | |
| 14 | + default: false | |
| 15 | + }, | |
| 16 | + format: { | |
| 17 | + type: String, | |
| 18 | + default: 'yyyy-MM-dd' | |
| 19 | + }, | |
| 20 | + selectionMode: { | |
| 21 | + type: String, | |
| 22 | + validator (value) { | |
| 23 | + return oneOf(value, ['year', 'month', 'date', 'time']); | |
| 24 | + }, | |
| 25 | + default: 'date' | |
| 26 | + }, | |
| 27 | + shortcuts: { | |
| 28 | + type: Array, | |
| 29 | + default: () => [] | |
| 30 | + }, | |
| 31 | + disabledDate: { | |
| 32 | + type: Function, | |
| 33 | + default: () => false | |
| 34 | + }, | |
| 35 | + value: { | |
| 36 | + type: Array, | |
| 37 | + default: () => [initTimeDate(), initTimeDate()] | |
| 38 | + } | |
| 39 | + }, | |
| 40 | + computed: { | |
| 41 | + isTime(){ | |
| 42 | + return this.currentView === 'time'; | |
| 43 | + } | |
| 44 | + }, | |
| 45 | + methods: { | |
| 46 | + handleToggleTime(){ | |
| 47 | + this.currentView = this.currentView === 'time' ? this.selectionMode : 'time'; | |
| 48 | + }, | |
| 49 | + } | |
| 50 | +}; | ... | ... |
src/components/date-picker/panel/time-range.vue renamed to src/components/date-picker/panel/Time/time-range.vue
| ... | ... | @@ -10,9 +10,9 @@ |
| 10 | 10 | ref="timeSpinner" |
| 11 | 11 | :steps="steps" |
| 12 | 12 | :show-seconds="showSeconds" |
| 13 | - :hours="hours" | |
| 14 | - :minutes="minutes" | |
| 15 | - :seconds="seconds" | |
| 13 | + :hours="dateStart.getHours()" | |
| 14 | + :minutes="dateStart.getMinutes()" | |
| 15 | + :seconds="dateStart.getSeconds()" | |
| 16 | 16 | :disabled-hours="disabledHours" |
| 17 | 17 | :disabled-minutes="disabledMinutes" |
| 18 | 18 | :disabled-seconds="disabledSeconds" |
| ... | ... | @@ -29,9 +29,9 @@ |
| 29 | 29 | ref="timeSpinnerEnd" |
| 30 | 30 | :steps="steps" |
| 31 | 31 | :show-seconds="showSeconds" |
| 32 | - :hours="hoursEnd" | |
| 33 | - :minutes="minutesEnd" | |
| 34 | - :seconds="secondsEnd" | |
| 32 | + :hours="dateEnd.getHours()" | |
| 33 | + :minutes="dateEnd.getMinutes()" | |
| 34 | + :seconds="dateEnd.getSeconds()" | |
| 35 | 35 | :disabled-hours="disabledHours" |
| 36 | 36 | :disabled-minutes="disabledMinutes" |
| 37 | 37 | :disabled-seconds="disabledSeconds" |
| ... | ... | @@ -47,46 +47,47 @@ |
| 47 | 47 | </div> |
| 48 | 48 | </template> |
| 49 | 49 | <script> |
| 50 | - import TimeSpinner from '../base/time-spinner.vue'; | |
| 51 | - import Confirm from '../base/confirm.vue'; | |
| 50 | + import TimeSpinner from '../../base/time-spinner.vue'; | |
| 51 | + import Confirm from '../../base/confirm.vue'; | |
| 52 | + import Options from '../../time-mixins'; | |
| 52 | 53 | |
| 53 | - import Mixin from './mixin'; | |
| 54 | - import Locale from '../../../mixins/locale'; | |
| 55 | 54 | |
| 56 | - import { initTimeDate, toDate, formatDate, formatDateLabels } from '../util'; | |
| 55 | + import Mixin from '../panel-mixin'; | |
| 56 | + import Locale from '../../../../mixins/locale'; | |
| 57 | + | |
| 58 | + import { initTimeDate, formatDateLabels } from '../../util'; | |
| 57 | 59 | |
| 58 | 60 | const prefixCls = 'ivu-picker-panel'; |
| 59 | 61 | const timePrefixCls = 'ivu-time-picker'; |
| 60 | 62 | |
| 63 | + const capitalize = (str) => str[0].toUpperCase() + str.slice(1); | |
| 64 | + | |
| 61 | 65 | export default { |
| 62 | - name: 'TimePicker', | |
| 63 | - mixins: [ Mixin, Locale ], | |
| 66 | + name: 'RangeTimePickerPanel', | |
| 67 | + mixins: [ Mixin, Locale, Options ], | |
| 64 | 68 | components: { TimeSpinner, Confirm }, |
| 65 | 69 | props: { |
| 66 | 70 | steps: { |
| 67 | 71 | type: Array, |
| 68 | 72 | default: () => [] |
| 69 | - } | |
| 73 | + }, | |
| 74 | + format: { | |
| 75 | + type: String, | |
| 76 | + default: 'HH:mm:ss' | |
| 77 | + }, | |
| 78 | + value: { | |
| 79 | + type: Array, | |
| 80 | + required: true | |
| 81 | + }, | |
| 70 | 82 | }, |
| 71 | 83 | data () { |
| 84 | + const [dateStart, dateEnd] = this.value.slice(); | |
| 72 | 85 | return { |
| 73 | 86 | prefixCls: prefixCls, |
| 74 | 87 | timePrefixCls: timePrefixCls, |
| 75 | - format: 'HH:mm:ss', | |
| 76 | 88 | showDate: false, |
| 77 | - date: initTimeDate(), | |
| 78 | - dateEnd: initTimeDate(), | |
| 79 | - value: '', | |
| 80 | - hours: '', | |
| 81 | - minutes: '', | |
| 82 | - seconds: '', | |
| 83 | - hoursEnd: '', | |
| 84 | - minutesEnd: '', | |
| 85 | - secondsEnd: '', | |
| 86 | - disabledHours: [], | |
| 87 | - disabledMinutes: [], | |
| 88 | - disabledSeconds: [], | |
| 89 | - hideDisabledOptions: false, | |
| 89 | + dateStart: dateStart || initTimeDate(), | |
| 90 | + dateEnd: dateEnd || initTimeDate(), | |
| 90 | 91 | confirm: false |
| 91 | 92 | }; |
| 92 | 93 | }, |
| ... | ... | @@ -111,28 +112,10 @@ |
| 111 | 112 | } |
| 112 | 113 | }, |
| 113 | 114 | watch: { |
| 114 | - value (newVal) { | |
| 115 | - if (!newVal) return; | |
| 116 | - if (Array.isArray(newVal)) { | |
| 117 | - const valStart = newVal[0] ? toDate(newVal[0]) : false; | |
| 118 | - const valEnd = newVal[1] ? toDate(newVal[1]) : false; | |
| 119 | - | |
| 120 | - if (valStart && valEnd) { | |
| 121 | - this.handleChange( | |
| 122 | - { | |
| 123 | - hours: valStart.getHours(), | |
| 124 | - minutes: valStart.getMinutes(), | |
| 125 | - seconds: valStart.getSeconds() | |
| 126 | - }, | |
| 127 | - { | |
| 128 | - hours: valEnd.getHours(), | |
| 129 | - minutes: valEnd.getMinutes(), | |
| 130 | - seconds: valEnd.getSeconds() | |
| 131 | - }, | |
| 132 | - false | |
| 133 | - ); | |
| 134 | - } | |
| 135 | - } | |
| 115 | + value (dates) { | |
| 116 | + const [dateStart, dateEnd] = dates.slice(); | |
| 117 | + this.dateStart = dateStart || initTimeDate(); | |
| 118 | + this.dateEnd = dateEnd || initTimeDate(); | |
| 136 | 119 | } |
| 137 | 120 | }, |
| 138 | 121 | methods: { |
| ... | ... | @@ -142,59 +125,25 @@ |
| 142 | 125 | const { labels, separator } = formatDateLabels(locale, datePanelLabel, date || initTimeDate()); |
| 143 | 126 | return [labels[0].label, separator, labels[1].label].join(''); |
| 144 | 127 | }, |
| 145 | - handleClear() { | |
| 146 | - this.date = initTimeDate(); | |
| 147 | - this.dateEnd = initTimeDate(); | |
| 148 | - this.hours = ''; | |
| 149 | - this.minutes = ''; | |
| 150 | - this.seconds = ''; | |
| 151 | - this.hoursEnd = ''; | |
| 152 | - this.minutesEnd = ''; | |
| 153 | - this.secondsEnd = ''; | |
| 154 | - }, | |
| 155 | - handleChange (date, dateEnd, emit = true) { | |
| 156 | - const oldDateEnd = new Date(this.dateEnd); | |
| 128 | + handleChange (start, end, emit = true) { | |
| 129 | + | |
| 130 | + const dateStart = new Date(this.dateStart); | |
| 131 | + let dateEnd = new Date(this.dateEnd); | |
| 132 | + | |
| 133 | + // set dateStart | |
| 134 | + Object.keys(start).forEach(type => { | |
| 135 | + dateStart[`set${capitalize(type)}`](start[type]) | |
| 136 | + }); | |
| 137 | + | |
| 138 | + // set dateEnd | |
| 139 | + Object.keys(end).forEach(type => { | |
| 140 | + dateEnd[`set${capitalize(type)}`](end[type]); | |
| 141 | + }); | |
| 157 | 142 | |
| 158 | - if (date.hours !== undefined) { | |
| 159 | - this.date.setHours(date.hours); | |
| 160 | - this.hours = this.date.getHours(); | |
| 161 | - } | |
| 162 | - if (date.minutes !== undefined) { | |
| 163 | - this.date.setMinutes(date.minutes); | |
| 164 | - this.minutes = this.date.getMinutes(); | |
| 165 | - } | |
| 166 | - if (date.seconds !== undefined) { | |
| 167 | - this.date.setSeconds(date.seconds); | |
| 168 | - this.seconds = this.date.getSeconds(); | |
| 169 | - } | |
| 170 | - if (dateEnd.hours !== undefined) { | |
| 171 | - this.dateEnd.setHours(dateEnd.hours); | |
| 172 | - this.hoursEnd = this.dateEnd.getHours(); | |
| 173 | - } | |
| 174 | - if (dateEnd.minutes !== undefined) { | |
| 175 | - this.dateEnd.setMinutes(dateEnd.minutes); | |
| 176 | - this.minutesEnd = this.dateEnd.getMinutes(); | |
| 177 | - } | |
| 178 | - if (dateEnd.seconds !== undefined) { | |
| 179 | - this.dateEnd.setSeconds(dateEnd.seconds); | |
| 180 | - this.secondsEnd = this.dateEnd.getSeconds(); | |
| 181 | - } | |
| 182 | 143 | // judge endTime > startTime? |
| 183 | - if (this.dateEnd < this.date) { | |
| 184 | - this.$nextTick(() => { | |
| 185 | - this.dateEnd = new Date(this.date); | |
| 186 | - this.hoursEnd = this.dateEnd.getHours(); | |
| 187 | - this.minutesEnd = this.dateEnd.getMinutes(); | |
| 188 | - this.secondsEnd = this.dateEnd.getSeconds(); | |
| 144 | + if (dateEnd < dateStart) dateEnd = dateStart; | |
| 189 | 145 | |
| 190 | - const format = 'yyyy-MM-dd HH:mm:ss'; | |
| 191 | - if (formatDate(oldDateEnd, format) !== formatDate(this.dateEnd, format)) { | |
| 192 | - if (emit) this.$emit('on-pick', [this.date, this.dateEnd], true); | |
| 193 | - } | |
| 194 | - }); | |
| 195 | - } else { | |
| 196 | - if (emit) this.$emit('on-pick', [this.date, this.dateEnd], true); | |
| 197 | - } | |
| 146 | + if (emit) this.$emit('on-pick', [dateStart, dateEnd], true); | |
| 198 | 147 | }, |
| 199 | 148 | handleStartChange (date) { |
| 200 | 149 | this.handleChange(date, {}); | ... | ... |
src/components/date-picker/panel/time.vue renamed to src/components/date-picker/panel/Time/time.vue
| ... | ... | @@ -7,9 +7,9 @@ |
| 7 | 7 | ref="timeSpinner" |
| 8 | 8 | :show-seconds="showSeconds" |
| 9 | 9 | :steps="steps" |
| 10 | - :hours="hours" | |
| 11 | - :minutes="minutes" | |
| 12 | - :seconds="seconds" | |
| 10 | + :hours="date.getHours()" | |
| 11 | + :minutes="date.getMinutes()" | |
| 12 | + :seconds="date.getSeconds()" | |
| 13 | 13 | :disabled-hours="disabledHours" |
| 14 | 14 | :disabled-minutes="disabledMinutes" |
| 15 | 15 | :disabled-seconds="disabledSeconds" |
| ... | ... | @@ -25,42 +25,45 @@ |
| 25 | 25 | </div> |
| 26 | 26 | </template> |
| 27 | 27 | <script> |
| 28 | - import TimeSpinner from '../base/time-spinner.vue'; | |
| 29 | - import Confirm from '../base/confirm.vue'; | |
| 28 | + import TimeSpinner from '../../base/time-spinner.vue'; | |
| 29 | + import Confirm from '../../base/confirm.vue'; | |
| 30 | + import Options from '../../time-mixins'; | |
| 30 | 31 | |
| 31 | - import Mixin from './mixin'; | |
| 32 | - import Locale from '../../../mixins/locale'; | |
| 33 | 32 | |
| 34 | - import { initTimeDate } from '../util'; | |
| 33 | + import Mixin from '../panel-mixin'; | |
| 34 | + import Locale from '../../../../mixins/locale'; | |
| 35 | + | |
| 36 | + import { initTimeDate } from '../../util'; | |
| 35 | 37 | |
| 36 | 38 | const prefixCls = 'ivu-picker-panel'; |
| 37 | 39 | const timePrefixCls = 'ivu-time-picker'; |
| 38 | 40 | |
| 41 | + const capitalize = (str) => str[0].toUpperCase() + str.slice(1); | |
| 42 | + | |
| 39 | 43 | export default { |
| 40 | - name: 'TimePicker', | |
| 41 | - mixins: [ Mixin, Locale ], | |
| 44 | + name: 'TimePickerPanel', | |
| 45 | + mixins: [ Mixin, Locale, Options ], | |
| 42 | 46 | components: { TimeSpinner, Confirm }, |
| 43 | 47 | props: { |
| 44 | 48 | steps: { |
| 45 | 49 | type: Array, |
| 46 | 50 | default: () => [] |
| 47 | - } | |
| 51 | + }, | |
| 52 | + format: { | |
| 53 | + type: String, | |
| 54 | + default: 'HH:mm:ss' | |
| 55 | + }, | |
| 56 | + value: { | |
| 57 | + type: Array, | |
| 58 | + required: true | |
| 59 | + }, | |
| 48 | 60 | }, |
| 49 | 61 | data () { |
| 50 | 62 | return { |
| 51 | 63 | prefixCls: prefixCls, |
| 52 | 64 | timePrefixCls: timePrefixCls, |
| 53 | - date: initTimeDate(), | |
| 54 | - value: '', | |
| 65 | + date: this.value[0] || initTimeDate(), | |
| 55 | 66 | showDate: false, |
| 56 | - format: 'HH:mm:ss', | |
| 57 | - hours: '', | |
| 58 | - minutes: '', | |
| 59 | - seconds: '', | |
| 60 | - disabledHours: [], | |
| 61 | - disabledMinutes: [], | |
| 62 | - disabledSeconds: [], | |
| 63 | - hideDisabledOptions: false, | |
| 64 | 67 | confirm: false |
| 65 | 68 | }; |
| 66 | 69 | }, |
| ... | ... | @@ -68,7 +71,7 @@ |
| 68 | 71 | showSeconds () { |
| 69 | 72 | return (this.format || '').indexOf('ss') !== -1; |
| 70 | 73 | }, |
| 71 | - visibleDate () { | |
| 74 | + visibleDate () { // TODO | |
| 72 | 75 | const date = this.date; |
| 73 | 76 | const month = date.getMonth() + 1; |
| 74 | 77 | const tYear = this.t('i.datepicker.year'); |
| ... | ... | @@ -77,44 +80,22 @@ |
| 77 | 80 | } |
| 78 | 81 | }, |
| 79 | 82 | watch: { |
| 80 | - value (newVal) { | |
| 81 | - if (!newVal) return; | |
| 83 | + value (dates) { | |
| 84 | + let newVal = dates[0] || initTimeDate(); | |
| 82 | 85 | newVal = new Date(newVal); |
| 83 | - if (!isNaN(newVal)) { | |
| 84 | - this.date = newVal; | |
| 85 | - this.handleChange({ | |
| 86 | - hours: newVal.getHours(), | |
| 87 | - minutes: newVal.getMinutes(), | |
| 88 | - seconds: newVal.getSeconds() | |
| 89 | - }, false); | |
| 90 | - } | |
| 86 | + this.date = newVal; | |
| 91 | 87 | } |
| 92 | 88 | }, |
| 93 | 89 | methods: { |
| 94 | - handleClear() { | |
| 95 | - this.date = initTimeDate(); | |
| 96 | - this.hours = ''; | |
| 97 | - this.minutes = ''; | |
| 98 | - this.seconds = ''; | |
| 99 | - }, | |
| 100 | 90 | handleChange (date, emit = true) { |
| 101 | - if (date.hours !== undefined) { | |
| 102 | - this.date.setHours(date.hours); | |
| 103 | - this.hours = this.date.getHours(); | |
| 104 | - } | |
| 105 | - if (date.minutes !== undefined) { | |
| 106 | - this.date.setMinutes(date.minutes); | |
| 107 | - this.minutes = this.date.getMinutes(); | |
| 108 | - } | |
| 109 | - if (date.seconds !== undefined) { | |
| 110 | - this.date.setSeconds(date.seconds); | |
| 111 | - this.seconds = this.date.getSeconds(); | |
| 112 | - } | |
| 113 | - if (emit) this.$emit('on-pick', this.date, true); | |
| 91 | + | |
| 92 | + const newDate = new Date(this.date); | |
| 93 | + Object.keys(date).forEach( | |
| 94 | + type => newDate[`set${capitalize(type)}`](date[type]) | |
| 95 | + ); | |
| 96 | + | |
| 97 | + if (emit) this.$emit('on-pick', newDate, true); | |
| 114 | 98 | }, |
| 115 | - updateScroll () { | |
| 116 | - this.$refs.timeSpinner.updateScroll(); | |
| 117 | - } | |
| 118 | 99 | }, |
| 119 | 100 | mounted () { |
| 120 | 101 | if (this.$parent && this.$parent.$options.name === 'DatePicker') this.showDate = true; | ... | ... |
src/components/date-picker/panel/mixin.js renamed to src/components/date-picker/panel/panel-mixin.js
| ... | ... | @@ -15,13 +15,32 @@ export default { |
| 15 | 15 | if (shortcut.onClick) shortcut.onClick(this); |
| 16 | 16 | }, |
| 17 | 17 | handlePickClear () { |
| 18 | + this.resetView(); | |
| 18 | 19 | this.$emit('on-pick-clear'); |
| 19 | 20 | }, |
| 20 | 21 | handlePickSuccess () { |
| 22 | + this.resetView(); | |
| 21 | 23 | this.$emit('on-pick-success'); |
| 22 | 24 | }, |
| 23 | 25 | handlePickClick () { |
| 24 | 26 | this.$emit('on-pick-click'); |
| 25 | - } | |
| 27 | + }, | |
| 28 | + resetView(){ | |
| 29 | + setTimeout( | |
| 30 | + () => this.currentView = this.selectionMode, | |
| 31 | + 500 // 500ms so the dropdown can close before changing | |
| 32 | + ); | |
| 33 | + }, | |
| 34 | + handleClear() { | |
| 35 | + this.dates = this.dates.map(() => null); | |
| 36 | + this.rangeState = {}; | |
| 37 | + this.$emit('on-pick', this.dates); | |
| 38 | + this.handleConfirm(); | |
| 39 | + // if (this.showTime) this.$refs.timePicker.handleClear(); | |
| 40 | + }, | |
| 41 | + handleConfirm(visible) { | |
| 42 | + this.$emit('on-pick', this.dates, visible); | |
| 43 | + }, | |
| 44 | + | |
| 26 | 45 | } |
| 27 | 46 | }; | ... | ... |