openhands / src /components /features /settings /settings-dropdown-input.tsx
SaylorTwift's picture
SaylorTwift HF Staff
Add files using upload-large-folder tool
9b906ea verified
Raw
History Blame Contribute Delete
3.13 kB
import { Autocomplete, AutocompleteItem } from "@heroui/react";
import React, { ReactNode } from "react";
import { useTranslation } from "react-i18next";
import { OptionalTag } from "./optional-tag";
import { cn } from "#/utils/utils";
import { formControlSettingsFieldClassName } from "#/utils/form-control-classes";
import { heroUiAutocompleteSelectorButtonClassName } from "#/ui/combobox-caret";
import { I18nKey } from "#/i18n/declaration";
interface SettingsDropdownInputProps {
testId: string;
name: string;
items: { key: React.Key; label: string }[];
label?: ReactNode;
wrapperClassName?: string;
placeholder?: string;
showOptionalTag?: boolean;
isDisabled?: boolean;
isLoading?: boolean;
defaultSelectedKey?: string;
selectedKey?: string;
isClearable?: boolean;
allowsCustomValue?: boolean;
required?: boolean;
onSelectionChange?: (key: React.Key | null) => void;
onInputChange?: (value: string) => void;
defaultFilter?: (textValue: string, inputValue: string) => boolean;
startContent?: ReactNode;
inputWrapperClassName?: string;
inputClassName?: string;
}
export function SettingsDropdownInput({
testId,
label,
wrapperClassName,
name,
items,
placeholder,
showOptionalTag,
isDisabled,
isLoading,
defaultSelectedKey,
selectedKey,
isClearable,
allowsCustomValue,
required,
onSelectionChange,
onInputChange,
defaultFilter,
startContent,
inputWrapperClassName,
inputClassName,
}: SettingsDropdownInputProps) {
const { t } = useTranslation("openhands");
return (
<label
className={cn("flex flex-col gap-2.5 w-full min-w-0", 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 || isLoading}
isLoading={isLoading}
placeholder={isLoading ? t(I18nKey.HOME$LOADING) : placeholder}
allowsCustomValue={allowsCustomValue}
isRequired={required}
className="w-full"
classNames={{
popoverContent: "bg-content1 rounded-xl",
selectorButton: heroUiAutocompleteSelectorButtonClassName,
}}
selectorButtonProps={{ disableRipple: true }}
inputProps={{
classNames: {
inputWrapper: cn(
formControlSettingsFieldClassName,
inputWrapperClassName,
),
input: inputClassName,
},
}}
defaultFilter={defaultFilter}
startContent={startContent || null}
>
{(item) => (
<AutocompleteItem key={item.key}>{item.label}</AutocompleteItem>
)}
</Autocomplete>
</label>
);
}