"use client"; import { useState, useEffect } from "react"; import { Loader2 } from "lucide-react"; import { Button } from "@/components/ui/button"; 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 { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle, } from "@/components/ui/sheet"; import { Task, TaskStatus, TaskPriority, TaskFormData, TASK_STATUS_CONFIG, TASK_PRIORITY_CONFIG, taskToFormData, formDataToCreateTask, formDataToUpdateTask, } from "@/types/task"; import { createTask, updateTask } from "@/lib/tasksService"; interface TaskFormSheetProps { open: boolean; onOpenChange: (open: boolean) => void; mode: "create" | "edit"; projectId: number; task?: Task | null; onSuccess?: (task: Task) => void; } const defaultFormData: TaskFormData = { title: "", description: "", projectId: 0, parentTaskId: null, status: "0", priority: "0", progress: 0, plannedHours: 0, startDate: "", endDate: "", budget: 0, }; export function TaskFormSheet({ open, onOpenChange, mode, projectId, task, onSuccess, }: TaskFormSheetProps) { const [formData, setFormData] = useState({ ...defaultFormData, projectId, }); const [isSubmitting, setIsSubmitting] = useState(false); const [error, setError] = useState(null); // Initialize form data when task changes (for edit mode) useEffect(() => { if (mode === "edit" && task) { setFormData(taskToFormData(task)); } else { setFormData({ ...defaultFormData, projectId, }); } setError(null); }, [mode, task, projectId, open]); const handleInputChange = ( e: React.ChangeEvent ) => { const { name, value, type } = e.target; setFormData((prev) => ({ ...prev, [name]: type === "number" ? parseFloat(value) || 0 : value, })); }; const handleSelectChange = (name: string, value: string) => { setFormData((prev) => ({ ...prev, [name]: value, })); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); setIsSubmitting(true); setError(null); try { let result: Task; if (mode === "create") { const createData = formDataToCreateTask(formData); result = await createTask(createData); } else { if (!task) { throw new Error("No hay tarea para editar"); } const updateData = formDataToUpdateTask(formData); result = await updateTask(task.id, updateData); } onSuccess?.(result); onOpenChange(false); } catch (err) { console.error("Error submitting task:", err); setError( err instanceof Error ? err.message : "Error al guardar la tarea" ); } finally { setIsSubmitting(false); } }; const isFormValid = formData.title.trim().length > 0; return ( {mode === "create" ? "Nueva Tarea" : "Editar Tarea"} {mode === "create" ? "Crea una nueva tarea para este proyecto." : "Modifica los detalles de la tarea."}
{/* Título */}
{/* Descripción */}