@@ -984,10 +984,29 @@ class TabContainer extends UI5Element {
984984
985985 const itemsDomRefs = this . items . map ( item => item . getDomRefInStrip ( ) ) as Array < TabInStrip | TabSeparatorInStrip > ;
986986
987+ let allVisibleItemsWidth = 0 ;
988+
989+ const selectedTab = this . _getRootTab ( this . _selectedTab ) ;
990+ const containerWidth = this . _getTabStrip ( ) . offsetWidth ;
991+ const selectedTabDomRef = selectedTab ?. getDomRefInStrip ( ) as TabInStrip | undefined ;
992+ const visibleItemsDomRefs = itemsDomRefs . filter ( item => ! item . hidden ) ;
993+
994+ visibleItemsDomRefs . forEach ( item => {
995+ allVisibleItemsWidth += this . _getItemWidth ( item ) ;
996+ } ) ;
997+
998+ const changeTabPosition = visibleItemsDomRefs . length !== itemsDomRefs . length && this . isModeStartAndEnd && selectedTabDomRef && visibleItemsDomRefs . indexOf ( selectedTabDomRef ) !== - 1 && allVisibleItemsWidth < containerWidth && this . _getItemWidth ( selectedTabDomRef ) < containerWidth ;
999+
9871000 // make sure the overflows are hidden
9881001 this . _getStartOverflow ( ) . setAttribute ( "hidden" , "" ) ;
9891002 this . _getEndOverflow ( ) . setAttribute ( "hidden" , "" ) ;
9901003
1004+ let firstVisibleIndex ;
1005+
1006+ if ( changeTabPosition ) {
1007+ firstVisibleIndex = itemsDomRefs . indexOf ( visibleItemsDomRefs [ 0 ] ) ;
1008+ }
1009+
9911010 // show all tabs
9921011 for ( let i = 0 ; i < itemsDomRefs . length ; i ++ ) {
9931012 itemsDomRefs [ i ] . removeAttribute ( "hidden" ) ;
@@ -1005,7 +1024,7 @@ class TabContainer extends UI5Element {
10051024 }
10061025
10071026 if ( this . isModeStartAndEnd ) {
1008- this . _updateStartAndEndOverflow ( itemsDomRefs ) ;
1027+ this . _updateStartAndEndOverflow ( itemsDomRefs , firstVisibleIndex ) ;
10091028 this . _updateOverflowCounters ( ) ;
10101029 } else {
10111030 this . _updateEndOverflow ( itemsDomRefs ) ;
@@ -1042,14 +1061,13 @@ class TabContainer extends UI5Element {
10421061 this . _endOverflowText = this . overflowButtonText ;
10431062 }
10441063
1045- _updateStartAndEndOverflow ( itemsDomRefs : Array < TabInStrip | TabSeparatorInStrip > ) {
1064+ _updateStartAndEndOverflow ( itemsDomRefs : Array < TabInStrip | TabSeparatorInStrip > , firstVisibleIndex ?: number ) {
10461065 let containerWidth = this . _getTabStrip ( ) . offsetWidth ;
10471066 const selectedTab = this . _getRootTab ( this . _selectedTab ) ;
10481067 const selectedTabDomRef = selectedTab ?. getDomRefInStrip ( ) as TabInStrip | undefined ;
10491068 const selectedItemIndexAndWidth = this . _getSelectedItemIndexAndWidth ( itemsDomRefs , selectedTabDomRef ) ;
10501069 const hasStartOverflow = this . _hasStartOverflow ( containerWidth , itemsDomRefs , selectedItemIndexAndWidth ) ;
10511070 const hasEndOverflow = this . _hasEndOverflow ( containerWidth , itemsDomRefs , selectedItemIndexAndWidth ) ;
1052- let firstVisible ;
10531071 let lastVisible ;
10541072
10551073 // has "end", but no "start" overflow
@@ -1076,9 +1094,11 @@ class TabContainer extends UI5Element {
10761094 // width is changed
10771095 containerWidth = this . _getTabStrip ( ) . offsetWidth ;
10781096
1079- firstVisible = this . _findFirstVisibleItem ( itemsDomRefs , containerWidth , selectedItemIndexAndWidth . width ) ;
1097+ if ( ! firstVisibleIndex ) {
1098+ firstVisibleIndex = this . _findFirstVisibleItem ( itemsDomRefs , containerWidth , selectedItemIndexAndWidth . width ) ;
1099+ }
10801100
1081- for ( let i = firstVisible - 1 ; i >= 0 ; i -- ) {
1101+ for ( let i = firstVisibleIndex - 1 ; i >= 0 ; i -- ) {
10821102 itemsDomRefs [ i ] . setAttribute ( "hidden" , "" ) ;
10831103 itemsDomRefs [ i ] . setAttribute ( "start-overflow" , "" ) ;
10841104 }
@@ -1093,10 +1113,12 @@ class TabContainer extends UI5Element {
10931113 // width is changed
10941114 containerWidth = this . _getTabStrip ( ) . offsetWidth ;
10951115
1096- firstVisible = this . _findFirstVisibleItem ( itemsDomRefs , containerWidth , selectedItemIndexAndWidth . width , selectedItemIndexAndWidth . index - 1 ) ;
1097- lastVisible = this . _findLastVisibleItem ( itemsDomRefs , containerWidth , selectedItemIndexAndWidth . width , firstVisible ) ;
1116+ if ( ! firstVisibleIndex ) {
1117+ firstVisibleIndex = this . _findFirstVisibleItem ( itemsDomRefs , containerWidth , selectedItemIndexAndWidth . width , selectedItemIndexAndWidth . index - 1 ) ;
1118+ }
1119+ lastVisible = this . _findLastVisibleItem ( itemsDomRefs , containerWidth , selectedItemIndexAndWidth . width , firstVisibleIndex ) ;
10981120
1099- for ( let i = firstVisible - 1 ; i >= 0 ; i -- ) {
1121+ for ( let i = firstVisibleIndex - 1 ; i >= 0 ; i -- ) {
11001122 itemsDomRefs [ i ] . setAttribute ( "hidden" , "" ) ;
11011123 itemsDomRefs [ i ] . setAttribute ( "start-overflow" , "" ) ;
11021124 }
@@ -1108,6 +1130,10 @@ class TabContainer extends UI5Element {
11081130 }
11091131
11101132 _hasStartOverflow ( containerWidth : number , itemsDomRefs : Array < TabInStrip | TabSeparatorInStrip > , selectedItemIndexAndWidth : { width : number ; index : number } ) {
1133+ if ( this . _getStartOverflow ( ) . textContent !== "+0" ) {
1134+ return true ;
1135+ }
1136+
11111137 if ( selectedItemIndexAndWidth . index === 0 ) {
11121138 return false ;
11131139 }
0 commit comments