Skip to content

Commit ddbcba0

Browse files
authored
Merge pull request #70 from github/add-tabcontainerchange-event-class
add TabContainerChange event class
2 parents 2f6ee23 + 3cb5d68 commit ddbcba0

2 files changed

Lines changed: 96 additions & 7 deletions

File tree

src/tab-container-element.ts

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,30 @@ function getTabs(el: TabContainerElement): HTMLElement[] {
99
)
1010
}
1111

12+
export class TabContainerChangeEvent extends Event {
13+
constructor(type: string, {tab, panel, ...init}: EventInit & {tab?: Element; panel?: Element}) {
14+
super(type, init)
15+
this.#tab = tab || null
16+
this.#panel = panel || null
17+
}
18+
19+
get detail() {
20+
// eslint-disable-next-line no-console
21+
console.warn('TabContainerElement.detail is deprecated, please use .panel instead')
22+
return {relatedTarget: this.#panel}
23+
}
24+
25+
#panel: Element | null = null
26+
get panel(): Element | null {
27+
return this.#panel
28+
}
29+
30+
#tab: Element | null = null
31+
get tab(): Element | null {
32+
return this.#tab
33+
}
34+
}
35+
1236
function getNavigationKeyCodes(vertical: boolean): [IncrementKeyCode[], DecrementKeyCode[]] {
1337
if (vertical) {
1438
return [
@@ -26,6 +50,42 @@ export class TabContainerElement extends HTMLElement {
2650
return this
2751
}
2852

53+
#onTabContainerChange: ((event: TabContainerChangeEvent) => void) | null = null
54+
get onTabContainerChange() {
55+
return this.#onTabContainerChange
56+
}
57+
58+
set onTabContainerChange(listener: ((event: TabContainerChangeEvent) => void) | null) {
59+
if (this.#onTabContainerChange) {
60+
this.removeEventListener(
61+
'tab-container-change',
62+
this.#onTabContainerChange as unknown as EventListenerOrEventListenerObject,
63+
)
64+
}
65+
this.#onTabContainerChange = typeof listener === 'object' || typeof listener === 'function' ? listener : null
66+
if (typeof listener === 'function') {
67+
this.addEventListener('tab-container-change', listener as unknown as EventListenerOrEventListenerObject)
68+
}
69+
}
70+
71+
#onTabContainerChanged: ((event: TabContainerChangeEvent) => void) | null = null
72+
get onTabContainerChanged() {
73+
return this.#onTabContainerChanged
74+
}
75+
76+
set onTabContainerChanged(listener: ((event: TabContainerChangeEvent) => void) | null) {
77+
if (this.#onTabContainerChanged) {
78+
this.removeEventListener(
79+
'tab-container-changed',
80+
this.#onTabContainerChanged as unknown as EventListenerOrEventListenerObject,
81+
)
82+
}
83+
this.#onTabContainerChanged = typeof listener === 'object' || typeof listener === 'function' ? listener : null
84+
if (typeof listener === 'function') {
85+
this.addEventListener('tab-container-changed', listener as unknown as EventListenerOrEventListenerObject)
86+
}
87+
}
88+
2989
connectedCallback(): void {
3090
this.addEventListener('keydown', (event: KeyboardEvent) => {
3191
const target = event.target
@@ -101,10 +161,11 @@ export class TabContainerElement extends HTMLElement {
101161
const selectedPanel = panels[index]
102162

103163
const cancelled = !this.dispatchEvent(
104-
new CustomEvent('tab-container-change', {
164+
new TabContainerChangeEvent('tab-container-change', {
105165
bubbles: true,
106166
cancelable: true,
107-
detail: {relatedTarget: selectedPanel},
167+
tab: selectedTab,
168+
panel: selectedPanel,
108169
}),
109170
)
110171
if (cancelled) return
@@ -126,9 +187,10 @@ export class TabContainerElement extends HTMLElement {
126187
selectedPanel.hidden = false
127188

128189
this.dispatchEvent(
129-
new CustomEvent('tab-container-changed', {
190+
new TabContainerChangeEvent('tab-container-changed', {
130191
bubbles: true,
131-
detail: {relatedTarget: selectedPanel},
192+
tab: selectedTab,
193+
panel: selectedPanel,
132194
}),
133195
)
134196
}

test/test.js

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,30 @@ describe('tab-container', function () {
1414
})
1515
})
1616

17+
describe('events', function () {
18+
it('has an onTabContainerChange property for the change event', function () {
19+
const el = document.createElement('tab-container')
20+
let called = false
21+
const listener = () => (called = true)
22+
el.onTabContainerChange = listener
23+
assert.equal(el.onTabContainerChange, listener)
24+
assert.equal(called, false)
25+
el.dispatchEvent(new Event('tab-container-change'))
26+
assert.equal(called, true)
27+
})
28+
29+
it('has an onTabContainerChanged property for the changed event', function () {
30+
const el = document.createElement('tab-container')
31+
let called = false
32+
const listener = () => (called = true)
33+
el.onTabContainerChanged = listener
34+
assert.equal(el.onTabContainerChanged, listener)
35+
assert.equal(called, false)
36+
el.dispatchEvent(new Event('tab-container-changed'))
37+
assert.equal(called, true)
38+
})
39+
})
40+
1741
describe('after tree insertion', function () {
1842
beforeEach(function () {
1943
document.body.innerHTML = `
@@ -47,7 +71,8 @@ describe('tab-container', function () {
4771
let counter = 0
4872
tabContainer.addEventListener('tab-container-changed', event => {
4973
counter++
50-
assert.equal(event.detail.relatedTarget, panels[1])
74+
assert.equal(event.tab, tabs[1])
75+
assert.equal(event.panel, panels[1])
5176
})
5277

5378
tabs[1].click()
@@ -105,7 +130,8 @@ describe('tab-container', function () {
105130
let counter = 0
106131
tabContainer.addEventListener('tab-container-change', event => {
107132
counter++
108-
assert.equal(event.detail.relatedTarget, panels[1])
133+
assert.equal(event.tab, tabs[1])
134+
assert.equal(event.panel, panels[1])
109135
event.preventDefault()
110136
})
111137

@@ -160,7 +186,8 @@ describe('tab-container', function () {
160186
let counter = 0
161187
tabContainer.addEventListener('tab-container-changed', event => {
162188
counter++
163-
assert.equal(event.detail.relatedTarget, panels[1])
189+
assert.equal(event.tab, tabs[1])
190+
assert.equal(event.panel, panels[1])
164191
})
165192

166193
tabContainer.selectTab(1)

0 commit comments

Comments
 (0)