{projects.length} {projects.length === 1 ? "project" : "projecten"} gevonden
Filters wissenimport Link from "next/link"; import { redirect } from "next/navigation"; import { getSession } from "../../lib/auth"; import { getDb, listRikxRondes, type ProjectListItem } from "../../lib/db"; import { PROJECT_STATUSES, isProjectStatus } from "../../lib/projectStatus"; import { AppHeader } from "../AppHeader"; import { AutoSubmitSelect } from "./AutoSubmitSelect"; import { ProjectPipeline } from "./ProjectPipeline"; import { ProjectTable } from "./ProjectTable"; const fieldClass = "w-full h-10 rounded-lg border border-zinc-300 dark:border-zinc-700 bg-white dark:bg-zinc-800 px-3 text-sm text-zinc-900 dark:text-zinc-100 placeholder:text-zinc-400 focus:outline-none focus:ring-2 focus:ring-rikx-orange"; const labelClass = "block text-sm text-zinc-700 dark:text-zinc-300 mb-1"; export default async function ProjectenPage({ searchParams, }: { searchParams: Promise<{ q?: string; status?: string; ronde?: string; weergave?: string }>; }) { const session = await getSession(); if (!session) redirect("/login"); const params = await searchParams; const q = (params.q ?? "").trim(); const status = isProjectStatus(params.status) ? params.status : ""; const rondes = listRikxRondes(); // "geen" = projecten zonder ronde; anders het id van een bestaande ronde const ronde = params.ronde === "geen" || rondes.some((r) => String(r.id) === params.ronde) ? params.ronde! : ""; // Pipeline is altijd de standaardweergave; de tabel alleen als die expliciet gekozen is. const view = params.weergave === "tabel" ? "tabel" : "pipeline"; const where: string[] = []; const args: (string | number)[] = []; if (q) { where.push("p.name LIKE ? ESCAPE '\\'"); args.push(`%${q.replace(/[\\%_]/g, (c) => `\\${c}`)}%`); } if (status) { where.push("p.status = ?"); args.push(status); } if (ronde === "geen") { where.push("p.ronde_id IS NULL"); } else if (ronde) { where.push("p.ronde_id = ?"); args.push(Number(ronde)); } const projects = getDb() .prepare( `SELECT p.*, r.label AS ronde_label FROM projects p LEFT JOIN rikx_rondes r ON r.id = p.ronde_id ${where.length ? `WHERE ${where.join(" AND ")}` : ""} ORDER BY p.created_at DESC, p.id DESC` ) .all(...args) as ProjectListItem[]; const isFiltered = Boolean(q || status || ronde); function viewHref(target: "pipeline" | "tabel") { const sp = new URLSearchParams(); if (target === "tabel") sp.set("weergave", "tabel"); if (status) sp.set("status", status); if (ronde) sp.set("ronde", ronde); if (q) sp.set("q", q); const qs = sp.toString(); return qs ? `/projecten?${qs}` : "/projecten"; } const toggleClass = (isActive: boolean) => isActive ? "rounded-lg bg-zinc-900 dark:bg-zinc-100 px-5 py-2.5 text-sm font-medium text-white dark:text-zinc-900" : "rounded-lg px-5 py-2.5 text-sm text-zinc-700 dark:text-zinc-300 hover:bg-zinc-100 dark:hover:bg-zinc-800 transition-colors"; return (
{projects.length} {projects.length === 1 ? "project" : "projecten"} gevonden
Filters wissen