"use client" import { useState, useEffect } from "react" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select" import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Loader2, CheckCircle2, MapPin, Navigation, Milestone } from "lucide-react" import { SidebarNavigation } from "@/components/sidebar-navigation" import { DataTable } from "@/components/data-table" import { fetchProjects, fetchPackagesByProject, fetchAllLocations, fetchAllPackages, createLocation, type Project, type Package as PackageType, type Location, type LocationCreate } from "@/lib/api" export default function CreateLocationPage() { const [locations, setLocations] = useState([]) const [projects, setProjects] = useState([]) const [packages, setPackages] = useState([]) const [allPackages, setAllPackages] = useState([]) const [isLoading, setIsLoading] = useState(true) const [isModalOpen, setIsModalOpen] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false) const [success, setSuccess] = useState(false) const [error, setError] = useState(null) const [loadingProjects, setLoadingProjects] = useState(false) const [loadingPackages, setLoadingPackages] = useState(false) // Form fields const [selectedProjectId, setSelectedProjectId] = useState("") const [selectedPackageId, setSelectedPackageId] = useState("") const [segmentName, setSegmentName] = useState("") const [chainageStartKm, setChainageStartKm] = useState("") const [chainageEndKm, setChainageEndKm] = useState("") const [startLat, setStartLat] = useState("") const [startLng, setStartLng] = useState("") const [endLat, setEndLat] = useState("") const [endLng, setEndLng] = useState("") // Load locations and projects const loadLocations = async () => { try { setIsLoading(true) setError(null) const data = await fetchAllLocations() setLocations(data) } catch (err) { setError("Failed to load locations. Please check if the backend is running.") } finally { setIsLoading(false) } } const loadProjects = async () => { try { setLoadingProjects(true) const data = await fetchProjects() setProjects(data) } catch (err) { setError("Failed to load projects.") } finally { setLoadingProjects(false) } } const loadAllPackages = async () => { try { const data = await fetchAllPackages() setAllPackages(data) } catch (err) { console.error("Failed to load all packages") } } useEffect(() => { loadLocations() loadProjects() loadAllPackages() }, []) // Load packages when project changes useEffect(() => { if (!selectedProjectId) { setPackages([]) setSelectedPackageId("") return } const loadPackages = async () => { try { setLoadingPackages(true) setSelectedPackageId("") const data = await fetchPackagesByProject(selectedProjectId) setPackages(data) } catch (err) { setError("Failed to load packages for the selected project.") } finally { setLoadingPackages(false) } } loadPackages() }, [selectedProjectId]) const resetForm = () => { setSelectedProjectId("") setSelectedPackageId("") setSegmentName("") setChainageStartKm("") setChainageEndKm("") setStartLat("") setStartLng("") setEndLat("") setEndLng("") setError(null) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!selectedPackageId) { setError("Please select a project and package first") return } if (!segmentName.trim()) { setError("Segment name is required") return } if (!startLat || !startLng || !endLat || !endLng) { setError("All GPS coordinates are required for locations") return } setIsSubmitting(true) setError(null) try { const data: LocationCreate = { package_id: selectedPackageId, segment_name: segmentName.trim(), chainage_start_km: chainageStartKm ? parseFloat(chainageStartKm) : null, chainage_end_km: chainageEndKm ? parseFloat(chainageEndKm) : null, start_lat: parseFloat(startLat), start_lng: parseFloat(startLng), end_lat: parseFloat(endLat), end_lng: parseFloat(endLng), } await createLocation(data) setSuccess(true) // Refresh locations list await loadLocations() setTimeout(() => { resetForm() setSuccess(false) setIsModalOpen(false) }, 2000) } catch (err) { setError(err instanceof Error ? err.message : "Failed to create location") } finally { setIsSubmitting(false) } } const getPackageName = (packageId: string) => { return allPackages.find(p => p.id === packageId)?.name || packageId } const selectedProject = projects.find(p => p.id === selectedProjectId) const selectedPackage = packages.find(p => p.id === selectedPackageId) const isFormComplete = selectedPackageId && segmentName.trim() && startLat && startLng && endLat && endLng const columns = [ { key: "segment_name", header: "Segment Name", render: (location: Location) => (
{location.segment_name}
) }, { key: "package_id", header: "Package", render: (location: Location) => getPackageName(location.package_id) }, { key: "project", header: "Project", render: (location: Location) => { const pkg = allPackages.find(p => p.id === location.package_id) const project = projects.find(p => p.id === pkg?.project_id) return project?.name || "—" } }, { key: "chainage", header: "Chainage (km)", render: (location: Location) => { if (location.chainage_start_km !== null && location.chainage_end_km !== null) { return ( {location.chainage_start_km} - {location.chainage_end_km} ) } return "—" } }, { key: "start_gps", header: "Start GPS", render: (location: Location) => ( {location.start_lat.toFixed(4)}, {location.start_lng.toFixed(4)} ) }, { key: "end_gps", header: "End GPS", render: (location: Location) => ( {location.end_lat.toFixed(4)}, {location.end_lng.toFixed(4)} ) }, ] return (
{/* Refined Header */}

Location Management

Manage road segment locations

{/* Error Message */} {error && !isModalOpen && (
!

{error}

)} {/* Data Table */}
setIsModalOpen(true)} addButtonText="Add New Location" isLoading={isLoading} />
{/* Footer */}

Sentient Geeks Pvt. Ltd.

{/* Modal Dialog */} e.preventDefault()} > Create New Location Select project & package, then fill in the location details {/* Success Message in Modal */} {success && (

Location created successfully!

)} {/* Error Message in Modal */} {error && (
!

{error}

)}
{/* Step 1: Select Project */}
1

Select Project

{/* Step 2: Select Package */}
2

Select Package

{/* Step 3: Location Details */}
3

Location Information

{/* Segment Name & Chainage Row */}
setSegmentName(e.target.value)} placeholder="Location to Location" className="h-9 text-sm" required />
setChainageStartKm(e.target.value)} placeholder="0" className="h-9 text-sm" />
setChainageEndKm(e.target.value)} placeholder="0" className="h-9 text-sm" />
{/* GPS Coordinates Grid */}
{/* Start Point */}

Start Point

setStartLat(e.target.value)} placeholder="Lat" className="h-8 text-[11px]" required />
setStartLng(e.target.value)} placeholder="Lng" className="h-8 text-[11px]" required />
{/* End Point */}

End Point

setEndLat(e.target.value)} placeholder="Lat" className="h-8 text-[11px]" required />
setEndLng(e.target.value)} placeholder="Lng" className="h-8 text-[11px]" required />
{/* Submit Button */}
) }