[FIX] Documenti Istituzionali (#499): le 5 voci standard non comparivano mai (NO_ORG)

Root cause: InstitutionalDocsController::list() usava requireAuth()+getCurrentOrgId(),
ma currentOrgId e' popolato solo da requireOrgAccess() → getCurrentOrgId() = null →
l'endpoint rispondeva sempre NO_ORG (400) → loadDocs riceveva standards=[] → la card
mostrava solo "Aggiungi voce" (screenshot Simon). L'endpoint NON aveva mai funzionato a runtime.
- Backend: list() usa resolveOrgId() (risolve X-Organization-Id senza lanciare) e restituisce
  SEMPRE le 5 voci standard; i documenti salvati solo se un'org e' selezionata.
- Frontend (dashboard.js): render condiviso + STD_FALLBACK → le 5 voci si mostrano sempre,
  anche se l'API fallisce. Buster dashboard.js 20260825.
- Backend attivato via reload php-fpm host.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-08-26 18:14:07 +02:00
co-authored by Claude Opus 4.8
parent 69f3894c18
commit 396783cd41
3 changed files with 40 additions and 29 deletions
+32 -23
View File
@@ -318,34 +318,43 @@
for (var i = 0; i < standards.length; i++) if (standards[i].label === label) return standards[i].key;
return null;
}
// Le 5 voci standard DEVONO essere sempre presenti anche se l'API non risponde.
var STD_FALLBACK = [
{ key: 'codice_etico', label: 'Codice Etico' },
{ key: 'mission', label: 'Mission' },
{ key: 'vision', label: 'Vision' },
{ key: 'statuto', label: 'Statuto' },
{ key: 'piano_sanzionatorio', label: 'Piano Sanzionatorio' }
];
function renderDocsCard(docs, standards) {
var card = document.getElementById('doc-card'); if (!card) return;
standards = (standards && standards.length) ? standards : STD_FALLBACK;
docs = docs || [];
var byKey = {}; var customs = [];
docs.forEach(function (d) { if (d.doc_key) byKey[d.doc_key] = d; else customs.push(d); });
var html = '';
standards.forEach(function (s) {
var item = byKey[s.key] || { doc_key: s.key, title: s.label, is_standard: 1 };
html += docRow(item, s.label);
});
customs.forEach(function (d) { html += docRow(d, null); });
if (canEditDocs()) {
html += '<button class="btn-ghost doc-add" type="button" style="margin-top:8px">' +
'<i data-lucide="plus" class="ic"></i>Aggiungi voce</button>';
}
card.innerHTML = '<div class="doc-list">' + html + '</div>';
refreshIcons();
wireDocEvents(card, standards);
}
function loadDocs() {
var card = document.getElementById('doc-card'); if (!card) return;
setLoading('doc-card');
api.request('GET', '/institutional-docs/list').then(function (res) {
var data = (res && res.data) || res || {};
var docs = data.docs || [];
var standards = data.standards || [];
var byKey = {}; var customs = [];
docs.forEach(function (d) {
if (d.doc_key) byKey[d.doc_key] = d; else customs.push(d);
});
var html = '';
// 5 voci standard sempre presenti
standards.forEach(function (s) {
var item = byKey[s.key] || { doc_key: s.key, title: s.label, is_standard: 1 };
html += docRow(item, s.label);
});
// voci custom
customs.forEach(function (d) { html += docRow(d, null); });
if (canEditDocs()) {
html += '<button class="btn-ghost doc-add" type="button" style="margin-top:8px">' +
'<i data-lucide="plus" class="ic"></i>Aggiungi voce</button>';
}
card.innerHTML = '<div class="doc-list">' + html + '</div>';
refreshIcons();
wireDocEvents(card, standards);
}).catch(function (e) {
setError('doc-card', (e && e.message) || 'Riprova tra poco.');
renderDocsCard(data.docs || [], data.standards);
}).catch(function () {
// Anche in caso di errore mostriamo comunque le 5 voci standard.
renderDocsCard([], STD_FALLBACK);
});
}
function docModal(opts, standards) {