Skip to content

Commit 5e0ea8f

Browse files
authored
feat(MultiSelect): add DefaultVirtualizeItemText parameter (#5682)
* feat: 增加 DefaultVirtualizeItemText 方法 * doc: 更新示例 * test: 更新单元测试 * revert: 撤销文档更新 * doc: 更新参数注释文档 * chore: bump version 9.5.0-beta10
1 parent 9c752c8 commit 5e0ea8f

File tree

8 files changed

+76
-32
lines changed

8 files changed

+76
-32
lines changed

src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -325,26 +325,28 @@ private enum MultiSelectEnumFoo
325325
<p class="code-label">1. 使用 OnQueryAsync 作为数据源</p>
326326
<div class="row mb-3">
327327
<div class="col-6">
328-
<MultiSelect IsVirtualize="true" @bind-Value="_virtualItemString1" OnQueryAsync="OnQueryAsync"
328+
<MultiSelect IsVirtualize="true" @bind-Value="_virtualItemValue1" DefaultVirtualizeItemText="@_virtualItemText1"
329+
OnQueryAsync="OnQueryAsync"
329330
ShowSearch="_showSearch" ShowToolbar="_showToolbar"
330331
IsClearable="_isClearable">
331332
</MultiSelect>
332333
</div>
333334
<div class="col-6">
334-
<Display TValue="string" Value="@_virtualItemString1"></Display>
335+
<Display TValue="string" Value="@_virtualItemValue1"></Display>
335336
</div>
336337
</div>
337338

338339
<p class="code-label">2. 使用 Items 作为数据源</p>
339340
<div class="row">
340341
<div class="col-6">
341-
<MultiSelect IsVirtualize="true" @bind-Value="_virtualItemString2" Items="VirtualItems"
342+
<MultiSelect IsVirtualize="true" @bind-Value="_virtualItemValue2" DefaultVirtualizeItemText="@_virtualItemText2"
343+
Items="VirtualItems"
342344
ShowSearch="_showSearch" ShowToolbar="_showToolbar"
343345
IsClearable="_isClearable">
344346
</MultiSelect>
345347
</div>
346348
<div class="col-6">
347-
<Display TValue="string" Value="@_virtualItemString2"></Display>
349+
<Display TValue="string" Value="@_virtualItemValue2"></Display>
348350
</div>
349351
</div>
350352
</DemoBlock>

src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor.cs

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,12 @@ private enum MultiSelectEnumFoo
113113
[NotNull]
114114
private List<Foo>? Foos { get; set; }
115115

116-
private string? _virtualItemString1;
116+
private string? _virtualItemValue1;
117+
private string? _virtualItemValue2;
118+
private string? _virtualItemText1;
119+
private string? _virtualItemText2;
117120

118-
private string? _virtualItemString2;
119-
120-
private IEnumerable<SelectedItem> VirtualItems => Foos.Select(i => new SelectedItem(i.Name!, i.Name!)).ToList();
121+
private IEnumerable<SelectedItem> VirtualItems => Foos.Select(i => new SelectedItem(i.Id.ToString(), i.Name!)).ToList();
121122

122123
private string? _editString;
123124
private bool _isClearable = true;
@@ -213,8 +214,10 @@ protected override void OnInitialized()
213214

214215
Items = GenerateDataSource(DataSource);
215216
Foos = Foo.GenerateFoo(LocalizerFoo);
216-
_virtualItemString1 = Foos[79].Name;
217-
_virtualItemString2 = Foos[45].Name;
217+
_virtualItemValue1 = $"{Foos[79].Id}, {Foos[78].Id}";
218+
_virtualItemValue2 = $"{Foos[45].Id}, {Foos[46].Id}";
219+
_virtualItemText1 = $"{Foos[79].Name}, {Foos[78].Name}";
220+
_virtualItemText2 = $"{Foos[45].Name}, {Foos[46].Name}";
218221
}
219222

220223
private static List<SelectedItem> GenerateItems() =>
@@ -482,6 +485,14 @@ private AttributeItem[] GetAttributes() =>
482485
Type = "bool",
483486
ValueList = "true|false",
484487
DefaultValue = "false"
488+
},
489+
new()
490+
{
491+
Name = nameof(MultiSelect<string>.DefaultVirtualizeItemText),
492+
Description = Localizer["MultiSelectsAttribute_DefaultVirtualizeItemText"],
493+
Type = "string",
494+
ValueList = " — ",
495+
DefaultValue = " — "
485496
}
486497
];
487498
}

