Per-shape hide + dimmed shape list in review editor (REQ-185, amended REQ-183)

- ReviewPage: hiddenShapeIds/overriddenShapeIds session Sets, H toggles
  selected/marked shapes, purge effect removed (dimmed rows selectable
  from list), auto-override on draw/assist/copy into hidden class,
  class-eye toggle clears that class's overrides
- ReviewSidebar: all rows listed, dimmed rows get restore eye, header
  count = total shapes
- ShortcutsPanel: H entry
- docs: REQ-183 amended + REQ-185 added; design/ui-spec/tasks synced
This commit is contained in:
asus committed 2026-10-02 13:22:50 +07:00
1 parent 96a00267d9
commit 6a36f102c9
7 files changed
+175 -57

No files matched your search

+13 -7
View File
@@ -355,13 +355,19 @@ sequentially and merges, without examples it is the unchanged full-set request.
per-class overrides table also carries a **Container** checkbox (REQ-184) that toggles
`project_classes.container` through `PATCH /api/projects/{id} { containers: … }`.
**Review sidebar class rows (REQ-180, REQ-183).** Each class row's frame-clear `×` (REQ-180)
gains an eye toggle in front of it: session-only `Set` state in `ReviewPage`, so it survives
frame changes, resets when the review page is left, and never touches stored data. Hiding a
class filters it out of the `annotations` array handed to `AnnotationCanvas` and to the
"Shapes on this frame" list, and a purge effect drops hidden shapes from the marked and
selected ids — so hidden shapes are not selectable, not marquee-selectable, not deletable —
while the row keeps its real per-frame count.
**Review sidebar class rows (REQ-180, REQ-183, REQ-185).** Each class row's frame-clear `×`
(REQ-180) gains an eye toggle in front of it: session-only `Set` state in `ReviewPage`, so it
survives frame changes, resets when the review page is left, and never touches stored data.
Hidden shapes are never handed to `AnnotationCanvas` — not drawn, not clickable, not
marquee-selectable — but they stay listed, dimmed, in "Shapes on this frame". Two session
Sets drive the hide half: `hiddenShapeIds` (the `H` key, REQ-185, which toggles the single
selection or all marked shapes) and `overriddenShapeIds` (the row-eye restore and the
auto-override below); a shape is visible when it is not `H`-hidden and (its class is visible
or it is overridden). Dimmed rows stay selectable, reclassable and deletable from the list —
the old "not deletable while hidden" purge invariant is superseded — while the class row
keeps its real per-frame count. Creating a shape while its class is hidden (draw, assist,
copy) auto-overrides it so the user sees what they just made; reclassing into a hidden class
dims it unless it already carries an override; toggling a class eye clears that class's overrides.
**Exemplar-driven labeling in review (REQ-173, REQ-174, REQ-175).** In `draw` mode a drag on
`AnnotationCanvas` is an exemplar, not a rectangle: `onExemplar(box, positive)` where