Skip to content

Commit 80419bf

Browse files
authored
ComboBox bugfix: ArgumentOutOfRangeException (#312)
* Bugfix: ArgumentOutOfRangeException * Obsoleted ActivateXxx methods
1 parent f8039bf commit 80419bf

2 files changed

Lines changed: 59 additions & 58 deletions

File tree

CodeBeam.MudBlazor.Extensions.UnitTests/Components/ComboboxTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,12 +263,12 @@ public async Task Combobox_MultiSelectEditable()
263263
comp.WaitForAssertion(() => comp.Find("div.mud-popover").ClassList.Should().NotContain("d-none"));
264264
// now click an item and see the value change
265265
comp.WaitForAssertion(() => comp.FindAll("div.mud-combobox-item").Count.Should().Be(4));
266-
comp.WaitForAssertion(() => combobox.Instance.GetEligibleAndNonDisabledItems().Count.Should().Be(4));
266+
comp.WaitForAssertion(() => combobox.Instance.GetEnabledAndEligibleItems().Count.Should().Be(4));
267267
var items = comp.FindAll("div.mud-combobox-item").ToArray();
268268
await comp.InvokeAsync(() => combobox.Instance.HandleInternalValueChanged("t"));
269269
await comp.InvokeAsync(() => combobox.Instance.ForceRenderItems());
270270
items = comp.FindAll("div.mud-combobox-item").ToArray();
271-
comp.WaitForAssertion(() => combobox.Instance.GetEligibleAndNonDisabledItems().Count.Should().Be(2));
271+
comp.WaitForAssertion(() => combobox.Instance.GetEnabledAndEligibleItems().Count.Should().Be(2));
272272
}
273273

274274
/// <summary>

CodeBeam.MudBlazor.Extensions/Components/ComboBox/MudComboBox.razor.cs

Lines changed: 57 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -758,7 +758,7 @@ protected internal async void HandleKeyDown(KeyboardEventArgs obj)
758758
var key = obj.Key.ToLowerInvariant();
759759
if (Editable == false && key.Length == 1 && key != " " && !(obj.CtrlKey || obj.ShiftKey || obj.AltKey || obj.MetaKey))
760760
{
761-
await ActiveFirstItem(key);
761+
await ActivateFirstItem(key);
762762
return;
763763
}
764764

@@ -782,10 +782,10 @@ protected internal async void HandleKeyDown(KeyboardEventArgs obj)
782782
}
783783
break;
784784
case "Home":
785-
await ActiveFirstItem();
785+
await ActivateFirstItem();
786786
break;
787787
case "End":
788-
await ActiveLastItem();
788+
await ActivateLastItem();
789789
break;
790790
case "ArrowUp":
791791
if (obj.AltKey)
@@ -798,7 +798,7 @@ protected internal async void HandleKeyDown(KeyboardEventArgs obj)
798798
}
799799
else
800800
{
801-
await ActiveAdjacentItem(-1);
801+
await ActivateAdjacentItem(-1);
802802
}
803803
break;
804804
case "ArrowDown":
@@ -812,7 +812,7 @@ protected internal async void HandleKeyDown(KeyboardEventArgs obj)
812812
}
813813
else
814814
{
815-
await ActiveAdjacentItem(1);
815+
await ActivateAdjacentItem(1);
816816
}
817817
break;
818818
case " ":
@@ -875,7 +875,7 @@ protected internal async Task SearchBoxHandleKeyDown(KeyboardEventArgs obj)
875875
HandleKeyDown(obj);
876876
break;
877877
case "Tab":
878-
await ActiveFirstItem();
878+
await ActivateFirstItem();
879879
await FocusAsync();
880880
StateHasChanged();
881881
break;
@@ -1263,7 +1263,7 @@ protected internal async Task ForceUpdateItems()
12631263

12641264
protected int GetActiveProperItemIndex()
12651265
{
1266-
var properItems = GetEligibleAndNonDisabledItems();
1266+
var properItems = GetEnabledAndEligibleItems();
12671267
if (properItems.Any())
12681268
{
12691269
if (_lastActivatedItem == null)
@@ -1306,72 +1306,77 @@ protected void DeactiveAllItems()
13061306
}
13071307
}
13081308

