From 314acb05b30ec7e33f623a8f6b401bb6f9e6bbf4 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 21 Mar 2025 17:30:03 +0800 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20DefaultVirtual?= =?UTF-8?q?izeItemText=20=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Select/MultiSelect.razor.cs | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/src/BootstrapBlazor/Components/Select/MultiSelect.razor.cs b/src/BootstrapBlazor/Components/Select/MultiSelect.razor.cs index 4e246e2630f..c59a459e7ba 100644 --- a/src/BootstrapBlazor/Components/Select/MultiSelect.razor.cs +++ b/src/BootstrapBlazor/Components/Select/MultiSelect.razor.cs @@ -112,6 +112,12 @@ public partial class MultiSelect [Parameter] public Func, Task>? OnSelectedItemsChanged { get; set; } + /// + /// Gets or sets the default virtualize items text. + /// + [Parameter] + public string? DefaultVirtualizeItemText { get; set; } + /// /// 获得/设置 全选按钮显示文本 /// @@ -158,6 +164,7 @@ public partial class MultiSelect [Parameter] [NotNull] public string? MinErrorMessage { get; set; } + [Inject] [NotNull] private IStringLocalizer>? Localizer { get; set; } @@ -167,7 +174,7 @@ public partial class MultiSelect private string? ScrollIntoViewBehaviorString => ScrollIntoViewBehavior == ScrollIntoViewBehavior.Smooth ? null : ScrollIntoViewBehavior.ToDescriptionString(); /// - /// OnParametersSet 方法 + /// /// protected override void OnParametersSet() { @@ -195,15 +202,15 @@ protected override void OnParametersSet() if (_lastSelectedValueString != _currentValue) { _lastSelectedValueString = _currentValue; - var list = _currentValue.Split(',', StringSplitOptions.RemoveEmptyEntries); SelectedItems.Clear(); if (IsVirtualize) { - SelectedItems.AddRange(list.Select(i => new SelectedItem(i, i))); + SelectedItems.AddRange(GetItemsByVirtualize()); } else { + var list = _currentValue.Split(',', StringSplitOptions.RemoveEmptyEntries); SelectedItems.AddRange(Rows.Where(item => list.Any(i => i.Trim() == item.Value))); } } @@ -232,6 +239,23 @@ protected override void OnAfterRender(bool firstRender) ToggleRow = nameof(ToggleRow) }); + private List GetItemsByVirtualize() + { + var ret = new List(); + var texts = new List(); + if (!string.IsNullOrEmpty(DefaultVirtualizeItemText)) + { + texts.AddRange(DefaultVirtualizeItemText.Split(',', StringSplitOptions.RemoveEmptyEntries)); + } + var values = CurrentValueAsString.Split(',', StringSplitOptions.RemoveEmptyEntries).ToList(); + for (int i = 0; i < values.Count; i++) + { + var text = i < texts.Count ? texts[i] : values[i]; + ret.Add(new SelectedItem(values[i], text)); + } + return ret; + } + private int _totalCount; private ItemsProviderResult _result; @@ -265,7 +289,7 @@ protected override async Task OnClearValue() } /// - /// FormatValueAsString 方法 + /// /// /// /// @@ -350,7 +374,7 @@ public async Task TriggerEditTag(string val) val = val.Trim(); if (OnEditCallback != null) { - ret = await OnEditCallback.Invoke(val); + ret = await OnEditCallback(val); } else if (!string.IsNullOrEmpty(val)) { From b6e659ecd2a47e8e275cc5355985ec5d452c2f92 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 21 Mar 2025 17:30:11 +0800 Subject: [PATCH 2/6] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E7=A4=BA=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/MultiSelects.razor | 14 ++++++++------ .../Components/Samples/MultiSelects.razor.cs | 15 +++++++++------ 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor b/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor index 1d29957a846..45c6f422717 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor @@ -5,7 +5,7 @@

@Localizer["MultiSelectsDescription"]

- +@*
@@ -293,7 +293,7 @@ private enum MultiSelectEnumFoo
-
+
*@ 1. 使用 OnQueryAsync 作为数据源

-
- +

2. 使用 Items 作为数据源

