mirror of
https://github.com/OpenHands/OpenHands.git
synced 2025-12-26 05:48:36 +08:00
78 lines
2.1 KiB
TypeScript
78 lines
2.1 KiB
TypeScript
import { Autocomplete, AutocompleteItem } from "@heroui/react";
|
|
import { ReactNode } from "react";
|
|
import { OptionalTag } from "./optional-tag";
|
|
import { cn } from "#/utils/utils";
|
|
|
|
interface SettingsDropdownInputProps {
|
|
testId: string;
|
|
name: string;
|
|
items: { key: React.Key; label: string }[];
|
|
label?: ReactNode;
|
|
wrapperClassName?: string;
|
|
placeholder?: string;
|
|
showOptionalTag?: boolean;
|
|
isDisabled?: boolean;
|
|
defaultSelectedKey?: string;
|
|
selectedKey?: string;
|
|
isClearable?: boolean;
|
|
onSelectionChange?: (key: React.Key | null) => void;
|
|
onInputChange?: (value: string) => void;
|
|
defaultFilter?: (textValue: string, inputValue: string) => boolean;
|
|
}
|
|
|
|
export function SettingsDropdownInput({
|
|
testId,
|
|
label,
|
|
wrapperClassName,
|
|
name,
|
|
items,
|
|
placeholder,
|
|
showOptionalTag,
|
|
isDisabled,
|
|
defaultSelectedKey,
|
|
selectedKey,
|
|
isClearable,
|
|
onSelectionChange,
|
|
onInputChange,
|
|
defaultFilter,
|
|
}: SettingsDropdownInputProps) {
|
|
return (
|
|
<label className={cn("flex flex-col gap-2.5", wrapperClassName)}>
|
|
{label && (
|
|
<div className="flex items-center gap-1">
|
|
<span className="text-sm">{label}</span>
|
|
{showOptionalTag && <OptionalTag />}
|
|
</div>
|
|
)}
|
|
<Autocomplete
|
|
aria-label={typeof label === "string" ? label : name}
|
|
data-testid={testId}
|
|
name={name}
|
|
defaultItems={items}
|
|
defaultSelectedKey={defaultSelectedKey}
|
|
selectedKey={selectedKey}
|
|
onSelectionChange={onSelectionChange}
|
|
onInputChange={onInputChange}
|
|
isClearable={isClearable}
|
|
isDisabled={isDisabled}
|
|
placeholder={placeholder}
|
|
className="w-full"
|
|
classNames={{
|
|
popoverContent: "bg-tertiary rounded-xl border border-[#717888]",
|
|
}}
|
|
inputProps={{
|
|
classNames: {
|
|
inputWrapper:
|
|
"bg-tertiary border border-[#717888] h-10 w-full rounded-sm p-2 placeholder:italic",
|
|
},
|
|
}}
|
|
defaultFilter={defaultFilter}
|
|
>
|
|
{(item) => (
|
|
<AutocompleteItem key={item.key}>{item.label}</AutocompleteItem>
|
|
)}
|
|
</Autocomplete>
|
|
</label>
|
|
);
|
|
}
|