Skip to content

Commit

Permalink
Fix IsAllSelectedInDropdown is correct when disabled items exists (#1953
Browse files Browse the repository at this point in the history
)

added unit tests for it.
  • Loading branch information
nielsNocore authored Feb 10, 2025
1 parent 0b3c605 commit 23b9a6e
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 9 deletions.
60 changes: 55 additions & 5 deletions Radzen.Blazor.Tests/DropDownTests.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using AngleSharp.Dom;
using Bunit;
Expand All @@ -14,18 +15,20 @@ class DataItem
{
public string Text { get; set; }
public int Id { get; set; }
public bool Disabled { get; set; } = false;
}

private static IRenderedComponent<RadzenDropDown<T>> DropDown<T>(TestContext ctx, Action<ComponentParameterCollectionBuilder<RadzenDropDown<T>>> configure = null)
{
var data = new [] {
var data = new[] {
new DataItem { Text = "Item 1", Id = 1 },
new DataItem { Text = "Item 2", Id = 2 },
};

var component = ctx.RenderComponent<RadzenDropDown<T>>();

component.SetParametersAndRender(parameters => {
component.SetParametersAndRender(parameters =>
{
parameters.Add(p => p.Data, data);
parameters.Add(p => p.TextProperty, nameof(DataItem.Text));

Expand Down Expand Up @@ -100,7 +103,8 @@ public void DropDown_AppliesSelectionStyleForStringValue()

ctx.JSInterop.Mode = JSRuntimeMode.Loose;

var component = DropDown<string>(ctx, parameters => {
var component = DropDown<string>(ctx, parameters =>
{
parameters.Add(p => p.ValueProperty, nameof(DataItem.Text));
});

Expand All @@ -123,7 +127,8 @@ public void DropDown_Respects_ItemEqualityComparer()

List<DataItem> boundCollection = [new() { Text = "Item 2" }];

var component = DropDown<string>(ctx, parameters => {
var component = DropDown<string>(ctx, parameters =>
{
parameters.Add(p => p.ItemComparer, new DataItemComparer());
parameters.Add(p => p.Multiple, true);
parameters.Add(p => p.Value, boundCollection);
Expand All @@ -150,7 +155,8 @@ public void DropDown_AppliesSelectionStyleWhenMultipleSelectionIsEnabled()

ctx.JSInterop.Mode = JSRuntimeMode.Loose;

var component = DropDown<string>(ctx, parameters => {
var component = DropDown<string>(ctx, parameters =>
{
parameters.Add(p => p.ValueProperty, nameof(DataItem.Text));
parameters.Add(p => p.Multiple, true);
});
Expand Down Expand Up @@ -275,6 +281,50 @@ public void DropDown_AppliesValueTemplateOnMultipleSelectionChips()
Assert.Collection(selectedItems, item => Assert.Contains("value: Item 1", item.Text()), item => Assert.Contains("value: Item 2", item.Text()));
}

[Theory]
[InlineData(false, true, false, true, "false")]
[InlineData(true, false, true, false, "true")]
[InlineData(true, false, false, false, "false")]
[InlineData(true, false, false, true, "true")]
[InlineData(false, false, false, true, "false")]
public void DropDown_AllSelectedFalseIfListIsAllDisabled(bool item1Selected, bool item1Disabled, bool item2Selected, bool item2Disabled, string expectedAriaCheckedValue)
{
using var ctx = new TestContext();
ctx.JSInterop.Mode = JSRuntimeMode.Loose;

var data = new[] {
new DataItem { Text = "Item 1", Id = 1, Disabled = item1Disabled },
new DataItem { Text = "Item 2", Id = 2, Disabled = item2Disabled },
};

List<int> selectedValues = [];
if (item1Selected)
{
selectedValues.Add(data[0].Id);
}
if (item2Selected)
{
selectedValues.Add(data[1].Id);
}

var component = ctx.RenderComponent<RadzenDropDown<DataItem>>(parameters => parameters
.Add(p => p.Data, data)
.Add(p => p.Value, selectedValues)
.Add(p => p.Multiple, true)
.Add(p => p.AllowSelectAll, true)
.Add(p => p.TextProperty, nameof(DataItem.Text))
.Add(p => p.DisabledProperty, nameof(DataItem.Disabled))
.Add(p => p.ValueProperty, nameof(DataItem.Id)));

Assert.NotNull(component);
var highlightedItems = component.FindAll(".rz-state-highlight");
Assert.Equal(selectedValues.Count, highlightedItems.Count);


var selectAllCheckBox = component.Find(".rz-multiselect-header input[type='checkbox']");

Assert.Equal(expectedAriaCheckedValue, selectAllCheckBox.GetAttribute("aria-checked"));
}

class DataItemComparer : IEqualityComparer<DataItem>, IEqualityComparer<object>
{
Expand Down
10 changes: 6 additions & 4 deletions Radzen.Blazor/DropDownBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -341,15 +341,17 @@ protected virtual async System.Threading.Tasks.Task SelectAll()

internal bool IsAllSelected()
{
List<object> notDisabledItemsInList = View.Cast<object>().ToList()
.Where(i => disabledPropertyGetter == null || disabledPropertyGetter(i) as bool? != true)
.ToList();

if (LoadData.HasDelegate && !string.IsNullOrEmpty(ValueProperty))
{
return View != null && View.Cast<object>().ToList()
.Where(i => disabledPropertyGetter != null ? disabledPropertyGetter(i) as bool? != true : true)
return View != null && notDisabledItemsInList.Count > 0 && notDisabledItemsInList
.All(i => IsItemSelectedByValue(GetItemOrValueFromProperty(i, ValueProperty)));
}

return View != null && selectedItems.Count == View.Cast<object>().ToList()
.Where(i => disabledPropertyGetter != null ? disabledPropertyGetter(i) as bool? != true : true).Count();
return View != null && notDisabledItemsInList.Count > 0 && selectedItems.Count == notDisabledItemsInList.Count;
}

/// <summary>
Expand Down

0 comments on commit 23b9a6e

Please sign in to comment.