Commit 7600961f694e49dbcf95a3e28df3bb390ecbd4e0

Authored by Aresn
Committed by GitHub
2 parents 21135d10 57f0582b

Merge pull request #3029 from SergioCrisostomo/fix-datepicker-output

Pass correct arguments to `on-change` callback
src/components/date-picker/picker.vue
@@ -183,7 +183,9 @@ @@ -183,7 +183,9 @@
183 return this.internalValue.slice(); 183 return this.internalValue.slice();
184 } else { 184 } else {
185 const isRange = this.type.includes('range'); 185 const isRange = this.type.includes('range');
186 - const val = this.internalValue.map(date => date instanceof Date ? new Date(date) : (date || '')); 186 + let val = this.internalValue.map(date => date instanceof Date ? new Date(date) : (date || ''));
  187 +
  188 + if (this.type.match(/^time/)) val = val.map(this.formatDate);
187 return (isRange || this.multiple) ? val : val[0]; 189 return (isRange || this.multiple) ? val : val[0];
188 } 190 }
189 }, 191 },
@@ -293,8 +295,8 @@ @@ -293,8 +295,8 @@
293 ); 295 );
294 }, 296 },
295 emitChange () { 297 emitChange () {
296 - this.$emit('on-change', this.visualValue, this.publicValue);  
297 this.$nextTick(() => { 298 this.$nextTick(() => {
  299 + this.$emit('on-change', this.publicValue);
298 this.dispatch('FormItem', 'on-form-change', this.publicValue); 300 this.dispatch('FormItem', 'on-form-change', this.publicValue);
299 }); 301 });
300 }, 302 },
src/components/date-picker/util.js
@@ -163,6 +163,8 @@ const RANGE_FORMATTER = function(value, format) { @@ -163,6 +163,8 @@ const RANGE_FORMATTER = function(value, format) {
163 if (start && end) { 163 if (start && end) {
164 return formatDate(start, format) + RANGE_SEPARATOR + formatDate(end, format); 164 return formatDate(start, format) + RANGE_SEPARATOR + formatDate(end, format);
165 } 165 }
  166 + } else if (!Array.isArray(value) && value instanceof Date){
  167 + return formatDate(value, format);
166 } 168 }
167 return ''; 169 return '';
168 }; 170 };
test/unit/specs/date-picker.spec.js
1 -import { createVue, destroyVM, stringToDate, dateToString, promissedTick } from '../util'; 1 +import { createVue, destroyVM, stringToDate, dateToString, dateToTimeString, promissedTick } from '../util';
2 2
3 describe('DatePicker.vue', () => { 3 describe('DatePicker.vue', () => {
4 let vm; 4 let vm;
@@ -26,6 +26,79 @@ describe('DatePicker.vue', () => { @@ -26,6 +26,79 @@ describe('DatePicker.vue', () => {
26 }); 26 });
27 }); 27 });
28 28
  29 + it('should pass correct arguments to on-change event', done => {
  30 + const now = new Date();
  31 + const nowDate = dateToString(now);
  32 + const nowTime = dateToTimeString(now);
  33 + const nextHour = dateToTimeString(now.getTime() + 36e5);
  34 + const nextWeek = new Date(now.getTime() + 6048e5);
  35 +
  36 + let dateValue, dateRangeValue, timeValue, timeRangeValue;
  37 + vm = createVue({
  38 + template: `
  39 + <div>
  40 + <date-picker type="date" @on-change="onChangeDate"></date-picker>
  41 + <date-picker type="daterange" @on-change="onChangeDateRange"></date-picker>
  42 + <time-picker type="time" @on-change="onChangeTime"></time-picker>
  43 + <time-picker type="timerange" @on-change="onChangeTimeRange"></time-picker>
  44 + </div>
  45 + `,
  46 + methods: {
  47 + onChangeDate(val) {
  48 + dateValue = val;
  49 + },
  50 + onChangeDateRange(val) {
  51 + dateRangeValue = val;
  52 + },
  53 + onChangeTime(val) {
  54 + timeValue = val;
  55 + },
  56 + onChangeTimeRange(val) {
  57 + timeRangeValue = val;
  58 + },
  59 + }
  60 + }, true);
  61 +
  62 + vm.$nextTick(() => {
  63 + const [datePicker, dateRangePicker, timePicker, timeRangePicker] = vm.$children;
  64 +
  65 + datePicker.handleInputChange({target: {value: nowDate}});
  66 + dateRangePicker.handleInputChange({target: {value: [
  67 + nowDate,
  68 + dateToString(nextWeek)
  69 + ].join(' - ')
  70 + }});
  71 +
  72 + timePicker.handleInputChange({target: {value: nowTime}});
  73 + const timeRangeString = [
  74 + nowTime,
  75 + nextHour
  76 + ].join(' - ');
  77 + timeRangePicker.handleInputChange({target: {
  78 + value: timeRangeString
  79 + }});
  80 +
  81 + vm.$nextTick(() => {
  82 + // DATE
  83 + expect(dateValue instanceof Date).to.equal(true);
  84 + expect(dateToString(dateValue)).to.equal(nowDate);
  85 + // DATERANGE
  86 + expect(Array.isArray(dateRangeValue)).to.equal(true);
  87 + expect(dateToString(dateRangeValue[0])).to.equal(nowDate);
  88 + expect(dateToString(dateRangeValue[1])).to.equal(dateToString(nextWeek));
  89 + // TIME
  90 + expect(typeof timeValue).to.equal('string');
  91 + expect(timeValue).to.equal(nowTime);
  92 + // TIMERANGE
  93 + expect(Array.isArray(timeRangeValue)).to.equal(true);
  94 + expect(timeRangeValue[0]).to.equal(nowTime);
  95 + expect(timeRangeValue[1]).to.equal(nextHour);
  96 +
  97 + done();
  98 + });
  99 + });
  100 + });
  101 +
