Skip to content

Commit a556aee

Browse files
authored
feat(FilterProvider): add FilterProvider component (#6029)
* feat: 增加 FilterProvider 组件 * test: 增加单元测试 * refactor: 更改过滤器 * revert: 兼容老组件 * revert: 撤销更改结构 * doc: 更新示例 * doc: 代码格式化 * chore: bump version 9.6.3 * refactor: 重构组件 * refactor: 移除 Filter 组件
1 parent 9abd346 commit a556aee

File tree

11 files changed

+193
-84
lines changed

11 files changed

+193
-84
lines changed

src/BootstrapBlazor.Server/Components/Samples/Table/TablesFilter.razor

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@
6565
</TableColumn>
6666
<TableColumn @bind-Field="@context.Count" Width="100" Sortable="true" Filterable="true">
6767
<FilterTemplate>
68-
<Filter TFilter="CustomerFilter"></Filter>
68+
<FilterProvider ShowMoreButton="false">
69+
<CustomerFilter></CustomerFilter>
70+
</FilterProvider>
6971
</FilterTemplate>
7072
</TableColumn>
7173
</TableColumns>
@@ -211,22 +213,30 @@
211213
<TableColumn @bind-Field="@context.DateTime" Width="180" Sortable="true" />
212214
<TableColumn @bind-Field="@context.Name" Width="100" Sortable="true" Filterable="true">
213215
<FilterTemplate>
214-
<Filter TFilter="MultiFilter" FilterParameters="_multiFilterParameter1"></Filter>
216+
<FilterProvider ShowMoreButton="false">
217+
<MultiFilter Items="Items.Select(i => new SelectedItem(i.Name!, i.Name!)).DistinctBy(i => i.Value).ToList()"></MultiFilter>
218+
</FilterProvider>
215219
</FilterTemplate>
216220
</TableColumn>
217221
<TableColumn @bind-Field="@context.Address" Sortable="true" Filterable="true">
218222
<FilterTemplate>
219-
<Filter TFilter="MultiFilter" FilterParameters="_multiFilterParameter2"></Filter>
223+
<FilterProvider ShowMoreButton="false">
224+
<MultiFilter OnGetItemsAsync="OnGetAddressItemsAsync"></MultiFilter>
225+
</FilterProvider>
220226
</FilterTemplate>
221227
</TableColumn>
222228
<TableColumn @bind-Field="@context.Complete" Width="100" Sortable="true" Filterable="true">
223229
<FilterTemplate>
224-
<Filter TFilter="MultiFilter" FilterParameters="_multiFilterParameter3"></Filter>
230+
<FilterProvider ShowMoreButton="false">
231+
<MultiFilter ShowSearch="false" Items="Items.Select(i => new SelectedItem(i.Complete.ToString()!, i.Complete.ToString()!)).DistinctBy(i => i.Value).ToList()"></MultiFilter>
232+
</FilterProvider>
225233
</FilterTemplate>
226234
</TableColumn>
227235
<TableColumn @bind-Field="@context.Education" Width="100" Sortable="true" Filterable="true">
228236
<FilterTemplate>
229-
<Filter TFilter="MultiFilter" FilterParameters="_multiFilterParameter4"></Filter>
237+
<FilterProvider ShowMoreButton="false">
238+
<MultiFilter ShowSearch="false" Items="Items.Select(i => new SelectedItem(i.Education.ToString()!, i.Education.ToString()!)).DistinctBy(i => i.Value).ToList()"></MultiFilter>
239+
</FilterProvider>
230240
</FilterTemplate>
231241
</TableColumn>
232242
<TableColumn @bind-Field="@context.Count" Width="150" Sortable="true" />

src/BootstrapBlazor.Server/Components/Samples/Table/TablesFilter.razor.cs

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,14 @@ public partial class TablesFilter
2929
[NotNull]
3030
private Table<Foo>? TableSetFilter { get; set; }
3131

32-
private readonly Dictionary<string, object> _multiFilterParameter1 = new();
33-
private readonly Dictionary<string, object> _multiFilterParameter2 = new();
34-
private readonly Dictionary<string, object> _multiFilterParameter3 = new();
35-
private readonly Dictionary<string, object> _multiFilterParameter4 = new();
36-
3732
/// <summary>
38-
/// OnInitialized 方法
33+
/// <inheritdoc/>
3934
/// </summary>
4035
protected override void OnInitialized()
4136
{
4237
base.OnInitialized();
4338

4439
Items = Foo.GenerateFoo(FooLocalizer);
45-
var items1 = Items.Select(i => new SelectedItem(i.Name!, i.Name!)).DistinctBy(i => i.Value);
46-
_multiFilterParameter1.Add(nameof(MultiFilter.Items), items1);
47-
48-
_multiFilterParameter2.Add(nameof(MultiFilter.OnGetItemsAsync), new Func<Task<List<SelectedItem>>>(OnGetAddressItemsAsync));
49-
50-
var items3 = Items.Select(i => new SelectedItem(i.Complete.ToString(), i.Complete.ToString())).DistinctBy(i => i.Value);
51-
_multiFilterParameter3.Add(nameof(MultiFilter.Items), items3);
52-
_multiFilterParameter3.Add(nameof(MultiFilter.ShowSearch), false);
53-
54-
var items4 = Items.Select(i => new SelectedItem(i.Education.ToString()!, i.Education.ToString()!)).DistinctBy(i => i.Value);
55-
_multiFilterParameter4.Add(nameof(MultiFilter.Items), items4);
56-
_multiFilterParameter4.Add(nameof(MultiFilter.ShowSearch), false);
5740
}
5841

5942
private async Task<List<SelectedItem>> OnGetAddressItemsAsync()

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>9.6.2</Version>
4+
<Version>9.6.3</Version>
55
</PropertyGroup>
66

77
<ItemGroup>

src/BootstrapBlazor/Components/Filters/FilterBase.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ public abstract class FilterBase : BootstrapModuleComponentBase, IFilterAction
3838
[CascadingParameter, NotNull]
3939
protected TableColumnFilter? TableColumnFilter { get; set; }
4040

41+
/// <summary>
42+
/// Gets or sets the <see cref="FilterContext"/> instance from cascading parameter.
43+
/// </summary>
44+
[CascadingParameter]
45+
protected FilterContext? FilterContext { get; set; }
46+
4147
/// <summary>
4248
/// <inheritdoc/>
4349
/// </summary>
@@ -51,6 +57,20 @@ protected override void OnInitialized()
5157
}
5258
}
5359

60+
/// <summary>
61+
/// <inheritdoc/>
62+
/// </summary>
63+
protected override void OnParametersSet()
64+
{
65+
base.OnParametersSet();
66+
67+
if (FilterContext != null)
68+
{
69+
FieldKey = FilterContext.FieldKey;
70+
IsHeaderRow = FilterContext.IsHeaderRow;
71+
}
72+
}
73+
5474
/// <summary>
5575
/// 重置按钮回调方法
5676
/// </summary>
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the Apache 2.0 License
3+
// See the LICENSE file in the project root for more information.
4+
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone
5+
6+
using System.Runtime.CompilerServices;
7+
8+
namespace BootstrapBlazor.Components;
9+
10+
/// <summary>
11+
/// FilterContext class
12+
/// </summary>
13+
public class FilterContext
14+
{
15+
/// <summary>
16+
/// Gets or sets whether the filter is header row. Default is false.
17+
/// </summary>
18+
public bool IsHeaderRow { get; set; }
19+
20+
/// <summary>
21+
/// Gets or sets the column field key. Default is null.
22+
/// </summary>
23+
public string? FieldKey { get; set; }
24+
25+
/// <summary>
26+
/// Gets or sets the filter counter. Default is 0.
27+
/// </summary>
28+
public int Count { get; set; }
29+
}

src/BootstrapBlazor/Components/Filters/Filter.razor renamed to src/BootstrapBlazor/Components/Filters/FilterProvider.razor

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,7 @@
11
@namespace BootstrapBlazor.Components
22
@inherits ComponentBase
3-
@typeparam TFilter
43

5-
@if (_isHeaderRow)
4+
@if (IsHeaderRow)
65
{
76
@RenderFilter()
87
}
@@ -17,8 +16,8 @@ else
1716
<div class="d-flex flex-fill">
1817
@if (ShowMoreButton)
1918
{
20-
<Button Color="Color.None" OnClick="OnClickPlus" Icon="@PlusIcon" IsDisabled="@(_count == 1)"></Button>
21-
<Button Color="Color.None" OnClick="OnClickMinus" Icon="@MinusIcon" IsDisabled="@(_count == 0)"></Button>
19+
<Button Color="Color.None" OnClick="OnClickPlus" Icon="@PlusIcon" IsDisabled="@(Count == 1)"></Button>
20+
<Button Color="Color.None" OnClick="OnClickMinus" Icon="@MinusIcon" IsDisabled="@(Count == 0)"></Button>
2221
}
2322
</div>
2423
<Button Color="Color.None" class="filter-dismiss" OnClick="OnClickReset" Text="@ClearButtonText"></Button>

src/BootstrapBlazor/Components/Filters/Filter.razor.cs renamed to src/BootstrapBlazor/Components/Filters/FilterProvider.razor.cs

Lines changed: 41 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,10 @@
88
namespace BootstrapBlazor.Components;
99

1010
/// <summary>
11-
/// Filter 组件
11+
/// FilterProvider component
1212
/// </summary>
13-
public partial class Filter<TFilter> where TFilter : IComponent
13+
public partial class FilterProvider
1414
{
15-
/// <summary>
16-
/// 获得/设置 过滤器组件参数集合 Default is null
17-
/// </summary>
18-
[Parameter]
19-
public IDictionary<string, object>? FilterParameters { get; set; }
20-
2115
/// <summary>
2216
/// 获得/设置 重置按钮文本
2317
/// </summary>
@@ -53,10 +47,20 @@ public partial class Filter<TFilter> where TFilter : IComponent
5347
/// <summary>
5448
/// Gets or sets the filter title. Default is null.
5549
/// </summary>
50+
[Parameter]
5651
public string? Title { get; set; }
5752

53+
/// <summary>
54+
/// Gets or sets the child content. Default is null.
55+
/// </summary>
56+
[Parameter]
57+
public RenderFragment? ChildContent { get; set; }
58+
59+
/// <summary>
60+
/// Gets or sets the <see cref="TableColumnFilter"/> instance from cascading parameter.
61+
/// </summary>
5862
[CascadingParameter]
59-
private TableColumnFilter? TableColumnFilter { get; set; }
63+
protected TableColumnFilter? TableColumnFilter { get; set; }
6064

6165
[Inject]
6266
[NotNull]
@@ -66,9 +70,20 @@ public partial class Filter<TFilter> where TFilter : IComponent
6670
[NotNull]
6771
private IIconTheme? IconTheme { get; set; }
6872

69-
private int _count;
70-
private string? _fieldKey;
71-
private bool _isHeaderRow = false;
73+
/// <summary>
74+
/// Gets or sets the filter counter. Default is 0.
75+
/// </summary>
76+
protected int Count { get; set; }
77+
78+
/// <summary>
79+
/// Gets or sets the column field key. Default is null.
80+
/// </summary>
81+
protected string? FieldKey { get; set; }
82+
83+
/// <summary>
84+
/// Gets or sets whether the filter is header row. Default is false.
85+
/// </summary>
86+
protected bool IsHeaderRow { get; set; }
7287

7388
/// <summary>
7489
/// <inheritdoc/>
@@ -84,9 +99,8 @@ protected override void OnParametersSet()
8499
ClearButtonText ??= Localizer[nameof(ClearButtonText)];
85100

86101
Title ??= TableColumnFilter.GetFilterTitle();
87-
88-
_isHeaderRow = TableColumnFilter.IsHeaderRow();
89-
_fieldKey = TableColumnFilter.GetFieldKey();
102+
FieldKey ??= TableColumnFilter.GetFieldKey();
103+
IsHeaderRow = TableColumnFilter.IsHeaderRow();
90104
}
91105

92106
/// <summary>
@@ -95,7 +109,7 @@ protected override void OnParametersSet()
95109
/// <returns></returns>
96110
private async Task OnClickReset()
97111
{
98-
_count = 0;
112+
Count = 0;
99113
if (TableColumnFilter != null)
100114
{
101115
await TableColumnFilter.Reset();
@@ -121,9 +135,9 @@ protected async Task OnClickConfirm()
121135
/// <returns></returns>
122136
private void OnClickPlus()
123137
{
124-
if (_count == 0)
138+
if (Count == 0)
125139
{
126-
_count++;
140+
Count++;
127141
}
128142
}
129143

@@ -133,9 +147,9 @@ private void OnClickPlus()
133147
/// <returns></returns>
134148
private void OnClickMinus()
135149
{
136-
if (_count == 1)
150+
if (Count == 1)
137151
{
138-
_count--;
152+
Count--;
139153
}
140154
}
141155

@@ -145,22 +159,14 @@ private void OnClickMinus()
145159
/// <returns></returns>
146160
protected virtual RenderFragment RenderFilter() => builder =>
147161
{
148-
var filterType = typeof(TFilter);
149-
builder.OpenComponent<TFilter>(0);
150-
if (filterType.IsSubclassOf(typeof(FilterBase)))
162+
builder.OpenComponent<CascadingValue<FilterContext>>(0);
163+
builder.AddAttribute(1, nameof(CascadingValue<FilterContext>.Value), new FilterContext()
151164
{
152-
builder.AddAttribute(1, nameof(FilterBase.FieldKey), _fieldKey);
153-
builder.AddAttribute(2, nameof(FilterBase.IsHeaderRow), _isHeaderRow);
154-
}
155-
if (filterType.IsSubclassOf(typeof(MultipleFilterBase)))
156-
{
157-
builder.AddAttribute(10, nameof(MultipleFilterBase.Count), _count);
158-
}
159-
160-
if (FilterParameters != null)
161-
{
162-
builder.AddMultipleAttributes(100, FilterParameters);
163-
}
165+
Count = Count,
166+
FieldKey = FieldKey,
167+
IsHeaderRow = IsHeaderRow
168+
});
169+
builder.AddAttribute(2, nameof(CascadingValue<FilterContext>.ChildContent), ChildContent);
164170
builder.CloseComponent();
165171
};
166172
}

src/BootstrapBlazor/Components/Filters/MultipleFilterBase.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,17 @@ public abstract class MultipleFilterBase : FilterBase
2020
/// 获得/设置 多个条件逻辑关系符号
2121
/// </summary>
2222
protected FilterLogic Logic { get; set; }
23+
24+
/// <summary>
25+
/// <inheritdoc/>
26+
/// </summary>
27+
protected override void OnParametersSet()
28+
{
29+
base.OnParametersSet();
30+
31+
if (FilterContext != null)
32+
{
33+
Count = FilterContext.Count;
34+
}
35+
}
2336
}

0 commit comments

Comments
 (0)