[FIX] Test multi-agente: dashboard gauge + risks backToList/loadFair

- dashboard: complianceScore ora ritorna 'score' (overall_score ultimo assessment);
  la gauge usa avg_implementation se >0, altrimenti il punteggio assessment.
  Prima mostrava 0% per org con gap analysis ma senza modulo controlli (H2).
- risks.html backToList(): ripristina la vista corrente tra le 4 (table/matrix/fair/kri),
  prima cadeva sempre su table/matrix (H1); renderDetail nasconde tutte e 4.
- risks.html loadFair(): legge risksRes.data.items (endpoint paginato), prima
  risksRes.data.risks era undefined e il dropdown FAIR restava vuoto (M1).

php -l + node --check OK. version 1.10.3.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile 2026-05-31 14:56:10 +02:00
parent 4d9153b36f
commit 2037cecaba
4 changed files with 13 additions and 8 deletions

View File

@ -147,6 +147,8 @@ class DashboardController extends BaseController
'total_controls' => $totalControls, 'total_controls' => $totalControls,
'implemented_controls' => $implementedControls, 'implemented_controls' => $implementedControls,
'avg_implementation' => $avgImplementation, 'avg_implementation' => $avgImplementation,
// Fallback per la gauge: punteggio gap analysis quando non ci sono controlli.
'score' => isset($assessments[0]['overall_score']) ? (float) $assessments[0]['overall_score'] : null,
]); ]);
} }

View File

@ -186,7 +186,10 @@
try { try {
const scoreRes = await api.getComplianceScore(); const scoreRes = await api.getComplianceScore();
if (scoreRes.success && scoreRes.data) { if (scoreRes.success && scoreRes.data) {
const score = scoreRes.data.avg_implementation || scoreRes.data.score || 0; // Preferisci la % controlli implementati; se 0/assente (org con gap
// analysis fatta ma senza modulo controlli) ripiega sul punteggio assessment.
const d = scoreRes.data;
const score = (d.avg_implementation && d.avg_implementation > 0) ? d.avg_implementation : (d.score || 0);
document.getElementById('compliance-gauge').innerHTML = renderScoreGauge(score, 180); document.getElementById('compliance-gauge').innerHTML = renderScoreGauge(score, 180);
} else { } else {
document.getElementById('compliance-gauge').innerHTML = renderScoreGauge(0, 180); document.getElementById('compliance-gauge').innerHTML = renderScoreGauge(0, 180);

View File

@ -650,7 +650,7 @@
const [risksRes, regRes] = await Promise.all([api.listRisks({ per_page: 200 }), api.getFairRegister()]); const [risksRes, regRes] = await Promise.all([api.listRisks({ per_page: 200 }), api.getFairRegister()]);
const sel = document.getElementById('fair-risk-select'); const sel = document.getElementById('fair-risk-select');
if (risksRes.success) { if (risksRes.success) {
const risks = risksRes.data.risks || risksRes.data || []; const risks = (risksRes.data && risksRes.data.items) || risksRes.data.risks || [];
sel.innerHTML = '<option value="">— seleziona rischio —</option>' + sel.innerHTML = '<option value="">— seleziona rischio —</option>' +
risks.map(r => `<option value="${r.id}">${escapeHtml((r.risk_code ? r.risk_code + ' · ' : '') + r.title)}</option>`).join(''); risks.map(r => `<option value="${r.id}">${escapeHtml((r.risk_code ? r.risk_code + ' · ' : '') + r.title)}</option>`).join('');
} }
@ -869,6 +869,8 @@
function renderDetail(risk) { function renderDetail(risk) {
document.getElementById('view-table').classList.add('hidden'); document.getElementById('view-table').classList.add('hidden');
document.getElementById('view-matrix').classList.add('hidden'); document.getElementById('view-matrix').classList.add('hidden');
document.getElementById('view-fair').classList.add('hidden');
document.getElementById('view-kri').classList.add('hidden');
const container = document.getElementById('view-detail'); const container = document.getElementById('view-detail');
container.classList.remove('hidden'); container.classList.remove('hidden');
@ -1040,11 +1042,9 @@
function backToList() { function backToList() {
document.getElementById('view-detail').classList.add('hidden'); document.getElementById('view-detail').classList.add('hidden');
if (currentView === 'table') { // Ripristina la vista corrente tra le 4 (table/matrix/fair/kri), non solo table/matrix.
document.getElementById('view-table').classList.remove('hidden'); const view = ['table', 'matrix', 'fair', 'kri'].includes(currentView) ? currentView : 'table';
} else { document.getElementById('view-' + view).classList.remove('hidden');
document.getElementById('view-matrix').classList.remove('hidden');
}
} }
// ── Create/Edit Risk Modal ─────────────────────────────────── // ── Create/Edit Risk Modal ───────────────────────────────────

View File

@ -1 +1 @@
{"version":"1.10.2","build":"2026-05-31-v1.10.2","date":"2026-05-31","changelog":"Fix selettore modale (modal-overlay) per le viste Categorie e Template fornitori, che non si popolavano. Completamento UI Fase 1 modulo questionari fornitori."} {"version":"1.10.3","build":"2026-05-31-v1.10.3","date":"2026-05-31","changelog":"Fix da test multi-agente: dashboard gauge compliance (fallback overall_score quando 0 controlli, ora il backend ritorna score), risks.html backToList ripristina la vista corretta tra le 4 viste (table/matrix/fair/kri) e loadFair legge data.items. Selettore modali categorie/template corretto."}