From 1bca35bd74d5b4641e099fbf3b61d3a4938e0152 Mon Sep 17 00:00:00 2001 From: mengxiong10 <15623530290@163.com> Date: Fri, 7 Aug 2020 16:42:38 +0800 Subject: [PATCH] fix: value entered manually in disabled range should be invalid (#508) --- __test__/date-picker.test.js | 20 ++++++++++++++++++++ src/date-picker.vue | 15 ++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/__test__/date-picker.test.js b/__test__/date-picker.test.js index 945d4620..ed5edfdc 100644 --- a/__test__/date-picker.test.js +++ b/__test__/date-picker.test.js @@ -418,4 +418,24 @@ describe('DatePicker', () => { }); expect(vm.validMultipleType).toBe(false); }); + + it('If the value entered manually is in the disabled range should be invalid', () => { + const someday = new Date(2020, 6, 1); + wrapper = shallowMount(DatePicker, { + format: 'YYYY-MM-DD', + propsData: { + disabledDate: date => { + return date < someday; + }, + }, + }); + const textInput = wrapper.find('input'); + textInput.setValue('2020-08-01'); + textInput.trigger('change'); + expect(wrapper.emitted().input[0][0]).toEqual(new Date(2020, 7, 1)); + textInput.setValue('2020-05-01'); + textInput.trigger('change'); + expect(wrapper.emitted().input[1]).toBe(undefined); + expect(wrapper.emitted()['input-error'][0][0]).toBe('2020-05-01'); + }); }); diff --git a/src/date-picker.vue b/src/date-picker.vue index c411eaea..ad2ce19e 100644 --- a/src/date-picker.vue +++ b/src/date-picker.vue @@ -396,6 +396,19 @@ export default { } return isValidDate(value); }, + isValidValueAndNotDisabled(value) { + if (!this.isValidValue(value)) { + return false; + } + const disabledDate = + typeof this.disabledDate === 'function' ? this.disabledDate : () => false; + const disabledTime = + typeof this.disabledTime === 'function' ? this.disabledTime : () => false; + if (!Array.isArray(value)) { + value = [value]; + } + return value.every(v => !disabledDate(v) && !disabledTime(v)); + }, handleMultipleDates(date, dates) { if (this.validMultipleType && dates) { const nextDates = dates.filter(v => v.getTime() !== date.getTime()); @@ -470,7 +483,7 @@ export default { } else { date = this.parseDate(text, this.format); } - if (this.isValidValue(date)) { + if (this.isValidValueAndNotDisabled(date)) { this.emitValue(date); this.blur(); } else {