[FEAT] Sessione + release: refresh token silenzioso + avviso "nuova versione"
Evita la "sessione scaduta" e i deploy che restano invisibili all'utente. - api.js: refresh PROATTIVO dell'access token ~2 min prima della scadenza (scheduleTokenRefresh su exp del JWT, riprogrammato ad ogni setTokens) + ensureFreshToken() per rinnovo immediato al ritorno sulla scheda. Con refresh a 7gg l'utente resta loggato senza mai vedere il login. - common.js: watch versione (poll version.json ogni 5 min + su visibilitychange) → banner "È disponibile una nuova versione — Aggiorna" (reload) quando cambia; nudge service worker (registration.update); su visibilitychange chiama anche api.ensureFreshToken(). Nessun hard-refresh manuale. - Cache-buster api/common ?v=20260729b. version 1.25.12. Solo frontend. 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
faadb62da6
commit
cf224480cc
@@ -70,8 +70,8 @@
|
||||
</script>
|
||||
|
||||
<!-- Stessa logica della app: api.js + common.js (helper) + common-bi.js (override BI) -->
|
||||
<script src="js/api.js?v=20260729"></script>
|
||||
<script src="js/common.js?v=20260624g"></script>
|
||||
<script src="js/api.js?v=20260729b"></script>
|
||||
<script src="js/common.js?v=20260729b"></script>
|
||||
<script src="js/common-bi.js?v=20260625d"></script>
|
||||
<script>
|
||||
// Renderizza la sidebar BI (loadSidebar è stato ridefinito da common-bi.js)
|
||||
|
||||
@@ -162,8 +162,8 @@
|
||||
</main>
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide → topnav-v3.js (chrome) → i18n → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -85,8 +85,8 @@
|
||||
</main>
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide → topnav-v3.js (chrome) → i18n → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -92,8 +92,8 @@
|
||||
</main>
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide → topnav-v3.js (chrome) → i18n → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -1122,8 +1122,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -270,8 +270,8 @@
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help. La logica
|
||||
pagina (wizard GAP) resta inline: usa gli stessi id/funzioni di prima. -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
+2
-2
@@ -377,8 +377,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -190,8 +190,8 @@
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help. La logica del
|
||||
calendario (aggregatore read-only) resta inline e usa gli stessi id/funzioni. -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -197,8 +197,8 @@
|
||||
</main>
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide → topnav-v3.js (chrome) → i18n → help → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -192,8 +192,8 @@
|
||||
</div>
|
||||
|
||||
<!-- Scripts V3. competenze.js si auto-inizializza su DOMContentLoaded (checkAuth/loadSidebar/I18n/Help). -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -98,8 +98,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -155,8 +155,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -222,8 +222,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -112,8 +112,8 @@
|
||||
<!-- Scripts V3: api.js (client REST, prima) → common.js (helper+FAB reali) →
|
||||
Lucide self-host → topnav-v3.js (chrome, ridefinisce loadSidebar) →
|
||||
i18n → help → dashboard.js -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -73,7 +73,7 @@
|
||||
</script>
|
||||
|
||||
<!-- Stessa logica della forgot-password.html: ZERO modifiche backend -->
|
||||
<script src="js/api.js?v=20260729"></script>
|
||||
<script src="js/api.js?v=20260729b"></script>
|
||||
<script>
|
||||
const form = document.getElementById('forgot-form');
|
||||
const err = document.getElementById('err');
|
||||
|
||||
+2
-2
@@ -1177,8 +1177,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -359,8 +359,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -931,8 +931,8 @@ curl -H <span class="str">"X-API-Key: nis2_TUA_CHIAVE"</span> \
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -160,8 +160,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
+2
-2
@@ -199,8 +199,8 @@
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → isms.js.
|
||||
isms.js si auto-inizializza su DOMContentLoaded (checkAuth/I18n/loadSidebar/Help/render). -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -10,6 +10,42 @@ class NIS2API {
|
||||
this.token = localStorage.getItem('nis2_access_token');
|
||||
this.refreshToken = localStorage.getItem('nis2_refresh_token');
|
||||
this.orgId = localStorage.getItem('nis2_org_id');
|
||||
this._refreshTimer = null;
|
||||
if (this.token) this.scheduleTokenRefresh();
|
||||
}
|
||||
|
||||
// ── Refresh proattivo/silenzioso ────────────────────────────────────
|
||||
// Rinnova l'access token PRIMA che scada, così l'utente non incontra 401 né deve
|
||||
// rifare il login (il refresh token dura 7 giorni). Evita la "sessione scaduta".
|
||||
_tokenExp(token) {
|
||||
try {
|
||||
const raw = (token || this.token || '').split('.')[1];
|
||||
const p = JSON.parse(atob(raw.replace(/-/g, '+').replace(/_/g, '/')));
|
||||
return (typeof p.exp === 'number') ? p.exp : 0;
|
||||
} catch (e) { return 0; }
|
||||
}
|
||||
|
||||
scheduleTokenRefresh() {
|
||||
if (this._refreshTimer) { clearTimeout(this._refreshTimer); this._refreshTimer = null; }
|
||||
if (!this.token || !this.refreshToken) return;
|
||||
const exp = this._tokenExp(this.token);
|
||||
if (!exp) return;
|
||||
let delay = exp * 1000 - Date.now() - 120000; // rinnova ~2 min prima della scadenza
|
||||
if (delay < 1000) delay = 1000;
|
||||
if (delay > 2000000000) delay = 2000000000; // cap (limite setTimeout a 32 bit)
|
||||
this._refreshTimer = setTimeout(() => {
|
||||
if (this.isAuthenticated() && this.refreshToken) this.doRefreshToken().catch(() => {});
|
||||
}, delay);
|
||||
}
|
||||
|
||||
// Rinnova SUBITO se l'access è scaduto o entro 5 min (usato al ritorno sulla scheda
|
||||
// dopo sospensione/inattività, quando i timer possono non essere scattati).
|
||||
async ensureFreshToken() {
|
||||
if (!this.token || !this.refreshToken) return;
|
||||
const exp = this._tokenExp(this.token);
|
||||
if (exp && exp * 1000 - Date.now() < 300000) {
|
||||
await this.doRefreshToken().catch(() => {});
|
||||
}
|
||||
}
|
||||
|
||||
// ═══════════════════════════════════════════════════════════════════
|
||||
@@ -133,6 +169,7 @@ class NIS2API {
|
||||
this.refreshToken = refresh;
|
||||
localStorage.setItem('nis2_access_token', access);
|
||||
localStorage.setItem('nis2_refresh_token', refresh);
|
||||
this.scheduleTokenRefresh(); // riprogramma il refresh silenzioso sul nuovo exp
|
||||
}
|
||||
|
||||
clearTokens() {
|
||||
|
||||
@@ -507,11 +507,17 @@ async function _loadFirmBranding() {
|
||||
|
||||
// ── Versioning live (Fase 4 / G13) ──────────────────────────────────────
|
||||
let _versionInfo = null;
|
||||
let _loadedVersion = null; // versione con cui l'app è stata caricata (per il check aggiornamenti)
|
||||
let _updateWatchStarted = false;
|
||||
async function _loadVersionFooter() {
|
||||
try {
|
||||
const r = await fetch('/version.json?_=' + Date.now());
|
||||
if (!r.ok) return;
|
||||
_versionInfo = await r.json();
|
||||
if (_loadedVersion === null && _versionInfo && _versionInfo.version) {
|
||||
_loadedVersion = _versionInfo.version;
|
||||
_startUpdateWatch();
|
||||
}
|
||||
const el = document.getElementById('sidebar-version');
|
||||
if (el && _versionInfo.version) {
|
||||
el.textContent = 'v' + _versionInfo.version + (_versionInfo.build ? ' · ' + _versionInfo.build : '');
|
||||
@@ -524,6 +530,52 @@ function _showVersionChangelog() {
|
||||
alert('NIS2 Agile v' + v.version + '\nBuild: ' + (v.build || '—') + '\nData: ' + (v.date || '—') + '\n\n' + (v.changelog || 'Nessun changelog disponibile'));
|
||||
}
|
||||
|
||||
// ── Gestione release: avvisa (senza forzare) quando è online una nuova versione ──
|
||||
// Poll di version.json ogni 5 min + al ritorno sulla scheda; se la versione è cambiata
|
||||
// mostra un banner "Aggiorna" che ricarica (asset freschi via cache-buster + service worker).
|
||||
// Al ritorno sulla scheda rinnova anche il token (evita la sessione scaduta dopo sospensione).
|
||||
function _startUpdateWatch() {
|
||||
if (_updateWatchStarted) return;
|
||||
_updateWatchStarted = true;
|
||||
setInterval(_checkForUpdate, 5 * 60 * 1000);
|
||||
document.addEventListener('visibilitychange', () => {
|
||||
if (document.visibilityState === 'visible') {
|
||||
_checkForUpdate();
|
||||
if (typeof api !== 'undefined' && api.ensureFreshToken) api.ensureFreshToken();
|
||||
}
|
||||
});
|
||||
_swUpdate();
|
||||
}
|
||||
function _swUpdate() {
|
||||
try { if (navigator.serviceWorker) navigator.serviceWorker.getRegistration().then(r => { if (r) r.update(); }).catch(() => {}); } catch (e) { /* noop */ }
|
||||
}
|
||||
async function _checkForUpdate() {
|
||||
try {
|
||||
const r = await fetch('/version.json?_=' + Date.now(), { cache: 'no-store' });
|
||||
if (!r.ok) return;
|
||||
const info = await r.json();
|
||||
if (info && info.version && _loadedVersion && info.version !== _loadedVersion) {
|
||||
_showUpdateBanner(info.version);
|
||||
}
|
||||
_swUpdate();
|
||||
} catch (e) { /* silenzioso */ }
|
||||
}
|
||||
function _showUpdateBanner(newVersion) {
|
||||
if (document.getElementById('nis2-update-banner')) return;
|
||||
const b = document.createElement('div');
|
||||
b.id = 'nis2-update-banner';
|
||||
b.style.cssText = 'position:fixed;left:50%;bottom:20px;transform:translateX(-50%);z-index:9998;' +
|
||||
'background:#0A2E54;color:#fff;border-radius:12px;padding:12px 16px;display:flex;align-items:center;gap:14px;' +
|
||||
'box-shadow:0 10px 30px rgba(11,40,80,.28);font:500 14px/1.4 Inter,system-ui,Arial,sans-serif;max-width:92vw';
|
||||
b.innerHTML =
|
||||
'<span>È disponibile una <b>nuova versione</b>' + (newVersion ? ' (v' + escapeHtml(String(newVersion)) + ')' : '') + '. Aggiorna per averla.</span>' +
|
||||
'<button id="nis2-update-btn" style="border:0;border-radius:8px;background:#F0B429;color:#1a1a1a;font-weight:700;padding:8px 14px;cursor:pointer">Aggiorna</button>' +
|
||||
'<button id="nis2-update-x" aria-label="Chiudi" style="border:0;background:transparent;color:#cfe0f1;font-size:18px;cursor:pointer;line-height:1">×</button>';
|
||||
document.body.appendChild(b);
|
||||
document.getElementById('nis2-update-btn').addEventListener('click', () => location.reload());
|
||||
document.getElementById('nis2-update-x').addEventListener('click', () => b.remove());
|
||||
}
|
||||
|
||||
function _setupMobileToggle() {
|
||||
// Crea pulsante toggle se non esiste
|
||||
if (!document.querySelector('.sidebar-toggle')) {
|
||||
|
||||
+2
-2
@@ -175,8 +175,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → kb.js -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -515,7 +515,7 @@ body { background: var(--bg-main); }
|
||||
|
||||
<div id="toast"></div>
|
||||
|
||||
<script src="js/api.js?v=20260729"></script>
|
||||
<script src="js/api.js?v=20260729b"></script>
|
||||
<script>
|
||||
// ══════════════════════════════════════════════════════
|
||||
// CONFIG
|
||||
|
||||
+2
-2
@@ -94,8 +94,8 @@
|
||||
</script>
|
||||
|
||||
<!-- Stessa logica della login attuale: ZERO modifiche backend -->
|
||||
<script src="js/api.js?v=20260729"></script>
|
||||
<script src="js/common.js?v=20260624g"></script>
|
||||
<script src="js/api.js?v=20260729b"></script>
|
||||
<script src="js/common.js?v=20260729b"></script>
|
||||
<script>
|
||||
if (api.isAuthenticated()) { window.location.href = 'dashboard.html'; }
|
||||
|
||||
|
||||
@@ -147,8 +147,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -175,8 +175,8 @@
|
||||
</div>
|
||||
|
||||
<!-- Scripts V3 (ordine ESATTO come dashboard.html) -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -426,6 +426,6 @@ curl https://nis2.agile.software/api/services/status</pre>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<script src="js/common.js?v=20260624g"></script>
|
||||
<script src="js/common.js?v=20260729b"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -137,8 +137,8 @@
|
||||
</main>
|
||||
|
||||
<!-- Scripts V3 (ordine ESATTO come dashboard.html) -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -494,8 +494,8 @@
|
||||
</script>
|
||||
|
||||
<!-- Stessa logica della onboarding.html: ZERO modifiche backend -->
|
||||
<script src="js/api.js?v=20260729"></script>
|
||||
<script src="js/common.js?v=20260624g"></script>
|
||||
<script src="js/api.js?v=20260729b"></script>
|
||||
<script src="js/common.js?v=20260729b"></script>
|
||||
<script>
|
||||
// ── Auth check ──────────────────────────────────────────────────
|
||||
if (!checkAuth()) throw new Error('Not authenticated');
|
||||
|
||||
@@ -151,8 +151,8 @@
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → organigramma.js.
|
||||
organigramma.js si auto-inizializza su DOMContentLoaded (checkAuth/loadSidebar/I18n/Help). -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -340,8 +340,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
+2
-2
@@ -141,8 +141,8 @@
|
||||
</main>
|
||||
|
||||
<!-- Scripts V3. raci.js si auto-inizializza su DOMContentLoaded (checkAuth/loadSidebar/I18n/Help). -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -268,8 +268,8 @@
|
||||
</script>
|
||||
|
||||
<!-- Stessa logica della register.html: ZERO modifiche backend -->
|
||||
<script src="js/api.js?v=20260729"></script>
|
||||
<script src="js/common.js?v=20260624g"></script>
|
||||
<script src="js/api.js?v=20260729b"></script>
|
||||
<script src="js/common.js?v=20260729b"></script>
|
||||
<script>
|
||||
if (api.isAuthenticated()) { window.location.href = 'dashboard.html'; }
|
||||
|
||||
|
||||
+2
-2
@@ -232,8 +232,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -157,8 +157,8 @@
|
||||
</div>
|
||||
|
||||
<!-- Scripts V3 (ordine ESATTO come dashboard.html) -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
+2
-2
@@ -499,8 +499,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -735,8 +735,8 @@
|
||||
<!-- Scripts V3: api.js (client REST, prima) → common.js (helper+FAB reali) →
|
||||
Lucide self-host → topnav-v3.js (chrome, ridefinisce loadSidebar) →
|
||||
i18n → help → init pagina (inline, invariato). -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -215,8 +215,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -210,8 +210,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -542,8 +542,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -190,8 +190,8 @@
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali+showModal/showNotification) →
|
||||
Lucide self-host → topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help.
|
||||
La logica della pagina e' inline (nessun training.js): preservata invariata. -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
{"version": "1.25.11", "build": "2026-07-29-v1.25.11", "date": "2026-07-29", "changelog": "Cruscotto Studio: ora e' previsto anche il ruolo CONSULENTE. Un utente con ruolo 'consulente' vede nel selettore azienda e nel Cruscotto Studio SOLO le aziende del proprio studio (i clienti collegati al proprio studio) piu' quelle di cui e' membro diretto, non l'intero elenco (che resta agli amministratori)."}
|
||||
{"version": "1.25.12", "build": "2026-07-29-v1.25.12", "date": "2026-07-29", "changelog": "Sessione e aggiornamenti piu' fluidi. (1) Il collegamento ora si RINNOVA DA SOLO in background poco prima di scadere (e al ritorno sulla scheda dopo una pausa il rinnovo e' immediato): non serve piu' rifare il login dopo un po', e le pagine non restano piu' 'appese'. (2) Quando esce una NUOVA VERSIONE dell'app, compare in basso un avviso 'E' disponibile una nuova versione - Aggiorna': un clic ricarica con la versione aggiornata, senza dover svuotare la cache o ricaricare a mano."}
|
||||
|
||||
@@ -258,8 +258,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
@@ -143,8 +143,8 @@
|
||||
|
||||
<!-- Scripts V3: api.js → common.js (helper+FAB reali) → Lucide self-host →
|
||||
topnav-v3.js (chrome, ridefinisce loadSidebar) → i18n → help → init pagina. -->
|
||||
<script src="/js/api.js?v=20260729"></script>
|
||||
<script src="/js/common.js?v=20260627t"></script>
|
||||
<script src="/js/api.js?v=20260729b"></script>
|
||||
<script src="/js/common.js?v=20260729b"></script>
|
||||
<script src="/vendor/lucide/lucide.min.js"></script>
|
||||
<script src="/js/topnav-v3.js?v=20260729"></script>
|
||||
<script src="/js/i18n.js?v=20260729"></script>
|
||||
|
||||
Reference in New Issue
Block a user