import { useState, useMemo } from "react"; import { Table, TableHeader, TableColumn, TableBody, TableRow, TableCell, Button, Chip, DropdownTrigger, Dropdown, DropdownMenu, DropdownItem, Selection, SortDescriptor, } from "@nextui-org/react"; import { ChevronDown, MoreVertical, CopyPlus, CopyMinus, Circle, CircleCheck, CircleX, CircleSlash2 } from "lucide-react"; import { priorities, testRunCaseStatus } from "@/config/selection"; import { CaseType } from "@/types/case"; const headerColumns = [ { name: "ID", uid: "id", sortable: true }, { name: "Title", uid: "title", sortable: true }, { name: "Priority", uid: "priority", sortable: true }, { name: "Status", uid: "runStatus", sortable: true }, { name: "Actions", uid: "actions" }, ]; type Props = { cases: CaseType[]; selectedKeys: Selection; onSelectionChange: React.Dispatch>; onIncludeCase: (includeCaseId: number) => {}; onExcludeCase: (excludeCaseId: number) => {}; }; export default function TestCaseSelector({ cases, selectedKeys, onSelectionChange, onIncludeCase, onExcludeCase, }: Props) { const [sortDescriptor, setSortDescriptor] = useState({ column: "id", direction: "ascending", }); const sortedItems = useMemo(() => { return [...cases].sort((a: CaseType, b: CaseType) => { const first = a[sortDescriptor.column as keyof CaseType] as number; const second = b[sortDescriptor.column as keyof CaseType] as number; const cmp = first < second ? -1 : first > second ? 1 : 0; return sortDescriptor.direction === "descending" ? -cmp : cmp; }); }, [sortDescriptor, cases]); const notIncludedCaseClass = "text-neutral-200 dark:text-neutral-600"; const chipBaseClass = "border-none gap-1 text-default-600"; const renderStatusIcon = (uid: string) => { if (uid === "untested") { return ; } else if (uid === "passed") { return ; } else if (uid === "failed") { return ; } else if (uid === "skipped") { return ; } }; const renderCell = (testCase: CaseType, columnKey: Key) => { const cellValue = testCase[columnKey as keyof CaseType]; const isIncluded = testCase.isIncluded; switch (columnKey) { case "priority": return ( {priorities[cellValue].name} ); case "runStatus": return ( {testRunCaseStatus.map((runCaseStatus, index) => ( {}} > {runCaseStatus.name} ))} ); case "actions": return ( } isDisabled={testCase.isIncluded} onPress={() => onIncludeCase(testCase.id)} > Include in run } isDisabled={!testCase.isIncluded} onPress={() => onExcludeCase(testCase.id)} > Exclude from run ); default: return cellValue; } }; const classNames = useMemo( () => ({ wrapper: ["min-w-3xl"], th: ["bg-transparent", "text-default-500", "border-b", "border-divider"], td: [ // changing the rows border radius // first "group-data-[first=true]:first:before:rounded-none", "group-data-[first=true]:last:before:rounded-none", // middle "group-data-[middle=true]:before:rounded-none", // last "group-data-[last=true]:first:before:rounded-none", "group-data-[last=true]:last:before:rounded-none", ], }), [] ); const handleSelectionChange = (keys: Selection) => { onSelectionChange(keys); }; return ( <> {(column) => ( {column.name} )} {(item) => ( {(columnKey) => ( {renderCell(item, columnKey)} )} )}
); }