Skip to content

Commit 309a1bf

Browse files
committed
fix: defaultValue should be used in datetime mode (#384)
When switching date causes time is disabled, the time of `defaultValue` should be used by default.
1 parent d7e7f49 commit 309a1bf

9 files changed

+50
-27
lines changed

__test__/datetime-panel.test.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ describe('DatetimePanel', () => {
3030
const disabledTime = date => date < new Date(2019, 9, 2, 12);
3131
wrapper = mount(DatetimePanel, {
3232
propsData: {
33-
defaultValue: new Date(2019, 9, 1),
33+
defaultValue: new Date(2019, 9, 2, 10),
3434
disabledDate,
3535
disabledTime,
3636
},
@@ -40,5 +40,10 @@ describe('DatetimePanel', () => {
4040
expect(wrapper.emitted().select).toBeUndefined();
4141
const timeTitle = wrapper.find('.mx-time-header-title');
4242
expect(timeTitle.text()).toBe('2019-10-02');
43+
// set the defaultValue is not disabled
44+
const defaultValue = new Date(2019, 9, 2, 12);
45+
wrapper.setProps({ defaultValue });
46+
td.trigger('click');
47+
expect(wrapper.emitted().select[0][0]).toEqual(defaultValue);
4348
});
4449
});

__test__/datetime-range.test.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,11 @@ describe('DatetimeRange', () => {
5959
expect(wrapper.emitted().select).toBeUndefined();
6060
const timeTitle = wrapper.find('.mx-time-header-title');
6161
expect(timeTitle.text()).toBe('2019-10-02');
62+
const defaultValue = new Date(2019, 9, 2, 12);
63+
wrapper.setProps({ defaultValue });
64+
td.trigger('click');
65+
td.trigger('click');
66+
await flushPromises();
67+
expect(wrapper.emitted().select[0][0]).toEqual([defaultValue, defaultValue]);
6268
});
6369
});

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,13 @@
1717
"build:index": "cross-env NODE_ENV=production rollup -c",
1818
"build:locale": "cross-env NODE_ENV=production rollup -c rollup.locale.config.js",
1919
"build:css": "sass --style=compressed --no-source-map src/style/index.scss index.css && postcss index.css --use autoprefixer -o index.css --no-map && cp -R src/style scss",
20-
"build": "npm run lint && npm run test && npm run clean && npm run build:index && npm run build:css && npm run build:locale",
20+
"build": "npm run test && npm run clean && npm run build:index && npm run build:css && npm run build:locale",
2121
"clean": "rimraf scss locale index.*",
2222
"lint": "eslint src/**/*.{js,vue}",
2323
"deploy:build": "cross-env NODE_ENV=production parcel build ./example/index.html --public-url ./ --out-dir _site --no-source-maps --no-minify",
2424
"deploy": "bash build/gh-pages-deploy.sh",
2525
"format": "prettier --write src/**/*",
26-
"test": "jest",
26+
"test": "npm run lint && jest",
2727
"cov": "jest --coverage --coverageReporters=text-lcov | coveralls",
2828
"version": "conventional-changelog -p angular -i CHANGELOG.md -s && git add CHANGELOG.md",
2929
"release": "bash build/git.sh && bash build/release.sh"

src/calendar/calendar-panel.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,9 @@ export default {
118118
props: {
119119
value: {},
120120
defaultValue: {
121-
type: [Date, Number],
121+
validator(value) {
122+
return !isNaN(new Date(value).getTime());
123+
},
122124
default() {
123125
const date = new Date();
124126
date.setHours(0, 0, 0, 0);

src/datetime/datetime-panel.js

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import CalendarPanel from '../calendar/calendar-panel';
22
import TimePanel from '../time/time-panel.vue';
3-
import { isValidDate } from '../util/date';
3+
import { assignTime, getValidDate } from '../util/date';
44
import { pick } from '../util/base';
55

66
export default {
@@ -43,14 +43,17 @@ export default {
4343
if (type === 'date') {
4444
this.openTimePanel();
4545
}
46-
const time = isValidDate(this.value) ? this.value : new Date(this.defaultValue);
47-
const datetime = new Date(date);
48-
datetime.setHours(time.getHours(), time.getMinutes(), time.getSeconds());
46+
let datetime = assignTime(date, getValidDate(this.value, this.defaultValue));
4947
if (this.disabledTime(new Date(datetime))) {
50-
this.currentValue = date;
51-
} else {
52-
this.emitDate(datetime, type);
48+
// set the time of defalutValue;
49+
datetime = assignTime(date, this.defaultValue);
50+
if (this.disabledTime(new Date(datetime))) {
51+
// if disabled don't emit date
52+
this.currentValue = datetime;
53+
return;
54+
}
5355
}
56+
this.emitDate(datetime, type);
5457
},
5558
},
5659
render() {

src/datetime/datetime-range.js

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import CalendarRange from '../calendar/calendar-range';
22
import TimeRange from '../time/time-range';
33
import { pick } from '../util/base';
4-
import { isValidRangeDate } from '../util/date';
4+
import { isValidRangeDate, assignTime } from '../util/date';
55

66
export default {
77
name: 'DatetimeRange',
@@ -43,20 +43,21 @@ export default {
4343
if (type === 'date') {
4444
this.openTimePanel();
4545
}
46-
let datetimes = dates.map((v, i) => {
47-
const datetime = new Date(v);
48-
const time = isValidRangeDate(this.value) ? this.value[i] : new Date(this.defaultValue);
49-
datetime.setHours(time.getHours(), time.getMinutes(), time.getSeconds());
50-
return datetime;
46+
let datetimes = dates.map((date, i) => {
47+
const time = isValidRangeDate(this.value) ? this.value[i] : this.defaultValue;
48+
return assignTime(date, time);
5149
});
5250
if (datetimes[1].getTime() < datetimes[0].getTime()) {
5351
datetimes = [datetimes[0], datetimes[0]];
5452
}
5553
if (datetimes.some(this.disabledTime)) {
56-
this.currentValue = dates;
57-
} else {
58-
this.emitDate(datetimes, type);
54+
datetimes = dates.map(date => assignTime(date, this.defaultValue));
55+
if (datetimes.some(this.disabledTime)) {
56+
this.currentValue = datetimes;
57+
return;
58+
}
5959
}
60+
this.emitDate(datetimes, type);
6061
},
6162
},
6263
render() {

src/time/time-panel.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,9 @@ export default {
4545
props: {
4646
value: {},
4747
defaultValue: {
48-
type: [Date, Number],
48+
validator(value) {
49+
return !isNaN(new Date(value).getTime());
50+
},
4951
default() {
5052
const date = new Date();
5153
date.setHours(0, 0, 0, 0);
@@ -134,7 +136,7 @@ export default {
134136
},
135137
methods: {
136138
isDisabled(date) {
137-
return this.disabledTime(new Date(date), this.innerValue);
139+
return this.disabledTime(new Date(date));
138140
},
139141
handleSelect(value, type) {
140142
const date = new Date(value);

src/time/time-range.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,10 @@ export default {
4949
this.emitChange(type, 1);
5050
},
5151
disabledStartTime(date) {
52-
return this.disabledTime(date, [this.startValue, this.endValue], 0);
52+
return this.disabledTime(date, 0);
5353
},
5454
disabledEndTime(date) {
55-
return (
56-
date.getTime() < this.startValue.getTime() ||
57-
this.disabledTime(date, [this.startValue, this.endValue], 1)
58-
);
55+
return date.getTime() < this.startValue.getTime() || this.disabledTime(date, 1);
5956
},
6057
},
6158
render() {

src/util/date.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,3 +19,10 @@ export function getValidDate(value, ...backup) {
1919
const date = new Date(value);
2020
return isValidDate(date) ? date : getValidDate(...backup);
2121
}
22+
23+
export function assignTime(target, source) {
24+
const date = new Date(target);
25+
const time = new Date(source);
26+
date.setHours(time.getHours(), time.getMinutes(), time.getSeconds());
27+
return date;
28+
}

0 commit comments

Comments
 (0)