From 23bd7435cc97fa21fb1689d14c7323b9a0e1398c Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Jul 2025 11:01:35 +0800 Subject: [PATCH 1/8] =?UTF-8?q?refactor:=20=E8=B0=83=E6=95=B4=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=BD=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Filters/FilterBase.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/BootstrapBlazor/Components/Filters/FilterBase.cs b/src/BootstrapBlazor/Components/Filters/FilterBase.cs index 4b8ad3bf8e1..0a9ee142801 100644 --- a/src/BootstrapBlazor/Components/Filters/FilterBase.cs +++ b/src/BootstrapBlazor/Components/Filters/FilterBase.cs @@ -38,11 +38,6 @@ public abstract class FilterBase : BootstrapModuleComponentBase, IFilterAction [Parameter] public int Count { get; set; } - /// - /// 获得/设置 多个条件逻辑关系符号 - /// - protected FilterLogic Logic { get; set; } - /// /// 获得/设置 所属 TableFilter 实例 /// @@ -55,6 +50,11 @@ public abstract class FilterBase : BootstrapModuleComponentBase, IFilterAction [CascadingParameter] protected FilterContext? FilterContext { get; set; } + /// + /// 获得/设置 多个条件逻辑关系符号 + /// + protected FilterLogic Logic { get; set; } + /// /// /// From 3f3e12513f3cca76480ac19b3b61d6f629543593 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Jul 2025 11:02:15 +0800 Subject: [PATCH 2/8] Revert "fix(EnumFilter): incorrect selected value (#6334)" This reverts commit daf9af9b3880a2619528374963c8c07d2073934a. --- .../Components/Filters/EnumFilter.razor.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/BootstrapBlazor/Components/Filters/EnumFilter.razor.cs b/src/BootstrapBlazor/Components/Filters/EnumFilter.razor.cs index 0323e86a8f6..4dfc9959915 100644 --- a/src/BootstrapBlazor/Components/Filters/EnumFilter.razor.cs +++ b/src/BootstrapBlazor/Components/Filters/EnumFilter.razor.cs @@ -29,8 +29,8 @@ public partial class EnumFilter [Parameter] public IEnumerable? Items { get; set; } - private string? _value1 = ""; - private string? _value2 = ""; + private string? _value1; + private string? _value2; /// /// @@ -51,8 +51,8 @@ protected override void OnParametersSet() /// public override void Reset() { - _value1 = ""; - _value2 = ""; + _value1 = null; + _value2 = null; Count = 0; StateHasChanged(); } @@ -100,7 +100,7 @@ public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter) } else { - _value1 = ""; + _value1 = null; } if (filter.Filters.Count > 1) @@ -113,7 +113,7 @@ public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter) } else { - _value2 = ""; + _value2 = null; } Logic = filter.FilterLogic; } From 4509634ed25546a2863a46a0c1f8d292a2ed7f2a Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Jul 2025 11:02:19 +0800 Subject: [PATCH 3/8] Revert "fix(BoolFilter): set default value is empty" This reverts commit 26e33c3876849cc255e26646f425a9569c7345e8. --- src/BootstrapBlazor/Components/Filters/BoolFilter.razor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BootstrapBlazor/Components/Filters/BoolFilter.razor.cs b/src/BootstrapBlazor/Components/Filters/BoolFilter.razor.cs index 4e97b7b7076..fadc3330db0 100644 --- a/src/BootstrapBlazor/Components/Filters/BoolFilter.razor.cs +++ b/src/BootstrapBlazor/Components/Filters/BoolFilter.razor.cs @@ -16,7 +16,7 @@ public partial class BoolFilter [Parameter] public IEnumerable? Items { get; set; } - private string _value = ""; + private string? _value; /// /// @@ -38,7 +38,7 @@ protected override void OnParametersSet() /// public override void Reset() { - _value = ""; + _value = null; StateHasChanged(); } From 9a23fdb877898806dedd5366be61c5330e8181d5 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Jul 2025 11:08:25 +0800 Subject: [PATCH 4/8] Reapply "fix(BoolFilter): set default value is empty" This reverts commit 4509634ed25546a2863a46a0c1f8d292a2ed7f2a. --- src/BootstrapBlazor/Components/Filters/BoolFilter.razor.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BootstrapBlazor/Components/Filters/BoolFilter.razor.cs b/src/BootstrapBlazor/Components/Filters/BoolFilter.razor.cs index fadc3330db0..4e97b7b7076 100644 --- a/src/BootstrapBlazor/Components/Filters/BoolFilter.razor.cs +++ b/src/BootstrapBlazor/Components/Filters/BoolFilter.razor.cs @@ -16,7 +16,7 @@ public partial class BoolFilter [Parameter] public IEnumerable? Items { get; set; } - private string? _value; + private string _value = ""; /// /// @@ -38,7 +38,7 @@ protected override void OnParametersSet() /// public override void Reset() { - _value = null; + _value = ""; StateHasChanged(); } From 819f6ff6fd4990d7ee0a0ad91db169aa0febdcbf Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Jul 2025 11:08:36 +0800 Subject: [PATCH 5/8] Reapply "fix(EnumFilter): incorrect selected value (#6334)" This reverts commit 3f3e12513f3cca76480ac19b3b61d6f629543593. --- .../Components/Filters/EnumFilter.razor.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/BootstrapBlazor/Components/Filters/EnumFilter.razor.cs b/src/BootstrapBlazor/Components/Filters/EnumFilter.razor.cs index 4dfc9959915..0323e86a8f6 100644 --- a/src/BootstrapBlazor/Components/Filters/EnumFilter.razor.cs +++ b/src/BootstrapBlazor/Components/Filters/EnumFilter.razor.cs @@ -29,8 +29,8 @@ public partial class EnumFilter [Parameter] public IEnumerable? Items { get; set; } - private string? _value1; - private string? _value2; + private string? _value1 = ""; + private string? _value2 = ""; /// /// @@ -51,8 +51,8 @@ protected override void OnParametersSet() /// public override void Reset() { - _value1 = null; - _value2 = null; + _value1 = ""; + _value2 = ""; Count = 0; StateHasChanged(); } @@ -100,7 +100,7 @@ public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter) } else { - _value1 = null; + _value1 = ""; } if (filter.Filters.Count > 1) @@ -113,7 +113,7 @@ public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter) } else { - _value2 = null; + _value2 = ""; } Logic = filter.FilterLogic; } From 3a2de918eb4a4cbb00ae9938bfc6a56afccf5e02 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Jul 2025 11:08:59 +0800 Subject: [PATCH 6/8] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Select/Select.razor.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/Components/Select/Select.razor.cs b/src/BootstrapBlazor/Components/Select/Select.razor.cs index 5f04d51841c..51f01b4aadb 100644 --- a/src/BootstrapBlazor/Components/Select/Select.razor.cs +++ b/src/BootstrapBlazor/Components/Select/Select.razor.cs @@ -27,7 +27,8 @@ public partial class Select : ISelect, ILookup private ILookupService? InjectLookupService { get; set; } /// - /// Gets or sets a value indicating whether the "active" state should be used when the associated value is null. + /// 获得/设置 值为 null 时是否使用第一个选项作为默认值 + /// Gets or sets a value indicating whether the "active" state should be used when the associated value is null. /// [Parameter] public bool IsUseActiveWhenValueIsNull { get; set; } From 57355cb95fecc3340ee6effe48954762af1d0b23 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Jul 2025 11:50:40 +0800 Subject: [PATCH 7/8] =?UTF-8?q?refactor:=20=E6=94=AF=E6=8C=81=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Filters/LookupFilter.razor.cs | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/BootstrapBlazor/Components/Filters/LookupFilter.razor.cs b/src/BootstrapBlazor/Components/Filters/LookupFilter.razor.cs index 28a1228fc16..01160714d76 100644 --- a/src/BootstrapBlazor/Components/Filters/LookupFilter.razor.cs +++ b/src/BootstrapBlazor/Components/Filters/LookupFilter.razor.cs @@ -18,9 +18,9 @@ public partial class LookupFilter /// /// /// - protected override void OnParametersSet() + protected override async Task OnParametersSetAsync() { - base.OnParametersSet(); + await base.OnParametersSetAsync(); if (TableColumnFilter != null) { @@ -28,6 +28,19 @@ protected override void OnParametersSet() _isShowSearch = column.ShowSearchWhenSelect; _type = column.PropertyType; _lookup = column; + + if (string.IsNullOrEmpty(_value)) + { + var service = _lookup.LookupService; + if (service != null) + { + var items = await _lookup.GetItemsAsync(service, _lookup.LookupServiceKey, _lookup.LookupServiceData); + if(items != null) + { + _value = items.FirstOrDefault()?.Value; + } + } + } } } From 59d1f1c341c7804dbecf08ab4abe56d8a08d1b6b Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Jul 2025 11:50:47 +0800 Subject: [PATCH 8/8] =?UTF-8?q?test:=20=E5=A2=9E=E5=8A=A0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/TableLookupFilterTest.cs | 106 +++++++++++++++++- 1 file changed, 104 insertions(+), 2 deletions(-) diff --git a/test/UnitTest/Components/TableLookupFilterTest.cs b/test/UnitTest/Components/TableLookupFilterTest.cs index b5b19c04b19..39a1a40c441 100644 --- a/test/UnitTest/Components/TableLookupFilterTest.cs +++ b/test/UnitTest/Components/TableLookupFilterTest.cs @@ -31,17 +31,18 @@ public async Task FilterAction_Ok() }); var lookup = cut.FindComponent(); var filter = lookup.Instance; - var newConditions = new FilterKeyValueAction() { Filters = [ - new FilterKeyValueAction() { FieldValue = "1" }, + new FilterKeyValueAction() { FieldValue = "2" }, ] }; await cut.InvokeAsync(() => filter.SetFilterConditionsAsync(newConditions)); var conditions = filter.GetFilterConditions(); Assert.Single(conditions.Filters); + Assert.Equal("2", conditions.Filters[0].FieldValue); + await cut.InvokeAsync(() => filter.Reset()); conditions = filter.GetFilterConditions(); Assert.Empty(conditions.Filters); @@ -64,6 +65,51 @@ public async Task FilterAction_Ok() Assert.Empty(conditions.Filters); } + [Fact] + public async Task LookupService_Ok() + { + var cut = Context.RenderComponent(pb => + { + pb.Add(a => a.Table, new MockTable()); + pb.Add(a => a.Column, new MockLookupServiceColumn()); + }); + var lookup = cut.FindComponent(); + var filter = lookup.Instance; + + // 由于 LookupFilter 默认值未设置使用候选项第一个 + cut.WaitForAssertion(() => cut.Contains("value=\"LookupService-Test-1-async\""), TimeSpan.FromMilliseconds(100)); + var newConditions = new FilterKeyValueAction() + { + Filters = + [ + new FilterKeyValueAction() { FieldValue = "v2" }, + ] + }; + await cut.InvokeAsync(() => filter.SetFilterConditionsAsync(newConditions)); + var conditions = filter.GetFilterConditions(); + Assert.Single(conditions.Filters); + Assert.Equal("v2", conditions.Filters[0].FieldValue); + + await cut.InvokeAsync(() => filter.Reset()); + conditions = filter.GetFilterConditions(); + Assert.Empty(conditions.Filters); + } + + [Fact] + public async Task LookupService_Empty() + { + var column = new MockEmptyLookupServiceColumn(); + var cut = Context.RenderComponent(pb => + { + pb.Add(a => a.Table, new MockTable()); + pb.Add(a => a.Column, column); + }); + var lookup = cut.FindComponent(); + var filter = lookup.Instance; + + await column.Task; + } + class MockTable : ITable { public Dictionary Filters { get; set; } = []; @@ -89,4 +135,60 @@ public MockColumn() }; } } + + class MockLookupServiceColumn : TableColumn + { + public MockLookupServiceColumn() + { + PropertyType = typeof(string); + FieldName = "Lookup"; + LookupService = new LookupFilterService(); + LookupServiceKey = "LookupKey"; + } + } + + class MockEmptyLookupServiceColumn : TableColumn + { + private LookupFilterService _service = new LookupFilterService(); + + public MockEmptyLookupServiceColumn() + { + PropertyType = typeof(string); + FieldName = "Lookup"; + LookupService = _service; + LookupServiceKey = "LookupEmptyKey"; + } + + public Task Task => _service.Task; + } + + class LookupFilterService : LookupServiceBase + { + private TaskCompletionSource _taskCompletionSource = new(); + + public override IEnumerable? GetItemsByKey(string? key, object? data) => null; + + public override async Task?> GetItemsByKeyAsync(string? key, object? data) + { + IEnumerable? ret = null; + + if (key == "LookupKey") + { + await Task.Delay(30); + ret = + [ + new SelectedItem("v1", "LookupService-Test-1-async"), + new SelectedItem("v2", "LookupService-Test-2-async") + ]; + } + else if (key == "LookupEmptyKey") + { + ret = []; + _taskCompletionSource.TrySetResult(); + } + return ret; + } + + public Task Task => _taskCompletionSource.Task; + } }