Commit b9041a0df909d517dcbe712196fec05c0dc81778
1 parent
fe44201b
DatePicker add confirm prop
DatePicker add confirm prop
Showing
7 changed files
with
83 additions
and
13 deletions
Show diff stats
1 | +<template> | |
2 | + <div :class="[prefixCls + '-confirm']"> | |
3 | + <i-button size="small" type="text" @click="handleClear">清空</i-button> | |
4 | + <i-button size="small" type="primary" @click="handleSuccess">确定</i-button> | |
5 | + </div> | |
6 | +</template> | |
7 | +<script> | |
8 | + import iButton from '../../button/button.vue'; | |
9 | + | |
10 | + const prefixCls = 'ivu-picker'; | |
11 | + | |
12 | + export default { | |
13 | + components: { iButton }, | |
14 | + data () { | |
15 | + return { | |
16 | + prefixCls: prefixCls | |
17 | + } | |
18 | + }, | |
19 | + methods: { | |
20 | + handleClear () { | |
21 | + this.$emit('on-pick-clear'); | |
22 | + }, | |
23 | + handleSuccess () { | |
24 | + this.$emit('on-pick-success'); | |
25 | + } | |
26 | + } | |
27 | + } | |
28 | +</script> | |
0 | 29 | \ No newline at end of file | ... | ... |
src/components/date-picker/panel/date-range.vue
... | ... | @@ -107,6 +107,10 @@ |
107 | 107 | :disabled-date="disabledDate" |
108 | 108 | @on-pick="handleRightMonthPick"></month-table> |
109 | 109 | </div> |
110 | + <Confirm | |
111 | + v-if="confirm" | |
112 | + @on-pick-clear="handlePickClear" | |
113 | + @on-pick-success="handlePickSuccess"></Confirm> | |
110 | 114 | </div> |
111 | 115 | </div> |
112 | 116 | </template> |
... | ... | @@ -115,6 +119,7 @@ |
115 | 119 | import DateTable from '../base/date-table.vue'; |
116 | 120 | import YearTable from '../base/year-table.vue'; |
117 | 121 | import MonthTable from '../base/month-table.vue'; |
122 | + import Confirm from '../base/confirm.vue'; | |
118 | 123 | import { toDate, prevMonth, nextMonth } from '../util'; |
119 | 124 | |
120 | 125 | import Mixin from './mixin'; |
... | ... | @@ -124,7 +129,7 @@ |
124 | 129 | |
125 | 130 | export default { |
126 | 131 | mixins: [Mixin], |
127 | - components: { Icon, DateTable, YearTable, MonthTable }, | |
132 | + components: { Icon, DateTable, YearTable, MonthTable, Confirm }, | |
128 | 133 | data () { |
129 | 134 | return { |
130 | 135 | prefixCls: prefixCls, |
... | ... | @@ -134,6 +139,7 @@ |
134 | 139 | value: '', |
135 | 140 | minDate: '', |
136 | 141 | maxDate: '', |
142 | + confirm: false, | |
137 | 143 | rangeState: { |
138 | 144 | endDate: null, |
139 | 145 | selecting: false | ... | ... |
src/components/date-picker/panel/date.vue
... | ... | @@ -57,6 +57,10 @@ |
57 | 57 | :disabled-date="disabledDate" |
58 | 58 | @on-pick="handleMonthPick"></month-table> |
59 | 59 | </div> |
60 | + <Confirm | |
61 | + v-if="confirm" | |
62 | + @on-pick-clear="handlePickClear" | |
63 | + @on-pick-success="handlePickSuccess"></Confirm> | |
60 | 64 | </div> |
61 | 65 | </div> |
62 | 66 | </template> |
... | ... | @@ -65,6 +69,7 @@ |
65 | 69 | import DateTable from '../base/date-table.vue'; |
66 | 70 | import YearTable from '../base/year-table.vue'; |
67 | 71 | import MonthTable from '../base/month-table.vue'; |
72 | + import Confirm from '../base/confirm.vue'; | |
68 | 73 | import { formatDate, parseDate } from '../util'; |
69 | 74 | |
70 | 75 | import Mixin from './mixin'; |
... | ... | @@ -74,7 +79,7 @@ |
74 | 79 | |
75 | 80 | export default { |
76 | 81 | mixins: [Mixin], |
77 | - components: { Icon, DateTable, YearTable, MonthTable }, | |
82 | + components: { Icon, DateTable, YearTable, MonthTable, Confirm }, | |
78 | 83 | data () { |
79 | 84 | return { |
80 | 85 | prefixCls: prefixCls, |
... | ... | @@ -85,12 +90,10 @@ |
85 | 90 | value: '', |
86 | 91 | showTime: false, |
87 | 92 | selectionMode: 'day', |
88 | - visible: false, | |
89 | 93 | disabledDate: '', |
90 | 94 | year: null, |
91 | 95 | month: null, |
92 | - showWeekNumber: false, | |
93 | - timePickerVisible: false | |
96 | + confirm: false | |
94 | 97 | } |
95 | 98 | }, |
96 | 99 | computed: { | ... | ... |
src/components/date-picker/panel/mixin.js
... | ... | @@ -13,6 +13,12 @@ export default { |
13 | 13 | handleShortcutClick (shortcut) { |
14 | 14 | if (shortcut.value) this.$emit('on-pick', shortcut.value()); |
15 | 15 | if (shortcut.onClick) shortcut.onClick(this); |
16 | + }, | |
17 | + handlePickClear () { | |
18 | + this.$emit('on-pick-clear'); | |
19 | + }, | |
20 | + handlePickSuccess () { | |
21 | + this.$emit('on-pick-success'); | |
16 | 22 | } |
17 | 23 | } |
18 | 24 | } |
19 | 25 | \ No newline at end of file | ... | ... |
src/components/date-picker/picker.vue
... | ... | @@ -162,6 +162,10 @@ |
162 | 162 | type: Boolean, |
163 | 163 | default: true |
164 | 164 | }, |
165 | + confirm: { | |
166 | + type: Boolean, | |
167 | + default: false | |
168 | + }, | |
165 | 169 | size: { |
166 | 170 | validator (value) { |
167 | 171 | return oneOf(value, ['small', 'large']); |
... | ... | @@ -315,14 +319,19 @@ |
315 | 319 | }, |
316 | 320 | handleIconClick () { |
317 | 321 | if (!this.showClose) return; |
322 | + this.handleClear(); | |
323 | + }, | |
324 | + handleClear () { | |
318 | 325 | this.visible = false; |
319 | 326 | this.internalValue = ''; |
320 | 327 | this.value = ''; |
328 | + this.emitChange(this.value); | |
321 | 329 | }, |
322 | 330 | showPicker () { |
323 | 331 | if (!this.picker) { |
324 | 332 | this.picker = new Vue(this.panel).$mount(this.$els.picker); |
325 | 333 | this.picker.value = this.internalValue; |
334 | + this.picker.confirm = this.confirm; | |
326 | 335 | this.picker.selectionMode = this.selectionMode; |
327 | 336 | if (this.format) this.picker.format = this.format; |
328 | 337 | |
... | ... | @@ -332,13 +341,22 @@ |
332 | 341 | } |
333 | 342 | |
334 | 343 | this.picker.$on('on-pick', (date, visible = false) => { |
344 | + if (!this.confirm) this.visible = visible; | |
345 | + | |
335 | 346 | this.emitChange(date); |
336 | 347 | this.value = date; |
337 | - this.visible = visible; | |
338 | 348 | this.picker.value = date; |
339 | 349 | this.picker.resetView && this.picker.resetView(); |
340 | 350 | }); |
341 | 351 | |
352 | + this.picker.$on('on-pick-clear', () => { | |
353 | + this.handleClear(); | |
354 | + }); | |
355 | + this.picker.$on('on-pick-success', () => { | |
356 | + this.emitChange(this.value); | |
357 | + this.visible = false; | |
358 | + }); | |
359 | + | |
342 | 360 | // todo $on('on-time-range') |
343 | 361 | } |
344 | 362 | if (this.internalValue instanceof Date) { |
... | ... | @@ -349,7 +367,7 @@ |
349 | 367 | this.picker.resetView && this.picker.resetView(); |
350 | 368 | }, |
351 | 369 | emitChange (date) { |
352 | - const format = this.format || DEFAULT_FORMATS[type]; | |
370 | + const format = this.format || DEFAULT_FORMATS[this.type]; | |
353 | 371 | const formatter = ( |
354 | 372 | TYPE_VALUE_RESOLVER_MAP[this.type] || |
355 | 373 | TYPE_VALUE_RESOLVER_MAP['default'] | ... | ... |
src/styles/components/date-picker.less
test/routers/date.vue
1 | 1 | <template> |
2 | 2 | <div style="margin: 50px"> |
3 | - <i-button @click="setDate">change date</i-button> | |
3 | + <i-button @click="type = 'year'">year</i-button> | |
4 | + <i-button @click="type = 'month'">month</i-button> | |
4 | 5 | <br> |
5 | 6 | <row> |
6 | 7 | <i-col span="8"> |
7 | 8 | <!--<i-button @click="setDate">set date</i-button>--> |
8 | 9 | <date-picker |
10 | + :type="type" | |
9 | 11 | style="width:200px" |
10 | 12 | placeholder="请选择日期" |
11 | 13 | :value.sync="value" |
12 | - :options="options" | |
13 | 14 | @on-change="change" |
14 | - :format="format" | |
15 | + :confirm="true" | |
16 | + :options="options" | |
15 | 17 | @on-open-change="change2"></date-picker> |
16 | 18 | </i-col> |
17 | 19 | <i-col span="8"> |
... | ... | @@ -22,9 +24,8 @@ |
22 | 24 | :value.sync="value2" |
23 | 25 | align="right" |
24 | 26 | :editable="true" |
25 | - :format="format" | |
26 | 27 | @on-change="change" |
27 | - :clearable="false" | |
28 | + :confirm="true" | |
28 | 29 | :options="options2"></date-picker> |
29 | 30 | </i-col> |
30 | 31 | </row> |
... | ... | @@ -35,6 +36,7 @@ |
35 | 36 | data () { |
36 | 37 | return { |
37 | 38 | // value: new Date(), |
39 | + type: 'date', | |
38 | 40 | value: '2016-12-25', |
39 | 41 | value2: ['2016-12-17', '2017-01-05'], |
40 | 42 | options2: { |
... | ... | @@ -130,7 +132,7 @@ |
130 | 132 | } |
131 | 133 | ] |
132 | 134 | }, |
133 | - format: 'yyyy-MM-dd' | |
135 | + format: 'yyyy-MM', | |
134 | 136 | } |
135 | 137 | }, |
136 | 138 | computed: {}, | ... | ... |