From 34b2a8c5cc1c86e2d321c6c7a77f40ce6919191c Mon Sep 17 00:00:00 2001 From: Julien Froidefond Date: Fri, 20 Feb 2026 11:59:13 +0100 Subject: [PATCH] Integrate RadarChart component into DashboardPage, enhancing evaluation display with radar data visualization. Update API to include dimensions in template retrieval, and adjust RadarChart for compact mode support. --- src/app/api/evaluations/route.ts | 6 +- src/app/page.tsx | 165 ++++++++++++++++++------------- src/components/RadarChart.tsx | 12 ++- 3 files changed, 106 insertions(+), 77 deletions(-) diff --git a/src/app/api/evaluations/route.ts b/src/app/api/evaluations/route.ts index c0d81a1..b36ae19 100644 --- a/src/app/api/evaluations/route.ts +++ b/src/app/api/evaluations/route.ts @@ -13,7 +13,7 @@ export async function GET(req: NextRequest) { ...(templateId && { templateId }), }, include: { - template: true, + template: { include: { dimensions: { orderBy: { orderIndex: "asc" } } } }, dimensionScores: { include: { dimension: true } }, }, orderBy: { evaluationDate: "desc" }, @@ -57,7 +57,7 @@ export async function POST(req: NextRequest) { status: "draft", }, include: { - template: true, + template: { include: { dimensions: { orderBy: { orderIndex: "asc" } } } }, dimensionScores: { include: { dimension: true } }, }, }); @@ -75,7 +75,7 @@ export async function POST(req: NextRequest) { const updated = await prisma.evaluation.findUnique({ where: { id: evaluation.id }, include: { - template: true, + template: { include: { dimensions: { orderBy: { orderIndex: "asc" } } } }, dimensionScores: { include: { dimension: true } }, }, }); diff --git a/src/app/page.tsx b/src/app/page.tsx index f9adf70..a5a6cce 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -4,6 +4,12 @@ import { useState, useEffect } from "react"; import Link from "next/link"; import { format } from "date-fns"; import { ConfirmModal } from "@/components/ConfirmModal"; +import { RadarChart } from "@/components/RadarChart"; + +interface Dimension { + id: string; + title: string; +} interface EvalRow { id: string; @@ -12,8 +18,32 @@ interface EvalRow { candidateTeam?: string | null; evaluatorName: string; evaluationDate: string; - template?: { name: string }; + template?: { name: string; dimensions?: Dimension[] }; status: string; + dimensionScores?: { dimensionId: string; score: number | null; dimension?: { title: string } }[]; +} + +function buildRadarData(e: EvalRow) { + const dimensions = e.template?.dimensions ?? []; + const scoreMap = new Map( + (e.dimensionScores ?? []).map((ds) => [ds.dimensionId, ds]) + ); + return dimensions + .filter((dim) => !(dim.title ?? "").startsWith("[Optionnel]")) + .map((dim) => { + const ds = scoreMap.get(dim.id); + const score = ds?.score; + if (score == null) return null; + const s = Number(score); + if (Number.isNaN(s) || s < 0 || s > 5) return null; + const title = dim.title ?? ""; + return { + dimension: title.length > 12 ? title.slice(0, 12) + "…" : title, + score: s, + fullMark: 5, + }; + }) + .filter((d): d is { dimension: string; score: number; fullMark: number } => d != null); } export default function DashboardPage() { @@ -41,80 +71,77 @@ export default function DashboardPage() { -
- - - - - - - - - - - - - - - {loading ? ( - - - - ) : evaluations.length === 0 ? ( - - - - ) : ( - evaluations.map((e) => ( - - - - - - - - - - - )) - )} - -
CandidatÉquipeRôleÉvaluateurDateModèleStatut
- loading... -
- Aucune évaluation.{" "} - - Créer - -
{e.candidateName}{e.candidateTeam ?? "—"}{e.candidateRole}{e.evaluatorName} - {format(new Date(e.evaluationDate), "yyyy-MM-dd")} - {e.template?.name ?? ""} + {loading ? ( +
loading...
+ ) : evaluations.length === 0 ? ( +
+ Aucune évaluation.{" "} + + Créer + +
+ ) : ( +
+ {evaluations.map((e) => { + const radarData = buildRadarData(e); + return ( + +
+
+
+

{e.candidateName}

+

+ {e.candidateRole} + {e.candidateTeam && ` · ${e.candidateTeam}`} +

+
{e.status === "submitted" ? "ok" : "draft"} -
- - - → - - - -
-
+ +
+ {e.evaluatorName} + {format(new Date(e.evaluationDate), "yyyy-MM-dd")} + {e.template?.name ?? ""} +
+
+ {radarData.length > 0 ? ( + + ) : ( +
+ pas de scores +
+ )} +
+ +
+ → ouvrir + +
+ + ); + })} + + )} +
- - + + - + {!compact && }