import type { ColumnDef } from "@tanstack/react-table"; import { format } from "date-fns"; import { CircleCheck, CircleCheckBig, CircleEllipsis, ClockFading, ExternalLink, SearchX, } from "lucide-react"; import Link from "next/link"; import { AnnuncioCardContent } from "~/components/servizio/annuncio_card"; import { Badge } from "~/components/ui/badge"; import { Button } from "~/components/ui/button"; import { DataTable } from "~/components/ui/data-table"; import { DataTableColumnHeader } from "~/components/ui/dataTable-header"; import type { PinnedFiltro, SearchFiltro, } from "~/components/ui/dataTable-toolbar"; import { Popover, PopoverContent, PopoverDescription, PopoverHeader, PopoverTitle, PopoverTrigger, } from "~/components/ui/popover"; import { Tooltip, TooltipContent, TooltipTrigger, } from "~/components/ui/tooltip"; import { UserAvatar } from "~/components/user_avatar"; import { cn } from "~/lib/utils"; import TipologiaPosizioneEnum from "~/schemas/public/TipologiaPosizioneEnum"; import type { RichiesteData } from "~/server/controllers/servizio.controller"; type RichiesteTableProps = { data: RichiesteData[]; }; export const RichiesteTable = ({ data }: RichiesteTableProps) => { const tabledata = data; const columns_titles = { id: "ID Ordine", username: "Utente", decorrenza: "Decorrenza", status: "Status", tipologia: "Tipo", annunci: "Annunci", actions: "Azioni", }; const statusOptions = [ { label: "Attesa di attivazione", value: "attesa_attivazione" }, { label: "Acconto pagato", value: "acconto_pagato" }, { label: "Saldo pagato", value: "saldo_pagato" }, { label: "Conferma in corso", value: "conferma" }, ]; const type_options = [ { label: "Transitorio", value: TipologiaPosizioneEnum.Transitorio }, { label: "Stabile", value: TipologiaPosizioneEnum.Stabile }, ]; type Column = (typeof tabledata)[number]; const columns: ColumnDef[] = [ { accessorKey: "id", cell: () => null, enableHiding: false, header: () => null, }, { accessorKey: "username", cell: ({ row }) => { return ( {row.original.username} ); }, enableHiding: false, header: ({ column }) => ( ), }, { accessorKey: "decorrenza", cell: ({ row }) => { let decorrenzaColor = ""; let decorrenzaTooltip = ""; if (!row.original.isOkAcconto || !row.original.decorrenza) { decorrenzaColor = "text-muted-foreground"; decorrenzaTooltip = "Attesa di attivazione"; } else if (row.original.isInterrotto) { decorrenzaColor = "text-destructive"; decorrenzaTooltip = "Servizio interrotto"; } else if (row.original.isOkAcconto && !row.original.isOkSaldo) { decorrenzaColor = "text-warning"; decorrenzaTooltip = "Attesa di saldo"; } return ( {row.original.decorrenza ? format(row.original.decorrenza, "dd/MM") : "---"}

{decorrenzaTooltip}

); }, enableHiding: false, header: ({ column }) => ( ), sortingFn: "datetime", }, { accessorKey: "tipologia", cell: ({ row }) => { const { tipologia } = row.original; return ( {tipologia.toString()} ); }, filterFn: (row, id, value) => { return value.includes(row.getValue(id)); }, header: ({ column }) => ( ), }, { accessorKey: "status", cell: ({ row }) => { let badgeClass = ""; let contents: React.ReactNode; const annunci = row.original.annunci_servizio; const awaitingConferma = annunci.some( (a) => a.user_confirmed_at !== null && !a.hasConfermaAdmin, ); const hasConfermaAdmin = annunci.some((a) => a.hasConfermaAdmin); if (row.original.isInterrotto) { badgeClass = "border-destructive bg-destructive/10 text-destructive"; contents = ( <> Interrotto ); } else if (!row.original.onboardOk) { badgeClass = "border-yellow-500 bg-yellow-500/10 text-yellow-600"; contents = ( <> Attesa attivazione ); } else if (awaitingConferma) { badgeClass = "border-sky-500 bg-sky-500/10 text-sky-500"; contents = ( <> In Conferma ); } else if (row.original.isOkSaldo && hasConfermaAdmin) { badgeClass = "border-blue-500 bg-blue-500/10 text-blue-500"; contents = ( <> Saldo pagato ); } else if (row.original.isOkAcconto) { badgeClass = "border-green-500 bg-green-500/10 text-green-500"; contents = ( <> Attivo ); } return ( svg]:size-4", badgeClass, )} variant="outline" > {contents} ); }, filterFn: (row, id, value) => { return value.includes(row.getValue(id)); }, header: ({ column }) => ( ), }, { accessorKey: "annunci_servizio", cell: ({ row }) => { const annunci = row.original.annunci_servizio; return ( Annunci Inseriti Desc
{annunci.map((a) => (

Visto contatti:{" "} {a.open_contatti_at ? format(a.open_contatti_at, "dd/MM/yyyy HH:mm") : "Non ancora visto"}

{/*TODO CAPIRE COSA AGGIUNGERE */}
} isAdmin key={a.annunci_id} /> ))}
); }, header: ({ column }) => ( ), enableSorting: false, }, { cell: ({ row }) => { return ( ); }, enableHiding: false, id: "actions", }, ]; const searchFiltro: SearchFiltro = { columnName: "id", placeholder: "Cerca ordine...", }; const pinnedFiltri: PinnedFiltro[] = [ { columnName: "status", options: statusOptions, title: "Stato Ordine", }, { columnName: "tipologia", options: type_options, title: "Tipo Ordine", }, ]; return (
); };