From eedda74d4384a93fb4192d00e7198779d964db2a Mon Sep 17 00:00:00 2001 From: andreas Date: Mon, 16 Mar 2020 04:17:25 +0200 Subject: [PATCH] fix: emit input event only if there is val to be deleted (#1038) --- src/components/Select.vue | 4 ++-- tests/unit/Keydown.spec.js | 40 ++++++++++++++++++++++++-------------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/components/Select.vue b/src/components/Select.vue index 4f4c623..d3acfa8 100644 --- a/src/components/Select.vue +++ b/src/components/Select.vue @@ -819,7 +819,7 @@ * @return {this.value} */ maybeDeleteValue() { - if (!this.searchEl.value.length && this.selectedValue && this.clearable) { + if (!this.searchEl.value.length && this.selectedValue && this.selectedValue.length && this.clearable) { let value = null; if (this.multiple) { value = [...this.selectedValue.slice(0, this.selectedValue.length - 1)] @@ -939,7 +939,7 @@ }; const defaults = { - // delete + // backspace 8: e => this.maybeDeleteValue(), // tab 9: e => this.onTab(), diff --git a/tests/unit/Keydown.spec.js b/tests/unit/Keydown.spec.js index 4721719..09f53fa 100644 --- a/tests/unit/Keydown.spec.js +++ b/tests/unit/Keydown.spec.js @@ -5,10 +5,10 @@ describe('Custom Keydown Handlers', () => { it('can use the map-keydown prop to trigger custom behaviour', () => { const onKeyDown = jest.fn(); const Select = mountDefault({ - mapKeydown: (defaults, vm) => ({...defaults, 32: onKeyDown}), + mapKeydown: (defaults, vm) => ({ ...defaults, 32: onKeyDown }), }); - Select.find({ref: 'search'}).trigger('keydown.space'); + Select.find({ ref: 'search' }).trigger('keydown.space'); expect(onKeyDown.mock.calls.length).toBe(1); }); @@ -20,7 +20,7 @@ describe('Custom Keydown Handlers', () => { const spy = jest.spyOn(Select.vm, 'typeAheadSelect'); - Select.find({ref: 'search'}).trigger('keydown.space'); + Select.find({ ref: 'search' }).trigger('keydown.space'); expect(spy).toHaveBeenCalledTimes(1); }); @@ -28,16 +28,16 @@ describe('Custom Keydown Handlers', () => { it('even works when combining selectOnKeyCodes with map-keydown', () => { const onKeyDown = jest.fn(); const Select = mountDefault({ - mapKeydown: (defaults, vm) => ({...defaults, 32: onKeyDown}), + mapKeydown: (defaults, vm) => ({ ...defaults, 32: onKeyDown }), selectOnKeyCodes: [9], }); const spy = jest.spyOn(Select.vm, 'typeAheadSelect'); - Select.find({ref: 'search'}).trigger('keydown.space'); + Select.find({ ref: 'search' }).trigger('keydown.space'); expect(onKeyDown.mock.calls.length).toBe(1); - Select.find({ref: 'search'}).trigger('keydown.tab'); + Select.find({ ref: 'search' }).trigger('keydown.tab'); expect(spy).toHaveBeenCalledTimes(1); }); @@ -47,28 +47,38 @@ describe('Custom Keydown Handlers', () => { const Select = mountDefault(); const spy = jest.spyOn(Select.vm, 'typeAheadSelect'); - Select.find({ref: 'search'}).trigger('compositionstart'); - Select.find({ref: 'search'}).trigger('keydown.enter'); + Select.find({ ref: 'search' }).trigger('compositionstart'); + Select.find({ ref: 'search' }).trigger('keydown.enter'); expect(spy).toHaveBeenCalledTimes(0); - Select.find({ref: 'search'}).trigger('compositionend'); - Select.find({ref: 'search'}).trigger('keydown.enter'); + Select.find({ ref: 'search' }).trigger('compositionend'); + Select.find({ ref: 'search' }).trigger('keydown.enter'); expect(spy).toHaveBeenCalledTimes(1); }); it('will not select a value with tab if the user is composing', () => { - const Select = mountDefault({selectOnTab: true}); + const Select = mountDefault({ selectOnTab: true }); const spy = jest.spyOn(Select.vm, 'typeAheadSelect'); - Select.find({ref: 'search'}).trigger('compositionstart'); - Select.find({ref: 'search'}).trigger('keydown.tab'); + Select.find({ ref: 'search' }).trigger('compositionstart'); + Select.find({ ref: 'search' }).trigger('keydown.tab'); expect(spy).toHaveBeenCalledTimes(0); - Select.find({ref: 'search'}).trigger('compositionend'); - Select.find({ref: 'search'}).trigger('keydown.tab'); + Select.find({ ref: 'search' }).trigger('compositionend'); + Select.find({ ref: 'search' }).trigger('keydown.tab'); expect(spy).toHaveBeenCalledTimes(1); }); + it('will not emit input event if value has not changed with backspace', () => { + const Select = mountDefault(); + Select.vm.$data._value = 'one'; + Select.find({ ref: 'search' }).trigger('keydown.backspace'); + expect(Select.emitted().input.length).toBe(1); + + Select.find({ ref: 'search' }).trigger('keydown.backspace'); + Select.find({ ref: 'search' }).trigger('keydown.backspace'); + expect(Select.emitted().input.length).toBe(1); + }); }); });