- Restructure: move backend from new_project/ to backend/ - Add full React/TypeScript frontend (37 pages, 17 services, 16 type defs, 11 query hooks) - Add docs/ with SRS specs, user stories, and workflow documentation - Update .gitignore for new directory layout Workflows implemented: WF1 User Signup, WF2 Placement Test, WF3 Exam Configuration, WF4 General English Exam, WF5 Course Generation, WF6 Entity Student Onboarding, AI Course Generation, Adaptive Learning Engine UI, White-Label Branding, Score Release Made-with: Cursor
46 lines
1.3 KiB
TypeScript
46 lines
1.3 KiB
TypeScript
import { Badge } from "@/components/ui/badge";
|
|
import { Tooltip, TooltipContent, TooltipTrigger } from "@/components/ui/tooltip";
|
|
|
|
export type AiRiskLevel = "At Risk" | "Monitor" | "On Track";
|
|
|
|
interface Props {
|
|
riskLevel?: AiRiskLevel;
|
|
reasons?: string[];
|
|
}
|
|
|
|
export default function AiRiskBadge({ riskLevel, reasons }: Props) {
|
|
if (!riskLevel) {
|
|
return (
|
|
<Tooltip>
|
|
<TooltipTrigger asChild>
|
|
<Badge variant="outline" className="text-xs cursor-help">
|
|
Unknown
|
|
</Badge>
|
|
</TooltipTrigger>
|
|
<TooltipContent>
|
|
<p className="text-xs max-w-[200px]">Risk data not available from profile.</p>
|
|
</TooltipContent>
|
|
</Tooltip>
|
|
);
|
|
}
|
|
|
|
const variant: "destructive" | "secondary" | "default" =
|
|
riskLevel === "At Risk" ? "destructive" : riskLevel === "Monitor" ? "secondary" : "default";
|
|
|
|
const tooltipText =
|
|
reasons?.filter(Boolean).length ? reasons!.filter(Boolean).join(" · ") : "No additional details provided.";
|
|
|
|
return (
|
|
<Tooltip>
|
|
<TooltipTrigger asChild>
|
|
<Badge variant={variant} className="text-xs cursor-help">
|
|
{riskLevel}
|
|
</Badge>
|
|
</TooltipTrigger>
|
|
<TooltipContent>
|
|
<p className="text-xs max-w-[200px]">{tooltipText}</p>
|
|
</TooltipContent>
|
|
</Tooltip>
|
|
);
|
|
}
|