File: Components\Controls\Chart\ChartFilters.razor.cs
Web Access
Project: src\src\Aspire.Dashboard\Aspire.Dashboard.csproj (Aspire.Dashboard)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Immutable;
using Aspire.Dashboard.Model;
using Aspire.Dashboard.Otlp.Model;
using Microsoft.AspNetCore.Components;
 
namespace Aspire.Dashboard.Components;
 
public partial class ChartFilters
{
    private readonly Guid _idSuffix = Guid.NewGuid();
    private readonly HashSet<string> _openFilterNames = [];
 
    [Parameter, EditorRequired]
    public required OtlpInstrumentType InstrumentType { get; set; }
 
    [Parameter, EditorRequired]
    public required bool ShowCount { get; set; }
 
    [Parameter]
    public EventCallback<bool> ShowCountChanged { get; set; }
 
    [Parameter, EditorRequired]
    public required ImmutableList<DimensionFilterViewModel> DimensionFilters { get; set; }
 
    [Parameter]
    public EventCallback<DimensionFilterViewModel> OnDimensionValuesChanged { get; set; }
 
    private string GetFilterButtonId(DimensionFilterViewModel filter) => $"typeFilterButton-{filter.SanitizedHtmlId}-{filter.NameHash}-{_idSuffix}";
 
    private bool IsPopupOpen(DimensionFilterViewModel filter) => _openFilterNames.Contains(filter.Name);
 
    private void TogglePopup(DimensionFilterViewModel filter) => SetPopupOpen(filter, !IsPopupOpen(filter));
 
    private void ShowPopup(DimensionFilterViewModel filter) => SetPopupOpen(filter, opened: true);
 
    private void SetPopupOpen(DimensionFilterViewModel filter, bool opened)
    {
        if (opened)
        {
            _openFilterNames.Add(filter.Name);
        }
        else
        {
            _openFilterNames.Remove(filter.Name);
        }
    }
 
    private Task OnFilterSelectionChangedAsync(DimensionFilterViewModel filter) => OnDimensionValuesChanged.InvokeAsync(filter);
 
    private Task OnShowCountChangedAsync(bool value) => ShowCountChanged.InvokeAsync(value);
}