Files
claudetools/projects/msp-tools/guru-rmm/dashboard/src/App.tsx
azcomputerguru c332f4f48d feat(dashboard): UI refinements - density, flat agents table, history log
- Reduce layout density ~20% (tighter padding, margins, fonts)
- Flatten Agents table view with Client/Site columns (no grouping)
- Add version info to sidebar footer (UI v0.2.0, API v0.1.0)
- Replace Commands nav with sidebar History log
- Add /history page with full command list
- Add /history/:id detail view with output display
- Apply Mission Control styling to all new components

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-21 08:12:31 -07:00

162 lines
3.5 KiB
TypeScript

import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom";
import { QueryClient, QueryClientProvider } from "@tanstack/react-query";
import { AuthProvider, useAuth } from "./hooks/useAuth";
import { Layout } from "./components/Layout";
import { Login } from "./pages/Login";
import { Register } from "./pages/Register";
import { Dashboard } from "./pages/Dashboard";
import { Clients } from "./pages/Clients";
import { Sites } from "./pages/Sites";
import { Agents } from "./pages/Agents";
import { AgentDetail } from "./pages/AgentDetail";
import { History, HistoryDetail } from "./pages/History";
import { Settings } from "./pages/Settings";
import "./index.css";
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 1000 * 60,
retry: 1,
},
},
});
function ProtectedRoute({ children }: { children: React.ReactNode }) {
const { user, isLoading } = useAuth();
if (isLoading) {
return (
<div className="min-h-screen flex items-center justify-center">
<p className="text-[hsl(var(--muted-foreground))]">Loading...</p>
</div>
);
}
if (!user) {
return <Navigate to="/login" replace />;
}
return <Layout>{children}</Layout>;
}
function PublicRoute({ children }: { children: React.ReactNode }) {
const { user, isLoading } = useAuth();
if (isLoading) {
return (
<div className="min-h-screen flex items-center justify-center">
<p className="text-[hsl(var(--muted-foreground))]">Loading...</p>
</div>
);
}
if (user) {
return <Navigate to="/" replace />;
}
return <>{children}</>;
}
function AppRoutes() {
return (
<Routes>
<Route
path="/login"
element={
<PublicRoute>
<Login />
</PublicRoute>
}
/>
<Route
path="/register"
element={
<PublicRoute>
<Register />
</PublicRoute>
}
/>
<Route
path="/"
element={
<ProtectedRoute>
<Dashboard />
</ProtectedRoute>
}
/>
<Route
path="/clients"
element={
<ProtectedRoute>
<Clients />
</ProtectedRoute>
}
/>
<Route
path="/sites"
element={
<ProtectedRoute>
<Sites />
</ProtectedRoute>
}
/>
<Route
path="/agents"
element={
<ProtectedRoute>
<Agents />
</ProtectedRoute>
}
/>
<Route
path="/agents/:id"
element={
<ProtectedRoute>
<AgentDetail />
</ProtectedRoute>
}
/>
<Route
path="/history"
element={
<ProtectedRoute>
<History />
</ProtectedRoute>
}
/>
<Route
path="/history/:id"
element={
<ProtectedRoute>
<HistoryDetail />
</ProtectedRoute>
}
/>
<Route
path="/settings"
element={
<ProtectedRoute>
<Settings />
</ProtectedRoute>
}
/>
<Route path="*" element={<Navigate to="/" replace />} />
</Routes>
);
}
function App() {
return (
<QueryClientProvider client={queryClient}>
<BrowserRouter>
<AuthProvider>
<AppRoutes />
</AuthProvider>
</BrowserRouter>
</QueryClientProvider>
);
}
export default App;