mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-12 22:26:13 +00:00
The page becomes one wide, calm filing-cabinet view: PageHeader with an Upload action, a drop-target upload zone whose accept list and per-file cap come from the usage endpoint (quota bar only above 80 %), a sticky filter rail (200 ms debounced search focused by '/', nine type chips, condition chips from linked episodes, a year segmenter, one-tap clear), and the virtualized timeline below. Filter state lives in the URL so every view is shareable and back-button-safe; uploads filtered to an episode arrive pre-linked. Hovering a card prefetches detail metadata — never the blob. Designed states: a skeleton grid that matches the loaded layout, a teaching empty state, a distinct no-matches state, and a retryable error card. /documents joins the shell's wide-container list; the shell stays the single owner of the page frame. Locale bundles gain the vault vocabulary in all six languages and drop the retired extraction-review strings. Plan-Task: W2-T1, W2-T4 (zone), W2-T5 (prefetch), W2-T6
19 lines
607 B
TypeScript
19 lines
607 B
TypeScript
import { Suspense } from "react";
|
|
|
|
import { DocumentsView } from "@/components/documents/documents-view";
|
|
|
|
/**
|
|
* The Dokumente vault — server shell only. The client surface owns the
|
|
* module gate, the URL-backed filter state (which needs `useSearchParams`,
|
|
* hence the Suspense boundary), the virtualized timeline, and the upload
|
|
* queue. The route rides the AuthShell's wide-container flag: the shell
|
|
* owns the page frame, this file never re-implements paddings.
|
|
*/
|
|
export default function DocumentsPage() {
|
|
return (
|
|
<Suspense fallback={null}>
|
|
<DocumentsView />
|
|
</Suspense>
|
|
);
|
|
}
|