feat(ui): promote Excel export to a top-level destination

- Add an /export hub page that hosts the existing (date-range, not event-specific)
  ExportDialog, so export is no longer reachable only by opening an event detail.
- Add an Export entry under the System nav section.
This commit is contained in:
2026-05-28 22:46:38 +03:00
parent 0e3c4b8d47
commit 4dae9e8d0d
2 changed files with 62 additions and 0 deletions
+4
View File
@@ -53,6 +53,10 @@
</NavLink> </NavLink>
<div class="m-nav__group" style="margin-top: var(--m-space-5);">@L["Nav.Section.System"]</div> <div class="m-nav__group" style="margin-top: var(--m-space-5);">@L["Nav.Section.System"]</div>
<NavLink class="m-nav__link" href="export">
<MudIcon Icon="@Icons.Material.Outlined.FileDownload" Size="Size.Small" />
<span>@L["Nav.Export"]</span>
</NavLink>
<NavLink class="m-nav__link" href="settings"> <NavLink class="m-nav__link" href="settings">
<MudIcon Icon="@Icons.Material.Outlined.Tune" Size="Size.Small" /> <MudIcon Icon="@Icons.Material.Outlined.Tune" Size="Size.Small" />
<span>@L["Nav.Settings"]</span> <span>@L["Nav.Settings"]</span>
@@ -0,0 +1,58 @@
@*
ExportHub — a top-level home for the Excel export so it is no longer gated
behind opening a single event's detail page. Hosts the shared ExportDialog
(date range + kind) which is not event-specific.
*@
@page "/export"
@inject IStringLocalizer<SharedResource> L
@inject IDialogService Dialog
@inject ISnackbar Snackbar
<PageTitle>@L["App.Title"] · @L["Export.Title"]</PageTitle>
<section class="m-shell">
<header class="m-rise m-rise-1" style="display: grid; gap: var(--m-space-3); max-width: 880px;">
<span class="m-kicker">@L["Export.Kicker"]</span>
<h1 class="m-display" style="font-size: clamp(2rem, 4vw, 3rem);">@L["Export.Title"]</h1>
<p style="color: var(--m-c-ink-soft); max-width: 60ch;">@L["Export.Hub.Lede"]</p>
</header>
<hr class="m-rule--double" />
<div class="m-rise m-rise-2" style="display: grid; gap: var(--m-space-3);">
<div>
<button type="button" class="m-chip" @onclick="OpenExportDialog" data-test="export-hub-open">
@L["Export.Hub.Action"] →
</button>
</div>
<span class="m-mono" style="font-size: 0.75rem; color: var(--m-c-ink-soft); letter-spacing: 0.08em;">
@L["Export.Hub.FilenameHint"]
</span>
</div>
</section>
@code {
private async Task OpenExportDialog()
{
var parameters = new DialogParameters
{
["InitialFrom"] = MoscowTime.Now.Date.AddDays(-7),
["InitialTo"] = MoscowTime.Now.Date,
};
var options = new DialogOptions
{
CloseOnEscapeKey = true,
FullWidth = true,
MaxWidth = MaxWidth.Small,
};
var reference = await Dialog.ShowAsync<ExportDialog>(L["Export.Title"], parameters, options);
var result = await reference.Result;
if (result is { Canceled: false, Data: string path })
{
Snackbar.Add(string.Format(CultureInfo.CurrentCulture, L["Export.Success"].Value, path), Severity.Success);
}
}
}