|
import useJobsList from '@/hooks/useJobsList'; |
|
import Link from 'next/link'; |
|
import UniversalTable, { TableColumn } from '@/components/UniversalTable'; |
|
import { JobConfig } from '@/types'; |
|
import JobActionBar from './JobActionBar'; |
|
|
|
interface JobsTableProps { |
|
onlyActive?: boolean; |
|
} |
|
|
|
export default function JobsTable({ onlyActive = false }: JobsTableProps) { |
|
const { jobs, status, refreshJobs } = useJobsList(onlyActive); |
|
const isLoading = status === 'loading'; |
|
|
|
const columns: TableColumn[] = [ |
|
{ |
|
title: 'Name', |
|
key: 'name', |
|
render: row => ( |
|
<Link href={`/jobs/${row.id}`} className="font-medium whitespace-nowrap"> |
|
{row.name} |
|
</Link> |
|
), |
|
}, |
|
{ |
|
title: 'Steps', |
|
key: 'steps', |
|
render: row => { |
|
const jobConfig: JobConfig = JSON.parse(row.job_config); |
|
const totalSteps = jobConfig.config.process[0].train.steps; |
|
|
|
return ( |
|
<div className="flex items-center"> |
|
<span> |
|
{row.step} / {totalSteps} |
|
</span> |
|
<div className="w-16 bg-gray-700 rounded-full h-1.5 ml-2"> |
|
<div |
|
className="bg-blue-500 h-1.5 rounded-full" |
|
style={{ width: `${(row.step / totalSteps) * 100}%` }} |
|
></div> |
|
</div> |
|
</div> |
|
); |
|
}, |
|
}, |
|
{ |
|
title: 'GPU', |
|
key: 'gpu_ids', |
|
}, |
|
{ |
|
title: 'Status', |
|
key: 'status', |
|
render: row => { |
|
let statusClass = 'text-gray-400'; |
|
if (row.status === 'completed') statusClass = 'text-green-400'; |
|
if (row.status === 'failed') statusClass = 'text-red-400'; |
|
if (row.status === 'running') statusClass = 'text-blue-400'; |
|
|
|
return <span className={statusClass}>{row.status}</span>; |
|
}, |
|
}, |
|
{ |
|
title: 'Info', |
|
key: 'info', |
|
className: 'truncate max-w-xs', |
|
}, |
|
{ |
|
title: 'Actions', |
|
key: 'actions', |
|
className: 'text-right', |
|
render: row => { |
|
return <JobActionBar job={row} onRefresh={refreshJobs} />; |
|
}, |
|
}, |
|
]; |
|
|
|
return <UniversalTable columns={columns} rows={jobs} isLoading={isLoading} onRefresh={refreshJobs} />; |
|
} |
|
|