"use client"; import { useState } from "react"; import { Button } from "@/components/ui/button"; import { DataTable } from "@/components/common/data-table"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { useProjects, useCreateProject, useUpdateProject, useDeleteProject, } from "@/hooks/use-projects"; import { ColumnDef } from "@tanstack/react-table"; import { Pencil, Trash, Plus, Folder } from "lucide-react"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Badge } from "@/components/ui/badge"; interface Project { id: number; projectCode: string; projectName: string; isActive: boolean; createdAt: string; updatedAt: string; } export default function ProjectsPage() { const { data: projects, isLoading } = useProjects(); const createProject = useCreateProject(); const updateProject = useUpdateProject(); const deleteProject = useDeleteProject(); const [dialogOpen, setDialogOpen] = useState(false); const [editingProject, setEditingProject] = useState(null); const [formData, setFormData] = useState({ projectCode: "", projectName: "", isActive: true, }); const columns: ColumnDef[] = [ { accessorKey: "projectCode", header: "Code", cell: ({ row }) => (
{row.original.projectCode}
), }, { accessorKey: "projectName", header: "Project Name" }, { accessorKey: "isActive", header: "Status", cell: ({ row }) => ( {row.original.isActive ? "Active" : "Inactive"} ), }, { id: "actions", header: "Actions", cell: ({ row }) => ( handleEdit(row.original)}> Edit { if (confirm(`Delete project ${row.original.projectCode}?`)) { deleteProject.mutate(row.original.id); } }} > Delete ), }, ]; const handleEdit = (project: Project) => { setEditingProject(project); setFormData({ projectCode: project.projectCode, projectName: project.projectName, isActive: project.isActive, }); setDialogOpen(true); }; const handleAdd = () => { setEditingProject(null); setFormData({ projectCode: "", projectName: "", isActive: true }); setDialogOpen(true); }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (editingProject) { updateProject.mutate( { id: editingProject.id, data: formData }, { onSuccess: () => setDialogOpen(false), } ); } else { createProject.mutate(formData, { onSuccess: () => setDialogOpen(false), }); } }; return (

Projects

Manage construction projects and configurations

{editingProject ? "Edit Project" : "New Project"}
setFormData({ ...formData, projectCode: e.target.value }) } required disabled={!!editingProject} // Code is usually immutable or derived />
setFormData({ ...formData, projectName: e.target.value }) } required />
setFormData({ ...formData, isActive: checked }) } />
); }