# Legacy Coverage Gaps — React UI vs WPF Era > Output of the autodev Step 2 BLOCKING-gate cross-check (2026-05-10). Compares > the current React port (this repo) against the legacy WPF source preserved at > `/Users/obezdienie001/dev/azaion/suite/annotations-research/` (commit > `22529c2`, the last commit before the WPF→.NET-API "big refactoring"). The > source-of-truth narrative is `_docs/legacy/wpf-era.md`; this document lists > the **delta** — features that exist in the WPF source but are not yet present > (or are broken) in the React port. > > Each gap is owned by one component. Per-component gap tables live in the > respective `_docs/02_document/components/_/description.md` §6b > sections. This document is the *single-page rollup* for review. > > **What this document is NOT**: it does not re-litigate features that > `_docs/legacy/wpf-era.md §11` declares "intentionally NOT being ported" > (DI host, LibVLCSharp, ZeroMQ, the Azaion.LoaderUI handoff, the binary-split > key-fragment dance, the Cython sidecars). Those gaps are by design. ## Coverage matrix | WPF concept (where it lived) | Status in React port | Owner component | |------------------------------|----------------------|-----------------| | Module switcher (Suite + IAzaionModule + SVG icon) | **Covered** by `Header.tsx` top nav | `03_shared-ui` | | Dark navy/blue + orange-accent color scheme | **Covered** by `index.css` `az-*` tokens | `03_shared-ui` (theme) | | Login → encrypted-creds handoff | **Intentionally not ported** (browser uses JWT) | `04_login` | | Detection-class strip + PhotoMode + 1–9 shortcut | **Covered** | `03_shared-ui/DetectionClasses` + `11_class-colors` | | `yoloId = classId + photoModeOffset` | **Covered** in `11_class-colors` | `11_class-colors` | | Annotator: bbox draw / 8-handle resize | **Covered** | `06_annotations/CanvasEditor` | | Annotator: Ctrl-multi-select / Ctrl-wheel zoom / Ctrl-drag pan | **Partially missing** (multi-select unverified, pan/zoom flagged) | `06_annotations/CanvasEditor` | | Annotator: time-windowed overlay (50 ms before / 150 ms after) | **Wrong** (symmetric ±200 ms, finding #6) | `06_annotations/CanvasEditor` | | Annotator: video play/pause + frame-by-frame stepping | **Partially covered** (controls exist; per-frame counts unverified vs FPS) | `06_annotations/VideoPlayer` | | Annotator: keyboard shortcuts `[Space]` / `[Left]` / `[Right]` / `[Enter]` / `[Del]` / `[X]` / `[M]` / `[R]` / `[K]` | **Missing** | `06_annotations` (multiple modules) | | Annotator: volume slider | **Missing** | `06_annotations/VideoPlayer` | | Annotator: status bar — clock + help text + status text | **Missing** | `06_annotations` (or shell-level toast) | | Annotator: AI-Detect button + modal progress | **Partial** — sync-image works; video AI-Detect is fire-and-forget, no SSE subscription, no progress UI (findings #21–23, #30) | `06_annotations/AnnotationsSidebar` | | Annotator: **Sound Detections** feature ("show objects from audio analysis") | **Intentionally not ported** (Step 4.5 decision 2026-05-10) | — | | Annotator: **Drone Maintenance** feature ("Аналіз стану БПЛА") | **Intentionally not ported** (Step 4.5 decision 2026-05-10) | — | | Annotator: camera-config side panel (altitude / focal / sensor → GSD) | **Missing** (finding #17) | `06_annotations/AnnotationsPage` | | Annotator: GPS panel toggle below canvas | **Moved** to `05_flights` GPS-Denied sub-page (per user direction) | `05_flights` | | Annotator: affiliation icons + combat-readiness indicator on bbox label | **Missing** (findings #14–15; `AFFILIATION_COLORS` exists but is dead code) | `06_annotations/CanvasEditor` | | Annotator: annotation-row gradient (alpha ∝ confidence; empty bg `#40DDDDDD`) | **Wrong** — alpha caps at 16 % (finding #9, hex/decimal mistake) | `06_annotations/AnnotationsSidebar` | | Annotator: media-list filter / search | **Covered** (debounced) | `06_annotations/MediaList` | | Annotator: media-list `blob:` previews | **Bug** (#25 — local previews ignore filter) | `06_annotations/MediaList` | | Annotator: virtualised media list | **Missing** (finding #26) | `06_annotations/MediaList` | | Annotator: "open folder" file menu | **Intentionally not ported** (web upload via dropzone) | `06_annotations` | | Annotator: help window with 6 quality rules | **Covered** (`HelpModal`) but rules are hardcoded in source — Step 4 i18n | `03_shared-ui/HelpModal` | | Dataset: thumbnail grid + filter | **Covered** but **not virtualised** (finding #3) | `07_dataset` | | Dataset: 3-tab layout (Annotations / Editor / **Class Distribution**) | **Implemented** (Step 4 correction — `DatasetPage.tsx:151` has all three tabs; `loadDistribution()` calls `/api/annotations/dataset/class-distribution`. Verify bar tint matches `classColors`.) | `07_dataset` | | Dataset: "Show only annotations with objects" checkbox | **Implemented** (Step 4 correction — `DatasetPage.tsx:110-114`, state `objectsOnly`) | `07_dataset` | | Dataset: Validate button (bulk validate to `Validated` status) | **Implemented** (Step 4 correction — `DatasetPage.tsx:142-146` button when `selectedIds.size > 0`); `[V]` keyboard shortcut still missing. | `07_dataset` | | Dataset: Refresh thumbnails button + progress | **Missing** (finding #2) | `07_dataset` | | Dataset: `SelectedAnnotationName` + `StatusText` status-bar slots | **Missing** | `07_dataset` | | Dataset: seed annotation 8 px border highlight (`IsSeed=true`) | **Missing** | `07_dataset` | | Dataset: keyboard shortcuts (1–9, Enter, Del, X, V, arrows, PgUp/PgDn, Esc) | **Missing** (finding #1) | `07_dataset` | | Dataset: inline editor saves | **Broken** (finding #4) | `07_dataset` + `06_annotations/CanvasEditor` | | Cross-cutting: resizable panel widths persisted per user | **Not persisted** (finding #11) | `00_foundation/useResizablePanel` + Settings backend | | Cross-cutting: Ukrainian + English localisation | **Covered** (`react-i18next` w/ `en.json` + `ua.json`) — surface area to verify against legacy `translations.json` (only 6 keys, but XAML hardcoded UA strings everywhere). | `00_foundation/i18n` | | Cross-cutting: confirmation dialogs (delete-media / delete-selected / delete-all / deactivate-user) | **Component covered** (`ConfirmDialog`); some destructive actions still bypass it (`08_admin` `handleDeleteClass` finding) | `03_shared-ui/ConfirmDialog` + `08_admin` | ## Decisions taken at Step 4.5 (Architecture Vision, 2026-05-10) The Step 4.5 user review resolved the product-level decisions that were pending here. Summary: 1. ~~Sound Detections feature~~ — **Dropped** (intentionally not ported). 2. ~~Drone Maintenance feature~~ — **Dropped** (intentionally not ported). 3. ~~Class Distribution chart~~ — already ported (Step 4 correction). 4. **Status bar with clock + help-text-blink pattern** — still open, deferred to a Phase B cycle (low priority — replace with toast unless a downstream cycle picks it up explicitly). 5. **Seed annotation concept** (`IsSeed=true` highlight) — still open, deferred to a Phase B cycle (need to verify whether the modern API still exposes `isSeed`). 6. **Camera config persistence** — still open, deferred to the Phase B cycle that ports the camera-config side panel from `mission-planner/`. 7. **Resizable panel width persistence** — **Persist** as part of `UserSettings` (Step 4 fix; principle P11 in `architecture.md` Architecture Vision). Additional Step 4.5 resolutions not from this rollup but recorded for traceability: - **Spec is source of truth for numeric enums** with inline comments per value (principle P9). - **OpenWeatherMap API key** moves to `.env` (principle P10; Step 4 fix candidate). - **Admin can edit detection classes** — re-introduce `PATCH /api/admin/classes/{id}` and the in-place edit form (principle P12). - **Mission-planner convergence** — flag at Step 2 (Architecture Baseline), spec at Step 3 (Test Spec), port across Phase B cycles, delete tree in final cycle (recorded in `architecture.md` Architecture Vision). ## Where to find the per-component detail - `_docs/02_document/components/06_annotations/description.md` §6b — Annotations gap table (~17 entries) - `_docs/02_document/components/07_dataset/description.md` §6b — Dataset gap table (~12 entries) - Other components (`00_foundation`, `01_api-transport`, `02_auth`, `03_shared-ui`, `04_login`, `05_flights`, `08_admin`, `09_settings`, `10_app-shell`, `11_class-colors`) have no WPF-source delta — either no WPF analog (most), or already covered (Header / module switcher / DetectionClasses / 11_class-colors) per `_docs/legacy/wpf-era.md §10`.