Implemented test run editor's test case selection

This commit is contained in:
Takeshi Kimata
2024-04-14 22:43:55 +09:00
parent fa69592899
commit 4a4288d47a
3 changed files with 32 additions and 33 deletions

View File

@@ -263,7 +263,6 @@ export default function RunEditor({ projectId, runId }: Props) {
</div> </div>
<div className="w-9/12"> <div className="w-9/12">
<TestCaseSelector <TestCaseSelector
projectId={projectId}
cases={testcases} cases={testcases}
selectedKeys={selectedKeys} selectedKeys={selectedKeys}
onSelectionChange={setSelectedKeys} onSelectionChange={setSelectedKeys}

View File

@@ -14,9 +14,8 @@ import {
DropdownItem, DropdownItem,
Selection, Selection,
SortDescriptor, SortDescriptor,
Link,
} from "@nextui-org/react"; } from "@nextui-org/react";
import { MoreVertical } from "lucide-react"; import { ChevronDown, MoreVertical } from "lucide-react";
import { priorities, testRunCaseStatus } from "@/config/selection"; import { priorities, testRunCaseStatus } from "@/config/selection";
import { CaseType } from "@/types/case"; import { CaseType } from "@/types/case";
@@ -24,20 +23,17 @@ const headerColumns = [
{ name: "ID", uid: "id", sortable: true }, { name: "ID", uid: "id", sortable: true },
{ name: "Title", uid: "title", sortable: true }, { name: "Title", uid: "title", sortable: true },
{ name: "Priority", uid: "priority", sortable: true }, { name: "Priority", uid: "priority", sortable: true },
{ name: "isIncluded", uid: "isIncluded", sortable: true },
{ name: "Status", uid: "runStatus", sortable: true }, { name: "Status", uid: "runStatus", sortable: true },
{ name: "Actions", uid: "actions" }, { name: "Actions", uid: "actions" },
]; ];
type Props = { type Props = {
projectId: string;
cases: CaseType[]; cases: CaseType[];
selectedKeys: Selection; selectedKeys: Selection;
onSelectionChange: React.Dispatch<React.SetStateAction<Selection>>; onSelectionChange: React.Dispatch<React.SetStateAction<Selection>>;
}; };
export default function TestCaseSelector({ export default function TestCaseSelector({
projectId,
cases, cases,
selectedKeys, selectedKeys,
onSelectionChange, onSelectionChange,
@@ -56,27 +52,21 @@ export default function TestCaseSelector({
return sortDescriptor.direction === "descending" ? -cmp : cmp; return sortDescriptor.direction === "descending" ? -cmp : cmp;
}); });
}, [sortDescriptor, cases]); }, [sortDescriptor, cases]);
const notIncludedCaseClass = "text-neutral-200 dark:text-neutral-600";
const chipBaseClass = "border-none gap-1 text-default-600";
const renderCell = useCallback((testCase: CaseType, columnKey: Key) => { const renderCell = useCallback((testCase: CaseType, columnKey: Key) => {
const cellValue = testCase[columnKey as keyof CaseType]; const cellValue = testCase[columnKey as keyof CaseType];
// console.log(columnKey, cellValue) const isIncluded = testCase.isIncluded;
switch (columnKey) { switch (columnKey) {
case "id":
return <span>{cellValue}</span>;
case "title":
return (
<Link
underline="hover"
href={`/projects/${projectId}/folders/${testCase.folderId}/cases/${testCase.id}`}
className="dark:text-white"
>
{cellValue}
</Link>
);
case "priority": case "priority":
return ( return (
<Chip <Chip
className="border-none gap-1 text-default-600" className={
isIncluded ? chipBaseClass : chipBaseClass + notIncludedCaseClass
}
color={priorities[cellValue].color} color={priorities[cellValue].color}
size="sm" size="sm"
variant="dot" variant="dot"
@@ -84,19 +74,27 @@ export default function TestCaseSelector({
{priorities[cellValue].name} {priorities[cellValue].name}
</Chip> </Chip>
); );
case "isIncluded":
const flag = cellValue ? "true" : "false"
return <span>{flag}</span>;
case "runStatus": case "runStatus":
return ( return (
<Chip <Dropdown>
className="border-none gap-1 text-default-600" <DropdownTrigger>
color={testRunCaseStatus[cellValue].color} <Button
size="sm" size="sm"
variant="dot" variant="light"
> isDisabled={!isIncluded}
{testRunCaseStatus[cellValue].name} endContent={isIncluded ? <ChevronDown size={16} /> : <></>}
</Chip> >
{isIncluded ? testRunCaseStatus[cellValue].name : <></>}
</Button>
</DropdownTrigger>
<DropdownMenu aria-label="test case actions">
{testRunCaseStatus.map((runCaseStatus, index) => (
<DropdownItem key={index} onClick={() => {}}>
{testRunCaseStatus[index].name}
</DropdownItem>
))}
</DropdownMenu>
</Dropdown>
); );
case "actions": case "actions":
return ( return (
@@ -167,7 +165,10 @@ export default function TestCaseSelector({
</TableHeader> </TableHeader>
<TableBody emptyContent={"No cases found"} items={sortedItems}> <TableBody emptyContent={"No cases found"} items={sortedItems}>
{(item) => ( {(item) => (
<TableRow key={item.id}> <TableRow
key={item.id}
className={!item.isIncluded ? notIncludedCaseClass : ""}
>
{(columnKey) => ( {(columnKey) => (
<TableCell>{renderCell(item, columnKey)}</TableCell> <TableCell>{renderCell(item, columnKey)}</TableCell>
)} )}

View File

@@ -43,7 +43,6 @@ const testRunStatus = [
] ]
const testRunCaseStatus = [ const testRunCaseStatus = [
{ name: "Not included", uid: "notincluded", color: "primary" },
{ name: "Untested", uid: "untested", color: "primary" }, { name: "Untested", uid: "untested", color: "primary" },
{ name: "Passed", uid: "passed", color: "success" }, { name: "Passed", uid: "passed", color: "success" },
{ name: "Failed", uid: "untested", color: "danger" }, { name: "Failed", uid: "untested", color: "danger" },