Download src/components/features/settings/settings-dropdown-input.tsx from SaylorTwift/openhands: direct link, hf CLI and curl.
- Browser
- Download file 3.13 kB
-
https://huggingface.co/SaylorTwift/openhands/resolve/main/src/components/features/settings/settings-dropdown-input.tsx
- Command line
-
hf download hf://SaylorTwift/openhands/src/components/features/settings/settings-dropdown-input.tsx
-
curl -L -o settings-dropdown-input.tsx https://huggingface.co/SaylorTwift/openhands/resolve/main/src/components/features/settings/settings-dropdown-input.tsx
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> | |
| ); | |
| } | |