import { createCron, updateCron } from "@/api/cron" import { Button } from "@/components/ui/button" import { Checkbox } from "@/components/ui/checkbox" import { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, DialogTrigger, } from "@/components/ui/dialog" import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { ScrollArea } from "@/components/ui/scroll-area" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select" import { IconButton } from "@/components/xui/icon-button" import { useNotification } from "@/hooks/useNotfication" import { useServer } from "@/hooks/useServer" import { asOptionalField } from "@/lib/utils" import { ModelCron } from "@/types" import { cronCoverageTypes, cronTypes } from "@/types" import { zodResolver } from "@hookform/resolvers/zod" import { useState } from "react" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import { toast } from "sonner" import { KeyedMutator } from "swr" import { z } from "zod" import { Combobox } from "./ui/combobox" import { Textarea } from "./ui/textarea" import { MultiSelect } from "./xui/multi-select" interface CronCardProps { data?: ModelCron mutate: KeyedMutator } const cronFormSchema = z.object({ task_type: z.coerce.number(), name: z.string().min(1), scheduler: z.string(), command: asOptionalField(z.string()), servers: z.array(z.number()), cover: z.coerce.number().int(), push_successful: asOptionalField(z.boolean()), notification_group_id: z.coerce.number().int(), }) type CronFormData = z.infer export const CronCard: React.FC = ({ data, mutate }) => { const { t } = useTranslation() const form = useForm({ resolver: zodResolver(cronFormSchema as any), defaultValues: data ? { task_type: data.task_type ?? 0, name: data.name ?? "", scheduler: data.scheduler ?? "", command: (data as any).command ?? "", servers: data.servers ?? [], cover: data.cover ?? 0, push_successful: (data as any).push_successful ?? false, notification_group_id: data.notification_group_id ?? 0, } : { task_type: 0, name: "", scheduler: "", command: "", servers: [], cover: 0, push_successful: false, notification_group_id: 0, }, resetOptions: { keepDefaultValues: false, }, }) const [open, setOpen] = useState(false) const onSubmit = async (values: CronFormData) => { try { data?.id ? await updateCron(data.id, values) : await createCron(values) } catch (e) { console.error(e) toast(t("Error"), { description: t("Results.UnExpectedError"), }) return } setOpen(false) await mutate() form.reset() } const { servers } = useServer() const serverList = servers?.map((s) => ({ value: `${s.id}`, label: s.name, })) || [{ value: "", label: "" }] const { notifierGroup } = useNotification() const ngroupList = notifierGroup?.map((ng) => ({ value: `${ng.group.id}`, label: ng.group.name, })) || [{ value: "", label: "" }] return ( {data ? : }
{data ? t("EditTask") : t("CreateTask")}
( {t("Name")} )} /> ( {t("Type")} )} /> ( {t("CronExpression")} )} /> ( {t("Command")}