[FIX] api.js: sessione scaduta → login invece di pagina bloccata "--"

Bug segnalato da un tester "sono tornato su nis2 e non funziona più" (utente/
aziende "--", inventario bloccato su Caricamento, niente FAB segnalazioni).
Causa: un 401 su /auth/refresh (refresh token scaduto/invalido) rientrava nel
handler di refresh (la condizione non escludeva l'endpoint auth) → ricorsione:
doRefreshToken() non ritornava mai, quindi logout()/redirect a login non
scattava e la pagina restava rotta. Riprodotto con puppeteer (access scaduto +
refresh invalido → dashboard "--" identica allo screenshot).

Fix: escludi /auth/refresh e /auth/login dall'auto-refresh; inoltre un 401 senza
refresh token disponibile fa logout() → login. Ora un utente che torna dopo la
scadenza del token viene mandato a login (ri-accede) invece di vedere "--".
Bug PRE-ESISTENTE in api.js (non introdotto dal V3), critico ora col push tester.
Cache-buster api.js ?v=20260627u su tutte le pagine.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile
2026-07-14 10:09:50 +02:00
co-authored by Claude Opus 4.8
parent 64e10b152b
commit 41476c88f2
42 changed files with 57 additions and 46 deletions
+1 -1
View File
@@ -70,7 +70,7 @@
</script> </script>
<!-- Stessa logica della app: api.js + common.js (helper) + common-bi.js (override BI) --> <!-- Stessa logica della app: api.js + common.js (helper) + common-bi.js (override BI) -->
<script src="js/api.js?v=20260631"></script> <script src="js/api.js?v=20260627u"></script>
<script src="js/common.js?v=20260624g"></script> <script src="js/common.js?v=20260624g"></script>
<script src="js/common-bi.js?v=20260625d"></script> <script src="js/common-bi.js?v=20260625d"></script>
<script> <script>
+1 -1
View File
@@ -162,7 +162,7 @@
</main> </main>
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide → topnav-v3.js (chrome) → i18n → init pagina --> <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide → topnav-v3.js (chrome) → i18n → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -85,7 +85,7 @@
</main> </main>
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide → topnav-v3.js (chrome) → i18n → init pagina --> <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide → topnav-v3.js (chrome) → i18n → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -92,7 +92,7 @@
</main> </main>
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide → topnav-v3.js (chrome) → i18n → init pagina --> <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide → topnav-v3.js (chrome) → i18n → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -1122,7 +1122,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -270,7 +270,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help. La logica topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help. La logica
pagina (wizard GAP) resta inline: usa gli stessi id/funzioni di prima. --> pagina (wizard GAP) resta inline: usa gli stessi id/funzioni di prima. -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -377,7 +377,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -190,7 +190,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help. La logica del topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help. La logica del
calendario (aggregatore read-only) resta inline e usa gli stessi id/funzioni. --> calendario (aggregatore read-only) resta inline e usa gli stessi id/funzioni. -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -139,7 +139,7 @@
</main> </main>
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide → topnav-v3.js (chrome) → i18n → help → init pagina --> <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide → topnav-v3.js (chrome) → i18n → help → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -192,7 +192,7 @@
</div> </div>
<!-- Scripts V3. competenze.js si auto-inizializza su DOMContentLoaded (checkAuth/loadSidebar/I18n/Help). --> <!-- Scripts V3. competenze.js si auto-inizializza su DOMContentLoaded (checkAuth/loadSidebar/I18n/Help). -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -98,7 +98,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -155,7 +155,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -222,7 +222,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -112,7 +112,7 @@
<!-- Scripts V3: api.js (client REST, prima) → common.js (helper+FAB reali) → <!-- Scripts V3: api.js (client REST, prima) → common.js (helper+FAB reali) →
Lucide self-host → topnav-v3.js (chrome, ridefinisce loadSidebar) → Lucide self-host → topnav-v3.js (chrome, ridefinisce loadSidebar) →
i18n → help → dashboard.js --> i18n → help → dashboard.js -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -73,7 +73,7 @@
</script> </script>
<!-- Stessa logica della forgot-password.html: ZERO modifiche backend --> <!-- Stessa logica della forgot-password.html: ZERO modifiche backend -->
<script src="js/api.js?v=20260631"></script> <script src="js/api.js?v=20260627u"></script>
<script> <script>
const form = document.getElementById('forgot-form'); const form = document.getElementById('forgot-form');
const err = document.getElementById('err'); const err = document.getElementById('err');
+1 -1
View File
@@ -1177,7 +1177,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -359,7 +359,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -931,7 +931,7 @@ curl -H <span class="str">"X-API-Key: nis2_TUA_CHIAVE"</span> \
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -160,7 +160,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -199,7 +199,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → isms.js. topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → isms.js.
isms.js si auto-inizializza su DOMContentLoaded (checkAuth/I18n/loadSidebar/Help/render). --> isms.js si auto-inizializza su DOMContentLoaded (checkAuth/I18n/loadSidebar/Help/render). -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+13 -2
View File
@@ -40,12 +40,23 @@ class NIS2API {
const response = await fetch(url, config); const response = await fetch(url, config);
const json = await response.json(); const json = await response.json();
// Token expired - try refresh // Token expired - try refresh. ESCLUDI gli endpoint auth stessi: un 401 su
if (response.status === 401 && this.refreshToken && !options._isRetry) { // /auth/refresh (refresh token scaduto/invalido) NON deve ri-triggerare il
// refresh → altrimenti ricorsione infinita, doRefreshToken() non ritorna mai,
// logout()/redirect non scatta e l'utente resta su una pagina rotta ("--").
// (Bug utente "sono tornato dopo un po'": access scaduto + refresh non valido.)
const isAuthEndpoint = endpoint === '/auth/refresh' || endpoint === '/auth/login';
if (response.status === 401 && !isAuthEndpoint && !options._isRetry) {
if (this.refreshToken) {
const refreshed = await this.doRefreshToken(); const refreshed = await this.doRefreshToken();
if (refreshed) { if (refreshed) {
return this.request(method, endpoint, data, { ...options, _isRetry: true }); return this.request(method, endpoint, data, { ...options, _isRetry: true });
} }
// refresh fallito → doRefreshToken() ha già fatto logout()+redirect a login
} else {
// 401 senza refresh token → sessione non recuperabile → vai a login
this.logout();
}
} }
if (!json.success && !options.silent) { if (!json.success && !options.silent) {
+1 -1
View File
@@ -175,7 +175,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → kb.js --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → kb.js -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -515,7 +515,7 @@ body { background: var(--bg-main); }
<div id="toast"></div> <div id="toast"></div>
<script src="js/api.js?v=20260631"></script> <script src="js/api.js?v=20260627u"></script>
<script> <script>
// ══════════════════════════════════════════════════════ // ══════════════════════════════════════════════════════
// CONFIG // CONFIG
+1 -1
View File
@@ -94,7 +94,7 @@
</script> </script>
<!-- Stessa logica della login attuale: ZERO modifiche backend --> <!-- Stessa logica della login attuale: ZERO modifiche backend -->
<script src="js/api.js?v=20260631"></script> <script src="js/api.js?v=20260627u"></script>
<script src="js/common.js?v=20260624g"></script> <script src="js/common.js?v=20260624g"></script>
<script> <script>
if (api.isAuthenticated()) { window.location.href = 'dashboard.html'; } if (api.isAuthenticated()) { window.location.href = 'dashboard.html'; }
+1 -1
View File
@@ -147,7 +147,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -175,7 +175,7 @@
</div> </div>
<!-- Scripts V3 (ordine ESATTO come dashboard.html) --> <!-- Scripts V3 (ordine ESATTO come dashboard.html) -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -137,7 +137,7 @@
</main> </main>
<!-- Scripts V3 (ordine ESATTO come dashboard.html) --> <!-- Scripts V3 (ordine ESATTO come dashboard.html) -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -494,7 +494,7 @@
</script> </script>
<!-- Stessa logica della onboarding.html: ZERO modifiche backend --> <!-- Stessa logica della onboarding.html: ZERO modifiche backend -->
<script src="js/api.js?v=20260631"></script> <script src="js/api.js?v=20260627u"></script>
<script src="js/common.js?v=20260624g"></script> <script src="js/common.js?v=20260624g"></script>
<script> <script>
// ── Auth check ────────────────────────────────────────────────── // ── Auth check ──────────────────────────────────────────────────
+1 -1
View File
@@ -151,7 +151,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → organigramma.js. topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → organigramma.js.
organigramma.js si auto-inizializza su DOMContentLoaded (checkAuth/loadSidebar/I18n/Help). --> organigramma.js si auto-inizializza su DOMContentLoaded (checkAuth/loadSidebar/I18n/Help). -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -340,7 +340,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -141,7 +141,7 @@
</main> </main>
<!-- Scripts V3. raci.js si auto-inizializza su DOMContentLoaded (checkAuth/loadSidebar/I18n/Help). --> <!-- Scripts V3. raci.js si auto-inizializza su DOMContentLoaded (checkAuth/loadSidebar/I18n/Help). -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -268,7 +268,7 @@
</script> </script>
<!-- Stessa logica della register.html: ZERO modifiche backend --> <!-- Stessa logica della register.html: ZERO modifiche backend -->
<script src="js/api.js?v=20260631"></script> <script src="js/api.js?v=20260627u"></script>
<script src="js/common.js?v=20260624g"></script> <script src="js/common.js?v=20260624g"></script>
<script> <script>
if (api.isAuthenticated()) { window.location.href = 'dashboard.html'; } if (api.isAuthenticated()) { window.location.href = 'dashboard.html'; }
+1 -1
View File
@@ -232,7 +232,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -157,7 +157,7 @@
</div> </div>
<!-- Scripts V3 (ordine ESATTO come dashboard.html) --> <!-- Scripts V3 (ordine ESATTO come dashboard.html) -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -502,7 +502,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -735,7 +735,7 @@
<!-- Scripts V3: api.js (client REST, prima) → common.js (helper+FAB reali) → <!-- Scripts V3: api.js (client REST, prima) → common.js (helper+FAB reali) →
Lucide self-host → topnav-v3.js (chrome, ridefinisce loadSidebar) → Lucide self-host → topnav-v3.js (chrome, ridefinisce loadSidebar) →
i18n → help → init pagina (inline, invariato). --> i18n → help → init pagina (inline, invariato). -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -215,7 +215,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -210,7 +210,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -542,7 +542,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -190,7 +190,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali+showModal/showNotification) → <!-- Scripts V3: api.js → common.js (helper+FAB reali+showModal/showNotification) →
Lucide self-host → topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help. Lucide self-host → topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help.
La logica della pagina e' inline (nessun training.js): preservata invariata. --> La logica della pagina e' inline (nessun training.js): preservata invariata. -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -258,7 +258,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>
+1 -1
View File
@@ -143,7 +143,7 @@
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host → <!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina. --> topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina. -->
<script src="/js/api.js?v=20260625d"></script> <script src="/js/api.js?v=20260627u"></script>
<script src="/js/common.js?v=20260627t"></script> <script src="/js/common.js?v=20260627t"></script>
<script src="/vendor/lucide/lucide.min.js"></script> <script src="/vendor/lucide/lucide.min.js"></script>
<script src="/js/topnav-v3.js?v=20260627t"></script> <script src="/js/topnav-v3.js?v=20260627t"></script>