52b2994d3b
Il salvataggio come bozza non e' mai scattato dal tasto indietro: la UI Blazor non riceveva l'evento, e uscire da un form con modifiche in corso buttava via il lavoro esattamente come prima che la bozza esistesse. Il back non arrivava a OnBackPressed per due motivi diversi: - da AndroidX Activity 1.6 il gesto passa dall'OnBackPressedDispatcher e il metodo dell'Activity non viene piu' invocato; - con la navigazione a tre tasti il back arriva come evento di tastiera e la WebView lo intercetta per conto suo, tornando indietro nella propria cronologia, prima che Activity o dispatcher lo vedano. Ora la chiave si ferma in DispatchKeyEvent, che passa prima della gerarchia di view, e resta un callback sul dispatcher per la navigazione a gesti, dove evento di tastiera non ce n'e'. Entrambi restano accesi solo finche' la UI ha davvero qualcosa da dire: altrimenti il back si comporta come sempre. I gestori diventano una pila, cosi' sopra il form puo' aprirsi un bottom sheet e il back chiude prima quello senza portarsi via la registrazione sottostante. ActionSheet si registra da solo mentre e' aperto. Verificato sull'EDA52: back sul form con modifiche apre "Lavoro non salvato" e salva la bozza; back sullo sheet chiude solo lo sheet. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
82 lines
2.4 KiB
Plaintext
82 lines
2.4 KiB
Plaintext
@using SteUp.Shared.Core.Messages.System
|
|
@inject BackButtonService BackButton
|
|
@implements IDisposable
|
|
|
|
@*
|
|
Bottom sheet (STILE_UI §6.14): sale dal basso, maniglia di trascinamento,
|
|
testata con titolo e chiusura, un'unica linea di struttura, corpo scorrevole.
|
|
Sostituisce i menu flottanti: stessa funzione, bersagli molto piu' grandi.
|
|
*@
|
|
|
|
@if (Open)
|
|
{
|
|
<div class="sheet-scrim" @onclick="Close" aria-hidden="true"></div>
|
|
|
|
<div class="sheet @(Tall ? "sheet--tall" : "")" role="dialog" aria-modal="true"
|
|
aria-label="@Title">
|
|
<div class="sheet__handle"></div>
|
|
|
|
<div class="sheet__head">
|
|
<div class="sheet__titles">
|
|
<h2 class="sheet__title">@Title</h2>
|
|
@if (!string.IsNullOrWhiteSpace(Subtitle))
|
|
{
|
|
<p class="sheet__subtitle">@Subtitle</p>
|
|
}
|
|
</div>
|
|
<MudIconButton Icon="@Icons.Material.Rounded.Close" Color="Color.Inherit"
|
|
aria-label="Chiudi" title="Chiudi" OnClick="Close"/>
|
|
</div>
|
|
|
|
<div class="sheet__divider"></div>
|
|
|
|
<div class="sheet__body">
|
|
@ChildContent
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
@code {
|
|
[Parameter] public bool Open { get; set; }
|
|
[Parameter] public EventCallback<bool> OpenChanged { get; set; }
|
|
[Parameter] public string? Title { get; set; }
|
|
[Parameter] public string? Subtitle { get; set; }
|
|
|
|
/// Sheet di compilazione (~92% dello schermo) invece che di consultazione.
|
|
[Parameter] public bool Tall { get; set; }
|
|
|
|
[Parameter] public RenderFragment? ChildContent { get; set; }
|
|
|
|
// Il tasto indietro del dispositivo chiude lo sheet invece di uscire dalla
|
|
// schermata sotto: e' il gesto che l'utente si aspetta, ed e' anche la
|
|
// ragione per cui i gestori sono impilati (vedi BackButtonService).
|
|
private IDisposable? _backRegistration;
|
|
|
|
protected override void OnParametersSet()
|
|
{
|
|
if (Open && _backRegistration is null)
|
|
{
|
|
_backRegistration = BackButton.Register(() => InvokeAsync(Close));
|
|
}
|
|
else if (!Open)
|
|
{
|
|
Unregister();
|
|
}
|
|
}
|
|
|
|
private async Task Close()
|
|
{
|
|
Unregister();
|
|
Open = false;
|
|
await OpenChanged.InvokeAsync(false);
|
|
}
|
|
|
|
private void Unregister()
|
|
{
|
|
_backRegistration?.Dispose();
|
|
_backRegistration = null;
|
|
}
|
|
|
|
public void Dispose() => Unregister();
|
|
}
|