import { toString as CronToString } from 'cronstrue' import { Clock, Loader2, MoreVertical } from 'lucide-react' import Link from 'next/link' import { useParams } from 'common' import { SQLCodeBlock } from 'components/interfaces/Auth/ThirdPartyAuthForm/SqlCodeBlock' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { CronJob } from 'data/database-cron-jobs/database-cron-jobs-query' import { useDatabaseCronJobToggleMutation } from 'data/database-cron-jobs/database-cron-jobs-toggle-mutation' import { useState } from 'react' import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, Input, Label_Shadcn_, Switch, } from 'ui' import ConfirmationModal from 'ui-patterns/Dialogs/ConfirmationModal' interface CronJobCardProps { job: CronJob onEditCronJob: (job: CronJob) => void onDeleteCronJob: (job: CronJob) => void } const generateJobDetailsSQL = (jobId: number) => { return `select * from cron.job_run_details where jobid = '${jobId}' order by start_time desc limit 10` } export const CronJobCard = ({ job, onEditCronJob, onDeleteCronJob }: CronJobCardProps) => { const [toggleConfirmationModalShown, showToggleConfirmationModal] = useState(false) const { ref } = useParams() const { project: selectedProject } = useProjectContext() const { mutate: toggleDatabaseCronJob, isLoading } = useDatabaseCronJobToggleMutation() // pg_cron can also use "30 seconds" format for schedule. Cronstrue doesn't understand that format so just use the // original schedule when cronstrue throws let schedule = job.schedule try { const scheduleString = CronToString(job.schedule) schedule = scheduleString } catch {} return ( <>
{job.jobname}
{isLoading ? ( ) : ( {job.active ? 'Active' : 'Inactive'} )} showToggleConfirmationModal(true)} />
Schedule
Command
{[job.command.trim()]}
showToggleConfirmationModal(false)} variant={job.active ? 'destructive' : undefined} onConfirm={() => { toggleDatabaseCronJob({ projectRef: selectedProject?.ref!, connectionString: selectedProject?.connectionString, jobId: job.jobid, active: !job.active, }) showToggleConfirmationModal(false) }} >

{`Are you sure you want to ${job.active ? 'disable' : 'enable'} the`}{' '} {`${job?.jobname}`} cron job?

) }