2026-10-06 23:49:49 +02:00
|
|
|
@inherits LayoutComponentBase
|
|
|
|
|
@implements IDisposable
|
2022-02-02 20:26:14 +01:00
|
|
|
|
2026-10-06 23:49:49 +02:00
|
|
|
@* The page and its menu. The overlays it holds (dialogs, menus, sheets: IDOverlayHost, cascaded) close with the phone's
|
|
|
|
|
Back button: while one is open, Back closes the newest instead of leaving the page; a link followed or the app's own
|
|
|
|
|
navigation closes them all and goes on. *@
|
|
|
|
|
<CascadingValue Value="(IDOverlayHost)Overlays" IsFixed="true">
|
|
|
|
|
<div class="relative flex flex-col md:flex-row w-full h-full">
|
|
|
|
|
<NavMenu />
|
2022-02-02 20:26:14 +01:00
|
|
|
|
2026-10-06 23:49:49 +02:00
|
|
|
<div class="block flex-1 relative w-full h-full">
|
|
|
|
|
<div class="block absolute overflow-y-auto w-full h-full p-3 md:py-4 md:pl-2 md:pr-4">
|
|
|
|
|
@Body
|
|
|
|
|
</div>
|
2022-02-14 01:51:52 +01:00
|
|
|
</div>
|
|
|
|
|
</div>
|
2026-10-03 15:26:21 +02:00
|
|
|
|
2026-10-06 23:49:49 +02:00
|
|
|
<ToastHost />
|
|
|
|
|
<PublicNoticeHost />
|
|
|
|
|
<ConfirmHost />
|
|
|
|
|
</CascadingValue>
|
|
|
|
|
|
|
|
|
|
@code {
|
|
|
|
|
[Inject] OverlayService Overlays { get; set; }
|
|
|
|
|
[Inject] NavigationManager Navigation { get; set; }
|
|
|
|
|
[Inject] AppStatusService Status { get; set; }
|
|
|
|
|
|
|
|
|
|
IDisposable changing;
|
|
|
|
|
|
|
|
|
|
protected override void OnInitialized() => changing = Navigation.RegisterLocationChangingHandler(OnLocationChanging);
|
|
|
|
|
|
|
|
|
|
async ValueTask OnLocationChanging(LocationChangingContext context)
|
|
|
|
|
{
|
|
|
|
|
var back = !context.IsNavigationIntercepted && Status.TookBack();
|
|
|
|
|
if (!Overlays.HasOpen)
|
|
|
|
|
return;
|
|
|
|
|
if (back)
|
|
|
|
|
{
|
|
|
|
|
context.PreventNavigation();
|
|
|
|
|
await Overlays.CloseTop(context.CancellationToken);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
await Overlays.CloseAll(context.CancellationToken);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void Dispose() => changing?.Dispose();
|
|
|
|
|
}
|