import React, { useState, useEffect } from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import * as z from "zod"; import { CalendarIcon, Loader2 } from "lucide-react"; import { format } from "date-fns"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Popover, PopoverContent, PopoverTrigger, } from "@/components/ui/popover"; import { Calendar } from "@/components/ui/calendar"; import { toast } from "@/lib/custom-toast"; import { tasksApi, TaskCreateRequest } from "@/services/tasksApi"; import { Employee } from "@/types"; import SlateRichTextEditor from "@/components/custom/SlateRichTextEditor"; // Form schema const formSchema = z.object({ title: z.string().min(1, "Title is required"), description: z.string().min(1, "Description is required"), type: z.string().min(1, "Type is required"), priority: z.string().min(1, "Priority is required"), status: z.string().min(1, "Status is required"), assignedTo: z.number().nullable(), estimates: z.string().optional(), stateDate: z.date(), endDate: z.date().nullable().optional(), }); interface AddTaskDialogProps { issueId: number; onTaskAdded: () => void; employees: Employee[]; isOpen: boolean; onOpenChange: (open: boolean) => void; } const AddTaskDialog: React.FC = ({ issueId, onTaskAdded, employees, isOpen, onOpenChange, }) => { const [isSubmitting, setIsSubmitting] = useState(false); console.log("Dialog isOpen state:", isOpen); // Debug log // Initialize the form const form = useForm>({ resolver: zodResolver(formSchema), defaultValues: { title: "", description: "", type: "Task", priority: "Medium", status: "New", assignedTo: null, estimates: "", stateDate: new Date(), endDate: null, }, }); // Reset form when dialog opens useEffect(() => { if (isOpen) { console.log("Dialog opened, resetting form"); // Debug log form.reset(); } }, [isOpen, form]); // Handle form submission const onSubmit = async (values: z.infer) => { setIsSubmitting(true); try { // Prepare task data const taskData: TaskCreateRequest = { title: values.title, description: values.description, type: values.type, priority: values.priority, status: values.status, assignedTo: values.assignedTo, estimates: values.estimates || "0", esUnit: 1, // Default to hours stateDate: values.stateDate.toISOString().split('T')[0], endDate: values.endDate ? values.endDate.toISOString().split('T')[0] : null, remainingHr: 0, sprintName: null, issuesId: issueId, }; console.log("Creating task with data:", taskData); // Debug log // Create the task await tasksApi.create(taskData); // Show success message toast.success("Task created successfully"); // Close the dialog and refresh the tasks list onOpenChange(false); onTaskAdded(); } catch (error) { console.error("Error creating task:", error); toast.error("Failed to create task. Please try again."); } finally { setIsSubmitting(false); } }; const handleOpenChange = (newOpen: boolean) => { console.log("Dialog openChange triggered:", newOpen); // Debug log onOpenChange(newOpen); }; return ( Add New Task Create a new task linked to this issue.
( Title )} /> ( Description field.onChange(value)} placeholder="Task description" minHeight="150px" /> )} />
( Type )} /> ( Priority )} />
( Status )} /> ( Assigned To )} />
( Start Date )} /> ( Due Date )} />
( Estimated Hours )} />
); }; export default AddTaskDialog;