Skip to content

Commit 984ef06

Browse files
authored
Merge pull request #85 from github/add-activetab-selectedtabindex-props
add activeTab, selectedTabIndex props
2 parents a3949df + 60631b2 commit 984ef06

File tree

2 files changed

+36
-2
lines changed

2 files changed

+36
-2
lines changed

src/tab-container-element.ts

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,10 @@ export class TabContainerElement extends HTMLElement {
111111
)
112112
}
113113

114+
get activeTab() {
115+
return this.#tabs[this.selectedTabIndex]
116+
}
117+
114118
get activePanel() {
115119
return this.#panelSlot.assignedNodes()[0] as HTMLElement
116120
}
@@ -189,7 +193,7 @@ export class TabContainerElement extends HTMLElement {
189193
const tabs = this.#tabs
190194
if (!tabs.includes(tab as HTMLElement)) return
191195

192-
const currentIndex = tabs.indexOf(tabs.find(e => e.matches('[aria-selected="true"]'))!)
196+
const currentIndex = this.selectedTabIndex
193197
const vertical = tab.closest('[role="tablist"]')?.getAttribute('aria-orientation') === 'vertical'
194198
const prevTab = event.code === 'ArrowLeft' || (vertical && event.code === 'ArrowUp')
195199
const nextTab = event.code === 'ArrowRight' || (vertical && event.code === 'ArrowDown')
@@ -226,6 +230,14 @@ export class TabContainerElement extends HTMLElement {
226230
}
227231
}
228232

233+
get selectedTabIndex(): number {
234+
return this.#tabs.findIndex(el => el.matches('[aria-selected=true]'))
235+
}
236+
237+
set selectedTabIndex(i: number) {
238+
this.selectTab(i)
239+
}
240+
229241
selectTab(index: number): void {
230242
if (!this.#setupComplete) {
231243
const tabListSlot = this.#tabListSlot
@@ -283,7 +295,7 @@ export class TabContainerElement extends HTMLElement {
283295
for (const el of afterSlotted) el.setAttribute('slot', 'after-panels')
284296
}
285297
const defaultTab = Number(this.getAttribute('default-tab') || -1)
286-
const defaultIndex = defaultTab >= 0 ? defaultTab : this.#tabs.findIndex(el => el.matches('[aria-selected=true]'))
298+
const defaultIndex = defaultTab >= 0 ? defaultTab : this.selectedTabIndex
287299
index = index >= 0 ? index : Math.max(0, defaultIndex)
288300
}
289301

test/test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,8 @@ describe('tab-container', function () {
183183
'change events point to second panel',
184184
)
185185
assert.equal(document.activeElement, tabs[1])
186+
assert.equal(tabContainer.activeTab, tabs[1])
187+
assert.equal(tabContainer.selectedTabIndex, 1)
186188
})
187189

