diff --git a/application/controllers/DashboardController.php b/application/controllers/DashboardController.php
index 3a25e36..2ade882 100644
--- a/application/controllers/DashboardController.php
+++ b/application/controllers/DashboardController.php
@@ -147,6 +147,8 @@ class DashboardController extends BaseController
'total_controls' => $totalControls,
'implemented_controls' => $implementedControls,
'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,
]);
}
diff --git a/public/dashboard.html b/public/dashboard.html
index 6223db6..508906b 100644
--- a/public/dashboard.html
+++ b/public/dashboard.html
@@ -186,7 +186,10 @@
try {
const scoreRes = await api.getComplianceScore();
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);
} else {
document.getElementById('compliance-gauge').innerHTML = renderScoreGauge(0, 180);
diff --git a/public/risks.html b/public/risks.html
index 7821f15..27ce72e 100644
--- a/public/risks.html
+++ b/public/risks.html
@@ -650,7 +650,7 @@
const [risksRes, regRes] = await Promise.all([api.listRisks({ per_page: 200 }), api.getFairRegister()]);
const sel = document.getElementById('fair-risk-select');
if (risksRes.success) {
- const risks = risksRes.data.risks || risksRes.data || [];
+ const risks = (risksRes.data && risksRes.data.items) || risksRes.data.risks || [];
sel.innerHTML = '' +
risks.map(r => ``).join('');
}
@@ -869,6 +869,8 @@
function renderDetail(risk) {
document.getElementById('view-table').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');
container.classList.remove('hidden');
@@ -1040,11 +1042,9 @@
function backToList() {
document.getElementById('view-detail').classList.add('hidden');
- if (currentView === 'table') {
- document.getElementById('view-table').classList.remove('hidden');
- } else {
- document.getElementById('view-matrix').classList.remove('hidden');
- }
+ // Ripristina la vista corrente tra le 4 (table/matrix/fair/kri), non solo table/matrix.
+ const view = ['table', 'matrix', 'fair', 'kri'].includes(currentView) ? currentView : 'table';
+ document.getElementById('view-' + view).classList.remove('hidden');
}
// ── Create/Edit Risk Modal ───────────────────────────────────
diff --git a/public/version.json b/public/version.json
index 9a0c9e3..0c1f26a 100644
--- a/public/version.json
+++ b/public/version.json
@@ -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."}