Skip to content

Commit 43be0f6

Browse files
authored
feat(ui5-combobox): introduces selection-change event (#2090)
1 parent 942b690 commit 43be0f6

File tree

3 files changed

+65
-1
lines changed

3 files changed

+65
-1
lines changed

packages/main/src/ComboBox.js

+41-1
Original file line numberDiff line numberDiff line change
@@ -297,6 +297,19 @@ const metadata = {
297297
* @public
298298
*/
299299
input: {},
300+
301+
/**
302+
* Fired when selection is changed by user interaction
303+
*
304+
* @event sap.ui.webcomponents.main.Combobox#selection-change
305+
* @param {HTMLElement} item item to be selected.
306+
* @public
307+
*/
308+
"selection-change": {
309+
detail: {
310+
item: { type: HTMLElement },
311+
},
312+
},
300313
},
301314
};
302315

@@ -371,6 +384,7 @@ class ComboBox extends UI5Element {
371384
this._initialRendering = true;
372385
this._itemFocused = false;
373386
this._tempFilterValue = "";
387+
this._selectionChanged = false;
374388
this.i18nBundle = getI18nBundle("@ui5/webcomponents");
375389
}
376390

@@ -385,7 +399,15 @@ class ComboBox extends UI5Element {
385399
}
386400

387401
if (this._autocomplete && domValue !== "") {
388-
this._autoCompleteValue(domValue);
402+
const item = this._autoCompleteValue(domValue);
403+
404+
if (!this._selectionChanged && (item && !item.selected)) {
405+
this.fireEvent("selection-change", {
406+
item,
407+
});
408+
409+
this._selectionChanged = false;
410+
}
389411
} else {
390412
this._tempValue = domValue;
391413
}
@@ -570,6 +592,12 @@ class ComboBox extends UI5Element {
570592
this._isKeyNavigation = true;
571593
this._itemFocused = true;
572594
this.fireEvent("input");
595+
596+
this.fireEvent("selection-change", {
597+
item: this._filteredItems[indexOfItem],
598+
});
599+
600+
this._selectionChanged = true;
573601
}
574602

575603
_keydown(event) {
@@ -629,6 +657,10 @@ class ComboBox extends UI5Element {
629657
this.inner.setSelectionRange(0, this._tempValue.length);
630658
}, 0);
631659
}
660+
661+
if (matchingItems.length) {
662+
return matchingItems[0];
663+
}
632664
}
633665

634666
_selectMatchingItem() {
@@ -659,6 +691,14 @@ class ComboBox extends UI5Element {
659691
this._tempValue = listItem.mappedItem.text;
660692
this.filterValue = this._tempValue;
661693

694+
if (!listItem.mappedItem.selected) {
695+
this.fireEvent("selection-change", {
696+
item: listItem.mappedItem,
697+
});
698+
699+
this._selectionChanged = true;
700+
}
701+
662702
this._filteredItems.map(item => {
663703
item.selected = (item === listItem.mappedItem);
664704

packages/main/test/pages/ComboBox.html

+7
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,9 @@
9797

9898
<div class="demo-section">
9999
<span id="change-event-result"></span>
100+
<br />
101+
<span id="selection-change-event-result"></span>
102+
100103
</div>
101104

102105
<div class="demo-section">
@@ -209,6 +212,10 @@ <h3>ComboBox in Compact</h3>
209212
document.getElementById("change-event-result").innerHTML = event.target.value;
210213
});
211214

215+
document.getElementById("combo").addEventListener("ui5-selection-change", function(event) {
216+
document.getElementById("selection-change-event-result").innerHTML = event.detail.item.text;
217+
});
218+
212219
document.getElementById("change-cb").addEventListener("ui5-change", function(event) {
213220
document.getElementById("change-placeholder").innerHTML = event.target.value;
214221
document.getElementById("change-count").innerHTML = parseInt(document.getElementById("change-count").innerHTML) + 1;

packages/main/test/specs/ComboBox.spec.js

+17
Original file line numberDiff line numberDiff line change
@@ -272,4 +272,21 @@ describe("General interaction", () => {
272272
listItems = popover.$("ui5-list").$$("ui5-li");
273273
assert.notOk(popover.opened, "Popover should be closed when no match");
274274
});
275+
276+
it ("Tests selection-change event and its parameters", () => {
277+
const combo = $("#combo");
278+
const label = $("#selection-change-event-result");
279+
const arrow = combo.shadow$("[input-icon]");
280+
const staticAreaItemClassName = browser.getStaticAreaItemClassName("#combo");
281+
const popover = browser.$(`.${staticAreaItemClassName}`).shadow$("ui5-responsive-popover");
282+
let listItems = popover.$("ui5-list").$$("ui5-li");
283+
284+
arrow.click();
285+
286+
const listItem = listItems[8];
287+
288+
listItem.click();
289+
290+
assert.strictEqual(label.getText(), listItem.shadow$(".ui5-li-title").getText(), "event is fired correctly");
291+
});
275292
});

0 commit comments

Comments
 (0)