From d443da7df2061b60d65f540b38c4e3c26ab35ee0 Mon Sep 17 00:00:00 2001 From: Varun Raj Date: Sat, 23 Aug 2025 16:34:44 +0530 Subject: [PATCH] feat: manage duplicates in bulk Signed-off-by: Varun Raj --- bun.lockb | Bin 474514 -> 475839 bytes package.json | 2 + .../assets/duplicate-assets/BulkActionBar.tsx | 81 +++++ .../duplicate-assets/DuplicateAssetRecord.tsx | 265 ++++++++++++++ .../VirtualizedDuplicateList.tsx | 115 ++++++ src/config/constants/sidebarNavs.tsx | 10 +- src/config/routes.ts | 4 +- src/handlers/api/asset.handler.ts | 8 +- src/pages/api/immich-proxy/[...path].ts | 43 ++- src/pages/assets/bulk-duplicate-finder.tsx | 328 ++++++++++++++++++ src/types/asset.d.ts | 61 ++++ 11 files changed, 904 insertions(+), 13 deletions(-) create mode 100644 src/components/assets/duplicate-assets/BulkActionBar.tsx create mode 100644 src/components/assets/duplicate-assets/DuplicateAssetRecord.tsx create mode 100644 src/components/assets/duplicate-assets/VirtualizedDuplicateList.tsx create mode 100644 src/pages/assets/bulk-duplicate-finder.tsx diff --git a/bun.lockb b/bun.lockb index c4de24ec5e672a50d43255c5d0e8ce8603ac6c06..158441fff8252401976b5ece1738e3eb6ae64b11 100755 GIT binary patch delta 94622 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 delta 93745 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 diff --git a/package.json b/package.json index 4aacb22..cc00a8b 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "@types/qs": "^6.9.15", "@types/react-autosuggest": "^10.1.11", "@types/react-calendar-heatmap": "^1.6.7", + "@types/react-window": "^1.8.8", "@vis.gl/react-google-maps": "^1.4.2", "axios": "^1.7.4", "chrono-node": "^1.4.9", @@ -66,6 +67,7 @@ "react-hot-toast": "^2.5.1", "react-leaflet": "^4.2.1", "react-mentions": "^4.4.10", + "react-window": "^1.8.11", "recharts": "^2.12.7", "remotion": "4.0.232", "sass": "^1.77.8", diff --git a/src/components/assets/duplicate-assets/BulkActionBar.tsx b/src/components/assets/duplicate-assets/BulkActionBar.tsx new file mode 100644 index 0000000..4b51463 --- /dev/null +++ b/src/components/assets/duplicate-assets/BulkActionBar.tsx @@ -0,0 +1,81 @@ +import React from 'react' +import { Button } from '@/components/ui/button' +import { Trash2, Check, X, RotateCcw } from 'lucide-react' +import { humanizeNumber } from '@/helpers/string.helper' + +interface BulkActionBarProps { + selectedCount: number + totalAssets: number + onDeleteSelected: () => void + onSelectAll: () => void + onDeselectAll: () => void + onInvertSelection: () => void + isVisible: boolean +} + +export default function BulkActionBar({ + selectedCount, + totalAssets, + onDeleteSelected, + onSelectAll, + onDeselectAll, + onInvertSelection, + isVisible +}: BulkActionBarProps) { + if (!isVisible) return null + + return ( +
+
+
+ {humanizeNumber(selectedCount)} of {humanizeNumber(totalAssets)} selected +
+ +
+ + + + + + +
+ + +
+
+
+ ) +} diff --git a/src/components/assets/duplicate-assets/DuplicateAssetRecord.tsx b/src/components/assets/duplicate-assets/DuplicateAssetRecord.tsx new file mode 100644 index 0000000..1248450 --- /dev/null +++ b/src/components/assets/duplicate-assets/DuplicateAssetRecord.tsx @@ -0,0 +1,265 @@ +import React, { useMemo } from 'react' +import { IDuplicateAssetRecord, IDuplicateAsset } from '@/types/asset' +import { ASSET_THUMBNAIL_PATH } from '@/config/routes' +import LazyImage from '@/components/ui/lazy-image' +import { Checkbox } from '@/components/ui/checkbox' +import { Button } from '@/components/ui/button' +import { AlertDialog } from '@/components/ui/alert-dialog' +import { humanizeBytes, humanizeNumber } from '@/helpers/string.helper' +import { formatDate } from '@/helpers/date.helper' +import { Camera, Calendar, HardDrive, MapPin, Trash2, Check, X, Shield } from 'lucide-react' + +interface DuplicateAssetRecordProps { + record: IDuplicateAssetRecord + selectedAssets: Set + onAssetSelect: (assetId: string, isShiftClick?: boolean) => void + onDeleteRecord: (record: IDuplicateAssetRecord) => void + onKeepSelected: (record: IDuplicateAssetRecord, selectedIds: string[], unselectedIds: string[]) => void + onKeepAllInRecord: (record: IDuplicateAssetRecord) => void +} + +interface DuplicateAssetItemProps { + asset: IDuplicateAsset + isSelected: boolean + onSelect: (assetId: string, isShiftClick?: boolean) => void +} + +function DuplicateAssetItem({ asset, isSelected, onSelect }: DuplicateAssetItemProps) { + const handleCheckboxChange = (event: React.MouseEvent) => { + const isShiftClick = event.shiftKey + onSelect(asset.id, isShiftClick) + } + + return ( +
+ + + {/* Asset details */} +
+

+ {asset.originalFileName} +

+ +
+
+ + {humanizeBytes(asset.exifInfo.fileSizeInByte)} +
+ +
+ + {asset.exifInfo.exifImageWidth} × {asset.exifInfo.exifImageHeight} +
+ + {asset.exifInfo.city && ( +
+ + {asset.exifInfo.city}, {asset.exifInfo.country} +
+ )} + + {asset.exifInfo.make && asset.exifInfo.model && ( +
+ {asset.exifInfo.make} {asset.exifInfo.model} +
+ )} +
+
+
+ ) +} + +export default function DuplicateAssetRecord({ + record, + selectedAssets, + onAssetSelect, + onDeleteRecord, + onKeepSelected, + onKeepAllInRecord +}: DuplicateAssetRecordProps) { + const recordAssetIds = record.assets.map(asset => asset.id) + const selectedInRecord = recordAssetIds.filter(id => selectedAssets.has(id)).length + const unselectedInRecord = record.assets.length - selectedInRecord + + // Calculate total size and selected/unselected sizes + const totalSize = useMemo(() => { + return record.assets.reduce((sum, asset) => sum + asset.exifInfo.fileSizeInByte, 0) + }, [record.assets]) + + const selectedSize = useMemo(() => { + return record.assets + .filter(asset => selectedAssets.has(asset.id)) + .reduce((sum, asset) => sum + asset.exifInfo.fileSizeInByte, 0) + }, [record.assets, selectedAssets]) + + const unselectedSize = useMemo(() => { + return record.assets + .filter(asset => !selectedAssets.has(asset.id)) + .reduce((sum, asset) => sum + asset.exifInfo.fileSizeInByte, 0) + }, [record.assets, selectedAssets]) + + const handleKeepAll = () => { + onKeepAllInRecord(record) + } + + const handleDeleteRecord = () => { + onDeleteRecord(record) + } + + const handleKeepSelected = () => { + const selectedAssetIds = record.assets + .filter(asset => selectedAssets.has(asset.id)) + .map(asset => asset.id) + + const unselectedAssetIds = record.assets + .filter(asset => !selectedAssets.has(asset.id)) + .map(asset => asset.id) + + if (selectedAssetIds.length === 0) return + + onKeepSelected(record, selectedAssetIds, unselectedAssetIds) + } + + return ( +
+
+
+
+
+ + {humanizeNumber(record.assets.length)} duplicate{record.assets.length !== 1 ? 's' : ''} +
+
+ + {humanizeBytes(totalSize)} total +
+ {selectedInRecord > 0 && ( +
+
+ + {selectedInRecord} to keep ({humanizeBytes(selectedSize)}) +
+
+ + {unselectedInRecord} to delete ({humanizeBytes(unselectedSize)} savings) +
+
+ )} +
+
+ + + + + {selectedInRecord > 0 && ( + + + + )} + + + + +
+
+
+ +
+ {record.assets.map((asset) => ( + + ))} +
+
+ ) +} diff --git a/src/components/assets/duplicate-assets/VirtualizedDuplicateList.tsx b/src/components/assets/duplicate-assets/VirtualizedDuplicateList.tsx new file mode 100644 index 0000000..8e580c3 --- /dev/null +++ b/src/components/assets/duplicate-assets/VirtualizedDuplicateList.tsx @@ -0,0 +1,115 @@ +import React, { useMemo } from 'react' +import { VariableSizeList as List } from 'react-window' +import { IDuplicateAssetRecord } from '@/types/asset' +import DuplicateAssetRecord from './DuplicateAssetRecord' + +interface VirtualizedDuplicateListProps { + duplicates: IDuplicateAssetRecord[] + selectedAssets: Set + onAssetSelect: (assetId: string, isShiftClick?: boolean) => void + onDeleteRecord: (record: IDuplicateAssetRecord) => void + onKeepSelected: (record: IDuplicateAssetRecord, selectedIds: string[], unselectedIds: string[]) => void + onKeepAllInRecord: (record: IDuplicateAssetRecord) => void + height: number +} + +interface ListItemProps { + index: number + style: React.CSSProperties + data: { + duplicates: IDuplicateAssetRecord[] + selectedAssets: Set + onAssetSelect: (assetId: string, isShiftClick?: boolean) => void + onDeleteRecord: (record: IDuplicateAssetRecord) => void + onKeepSelected: (record: IDuplicateAssetRecord, selectedIds: string[], unselectedIds: string[]) => void + onKeepAllInRecord: (record: IDuplicateAssetRecord) => void + } +} + +const ListItem: React.FC = ({ index, style, data }) => { + const { duplicates, selectedAssets, onAssetSelect, onDeleteRecord, onKeepSelected, onKeepAllInRecord } = data + const record = duplicates[index] + + return ( +
+
+ +
+
+ ) +} + +// Calculate dynamic height for each duplicate record +const getItemSize = (record: IDuplicateAssetRecord): number => { + // Base height for the header section + let height = 120 // Header + margin + + // Calculate grid rows needed + const assetsPerRow = 5 // xl:grid-cols-5 is the max + const rows = Math.ceil(record.assets.length / assetsPerRow) + + // Each asset item is approximately 320px tall (200px image + 120px details) + const assetRowHeight = 320 + + return height + (rows * assetRowHeight) + 32 // Add some margin +} + +export default function VirtualizedDuplicateList({ + duplicates, + selectedAssets, + onAssetSelect, + onDeleteRecord, + onKeepSelected, + onKeepAllInRecord, + height +}: VirtualizedDuplicateListProps) { + // Custom item size getter for VariableSizeList + const getItemHeight = (index: number) => { + if (index >= duplicates.length) return 0 + return getItemSize(duplicates[index]) + } + + // Data to pass to each list item + const itemData = { + duplicates, + selectedAssets, + onAssetSelect, + onDeleteRecord, + onKeepSelected, + onKeepAllInRecord + } + + // For better performance with many items, we'll use a custom implementation + // that handles variable heights properly + return ( +
+ {duplicates.length === 0 ? ( +
+

No duplicate records to display

+
+ ) : ( + + {ListItem} + + )} +
+ ) +} diff --git a/src/config/constants/sidebarNavs.tsx b/src/config/constants/sidebarNavs.tsx index b4de6fc..6b95734 100644 --- a/src/config/constants/sidebarNavs.tsx +++ b/src/config/constants/sidebarNavs.tsx @@ -1,4 +1,4 @@ -import { GalleryHorizontal, GalleryVerticalEnd, Image as ImageIcon, MapPin, MapPinX, Rewind, Search, User, Video } from "lucide-react"; +import { Copy, GalleryHorizontal, GalleryVerticalEnd, Image as ImageIcon, MapPin, MapPinX, Rewind, Search, User, Video } from "lucide-react"; export const sidebarNavs = [ // { @@ -47,6 +47,12 @@ export const sidebarNavs = [ title: "Empty Videos", link: "/assets/empty-videos", icon: