[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:
parent
4d9153b36f
commit
2037cecaba
@ -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,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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 ───────────────────────────────────
|
||||||
|
|||||||
@ -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."}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user