Files
SteUP_Dotnet/.impeccable/critique/2026-07-08T13-15-08Z__steup-shared-components-pages-ispezionepage-razor.md
T
MarcoE c454474f49 Migliora IspezionePage e form scheda (design review impeccable)
Ispezione:
- Stato sync visibile: badge per-scheda (Da inviare/Inviato) e contatore
  "N da inviare" per reparto (nuovo SchedaSyncHelper)
- Completamento: progresso reale nell'overlay + spunta di successo;
  NON completa se una scheda fallisce (resta editabile, schede "Da inviare")
- Export reparto/completamento blindati: conferma + guardia anti doppio-tap,
  try/finally che libera sempre l'overlay
- Accento corallo unico per l'azione "invia"; target di tocco >=44px;
  empty state; solo il primo pannello espanso di default
- Tasto "Invia" nascosto sulle schede gia inviate
- Messaggio d'errore comprensibile in campo (dettaglio tecnico nei log)
- Fix OnSchedaModified (index >= 0)

Aspetto card:
- SchedaCard e InspectionCard: superficie Carta + hairline border + ombra
  morbida (nuovo token --card-box-shadow); pagina con tinta Grigio Campo
- SchedaCard compattata

Form scheda (ModalFormScheda):
- Tasto Salva/Aggiorna full-width
- Fix "Suggerisci note descrittive": la nota selezionata ora viene inserita
  nel campo (metodo async sul thread UI + OnAfterChangeValue)

StatusEnum: etichette in sentence-case

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 16:39:20 +02:00

99 lines
8.1 KiB
Markdown

