Skip to content

fix: OnParameterSet should not set internal value when multiple is enabled in ListComponentBase #3834

@Tyme-Bleyaert

Description

@Tyme-Bleyaert

🐛 Bug Report

When setting a custom collection yourself with FluentSelect and multiple enabled, the collection gets overriden because of the internal value of single select gets set.

💻 Repro or Code Sample

<FluentSelect TOption="Issues" Multiple="true" Items="_allIssues" SelectedOptions="FlagsAsEnumerable" SelectedOptionsChanged="OnSelectionChanged">
    <OptionTemplate>
            @context.ToString()
    </OptionTemplate>
</FluentSelect>

@code{
    private Issues _issues;

    [Parameter]
    public Issues Values { get; set; }

    [Parameter]
    public EventCallback<Issues> ValuesChanged { get; set; }

    [Flags]
    public enum Issues 
    {
        NoIssues = 0,
        FullyBroken = NoIssues << 1,
        SettingsMissing = FullyBroken << 1,
        MaintenanceNeeded = SettingsMissing << 1,

    }
    private readonly static Issues[] _allIssues = Enum.GetValues<Issues>();

    protected override void OnParametersSet()
    {
        _issues = Values;
        base.OnParametersSet();
    }

    protected IEnumerable<Issues> FlagsAsEnumerable
    {
        get
        {
            if (_issues == Issues.NoIssues)
                return [Issues.NoIssues];

            if (_issues == Issues.FullyBroken)
                return [Issues.FullyBroken];

            return _allIssues.Where(e => _issues.HasFlag(e) && e != Issues.NoIssues && e != Issues.FullyBroken);
        }
    }

    private Task OnSelectionChanged(IEnumerable<Issues> issues)
    {
        if (issues.Contains(IssueTypes.None) && _issues != Issues.NoIssues)
            _issues = Issues.NoIssues;
        else if (issues.Contains(IssueTypes.Defect) && _issues != Issues.FullyBroken)
            _issues = Issues.FullyBroken;
        else
            _issues = issues.Aggregate(default(Issues), (a, b) => a |= b);

        return ValuesChanged.InvokeAsync(_issues);
    }
}

🤔 Expected Behavior

I can choose the selected values and ListComponentBase should not override them.

😯 Current Behavior

The values changed gets raised before the new values are set.

💁 Possible Solution

🔦 Context

The component does not work correctly in its current state.

🌍 Your Environment

Metadata

Metadata

Assignees

No one assigned

    Labels

    triageNew issue. Needs to be looked at

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions