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

110 lines
2.5 KiB
TypeScript
Raw Normal View History

2025-08-04 17:45:44 +02:00
import type { ColumnDef } from "@tanstack/react-table";
import { Cog } from "lucide-react";
import { DataTable } from "~/components/custom_ui/data-table";
2025-08-28 18:27:07 +02:00
import { DataTableColumnHeader } from "~/components/custom_ui/dataTable-header";
2025-08-04 17:45:44 +02:00
import type { SearchFiltro } from "~/components/custom_ui/dataTable-toolbar";
2025-08-28 18:27:07 +02:00
import { Etichetta } from "~/components/etichette";
2025-08-04 17:45:44 +02:00
import { Button } from "~/components/ui/button";
import type { Etichette } from "~/schemas/public/Etichette";
export const EtichetteTable = (props: {
2025-08-28 18:27:07 +02:00
data: Etichette[];
setOpenEdit: (status: boolean) => void;
setEditData: (data: Etichette | null) => void;
2025-08-04 17:45:44 +02:00
}) => {
2025-08-28 18:27:07 +02:00
const { data, setOpenEdit, setEditData } = props;
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",
colore: row.color_hex,
2025-08-28 18:27:07 +02:00
id: row.id_etichetta,
title: row.title,
};
});
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
const columns_titles = {
actions: "Azioni",
2025-08-29 16:18:32 +02:00
etichetta: "Etichetta",
id: "Id",
2025-08-28 18:27:07 +02:00
};
type Column = (typeof tabledata)[number];
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
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} />
),
},
{
accessorKey: "title",
cell: ({ row }) => {
const data = row.original;
return (
<Etichetta
className="text-base"
2025-08-29 16:18:32 +02:00
color_hex={data.colore}
title={data.title}
2025-08-28 18:27:07 +02:00
/>
);
},
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
enableHiding: false,
2025-08-29 16:18:32 +02:00
header: ({ column }) => (
<DataTableColumnHeader
column={column}
title={columns_titles.etichetta}
/>
),
2025-08-28 18:27:07 +02:00
},
2025-08-04 17:45:44 +02:00
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 data = row.original;
return (
<Button
aria-label="Modifica Etichetta"
onClick={() => {
setEditData({
2025-08-29 16:18:32 +02:00
color_hex: data.colore,
2025-08-28 18:27:07 +02:00
id_etichetta: data.id,
title: data.title,
});
setOpenEdit(true);
}}
2025-08-29 16:18:32 +02:00
variant="outline"
2025-08-28 18:27:07 +02:00
>
<div className="flex items-center gap-2">
<Cog /> Modifica
</div>
</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
},
];
2025-08-04 17:45:44 +02:00
2025-08-28 18:27:07 +02:00
const searchFiltro: SearchFiltro = {
columnName: "title",
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: true, id: "id" }]}
2025-08-28 18:27:07 +02:00
pinnedFiltri={undefined}
searchColumn={searchFiltro}
/>
</div>
);
2025-08-04 17:45:44 +02:00
};