Skip to content
Merged
Show file tree
Hide file tree
Changes from 52 commits
Commits
Show all changes
67 commits
Select commit Hold shift + click to select a range
ea255b0
doc: 更新注释
ArgoZhang May 11, 2025
5663c73
refactor: 重新设计 FilterTemplate 模板
ArgoZhang May 11, 2025
2e56ef9
refactor: 移除预编译宏
ArgoZhang May 11, 2025
daaa257
refactor: 重新设计过滤器
ArgoZhang May 11, 2025
2fa28cd
refactor: 增加枚举类型过滤器
ArgoZhang May 11, 2025
dbd3662
refactor: 增加布尔类型过滤器
ArgoZhang May 11, 2025
0ca2ec4
refactor: 重构 Filter 结构
ArgoZhang May 12, 2025
e277304
refactor: 更新 TableColumnDateTimeFilter 组件
ArgoZhang May 12, 2025
37f2618
feat: 增加 TableColumnStringFilter 组件
ArgoZhang May 12, 2025
b1465ee
feat: 增加 NumberFilter 组件
ArgoZhang May 12, 2025
f6ed701
refactor: 更新 NumberFilter 组件
ArgoZhang May 12, 2025
b6d3cf8
refactor: 增加 Lookup 过滤器
ArgoZhang May 12, 2025
5c47de1
chore: 移除老的过滤器
ArgoZhang May 12, 2025
3dacab8
refactor: 增加 TableColumnMultiFilter 过滤去
ArgoZhang May 12, 2025
bdd5893
refactor: 恢复组件名称
ArgoZhang May 12, 2025
643bdf2
doc: 根据最新组件设计重构自定义过滤组件
ArgoZhang May 12, 2025
d0e8103
refactor: 增加忽略检查设置
ArgoZhang May 12, 2025
e123e25
refactor: 增加 HasFilter 扩展方法
ArgoZhang May 12, 2025
cc0fa2c
doc: 更新示例
ArgoZhang May 12, 2025
f8db02e
refactor: 精简代码
ArgoZhang May 12, 2025
47a5845
refactor: 重构过滤器
ArgoZhang May 12, 2025
80ef17d
refactor: 更新扩展方法
ArgoZhang May 12, 2025
6d55ed2
refactor: 精简代码
ArgoZhang May 12, 2025
2c8fc97
test: 更新单元测试
ArgoZhang May 12, 2025
c09ecd6
Merge branch 'main' into feat-filter
ArgoZhang May 13, 2025
e083a75
refactor: 重构代码
ArgoZhang May 13, 2025
fac8044
refactor: 调整过滤器结构
ArgoZhang May 13, 2025
ae092a4
refactor: 重构代码
ArgoZhang May 13, 2025
c0b4152
refactor: 代码重构
ArgoZhang May 13, 2025
113ce90
doc: 更新示例
ArgoZhang May 13, 2025
0244598
refactor: 增加 Count 参数
ArgoZhang May 13, 2025
62f9733
refactor: 增加 IsHeaderRow 参数设置
ArgoZhang May 13, 2025
11149cf
refactor: 重构 IsHeaderRow 逻辑
ArgoZhang May 13, 2025
ef092e1
refactor: 重构组件名称
ArgoZhang May 13, 2025
69e3b69
feat: 设计 Title 参数
ArgoZhang May 13, 2025
ec91a19
Merge branch 'main' into feat-filter
ArgoZhang May 13, 2025
19a15fe
refactor: 重构方法名称
ArgoZhang May 13, 2025
bd7699d
revert: 撤销更改
ArgoZhang May 13, 2025
38140b5
revert: 回复文档示例
ArgoZhang May 13, 2025
fc46c58
Revert "revert: 回复文档示例"
ArgoZhang May 13, 2025
dbe14b3
Revert "revert: 撤销更改"
ArgoZhang May 13, 2025
44dfaba
doc: 更新示例
ArgoZhang May 13, 2025
92bf36b
refactor: 移除 FieldKey 接口参数
ArgoZhang May 13, 2025
d85aad0
refactor: 更新过滤器类名
ArgoZhang May 13, 2025
baa70ea
refactor: 重构代码
ArgoZhang May 13, 2025
fbe163b
test: 增加单元测试
ArgoZhang May 13, 2025
119e170
test: 更新 EnumFilter 单元测试
ArgoZhang May 13, 2025
763e972
test: 增加 BoolFilter 单元测试
ArgoZhang May 13, 2025
f33a8a8
test: 增加 EnumFilter 单元测试
ArgoZhang May 13, 2025
c65affa
test: 增加 DateTimeFilter 单元测试
ArgoZhang May 13, 2025
0a97d1f
test: 增加 NumberFilter 单元测试
ArgoZhang May 13, 2025
4e35593
test: 增加 LookupFilter 单元测试
ArgoZhang May 14, 2025
e092706
test: 增加 MultiFilter 单元测试
ArgoZhang May 14, 2025
3c4150f
refactor: 精简代码
ArgoZhang May 14, 2025
88e8679
refactor: 代码格式化
ArgoZhang May 14, 2025
aaa1ad0
refactor: 更改判断逻辑
ArgoZhang May 14, 2025
427a9ab
doc: 增加注释
ArgoZhang May 14, 2025
250ace0
refactor: 增加 SearchFilterAction 单元测试
ArgoZhang May 14, 2025
3939e7e
refactor: 精简代码
ArgoZhang May 14, 2025
3e9f309
refactor: 使用 razor 文件
ArgoZhang May 14, 2025
57e32c2
refactor: 重构代码
ArgoZhang May 14, 2025
677e723
test: 补充单元测试
ArgoZhang May 14, 2025
48ac1da
refactor: 重构代码
ArgoZhang May 14, 2025
8ab1b24
test: 增加单元测试
ArgoZhang May 14, 2025
fa3e3d0
refactor: 精简代码
ArgoZhang May 14, 2025
ce24b60
test: 更新单元测试
ArgoZhang May 14, 2025
b4ee5c1
test: 更新单元测试
ArgoZhang May 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,50 +1,10 @@
@inherits FilterBase

