File tree Expand file tree Collapse file tree 2 files changed +32
-8
lines changed
react-aria-components/test Expand file tree Collapse file tree 2 files changed +32
-8
lines changed Original file line number Diff line number Diff line change @@ -22,7 +22,7 @@ let canUseDOM = Boolean(
22
22
window . document . createElement
23
23
) ;
24
24
25
- let idsUpdaterMap : Map < string , ( v : string ) => void > = new Map ( ) ;
25
+ let idsUpdaterMap : Map < string , Array < ( v : string ) => void > > = new Map ( ) ;
26
26
27
27
/**
28
28
* If a default is not provided, generate an id.
@@ -39,7 +39,12 @@ export function useId(defaultId?: string): string {
39
39
} , [ ] ) ;
40
40
41
41
if ( canUseDOM ) {
42
- idsUpdaterMap . set ( res , updateValue ) ;
42
+ // TS not smart enough to know that `has` means the value exists
43
+ if ( idsUpdaterMap . has ( res ) && ! idsUpdaterMap . get ( res ) ! . includes ( updateValue ) ) {
44
+ idsUpdaterMap . set ( res , [ ...idsUpdaterMap . get ( res ) ! , updateValue ] ) ;
45
+ } else {
46
+ idsUpdaterMap . set ( res , [ updateValue ] ) ;
47
+ }
43
48
}
44
49
45
50
useLayoutEffect ( ( ) => {
@@ -71,15 +76,15 @@ export function mergeIds(idA: string, idB: string): string {
71
76
return idA ;
72
77
}
73
78
74
- let setIdA = idsUpdaterMap . get ( idA ) ;
75
- if ( setIdA ) {
76
- setIdA ( idB ) ;
79
+ let setIdsA = idsUpdaterMap . get ( idA ) ;
80
+ if ( setIdsA ) {
81
+ setIdsA . forEach ( fn => fn ( idB ) ) ;
77
82
return idB ;
78
83
}
79
84
80
- let setIdB = idsUpdaterMap . get ( idB ) ;
81
- if ( setIdB ) {
82
- setIdB ( idA ) ;
85
+ let setIdsB = idsUpdaterMap . get ( idB ) ;
86
+ if ( setIdsB ) {
87
+ setIdsB . forEach ( fn => fn ( idA ) ) ;
83
88
return idA ;
84
89
}
85
90
Original file line number Diff line number Diff line change @@ -238,5 +238,24 @@ describe('TextField', () => {
238
238
expect ( outerEl [ 0 ] ) . not . toHaveAttribute ( 'id' ) ;
239
239
expect ( input ) . toHaveAttribute ( 'id' , 'name' ) ;
240
240
} ) ;
241
+
242
+ it ( 'should link an id on the input to the label htmlFor' , async ( ) => {
243
+ let { getAllByTestId, getByRole, getByText} = render (
244
+ < TextField defaultValue = "test" data-testid = "text-field-test" data-foo = "bar" >
245
+ < Label > Test</ Label >
246
+ < Input id = "name" />
247
+ < Text slot = "description" > Description</ Text >
248
+ < Text slot = "errorMessage" > Error</ Text >
249
+ </ TextField >
250
+ ) ;
251
+ let outerEl = getAllByTestId ( 'text-field-test' ) ;
252
+ let input = getByRole ( 'textbox' ) ;
253
+ let label = getByText ( 'Test' ) ;
254
+
255
+ expect ( outerEl ) . toHaveLength ( 1 ) ;
256
+ expect ( outerEl [ 0 ] ) . not . toHaveAttribute ( 'id' ) ;
257
+ expect ( input ) . toHaveAttribute ( 'id' , 'name' ) ;
258
+ expect ( label ) . toHaveAttribute ( 'for' , 'name' ) ;
259
+ } ) ;
241
260
} ) ;
242
261
} ) ;
You can’t perform that action at this time.
0 commit comments