feat: tableau de bord classeur - plages nommees, TCD/graphiques et KPI par feuille #153

A17 — nouveau endpoint GET /api/file/{vault}/xlsx/dashboard (read_workbook_
dashboard : plages nommees avec portee depuis defined_names read_only,
comptage graphiques/TCD par parts OPC, stats par feuille bornées 500x40 :
cellules/lignes/colonnes/formules/numerique + 8 premieres valeurs en cartes
KPI) et panneau frontend toggled depuis la toolbar (table des plages,
cartes KPI par feuille, hint actions IA). Bouton absent pour .csv et
formats en lecture seule ; le menu structure est saute quand le bouton
n'existe pas. i18n FR/EN (xlsx.dashboard_*), 8 tests backend + 2 tests
JSDOM + contre-preuve (5 echecs sur neutralisation), ruff/mypy 0.

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <[email protected]>
This commit is contained in:
2026-09-28 16:40:09 -04:00
parent ca6407e0c0
commit c4b8e66206
18 changed files with 562 additions and 15 deletions
+91
View File
@@ -11128,6 +11128,97 @@ body.desktop-mode .editor-container {
background: transparent;
color: var(--text-primary);
}
/* #153 A17 — workbook dashboard panel: named ranges table + KPI cards.
Colors come from the existing CSS variables (no hardcoded values). */
.xlsx-dashboard {
margin: 8px 0;
padding: 10px 12px;
border: 1px solid var(--border);
border-radius: 6px;
background: var(--surface);
}
.xlsx-dashboard-head {
display: flex;
align-items: baseline;
justify-content: space-between;
gap: 8px;
flex-wrap: wrap;
margin-bottom: 8px;
}
.xlsx-dashboard-head h3 {
display: flex;
align-items: center;
gap: 6px;
margin: 0;
font-size: 0.95rem;
color: var(--text-primary);
}
.xlsx-dashboard-objects {
font-size: 0.8rem;
color: var(--text-muted);
}
.xlsx-ranges-table {
margin-bottom: 10px;
font-size: 0.82rem;
}
.xlsx-kpi-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 8px;
}
.xlsx-kpi-sheet {
padding: 8px 10px;
border: 1px solid var(--border);
border-radius: 6px;
background: var(--bg-secondary);
}
.xlsx-kpi-sheet h4 {
margin: 0 0 4px;
font-size: 0.85rem;
color: var(--text-primary);
}
.xlsx-kpi-meta {
margin: 0 0 6px;
font-size: 0.75rem;
color: var(--text-muted);
}
.xlsx-kpi-cards {
display: flex;
flex-wrap: wrap;
gap: 6px;
}
.xlsx-kpi {
display: inline-flex;
flex-direction: column;
min-width: 64px;
padding: 4px 8px;
border: 1px solid var(--border);
border-radius: 6px;
background: var(--surface);
}
.xlsx-kpi-label {
font-size: 0.7rem;
color: var(--text-muted);
}
.xlsx-kpi-value {
font-family: 'JetBrains Mono', monospace;
font-size: 0.85rem;
color: var(--text-primary);
}
.xlsx-kpi-empty {
color: var(--text-muted);
font-size: 0.8rem;
}
.xlsx-dashboard-hint {
margin: 10px 0 0;
font-size: 0.78rem;
color: var(--text-muted);
}
.xlsx-dashboard-loading {
color: var(--text-muted);
font-size: 0.8rem;
}
.xlsx-structure-item:hover {
background: var(--bg-secondary);
}