import { createService, updateService } from "@/api/service" 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 { conv } from "@/lib/utils" import { asOptionalField } from "@/lib/utils" import { ModelService } from "@/types" import { serviceCoverageTypes, serviceTypes } 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 { MultiSelect } from "./xui/multi-select" interface ServiceCardProps { data?: ModelService mutate: KeyedMutator } const serviceFormSchema = z.object({ cover: z.coerce.number().int().min(0), display_index: z.coerce.number().int(), duration: z.coerce.number().int().min(30), enable_show_in_service: asOptionalField(z.boolean()), enable_trigger_task: asOptionalField(z.boolean()), fail_trigger_tasks: z.array(z.number()), fail_trigger_tasks_raw: z.string(), latency_notify: asOptionalField(z.boolean()), max_latency: z.coerce.number().int().min(0), min_latency: z.coerce.number().int().min(0), name: z.string().min(1), notification_group_id: z.coerce.number().int(), notify: asOptionalField(z.boolean()), recover_trigger_tasks: z.array(z.number()), recover_trigger_tasks_raw: z.string(), skip_servers: z.record(z.string(), z.boolean()), skip_servers_raw: z.array(z.string()), target: z.string(), type: z.coerce.number().int().min(0), }) export const ServiceCard: React.FC = ({ data, mutate }) => { const { t } = useTranslation() const form = useForm({ resolver: zodResolver(serviceFormSchema) as any, defaultValues: data ? { ...data, fail_trigger_tasks_raw: conv.arrToStr(data.fail_trigger_tasks), recover_trigger_tasks_raw: conv.arrToStr(data.recover_trigger_tasks), skip_servers_raw: conv.recordToStrArr(data.skip_servers ? data.skip_servers : {}), } : { type: 1, cover: 0, display_index: 0, name: "", target: "", max_latency: 0.0, min_latency: 0.0, duration: 30, notification_group_id: 0, fail_trigger_tasks: [], fail_trigger_tasks_raw: "", recover_trigger_tasks: [], recover_trigger_tasks_raw: "", skip_servers: {}, skip_servers_raw: [], }, resetOptions: { keepDefaultValues: false, }, }) const [open, setOpen] = useState(false) const onSubmit = async (values: any) => { values.skip_servers = conv.arrToRecord(values.skip_servers_raw) values.fail_trigger_tasks = conv.strToArr(values.fail_trigger_tasks_raw).map(Number) values.recover_trigger_tasks = conv.strToArr(values.recover_trigger_tasks_raw).map(Number) const { skip_servers_raw, ...requiredFields } = values try { data?.id ? await updateService(data.id, requiredFields) : await createService(requiredFields) } 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("EditService") : t("CreateService")}
( {t("Name")} )} /> ( {t("Weight")} )} /> ( {t("Target")} )} /> ( {t("Type")} )} /> (
)} /> ( {t("Interval")} (s) )} /> ( {t("Coverage")} )} /> ( {t("SpecificServers")} )} /> ( {t("NotifierGroupID")} )} /> (
)} /> ( {t("MaximumLatency")} )} /> ( {t("MinimumLatency")} )} /> (
)} /> (
)} /> ( {t("TasksToTriggerOnAlert") + t("SeparateWithComma")} )} /> ( {t("TasksToTriggerAfterRecovery") + t("SeparateWithComma")} )} />
) }