Skip to content

Commit b3e7f5f

Browse files
authored
fix(Filter): preserve programmatic filter conditions (#8549)
* fix(Filter): synchronize filter count updates * test: 补充单元测试 * test: 更新单元测试 * chore: bump version 11.0.2-beta01
1 parent 68d4c45 commit b3e7f5f

11 files changed

Lines changed: 131 additions & 14 deletions

‎src/BootstrapBlazor/BootstrapBlazor.csproj‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
22

33
<PropertyGroup>
4-
<Version>11.0.1</Version>
4+
<Version>11.0.2-beta01</Version>
55
</PropertyGroup>
66

77
<ItemGroup>

‎src/BootstrapBlazor/Components/Filters/DateTimeFilter.razor.cs‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public override void Reset()
5555
_value2 = null;
5656
_action1 = FilterAction.GreaterThanOrEqual;
5757
_action2 = FilterAction.LessThanOrEqual;
58-
Count = 0;
58+
SetCount(0);
5959
Logic = FilterLogic.And;
6060
StateHasChanged();
6161
}
@@ -97,7 +97,6 @@ public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter)
9797

9898
if (filter.Filters.Count > 1)
9999
{
100-
Count = 1;
101100
FilterKeyValueAction second = filter.Filters[1];
102101
if (second.FieldValue is DateTime value2)
103102
{

‎src/BootstrapBlazor/Components/Filters/EnumFilter.razor.cs‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public override void Reset()
5454
{
5555
_value1 = "";
5656
_value2 = "";
57-
Count = 0;
57+
SetCount(0);
5858
StateHasChanged();
5959
}
6060

@@ -108,7 +108,6 @@ public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter)
108108

109109
if (filter.Filters.Count > 1)
110110
{
111-
Count = 1;
112111
FilterKeyValueAction second = filter.Filters[1];
113112
if (IsNullFilterAction(second.FilterAction))
114113
{

‎src/BootstrapBlazor/Components/Filters/FilterBase.cs‎

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,12 @@ private protected IEnumerable<SelectedItem> AddNullFilterValues(IEnumerable<Sele
125125
FilterAction = action
126126
};
127127

128+
private protected void SetCount(int count)
129+
{
130+
Count = count;
131+
FilterContext?.CountChanged?.Invoke(count);
132+
}
133+
128134
/// <summary>
129135
/// <inheritdoc/>
130136
/// </summary>
@@ -195,5 +201,9 @@ protected virtual async Task OnFilterAsync()
195201
/// <inheritdoc cref="IFilterAction.SetFilterConditionsAsync(FilterKeyValueAction)"/>
196202
/// </summary>
197203
/// <param name="filter"></param>
198-
public virtual Task SetFilterConditionsAsync(FilterKeyValueAction filter) => OnFilterAsync();
204+
public virtual Task SetFilterConditionsAsync(FilterKeyValueAction filter)
205+
{
206+
SetCount(filter.Filters.Count > 1 ? 1 : 0);
207+
return OnFilterAsync();
208+
}
199209
}

‎src/BootstrapBlazor/Components/Filters/FilterContext.cs‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,6 @@ public class FilterContext
2828
/// <para lang="en">Gets or sets the filter counter. Default is 0</para>
2929
/// </summary>
3030
public int Count { get; set; }
31+
32+
internal Action<int>? CountChanged { get; set; }
3133
}

‎src/BootstrapBlazor/Components/Filters/FilterProvider.razor.cs‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,9 +152,19 @@ private void OnClickMinus()
152152
}
153153
}
154154

155+
private void OnCountChanged(int count)
156+
{
157+
if (Count != count)
158+
{
159+
Count = count;
160+
StateHasChanged();
161+
}
162+
}
163+
155164
private FilterContext FilterContext => new()
156165
{
157166
Count = Count,
167+
CountChanged = OnCountChanged,
158168
FieldKey = FieldKey,
159169
IsHeaderRow = IsHeaderRow
160170
};

