The split draws the buildings you selected

Two buildings named in the address; ⋯ → Split by property draws two lines — not every building the viewer can see.

16 Sept 2026 · branch ui-db-d2-slice · captured against propflow-stage · at ad83593b5a

Data note. Every name and balance below comes from propflow-stage, which is anonymized by construction (ADR-0097/0110 — phones in the impossible +1000 NPA, emails @example.test). The identical capture against prod would carry real tenants' names and balances and is not safe to attach anywhere, which is why the generator refuses to run against one.

1 · AFTER — two buildings selected, ⋯ → Split by property draws two

The address names one company and two of its buildings. The headline tiles and the combined trend line already answered for those two — the occupancy here reads 100.0% where the whole company reads 76.5%, the maintenance card 39 open work orders where the company has 1,049 (/api/dashboard/stats narrows to the selection; /api/dashboard/metric-history's portfolio branch does since #8791). The Split view did not: it fanned out over propertyOptions, every building the viewer can see in the company — seventy here — and the route answered each unselected one with an empty series, so the legend carried seventy names with sixty-eight flat lines under them.

Now the split reads the same selection the tile reads. Two names in the legend, two lines. The list is narrowed where it is decided — DashboardHome.splitProperties, which is both what gets fetched and what gets plotted — so the sixty-eight unselected fetches are not made either. The ⋯ menu stays open after the toggle, so the checked Split by property row is in the picture and in the DOM.

Asserted in the captured DOMSplit by property · One line per property. The toggle's label and hint are asserted because they are static product copy; the two building names are deliberately NOT asserted — they are a customer's, and the spec is committed to source. This tool asserts that a string is PRESENT, never that one is absent, so "only two lines" is carried by the picture and by the unit test's literal list.

AFTER — two buildings selected, ⋯ → Split by property draws two

2 · AFTER — hovered: the per-building overlay lists the same two

The hover overlay is built from the same seriesByProperty the legend is, so it is a second reading of the same list: two rows, two values. Before this change it listed every building in the company, most of them with nothing to say.

Asserted in the captured DOMOccupancy. Presence only, and the menu has to be closed for the overlay to be reachable, so only the tab label is asserted here. The overlay's row count is the picture's claim.

AFTER — hovered: the per-building overlay lists the same two

3 · CONTROL — the whole company selected, the split still draws every building

Same server, same code, the company selected at its full roster. The split fans out over every building the viewer can see, exactly as it did before this change — which is what proves the two-line picture above is the selection narrowing the list, not the fix hiding lines. (A whole-company selection carries the full roster in propertyIds, so the intersection is the identity; the unit test pins this as its positive control.)

Asserted in the captured DOMSplit by property · One line per property. Same static copy asserted; the many-line legend is the picture's claim.

CONTROL — the whole company selected, the split still draws every building

What is not here, and why

No BEFORE frame. A before needs a second dev server pinned to main; this box is carrying eleven lanes' servers today and a twelfth Next process was not worth the risk to them. The before-state is instead carried two ways: the CONTROL section above shows the roster-wide fan-out on this same server (the whole-company case is byte-identical to the old behaviour), and the PR's mutation control reverts the helper to the exact expression DashboardHome used before and prints expected [ 'a1', 'a2', 'a3', 'a4', 'a5' ] to deeply equal [ 'a1', 'a2' ].

Staff identity, deliberately. The non-staff evidence identity lives in a sandbox company whose two buildings are both isTest, which the split's own fence drops — it cannot show a two-of-many selection. A staff viewer who names a company in the address leaves fleet and becomes an ordinary one-company selection, which is the case this change is about.

Correction to the row's record. #8266 recorded that a timezone crash blanked the dashboard and no build could render a split chart; that crash was fixed by #8305 (merged 2026-09-13) and these frames are the proof it renders again.

PropFlow Docs