<Select Items="@Items" @bind-Value="@Value" OnSelectedItemChanged="_ => OnFilterValueChanged()"></Select>
@if (IsHeaderRow)
{

@code {
private int Value = 10;

/// <summary>
/// OnInitialized 方法
/// </summary>
protected override void OnInitialized()
{
base.OnInitialized();

if (TableFilter != null) TableFilter.ShowMoreButton = false;

Items = new SelectedItem[]
{
new SelectedItem { Value = "10", Text = "大于 10" },
new SelectedItem { Value = "50", Text = "大于 50" },
new SelectedItem { Value = "100", Text = "大于 100" }
};
}

/// <summary>
/// 重置过滤条件方法
/// </summary>
public override void Reset()
{
Value = 10;

StateHasChanged();
}

/// <summary>
/// 生成过滤条件方法
/// </summary>
/// <returns></returns>
public override FilterKeyValueAction GetFilterConditions()
{
var filter = new FilterKeyValueAction() { Filters = new() };
filter.Filters.Add(new FilterKeyValueAction()
{
FieldKey = FieldKey,
FieldValue = Value,
FilterAction = FilterAction.GreaterThan
});
return filter;
}
}
else
{
<Select Items="@_items" @bind-Value="@Value"></Select>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the Apache 2.0 License
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone

namespace BootstrapBlazor.Server.Components.Components;

/// <summary>
///
/// </summary>
public partial class CustomerFilter
{
private int? Value;

private readonly IEnumerable<SelectedItem> _items = new SelectedItem[]
{
new() { Value = "", Text = "请选择 ..." },
new() { Value = "10", Text = "大于 10" },
new() { Value = "50", Text = "大于 50" },
new() { Value = "80", Text = "大于 80" }
};

/// <summary>
/// 重置过滤条件方法
/// </summary>
public override void Reset()
{
Value = null;
StateHasChanged();
}

/// <summary>
/// 生成过滤条件方法
/// </summary>
/// <returns></returns>
public override FilterKeyValueAction GetFilterConditions()
{
var filter = new FilterKeyValueAction() { Filters = [] };
if (Value != null)
{
filter.Filters.Add(new FilterKeyValueAction()
{
FieldKey = FieldKey,
FieldValue = Value.Value,
FilterAction = FilterAction.GreaterThan
});
}
return filter;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@
</DemoBlock>

<DemoBlock Title="@Localizer["FilterTemplateTitle"]"
Introduction="@Localizer["FilterTemplateIntro"]" Name="CustomerFilter">
Introduction="@Localizer["FilterTemplateIntro"]" Name="CustomFilter">
<section ignore>@((MarkupString)Localizer["TablesFilterTemplateDescription", ComponentSourceCodeUrl].Value)</section>

<Table TItem="Foo"
Expand All @@ -65,7 +65,7 @@
</TableColumn>
<TableColumn @bind-Field="@context.Count" Width="100" Sortable="true" Filterable="true">
<FilterTemplate>
<CustomerFilter></CustomerFilter>
<Filter TFilter="CustomerFilter"></Filter>
</FilterTemplate>
</TableColumn>
</TableColumns>
Expand All @@ -81,12 +81,12 @@
ShowSkeleton="true" ShowFilterHeader="true"
OnQueryAsync="@OnQueryAsync">
<TableColumns>
<TableColumn @bind-Field="@context.DateTime" Width="180" Sortable="true" />
<TableColumn @bind-Field="@context.Name" Width="100" Sortable="true" />
<TableColumn @bind-Field="@context.Address" Sortable="true" />
<TableColumn @bind-Field="@context.DateTime" Width="180" Sortable="true" Filterable="true" />
<TableColumn @bind-Field="@context.Name" Width="100" Sortable="true" Filterable="true" />
<TableColumn @bind-Field="@context.Address" Sortable="true" Filterable="true" />
<TableColumn @bind-Field="@context.Complete" Width="100" Sortable="true" Filterable="true" />
<TableColumn @bind-Field="@context.Education" Width="100" Sortable="true" Filterable="true" />
<TableColumn @bind-Field="@context.Count" Width="100" Sortable="true" DefaultSort="true" DefaultSortOrder="@SortOrder.Desc" />
<TableColumn @bind-Field="@context.Count" Width="100" Sortable="true" Filterable="true" DefaultSort="true" DefaultSortOrder="@SortOrder.Desc" />
</TableColumns>
</Table>
</DemoBlock>
Expand Down Expand Up @@ -211,22 +211,22 @@
<TableColumn @bind-Field="@context.DateTime" Width="180" Sortable="true" />
<TableColumn @bind-Field="@context.Name" Width="100" Sortable="true" Filterable="true">
<FilterTemplate>
<MultiFilter Items="_nameMultiFilterItems"></MultiFilter>
<Filter TFilter="MultiFilter" FilterParameters="_multiFilterParameter1"></Filter>
</FilterTemplate>
</TableColumn>
<TableColumn @bind-Field="@context.Address" Sortable="true" Filterable="true">
<FilterTemplate>
<MultiFilter OnGetItemsAsync="OnGetAddressItemsAsync"></MultiFilter>
<Filter TFilter="MultiFilter" FilterParameters="_multiFilterParameter2"></Filter>
</FilterTemplate>
</TableColumn>
<TableColumn @bind-Field="@context.Complete" Width="100" Sortable="true" Filterable="true">
<FilterTemplate>
<MultiFilter ShowSearch="false" Items="Items.Select(i => new SelectedItem(i.Complete.ToString()!, i.Complete.ToString()!)).DistinctBy(i => i.Value)"></MultiFilter>
<Filter TFilter="MultiFilter" FilterParameters="_multiFilterParameter3"></Filter>
</FilterTemplate>
</TableColumn>
<TableColumn @bind-Field="@context.Education" Width="100" Sortable="true" Filterable="true">
<FilterTemplate>
<MultiFilter ShowSearch="false" Items="Items.Select(i => new SelectedItem(i.Education.ToString()!, i.Education.ToString()!)).DistinctBy(i => i.Value)"></MultiFilter>
<Filter TFilter="MultiFilter" FilterParameters="_multiFilterParameter4"></Filter>
</FilterTemplate>
</TableColumn>
<TableColumn @bind-Field="@context.Count" Width="150" Sortable="true" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@ public partial class TablesFilter
[NotNull]
private Table<Foo>? TableSetFilter { get; set; }

private IEnumerable<SelectedItem> _nameMultiFilterItems = default!;
private readonly Dictionary<string, object> _multiFilterParameter1 = new();
private readonly Dictionary<string, object> _multiFilterParameter2 = new();
private readonly Dictionary<string, object> _multiFilterParameter3 = new();
private readonly Dictionary<string, object> _multiFilterParameter4 = new();

/// <summary>
/// OnInitialized 方法
Expand All @@ -39,7 +42,18 @@ protected override void OnInitialized()
base.OnInitialized();

Items = Foo.GenerateFoo(FooLocalizer);
_nameMultiFilterItems = Items.Select(i => new SelectedItem(i.Name!, i.Name!)).DistinctBy(i => i.Value);
var items1 = Items.Select(i => new SelectedItem(i.Name!, i.Name!)).DistinctBy(i => i.Value);
_multiFilterParameter1.Add(nameof(MultiFilter.Items), items1);

_multiFilterParameter2.Add(nameof(MultiFilter.OnGetItemsAsync), new Func<Task<List<SelectedItem>>>(OnGetAddressItemsAsync));

var items3 = Items.Select(i => new SelectedItem(i.Complete.ToString(), i.Complete.ToString())).DistinctBy(i => i.Value);
_multiFilterParameter3.Add(nameof(MultiFilter.Items), items3);
_multiFilterParameter3.Add(nameof(MultiFilter.ShowSearch), false);

var items4 = Items.Select(i => new SelectedItem(i.Education.ToString()!, i.Education.ToString()!)).DistinctBy(i => i.Value);
_multiFilterParameter4.Add(nameof(MultiFilter.Items), items4);
_multiFilterParameter4.Add(nameof(MultiFilter.ShowSearch), false);
}

private async Task<List<SelectedItem>> OnGetAddressItemsAsync()
Expand Down
5 changes: 3 additions & 2 deletions src/BootstrapBlazor/Components/Filters/BoolFilter.razor
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@

@if (IsHeaderRow)
{
<Select Items="@Items" @bind-Value="@Value" OnSelectedItemChanged="_ => OnFilterValueChanged()" IsPopover="true"></Select>
<Select Items="@Items" @bind-Value="@_value" ShowLabel="false" SkipValidate="true"
OnSelectedItemChanged="_ => OnFilterAsync()" IsPopover="true"></Select>
}
else
{
<Select Items="@Items" @bind-Value="@Value"></Select>
<Select Items="@Items" @bind-Value="@_value" ShowLabel="false" SkipValidate="true"></Select>
}
53 changes: 18 additions & 35 deletions src/BootstrapBlazor/Components/Filters/BoolFilter.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,33 +3,20 @@
// See the LICENSE file in the project root for more information.
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone

using Microsoft.Extensions.Localization;

namespace BootstrapBlazor.Components;

/// <summary>
/// 布尔类型过滤条件
/// BoolFilter component is used for boolean value filtering in table column.
/// </summary>
public partial class BoolFilter
{
private string Value { get; set; } = "";

[Inject]
[NotNull]
private IStringLocalizer<TableFilter>? Localizer { get; set; }

/// <summary>
/// <inheritdoc/>
/// Gets or sets the filter candidate items. It is recommended to use static data to avoid performance loss.
/// </summary>
protected override void OnInitialized()
{
base.OnInitialized();
[Parameter]
public IEnumerable<SelectedItem>? Items { get; set; }

if (TableFilter != null)
{
TableFilter.ShowMoreButton = false;
}
}
private string? _value;

/// <summary>
/// <inheritdoc/>
Expand All @@ -38,20 +25,20 @@ protected override void OnParametersSet()
{
base.OnParametersSet();

Items ??= new SelectedItem[]
{
new("", Localizer["BoolFilter.AllText"].Value),
new("true", Localizer["BoolFilter.TrueText"].Value),
new("false", Localizer["BoolFilter.FalseText"].Value)
};
Items ??=
[
new SelectedItem("", Localizer["BoolFilter.AllText"].Value),
new SelectedItem("true", Localizer["BoolFilter.TrueText"].Value),
new SelectedItem("false", Localizer["BoolFilter.FalseText"].Value)
];
}

/// <summary>
/// <inheritdoc/>
/// </summary>
public override void Reset()
{
Value = "";
_value = null;
StateHasChanged();
}

Expand All @@ -61,13 +48,13 @@ public override void Reset()
/// <returns></returns>
public override FilterKeyValueAction GetFilterConditions()
{
var filter = new FilterKeyValueAction() { Filters = [] };
if (!string.IsNullOrEmpty(Value))
var filter = new FilterKeyValueAction { Filters = [] };
if (!string.IsNullOrEmpty(_value))
{
filter.Filters.Add(new FilterKeyValueAction()
filter.Filters.Add(new FilterKeyValueAction
{
FieldKey = FieldKey,
FieldValue = Value == "true",
FieldValue = _value == "true",
FilterAction = FilterAction.Equal
});
}
Expand All @@ -79,14 +66,10 @@ public override FilterKeyValueAction GetFilterConditions()
/// </summary>
public override async Task SetFilterConditionsAsync(FilterKeyValueAction filter)
{
var first = filter.Filters?.FirstOrDefault() ?? filter;
var first = filter.Filters.FirstOrDefault() ?? filter;
if (first.FieldValue is bool value)
{
Value = value ? "true" : "false";
}
else if (first.FieldValue is null)
{
Value = "";
_value = value ? "true" : "false";
}
await base.SetFilterConditionsAsync(filter);
}
Expand Down
18 changes: 8 additions & 10 deletions src/BootstrapBlazor/Components/Filters/DateTimeFilter.razor
Original file line number Diff line number Diff line change
@@ -1,25 +1,23 @@
@namespace BootstrapBlazor.Components
@inherits FilterBase
@inherits MultipleFilterBase

@if (IsHeaderRow)
{
<div class="@FilterRowClassString">
<DateTimePicker class="is-filter" @bind-Value="Value1" OnValueChanged="_ => OnFilterValueChanged()"></DateTimePicker>
<FilterButton Items="Items" @bind-Value="Action1" OnSelectedItemChanged="_ => OnFilterValueChanged()" OnClearFilter="OnClearFilter" />
<DateTimePicker class="is-filter" @bind-Value="_value1" OnValueChanged="_ => OnFilterAsync()"
ShowLabel="false" SkipValidate="true"></DateTimePicker>
<FilterButton Items="Items" @bind-Value="_action1" OnSelectedItemChanged="_ => OnFilterAsync()" OnClearFilter="OnClearFilter"></FilterButton>
</div>
}
else
{
<Select Items="Items" @bind-Value="Action1"></Select>

<DateTimePicker class="is-filter" @bind-Value="Value1"></DateTimePicker>
<Select Items="Items" @bind-Value="_action1" ShowLabel="false" SkipValidate="true"></Select>
<DateTimePicker class="is-filter" @bind-Value="_value1" ShowLabel="false" SkipValidate="true"></DateTimePicker>

@if (Count > 0)
{
<FilterLogicItem @bind-Logic="Logic"></FilterLogicItem>

<Select Items="Items" @bind-Value="Action2"></Select>

<DateTimePicker class="is-filter" @bind-Value="Value2"></DateTimePicker>
<Select Items="Items" @bind-Value="_action2" ShowLabel="false" SkipValidate="true"></Select>
<DateTimePicker class="is-filter" @bind-Value="_value2" ShowLabel="false" SkipValidate="true"></DateTimePicker>
}
}
Loading
Loading