Skip to content

Commit b12a30b

Browse files
authored
fix(ui5-select): enable home/end keys (#3372)
Now, Home and End keyboard keys are enabled.
1 parent b2b6c56 commit b12a30b

File tree

1 file changed

+39
-23
lines changed

1 file changed

+39
-23
lines changed

packages/main/src/Select.js

+39-23
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import {
66
isDown,
77
isEnter,
88
isEscape,
9+
isHome,
10+
isEnd,
911
isShow,
1012
isTabNext,
1113
isTabPrevious,
@@ -443,21 +445,31 @@ class Select extends UI5Element {
443445
if (isShow(event)) {
444446
event.preventDefault();
445447
this._toggleRespPopover();
446-
}
447-
448-
if (isSpace(event)) {
448+
} else if (isSpace(event)) {
449449
event.preventDefault();
450-
}
451-
452-
if (isEscape(event) && this._isPickerOpen) {
450+
} else if (isEscape(event) && this._isPickerOpen) {
453451
this._escapePressed = true;
454-
}
455-
456-
if (isEnter(event)) {
452+
} else if (isHome(event)) {
453+
this._handleHomeKey(event);
454+
} else if (isEnd(event)) {
455+
this._handleEndKey(event);
456+
} else if (isEnter(event)) {
457457
this._handleSelectionChange();
458+
} else {
459+
this._handleArrowNavigation(event);
458460
}
461+
}
462+
463+
_handleHomeKey(event) {
464+
event.preventDefault();
465+
this._changeSelectedItem(this._selectedIndex, 0);
466+
}
467+
468+
_handleEndKey(event) {
469+
const lastIndex = this.options.length - 1;
459470

460-
this._handleArrowNavigation(event, true);
471+
event.preventDefault();
472+
this._changeSelectedItem(this._selectedIndex, lastIndex);
461473
}
462474

463475
_onkeyup(event) {
@@ -511,7 +523,7 @@ class Select extends UI5Element {
511523
this._toggleRespPopover();
512524
}
513525

514-
_handleArrowNavigation(event, shouldFireEvent) {
526+
_handleArrowNavigation(event) {
515527
let nextIndex = -1;
516528
const currentIndex = this._selectedIndex;
517529
const isDownKey = isDown(event);
@@ -525,25 +537,29 @@ class Select extends UI5Element {
525537
nextIndex = this._getPreviousOptionIndex();
526538
}
527539

528-
this.options[this._selectedIndex].selected = false;
529-
this.options[this._selectedIndex]._focused = false;
530-
531-
this.options[nextIndex].selected = true;
532-
this.options[nextIndex]._focused = true;
533-
534-
this._selectedIndex = nextIndex === -1 ? this._selectedIndex : nextIndex;
540+
this._changeSelectedItem(this._selectedIndex, nextIndex);
535541

536542
if (currentIndex !== this._selectedIndex) {
537543
// Announce new item even if picker is opened.
538544
// The aria-activedescendents attribute can't be used,
539545
// because listitem elements are in different shadow dom
540546
this.itemSelectionAnnounce();
541547
}
548+
}
549+
}
542550

543-
if (shouldFireEvent && !this._isPickerOpen) {
544-
// arrow pressed on closed picker - do selection change
545-
this._fireChangeEvent(this.options[nextIndex]);
546-
}
551+
_changeSelectedItem(oldIndex, newIndex) {
552+
this.options[oldIndex].selected = false;
553+
this.options[oldIndex]._focused = false;
554+
555+
this.options[newIndex].selected = true;
556+
this.options[newIndex]._focused = true;
557+
558+
this._selectedIndex = newIndex;
559+
560+
if (!this._isPickerOpen) {
561+
// arrow pressed on closed picker - do selection change
562+
this._fireChangeEvent(this.options[newIndex]);
547563
}
548564
}
549565

@@ -710,7 +726,7 @@ class Select extends UI5Element {
710726
}
711727

712728
get selectedOptionIcon() {
713-
return this.selectedOption.icon;
729+
return this.selectedOption && this.selectedOption.icon;
714730
}
715731

716732
async _getPopover() {

0 commit comments

Comments
 (0)