mirror of
https://github.com/MBombeck/HealthLog.git
synced 2026-11-13 06:32:03 +00:00
The dashboard page held every tile and chart card in one 2,100-line function: a 1,279-line inline block pushed 24 cards behind 36 show flags. The cards now live in components/dashboard/tiles/, each with its layout widget, its own visibility rule (data floor, module, resolved layout) and its render; the layout toggle and order are applied once by the registry. - use-dashboard-data: the snapshot or legacy reads, the layout, mood, thresholds, the batched chart series and the loading gate - tile-context: summaries, display units, comparison deltas, freshness, directions and target bands, derived once per render - strip-tiles / chart-tiles: the two registries and their builders - dashboard-tiles: the strip, the chart row, their skeletons and the empty state The page is a composer of about 170 lines. Rendering is unchanged. The guards that read page-client.tsx read the whole registry through one helper; the weight-direction, HRV freshness, BP-in-target comparison and chart-reveal checks now build the real tiles instead of matching text.
38 lines
1.5 KiB
TypeScript
38 lines
1.5 KiB
TypeScript
/**
|
|
* The dashboard's source, for the guards that pin how it is wired.
|
|
*
|
|
* The dashboard is a composer (`src/app/page-client.tsx`) over a tile
|
|
* registry (`src/components/dashboard/tiles/`): the reads, the tile context,
|
|
* the strip and chart definitions and the rendering of both rows each live in
|
|
* their own module there. A guard that used to read the one page file reads
|
|
* all of them through here, so a rule about the dashboard holds wherever in
|
|
* the registry the code it watches sits, and moving code between the files
|
|
* cannot turn a negative assertion green. The folder read carries a floor,
|
|
* and the page read an anchor, so a rename fails loudly instead of returning
|
|
* less text.
|
|
*/
|
|
import { readSource, readSourceFolder } from "./source-files";
|
|
|
|
export const DASHBOARD_PAGE = "src/app/page-client.tsx";
|
|
export const DASHBOARD_TILES_DIR = "src/components/dashboard/tiles";
|
|
|
|
/** Each dashboard module as `[repo-relative path, text]`. */
|
|
export function dashboardSourceFiles(): Array<[string, string]> {
|
|
const page = readSource(DASHBOARD_PAGE, "DashboardPageClient");
|
|
const tiles = readSourceFolder(DASHBOARD_TILES_DIR, {
|
|
floor: 5,
|
|
include: (rel) => !rel.includes("__tests__"),
|
|
}).map(([rel, text]): [string, string] => [
|
|
`${DASHBOARD_TILES_DIR}/${rel}`,
|
|
text,
|
|
]);
|
|
return [[DASHBOARD_PAGE, page], ...tiles];
|
|
}
|
|
|
|
/** The dashboard modules' text, concatenated in a stable order. */
|
|
export function dashboardSource(): string {
|
|
return dashboardSourceFiles()
|
|
.map(([, text]) => text)
|
|
.join("\n");
|
|
}
|