|
import Link from 'next/link'; |
|
import { Eye, Trash2, Pen, Play, Pause } from 'lucide-react'; |
|
import { Button } from '@headlessui/react'; |
|
import { openConfirm } from '@/components/ConfirmModal'; |
|
import { Job } from '@prisma/client'; |
|
import { startJob, stopJob, deleteJob, getAvaliableJobActions } from '@/utils/jobs'; |
|
|
|
interface JobActionBarProps { |
|
job: Job; |
|
onRefresh?: () => void; |
|
afterDelete?: () => void; |
|
hideView?: boolean; |
|
className?: string; |
|
} |
|
|
|
export default function JobActionBar({ job, onRefresh, afterDelete, className, hideView }: JobActionBarProps) { |
|
const { canStart, canStop, canDelete, canEdit } = getAvaliableJobActions(job); |
|
|
|
if (!afterDelete) afterDelete = onRefresh; |
|
|
|
return ( |
|
<div className={`${className}`}> |
|
{canStart && ( |
|
<Button |
|
onClick={async () => { |
|
if (!canStart) return; |
|
await startJob(job.id); |
|
if (onRefresh) onRefresh(); |
|
}} |
|
className={`ml-2 opacity-100`} |
|
> |
|
<Play /> |
|
</Button> |
|
)} |
|
{canStop && ( |
|
<Button |
|
onClick={() => { |
|
if (!canStop) return; |
|
openConfirm({ |
|
title: 'Stop Job', |
|
message: `Are you sure you want to stop the job "${job.name}"? You CAN resume later.`, |
|
type: 'info', |
|
confirmText: 'Stop', |
|
onConfirm: async () => { |
|
await stopJob(job.id); |
|
if (onRefresh) onRefresh(); |
|
}, |
|
}); |
|
}} |
|
className={`ml-2 opacity-100`} |
|
> |
|
<Pause /> |
|
</Button> |
|
)} |
|
{!hideView && ( |
|
<Link href={`/jobs/${job.id}`} className="ml-2 text-gray-200 hover:text-gray-100 inline-block"> |
|
<Eye /> |
|
</Link> |
|
)} |
|
{canEdit && ( |
|
<Link href={`/jobs/new?id=${job.id}`} className="ml-2 hover:text-gray-100 inline-block"> |
|
<Pen /> |
|
</Link> |
|
)} |
|
<Button |
|
onClick={() => { |
|
let message = `Are you sure you want to delete the job "${job.name}"? This will also permanently remove it from your disk.`; |
|
if (job.status === 'running') { |
|
message += ' WARNING: The job is currently running. You should stop it first if you can.'; |
|
} |
|
openConfirm({ |
|
title: 'Delete Job', |
|
message: message, |
|
type: 'warning', |
|
confirmText: 'Delete', |
|
onConfirm: async () => { |
|
if (job.status === 'running') { |
|
try { |
|
await stopJob(job.id); |
|
} catch (e) { |
|
console.error('Error stopping job before deleting:', e); |
|
} |
|
} |
|
await deleteJob(job.id); |
|
if (afterDelete) afterDelete(); |
|
}, |
|
}); |
|
}} |
|
className={`ml-2 opacity-100`} |
|
> |
|
<Trash2 /> |
|
</Button> |
|
</div> |
|
); |
|
} |
|
|