import { permissions } from "@mrp/shared"; import type { ProjectPriority, ProjectStatus, ProjectSummaryDto } from "@mrp/shared/dist/projects/types.js"; import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { useAuth } from "../../auth/AuthProvider"; import { api, ApiError } from "../../lib/api"; import { projectPriorityFilters, projectStatusFilters } from "./config"; import { ProjectPriorityBadge } from "./ProjectPriorityBadge"; import { ProjectStatusBadge } from "./ProjectStatusBadge"; export function ProjectListPage() { const { token, user } = useAuth(); const [projects, setProjects] = useState([]); const [query, setQuery] = useState(""); const [statusFilter, setStatusFilter] = useState<"ALL" | ProjectStatus>("ALL"); const [priorityFilter, setPriorityFilter] = useState<"ALL" | ProjectPriority>("ALL"); const [status, setStatus] = useState("Load projects, linked customer work, and program ownership."); const canManage = user?.permissions.includes(permissions.projectsWrite) ?? false; useEffect(() => { if (!token) { return; } setStatus("Loading projects..."); api .getProjects(token, { q: query || undefined, status: statusFilter === "ALL" ? undefined : statusFilter, priority: priorityFilter === "ALL" ? undefined : priorityFilter, }) .then((nextProjects) => { setProjects(nextProjects); setStatus(nextProjects.length === 0 ? "No projects matched the current filters." : `${nextProjects.length} project(s) loaded.`); }) .catch((error: unknown) => { const message = error instanceof ApiError ? error.message : "Unable to load projects."; setStatus(message); }); }, [priorityFilter, query, statusFilter, token]); return (

Projects

Program records

Track long-running customer programs across commercial commitments, shipment deliverables, ownership, and due dates.

{canManage ? ( New project ) : null}
{status}
{projects.length === 0 ? (
No projects are available for the current filters.
) : (
{projects.map((project) => ( ))}
Project Customer Owner Status Priority Due
{project.projectNumber}
{project.name}
{project.customerName} {project.ownerName || "Unassigned"} {project.dueDate ? new Date(project.dueDate).toLocaleDateString() : "No due date"}
)}
); }