Fix month|year preselection/shortcut when picking a date
This commit is contained in:
parent
5426dcf989
commit
b52e02e436
4 changed files with 56 additions and 21 deletions
|
@ -42,6 +42,10 @@ export default {
|
||||||
},
|
},
|
||||||
startDate: {
|
startDate: {
|
||||||
type: Date
|
type: Date
|
||||||
|
},
|
||||||
|
pickerType: {
|
||||||
|
type: String,
|
||||||
|
require: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
|
|
@ -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'){
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -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"
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue