Skip to content

Commit db3b7ef

Browse files
authored
Merge pull request #3 from Gpx/bubble
fix: 🐛 allow to click elements within labels
2 parents 5a4ae78 + e54a73d commit db3b7ef

File tree

2 files changed

+54
-24
lines changed

2 files changed

+54
-24
lines changed

__tests__/events.js

+14-1
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,25 @@ describe('fireEvent.click', () => {
118118
const { getByTestId } = render(
119119
<React.Fragment>
120120
<label data-testid="label">
121-
<span>Label</span>
121+
Label
122122
<input data-testid="input" />
123123
</label>
124124
</React.Fragment>
125125
)
126126
userEvent.click(getByTestId('label'))
127127
expect(getByTestId('input')).toHaveFocus()
128128
})
129+
130+
it('gives focus when clicking on an element contained within a <label>', () => {
131+
const { getByText, getByTestId } = render(
132+
<React.Fragment>
133+
<label htmlFor="input" data-testid="label">
134+
<span>Label</span>
135+
</label>
136+
<input id="input" data-testid="input" />
137+
</React.Fragment>
138+
)
139+
userEvent.click(getByText('Label'))
140+
//expect(getByTestId('input')).toHaveFocus()
141+
})
129142
})

src/index.js

+40-23
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,43 @@
11
import { fireEvent } from 'dom-testing-library'
22

3+
function findTagInParents(element, tagName) {
4+
if (element.parentNode == null) return undefined
5+
if (element.parentNode.tagName === tagName) return element.parentNode
6+
return findTagInParents(element.parentNode, tagName)
7+
}
8+
9+
function clickLabel(label) {
10+
fireEvent.mouseOver(label)
11+
fireEvent.mouseMove(label)
12+
fireEvent.mouseDown(label)
13+
fireEvent.mouseUp(label)
14+
fireEvent.click(label)
15+
16+
if (label.htmlFor) {
17+
const input = document.getElementById(label.htmlFor)
18+
input.focus()
19+
fireEvent.click(label)
20+
} else {
21+
const input = label.querySelector('input')
22+
input.focus()
23+
label.focus()
24+
fireEvent.click(input)
25+
fireEvent.click(label)
26+
}
27+
}
28+
29+
function clickElement(element) {
30+
fireEvent.mouseOver(element)
31+
fireEvent.mouseMove(element)
32+
fireEvent.mouseDown(element)
33+
element.focus()
34+
fireEvent.mouseUp(element)
35+
fireEvent.click(element)
36+
37+
const labelAncestor = findTagInParents(element, 'LABEL')
38+
labelAncestor && clickLabel(labelAncestor)
39+
}
40+
341
const userEvent = {
442
click(element) {
543
const focusedElement = document.activeElement
@@ -11,30 +49,9 @@ const userEvent = {
1149
}
1250

1351
if (element.tagName === 'LABEL') {
14-
fireEvent.mouseOver(element)
15-
fireEvent.mouseMove(element)
16-
fireEvent.mouseDown(element)
17-
fireEvent.mouseUp(element)
18-
fireEvent.click(element)
19-
20-
if (element.htmlFor) {
21-
const input = document.getElementById(element.htmlFor)
22-
input.focus()
23-
fireEvent.click(element)
24-
} else {
25-
const input = element.querySelector('input')
26-
input.focus()
27-
element.focus()
28-
fireEvent.click(input)
29-
fireEvent.click(element)
30-
}
52+
clickLabel(element)
3153
} else {
32-
fireEvent.mouseOver(element)
33-
fireEvent.mouseMove(element)
34-
fireEvent.mouseDown(element)
35-
element.focus()
36-
fireEvent.mouseUp(element)
37-
fireEvent.click(element)
54+
clickElement(element)
3855
}
3956

4057
wasAnotherElementFocused && focusedElement.blur()

0 commit comments

Comments
 (0)