import { MoreVertical, Play, Trash } from 'lucide-react' import { motion, AnimatePresence } from 'framer-motion' import { useDatabaseTestQuery } from 'data/database-tests/database-test-query' import { useState } from 'react' import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, Badge, } from 'ui' import TestStatusHoverCard from './TestStatusHoverCard' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' import { ButtonTooltip } from 'components/ui/ButtonTooltip' import { DatabaseTest } from 'data/database-tests/database-tests-query' import { DatabaseTestStatus } from './Tests.types' import { useSelectedProjectQuery } from 'hooks/misc/useSelectedProject' import { useDatabaseTestDeleteMutation } from 'data/database-tests/database-test-delete-mutation' interface TestRowProps { test: DatabaseTest & { status: DatabaseTestStatus } canRun?: boolean onSelectTest: (test: DatabaseTest) => void onRun: () => void isActive: boolean index: number isLast: boolean status?: DatabaseTestStatus } const TestRow = ({ test, canRun = false, onSelectTest, onRun, index, isLast, isActive, status = test.status, }: TestRowProps) => { const { data: project } = useSelectedProjectQuery() const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false) const shouldFetchDetail = isActive const { data: testDetail, refetch } = useDatabaseTestQuery( { projectRef: project?.ref, id: test.id }, { enabled: shouldFetchDetail } ) const { mutate: deleteTest, isLoading: isDeleting } = useDatabaseTestDeleteMutation({ onSuccess: () => { setIsDeleteModalOpen(false) }, }) const ensureQuery = async (): Promise => { if (testDetail?.query) return testDetail.query if (test.query && test.query.length > 0) return test.query // Fetch latest if needed const { data } = await refetch() return data?.query ?? '' } const onDelete = () => { if (!project) return deleteTest({ projectRef: project.ref, id: test.id }) } const getStatusBadge = () => { if (status === 'running') return { label: 'Running', variant: 'warning' as const } switch (status) { case 'passed': return { label: 'Passing', variant: 'success' as const } case 'failed': return { label: 'Failing', variant: 'destructive' as const } case 'queued': return { label: 'Queued', variant: 'secondary' as const } default: return undefined } } const getCircleClasses = () => { if (status === 'running') return 'bg-surface-300 border-default text-foreground' return 'bg border text-foreground-lighter' } return ( <>
{status === 'running' && ( )}
{/* Step number / status circle */}
{index + 1} {/* Dotted connective line */}
{/* Test name */}

{ const sql = await ensureQuery() onSelectTest({ ...test, query: sql }) }} > {test.name}

{/* Status hover card */} {(() => { const badge = getStatusBadge() if (!badge) return
return ( {badge.label} ) })()} {/* Run button */} {canRun && ( } loading={status === 'running'} disabled={status === 'running' || status === 'queued'} onClick={onRun} tooltip={{ content: { side: 'bottom' } }} className="h-7 w-7" /> )} {/* Actions dropdown */}
setIsDeleteModalOpen(false)} onConfirm={onDelete} loading={isDeleting} >

Are you sure you want to delete the test "{test.name}"? This action cannot be undone.

) } export default TestRow