Files
SteUP_Dotnet/SteUp.Shared/Core/Helpers/SchedaSyncHelper.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

72 lines
2.4 KiB
C#

using MudBlazor;
using SteUp.Shared.Core.Entities;
namespace SteUp.Shared.Core.Helpers;
/// <summary>
/// Stato di sincronizzazione di una scheda rispetto al server Integry.
/// Principio "Offline è la verità": il rilevatore deve sempre vedere cosa è
/// ancora solo sul dispositivo e cosa è già arrivato al server.
/// </summary>
public enum SyncState
{
/// Salvata solo in locale, non ancora inviata al server.
DaInviare = 0,
/// Inviata al server (ha un ActivityId).
Inviato = 1,
/// Salvata in locale ma non completata: da riprendere, non inviabile.
Bozza = 2
}
public static class SchedaSyncHelper
{
public static SyncState GetSyncState(this Scheda scheda) =>
scheda.Bozza
? SyncState.Bozza
: string.IsNullOrEmpty(scheda.ActivityId)
? SyncState.DaInviare
: SyncState.Inviato;
public static string ToLabel(this SyncState state) =>
state switch
{
SyncState.DaInviare => "Da inviare",
SyncState.Inviato => "Inviato",
SyncState.Bozza => "Da completare",
_ => string.Empty
};
/// <summary>
/// Colore del badge. Corallo (Primary) = azione richiesta (da inviare);
/// verde (Success) = fatto (inviato). Rispetta la Regola dell'Unico Accento.
/// </summary>
public static Color GetColor(this SyncState state) =>
state switch
{
SyncState.DaInviare => Color.Primary,
SyncState.Inviato => Color.Success,
SyncState.Bozza => Color.Warning,
_ => Color.Default
};
public static string GetIcon(this SyncState state) =>
state switch
{
SyncState.DaInviare => Icons.Material.Rounded.PhonelinkOff,
SyncState.Inviato => Icons.Material.Rounded.CloudDone,
SyncState.Bozza => Icons.Material.Rounded.EditNote,
_ => string.Empty
};
/// Numero di schede non ancora inviate in una lista. Le bozze non contano:
/// non sono inviabili finché non vengono completate.
public static int CountDaInviare(this IEnumerable<Scheda> schede) =>
schede.Count(s => s.GetSyncState() == SyncState.DaInviare);
/// Numero di schede lasciate a metà, da riprendere.
public static int CountBozze(this IEnumerable<Scheda> schede) =>
schede.Count(s => s.GetSyncState() == SyncState.Bozza);
}