diff --git a/frontend/dashboard/app/components/dropdown_select.tsx b/frontend/dashboard/app/components/dropdown_select.tsx index 9a87a9daf..003581eba 100644 --- a/frontend/dashboard/app/components/dropdown_select.tsx +++ b/frontend/dashboard/app/components/dropdown_select.tsx @@ -23,6 +23,7 @@ interface DropdownSelectProps { const DropdownSelect: React.FC = ({ title, type, items, initialSelected, onChangeSelected }) => { const [isOpen, setIsOpen] = useState(false); const [selected, setSelected] = useState(initialSelected); + const [searchText, setSearchText] = useState(''); const dropdownRef = useRef(null); useEffect(() => { @@ -61,6 +62,7 @@ const DropdownSelect: React.FC = ({ title, type, items, ini const toggleDropdown = () => { setIsOpen(!isOpen); + setSearchText('') }; const selectSingleItem = (item: string | AppVersion | OsVersion) => { @@ -141,6 +143,7 @@ const DropdownSelect: React.FC = ({ title, type, items, ini const groupSelectButtonStyle = "text-white text-xs font-display rounded-md border border-white p-1 bg-neutral-950 hover:text-black hover:bg-yellow-200 hover:border-black focus-visible:bg-yellow-200 focus-visible:text-black focus-visible:border-black active:bg-yellow-300 outline-none" const checkboxContainerStyle = "px-2 py-2 bg-neutral-950 truncate text-white hover:text-black hover:bg-yellow-200 font-display text-left" const checkboxInputStyle = "appearance-none border-white rounded-sm font-display bg-neutral-950 checked:bg-neutral-950 checked:hover:bg-neutral-950 checked:focus:bg-neutral-950 focus:ring-offset-yellow-200 focus:ring-0 checked:ring-1 checked:ring-white" + const searchInputStyle = "w-full bg-neutral-950 text-white text-sm border border-white rounded-md focus-visible:ring-yellow-300 py-2 px-4 font-sans placeholder:text-gray-400" return (
@@ -164,38 +167,94 @@ const DropdownSelect: React.FC = ({ title, type, items, ini aria-orientation="vertical" aria-labelledby="options-menu" > - {type === DropdownSelectType.SingleString && items.map((item) => ( - - ))} - {type === DropdownSelectType.SingleAppVersion && items.map((item) => ( - - ))} - {type === DropdownSelectType.SingleOsVersion && items.map((item) => ( - - ))} + {type === DropdownSelectType.SingleString && +
+ {(items as string[]).length > 1 &&
+ { + setSearchText(e.target.value) + }} + /> +
} + {items.filter((item) => (item as string).toLowerCase().includes(searchText.toLowerCase())).map((item) => ( + + ))} +
+ } + {type === DropdownSelectType.SingleAppVersion && +
+ {(items as AppVersion[]).length > 1 &&
+ { + setSearchText(e.target.value) + }} + /> +
} + {items.filter((item) => (item as AppVersion).displayName.toLowerCase().includes(searchText.toLowerCase())).map((item) => ( + + ))} +
+ } + {type === DropdownSelectType.SingleOsVersion && +
+ {(items as OsVersion[]).length > 1 &&
+ { + setSearchText(e.target.value) + }} + /> +
} + {items.filter((item) => (item as OsVersion).displayName.toLowerCase().includes(searchText.toLowerCase())).map((item) => ( + + ))} +
+ } {type === DropdownSelectType.MultiString &&
+ {(items as string[]).length > 1 &&
+ { + setSearchText(e.target.value) + }} + /> +
} {(items as string[]).length > 1 &&
} - {items.map((item) => ( + {items.filter((item) => (item as string).toLocaleLowerCase().includes(searchText.toLocaleLowerCase())).map((item) => (
= ({ title, type, items, ini } {type === DropdownSelectType.MultiOsVersion &&
+ {(items as OsVersion[]).length > 1 &&
+ { + setSearchText(e.target.value) + }} + /> +
} {(items as OsVersion[]).length > 1 &&
} - {items.map((item) => ( + {items.filter((item) => (item as OsVersion).displayName.toLocaleLowerCase().includes(searchText.toLocaleLowerCase())).map((item) => (
= ({ title, type, items, ini } {type === DropdownSelectType.MultiAppVersion &&
+ {(items as AppVersion[]).length > 1 &&
+ { + setSearchText(e.target.value) + }} + /> +
} {(items as AppVersion[]).length > 1 &&
} - {items.map((item) => ( + {items.filter((item) => (item as AppVersion).displayName.toLocaleLowerCase().includes(searchText.toLocaleLowerCase())).map((item) => (