Files
users/components/ai-assistant/create-task-dialog.tsx
v0 f0a6a364f2 feat: sync Sidebar and BottomNav, standardize user profile API
Align Sidebar & BottomNav menus, remove "Search", add user profile mock data, implement /api/users, add FilterDrawer, complete Section, ProfileHeader, MetricsRFM components

Co-authored-by: null <4804959+fnvtk@users.noreply.github.com>
2025-08-08 07:00:12 +00:00

143 lines
5.1 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use client"
import { useState } from "react"
import { Brain } from 'lucide-react'
import type { AnalysisTask, DatabaseInfo, ReportTemplate } from "@/types/ai-assistant"
import { Button } from "@/components/ui/button"
import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"
import { Input } from "@/components/ui/input"
import { Label } from "@/components/ui/label"
import { Textarea } from "@/components/ui/textarea"
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"
import { Switch } from "@/components/ui/switch"
import { sanitizeText } from "@/lib/text-sanitize"
export default function CreateTaskDialog({
databases,
templates,
onCreate,
}: {
databases: DatabaseInfo[]
templates: ReportTemplate[]
onCreate: (task: AnalysisTask) => void
}) {
const [open, setOpen] = useState(false)
const [name, setName] = useState("")
const [database, setDatabase] = useState("")
const [template, setTemplate] = useState("")
const [customPrompt, setCustomPrompt] = useState("")
const [includeCharts, setIncludeCharts] = useState(true)
const [includeRecommendations, setIncludeRecommendations] = useState(true)
function submit() {
const task: AnalysisTask = {
id: `task_${Date.now()}`,
name: name || "未命名任务",
database: database || "未选择数据库",
status: "pending",
progress: 0,
createdAt: new Date().toISOString(),
description: sanitizeText(
`${customPrompt}${
includeCharts ? " | 包含图表" : ""
}${includeRecommendations ? " | 包含AI建议" : ""}`,
),
}
onCreate(task)
setOpen(false)
setName("")
setDatabase("")
setTemplate("")
setCustomPrompt("")
setIncludeCharts(true)
setIncludeRecommendations(true)
}
return (
<Dialog open={open} onOpenChange={setOpen}>
<DialogTrigger asChild>
<Button className="flex items-center gap-2">
<Brain className="w-4 h-4" />
</Button>
</DialogTrigger>
<DialogContent className="max-w-2xl">
<DialogHeader>
<DialogTitle></DialogTitle>
</DialogHeader>
<div className="space-y-4 py-2">
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="space-y-2">
<Label htmlFor="taskName"></Label>
<Input id="taskName" value={name} onChange={(e) => setName(e.target.value)} placeholder="输入任务名称" />
</div>
<div className="space-y-2">
<Label htmlFor="database"></Label>
<Select value={database} onValueChange={setDatabase}>
<SelectTrigger>
<SelectValue placeholder="选择要分析的数据库" />
</SelectTrigger>
<SelectContent>
{databases.map((db) => (
<SelectItem key={db.id} value={db.name}>
{db.name}{db.type}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
</div>
<div className="space-y-2">
<Label htmlFor="template"></Label>
<Select value={template} onValueChange={setTemplate}>
<SelectTrigger>
<SelectValue placeholder="选择报告模板" />
</SelectTrigger>
<SelectContent>
{templates.map((t) => (
<SelectItem key={t.id} value={t.id}>
{t.name} - {t.category}
</SelectItem>
))}
</SelectContent>
</Select>
</div>
<div className="space-y-2">
<Label htmlFor="customPrompt"></Label>
<Textarea
id="customPrompt"
rows={4}
value={customPrompt}
onChange={(e) => setCustomPrompt(e.target.value)}
placeholder="描述希望 AI 重点分析的内容..."
/>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="flex items-center space-x-2">
<Switch id="includeCharts" checked={includeCharts} onCheckedChange={setIncludeCharts} />
<Label htmlFor="includeCharts"></Label>
</div>
<div className="flex items-center space-x-2">
<Switch
id="includeRecommendations"
checked={includeRecommendations}
onCheckedChange={setIncludeRecommendations}
/>
<Label htmlFor="includeRecommendations"> AI </Label>
</div>
</div>
</div>
<div className="flex justify-end gap-2">
<Button variant="outline" onClick={() => setOpen(false)}>
</Button>
<Button onClick={submit}></Button>
</div>
</DialogContent>
</Dialog>
)
}