Skip to content

Commit 43f6013

Browse files
authored
Merge pull request #982 from patternfly/issue-981-pfe-autocomplete-option-selected-event
fix: fire pfe-autcomplete:option-selected event on click and enter key
2 parents fbbc35c + e5c6f4b commit 43f6013

File tree

5 files changed

+75
-20
lines changed

5 files changed

+75
-20
lines changed

CHANGELOG-prerelease.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
## Prerelease 52 ( TBD )
22

3+
- [](https://github.com/patternfly/patternfly-elements/commit/) fix: fire pfe-autcomplete:option-selected event on click and enter key
34
- [](https://github.com/patternfly/patternfly-elements/commit/) feat: Add support for empty local variables
45

56
## Prerelease 51 ( 2020-07-16 )

elements/pfe-autocomplete/README.md

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,20 +83,31 @@ This is an optional attribute string that you can provide on the input tag in th
8383
</pfe-autocomplete>
8484
```
8585

86-
## Get selected item
87-
User can select an item by clicking on search button, type press enter or select an item by using keyboard and press enter. The selected item can be captured by listening to an event(`pfe-search-event`) or observing attribute(`selected-value`) change.
86+
**`selected-value`**
87+
By observing `selected-value` attribute you can detect autocomplete selected value.
88+
89+
## Events
8890

89-
### pfe-search-event
90-
When user performs search, `pfe-search-event` event is fired. By listening to this event you can get selected phrase by getting `e.detail.searchValue`.
91+
### pfe-autocomplete:search-event
92+
Fires when a user performs search. By listening to this event you can get selected phrase by getting `e.detail.searchValue`.
9193

9294
```
93-
searchAutocomplete.addEventListener('pfe-search-event', function(e) {
94-
console.log('do search= ' + e.detail.searchValue);
95-
});
95+
detail: {
96+
searchValue: String
97+
}
9698
```
9799

98-
### selected-value attribute
99-
By observing `selected-value` attribute you can detect autocomplete selected value.
100+
### pfe-autocomplete:option-selected
101+
Fires when a user selects an option from the dropdown list.
102+
103+
```
104+
detail: {
105+
optionValue: String
106+
}
107+
```
108+
109+
## Get selected item
110+
User can select an item by clicking on search button, type press enter or select an item by using keyboard and press enter. The selected item can be captured by listening to an event(`pfe-autocomplete:search-event`) or observing attribute(`selected-value`) change.
100111

101112
## Dependencies
102113

elements/pfe-autocomplete/demo/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ <h2 class="pfe-headline-2">Disabled</h2>
8282
}));
8383
};
8484

85-
staticAutocomplete.addEventListener('pfe-search-event', function(e) {
85+
staticAutocomplete.addEventListener('pfe-autocomplete:search-event', function(e) {
8686
document.querySelector("#staticSelectedValue").textContent = e.detail.searchValue;
8787
});
8888

@@ -118,7 +118,7 @@ <h2 class="pfe-headline-2">Disabled</h2>
118118

119119
// when user performs search, this event is fired
120120
// search phrase is passed to e.detail.searchValue
121-
searchAutocomplete.addEventListener('pfe-search-event', function(e) {
121+
searchAutocomplete.addEventListener('pfe-autocomplete:search-event', function(e) {
122122
document.querySelector("#ajaxSelectedValue").textContent = e.detail.searchValue;
123123
});
124124
</script>

elements/pfe-autocomplete/src/pfe-autocomplete.js

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ class PfeAutocomplete extends PFElement {
2929

3030
static get events() {
3131
return {
32-
search: `pfe-search-event`,
33-
select: `pfe-option-selected`,
32+
search: `${this.tag}:search-event`,
33+
select: `${this.tag}:option-selected`,
3434
slotchange: `slotchange`
3535
};
3636
}
@@ -41,7 +41,10 @@ class PfeAutocomplete extends PFElement {
4141
this._slotchangeHandler = this._slotchangeHandler.bind(this);
4242

4343
this._slot = this.shadowRoot.querySelector("slot");
44-
this._slot.addEventListener("slotchange", this._slotchangeHandler);
44+
this._slot.addEventListener(
45+
PfeAutocomplete.events.slotchange,
46+
this._slotchangeHandler
47+
);
4548
}
4649

4750
connectedCallback() {
@@ -391,6 +394,12 @@ class PfeAutocomplete extends PFElement {
391394

392395
this._input.value = this._activeOption(activeIndex);
393396
} else if (key === KEYCODE.ENTER) {
397+
if (this._activeOption(activeIndex)) {
398+
this.emitEvent(PfeAutocomplete.events.select, {
399+
detail: { optionValue: this._activeOption(activeIndex) }
400+
});
401+
}
402+
394403
let selectedValue = this._input.value;
395404
this._doSearch(selectedValue);
396405
return;
@@ -417,8 +426,8 @@ class PfeAutocomplete extends PFElement {
417426
* reflow | Re-renders the dropdown
418427
419428
* - Events ----------------------------------------
420-
* pfe-option-selected | Fires when an option is selected.
421-
event.detailes.selectedValue contains the selected value.
429+
* pfe-autocomplete:option-selected | Fires when an option is selected.
430+
event.details.optionValue contains the selected value.
422431
*/
423432
class PfeSearchDroplist extends PFElement {
424433
static get tag() {

elements/pfe-autocomplete/test/pfe-autocomplete_test.html

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,12 +109,12 @@
109109
});
110110
});
111111

112-
it('should fire pfe-search-event after click on search icon', (done) => {
112+
it('should fire pfe-autocomplete:search-event after click on search icon', (done) => {
113113
flush(() => {
114114
const input = autocompleteElem._input;
115115
input.value = "test";
116116

117-
autocompleteElem.addEventListener("pfe-search-event", function(event) {
117+
autocompleteElem.addEventListener("pfe-autocomplete:search-event", function(event) {
118118
assert.equal(event.detail.searchValue, "test");
119119
done();
120120
});
@@ -133,14 +133,14 @@
133133
});
134134
});
135135

136-
it('should fire pfe-search-event after user click on an option', done => {
136+
it('should fire pfe-autocomplete:search-event after user click on an option', done => {
137137
flush(() => {
138138
droplistElem.data = ['option 1', 'option 2'];
139139
droplistElem.reflow = true;
140140
droplistElem.open = true;
141141
let option = droplistElem.shadowRoot.querySelector('li:nth-child(2)');
142142

143-
autocompleteElem.addEventListener("pfe-search-event", function(event) {
143+
autocompleteElem.addEventListener("pfe-autocomplete:search-event", function(event) {
144144
assert.equal(event.detail.searchValue, "option 2");
145145
done();
146146
});
@@ -149,6 +149,40 @@
149149
});
150150
});
151151

152+
it('should fire a pfe-autocomplete:option-selected event when a user selects an option in the droplist with the enter key', done => {
153+
flush(() => {
154+
const input = autocompleteElem._input;
155+
droplistElem.data = ['option 1', 'option 2'];
156+
droplistElem.reflow = true;
157+
droplistElem.open = true;
158+
input.focus();
159+
160+
autocompleteElem.addEventListener("pfe-autocomplete:option-selected", function(event) {
161+
assert.equal(event.detail.optionValue, "option 1");
162+
done();
163+
});
164+
165+
MockInteractions.keyUpOn(input, 40);
166+
MockInteractions.keyUpOn(input, 13);
167+
});
168+
});
169+
170+
it('should fire a pfe-autocomplete:option-selected event when a user selects an option in the droplist with the mouse', done => {
171+
flush(() => {
172+
droplistElem.data = ['option 1', 'option 2'];
173+
droplistElem.reflow = true;
174+
droplistElem.open = true;
175+
let option = droplistElem.shadowRoot.querySelector('li:nth-child(2)');
176+
177+
autocompleteElem.addEventListener("pfe-autocomplete:option-selected", function(event) {
178+
assert.equal(event.detail.optionValue, "option 2");
179+
done();
180+
});
181+
182+
MockInteractions.tap(option);
183+
});
184+
});
185+
152186
it('should set selected-value attribute after user click on an option', done => {
153187
flush(() => {
154188
droplistElem.data = ['option 1', 'option 2'];

0 commit comments

Comments
 (0)