DatePicker: add clear value, closed #759 (#1026)

pull/1042/head
cinwell.li 2016-11-13 15:57:34 +08:00 committed by FuryBean
parent d37e0dbd39
commit 1208ef520c
7 changed files with 98 additions and 26 deletions

View File

@ -273,16 +273,16 @@
this.minDate = null; this.minDate = null;
this.maxDate = null; this.maxDate = null;
} else if (Array.isArray(newVal)) { } else if (Array.isArray(newVal)) {
this.minDate = toDate(newVal[0]); this.minDate = newVal[0] ? toDate(newVal[0]) : null;
this.maxDate = toDate(newVal[1]); this.maxDate = newVal[1] ? toDate(newVal[1]) : null;
} }
} }
}, },
methods: { methods: {
handleClear() { handleClear() {
this.minDate = ''; this.minDate = null;
this.maxDate = ''; this.maxDate = null;
this.handleConfirm(); this.handleConfirm();
}, },

View File

@ -183,6 +183,7 @@
methods: { methods: {
handleClear() { handleClear() {
this.date = new Date(); this.date = new Date();
this.$emit('pick');
}, },
resetDate() { resetDate() {

View File

@ -127,6 +127,10 @@
}, },
methods: { methods: {
handleClear() {
this.handleCancel();
},
handleCancel() { handleCancel() {
this.$emit('pick'); this.$emit('pick');
}, },

View File

@ -81,6 +81,10 @@
if (!item.disabled) { if (!item.disabled) {
this.$emit('pick', item.value); this.$emit('pick', item.value);
} }
},
handleClear() {
this.$emit('pick');
} }
}, },

View File

@ -100,8 +100,12 @@
}, },
methods: { methods: {
handleClear() {
this.handleCancel();
},
handleCancel() { handleCancel() {
this.$emit('pick', null); this.$emit('pick');
}, },
handleChange(date) { handleChange(date) {

View File

@ -5,7 +5,7 @@
:class="{ :class="{
'is-have-trigger': haveTrigger, 'is-have-trigger': haveTrigger,
'is-active': pickerVisible, 'is-active': pickerVisible,
'is-filled': !!this.value 'is-filled': !!this.internalValue
}"> }">
<input <input
@ -22,9 +22,11 @@
v-model.lazy="visualValue" /> v-model.lazy="visualValue" />
<span <span
@click="pickerVisible = !pickerVisible" @click.stop="handleClickIcon"
class="el-date-editor__trigger el-icon" class="el-date-editor__trigger el-icon"
:class="[triggerClass]" :class="[showClose ? 'el-icon-close' : triggerClass]"
@mouseenter="handleMouseEnterIcon"
@mouseleave="showClose = false"
v-if="haveTrigger"> v-if="haveTrigger">
</span> </span>
</span> </span>
@ -219,7 +221,9 @@ export default {
data() { data() {
return { return {
pickerVisible: false pickerVisible: false,
showClose: false,
internalValue: ''
}; };
}, },
@ -228,15 +232,37 @@ export default {
if (this.readonly || this.disabled) return; if (this.readonly || this.disabled) return;
val ? this.showPicker() : this.hidePicker(); val ? this.showPicker() : this.hidePicker();
}, },
value(val) { internalValue(val) {
if (!val && this.picker && typeof this.picker.handleClear === 'function') { if (!val && this.picker && typeof this.picker.handleClear === 'function') {
this.picker.handleClear(); this.picker.handleClear();
} }
this.dispatch('form-item', 'el.form.change'); this.dispatch('form-item', 'el.form.change');
},
value: {
immediate: true,
handler(val) {
this.internalValue = val;
}
} }
}, },
computed: { computed: {
valueIsEmpty() {
const val = this.internalValue;
if (Array.isArray(val)) {
for (let i = 0, j = val.length; i < j; i++) {
if (val[i]) {
return false;
}
}
} else {
if (val) {
return false;
}
}
return true;
},
triggerClass() { triggerClass() {
return this.type.indexOf('time') !== -1 ? 'el-icon-time' : 'el-icon-date'; return this.type.indexOf('time') !== -1 ? 'el-icon-time' : 'el-icon-date';
}, },
@ -262,7 +288,7 @@ export default {
visualValue: { visualValue: {
get() { get() {
const value = this.value; const value = this.internalValue;
const formatter = ( const formatter = (
TYPE_VALUE_RESOLVER_MAP[this.type] || TYPE_VALUE_RESOLVER_MAP[this.type] ||
TYPE_VALUE_RESOLVER_MAP['default'] TYPE_VALUE_RESOLVER_MAP['default']
@ -301,6 +327,20 @@ export default {
}, },
methods: { methods: {
handleMouseEnterIcon() {
if (!this.valueIsEmpty) {
this.showClose = true;
}
},
handleClickIcon() {
if (this.valueIsEmpty) {
this.pickerVisible = !this.pickerVisible;
} else {
this.internalValue = '';
}
},
handleClose() { handleClose() {
this.pickerVisible = false; this.pickerVisible = false;
}, },
@ -370,7 +410,7 @@ export default {
showPicker() { showPicker() {
if (!this.picker) { if (!this.picker) {
this.panel.defaultValue = this.value; this.panel.defaultValue = this.internalValue;
this.picker = new Vue(this.panel).$mount(document.createElement('div')); this.picker = new Vue(this.panel).$mount(document.createElement('div'));
this.popperElm = this.picker.$el; this.popperElm = this.picker.$el;
this.picker.width = this.$refs.reference.getBoundingClientRect().width; this.picker.width = this.$refs.reference.getBoundingClientRect().width;
@ -412,10 +452,7 @@ export default {
this.picker.$on('dodestroy', this.doDestroy); this.picker.$on('dodestroy', this.doDestroy);
this.picker.$on('pick', (date, visible = false) => { this.picker.$on('pick', (date, visible = false) => {
this.$emit('input', date); this.$emit('input', date);
this.pickerVisible = this.picker.visible = visible;
if (!visible) {
this.pickerVisible = this.picker.visible = !this.picker.visible;
}
this.picker.resetView && this.picker.resetView(); this.picker.resetView && this.picker.resetView();
}); });
@ -431,11 +468,11 @@ export default {
this.updatePopper(); this.updatePopper();
if (this.value instanceof Date) { if (this.internalValue instanceof Date) {
this.picker.date = new Date(this.value.getTime()); this.picker.date = new Date(this.internalValue.getTime());
this.picker.resetView && this.picker.resetView(); this.picker.resetView && this.picker.resetView();
} else { } else {
this.picker.value = this.value; this.picker.value = this.internalValue;
} }
this.$nextTick(() => { this.$nextTick(() => {

View File

@ -66,6 +66,31 @@ describe('DatePicker', () => {
}, DELAY); }, DELAY);
}); });
it('clear value', done => {
vm = createVue({
template: `
<el-date-picker v-model="value" ref="compo"></el-date-picker>
`,
data() {
return { value: '' };
}
}, true);
const input = vm.$el.querySelector('input');
input.focus();
setTimeout(_ => {
const $el = vm.$refs.compo.picker.$el;
$el.querySelector('td.available').click();
vm.$nextTick(_ => {
vm.$el.querySelector('.el-date-editor__trigger').click();
setTimeout(_ => {
expect(vm.value).to.empty;
done();
}, DELAY);
});
}, DELAY);
});
it('reset', done => { it('reset', done => {
vm = createVue({ vm = createVue({
template: ` template: `
@ -218,7 +243,6 @@ describe('DatePicker', () => {
it('click now button', done => { it('click now button', done => {
const date = new Date(1999, 10, 10, 10, 10); const date = new Date(1999, 10, 10, 10, 10);
vm.picker.date = new Date(date);
vm.picker.$el.querySelector('.el-picker-panel__link-btn').click(); vm.picker.$el.querySelector('.el-picker-panel__link-btn').click();
setTimeout(_ => { setTimeout(_ => {
expect(vm.picker.date > date).to.true; expect(vm.picker.date > date).to.true;
@ -228,14 +252,12 @@ describe('DatePicker', () => {
it('click timepicker', done => { it('click timepicker', done => {
const input = vm.picker.$el.querySelectorAll('.el-date-picker__editor-wrap input')[1]; const input = vm.picker.$el.querySelectorAll('.el-date-picker__editor-wrap input')[1];
input.blur(); triggerEvent(input, 'focus');
input.focus();
input.blur();
setTimeout(_ => { setTimeout(_ => {
expect(vm.picker.$el.querySelector('.el-time-panel')).to.have.deep.property('style.display').to.equal(''); expect(vm.picker.$el.querySelector('.el-time-panel')).to.have.deep.property('style.display').to.equal('');
done(); done();
}, 400); }, DELAY);
}); });
it('input timepicker', done => { it('input timepicker', done => {
@ -391,7 +413,7 @@ describe('DatePicker', () => {
setTimeout(_ => { setTimeout(_ => {
expect(vm.picker.$el.querySelector('.el-date-range-picker__time-picker-wrap .el-time-panel')).to.have.deep.property('style.display').to.equal(''); expect(vm.picker.$el.querySelector('.el-date-range-picker__time-picker-wrap .el-time-panel')).to.have.deep.property('style.display').to.equal('');
done(); done();
}, 400); }, DELAY);
}); });
it('click timepicker in right', done => { it('click timepicker in right', done => {
@ -403,7 +425,7 @@ describe('DatePicker', () => {
setTimeout(_ => { setTimeout(_ => {
expect(vm.picker.$el.querySelectorAll('.el-date-range-picker__time-picker-wrap .el-time-panel')[1]).to.have.deep.property('style.display').to.equal(''); expect(vm.picker.$el.querySelectorAll('.el-date-range-picker__time-picker-wrap .el-time-panel')[1]).to.have.deep.property('style.display').to.equal('');
done(); done();
}, 400); }, DELAY);
}); });
it('input timepicker', done => { it('input timepicker', done => {