29 it('should create a DatePicker component of type="datetimerange"', done => { 102 it('should create a DatePicker component of type="datetimerange"', done => {
30 vm = createVue(` 103 vm = createVue(`
31 <Date-Picker type="datetimerange"></Date-Picker> 104 <Date-Picker type="datetimerange"></Date-Picker>
@@ -134,7 +207,7 @@ describe(&#39;DatePicker.vue&#39;, () =&gt; { @@ -134,7 +207,7 @@ describe(&#39;DatePicker.vue&#39;, () =&gt; {
134 207
135 it('should fire `on-change` when reseting value', done => { 208 it('should fire `on-change` when reseting value', done => {
136 const now = new Date(); 209 const now = new Date();
137 - const nowDate = [now.getFullYear(), now.getMonth() + 1, now.getDate()].map(nr => (nr > 9 ? nr : '0' + nr)).join('-'); 210 + const nowDate = dateToString(now);
138 let onChangeCalled = false; 211 let onChangeCalled = false;
139 vm = createVue({ 212 vm = createVue({
140 template: '<date-picker :value="date" type="date" @on-change="onChange"></date-picker>', 213 template: '<date-picker :value="date" type="date" @on-change="onChange"></date-picker>',
@@ -14,6 +14,8 @@ const createElm = function() { @@ -14,6 +14,8 @@ const createElm = function() {
14 return elm; 14 return elm;
15 }; 15 };
16 16
  17 +const pad = (nr) => nr < 10 ? '0' + nr : nr;
  18 +
17 /** 19 /**
18 * 回收 vm 20 * 回收 vm
19 * @param {Object} vm 21 * @param {Object} vm
@@ -72,10 +74,20 @@ exports.stringToDate = function(str) { @@ -72,10 +74,20 @@ exports.stringToDate = function(str) {
72 * @param {Date} 74 * @param {Date}
73 */ 75 */
74 exports.dateToString = function(d) { 76 exports.dateToString = function(d) {
75 - return [d.getFullYear(), d.getMonth() + 1, d.getDate()].map(nr => nr > 9 ? nr : '0' + nr).join('-'); 77 + return [d.getFullYear(), d.getMonth() + 1, d.getDate()].map(pad).join('-');
76 }; 78 };
77 79
78 /** 80 /**
  81 + * Transform Date to HH:MM:SS string
  82 + * @param {Date}
  83 + */
  84 +exports.dateToTimeString = function(d){
  85 + const date = new Date(d);
  86 + return [date.getHours(), date.getMinutes(), date.getSeconds()].map(pad).join(':');
  87 +
  88 +}
  89 +
  90 +/**
79 * 触发一个事件 91 * 触发一个事件
80 * mouseenter, mouseleave, mouseover, keyup, change, click 等 92 * mouseenter, mouseleave, mouseover, keyup, change, click 等
81 * @param {Element} elm 93 * @param {Element} elm