import React, { useState, useEffect } from "react"; import { Plus, Edit, Trash, CalendarDays } from "lucide-react"; import { format, parseISO } from "date-fns"; import { useQueryClient, useQuery, useMutation } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { Calendar } from "@/components/ui/calendar"; import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { toast } from "@/lib/custom-toast"; import { cn } from "@/lib/utils"; import { MaintenanceAmcDate, MaintenanceAmcDateCreateRequest, MaintenanceAmcDateUpdateRequest } from "@/types"; import { maintenanceAmcDateService } from "@/lib/api"; import CustomDialog from "@/components/CustomDialog"; interface MaintenanceAmcDatesSectionProps { projectId: number; } export default function MaintenanceAmcDatesSection({ projectId }: MaintenanceAmcDatesSectionProps) { const queryClient = useQueryClient(); const [open, setOpen] = useState(false); const [editMode, setEditMode] = useState(false); const [formData, setFormData] = useState({ projectId: projectId, maintenanceType: '', startDate: new Date().toISOString(), endDate: new Date().toISOString(), notes: '' }); const [selectedId, setSelectedId] = useState(null); const [startDateOpen, setStartDateOpen] = useState(false); const [endDateOpen, setEndDateOpen] = useState(false); // Fetch maintenance AMC dates for the project const { data: maintenanceAmcDates = [], isLoading } = useQuery({ queryKey: ['maintenanceAmcDates', projectId], queryFn: () => maintenanceAmcDateService.getByProjectId(projectId), enabled: !!projectId }); // Create mutation const createMutation = useMutation({ mutationFn: (data: MaintenanceAmcDateCreateRequest) => maintenanceAmcDateService.create(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['maintenanceAmcDates', projectId] }); toast.success('Maintenance/AMC date added successfully'); resetForm(); setOpen(false); }, onError: (error) => { console.error('Error creating maintenance AMC date:', error); toast.error('Failed to add maintenance/AMC date'); } }); // Update mutation const updateMutation = useMutation({ mutationFn: (data: MaintenanceAmcDateUpdateRequest) => maintenanceAmcDateService.update(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['maintenanceAmcDates', projectId] }); toast.success('Maintenance/AMC date updated successfully'); resetForm(); setOpen(false); }, onError: (error) => { console.error('Error updating maintenance AMC date:', error); toast.error('Failed to update maintenance/AMC date'); } }); // Delete mutation const deleteMutation = useMutation({ mutationFn: (id: number) => maintenanceAmcDateService.delete(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['maintenanceAmcDates', projectId] }); toast.success('Maintenance/AMC date deleted successfully'); }, onError: (error) => { console.error('Error deleting maintenance AMC date:', error); toast.error('Failed to delete maintenance/AMC date'); } }); // Reset form data const resetForm = () => { setFormData({ projectId: projectId, maintenanceType: '', startDate: new Date().toISOString(), endDate: new Date().toISOString(), notes: '' }); setEditMode(false); setSelectedId(null); }; // Handle submit const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (!formData.maintenanceType.trim()) { toast.error('Maintenance Type is required'); return; } if (editMode && selectedId) { updateMutation.mutate({ ...formData, maintenanceId: selectedId } as MaintenanceAmcDateUpdateRequest); } else { createMutation.mutate(formData); } }; // Handle edit button click const handleEdit = (item: MaintenanceAmcDate) => { setEditMode(true); setSelectedId(item.maintenanceId); setFormData({ projectId: item.projectId, maintenanceType: item.maintenanceType, startDate: item.startDate, endDate: item.endDate, notes: item.notes }); setOpen(true); }; // Handle delete button click const handleDelete = (id: number) => { if (confirm('Are you sure you want to delete this maintenance/AMC date?')) { deleteMutation.mutate(id); } }; // Handle form input changes const handleInputChange = (e: React.ChangeEvent) => { const { name, value } = e.target; setFormData(prev => ({ ...prev, [name]: value })); }; // Handle date changes const handleStartDateChange = (date: Date | undefined) => { if (date) { setFormData(prev => ({ ...prev, startDate: date.toISOString() })); } }; const handleEndDateChange = (date: Date | undefined) => { if (date) { setFormData(prev => ({ ...prev, endDate: date.toISOString() })); } }; // Format date for display const formatDate = (dateString: string) => { try { return format(parseISO(dateString), 'PPP'); } catch (error) { console.error('Error formatting date:', error); return 'Invalid date'; } }; return (

Maintenance & AMC Dates

setOpen(false)} title={`${editMode ? 'Edit' : 'Add'} Maintenance or AMC Date`} >
{ handleStartDateChange(date); setStartDateOpen(false); }} initialFocus />
{ handleEndDateChange(date); setEndDateOpen(false); }} initialFocus />