6
6
isDown ,
7
7
isEnter ,
8
8
isEscape ,
9
+ isHome ,
10
+ isEnd ,
9
11
isShow ,
10
12
isTabNext ,
11
13
isTabPrevious ,
@@ -443,21 +445,31 @@ class Select extends UI5Element {
443
445
if ( isShow ( event ) ) {
444
446
event . preventDefault ( ) ;
445
447
this . _toggleRespPopover ( ) ;
446
- }
447
-
448
- if ( isSpace ( event ) ) {
448
+ } else if ( isSpace ( event ) ) {
449
449
event . preventDefault ( ) ;
450
- }
451
-
452
- if ( isEscape ( event ) && this . _isPickerOpen ) {
450
+ } else if ( isEscape ( event ) && this . _isPickerOpen ) {
453
451
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 ) ) {
457
457
this . _handleSelectionChange ( ) ;
458
+ } else {
459
+ this . _handleArrowNavigation ( event ) ;
458
460
}
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 ;
459
470
460
- this . _handleArrowNavigation ( event , true ) ;
471
+ event . preventDefault ( ) ;
472
+ this . _changeSelectedItem ( this . _selectedIndex , lastIndex ) ;
461
473
}
462
474
463
475
_onkeyup ( event ) {
@@ -511,7 +523,7 @@ class Select extends UI5Element {
511
523
this . _toggleRespPopover ( ) ;
512
524
}
513
525
514
- _handleArrowNavigation ( event , shouldFireEvent ) {
526
+ _handleArrowNavigation ( event ) {
515
527
let nextIndex = - 1 ;
516
528
const currentIndex = this . _selectedIndex ;
517
529
const isDownKey = isDown ( event ) ;
@@ -525,25 +537,29 @@ class Select extends UI5Element {
525
537
nextIndex = this . _getPreviousOptionIndex ( ) ;
526
538
}
527
539
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 ) ;
535
541
536
542
if ( currentIndex !== this . _selectedIndex ) {
537
543
// Announce new item even if picker is opened.
538
544
// The aria-activedescendents attribute can't be used,
539
545
// because listitem elements are in different shadow dom
540
546
this . itemSelectionAnnounce ( ) ;
541
547
}
548
+ }
549
+ }
542
550
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 ] ) ;
547
563
}
548
564
}
549
565
@@ -710,7 +726,7 @@ class Select extends UI5Element {
710
726
}
711
727
712
728
get selectedOptionIcon ( ) {
713
- return this . selectedOption . icon ;
729
+ return this . selectedOption && this . selectedOption . icon ;
714
730
}
715
731
716
732
async _getPopover ( ) {
0 commit comments