Spaces:
Running
Running
| 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> | |
| ); | |
| } | |