From ea3b72db5c99c9b83435d7c91f3b56dcaba00d3c Mon Sep 17 00:00:00 2001 From: jramos Date: Wed, 11 Mar 2026 11:47:03 -0600 Subject: [PATCH] Add hamburger nav menu with 4-page navigation structure - NavDrawer component: slide-in left drawer with backdrop, matches dark theme - Nav items: Home, Reporting, Knowledge Base, Exports with color-coded icons - Active page highlighted with colored background + indicator dot - Placeholder pages for Reporting (amber), Knowledge Base (green), Exports (purple) - Stats bar and three-column layout conditionally render on Home page only - currentPage state drives all page switching Co-Authored-By: Claude Sonnet 4.6 --- frontend/src/App.js | 52 +++++-- frontend/src/components/NavDrawer.js | 127 ++++++++++++++++++ frontend/src/components/pages/ExportsPage.js | 25 ++++ .../src/components/pages/KnowledgeBasePage.js | 25 ++++ .../src/components/pages/ReportingPage.js | 25 ++++ 5 files changed, 242 insertions(+), 12 deletions(-) create mode 100644 frontend/src/components/NavDrawer.js create mode 100644 frontend/src/components/pages/ExportsPage.js create mode 100644 frontend/src/components/pages/KnowledgeBasePage.js create mode 100644 frontend/src/components/pages/ReportingPage.js diff --git a/frontend/src/App.js b/frontend/src/App.js index cb41c0e..3779751 100644 --- a/frontend/src/App.js +++ b/frontend/src/App.js @@ -1,5 +1,5 @@ import React, { useState, useEffect } from 'react'; -import { Search, FileText, AlertCircle, Download, Upload, Eye, Filter, CheckCircle, XCircle, Loader, Trash2, Plus, RefreshCw, Edit2, ChevronDown, Shield, Activity } from 'lucide-react'; +import { Search, FileText, AlertCircle, Download, Upload, Eye, Filter, CheckCircle, XCircle, Loader, Trash2, Plus, RefreshCw, Edit2, ChevronDown, Shield, Activity, Menu } from 'lucide-react'; import { useAuth } from './contexts/AuthContext'; import LoginForm from './components/LoginForm'; import UserMenu from './components/UserMenu'; @@ -8,6 +8,10 @@ import AuditLog from './components/AuditLog'; import NvdSyncModal from './components/NvdSyncModal'; import KnowledgeBaseModal from './components/KnowledgeBaseModal'; import KnowledgeBaseViewer from './components/KnowledgeBaseViewer'; +import NavDrawer from './components/NavDrawer'; +import ReportingPage from './components/pages/ReportingPage'; +import KnowledgeBasePage from './components/pages/KnowledgeBasePage'; +import ExportsPage from './components/pages/ExportsPage'; import './App.css'; const API_BASE = process.env.REACT_APP_API_BASE || 'http://localhost:3001/api'; @@ -171,6 +175,8 @@ export default function App() { const [cveDocuments, setCveDocuments] = useState({}); const [quickCheckCVE, setQuickCheckCVE] = useState(''); const [quickCheckResult, setQuickCheckResult] = useState(null); + const [currentPage, setCurrentPage] = useState('home'); + const [navOpen, setNavOpen] = useState(false); const [showAddCVE, setShowAddCVE] = useState(false); const [showUserManagement, setShowUserManagement] = useState(false); const [showAuditLog, setShowAuditLog] = useState(false); @@ -950,6 +956,12 @@ export default function App() { return (
+ setNavOpen(false)} + currentPage={currentPage} + onNavigate={setCurrentPage} + /> {/* Scanning line effect */}
@@ -957,11 +969,22 @@ export default function App() { {/* Header */}
-
-

- STEAM Security Dashboard -

-

NTS Threat Intelligence and Metric Aggregation

+
+ +
+

+ STEAM Security Dashboard +

+

NTS Threat Intelligence and Metric Aggregation

+
{canWrite() && ( @@ -986,8 +1009,8 @@ export default function App() {
- {/* Stats Bar - Modern refined styling */} -
+ {/* Stats Bar - only shown on Home page */} + {currentPage === 'home' &&
Total CVEs
@@ -1008,9 +1031,14 @@ export default function App() {
Critical
{cves.filter(c => c.severity === 'Critical').length}
-
+
}
+ {/* Page content */} + {currentPage === 'reporting' && } + {currentPage === 'knowledge-base' && } + {currentPage === 'exports' && } + {/* User Management Modal */} {showUserManagement && ( setShowUserManagement(false)} /> @@ -1624,8 +1652,8 @@ export default function App() {
)} - {/* Three Column Layout */} -
+ {/* Three Column Layout - Home page only */} + {currentPage === 'home' &&
{/* LEFT PANEL - Wiki/Knowledge Base */}
@@ -2472,7 +2500,7 @@ export default function App() {
{/* End Right Panel */} -
+
} {/* End Three Column Layout */}
diff --git a/frontend/src/components/NavDrawer.js b/frontend/src/components/NavDrawer.js new file mode 100644 index 0000000..a22c0f9 --- /dev/null +++ b/frontend/src/components/NavDrawer.js @@ -0,0 +1,127 @@ +import React from 'react'; +import { X, Home, BarChart2, BookOpen, Download } from 'lucide-react'; + +const NAV_ITEMS = [ + { id: 'home', label: 'Home', icon: Home, color: '#0EA5E9', description: 'Main dashboard' }, + { id: 'reporting', label: 'Reporting', icon: BarChart2,color: '#F59E0B', description: 'Reports & analytics' }, + { id: 'knowledge-base', label: 'Knowledge Base', icon: BookOpen, color: '#10B981', description: 'Articles & documentation' }, + { id: 'exports', label: 'Exports', icon: Download, color: '#8B5CF6', description: 'Export data & reports' }, +]; + +export default function NavDrawer({ isOpen, onClose, currentPage, onNavigate }) { + if (!isOpen) return null; + + return ( + <> + {/* Backdrop */} +
+ + {/* Drawer */} +
+ {/* Drawer header */} +
+
+
+ STEAM +
+
+ Security Dashboard +
+
+ +
+ + {/* Nav items */} + + + {/* Footer */} +
+
+ NTS Threat Intelligence +
+
+
+ + ); +} diff --git a/frontend/src/components/pages/ExportsPage.js b/frontend/src/components/pages/ExportsPage.js new file mode 100644 index 0000000..afbf95b --- /dev/null +++ b/frontend/src/components/pages/ExportsPage.js @@ -0,0 +1,25 @@ +import React from 'react'; +import { Download } from 'lucide-react'; + +export default function ExportsPage() { + return ( +
+
+
+ +
+

+ Exports +

+

+ Under construction — coming soon +

+
+
+ ); +} diff --git a/frontend/src/components/pages/KnowledgeBasePage.js b/frontend/src/components/pages/KnowledgeBasePage.js new file mode 100644 index 0000000..bae66ab --- /dev/null +++ b/frontend/src/components/pages/KnowledgeBasePage.js @@ -0,0 +1,25 @@ +import React from 'react'; +import { BookOpen } from 'lucide-react'; + +export default function KnowledgeBasePage() { + return ( +
+
+
+ +
+

+ Knowledge Base +

+

+ Under construction — coming soon +

+
+
+ ); +} diff --git a/frontend/src/components/pages/ReportingPage.js b/frontend/src/components/pages/ReportingPage.js new file mode 100644 index 0000000..831c472 --- /dev/null +++ b/frontend/src/components/pages/ReportingPage.js @@ -0,0 +1,25 @@ +import React from 'react'; +import { BarChart2 } from 'lucide-react'; + +export default function ReportingPage() { + return ( +
+
+
+ +
+

+ Reporting +

+

+ Under construction — coming soon +

+
+
+ ); +}