Remove WIP tab from frontend, keep roadmap only in repo
CI / basic-check (push) Has been cancelled

This commit is contained in:
Perplexity Bot
2026-08-04 20:19:19 +00:00
parent 12a6dffcb9
commit 998c5246dd
2 changed files with 46 additions and 32 deletions
+39
View File
@@ -31,3 +31,42 @@ La roadmap e il backlog di sviluppo sono centralizzati su Gitea:
- MFA per admin e azioni critiche. - MFA per admin e azioni critiche.
- Terminale remoto protetto (stile Termix). - Terminale remoto protetto (stile Termix).
- Audit comandi e approvazione esplicita. - Audit comandi e approvazione esplicita.
## WIP interni
Questa sezione è riservata ai WIP interni e al backlog tecnico.
Non deve essere esposta nel frontend dell'app.
### Auth foundation
- Sessioni sicure, logout reale, protezione delle rotte.
- Bootstrap identità utente all'avvio.
- Ruoli base (admin, editor, viewer).
- Policy per risorse sensibili (inventory, settings, utenti).
### Inventory hardening
- Validazione input e output su API.
- Audit log per modifiche a nodi e relazioni.
- Permessi per creazione/modifica/cancellazione.
### Discovery pipeline
- SNMP collector — WIP.
- LLDP ingestion — WIP.
- Port mapping inference — WIP.
- Correlazione automatica con relazioni inventory.
### Topology multilivello
- Vista fisica dispositivi.
- Vista logica host / VM / container / app.
- Layer networking e dipendenze.
- Drag & drop, focus node, highlight vicini.
### Remote access hardening
- MFA per admin e azioni critiche.
- Terminale remoto protetto (stile Termix).
- Audit comandi e approvazione esplicita.
- Tracciamento sessioni e log comandi.
+7 -32
View File
@@ -2,7 +2,7 @@ import { useState } from 'react';
import { InventoryPage } from './pages/InventoryPage'; import { InventoryPage } from './pages/InventoryPage';
import './app-shell.css'; import './app-shell.css';
type TabKey = 'overview' | 'inventory' | 'discovery' | 'topology' | 'options' | 'wip'; type TabKey = 'overview' | 'inventory' | 'discovery' | 'topology' | 'options';
const tabs: { key: TabKey; label: string; description: string }[] = [ const tabs: { key: TabKey; label: string; description: string }[] = [
{ key: 'overview', label: 'Overview', description: 'Stato generale del workspace NetMapper.' }, { key: 'overview', label: 'Overview', description: 'Stato generale del workspace NetMapper.' },
@@ -10,7 +10,6 @@ const tabs: { key: TabKey; label: string; description: string }[] = [
{ key: 'discovery', label: 'Discovery', description: 'Pipeline e job di raccolta dati.' }, { key: 'discovery', label: 'Discovery', description: 'Pipeline e job di raccolta dati.' },
{ key: 'topology', label: 'Topology', description: 'Vista futura della mappa multilivello.' }, { key: 'topology', label: 'Topology', description: 'Vista futura della mappa multilivello.' },
{ key: 'options', label: 'Options', description: 'Utenti, impostazioni, servizi di sistema e sicurezza.' }, { key: 'options', label: 'Options', description: 'Utenti, impostazioni, servizi di sistema e sicurezza.' },
{ key: 'wip', label: 'WIP', description: 'Roadmap e link a Gitea per lo sviluppo.' },
]; ];
function ShellCard({ title, children, tone = 'default' }: { title: string; children: React.ReactNode; tone?: 'default' | 'accent' | 'warning' }) { function ShellCard({ title, children, tone = 'default' }: { title: string; children: React.ReactNode; tone?: 'default' | 'accent' | 'warning' }) {
@@ -62,11 +61,11 @@ function DiscoveryTab() {
<li>Correlazione con relazioni inventory.</li> <li>Correlazione con relazioni inventory.</li>
</ul> </ul>
</ShellCard> </ShellCard>
<ShellCard title="Job queue / WIP"> <ShellCard title="Job queue">
<ul className="shell-list"> <ul className="shell-list">
<li>SNMP collector — WIP.</li> <li>SNMP collector.</li>
<li>LLDP ingestion — WIP.</li> <li>LLDP ingestion.</li>
<li>Port mapping inference — WIP.</li> <li>Port mapping inference.</li>
</ul> </ul>
</ShellCard> </ShellCard>
</div> </div>
@@ -160,27 +159,6 @@ function OptionsTab() {
); );
} }
function WipTab() {
return (
<div className="shell-grid two-columns">
<ShellCard title="Roadmap" tone="accent">
<ul className="shell-list">
<li>La roadmap è centralizzata su Gitea: issues, milestone e board.</li>
<li>I WIP visibili sono rimossi dal frontend per evitare rumore.</li>
<li>Le card di Overview riportano solo milestone attive, non backlog.</li>
</ul>
</ShellCard>
<ShellCard title="Gitea link">
<ul className="shell-list">
<li>Issues aperte, board e roadmap del progetto NetMapper.</li>
<li>Link placeholder: <code>https://git.lelekaos.com/admin/NetMapper2026/issues</code></li>
<li>Da integrare in futuro con widget o embed della board.</li>
</ul>
</ShellCard>
</div>
);
}
function App() { function App() {
const [activeTab, setActiveTab] = useState<TabKey>('inventory'); const [activeTab, setActiveTab] = useState<TabKey>('inventory');
const currentTab = tabs.find((tab) => tab.key === activeTab)!; const currentTab = tabs.find((tab) => tab.key === activeTab)!;
@@ -204,7 +182,7 @@ function App() {
onClick={() => setActiveTab(tab.key)} onClick={() => setActiveTab(tab.key)}
> >
<span>{tab.label}</span> <span>{tab.label}</span>
<small>{tab.label === 'WIP' ? 'Roadmap e link a Gitea per lo sviluppo.' : tab.description}</small> <small>{tab.description}</small>
</button> </button>
))} ))}
</nav> </nav>
@@ -220,7 +198,7 @@ function App() {
<header className="app-header"> <header className="app-header">
<div> <div>
<h2>{currentTab.label}</h2> <h2>{currentTab.label}</h2>
<p>{currentTab.label === 'WIP' ? 'Roadmap e link a Gitea per lo sviluppo.' : currentTab.description}</p> <p>{currentTab.description}</p>
</div> </div>
<div className="app-header-actions"> <div className="app-header-actions">
<span className="shell-pill">Book of truth</span> <span className="shell-pill">Book of truth</span>
@@ -243,9 +221,6 @@ function App() {
<section style={{ display: activeTab === 'options' ? 'block' : 'none' }}> <section style={{ display: activeTab === 'options' ? 'block' : 'none' }}>
<OptionsTab /> <OptionsTab />
</section> </section>
<section style={{ display: activeTab === 'wip' ? 'block' : 'none' }}>
<WipTab />
</section>
</main> </main>
</div> </div>
); );