diff --git a/src/components/date-picker/base/confirm.vue b/src/components/date-picker/base/confirm.vue new file mode 100644 index 00000000..c29d435b --- /dev/null +++ b/src/components/date-picker/base/confirm.vue @@ -0,0 +1,28 @@ + + \ No newline at end of file diff --git a/src/components/date-picker/panel/date-range.vue b/src/components/date-picker/panel/date-range.vue index 9ff6a801..a8d97137 100644 --- a/src/components/date-picker/panel/date-range.vue +++ b/src/components/date-picker/panel/date-range.vue @@ -107,6 +107,10 @@ :disabled-date="disabledDate" @on-pick="handleRightMonthPick"> + @@ -115,6 +119,7 @@ import DateTable from '../base/date-table.vue'; import YearTable from '../base/year-table.vue'; import MonthTable from '../base/month-table.vue'; + import Confirm from '../base/confirm.vue'; import { toDate, prevMonth, nextMonth } from '../util'; import Mixin from './mixin'; @@ -124,7 +129,7 @@ export default { mixins: [Mixin], - components: { Icon, DateTable, YearTable, MonthTable }, + components: { Icon, DateTable, YearTable, MonthTable, Confirm }, data () { return { prefixCls: prefixCls, @@ -134,6 +139,7 @@ value: '', minDate: '', maxDate: '', + confirm: false, rangeState: { endDate: null, selecting: false diff --git a/src/components/date-picker/panel/date.vue b/src/components/date-picker/panel/date.vue index fc73c6b9..d422d709 100644 --- a/src/components/date-picker/panel/date.vue +++ b/src/components/date-picker/panel/date.vue @@ -57,6 +57,10 @@ :disabled-date="disabledDate" @on-pick="handleMonthPick"> + @@ -65,6 +69,7 @@ import DateTable from '../base/date-table.vue'; import YearTable from '../base/year-table.vue'; import MonthTable from '../base/month-table.vue'; + import Confirm from '../base/confirm.vue'; import { formatDate, parseDate } from '../util'; import Mixin from './mixin'; @@ -74,7 +79,7 @@ export default { mixins: [Mixin], - components: { Icon, DateTable, YearTable, MonthTable }, + components: { Icon, DateTable, YearTable, MonthTable, Confirm }, data () { return { prefixCls: prefixCls, @@ -85,12 +90,10 @@ value: '', showTime: false, selectionMode: 'day', - visible: false, disabledDate: '', year: null, month: null, - showWeekNumber: false, - timePickerVisible: false + confirm: false } }, computed: { diff --git a/src/components/date-picker/panel/mixin.js b/src/components/date-picker/panel/mixin.js index 1e0e3536..8083f497 100644 --- a/src/components/date-picker/panel/mixin.js +++ b/src/components/date-picker/panel/mixin.js @@ -13,6 +13,12 @@ export default { handleShortcutClick (shortcut) { if (shortcut.value) this.$emit('on-pick', shortcut.value()); if (shortcut.onClick) shortcut.onClick(this); + }, + handlePickClear () { + this.$emit('on-pick-clear'); + }, + handlePickSuccess () { + this.$emit('on-pick-success'); } } } \ No newline at end of file diff --git a/src/components/date-picker/picker.vue b/src/components/date-picker/picker.vue index 7768aabe..19950500 100644 --- a/src/components/date-picker/picker.vue +++ b/src/components/date-picker/picker.vue @@ -162,6 +162,10 @@ type: Boolean, default: true }, + confirm: { + type: Boolean, + default: false + }, size: { validator (value) { return oneOf(value, ['small', 'large']); @@ -315,14 +319,19 @@ }, handleIconClick () { if (!this.showClose) return; + this.handleClear(); + }, + handleClear () { this.visible = false; this.internalValue = ''; this.value = ''; + this.emitChange(this.value); }, showPicker () { if (!this.picker) { this.picker = new Vue(this.panel).$mount(this.$els.picker); this.picker.value = this.internalValue; + this.picker.confirm = this.confirm; this.picker.selectionMode = this.selectionMode; if (this.format) this.picker.format = this.format; @@ -332,13 +341,22 @@ } this.picker.$on('on-pick', (date, visible = false) => { + if (!this.confirm) this.visible = visible; + this.emitChange(date); this.value = date; - this.visible = visible; this.picker.value = date; this.picker.resetView && this.picker.resetView(); }); + this.picker.$on('on-pick-clear', () => { + this.handleClear(); + }); + this.picker.$on('on-pick-success', () => { + this.emitChange(this.value); + this.visible = false; + }); + // todo $on('on-time-range') } if (this.internalValue instanceof Date) { @@ -349,7 +367,7 @@ this.picker.resetView && this.picker.resetView(); }, emitChange (date) { - const format = this.format || DEFAULT_FORMATS[type]; + const format = this.format || DEFAULT_FORMATS[this.type]; const formatter = ( TYPE_VALUE_RESOLVER_MAP[this.type] || TYPE_VALUE_RESOLVER_MAP['default'] diff --git a/src/styles/components/date-picker.less b/src/styles/components/date-picker.less index 66dba3b7..48c40091 100644 --- a/src/styles/components/date-picker.less +++ b/src/styles/components/date-picker.less @@ -238,4 +238,11 @@ float: left; } } + + &-confirm{ + border-top: 1px solid @border-color-split; + text-align: right; + padding: 8px; + clear: both; + } } \ No newline at end of file diff --git a/test/routers/date.vue b/test/routers/date.vue index 53d11958..26b5134a 100644 --- a/test/routers/date.vue +++ b/test/routers/date.vue @@ -1,17 +1,19 @@