import { WorkflowRunLog } from "@/domain/workflow"; import { logs } from "@/repository/workflow"; import { ColumnDef } from "@tanstack/react-table"; import { useState } from "react"; import { DataTable } from "./DataTable"; import { useSearchParams } from "react-router-dom"; import { Check, X } from "lucide-react"; import WorkflowLogDetail from "./WorkflowLogDetail"; import { useTranslation } from "react-i18next"; const WorkflowLog = () => { const [data, setData] = useState<WorkflowRunLog[]>([]); const [pageCount, setPageCount] = useState<number>(0); const [searchParams] = useSearchParams(); const id = searchParams.get("id"); const { t } = useTranslation(); const [open, setOpen] = useState(false); const [selectedLog, setSelectedLog] = useState<WorkflowRunLog>(); const fetchData = async (page: number, pageSize?: number) => { const resp = await logs({ page: page, perPage: pageSize, id: id ?? "" }); setData(resp.items); setPageCount(resp.totalPages); }; const columns: ColumnDef<WorkflowRunLog>[] = [ { accessorKey: "succeed", header: t("workflow.history.props.state"), cell: ({ row }) => { const succeed: boolean = row.getValue("succeed"); if (succeed) { return ( <div className="flex items-center space-x-2 min-w-[150px]"> <div className="text-white bg-green-500 w-8 h-8 rounded-full flex items-center justify-center"> <Check size={18} /> </div> <div className="text-sone-700">{t("workflow.history.props.state.success")}</div> </div> ); } else { return ( <div className="flex items-center space-x-2 min-w-[150px]"> <div className="text-white bg-red-500 w-8 h-8 rounded-full flex items-center justify-center"> <X size={18} /> </div> <div className="text-stone-700">{t("workflow.history.props.state.failed")}</div> </div> ); } }, }, { accessorKey: "error", header: t("workflow.history.props.reason"), cell: ({ row }) => { let error: string = row.getValue("error"); if (!error) { error = ""; } return <div className="max-w-[300px] truncate text-red-500">{error}</div>; }, }, { accessorKey: "created", header: t("workflow.history.props.time"), cell: ({ row }) => { const date: string = row.getValue("created"); return new Date(date).toLocaleString(); }, }, ]; const handleRowClick = (id: string) => { setOpen(true); const log = data.find((item) => item.id === id); setSelectedLog(log); }; return ( <div className="w-full md:w-[960px]"> <div> <div className="text-muted-foreground mb-5">{t("workflow.history.page.title")}</div> <DataTable columns={columns} data={data} onPageChange={fetchData} pageCount={pageCount} onRowClick={handleRowClick} /> </div> <WorkflowLogDetail open={open} onOpenChange={setOpen} log={selectedLog} /> </div> ); }; export default WorkflowLog;