import { useState, useEffect } from "react"; import { Form, useActionData, useNavigation } from "@remix-run/react"; import { Button, Input, Select, Text, Card, CardHeader, CardBody, MultiSelect } from "~/components/ui"; import { AutocompleteInput } from "~/components/ui/AutocompleteInput"; import type { MaintenanceVisitWithRelations, Customer, Vehicle, MaintenanceType, MaintenanceJob } from "~/types/database"; import { PAYMENT_STATUS_NAMES, VISIT_DELAY_OPTIONS } from "~/lib/constants"; interface MaintenanceVisitFormProps { visit?: MaintenanceVisitWithRelations; customers: Customer[]; vehicles: Vehicle[]; maintenanceTypes: { id: number; name: string; }[]; onCancel?: () => void; } export function MaintenanceVisitForm({ visit, customers, vehicles, maintenanceTypes, onCancel }: MaintenanceVisitFormProps) { const actionData = useActionData(); const navigation = useNavigation(); const isSubmitting = navigation.state === "submitting"; // Form state const [plateNumberInput, setPlateNumberInput] = useState( visit?.vehicle?.plateNumber || "" ); const [selectedCustomerId, setSelectedCustomerId] = useState( visit?.customerId?.toString() || "" ); const [selectedVehicleId, setSelectedVehicleId] = useState( visit?.vehicleId?.toString() || "" ); const [filteredVehicles, setFilteredVehicles] = useState(vehicles); // Selected maintenance types state const [selectedMaintenanceTypes, setSelectedMaintenanceTypes] = useState(() => { if (visit?.maintenanceJobs) { try { const jobs = JSON.parse(visit.maintenanceJobs); return jobs.map((job: MaintenanceJob) => job.typeId).filter((id: number) => id > 0); } catch { return []; } } return []; }); // Create autocomplete options for plate numbers const plateNumberOptions = vehicles.map(vehicle => { const customer = customers.find(c => c.id === vehicle.ownerId); return { value: vehicle.plateNumber, label: `${vehicle.plateNumber} - ${vehicle.manufacturer} ${vehicle.model} (${customer?.name || 'غير محدد'})`, data: { vehicle, customer } }; }); // Handle plate number selection const handlePlateNumberSelect = (option: any) => { const { vehicle, customer } = option.data; setPlateNumberInput(vehicle.plateNumber); setSelectedCustomerId(customer?.id?.toString() || ""); setSelectedVehicleId(vehicle.id.toString()); }; // Reset form state when visit prop changes (switching between create/edit modes) useEffect(() => { if (visit) { // Editing mode - populate with visit data setPlateNumberInput(visit.vehicle?.plateNumber || ""); setSelectedCustomerId(visit.customerId?.toString() || ""); setSelectedVehicleId(visit.vehicleId?.toString() || ""); // Parse maintenance jobs from JSON try { const jobs = JSON.parse(visit.maintenanceJobs); const typeIds = jobs.map((job: MaintenanceJob) => job.typeId).filter((id: number) => id > 0); setSelectedMaintenanceTypes(typeIds); } catch { setSelectedMaintenanceTypes([]); } } else { // Create mode - reset to empty state setPlateNumberInput(""); setSelectedCustomerId(""); setSelectedVehicleId(""); setSelectedMaintenanceTypes([]); } }, [visit]); // Filter vehicles based on selected customer useEffect(() => { if (selectedCustomerId) { const customerId = parseInt(selectedCustomerId); const customerVehicles = vehicles.filter(v => v.ownerId === customerId); setFilteredVehicles(customerVehicles); // Reset vehicle selection if current vehicle doesn't belong to selected customer if (selectedVehicleId) { const vehicleId = parseInt(selectedVehicleId); const vehicleBelongsToCustomer = customerVehicles.some(v => v.id === vehicleId); if (!vehicleBelongsToCustomer) { setSelectedVehicleId(""); } } } else { setFilteredVehicles(vehicles); } }, [selectedCustomerId, vehicles, selectedVehicleId]); // Format date for input const formatDateForInput = (date: Date | string | null) => { if (!date) return ""; const d = new Date(date); return d.toISOString().slice(0, 16); // YYYY-MM-DDTHH:MM format }; // Convert selected maintenance types to jobs format for submission const getMaintenanceJobsForSubmission = () => { return selectedMaintenanceTypes.map(typeId => { const type = maintenanceTypes.find(t => t.id === typeId); return { typeId, job: type?.name || '', notes: '' }; }); }; return ( {visit ? "تعديل زيارة الصيانة" : "إضافة زيارة صيانة جديدة"}
{visit && ( )} {/* Plate Number Autocomplete - Only show for new visits */} {!visit && (
ابدأ بكتابة رقم اللوحة لاختيار المركبة والعميل تلقائياً
)}
{/* Customer Selection */}
{actionData?.errors?.customerId && ( {actionData.errors.customerId} )} {!visit && plateNumberInput && selectedCustomerId && ( تم اختيار العميل تلقائياً من رقم اللوحة )}
{/* Vehicle Selection */}
{actionData?.errors?.vehicleId && ( {actionData.errors.vehicleId} )} {!selectedCustomerId && !plateNumberInput && ( يرجى اختيار العميل أولاً أو البحث برقم اللوحة )} {!visit && plateNumberInput && selectedVehicleId && ( تم اختيار المركبة تلقائياً من رقم اللوحة )}
{/* Maintenance Types Selection */}
({ value: type.id, label: type.name }))} value={selectedMaintenanceTypes} onChange={setSelectedMaintenanceTypes} placeholder="اختر أنواع الصيانة المطلوبة..." error={actionData?.errors?.maintenanceJobs} required /> يمكنك اختيار أكثر من نوع صيانة واحد {/* Hidden input to pass maintenance jobs data in the expected format */}
{/* Payment Status */}