Skip to content

Commit 9f99225

Browse files
committed
feat: support custom tabs that do not necessarily extend from UUITab but still follows the interface
1 parent 0df4cd4 commit 9f99225

File tree

1 file changed

+21
-24
lines changed

1 file changed

+21
-24
lines changed

packages/uui-tabs/lib/uui-tab-group.element.ts

+21-24
Original file line numberDiff line numberDiff line change
@@ -32,50 +32,47 @@ export class UUITabGroupElement extends LitElement {
3232
})
3333
private slotNodes?: HTMLElement[];
3434

35-
private tabElements: UUITabElement[] = [];
35+
private tabElements: HTMLElement[] = [];
3636

3737
private setTabArray() {
38-
if (this.slotNodes) {
39-
this.tabElements = this.slotNodes.filter(this.elementIsTab);
40-
} else {
41-
this.tabElements = [];
42-
}
43-
}
44-
45-
private elementIsTab(el: unknown): el is UUITabElement {
46-
return el instanceof UUITabElement;
38+
this.tabElements = this.slotNodes ? this.slotNodes : [];
4739
}
4840

4941
private onSlotChange() {
42+
this.tabElements.forEach(el => {
43+
el.removeEventListener(
44+
'click',
45+
this.onTabActive
46+
);
47+
});
48+
5049
this.setTabArray();
51-
if (this.tabElements) {
52-
this.tabElements.forEach(el => {
53-
el.removeEventListener(
54-
'click',
55-
// @ts-ignore TODO: fix typescript error
56-
this.onTabActive as EventHandlerNonNull
57-
);
58-
});
59-
}
6050

6151
this.tabElements.forEach(el => {
62-
// @ts-ignore TODO: fix typescript error
63-
el.addEventListener('click', this.onTabActive as EventHandlerNonNull);
52+
el.addEventListener('click', this.onTabActive);
6453
});
6554
}
6655

6756
private onTabActive = (e: MouseEvent) => {
6857
//? should this contain stopPropagation?
69-
const selectedElement = e.target as UUITabElement;
70-
selectedElement.active = true;
58+
const selectedElement = e.target as HTMLElement;
59+
if (this.elementIsTabLike(selectedElement)) {
60+
selectedElement.active = true;
61+
}
7162

7263
const filtered = this.tabElements.filter(el => el !== selectedElement);
7364

7465
filtered.forEach(el => {
75-
el.active = false;
66+
if (this.elementIsTabLike(el)) {
67+
el.active = false;
68+
}
7669
});
7770
};
7871

72+
private elementIsTabLike(el: any): el is UUITabElement {
73+
return el instanceof UUITabElement || 'active' in el;
74+
}
75+
7976
connectedCallback() {
8077
super.connectedCallback();
8178
if (!this.hasAttribute('role')) this.setAttribute('role', 'tablist');

0 commit comments

Comments
 (0)