mirror of
https://github.com/element-plus/element-plus.git
synced 2025-02-05 11:21:11 +08:00
feat(components): [el-date-picker] add panel change event (#5304)
* feat(components): [el-date-picker] add panel change event * docs: [el-date-picker] add panel change event
This commit is contained in:
parent
1888d3c06b
commit
8a9747310e
@ -216,6 +216,7 @@ Note, date time locale (month name, first day of the week ...) are also configur
|
|||||||
| blur | triggers when Input blurs | component instance |
|
| blur | triggers when Input blurs | component instance |
|
||||||
| focus | triggers when Input focuses | component instance |
|
| focus | triggers when Input focuses | component instance |
|
||||||
| calendar-change | triggers when the calendar selected date is changed. Only for `daterange` | [Date, Date] |
|
| calendar-change | triggers when the calendar selected date is changed. Only for `daterange` | [Date, Date] |
|
||||||
|
| panel-change | triggers when the navigation button click. | `(date, mode, view)` |
|
||||||
|
|
||||||
## Methods
|
## Methods
|
||||||
|
|
||||||
|
@ -30,6 +30,53 @@ afterEach(() => {
|
|||||||
document.documentElement.innerHTML = ''
|
document.documentElement.innerHTML = ''
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const testDatePickerPanelChange = async (type: 'date' | 'daterange') => {
|
||||||
|
let mode
|
||||||
|
const wrapper = _mount(
|
||||||
|
`<el-date-picker
|
||||||
|
type="${type}"
|
||||||
|
v-model="value"
|
||||||
|
@panel-change="onPanelChange"
|
||||||
|
/>`,
|
||||||
|
() => ({ value: type === 'daterange' ? [] : '' }),
|
||||||
|
{
|
||||||
|
methods: {
|
||||||
|
onPanelChange(value, _mode) {
|
||||||
|
mode = _mode
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
const reset = () => {
|
||||||
|
mode = undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
const input = wrapper.find('input')
|
||||||
|
input.trigger('blur')
|
||||||
|
input.trigger('focus')
|
||||||
|
await nextTick()
|
||||||
|
const prevMonth = document.querySelector<HTMLElement>('button.arrow-left')
|
||||||
|
const prevYear = document.querySelector<HTMLElement>('button.d-arrow-left')
|
||||||
|
const nextMonth = document.querySelector<HTMLElement>('button.arrow-right')
|
||||||
|
const nextYear = document.querySelector<HTMLElement>('button.d-arrow-right')
|
||||||
|
prevMonth.click()
|
||||||
|
await nextTick()
|
||||||
|
expect(mode).toBe('month')
|
||||||
|
reset()
|
||||||
|
nextMonth.click()
|
||||||
|
await nextTick()
|
||||||
|
expect(mode).toBe('month')
|
||||||
|
reset()
|
||||||
|
prevYear.click()
|
||||||
|
await nextTick()
|
||||||
|
expect(mode).toBe('year')
|
||||||
|
reset()
|
||||||
|
nextYear.click()
|
||||||
|
await nextTick()
|
||||||
|
expect(mode).toBe('year')
|
||||||
|
}
|
||||||
|
|
||||||
describe('DatePicker', () => {
|
describe('DatePicker', () => {
|
||||||
it('create & custom class & style', async () => {
|
it('create & custom class & style', async () => {
|
||||||
const popperClassName = 'popper-class-test'
|
const popperClassName = 'popper-class-test'
|
||||||
@ -532,6 +579,10 @@ describe('DatePicker Navigation', () => {
|
|||||||
expect(getYearLabel()).toContain('2001')
|
expect(getYearLabel()).toContain('2001')
|
||||||
expect(getMonthLabel()).toContain('January')
|
expect(getMonthLabel()).toContain('January')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('panel change event', async () => {
|
||||||
|
await testDatePickerPanelChange('date')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('MonthPicker', () => {
|
describe('MonthPicker', () => {
|
||||||
@ -1094,6 +1145,10 @@ describe('DateRangePicker', () => {
|
|||||||
['01/05 2021', '01/06 2021'].toString()
|
['01/05 2021', '01/06 2021'].toString()
|
||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('panel change event', async () => {
|
||||||
|
await testDatePickerPanelChange('daterange')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe('MonthRange', () => {
|
describe('MonthRange', () => {
|
||||||
|
@ -229,7 +229,7 @@ export default defineComponent({
|
|||||||
validator: isValidDatePickType,
|
validator: isValidDatePickType,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
emits: ['pick', 'set-picker-option'],
|
emits: ['pick', 'set-picker-option', 'panel-change'],
|
||||||
setup(props, ctx) {
|
setup(props, ctx) {
|
||||||
const { t, lang } = useLocale()
|
const { t, lang } = useLocale()
|
||||||
const pickerBase = inject('EP_PICKER_BASE') as any
|
const pickerBase = inject('EP_PICKER_BASE') as any
|
||||||
@ -317,10 +317,12 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
const prevMonth_ = () => {
|
const prevMonth_ = () => {
|
||||||
innerDate.value = innerDate.value.subtract(1, 'month')
|
innerDate.value = innerDate.value.subtract(1, 'month')
|
||||||
|
handlePanelChange('month')
|
||||||
}
|
}
|
||||||
|
|
||||||
const nextMonth_ = () => {
|
const nextMonth_ = () => {
|
||||||
innerDate.value = innerDate.value.add(1, 'month')
|
innerDate.value = innerDate.value.add(1, 'month')
|
||||||
|
handlePanelChange('month')
|
||||||
}
|
}
|
||||||
|
|
||||||
const prevYear_ = () => {
|
const prevYear_ = () => {
|
||||||
@ -329,6 +331,7 @@ export default defineComponent({
|
|||||||
} else {
|
} else {
|
||||||
innerDate.value = innerDate.value.subtract(1, 'year')
|
innerDate.value = innerDate.value.subtract(1, 'year')
|
||||||
}
|
}
|
||||||
|
handlePanelChange('year')
|
||||||
}
|
}
|
||||||
|
|
||||||
const nextYear_ = () => {
|
const nextYear_ = () => {
|
||||||
@ -337,6 +340,7 @@ export default defineComponent({
|
|||||||
} else {
|
} else {
|
||||||
innerDate.value = innerDate.value.add(1, 'year')
|
innerDate.value = innerDate.value.add(1, 'year')
|
||||||
}
|
}
|
||||||
|
handlePanelChange('year')
|
||||||
}
|
}
|
||||||
|
|
||||||
const currentView = ref('date')
|
const currentView = ref('date')
|
||||||
@ -402,6 +406,7 @@ export default defineComponent({
|
|||||||
} else {
|
} else {
|
||||||
currentView.value = 'date'
|
currentView.value = 'date'
|
||||||
}
|
}
|
||||||
|
handlePanelChange('month')
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleYearPick = (year) => {
|
const handleYearPick = (year) => {
|
||||||
@ -412,6 +417,7 @@ export default defineComponent({
|
|||||||
innerDate.value = innerDate.value.year(year)
|
innerDate.value = innerDate.value.year(year)
|
||||||
currentView.value = 'month'
|
currentView.value = 'month'
|
||||||
}
|
}
|
||||||
|
handlePanelChange('year')
|
||||||
}
|
}
|
||||||
|
|
||||||
const showMonthPicker = () => {
|
const showMonthPicker = () => {
|
||||||
@ -640,6 +646,15 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const handlePanelChange = (mode: 'month' | 'year') => {
|
||||||
|
ctx.emit(
|
||||||
|
'panel-change',
|
||||||
|
innerDate.value.toDate(),
|
||||||
|
mode,
|
||||||
|
currentView.value
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
ctx.emit('set-picker-option', ['isValidValue', isValidValue])
|
ctx.emit('set-picker-option', ['isValidValue', isValidValue])
|
||||||
ctx.emit('set-picker-option', ['formatToString', formatToString])
|
ctx.emit('set-picker-option', ['formatToString', formatToString])
|
||||||
ctx.emit('set-picker-option', ['parseUserInput', parseUserInput])
|
ctx.emit('set-picker-option', ['parseUserInput', parseUserInput])
|
||||||
|
@ -285,7 +285,7 @@ export default defineComponent({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
emits: ['pick', 'set-picker-option', 'calendar-change'],
|
emits: ['pick', 'set-picker-option', 'calendar-change', 'panel-change'],
|
||||||
|
|
||||||
setup(props, ctx) {
|
setup(props, ctx) {
|
||||||
const { t, lang } = useLocale()
|
const { t, lang } = useLocale()
|
||||||
@ -372,6 +372,7 @@ export default defineComponent({
|
|||||||
if (!props.unlinkPanels) {
|
if (!props.unlinkPanels) {
|
||||||
rightDate.value = leftDate.value.add(1, 'month')
|
rightDate.value = leftDate.value.add(1, 'month')
|
||||||
}
|
}
|
||||||
|
handlePanelChange('year')
|
||||||
}
|
}
|
||||||
|
|
||||||
const leftPrevMonth = () => {
|
const leftPrevMonth = () => {
|
||||||
@ -379,6 +380,7 @@ export default defineComponent({
|
|||||||
if (!props.unlinkPanels) {
|
if (!props.unlinkPanels) {
|
||||||
rightDate.value = leftDate.value.add(1, 'month')
|
rightDate.value = leftDate.value.add(1, 'month')
|
||||||
}
|
}
|
||||||
|
handlePanelChange('month')
|
||||||
}
|
}
|
||||||
|
|
||||||
const rightNextYear = () => {
|
const rightNextYear = () => {
|
||||||
@ -388,6 +390,7 @@ export default defineComponent({
|
|||||||
} else {
|
} else {
|
||||||
rightDate.value = rightDate.value.add(1, 'year')
|
rightDate.value = rightDate.value.add(1, 'year')
|
||||||
}
|
}
|
||||||
|
handlePanelChange('year')
|
||||||
}
|
}
|
||||||
|
|
||||||
const rightNextMonth = () => {
|
const rightNextMonth = () => {
|
||||||
@ -397,22 +400,35 @@ export default defineComponent({
|
|||||||
} else {
|
} else {
|
||||||
rightDate.value = rightDate.value.add(1, 'month')
|
rightDate.value = rightDate.value.add(1, 'month')
|
||||||
}
|
}
|
||||||
|
handlePanelChange('month')
|
||||||
}
|
}
|
||||||
|
|
||||||
const leftNextYear = () => {
|
const leftNextYear = () => {
|
||||||
leftDate.value = leftDate.value.add(1, 'year')
|
leftDate.value = leftDate.value.add(1, 'year')
|
||||||
|
handlePanelChange('year')
|
||||||
}
|
}
|
||||||
|
|
||||||
const leftNextMonth = () => {
|
const leftNextMonth = () => {
|
||||||
leftDate.value = leftDate.value.add(1, 'month')
|
leftDate.value = leftDate.value.add(1, 'month')
|
||||||
|
handlePanelChange('month')
|
||||||
}
|
}
|
||||||
|
|
||||||
const rightPrevYear = () => {
|
const rightPrevYear = () => {
|
||||||
rightDate.value = rightDate.value.subtract(1, 'year')
|
rightDate.value = rightDate.value.subtract(1, 'year')
|
||||||
|
handlePanelChange('year')
|
||||||
}
|
}
|
||||||
|
|
||||||
const rightPrevMonth = () => {
|
const rightPrevMonth = () => {
|
||||||
rightDate.value = rightDate.value.subtract(1, 'month')
|
rightDate.value = rightDate.value.subtract(1, 'month')
|
||||||
|
handlePanelChange('month')
|
||||||
|
}
|
||||||
|
|
||||||
|
const handlePanelChange = (mode: 'month' | 'year') => {
|
||||||
|
ctx.emit(
|
||||||
|
'panel-change',
|
||||||
|
[leftDate.value.toDate(), rightDate.value.toDate()],
|
||||||
|
mode
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const enableMonthArrow = computed(() => {
|
const enableMonthArrow = computed(() => {
|
||||||
|
@ -137,6 +137,7 @@
|
|||||||
@select-range="setSelectionRange"
|
@select-range="setSelectionRange"
|
||||||
@set-picker-option="onSetPickerOption"
|
@set-picker-option="onSetPickerOption"
|
||||||
@calendar-change="onCalendarChange"
|
@calendar-change="onCalendarChange"
|
||||||
|
@panel-change="onPanelChange"
|
||||||
@mousedown.stop
|
@mousedown.stop
|
||||||
></slot>
|
></slot>
|
||||||
</template>
|
</template>
|
||||||
@ -236,7 +237,14 @@ export default defineComponent({
|
|||||||
ElIcon,
|
ElIcon,
|
||||||
},
|
},
|
||||||
props: timePickerDefaultProps,
|
props: timePickerDefaultProps,
|
||||||
emits: ['update:modelValue', 'change', 'focus', 'blur', 'calendar-change'],
|
emits: [
|
||||||
|
'update:modelValue',
|
||||||
|
'change',
|
||||||
|
'focus',
|
||||||
|
'blur',
|
||||||
|
'calendar-change',
|
||||||
|
'panel-change',
|
||||||
|
],
|
||||||
setup(props, ctx) {
|
setup(props, ctx) {
|
||||||
const { lang } = useLocale()
|
const { lang } = useLocale()
|
||||||
|
|
||||||
@ -619,6 +627,10 @@ export default defineComponent({
|
|||||||
ctx.emit('calendar-change', e)
|
ctx.emit('calendar-change', e)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const onPanelChange = (value, mode, view) => {
|
||||||
|
ctx.emit('panel-change', value, mode, view)
|
||||||
|
}
|
||||||
|
|
||||||
provide('EP_PICKER_BASE', {
|
provide('EP_PICKER_BASE', {
|
||||||
props,
|
props,
|
||||||
})
|
})
|
||||||
@ -657,6 +669,7 @@ export default defineComponent({
|
|||||||
pickerDisabled,
|
pickerDisabled,
|
||||||
onSetPickerOption,
|
onSetPickerOption,
|
||||||
onCalendarChange,
|
onCalendarChange,
|
||||||
|
onPanelChange,
|
||||||
focus,
|
focus,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user