Skip to content

Commit

Permalink
Handle disable option in Select, Combobox and Multiselect (#826)
Browse files Browse the repository at this point in the history
* Add disabled to Option type

* Handle disabled item state in Select component

* Handle disabled in Combobox and Multiselect
  • Loading branch information
poulch authored Jul 16, 2024
1 parent b56057e commit f032235
Show file tree
Hide file tree
Showing 9 changed files with 98 additions and 5 deletions.
1 change: 1 addition & 0 deletions src/components/BaseSelect/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { ReactNode } from "react";
export type Option = {
label: string;
value: string;
disabled?: boolean;
startAdornment?: ReactNode;
endAdornment?: ReactNode;
};
Expand Down
8 changes: 7 additions & 1 deletion src/components/Combobox/Dynamic/DynamicCombobox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -172,11 +172,17 @@ const DynamicComboboxInner = <T extends Option>(
{...getItemProps({
item,
index,
disabled: item.disabled,
})}
active={highlightedIndex === index}
>
{item?.startAdornment}
<Text size={getListTextSize(size)}>{item.label}</Text>
<Text
color={item.disabled ? "defaultDisabled" : undefined}
size={getListTextSize(size)}
>
{item.label}
</Text>
{item?.endAdornment}
</List.Item>
))}
Expand Down
8 changes: 7 additions & 1 deletion src/components/Combobox/Static/Combobox.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -164,11 +164,17 @@ const ComboboxInner = <T extends Option, V extends Option | string>(
{...getItemProps({
item,
index,
disabled: item.disabled,
})}
active={highlightedIndex === index}
>
{item?.startAdornment}
<Text size={getListTextSize(size)}>{item.label}</Text>
<Text
color={item.disabled ? "defaultDisabled" : undefined}
size={getListTextSize(size)}
>
{item.label}
</Text>
{item?.endAdornment}
</List.Item>
))}
Expand Down
20 changes: 20 additions & 0 deletions src/components/Combobox/Static/StaticCombobox.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,26 @@ export const WithEllipsis = () => {
);
};

export const WithDisabledOption = () => {
const values = options.map((option) => ({
...option,
disabled: option.value === "color-green",
}));
const [value, setValue] = useState<Option | null>(values[0]);

return (
<Box __width="200px">
<Combobox
options={values}
value={value}
size="large"
label="Label"
onChange={(value) => setValue(value)}
/>
</Box>
);
};

export const NoOptions = () => {
return (
<Box __width="200px">
Expand Down
8 changes: 7 additions & 1 deletion src/components/Multiselect/Dynamic/DynamicMultiselect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -217,9 +217,15 @@ const DynamicMultiselectInner = <T extends Option>(
{...getItemProps({
item,
index,
disabled: item.disabled,
})}
>
<Text size={getListTextSize(size)}>{item.label}</Text>
<Text
color={item.disabled ? "defaultDisabled" : undefined}
size={getListTextSize(size)}
>
{item.label}
</Text>
</List.Item>
))}

Expand Down
22 changes: 22 additions & 0 deletions src/components/Multiselect/Static/Multiselect.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -197,6 +197,28 @@ export const WithStringAsValues = () => {
);
};

export const WithDisabledOption = () => {
const [selectedItems, setSelectedItems] = useState(["Black"]);
const values = options.map((option) => {
return {
...option,
disabled: option.value === "Green",
};
});

return (
<Box __width={300}>
<Multiselect
label="Pick colors"
size="large"
value={selectedItems}
onChange={(values) => setSelectedItems(values)}
options={values}
/>
</Box>
);
};

export const Empty = () => {
return <Multiselect options={[]} value={[]} />;
};
Expand Down
8 changes: 7 additions & 1 deletion src/components/Multiselect/Static/Multiselect.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -200,9 +200,15 @@ const MultiselectInner = <T extends Option, V extends Option | string>(
{...getItemProps({
item,
index,
disabled: item.disabled,
})}
>
<Text size={getListTextSize(size)}>{item.label}</Text>
<Text
color={item.disabled ? "defaultDisabled" : undefined}
size={getListTextSize(size)}
>
{item.label}
</Text>
</List.Item>
))}

Expand Down
21 changes: 21 additions & 0 deletions src/components/Select/Select.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,27 @@ export const WithEllipsis = () => {
);
};

export const WithDisabledOption = () => {
const values: Option[] = options.map((option) => ({
...option,
disabled: option.value === "color-green",
}));

const [value, setValue] = useState("color-black");

return (
<Box __width="200px">
<Select
options={values}
value={value}
size="large"
label="Label"
onChange={(value) => setValue(value)}
/>
</Box>
);
};

export const Empty = () => {
return <Select options={options} value="" />;
};
Expand Down
7 changes: 6 additions & 1 deletion src/components/Select/Select.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -190,11 +190,16 @@ const SelectInner = <T extends Option, V extends Option | string>(
{...getItemProps({
item,
index,
disabled: item.disabled,
})}
active={highlightedIndex === index}
>
{item?.startAdornment}
<Text size={getListTextSize(size)} width="100%">
<Text
color={item.disabled ? "defaultDisabled" : undefined}
size={getListTextSize(size)}
width="100%"
>
{item.label}
</Text>
{item?.endAdornment}
Expand Down

0 comments on commit f032235

Please sign in to comment.