‎src/BootstrapBlazor/Components/Filters/NumberFilter.razor.cs‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ public override void Reset()
5757
_value2 = default;
5858
_action1 = FilterAction.GreaterThanOrEqual;
5959
_action2 = FilterAction.LessThanOrEqual;
60-
Count = 0;
60+
SetCount(0);
6161
Logic = FilterLogic.And;
6262
StateHasChanged();
6363
}
@@ -99,7 +99,6 @@ public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter)
9999

100100
if (filter.Filters.Count > 1)
101101
{
102-
Count = 1;
103102
FilterKeyValueAction second = filter.Filters[1];
104103
if (second.FieldValue is TType value2)
105104
{

‎src/BootstrapBlazor/Components/Filters/RegexFilter.razor.cs‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public override void Reset()
6464
_action1 = FilterAction.Match;
6565
_action2 = FilterAction.Match;
6666
Logic = FilterLogic.Or;
67-
Count = 0;
67+
SetCount(0);
6868
StateHasChanged();
6969
}
7070

@@ -105,7 +105,6 @@ public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter)
105105

106106
if (filter.Filters.Count > 1)
107107
{
108-
Count = 1;
109108
FilterKeyValueAction second = filter.Filters[1];
110109
if (second.FieldValue is string value2)
111110
{
@@ -116,7 +115,7 @@ public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter)
116115
_value2 = null;
117116
}
118117
_action2 = second.FilterAction;
119-
Logic = second.FilterLogic;
118+
Logic = filter.FilterLogic;
120119
}
121120
await base.SetFilterConditionsAsync(filter);
122121
}

‎src/BootstrapBlazor/Components/Filters/StringFilter.razor.cs‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public override void Reset()
6666
_action1 = FilterAction.Contains;
6767
_action2 = FilterAction.Contains;
6868
Logic = FilterLogic.Or;
69-
Count = 0;
69+
SetCount(0);
7070
StateHasChanged();
7171
}
7272

@@ -107,7 +107,6 @@ public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter)
107107

108108
if (filter.Filters.Count > 1)
109109
{
110-
Count = 1;
111110
FilterKeyValueAction second = filter.Filters[1];
112111
if (second.FieldValue is string value2)
113112
{
@@ -118,7 +117,7 @@ public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter)
118117
_value2 = null;
119118
}
120119
_action2 = second.FilterAction;
121-
Logic = second.FilterLogic;
120+
Logic = filter.FilterLogic;
122121
}
123122
await base.SetFilterConditionsAsync(filter);
124123
}

‎test/UnitTest/Components/ContextMenuTest.cs‎

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,46 @@ namespace UnitTest.Components;
1212

1313
public class ContextMenuTest : BootstrapBlazorTestBase
1414
{
15+
[Theory]
16+
[InlineData(false)]
17+
[InlineData(true)]
18+
public async Task Show_Ok(bool hasCallback)
19+
{
20+
var contextItem = new object();
21+
var callbackCompleted = false;
22+
var cut = Context.Render<ContextMenuZone>(pb =>
23+
{
24+
pb.AddChildContent<ContextMenu>(builder =>
25+
{
26+
if (hasCallback)
27+
{
28+
builder.Add(a => a.OnBeforeShowCallback, async value =>
29+
{
30+
Assert.Same(contextItem, value);
31+
await Task.Yield();
32+
callbackCompleted = true;
33+
});
34+
}
35+
});
36+
});
37+
var menu = cut.FindComponent<ContextMenu>();
38+
var renderCount = menu.RenderCount;
39+
var method = typeof(ContextMenu).GetMethod("Show", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
40+
Assert.NotNull(method);
41+
42+
await cut.InvokeAsync(async () =>
43+
{
44+
var task = Assert.IsAssignableFrom<Task>(method.Invoke(menu.Instance, [new MouseEventArgs(), contextItem]));
45+
await task;
46+
});
47+
48+
Assert.Equal(hasCallback, callbackCompleted);
49+
var field = typeof(ContextMenu).GetField("_contextItem", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
50+
Assert.NotNull(field);
51+
Assert.Same(contextItem, field.GetValue(menu.Instance));
52+
Assert.True(menu.RenderCount > renderCount);
53+
}
54+
1555
[Fact]
1656
public async Task ContextMenu_Ok()
1757
{

0 commit comments

Comments
 (0)