infoalloggi-monorepo/apps/infoalloggi/src/components/tables/annunci-tables.tsx

153 lines
3.4 KiB
TypeScript
Raw Normal View History

2025-08-04 17:45:44 +02:00
import type { ColumnDef } from "@tanstack/react-table";
import { Wrench } from "lucide-react";
2025-08-04 17:45:44 +02:00
import Link from "next/link";
2025-08-28 18:27:07 +02:00
import { DataTable } from "~/components/custom_ui/data-table";
import { DataTableColumnHeader } from "~/components/custom_ui/dataTable-header";
import type {
PinnedFiltro,
SearchFiltro,
} from "~/components/custom_ui/dataTable-toolbar";
2025-08-28 18:27:07 +02:00
import { Button } from "~/components/ui/button";
2025-08-04 17:45:44 +02:00
import { StatusBadge } from "~/pages/area-riservata/admin/edit-annuncio/[id]";
2025-08-28 18:27:07 +02:00
import type { Annunci } from "~/schemas/public/Annunci";
2025-08-04 17:45:44 +02:00
export const AnnunciTable = ({
2025-08-28 18:27:07 +02:00
data,
2025-08-04 17:45:44 +02:00
}: {
2025-08-28 18:27:07 +02:00
data: Pick<
Annunci,
"id" | "codice" | "titolo_it" | "comune" | "tipo" | "locatore" | "stato"
>[];
2025-08-04 17:45:44 +02:00
}) => {
2025-08-28 18:27:07 +02:00
const tabledata = data.map((row) => {
return {
actions: "Azioni",
2025-08-28 18:27:07 +02:00
codice: row.codice,
comune: row.comune,
id: row.id,
2025-08-28 18:27:07 +02:00
locatore: row.locatore,
stato: row.stato,
tipo: row.tipo,
titolo_it: row.titolo_it,
2025-08-28 18:27:07 +02:00
};
});
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
const columns_titles = {
actions: "Azioni",
2025-08-28 18:27:07 +02:00
codice: "Codice",
comune: "Comune",
locatore: "Locatore",
stato: "Stato",
tipo: "Tipo",
titolo_it: "Titolo",
2025-08-28 18:27:07 +02:00
};
type Column = (typeof tabledata)[number];
const columns: ColumnDef<Column>[] = [
{
accessorKey: "actions",
cell: ({ row }) => {
return (
<Link
aria-label="Edit Annuncio"
href={`/area-riservata/admin/edit-annuncio/${row.original.id}`}
target="_blank"
>
<Button className="px-2" size="sm" variant="default">
<Wrench />
</Button>
</Link>
);
},
enableHiding: false,
enableSorting: false,
header: ({ column }) => (
<DataTableColumnHeader column={column} title={columns_titles.actions} />
),
},
{
accessorKey: "codice",
2025-08-28 18:27:07 +02:00
header: ({ column }) => (
<DataTableColumnHeader column={column} title={columns_titles.codice} />
),
},
{
accessorKey: "stato",
cell: ({ row }) => {
return <StatusBadge status={row.original.stato} />;
},
header: ({ column }) => (
<DataTableColumnHeader column={column} title={columns_titles.stato} />
),
},
{
accessorKey: "titolo_it",
2025-08-28 18:27:07 +02:00
header: ({ column }) => (
<DataTableColumnHeader
column={column}
title={columns_titles.titolo_it}
/>
),
},
{
accessorKey: "comune",
2025-08-28 18:27:07 +02:00
header: ({ column }) => (
<DataTableColumnHeader column={column} title={columns_titles.comune} />
),
},
{
accessorKey: "tipo",
2025-08-28 18:27:07 +02:00
header: ({ column }) => (
<DataTableColumnHeader column={column} title={columns_titles.tipo} />
),
},
{
accessorKey: "locatore",
2025-08-28 18:27:07 +02:00
header: ({ column }) => (
<DataTableColumnHeader
column={column}
title={columns_titles.locatore}
/>
),
},
];
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
const searchFiltro: SearchFiltro = {
columnName: "codice",
placeholder: "Filtra codice...",
};
const pinnedFiltri: PinnedFiltro[] = [
{
columnName: "stato",
options: [
{ label: "Attivo", value: "Attivo" },
{
label: "Sospeso",
value: "Sospeso",
},
{
label: "Trattativa",
value: "Trattativa",
},
],
title: "Stato",
},
];
2025-08-28 18:27:07 +02:00
return (
<div className="mx-auto w-full px-2 py-5">
<DataTable
columns={columns}
columns_titles={columns_titles}
data={tabledata}
defaultFilterState={[
{
id: "stato",
value: ["Attivo"],
},
]}
2025-08-28 18:27:07 +02:00
defaultSort={[{ desc: true, id: "codice" }]}
pinnedFiltri={pinnedFiltri}
searchColumn={searchFiltro}
2025-08-28 18:27:07 +02:00
/>
</div>
);
2025-08-04 17:45:44 +02:00
};