From fe770c3864afaf05512e8984335950f74e79a0e7 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Tue, 18 Oct 2022 23:10:44 -0700 Subject: [PATCH 01/39] Initial implentation --- src/components/search.jsx | 93 +++++++++++++++++++++++++++++++++++++++ src/pages/index.jsx | 30 +++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 src/components/search.jsx diff --git a/src/components/search.jsx b/src/components/search.jsx new file mode 100644 index 000000000..a53ab59d4 --- /dev/null +++ b/src/components/search.jsx @@ -0,0 +1,93 @@ +import { useTranslation } from "react-i18next"; +import { useEffect, useState, useRef } from "react"; +import classNames from "classnames"; + +export default function Search({bookmarks, services, searchString, setSearchString, isOpen, close}) { + const { t, i18n } = useTranslation(); + const all = [...bookmarks.map(bg => bg.bookmarks).flat(), ...services.map(sg => sg.services).flat()]; + + const searchField = useRef(); + + const [results, setResults] = useState([]); + const [currentItemIndex, setCurrentItemIndex] = useState(null); + + function handleSearchChange(event) { + setSearchString(event.target.value.toLowerCase()) + } + + function handleSearchKeyDown(event) { + if (event.key === "Escape") { + setSearchString(""); + close(false); + } else if (event.key === "Enter" && results.length) { + 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); + event.preventDefault(); + } else if (event.key == "ArrowUp" && currentItemIndex > 0) { + setCurrentItemIndex(currentItemIndex - 1); + event.preventDefault(); + } + } + + useEffect(() => { + if (searchString.length === 0) setResults([]); + else { + const newResults = all.filter(r => r.name.toLowerCase().includes(searchString)); + setResults(newResults); + if (newResults.length) { + setCurrentItemIndex(0); + } + } + }, [searchString]) + + + const [hidden, setHidden] = useState(true); + useEffect(() => { + if (isOpen) { + searchField.current.focus(); + setHidden(false); + } else { + setTimeout(() => { + setHidden(true); + }, 300); // disable on close + } + }, [isOpen]) + + return ( + + ); +} diff --git a/src/pages/index.jsx b/src/pages/index.jsx index b4eb50e18..3d6a2298b 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -21,6 +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"; const ThemeToggle = dynamic(() => import("components/toggles/theme"), { ssr: false, @@ -160,6 +161,11 @@ const headerStyles = { clean: "m-4 mb-0 sm:m-8 sm:mb-0", }; +function handleChange(event) { + // this.setState({value: event.target.value}); + console.log(event); +} + function Home({ initialSettings }) { const { i18n } = useTranslation(); const { theme, setTheme } = useContext(ThemeContext); @@ -188,6 +194,29 @@ function Home({ initialSettings }) { } }, [i18n, settings, color, setColor, theme, setTheme]); + const [searching, setSearching] = useState(false); + const [searchString, setSearchString] = useState(false); + + useEffect(() => { + document.addEventListener('keydown', handleKeyDown); + + function handleKeyDown(e) { + console.log(e.target.tagName, e.key, e); + if (e.target.tagName === "BODY") { + if (String.fromCharCode(e.keyCode).match(/(\w|\s)/g) && !(e. altKey || e.ctrlKey || e.metaKey || e.shiftKey)) { + setSearching(true); + } else if (e.key === "Escape") { + setSearchString(""); + setSearching(false); + } + } + } + + return function cleanup() { + document.removeEventListener('keydown', handleKeyDown); + } + }) + return ( <> @@ -211,6 +240,7 @@ function Home({ initialSettings }) { headerStyles[initialSettings.headerStyle || "underlined"] )} > + {widgets && ( <> {widgets From 3249c95a74327cc7e4109c31513066e9ab8dcc73 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 19 Oct 2022 00:26:54 -0700 Subject: [PATCH 02/39] Refactor homepage search, visual improvement --- public/locales/en/common.json | 4 ++++ src/components/search.jsx | 33 ++++++++++++++++++++------------ src/components/services/item.jsx | 2 +- src/pages/index.jsx | 6 +++--- 4 files changed, 29 insertions(+), 16 deletions(-) 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 From fa46c9a1a4e33b3f4efa58d8d17f84b190f6f560 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 19 Oct 2022 00:54:35 -0700 Subject: [PATCH 03/39] lint --- src/components/search.jsx | 67 +++++++++++++++++++-------------------- src/pages/index.jsx | 14 +++----- 2 files changed, 37 insertions(+), 44 deletions(-) diff --git a/src/components/search.jsx b/src/components/search.jsx index d6de8a304..ba15b42ac 100644 --- a/src/components/search.jsx +++ b/src/components/search.jsx @@ -1,11 +1,11 @@ import { useTranslation } from "react-i18next"; import { useEffect, useState, useRef } from "react"; import classNames from "classnames"; + import { resolveIcon } from "./services/item"; -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()]; +export default function HomepageSearch({bookmarksAndServices, searchString, setSearchString, isOpen, close}) { + const { t } = useTranslation(); const searchField = useRef(); @@ -25,10 +25,10 @@ export default function HomepageSearch({bookmarks, services, searchString, setSe close(false); const result = results[currentItemIndex]; window.open(result.href, '_blank'); - } else if (event.key == "ArrowDown" && results[currentItemIndex + 1]) { + } else if (event.key === "ArrowDown" && results[currentItemIndex + 1]) { setCurrentItemIndex(currentItemIndex + 1); event.preventDefault(); - } else if (event.key == "ArrowUp" && currentItemIndex > 0) { + } else if (event.key === "ArrowUp" && currentItemIndex > 0) { setCurrentItemIndex(currentItemIndex - 1); event.preventDefault(); } @@ -37,13 +37,13 @@ export default function HomepageSearch({bookmarks, services, searchString, setSe useEffect(() => { if (searchString.length === 0) setResults([]); else { - const newResults = all.filter(r => r.name.toLowerCase().includes(searchString)); + const newResults = bookmarksAndServices.filter(r => r.name.toLowerCase().includes(searchString)); setResults(newResults); if (newResults.length) { setCurrentItemIndex(0); } } - }, [searchString]) + }, [searchString, bookmarksAndServices]) const [hidden, setHidden] = useState(true); @@ -65,38 +65,35 @@ export default function HomepageSearch({bookmarks, services, searchString, setSe !hidden && isOpen && "opacity-100", !isOpen && "opacity-0", )} role="dialog" aria-modal="true"> -
+
-
- 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((r, i) => { - return ( -
  • -
    -
    - {r.icon && resolveIcon(r.icon)} - {r.abbr && r.abbr} -
    - {r.name} -
    -
    {r.abbr ? t("homepagesearch.bookmark") : t("homepagesearch.service")}
    -
  • ) - }) - } -
-
+
+ 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.length > 0 &&
    + {results.map((r, i) => ( +
  • +
    +
    + {r.icon && resolveIcon(r.icon)} + {r.abbr && r.abbr} +
    + {r.name} +
    +
    {r.abbr ? t("homepagesearch.bookmark") : t("homepagesearch.service")}
    +
  • + ))} +
}
+
); } diff --git a/src/pages/index.jsx b/src/pages/index.jsx index 3b047e6e8..efedf83d8 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -161,11 +161,6 @@ const headerStyles = { clean: "m-4 mb-0 sm:m-8 sm:mb-0", }; -function handleChange(event) { - // this.setState({value: event.target.value}); - console.log(event); -} - function Home({ initialSettings }) { const { i18n } = useTranslation(); const { theme, setTheme } = useContext(ThemeContext); @@ -179,6 +174,8 @@ function Home({ initialSettings }) { const { data: services } = useSWR("/api/services"); const { data: bookmarks } = useSWR("/api/bookmarks"); const { data: widgets } = useSWR("/api/widgets"); + + const bookmarksAndServices = [...bookmarks.map(bg => bg.bookmarks).flat(), ...services.map(sg => sg.services).flat()] useEffect(() => { if (settings.language) { @@ -198,10 +195,7 @@ function Home({ initialSettings }) { const [searchString, setSearchString] = useState(""); useEffect(() => { - document.addEventListener('keydown', handleKeyDown); - function handleKeyDown(e) { - console.log(e.target.tagName, e.key, e); if (e.target.tagName === "BODY") { if (String.fromCharCode(e.keyCode).match(/(\w|\s)/g) && !(e. altKey || e.ctrlKey || e.metaKey || e.shiftKey)) { setSearching(true); @@ -212,6 +206,8 @@ function Home({ initialSettings }) { } } + document.addEventListener('keydown', handleKeyDown); + return function cleanup() { document.removeEventListener('keydown', handleKeyDown); } @@ -240,7 +236,7 @@ function Home({ initialSettings }) { headerStyles[initialSettings.headerStyle || "underlined"] )} > - + {widgets && ( <> {widgets From db9633496b17612ba5bdeb356174fa8a62f9749b Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 19 Oct 2022 09:04:34 -0700 Subject: [PATCH 04/39] Handle clicking items --- src/components/search.jsx | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/components/search.jsx b/src/components/search.jsx index ba15b42ac..596efc459 100644 --- a/src/components/search.jsx +++ b/src/components/search.jsx @@ -12,17 +12,20 @@ export default function HomepageSearch({bookmarksAndServices, searchString, setS const [results, setResults] = useState([]); const [currentItemIndex, setCurrentItemIndex] = useState(null); + function resetAndClose() { + setSearchString(""); + close(false); + } + function handleSearchChange(event) { setSearchString(event.target.value.toLowerCase()) } function handleSearchKeyDown(event) { if (event.key === "Escape") { - setSearchString(""); - close(false); + resetAndClose(); } else if (event.key === "Enter" && results.length) { - setSearchString(""); - close(false); + resetAndClose(); const result = results[currentItemIndex]; window.open(result.href, '_blank'); } else if (event.key === "ArrowDown" && results[currentItemIndex + 1]) { @@ -34,6 +37,10 @@ export default function HomepageSearch({bookmarksAndServices, searchString, setS } } + function handleItemClick() { + resetAndClose(); + } + useEffect(() => { if (searchString.length === 0) setResults([]); else { @@ -76,18 +83,20 @@ export default function HomepageSearch({bookmarksAndServices, searchString, setS )} type="text" ref={searchField} value={searchString} onChange={handleSearchChange} onKeyDown={handleSearchKeyDown} /> {results.length > 0 && } From ba4a1eb6460f1035e10b801c53a9d30d13b82582 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 19 Oct 2022 13:55:18 -0700 Subject: [PATCH 05/39] Refactor, better handle mouseover --- src/components/{search.jsx => quicklaunch.jsx} | 10 +++++++--- src/pages/index.jsx | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) rename src/components/{search.jsx => quicklaunch.jsx} (92%) diff --git a/src/components/search.jsx b/src/components/quicklaunch.jsx similarity index 92% rename from src/components/search.jsx rename to src/components/quicklaunch.jsx index 596efc459..6fe15c579 100644 --- a/src/components/search.jsx +++ b/src/components/quicklaunch.jsx @@ -4,7 +4,7 @@ import classNames from "classnames"; import { resolveIcon } from "./services/item"; -export default function HomepageSearch({bookmarksAndServices, searchString, setSearchString, isOpen, close}) { +export default function QuickLaunch({bookmarksAndServices, searchString, setSearchString, isOpen, close}) { const { t } = useTranslation(); const searchField = useRef(); @@ -37,6 +37,10 @@ export default function HomepageSearch({bookmarksAndServices, searchString, setS } } + function handleItemHover(event) { + setCurrentItemIndex(parseInt(event.target?.dataset?.index)); + } + function handleItemClick() { resetAndClose(); } @@ -84,9 +88,9 @@ export default function HomepageSearch({bookmarksAndServices, searchString, setS {results.length > 0 &&
    {results.map((r, i) => (
  • -
    diff --git a/src/pages/index.jsx b/src/pages/index.jsx index efedf83d8..a1ce96d5e 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 HomepageSearch from "components/search"; +import QuickLaunch from "components/quicklaunch"; const ThemeToggle = dynamic(() => import("components/toggles/theme"), { ssr: false, @@ -236,7 +236,7 @@ function Home({ initialSettings }) { headerStyles[initialSettings.headerStyle || "underlined"] )} > - + {widgets && ( <> {widgets From b5410eea12bcb0d8236f066ec2315ed8f510f0e0 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 19 Oct 2022 14:23:51 -0700 Subject: [PATCH 06/39] fix quicklaunch hover bug on open --- src/components/quicklaunch.jsx | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx index 6fe15c579..f61a14e06 100644 --- a/src/components/quicklaunch.jsx +++ b/src/components/quicklaunch.jsx @@ -12,6 +12,11 @@ export default function QuickLaunch({bookmarksAndServices, searchString, setSear const [results, setResults] = useState([]); const [currentItemIndex, setCurrentItemIndex] = useState(null); + function openCurrentItem() { + const result = results[currentItemIndex]; + window.open(result.href, '_blank'); + } + function resetAndClose() { setSearchString(""); close(false); @@ -26,8 +31,7 @@ export default function QuickLaunch({bookmarksAndServices, searchString, setSear resetAndClose(); } else if (event.key === "Enter" && results.length) { resetAndClose(); - const result = results[currentItemIndex]; - window.open(result.href, '_blank'); + openCurrentItem(); } else if (event.key === "ArrowDown" && results[currentItemIndex + 1]) { setCurrentItemIndex(currentItemIndex + 1); event.preventDefault(); @@ -43,6 +47,7 @@ export default function QuickLaunch({bookmarksAndServices, searchString, setSear function handleItemClick() { resetAndClose(); + openCurrentItem(); } useEffect(() => { @@ -85,22 +90,22 @@ export default function QuickLaunch({bookmarksAndServices, searchString, setSear 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.length > 0 &&
      + {results.length > 0 && } From 484d69a4b571213d26c5488aefc9199329720b41 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 19 Oct 2022 14:29:30 -0700 Subject: [PATCH 07/39] services should come first --- src/components/quicklaunch.jsx | 6 +++--- src/pages/index.jsx | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx index f61a14e06..9051c599d 100644 --- a/src/components/quicklaunch.jsx +++ b/src/components/quicklaunch.jsx @@ -4,7 +4,7 @@ import classNames from "classnames"; import { resolveIcon } from "./services/item"; -export default function QuickLaunch({bookmarksAndServices, searchString, setSearchString, isOpen, close}) { +export default function QuickLaunch({servicesAndBookmarks, searchString, setSearchString, isOpen, close}) { const { t } = useTranslation(); const searchField = useRef(); @@ -53,13 +53,13 @@ export default function QuickLaunch({bookmarksAndServices, searchString, setSear useEffect(() => { if (searchString.length === 0) setResults([]); else { - const newResults = bookmarksAndServices.filter(r => r.name.toLowerCase().includes(searchString)); + const newResults = servicesAndBookmarks.filter(r => r.name.toLowerCase().includes(searchString)); setResults(newResults); if (newResults.length) { setCurrentItemIndex(0); } } - }, [searchString, bookmarksAndServices]) + }, [searchString, servicesAndBookmarks]) const [hidden, setHidden] = useState(true); diff --git a/src/pages/index.jsx b/src/pages/index.jsx index a1ce96d5e..400d7eb5a 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -175,7 +175,7 @@ function Home({ initialSettings }) { const { data: bookmarks } = useSWR("/api/bookmarks"); const { data: widgets } = useSWR("/api/widgets"); - const bookmarksAndServices = [...bookmarks.map(bg => bg.bookmarks).flat(), ...services.map(sg => sg.services).flat()] + const servicesAndBookmarks = [...services.map(sg => sg.services).flat(), ...bookmarks.map(bg => bg.bookmarks).flat()] useEffect(() => { if (settings.language) { @@ -236,7 +236,7 @@ function Home({ initialSettings }) { headerStyles[initialSettings.headerStyle || "underlined"] )} > - + {widgets && ( <> {widgets From a1788b01c37715b3c17df5cfc701dc38a94ad387 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 19 Oct 2022 17:10:01 -0700 Subject: [PATCH 08/39] Show description in quicklook --- src/components/quicklaunch.jsx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx index 9051c599d..4a3f345e8 100644 --- a/src/components/quicklaunch.jsx +++ b/src/components/quicklaunch.jsx @@ -42,7 +42,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear } function handleItemHover(event) { - setCurrentItemIndex(parseInt(event.target?.dataset?.index)); + setCurrentItemIndex(parseInt(event.target?.dataset?.index, 10)); } function handleItemClick() { @@ -84,7 +84,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
      -
      +
      0 && "rounded-t-md", results.length === 0 && "rounded-md", @@ -93,7 +93,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear {results.length > 0 &&
        {results.map((r, i) => (
      • -
      - {r.name} +
      + {r.name} + {r.description && {r.description}} +
      -
      {r.abbr ? t("homepagesearch.bookmark") : t("homepagesearch.service")}
      +
      {r.abbr ? t("homepagesearch.bookmark") : t("homepagesearch.service")}
      ))} From 5abe13c7261baf4eb2c2333fd527d88064841982 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 19 Oct 2022 20:16:29 -0700 Subject: [PATCH 09/39] Handle click to close, close animation timing --- src/components/quicklaunch.jsx | 33 +++++++++++++++++++++------------ src/pages/index.jsx | 2 +- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx index 4a3f345e8..d40e50d0a 100644 --- a/src/components/quicklaunch.jsx +++ b/src/components/quicklaunch.jsx @@ -1,5 +1,5 @@ import { useTranslation } from "react-i18next"; -import { useEffect, useState, useRef } from "react"; +import { useEffect, useState, useRef, useCallback } from "react"; import classNames from "classnames"; import { resolveIcon } from "./services/item"; @@ -17,10 +17,12 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear window.open(result.href, '_blank'); } - function resetAndClose() { - setSearchString(""); + const closeAndReset = useCallback(() => { close(false); - } + setTimeout(() => { + setSearchString(""); + }, 200); // delay a little for animations + }, [close, setSearchString]); function handleSearchChange(event) { setSearchString(event.target.value.toLowerCase()) @@ -28,9 +30,9 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear function handleSearchKeyDown(event) { if (event.key === "Escape") { - resetAndClose(); + closeAndReset(); } else if (event.key === "Enter" && results.length) { - resetAndClose(); + closeAndReset(); openCurrentItem(); } else if (event.key === "ArrowDown" && results[currentItemIndex + 1]) { setCurrentItemIndex(currentItemIndex + 1); @@ -46,7 +48,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear } function handleItemClick() { - resetAndClose(); + closeAndReset(); openCurrentItem(); } @@ -59,20 +61,27 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear setCurrentItemIndex(0); } } - }, [searchString, servicesAndBookmarks]) + }, [searchString, servicesAndBookmarks]); const [hidden, setHidden] = useState(true); useEffect(() => { + function handleBackdropClick(event) { + if (event.target?.tagName === "DIV") closeAndReset(); + } + if (isOpen) { searchField.current.focus(); + document.body.addEventListener('click', handleBackdropClick); setHidden(false); } else { + document.body.removeEventListener('click', handleBackdropClick); setTimeout(() => { setHidden(true); }, 300); // disable on close } - }, [isOpen]) + + }, [isOpen, closeAndReset]); return (
      -
      + 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} /> + )} type="text" autoCorrect="false" ref={searchField} value={searchString} onChange={handleSearchChange} onKeyDown={handleSearchKeyDown} /> {results.length > 0 &&
        {results.map((r, i) => (
      • @@ -112,7 +121,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear
      • ))}
      } -
      +
      diff --git a/src/pages/index.jsx b/src/pages/index.jsx index 400d7eb5a..bf64cc595 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -209,7 +209,7 @@ function Home({ initialSettings }) { document.addEventListener('keydown', handleKeyDown); return function cleanup() { - document.removeEventListener('keydown', handleKeyDown); + document.removeEventListener('keydown', handleKeyDown); } }) From f62021633b601475f461550054e49deaa8478e6b Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 19 Oct 2022 23:07:01 -0700 Subject: [PATCH 10/39] Respect settings target and allow command override --- src/components/quicklaunch.jsx | 18 +++++++++++------- src/pages/index.jsx | 2 +- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx index d40e50d0a..a78ed5981 100644 --- a/src/components/quicklaunch.jsx +++ b/src/components/quicklaunch.jsx @@ -1,28 +1,32 @@ import { useTranslation } from "react-i18next"; -import { useEffect, useState, useRef, useCallback } from "react"; +import { useEffect, useState, useRef, useCallback, useContext } from "react"; import classNames from "classnames"; import { resolveIcon } from "./services/item"; +import { SettingsContext } from "utils/contexts/settings"; + export default function QuickLaunch({servicesAndBookmarks, searchString, setSearchString, isOpen, close}) { const { t } = useTranslation(); + const { settings } = useContext(SettingsContext); const searchField = useRef(); const [results, setResults] = useState([]); const [currentItemIndex, setCurrentItemIndex] = useState(null); - function openCurrentItem() { + function openCurrentItem(newWindow) { const result = results[currentItemIndex]; - window.open(result.href, '_blank'); + window.open(result.href, newWindow ? "_blank" : settings.target ?? "_blank"); } const closeAndReset = useCallback(() => { close(false); setTimeout(() => { setSearchString(""); + setCurrentItemIndex(null); }, 200); // delay a little for animations - }, [close, setSearchString]); + }, [close, setSearchString, setCurrentItemIndex]); function handleSearchChange(event) { setSearchString(event.target.value.toLowerCase()) @@ -33,7 +37,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear closeAndReset(); } else if (event.key === "Enter" && results.length) { closeAndReset(); - openCurrentItem(); + openCurrentItem(event.metaKey); } else if (event.key === "ArrowDown" && results[currentItemIndex + 1]) { setCurrentItemIndex(currentItemIndex + 1); event.preventDefault(); @@ -47,9 +51,9 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear setCurrentItemIndex(parseInt(event.target?.dataset?.index, 10)); } - function handleItemClick() { + function handleItemClick(event) { closeAndReset(); - openCurrentItem(); + openCurrentItem(event.metaKey); } useEffect(() => { diff --git a/src/pages/index.jsx b/src/pages/index.jsx index bf64cc595..7a0fdb087 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -197,7 +197,7 @@ function Home({ initialSettings }) { useEffect(() => { function handleKeyDown(e) { if (e.target.tagName === "BODY") { - if (String.fromCharCode(e.keyCode).match(/(\w|\s)/g) && !(e. altKey || e.ctrlKey || e.metaKey || e.shiftKey)) { + if (String.fromCharCode(e.keyCode).match(/(\w|\s)/g) && !(e.altKey || e.ctrlKey || e.metaKey || e.shiftKey)) { setSearching(true); } else if (e.key === "Escape") { setSearchString(""); From 9c1c0e44655c393ec6b448f71558a93e44270afe Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 20 Oct 2022 11:12:47 -0700 Subject: [PATCH 11/39] Add quicklook searchDescriptions option --- src/components/quicklaunch.jsx | 31 +++++++++++++++++++++++++++---- src/pages/index.jsx | 9 ++++++++- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx index a78ed5981..4d99bb597 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 (
      {r.name} - {r.description && {r.description}} + {r.description && + + {searchDescriptions && r.priority < 2 ? highlightText(r.description) : r.description} + + }
      {r.abbr ? t("homepagesearch.bookmark") : t("homepagesearch.service")}
      diff --git a/src/pages/index.jsx b/src/pages/index.jsx index 7a0fdb087..a180c6422 100644 --- a/src/pages/index.jsx +++ b/src/pages/index.jsx @@ -236,7 +236,14 @@ function Home({ initialSettings }) { headerStyles[initialSettings.headerStyle || "underlined"] )} > - + {widgets && ( <> {widgets From 689e2a80117f9b8e6372b6ce6e4f7de4e463b2b2 Mon Sep 17 00:00:00 2001 From: Michael Shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 20 Oct 2022 11:35:21 -0700 Subject: [PATCH 12/39] Quicklook support individual item target --- src/components/quicklaunch.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/quicklaunch.jsx b/src/components/quicklaunch.jsx index 4d99bb597..58d15cef2 100644 --- a/src/components/quicklaunch.jsx +++ b/src/components/quicklaunch.jsx @@ -17,7 +17,7 @@ export default function QuickLaunch({servicesAndBookmarks, searchString, setSear function openCurrentItem(newWindow) { const result = results[currentItemIndex]; - window.open(result.href, newWindow ? "_blank" : settings.target ?? "_blank"); + window.open(result.href, newWindow ? "_blank" : result.target ?? settings.target ?? "_blank"); } const closeAndReset = useCallback(() => { From 1a4cbd1d363b25630621abfa352466e24b2b912b Mon Sep 17 00:00:00 2001 From: Nonoss117 Date: Fri, 21 Oct 2022 04:42:50 +0000 Subject: [PATCH 13/39] Translated using Weblate (French) Currently translated at 100.0% (144 of 144 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/ --- public/locales/fr/common.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index f6429c492..d1622ade1 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -47,7 +47,7 @@ "wanted": "Demande", "queued": "En attente", "movies": "Films", - "missing": "Missing" + "missing": "Manquant" }, "readarr": { "wanted": "Demande", From 838ed5de0733219d87e8d859f6fa4ebde51dbb1d Mon Sep 17 00:00:00 2001 From: hunkyn Date: Fri, 21 Oct 2022 02:13:56 +0000 Subject: [PATCH 14/39] Translated using Weblate (Telugu) Currently translated at 100.0% (144 of 144 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/ --- public/locales/te/common.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/locales/te/common.json b/public/locales/te/common.json index e367d409a..c85815026 100644 --- a/public/locales/te/common.json +++ b/public/locales/te/common.json @@ -92,7 +92,7 @@ "wanted": "కావలెను", "queued": "క్యూయూఎడ్", "movies": "సినిమాలు", - "missing": "Missing" + "missing": "మిస్సింగ్" }, "lidarr": { "wanted": "కావలెను", @@ -192,11 +192,11 @@ "up": "అప్", "down": "డౌన్", "wait": "దయచేసి వేచి ఉండండి", - "lan": "LAN", + "lan": "లాన్", "wlan": "WLAN", - "devices": "Devices", - "lan_devices": "LAN Devices", - "wlan_devices": "WLAN Devices" + "devices": "పరికరాలు", + "lan_devices": "LAN పరికరాలు", + "wlan_devices": "WLAN పరికరాలు" }, "plex": { "streams": "యాక్టివ్ స్ట్రీమ్‌లు", From 573fed68a49df95626a5849365ab17ae64192be1 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:41 +0000 Subject: [PATCH 15/39] Translated using Weblate (German) Currently translated at 90.4% (132 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/de/ --- public/locales/de/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/de/common.json b/public/locales/de/common.json index 05e5834b7..9d9ed6bc2 100644 --- a/public/locales/de/common.json +++ b/public/locales/de/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "RAM", "wait": "Bitte warten" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 6ee976774742772cb4c17b62cd7a605f385c8b40 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:41 +0000 Subject: [PATCH 16/39] Translated using Weblate (Spanish) Currently translated at 94.5% (138 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/es/ --- public/locales/es/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/es/common.json b/public/locales/es/common.json index 862162f8c..10724e675 100644 --- a/public/locales/es/common.json +++ b/public/locales/es/common.json @@ -207,5 +207,9 @@ "cpu": "Procesador", "mem": "Memoria", "wait": "Espere por favor" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 803fbac8405f80dca622ead8d3a9498e9ec2b366 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:41 +0000 Subject: [PATCH 17/39] Translated using Weblate (French) Currently translated at 98.6% (144 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fr/ --- public/locales/fr/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/fr/common.json b/public/locales/fr/common.json index d1622ade1..0b81a28c5 100644 --- a/public/locales/fr/common.json +++ b/public/locales/fr/common.json @@ -207,5 +207,9 @@ "cpu": "Cpu", "mem": "Mém", "wait": "Merci de patienter" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 06ec26c5d0ebd50d07fc30b19c03d64bcd00b2f1 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:41 +0000 Subject: [PATCH 18/39] Translated using Weblate (Portuguese) Currently translated at 78.7% (115 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt/ --- public/locales/pt/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/pt/common.json b/public/locales/pt/common.json index 96d818642..53ba73efb 100644 --- a/public/locales/pt/common.json +++ b/public/locales/pt/common.json @@ -218,5 +218,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From c6c82cc05838c55f5255a6a4145b60ef83931dd7 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:41 +0000 Subject: [PATCH 19/39] Translated using Weblate (Russian) Currently translated at 15.7% (23 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ru/ --- public/locales/ru/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/ru/common.json b/public/locales/ru/common.json index e20e3084e..dabdcf290 100644 --- a/public/locales/ru/common.json +++ b/public/locales/ru/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 190c5b731e615f1f045f8f4eea94042ddd5c6641 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:41 +0000 Subject: [PATCH 20/39] Translated using Weblate (Chinese (Simplified)) Currently translated at 94.5% (138 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hans/ --- public/locales/zh-CN/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/zh-CN/common.json b/public/locales/zh-CN/common.json index ec3cc2bfc..da1e4a35e 100644 --- a/public/locales/zh-CN/common.json +++ b/public/locales/zh-CN/common.json @@ -207,5 +207,9 @@ "cpu": "处理器", "mem": "内存", "wait": "请稍等" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 09844d55e2e16f9005e19420ffb5e97582a65168 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:42 +0000 Subject: [PATCH 21/39] Translated using Weblate (Italian) Currently translated at 52.7% (77 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/it/ --- public/locales/it/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/it/common.json b/public/locales/it/common.json index 4d673e3d7..edc397cd8 100644 --- a/public/locales/it/common.json +++ b/public/locales/it/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 2bbab5ec8a9c1eaa289934db0895cb383e47f3d2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:41 +0000 Subject: [PATCH 22/39] =?UTF-8?q?Translated=20using=20Weblate=20(Norwegian?= =?UTF-8?q?=20Bokm=C3=A5l)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Currently translated at 54.1% (79 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nb_NO/ --- public/locales/nb-NO/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/nb-NO/common.json b/public/locales/nb-NO/common.json index b9b7cdf63..1e7484e14 100644 --- a/public/locales/nb-NO/common.json +++ b/public/locales/nb-NO/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 296d0131fd4b327dfbe841a29cdd7b4edebcd001 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:42 +0000 Subject: [PATCH 23/39] Translated using Weblate (Vietnamese) Currently translated at 30.1% (44 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/vi/ --- public/locales/vi/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/vi/common.json b/public/locales/vi/common.json index b00128e80..3f347af24 100644 --- a/public/locales/vi/common.json +++ b/public/locales/vi/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From bac42138718e359e31a74541054783fe97ecab3a Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:42 +0000 Subject: [PATCH 24/39] Translated using Weblate (Dutch) Currently translated at 43.1% (63 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/nl/ --- public/locales/nl/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/nl/common.json b/public/locales/nl/common.json index d8206f53c..38af7341e 100644 --- a/public/locales/nl/common.json +++ b/public/locales/nl/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 99ee02c830e272573626d8ac244fc8dc18a67899 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:42 +0000 Subject: [PATCH 25/39] Translated using Weblate (Chinese (Traditional)) Currently translated at 6.1% (9 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/zh_Hant/ --- public/locales/zh-Hant/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/zh-Hant/common.json b/public/locales/zh-Hant/common.json index a7a343676..b2a8d99c0 100644 --- a/public/locales/zh-Hant/common.json +++ b/public/locales/zh-Hant/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From caf05dd5308ad22060e9dfa8f8a8add9d9f14540 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:40 +0000 Subject: [PATCH 26/39] Translated using Weblate (Catalan) Currently translated at 89.7% (131 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ca/ --- public/locales/ca/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/ca/common.json b/public/locales/ca/common.json index e40c5b0d1..1971c3ff5 100644 --- a/public/locales/ca/common.json +++ b/public/locales/ca/common.json @@ -207,5 +207,9 @@ "cpu": "Processador", "mem": "Memòria", "wait": "Si us plau, espereu" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 8404fad870fe0e187f336113c4fd7e0f77d5e8d1 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:40 +0000 Subject: [PATCH 27/39] Translated using Weblate (Polish) Currently translated at 67.1% (98 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pl/ --- public/locales/pl/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/pl/common.json b/public/locales/pl/common.json index 6c0a7377b..2b492d877 100644 --- a/public/locales/pl/common.json +++ b/public/locales/pl/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From c82328dcb22ac87a02bb15d2a3d6a1fe00e5aa8d Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:38 +0000 Subject: [PATCH 28/39] Translated using Weblate (Swedish) Currently translated at 89.0% (130 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sv/ --- public/locales/sv/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/sv/common.json b/public/locales/sv/common.json index e91e6474e..9bb45161c 100644 --- a/public/locales/sv/common.json +++ b/public/locales/sv/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Vänligen vänta" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 13e7ae8d21ebd39f5f771fcb74a8337bf3b041eb Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:39 +0000 Subject: [PATCH 29/39] Translated using Weblate (Croatian) Currently translated at 84.2% (123 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hr/ --- public/locales/hr/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/hr/common.json b/public/locales/hr/common.json index 9e8bc13fe..a00bcaadb 100644 --- a/public/locales/hr/common.json +++ b/public/locales/hr/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 9ea166bdd3b83903cde8f141497ece686a771ecb Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:40 +0000 Subject: [PATCH 30/39] Translated using Weblate (Hungarian) Currently translated at 73.9% (108 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/hu/ --- public/locales/hu/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/hu/common.json b/public/locales/hu/common.json index ec15d5e64..bc76c1f31 100644 --- a/public/locales/hu/common.json +++ b/public/locales/hu/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 653a000ae7bf5e46dc6ce7d7cb175c9cb7568501 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:39 +0000 Subject: [PATCH 31/39] Translated using Weblate (Hebrew) Currently translated at 69.1% (101 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/he/ --- public/locales/he/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/he/common.json b/public/locales/he/common.json index 5d0d41536..46cd144af 100644 --- a/public/locales/he/common.json +++ b/public/locales/he/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 142ac829107d624f6e45d3e05734b2b6a612e975 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:39 +0000 Subject: [PATCH 32/39] Translated using Weblate (Romanian) Currently translated at 93.8% (137 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/ro/ --- public/locales/ro/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/ro/common.json b/public/locales/ro/common.json index 645b71823..1ed28d2da 100644 --- a/public/locales/ro/common.json +++ b/public/locales/ro/common.json @@ -207,5 +207,9 @@ "cpu": "Procesor", "mem": "Memorie", "wait": "Te rugam sa astepti" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 6052b6dd0dd8334bab9652e2cdd2faf2d7723ee2 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:39 +0000 Subject: [PATCH 33/39] Translated using Weblate (Portuguese (Brazil)) Currently translated at 78.7% (115 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/pt_BR/ --- public/locales/pt-BR/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/pt-BR/common.json b/public/locales/pt-BR/common.json index 9d38815b7..4dbd1d3ed 100644 --- a/public/locales/pt-BR/common.json +++ b/public/locales/pt-BR/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 973029aa3e4512c9b43f3736a10e9b2251db7410 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:40 +0000 Subject: [PATCH 34/39] Translated using Weblate (Yue) Currently translated at 80.8% (118 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/yue/ --- public/locales/yue/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/yue/common.json b/public/locales/yue/common.json index 4f7622b54..cb98c0776 100644 --- a/public/locales/yue/common.json +++ b/public/locales/yue/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 4f65af78d23919626a5f21ebaf63bbb6a2d7a38c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:40 +0000 Subject: [PATCH 35/39] Translated using Weblate (Finnish) Currently translated at 84.2% (123 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/fi/ --- public/locales/fi/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/fi/common.json b/public/locales/fi/common.json index 0a3e50c2e..b419ee32f 100644 --- a/public/locales/fi/common.json +++ b/public/locales/fi/common.json @@ -207,5 +207,9 @@ "wait": "Please wait", "cpu": "CPU", "mem": "MEM" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 3cd6a6df4ad73ab9ee6797281837b44d16ec57e6 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:40 +0000 Subject: [PATCH 36/39] Translated using Weblate (Telugu) Currently translated at 98.6% (144 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/te/ --- public/locales/te/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/te/common.json b/public/locales/te/common.json index c85815026..f97af7c94 100644 --- a/public/locales/te/common.json +++ b/public/locales/te/common.json @@ -207,5 +207,9 @@ "cpu": "సీపియూ", "mem": "MEM", "wait": "దయచేసి వేచి ఉండండి" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 8244601d400909ecda6d47cbf3bb0fcba2eb1593 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:41 +0000 Subject: [PATCH 37/39] Translated using Weblate (Bulgarian) Currently translated at 31.5% (46 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/bg/ --- public/locales/bg/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/bg/common.json b/public/locales/bg/common.json index 8faf6d864..5eae86002 100644 --- a/public/locales/bg/common.json +++ b/public/locales/bg/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 08c94d3cee5fefe2fbdf521b8258cc0e6128785c Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:39 +0000 Subject: [PATCH 38/39] Translated using Weblate (Turkish) Currently translated at 78.0% (114 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/tr/ --- public/locales/tr/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/tr/common.json b/public/locales/tr/common.json index 6f4b7d242..13f0086ad 100644 --- a/public/locales/tr/common.json +++ b/public/locales/tr/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } } From 1174e299e0e73638707d0d73524c15773808cdb1 Mon Sep 17 00:00:00 2001 From: Anonymous Date: Fri, 21 Oct 2022 08:11:39 +0000 Subject: [PATCH 39/39] Translated using Weblate (Serbian) Currently translated at 6.1% (9 of 146 strings) Translation: Homepage/Homepage Translate-URL: https://hosted.weblate.org/projects/homepage/homepage/sr/ --- public/locales/sr/common.json | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/public/locales/sr/common.json b/public/locales/sr/common.json index 777d1e1cc..34c796b65 100644 --- a/public/locales/sr/common.json +++ b/public/locales/sr/common.json @@ -207,5 +207,9 @@ "cpu": "CPU", "mem": "MEM", "wait": "Please wait" + }, + "homepagesearch": { + "bookmark": "Bookmark", + "service": "Service" } }