diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx index a78ed598..4d99bb59 100644 --- a/src/components/quicklaunch.jsx +++ b/src/components/quicklaunch.jsx @@ -6,7 +6,7 @@ import { resolveIcon } from "./services/item"; import { SettingsContext } from "utils/contexts/settings"; -export default function QuickLaunch({servicesAndBookmarks, searchString, setSearchString, isOpen, close}) { +export default function QuickLaunch({servicesAndBookmarks, searchString, setSearchString, isOpen, close, searchDescriptions}) { const { t } = useTranslation(); const { settings } = useContext(SettingsContext); @@ -59,13 +59,27 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear useEffect(() => { if (searchString.length === 0) setResults([]); else { - const newResults = servicesAndBookmarks.filter(r => r.name.toLowerCase().includes(searchString)); + let newResults = servicesAndBookmarks.filter(r => { + const nameMatch = r.name.toLowerCase().includes(searchString); + let descriptionMatch; + if (searchDescriptions) { + descriptionMatch = r.description?.toLowerCase().includes(searchString) + r.priority = nameMatch ? 2 * (+nameMatch) : +descriptionMatch; // eslint-disable-line no-param-reassign + } + return nameMatch || descriptionMatch; + }); + + if (searchDescriptions) { + newResults = newResults.sort((a, b) => b.priority - a.priority); + } + setResults(newResults); + if (newResults.length) { setCurrentItemIndex(0); } } - }, [searchString, servicesAndBookmarks]); + }, [searchString, servicesAndBookmarks, searchDescriptions]); const [hidden, setHidden] = useState(true); @@ -87,6 +101,11 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear }, [isOpen, closeAndReset]); + function highlightText(text) { + const parts = text.split(new RegExp(`(${searchString})`, 'gi')); + return {parts.map(part => part.toLowerCase() === searchString.toLowerCase() ? {part} : part)}; + } + return (