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
This commit is contained in:
lintsinghua 2025-10-22 22:00:05 +08:00
parent 6830183cd0
commit 96e15452e8
2 changed files with 29 additions and 8 deletions

View File

@ -26,9 +26,10 @@ interface CreateTaskDialogProps {
open: boolean; open: boolean;
onOpenChange: (open: boolean) => void; onOpenChange: (open: boolean) => void;
onTaskCreated: () => 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<Project[]>([]); const [projects, setProjects] = useState<Project[]>([]);
const [loading, setLoading] = useState(false); const [loading, setLoading] = useState(false);
const [creating, setCreating] = useState(false); const [creating, setCreating] = useState(false);
@ -61,8 +62,12 @@ export default function CreateTaskDialog({ open, onOpenChange, onTaskCreated }:
useEffect(() => { useEffect(() => {
if (open) { if (open) {
loadProjects(); loadProjects();
// 如果有预选择的项目ID设置到表单中
if (preselectedProjectId) {
setTaskForm(prev => ({ ...prev, project_id: preselectedProjectId }));
} }
}, [open]); }
}, [open, preselectedProjectId]);
const loadProjects = async () => { const loadProjects = async () => {
try { try {

View File

@ -7,9 +7,6 @@ import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Progress } from "@/components/ui/progress"; import { Progress } from "@/components/ui/progress";
import { import {
ArrowLeft, ArrowLeft,
GitBranch,
Calendar,
Users,
Settings, Settings,
ExternalLink, ExternalLink,
Code, Code,
@ -23,8 +20,9 @@ import {
} from "lucide-react"; } from "lucide-react";
import { api } from "@/shared/config/database"; import { api } from "@/shared/config/database";
import { runRepositoryAudit } from "@/features/projects/services"; 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 { toast } from "sonner";
import CreateTaskDialog from "@/components/audit/CreateTaskDialog";
export default function ProjectDetail() { export default function ProjectDetail() {
const { id } = useParams<{ id: string }>(); const { id } = useParams<{ id: string }>();
@ -32,6 +30,7 @@ export default function ProjectDetail() {
const [tasks, setTasks] = useState<AuditTask[]>([]); const [tasks, setTasks] = useState<AuditTask[]>([]);
const [loading, setLoading] = useState(true); const [loading, setLoading] = useState(true);
const [scanning, setScanning] = useState(false); const [scanning, setScanning] = useState(false);
const [showCreateTaskDialog, setShowCreateTaskDialog] = useState(false);
useEffect(() => { useEffect(() => {
if (id) { if (id) {
@ -112,6 +111,15 @@ export default function ProjectDetail() {
}); });
}; };
const handleCreateTask = () => {
setShowCreateTaskDialog(true);
};
const handleTaskCreated = () => {
toast.success("审计任务已创建");
loadProjectData(); // 重新加载项目数据以显示新任务
};
if (loading) { if (loading) {
return ( return (
<div className="flex items-center justify-center min-h-screen"> <div className="flex items-center justify-center min-h-screen">
@ -352,7 +360,7 @@ export default function ProjectDetail() {
<TabsContent value="tasks" className="space-y-6"> <TabsContent value="tasks" className="space-y-6">
<div className="flex items-center justify-between"> <div className="flex items-center justify-between">
<h3 className="text-lg font-medium"></h3> <h3 className="text-lg font-medium"></h3>
<Button> <Button onClick={handleCreateTask}>
<Play className="w-4 h-4 mr-2" /> <Play className="w-4 h-4 mr-2" />
</Button> </Button>
@ -429,7 +437,7 @@ export default function ProjectDetail() {
<Activity className="w-16 h-16 text-muted-foreground mb-4" /> <Activity className="w-16 h-16 text-muted-foreground mb-4" />
<h3 className="text-lg font-medium text-muted-foreground mb-2"></h3> <h3 className="text-lg font-medium text-muted-foreground mb-2"></h3>
<p className="text-sm text-muted-foreground mb-4"></p> <p className="text-sm text-muted-foreground mb-4"></p>
<Button> <Button onClick={handleCreateTask}>
<Play className="w-4 h-4 mr-2" /> <Play className="w-4 h-4 mr-2" />
</Button> </Button>
@ -454,6 +462,14 @@ export default function ProjectDetail() {
</div> </div>
</TabsContent> </TabsContent>
</Tabs> </Tabs>
{/* 创建任务对话框 */}
<CreateTaskDialog
open={showCreateTaskDialog}
onOpenChange={setShowCreateTaskDialog}
onTaskCreated={handleTaskCreated}
preselectedProjectId={id}
/>
</div> </div>
); );
} }