import Link from "next/link"; import { notFound } from "next/navigation"; import { getTranslations } from "next-intl/server"; import { DocumentCategory } from "@prisma/client"; import { PageHead } from "@/components/mockup-ui"; import { buttonLinkClass, controlClass, hrefWith, Pagination, paginationSummary } from "@/components/customers/form-ui"; import { DocumentPanel } from "@/components/documents/document-panel"; import { requirePageContext } from "@/server/api/context"; import { can } from "@/server/services/context"; import { customerOptions } from "@/server/services/customers/customers"; import { customerDisplayName } from "@/server/services/customers/format"; import { listDocuments } from "@/server/services/documents/access"; import { DOCUMENT_CATEGORIES } from "@/server/services/documents/store"; import { workOrderScope } from "@/server/services/work-orders/visibility"; type SearchParams = Promise<{ q?: string; category?: string; customerId?: string; siteId?: string; workOrder?: string; all?: string; page?: string; docOk?: string; docError?: string; docEdit?: string; docVersion?: string; }>; /** Backoffice overview of all documents (spec §24) with filters category / customer / site / work order. */ export default async function DocumentsPage({ searchParams }: { searchParams: SearchParams }) { const ctx = await requirePageContext("documents"); if (!can(ctx, "document:read")) notFound(); const t = await getTranslations("documents"); const sp = await searchParams; const q = sp.q?.trim() || undefined; const category = (DOCUMENT_CATEGORIES as string[]).includes(sp.category ?? "") ? (sp.category as DocumentCategory) : undefined; const customerId = sp.customerId?.trim() || undefined; const siteId = sp.siteId?.trim() || undefined; const workOrderNumber = sp.workOrder?.trim() || undefined; const latestOnly = sp.all !== "1"; const page = Math.max(1, Math.floor(Number(sp.page)) || 1); let workOrderId: string | undefined; if (workOrderNumber) { const wo = await ctx.db.workOrder.findFirst({ where: { AND: [{ number: workOrderNumber }, await workOrderScope(ctx)] }, select: { id: true } }); workOrderId = wo?.id ?? "__none__"; } const [result, customers] = await Promise.all([ listDocuments(ctx, { q, category, customerId, siteId, workOrderId, latestOnly, page, pageSize: 25 }), can(ctx, "customer:read") ? customerOptions(ctx) : Promise.resolve([]), ]); const filters = { q, category, customerId, siteId, workOrder: workOrderNumber, all: latestOnly ? undefined : "1" }; const listHref = (p: number) => hrefWith("/documents", { ...filters, page: p > 1 ? p : undefined }); return (
{siteId && }
{Object.values(filters).some(Boolean) && ( {t("filter.reset")} )}
); }