diff --git a/public/admin/users.html b/public/admin/users.html
index 7d02f53..ee9a153 100644
--- a/public/admin/users.html
+++ b/public/admin/users.html
@@ -231,6 +231,7 @@
Ultimo Login |
Attivo |
Data Creazione |
+ Azioni |
`;
@@ -270,6 +271,14 @@
${formatDate(user.created_at)} |
+
+ ${role !== 'super_admin' && isActive
+ ? ``
+ : '-'}
+ |
`;
});
@@ -333,6 +342,27 @@
loadUsers(currentPage);
}
}
+
+ // ── Impersonate (Fase 4 / G11 — UI) ──
+ async function impersonateUser(userId, email) {
+ if (!confirm('Entrare come ' + email + ' per 1 ora?\n\nSarai loggato come quell\'utente. Tornerai alla tua sessione facendo logout.')) return;
+ try {
+ const res = await api.post('/auth/impersonate', { user_id: userId });
+ if (res.success && res.data && res.data.access_token) {
+ // Salva sessione originale per "Exit impersonate"
+ sessionStorage.setItem('nis2_impersonate_origin_token', api.token);
+ sessionStorage.setItem('nis2_impersonate_origin_refresh', api.refreshToken || '');
+ sessionStorage.setItem('nis2_impersonate_target_email', email);
+ // Sostituisce token con quello impersonate (no refresh per default)
+ api.setTokens(res.data.access_token, '');
+ window.location.href = '/dashboard.html';
+ } else {
+ showNotification(res.message || 'Impersonate fallito.', 'error');
+ }
+ } catch (e) {
+ showNotification('Errore di connessione.', 'error');
+ }
+ }