From d94af046c070126b60a954cb3468dc690cda14e1 Mon Sep 17 00:00:00 2001 From: Takeshi Kimata <117462761+kimatata@users.noreply.github.com> Date: Sun, 17 Mar 2024 17:32:19 +0900 Subject: [PATCH] Refactored case edit pane's jsx and methods --- ...editor.tsx => case-attachments-editor.tsx} | 4 +- .../[folderId]/cases/[caseId]/case-editor.tsx | 370 +++++++++++++ ...steps-editor.tsx => case-steps-editor.tsx} | 2 +- .../[folderId]/cases/[caseId]/caseControl.ts | 132 +++++ .../[folderId]/cases/[caseId]/caseTypes.ts | 50 ++ .../[folderId]/cases/[caseId]/page.tsx | 513 +----------------- .../folders/[folderId]/cases/page.tsx | 14 - .../[folderId]/cases/test-case-table.tsx | 84 +-- .../projects/[projectId]/folders/layout.tsx | 14 - 9 files changed, 613 insertions(+), 570 deletions(-) rename frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/{attachments-editor.tsx => case-attachments-editor.tsx} (95%) create mode 100644 frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/case-editor.tsx rename frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/{steps-editor.tsx => case-steps-editor.tsx} (98%) create mode 100644 frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/caseControl.ts create mode 100644 frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/caseTypes.ts diff --git a/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/attachments-editor.tsx b/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/case-attachments-editor.tsx similarity index 95% rename from frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/attachments-editor.tsx rename to frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/case-attachments-editor.tsx index 6d0b970..808b659 100644 --- a/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/attachments-editor.tsx +++ b/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/case-attachments-editor.tsx @@ -1,5 +1,5 @@ import { Image, Button, Tooltip } from "@nextui-org/react"; -import { AttachmentType } from "./page"; +import { AttachmentType } from "./caseTypes"; import { Trash } from "lucide-react"; type Props = { @@ -7,7 +7,7 @@ type Props = { onAttachmentDelete: (attachmentId: number) => void; }; -export default function AttachmentsEditor({ +export default function CaseAttachmentsEditor({ attachments = [], onAttachmentDelete, }: Props) { diff --git a/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/case-editor.tsx b/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/case-editor.tsx new file mode 100644 index 0000000..6e39c7a --- /dev/null +++ b/frontend/app/projects/[projectId]/folders/[folderId]/cases/[caseId]/case-editor.tsx @@ -0,0 +1,370 @@ +"use client"; +import { useEffect, useState } from "react"; +import { + Input, + Textarea, + Select, + SelectItem, + Chip, + Button, + Divider, + Tooltip, +} from "@nextui-org/react"; +import { useRouter } from "next/navigation"; +import { Save, Plus, ArrowLeft, ArrowUpFromLine } from "lucide-react"; +import { priorities, testTypes, templates } from "@/config/selection"; +import CaseStepsEditor from "./case-steps-editor"; +import CaseAttachmentsEditor from "./case-attachments-editor"; +import { CaseType } from "./caseTypes"; +import { + fetchCase, + fetchCreateStep, + fetchDeleteStep, + updateCase, + fetchCreateAttachments, +} from "./caseControl"; + +const defaultTestCase = { + id: 0, + title: "", + state: 0, + priority: 0, + type: 0, + automationStatus: 0, + description: "", + template: 0, + preConditions: "", + expectedResults: "", + folderId: 0, +}; + +export default function CaseEditor({ + params, +}: { + params: { projectId: string; folderId: string; caseId: string }; +}) { + const [testCase, setTestCase] = useState(defaultTestCase); + const [isTitleInvalid, setIsTitleInvalid] = useState(false); + const [isUpdating, setIsUpdating] = useState(false); + const router = useRouter(); + + const onPlusClick = async (newStepNo: number) => { + const newStep = await fetchCreateStep(newStepNo, params.caseId); + if (newStep) { + newStep.caseSteps = { stepNo: newStepNo }; + const updatedSteps = testCase.Steps.map((step) => { + if (step.caseSteps.stepNo >= newStepNo) { + return { + ...step, + caseSteps: { + ...step.caseSteps, + stepNo: step.caseSteps.stepNo + 1, + }, + }; + } + return step; + }); + + updatedSteps.push(newStep); + + setTestCase({ + ...testCase, + Steps: updatedSteps, + }); + } + }; + + const onDeleteClick = async (stepId: number) => { + // find deletedStep's stepNo + const deletedStep = testCase.Steps.find((step) => step.id === stepId); + if (!deletedStep) { + return; + } + const deletedStepNo = deletedStep.caseSteps.stepNo; + + // delete request + await fetchDeleteStep(stepId, params.caseId); + + const updatedSteps = testCase.Steps.map((step) => { + if (step.caseSteps.stepNo > deletedStepNo) { + return { + ...step, + caseSteps: { + ...step.caseSteps, + stepNo: step.caseSteps.stepNo - 1, + }, + }; + } + return step; + }).filter((step) => step.id !== stepId); + + setTestCase({ + ...testCase, + Steps: updatedSteps, + }); + }; + + const handleDrop = (event) => { + event.preventDefault(); + fetchCreateAttachments(params.caseId, event.dataTransfer.files); + }; + + const handleInput = (event) => { + fetchCreateAttachments(params.caseId, event.target.files); + }; + + useEffect(() => { + async function fetchDataEffect() { + try { + const data = await fetchCase(params.caseId); + setTestCase(data); + } catch (error) { + console.error("Error in effect:", error.message); + } + } + + fetchDataEffect(); + }, []); + + return ( + <> +
+
+ + + +

{testCase.title}

+
+ +
+ +
+
Basic
+ { + setTestCase({ ...testCase, title: e.target.value }); + }} + className="mt-3" + /> + +