From 4dae9e8d0d07508d693ef4d38e9b93db3db6b9ad Mon Sep 17 00:00:00 2001 From: "alexei.dolgolyov" Date: Thu, 28 May 2026 22:46:38 +0300 Subject: [PATCH] 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. --- src/Marathon.UI/Components/NavBody.razor | 4 ++ src/Marathon.UI/Pages/Export/ExportHub.razor | 58 ++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 src/Marathon.UI/Pages/Export/ExportHub.razor diff --git a/src/Marathon.UI/Components/NavBody.razor b/src/Marathon.UI/Components/NavBody.razor index ae99beb..afe1e97 100644 --- a/src/Marathon.UI/Components/NavBody.razor +++ b/src/Marathon.UI/Components/NavBody.razor @@ -53,6 +53,10 @@ + + + @L["Nav.Export"] + @L["Nav.Settings"] diff --git a/src/Marathon.UI/Pages/Export/ExportHub.razor b/src/Marathon.UI/Pages/Export/ExportHub.razor new file mode 100644 index 0000000..729c0f7 --- /dev/null +++ b/src/Marathon.UI/Pages/Export/ExportHub.razor @@ -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 L +@inject IDialogService Dialog +@inject ISnackbar Snackbar + +@L["App.Title"] · @L["Export.Title"] + +
+
+ @L["Export.Kicker"] +

@L["Export.Title"]

+

@L["Export.Hub.Lede"]

+
+ +
+ +
+
+ +
+ + @L["Export.Hub.FilenameHint"] + +
+
+ +@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(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); + } + } +}