Skip to content

Commit dbae1d0

Browse files
fix(Table): support QueryPageOptions serialization (#7323)
* 添加 QueryPageOptions json序列化失败例子 * 测试通过 * 更新示例 * Revert "更新示例" This reverts commit 0bbbb21. * Revert "测试通过" This reverts commit d2db59e. # Conflicts: # src/BootstrapBlazor/Extensions/QueryPageOptionsExtensions.cs * Revert "添加 QueryPageOptions json序列化失败例子" This reverts commit 1679565. * revert: 撤销单元测试更改 * refactor: 优化代码 * feat: 增加 JsonFilterKeyValueActionConverter 转换器 * refactor: 更新 IFilterAction 序列化实现类 * test: 增加单元测试 * fix: 修复搜索过滤集合序列化逻辑 * refactor: 统一键值 --------- Co-authored-by: 2248356998 qq.com <2248356998@qq.com>
1 parent 2e5c675 commit dbae1d0

11 files changed

Lines changed: 330 additions & 81 deletions

File tree

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Licensed to the .NET Foundation under one or more agreements.
1+
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the Apache 2.0 License
33
// See the LICENSE file in the project root for more information.
44
// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone
@@ -45,9 +45,10 @@ private Task OnDragColumnEndAsync(string? columnName, IEnumerable<ITableColumn>
4545
private Task<QueryData<Foo>> OnQueryAsync(QueryPageOptions options)
4646
{
4747
IEnumerable<Foo> items = Items;
48+
4849
// 过滤
4950
var isFiltered = false;
50-
if (options.Filters.Any())
51+
if (options.Filters.Count != 0)
5152
{
5253
items = items.Where(options.Filters.GetFilterFunc<Foo>());
5354
isFiltered = true;

src/BootstrapBlazor/Components/Filters/FilterKeyValueAction.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ namespace BootstrapBlazor.Components;
1010
/// <summary>
1111
/// Filter 过滤条件项目 属性 <see cref="Filters"/> 为条件表达式,其之间关系由 <see cref="FilterLogic"/> 来决定
1212
/// </summary>
13+
[JsonConverter(typeof(JsonFilterKeyValueActionConverter))]
1314
public class FilterKeyValueAction
1415
{
1516
/// <summary>
@@ -20,7 +21,6 @@ public class FilterKeyValueAction
2021
/// <summary>
2122
/// 获得/设置 Filter 项字段值
2223
/// </summary>
23-
[JsonConverter(typeof(ObjectWithTypeConverter))]
2424
public object? FieldValue { get; set; }
2525

2626
/// <summary>

src/BootstrapBlazor/Components/Filters/IFilterAction.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Licensed to the .NET Foundation under one or more agreements.
1+
// Licensed to the .NET Foundation under one or more agreements.
22
// The .NET Foundation licenses this file to you under the Apache 2.0 License
33
// See the LICENSE file in the project root for more information.
44
// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone
@@ -10,7 +10,7 @@ namespace BootstrapBlazor.Components;
1010
/// <summary>
1111
/// IFilterAction 接口
1212
/// </summary>
13-
[JsonDerivedType(typeof(SearchFilterAction))]
13+
[JsonDerivedType(typeof(SerializeFilterAction))]
1414
public interface IFilterAction
1515
{
1616
/// <summary>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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(argo@live.ca) Website: https://www.blazor.zone
5+
6+
namespace BootstrapBlazor.Components;
7+
8+
/// <summary>
9+
/// 序列化过滤条件类为 <see cref="IFilterAction"/> 序列化使用
10+
/// </summary>
11+
public sealed class SerializeFilterAction : IFilterAction
12+
{
13+
/// <summary>
14+
/// 获得/设置 过滤条件集合
15+
/// </summary>
16+
public FilterKeyValueAction? Filter { get; set; }
17+
18+
/// <summary>
19+
/// 重置过滤条件方法
20+
/// </summary>
21+
public void Reset()
22+
{
23+
Filter = new();
24+
}
25+
26+
/// <summary>
27+
/// 设置过滤条件方法
28+
/// </summary>
29+
/// <param name="filter"></param>
30+
/// <returns></returns>
31+
public Task SetFilterConditionsAsync(FilterKeyValueAction filter)
32+
{
33+
Filter = filter;
34+
return Task.CompletedTask;
35+
}
36+
37+
/// <summary>
38+
/// 获取所有过滤条件集合
39+
/// </summary>
40+
/// <returns></returns>
41+
public FilterKeyValueAction GetFilterConditions() => Filter ?? new();
42+
}
Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
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(argo@live.ca) Website: https://www.blazor.zone
5+
6+
using System.Text.Json;
7+
using System.Text.Json.Serialization;
8+
9+
namespace BootstrapBlazor.Components;
10+
11+
/// <summary>
12+
/// <see cref="FilterKeyValueAction"/> 转换器
13+
/// </summary>
14+
public sealed class JsonFilterKeyValueActionConverter : JsonConverter<FilterKeyValueAction>
15+
{
16+
/// <summary>
17+
/// <inheritdoc/>
18+
/// </summary>
19+
/// <param name="reader"></param>
20+
/// <param name="typeToConvert"></param>
21+
/// <param name="options"></param>
22+
/// <returns></returns>
23+
public override FilterKeyValueAction? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
24+
{
25+
var action = new FilterKeyValueAction();
26+
if (reader.TokenType == JsonTokenType.StartObject)
27+
{
28+
Type? fieldValueType = null;
29+
while (reader.Read())
30+
{
31+
if (reader.TokenType == JsonTokenType.EndObject)
32+
{
33+
break;
34+
}
35+
if (reader.TokenType == JsonTokenType.PropertyName)
36+
{
37+
var propertyName = reader.GetString();
38+
reader.Read();
39+
switch (propertyName)
40+
{
41+
case "fieldKey":
42+
action.FieldKey = reader.GetString();
43+
break;
44+
case "fieldValueType":
45+
var typeName = reader.GetString();
46+
if (!string.IsNullOrEmpty(typeName))
47+
{
48+
fieldValueType = Type.GetType(typeName);
49+
}
50+
break;
51+
case "fieldValue":
52+
if (fieldValueType != null)
53+
{
54+
action.FieldValue = JsonSerializer.Deserialize(ref reader, fieldValueType, options);
55+
}
56+
else
57+
{
58+
action.FieldValue = reader.GetString();
59+
}
60+
break;
61+
case "filterAction":
62+
action.FilterAction = JsonSerializer.Deserialize<FilterAction>(ref reader, options);
63+
break;
64+
case "filterLogic":
65+
action.FilterLogic = JsonSerializer.Deserialize<FilterLogic>(ref reader, options);
66+
break;
67+
case "filters":
68+
var filters = JsonSerializer.Deserialize<List<FilterKeyValueAction>>(ref reader, options);
69+
if (filters != null)
70+
{
71+
action.Filters.AddRange(filters);
72+
}
73+
break;
74+
}
75+
}
76+
}
77+
}
78+
return action;
79+
}
80+
81+
/// <summary>
82+
/// <inheritdoc/>
83+
/// </summary>
84+
/// <param name="writer"></param>
85+
/// <param name="value"></param>
86+
/// <param name="options"></param>
87+
public override void Write(Utf8JsonWriter writer, FilterKeyValueAction value, JsonSerializerOptions options)
88+
{
89+
writer.WriteStartObject();
90+
writer.WriteString("fieldKey", value.FieldKey);
91+
92+
writer.WriteString("fieldValueType", value.FieldValue?.GetType().FullName);
93+
94+
writer.WritePropertyName("fieldValue");
95+
writer.WriteRawValue(JsonSerializer.Serialize(value.FieldValue, options));
96+
97+
writer.WritePropertyName("filterAction");
98+
writer.WriteRawValue(JsonSerializer.Serialize(value.FilterAction, options));
99+
100+
writer.WritePropertyName("filterLogic");
101+
writer.WriteRawValue(JsonSerializer.Serialize(value.FilterLogic, options));
102+
103+
writer.WriteStartArray("filters");
104+
foreach (var filter in value.Filters)
105+
{
106+
writer.WriteRawValue(JsonSerializer.Serialize(filter, options));
107+
}
108+
writer.WriteEndArray();
109+
110+
writer.WriteEndObject();
111+
}
112+
}

src/BootstrapBlazor/Converter/JsonQueryPageOptionConverter.cs

Lines changed: 110 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace BootstrapBlazor.Components;
1111
/// <summary>
1212
/// QueryPageOptions json converter
1313
/// </summary>
14-
public class JsonQueryPageOptionsConverter : JsonConverter<QueryPageOptions>
14+
public sealed class JsonQueryPageOptionsConverter : JsonConverter<QueryPageOptions>
1515
{
1616
/// <summary>
1717
/// <inheritdoc/>
@@ -104,14 +104,80 @@ public class JsonQueryPageOptionsConverter : JsonConverter<QueryPageOptions>
104104
reader.Read();
105105
ret.IsVirtualScroll = reader.GetBoolean();
106106
}
107-
108-
else if (propertyName == "filterKeyValueAction")
107+
else if (propertyName == "searches")
109108
{
110109
reader.Read();
111-
var val = JsonSerializer.Deserialize<FilterKeyValueAction>(ref reader, options);
112-
if (val != null)
110+
if (reader.TokenType == JsonTokenType.StartArray)
111+
{
112+
while (reader.Read())
113+
{
114+
if (reader.TokenType == JsonTokenType.EndArray)
115+
{
116+
break;
117+
}
118+
var val = JsonSerializer.Deserialize<SerializeFilterAction>(ref reader, options);
119+
if (val != null)
120+
{
121+
ret.Searches.Add(val);
122+
}
123+
}
124+
}
125+
}
126+
else if (propertyName == "customerSearches")
127+
{
128+
reader.Read();
129+
if (reader.TokenType == JsonTokenType.StartArray)
130+
{
131+
while (reader.Read())
132+
{
133+
if (reader.TokenType == JsonTokenType.EndArray)
134+
{
135+
break;
136+
}
137+
var val = JsonSerializer.Deserialize<SerializeFilterAction>(ref reader, options);
138+
if (val != null)
139+
{
140+
ret.CustomerSearches.Add(val);
141+
}
142+
}
143+
}
144+
}
145+
else if (propertyName == "advanceSearches")
146+
{
147+
reader.Read();
148+
if (reader.TokenType == JsonTokenType.StartArray)
149+
{
150+
while (reader.Read())
151+
{
152+
if (reader.TokenType == JsonTokenType.EndArray)
153+
{
154+
break;
155+
}
156+
var val = JsonSerializer.Deserialize<SerializeFilterAction>(ref reader, options);
157+
if (val != null)
158+
{
159+
ret.AdvanceSearches.Add(val);
160+
}
161+
}
162+
}
163+
}
164+
else if (propertyName == "filters")
165+
{
166+
reader.Read();
167+
if (reader.TokenType == JsonTokenType.StartArray)
113168
{
114-
ret.FilterKeyValueAction = val;
169+
while (reader.Read())
170+
{
171+
if (reader.TokenType == JsonTokenType.EndArray)
172+
{
173+
break;
174+
}
175+
var val = JsonSerializer.Deserialize<SerializeFilterAction>(ref reader, options);
176+
if (val != null)
177+
{
178+
ret.Filters.Add(val);
179+
}
180+
}
115181
}
116182
}
117183
else if (propertyName == "isFirstQuery")
@@ -186,12 +252,45 @@ public override void Write(Utf8JsonWriter writer, QueryPageOptions value, JsonSe
186252
{
187253
writer.WriteBoolean("isVirtualScroll", value.IsVirtualScroll);
188254
}
189-
190-
if (value.Searches.Count != 0||value.CustomerSearches.Count != 0||value.AdvanceSearches.Count != 0|| value.Filters.Count != 0)
255+
if (value.Searches.Count != 0)
256+
{
257+
writer.WriteStartArray("searches");
258+
foreach (var filter in value.Searches)
259+
{
260+
var serializeFilterAction = new SerializeFilterAction() { Filter = filter.GetFilterConditions() };
261+
writer.WriteRawValue(JsonSerializer.Serialize(serializeFilterAction, options));
262+
}
263+
writer.WriteEndArray();
264+
}
265+
if (value.CustomerSearches.Count != 0)
191266
{
192-
writer.WritePropertyName("filterKeyValueAction");
193-
var filterKeyValueAction = value.ToFilter();
194-
writer.WriteRawValue(JsonSerializer.Serialize(filterKeyValueAction, options));
267+
writer.WriteStartArray("customerSearches");
268+
foreach (var filter in value.CustomerSearches)
269+
{
270+
var serializeFilterAction = new SerializeFilterAction() { Filter = filter.GetFilterConditions() };
271+
writer.WriteRawValue(JsonSerializer.Serialize(serializeFilterAction, options));
272+
}
273+
writer.WriteEndArray();
274+
}
275+
if (value.AdvanceSearches.Count != 0)
276+
{
277+
writer.WriteStartArray("advanceSearches");
278+
foreach (var filter in value.AdvanceSearches)
279+
{
280+
var serializeFilterAction = new SerializeFilterAction() { Filter = filter.GetFilterConditions() };
281+
writer.WriteRawValue(JsonSerializer.Serialize(serializeFilterAction, options));
282+
}
283+
writer.WriteEndArray();
284+
}
285+
if (value.Filters.Count != 0)
286+
{
287+
writer.WriteStartArray("filters");
288+
foreach (var filter in value.Filters)
289+
{
290+
var serializeFilterAction = new SerializeFilterAction() { Filter = filter.GetFilterConditions() };
291+
writer.WriteRawValue(JsonSerializer.Serialize(serializeFilterAction, options));
292+
}
293+
writer.WriteEndArray();
195294
}
196295
if (value.IsFirstQuery)
197296
{

src/BootstrapBlazor/Converter/ObjectWithTypeConverter.cs

Lines changed: 0 additions & 34 deletions
This file was deleted.

0 commit comments

Comments
 (0)