import Link from "next/link"; import { notFound } from "next/navigation"; import { ArrowLeft, Trash2 } from "lucide-react"; import { getCollectionBySlug, listImages } from "@/lib/db/queries"; import { MasonryGrid } from "@/components/grid/MasonryGrid"; import { RegisterVisible } from "@/components/select/RegisterVisible"; import { FilterBar } from "@/components/grid/FilterBar"; import { UploadCard } from "@/components/ingest/UploadCard"; import { deleteCollection, renameCollection } from "@/app/actions/collections"; import { EntityRenameInline } from "@/components/entities/EntityRenameInline"; import { ReorderableCollectionGrid } from "@/components/collections/ReorderableCollectionGrid"; import { resolveSort } from "@/lib/sortServer"; import { parseFilterCriteria, statusToFlags } from "@/lib/filters"; export const dynamic = "force-dynamic"; export default async function CollectionPage({ params, searchParams, }: { params: Promise<{ slug: string }>; searchParams: Promise>; }) { const { slug } = await params; const sp = await searchParams; const c = getCollectionBySlug(decodeURIComponent(slug)); if (!c) notFound(); const urlSort = typeof sp.sort === "string" ? sp.sort : undefined; // Resolve only when user explicitly chose; otherwise keep manual position default. const sort = urlSort ? await resolveSort(urlSort) : undefined; const search = (typeof sp.q === "string" ? sp.q.trim() : "") || undefined; const criteria = parseFilterCriteria(sp); const items = listImages({ collectionId: c.id, sort, search, ...statusToFlags(criteria.status), marks: criteria.marks, actressIds: criteria.ids.actresses, actressMode: criteria.mode.actresses, studioIds: criteria.ids.studios, seriesIds: criteria.ids.series, genreIds: criteria.ids.genres, genreMode: criteria.mode.genres, collectionIds: criteria.ids.collections, collectionMode: criteria.mode.collections, tagIds: criteria.ids.tags, tagMode: criteria.mode.tags, categoryIds: criteria.ids.categories, categoryMode: criteria.mode.categories, }); const remove = async () => { "use server"; await deleteCollection(c.id); }; const rename = async (name: string) => { "use server"; return await renameCollection(c.id, name); }; return (
Collection

{c.name}

{c.description &&

{c.description}

}

{items.length} Item{items.length === 1 ? "" : "s"}

{items.length === 0 ? (
Empty. Add images from any image detail page.
) : ( <> i.id)} /> {urlSort ? ( // User overrode the default order via the sort menu — disable // drag-reorder since drag-position vs sorted-position would // contradict each other. ) : ( )} )}
); }