-
- +
diff --git a/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor.cs index cc926bd65b0..cf925132be6 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor.cs @@ -113,11 +113,12 @@ private enum MultiSelectEnumFoo [NotNull] private List? Foos { get; set; } - private string? _virtualItemString1; + private string? _virtualItemValue1; + private string? _virtualItemValue2; + private string? _virtualItemText1; + private string? _virtualItemText2; - private string? _virtualItemString2; - - private IEnumerable VirtualItems => Foos.Select(i => new SelectedItem(i.Name!, i.Name!)).ToList(); + private IEnumerable VirtualItems => Foos.Select(i => new SelectedItem(i.Id.ToString(), i.Name!)).ToList(); private string? _editString; private bool _isClearable = true; @@ -213,8 +214,10 @@ protected override void OnInitialized() Items = GenerateDataSource(DataSource); Foos = Foo.GenerateFoo(LocalizerFoo); - _virtualItemString1 = Foos[79].Name; - _virtualItemString2 = Foos[45].Name; + _virtualItemValue1 = $"{Foos[79].Id}, {Foos[78].Id}"; + _virtualItemValue2 = $"{Foos[45].Id}, {Foos[46].Id}"; + _virtualItemText1 = $"{Foos[79].Name}, {Foos[78].Name}"; + _virtualItemText2 = $"{Foos[45].Name}, {Foos[46].Name}"; } private static List GenerateItems() => From 312504f7c232c9e8342cc3168dd8f4a2b1505faa Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 21 Mar 2025 20:07:59 +0800 Subject: [PATCH 3/6] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Components/MultiSelectTest.cs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/test/UnitTest/Components/MultiSelectTest.cs b/test/UnitTest/Components/MultiSelectTest.cs index 67dd655fbfa..4561021c772 100644 --- a/test/UnitTest/Components/MultiSelectTest.cs +++ b/test/UnitTest/Components/MultiSelectTest.cs @@ -668,7 +668,7 @@ public void IsMarkupString_Ok() } [Fact] - public void IsVirtualize_Items() + public void DefaultVirtualizeItemText_Ok() { var cut = Context.RenderComponent>(pb => { @@ -677,19 +677,14 @@ public void IsVirtualize_Items() new("1", "Test1"), new("2", "Test2") }); - pb.Add(a => a.Value, "2"); + pb.Add(a => a.Value, "1,2"); + pb.Add(a => a.DefaultVirtualizeItemText, "Test1"); pb.Add(a => a.IsVirtualize, true); - pb.Add(a => a.RowHeight, 33f); - pb.Add(a => a.OverscanCount, 4); - }); - - cut.SetParametersAndRender(pb => pb.Add(a => a.ShowSearch, true)); - cut.InvokeAsync(async () => - { - // 搜索 T - cut.Find(".search-text").Input("T"); - await cut.Instance.ConfirmSelectedItem(0); }); + var items = cut.FindAll(".multi-select-items .multi-select-item"); + Assert.Equal(2, items.Count); + Assert.Equal("Test1", items[0].InnerHtml); + Assert.Equal("2", items[1].InnerHtml); } [Fact] From 4eef012f0b914c00f095b68385c1f8fa5d4a56c6 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 21 Mar 2025 20:12:28 +0800 Subject: [PATCH 4/6] =?UTF-8?q?revert:=20=E6=92=A4=E9=94=80=E6=96=87?= =?UTF-8?q?=E6=A1=A3=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/MultiSelects.razor | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor b/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor index 45c6f422717..6a6ecb4a7a7 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor +++ b/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor @@ -5,7 +5,7 @@

@Localizer["MultiSelectsDescription"]

-@* +
@@ -293,7 +293,7 @@ private enum MultiSelectEnumFoo
-
*@ +
Date: Fri, 21 Mar 2025 20:19:59 +0800 Subject: [PATCH 5/6] =?UTF-8?q?doc:=20=E6=9B=B4=E6=96=B0=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Samples/MultiSelects.razor.cs | 8 ++++++++ .../Components/Samples/Selects.razor.cs | 8 ++++++++ src/BootstrapBlazor.Server/Locales/en-US.json | 6 ++++-- src/BootstrapBlazor.Server/Locales/zh-CN.json | 6 ++++-- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor.cs index cf925132be6..2f93ec157b0 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor.cs @@ -485,6 +485,14 @@ private AttributeItem[] GetAttributes() => Type = "bool", ValueList = "true|false", DefaultValue = "false" + }, + new() + { + Name = nameof(MultiSelect.DefaultVirtualizeItemText), + Description = Localizer["MultiSelectsAttribute_DefaultVirtualizeItemText"], + Type = "string", + ValueList = " — ", + DefaultValue = " — " } ]; } diff --git a/src/BootstrapBlazor.Server/Components/Samples/Selects.razor.cs b/src/BootstrapBlazor.Server/Components/Samples/Selects.razor.cs index 4eb82111198..4c2eb39bbdf 100644 --- a/src/BootstrapBlazor.Server/Components/Samples/Selects.razor.cs +++ b/src/BootstrapBlazor.Server/Components/Samples/Selects.razor.cs @@ -423,6 +423,14 @@ private AttributeItem[] GetAttributes() => Type = "bool", ValueList = "true|false", DefaultValue = "false" + }, + new() + { + Name = nameof(Select.DefaultVirtualizeItemText), + Description = Localizer["SelectsDefaultVirtualizeItemText"], + Type = "string", + ValueList = " — ", + DefaultValue = " — " } ]; } diff --git a/src/BootstrapBlazor.Server/Locales/en-US.json b/src/BootstrapBlazor.Server/Locales/en-US.json index b4222f97bd4..63fe6cc4810 100644 --- a/src/BootstrapBlazor.Server/Locales/en-US.json +++ b/src/BootstrapBlazor.Server/Locales/en-US.json @@ -3031,7 +3031,8 @@ "MultiSelectVirtualizeIntro": "Set IsVirtualize to true enable virtual scroll for large data", "MultiSelectVirtualizeDescription": "Component virtual scrolling supports two ways of providing data through Items or OnQueryAsync callback methods", "MultiSelectsAttribute_ShowSearch": "Whether to display the search box", - "MultiSelectsAttribute_IsVirtualize": "Wether to enable virtualize" + "MultiSelectsAttribute_IsVirtualize": "Wether to enable virtualize", + "MultiSelectsAttribute_DefaultVirtualizeItemText": "The text string corresponding to the first load value when virtual scrolling is turned on is separated by commas" }, "BootstrapBlazor.Server.Components.Samples.Radios": { "RadiosTitle": "Radio", @@ -3208,7 +3209,8 @@ "SelectsOnInputChangedCallback": "Callback method for converting input text into corresponding Value in edit mode", "TextConvertToValueCallback": "Callback method when input text changes in edit mode", "SelectsIsEditable": "Whether editable", - "SelectsIsVirtualize": "Wether to enable virtualize" + "SelectsIsVirtualize": "Wether to enable virtualize", + "SelectsDefaultVirtualizeItemText": "The text string corresponding to the first load value when virtual scrolling is turned on is separated by commas" }, "BootstrapBlazor.Server.Components.Samples.Sliders": { "SlidersTitle": "Slider", diff --git a/src/BootstrapBlazor.Server/Locales/zh-CN.json b/src/BootstrapBlazor.Server/Locales/zh-CN.json index 38185aa07b4..5450fd520d7 100644 --- a/src/BootstrapBlazor.Server/Locales/zh-CN.json +++ b/src/BootstrapBlazor.Server/Locales/zh-CN.json @@ -3031,7 +3031,8 @@ "MultiSelectVirtualizeIntro": "通过设置 IsVirtualize 参数开启组件虚拟功能特性", "MultiSelectVirtualizeDescription": "组件虚拟滚动支持两种形式通过 Items 或者 OnQueryAsync 回调方法提供数据", "MultiSelectsAttribute_ShowSearch": "是否显示搜索框", - "MultiSelectsAttribute_IsVirtualize": "是否开启虚拟滚动" + "MultiSelectsAttribute_IsVirtualize": "是否开启虚拟滚动", + "MultiSelectsAttribute_DefaultVirtualizeItemText": "开启虚拟滚动时首次加载 Value 对应的文本字符串用逗号分割" }, "BootstrapBlazor.Server.Components.Samples.Radios": { "RadiosTitle": "Radio 单选框", @@ -3208,7 +3209,8 @@ "SelectsOnInputChangedCallback": "编辑模式下输入文本转换为对应 Value 回调方法", "TextConvertToValueCallback": "编辑模式下输入文本变化时回调方法", "SelectsIsEditable": "是否可编辑", - "SelectsIsVirtualize": "是否开启虚拟滚动" + "SelectsIsVirtualize": "是否开启虚拟滚动", + "SelectsDefaultVirtualizeItemText": "开启虚拟滚动时首次加载 Value 对应的文本字符串用逗号分割" }, "BootstrapBlazor.Server.Components.Samples.Sliders": { "SlidersTitle": "Slider 滑块", From 4923368bc84aefcc2c938dacbf54ca815690fe5f Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Fri, 21 Mar 2025 20:22:11 +0800 Subject: [PATCH 6/6] chore: bump version 9.5.0-beta10 --- src/BootstrapBlazor/BootstrapBlazor.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 7001e10fdeb..40666cb0b8f 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@  - 9.4.10 + 9.5.0-beta10