Skip to content

Commit 666d0c2

Browse files
authored
Merge pull request #73 from github/data_no_focus_bug
Don't set a tabindex=0 when the toolbar has data-no-focus attribute applied
2 parents 432d70d + 58282f3 commit 666d0c2

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

Diff for: src/index.ts

+27-6
Original file line numberDiff line numberDiff line change
@@ -320,20 +320,43 @@ function applyFromToolbar(event: Event) {
320320
applyStyle(target, style)
321321
}
322322

323+
function setFocusManagement(toolbar: MarkdownToolbarElement) {
324+
toolbar.addEventListener('keydown', focusKeydown)
325+
toolbar.setAttribute('tabindex', '0')
326+
toolbar.addEventListener('focus', onToolbarFocus, {once: true})
327+
}
328+
329+
function unsetFocusManagement(toolbar: MarkdownToolbarElement) {
330+
toolbar.removeEventListener('keydown', focusKeydown)
331+
toolbar.removeAttribute('tabindex')
332+
toolbar.removeEventListener('focus', onToolbarFocus)
333+
}
334+
323335
class MarkdownToolbarElement extends HTMLElement {
336+
static observedAttributes = ['data-no-focus']
337+
324338
connectedCallback(): void {
325339
if (!this.hasAttribute('role')) {
326340
this.setAttribute('role', 'toolbar')
327341
}
328-
this.addEventListener('keydown', focusKeydown)
329-
this.setAttribute('tabindex', '0')
330-
this.addEventListener('focus', onToolbarFocus, {once: true})
342+
if (!this.hasAttribute('data-no-focus')) {
343+
setFocusManagement(this)
344+
}
331345
this.addEventListener('keydown', keydown(applyFromToolbar))
332346
this.addEventListener('click', applyFromToolbar)
333347
}
334348

349+
attributeChangedCallback(name: string, oldValue: string, newValue: string): void {
350+
if (name !== 'data-no-focus') return
351+
if (newValue === null) {
352+
setFocusManagement(this)
353+
} else {
354+
unsetFocusManagement(this)
355+
}
356+
}
357+
335358
disconnectedCallback(): void {
336-
this.removeEventListener('keydown', focusKeydown)
359+
unsetFocusManagement(this)
337360
}
338361

339362
get field(): HTMLTextAreaElement | null {
@@ -350,7 +373,6 @@ class MarkdownToolbarElement extends HTMLElement {
350373

351374
function onToolbarFocus({target}: FocusEvent) {
352375
if (!(target instanceof Element)) return
353-
if (target.hasAttribute('data-no-focus')) return
354376
target.removeAttribute('tabindex')
355377
let tabindex = '0'
356378
for (const button of getButtons(target)) {
@@ -367,7 +389,6 @@ function focusKeydown(event: KeyboardEvent) {
367389
if (key !== 'ArrowRight' && key !== 'ArrowLeft' && key !== 'Home' && key !== 'End') return
368390
const toolbar = event.currentTarget
369391
if (!(toolbar instanceof HTMLElement)) return
370-
if (toolbar.hasAttribute('data-no-focus')) return
371392
const buttons = getButtons(toolbar)
372393
const index = buttons.indexOf(event.target as HTMLElement)
373394
const length = buttons.length

Diff for: test/test.js

+2-6
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ describe('markdown-toolbar-element', function () {
9696

9797
describe('focus management', function () {
9898
function focusFirstButton() {
99+
document.querySelector('markdown-toolbar').focus()
99100
const button = document.querySelector('md-bold')
100101
button.focus()
101102
}
@@ -111,10 +112,6 @@ describe('markdown-toolbar-element', function () {
111112
return [...document.querySelectorAll(`markdown-toolbar [tabindex="${index}"]`)]
112113
}
113114

114-
beforeEach(() => {
115-
document.querySelector('markdown-toolbar').focus()
116-
})
117-
118115
it('moves focus to next button when ArrowRight is pressed', function () {
119116
focusFirstButton()
120117
pushKeyOnFocussedButton('ArrowRight')
@@ -135,8 +132,7 @@ describe('markdown-toolbar-element', function () {
135132
document.querySelector('markdown-toolbar').setAttribute('data-no-focus', '')
136133
focusFirstButton()
137134
pushKeyOnFocussedButton('ArrowRight')
138-
assert.deepEqual(getElementsWithTabindex(0), [document.querySelector('md-bold')])
139-
assert.deepEqual(getElementsWithTabindex(0), [document.activeElement])
135+
assert.lengthOf(getElementsWithTabindex(0), 0)
140136
})
141137

142138
it('cycles focus round to last element from first when ArrowLeft is pressed', function () {

0 commit comments

Comments
 (0)