"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 TestCaseSelector from "./TestCaseSelector"; import { testRunStatus } from "@/config/selection"; import { RunType, RunCaseType } from "@/types/run"; import { CaseType } from "@/types/case"; import { FolderType } from "@/types/folder"; import { fetchRun, updateRun, fetchRunCases, createRunCase, deleteRunCase, } 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); } 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 handleIncludeExcludeCase = async ( isInclude: boolean, clickedTestCaseId: number ) => { let createdRunCase: RunCaseType; if (isInclude) { createdRunCase = await createRunCase(runId, clickedTestCaseId); } else { await deleteRunCase(runId, clickedTestCaseId); } setTestCases((prevTestCases) => { return prevTestCases.map((testCase) => { if (testCase.id === clickedTestCaseId) { return { ...testCase, isIncluded: isInclude }; } return testCase; }); }); if (isInclude) { setRunCases((prevRunCases) => { return [...prevRunCases, createdRunCase]; }); } else { setRunCases((prevRunCases) => { return prevRunCases.filter( (runCase) => runCase.caseId !== clickedTestCaseId ); }); } }; const onIncludeExcludeClick = async (mode: string) => { console.log(mode); if (selectedKeys === "all") { const allKeys = testcases.map((item) => item.id); console.log(allKeys); } else { console.log([...selectedKeys]); } setSelectedKeys(new Set([])); }; const baseClass = ""; const selectedClass = `${baseClass} bg-neutral-200 dark:bg-neutral-700`; return ( <>

{testRun.name}

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