feat(labs): add biomarker filtering and sorting

This commit is contained in:
Konrad Garbal committed 2026-11-10 20:46:57 +01:00
1 parent 22b85ff97d
commit b4ac67ee7c
36 files changed
+3290 -172

No files matched your search

+5 -5
View File
@@ -77172,10 +77172,9 @@ components:
description: "One category of the labs list, resolved by the server. `key` is opaque: a catalog panel key,
`custom:<hash>` for the person's own panel, or `other`; it carries no user text and is stable, so a client may
key collapse state on it. `label` is rendered as given (a catalog panel in the caller's locale, the person's own
spelling, or the localised \"Other\"). `markerKeys` names the `markers[].key` values in the category. `status`
combines the members' newest readings: `above` when any is above its range, else `below` when any is below, else
`in-range` when any was assessed, else `unknown`. A client renders these values and never rebuilds the category,
the order or the status."
spelling, or the localised \"Other\"). `markerKeys` names the `markers[].key` values in the category. `counts`
and `status` describe the full category without filters; a client renders these values directly when unfiltered,
and may summarize the visible row subset client-side while filters are active."
LabOverviewCategoryCounts:
type: object
properties:
@@ -77201,7 +77200,8 @@ components:
- above
- unknown
additionalProperties: false
description: How many members' newest readings are in range, below, above, or unassessed (qualitative, or no range).
description: How many members' newest readings are in range, below, above, or unassessed (qualitative, or no range) for
the full category without filters.
GetLabResultResponse:
type: object
properties:
+10 -5
View File
@@ -236,15 +236,20 @@ lists) uses the unified `<FilterBar>` rail from
`src/components/ui/filter-bar.tsx` — never a per-page row of large
labelled `<Select>`s and date inputs.
- **Grammar**: `[icon] [Zeitraum] [Typ] [Quelle] [extras…]
[Zurücksetzen] … [count]`. Canonical dimension order is date range,
type, source; surface-specific dimensions append after.
- **Grammar**: `[search] [icon] [Zeitraum] [Typ] [Quelle] [extras…]
[Zurücksetzen] … [count]`. Where search is supported (such as labs), the
search input is integrated as the leading element in the rail. Canonical
dimension order remains date range, type, source; surface-specific
dimensions append after.
- **Pill = trigger + chip**: inactive pills show only the dimension
name; active pills show `Name: Wert`, pick up the primary accent and
grow a removable ✕. No separate chip row.
- **Reset** renders only while at least one dimension is active.
- **Mobile** (< `sm`): the rail is a horizontal scroll row (hidden
scrollbar, edge-bleed); the result count wraps to its own line.
- **Mobile** (< `sm`): standard pill rails scroll horizontally (hidden
scrollbar, edge-bleed); the result count wraps to its own line. When an
integrated search input is present in the rail (such as in labs), the
rail wraps (`max-sm:flex-wrap`) so search spans full width and pills
wrap underneath, avoiding horizontal scroll while typing.
- The component is presentation-only — filter state, query keys and
fetching stay in the owning page. Use `FilterBarSelect` for enum
dimensions and `FilterBarDateRange` for the from/to pair.