@implements IDisposable @inject IDialogService Dialog @inject PageActionsService PageActions @using SteUp.Shared.Core.Messages.System @* 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 il comando. Non e' un pulsante che galleggia sopra la barra e ne copre il centro: e' la casella centrale, alla stessa altezza delle altre due. Sta sempre nello stesso punto, ma quello che fa lo decide la schermata sotto (vedi PageActionsService): dentro un'ispezione apre le sue azioni, altrove apre una nuova ispezione. *@ @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); private string ActionLabel => PageActions.HasActions ? "Azioni" : "Nuova ispezione"; protected override void OnInitialized() { NavigationManager.LocationChanged += OnLocationChanged; PageActions.Changed += OnPageActionsChanged; Refresh(); } private void OnPageActionsChanged() => InvokeAsync(StateHasChanged); private void OnLocationChanged(object? sender, LocationChangedEventArgs args) => Refresh(); private void Refresh() { IsVisible = NavigableRoutes.Contains(CurrentRoute, StringComparer.OrdinalIgnoreCase); StateHasChanged(); } /// Il comando vale quello che la schermata gli ha dato; se non gliel'ha /// dato nessuno, vale la cosa che l'app fa piu' spesso. private Task RunAction() => PageActions.HasActions ? PageActions.Invoke() : NewInspection(); 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; PageActions.Changed -= OnPageActionsChanged; } }