import { useState } from "react"; import { createRoute, useNavigate } from "@tanstack/react-router"; import { Route as appRoute } from "../_app"; import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { api, useApiQuery, useApiMutation } from "@/lib/api"; import { useRealtime } from "@/hooks/use-realtime"; import { Plus, Trash2, FolderKanban, Users, Calendar, ListTodo, GripVertical } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Badge } from "@/components/ui/badge"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Progress } from "@/components/ui/progress"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, AlertDialogTrigger } from "@/components/ui/alert-dialog"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { EntityDetailPanel } from "@/components/entities/entity-detail-panel"; import { cn } from "@/lib/utils"; import type { Project, Section, Task, PaginatedResponse } from "@/lib/types"; function ProjectForm({ project, onClose }: { project?: Project; onClose: () => void }) { const queryClient = useQueryClient(); const [name, setName] = useState(project?.name || ""); const [description, setDescription] = useState(project?.description || ""); const [status, setStatus] = useState(project?.status || "active"); const [color, setColor] = useState(project?.color || "#3b82f6"); const [targetDate, setTargetDate] = useState(project?.targetDate ? project.targetDate.slice(0, 10) : ""); const createMutation = useMutation({ mutationFn: (data: any) => api.post("/projects", data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["projects"] }); onClose(); }, }); const updateMutation = useMutation({ mutationFn: (data: any) => api.patch("/projects/" + project!.id, data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["projects"] }); onClose(); }, }); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!name.trim()) return; const data: any = { name: name.trim(), description: description || null, status, color }; if (targetDate) data.targetDate = new Date(targetDate).toISOString(); if (project) updateMutation.mutate(data); else createMutation.mutate(data); }; return (
setName(e.target.value)} placeholder="Project name" required />