+
))}
}
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/12] 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 f61a14e0..9051c599 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 a1ce96d5..400d7eb5 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/12] 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 9051c599..4a3f345e 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/12] 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 4a3f345e..d40e50d0 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 (
diff --git a/src/pages/index.jsx b/src/pages/index.jsx
index 400d7eb5..bf64cc59 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/12] 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 d40e50d0..a78ed598 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 bf64cc59..7a0fdb08 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/12] 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 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 (
{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 7a0fdb08..a180c642 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/12] 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 4d99bb59..58d15cef 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(() => {