aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-03-31 17:39:56 +0100
committerMohamedBassem <me@mbassem.com>2024-03-31 19:27:25 +0100
commited46407c41405014dda4cbd3dc7a39d04d1a15ac (patch)
treea7f3a6f85d59a34c7e36aee168721de2ebe5c18b /apps/web
parentdc6e0eab70421749faaa9a802d66c1901f3e9b50 (diff)
downloadkarakeep-ed46407c41405014dda4cbd3dc7a39d04d1a15ac.tar.zst
feature: Split the tags in AllTags page by who used them
Diffstat (limited to 'apps/web')
-rw-r--r--apps/web/app/dashboard/tags/page.tsx75
1 files changed, 56 insertions, 19 deletions
diff --git a/apps/web/app/dashboard/tags/page.tsx b/apps/web/app/dashboard/tags/page.tsx
index f87b0fcc..2ba1074c 100644
--- a/apps/web/app/dashboard/tags/page.tsx
+++ b/apps/web/app/dashboard/tags/page.tsx
@@ -1,8 +1,13 @@
import Link from "next/link";
-import { redirect } from "next/navigation";
import { Separator } from "@/components/ui/separator";
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip";
import { api } from "@/server/api/client";
-import { getServerAuthSession } from "@/server/auth";
+import { Info } from "lucide-react";
function TagPill({ name, count }: { name: string; count: number }) {
return (
@@ -16,30 +21,62 @@ function TagPill({ name, count }: { name: string; count: number }) {
}
export default async function TagsPage() {
- const session = await getServerAuthSession();
- if (!session) {
- redirect("/");
- }
-
- let tags = (await api.tags.list()).tags;
+ let allTags = (await api.tags.list()).tags;
// Sort tags by usage desc
- tags = tags.sort((a, b) => b.count - a.count);
+ allTags = allTags.sort((a, b) => b.count - a.count);
+
+ const humanTags = allTags.filter((t) => (t.countAttachedBy.human ?? 0) > 0);
+ const aiTags = allTags.filter((t) => (t.countAttachedBy.human ?? 0) == 0);
- let tagPill;
- if (tags.length) {
- tagPill = tags.map((t) => (
- <TagPill key={t.id} name={t.name} count={t.count} />
- ));
- } else {
- tagPill = "No Tags";
- }
+ const tagsToPill = (tags: typeof allTags) => {
+ let tagPill;
+ if (tags.length) {
+ tagPill = tags.map((t) => (
+ <TagPill key={t.id} name={t.name} count={t.count} />
+ ));
+ } else {
+ tagPill = "No Tags";
+ }
+ return tagPill;
+ };
return (
- <div className="space-y-3">
+ <div className="space-y-3 rounded-md border bg-background p-4">
<span className="text-2xl">All Tags</span>
<Separator />
- <div className="flex flex-wrap gap-3">{tagPill}</div>
+
+ <span className="flex items-center gap-2">
+ <p className="text-lg">Your Tags</p>
+ <TooltipProvider delayDuration={0}>
+ <Tooltip>
+ <TooltipTrigger asChild>
+ <Info size={20} />
+ </TooltipTrigger>
+ <TooltipContent>
+ <p>Tags that were attached at least once by you</p>
+ </TooltipContent>
+ </Tooltip>
+ </TooltipProvider>
+ </span>
+ <div className="flex flex-wrap gap-3">{tagsToPill(humanTags)}</div>
+
+ <Separator />
+
+ <span className="flex items-center gap-2">
+ <p className="text-lg">AI Tags</p>
+ <TooltipProvider delayDuration={0}>
+ <Tooltip>
+ <TooltipTrigger asChild>
+ <Info className="text-gray-100" size={20} />
+ </TooltipTrigger>
+ <TooltipContent>
+ <p>Tags that were only attached automatically (by AI)</p>
+ </TooltipContent>
+ </Tooltip>
+ </TooltipProvider>
+ </span>
+ <div className="flex flex-wrap gap-3">{tagsToPill(aiTags)}</div>
</div>
);
}