'use client' import { useState, useTransition } from 'react' import { useRouter } from 'next/navigation' import type { ClaudeJobStatus } from '@prisma/client' import { Badge } from '@/components/ui/badge' import { Button } from '@/components/ui/button' import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, DialogClose, } from '@/components/ui/dialog' import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from '@/components/ui/table' import { cancelJobAction, deleteJobAction } from '@/actions/admin/jobs' const TERMINAL_STATUSES: ClaudeJobStatus[] = ['DONE', 'FAILED', 'CANCELLED'] const STATUS_CLASS: Record = { QUEUED: 'bg-status-todo/15 text-status-todo border-status-todo/30', CLAIMED: 'bg-status-in-progress/15 text-status-in-progress border-status-in-progress/30', RUNNING: 'bg-status-in-progress/15 text-status-in-progress border-status-in-progress/30', DONE: 'bg-status-done/15 text-status-done border-status-done/30', FAILED: 'bg-destructive/15 text-destructive border-destructive/30', CANCELLED: 'bg-secondary text-secondary-foreground border-border', } type Job = { id: string status: ClaudeJobStatus kind: string user: { username: string } product: { name: string } created_at: Date error: string | null } const ALL_STATUSES: ClaudeJobStatus[] = ['QUEUED', 'CLAIMED', 'RUNNING', 'DONE', 'FAILED', 'CANCELLED'] function DeleteDialog({ job }: { job: Job }) { const [open, setOpen] = useState(false) const [pending, startTransition] = useTransition() function handleDelete() { startTransition(async () => { await deleteJobAction(job.id) setOpen(false) }) } return ( }> Verwijder Job verwijderen

Weet je zeker dat je job {job.id.slice(-8)} wilt verwijderen?

}>Annuleer
) } function CancelButton({ job }: { job: Job }) { const [pending, startTransition] = useTransition() const isTerminal = TERMINAL_STATUSES.includes(job.status) function handleCancel() { startTransition(async () => { await cancelJobAction(job.id) }) } return ( ) } export function StatusFilter({ current }: { current: string }) { const router = useRouter() return ( ) } export function JobsTable({ jobs }: { jobs: Job[] }) { return ( Status Kind User Product Aangemaakt Error Acties {jobs.map(job => ( {job.status} {job.kind} {job.user.username} {job.product.name} {new Date(job.created_at).toLocaleString('nl-NL')} {job.error ? ( {job.error.slice(0, 80)}{job.error.length > 80 ? '…' : ''} ) : ( )}
))} {jobs.length === 0 && ( Geen jobs gevonden. )}
) }