src/BootstrapBlazor.Server/Components/Samples/Selects.razor.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,14 @@ private AttributeItem[] GetAttributes() =>
423423
Type = "bool",
424424
ValueList = "true|false",
425425
DefaultValue = "false"
426+
},
427+
new()
428+
{
429+
Name = nameof(Select<string>.DefaultVirtualizeItemText),
430+
Description = Localizer["SelectsDefaultVirtualizeItemText"],
431+
Type = "string",
432+
ValueList = " — ",
433+
DefaultValue = " — "
426434
}
427435
];
428436
}

src/BootstrapBlazor.Server/Locales/en-US.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3031,7 +3031,8 @@
30313031
"MultiSelectVirtualizeIntro": "Set <code>IsVirtualize</code> to <b>true</b> enable virtual scroll for large data",
30323032
"MultiSelectVirtualizeDescription": "Component virtual scrolling supports two ways of providing data through <code>Items</code> or <code>OnQueryAsync</code> callback methods",
30333033
"MultiSelectsAttribute_ShowSearch": "Whether to display the search box",
3034-
"MultiSelectsAttribute_IsVirtualize": "Wether to enable virtualize"
3034+
"MultiSelectsAttribute_IsVirtualize": "Wether to enable virtualize",
3035+
"MultiSelectsAttribute_DefaultVirtualizeItemText": "The text string corresponding to the first load value when virtual scrolling is turned on is separated by commas"
30353036
},
30363037
"BootstrapBlazor.Server.Components.Samples.Radios": {
30373038
"RadiosTitle": "Radio",
@@ -3208,7 +3209,8 @@
32083209
"SelectsOnInputChangedCallback": "Callback method for converting input text into corresponding Value in edit mode",
32093210
"TextConvertToValueCallback": "Callback method when input text changes in edit mode",
32103211
"SelectsIsEditable": "Whether editable",
3211-
"SelectsIsVirtualize": "Wether to enable virtualize"
3212+
"SelectsIsVirtualize": "Wether to enable virtualize",
3213+
"SelectsDefaultVirtualizeItemText": "The text string corresponding to the first load value when virtual scrolling is turned on is separated by commas"
32123214
},
32133215
"BootstrapBlazor.Server.Components.Samples.Sliders": {
32143216
"SlidersTitle": "Slider",

src/BootstrapBlazor.Server/Locales/zh-CN.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3031,7 +3031,8 @@
30313031
"MultiSelectVirtualizeIntro": "通过设置 <code>IsVirtualize</code> 参数开启组件虚拟功能特性",
30323032
"MultiSelectVirtualizeDescription": "组件虚拟滚动支持两种形式通过 <code>Items</code> 或者 <code>OnQueryAsync</code> 回调方法提供数据",
30333033
"MultiSelectsAttribute_ShowSearch": "是否显示搜索框",
3034-
"MultiSelectsAttribute_IsVirtualize": "是否开启虚拟滚动"
3034+
"MultiSelectsAttribute_IsVirtualize": "是否开启虚拟滚动",
3035+
"MultiSelectsAttribute_DefaultVirtualizeItemText": "开启虚拟滚动时首次加载 Value 对应的文本字符串用逗号分割"
30353036
},
30363037
"BootstrapBlazor.Server.Components.Samples.Radios": {
30373038
"RadiosTitle": "Radio 单选框",
@@ -3208,7 +3209,8 @@
32083209
"SelectsOnInputChangedCallback": "编辑模式下输入文本转换为对应 Value 回调方法",
32093210
"TextConvertToValueCallback": "编辑模式下输入文本变化时回调方法",
32103211
"SelectsIsEditable": "是否可编辑",
3211-
"SelectsIsVirtualize": "是否开启虚拟滚动"
3212+
"SelectsIsVirtualize": "是否开启虚拟滚动",
3213+
"SelectsDefaultVirtualizeItemText": "开启虚拟滚动时首次加载 Value 对应的文本字符串用逗号分割"
32123214
},
32133215
"BootstrapBlazor.Server.Components.Samples.Sliders": {
32143216
"SlidersTitle": "Slider 滑块",

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.4.10</Version>
4+
<Version>9.5.0-beta10</Version>
55
</PropertyGroup>
66

77
<ItemGroup>

src/BootstrapBlazor/Components/Select/MultiSelect.razor.cs

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,12 @@ public partial class MultiSelect<TValue>
112112
[Parameter]
113113
public Func<IEnumerable<SelectedItem>, Task>? OnSelectedItemsChanged { get; set; }
114114

115+
/// <summary>
116+
/// Gets or sets the default virtualize items text.
117+
/// </summary>
118+
[Parameter]
119+
public string? DefaultVirtualizeItemText { get; set; }
120+
115121
/// <summary>
116122
/// 获得/设置 全选按钮显示文本
117123
/// </summary>
@@ -158,6 +164,7 @@ public partial class MultiSelect<TValue>
158164
[Parameter]
159165
[NotNull]
160166
public string? MinErrorMessage { get; set; }
167+
161168
[Inject]
162169
[NotNull]
163170
private IStringLocalizer<MultiSelect<TValue>>? Localizer { get; set; }
@@ -167,7 +174,7 @@ public partial class MultiSelect<TValue>
167174
private string? ScrollIntoViewBehaviorString => ScrollIntoViewBehavior == ScrollIntoViewBehavior.Smooth ? null : ScrollIntoViewBehavior.ToDescriptionString();
168175

169176
/// <summary>
170-
/// OnParametersSet 方法
177+
/// <inheritdoc/>
171178
/// </summary>
172179
protected override void OnParametersSet()
173180
{
@@ -195,15 +202,15 @@ protected override void OnParametersSet()
195202
if (_lastSelectedValueString != _currentValue)
196203
{
197204
_lastSelectedValueString = _currentValue;
198-
var list = _currentValue.Split(',', StringSplitOptions.RemoveEmptyEntries);
199205

200206
SelectedItems.Clear();
201207
if (IsVirtualize)
202208
{
203-
SelectedItems.AddRange(list.Select(i => new SelectedItem(i, i)));
209+
SelectedItems.AddRange(GetItemsByVirtualize());
204210
}
205211
else
206212
{
213+
var list = _currentValue.Split(',', StringSplitOptions.RemoveEmptyEntries);
207214
SelectedItems.AddRange(Rows.Where(item => list.Any(i => i.Trim() == item.Value)));
208215
}
209216
}
@@ -232,6 +239,23 @@ protected override void OnAfterRender(bool firstRender)
232239
ToggleRow = nameof(ToggleRow)
233240
});
234241

