d5419729e5
- MudBlazor theme (dark default) + responsive drawer/appbar layout + nav. - DashboardService read model: KPIs with period-over-period deltas, category breakdown, "what cost more/less" difference view, monthly trends. - Pages: Overview (KPI cards + DeltaChip + donut + difference table), Trends (range-select bar chart), Meters (list + source status), Import (load reference dataset + CSV dry-run preview), Admin (energy types, tariffs). Charts isolated into components to avoid the ApexCharts/MudBlazor Color/Format name clashes. - ReferenceDataImporter: one-click load of all four sheets as a starter dataset (meters, tank, tariff history, category memberships) — bundled sample CSVs copied to app output. - End-to-end render test: import creates meters + consumption; overview/meters/trends/ import/admin pages all return 200 with KPI cards rendered. 92 tests green (56 Core + 36 integration). Deferred to polish: dedicated PV & oil/consumable panels, meter-detail page, full admin CRUD, prev-year trend overlay. Claude-Session: https://claude.ai/code/session_01WujdMtMJPbxDpDnMeK22rr
41 lines
1.3 KiB
Plaintext
41 lines
1.3 KiB
Plaintext
@inherits LayoutComponentBase
|
|
@using MeterVault.App.Theme
|
|
|
|
<MudThemeProvider Theme="MeterVaultTheme.Instance" @bind-IsDarkMode="_darkMode" />
|
|
<MudPopoverProvider />
|
|
<MudDialogProvider />
|
|
<MudSnackbarProvider />
|
|
|
|
<MudLayout>
|
|
<MudAppBar Elevation="1" Dense="true">
|
|
<MudIcon Icon="@Icons.Material.Filled.Bolt" Class="mr-2" />
|
|
<MudText Typo="Typo.h6">MeterVault</MudText>
|
|
<MudSpacer />
|
|
<MudTooltip Text="@(_darkMode ? "Light mode" : "Dark mode")">
|
|
<MudIconButton Icon="@(_darkMode ? Icons.Material.Filled.LightMode : Icons.Material.Filled.DarkMode)"
|
|
Color="Color.Inherit" OnClick="@(() => _darkMode = !_darkMode)" />
|
|
</MudTooltip>
|
|
</MudAppBar>
|
|
|
|
<MudDrawer @bind-Open="_drawerOpen" Elevation="1" ClipMode="DrawerClipMode.Always" Variant="DrawerVariant.Responsive">
|
|
<NavMenu />
|
|
</MudDrawer>
|
|
|
|
<MudMainContent>
|
|
<MudContainer MaxWidth="MaxWidth.False" Class="pa-4 mv-main">
|
|
@Body
|
|
</MudContainer>
|
|
</MudMainContent>
|
|
</MudLayout>
|
|
|
|
<div id="blazor-error-ui" data-nosnippet>
|
|
An unhandled error has occurred.
|
|
<a href="." class="reload">Reload</a>
|
|
<span class="dismiss">🗙</span>
|
|
</div>
|
|
|
|
@code {
|
|
private bool _drawerOpen = true;
|
|
private bool _darkMode = true;
|
|
}
|