Skip to content

Commit 4931fa2

Browse files
committed
feat(datepicker): Focus prev/next buttons on click
1 parent 22ebd1d commit 4931fa2

13 files changed

+58
-33
lines changed

src/components/Datepicker.vue

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -381,10 +381,12 @@ export default {
381381
this.$emit('focus')
382382
},
383383
/**
384-
* Set the new pageDate and emit `changed-<view>` event
384+
* Set the new pageDate, focus the relevant element and emit a `changed-<view>` event
385385
*/
386-
handlePageChange(pageDate) {
386+
handlePageChange({ focusRefs, pageDate }) {
387387
this.setPageDate(pageDate)
388+
this.focus.refs = focusRefs
389+
this.reviewFocus()
388390
this.$emit(`changed-${this.nextView.up}`, pageDate)
389391
},
390392
/**

src/components/PickerDay.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
<PickerHeader
66
v-if="showHeader"
7+
ref="pickerHeader"
78
:bootstrap-styling="bootstrapStyling"
89
:is-next-disabled="isNextDisabled"
910
:is-previous-disabled="isPreviousDisabled"

src/components/PickerHeader.vue

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,27 @@
11
<template>
22
<header>
33
<button
4+
ref="prev"
45
class="prev"
56
:class="{ btn: bootstrapStyling, rtl: isRtl }"
67
data-test-previous-button
78
:disabled="isPreviousDisabled"
89
type="button"
9-
@click="isPreviousDisabled ? null : $emit('page-change', -1)"
10+
@click="$emit('page-change', previousPage)"
1011
>
1112
<slot name="prevIntervalBtn">
1213
<span class="default">&lt;</span>
1314
</slot>
1415
</button>
1516
<slot />
1617
<button
18+
ref="next"
1719
class="next"
1820
:class="{ btn: bootstrapStyling, rtl: isRtl }"
1921
data-test-next-button
2022
:disabled="isNextDisabled"
2123
type="button"
22-
@click="isNextDisabled ? null : $emit('page-change', 1)"
24+
@click="$emit('page-change', nextPage)"
2325
>
2426
<slot name="nextIntervalBtn">
2527
<span class="default">&gt;</span>
@@ -49,5 +51,11 @@ export default {
4951
required: true,
5052
},
5153
},
54+
data() {
55+
return {
56+
previousPage: { incrementBy: -1, focusRefs: ['prev'] },
57+
nextPage: { incrementBy: 1, focusRefs: ['next'] },
58+
}
59+
},
5260
}
5361
</script>

src/components/PickerMonth.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
<PickerHeader
66
v-if="showHeader"
7+
ref="pickerHeader"
78
:bootstrap-styling="bootstrapStyling"
89
:is-next-disabled="isNextDisabled"
910
:is-previous-disabled="isPreviousDisabled"

src/components/PickerYear.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
<PickerHeader
66
v-if="showHeader"
7+
ref="pickerHeader"
78
:bootstrap-styling="bootstrapStyling"
89
:is-next-disabled="isNextDisabled"
910
:is-previous-disabled="isPreviousDisabled"

src/mixins/navMixin.vue

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,24 @@ export default {
4646
* @param {string} ref The `ref` name of the wanted element
4747
* @returns {HTMLElement|Vue} A Vue element
4848
*/
49+
// eslint-disable-next-line complexity
4950
getElementByRef(ref) {
5051
if (ref === 'tabbableCell') {
5152
return this.tabbableCell
5253
}
5354
if (ref === 'input') {
5455
return this.$refs.dateInput && this.$refs.dateInput.$refs[this.refName]
5556
}
57+
if (this.showHeader) {
58+
if (ref === 'up') {
59+
return this.$refs.picker && this.$refs.picker.$refs.up.$el
60+
}
61+
return (
62+
this.$refs.picker &&
63+
this.$refs.picker.$refs.pickerHeader &&
64+
this.$refs.picker.$refs.pickerHeader.$refs[ref]
65+
)
66+
}
5667
return null
5768
},
5869
/**

src/mixins/pickerMixin.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,9 @@ export default {
9494
/**
9595
* Changes the page up or down
9696
* @param {Number} incrementBy
97+
* @param {[String]} focusRefs
9798
*/
98-
changePage(incrementBy) {
99+
changePage({ incrementBy, focusRefs }) {
99100
const { pageDate, utils } = this
100101
const units =
101102
this.view === 'year' ? incrementBy * this.yearRange : incrementBy
@@ -108,7 +109,7 @@ export default {
108109
utils.setFullYear(pageDate, utils.getFullYear(pageDate) + units)
109110
}
110111
111-
this.$emit('page-change', pageDate)
112+
this.$emit('page-change', { focusRefs, pageDate })
112113
},
113114
/**
114115
* Determines which transition to use (for edge dates) and emits a 'select' event

test/unit/specs/Datepicker/Datepicker.spec.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -365,16 +365,16 @@ describe('Datepicker shallowMounted', () => {
365365
it('emits changed-month/year/decade', async () => {
366366
const pageDate = new Date(2016, 2, 1)
367367
await wrapper.vm.setView('day')
368-
await wrapper.vm.handlePageChange(pageDate)
368+
await wrapper.vm.handlePageChange({ pageDate })
369369

370370
expect(wrapper.emitted('changed-month')).toBeTruthy()
371371

372372
await wrapper.vm.setView('month')
373-
await wrapper.vm.handlePageChange(pageDate)
373+
await wrapper.vm.handlePageChange({ pageDate })
374374
expect(wrapper.emitted('changed-year')).toBeTruthy()
375375

376376
await wrapper.vm.setView('year')
377-
await wrapper.vm.handlePageChange(pageDate)
377+
await wrapper.vm.handlePageChange({ pageDate })
378378
expect(wrapper.emitted('changed-decade')).toBeTruthy()
379379
})
380380

test/unit/specs/PickerDay/pickerDay.spec.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,13 @@ describe('PickerDay', () => {
2929
})
3030

3131
it('can set the next month', () => {
32-
wrapper.vm.changePage(1)
33-
expect(wrapper.emitted('page-change')[0][0].getMonth()).toEqual(2)
32+
wrapper.vm.changePage({ incrementBy: 1, focusRefs: ['next'] })
33+
expect(wrapper.emitted('page-change')[0][0].pageDate.getMonth()).toEqual(2)
3434
})
3535

3636
it('can set the previous month', () => {
37-
wrapper.vm.changePage(-1)
38-
expect(wrapper.emitted('page-change')[0][0].getMonth()).toEqual(0)
37+
wrapper.vm.changePage({ incrementBy: -1, focusRefs: ['prev'] })
38+
expect(wrapper.emitted('page-change')[0][0].pageDate.getMonth()).toEqual(0)
3939
})
4040

4141
it('emits an event when selected', () => {

test/unit/specs/PickerMonth/pickerMonth.spec.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,18 @@ describe('PickerMonth', () => {
3838
expect(wrapper.vm.isSelectedMonth(new Date(2017, 1, 1))).toEqual(false)
3939
})
4040

41-
it('can set the next year', async () => {
42-
wrapper.vm.changePage(1)
43-
expect(wrapper.emitted('page-change')[0][0].getFullYear()).toEqual(2019)
41+
it('can set the next year', () => {
42+
wrapper.vm.changePage({ incrementBy: 1, focusRefs: ['next'] })
43+
expect(wrapper.emitted('page-change')[0][0].pageDate.getFullYear()).toEqual(
44+
2019,
45+
)
4446
})
4547

46-
it('can set the previous year', async () => {
47-
wrapper.vm.changePage(-1)
48-
expect(wrapper.emitted('page-change')[0][0].getFullYear()).toEqual(2017)
48+
it('can set the previous year', () => {
49+
wrapper.vm.changePage({ incrementBy: -1, focusRefs: ['prev'] })
50+
expect(wrapper.emitted('page-change')[0][0].pageDate.getFullYear()).toEqual(
51+
2017,
52+
)
4953
})
5054

5155
it('emits date on selection', () => {

test/unit/specs/PickerYear/disabledYears.spec.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ describe('PickerYear', () => {
2525
})
2626

2727
it("can't navigate to a disabled year", () => {
28-
wrapper.vm.changePage(-1)
28+
wrapper.vm.changePage({ incrementBy: -1, focusRefs: ['prev'] })
2929
expect(wrapper.emitted('changed-decade')).toBeFalsy()
3030

31-
wrapper.vm.changePage(1)
31+
wrapper.vm.changePage({ incrementBy: 1, focusRefs: ['next'] })
3232
expect(wrapper.emitted('changed-decade')).toBeFalsy()
3333
})
3434

test/unit/specs/PickerYear/pickerYear.spec.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,17 @@ describe('PickerYear', () => {
4343
})
4444

4545
it('can set the next decade', () => {
46-
wrapper.vm.changePage(1)
47-
expect(wrapper.emitted('page-change')[0][0].getFullYear()).toEqual(2028)
46+
wrapper.vm.changePage({ incrementBy: 1, focusRefs: ['next'] })
47+
expect(wrapper.emitted('page-change')[0][0].pageDate.getFullYear()).toEqual(
48+
2028,
49+
)
4850
})
4951

5052
it('can set the previous decade', () => {
51-
wrapper.vm.changePage(-1)
52-
expect(wrapper.emitted('page-change')[0][0].getFullYear()).toEqual(2008)
53+
wrapper.vm.changePage({ incrementBy: -1, focusRefs: ['prev'] })
54+
expect(wrapper.emitted('page-change')[0][0].pageDate.getFullYear()).toEqual(
55+
2008,
56+
)
5357
})
5458

5559
it('formats the decade range', async () => {

test/unit/specs/pickerMixin.spec.js

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,4 @@ describe('pickerMixin', () => {
3636
it('mounts', () => {
3737
expect(wrapper.vm).toBeTruthy()
3838
})
39-
40-
it('uses `isNextDisabled` correctly', () => {
41-
expect(wrapper.vm.isNextDisabled).toBeFalsy()
42-
})
43-
44-
it('uses `isPreviousDisabled` correctly', () => {
45-
expect(wrapper.vm.isPreviousDisabled).toBeFalsy()
46-
})
4739
})

0 commit comments

Comments
 (0)