tasks/frontend/src/App.tsx
jtricerolph 017f6dfdc1 Frontend: dynamic status pipeline, categories/projects, tag+assign+reallocate UI
- Board/List/Today views now render the admin-editable status pipeline
  instead of a hardcoded todo/doing/done enum (StatusesContext)
- Category filter chip-bar on Board and List views (ported the idea from
  reviewing the FD's own build, simplified to match our flat single-category
  model rather than his tree)
- New Projects list + detail views, project create/edit modal
- New Dispatch view for the 'reallocate' cap -- flat cross-user task list
  with an inline move action (deliberately not routed through the shared
  task drawer, since GET /api/tasks/:id only grants visibility to
  owner/assignee/tagged users, not dispatchers)
- Task drawer: dynamic status pills, category/project selects, tag
  picker (share/watch, no cap needed), assign field (owner + assign cap),
  reallocate field (reallocate cap) -- all fields disabled for non-owners
  since the backend's single PATCH endpoint is owner-gated
- Settings page: status pipeline + category management (settings cap)
- Fixed missing input[type="datetime-local"]/[type="time"] styling -- the
  Due/Remind fields were rendering with unstyled browser defaults
2026-09-17 08:52:08 +00:00

55 lines
2.4 KiB
TypeScript

import { BrowserRouter, Routes, Route, Navigate } from 'react-router-dom'
import AuthGate from './components/AuthGate'
import { UpdateBanner } from './components/UpdateBanner'
import IosInstallHint from './components/IosInstallHint'
import { useVersionCheck } from './hooks/useVersionCheck'
import Layout from './components/Layout'
import { ListsProvider } from './context/ListsContext'
import { StatusesProvider } from './context/StatusesContext'
import { CategoriesProvider } from './context/CategoriesContext'
import { ProjectsProvider } from './context/ProjectsContext'
import { TaskDrawerProvider } from './components/TaskDrawer'
import TodayView from './pages/TodayView'
import ListView from './pages/ListView'
import BoardView from './pages/BoardView'
import ProjectsView from './pages/ProjectsView'
import ProjectDetailView from './pages/ProjectDetailView'
import DispatchView from './pages/DispatchView'
import Settings from './pages/Settings'
export default function App() {
const updateAvailable = useVersionCheck('/tasks/health')
return (
<>
<BrowserRouter basename="/tasks">
<AuthGate>
<ListsProvider>
<StatusesProvider>
<CategoriesProvider>
<ProjectsProvider>
<TaskDrawerProvider>
<Layout>
<Routes>
<Route path="/" element={<Navigate to="/today" replace />} />
<Route path="/today" element={<TodayView />} />
<Route path="/board" element={<BoardView />} />
<Route path="/list/:id" element={<ListView />} />
<Route path="/projects" element={<ProjectsView />} />
<Route path="/project/:id" element={<ProjectDetailView />} />
<Route path="/dispatch" element={<DispatchView />} />
<Route path="/settings" element={<Settings />} />
<Route path="*" element={<Navigate to="/today" replace />} />
</Routes>
</Layout>
</TaskDrawerProvider>
</ProjectsProvider>
</CategoriesProvider>
</StatusesProvider>
</ListsProvider>
</AuthGate>
</BrowserRouter>
<UpdateBanner visible={updateAvailable} />
<IosInstallHint />
</>
)
}