Files
users/components/dialogs/alert-rule-settings-dialog.tsx
v0 b17b488f8e refactor: restructure navigation and module layout
Reorganize navigation and module structure based on new requirements.

Co-authored-by: null <4804959+fnvtk@users.noreply.github.com>
2026-01-31 04:32:36 +00:00

239 lines
9.7 KiB
TypeScript

"use client"
import { useState } from "react"
import {
Dialog,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogTitle,
} from "@/components/ui/dialog"
import { Button } from "@/components/ui/button"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { Switch } from "@/components/ui/switch"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"
import { Settings, Bell, Users, Clock } from "lucide-react"
import { Checkbox } from "@/components/ui/checkbox"
interface AlertRuleSettingsDialogProps {
open: boolean
onOpenChange: (open: boolean) => void
rule?: {
name: string
condition: string
severity: string
}
}
export function AlertRuleSettingsDialog({ open, onOpenChange, rule }: AlertRuleSettingsDialogProps) {
const [activeTab, setActiveTab] = useState("condition")
return (
<Dialog open={open} onOpenChange={onOpenChange}>
<DialogContent className="max-w-2xl">
<DialogHeader>
<DialogTitle className="flex items-center gap-2">
<Settings className="w-5 h-5" />
- {rule?.name || "告警规则"}
</DialogTitle>
<DialogDescription></DialogDescription>
</DialogHeader>
<Tabs value={activeTab} onValueChange={setActiveTab}>
<TabsList className="grid w-full grid-cols-4">
<TabsTrigger value="condition"></TabsTrigger>
<TabsTrigger value="notify"></TabsTrigger>
<TabsTrigger value="suppress"></TabsTrigger>
<TabsTrigger value="action"></TabsTrigger>
</TabsList>
<TabsContent value="condition" className="space-y-4 mt-4">
<div className="space-y-2">
<Label></Label>
<Input defaultValue={rule?.name} />
</div>
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<Label></Label>
<Select defaultValue="cpu">
<SelectTrigger>
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="cpu">CPU使用率</SelectItem>
<SelectItem value="memory">使</SelectItem>
<SelectItem value="disk">使</SelectItem>
<SelectItem value="network"></SelectItem>
<SelectItem value="api_latency">API延迟</SelectItem>
<SelectItem value="error_rate"></SelectItem>
</SelectContent>
</Select>
</div>
<div className="space-y-2">
<Label></Label>
<Select defaultValue="gt">
<SelectTrigger>
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="gt"></SelectItem>
<SelectItem value="gte"></SelectItem>
<SelectItem value="lt"></SelectItem>
<SelectItem value="lte"></SelectItem>
<SelectItem value="eq"></SelectItem>
</SelectContent>
</Select>
</div>
</div>
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<Label></Label>
<Input type="number" defaultValue="80" />
</div>
<div className="space-y-2">
<Label></Label>
<Select defaultValue="5">
<SelectTrigger>
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="1">1</SelectItem>
<SelectItem value="3">3</SelectItem>
<SelectItem value="5">5</SelectItem>
<SelectItem value="10">10</SelectItem>
<SelectItem value="15">15</SelectItem>
</SelectContent>
</Select>
</div>
</div>
<div className="space-y-2">
<Label></Label>
<Select defaultValue={rule?.severity || "warning"}>
<SelectTrigger>
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="info"></SelectItem>
<SelectItem value="warning"></SelectItem>
<SelectItem value="critical"></SelectItem>
</SelectContent>
</Select>
</div>
</TabsContent>
<TabsContent value="notify" className="space-y-4 mt-4">
<div className="flex items-center gap-2 mb-2">
<Bell className="w-4 h-4 text-blue-500" />
<span className="font-medium"></span>
</div>
<div className="space-y-3">
{[
{ id: "email", label: "邮件通知", checked: true },
{ id: "sms", label: "短信通知", checked: true },
{ id: "webhook", label: "Webhook", checked: false },
{ id: "dingtalk", label: "钉钉群", checked: true },
{ id: "wechat", label: "企业微信", checked: false },
].map((channel) => (
<div key={channel.id} className="flex items-center gap-3 p-3 bg-slate-50 rounded-lg">
<Checkbox defaultChecked={channel.checked} />
<span className="text-sm font-medium">{channel.label}</span>
</div>
))}
</div>
<div className="space-y-2">
<Label className="flex items-center gap-2">
<Users className="w-4 h-4" />
</Label>
<Select defaultValue="ops">
<SelectTrigger>
<SelectValue />
</SelectTrigger>
<SelectContent>
<SelectItem value="ops"></SelectItem>
<SelectItem value="dev"></SelectItem>
<SelectItem value="manager"></SelectItem>
<SelectItem value="all"></SelectItem>
</SelectContent>
</Select>
</div>
</TabsContent>
<TabsContent value="suppress" className="space-y-4 mt-4">
<div className="flex items-center gap-2 mb-2">
<Clock className="w-4 h-4 text-amber-500" />
<span className="font-medium"></span>
</div>
<div className="flex items-center justify-between p-4 bg-slate-50 rounded-lg">
<div>
<p className="font-medium"></p>
<p className="text-sm text-slate-500"></p>
</div>
<Switch defaultChecked />
</div>
<div className="space-y-2">
<Label> ()</Label>
<Input type="number" defaultValue="30" />
</div>
<div className="flex items-center justify-between p-4 bg-slate-50 rounded-lg">
<div>
<p className="font-medium"></p>
<p className="text-sm text-slate-500"></p>
</div>
<Switch />
</div>
<div className="grid grid-cols-2 gap-4">
<div className="space-y-2">
<Label></Label>
<Input type="time" defaultValue="22:00" />
</div>
<div className="space-y-2">
<Label></Label>
<Input type="time" defaultValue="08:00" />
</div>
</div>
</TabsContent>
<TabsContent value="action" className="space-y-4 mt-4">
<div className="flex items-center justify-between p-4 bg-slate-50 rounded-lg">
<div>
<p className="font-medium"></p>
<p className="text-sm text-slate-500"></p>
</div>
<Switch />
</div>
<div className="flex items-center justify-between p-4 bg-slate-50 rounded-lg">
<div>
<p className="font-medium"></p>
<p className="text-sm text-slate-500"></p>
</div>
<Switch />
</div>
<div className="flex items-center justify-between p-4 bg-slate-50 rounded-lg">
<div>
<p className="font-medium"></p>
<p className="text-sm text-slate-500"></p>
</div>
<Switch />
</div>
<div className="space-y-2">
<Label></Label>
<Input placeholder="输入告警触发时执行的脚本路径" />
</div>
</TabsContent>
</Tabs>
<DialogFooter>
<Button variant="outline" onClick={() => onOpenChange(false)}>
</Button>
<Button onClick={() => onOpenChange(false)}></Button>
</DialogFooter>
</DialogContent>
</Dialog>
)
}