Skip to content

Commit 81c50ba

Browse files
author
Aaron Pettengill
committed
fix: Only return first child element in label query
1 parent 672f231 commit 81c50ba

File tree

2 files changed

+36
-5
lines changed

2 files changed

+36
-5
lines changed

src/__tests__/element-queries.js

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ test('can filter results of label query based on selector', () => {
230230
})
231231

232232
test('can find any form control when label text is inside other elements', () => {
233-
const {getAllByLabelText} = render(`
233+
const {getByLabelText} = render(`
234234
<label>
235235
<span>Test</span>
236236
<span>Label</span>
@@ -244,8 +244,38 @@ test('can find any form control when label text is inside other elements', () =>
244244
</label>
245245
`)
246246

247-
const result = getAllByLabelText('Test Label')
248-
expect(result).toHaveLength(7)
247+
const nodeTypes = [
248+
'button',
249+
'input',
250+
'meter',
251+
'output',
252+
'progress',
253+
'select',
254+
'textarea',
255+
]
256+
nodeTypes.forEach(nodeType => {
257+
expect(getByLabelText('Test Label', {selector: nodeType}).nodeName).toEqual(
258+
nodeType.toUpperCase(),
259+
)
260+
})
261+
})
262+
263+
test('returns the first form control inside a label', () => {
264+
const {getByLabelText} = render(`
265+
<label>
266+
<span>Test</span>
267+
<span>Label</span>
268+
<button />
269+
<input />
270+
<meter />
271+
<output />
272+
<progress />
273+
<select />
274+
<textarea />
275+
</label>
276+
`)
277+
278+
expect(getByLabelText('Test Label').nodeName).toEqual('BUTTON')
249279
})
250280

251281
test('can find non-input elements when aria-labelledby a label', () => {

src/queries/label-text.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,10 @@ function queryAllByLabelText(
7474
// <label>text: <input /></label>
7575
const formControlSelector =
7676
'button, input, meter, output, progress, select, textarea'
77-
Array.from(
77+
const labelledFormControl = Array.from(
7878
label.querySelectorAll(formControlSelector),
79-
).forEach(element => elementsForLabel.push(element))
79+
).filter(element => element.matches(selector))[0]
80+
if (labelledFormControl) elementsForLabel.push(labelledFormControl)
8081
}
8182
return matchedElements.concat(elementsForLabel)
8283
}, [])

0 commit comments

Comments
 (0)