From 071c398aad041a59b2719b60d2f6c410e19144f3 Mon Sep 17 00:00:00 2001 From: mengxiong10 <15623530290@163.com> Date: Mon, 30 Aug 2021 16:13:14 +0800 Subject: [PATCH] feat: improve the boundary of disabledtime (#597) --- __test__/time-panel.test.js | 8 ++--- example/demo/DisabledDateTime.vue | 6 ++-- src/time/list-columns.vue | 2 +- src/time/time-panel.vue | 56 ++++++++++++++++++++++++++----- 4 files changed, 55 insertions(+), 17 deletions(-) diff --git a/__test__/time-panel.test.js b/__test__/time-panel.test.js index 7f65d44..df22956 100644 --- a/__test__/time-panel.test.js +++ b/__test__/time-panel.test.js @@ -70,19 +70,19 @@ describe('TimePanel', () => { }, }); const hour = wrapper.find('[data-type=hour] li:nth-child(2)'); - hour.trigger('click'); + await hour.trigger('click'); expect(wrapper.emitted().select[0][0]).toEqual(new Date(2019, 9, 10, 1)); await wrapper.setProps({ value: new Date(2019, 9, 10, 1) }); const minute = wrapper.find('[data-type=minute] li:nth-child(2)'); - minute.trigger('click'); + await minute.trigger('click'); expect(wrapper.emitted().select[1][0]).toEqual(new Date(2019, 9, 10, 1, 1)); await wrapper.setProps({ value: new Date(2019, 9, 10, 1, 1) }); const second = wrapper.find('[data-type=second] li:nth-child(2)'); - second.trigger('click'); + await second.trigger('click'); expect(wrapper.emitted().select[2][0]).toEqual(new Date(2019, 9, 10, 1, 1, 1)); await wrapper.setProps({ value: new Date(2019, 9, 10, 1, 1, 1) }); const pm = wrapper.find('[data-type=ampm] li:nth-child(2)'); - pm.trigger('click'); + await pm.trigger('click'); expect(wrapper.emitted().select[3][0]).toEqual(new Date(2019, 9, 10, 13, 1, 1)); }); diff --git a/example/demo/DisabledDateTime.vue b/example/demo/DisabledDateTime.vue index a7262e2..7f543dd 100644 --- a/example/demo/DisabledDateTime.vue +++ b/example/demo/DisabledDateTime.vue @@ -9,13 +9,13 @@ >
-

Not before 09:00

+

Not before 09:30

@@ -50,7 +50,7 @@ export default { return date < today || date > new Date(today.getTime() + 7 * 24 * 3600 * 1000); }, notBeforeNineOClock(date) { - return date.getHours() < 9; + return date < new Date(date.getTime()).setHours(9, 30, 0, 0); }, notBeforeToday(date) { return date < new Date(new Date().setHours(0, 0, 0, 0)); diff --git a/src/time/list-columns.vue b/src/time/list-columns.vue index e0a0a49..c91634f 100644 --- a/src/time/list-columns.vue +++ b/src/time/list-columns.vue @@ -11,7 +11,7 @@ v-for="(item, j) in col.list" :key="item.value" :data-index="j" - :class="[`${prefixClass}-time-item`, getClasses(item.value)]" + :class="[`${prefixClass}-time-item`, getClasses(item.value, col.type)]" > {{ item.text }} diff --git a/src/time/time-panel.vue b/src/time/time-panel.vue index ce7d14e..d9dd1da 100644 --- a/src/time/time-panel.vue +++ b/src/time/time-panel.vue @@ -120,10 +120,12 @@ export default { default: 100, }, }, + data() { + return { + innerValue: getValidDate(this.value, this.defaultValue), + }; + }, computed: { - innerValue() { - return getValidDate(this.value, this.defaultValue); - }, title() { const titleFormat = this.timeTitleFormat; const date = new Date(this.innerValue); @@ -147,25 +149,61 @@ export default { return obj; }, }, + watch: { + value: { + immediate: true, + handler() { + this.innerValue = getValidDate(this.value, this.defaultValue); + }, + }, + }, methods: { formatDate(date, fmt) { return format(date, fmt, { locale: this.getLocale().formatLocale }); }, - isDisabled(date) { - return this.disabledTime(new Date(date)); + isDisabledTime(value) { + return this.disabledTime(new Date(value)); + }, + isDisabledHour(date) { + const value = new Date(date); + return ( + this.isDisabledTime(value) && + this.isDisabledTime(value.setMinutes(0, 0, 0)) && + this.isDisabledTime(value.setMinutes(59, 59, 999)) + ); + }, + isDisabledMinute(date) { + const value = new Date(date); + return ( + this.isDisabledTime(value) && + this.isDisabledTime(value.setSeconds(0, 0)) && + this.isDisabledTime(value.setSeconds(59, 999)) + ); + }, + isDisabled(date, type) { + if (type === 'hour') { + return this.isDisabledHour(date); + } + if (type === 'minute') { + return this.isDisabledMinute(date); + } + return this.isDisabledTime(date); }, handleSelect(value, type) { const date = new Date(value); - if (!this.isDisabled(value)) { - this.$emit('select', date, type); + if (!this.isDisabled(value, type)) { + this.innerValue = date; + if (!this.isDisabledTime(date)) { + this.$emit('select', date, type); + } } }, handleClickTitle() { this.$emit('clicktitle'); }, - getClasses(value) { + getClasses(value, type) { const cellDate = new Date(value); - if (this.isDisabled(value)) { + if (this.isDisabled(value, type)) { return 'disabled'; } if (cellDate.getTime() === this.innerValue.getTime()) {