"use client"; import React from "react"; import { useState, useEffect } from "react"; import { useRouter } from "next/navigation"; import { Button, Input, Textarea, Select, SelectItem, Tooltip, Listbox, ListboxItem, Divider, Selection, DropdownTrigger, Dropdown, DropdownMenu, DropdownItem, } from "@nextui-org/react"; import { Save, ArrowLeft, Folder, ChevronDown, CopyPlus, CopyMinus, } from "lucide-react"; import RunProgressDounut from "./RunPregressDonutChart"; import TestCaseSelector from "./TestCaseSelector"; import { testRunStatus } from "@/config/selection"; import { RunType, RunCaseType, RunCaseInfoType } from "@/types/run"; import { CaseType } from "@/types/case"; import { FolderType } from "@/types/folder"; import { fetchRun, updateRun, fetchRunCases, createRunCase, updateRunCase, bulkCreateRunCases, deleteRunCase, bulkDeleteRunCases, } from "../runsControl"; import { fetchFolders } from "../../folders/foldersControl"; import { fetchCases } from "../../folders/[folderId]/cases/caseControl"; const defaultTestRun = { id: 0, name: "", configurations: 0, description: "", state: 0, projectId: 0, }; type Props = { projectId: string; runId: string; }; export default function RunEditor({ projectId, runId }: Props) { const [testRun, setTestRun] = useState(defaultTestRun); const [folders, setFolders] = useState([]); const [runCases, setRunCases] = useState([]); const [selectedKeys, setSelectedKeys] = useState(new Set([])); const [selectedFolder, setSelectedFolder] = useState({}); const [testcases, setTestCases] = useState([]); const [isNameInvalid, setIsNameInvalid] = useState(false); const [isUpdating, setIsUpdating] = useState(false); const router = useRouter(); useEffect(() => { async function fetchDataEffect() { try { const runData = await fetchRun(runId); setTestRun(runData); const foldersData = await fetchFolders(projectId); setFolders(foldersData); setSelectedFolder(foldersData[0]); } catch (error: any) { console.error("Error in effect:", error.message); } } fetchDataEffect(); }, []); useEffect(() => { async function fetchCasesData() { if (selectedFolder && selectedFolder.id) { try { const latestRunCases = await fetchRunCases(runId); setRunCases(latestRunCases); const testCasesData = await fetchCases(selectedFolder.id); // Check if each testCase has an association with testRun // and add "isIncluded" property const updatedTestCasesData = testCasesData.map((testCase) => { const runCase = latestRunCases.find( (runCase) => runCase.caseId === testCase.id ); const isIncluded = runCase ? true : false; const runStatus = runCase ? runCase.status : 0; return { ...testCase, isIncluded, runStatus, }; }); setTestCases(updatedTestCasesData); } catch (error: any) { console.error("Error fetching cases data:", error.message); } } } fetchCasesData(); }, [selectedFolder]); const handleChangeStatus = async (changeCaseId: number, status: number) => { await updateRunCase(runId, changeCaseId, status); setTestCases((prevTestCases) => { return prevTestCases.map((testCase) => { if (testCase.id === changeCaseId) { return { ...testCase, runStatus: status }; } return testCase; }); }); }; const handleIncludeExcludeCase = async ( isInclude: boolean, clickedTestCaseId: number ) => { if (isInclude) { const createdRunCase = await createRunCase(runId, clickedTestCaseId); setRunCases((prevRunCases) => { return [...prevRunCases, createdRunCase]; }); } else { await deleteRunCase(runId, clickedTestCaseId); setRunCases((prevRunCases) => { return prevRunCases.filter( (runCase) => runCase.caseId !== clickedTestCaseId ); }); } setTestCases((prevTestCases) => { return prevTestCases.map((testCase) => { if (testCase.id === clickedTestCaseId) { return { ...testCase, isIncluded: isInclude }; } return testCase; }); }); }; const handleBulkIncludeExcludeCases = async (isInclude: boolean) => { let keys: number[] = []; if (selectedKeys === "all") { keys = testcases.map((item) => item.id); } else { keys = Array.from(selectedKeys).map(Number); } const runCaseInfo: RunCaseInfoType[] = keys.map((caseId) => ({ runId: runId, caseId: caseId, })); if (isInclude) { const createdRunCases = await bulkCreateRunCases(runCaseInfo); setRunCases((prevRunCases) => [...prevRunCases, ...createdRunCases]); } else { await bulkDeleteRunCases(runCaseInfo); setRunCases((prevRunCases) => { return prevRunCases.filter((runCase) => { return !runCaseInfo.some((info) => info.caseId === runCase.caseId); }); }); } const updatedTestCases = testcases.map((testcase) => { if (keys.includes(testcase.id)) { return { ...testcase, isIncluded: isInclude }; } return testcase; }); setTestCases(updatedTestCases); setSelectedKeys(new Set([])); }; const baseClass = ""; const selectedClass = `${baseClass} bg-neutral-200 dark:bg-neutral-700`; return ( <>

{testRun.name}

{ setTestRun({ ...testRun, name: e.target.value }); }} className="mt-3" />