Backend: - LOW-002: Add Query validation with max page size limits (100) - LOW-003: Replace magic strings with TaskStatus.is_done flag - LOW-004: Add 'creation' trigger type validation - Add action_executor.py with UpdateFieldAction and AutoAssignAction Frontend: - LOW-005: Replace TypeScript 'any' with 'unknown' + type guards - LOW-006: Add ConfirmModal component with A11Y support - LOW-007: Add ToastContext for user feedback notifications - LOW-009: Add Skeleton components (17 loading states replaced) - LOW-010: Setup Vitest with 21 tests for ConfirmModal and Skeleton Components updated: - App.tsx, ProtectedRoute.tsx, Spaces.tsx, Projects.tsx, Tasks.tsx - ProjectSettings.tsx, AuditPage.tsx, WorkloadPage.tsx, ProjectHealthPage.tsx - Comments.tsx, AttachmentList.tsx, TriggerList.tsx, TaskDetailModal.tsx - NotificationBell.tsx, BlockerDialog.tsx, CalendarView.tsx, WorkloadUserDetail.tsx 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
119 lines
2.8 KiB
TypeScript
119 lines
2.8 KiB
TypeScript
import { Routes, Route, Navigate } from 'react-router-dom'
|
|
import { useAuth } from './contexts/AuthContext'
|
|
import { Skeleton } from './components/Skeleton'
|
|
import Login from './pages/Login'
|
|
import Dashboard from './pages/Dashboard'
|
|
import Spaces from './pages/Spaces'
|
|
import Projects from './pages/Projects'
|
|
import Tasks from './pages/Tasks'
|
|
import ProjectSettings from './pages/ProjectSettings'
|
|
import AuditPage from './pages/AuditPage'
|
|
import WorkloadPage from './pages/WorkloadPage'
|
|
import ProjectHealthPage from './pages/ProjectHealthPage'
|
|
import ProtectedRoute from './components/ProtectedRoute'
|
|
import Layout from './components/Layout'
|
|
|
|
function App() {
|
|
const { isAuthenticated, loading } = useAuth()
|
|
|
|
if (loading) {
|
|
return (
|
|
<div className="container" style={{ padding: '24px', maxWidth: '1200px', margin: '0 auto' }}>
|
|
<Skeleton variant="rect" width="100%" height={60} style={{ marginBottom: '24px' }} />
|
|
<Skeleton variant="rect" width="100%" height={400} />
|
|
</div>
|
|
)
|
|
}
|
|
|
|
return (
|
|
<Routes>
|
|
<Route
|
|
path="/login"
|
|
element={isAuthenticated ? <Navigate to="/" /> : <Login />}
|
|
/>
|
|
<Route
|
|
path="/"
|
|
element={
|
|
<ProtectedRoute>
|
|
<Layout>
|
|
<Dashboard />
|
|
</Layout>
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/spaces"
|
|
element={
|
|
<ProtectedRoute>
|
|
<Layout>
|
|
<Spaces />
|
|
</Layout>
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/spaces/:spaceId"
|
|
element={
|
|
<ProtectedRoute>
|
|
<Layout>
|
|
<Projects />
|
|
</Layout>
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/projects/:projectId"
|
|
element={
|
|
<ProtectedRoute>
|
|
<Layout>
|
|
<Tasks />
|
|
</Layout>
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/projects/:projectId/settings"
|
|
element={
|
|
<ProtectedRoute>
|
|
<Layout>
|
|
<ProjectSettings />
|
|
</Layout>
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/audit"
|
|
element={
|
|
<ProtectedRoute>
|
|
<Layout>
|
|
<AuditPage />
|
|
</Layout>
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/workload"
|
|
element={
|
|
<ProtectedRoute>
|
|
<Layout>
|
|
<WorkloadPage />
|
|
</Layout>
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
<Route
|
|
path="/project-health"
|
|
element={
|
|
<ProtectedRoute>
|
|
<Layout>
|
|
<ProjectHealthPage />
|
|
</Layout>
|
|
</ProtectedRoute>
|
|
}
|
|
/>
|
|
</Routes>
|
|
)
|
|
}
|
|
|
|
export default App
|