[FIX] Liste paginate: frontend leggeva result.data (oggetto {items}) come array
Causa "Errore di connessione" su Inventario (e liste analoghe): gli endpoint
list usano jsonPaginated → data = {items,total,page,per_page,pages}, ma il
frontend faceva `allAssets = result.data || []` e poi .filter/.forEach/.length
sull'oggetto → TypeError → catch → messaggio d'errore (e stat a "--").
Allineato il consumo a jsonPaginated (come gia' faceva risks.html):
- public/assets.html — Inventario (loadAssets): estrae data.items + per_page=100
- public/incidents.html — lista incidenti (renderIncidentsTable)
- public/reports.html — visualizzatore Audit log (loadAuditLogs): data.items +
paginazione da data.pages/page (prima usava result.pagination/total_pages inesistenti)
- public/admin/organizations.html, public/admin/users.html — liste admin
(data.items + paginazione da data: total/per_page/page)
Tutti gli estrattori sono difensivi (gestiscono anche un eventuale array bare).
Verificato: endpoint reali tornano data={items,...}; nessun consumer rotto
restante (listNCRs/listFeedback non usati da pagine; /feedback/mine resta array).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
896caa829c
commit
f32b6f28f5
@@ -3,4 +3,4 @@
|
|||||||
Nessun ticket aperto.
|
Nessun ticket aperto.
|
||||||
|
|
||||||
---
|
---
|
||||||
_Ultimo sync: 2026-06-17 09:25:01_
|
_Ultimo sync: 2026-06-17 12:10:01_
|
||||||
|
|||||||
@@ -211,7 +211,8 @@
|
|||||||
try {
|
try {
|
||||||
const result = await api.request('GET', '/admin/organizations?page=' + page);
|
const result = await api.request('GET', '/admin/organizations?page=' + page);
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
renderOrganizations(result.data || [], result.pagination || {});
|
// /admin/organizations risponde paginato: data = {items, total, page, per_page, pages}.
|
||||||
|
renderOrganizations((result.data && result.data.items) || (Array.isArray(result.data) ? result.data : []), (result.data && !Array.isArray(result.data)) ? result.data : (result.pagination || {}));
|
||||||
} else {
|
} else {
|
||||||
container.innerHTML = `
|
container.innerHTML = `
|
||||||
<div class="empty-state">
|
<div class="empty-state">
|
||||||
|
|||||||
@@ -224,7 +224,8 @@
|
|||||||
try {
|
try {
|
||||||
const result = await api.request('GET', '/admin/users?page=' + page);
|
const result = await api.request('GET', '/admin/users?page=' + page);
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
renderUsers(result.data || [], result.pagination || {});
|
// /admin/users risponde paginato: data = {items, total, page, per_page, pages}.
|
||||||
|
renderUsers((result.data && result.data.items) || (Array.isArray(result.data) ? result.data : []), (result.data && !Array.isArray(result.data)) ? result.data : (result.pagination || {}));
|
||||||
} else {
|
} else {
|
||||||
container.innerHTML = `
|
container.innerHTML = `
|
||||||
<div class="empty-state">
|
<div class="empty-state">
|
||||||
|
|||||||
+3
-2
@@ -451,7 +451,7 @@
|
|||||||
const container = document.getElementById('assets-container');
|
const container = document.getElementById('assets-container');
|
||||||
container.innerHTML = '<div class="loading-state"><div class="spinner"></div><p>Caricamento inventario...</p></div>';
|
container.innerHTML = '<div class="loading-state"><div class="spinner"></div><p>Caricamento inventario...</p></div>';
|
||||||
|
|
||||||
const params = {};
|
const params = { per_page: 100 };
|
||||||
const type = document.getElementById('filter-type').value;
|
const type = document.getElementById('filter-type').value;
|
||||||
const criticality = document.getElementById('filter-criticality').value;
|
const criticality = document.getElementById('filter-criticality').value;
|
||||||
const status = document.getElementById('filter-status').value;
|
const status = document.getElementById('filter-status').value;
|
||||||
@@ -461,7 +461,8 @@
|
|||||||
try {
|
try {
|
||||||
const result = await api.listAssets(params);
|
const result = await api.listAssets(params);
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
allAssets = result.data || [];
|
// /assets/list risponde paginato: data = {items, total, ...}. Estrai l'array.
|
||||||
|
allAssets = (result.data && result.data.items) || (Array.isArray(result.data) ? result.data : []);
|
||||||
const view = type ? allAssets.filter(a => a.voce_code === type) : allAssets;
|
const view = type ? allAssets.filter(a => a.voce_code === type) : allAssets;
|
||||||
updateStats(view);
|
updateStats(view);
|
||||||
renderAssets(view);
|
renderAssets(view);
|
||||||
|
|||||||
@@ -400,7 +400,8 @@
|
|||||||
try {
|
try {
|
||||||
const result = await api.listIncidents(params);
|
const result = await api.listIncidents(params);
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
renderIncidentsTable(result.data || []);
|
// /incidents/list risponde paginato: data = {items, total, ...}.
|
||||||
|
renderIncidentsTable((result.data && result.data.items) || (Array.isArray(result.data) ? result.data : []));
|
||||||
} else {
|
} else {
|
||||||
showNotification(result.message || 'Errore nel caricamento incidenti', 'error');
|
showNotification(result.message || 'Errore nel caricamento incidenti', 'error');
|
||||||
}
|
}
|
||||||
|
|||||||
+7
-5
@@ -903,9 +903,11 @@
|
|||||||
try {
|
try {
|
||||||
const result = await api.getAuditLogs({ page: auditPage, per_page: 25 });
|
const result = await api.getAuditLogs({ page: auditPage, per_page: 25 });
|
||||||
if (result.success) {
|
if (result.success) {
|
||||||
const logs = result.data || [];
|
// /audit/logs risponde paginato: data = {items, total, page, per_page, pages}.
|
||||||
const pagination = result.pagination || {};
|
const d = result.data || {};
|
||||||
auditTotalPages = pagination.total_pages || 1;
|
const logs = Array.isArray(d) ? d : (d.items || []);
|
||||||
|
const pagination = Array.isArray(d) ? (result.pagination || {}) : d;
|
||||||
|
auditTotalPages = pagination.pages || pagination.total_pages || 1;
|
||||||
renderAuditLogs(logs, pagination);
|
renderAuditLogs(logs, pagination);
|
||||||
} else {
|
} else {
|
||||||
container.innerHTML = '<div class="empty-state-box"><h4>Errore nel caricamento</h4><p>' + escapeHtml(result.message || '') + '</p></div>';
|
container.innerHTML = '<div class="empty-state-box"><h4>Errore nel caricamento</h4><p>' + escapeHtml(result.message || '') + '</p></div>';
|
||||||
@@ -968,8 +970,8 @@
|
|||||||
|
|
||||||
html += '</tbody></table>';
|
html += '</tbody></table>';
|
||||||
|
|
||||||
// Pagination
|
// Pagination (data paginato: 'pages' = numero pagine totali)
|
||||||
const totalPages = pagination.total_pages || 1;
|
const totalPages = pagination.pages || pagination.total_pages || 1;
|
||||||
const currentPage = pagination.page || auditPage;
|
const currentPage = pagination.page || auditPage;
|
||||||
html += `
|
html += `
|
||||||
<div class="pagination">
|
<div class="pagination">
|
||||||
|
|||||||
Reference in New Issue
Block a user