Oltre alle etichette a peso variabile (EAN13/CODE128 a 13 cifre), ora
vengono riconosciuti i CODE128 di 7 cifre che iniziano con '2': si scarta
il prefisso e restano le 6 cifre del PLU, come per DecodeEanPeso.
Honeywell emette BarcodeFailureEvent anche solo premendo e rilasciando il
trigger senza inquadrare nulla: e' la normale mancata lettura, non un
guasto. Finiva pero' in OnScanFailed insieme ai guasti veri, quindi ogni
pressione a vuoto fermava il rilevatore con un dialog bloccante contenente
il toString() Java grezzo:
Scan failure: com.honeywell.aidc.BarcodeFailureEvent[source=...]
Ora l'evento e' ignorato: chi preme il trigger sa gia' di non aver letto
niente, non serve alcun riscontro. OnScanFailed resta riservato ai guasti
reali (ScannerUnavailableException alla Claim, init di AidcManager fallito).
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Uscendo da una scheda a meta' (tasto indietro del dispositivo o "Annulla")
il lavoro veniva scartato. Il tasto indietro non era nemmeno gestito: non
arriva alla WebView e non c'e' stack di navigazione, quindi mandava l'app
in background con i dati solo in memoria.
Nuovo stato Bozza ("Da completare"): salvata in locale, mai inviabile
finche' non viene conclusa.
- Scheda.Bozza + migration additiva (default false: le schede esistenti
non cambiano stato).
- SchedaSyncHelper: terzo SyncState, CountBozze(). CountDaInviare()
esclude le bozze, quindi il badge "da inviare" resta corretto.
- ModalFormScheda: SaveDraft() salva solo in locale senza validazione;
Save() azzera il flag; Submit() avvisa quando il form e' invalido
(prima il tocco su "Salva" sembrava non fare nulla se i campi mancanti
erano fuori schermo); Update() prende preserveActivityId cosi' una
bozza di scheda gia' inviata mantiene il link al server e al
completamento lo aggiorna invece di duplicarlo.
- ConfirmUpdateActivity: il pulsante bozza sta su NoText, non CancelText
(CancelText ritorna null, NoText ritorna false).
- BackButtonService + MainActivity.OnBackPressed: il tasto indietro passa
dallo stesso percorso di "Annulla". Ignorato mentre e' aperto un dialog
figlio, per non mostrare il prompt sotto un altro dialog.
- IspezionePage: "Concludi ispezione" si blocca se ci sono bozze,
"Esporta reparto" le salta, chip "N da completare" per reparto.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Uscendo dalla scheda il prompt di salvataggio non compariva e il pulsante
"Salva" restava nascosto, perche' IsDirty non vedeva il lavoro fatto:
- gli articoli scelti dalla griglia (OpenSelectArt) non marcavano mai la
scheda come modificata;
- ValueComparer confronta solo i campi del form, quindi ogni RecalcDirty()
successivo azzerava il flag alzato con forceTrue da scanner e allegati.
Non bastava confrontare Articoli: Clone() e' un MemberwiseClone, quindi
_originalScheda condivide la stessa lista.
Ora il confronto usa uno snapshot dei barcode preso all'apertura piu' un
flag per gli allegati (che vivono in AttachedList fino al salvataggio), e
RecalcDirty() perde forceTrue: non puo' piu' essere azzerato. Le chiamate
su insert/remove degli articoli erano anche fatte prima della modifica
della lista, quindi valutavano lo stato precedente.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Da Android 15 (API 35+) l'edge-to-edge e' forzato e adjustResize non
ridimensiona piu' la finestra: la tastiera si limita a coprire la
BlazorWebView. Con il layout rigido (html overflow:hidden, #app 100vh,
page/main height:100% overflow:hidden) nemmeno il browser riesce a
portare in vista il campo col focus.
- MainActivity: WindowSoftInputMode AdjustResize|StateHidden e listener
sugli WindowInsets che applica al content view il padding bottom pari
all'inset IME (meno quello delle system bars, gia' coperto da
SafeAreaEdges in MainPage), cosi' il 100vh si ricalcola.
- main.js: su focusin e visualViewport resize porta il campo attivo al
centro con scrollIntoView, necessario per i contenitori scrollabili.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Il MudTextField delle note ha DebounceInterval e non rifletteva una modifica
del Value fatta da codice. Aggiunta una @key sul campo che, incrementata
quando si applica il suggerimento, forza Blazor a ricreare il campo con la
nota selezionata gia impostata: la nota compare subito a video.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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>