-
-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #971 from sagalbot/fix-956-event-delegation
WIP Event delegation for #956
- Loading branch information
Showing
8 changed files
with
247 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
<template> | ||
<v-select | ||
taggable | ||
multiple | ||
no-drop | ||
:map-keydown="handlers" | ||
placeholder="enter an email" | ||
/> | ||
</template> | ||
|
||
<script> | ||
export default { | ||
name: 'CustomHandlers', | ||
methods: { | ||
handlers: (map, vm) => ({ | ||
...map, 50: e => { | ||
e.preventDefault(); | ||
if( e.key === '@' && vm.search.length > 0 ) { | ||
vm.search = `${vm.search}@gmail.com`; | ||
} | ||
}, | ||
}), | ||
}, | ||
}; | ||
</script> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
<template> | ||
<!-- tag on 188/comma & 13/return --> | ||
<v-select no-drop taggable multiple :select-on-key-codes="[188, 13]" /> | ||
</template> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
### Customizing Keydown Behaviour | ||
--- | ||
|
||
## selectOnKeyCodes <Badge text="v3.3.0+" /> | ||
|
||
`selectOnKeyCodes {Array}` is an array of keyCodes that will trigger a typeAheadSelect. Any keyCodes | ||
in this array will prevent the default event action and trigger a typeahead select. By default, | ||
it's just `[13]` for return. For example, maybe you want to tag on a comma keystroke: | ||
|
||
<TagOnComma /> | ||
|
||
<<< @/.vuepress/components/TagOnComma.vue | ||
|
||
## mapKeyDown <Badge text="v3.3.0+" /> | ||
|
||
Vue Select provides the `map-keydown` Function prop to allow for customizing the components response to | ||
keydown events while the search input has focus. | ||
|
||
```js | ||
/** | ||
* @param map {Object} Mapped keyCode to handlers { <keyCode>:<callback> } | ||
* @param vm {VueSelect} | ||
* @return {Object} | ||
*/ | ||
(map, vm) => map, | ||
``` | ||
|
||
By default, the prop is a no–op returning the same object `map` object it receives. This object | ||
maps keyCodes to handlers: `{ <keyCode>: <callback> }`. Modifying this object can override default | ||
functionality, or add handlers for different keys that the component doesn't normally listen for. | ||
|
||
Note that any keyCodes you've added to `selectOnKeyCodes` will be passed to `map-keydown` as well, | ||
so `map-keydown` will always take precedence. | ||
|
||
**Default Handlers** | ||
|
||
```js | ||
// delete | ||
8: e => this.maybeDeleteValue() | ||
|
||
// tab | ||
9: e => this.onTab() | ||
|
||
// enter | ||
13: e => { | ||
e.preventDefault(); | ||
return this.typeAheadSelect(); | ||
} | ||
|
||
// esc | ||
27: e => this.onEscape() | ||
|
||
// up | ||
38: e => { | ||
e.preventDefault(); | ||
return this.typeAheadUp(); | ||
} | ||
|
||
// down | ||
40: e => { | ||
e.preventDefault(); | ||
return this.typeAheadDown(); | ||
} | ||
``` | ||
|
||
### Example: Autocomplete Email Addresses | ||
|
||
This is example listens for the `@` key, and autocompletes an email address with `@gmail.com`. | ||
|
||
<CustomHandlers /> | ||
|
||
<<< @/.vuepress/components/CustomHandlers.vue | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
import { mountDefault } from '../helpers'; | ||
|
||
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}), | ||
}); | ||
|
||
Select.find({ref: 'search'}).trigger('keydown.space'); | ||
|
||
expect(onKeyDown.mock.calls.length).toBe(1); | ||
}); | ||
|
||
it('selectOnKeyCodes should trigger a selection for custom keycodes', () => { | ||
const Select = mountDefault({ | ||
selectOnKeyCodes: [32], | ||
}); | ||
|
||
const spy = jest.spyOn(Select.vm, 'typeAheadSelect'); | ||
|
||
Select.find({ref: 'search'}).trigger('keydown.space'); | ||
|
||
expect(spy).toHaveBeenCalledTimes(1); | ||
}); | ||
|
||
it('even works when combining selectOnKeyCodes with map-keydown', () => { | ||
const onKeyDown = jest.fn(); | ||
const Select = mountDefault({ | ||
mapKeydown: (defaults, vm) => ({...defaults, 32: onKeyDown}), | ||
selectOnKeyCodes: [9], | ||
}); | ||
|
||
const spy = jest.spyOn(Select.vm, 'typeAheadSelect'); | ||
|
||
Select.find({ref: 'search'}).trigger('keydown.space'); | ||
expect(onKeyDown.mock.calls.length).toBe(1); | ||
|
||
Select.find({ref: 'search'}).trigger('keydown.tab'); | ||
expect(spy).toHaveBeenCalledTimes(1); | ||
}); | ||
|
||
describe('CompositionEvent support', () => { | ||
|
||
it('will not select a value with enter if the user is composing', () => { | ||
const Select = mountDefault(); | ||
const spy = jest.spyOn(Select.vm, 'typeAheadSelect'); | ||
|
||
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'); | ||
expect(spy).toHaveBeenCalledTimes(1); | ||
}); | ||
|
||
it('will not select a value with tab if the user is composing', () => { | ||
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'); | ||
expect(spy).toHaveBeenCalledTimes(0); | ||
|
||
Select.find({ref: 'search'}).trigger('compositionend'); | ||
Select.find({ref: 'search'}).trigger('keydown.tab'); | ||
expect(spy).toHaveBeenCalledTimes(1); | ||
}); | ||
|
||
}); | ||
|
||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters