import { useEffect, useState } from 'react'; import { InventoryPage } from './pages/InventoryPage'; import { LoginPage } from './pages/LoginPage'; import { getToken, clearSession } from './lib/session'; import './app-shell.css'; type TabKey = 'overview' | 'inventory' | 'discovery' | 'topology' | 'options'; const tabs = [ { key: 'overview', label: 'Overview', description: 'Stato generale del workspace NetMapper.' }, { key: 'inventory', label: 'Inventory', description: 'Tree fisico/logico e navigazione tra oggetti.' }, { key: 'discovery', label: 'Discovery', description: 'Pipeline e job di raccolta dati.' }, { key: 'topology', label: 'Topology', description: 'Vista futura della mappa multilivello.' }, { key: 'options', label: 'Options', description: 'Utenti, impostazioni, servizi di sistema e sicurezza.' }, ] as const; function ShellCard({ title, children, tone = 'default' }: { title: string; children: React.ReactNode; tone?: 'default' | 'accent' | 'warning' }) { return

{title}

{children}
; } function OverviewTab() { return
; } function DiscoveryTab() { return
; } function TopologyTab() { return
; } function OptionsTab() { return
  • Utenti locali e ruoli applicativi.
  • Disattivazione account inattivi o non più autorizzati.
  • Storico accessi e audit trail amministrativo.
  • Parametri workspace e branding dell'istanza.
  • Configurazione discovery, inventory e policy future.
  • Feature flags per moduli sperimentali.
  • La sezione Servizi viene assorbita nel menu Options.
  • Qui confluiranno terminale remoto, job runner e integrazioni di sistema.
  • Ogni funzione sensibile dovrà essere protetta da permessi espliciti.
  • Login obbligatorio per tutte le viste non pubbliche.
  • MFA per admin e per funzioni ad alto impatto.
  • Controlli server-side su ogni richiesta, deny-by-default e audit centralizzato.
; } function AppShell() { const [activeTab, setActiveTab] = useState('inventory'); const currentTab = tabs.find((t) => t.key === activeTab)!; return

{currentTab.label}

{currentTab.description}

Book of truthAuth active
; } export default function App() { const [loggedIn, setLoggedIn] = useState(false); useEffect(() => { const t = getToken(); if (t) setLoggedIn(true); }, []); const handleLogin = () => setLoggedIn(true); const handleLogout = () => { clearSession(); setLoggedIn(false); }; if (!loggedIn) return ; return <>; }