[DOCS] Help online + i18n IT/EN + product_knowledge AI per Fasi 2-5 (v1.6.1)

Aggiornamento documentazione obbligatorio post-feature (CLAUDE.md agent workflow):

- public/js/help.js: estesa sezione 'settings' con 5 nuovi heading:
  Sessioni Attive (Fase 2), Preferenze utente (Fase 4), Password dimenticata
  (Fase 3), Cambio organizzazione multi-tenant (Fase 3), Branding white-label
  (Fase 5, solo super_admin/consulente). Riscrittura Sicurezza Account con
  dettaglio sessions UI.

- public/js/i18n.js: aggiunte 60+ chiavi IT/EN per sessions.*, pwreset.*,
  tenant.*, preferences.*, impersonate.*, branding.*, settings.* (preferences
  + branding).

- AgileHub product_knowledge: PUT /ai/products/NIS2/card (id=914) con
  description + 11 scope tag + target_buyer + free_markdown completo
  (target, moduli, auth/security Fasi 1-5, servizi B2B, AI/RAG, stack,
  multi-tenancy, GDPR). Sostituisce card vuota precedente.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
DevEnv nis2-agile 2026-05-29 13:50:06 +02:00
parent a7bd37a797
commit 4a85abeb3b
3 changed files with 110 additions and 3 deletions

View File

@ -488,10 +488,50 @@ const HelpSystem = (function () {
{ {
heading: 'Sicurezza Account', heading: 'Sicurezza Account',
items: [ items: [
'Modifica la password del tuo account in qualsiasi momento.', 'Modifica la password del tuo account in qualsiasi momento dal pulsante "Cambia password".',
'La piattaforma applica un <strong>timeout di sessione automatico</strong> dopo 30 minuti di inattivita\'. Un avviso con countdown appare 5 minuti prima del logout per permetterti di rimanere connesso.', 'La piattaforma applica un <strong>timeout di sessione automatico</strong> dopo 30 minuti di inattivita\'. Un avviso con countdown appare 5 minuti prima del logout per permetterti di rimanere connesso.',
'Il logout automatico protegge le informazioni sensibili in caso di postazione incustodita.', 'Il logout automatico protegge le informazioni sensibili in caso di postazione incustodita.',
'Configura le impostazioni di notifica per scadenze e alert.' 'La sezione <strong>Sessioni Attive</strong> elenca tutti i dispositivi attualmente loggati al tuo account (browser, sistema operativo, indirizzo IP, ultimo accesso). Puoi disconnettere un singolo dispositivo con "Disconnetti" oppure tutti tranne questo con "Disconnetti gli altri" — utile se sospetti accessi non autorizzati.'
]
},
{
heading: 'Preferenze utente',
items: [
'Nel tab <strong>Preferenze</strong> puoi personalizzare la tua esperienza individuale (non condivisa con altri membri dell\'organizzazione).',
'<strong>Lingua</strong>: italiano, inglese, francese o tedesco — applicata a tutti i menu e messaggi.',
'<strong>Tema</strong>: chiaro, scuro o automatico (segue le impostazioni del sistema operativo).',
'<strong>Timezone</strong>: usata per visualizzare date e ore. Default Europe/Rome (CET/CEST). Cambia se lavori da un altro fuso.',
'<strong>Notifiche email</strong>: ricevi via email gli avvisi per incidenti, scadenze e training.',
'<strong>Notifiche in-app</strong>: mostra badge contatori nella sidebar per nuove notifiche.'
]
},
{
heading: 'Password dimenticata',
items: [
'Dalla pagina di login clicca su "Password dimenticata?" per richiedere un link di reset.',
'Inserisci la tua email: se registrata riceverai un messaggio con un link valido <strong>30 minuti</strong>.',
'Il link è single-use: una volta cliccato e impostata la nuova password, non potra\' essere riusato.',
'Per motivi di sicurezza, la pagina mostra sempre lo stesso messaggio sia che l\'email sia registrata sia che non lo sia (anti-enumeration).',
'Dopo il reset, tutte le sessioni attive precedenti vengono disconnesse automaticamente.'
]
},
{
heading: 'Cambio organizzazione (multi-tenant)',
items: [
'Se sei membro di piu\' organizzazioni (es. consulente), nella sidebar appare un <strong>dropdown azienda</strong> in alto.',
'Click sul dropdown per vedere tutte le organizzazioni a cui hai accesso e quale è quella attualmente attiva (✓).',
'Selezionando un\'altra organizzazione il sistema emette un nuovo token con il contesto aggiornato e ricarica la pagina.',
'Il cambio è registrato nell\'audit log come <em>context_switch</em>.'
]
},
{
heading: 'Branding white-label (solo consulenti / super admin)',
items: [
'Il tab <strong>Branding</strong> consente a uno studio di consulenza di personalizzare l\'interfaccia che vedranno i suoi clienti.',
'<strong>Nome prodotto custom</strong>: sostituisce "NIS2 Agile" con il branding dello studio (es. "Studio Rossi NIS2 Suite").',
'<strong>URL Logo</strong>: link assoluto al logo dello studio (es. https://www.tuosito.it/logo.svg). Verra\' mostrato nella sidebar e nelle pagine di login.',
'<strong>Colori</strong>: il primario sostituisce il blu di default (intestazioni, pulsanti principali); il secondario sostituisce il ciano (badge, accenti).',
'Le modifiche vengono applicate automaticamente a tutti gli utenti del firm al ricaricamento della pagina.'
] ]
} }
], ],

