b8f70212a1
Wide (>=1024px): right-hand pane beside the table with a close control. Narrow: Base UI Drawer sliding from the right (lazy-loaded so its code splits out of the main chunk). Both preserve the table's query string on close. Remove the index SelectPrompt route (the table is the landing view) and delete the now-unused SelectPrompt. Make table rows keyboard-activatable (role=link, tabIndex, Enter). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
84 lines
3.0 KiB
TypeScript
84 lines
3.0 KiB
TypeScript
import { lazy, Suspense } from "react";
|
|
import { BrowserRouter, Navigate, Route, Routes } from "react-router-dom";
|
|
|
|
import { RequireAuth } from "./auth/require-auth";
|
|
import { LoginPage } from "./auth/login-page";
|
|
import { AppShell } from "./shell/app-shell";
|
|
import { ObjectsPage } from "./objects/objects-page";
|
|
import { ObjectDetail } from "./objects/object-detail";
|
|
import { SearchPage } from "./search/search-page";
|
|
import { SelectSearchPrompt } from "./search/select-search-prompt";
|
|
import { VocabulariesPage } from "./vocab/vocabularies-page";
|
|
import { VocabularyTerms } from "./vocab/vocabulary-terms";
|
|
import { SelectVocabularyPrompt } from "./vocab/select-vocabulary-prompt";
|
|
import { AuthoritiesPage } from "./authorities/authorities-page";
|
|
|
|
const ObjectNewPage = lazy(() =>
|
|
import("./objects/object-new-page").then((m) => ({ default: m.ObjectNewPage })),
|
|
);
|
|
|
|
const ObjectEditForm = lazy(() =>
|
|
import("./objects/object-edit-form").then((m) => ({ default: m.ObjectEditForm })),
|
|
);
|
|
|
|
const FieldsPage = lazy(() =>
|
|
import("./fields/fields-page").then((m) => ({ default: m.FieldsPage })),
|
|
);
|
|
|
|
function FormFallback() {
|
|
return <div role="status" className="p-4 text-sm text-neutral-400">Loading…</div>;
|
|
}
|
|
|
|
export function App() {
|
|
return (
|
|
<BrowserRouter>
|
|
<Routes>
|
|
<Route path="/login" element={<LoginPage />} />
|
|
<Route element={<RequireAuth />}>
|
|
<Route element={<AppShell />}>
|
|
<Route
|
|
path="/objects/new"
|
|
element={
|
|
<Suspense fallback={<FormFallback />}>
|
|
<ObjectNewPage />
|
|
</Suspense>
|
|
}
|
|
/>
|
|
<Route path="/objects" element={<ObjectsPage />}>
|
|
<Route path=":id" element={<ObjectDetail />} />
|
|
<Route
|
|
path=":id/edit"
|
|
element={
|
|
<Suspense fallback={<FormFallback />}>
|
|
<ObjectEditForm />
|
|
</Suspense>
|
|
}
|
|
/>
|
|
</Route>
|
|
<Route path="/vocabularies" element={<VocabulariesPage />}>
|
|
<Route index element={<SelectVocabularyPrompt />} />
|
|
<Route path=":id" element={<VocabularyTerms />} />
|
|
</Route>
|
|
<Route path="/search" element={<SearchPage />}>
|
|
<Route index element={<SelectSearchPrompt />} />
|
|
<Route path=":id" element={<ObjectDetail />} />
|
|
</Route>
|
|
<Route path="/authorities" element={<Navigate to="/authorities/person" replace />} />
|
|
<Route path="/authorities/:kind" element={<AuthoritiesPage />} />
|
|
<Route
|
|
path="/fields"
|
|
element={
|
|
<Suspense fallback={<FormFallback />}>
|
|
<FieldsPage />
|
|
</Suspense>
|
|
}
|
|
/>
|
|
<Route path="/" element={<Navigate to="/objects" replace />} />
|
|
</Route>
|
|
</Route>
|
|
<Route path="*" element={<Navigate to="/objects" replace />} />
|
|
</Routes>
|
|
</BrowserRouter>
|
|
);
|
|
}
|