@page "/dashboard" @page "/dashboards/{DashboardId?}" @implements IAsyncDisposable @inject Microsoft.Extensions.Configuration.IConfiguration Configuration @inject NavigationManager Navigation @inject DashboardApiClient DashboardApi Dashboards
@(IsDesigner ? "Zum Viewer wechseln" : "Zum Designer wechseln")
@code { [Parameter] public string? DashboardId { get; set; } [SupplyParameterFromQuery] public string? Mode { get; set; } private readonly List dashboards = new(); private HubConnection? _hubConnection; private bool IsDesigner => !string.Equals(Mode, "viewer", StringComparison.OrdinalIgnoreCase); private WorkingMode CurrentMode => IsDesigner ? WorkingMode.Designer : WorkingMode.ViewerOnly; private string SelectedDashboardId { get; set; } = string.Empty; private string DashboardKey => $"{SelectedDashboardId}-{(IsDesigner ? "designer" : "viewer")}"; private string DashboardEndpoint => $"{Configuration["ApiBaseUrl"]?.TrimEnd('/')}/api/dashboard"; private string HubEndpoint => $"{Configuration["ApiBaseUrl"]?.TrimEnd('/')}/hubs/dashboards"; protected override async Task OnInitializedAsync() { await RefreshDashboards(); _hubConnection = new HubConnectionBuilder() .WithUrl(HubEndpoint) .WithAutomaticReconnect() .Build(); _hubConnection.On("DashboardsChanged", async () => { await RefreshDashboards(); }); await _hubConnection.StartAsync(); } protected override async Task OnParametersSetAsync() { if (dashboards.Count == 0) { await RefreshDashboards(); } var requestedId = string.IsNullOrWhiteSpace(DashboardId) || string.Equals(DashboardId, "default", StringComparison.OrdinalIgnoreCase) ? null : DashboardId; var resolved = !string.IsNullOrWhiteSpace(requestedId) ? dashboards.FirstOrDefault(d => string.Equals(d.Id, requestedId, StringComparison.OrdinalIgnoreCase)) : dashboards.FirstOrDefault(d => string.Equals(d.Id, "DefaultDashboard", StringComparison.OrdinalIgnoreCase)) ?? dashboards.FirstOrDefault(); if (resolved == null) { return; } SelectedDashboardId = resolved.Id; if (!string.Equals(DashboardId, resolved.Id, StringComparison.OrdinalIgnoreCase)) { Navigation.NavigateTo($"dashboards/{resolved.Id}?mode={(IsDesigner ? "designer" : "viewer")}", replace: true); } } private void ToggleMode() { var targetMode = IsDesigner ? "viewer" : "designer"; Navigation.NavigateTo($"dashboards/{SelectedDashboardId}?mode={targetMode}", replace: true); } private async Task RefreshDashboards() { var latest = await DashboardApi.GetAllAsync(); if (latest.Count == dashboards.Count && latest.All(d => dashboards.Any(x => x.Id == d.Id && x.Name == d.Name))) { return; } dashboards.Clear(); dashboards.AddRange(latest); await InvokeAsync(StateHasChanged); } public async ValueTask DisposeAsync() { if (_hubConnection != null) { await _hubConnection.DisposeAsync(); } } }