"use client"; import { useState, useEffect } from "react"; const STORAGE_KEY_PREFIX = "eval-dim-expanded"; function getStoredExpanded(evaluationId: string, dimensionId: string): boolean | null { if (typeof window === "undefined") return null; try { const raw = localStorage.getItem(`${STORAGE_KEY_PREFIX}-${evaluationId}`); if (!raw) return null; const obj = JSON.parse(raw) as Record; return obj[dimensionId] ?? null; } catch { return null; } } function setStoredExpanded(evaluationId: string, dimensionId: string, expanded: boolean): void { if (typeof window === "undefined") return; try { const key = `${STORAGE_KEY_PREFIX}-${evaluationId}`; const raw = localStorage.getItem(key); const obj = (raw ? JSON.parse(raw) : {}) as Record; obj[dimensionId] = expanded; localStorage.setItem(key, JSON.stringify(obj)); } catch { /* ignore */ } } interface Dimension { id: string; slug: string; title: string; rubric: string; suggestedQuestions?: string | null; } interface DimensionScore { score: number | null; justification: string | null; examplesObserved: string | null; confidence: string | null; candidateNotes: string | null; } interface DimensionCardProps { dimension: Dimension; score: DimensionScore | null; index: number; evaluationId?: string; onScoreChange: (dimensionId: string, data: Partial) => void; /** Increment to collapse this card (e.g. from "Tout fermer" button) */ collapseAllTrigger?: number; } function parseRubric(rubric: string): string[] { if (rubric === "1-5" || !rubric) return ["1", "2", "3", "4", "5"]; const labels: string[] = []; for (let i = 1; i <= 5; i++) { const m = rubric.match(new RegExp(`${i}:([^;]+)`)); labels.push(m ? m[1].trim() : String(i)); } return labels; } function parseQuestions(s: string | null | undefined): string[] { if (!s) return []; try { const arr = JSON.parse(s) as unknown; return Array.isArray(arr) ? arr.filter((x): x is string => typeof x === "string") : []; } catch { return []; } } const inputClass = "w-full rounded border border-zinc-300 dark:border-zinc-600 bg-white dark:bg-zinc-700/80 px-2.5 py-1.5 text-sm text-zinc-900 dark:text-zinc-100 placeholder-zinc-400 dark:placeholder-zinc-500 focus:border-cyan-500 focus:ring-1 focus:ring-cyan-500/30"; export function DimensionCard({ dimension, score, index, evaluationId, onScoreChange, collapseAllTrigger }: DimensionCardProps) { const [notes, setNotes] = useState(score?.candidateNotes ?? ""); const hasQuestions = parseQuestions(dimension.suggestedQuestions).length > 0; const [expanded, setExpanded] = useState(hasQuestions); useEffect(() => { if (evaluationId && typeof window !== "undefined") { const stored = getStoredExpanded(evaluationId, dimension.id); if (stored !== null) queueMicrotask(() => setExpanded(stored)); } }, [evaluationId, dimension.id]); useEffect(() => { if (collapseAllTrigger != null && collapseAllTrigger > 0) { queueMicrotask(() => setExpanded(false)); if (evaluationId) setStoredExpanded(evaluationId, dimension.id, false); } }, [collapseAllTrigger, evaluationId, dimension.id]); const toggleExpanded = () => { setExpanded((e) => { const next = !e; if (evaluationId) setStoredExpanded(evaluationId, dimension.id, next); return next; }); }; const currentScore = score?.score ?? null; const rubricLabels = parseRubric(dimension.rubric); const questions = parseQuestions(dimension.suggestedQuestions); return (
{expanded && (
{/* Questions suggérées - en premier */} {questions.length > 0 && (

Questions suggérées

    {questions.map((q, i) => (
  1. {q}
  2. ))}
)} {/* Rubric */}
{rubricLabels.map((r, i) => (
{i + 1} {r}
))}
{/* Quick score */}
Score: {[1, 2, 3, 4, 5].map((n) => ( ))} {currentScore != null && ( )}
{/* Notes candidat */}