"use client"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { Badge } from "@/components/ui/badge"; import { cn } from "@/lib/utils"; import { PRData, TestsData } from "@/app/Interfaces/interface"; import React, { useEffect, useState } from "react"; import { Button } from "./ui/button"; import { codeSnippets } from "@/public/snippets"; import { Checkbox } from "./ui/checkbox"; import { useCopilotAction, ActionRenderPropsWait, } from "@copilotkit/react-core"; import { PlayCircle, Loader2, CheckCircle2, XCircle } from "lucide-react"; import { ChatGrid } from "./data-chat-grid"; interface DataTableProps { columns: { accessorKey: string; header: string; }[]; data: TestsData[]; onToggle: (testSuite: TestsData[]) => void; setTestsData: (testsData: TestsData[]) => void; testsData: TestsData[]; } export function DataTable({ columns, data, onToggle, setTestsData, testsData, }: DataTableProps) { const [expandedRow, setExpandedRow] = useState(null); const [selectedIndex, setSelectedIndex] = useState(0); const [testSuite, setTestSuite] = useState(data || []); const [testSuiteToMove, setTestSuiteToMove] = useState([]); const [testStatus, setTestStatus] = useState<{ [key: number]: "idle" | "running" | "passed" | "failed"; }>({}); const [testCaseStatus, setTestCaseStatus] = useState<{ [rowIndex: number]: string[]; }>({}); const [snippetsHandler, setSnippetsHandler] = useState([]); // Get all possible keys from data (assuming all rows have same keys) const allKeys = data.length > 0 ? Object.keys(data[0]) : []; const mainKeys = columns.map((col) => col.accessorKey); const extraKeys = allKeys.filter((key) => !mainKeys.includes(key)); useEffect(() => { setTestSuite(data); setTestStatus((prev) => ({ ...prev, ...Object.fromEntries(data.map((item, index) => [index, item.status])), })); }, [data]); const handleRowClick = (rowIndex: number) => { setExpandedRow(expandedRow === rowIndex ? null : rowIndex); }; // Handler for play icon const runTest = (rowIndex: number, row: TestsData) => { if (testStatus[rowIndex] === "running") return; setTestStatus((prev) => ({ ...prev, [rowIndex]: "running" })); setTestCaseStatus((prev) => ({ ...prev, [rowIndex]: testSuite[rowIndex]?.testCases.map(() => "running"), })); setTimeout(() => { const isPassed = Math.random() > 0.5; setTestStatus((prev) => ({ ...prev, [rowIndex]: isPassed ? "passed" : "failed", })); setTestCaseStatus((prev) => ({ ...prev, [rowIndex]: testSuite[rowIndex]?.testCases.map(() => isPassed ? "passed" : "failed", ), })); const suiteToMove = testSuite[rowIndex]; console.log(suiteToMove, "suiteToMove", rowIndex); if (suiteToMove) { // onToggle([...testSuite.filter((_, idx) => idx !== rowIndex)]) console.log(suiteToMove, "suiteToMove"); suiteToMove.testCases.forEach((element) => { element.status = isPassed ? "passed" : "failed"; }); suiteToMove.status = isPassed ? "passed" : "failed"; console.log(testSuiteToMove, "testSuiteToMove"); setTestSuiteToMove([ ...testSuiteToMove, { title: suiteToMove.title, status: suiteToMove.status, shortDescription: suiteToMove.shortDescription, testCases: suiteToMove.testCases, testId: suiteToMove.testId, prId: suiteToMove.prId, failedTestCases: suiteToMove.failedTestCases, passedTestCases: suiteToMove.passedTestCases, skippedTestCases: suiteToMove.skippedTestCases, totalTestCases: suiteToMove.totalTestCases, codeSnippet: suiteToMove.codeSnippet, executedBy: suiteToMove.executedBy, coverage: suiteToMove.coverage, createdAt: suiteToMove.createdAt, updatedAt: suiteToMove.updatedAt, }, ]); } }, 2000); }; return (
{columns.map((column) => ( {column.header} ))} {testSuite.length == 0 ? ( No test data available. ) : ( testSuite.map((row, rowIndex) => ( handleRowClick(rowIndex)} style={{ cursor: "default" }} > {columns.map((column) => ( {column.accessorKey === "status" ? (
{testStatus[rowIndex] === "running" ? ( ) : testStatus[rowIndex] === "passed" ? ( ) : testStatus[rowIndex] === "failed" ? ( ) : ( { e.stopPropagation(); if ( !Object.values(testStatus).some( (status) => status === "running", ) ) { runTest(rowIndex, row); } }} /> )}
) : ( String(row[column.accessorKey as keyof TestsData]) )}
))}
{expandedRow === rowIndex && (
Description:
{row.shortDescription || "No description available."}
Code Snippet:
                          {
                            codeSnippets[
                              Math.floor(Math.random() * codeSnippets.length)
                            ]
                          }
                        
Test Cases:
    {row.testCases.map((tc, idx) => (
  • {tc.name}
  • ))}
)}
)) )}
); } const getStatusColor = (status: string) => { switch (status) { case "in_progress": return "bg-blue-100 text-blue-700"; case "passed": return "bg-green-100 text-green-700"; case "failed": return "bg-red-100 text-red-700"; case "skipped": return "bg-gray-100 text-gray-700"; default: return "bg-gray-100 text-gray-700"; } }; function StatusBadge({ status }: { status: string }) { return ( {status.split("_").join(" ")} ); }