Files
SteUP_Dotnet/SteUp.Shared/Core/Messages/System/BackButtonService.cs
T
MarcoE d076a4b77a Salvataggio come bozza: il lavoro in corso non si perde piu'
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>
2026-09-16 13:24:35 +02:00

43 lines
1.4 KiB
C#

namespace SteUp.Shared.Core.Messages.System;
/// <summary>
/// Ponte fra il tasto indietro del dispositivo (host nativo) e la UI Blazor.
/// Il form scheda si registra mentre è aperto così il back non manda l'app in
/// background buttando via il lavoro non salvato: passa invece dallo stesso
/// percorso del pulsante "Annulla", che propone il salvataggio come bozza.
/// </summary>
public class BackButtonService
{
private Func<Task>? _handler;
/// Registra il gestore corrente. Ritorna l'azione di deregistrazione.
public IDisposable Register(Func<Task> handler)
{
_handler = handler;
return new Registration(this, handler);
}
/// <summary>
/// Invocato dall'host nativo. Ritorna true se la UI Blazor ha preso in carico
/// il tasto indietro: in quel caso l'host non deve fare altro.
/// </summary>
public bool TryHandleBackPressed()
{
var handler = _handler;
if (handler is null) return false;
// Fire-and-forget: il gestore rientra nel dispatcher Blazor da solo.
_ = handler();
return true;
}
private sealed class Registration(BackButtonService owner, Func<Task> handler) : IDisposable
{
public void Dispose()
{
// Non azzerare se nel frattempo si è registrato qualcun altro.
if (ReferenceEquals(owner._handler, handler)) owner._handler = null;
}
}
}