import { ColorBadge, DataTable, DataTableSkeleton, DownloadDialog, ErrorOverlay, SimpleEmptyState, } from "@/components"; import { DataTableToolbar } from "@/components/DataTable/DataTableToolbar"; import { useDataTable, useDataTableContext } from "@/lib/hooks"; import { Button, Card, CardContent, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, ResizableHandle, ResizablePanel, ResizablePanelGroup, Tooltip, TooltipContent, TooltipTrigger, } from "@/ui"; import { IListQuotes_Response_DTO, MoneyValue, UTCDateValue } from "@shared/contexts"; import { ColumnDef, Row } from "@tanstack/react-table"; import { t } from "i18next"; import { FilePenLineIcon, MoreVerticalIcon } from "lucide-react"; import { useEffect, useMemo, useState } from "react"; import { useNavigate } from "react-router-dom"; import useDownloader from "react-use-downloader"; import { useQuotes } from "../hooks"; import { QuotePDFPreview } from "./QuotePDFPreview"; export const QuotesDataTable = ({ status = "all", preview = false, }: { status?: string; preview?: boolean; }) => { const navigate = useNavigate(); const { pagination, globalFilter, isFiltered } = useDataTableContext(); const [activeRow, setActiveRow] = useState | undefined>(undefined); const { useList, getQuotePDFFilename } = useQuotes(); const { data, isPending, isError, error } = useList({ pagination: { pageIndex: pagination.pageIndex, pageSize: pagination.pageSize, }, status, quickSearchTerm: globalFilter, }); const { download, ...downloadProps } = useDownloader(); const columns = useMemo[]>( () => [ { id: "date" as const, accessor: "date", header: () => <>{t("quotes.list.columns.date")}, cell: ({ row: { original } }) => { const quoteDate = UTCDateValue.create(original.date); return (
{quoteDate.isSuccess ? quoteDate.object.toLocaleDateString("es-ES") : "-"}
); }, enableResizing: false, }, { id: "customer_information" as const, accessorKey: "customer_information", header: () => <>{t("quotes.list.columns.customer_information")}, cell: ({ row: { original } }) => (
{original.customer_information.split("\n").map((item, index) => { return ( {item}
); })}
), enableResizing: false, size: 640, }, { id: "reference" as const, accessorKey: "reference", header: () => <>{t("quotes.list.columns.reference")}, cell: ({ renderValue }) =>
{renderValue()}
, enableResizing: false, }, { id: "status" as const, accessorKey: "status", header: () => <>{t("quotes.list.columns.status")}, // eslint-disable-next-line @typescript-eslint/no-explicit-any cell: ({ row: { original } }) => , enableResizing: false, }, { id: "total_price" as const, accessor: "total_price", header: () =>
{t("quotes.list.columns.total_price")}
, cell: ({ row: { original } }) => { const price = MoneyValue.create(original.total_price); return (
{price.isSuccess ? price.object.toFormat() : "-"}
); }, enableResizing: false, }, { id: "row-actions", header: () => null, cell: ({ row }: { row: Row }) => (

{t("quotes.list.columns.actions.edit")}

Edit { e.preventDefault(); download(row.original.id, getQuotePDFFilename(row.original)); }} > Download Trash
), enableResizing: false, }, ], // eslint-disable-next-line react-hooks/exhaustive-deps [] ); const handleOnPaginationChange = () => { //setActiveRow(undefined); }; const { table } = useDataTable({ data: data?.items ?? [], columns: columns, pageCount: data?.total_pages ?? -1, onPaginationChange: handleOnPaginationChange, }); const handleOnRowClick = (row: Row) => { setActiveRow(row); }; useEffect(() => { if (table && data && data?.total_pages > 0) { setActiveRow(table.getRowModel().rows[0]); } }, [data, table]); if (isError) { return ; } if (isPending) { return (
); } if (data?.total_items === 0 && !isFiltered) { return ( navigate("add", { relative: "path" })} /> ); } return ( <> {preview && } {preview && ( )} ); };