M2-T10: build records management UI (paginated lists + single-record CRUD)

- reusable src/records/ module: useUpdate/useDelete Poo+Location hooks
  (encodeURIComponent PK, prefix-based query invalidation), EditPooModal,
  EditLocationModal, ConfirmDeleteModal — exported for the map (T09) to reuse
- RecordsPage (/records): paginated poo + location tables (page size 100),
  edit + delete-with-confirm, refresh on success
- query keys ['poo']/['locations'] so map and list invalidations cross-cut
- typed client only; vitest tests
This commit is contained in:
2026-06-13 15:20:50 +02:00
parent 6cc6382515
commit ef7ea6b971
9 changed files with 1442 additions and 0 deletions
+10
View File
@@ -26,6 +26,7 @@ import { ProtectedRoute } from './auth/ProtectedRoute'
import { LoginPage } from './pages/LoginPage'
import { HomePage } from './pages/HomePage'
import { ConfigPage } from './pages/ConfigPage'
import { RecordsPage } from './pages/RecordsPage'
import { ChangePasswordPage } from './pages/ChangePasswordPage'
import apiClient from './api/client'
import { useQueryClient } from '@tanstack/react-query'
@@ -97,6 +98,14 @@ function AppLayout() {
</Link>
<Group gap="xs">
{/* Records nav link */}
<Link
to="/records"
style={{ textDecoration: 'none', fontSize: '0.9rem' }}
title="Records"
>
Records
</Link>
{/* Gear icon nav slot — links to config page (§5#10) */}
<Link
to="/config"
@@ -152,6 +161,7 @@ export default function App() {
>
<Route index element={<HomePage />} />
<Route path="/config" element={<ConfigPage />} />
<Route path="/records" element={<RecordsPage />} />
</Route>
</Routes>
</SessionProvider>