From e96ba3d26b6c0ff2eeb8c2e161535b3629e22630 Mon Sep 17 00:00:00 2001 From: "cinwell.li" Date: Thu, 20 Oct 2016 20:12:21 +0800 Subject: [PATCH] DatePicker: Optimize the input, fixed #484 (#543) --- CHANGELOG.md | 3 + packages/date-picker/src/panel/date-range.vue | 5 ++ packages/date-picker/src/panel/date.vue | 11 ++- packages/date-picker/src/panel/time-range.vue | 53 +++++++---- .../date-picker/src/panel/time-select.vue | 8 ++ packages/date-picker/src/panel/time.vue | 12 +-- packages/date-picker/src/picker.vue | 89 +++++-------------- packages/date-picker/src/util/dropdown.js | 27 ------ 8 files changed, 91 insertions(+), 117 deletions(-) delete mode 100644 packages/date-picker/src/util/dropdown.js diff --git a/CHANGELOG.md b/CHANGELOG.md index 661b6794384..02540080051 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,9 @@ - TableColumn[type="selection"] 增加 selectable 属性 - 修复 Input textarea 在动态赋值时 autosize 没有触发的问题 - 修复 Input Number min max 属性设置后点击加减出现的崩溃的bug +- 优化 TimePicker/DatePicker 输入日期行为 +- 修复 DatePicker 输入禁用状态的日期却生效的问题 #484 + #### 非兼容性更新 diff --git a/packages/date-picker/src/panel/date-range.vue b/packages/date-picker/src/panel/date-range.vue index 039a8032776..32845dadb4e 100644 --- a/packages/date-picker/src/panel/date-range.vue +++ b/packages/date-picker/src/panel/date-range.vue @@ -331,7 +331,12 @@ handleDateInput(event, type) { const value = event.target.value; const parsedValue = parseDate(value, 'yyyy-MM-dd'); + if (parsedValue) { + if (typeof this.disabledDate === 'function' && + this.disabledDate(new Date(parsedValue))) { + return; + } const target = new Date(type === 'min' ? this.minDate : this.maxDate); if (target) { target.setFullYear(parsedValue.getFullYear()); diff --git a/packages/date-picker/src/panel/date.vue b/packages/date-picker/src/panel/date.vue index 458f7ba0d15..c7d2741aa91 100644 --- a/packages/date-picker/src/panel/date.vue +++ b/packages/date-picker/src/panel/date.vue @@ -137,10 +137,16 @@ }, value(newVal) { - if (this.selectionMode === 'day' && newVal instanceof Date) { + if (newVal instanceof Date) { + + if (typeof this.disabledDate === 'function' && + this.disabledDate(new Date(newVal))) { + return; + } this.date = newVal; this.year = newVal.getFullYear(); this.month = newVal.getMonth(); + this.$emit('pick', newVal, true); } }, @@ -377,6 +383,8 @@ date.setMonth(this.date.getMonth()); date.setDate(this.date.getDate()); this.date = date; + this.$refs.timepicker.value = date; + this.timePickerVisible = false; } } } @@ -394,6 +402,7 @@ date.setMinutes(this.date.getMinutes()); date.setSeconds(this.date.getSeconds()); this.date = date; + this.resetView(); } } }, diff --git a/packages/date-picker/src/panel/time-range.vue b/packages/date-picker/src/panel/time-range.vue index d61bc285611..9a65930129b 100644 --- a/packages/date-picker/src/panel/time-range.vue +++ b/packages/date-picker/src/panel/time-range.vue @@ -61,6 +61,15 @@ return minValue > maxValue; }; + const clacTime = function(time) { + time = Array.isArray(time) ? time : [time]; + const minTime = time[0] || new Date(); + const date = new Date(); + date.setHours(date.getHours() + 1); + const maxTime = time[1] || date; + + return { minTime, maxTime }; + }; export default { components: { @@ -73,24 +82,38 @@ } }, + props: ['value'], + + watch: { + value(val) { + const time = clacTime(val); + + this.handleMinChange({ + hours: time.minTime.getHours(), + minutes: time.minTime.getMinutes(), + seconds: time.minTime.getSeconds() + }); + this.handleMaxChange({ + hours: time.maxTime.getHours(), + minutes: time.maxTime.getMinutes(), + seconds: time.maxTime.getSeconds() + }); + } + }, + data() { - let defaultValue = this.$options.defaultValue; - defaultValue = Array.isArray(defaultValue) ? defaultValue : [defaultValue]; - const minTime = defaultValue[0] || new Date(); - const date = new Date(); - date.setHours(date.getHours() + 1); - const maxTime = defaultValue[1] || date; + const time = clacTime(this.$options.defaultValue); return { - minTime: minTime, - maxTime: maxTime, - btnDisabled: isDisabled(minTime, maxTime), - maxHours: maxTime.getHours(), - maxMinutes: maxTime.getMinutes(), - maxSeconds: maxTime.getSeconds(), - minHours: minTime.getHours(), - minMinutes: minTime.getMinutes(), - minSeconds: minTime.getSeconds(), + minTime: time.minTime, + maxTime: time.maxTime, + btnDisabled: isDisabled(time.minTime, time.maxTime), + maxHours: time.maxTime.getHours(), + maxMinutes: time.maxTime.getMinutes(), + maxSeconds: time.maxTime.getSeconds(), + minHours: time.minTime.getHours(), + minMinutes: time.minTime.getMinutes(), + minSeconds: time.minTime.getSeconds(), format: 'HH:mm:ss', visible: false, width: 0 diff --git a/packages/date-picker/src/panel/time-select.vue b/packages/date-picker/src/panel/time-select.vue index 56654fb0218..c1487f8be14 100644 --- a/packages/date-picker/src/panel/time-select.vue +++ b/packages/date-picker/src/panel/time-select.vue @@ -72,6 +72,14 @@ if (this.value && val && compareTime(this.value, val) === -1) { this.$emit('pick'); } + }, + + value(val, old) { + if (val && this.items.some(i => i.value === val && !i.disabled)) { + this.$emit('pick', val, true); + } else { + this.$emit('pick', old, true); + } } }, diff --git a/packages/date-picker/src/panel/time.vue b/packages/date-picker/src/panel/time.vue index 2451bb5b46c..42aa78ad819 100644 --- a/packages/date-picker/src/panel/time.vue +++ b/packages/date-picker/src/panel/time.vue @@ -19,7 +19,7 @@ + @click="handleCancel">{{ $t('datepicker.cancel') }}