diff --git a/src/components/date-picker/picker.vue b/src/components/date-picker/picker.vue index df3d3987..734578ad 100644 --- a/src/components/date-picker/picker.vue +++ b/src/components/date-picker/picker.vue @@ -183,7 +183,9 @@ return this.internalValue.slice(); } else { const isRange = this.type.includes('range'); - const val = this.internalValue.map(date => date instanceof Date ? new Date(date) : (date || '')); + let val = this.internalValue.map(date => date instanceof Date ? new Date(date) : (date || '')); + + if (this.type.match(/^time/)) val = val.map(this.formatDate); return (isRange || this.multiple) ? val : val[0]; } }, @@ -293,8 +295,8 @@ ); }, emitChange () { - this.$emit('on-change', this.visualValue, this.publicValue); this.$nextTick(() => { + this.$emit('on-change', this.publicValue); this.dispatch('FormItem', 'on-form-change', this.publicValue); }); }, diff --git a/src/components/date-picker/util.js b/src/components/date-picker/util.js index d85a2b56..90746525 100644 --- a/src/components/date-picker/util.js +++ b/src/components/date-picker/util.js @@ -163,6 +163,8 @@ const RANGE_FORMATTER = function(value, format) { if (start && end) { return formatDate(start, format) + RANGE_SEPARATOR + formatDate(end, format); } + } else if (!Array.isArray(value) && value instanceof Date){ + return formatDate(value, format); } return ''; }; diff --git a/test/unit/specs/date-picker.spec.js b/test/unit/specs/date-picker.spec.js index 1961b68a..f1521384 100644 --- a/test/unit/specs/date-picker.spec.js +++ b/test/unit/specs/date-picker.spec.js @@ -1,4 +1,4 @@ -import { createVue, destroyVM, stringToDate, dateToString, promissedTick } from '../util'; +import { createVue, destroyVM, stringToDate, dateToString, dateToTimeString, promissedTick } from '../util'; describe('DatePicker.vue', () => { let vm; @@ -26,6 +26,79 @@ describe('DatePicker.vue', () => { }); }); + it('should pass correct arguments to on-change event', done => { + const now = new Date(); + const nowDate = dateToString(now); + const nowTime = dateToTimeString(now); + const nextHour = dateToTimeString(now.getTime() + 36e5); + const nextWeek = new Date(now.getTime() + 6048e5); + + let dateValue, dateRangeValue, timeValue, timeRangeValue; + vm = createVue({ + template: ` +
+ + + + +
+ `, + methods: { + onChangeDate(val) { + dateValue = val; + }, + onChangeDateRange(val) { + dateRangeValue = val; + }, + onChangeTime(val) { + timeValue = val; + }, + onChangeTimeRange(val) { + timeRangeValue = val; + }, + } + }, true); + + vm.$nextTick(() => { + const [datePicker, dateRangePicker, timePicker, timeRangePicker] = vm.$children; + + datePicker.handleInputChange({target: {value: nowDate}}); + dateRangePicker.handleInputChange({target: {value: [ + nowDate, + dateToString(nextWeek) + ].join(' - ') + }}); + + timePicker.handleInputChange({target: {value: nowTime}}); + const timeRangeString = [ + nowTime, + nextHour + ].join(' - '); + timeRangePicker.handleInputChange({target: { + value: timeRangeString + }}); + + vm.$nextTick(() => { + // DATE + expect(dateValue instanceof Date).to.equal(true); + expect(dateToString(dateValue)).to.equal(nowDate); + // DATERANGE + expect(Array.isArray(dateRangeValue)).to.equal(true); + expect(dateToString(dateRangeValue[0])).to.equal(nowDate); + expect(dateToString(dateRangeValue[1])).to.equal(dateToString(nextWeek)); + // TIME + expect(typeof timeValue).to.equal('string'); + expect(timeValue).to.equal(nowTime); + // TIMERANGE + expect(Array.isArray(timeRangeValue)).to.equal(true); + expect(timeRangeValue[0]).to.equal(nowTime); + expect(timeRangeValue[1]).to.equal(nextHour); + + done(); + }); + }); + }); + it('should create a DatePicker component of type="datetimerange"', done => { vm = createVue(` @@ -134,7 +207,7 @@ describe('DatePicker.vue', () => { it('should fire `on-change` when reseting value', done => { const now = new Date(); - const nowDate = [now.getFullYear(), now.getMonth() + 1, now.getDate()].map(nr => (nr > 9 ? nr : '0' + nr)).join('-'); + const nowDate = dateToString(now); let onChangeCalled = false; vm = createVue({ template: '', diff --git a/test/unit/util.js b/test/unit/util.js index cc48dc63..46920a19 100644 --- a/test/unit/util.js +++ b/test/unit/util.js @@ -14,6 +14,8 @@ const createElm = function() { return elm; }; +const pad = (nr) => nr < 10 ? '0' + nr : nr; + /** * 回收 vm * @param {Object} vm @@ -72,9 +74,19 @@ exports.stringToDate = function(str) { * @param {Date} */ exports.dateToString = function(d) { - return [d.getFullYear(), d.getMonth() + 1, d.getDate()].map(nr => nr > 9 ? nr : '0' + nr).join('-'); + return [d.getFullYear(), d.getMonth() + 1, d.getDate()].map(pad).join('-'); }; +/** + * Transform Date to HH:MM:SS string + * @param {Date} + */ +exports.dateToTimeString = function(d){ + const date = new Date(d); + return [date.getHours(), date.getMinutes(), date.getSeconds()].map(pad).join(':'); + +} + /** * 触发一个事件 * mouseenter, mouseleave, mouseover, keyup, change, click 等