Skip to content

Commit e8f2c57

Browse files
committed
fix(form): TextField and Select disabled behavior
The Select component will no longer open the Listbox if it somehow gains focus while disabled (_should_ have been impossible though) and the TextField now correctly passes the disabled attribute to the input field.
1 parent de6b56d commit e8f2c57

File tree

5 files changed

+53
-1
lines changed

5 files changed

+53
-1
lines changed

packages/form/src/select/Select.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,10 @@ const Select = forwardRef<HTMLDivElement, SelectProps>(function Select(
258258
onKeyDown(event);
259259
}
260260

261+
if (disabled) {
262+
return;
263+
}
264+
261265
switch (event.key) {
262266
case " ":
263267
case "ArrowUp":
@@ -296,7 +300,7 @@ const Select = forwardRef<HTMLDivElement, SelectProps>(function Select(
296300
// no default
297301
}
298302
},
299-
[onKeyDown, show]
303+
[onKeyDown, disabled, show]
300304
);
301305

302306
const selectRef = useRef<HTMLDivElement | null>(null);

packages/form/src/select/__tests__/Select.tsx

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,4 +125,23 @@ describe("Select", () => {
125125

126126
expect(input.value).toBe("Option 1");
127127
});
128+
129+
it("should not open the listbox while disabled", () => {
130+
render(<Select {...PROPS} disabled />);
131+
expect(getListbox).toThrow();
132+
const select = getSelect();
133+
134+
fireEvent.click(select);
135+
expect(getListbox).toThrow();
136+
137+
fireEvent.focus(select);
138+
fireEvent.keyDown(select, { key: " " });
139+
expect(getListbox).toThrow();
140+
141+
fireEvent.keyDown(select, { key: "ArrowDown" });
142+
expect(getListbox).toThrow();
143+
144+
fireEvent.keyDown(select, { key: "ArrowUp" });
145+
expect(getListbox).toThrow();
146+
});
128147
});

packages/form/src/text-field/TextField.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ const TextField = forwardRef<HTMLInputElement, TextFieldProps>(
212212
{...props}
213213
ref={ref}
214214
type={type}
215+
disabled={disabled}
215216
onFocus={onFocus}
216217
onBlur={onBlur}
217218
onChange={onChange}

packages/form/src/text-field/__tests__/TextField.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,11 @@ describe("TextField", () => {
1212

1313
rerender(<TextField {...props} label="Label" placeholder="Placeholder" />);
1414
expect(container).toMatchSnapshot();
15+
16+
rerender(
17+
<TextField {...props} label="Label" placeholder="Placeholder" disabled />
18+
);
19+
expect(container).toMatchSnapshot();
20+
expect(document.getElementById("field")).toHaveAttribute("disabled");
1521
});
1622
});

packages/form/src/text-field/__tests__/__snapshots__/TextField.tsx.snap

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,25 @@ exports[`TextField should render correctly 2`] = `
3434
</div>
3535
</div>
3636
`;
37+
38+
exports[`TextField should render correctly 3`] = `
39+
<div>
40+
<div
41+
class="rmd-text-field-container rmd-text-field-container--outline rmd-text-field-container--disabled rmd-text-field-container--label"
42+
>
43+
<label
44+
class="rmd-label rmd-label--disabled rmd-floating-label"
45+
for="field"
46+
>
47+
Label
48+
</label>
49+
<input
50+
class="rmd-text-field rmd-text-field--floating"
51+
disabled=""
52+
id="field"
53+
placeholder="Placeholder"
54+
type="text"
55+
/>
56+
</div>
57+
</div>
58+
`;

0 commit comments

Comments
 (0)