diff --git a/docs/CodeBeam.MudBlazor.Extensions.Docs.Wasm/wwwroot/CodeBeam.MudBlazor.Extensions.xml b/docs/CodeBeam.MudBlazor.Extensions.Docs.Wasm/wwwroot/CodeBeam.MudBlazor.Extensions.xml index 600b4649..dabdd227 100644 --- a/docs/CodeBeam.MudBlazor.Extensions.Docs.Wasm/wwwroot/CodeBeam.MudBlazor.Extensions.xml +++ b/docs/CodeBeam.MudBlazor.Extensions.Docs.Wasm/wwwroot/CodeBeam.MudBlazor.Extensions.xml @@ -995,12 +995,6 @@ - - - - - - @@ -4164,12 +4158,6 @@ - - - - - - diff --git a/docs/CodeBeam.MudBlazor.Extensions.Docs/CodeBeam.MudBlazor.Extensions.Docs.csproj b/docs/CodeBeam.MudBlazor.Extensions.Docs/CodeBeam.MudBlazor.Extensions.Docs.csproj index a1c691a6..329de389 100644 --- a/docs/CodeBeam.MudBlazor.Extensions.Docs/CodeBeam.MudBlazor.Extensions.Docs.csproj +++ b/docs/CodeBeam.MudBlazor.Extensions.Docs/CodeBeam.MudBlazor.Extensions.Docs.csproj @@ -14,7 +14,7 @@ - + diff --git a/docs/CodeBeam.MudBlazor.Extensions.Docs/Pages/Components/ListExtended/Examples/ListExtendedExample3.razor b/docs/CodeBeam.MudBlazor.Extensions.Docs/Pages/Components/ListExtended/Examples/ListExtendedExample3.razor index 028aeea0..6b704aab 100644 --- a/docs/CodeBeam.MudBlazor.Extensions.Docs/Pages/Components/ListExtended/Examples/ListExtendedExample3.razor +++ b/docs/CodeBeam.MudBlazor.Extensions.Docs/Pages/Components/ListExtended/Examples/ListExtendedExample3.razor @@ -30,7 +30,7 @@ - + @foreach (var item in _list?.GetItems() ?? new()) { @item.Text @@ -57,8 +57,16 @@ MudListExtended? _list; int? _selectedValue = 1; IEnumerable _selectedValues = new List(); + IReadOnlyCollection _mSelectedValues; MudListItemExtended? _selectedItem; MudListItemExtended _thirdItem = new(); MudListItemExtended _fifthItem = new(); IEnumerable> _selectedItems = new List>(); + + protected override void OnInitialized() + { + base.OnInitialized(); + _mSelectedValues = _selectedValues as IReadOnlyCollection ?? _selectedValues.ToList(); + } + } \ No newline at end of file diff --git a/src/CodeBeam.MudBlazor.Extensions/CodeBeam.MudBlazor.Extensions.csproj b/src/CodeBeam.MudBlazor.Extensions/CodeBeam.MudBlazor.Extensions.csproj index bf6dc8aa..e10a8969 100644 --- a/src/CodeBeam.MudBlazor.Extensions/CodeBeam.MudBlazor.Extensions.csproj +++ b/src/CodeBeam.MudBlazor.Extensions/CodeBeam.MudBlazor.Extensions.csproj @@ -45,12 +45,10 @@ - + - + diff --git a/src/CodeBeam.MudBlazor.Extensions/Components/ComboBox/MudComboBox.razor.cs b/src/CodeBeam.MudBlazor.Extensions/Components/ComboBox/MudComboBox.razor.cs index e8dfcd5a..831d8ada 100644 --- a/src/CodeBeam.MudBlazor.Extensions/Components/ComboBox/MudComboBox.razor.cs +++ b/src/CodeBeam.MudBlazor.Extensions/Components/ComboBox/MudComboBox.razor.cs @@ -749,7 +749,7 @@ protected override void OnInitialized() else if (MultiSelection && SelectedValues != null) { // TODO: Check this line again - SetValueAsync(SelectedValues.FirstOrDefault()).CatchAndLog(); + SetValueCoreAsync(SelectedValues.FirstOrDefault()).CatchAndLog(); } } @@ -1285,22 +1285,6 @@ protected void DeselectAllItems() } } - /// - /// - /// - /// - public override async Task ForceUpdate() - { - await base.ForceUpdate(); - if (!MultiSelection) - { - SelectedValues = new HashSet(_comparer) { Value }; - } - else - { - await SelectedValuesChanged.InvokeAsync(new HashSet(SelectedValues, _comparer)); - } - } /// /// diff --git a/src/CodeBeam.MudBlazor.Extensions/Components/DateWheelPicker/MudDateWheelPicker.razor.cs b/src/CodeBeam.MudBlazor.Extensions/Components/DateWheelPicker/MudDateWheelPicker.razor.cs index 919c44b0..20fe83a6 100644 --- a/src/CodeBeam.MudBlazor.Extensions/Components/DateWheelPicker/MudDateWheelPicker.razor.cs +++ b/src/CodeBeam.MudBlazor.Extensions/Components/DateWheelPicker/MudDateWheelPicker.razor.cs @@ -573,7 +573,7 @@ protected string NumberToString(int val) /// public async Task Clear() { - await SetValueAsync(null); + await SetValueCoreAsync(null); await InputReference.SetText(null); } diff --git a/src/CodeBeam.MudBlazor.Extensions/Components/PasswordField/MudPasswordField.razor.cs b/src/CodeBeam.MudBlazor.Extensions/Components/PasswordField/MudPasswordField.razor.cs index f90bd4ca..0168e440 100644 --- a/src/CodeBeam.MudBlazor.Extensions/Components/PasswordField/MudPasswordField.razor.cs +++ b/src/CodeBeam.MudBlazor.Extensions/Components/PasswordField/MudPasswordField.razor.cs @@ -160,7 +160,7 @@ public async Task SetText(string text) private async Task OnMaskedValueChanged(string s) { - await SetTextAsync(s); + await SetTextCoreAsync(s); } /// diff --git a/src/CodeBeam.MudBlazor.Extensions/Components/SelectExtended/MudSelectExtended.razor b/src/CodeBeam.MudBlazor.Extensions/Components/SelectExtended/MudSelectExtended.razor index dca0aa16..fd7a13bc 100644 --- a/src/CodeBeam.MudBlazor.Extensions/Components/SelectExtended/MudSelectExtended.razor +++ b/src/CodeBeam.MudBlazor.Extensions/Components/SelectExtended/MudSelectExtended.razor @@ -137,7 +137,7 @@ @if (ItemCollection != null || ChildContent != null) { - - , string?>? multiSelectionTextFunc = null) { // The Text property of the control is updated - await SetTextAsync(multiSelectionTextFunc?.Invoke(selectedConvertedValues)); + await SetTextCoreAsync(multiSelectionTextFunc?.Invoke(selectedConvertedValues)); // The comparison is made on the multiSelectionText variable if (multiSelectionText != text) @@ -1106,7 +1106,7 @@ public async Task SelectOption(object? obj) return; } - await SetValueAsync(value); + await SetValueCoreAsync(value); //await UpdateTextPropertyAsync(false); _elementReference.SetText(ReadText).CatchAndLog(); //_selectedValues.Clear(); @@ -1117,23 +1117,6 @@ public async Task SelectOption(object? obj) await InvokeAsync(StateHasChanged); } - //TODO: will override this method when core library will have the base one. - /// - /// - /// - /// - public override async Task ForceUpdate() - { - await base.ForceUpdate(); - if (!MultiSelection) - { - SelectedValues = new HashSet(_comparer) { ReadValue }; - } - else - { - await SelectedValuesChanged.InvokeAsync(new HashSet(SelectedValues, _comparer)); - } - } /// /// diff --git a/src/CodeBeam.MudBlazor.Extensions/Components/Wheel/MudWheel.razor.cs b/src/CodeBeam.MudBlazor.Extensions/Components/Wheel/MudWheel.razor.cs index 59eeb873..99001706 100644 --- a/src/CodeBeam.MudBlazor.Extensions/Components/Wheel/MudWheel.razor.cs +++ b/src/CodeBeam.MudBlazor.Extensions/Components/Wheel/MudWheel.razor.cs @@ -165,12 +165,12 @@ protected async Task HandleOnWheel(WheelEventArgs args) if (args.DeltaY < 0 && index != 0) { T? val = ItemCollection[index - 1]; - await SetValueAsync(val); + await SetValueCoreAsync(val); } else if (0 < args.DeltaY && index != ItemCollection.Count - 1) { T? val = ItemCollection[index + 1]; - await SetValueAsync(val); + await SetValueCoreAsync(val); } await Task.Delay(300); } @@ -218,7 +218,7 @@ protected async Task HandleOnSwipe(SwipeEventArgs args) } T? val = ItemCollection[index - 1]; index--; - await SetValueAsync(val); + await SetValueCoreAsync(val); StateHasChanged(); } else if (args.SwipeDirection == SwipeDirection.BottomToTop) @@ -229,7 +229,7 @@ protected async Task HandleOnSwipe(SwipeEventArgs args) } T? val = ItemCollection[index + 1]; index++; - await SetValueAsync(val); + await SetValueCoreAsync(val); StateHasChanged(); } } @@ -258,7 +258,7 @@ public async Task ChangeWheel(int changeCount) await _animate.Refresh(); T? val = ItemCollection is not null ? ItemCollection[index + changeCount] : default; - await SetValueAsync(val); + await SetValueCoreAsync(val); } /// diff --git a/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Components/ComboboxTests.cs b/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Components/ComboboxTests.cs index c7e7a471..f4cece0c 100644 --- a/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Components/ComboboxTests.cs +++ b/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Components/ComboboxTests.cs @@ -55,29 +55,6 @@ public void ComboBox_InitialValuesTest(bool multiSelection) combobox.Instance.GetState(x => x.Text).Should().Be("1"); } - [Test] - public async Task ComboBox_ValueBubblingTest() - { - var comp = Context.Render(); - var combobox = comp.FindComponent>(); - - combobox.Instance.GetState(x => x.Value).Should().BeNull(); - combobox.Instance.GetState(x => x.Text).Should().BeNull(); - - comp.Render(p => p.Add(x => x.SelectedValue, "1")); - await comp.InvokeAsync(() => combobox.Instance.ForceUpdate()); - comp.WaitForAssertion(() => combobox.Instance.GetState(x => x.Value).Should().Be("1")); - combobox.Instance.SelectedValues.Should().BeEquivalentTo(new HashSet() { "1" }); - combobox.Instance.GetState(x => x.Text).Should().Be("1"); - - comp.Render(p => p.Add(x => x.SelectedValue, "2")); - comp.WaitForAssertion(() => combobox.Instance.GetState(x => x.Value).Should().Be("2")); - combobox.Instance.SelectedValues.Should().BeEquivalentTo(new HashSet() { "1" }); - await comp.InvokeAsync(() => combobox.Instance.ForceUpdate()); - combobox.Instance.SelectedValues.Should().BeEquivalentTo(new HashSet() { "2" }); - combobox.Instance.GetState(x => x.Text).Should().Be("2"); - } - [Test] public void ComboBox_ValueBubblingTest_MultiSelection() { @@ -101,32 +78,6 @@ public void ComboBox_ValueBubblingTest_MultiSelection() combobox.Instance.GetState(x => x.Text).Should().Be(null); } - [Test] - public async Task ComboBox_ValueChangeEventCountTest() - { - var comp = Context.Render(x => - { - x.Add(c => c.MultiSelection, false); - }); - var combobox = comp.FindComponent>(); - var input = comp.Find("div.mud-input-control"); - - comp.Instance.ValueChangeCount.Should().Be(0); - comp.Instance.ValuesChangeCount.Should().Be(0); - - await comp.InvokeAsync(() => combobox.Render(p => p.Add(x => x.Value, "1"))); - await comp.InvokeAsync(() => combobox.Instance.ForceUpdate()); - comp.WaitForAssertion(() => comp.Instance.ValueChangeCount.Should().Be(1)); - comp.Instance.ValuesChangeCount.Should().Be(1); - combobox.Instance.GetState(x => x.Value).Should().Be("1"); - - // Changing value programmatically without ForceUpdate should change value, but should not fire change events - // Its by design, so this part can be change if design changes - await comp.InvokeAsync(() => combobox.Render(p => p.Add(x => x.Value, "2"))); - comp.WaitForAssertion(() => comp.Instance.ValueChangeCount.Should().Be(1)); - comp.Instance.ValuesChangeCount.Should().Be(1); - combobox.Instance.GetState(x => x.Value).Should().Be("2"); - } [Test] public async Task ComboBox_ValueChangeEventCountTest_MultiSelection() diff --git a/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Components/SelectExtendedTests.cs b/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Components/SelectExtendedTests.cs index 0b8372b4..23ef428e 100644 --- a/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Components/SelectExtendedTests.cs +++ b/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Components/SelectExtendedTests.cs @@ -66,29 +66,7 @@ public void Select_InitialValuesTest(bool multiSelection) select.Instance.SelectedValues.Should().BeEquivalentTo(new HashSet() { "1" }); select.Instance.GetState(x => x.Text).Should().Be("1"); } - - [Test] - public async Task Select_ValueBubblingTest() - { - var comp = Context.Render(); - var select = comp.FindComponent>(); - - select.Instance.GetState(x => x.Value).Should().BeNull(); - select.Instance.GetState(x => x.Text).Should().BeNull(); - - comp.Render(p => p.Add(x => x.SelectedValue, "1")); - await comp.InvokeAsync(() => select.Instance.ForceUpdate()); - comp.WaitForAssertion(() => select.Instance.GetState(x => x.Value).Should().Be("1")); - select.Instance.SelectedValues.Should().BeEquivalentTo(new HashSet() { "1" }); - select.Instance.GetState(x => x.Text).Should().Be("1"); - - comp.Render(p => p.Add(x => x.SelectedValue, "2")); - await comp.InvokeAsync(() => select.Instance.ForceUpdate()); - comp.WaitForAssertion(() => select.Instance.GetState(x => x.Value).Should().Be("2")); - select.Instance.SelectedValues.Should().BeEquivalentTo(new HashSet() { "2" }); - select.Instance.GetState(x => x.Text).Should().Be("2"); - } - + [Test] public void Select_ValueBubblingTest_MultiSelection() { @@ -112,33 +90,6 @@ public void Select_ValueBubblingTest_MultiSelection() select.Instance.GetState(x => x.Text).Should().Be("2, 1"); } - [Test] - public async Task Select_ValueChangeEventCountTest() - { - var comp = Context.Render(x => - { - x.Add(c => c.MultiSelection, false); - }); - var select = comp.FindComponent>(); - var input = comp.Find("div.mud-input-control"); - - comp.Instance.ValueChangeCount.Should().Be(0); - comp.Instance.ValuesChangeCount.Should().Be(0); - - await comp.InvokeAsync(() => select.Render(p => p.Add(x => x.Value, "1"))); - await comp.InvokeAsync(() => select.Instance.ForceUpdate()); - comp.WaitForAssertion(() => comp.Instance.ValueChangeCount.Should().Be(1)); - comp.Instance.ValuesChangeCount.Should().Be(1); - select.Instance.GetState(x => x.Value).Should().Be("1"); - - // Changing value programmatically without ForceUpdate should change value, but should not fire change events - // Its by design, so this part can be change if design changes - await comp.InvokeAsync(() => select.Render(p => p.Add(x => x.Value, "2"))); - comp.WaitForAssertion(() => comp.Instance.ValueChangeCount.Should().Be(1)); - comp.Instance.ValuesChangeCount.Should().Be(1); - select.Instance.GetState(x => x.Value).Should().Be("2"); - } - [Test] public async Task Select_ValueChangeEventCountTest_MultiSelection() { diff --git a/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Mocks/MockEventListener.cs b/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Mocks/MockEventListener.cs deleted file mode 100644 index 00ae67af..00000000 --- a/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Mocks/MockEventListener.cs +++ /dev/null @@ -1,79 +0,0 @@ -// Copyright (c) MudBlazor 2021 -// MudBlazor licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Components.Web; -using MudBlazor; - -namespace MudExtensions.UnitTests.Mocks -{ - public class MockEventListenerFactory : IEventListenerFactory - { - private readonly MockEventListener _listener; - - public MockEventListenerFactory(MockEventListener listener) - { - _listener = listener; - } - - public MockEventListenerFactory() - { - - } - - public IEventListener Create() => _listener ?? new MockEventListener(); - } - - public class MockEventListener : IEventListener - { - public Dictionary> Callbacks { get; private set; } = new(); - - public Dictionary ElementIdMapper { get; private set; } = new(); - - public ValueTask DisposeAsync() - { - Callbacks.Clear(); - ElementIdMapper.Clear(); - return ValueTask.CompletedTask; - } - - public Task Subscribe(string eventName, string elementId, string projection, int throttleInterval, Func callback) - { - var id = Guid.NewGuid(); - ElementIdMapper.Add(id, elementId); - Callbacks.Add(id, callback); - return Task.FromResult(id); - } - - public Task SubscribeGlobal(string eventName, int throotleInterval, Func callback) - { - var id = Guid.NewGuid(); - ElementIdMapper.Add(id, "document"); - Callbacks.Add(id, callback); - return Task.FromResult(id); - } - - public Task Unsubscribe(Guid key) - { - var result = Callbacks.ContainsKey(key); - if (result) - { - Callbacks.Remove(key); - ElementIdMapper.Remove(key); - } - - return Task.FromResult(result); - } - - internal void FireEvent(MouseEventArgs args) - { - foreach (var item in Callbacks.Values) - { - item.Invoke(args); - } - } - } -} diff --git a/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Mocks/MockKeyInterceptorService.cs b/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Mocks/MockKeyInterceptorService.cs index 5a396f29..74feb654 100644 --- a/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Mocks/MockKeyInterceptorService.cs +++ b/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Mocks/MockKeyInterceptorService.cs @@ -11,12 +11,14 @@ public class MockKeyInterceptorService : IKeyInterceptorService public ValueTask DisposeAsync() => ValueTask.CompletedTask; public Task SubscribeAsync(IKeyInterceptorObserver observer, KeyInterceptorOptions options) => Task.CompletedTask; + public Task SubscribeAsync(string elementId, KeyInterceptorOptions options, Action configure) => Task.CompletedTask; public Task SubscribeAsync(string elementId, KeyInterceptorOptions options, IKeyDownObserver? keyDown = null, IKeyUpObserver? keyUp = null) => Task.CompletedTask; public Task SubscribeAsync(string elementId, KeyInterceptorOptions options, Action? keyDown = null, Action? keyUp = null) => Task.CompletedTask; public Task SubscribeAsync(string elementId, KeyInterceptorOptions options, Func? keyDown = null, Func? keyUp = null) => Task.CompletedTask; + public Task DispatchAsync(string elementId, KeyEventKind kind, KeyboardEventArgs args) => Task.CompletedTask; public Task UpdateKeyAsync(IKeyInterceptorObserver observer, KeyOptions option) => Task.CompletedTask; diff --git a/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Mocks/MockScrollServices.cs b/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Mocks/MockScrollServices.cs index 19ab6529..c64b4cb8 100644 --- a/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Mocks/MockScrollServices.cs +++ b/tests/CodeBeam.MudBlazor.Extensions.UnitTests/Mocks/MockScrollServices.cs @@ -12,6 +12,11 @@ public IScrollListener Create(string selector) => { Selector = selector, }; + + public IScrollListener Create(string? selector, int reportRateMs) + { + throw new NotImplementedException(); + } } /// @@ -19,7 +24,13 @@ public IScrollListener Create(string selector) => /// public class MockScrollListener : IScrollListener { + public ValueTask GetCurrentScrollDataAsync() + { + return ValueTask.FromResult(new ScrollEventArgs()); + } + public string? Selector { get; set; } + public int ReportRateMs { get; set; } public event EventHandler? OnScroll; @@ -32,6 +43,8 @@ public void Dispose() { } + + public ValueTask DisposeAsync()=> ValueTask.CompletedTask; }