"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 { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from "@/components/ui/dialog" import { Loader2, CheckCircle2, FolderPlus, MapPin, Building2, Route, X } from "lucide-react" import { SidebarNavigation } from "@/components/sidebar-navigation" import { DataTable } from "@/components/data-table" import { createProject, fetchProjects, updateProject, deleteProject, type ProjectCreate, type Project, type ProjectUpdate } from "@/lib/api" import { toast } from "sonner" export default function CreateProjectPage() { const [projects, setProjects] = useState([]) const [isLoading, setIsLoading] = useState(true) const [isModalOpen, setIsModalOpen] = useState(false) const [isSubmitting, setIsSubmitting] = useState(false) const [error, setError] = useState(null) // Editing state const [isEditing, setIsEditing] = useState(false) const [currentProject, setCurrentProject] = useState(null) // Form fields const [name, setName] = useState("") const [state, setState] = useState("") const [corridorName, setCorridorName] = useState("") const [startLat, setStartLat] = useState("") const [startLng, setStartLng] = useState("") const [endLat, setEndLat] = useState("") const [endLng, setEndLng] = useState("") // Load projects const loadProjects = async () => { try { setIsLoading(true) setError(null) const data = await fetchProjects() setProjects(data) } catch (err) { setError("Failed to load projects. Please check if the backend is running.") } finally { setIsLoading(false) } } useEffect(() => { loadProjects() }, []) const resetForm = () => { setName("") setState("") setCorridorName("") setStartLat("") setStartLng("") setEndLat("") setEndLng("") setError(null) setIsEditing(false) setCurrentProject(null) } const handleSubmit = async (e: React.FormEvent) => { e.preventDefault() if (!name.trim()) { setError("Project name is required") return } setIsSubmitting(true) setError(null) try { if (isEditing && currentProject) { const data: ProjectUpdate = { name: name.trim(), state: state.trim() || null, corridor_name: corridorName.trim() || null, start_lat: startLat ? parseFloat(startLat) : null, start_lng: startLng ? parseFloat(startLng) : null, end_lat: endLat ? parseFloat(endLat) : null, end_lng: endLng ? parseFloat(endLng) : null, } await updateProject(currentProject.id, data) toast.success("Project updated successfully!") } else { const data: ProjectCreate = { name: name.trim(), state: state.trim() || null, corridor_name: corridorName.trim() || null, start_lat: startLat ? parseFloat(startLat) : null, start_lng: startLng ? parseFloat(startLng) : null, end_lat: endLat ? parseFloat(endLat) : null, end_lng: endLng ? parseFloat(endLng) : null, } await createProject(data) toast.success("Project created successfully!") } // Refresh projects list await loadProjects() // Close modal and reset form immediately setIsModalOpen(false) resetForm() } catch (err) { setError(err instanceof Error ? err.message : `Failed to ${isEditing ? 'update' : 'create'} project`) } finally { setIsSubmitting(false) } } const handleEdit = (project: Project) => { setIsEditing(true) setCurrentProject(project) setName(project.name || "") setState(project.state || "") setCorridorName(project.corridor_name || "") setStartLat(project.start_lat?.toString() || "") setStartLng(project.start_lng?.toString() || "") setEndLat(project.end_lat?.toString() || "") setEndLng(project.end_lng?.toString() || "") setIsModalOpen(true) } const handleDelete = async (project: Project) => { if (!confirm(`Are you sure you want to delete project "${project.name}"?`)) return try { setIsLoading(true) await deleteProject(project.id) toast.success("Project deleted successfully!") await loadProjects() } catch (err) { setError("Failed to delete project") } finally { setIsLoading(false) } } const columns = [ { key: "name", header: "Project Name", render: (project: Project) => (
{project.name}
) }, { key: "state", header: "State", render: (project: Project) => { if (!project.state) return return (
{project.state.split(',').map((item, idx) => ( {item.trim()} ))}
) } }, { key: "corridor_name", header: "Corridor", }, ] return (
{/* Refined Header */}

Project Management

Manage road infrastructure projects

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

{error}

)} {/* Data Table */}
{ setIsEditing(false); setIsModalOpen(true); }} onEdit={handleEdit} onDelete={handleDelete} addButtonText="Add New Project" isLoading={isLoading} />
{/* Footer */}

Sentient Geeks Pvt. Ltd.

{/* Modal Dialog */} { if (!open) { setIsModalOpen(false); resetForm(); } else { setIsModalOpen(true); } }}> e.preventDefault()} > {isEditing ? 'Edit Project' : 'Create New Project'} {isEditing ? 'Update disclosure details for your road infrastructure project' : 'Fill in the details for your new road infrastructure project'} {/* Error Message in Modal */} {error && (
!

{error}

)}
{/* Project Name */}
setName(e.target.value)} placeholder="Project Name" className="h-10 text-sm" required />
{/* State & Corridor Row */}
setState(e.target.value)} placeholder="State" className="h-10 text-sm" />
setCorridorName(e.target.value)} placeholder="Corridor Name" className="h-10 text-sm" />
{/* GPS Coordinates Grid */}
{/* Start Point */}

Start Point

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

End Point

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