Skip to content

Commit 6cb92ac

Browse files
wacky6ziyoung
authored andcommitted
DatePicker: validate input date (#12898)
* date-picker: fix confirm() ignoring date validity make date-range panel's confirm validate date before confirming. 1. disable confirm button if picked date is invalid 2. reset highlight date on picker open (resetView) * test: date-time-range confirm honors disabledDate
1 parent e772579 commit 6cb92ac

File tree

2 files changed

+50
-5
lines changed

2 files changed

+50
-5
lines changed

packages/date-picker/src/panel/date-range.vue

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@
176176
size="mini"
177177
class="el-picker-panel__link-btn"
178178
:disabled="btnDisabled"
179-
@click="handleConfirm()">
179+
@click="handleConfirm(false)">
180180
{{ t('el.datepicker.confirm') }}
181181
</el-button>
182182
</div>
@@ -227,7 +227,7 @@
227227
228228
computed: {
229229
btnDisabled() {
230-
return !(this.minDate && this.maxDate && !this.selecting);
230+
return !(this.minDate && this.maxDate && !this.selecting && this.isValidValue([this.minDate, this.maxDate]));
231231
},
232232
233233
leftLabel() {
@@ -610,7 +610,9 @@
610610
},
611611
612612
handleConfirm(visible = false) {
613-
this.$emit('pick', [this.minDate, this.maxDate], visible);
613+
if (this.isValidValue([this.minDate, this.maxDate])) {
614+
this.$emit('pick', [this.minDate, this.maxDate], visible);
615+
}
614616
},
615617
616618
isValidValue(value) {
@@ -622,6 +624,14 @@
622624
? !this.disabledDate(value[0]) && !this.disabledDate(value[1])
623625
: true
624626
);
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;
625635
}
626636
},
627637

test/unit/specs/date-picker.spec.js

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1760,7 +1760,6 @@ describe('DatePicker', () => {
17601760
picker.$el.querySelector('td.available ~ td.available').click();
17611761
setTimeout(_ => {
17621762
expect(spy.calledOnce).to.equal(true);
1763-
console.log('first assert passed');
17641763
// change event is not emitted if used does not change value
17651764
// datarange also requires proper array equality check
17661765
input.blur();
@@ -1773,7 +1772,6 @@ describe('DatePicker', () => {
17731772
endCell.click();
17741773
setTimeout(_ => {
17751774
expect(spy.calledOnce).to.equal(true);
1776-
console.log('second assert passed');
17771775
done();
17781776
}, DELAY);
17791777
}, DELAY);
@@ -2194,6 +2192,43 @@ describe('DatePicker', () => {
21942192
}, DELAY);
21952193
}, DELAY);
21962194
});
2195+
2196+
it('confirm honors disabledDate', done => {
2197+
vm = createVue({
2198+
template: '<el-date-picker type="datetimerange" value-format="yyyy-MM-dd HH:mm:ss" v-model="value" :picker-options="pickerOptions" ref="compo" />',
2199+
data() {
2200+
return {
2201+
pickerOptions: {
2202+
disabledDate(date) {
2203+
return date.getTime() < new Date(2000, 9, 1); // 2000-10-01
2204+
}
2205+
},
2206+
value: ['2000-10-02 00:00:00', '2000-10-03 00:00:00']
2207+
};
2208+
}
2209+
}, true);
2210+
const input = vm.$el.querySelector('input');
2211+
2212+
input.blur();
2213+
input.focus();
2214+
setTimeout(_ => {
2215+
// simulate user input of invalid date
2216+
vm.$refs.compo.picker.handleDateChange({ target: { value: '2000-09-01'} }, 'min');
2217+
setTimeout(_ => {
2218+
expect(vm.$refs.compo.picker.btnDisabled).to.equal(true); // invalid input disables button
2219+
vm.$refs.compo.picker.handleConfirm();
2220+
setTimeout(_ => {
2221+
expect(vm.$refs.compo.pickerVisible).to.equal(true); // can not confirm, picker remains open
2222+
// simulate click outside to close picker
2223+
vm.$refs.compo.handleClose();
2224+
setTimeout(_ => {
2225+
expect(vm.value).to.eql(['2000-10-02 00:00:00', '2000-10-03 00:00:00']);
2226+
done();
2227+
}, DELAY);
2228+
}, DELAY);
2229+
}, DELAY);
2230+
}, DELAY);
2231+
});
21972232
});
21982233

21992234
const currentMonth = new Date(new Date().getTime());

0 commit comments

Comments
 (0)