Skip to content

Commit 3657279

Browse files
authored
fix(Select): display label for empty string value (#543)
1 parent 970547e commit 3657279

File tree

3 files changed

+50
-5
lines changed

3 files changed

+50
-5
lines changed

src/components/Select/SingleSelect.test.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,46 @@ describe("Select", () => {
138138
expect(getByTestId("select-trigger")).toHaveTextContent("Content0");
139139
});
140140

141+
it("should render initially selected option with empty value", () => {
142+
const OPTION_TEXT = "Empty option";
143+
144+
const { getByTestId } = renderSelect({
145+
value: "",
146+
options: [
147+
{
148+
value: "",
149+
label: OPTION_TEXT,
150+
},
151+
],
152+
});
153+
154+
const selectedValue = getByTestId("select-trigger");
155+
expect(selectedValue.textContent).toBe(OPTION_TEXT);
156+
});
157+
158+
it("should render manually selected option with empty value", () => {
159+
const OPTION_TEXT = "Empty option";
160+
161+
const { queryByText, getByTestId } = renderSelect({
162+
options: [
163+
{
164+
value: "",
165+
label: OPTION_TEXT,
166+
},
167+
],
168+
});
169+
170+
const selectTrigger = getByTestId("select-trigger");
171+
expect(selectTrigger).not.toBeNull();
172+
expect(selectTrigger.textContent).toBe("Select an option");
173+
selectTrigger && fireEvent.click(selectTrigger);
174+
175+
const item = queryByText(OPTION_TEXT);
176+
expect(item).not.toBeNull();
177+
item && fireEvent.click(item);
178+
expect(selectTrigger.textContent).toBe(OPTION_TEXT);
179+
});
180+
141181
it("should close select on selecting item", () => {
142182
const { queryByText } = renderSelect({});
143183
const selectTrigger = queryByText("Select an option");

src/components/Select/SingleSelect.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,11 @@ export const Select = ({
2929
...props
3030
}: SelectProps) => {
3131
const [selectedValues, setSelectedValues] = useState<Array<string>>(
32-
valueProp ? [valueProp] : defaultValue ? [defaultValue] : []
32+
typeof valueProp === "string"
33+
? [valueProp]
34+
: typeof defaultValue === "string"
35+
? [defaultValue]
36+
: []
3337
);
3438
const [open, setOpen] = useState(false);
3539

@@ -69,7 +73,7 @@ export const Select = ({
6973
);
7074

7175
useUpdateEffect(() => {
72-
setSelectedValues(valueProp ? [valueProp] : []);
76+
setSelectedValues(typeof valueProp === "string" ? [valueProp] : []);
7377
}, [valueProp]);
7478

7579
const conditionalProps: Partial<SelectOptionProp> = {};
@@ -82,7 +86,7 @@ export const Select = ({
8286
return (
8387
<InternalSelect
8488
onChange={onChange}
85-
value={valueProp ? [valueProp] : selectedValues}
89+
value={typeof valueProp === "string" ? [valueProp] : selectedValues}
8690
open={open}
8791
onOpenChange={onOpenChange}
8892
onSelect={onSelect}

src/components/Select/SingleSelectValue.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ const SingleSelectValue = ({
2020
valueNode?: SelectItemProps;
2121
value: string;
2222
}) => {
23-
const { icon, iconDir, children, label } = valueNode ?? {};
24-
if (!value) {
23+
if (value === undefined || value === null) {
2524
return null;
2625
}
2726

27+
const { icon, iconDir, children, label } = valueNode ?? {};
28+
2829
return (
2930
<SelectValueContainer>
3031
<IconWrapper

0 commit comments

Comments
 (0)