@implements IDisposable @inject IDialogService Dialog @* Navigazione flottante in basso (STILE_UI ยง6.15): il contenuto le scorre sotto, le destinazioni restano a portata di pollice. Icona outline a riposo, piena da selezionata, etichetta sempre visibile in entrambe. Da 720px diventa una colonna laterale (vedi components.css). In mezzo alle due destinazioni sta l'unica azione dell'app: aprire una nuova ispezione. Non e' un pulsante che galleggia sopra la barra e ne copre il centro, e' la terza casella della barra, alla stessa altezza delle altre due. Vale una cosa sola dappertutto: se cambiasse significato da una pagina all'altra sarebbe un tasto da indovinare. *@ @code { private bool IsVisible { get; set; } = true; private static readonly string[] NavigableRoutes = ["ispezioni", "ispezione", "user"]; private string CurrentRoute => NavigationManager.Uri.Remove(0, NavigationManager.BaseUri.Length).Split('?')[0]; private bool IsOn(string route) => CurrentRoute.EqualsIgnoreCase(route); protected override void OnInitialized() { NavigationManager.LocationChanged += OnLocationChanged; Refresh(); } private void OnLocationChanged(object? sender, LocationChangedEventArgs args) => Refresh(); private void Refresh() { IsVisible = NavigableRoutes.Contains(CurrentRoute, StringComparer.OrdinalIgnoreCase); StateHasChanged(); } private async Task NewInspection() { if (!await SteupDataService.CanOpenNewInspection()) { await Dialog.ShowWarning( "Per aprire una nuova ispezione devi prima concludere tutte le ispezioni aperte da piu' di 20 giorni."); return; } // La scelta del punto vendita naviga da sola sull'ispezione: qui non // c'e' altro da fare, nemmeno quando l'utente annulla. await Dialog.OpenSelectShop(); } public void Dispose() => NavigationManager.LocationChanged -= OnLocationChanged; }