View File

@ -175,6 +175,73 @@ const I18n = (function () {
'session.stay': { it: 'Rimani connesso', en: 'Stay connected' }, 'session.stay': { it: 'Rimani connesso', en: 'Stay connected' },
'session.logout_now': { it: 'Disconnetti', en: 'Log out' }, 'session.logout_now': { it: 'Disconnetti', en: 'Log out' },
// ── Multi-device Sessions (Fase 2) ──────────────
'sessions.title': { it: 'Sessioni Attive', en: 'Active Sessions' },
'sessions.desc': { it: 'Dispositivi attualmente loggati al tuo account. Puoi disconnetterli singolarmente o tutti tranne questo.', en: 'Devices currently logged into your account. You can disconnect them individually or all but this one.' },
'sessions.current_device': { it: 'Questo dispositivo', en: 'This device' },
'sessions.revoke': { it: 'Disconnetti', en: 'Disconnect' },
'sessions.revoke_all': { it: 'Disconnetti gli altri', en: 'Disconnect others' },
'sessions.ip': { it: 'IP', en: 'IP' },
'sessions.last_activity': { it: 'Ultimo accesso', en: 'Last activity' },
'sessions.login': { it: 'Login', en: 'Login' },
'sessions.empty': { it: 'Nessuna sessione attiva.', en: 'No active sessions.' },
'sessions.confirm_revoke': { it: 'Disconnettere questo dispositivo?', en: 'Disconnect this device?' },
'sessions.confirm_revoke_all': { it: 'Disconnettere tutti gli altri dispositivi?', en: 'Disconnect all other devices?' },
// ── Password Reset (Fase 3) ─────────────────────
'pwreset.forgot_link': { it: 'Password dimenticata?', en: 'Forgot password?' },
'pwreset.forgot_title': { it: 'Reimposta la tua password', en: 'Reset your password' },
'pwreset.forgot_helper': { it: 'Inserisci l\'indirizzo email associato al tuo account. Ti invieremo un link valido 30 minuti.', en: 'Enter the email associated with your account. We will send you a link valid for 30 minutes.' },
'pwreset.send_link': { it: 'Invia link', en: 'Send link' },
'pwreset.set_new': { it: 'Imposta una nuova password', en: 'Set a new password' },
'pwreset.new_password': { it: 'Nuova password', en: 'New password' },
'pwreset.confirm': { it: 'Conferma password', en: 'Confirm password' },
'pwreset.submit': { it: 'Imposta password', en: 'Set password' },
'pwreset.back_login': { it: 'Torna al login', en: 'Back to login' },
'pwreset.strength_weak': { it: 'Debole', en: 'Weak' },
'pwreset.strength_medium': { it: 'Media', en: 'Medium' },
'pwreset.strength_good': { it: 'Buona', en: 'Good' },
'pwreset.strength_excellent':{ it: 'Ottima', en: 'Excellent' },
// ── Tenant switcher (Fase 3) ────────────────────
'tenant.select': { it: 'Seleziona azienda', en: 'Select company' },
'tenant.all': { it: '← Tutte le aziende', en: '← All companies' },
// ── Preferenze (Fase 4) ─────────────────────────
'preferences.title': { it: 'Preferenze utente', en: 'User preferences' },
'preferences.desc': { it: 'Personalizzazione interfaccia e notifiche.', en: 'Interface and notifications personalization.' },
'preferences.language': { it: 'Lingua', en: 'Language' },
'preferences.theme': { it: 'Tema', en: 'Theme' },
'preferences.theme_auto': { it: 'Auto (segue sistema)', en: 'Auto (follows system)' },
'preferences.theme_light': { it: 'Chiaro', en: 'Light' },
'preferences.theme_dark': { it: 'Scuro', en: 'Dark' },
'preferences.timezone': { it: 'Timezone', en: 'Timezone' },
'preferences.notif_email': { it: 'Ricevi notifiche via email (incidenti, deadline, training)', en: 'Receive email notifications (incidents, deadlines, training)' },
'preferences.notif_inapp': { it: 'Mostra notifiche in-app (badge sidebar)', en: 'Show in-app notifications (sidebar badges)' },
'preferences.save': { it: 'Salva preferenze', en: 'Save preferences' },
'preferences.saved': { it: '✓ Salvato', en: '✓ Saved' },
// ── Impersonate (Fase 4) ────────────────────────
'impersonate.btn': { it: 'Impersonate', en: 'Impersonate' },
'impersonate.tooltip': { it: 'Entra come questo utente per 1 ora', en: 'Enter as this user for 1 hour' },
'impersonate.confirm': { it: 'Entrare come {email} per 1 ora?', en: 'Enter as {email} for 1 hour?' },
'impersonate.banner': { it: 'Modalità Impersonate — stai usando l\'account di', en: 'Impersonate mode — you are using the account of' },
'impersonate.exit': { it: 'Esci impersonate', en: 'Exit impersonate' },
// ── Branding white-label (Fase 5) ───────────────
'branding.title': { it: 'Branding white-label', en: 'White-label branding' },
'branding.desc': { it: 'Personalizza colori, logo e nome prodotto per il tuo studio. Visibile a tutti i tuoi clienti loggati.', en: 'Customize colors, logo and product name for your firm. Visible to all your logged-in clients.' },
'branding.brand_name': { it: 'Nome prodotto custom (opzionale)', en: 'Custom product name (optional)' },
'branding.logo_url': { it: 'URL Logo (opzionale)', en: 'Logo URL (optional)' },
'branding.primary': { it: 'Colore primario', en: 'Primary color' },
'branding.secondary': { it: 'Colore secondario', en: 'Secondary color' },
'branding.save': { it: 'Salva branding', en: 'Save branding' },
'branding.saved': { it: '✓ Salvato — ricarica per vedere', en: '✓ Saved — reload to see' },
// ── Settings tabs (Fase 4-5) ────────────────────
'settings.preferences': { it: 'Preferenze', en: 'Preferences' },
'settings.branding': { it: 'Branding', en: 'Branding' },
// ── Tempo relativo ───────────────────────────── // ── Tempo relativo ─────────────────────────────
'time.now': { it: 'Adesso', en: 'Just now' }, 'time.now': { it: 'Adesso', en: 'Just now' },
'time.min_ago': { it: 'min fa', en: 'min ago' }, 'time.min_ago': { it: 'min fa', en: 'min ago' },

View File

@ -1 +1 @@
{"version":"1.6.0","build":"20260529f","date":"2026-05-29T14:30:00+02:00","changelog":"UI Fasi 4+5: pulsante Impersonate in admin/users.html con banner persistente arancione, tab Preferenze in settings (lingua/tema/timezone/notifiche), tab Branding white-label per super_admin/consulenti (colori + logo + brand name). Vedi docs/GAP_TRPG_NIS2_ALIGNMENT.md"} {"version":"1.6.1","build":"20260529g","date":"2026-05-29T14:55:00+02:00","changelog":"Doc: aggiornati help.js (sezione Impostazioni con Sessioni/Preferenze/Branding/Reset/Tenant), i18n.js (chiavi IT/EN per Fasi 2-5), product knowledge AI AgileHub (card NIS2 id=914)"}