diff --git a/packages/components/src/components/tab-header/readme.md b/packages/components/src/components/tab-header/readme.md index aeddef3efe..706e9cbe2d 100644 --- a/packages/components/src/components/tab-header/readme.md +++ b/packages/components/src/components/tab-header/readme.md @@ -11,12 +11,19 @@ | ----------- | ------------ | ------------------------------------------------------------------------------------- | -------------------- | ----------- | | `autoFocus` | `auto-focus` | (optional) autoFocus | `boolean` | `undefined` | | `disabled` | `disabled` | True for a disabled Tabnavigation | `boolean` | `false` | -| `selected` | `selected` | | `boolean` | `undefined` | +| `selected` | `selected` | (optional) Whether the tab is selected | `boolean` | `undefined` | | `size` | `size` | (optional) size | `"large" \| "small"` | `'small'` | | `small` | `small` | **[DEPRECATED]** - size should replace small

| `boolean` | `false` | | `styles` | `styles` | (optional) Injected CSS styles | `string` | `undefined` | +## Events + +| Event | Description | Type | +| -------------- | ----------- | ------------------ | +| `scale-select` | | `CustomEvent` | + + ---------------------------------------------- *Built with [StencilJS](https://stenciljs.com/)* diff --git a/packages/components/src/components/tab-header/tab-header.tsx b/packages/components/src/components/tab-header/tab-header.tsx index 084c06fe6f..e063bfe875 100644 --- a/packages/components/src/components/tab-header/tab-header.tsx +++ b/packages/components/src/components/tab-header/tab-header.tsx @@ -9,7 +9,18 @@ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ -import { Component, h, Prop, Host, Watch, State, Element } from '@stencil/core'; +import { + Component, + Element, + Event, + EventEmitter, + h, + Host, + Listen, + Prop, + State, + Watch, +} from '@stencil/core'; import classNames from 'classnames'; import { ScaleIcon, isScaleIcon } from '../../utils/utils'; import statusNote from '../../utils/status-note'; @@ -34,15 +45,27 @@ export class TabHeader { /** @deprecated - size should replace small */ @Prop() small?: boolean = false; /** (optional) size */ - @Prop() size: 'small' | 'large' = 'small'; + @Prop() size?: 'small' | 'large' = 'small'; /** (optional) autoFocus */ @Prop() autoFocus?: boolean; + /** (optional) Whether the tab is selected */ + @Prop() selected?: boolean; /** (optional) Injected CSS styles */ @Prop() styles?: string; - @Prop() selected: boolean; @State() hasFocus: boolean = false; + @Event({ eventName: 'scale-select' }) scaleSelect: EventEmitter; + + @Listen('click') + handleClick(event: MouseEvent) { + event.stopPropagation(); + if (this.disabled) { + return; + } + this.scaleSelect.emit(); + } + @Watch('selected') selectedChanged(newValue: boolean) { if (!this.hostElement.isConnected) { diff --git a/packages/components/src/components/tab-nav/tab-nav.tsx b/packages/components/src/components/tab-nav/tab-nav.tsx index 99f7a0c093..4eb4a77cdd 100644 --- a/packages/components/src/components/tab-nav/tab-nav.tsx +++ b/packages/components/src/components/tab-nav/tab-nav.tsx @@ -40,33 +40,12 @@ export class TabNav { /** (optional) Injected CSS styles */ @Prop() styles?: string; - @Listen('click') - handleClick(event: MouseEvent) { - // To provent event bubbling. - event.stopPropagation(); - - // workaround for slotted icons - const targetHTMLElement = event.target as HTMLElement; - const targetTag = targetHTMLElement.tagName.toLowerCase(); - const svgTags = ['svg', 'g', 'path']; - let nextTab: HTMLScaleTabHeaderElement; - - if (svgTags.includes(targetTag)) { - const closestNextTab = targetHTMLElement.closest( - `scale-tab-header[role="tab"]` - ) as HTMLScaleTabHeaderElement; - if (closestNextTab) { - nextTab = closestNextTab; - this.selectTab(nextTab); - } - } else { - if ( - (event.target as HTMLScaleTabHeaderElement).getAttribute('role') === - 'tab' - ) { - nextTab = event.target as HTMLScaleTabHeaderElement; - this.selectTab(nextTab); - } + @Listen('scale-select') + handleSelect(event) { + const nextTab = event.target as HTMLScaleTabHeaderElement; + // Act only if it's a direct child + if (this.getAllEnabledTabs().includes(nextTab)) { + this.selectTab(nextTab); } }