Skip to content

Commit 071c398

Browse files
committed
feat: improve the boundary of disabledtime (#597)
1 parent d027ab1 commit 071c398

File tree

4 files changed

+55
-17
lines changed

4 files changed

+55
-17
lines changed

__test__/time-panel.test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,19 +70,19 @@ describe('TimePanel', () => {
7070
},
7171
});
7272
const hour = wrapper.find('[data-type=hour] li:nth-child(2)');
73-
hour.trigger('click');
73+
await hour.trigger('click');
7474
expect(wrapper.emitted().select[0][0]).toEqual(new Date(2019, 9, 10, 1));
7575
await wrapper.setProps({ value: new Date(2019, 9, 10, 1) });
7676
const minute = wrapper.find('[data-type=minute] li:nth-child(2)');
77-
minute.trigger('click');
77+
await minute.trigger('click');
7878
expect(wrapper.emitted().select[1][0]).toEqual(new Date(2019, 9, 10, 1, 1));
7979
await wrapper.setProps({ value: new Date(2019, 9, 10, 1, 1) });
8080
const second = wrapper.find('[data-type=second] li:nth-child(2)');
81-
second.trigger('click');
81+
await second.trigger('click');
8282
expect(wrapper.emitted().select[2][0]).toEqual(new Date(2019, 9, 10, 1, 1, 1));
8383
await wrapper.setProps({ value: new Date(2019, 9, 10, 1, 1, 1) });
8484
const pm = wrapper.find('[data-type=ampm] li:nth-child(2)');
85-
pm.trigger('click');
85+
await pm.trigger('click');
8686
expect(wrapper.emitted().select[3][0]).toEqual(new Date(2019, 9, 10, 13, 1, 1));
8787
});
8888

example/demo/DisabledDateTime.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99
></date-picker>
1010
</section>
1111
<section>
12-
<p>Not before 09:00</p>
12+
<p>Not before 09:30</p>
1313
<date-picker
1414
v-model="value3"
1515
value-type="format"
1616
type="time"
1717
placeholder="HH:mm:ss"
18-
:default-value="new Date().setHours(9, 0, 0, 0)"
18+
:default-value="new Date().setHours(9, 30, 0, 0)"
1919
:disabled-time="notBeforeNineOClock"
2020
></date-picker>
2121
</section>
@@ -50,7 +50,7 @@ export default {
5050
return date < today || date > new Date(today.getTime() + 7 * 24 * 3600 * 1000);
5151
},
5252
notBeforeNineOClock(date) {
53-
return date.getHours() < 9;
53+
return date < new Date(date.getTime()).setHours(9, 30, 0, 0);
5454
},
5555
notBeforeToday(date) {
5656
return date < new Date(new Date().setHours(0, 0, 0, 0));

src/time/list-columns.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
v-for="(item, j) in col.list"
1212
:key="item.value"
1313
:data-index="j"
14-
:class="[`${prefixClass}-time-item`, getClasses(item.value)]"
14+
:class="[`${prefixClass}-time-item`, getClasses(item.value, col.type)]"
1515
>
1616
{{ item.text }}
1717
</li>

src/time/time-panel.vue

Lines changed: 47 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,12 @@ export default {
120120
default: 100,
121121
},
122122
},
123+
data() {
124+
return {
125+
innerValue: getValidDate(this.value, this.defaultValue),
126+
};
127+
},
123128
computed: {
124-
innerValue() {
125-
return getValidDate(this.value, this.defaultValue);
126-
},
127129
title() {
128130
const titleFormat = this.timeTitleFormat;
129131
const date = new Date(this.innerValue);
@@ -147,25 +149,61 @@ export default {
147149
return obj;
148150
},
149151
},
152+
watch: {
153+
value: {
154+
immediate: true,
155+
handler() {
156+
this.innerValue = getValidDate(this.value, this.defaultValue);
157+
},
158+
},
159+
},
150160
methods: {
151161
formatDate(date, fmt) {
152162
return format(date, fmt, { locale: this.getLocale().formatLocale });
153163
},
154-
isDisabled(date) {
155-
return this.disabledTime(new Date(date));
164+
isDisabledTime(value) {
165+
return this.disabledTime(new Date(value));
166+
},
167+
isDisabledHour(date) {
168+
const value = new Date(date);
169+
return (
170+
this.isDisabledTime(value) &&
171+
this.isDisabledTime(value.setMinutes(0, 0, 0)) &&
172+
this.isDisabledTime(value.setMinutes(59, 59, 999))
173+
);
174+
},
175+
isDisabledMinute(date) {
176+
const value = new Date(date);
177+
return (
178+
this.isDisabledTime(value) &&
179+
this.isDisabledTime(value.setSeconds(0, 0)) &&
180+
this.isDisabledTime(value.setSeconds(59, 999))
181+
);
182+
},
183+
isDisabled(date, type) {
184+
if (type === 'hour') {
185+
return this.isDisabledHour(date);
186+
}
187+
if (type === 'minute') {
188+
return this.isDisabledMinute(date);
189+
}
190+
return this.isDisabledTime(date);
156191
},
157192
handleSelect(value, type) {
158193
const date = new Date(value);
159-
if (!this.isDisabled(value)) {
160-
this.$emit('select', date, type);
194+
if (!this.isDisabled(value, type)) {
195+
this.innerValue = date;
196+
if (!this.isDisabledTime(date)) {
197+
this.$emit('select', date, type);
198+
}
161199
}
162200
},
163201
handleClickTitle() {
164202
this.$emit('clicktitle');
165203
},
166-
getClasses(value) {
204+
getClasses(value, type) {
167205
const cellDate = new Date(value);
168-
if (this.isDisabled(value)) {
206+
if (this.isDisabled(value, type)) {
169207
return 'disabled';
170208
}
171209
if (cellDate.getTime() === this.innerValue.getTime()) {

0 commit comments

Comments
 (0)