feat: safe deletion, album/asset delete, trash, README update
- volume-aware deletion: read-only volumes remove DB only, writable volumes soft-delete to trash with configurable grace period - trash page with restore, worker purge sweep (TRASH_RETENTION_DAYS) - album delete endpoint + sidebar trash icon - asset delete from timeline selection toolbar - all listing queries exclude trashed assets (deleted_at IS NULL) - timeline ordered by EXIF capture date, date-summary endpoint - README rewritten with features, setup, full env var table
This commit is contained in:
@@ -14,11 +14,12 @@ import {
|
||||
import { Button } from "@/components/ui/button"
|
||||
import { Input } from "@/components/ui/input"
|
||||
import { useAlbums } from "@/hooks/use-albums"
|
||||
import { ImageIcon, PlusIcon } from "lucide-react"
|
||||
import { toast } from "sonner"
|
||||
import { ImageIcon, PlusIcon, Trash2Icon } from "lucide-react"
|
||||
|
||||
export function AlbumSidebar() {
|
||||
const pathname = usePathname()
|
||||
const { albums, createAlbum } = useAlbums()
|
||||
const { albums, createAlbum, deleteAlbum } = useAlbums()
|
||||
const [isCreating, setIsCreating] = useState(false)
|
||||
const [newTitle, setNewTitle] = useState("")
|
||||
|
||||
@@ -59,14 +60,31 @@ export function AlbumSidebar() {
|
||||
)}
|
||||
<SidebarMenu>
|
||||
{albums.map((album) => (
|
||||
<SidebarMenuItem key={album.id}>
|
||||
<SidebarMenuItem key={album.id} className="group/album">
|
||||
<SidebarMenuButton
|
||||
asChild
|
||||
isActive={pathname === `/albums/${album.id}`}
|
||||
>
|
||||
<Link href={`/albums/${album.id}`}>
|
||||
<ImageIcon className="h-4 w-4" />
|
||||
<span>{album.title}</span>
|
||||
<span className="flex-1">{album.title}</span>
|
||||
<Button
|
||||
variant="ghost"
|
||||
size="icon"
|
||||
className="h-5 w-5 opacity-0 group-hover/album:opacity-100"
|
||||
onClick={async (e) => {
|
||||
e.preventDefault()
|
||||
e.stopPropagation()
|
||||
try {
|
||||
await deleteAlbum(album.id)
|
||||
toast.success("Album deleted")
|
||||
} catch {
|
||||
toast.error("Failed to delete album")
|
||||
}
|
||||
}}
|
||||
>
|
||||
<Trash2Icon className="h-3 w-3" />
|
||||
</Button>
|
||||
</Link>
|
||||
</SidebarMenuButton>
|
||||
</SidebarMenuItem>
|
||||
|
||||
Reference in New Issue
Block a user