188190
it('keyboard shortcuts work and `tab-container-changed` events are dispatched', function () {
@@ -208,6 +210,8 @@ describe('tab-container', function () {
208210
assert.deepStrictEqual(tabs.map(isSelected), [true, false, false], 'First tab is selected')
209211
assert.deepStrictEqual(panels.map(isHidden), [false, true, true], 'First panel is visible')
210212
assert.equal(document.activeElement, tabs[0])
213+
assert.equal(tabContainer.activeTab, tabs[0])
214+
assert.equal(tabContainer.selectedTabIndex, 0)
211215
assert.equal(events.length, 2, 'tab-container-change(d) called')
212216
assert.deepStrictEqual(
213217
events.map(e => e.type),
@@ -301,6 +305,8 @@ describe('tab-container', function () {
301305
'change events point to second panel',
302306
)
303307
assert.equal(document.activeElement, tabs[1])
308+
assert.equal(tabContainer.activeTab, tabs[1])
309+
assert.equal(tabContainer.selectedTabIndex, 1)
304310
})
305311

306312
it('result in noop, when selectTab receives out of bounds index', function () {
@@ -445,6 +451,8 @@ describe('tab-container', function () {
445451
assert.deepStrictEqual(tabs.map(isSelected), [false, false, true], 'Third tab is selected')
446452
assert.deepStrictEqual(panels.map(isHidden), [true, true, false], 'Third panel is visible')
447453
assert.equal(document.activeElement, tabs[2])
454+
assert.equal(tabContainer.activeTab, tabs[2])
455+
assert.equal(tabContainer.selectedTabIndex, 2)
448456
assert.equal(events.length, 2, 'tab-container-change(d) called')
449457
assert.deepStrictEqual(
450458
events.map(e => e.type),
@@ -467,6 +475,8 @@ describe('tab-container', function () {
467475
assert.deepStrictEqual(tabs.map(isSelected), [true, false, false], 'First tab is selected')
468476
assert.deepStrictEqual(panels.map(isHidden), [false, true, true], 'First panel is visible')
469477
assert.equal(document.activeElement, tabs[0])
478+
assert.equal(tabContainer.activeTab, tabs[0])
479+
assert.equal(tabContainer.selectedTabIndex, 0)
470480
assert.equal(events.length, 2, 'tab-container-change(d) called')
471481
assert.deepStrictEqual(
472482
events.map(e => e.type),
@@ -489,6 +499,8 @@ describe('tab-container', function () {
489499
assert.deepStrictEqual(tabs.map(isSelected), [false, true, false], 'Second tab is selected')
490500
assert.deepStrictEqual(panels.map(isHidden), [true, false, true], 'Second panel is visible')
491501
assert.equal(document.activeElement, tabs[1])
502+
assert.equal(tabContainer.activeTab, tabs[1])
503+
assert.equal(tabContainer.selectedTabIndex, 1)
492504
assert.equal(events.length, 2, 'tab-container-change(d) called')
493505
assert.deepStrictEqual(
494506
events.map(e => e.type),
@@ -511,6 +523,8 @@ describe('tab-container', function () {
511523
assert.deepStrictEqual(tabs.map(isSelected), [false, false, true], 'Third tab is selected')
512524
assert.deepStrictEqual(panels.map(isHidden), [true, true, false], 'Third panel is visible')
513525
assert.equal(document.activeElement, tabs[2])
526+
assert.equal(tabContainer.activeTab, tabs[2])
527+
assert.equal(tabContainer.selectedTabIndex, 2)
514528
assert.equal(events.length, 2, 'tab-container-change(d) called')
515529
assert.deepStrictEqual(
516530
events.map(e => e.type),
@@ -534,6 +548,8 @@ describe('tab-container', function () {
534548
assert.deepStrictEqual(tabs.map(isSelected), [false, false, true], 'Third tab is selected')
535549
assert.deepStrictEqual(panels.map(isHidden), [true, true, false], 'Third panel is visible')
536550
assert.equal(document.activeElement, tabs[2])
551+
assert.equal(tabContainer.activeTab, tabs[2])
552+
assert.equal(tabContainer.selectedTabIndex, 2)
537553
assert.equal(events.length, 2, 'tab-container-change(d) called')
538554
assert.deepStrictEqual(
539555
events.map(e => e.type),
@@ -556,6 +572,8 @@ describe('tab-container', function () {
556572
assert.deepStrictEqual(tabs.map(isSelected), [true, false, false], 'First tab is selected')
557573
assert.deepStrictEqual(panels.map(isHidden), [false, true, true], 'First panel is visible')
558574
assert.equal(document.activeElement, tabs[0])
575+
assert.equal(tabContainer.activeTab, tabs[0])
576+
assert.equal(tabContainer.selectedTabIndex, 0)
559577
assert.equal(events.length, 2, 'tab-container-change(d) called')
560578
assert.deepStrictEqual(
561579
events.map(e => e.type),
@@ -578,6 +596,8 @@ describe('tab-container', function () {
578596
assert.deepStrictEqual(tabs.map(isSelected), [false, true, false], 'Second tab is selected')
579597
assert.deepStrictEqual(panels.map(isHidden), [true, false, true], 'Second panel is visible')
580598
assert.equal(document.activeElement, tabs[1])
599+
assert.equal(tabContainer.activeTab, tabs[1])
600+
assert.equal(tabContainer.selectedTabIndex, 1)
581601
assert.equal(events.length, 2, 'tab-container-change(d) called')
582602
assert.deepStrictEqual(
583603
events.map(e => e.type),
@@ -600,6 +620,8 @@ describe('tab-container', function () {
600620
assert.deepStrictEqual(tabs.map(isSelected), [false, false, true], 'Third tab is selected')
601621
assert.deepStrictEqual(panels.map(isHidden), [true, true, false], 'Third panel is visible')
602622
assert.equal(document.activeElement, tabs[2])
623+
assert.equal(tabContainer.activeTab, tabs[2])
624+
assert.equal(tabContainer.selectedTabIndex, 2)
603625
assert.equal(events.length, 2, 'tab-container-change(d) called')
604626
assert.deepStrictEqual(
605627
events.map(e => e.type),

0 commit comments

Comments
 (0)