Skip to content

Commit 0e8712a

Browse files
committed
feat(datepicker): Emit a changed event
1 parent 5aefbfd commit 0e8712a

File tree

3 files changed

+48
-24
lines changed

3 files changed

+48
-24
lines changed

docs/guide/Events/README.md

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,16 @@
22

33
These events are emitted on actions in the datepicker
44

5-
| Event | Output | Description |
6-
|-------------------------------------------------| ---------- | ------------------------------------- |
7-
| changed-month | Object | Month page has been changed |
8-
| changed-year | Object | Year page has been changed |
9-
| changed-decade | Object | Decade page has been changed |
10-
| cleared | | Selected date has been cleared |
11-
| closed | | The picker has been closed |
12-
| input | Date\|null | A date has been selected |
13-
| opened | | The picker has been opened |
14-
| selected <br/>*(deprecated in favour of input)* | Date\|null | A date has been selected |
15-
| blur | | Input blur event |
16-
| focus | | Input focus event |
5+
| Event | Output | Description |
6+
| ----------------------------------------------- | ----------- | --------------------------------- |
7+
| changed | Date\|null | The selected date has been changed |
8+
| changed-month | Object | Month page has been changed |
9+
| changed-year | Object | Year page has been changed |
10+
| changed-decade | Object | Decade page has been changed |
11+
| cleared | | Selected date has been cleared |
12+
| closed | | The picker has been closed |
13+
| input | Date\|null | A date has been selected |
14+
| opened | | The picker has been opened |
15+
| selected <br/>_(deprecated in favour of input)_ | Date\|null | A date has been selected |
16+
| blur | | Input blur event |
17+
| focus | | Input focus event |

src/components/Datepicker.vue

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,17 @@ export default {
462462
this.closeByClickOutside()
463463
}
464464
},
465+
dateChanged(date) {
466+
if (!this.selectedDate && !date) {
467+
return false
468+
}
469+
470+
if (this.selectedDate && date) {
471+
return date.valueOf() !== this.selectedDate.valueOf()
472+
}
473+
474+
return true
475+
},
465476
/**
466477
* Closes the calendar when no element within it has focus
467478
*/
@@ -686,6 +697,10 @@ export default {
686697
* @param {Date|null} date
687698
*/
688699
selectDate(date) {
700+
if (this.dateChanged(date)) {
701+
this.$emit('changed', date)
702+
}
703+
689704
this.setValue(date)
690705
this.$emit('input', date)
691706
this.$emit('selected', date)
@@ -708,19 +723,8 @@ export default {
708723
selectTypedDateOnLosingFocus() {
709724
const parsedDate = this.$refs.dateInput.parseInput()
710725
const date = this.utils.isValidDate(parsedDate) ? parsedDate : null
711-
const hasChanged = () => {
712-
if (!this.selectedDate && !date) {
713-
return false
714-
}
715-
716-
if (this.selectedDate && date) {
717-
return date.valueOf() !== this.selectedDate.valueOf()
718-
}
719-
720-
return true
721-
}
722726
723-
if (hasChanged()) {
727+
if (this.dateChanged(date)) {
724728
this.selectDate(date)
725729
}
726730
},

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,25 @@ describe('Datepicker mounted', () => {
354354
expect(wrapper.emitted('focus')).toBeTruthy()
355355
})
356356

357+
it('emits changed', async () => {
358+
await wrapper.vm.open()
359+
360+
const dayCell = wrapper.findAll('button').at(10)
361+
362+
await dayCell.trigger('click')
363+
expect(wrapper.emitted('changed')).toHaveLength(1)
364+
365+
await wrapper.vm.open()
366+
await dayCell.trigger('click')
367+
expect(wrapper.emitted('changed')).toHaveLength(1)
368+
369+
await wrapper.vm.open()
370+
371+
const differentDayCell = wrapper.findAll('button').at(11)
372+
await differentDayCell.trigger('click')
373+
expect(wrapper.emitted('changed')).toHaveLength(2)
374+
})
375+
357376
it('toggles when the input field is clicked', async () => {
358377
const input = wrapper.find('input')
359378

0 commit comments

Comments
 (0)