242+
private List<SelectedItem> GetItemsByVirtualize()
243+
{
244+
var ret = new List<SelectedItem>();
245+
var texts = new List<string>();
246+
if (!string.IsNullOrEmpty(DefaultVirtualizeItemText))
247+
{
248+
texts.AddRange(DefaultVirtualizeItemText.Split(',', StringSplitOptions.RemoveEmptyEntries));
249+
}
250+
var values = CurrentValueAsString.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList();
251+
for (int i = 0; i < values.Count; i++)
252+
{
253+
var text = i < texts.Count ? texts[i] : values[i];
254+
ret.Add(new SelectedItem(values[i], text));
255+
}
256+
return ret;
257+
}
258+
235259
private int _totalCount;
236260
private ItemsProviderResult<SelectedItem> _result;
237261

@@ -265,7 +289,7 @@ protected override async Task OnClearValue()
265289
}
266290

267291
/// <summary>
268-
/// FormatValueAsString 方法
292+
/// <inheritdoc/>
269293
/// </summary>
270294
/// <param name="value"></param>
271295
/// <returns></returns>
@@ -350,7 +374,7 @@ public async Task<bool> TriggerEditTag(string val)
350374
val = val.Trim();
351375
if (OnEditCallback != null)
352376
{
353-
ret = await OnEditCallback.Invoke(val);
377+
ret = await OnEditCallback(val);
354378
}
355379
else if (!string.IsNullOrEmpty(val))
356380
{

test/UnitTest/Components/MultiSelectTest.cs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ public void IsMarkupString_Ok()
668668
}
669669

670670
[Fact]
671-
public void IsVirtualize_Items()
671+
public void DefaultVirtualizeItemText_Ok()
672672
{
673673
var cut = Context.RenderComponent<MultiSelect<string>>(pb =>
674674
{
@@ -677,19 +677,14 @@ public void IsVirtualize_Items()
677677
new("1", "Test1"),
678678
new("2", "Test2")
679679
});
680-
pb.Add(a => a.Value, "2");
680+
pb.Add(a => a.Value, "1,2");
681+
pb.Add(a => a.DefaultVirtualizeItemText, "Test1");
681682
pb.Add(a => a.IsVirtualize, true);
682-
pb.Add(a => a.RowHeight, 33f);
683-
pb.Add(a => a.OverscanCount, 4);
684-
});
685-
686-
cut.SetParametersAndRender(pb => pb.Add(a => a.ShowSearch, true));
687-
cut.InvokeAsync(async () =>
688-
{
689-
// 搜索 T
690-
cut.Find(".search-text").Input("T");
691-
await cut.Instance.ConfirmSelectedItem(0);
692683
});
684+
var items = cut.FindAll(".multi-select-items .multi-select-item");
685+
Assert.Equal(2, items.Count);
686+
Assert.Equal("Test1", items[0].InnerHtml);
687+
Assert.Equal("2", items[1].InnerHtml);
693688
}
694689

695690
[Fact]

0 commit comments

Comments
 (0)