251210:1709 Frontend: reeactor organization and run build
Some checks failed
Spec Validation / validate-markdown (push) Has been cancelled
Spec Validation / validate-diagrams (push) Has been cancelled
Spec Validation / check-todos (push) Has been cancelled

This commit is contained in:
admin
2025-12-10 17:09:11 +07:00
parent aa96cd90e3
commit c8a0f281ef
140 changed files with 3780 additions and 1473 deletions

View File

@@ -35,48 +35,48 @@ import {
} from "@/components/ui/card";
// Type สำหรับข้อมูล Project (Mockup ตาม Data Dictionary)
type Project = {
interface Project {
id: number;
project_code: string;
project_name: string;
projectCode: string;
projectName: string;
status: "Active" | "Completed" | "On Hold";
progress: number;
start_date: string;
end_date: string;
contractor_name: string;
};
startDate: string;
endDate: string;
contractorName: string;
}
// Mock Data
const mockProjects: Project[] = [
{
id: 1,
project_code: "LCBP3",
project_name: "โครงการพัฒนาท่าเรือแหลมฉบัง ระยะที่ 3 (ส่วนที่ 1-4)",
projectCode: "LCBP3",
projectName: "โครงการพัฒนาท่าเรือแหลมฉบัง ระยะที่ 3 (ส่วนที่ 1-4)",
status: "Active",
progress: 45,
start_date: "2021-01-01",
end_date: "2025-12-31",
contractor_name: "Multiple Contractors",
startDate: "2021-01-01",
endDate: "2025-12-31",
contractorName: "Multiple Contractors",
},
{
id: 2,
project_code: "LCBP3-C1",
project_name: "งานก่อสร้างงานทางทะเล (ส่วนที่ 1)",
projectCode: "LCBP3-C1",
projectName: "งานก่อสร้างงานทางทะเล (ส่วนที่ 1)",
status: "Active",
progress: 70,
start_date: "2021-06-01",
end_date: "2024-06-01",
contractor_name: "CNNC",
startDate: "2021-06-01",
endDate: "2024-06-01",
contractorName: "CNNC",
},
{
id: 3,
project_code: "LCBP3-C2",
project_name: "งานก่อสร้างอาคาร ท่าเทียบเรือ (ส่วนที่ 2)",
projectCode: "LCBP3-C2",
projectName: "งานก่อสร้างอาคาร ท่าเทียบเรือ (ส่วนที่ 2)",
status: "Active",
progress: 15,
start_date: "2023-01-01",
end_date: "2026-01-01",
contractor_name: "ITD-NWR Joint Venture",
startDate: "2023-01-01",
endDate: "2026-01-01",
contractorName: "ITD-NWR Joint Venture",
},
];
@@ -85,8 +85,8 @@ export default function ProjectsPage() {
const [searchTerm, setSearchTerm] = useState("");
const filteredProjects = mockProjects.filter((project) =>
project.project_name.toLowerCase().includes(searchTerm.toLowerCase()) ||
project.project_code.toLowerCase().includes(searchTerm.toLowerCase())
project.projectName.toLowerCase().includes(searchTerm.toLowerCase()) ||
project.projectCode.toLowerCase().includes(searchTerm.toLowerCase())
);
const getStatusVariant = (status: string) => {
@@ -150,16 +150,16 @@ export default function ProjectsPage() {
<TableBody>
{filteredProjects.map((project) => (
<TableRow key={project.id} className="cursor-pointer hover:bg-muted/50" onClick={() => handleViewDetails(project.id)}>
<TableCell className="font-medium">{project.project_code}</TableCell>
<TableCell className="font-medium">{project.projectCode}</TableCell>
<TableCell>
<div className="flex flex-col">
<span>{project.project_name}</span>
<span>{project.projectName}</span>
<span className="text-xs text-muted-foreground">
{project.start_date} - {project.end_date}
{project.startDate} - {project.endDate}
</span>
</div>
</TableCell>
<TableCell>{project.contractor_name}</TableCell>
<TableCell>{project.contractorName}</TableCell>
<TableCell>
<Badge variant={getStatusVariant(project.status)}>
{project.status}
@@ -186,11 +186,11 @@ export default function ProjectsPage() {
<DropdownMenuItem onClick={(e) => { e.stopPropagation(); handleViewDetails(project.id); }}>
View Details
</DropdownMenuItem>
<DropdownMenuItem onClick={(e) => { e.stopPropagation(); alert(`Manage Contracts for ${project.project_code}`); }}>
<DropdownMenuItem onClick={(e) => { e.stopPropagation(); alert(`Manage Contracts for ${project.projectCode}`); }}>
Manage Contracts
</DropdownMenuItem>
<DropdownMenuSeparator />
<DropdownMenuItem onClick={(e) => { e.stopPropagation(); alert(`Edit ${project.project_code}`); }}>
<DropdownMenuItem onClick={(e) => { e.stopPropagation(); alert(`Edit ${project.projectCode}`); }}>
Edit Project
</DropdownMenuItem>
</DropdownMenuContent>
@@ -209,9 +209,9 @@ export default function ProjectsPage() {
<CardHeader className="pb-2">
<div className="flex justify-between items-start">
<div>
<CardTitle className="text-base font-bold">{project.project_code}</CardTitle>
<CardTitle className="text-base font-bold">{project.projectCode}</CardTitle>
<CardDescription className="mt-1 line-clamp-2">
{project.project_name}
{project.projectName}
</CardDescription>
</div>
<Badge variant={getStatusVariant(project.status)} className="shrink-0">
@@ -222,11 +222,11 @@ export default function ProjectsPage() {
<CardContent className="pb-2 space-y-4">
<div className="flex items-center gap-2 text-sm text-muted-foreground">
<Folder className="h-4 w-4" />
<span>{project.contractor_name}</span>
<span>{project.contractorName}</span>
</div>
<div className="flex items-center gap-2 text-sm text-muted-foreground">
<Calendar className="h-4 w-4" />
<span>{project.start_date} - {project.end_date}</span>
<span>{project.startDate} - {project.endDate}</span>
</div>
<div className="space-y-1">
<div className="flex justify-between text-xs">
@@ -248,4 +248,4 @@ export default function ProjectsPage() {
</div>
</div>
);
}
}