- Shipped
- September 3, 2026 at 2:52 PM UTC
- Author
- Kamo
- Commit
- 49b57da
Three changes to /leads. Quick search moves into the hero, above the CRM Settings links. In the filter row it was the last control on a line of eleven dropdowns, findable only by scanning past all of them. LeadManager still owns the value's journey into the query and into the session storage that restores the filter bar on the way back from a lead — the box moved, nothing else did. A flip switch, centred in the pagination row: Lead View / Communication View. Two named positions rather than a Switch, because neither of these is "off" — they are two ways of looking at the same filtered set, and a control naming only one would leave the reader guessing what the other position does. Communication View replaces the grid with the same timeline a lead's own Communications tab draws — same component, same six sub-tabs, same entry renderers — scoped to whatever the filter bar currently matches. Every entry carries a chip naming its lead and linking into it: cross-lead, a row that does not say whose call it was is unreadable, and finding the one conversation worth opening is the whole reason to scan the list. No note composer, deliberately: a note has to be about one lead, and a box that could not say which is a trap rather than a convenience. Details that are load-bearing rather than incidental: - The grid's page fetch is SUSPENDED in Communication View. GET /api/security/leads writes one PHI access row per lead it returns, and fetching a page to render a screen showing none of them would put reads in the audit trail that nobody performed. - The filter string handed to the timeline is debounced on the grid's own delay. The grid debounces its request; the timeline cannot — it refetches whenever the string changes and fires two requests per change, so typing "smith" was ten round trips, each writing a PHI search record, none of them aborted. - page/size/sort are stripped from it. size actively collides, because the timeline sets its own. - The pager's two tracks stay MOUNTED when they empty. A display:none child is not a grid item at all, so hiding them would have left the switch as the first item and slid it into the left-hand track, off centre.