Skip to content

Commit ece0c54

Browse files
authored
Autocomplete: fix multi selection when ReadData is used (#6303)
1 parent f5119e3 commit ece0c54

File tree

2 files changed

+74
-11
lines changed

2 files changed

+74
-11
lines changed

Source/Extensions/Blazorise.Components/Autocomplete.razor.cs

Lines changed: 41 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -775,20 +775,26 @@ private async Task RemoveMultipleText( string text )
775775
if ( SelectedTexts is null )
776776
return;
777777

778-
SelectedTexts.Remove( text );
779-
await SelectedTextsChanged.InvokeAsync( SelectedTexts );
778+
var removed = SelectedTexts.Remove( text );
780779

781-
if ( SelectionMode == AutocompleteSelectionMode.Multiple )
782-
DirtyFilter();
780+
if ( removed )
781+
{
782+
await SelectedTextsChanged.InvokeAsync( SelectedTexts );
783+
784+
if ( SelectionMode == AutocompleteSelectionMode.Multiple )
785+
DirtyFilter();
786+
}
783787
}
784788

785789
private async Task RemoveMultipleValue( TValue value )
786790
{
787791
if ( SelectedValues is null )
788792
return;
789793

790-
SelectedValues.Remove( value );
791-
await SelectedValuesChanged.InvokeAsync( SelectedValues );
794+
var removed = SelectedValues.Remove( value );
795+
796+
if ( removed )
797+
await SelectedValuesChanged.InvokeAsync( SelectedValues );
792798
}
793799

794800
/// <summary>
@@ -814,8 +820,10 @@ public async Task RemoveMultipleTextAndValue( string text )
814820
if ( Disabled )
815821
return;
816822

823+
var selectedValue = GetValueByText( text );
824+
817825
await RemoveMultipleText( text );
818-
await RemoveMultipleValue( GetValueByText( text ) );
826+
await RemoveMultipleValue( selectedValue );
819827

820828
if ( ( validationRef.ParentValidations?.Mode ?? ValidationMode.Auto ) == ValidationMode.Auto )
821829
await validationRef.ValidateAsync();
@@ -830,7 +838,17 @@ public async Task RemoveMultipleTextAndValue( string text )
830838
/// <returns></returns>
831839
public async Task RemoveMultipleTextAndValue( TValue value )
832840
{
833-
await RemoveMultipleText( GetItemText( value ) );
841+
var text = GetItemText( value );
842+
843+
if ( string.IsNullOrEmpty( text ) && SelectedValues is not null && SelectedTexts is not null )
844+
{
845+
var selectedValueIndex = SelectedValues.IndexOf( value );
846+
847+
if ( selectedValueIndex > -1 && selectedValueIndex < SelectedTexts.Count )
848+
text = SelectedTexts[selectedValueIndex];
849+
}
850+
851+
await RemoveMultipleText( text );
834852
await RemoveMultipleValue( value );
835853

836854
if ( ( validationRef.ParentValidations?.Mode ?? ValidationMode.Auto ) == ValidationMode.Auto )
@@ -1190,9 +1208,21 @@ public IEnumerable<TItem> GetItemsByText( string text )
11901208
/// <param name="text"></param>
11911209
/// <returns></returns>
11921210
private TValue GetValueByText( string text )
1193-
=> SelectedValues is not null
1194-
? SelectedValues.FirstOrDefault( x => GetItemText( x ) == text )
1195-
: default;
1211+
{
1212+
if ( SelectedValues is not null && SelectedTexts is not null )
1213+
{
1214+
var selectedValueIndex = SelectedTexts.IndexOf( text );
1215+
1216+
if ( selectedValueIndex > -1 && selectedValueIndex < SelectedValues.Count )
1217+
return SelectedValues[selectedValueIndex];
1218+
}
1219+
1220+
var item = GetItemByText( text );
1221+
1222+
return item is null
1223+
? default
1224+
: GetItemValue( item );
1225+
}
11961226

11971227
private Color GetMultipleBadgeColor() => Disabled
11981228
? MultipleDisabledBadgeColor

Tests/Blazorise.Tests/Components/AutocompleteMultipleReadDataComponentTest.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#region Using directives
2+
using System.Linq;
23
using System.Threading.Tasks;
4+
using Bunit;
35
using Xunit;
46
#endregion
57

@@ -54,4 +56,35 @@ public Task RemoveValues_ShouldRemove( string[] startTexts, string[] removeTexts
5456
{
5557
return TestRemoveValues<AutocompleteMultipleReadDataComponent>( startTexts, removeTexts, expectedTexts );
5658
}
59+
60+
[Fact]
61+
public async Task RemovePreviousSelection_WhenLastReadDataDoesNotContainIt_ShouldKeepRemainingSelection()
62+
{
63+
var comp = RenderComponent<AutocompleteMultipleReadDataComponent>( parameters =>
64+
parameters.Add( p => p.MinLength, 0 ) );
65+
66+
var autoComplete = comp.Find( ".b-is-autocomplete input" );
67+
68+
await autoComplete.FocusAsync( new() );
69+
await autoComplete.InputAsync( "Antarctica" );
70+
AutocompleteBaseComponentTest.WaitAndClickfirstOption( comp, "Antarctica", true );
71+
72+
await autoComplete.FocusAsync( new() );
73+
await autoComplete.InputAsync( "Zambia" );
74+
AutocompleteBaseComponentTest.WaitAndClickfirstOption( comp, "Zambia", true );
75+
76+
var badges = comp.FindAll( ".b-is-autocomplete .badge" );
77+
var badgeToRemove = badges.Single( x => x.TextContent.Replace( "×", "" ) == "Antarctica" );
78+
var removeButton = badgeToRemove.GetElementsByTagName( "span" )[0];
79+
await removeButton.ClickAsync( new() );
80+
81+
comp.WaitForAssertion( () =>
82+
{
83+
badges.Refresh();
84+
Assert.Single( badges );
85+
Assert.Equal( "Zambia", badges[0].TextContent.Replace( "×", "" ) );
86+
Assert.Equal( new[] { "Zambia" }, comp.Instance.SelectedTexts );
87+
Assert.Equal( new[] { "ZM" }, comp.Instance.SelectedValues );
88+
}, TestExtensions.WaitTime );
89+
}
5790
}

0 commit comments

Comments
 (0)