aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMohamed Bassem <me@mbassem.com>2025-01-02 11:45:31 +0000
committerMohamed Bassem <me@mbassem.com>2025-01-02 11:45:51 +0000
commit3bcb1e10d3e97309ff8ede707dc5c3c057ba27ca (patch)
tree3e91a26863a1476059bbac111f6d6bf39a909fba
parent5ecdc36b7d60aa66b49e01e9fec8ba61ad537376 (diff)
downloadkarakeep-3bcb1e10d3e97309ff8ede707dc5c3c057ba27ca.tar.zst
fix: Add i18n for query explainer and add missing url matcher
-rw-r--r--apps/browser-extension/tsconfig.json2
-rw-r--r--apps/web/components/dashboard/search/QueryExplainerTooltip.tsx71
-rw-r--r--apps/web/lib/i18n/locales/en/translation.json23
-rw-r--r--packages/trpc/lib/search.ts1
4 files changed, 82 insertions, 15 deletions
diff --git a/apps/browser-extension/tsconfig.json b/apps/browser-extension/tsconfig.json
index f77e7f00..b9bc1c46 100644
--- a/apps/browser-extension/tsconfig.json
+++ b/apps/browser-extension/tsconfig.json
@@ -16,7 +16,7 @@
"jsx": "react-jsx",
"strict": true,
- "noUnusedLocals": true,
+ "noUnusedLocals": false,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
diff --git a/apps/web/components/dashboard/search/QueryExplainerTooltip.tsx b/apps/web/components/dashboard/search/QueryExplainerTooltip.tsx
index 13174fb2..f5f73be3 100644
--- a/apps/web/components/dashboard/search/QueryExplainerTooltip.tsx
+++ b/apps/web/components/dashboard/search/QueryExplainerTooltip.tsx
@@ -1,5 +1,6 @@
import InfoTooltip from "@/components/ui/info-tooltip";
import { Table, TableBody, TableCell, TableRow } from "@/components/ui/table";
+import { useTranslation } from "@/lib/i18n/client";
import { TextAndMatcher } from "@hoarder/shared/searchQueryParser";
import { Matcher } from "@hoarder/shared/types/search";
@@ -13,6 +14,7 @@ export default function QueryExplainerTooltip({
parsedSearchQuery: TextAndMatcher & { result: string };
className?: string;
}) {
+ const { t } = useTranslation();
if (parsedSearchQuery.result == "invalid") {
return null;
}
@@ -23,7 +25,9 @@ export default function QueryExplainerTooltip({
return (
<TableRow>
<TableCell>
- {matcher.inverse ? "Doesn't have" : "Has"} Tag
+ {matcher.inverse
+ ? t("search.does_not_have_tag")
+ : t("search.has_tag")}
</TableCell>
<TableCell>{matcher.tagName}</TableCell>
</TableRow>
@@ -32,7 +36,9 @@ export default function QueryExplainerTooltip({
return (
<TableRow>
<TableCell>
- {matcher.inverse ? "Is not in" : "Is in "} List
+ {matcher.inverse
+ ? t("search.is_not_in_list")
+ : t("search.is_in_list")}
</TableCell>
<TableCell>{matcher.listName}</TableCell>
</TableRow>
@@ -40,50 +46,72 @@ export default function QueryExplainerTooltip({
case "dateAfter":
return (
<TableRow>
- <TableCell>{matcher.inverse ? "Not" : ""} Created After</TableCell>
+ <TableCell>
+ {matcher.inverse
+ ? t("search.not_created_on_or_after")
+ : t("search.created_on_or_after")}
+ </TableCell>
<TableCell>{matcher.dateAfter.toDateString()}</TableCell>
</TableRow>
);
case "dateBefore":
return (
<TableRow>
- <TableCell>{matcher.inverse ? "Not" : ""} Created Before</TableCell>
+ <TableCell>
+ {matcher.inverse
+ ? t("search.not_created_on_or_before")
+ : t("search.created_on_or_before")}
+ </TableCell>
<TableCell>{matcher.dateBefore.toDateString()}</TableCell>
</TableRow>
);
case "favourited":
return (
<TableRow>
- <TableCell>Favourited</TableCell>
- <TableCell>{matcher.favourited.toString()}</TableCell>
+ <TableCell colSpan={2} className="text-center">
+ {matcher.favourited
+ ? t("search.is_favorited")
+ : t("search.is_not_favorited")}
+ </TableCell>
</TableRow>
);
case "archived":
return (
<TableRow>
- <TableCell>Archived</TableCell>
- <TableCell>{matcher.archived.toString()}</TableCell>
+ <TableCell colSpan={2} className="text-center">
+ {matcher.archived
+ ? t("search.is_archived")
+ : t("search.is_not_archived")}
+ </TableCell>
</TableRow>
);
case "tagged":
return (
<TableRow>
- <TableCell>Has Tags</TableCell>
- <TableCell>{matcher.tagged.toString()}</TableCell>
+ <TableCell colSpan={2} className="text-center">
+ {matcher.tagged
+ ? t("search.has_any_tag")
+ : t("search.has_no_tags")}
+ </TableCell>
</TableRow>
);
case "inlist":
return (
<TableRow>
- <TableCell>In Any List</TableCell>
- <TableCell>{matcher.inList.toString()}</TableCell>
+ <TableCell colSpan={2} className="text-center">
+ {matcher.inList
+ ? t("search.is_in_any_list")
+ : t("search.is_not_in_any_list")}
+ </TableCell>
</TableRow>
);
case "and":
case "or":
return (
<TableRow>
- <TableCell className="capitalize">{matcher.type}</TableCell>
+ <TableCell>
+ {matcher.type === "and" ? t("search.and") : t("search.or")}
+ </TableCell>
<TableCell>
<Table>
<TableBody>
@@ -95,6 +123,21 @@ export default function QueryExplainerTooltip({
</TableCell>
</TableRow>
);
+ case "url":
+ return (
+ <TableRow>
+ <TableCell>
+ {matcher.inverse
+ ? t("search.url_does_not_contain")
+ : t("search.url_contains")}
+ </TableCell>
+ <TableCell>{matcher.url}</TableCell>
+ </TableRow>
+ );
+ default: {
+ const _exhaustiveCheck: never = matcher;
+ return null;
+ }
}
};
@@ -105,7 +148,7 @@ export default function QueryExplainerTooltip({
<TableBody>
{parsedSearchQuery.text && (
<TableRow>
- <TableCell>Text</TableCell>
+ <TableCell>{t("search.full_text_search")}</TableCell>
<TableCell>{parsedSearchQuery.text}</TableCell>
</TableRow>
)}
diff --git a/apps/web/lib/i18n/locales/en/translation.json b/apps/web/lib/i18n/locales/en/translation.json
index 27799121..e1bd443a 100644
--- a/apps/web/lib/i18n/locales/en/translation.json
+++ b/apps/web/lib/i18n/locales/en/translation.json
@@ -188,6 +188,29 @@
"drag_and_drop_merging_info": "Drag and drop tags on each other to merge them",
"sort_by_name": "Sort by Name"
},
+ "search": {
+ "is_favorited": "Is Favorited",
+ "is_not_favorited": "Is Not Favorited",
+ "is_archived": "Is Archived",
+ "is_not_archived": "Is Not Archived",
+ "has_any_tag": "Has Any Tag",
+ "has_no_tags": "Has No Tag",
+ "is_in_any_list": "Is In Any List",
+ "is_not_in_any_list": "Is not In Any List",
+ "created_on_or_after": "Created on or After",
+ "not_created_on_or_after": "Not Created on or After",
+ "created_on_or_before": "Created on or Before",
+ "not_created_on_or_before": "Not Created on or Before",
+ "url_contains": "URL Contains",
+ "url_does_not_contain": "URL Does Not Contain",
+ "is_in_list": "Is In List",
+ "is_not_in_list": "Is not In List",
+ "has_tag": "Has Tag",
+ "does_not_have_tag": "Does Not Have Tag",
+ "full_text_search": "Full Text Search",
+ "and": "And",
+ "or": "Or"
+ },
"preview": {
"view_original": "View Original",
"cached_content": "Cached Content"
diff --git a/packages/trpc/lib/search.ts b/packages/trpc/lib/search.ts
index e7e6b5f7..74aaf51b 100644
--- a/packages/trpc/lib/search.ts
+++ b/packages/trpc/lib/search.ts
@@ -246,6 +246,7 @@ async function getIds(
return union(vals);
}
default: {
+ const _exhaustiveCheck: never = matcher;
throw new Error("Unknown matcher type");
}
}