aboutsummaryrefslogtreecommitdiffstats
path: root/apps/web/components/dashboard/bookmarks
diff options
context:
space:
mode:
authorMd Saban <45597394+mdsaban@users.noreply.github.com>2024-07-02 03:51:23 +0530
committerGitHub <noreply@github.com>2024-07-01 23:21:23 +0100
commitd193d9bf89e8a88bf70b673ea5e438d73cf40c0c (patch)
tree56d260c0624b74bda054f8865c3bd2e166f49e8d /apps/web/components/dashboard/bookmarks
parentbf92fa3386be331871963f99ec5c813186a388b3 (diff)
downloadkarakeep-d193d9bf89e8a88bf70b673ea5e438d73cf40c0c.tar.zst
feat: Add bulk edit option for bookmarks. Fixes #84 (#259)
* feat: add bulk edit option for bookmarks * fix: resolve comments * fix: resolve comments * fix: resolve comments * fix: resolve comments * rename bulk action store, simplify the bulk action toolbar --------- Co-authored-by: MohamedBassem <me@mbassem.com>
Diffstat (limited to 'apps/web/components/dashboard/bookmarks')
-rw-r--r--apps/web/components/dashboard/bookmarks/BookmarkActionBar.tsx2
-rw-r--r--apps/web/components/dashboard/bookmarks/BookmarkLayoutAdaptingCard.tsx62
-rw-r--r--apps/web/components/dashboard/bookmarks/icons.tsx12
3 files changed, 68 insertions, 8 deletions
diff --git a/apps/web/components/dashboard/bookmarks/BookmarkActionBar.tsx b/apps/web/components/dashboard/bookmarks/BookmarkActionBar.tsx
index 6cc8e44e..299f47eb 100644
--- a/apps/web/components/dashboard/bookmarks/BookmarkActionBar.tsx
+++ b/apps/web/components/dashboard/bookmarks/BookmarkActionBar.tsx
@@ -22,7 +22,7 @@ export default function BookmarkActionBar({
href={`/dashboard/preview/${bookmark.id}`}
className={cn(buttonVariants({ variant: "ghost" }), "px-2")}
>
- <Maximize2 size="20" />
+ <Maximize2 size={16} />
</Link>
<BookmarkOptions bookmark={bookmark} />
</div>
diff --git a/apps/web/components/dashboard/bookmarks/BookmarkLayoutAdaptingCard.tsx b/apps/web/components/dashboard/bookmarks/BookmarkLayoutAdaptingCard.tsx
index e1cc1f7c..33b65108 100644
--- a/apps/web/components/dashboard/bookmarks/BookmarkLayoutAdaptingCard.tsx
+++ b/apps/web/components/dashboard/bookmarks/BookmarkLayoutAdaptingCard.tsx
@@ -1,12 +1,15 @@
import type { BookmarksLayoutTypes } from "@/lib/userLocalSettings/types";
-import React from "react";
+import React, { useEffect, useState } from "react";
import Link from "next/link";
+import useBulkActionsStore from "@/lib/bulkActions";
import {
bookmarkLayoutSwitch,
useBookmarkLayout,
} from "@/lib/userLocalSettings/bookmarksLayout";
import { cn } from "@/lib/utils";
import dayjs from "dayjs";
+import { Check } from "lucide-react";
+import { useTheme } from "next-themes";
import type { ZBookmark } from "@hoarder/shared/types/bookmarks";
import { isBookmarkStillTagging } from "@hoarder/shared-react/utils/bookmarkUtils";
@@ -45,6 +48,57 @@ function BottomRow({
);
}
+function MultiBookmarkSelector({ bookmark }: { bookmark: ZBookmark }) {
+ const { selectedBookmarks, isBulkEditEnabled } = useBulkActionsStore();
+ const toggleBookmark = useBulkActionsStore((state) => state.toggleBookmark);
+ const [isSelected, setIsSelected] = useState(false);
+ const { theme } = useTheme();
+
+ useEffect(() => {
+ setIsSelected(selectedBookmarks.some((item) => item.id === bookmark.id));
+ }, [selectedBookmarks]);
+
+ if (!isBulkEditEnabled) return null;
+
+ const getIconColor = () => {
+ if (theme === "dark") {
+ return isSelected ? "black" : "white";
+ }
+ return isSelected ? "white" : "black";
+ };
+
+ const getIconBackgroundColor = () => {
+ if (theme === "dark") {
+ return isSelected ? "bg-white" : "bg-white bg-opacity-10";
+ }
+ return isSelected ? "bg-black" : "bg-white bg-opacity-40";
+ };
+
+ return (
+ <button
+ className={cn(
+ "absolute left-0 top-0 z-50 h-full w-full bg-opacity-0",
+ {
+ "bg-opacity-10": isSelected,
+ },
+ theme === "dark" ? "bg-white" : "bg-black",
+ )}
+ onClick={() => toggleBookmark(bookmark)}
+ >
+ <button className="absolute right-2 top-2 z-50 opacity-100">
+ <div
+ className={cn(
+ "flex h-4 w-4 items-center justify-center rounded-full border border-gray-600",
+ getIconBackgroundColor(),
+ )}
+ >
+ <Check size={12} color={getIconColor()} />
+ </div>
+ </button>
+ </button>
+ );
+}
+
function ListView({
bookmark,
image,
@@ -56,10 +110,11 @@ function ListView({
return (
<div
className={cn(
- "flex max-h-96 gap-4 overflow-hidden rounded-lg p-2 shadow-md",
+ "relative flex max-h-96 gap-4 overflow-hidden rounded-lg p-2 shadow-md",
className,
)}
>
+ <MultiBookmarkSelector bookmark={bookmark} />
<div className="flex size-32 items-center justify-center overflow-hidden">
{image("list", "object-cover rounded-lg size-32")}
</div>
@@ -100,11 +155,12 @@ function GridView({
return (
<div
className={cn(
- "flex flex-col overflow-hidden rounded-lg shadow-md",
+ "relative flex flex-col overflow-hidden rounded-lg shadow-md",
className,
fitHeight && layout != "grid" ? "max-h-96" : "h-96",
)}
>
+ <MultiBookmarkSelector bookmark={bookmark} />
{img && <div className="h-56 w-full shrink-0 overflow-hidden">{img}</div>}
<div className="flex h-full flex-col justify-between gap-2 overflow-hidden p-2">
<div className="grow-1 flex flex-col gap-2 overflow-hidden">
diff --git a/apps/web/components/dashboard/bookmarks/icons.tsx b/apps/web/components/dashboard/bookmarks/icons.tsx
index d899f19d..04e3ff32 100644
--- a/apps/web/components/dashboard/bookmarks/icons.tsx
+++ b/apps/web/components/dashboard/bookmarks/icons.tsx
@@ -3,27 +3,31 @@ import { Archive, ArchiveRestore, Star } from "lucide-react";
export function FavouritedActionIcon({
favourited,
className,
+ size,
}: {
favourited: boolean;
className?: string;
+ size?: number;
}) {
return favourited ? (
- <Star className={className} color="#ebb434" fill="#ebb434" />
+ <Star size={size} className={className} color="#ebb434" fill="#ebb434" />
) : (
- <Star className={className} />
+ <Star size={size} className={className} />
);
}
export function ArchivedActionIcon({
archived,
className,
+ size,
}: {
archived: boolean;
className?: string;
+ size?: number;
}) {
return archived ? (
- <ArchiveRestore className={className} />
+ <ArchiveRestore size={size} className={className} />
) : (
- <Archive className={className} />
+ <Archive size={size} className={className} />
);
}