diff --git a/client/pages/staff/StaffPerformanceReviews.tsx b/client/pages/staff/StaffPerformanceReviews.tsx new file mode 100644 index 00000000..1b011949 --- /dev/null +++ b/client/pages/staff/StaffPerformanceReviews.tsx @@ -0,0 +1,331 @@ +import { useState } from "react"; +import Layout from "@/components/Layout"; +import SEO from "@/components/SEO"; +import { Button } from "@/components/ui/button"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "@/components/ui/card"; +import { Badge } from "@/components/ui/badge"; +import { Progress } from "@/components/ui/progress"; +import { + TrendingUp, + MessageSquare, + CheckCircle, + Clock, + Award, + Users, +} from "lucide-react"; + +interface Review { + id: string; + period: string; + status: "Pending" | "In Progress" | "Completed"; + reviewer?: string; + dueDate: string; + feedback?: number; + selfAssessment?: boolean; +} + +interface Metric { + name: string; + score: number; + lastQuarter: number; +} + +const userReviews: Review[] = [ + { + id: "1", + period: "Q1 2025", + status: "In Progress", + dueDate: "March 31, 2025", + selfAssessment: true, + feedback: 3, + }, + { + id: "2", + period: "Q4 2024", + status: "Completed", + dueDate: "December 31, 2024", + selfAssessment: true, + feedback: 5, + }, + { + id: "3", + period: "Q3 2024", + status: "Completed", + dueDate: "September 30, 2024", + selfAssessment: true, + feedback: 4, + }, +]; + +const performanceMetrics: Metric[] = [ + { + name: "Technical Skills", + score: 8.5, + lastQuarter: 8.2, + }, + { + name: "Communication", + score: 8.8, + lastQuarter: 8.5, + }, + { + name: "Collaboration", + score: 9.0, + lastQuarter: 8.7, + }, + { + name: "Leadership", + score: 8.2, + lastQuarter: 7.9, + }, + { + name: "Problem Solving", + score: 8.7, + lastQuarter: 8.4, + }, +]; + +const getStatusColor = (status: string) => { + switch (status) { + case "Completed": + return "bg-green-500/20 text-green-300 border-green-500/30"; + case "In Progress": + return "bg-blue-500/20 text-blue-300 border-blue-500/30"; + case "Pending": + return "bg-amber-500/20 text-amber-300 border-amber-500/30"; + default: + return "bg-slate-500/20 text-slate-300"; + } +}; + +export default function StaffPerformanceReviews() { + const [selectedReview, setSelectedReview] = useState(null); + + const avgScore = + Math.round( + (performanceMetrics.reduce((sum, m) => sum + m.score, 0) / + performanceMetrics.length) * + 10, + ) / 10; + + return ( + + + +
+ {/* Background effects */} +
+
+
+
+ +
+ {/* Header */} +
+
+
+ +
+
+

+ Performance Reviews +

+

+ 360 feedback, self-assessments, and performance metrics +

+
+
+ + {/* Overall Score */} + + +
+
+

+ Overall Rating +

+

+ {avgScore} +

+

+ Based on 5 performance dimensions +

+
+
+
+ +

+ Exceeds Expectations +

+
+
+
+
+
+ + {/* Performance Metrics */} +
+

+ Performance Dimensions +

+
+ {performanceMetrics.map((metric) => ( + + +
+
+

+ {metric.name} +

+

+ Last quarter: {metric.lastQuarter} +

+
+

+ {metric.score} +

+
+ +
+
+ ))} +
+
+ + {/* Review History */} +
+

+ Review History +

+
+ {userReviews.map((review) => ( + + setSelectedReview( + selectedReview === review.id ? null : review.id, + ) + } + > + +
+
+ + {review.period} Review + + + Due: {review.dueDate} + +
+ + {review.status} + +
+
+ {selectedReview === review.id && ( + +
+ {review.selfAssessment && ( +
+ +
+

+ Self Assessment +

+

+ Completed +

+
+
+ )} + {review.feedback && ( +
+ +
+

+ 360 Feedback +

+

+ {review.feedback} responses +

+
+
+ )} + {review.status === "Completed" && ( +
+ +
+

+ Manager Review +

+

+ Completed +

+
+
+ )} +
+ +
+ )} +
+ ))} +
+
+ + {/* Action Items */} + + + Next Steps + + +
+ +
+

+ Complete Q1 Self Assessment +

+

+ Due by March 31, 2025 +

+
+
+
+ +
+

+ Schedule 1:1 with Manager +

+

+ Discuss Q1 progress and goals +

+
+
+
+
+
+
+
+ + ); +}