13d5400104
Il tasto al centro perde l'etichetta: non ne ha una sola, perche' quello che fa lo decide la schermata sotto. Dentro un'ispezione apre le sue azioni (nuova scheda, concludi, elimina); altrove apre una nuova ispezione. Il glifo resta lo stesso e resta nello stesso punto: quello che cambia e' cosa c'e' dietro, non dove mettere il dito. Le azioni dell'ispezione lasciano quindi la testata, dove stavano dietro un menu a tre punti, e tornano sotto il pollice. Il collegamento passa da PageActionsService: la pagina si registra finche' e' a video e si sfila uscendo, cosi' la barra non tiene in vita schermate che non ci sono piu'. Chi non registra niente lascia al comando il suo significato di default — un'ispezione conclusa non registra, e il tasto non resta li' a non fare nulla. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
96 lines
3.6 KiB
Plaintext
96 lines
3.6 KiB
Plaintext
@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.
|
|
*@
|
|
|
|
<nav class="navbar @(IsVisible ? "" : "navbar--hidden")" aria-label="Navigazione principale">
|
|
<NavLink class="navbar__item pressable" href="ispezioni" Match="NavLinkMatch.All">
|
|
<span class="navbar__icon">
|
|
<i class="@(IsOn("ispezioni") ? "ri-file-list-3-fill" : "ri-file-list-3-line")" aria-hidden="true"></i>
|
|
</span>
|
|
<span class="navbar__label">Ispezioni</span>
|
|
</NavLink>
|
|
|
|
<button type="button" class="navbar__action" @onclick="RunAction"
|
|
disabled="@(!NetworkService.IsNetworkAvailable())"
|
|
aria-label="@ActionLabel"
|
|
title="@(NetworkService.IsNetworkAvailable() ? ActionLabel : "Serve la connessione")">
|
|
<i class="ri-add-line" aria-hidden="true"></i>
|
|
</button>
|
|
|
|
<NavLink class="navbar__item pressable" href="user" Match="NavLinkMatch.All">
|
|
<span class="navbar__icon">
|
|
<i class="@(IsOn("user") ? "ri-user-fill" : "ri-user-line")" aria-hidden="true"></i>
|
|
</span>
|
|
<span class="navbar__label">Profilo</span>
|
|
</NavLink>
|
|
</nav>
|
|
|
|
@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;
|
|
}
|
|
}
|