Bulk actions: analyst page + developer guide (#910)
Bulk-Actions.md — the key map (mouse and keyboard), why plain click starts
again, the anchor behaviour that lets a second Shift+click SHRINK a block, the
three display modes, and the deliberate edges (desktop only, 100 per batch,
subject not bulk-editable).
Bulk-Actions-Developer-Guide.md — colour-keyed file table first, then the two
decisions that matter:
- three selection variables, not one: the anchor is separate so Shift can
measure from the last PLAIN click, and the cursor is separate so Ctrl+arrow
can move over rows that are not selected (which is what makes Space work).
Also why .kb-focus is an outline and never a fill.
- bulk writes LOOP TicketsService::updateTicket server-side rather than one
UPDATE ... WHERE id IN (...), because changing a ticket is not a column
write. The failure mode that buys: a workflow that fires for one ticket and
silently not for fifty. Per-ticket access control and correct per-ticket
audit fall out for free.
Plus the n <= 1 choke point (a real shipped bug: the bar kept saying "5
selected" while one was held), why showToast can't carry progress, the
inside/outside rule shared by right-click and drag, why the drag ghost uses
real child elements rather than pseudo-elements, and how the whole thing was
verified with real modifier-key MouseEvents in headless Chrome.
Every file, function, variable, constant and CSS class named in the tables was
checked to exist in the repo, and every internal link to resolve. Linked from
the sidebar under Tickets and from Tickets.md.