"use client"; import { useRef, useState } from "react"; import { useRouter } from "next/navigation"; import { Loader2, Star, Tag, Trash2, X } from "lucide-react"; import type { ProjectStatus } from "@prisma/client"; import { Popover } from "@/components/ui/Popover"; import { STATUS_META, STATUS_ORDER } from "@/lib/status"; import { cn, parseTags } from "@/lib/utils"; /** * Leiste fuer die Mehrfachauswahl. Erscheint erst, wenn etwas ausgewaehlt ist, * und liegt fest am unteren Rand – bei einer langen Liste waere sie oben * sonst laengst aus dem Blick gescrollt, waehrend man noch auswaehlt. */ export function BulkBar({ ids, onDone, onClear, }: { ids: string[]; onDone: () => void; onClear: () => void; }) { const router = useRouter(); const [busy, setBusy] = useState(false); const [error, setError] = useState(null); const [statusOpen, setStatusOpen] = useState(false); const [tagsOpen, setTagsOpen] = useState(false); const [tagInput, setTagInput] = useState(""); const statusRef = useRef(null); const tagsRef = useRef(null); async function apply(body: Record) { setBusy(true); setError(null); try { const response = await fetch("/api/projects/bulk", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ids, ...body }), }); const payload = await response.json().catch(() => ({})); if (!response.ok) throw new Error(payload.error ?? "Das hat nicht geklappt."); onDone(); router.refresh(); } catch (caught) { setError(caught instanceof Error ? caught.message : String(caught)); } finally { setBusy(false); setStatusOpen(false); setTagsOpen(false); } } async function remove() { if ( !window.confirm( `${ids.length} Projekt${ids.length === 1 ? "" : "e"} mit allen Notizen und Aufgaben ` + "unwiderruflich loeschen?", ) ) { return; } await apply({ action: "delete" }); } return (
{ids.length} ausgewählt setStatusOpen(false)} align="start" >
{STATUS_ORDER.map((status) => ( ))}
setTagsOpen(false)} align="start">
setTagInput(event.target.value)} placeholder="experiment, archiv" autoFocus />
{busy ? : null} {error ? (

{error}

) : null}
); }