Select-all and clear need their own entry points
Aliases: select all · clear selection · bulk select
What it is
In a multi-select dropdown, “tick the whole current set” and “leave none” are set-level operations. They cannot be finished by clicking every row, and they cannot hide inside an ordinary option. A dedicated select-all / clear sits above the list or beside the trigger, and those two steps do not share a row with a data item. Without them, a hundred-item choice is either unfinished or riddled with misses from serial ticking.
Dedicated is not a licence to prettify a dangerous action: select-all’s scope must say whether it is “the current filter” or “the whole dataset.”
Why it happens
Time to tick item-by-item grows linearly with the set, and so does error. During repetitive ticking people skip rows and forget where they were, so “I want everything” becomes an unreliable manual scan. Clearing is the same: peeling chips one by one tends to stop at “looks empty.” A set-level action collapses N pointings into one, provided its scope is understood.
If “Select all” is the first data row, it enters sort, search, and scroll: sometimes invisible, sometimes treated as a real object named Select all. Ticking select-all after a filter silently shrinks scope from the universe to the hits, while people still imagine the universe. Ambiguous scope is more dangerous than a missing button, because a shortcut appears to exist.
Where it stops holding
With four or five options, select-all buys little and can bury per-item clarity; it may be omitted, though clear is still worth keeping because its opponent is the selected set, not the option count. Permission or read-only rows must not be swept in: the entry either skips them and says how many were skipped, or it disables select-all when unchoosable rows exist. If clear cannot be undone (an immediately applied grant), treat the entry as destructive rather than as a small-type twin of select-all. Select-all on a tree is parent–child coupling, not a flat-list button dropped onto a hierarchy.
Applying it
- Pin select-all and clear at the top of the list; they must not scroll away or be stored as option data.
- Let select-all copy carry scope: “Select all 128” or “Select all search results,” with the number matching the real set.
- Clear removes the selection, not the options; irreversible effects get their own confirmation.
- How to check: filter to a true subset, press select-all, and inspect whether written IDs are the subset or the universe. Then press clear; the trigger should return to the empty placeholder. Wrong scope or leftover ticks means the entry did not finish a set operation.