From 96e15452e81993464bcf00ed649c26503679a3ed Mon Sep 17 00:00:00 2001 From: lintsinghua <1930438860@qq.com> Date: Wed, 22 Oct 2025 22:00:05 +0800 Subject: [PATCH] feat(audit): Enhance CreateTaskDialog with project preselection - Add preselectedProjectId prop to CreateTaskDialog component - Implement automatic project selection when a project ID is provided - Update useEffect hook to set project ID in task form when preselected - Add CreateTaskDialog to ProjectDetail page for seamless task creation - Implement handleCreateTask and handleTaskCreated methods - Add dialog trigger buttons in both empty state and tasks section - Improve user experience by simplifying task creation workflow --- src/components/audit/CreateTaskDialog.tsx | 9 ++++++-- src/pages/ProjectDetail.tsx | 28 ++++++++++++++++++----- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/components/audit/CreateTaskDialog.tsx b/src/components/audit/CreateTaskDialog.tsx index 9199f16..6dee43f 100644 --- a/src/components/audit/CreateTaskDialog.tsx +++ b/src/components/audit/CreateTaskDialog.tsx @@ -26,9 +26,10 @@ interface CreateTaskDialogProps { open: boolean; onOpenChange: (open: boolean) => void; onTaskCreated: () => void; + preselectedProjectId?: string; } -export default function CreateTaskDialog({ open, onOpenChange, onTaskCreated }: CreateTaskDialogProps) { +export default function CreateTaskDialog({ open, onOpenChange, onTaskCreated, preselectedProjectId }: CreateTaskDialogProps) { const [projects, setProjects] = useState([]); const [loading, setLoading] = useState(false); const [creating, setCreating] = useState(false); @@ -61,8 +62,12 @@ export default function CreateTaskDialog({ open, onOpenChange, onTaskCreated }: useEffect(() => { if (open) { loadProjects(); + // 如果有预选择的项目ID,设置到表单中 + if (preselectedProjectId) { + setTaskForm(prev => ({ ...prev, project_id: preselectedProjectId })); + } } - }, [open]); + }, [open, preselectedProjectId]); const loadProjects = async () => { try { diff --git a/src/pages/ProjectDetail.tsx b/src/pages/ProjectDetail.tsx index 367fc8d..1be09cc 100644 --- a/src/pages/ProjectDetail.tsx +++ b/src/pages/ProjectDetail.tsx @@ -7,9 +7,6 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Progress } from "@/components/ui/progress"; import { ArrowLeft, - GitBranch, - Calendar, - Users, Settings, ExternalLink, Code, @@ -23,8 +20,9 @@ import { } from "lucide-react"; import { api } from "@/shared/config/database"; import { runRepositoryAudit } from "@/features/projects/services"; -import type { Project, AuditTask, AuditIssue } from "@/shared/types"; +import type { Project, AuditTask } from "@/shared/types"; import { toast } from "sonner"; +import CreateTaskDialog from "@/components/audit/CreateTaskDialog"; export default function ProjectDetail() { const { id } = useParams<{ id: string }>(); @@ -32,6 +30,7 @@ export default function ProjectDetail() { const [tasks, setTasks] = useState([]); const [loading, setLoading] = useState(true); const [scanning, setScanning] = useState(false); + const [showCreateTaskDialog, setShowCreateTaskDialog] = useState(false); useEffect(() => { if (id) { @@ -112,6 +111,15 @@ export default function ProjectDetail() { }); }; + const handleCreateTask = () => { + setShowCreateTaskDialog(true); + }; + + const handleTaskCreated = () => { + toast.success("审计任务已创建"); + loadProjectData(); // 重新加载项目数据以显示新任务 + }; + if (loading) { return (
@@ -352,7 +360,7 @@ export default function ProjectDetail() {

审计任务列表

- @@ -429,7 +437,7 @@ export default function ProjectDetail() {

暂无审计任务

创建第一个审计任务开始代码质量分析

- @@ -454,6 +462,14 @@ export default function ProjectDetail() {
+ + {/* 创建任务对话框 */} +
); } \ No newline at end of file