Commit b52e02e4367002c01d04793c2e8059965aa26b80
1 parent
5426dcf9
Fix month|year preselection/shortcut when picking a date
Showing
4 changed files
with
56 additions
and
21 deletions
Show diff stats
src/components/date-picker/panel/Date/date-panel-mixin.js
src/components/date-picker/panel/Date/date-range.vue
| @@ -31,7 +31,7 @@ | @@ -31,7 +31,7 @@ | ||
| 31 | v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span> | 31 | v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span> |
| 32 | </div> | 32 | </div> |
| 33 | <component | 33 | <component |
| 34 | - :is="pickerTable" | 34 | + :is="leftPickerTable" |
| 35 | ref="leftYearTable" | 35 | ref="leftYearTable" |
| 36 | v-if="currentView !== 'time'" | 36 | v-if="currentView !== 'time'" |
| 37 | :table-date="leftPanelDate" | 37 | :table-date="leftPanelDate" |
| @@ -41,7 +41,7 @@ | @@ -41,7 +41,7 @@ | ||
| 41 | :show-week-numbers="showWeekNumbers" | 41 | :show-week-numbers="showWeekNumbers" |
| 42 | :value="dates" | 42 | :value="dates" |
| 43 | @on-change-range="handleChangeRange" | 43 | @on-change-range="handleChangeRange" |
| 44 | - @on-pick="handleRangePick" | 44 | + @on-pick="panelPickerHandlers.left" |
| 45 | @on-pick-click="handlePickClick" | 45 | @on-pick-click="handlePickClick" |
| 46 | ></component> | 46 | ></component> |
| 47 | </div> | 47 | </div> |
| @@ -69,7 +69,7 @@ | @@ -69,7 +69,7 @@ | ||
| 69 | v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span> | 69 | v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span> |
| 70 | </div> | 70 | </div> |
| 71 | <component | 71 | <component |
| 72 | - :is="pickerTable" | 72 | + :is="rightPickerTable" |
| 73 | ref="rightYearTable" | 73 | ref="rightYearTable" |
| 74 | v-if="currentView !== 'time'" | 74 | v-if="currentView !== 'time'" |
| 75 | :table-date="rightPanelDate" | 75 | :table-date="rightPanelDate" |
| @@ -79,7 +79,7 @@ | @@ -79,7 +79,7 @@ | ||
| 79 | :show-week-numbers="showWeekNumbers" | 79 | :show-week-numbers="showWeekNumbers" |
| 80 | :value="dates" | 80 | :value="dates" |
| 81 | @on-change-range="handleChangeRange" | 81 | @on-change-range="handleChangeRange" |
| 82 | - @on-pick="handleRangePick" | 82 | + @on-pick="panelPickerHandlers.right" |
| 83 | @on-pick-click="handlePickClick"></component> | 83 | @on-pick-click="handlePickClick"></component> |
| 84 | </div> | 84 | </div> |
| 85 | <div :class="[prefixCls + '-content']" v-show="isTime"> | 85 | <div :class="[prefixCls + '-content']" v-show="isTime"> |
| @@ -147,6 +147,8 @@ | @@ -147,6 +147,8 @@ | ||
| 147 | dates: this.value, | 147 | dates: this.value, |
| 148 | rangeState: {from: this.value[0], to: this.value[1], selecting: minDate && !maxDate}, | 148 | rangeState: {from: this.value[0], to: this.value[1], selecting: minDate && !maxDate}, |
| 149 | currentView: this.selectionMode || 'range', | 149 | currentView: this.selectionMode || 'range', |
| 150 | + leftPickerTable: `${this.selectionMode}-table`, | ||
| 151 | + rightPickerTable: `${this.selectionMode}-table`, | ||
| 150 | leftPanelDate: leftPanelDate, | 152 | leftPanelDate: leftPanelDate, |
| 151 | rightPanelDate: new Date(leftPanelDate.getFullYear(), leftPanelDate.getMonth() + 1, leftPanelDate.getDate()) | 153 | rightPanelDate: new Date(leftPanelDate.getFullYear(), leftPanelDate.getMonth() + 1, leftPanelDate.getDate()) |
| 152 | }; | 154 | }; |
| @@ -161,9 +163,6 @@ | @@ -161,9 +163,6 @@ | ||
| 161 | } | 163 | } |
| 162 | ]; | 164 | ]; |
| 163 | }, | 165 | }, |
| 164 | - pickerTable(){ | ||
| 165 | - return `${this.currentView}-table`; | ||
| 166 | - }, | ||
| 167 | leftDatePanelLabel(){ | 166 | leftDatePanelLabel(){ |
| 168 | return this.panelLabelConfig('left'); | 167 | return this.panelLabelConfig('left'); |
| 169 | }, | 168 | }, |
| @@ -172,6 +171,13 @@ | @@ -172,6 +171,13 @@ | ||
| 172 | }, | 171 | }, |
| 173 | timeDisabled(){ | 172 | timeDisabled(){ |
| 174 | return !(this.dates[0] && this.dates[1]); | 173 | return !(this.dates[0] && this.dates[1]); |
| 174 | + }, | ||
| 175 | + panelPickerHandlers(){ | ||
| 176 | + const tableType = `${this.currentView}-table`; | ||
| 177 | + return { | ||
| 178 | + left: this.leftPickerTable === tableType ? this.handleRangePick : this.handlePreSelection.bind(this, 'left'), | ||
| 179 | + right: this.leftPickerTable === tableType ? this.handleRangePick : this.handlePreSelection.bind(this, 'right'), | ||
| 180 | + } | ||
| 175 | } | 181 | } |
| 176 | }, | 182 | }, |
| 177 | watch: { | 183 | watch: { |
| @@ -190,6 +196,9 @@ | @@ -190,6 +196,9 @@ | ||
| 190 | const rightMonth = this.rightPanelDate.getMonth(); | 196 | const rightMonth = this.rightPanelDate.getMonth(); |
| 191 | const isSameYear = this.leftPanelDate.getFullYear() === this.rightPanelDate.getFullYear(); | 197 | const isSameYear = this.leftPanelDate.getFullYear() === this.rightPanelDate.getFullYear(); |
| 192 | 198 | ||
| 199 | + this.leftPickerTable = `${currentView}-table`; | ||
| 200 | + this.rightPickerTable = `${currentView}-table`; | ||
| 201 | + | ||
| 193 | if (currentView === 'date' && isSameYear && leftMonth === rightMonth){ | 202 | if (currentView === 'date' && isSameYear && leftMonth === rightMonth){ |
| 194 | this.changePanelDate('right', 'Month', 1); | 203 | this.changePanelDate('right', 'Month', 1); |
| 195 | } | 204 | } |
| @@ -257,11 +266,15 @@ | @@ -257,11 +266,15 @@ | ||
| 257 | } | 266 | } |
| 258 | } | 267 | } |
| 259 | }, | 268 | }, |
| 260 | - showYearPicker () { | ||
| 261 | - this.currentView = 'year'; | 269 | + showYearPicker (panel) { |
| 270 | + this[`${panel}PickerTable`] = 'year-table'; | ||
| 271 | + }, | ||
| 272 | + showMonthPicker (panel) { | ||
| 273 | + this[`${panel}PickerTable`] = 'month-table'; | ||
| 262 | }, | 274 | }, |
| 263 | - showMonthPicker () { | ||
| 264 | - this.currentView = 'month'; | 275 | + handlePreSelection(panel, value){ |
| 276 | + this[`${panel}PanelDate`] = value; | ||
| 277 | + this[`${panel}PickerTable`] = `${this.currentView}-table`; | ||
| 265 | }, | 278 | }, |
| 266 | handleRangePick (val) { | 279 | handleRangePick (val) { |
| 267 | if (this.rangeState.selecting || this.currentView === 'time'){ | 280 | if (this.rangeState.selecting || this.currentView === 'time'){ |
src/components/date-picker/panel/Date/date.vue
| @@ -37,7 +37,7 @@ | @@ -37,7 +37,7 @@ | ||
| 37 | :value="dates" | 37 | :value="dates" |
| 38 | :selection-mode="selectionMode" | 38 | :selection-mode="selectionMode" |
| 39 | :disabled-date="disabledDate" | 39 | :disabled-date="disabledDate" |
| 40 | - @on-pick="handlePick" | 40 | + @on-pick="panelPickerHandlers" |
| 41 | @on-pick-click="handlePickClick" | 41 | @on-pick-click="handlePickClick" |
| 42 | ></component> | 42 | ></component> |
| 43 | </div> | 43 | </div> |
| @@ -92,11 +92,14 @@ | @@ -92,11 +92,14 @@ | ||
| 92 | // in the mixin | 92 | // in the mixin |
| 93 | }, | 93 | }, |
| 94 | data () { | 94 | data () { |
| 95 | - const dates = this.value.slice().sort(); | 95 | + const {selectionMode, value} = this; |
| 96 | + | ||
| 97 | + const dates = value.slice().sort(); | ||
| 96 | return { | 98 | return { |
| 97 | prefixCls: prefixCls, | 99 | prefixCls: prefixCls, |
| 98 | datePrefixCls: datePrefixCls, | 100 | datePrefixCls: datePrefixCls, |
| 99 | - currentView: this.selectionMode || 'date', | 101 | + currentView: selectionMode || 'date', |
| 102 | + pickerTable: this.getTableType(selectionMode), | ||
| 100 | dates: dates, | 103 | dates: dates, |
| 101 | panelDate: this.startDate || dates[0] || new Date() | 104 | panelDate: this.startDate || dates[0] || new Date() |
| 102 | }; | 105 | }; |
| @@ -110,8 +113,8 @@ | @@ -110,8 +113,8 @@ | ||
| 110 | } | 113 | } |
| 111 | ]; | 114 | ]; |
| 112 | }, | 115 | }, |
| 113 | - pickerTable(){ | ||
| 114 | - return this.currentView.match(/^time/) ? 'time-picker' : `${this.currentView}-table`; | 116 | + panelPickerHandlers(){ |
| 117 | + return this.pickerTable === `${this.currentView}-table` ? this.handlePick : this.handlePreSelection | ||
| 115 | }, | 118 | }, |
| 116 | datePanelLabel () { | 119 | datePanelLabel () { |
| 117 | const locale = this.t('i.locale'); | 120 | const locale = this.t('i.locale'); |
| @@ -120,7 +123,7 @@ | @@ -120,7 +123,7 @@ | ||
| 120 | const { labels, separator } = formatDateLabels(locale, datePanelLabel, date); | 123 | const { labels, separator } = formatDateLabels(locale, datePanelLabel, date); |
| 121 | 124 | ||
| 122 | const handler = type => { | 125 | const handler = type => { |
| 123 | - return () => (this.currentView = type); | 126 | + return () => this.pickerTable = this.getTableType(type); |
| 124 | }; | 127 | }; |
| 125 | 128 | ||
| 126 | return { | 129 | return { |
| @@ -139,8 +142,9 @@ | @@ -139,8 +142,9 @@ | ||
| 139 | selectionMode(){ | 142 | selectionMode(){ |
| 140 | this.currentView = this.selectionMode; | 143 | this.currentView = this.selectionMode; |
| 141 | }, | 144 | }, |
| 142 | - currentView (val) { | ||
| 143 | - this.$emit('on-selection-mode-change', val); | 145 | + currentView (currentView) { |
| 146 | + this.$emit('on-selection-mode-change', currentView); | ||
| 147 | + this.pickertable = this.getTableType(currentView); | ||
| 144 | } | 148 | } |
| 145 | }, | 149 | }, |
| 146 | methods: { | 150 | methods: { |
| @@ -151,16 +155,29 @@ | @@ -151,16 +155,29 @@ | ||
| 151 | this.panelDate = siblingMonth(this.panelDate, dir * 12); | 155 | this.panelDate = siblingMonth(this.panelDate, dir * 12); |
| 152 | } | 156 | } |
| 153 | }, | 157 | }, |
| 158 | + getTableType(currentView){ | ||
| 159 | + return currentView.match(/^time/) ? 'time-picker' : `${currentView}-table`; | ||
| 160 | + }, | ||
| 154 | changeMonth(dir){ | 161 | changeMonth(dir){ |
| 155 | this.panelDate = siblingMonth(this.panelDate, dir); | 162 | this.panelDate = siblingMonth(this.panelDate, dir); |
| 156 | }, | 163 | }, |
| 164 | + handlePreSelection(value){ | ||
| 165 | + this.panelDate = value; | ||
| 166 | + this.pickerTable = this.getTableType(this.currentView); | ||
| 167 | + }, | ||
| 157 | handlePick (value) { | 168 | handlePick (value) { |
| 158 | - const {selectionMode, panelDate} = this; | 169 | + const {selectionMode, panelDate, pickerType} = this; |
| 159 | if (selectionMode === 'year') value = new Date(value.getFullYear(), 0, 1); | 170 | if (selectionMode === 'year') value = new Date(value.getFullYear(), 0, 1); |
| 160 | else if (selectionMode === 'month') value = new Date(panelDate.getFullYear(), value.getMonth(), 1); | 171 | else if (selectionMode === 'month') value = new Date(panelDate.getFullYear(), value.getMonth(), 1); |
| 161 | else value = new Date(value); | 172 | else value = new Date(value); |
| 162 | 173 | ||
| 163 | - this.$emit('on-pick', value); | 174 | + if (pickerType === selectionMode){ |
| 175 | + this.$emit('on-pick', value); | ||
| 176 | + } else { | ||
| 177 | + this.selectionMode | ||
| 178 | + } | ||
| 179 | + | ||
| 180 | + | ||
| 164 | }, | 181 | }, |
| 165 | }, | 182 | }, |
| 166 | }; | 183 | }; |
src/components/date-picker/picker.vue
| @@ -45,6 +45,7 @@ | @@ -45,6 +45,7 @@ | ||
| 45 | :start-date="startDate" | 45 | :start-date="startDate" |
| 46 | :split-panels="splitPanels" | 46 | :split-panels="splitPanels" |
| 47 | :show-week-numbers="showWeekNumbers" | 47 | :show-week-numbers="showWeekNumbers" |
| 48 | + :picker-type="type" | ||
| 48 | 49 | ||
| 49 | v-bind="ownPickerProps" | 50 | v-bind="ownPickerProps" |
| 50 | 51 |