diff --git a/src/components/SampleData.ts b/src/components/SampleData.ts index 2fd7295..939b6fa 100644 --- a/src/components/SampleData.ts +++ b/src/components/SampleData.ts @@ -95,6 +95,7 @@ export interface ProjectData { spent: number; vendor: string; vendorId?: string; + createdAt?: string | { seconds: number }; reports: ProjectReport[]; } diff --git a/src/components/VendorProjectCard.tsx b/src/components/VendorProjectCard.tsx index d7110d6..261680b 100644 --- a/src/components/VendorProjectCard.tsx +++ b/src/components/VendorProjectCard.tsx @@ -2,13 +2,14 @@ import React from "react"; import { Link } from "react-router-dom"; import { ProjectData } from "./SampleData"; +import ScheduleCompletionBar from "./forms/ScheduleCompletionBar"; interface VendorProjectCardProps { project: ProjectData; } const VendorProjectCard: React.FC = ({ project }) => { - const { id, name, status, metric1, metric2, description, reports } = project; + const { id, name, status, description, reports, createdAt } = project; // Sort reports by date (most recent first) const sortedReports = [...reports].sort( @@ -18,6 +19,9 @@ const VendorProjectCard: React.FC = ({ project }) => { // Get the two most recent reports const recentReports = sortedReports.slice(0, 2); + // Get the most recent report for schedule data + const latestReport = sortedReports[0]; + return (
@@ -51,14 +55,46 @@ const VendorProjectCard: React.FC = ({ project }) => {
- {metric1} + {/* Use ScheduleCompletion component */} + {latestReport?.scheduleData?.baseline?.expectedDate && + latestReport?.date && + createdAt ? ( + + ) : ( + + No schedule data available + + )}
- {metric2} +
Total Reports
+
+ + {reports.length} + +
diff --git a/src/components/forms/ScheduleCompletionBar.tsx b/src/components/forms/ScheduleCompletionBar.tsx new file mode 100644 index 0000000..caa58cd --- /dev/null +++ b/src/components/forms/ScheduleCompletionBar.tsx @@ -0,0 +1,55 @@ +// src/components/forms/ScheduleCompletionBar.tsx +import React from "react"; + +interface ScheduleCompletionBarProps { + projectCreatedAt: string; + expectedBaselineDate: string; + actualProjectedDate: string; + reportDate: string; +} + +const ScheduleCompletionBar: React.FC = ({ + projectCreatedAt, + expectedBaselineDate, + reportDate, +}) => { + // Parse dates + const createdDate = new Date(projectCreatedAt); + const baselineDate = new Date(expectedBaselineDate); + const currentDate = new Date(reportDate); + + // Calculate total project duration (from creation to baseline completion) + const totalDuration = baselineDate.getTime() - createdDate.getTime(); + + // Calculate elapsed time (from creation to report date) + const elapsedTime = currentDate.getTime() - createdDate.getTime(); + + // Calculate percentage complete + const percentageComplete = Math.min( + Math.max((elapsedTime / totalDuration) * 100, 0), + 100 + ); + + return ( +
+
Project Completion
+
+
+ {Math.round(percentageComplete)}% +
+
+
+ ); +}; + +export default ScheduleCompletionBar; diff --git a/src/pages/ProjectDetailPage.tsx b/src/pages/ProjectDetailPage.tsx index bd1645e..f415f63 100644 --- a/src/pages/ProjectDetailPage.tsx +++ b/src/pages/ProjectDetailPage.tsx @@ -26,7 +26,6 @@ const ProjectDetailPage: React.FC = () => { const loadProject = async () => { console.log("Looking for project with ID:", projectId); - // First, try to load from Firestore try { const projectRef = doc(db, "projects", projectId); const projectSnap = await getDoc(projectRef); @@ -54,7 +53,6 @@ const ProjectDetailPage: React.FC = () => { reports: [], } as ProjectData); - // Set up real-time listener for reports const reportsRef = collection(db, "projects", projectId, "reports"); const unsubscribe = onSnapshot(reportsRef, (snapshot) => { const reportsList = snapshot.docs.map( diff --git a/src/services/firebaseDataService.ts b/src/services/firebaseDataService.ts index 076376d..f776b96 100644 --- a/src/services/firebaseDataService.ts +++ b/src/services/firebaseDataService.ts @@ -255,7 +255,7 @@ export const fetchAllProjects = async (): Promise => { 100 ) : 0; - + // const project: ProjectData = { id: docSnapshot.id, name: data.name || "Untitled Project", @@ -271,6 +271,7 @@ export const fetchAllProjects = async (): Promise => { spent: data.spent || 0, vendor: data.vendor || data.vendorName || "No Vendor Assigned", vendorId: data.vendorId || undefined, + createdAt: data.createdAt || undefined, reports: reports, }; @@ -467,6 +468,7 @@ export const fetchProjectsByVendor = async ( spent: spentValue, vendor: data.vendor || data.vendorName || "No Vendor Assigned", vendorId: data.vendorId || undefined, + createdAt: data.createdAt || undefined, reports: reports, };