diff --git a/frontend/src/components/AITagging/AIgallery.tsx b/frontend/src/components/AITagging/AIgallery.tsx index 63f81b43..8d19ef7d 100644 --- a/frontend/src/components/AITagging/AIgallery.tsx +++ b/frontend/src/components/AITagging/AIgallery.tsx @@ -35,15 +35,14 @@ export default function AIGallery({ queryFn: getAllImageObjects, queryKey: ['ai-tagging-images', 'ai'], }); - const { mutate: generateThumbnail, isPending: isCreating } = usePictoMutation( { mutationFn: generateThumbnails, autoInvalidateTags: ['ai-tagging-images', 'ai'], }, ); - - const [filterTag, setFilterTag] = useState(''); + let mediaItems = successData ?? []; + const [filterTag, setFilterTag] = useState([]); const [currentPage, setCurrentPage] = useState(1); const [showMediaViewer, setShowMediaViewer] = useState(false); const [selectedMediaIndex, setSelectedMediaIndex] = useState(0); @@ -55,14 +54,17 @@ export default function AIGallery({ { length: 41 }, (_, index) => index + 10, ); - - const filteredMediaItems = useMemo(() => { - return filterTag + const filteredMediaItems = useMemo(() => { + return filterTag.length > 0 ? mediaItems.filter((mediaItem: any) => - mediaItem.tags?.includes(filterTag), + filterTag.some((tag) => mediaItem.tags.includes(tag)) ) : mediaItems; - }, [filterTag, mediaItems]); + }, [filterTag, mediaItems, loading]) + + +const [pageNo,setpageNo] = useState(20); + const currentItems = useMemo(() => { const indexOfLastItem = currentPage * pageNo; @@ -105,7 +107,6 @@ export default function AIGallery({

{title}

)} void; + setFilterTag: (tag: string[]) => void; mediaItems: MediaItem[]; onFolderAdded: () => Promise; isLoading: boolean; @@ -27,7 +30,6 @@ interface FilterControlsProps { } export default function FilterControls({ - filterTag, setFilterTag, mediaItems, onFolderAdded, @@ -54,6 +56,46 @@ export default function FilterControls({ .sort(); }, [mediaItems]); + const [isDropdownOpen, setIsDropdownOpen] = useState(false); + + const [selectedFlags, setSelectedFlags] = useState< + { tag: string; isChecked: boolean }[] + >([ + { tag: 'All tags', isChecked: false }, + ...uniqueTags.map((ele) => ({ tag: ele, isChecked: false })), + ]); + + const handleAddFlag = (idx: number) => { + const updatedFlags = [...selectedFlags]; + updatedFlags[idx].isChecked = true; + setSelectedFlags(updatedFlags); + }; + + const handleRemoveFlag = (idx: number) => { + const updatedFlags = [...selectedFlags]; + updatedFlags[idx].isChecked = false; + setSelectedFlags(updatedFlags); + }; + + + const handleFilterFlag = ()=>{ + let flags : string[] = []; + if(selectedFlags[0].isChecked) { + setFilterTag([]); + return; + } + selectedFlags.forEach((ele)=>{ + if(ele.isChecked) flags.push(ele.tag); + }) + + console.log("Updated Filter Flags = ",flags); + setFilterTag(flags); + } + + const handleToggleDropdown = (event:Event) => { + event.preventDefault(); + setIsDropdownOpen((prevState) => !prevState); // Toggle dropdown visibility + }; const handleFolderPick = async (path: string) => { try { addFolderAPI(path); @@ -106,16 +148,28 @@ export default function FilterControls({

Delete Images

- + - All tags - {uniqueTags.map((tag) => ( - - {tag} + {selectedFlags.map((ele, index) => ( + { + selectedFlags[index].isChecked ? handleRemoveFlag(index) : handleAddFlag(index); + event.preventDefault(); + }} + className='cursor-pointer' + > + + {ele.tag} ))} + setErrorDialogContent(null)} diff --git a/frontend/src/components/Media/MediaGallery.tsx b/frontend/src/components/Media/MediaGallery.tsx index 3a249587..fed4ddf4 100644 --- a/frontend/src/components/Media/MediaGallery.tsx +++ b/frontend/src/components/Media/MediaGallery.tsx @@ -5,6 +5,14 @@ import SortingControls from './SortningControls'; import PaginationControls from '../ui/PaginationControls'; import { MediaGalleryProps } from '@/types/Media'; import { sortMedia } from '@/utils/Media'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuRadioGroup, + DropdownMenuRadioItem, + DropdownMenuTrigger, +} from '@radix-ui/react-dropdown-menu'; +import { Button } from '../ui/button'; export default function MediaGallery({ mediaItems, @@ -19,17 +27,22 @@ export default function MediaGallery({ const itemsPerPage: number = 20; const itemsPerRow: number = 3; + const noOfPages: number[] = Array.from( + { length: 41 }, + (_, index) => index + 10, + ); + const [pageNo, setpageNo] = useState(20); const sortedMedia = useMemo(() => { return sortMedia(mediaItems, [sortBy]); }, [mediaItems, sortBy]); const currentItems = useMemo(() => { - const indexOfLastItem = currentPage * itemsPerPage; - const indexOfFirstItem = indexOfLastItem - itemsPerPage; + const indexOfLastItem = currentPage * pageNo; + const indexOfFirstItem = indexOfLastItem - pageNo; return sortedMedia.slice(indexOfFirstItem, indexOfLastItem); - }, [sortedMedia, currentPage, itemsPerPage]); + }, [sortedMedia, currentPage, pageNo]); - const totalPages = Math.ceil(sortedMedia.length / itemsPerPage); + const totalPages = Math.ceil(sortedMedia.length / pageNo); const handleSetSortBy = useCallback((value: string) => { setSortBy(value); @@ -61,11 +74,45 @@ export default function MediaGallery({ type={type} /> {totalPages >= 1 && ( - +
+ +
+ + + + + + setpageNo(Number(value))} + > + {noOfPages.map((itemsPerPage) => ( + + {itemsPerPage} + + ))} + + + +
+
)} {showMediaViewer && ( { title: `Image ${imagePath}`, date, tags: [], + imagePath:'' }; }), );