+
+
+ @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);
+ }
+ }
+}