"use client"; import Link from "next/link"; import { useTranslations } from "next-intl"; import { DataTable } from "@/components/admin/data-table"; import { Badge } from "@/components/ui/badge"; import type { DataTableColumn, PaginatedResult } from "@/types"; export interface TicketRow { id: number; subject: string; creator: string; creatorId: number; category: string; messages: number; status: string; priority: string; assignee: string; date: string; } const STATUS_VARIANT: Record< string, "default" | "secondary" | "destructive" | "outline" > = { open: "default", in_progress: "secondary", waiting: "outline", closed: "secondary", }; export function TicketsTable({ data }: { data: PaginatedResult }) { const t = useTranslations("pages.admin.tickets"); const statusLabel: Record = { open: t("statusOpen"), in_progress: t("statusInProgress"), waiting: t("statusWaiting"), closed: t("statusClosed"), }; const columns: DataTableColumn[] = [ { key: "subject", label: t("colTicket"), sortable: true, render: (_value, row) => (
#{row.id} {row.subject}
{t("meta", { user: row.creator, count: row.messages, category: row.category, })}
), }, { key: "status", label: t("colStatus"), sortable: true, filterKey: "filter_status", filterOptions: [ { label: t("statusOpen"), value: "open" }, { label: t("statusInProgress"), value: "in_progress" }, { label: t("statusWaiting"), value: "waiting" }, { label: t("statusClosed"), value: "closed" }, ], render: (value) => { const status = String(value); return ( {statusLabel[status] ?? status.replace("_", " ")} ); }, }, { key: "priority", label: t("colPriority"), sortable: true, render: (value) => { const p = String(value); const className = p === "urgent" ? "text-[var(--admin-error)] font-bold" : p === "high" ? "text-[var(--admin-warning)]" : p === "normal" ? "text-[var(--admin-info)]" : ""; return {p}; }, }, { key: "assignee", label: t("colAssigned"), sortable: true }, { key: "date", label: t("colDate"), sortable: true }, ]; return ( ); }