import { createAlertRule, updateAlertRule } from "@/api/alert-rule" 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 { conv } from "@/lib/utils" import { asOptionalField } from "@/lib/utils" import { ModelAlertRule } from "@/types" import { triggerModes } from "@/types" import { zodResolver } from "@hookform/resolvers/zod" import { useState } from "react" import { useForm } from "react-hook-form" import { useTranslation } from "react-i18next" import { KeyedMutator } from "swr" import { z } from "zod" import { Combobox } from "./ui/combobox" import { Textarea } from "./ui/textarea" interface AlertRuleCardProps { data?: ModelAlertRule mutate: KeyedMutator } const ruleSchema = z.object({ type: z.string(), min: asOptionalField(z.number()), max: asOptionalField(z.number()), cycle_start: asOptionalField(z.string()), cycle_interval: asOptionalField(z.number()), cycle_unit: asOptionalField(z.enum(["hour", "day", "week", "month", "year"])), duration: asOptionalField(z.number()), cover: z.number().int().min(0), ignore: asOptionalField(z.record(z.boolean())), next_transfer_at: asOptionalField(z.record(z.string())), last_cycle_status: asOptionalField(z.boolean()), }) const alertRuleFormSchema = z.object({ name: z.string().min(1), rules_raw: z.string().refine( (val) => { try { JSON.parse(val) return true } catch (e) { return false } }, { message: "Invalid JSON string", }, ), rules: z.array(ruleSchema), fail_trigger_tasks: z.array(z.number()), recover_trigger_tasks: z.array(z.number()), notification_group_id: z.coerce.number().int(), trigger_mode: z.coerce.number().int().min(0), enable: asOptionalField(z.boolean()), }) export const AlertRuleCard: React.FC = ({ data, mutate }) => { const { t } = useTranslation() const form = useForm>({ resolver: zodResolver(alertRuleFormSchema), defaultValues: data ? { ...data, rules_raw: JSON.stringify(data.rules), } : { name: "", rules_raw: "", rules: [], fail_trigger_tasks: [], recover_trigger_tasks: [], notification_group_id: 0, trigger_mode: 0, }, resetOptions: { keepDefaultValues: false, }, }) const [open, setOpen] = useState(false) const onSubmit = async (values: z.infer) => { values.rules = JSON.parse(values.rules_raw) const { rules_raw, ...requiredFields } = values data?.id ? await updateAlertRule(data.id, requiredFields) : await createAlertRule(requiredFields) setOpen(false) await mutate() form.reset() } const { notifierGroup } = useNotification() const ngroupList = notifierGroup?.map((ng) => ({ value: `${ng.group.id}`, label: ng.group.name, })) || [{ value: "", label: "" }] return ( {data ? : }
{data ? t("EditAlertRule") : t("CreateAlertRule")}
( {t("Name")} )} /> ( {t("Rules")}