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

213 lines
5.2 KiB
TypeScript
Raw Normal View History

2025-08-04 17:45:44 +02:00
import type { ColumnDef } from "@tanstack/react-table";
import { CircleSlash, Cog } from "lucide-react";
2025-08-28 18:27:07 +02:00
import { DataTable } from "~/components/custom_ui/data-table";
import { DataTableColumnHeader } from "~/components/custom_ui/dataTable-header";
2025-08-04 17:45:44 +02:00
import type {
2025-08-28 18:27:07 +02:00
PinnedFiltro,
SearchFiltro,
2025-08-04 17:45:44 +02:00
} from "~/components/custom_ui/dataTable-toolbar";
import { Badge } from "~/components/ui/badge";
2025-08-28 18:27:07 +02:00
import { Button } from "~/components/ui/button";
import { cn, formatCurrency } from "~/lib/utils";
import type { Prezziario } from "~/schemas/public/Prezziario";
2025-08-04 17:45:44 +02:00
export const PrezzarioTable = ({
2025-08-28 18:27:07 +02:00
data,
setOpenEdit,
setEditData,
2025-08-04 17:45:44 +02:00
}: {
2025-08-28 18:27:07 +02:00
data: Prezziario[];
setOpenEdit: (status: boolean) => void;
setEditData: (data: Prezziario | null) => void;
2025-08-04 17:45:44 +02:00
}) => {
2025-08-28 18:27:07 +02:00
const tabledata = data.map((row) => {
return {
2025-08-29 16:18:32 +02:00
actions: "Azioni",
2025-08-28 18:27:07 +02:00
categoria: [
row.isAcconto && "acconto",
row.isSaldo && "saldo",
row.isConsulenza && "consulenza",
].filter(Boolean),
2025-08-29 16:18:32 +02:00
desc_en: row.desc_en,
desc_it: row.desc_it,
id: row.idprezziario,
2025-08-28 18:27:07 +02:00
isAcconto: row.isAcconto,
isActive: row.isActive,
2025-08-29 16:18:32 +02:00
isConsulenza: row.isConsulenza,
isSaldo: row.isSaldo,
isStabile: row.isStabile,
isTransitorio: row.isTransitorio,
nome_en: row.nome_en,
nome_it: row.nome_it,
prezzo_cent: row.prezzo_cent,
2025-08-28 18:27:07 +02:00
sconto: row.sconto,
2025-08-29 16:18:32 +02:00
testo_condizioni: row.testo_condizioni,
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 cat_options = [
{ label: "acconto", value: "acconto" },
{ label: "saldo", value: "saldo" },
{ label: "consulenza", value: "consulenza" },
];
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
const columns_titles = {
2025-08-29 16:18:32 +02:00
actions: "Azioni",
categoria: "Categoria",
2025-08-28 18:27:07 +02:00
id: "Codice",
nome: "Nome",
prezzo: "Prezzo",
sconto: "Sconto",
2025-08-29 16:18:32 +02:00
tipologia: "Tipo",
2025-08-28 18:27:07 +02:00
};
type Column = (typeof tabledata)[number];
const includesAll = (arr: string[], values: string[]) =>
values.every((v) => arr.includes(v));
const columns: ColumnDef<Column>[] = [
{
2025-08-29 16:18:32 +02:00
accessorKey: "id",
enableHiding: false,
2025-08-28 18:27:07 +02:00
header: ({ column }) => (
<DataTableColumnHeader column={column} title={columns_titles.id} />
),
},
{
2025-08-29 16:18:32 +02:00
accessorKey: "nome",
2025-08-28 18:27:07 +02:00
cell: ({ row }) => {
return (
<div className={cn(!row.original.isActive && "line-through")}>
{row.original.nome_it}
</div>
);
},
2025-08-29 16:18:32 +02:00
header: ({ column }) => (
<DataTableColumnHeader column={column} title={columns_titles.nome} />
),
2025-08-28 18:27:07 +02:00
},
{
2025-08-29 16:18:32 +02:00
accessorKey: "categoria",
filterFn: (row, id, value) => {
return includesAll(row.getValue(id), value as string[]);
},
2025-08-28 18:27:07 +02:00
header: ({ column }) => (
<DataTableColumnHeader
column={column}
title={columns_titles.categoria}
/>
),
},
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
{
accessorKey: "tipologia",
cell: ({ row }) => {
return (
<div>
{row.original.isTransitorio
? row.original.isStabile
? "Transitorio/Stabile"
: "Transitorio"
: row.original.isStabile
? "Stabile"
: ""}
</div>
);
},
2025-08-29 16:18:32 +02:00
filterFn: (row, id, value) => {
return includesAll(row.getValue(id), value as string[]);
},
2025-08-28 18:27:07 +02:00
header: ({ column }) => (
2025-08-29 16:18:32 +02:00
<DataTableColumnHeader
column={column}
title={columns_titles.tipologia}
/>
2025-08-28 18:27:07 +02:00
),
2025-08-29 16:18:32 +02:00
},
{
accessorKey: "prezzo",
2025-08-28 18:27:07 +02:00
cell: ({ row }) => {
return <div>{formatCurrency(row.original.prezzo_cent / 100)}</div>;
},
header: ({ column }) => (
2025-08-29 16:18:32 +02:00
<DataTableColumnHeader column={column} title={columns_titles.prezzo} />
2025-08-28 18:27:07 +02:00
),
2025-08-29 16:18:32 +02:00
},
{
accessorKey: "sconto",
2025-08-28 18:27:07 +02:00
cell: ({ row }) => {
if (row.original.sconto === 0) {
return (
<Badge variant="secondary">
<CircleSlash className="size-4" />
</Badge>
);
}
return <Badge>{row.original.sconto}%</Badge>;
},
header: ({ column }) => (
2025-08-29 16:18:32 +02:00
<DataTableColumnHeader column={column} title={columns_titles.sconto} />
2025-08-28 18:27:07 +02:00
),
2025-08-29 16:18:32 +02:00
},
{
accessorKey: "actions",
2025-08-28 18:27:07 +02:00
cell: ({ row }) => {
const rowData = row.original;
return (
<Button
aria-label="Modifica Prezziario"
onClick={() => {
setEditData({
desc_en: rowData.desc_en,
2025-08-29 16:18:32 +02:00
desc_it: rowData.desc_it,
idprezziario: rowData.id,
2025-08-28 18:27:07 +02:00
isAcconto: rowData.isAcconto,
isActive: rowData.isActive,
2025-08-29 16:18:32 +02:00
isConsulenza: rowData.isConsulenza,
isSaldo: rowData.isSaldo,
2025-08-28 18:27:07 +02:00
isStabile: rowData.isStabile,
2025-08-29 16:18:32 +02:00
isTransitorio: rowData.isTransitorio,
nome_en: rowData.nome_en,
nome_it: rowData.nome_it,
prezzo_cent: rowData.prezzo_cent,
sconto: rowData.sconto,
testo_condizioni: rowData.testo_condizioni,
2025-08-28 18:27:07 +02:00
});
setOpenEdit(true);
}}
2025-08-29 16:18:32 +02:00
variant="ghost"
2025-08-28 18:27:07 +02:00
>
<Cog className="text-neutral-600" />
</Button>
);
},
enableHiding: false,
enableSorting: false,
2025-08-29 16:18:32 +02:00
header: ({ column }) => (
<DataTableColumnHeader column={column} title={columns_titles.actions} />
),
2025-08-28 18:27:07 +02:00
},
];
const pinnedFiltri: PinnedFiltro[] = [
{
columnName: "categoria",
options: cat_options,
2025-08-29 16:18:32 +02:00
title: "Categoria",
2025-08-28 18:27:07 +02:00
},
];
const searchFiltro: SearchFiltro = {
columnName: "id",
placeholder: "Filtra codice...",
};
return (
<div className="mx-auto w-full px-2 py-10">
<DataTable
columns={columns}
2025-08-29 16:18:32 +02:00
columns_titles={columns_titles}
2025-08-28 18:27:07 +02:00
data={tabledata}
2025-08-29 16:18:32 +02:00
defaultSort={[{ desc: false, id: "id" }]}
2025-08-28 18:27:07 +02:00
pinnedFiltri={pinnedFiltri}
searchColumn={searchFiltro}
/>
</div>
);
2025-08-04 17:45:44 +02:00
};