---
target: IspezionePage
total_score: 18
p0_count: 1
p1_count: 3
timestamp: 2026-07-08T13-15-08Z
slug: steup-shared-components-pages-ispezionepage-razor
---
# Critique: IspezionePage
Method: dual-agent (A: design-review · B: detector+evidence). Browser visualization SKIPPED (MAUI Blazor Hybrid / WASM requires app build + auth + runtime state; no static HTML or dev server to inject into).
## Design Health Score
| # | Heuristic | Score | Key Issue |
|---|-----------|-------|-----------|
| 1 | Visibility of System Status | 1 | SchedaCard never shows local-only vs already-sent (`ActivityId`); "offline è la verità" is invisible on its central screen |
| 2 | Match System / Real World | 3 | Clean Italian, correct `sched{a/e}` pluralization; but online "+" is icon-only, unlabelled |
| 3 | User Control and Freedom | 1 | ExportReparto and Completa push to server irreversibly, no undo; export has no confirm |
| 4 | Consistency and Standards | 1 | MudBlazor default color rainbow (Warning/Success/Info/Error) violates single-accent; MudFab is both tiny icon and wide labelled button |
| 5 | Error Prevention | 2 | Completa & Delete confirmed; Export has no confirm and no double-tap guard |
| 6 | Recognition Rather Than Recall | 2 | No per-scheda sync badge → user must remember which reparti were exported |
| 7 | Flexibility and Efficiency | 2 | Three overlapping sync paths (per-scheda / per-reparto / Completa), unclear which supersedes |
| 8 | Aesthetic and Minimalist Design | 2 | Multi-color FAB clusters + info chips add chroma noise |
| 9 | Error Recovery | 2 | OnError surfaces raw `e.Message` (+ Console.WriteLine) — technical, not field-friendly |
| 10 | Help and Documentation | 2 | No empty state — empty SchedeGrouped renders a blank body |
| **Total** | | **18/40** | **Poor — major UX work before it delivers its promise** |
## Anti-Patterns Verdict
**LLM assessment:** No gradients/glass/eyebrows/side-stripes. The tell is subtler: the screen wears MudBlazor's default demo palette. Actions form a semantic rainbow — Warning(orange)=Add, Success(green)=Export, Info(blue)=Edit, Error(red)=Delete — none overridden in MudTheme (only Primary/Secondary/Tertiary/TextPrimary are set). DESIGN.md's loudest rule (La Regola dell'Unico Accento — coral #ec4c41 as the sole action color) appears nowhere on the action surface. Reads as "component-library defaults, lightly arranged" — the enterprise-Blazor flavor of AI slop.
**Deterministic scan:** detect.mjs clean (exit 0, 0 findings) on IspezionePage.razor and on InspectionCard + SchedaCard. No false positives. The scanner targets HTML/CSS slop patterns; the real defects here are semantic (color roles, state visibility) which it structurally cannot see — so the LLM review carries this critique.
**Visual overlays:** none — browser visualization not applicable to this target.
## Overall Impression
The bones are good — reparto grouping with live counts, restrained rounded surfaces, honest completion-confirm copy — but the screen fails at the one thing the product exists for: making sync/offline state unambiguous. A rilevatore cannot glance at this screen and know what is still trapped on the phone. On top of that, the signature coral accent is absent from every action, replaced by library-default colors. Biggest single opportunity: make per-scheda sync state visible and route all actions through the single coral accent.
## What's Working
1. **Completion-confirm copy** is plain, honest, consequence-first — the "conferme che prevengono l'errore" principle done right.
2. **Reparto grouping with live count chips** + correct Italian pluralization — thoughtful, task-shaped IA.
3. **Restrained surface design** (1em panels, 20px cards, tonal #f5f5f5, flat-by-default) respects the "taccuino da campo" north star.
## Priority Issues
**[P0] Sync state is invisible on SchedaCard / the whole screen** — violates "Offline è la verità" (#1 principle)
- Why: nothing distinguishes a locally-saved scheda from one on the server (`ActivityId`); no reparto "X da inviare" signal. The core product promise breaks exactly where it matters.
- Fix: persistent per-scheda status badge (Locale / Da inviare / Inviato) — coral for needs-action, success green for inviato; reparto-level unsent counter.
- Command: /impeccable clarify
**[P1] Kill the MudBlazor color rainbow; restore the single accent** — violates Regola dell'Unico Accento
- Why: coral never appears on actions; "Add" literally looks like a warning; reads as default slop and destroys the accent's meaning.
- Fix: coral (Primary) for the single primary action per context; demote secondary actions to neutral/text; reserve red strictly for Delete.
- Command: /impeccable colorize
**[P1] Export reparto is irreversible, unconfirmed, and double-tap-able**
- Why: fires on FAB tap with no confirmation; overlay mounts a frame late, so a fast gloved double-tap can re-send the batch → duplicate server activities.
- Fix: confirm dialog matching Completa; disable/guard the FAB the instant it's tapped, not on next render.
- Command: /impeccable harden
**[P1] Primary actions sit in panel headers, not at thumb reach** — violates "Il pollice comanda"
- Why: Add/Export FABs live in TitleContent at the top of a scrolling list; Size.Small FABs ≈40px (under 44px); Delete sits ~1rem from Export.
- Fix: move primary create to bottom-right custom-mudfab; enforce ≥44px; separate Delete from Export (spacing or overflow menu).
- Command: /impeccable layout
**[P2] Opaque blocking wait + no success payoff at completion**
- Why: Completa loop shows a featureless full-screen spinner through save→upload-photos→complete with zero progress; SpinnerOverlay's built-in success-checkmark is never wired here — the emotional peak has no reassurance.
- Fix: step progress ("Invio scheda 3/7 · foto 2/4"); trigger the existing success animation on completion.
- Command: /impeccable animate
**[P3] All panels Expanded="true" + no empty state**
- Why: every reparto expands by default (scroll purgatory for many reparti); an empty inspection renders blank.
- Fix: expand only the first (or none) with counts visible; add empty state ("Nessuna scheda — tocca + per iniziare").
- Command: /impeccable distill
## Persona Red Flags
- **Casey (distracted mobile):** unlabelled orange "+" online; three different sync verbs; nothing shows what's already sent → taps Export twice or completes without exporting.
- **Sam (accessibility):** Size.Small FABs under 44px; meaning by color alone across a Warning/Info/Success/Error rainbow (color-blind users can't tell Add from Delete by hue); `info-subtitle` (gray-default) and `info-inspection-text` (text-secondary) muted gray violate the sun-contrast rule and likely fail AA.
- **Riley (stress tester):** double-tap Export → duplicate records; errors surface as raw exception strings; 40 schede across 8 reparti all expanded → scroll purgatory.
- **Marco the rilevatore (gloved, offline, sunlight):** offline, the Export FAB silently disappears with no "why"; the Add FAB stays enabled here yet the same action is Disabled in NavMenu (contradictory); in bright sun he cannot tell which schede are still trapped on the device — the exact fear the app exists to remove.
## Minor Observations
- InspectionCard runs an artificial `await Task.Delay(250)` before showing store data — a deliberate stall on a screen whose principle is "feedback immediato".
- scheda action cluster is center-justified — harder to acquire one-handed than edge-anchored.
- OnError keeps a `Console.WriteLine(e.Message)` beside the logger — dev residue.
- Photo/QR chips in SchedaCard add visual weight but aren't tappable.
## Questions to Consider
- If a rilevatore can't glance at this screen and instantly know what's still only on the phone, does the app deliver its single promise?
- Why do three separate "send" affordances exist (per-scheda, per-reparto, complete)? Could one honest sync model with clear per-item state replace all three?
- The success-checkmark animation was built but never wired here — cut or forgotten? Which is worse?
- If coral is "the color of action" but every action button is orange/green/blue, what is coral the color of on this screen?