1309-
public async Task ActiveFirstItem(string startChar = null)
1309+
[Obsolete("Please use ActivateFirstItem() method")]
1310+
public Task ActiveFirstItem(string startChar = null) => ActivateFirstItem(startChar);
1311+
public async Task ActivateFirstItem(string startsWith = null)
13101312
{
1311-
if (Items == null || Items.Count == 0 || Items[0].Disabled)
1312-
{
1313+
var item = Items.FirstOrDefault();
1314+
if (item is null || item.Disabled)
13131315
return;
1314-
}
1316+
13151317
DeactiveAllItems();
1316-
var properItems = GetEligibleAndNonDisabledItems();
1317-
if (string.IsNullOrWhiteSpace(startChar))
1318+
if (string.IsNullOrWhiteSpace(startsWith))
13181319
{
1319-
properItems[0].SetActive(true);
1320-
_lastActivatedItem = properItems[0];
1321-
await ScrollToMiddleAsync(Items[0]);
1320+
item = GetEnabledAndEligibleItems().FirstOrDefault();
1321+
if (item is not null)
1322+
{
1323+
item.SetActive(true);
1324+
await ScrollToMiddleAsync(item);
1325+
}
1326+
_lastActivatedItem = item;
13221327
return;
13231328
}
13241329

1325-
if (Editable == true)
1326-
{
1330+
if (Editable)
13271331
return;
1328-
}
13291332

1330-
// find first item that starts with the letter
1331-
var possibleItems = Items.Where(x => (x.Text ?? Converter.Set(x.Value) ?? string.Empty).StartsWith(startChar, StringComparison.OrdinalIgnoreCase)).ToList();
1332-
if (possibleItems == null || !possibleItems.Any())
1333+
var foundItems = Items.Where(x => (x.Text ?? Converter.Set(x.Value) ?? string.Empty).StartsWith(startsWith, StringComparison.OrdinalIgnoreCase)).ToList();
1334+
if (!foundItems.Any())
13331335
{
1334-
if (_lastActivatedItem == null)
1336+
if (_lastActivatedItem is not null)
13351337
{
1336-
return;
1338+
_lastActivatedItem.SetActive(true);
1339+
await ScrollToMiddleAsync(_lastActivatedItem);
13371340
}
1338-
_lastActivatedItem.SetActive(true);
1339-
await ScrollToMiddleAsync(_lastActivatedItem);
13401341
return;
13411342
}
13421343

1343-
var theItem = possibleItems.FirstOrDefault(x => x == _lastActivatedItem);
1344-
if (theItem == null)
1344+
item = foundItems.FirstOrDefault(x => x == _lastActivatedItem);
1345+
if (item is null)
13451346
{
1346-
possibleItems[0].SetActive(true);
1347-
_lastActivatedItem = possibleItems[0];
1348-
await ScrollToMiddleAsync(possibleItems[0]);
1347+
item = foundItems[0];
1348+
item.SetActive(true);
1349+
await ScrollToMiddleAsync(item);
1350+
_lastActivatedItem = item;
13491351
return;
13501352
}
13511353

1352-
if (theItem == possibleItems.LastOrDefault())
1354+
if (item == foundItems.LastOrDefault())
13531355
{
1354-
possibleItems[0].SetActive(true);
1355-
_lastActivatedItem = possibleItems[0];
1356-
await ScrollToMiddleAsync(possibleItems[0]);
1356+
item = foundItems[0];
1357+
item.SetActive(true);
1358+
await ScrollToMiddleAsync(item);
1359+
_lastActivatedItem = item;
13571360
}
13581361
else
13591362
{
1360-
var item = possibleItems[possibleItems.IndexOf(theItem) + 1];
1363+
item = foundItems[foundItems.IndexOf(item) + 1];
13611364
item.SetActive(true);
1362-
_lastActivatedItem = item;
13631365
await ScrollToMiddleAsync(item);
1366+
_lastActivatedItem = item;
13641367
}
13651368
}
13661369

1367-
public async Task ActiveAdjacentItem(int changeCount)
1370+
[Obsolete("Please use ActivateAdjacentItem() method")]
1371+
public Task ActiveAdjacentItem(int changeCount) => ActivateAdjacentItem(changeCount);
1372+
public async Task ActivateAdjacentItem(int changeCount)
13681373
{
13691374
if (Items == null || Items.Count == 0)
13701375
{
13711376
return;
13721377
}
13731378

1374-
var properItems = GetEligibleAndNonDisabledItems();
1379+
var properItems = GetEnabledAndEligibleItems();
13751380
int index = GetActiveProperItemIndex();
13761381
if (index + changeCount >= properItems.Count || 0 > index + changeCount)
13771382
{
@@ -1385,31 +1390,27 @@ public async Task ActiveAdjacentItem(int changeCount)
13851390
await ScrollToMiddleAsync(Items[index + changeCount]);
13861391
}
13871392

1388-
public async Task ActiveLastItem()
1393+
[Obsolete("Please use ActivateLastItem() method")]
1394+
public Task ActiveLastItem() => ActivateLastItem();
1395+
public async Task ActivateLastItem()
13891396
{
13901397
if (!(Items.Count > 0))
13911398
return;
13921399

13931400
DeactiveAllItems();
1394-
var properItems = GetEligibleAndNonDisabledItems();
1395-
var lastItem = properItems.LastOrDefault();
1396-
lastItem?.SetActive(true);
1397-
_lastActivatedItem = lastItem;
1398-
1399-
if (_lastActivatedItem is not null)
1400-
await ScrollToMiddleAsync(_lastActivatedItem);
1401-
}
1402-
1403-
#endregion
1404-
1405-
protected internal List<MudComboBoxItem<T>> GetEligibleAndNonDisabledItems()
1406-
{
1407-
if (Items == null)
1401+
var item = GetEnabledAndEligibleItems().LastOrDefault();
1402+
if (item is not null)
14081403
{
1409-
return new();
1404+
item.SetActive(true);
1405+
await ScrollToMiddleAsync(item);
14101406
}
1411-
return Items.Where(x => x.Eligible == true && x.Disabled == false).ToList();
1407+
_lastActivatedItem = item;
14121408
}
1409+
1410+
#endregion
1411+
1412+
protected internal List<MudComboBoxItem<T>> GetEnabledAndEligibleItems() => Items.Where(x => !x.Disabled && x.Eligible).ToList();
1413+
14131414

14141415
protected bool HasEligibleItems()
14151416
{

0 commit comments

Comments
 (0)