diff --git a/public/locales/en/common.json b/public/locales/en/common.json index 69d88305c..9724db9da 100644 --- a/public/locales/en/common.json +++ b/public/locales/en/common.json @@ -218,5 +218,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } diff --git a/src/components/search.jsx b/src/components/search.jsx index a53ab59d4..d6de8a304 100644 --- a/src/components/search.jsx +++ b/src/components/search.jsx @@ -1,8 +1,9 @@ import { useTranslation } from "react-i18next"; import { useEffect, useState, useRef } from "react"; import classNames from "classnames"; +import { resolveIcon } from "./services/item"; -export default function Search({bookmarks, services, searchString, setSearchString, isOpen, close}) { +export default function HomepageSearch({bookmarks, services, searchString, setSearchString, isOpen, close}) { const { t, i18n } = useTranslation(); const all = [...bookmarks.map(bg => bg.bookmarks).flat(), ...services.map(sg => sg.services).flat()]; @@ -23,7 +24,6 @@ export default function Search({bookmarks, services, searchString, setSearchStri setSearchString(""); close(false); const result = results[currentItemIndex]; - console.log("go to", result); window.open(result.href, '_blank'); } else if (event.key == "ArrowDown" && results[currentItemIndex + 1]) { setCurrentItemIndex(currentItemIndex + 1); @@ -68,24 +68,33 @@ export default function Search({bookmarks, services, searchString, setSearchStri
-
-
- +
+ 0 && "rounded-t-md", + results.length === 0 && "rounded-md", + "w-full p-4 m-0 border-0 border-b border-slate-700 focus:border-slate-700 focus:outline-0 focus:ring-0 text-sm md:text-xl text-theme-700 dark:text-theme-200 bg-theme-60 dark:bg-theme-800" + )} type="text" ref={searchField} value={searchString} onChange={handleSearchChange} onKeyDown={handleSearchKeyDown} />
    - {results.map((w, i) => { + {results.map((r, i) => { return (
  • - {w.name} + i === 0 && "mt-4", + i === currentItemIndex && "bg-theme-300/50 dark:bg-theme-700/50", + "flex flex-row items-center justify-between rounded-md text-sm md:text-xl m-2 py-2 px-4 cursor-pointer text-theme-700 dark:text-theme-200 dark:hover:text-theme-300 hover:bg-theme-200/50 dark:hover:bg-theme-900/30", + )} key={r.name}> +
    +
    + {r.icon && resolveIcon(r.icon)} + {r.abbr && r.abbr} +
    + {r.name} +
    +
    {r.abbr ? t("homepagesearch.bookmark") : t("homepagesearch.service")}
  • ) }) }
-
diff --git a/src/components/services/item.jsx b/src/components/services/item.jsx index 345e2d5c5..ea3bc6a0e 100644 --- a/src/components/services/item.jsx +++ b/src/components/services/item.jsx @@ -8,7 +8,7 @@ import Widget from "./widget"; import Docker from "widgets/docker/component"; import { SettingsContext } from "utils/contexts/settings"; -function resolveIcon(icon) { +export function resolveIcon(icon) { // direct or relative URLs if (icon.startsWith("http") || icon.startsWith("/")) { return logo; diff --git a/src/pages/index.jsx b/src/pages/index.jsx index 3d6a2298b..3b047e6e8 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -21,7 +21,7 @@ import { SettingsContext } from "utils/contexts/settings"; import { bookmarksResponse, servicesResponse, widgetsResponse } from "utils/config/api-response"; import ErrorBoundary from "components/errorboundry"; import themes from "utils/styles/themes"; -import Search from "components/search"; +import HomepageSearch from "components/search"; const ThemeToggle = dynamic(() => import("components/toggles/theme"), { ssr: false, @@ -195,7 +195,7 @@ function Home({ initialSettings }) { }, [i18n, settings, color, setColor, theme, setTheme]); const [searching, setSearching] = useState(false); - const [searchString, setSearchString] = useState(false); + const [searchString, setSearchString] = useState(""); useEffect(() => { document.addEventListener('keydown', handleKeyDown); @@ -240,7 +240,7 @@ function Home({ initialSettings }) { headerStyles[initialSettings.headerStyle || "underlined"] )} > - + {widgets && ( <> {widgets