mirror of
https://github.com/tenrok/vue2-datepicker.git
synced 2026-06-24 07:40:37 +03:00
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.
This commit is contained in:
@@ -30,7 +30,7 @@ describe('DatetimePanel', () => {
|
|||||||
const disabledTime = date => date < new Date(2019, 9, 2, 12);
|
const disabledTime = date => date < new Date(2019, 9, 2, 12);
|
||||||
wrapper = mount(DatetimePanel, {
|
wrapper = mount(DatetimePanel, {
|
||||||
propsData: {
|
propsData: {
|
||||||
defaultValue: new Date(2019, 9, 1),
|
defaultValue: new Date(2019, 9, 2, 10),
|
||||||
disabledDate,
|
disabledDate,
|
||||||
disabledTime,
|
disabledTime,
|
||||||
},
|
},
|
||||||
@@ -40,5 +40,10 @@ describe('DatetimePanel', () => {
|
|||||||
expect(wrapper.emitted().select).toBeUndefined();
|
expect(wrapper.emitted().select).toBeUndefined();
|
||||||
const timeTitle = wrapper.find('.mx-time-header-title');
|
const timeTitle = wrapper.find('.mx-time-header-title');
|
||||||
expect(timeTitle.text()).toBe('2019-10-02');
|
expect(timeTitle.text()).toBe('2019-10-02');
|
||||||
|
// set the defaultValue is not disabled
|
||||||
|
const defaultValue = new Date(2019, 9, 2, 12);
|
||||||
|
wrapper.setProps({ defaultValue });
|
||||||
|
td.trigger('click');
|
||||||
|
expect(wrapper.emitted().select[0][0]).toEqual(defaultValue);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -59,5 +59,11 @@ describe('DatetimeRange', () => {
|
|||||||
expect(wrapper.emitted().select).toBeUndefined();
|
expect(wrapper.emitted().select).toBeUndefined();
|
||||||
const timeTitle = wrapper.find('.mx-time-header-title');
|
const timeTitle = wrapper.find('.mx-time-header-title');
|
||||||
expect(timeTitle.text()).toBe('2019-10-02');
|
expect(timeTitle.text()).toBe('2019-10-02');
|
||||||
|
const defaultValue = new Date(2019, 9, 2, 12);
|
||||||
|
wrapper.setProps({ defaultValue });
|
||||||
|
td.trigger('click');
|
||||||
|
td.trigger('click');
|
||||||
|
await flushPromises();
|
||||||
|
expect(wrapper.emitted().select[0][0]).toEqual([defaultValue, defaultValue]);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
+2
-2
@@ -17,13 +17,13 @@
|
|||||||
"build:index": "cross-env NODE_ENV=production rollup -c",
|
"build:index": "cross-env NODE_ENV=production rollup -c",
|
||||||
"build:locale": "cross-env NODE_ENV=production rollup -c rollup.locale.config.js",
|
"build:locale": "cross-env NODE_ENV=production rollup -c rollup.locale.config.js",
|
||||||
"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",
|
"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",
|
||||||
"build": "npm run lint && npm run test && npm run clean && npm run build:index && npm run build:css && npm run build:locale",
|
"build": "npm run test && npm run clean && npm run build:index && npm run build:css && npm run build:locale",
|
||||||
"clean": "rimraf scss locale index.*",
|
"clean": "rimraf scss locale index.*",
|
||||||
"lint": "eslint src/**/*.{js,vue}",
|
"lint": "eslint src/**/*.{js,vue}",
|
||||||
"deploy:build": "cross-env NODE_ENV=production parcel build ./example/index.html --public-url ./ --out-dir _site --no-source-maps --no-minify",
|
"deploy:build": "cross-env NODE_ENV=production parcel build ./example/index.html --public-url ./ --out-dir _site --no-source-maps --no-minify",
|
||||||
"deploy": "bash build/gh-pages-deploy.sh",
|
"deploy": "bash build/gh-pages-deploy.sh",
|
||||||
"format": "prettier --write src/**/*",
|
"format": "prettier --write src/**/*",
|
||||||
"test": "jest",
|
"test": "npm run lint && jest",
|
||||||
"cov": "jest --coverage --coverageReporters=text-lcov | coveralls",
|
"cov": "jest --coverage --coverageReporters=text-lcov | coveralls",
|
||||||
"version": "conventional-changelog -p angular -i CHANGELOG.md -s && git add CHANGELOG.md",
|
"version": "conventional-changelog -p angular -i CHANGELOG.md -s && git add CHANGELOG.md",
|
||||||
"release": "bash build/git.sh && bash build/release.sh"
|
"release": "bash build/git.sh && bash build/release.sh"
|
||||||
|
|||||||
@@ -118,7 +118,9 @@ export default {
|
|||||||
props: {
|
props: {
|
||||||
value: {},
|
value: {},
|
||||||
defaultValue: {
|
defaultValue: {
|
||||||
type: [Date, Number],
|
validator(value) {
|
||||||
|
return !isNaN(new Date(value).getTime());
|
||||||
|
},
|
||||||
default() {
|
default() {
|
||||||
const date = new Date();
|
const date = new Date();
|
||||||
date.setHours(0, 0, 0, 0);
|
date.setHours(0, 0, 0, 0);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import CalendarPanel from '../calendar/calendar-panel';
|
import CalendarPanel from '../calendar/calendar-panel';
|
||||||
import TimePanel from '../time/time-panel.vue';
|
import TimePanel from '../time/time-panel.vue';
|
||||||
import { isValidDate } from '../util/date';
|
import { assignTime, getValidDate } from '../util/date';
|
||||||
import { pick } from '../util/base';
|
import { pick } from '../util/base';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -43,14 +43,17 @@ export default {
|
|||||||
if (type === 'date') {
|
if (type === 'date') {
|
||||||
this.openTimePanel();
|
this.openTimePanel();
|
||||||
}
|
}
|
||||||
const time = isValidDate(this.value) ? this.value : new Date(this.defaultValue);
|
let datetime = assignTime(date, getValidDate(this.value, this.defaultValue));
|
||||||
const datetime = new Date(date);
|
|
||||||
datetime.setHours(time.getHours(), time.getMinutes(), time.getSeconds());
|
|
||||||
if (this.disabledTime(new Date(datetime))) {
|
if (this.disabledTime(new Date(datetime))) {
|
||||||
this.currentValue = date;
|
// set the time of defalutValue;
|
||||||
} else {
|
datetime = assignTime(date, this.defaultValue);
|
||||||
this.emitDate(datetime, type);
|
if (this.disabledTime(new Date(datetime))) {
|
||||||
|
// if disabled don't emit date
|
||||||
|
this.currentValue = datetime;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
this.emitDate(datetime, type);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
render() {
|
render() {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import CalendarRange from '../calendar/calendar-range';
|
import CalendarRange from '../calendar/calendar-range';
|
||||||
import TimeRange from '../time/time-range';
|
import TimeRange from '../time/time-range';
|
||||||
import { pick } from '../util/base';
|
import { pick } from '../util/base';
|
||||||
import { isValidRangeDate } from '../util/date';
|
import { isValidRangeDate, assignTime } from '../util/date';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: 'DatetimeRange',
|
name: 'DatetimeRange',
|
||||||
@@ -43,20 +43,21 @@ export default {
|
|||||||
if (type === 'date') {
|
if (type === 'date') {
|
||||||
this.openTimePanel();
|
this.openTimePanel();
|
||||||
}
|
}
|
||||||
let datetimes = dates.map((v, i) => {
|
let datetimes = dates.map((date, i) => {
|
||||||
const datetime = new Date(v);
|
const time = isValidRangeDate(this.value) ? this.value[i] : this.defaultValue;
|
||||||
const time = isValidRangeDate(this.value) ? this.value[i] : new Date(this.defaultValue);
|
return assignTime(date, time);
|
||||||
datetime.setHours(time.getHours(), time.getMinutes(), time.getSeconds());
|
|
||||||
return datetime;
|
|
||||||
});
|
});
|
||||||
if (datetimes[1].getTime() < datetimes[0].getTime()) {
|
if (datetimes[1].getTime() < datetimes[0].getTime()) {
|
||||||
datetimes = [datetimes[0], datetimes[0]];
|
datetimes = [datetimes[0], datetimes[0]];
|
||||||
}
|
}
|
||||||
if (datetimes.some(this.disabledTime)) {
|
if (datetimes.some(this.disabledTime)) {
|
||||||
this.currentValue = dates;
|
datetimes = dates.map(date => assignTime(date, this.defaultValue));
|
||||||
} else {
|
if (datetimes.some(this.disabledTime)) {
|
||||||
this.emitDate(datetimes, type);
|
this.currentValue = datetimes;
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
this.emitDate(datetimes, type);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
render() {
|
render() {
|
||||||
|
|||||||
@@ -45,7 +45,9 @@ export default {
|
|||||||
props: {
|
props: {
|
||||||
value: {},
|
value: {},
|
||||||
defaultValue: {
|
defaultValue: {
|
||||||
type: [Date, Number],
|
validator(value) {
|
||||||
|
return !isNaN(new Date(value).getTime());
|
||||||
|
},
|
||||||
default() {
|
default() {
|
||||||
const date = new Date();
|
const date = new Date();
|
||||||
date.setHours(0, 0, 0, 0);
|
date.setHours(0, 0, 0, 0);
|
||||||
@@ -134,7 +136,7 @@ export default {
|
|||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
isDisabled(date) {
|
isDisabled(date) {
|
||||||
return this.disabledTime(new Date(date), this.innerValue);
|
return this.disabledTime(new Date(date));
|
||||||
},
|
},
|
||||||
handleSelect(value, type) {
|
handleSelect(value, type) {
|
||||||
const date = new Date(value);
|
const date = new Date(value);
|
||||||
|
|||||||
@@ -49,13 +49,10 @@ export default {
|
|||||||
this.emitChange(type, 1);
|
this.emitChange(type, 1);
|
||||||
},
|
},
|
||||||
disabledStartTime(date) {
|
disabledStartTime(date) {
|
||||||
return this.disabledTime(date, [this.startValue, this.endValue], 0);
|
return this.disabledTime(date, 0);
|
||||||
},
|
},
|
||||||
disabledEndTime(date) {
|
disabledEndTime(date) {
|
||||||
return (
|
return date.getTime() < this.startValue.getTime() || this.disabledTime(date, 1);
|
||||||
date.getTime() < this.startValue.getTime() ||
|
|
||||||
this.disabledTime(date, [this.startValue, this.endValue], 1)
|
|
||||||
);
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
render() {
|
render() {
|
||||||
|
|||||||
@@ -19,3 +19,10 @@ export function getValidDate(value, ...backup) {
|
|||||||
const date = new Date(value);
|
const date = new Date(value);
|
||||||
return isValidDate(date) ? date : getValidDate(...backup);
|
return isValidDate(date) ? date : getValidDate(...backup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function assignTime(target, source) {
|
||||||
|
const date = new Date(target);
|
||||||
|
const time = new Date(source);
|
||||||
|
date.setHours(time.getHours(), time.getMinutes(), time.getSeconds());
|
||||||
|
return date;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user