diff --git a/packages/main/src/TabContainer.ts b/packages/main/src/TabContainer.ts index 2f36a1dc9b06..fe546ce3cc8a 100644 --- a/packages/main/src/TabContainer.ts +++ b/packages/main/src/TabContainer.ts @@ -475,7 +475,7 @@ class TabContainer extends UI5Element { } } - async _onTabStripClick(e: Event) { + _onTabStripClick(e: Event) { const tab = getTab(e.target as HTMLElement); if (!tab || tab._realTab.disabled) { return; @@ -489,23 +489,43 @@ class TabContainer extends UI5Element { return; } - if (!tab._realTab._hasOwnContent && tab._realTab.tabs.length) { - this._setPopoverItems(tab._realTab.subTabs); - this.responsivePopover = await this._respPopover(); - - if (this.responsivePopover.opened) { - this.responsivePopover.close(); - } else { - this._setPopoverInitialFocus(); - } - - this.responsivePopover.showAt(tab._realTab.getTabInStripDomRef()!); + if (this._isSingleClickTab(tab)) { + this._togglePopover(tab, tab._realTab.subTabs); return; } this._onHeaderItemSelect(tab); } + _isSingleClickTab(tab: Tab) { + return !tab._realTab._hasOwnContent && tab._realTab.tabs.length; + } + + async _togglePopover(opener: HTMLElement, items: Array, setInitialFocus = false) { + this.responsivePopover = await this._respPopover(); + + if (this.responsivePopover.isOpen()) { + this.responsivePopover.close(); + } else { + this._showPopoverAt(opener, items, setInitialFocus); + } + } + + async _showPopoverAt(opener: HTMLElement, items: Array, setInitialFocus = false) { + this._setPopoverItems(items); + this.responsivePopover = await this._respPopover(); + + if (this.responsivePopover.isOpen() && this.responsivePopover._opener !== opener) { + this.responsivePopover.close(); + } + + if (setInitialFocus) { + this._setPopoverInitialFocus(); + } + + this.responsivePopover.showAt(opener); + } + getPopoverOpenerItems(opener?: HTMLElement) { const _opener = opener || this.responsivePopover?._opener; @@ -528,7 +548,7 @@ class TabContainer extends UI5Element { return (_opener as Tab)._realTab.subTabs; } - async _onTabExpandButtonClick(e: Event) { + _onTabExpandButtonClick(e: Event) { e.stopPropagation(); e.preventDefault(); @@ -550,15 +570,7 @@ class TabContainer extends UI5Element { return; } - this._setPopoverItems(tabInstance.subTabs); - this.responsivePopover = await this._respPopover(); - - if (this.responsivePopover.isOpen()) { - this.responsivePopover.close(); - } else { - this._setPopoverInitialFocus(); - } - this.responsivePopover.showAt(button); + this._togglePopover(button, tabInstance.subTabs, true); } _setPopoverInitialFocus() { @@ -765,7 +777,7 @@ class TabContainer extends UI5Element { return slideUp(element).promise(); } - async _onOverflowClick(e: Event) { + _onOverflowClick(e: Event) { if ((e.target as HTMLElement).classList.contains("ui5-tc__overflow")) { // the empty area in the overflow was clicked return; @@ -773,7 +785,7 @@ class TabContainer extends UI5Element { const overflow = e.currentTarget as HTMLElement; const isEndOverflow = overflow.classList.contains("ui5-tc__overflow--end"); - this._setPopoverItems(this.getPopoverOpenerItems(