Files
SteUP_Dotnet/SteUp.Shared/Components/Layout/NavMenu.razor
T
MarcoE 13d5400104 Il comando della barra si adatta alla schermata
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>
2026-09-17 15:44:55 +02:00

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;
}
}