Fix month|year preselection/shortcut when picking a date

This commit is contained in:
Sergio Crisostomo 2018-01-24 09:46:07 +01:00
parent 5426dcf989
commit b52e02e436
4 changed files with 56 additions and 21 deletions

View file

@ -42,6 +42,10 @@ export default {
}, },
startDate: { startDate: {
type: Date type: Date
},
pickerType: {
type: String,
require: true
} }
}, },
computed: { computed: {

View file

@ -31,7 +31,7 @@
v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span> v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span>
</div> </div>
<component <component
:is="pickerTable" :is="leftPickerTable"
ref="leftYearTable" ref="leftYearTable"
v-if="currentView !== 'time'" v-if="currentView !== 'time'"
:table-date="leftPanelDate" :table-date="leftPanelDate"
@ -41,7 +41,7 @@
:show-week-numbers="showWeekNumbers" :show-week-numbers="showWeekNumbers"
:value="dates" :value="dates"
@on-change-range="handleChangeRange" @on-change-range="handleChangeRange"
@on-pick="handleRangePick" @on-pick="panelPickerHandlers.left"
@on-pick-click="handlePickClick" @on-pick-click="handlePickClick"
></component> ></component>
</div> </div>
@ -69,7 +69,7 @@
v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span> v-show="currentView === 'date'"><Icon type="ios-arrow-right"></Icon></span>
</div> </div>
<component <component
:is="pickerTable" :is="rightPickerTable"
ref="rightYearTable" ref="rightYearTable"
v-if="currentView !== 'time'" v-if="currentView !== 'time'"
:table-date="rightPanelDate" :table-date="rightPanelDate"
@ -79,7 +79,7 @@
:show-week-numbers="showWeekNumbers" :show-week-numbers="showWeekNumbers"
:value="dates" :value="dates"
@on-change-range="handleChangeRange" @on-change-range="handleChangeRange"
@on-pick="handleRangePick" @on-pick="panelPickerHandlers.right"
@on-pick-click="handlePickClick"></component> @on-pick-click="handlePickClick"></component>
</div> </div>
<div :class="[prefixCls + '-content']" v-show="isTime"> <div :class="[prefixCls + '-content']" v-show="isTime">
@ -147,6 +147,8 @@
dates: this.value, dates: this.value,
rangeState: {from: this.value[0], to: this.value[1], selecting: minDate && !maxDate}, rangeState: {from: this.value[0], to: this.value[1], selecting: minDate && !maxDate},
currentView: this.selectionMode || 'range', currentView: this.selectionMode || 'range',
leftPickerTable: `${this.selectionMode}-table`,
rightPickerTable: `${this.selectionMode}-table`,
leftPanelDate: leftPanelDate, leftPanelDate: leftPanelDate,
rightPanelDate: new Date(leftPanelDate.getFullYear(), leftPanelDate.getMonth() + 1, leftPanelDate.getDate()) rightPanelDate: new Date(leftPanelDate.getFullYear(), leftPanelDate.getMonth() + 1, leftPanelDate.getDate())
}; };
@ -161,9 +163,6 @@
} }
]; ];
}, },
pickerTable(){
return `${this.currentView}-table`;
},
leftDatePanelLabel(){ leftDatePanelLabel(){
return this.panelLabelConfig('left'); return this.panelLabelConfig('left');
}, },
@ -172,6 +171,13 @@
}, },
timeDisabled(){ timeDisabled(){
return !(this.dates[0] && this.dates[1]); return !(this.dates[0] && this.dates[1]);
},
panelPickerHandlers(){
const tableType = `${this.currentView}-table`;
return {
left: this.leftPickerTable === tableType ? this.handleRangePick : this.handlePreSelection.bind(this, 'left'),
right: this.leftPickerTable === tableType ? this.handleRangePick : this.handlePreSelection.bind(this, 'right'),
}
} }
}, },
watch: { watch: {
@ -190,6 +196,9 @@
const rightMonth = this.rightPanelDate.getMonth(); const rightMonth = this.rightPanelDate.getMonth();
const isSameYear = this.leftPanelDate.getFullYear() === this.rightPanelDate.getFullYear(); const isSameYear = this.leftPanelDate.getFullYear() === this.rightPanelDate.getFullYear();
this.leftPickerTable = `${currentView}-table`;
this.rightPickerTable = `${currentView}-table`;
if (currentView === 'date' && isSameYear && leftMonth === rightMonth){ if (currentView === 'date' && isSameYear && leftMonth === rightMonth){
this.changePanelDate('right', 'Month', 1); this.changePanelDate('right', 'Month', 1);
} }
@ -257,11 +266,15 @@
} }
} }
}, },
showYearPicker () { showYearPicker (panel) {
this.currentView = 'year'; this[`${panel}PickerTable`] = 'year-table';
}, },
showMonthPicker () { showMonthPicker (panel) {
this.currentView = 'month'; this[`${panel}PickerTable`] = 'month-table';
},
handlePreSelection(panel, value){
this[`${panel}PanelDate`] = value;
this[`${panel}PickerTable`] = `${this.currentView}-table`;
}, },
handleRangePick (val) { handleRangePick (val) {
if (this.rangeState.selecting || this.currentView === 'time'){ if (this.rangeState.selecting || this.currentView === 'time'){

View file

@ -37,7 +37,7 @@
:value="dates" :value="dates"
:selection-mode="selectionMode" :selection-mode="selectionMode"
:disabled-date="disabledDate" :disabled-date="disabledDate"
@on-pick="handlePick" @on-pick="panelPickerHandlers"
@on-pick-click="handlePickClick" @on-pick-click="handlePickClick"
></component> ></component>
</div> </div>
@ -92,11 +92,14 @@
// in the mixin // in the mixin
}, },
data () { data () {
const dates = this.value.slice().sort(); const {selectionMode, value} = this;
const dates = value.slice().sort();
return { return {
prefixCls: prefixCls, prefixCls: prefixCls,
datePrefixCls: datePrefixCls, datePrefixCls: datePrefixCls,
currentView: this.selectionMode || 'date', currentView: selectionMode || 'date',
pickerTable: this.getTableType(selectionMode),
dates: dates, dates: dates,
panelDate: this.startDate || dates[0] || new Date() panelDate: this.startDate || dates[0] || new Date()
}; };
@ -110,8 +113,8 @@
} }
]; ];
}, },
pickerTable(){ panelPickerHandlers(){
return this.currentView.match(/^time/) ? 'time-picker' : `${this.currentView}-table`; return this.pickerTable === `${this.currentView}-table` ? this.handlePick : this.handlePreSelection
}, },
datePanelLabel () { datePanelLabel () {
const locale = this.t('i.locale'); const locale = this.t('i.locale');
@ -120,7 +123,7 @@
const { labels, separator } = formatDateLabels(locale, datePanelLabel, date); const { labels, separator } = formatDateLabels(locale, datePanelLabel, date);
const handler = type => { const handler = type => {
return () => (this.currentView = type); return () => this.pickerTable = this.getTableType(type);
}; };
return { return {
@ -139,8 +142,9 @@
selectionMode(){ selectionMode(){
this.currentView = this.selectionMode; this.currentView = this.selectionMode;
}, },
currentView (val) { currentView (currentView) {
this.$emit('on-selection-mode-change', val); this.$emit('on-selection-mode-change', currentView);
this.pickertable = this.getTableType(currentView);
} }
}, },
methods: { methods: {
@ -151,16 +155,29 @@
this.panelDate = siblingMonth(this.panelDate, dir * 12); this.panelDate = siblingMonth(this.panelDate, dir * 12);
} }
}, },
getTableType(currentView){
return currentView.match(/^time/) ? 'time-picker' : `${currentView}-table`;
},
changeMonth(dir){ changeMonth(dir){
this.panelDate = siblingMonth(this.panelDate, dir); this.panelDate = siblingMonth(this.panelDate, dir);
}, },
handlePreSelection(value){
this.panelDate = value;
this.pickerTable = this.getTableType(this.currentView);
},
handlePick (value) { handlePick (value) {
const {selectionMode, panelDate} = this; const {selectionMode, panelDate, pickerType} = this;
if (selectionMode === 'year') value = new Date(value.getFullYear(), 0, 1); if (selectionMode === 'year') value = new Date(value.getFullYear(), 0, 1);
else if (selectionMode === 'month') value = new Date(panelDate.getFullYear(), value.getMonth(), 1); else if (selectionMode === 'month') value = new Date(panelDate.getFullYear(), value.getMonth(), 1);
else value = new Date(value); else value = new Date(value);
if (pickerType === selectionMode){
this.$emit('on-pick', value); this.$emit('on-pick', value);
} else {
this.selectionMode
}
}, },
}, },
}; };

View file

@ -45,6 +45,7 @@
:start-date="startDate" :start-date="startDate"
:split-panels="splitPanels" :split-panels="splitPanels"
:show-week-numbers="showWeekNumbers" :show-week-numbers="showWeekNumbers"
:picker-type="type"
v-bind="ownPickerProps" v-bind="ownPickerProps"