From badf697d0b83ef4d093e781f04ed73d3901e6a9f Mon Sep 17 00:00:00 2001 From: MohamedBassem Date: Fri, 27 Sep 2024 09:17:51 +0000 Subject: feature(web): Add a select all button to bulk actions --- .../components/dashboard/BulkBookmarksAction.tsx | 24 +++++++++++++++++----- .../dashboard/bookmarks/BookmarksGrid.tsx | 11 +++++++++- apps/web/lib/bulkActions.ts | 23 +++++++++++++++++++++ 3 files changed, 52 insertions(+), 6 deletions(-) (limited to 'apps/web') diff --git a/apps/web/components/dashboard/BulkBookmarksAction.tsx b/apps/web/components/dashboard/BulkBookmarksAction.tsx index 9e831e80..a3f0ea55 100644 --- a/apps/web/components/dashboard/BulkBookmarksAction.tsx +++ b/apps/web/components/dashboard/BulkBookmarksAction.tsx @@ -25,6 +25,13 @@ export default function BulkBookmarksAction() { const setIsBulkEditEnabled = useBulkActionsStore( (state) => state.setIsBulkEditEnabled, ); + const selectAllBookmarks = useBulkActionsStore((state) => state.selectAll); + const unSelectAllBookmarks = useBulkActionsStore( + (state) => state.unSelectAll, + ); + const isEverythingSelected = useBulkActionsStore( + (state) => state.isEverythingSelected, + ); const { toast } = useToast(); const [isDeleteDialogOpen, setIsDeleteDialogOpen] = useState(false); const [manageListsModal, setManageListsModalOpen] = useState(false); @@ -168,6 +175,18 @@ export default function BulkBookmarksAction() { action: () => setIsDeleteDialogOpen(true), hidden: !isBulkEditEnabled, }, + { + name: isEverythingSelected() ? "Unselect All" : "Select All", + icon: ( +

+ ( {selectedBookmarks.length} ) +

+ ), + action: () => + isEverythingSelected() ? unSelectAllBookmarks() : selectAllBookmarks(), + alwaysEnable: true, + hidden: !isBulkEditEnabled, + }, { name: "Close bulk edit", icon: , @@ -213,11 +232,6 @@ export default function BulkBookmarksAction() { setOpen={setBulkTagModalOpen} />
- {isBulkEditEnabled && ( -

- ( {selectedBookmarks.length} ) -

- )} {actionList.map( ({ name, icon: Icon, action, isPending, hidden, alwaysEnable }) => ( void; }) { const layout = useBookmarkLayout(); + const bulkActionsStore = useBulkActionsStore(); const breakpointConfig = useMemo(() => getBreakpointConfig(), []); + useEffect(() => { + bulkActionsStore.setVisibleBookmarks(bookmarks); + return () => { + bulkActionsStore.setVisibleBookmarks([]); + }; + }, [bookmarks]); + if (bookmarks.length == 0 && !showEditorCard) { return

No bookmarks

; } diff --git a/apps/web/lib/bulkActions.ts b/apps/web/lib/bulkActions.ts index 1e9dbbd7..a2ee6a29 100644 --- a/apps/web/lib/bulkActions.ts +++ b/apps/web/lib/bulkActions.ts @@ -5,13 +5,19 @@ import type { ZBookmark } from "@hoarder/shared/types/bookmarks"; interface BookmarkState { selectedBookmarks: ZBookmark[]; + visibleBookmarks: ZBookmark[]; isBulkEditEnabled: boolean; setIsBulkEditEnabled: (isEnabled: boolean) => void; toggleBookmark: (bookmark: ZBookmark) => void; + setVisibleBookmarks: (visibleBookmarks: ZBookmark[]) => void; + selectAll: () => void; + unSelectAll: () => void; + isEverythingSelected: () => boolean; } const useBulkActionsStore = create((set, get) => ({ selectedBookmarks: [], + visibleBookmarks: [], isBulkEditEnabled: false, toggleBookmark: (bookmark: ZBookmark) => { @@ -30,10 +36,27 @@ const useBulkActionsStore = create((set, get) => ({ } }, + selectAll: () => { + set({ selectedBookmarks: get().visibleBookmarks }); + }, + unSelectAll: () => { + set({ selectedBookmarks: [] }); + }, + + isEverythingSelected: () => { + return get().selectedBookmarks.length === get().visibleBookmarks.length; + }, + setIsBulkEditEnabled: (isEnabled) => { set({ isBulkEditEnabled: isEnabled }); set({ selectedBookmarks: [] }); }, + + setVisibleBookmarks: (visibleBookmarks: ZBookmark[]) => { + set({ + visibleBookmarks, + }); + }, })); export default useBulkActionsStore; -- cgit v1.2.3-70-g09d2