Skip to content

Commit 504a34d

Browse files
committed
Merge branch 'main' into feat-chat-deepseek
2 parents 0937b35 + 7921a8a commit 504a34d

27 files changed

+913
-539
lines changed

src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
<PackageReference Include="BootstrapBlazor.Chart" Version="9.0.0" />
3232
<PackageReference Include="BootstrapBlazor.CherryMarkdown" Version="9.0.0" />
3333
<PackageReference Include="BootstrapBlazor.Dock" Version="9.0.0" />
34-
<PackageReference Include="BootstrapBlazor.DockView" Version="9.1.3" />
34+
<PackageReference Include="BootstrapBlazor.DockView" Version="9.1.5" />
3535
<PackageReference Include="BootstrapBlazor.DriverJs" Version="9.0.3" />
3636
<PackageReference Include="BootstrapBlazor.ElementIcon" Version="9.0.3" />
3737
<PackageReference Include="BootstrapBlazor.FileViewer" Version="9.0.0" />

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

Lines changed: 68 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,18 +123,24 @@ private enum MultiSelectEnumFoo
123123
<Checkbox @bind-Value="@_isFixedSearch" />
124124
</BootstrapInputGroup>
125125
</div>
126+
<div class="col-12 col-sm-6">
127+
<BootstrapInputGroup>
128+
<BootstrapInputGroupLabel DisplayText="IsClearable" />
129+
<Checkbox @bind-Value="@_isClearable" />
130+
</BootstrapInputGroup>
131+
</div>
126132
</div>
127133
</section>
128134

129135
<div class="row g-3">
130136
<div class="col-12 col-sm-6">
131137
<MultiSelect Items="@Items" @bind-Value="@SelectedSearchItemsValue"
132-
ShowSearch="true" IsFixedSearch="_isFixedSearch" OnSearchTextChanged="@OnSearch">
138+
ShowSearch="true" IsFixedSearch="_isFixedSearch" IsClearable="_isClearable" OnSearchTextChanged="@OnSearch">
133139
</MultiSelect>
134140
</div>
135141
<div class="col-12 col-sm-6">
136142
<MultiSelect Items="@LongItems" @bind-Value="@SelectedMaxItemsValue"
137-
ShowSearch="true" IsFixedSearch="_isFixedSearch">
143+
ShowSearch="true" IsFixedSearch="_isFixedSearch" IsClearable="_isClearable">
138144
</MultiSelect>
139145
</div>
140146
</div>
@@ -295,6 +301,66 @@ private enum MultiSelectEnumFoo
295301
</div>
296302
</DemoBlock>
297303

304+
<DemoBlock Title="@Localizer["MultiSelectVirtualizeTitle"]"
305+
Introduction="@Localizer["MultiSelectVirtualizeIntro"]"
306+
Name="IsVirtualize">
307+
<section ignore>
308+
<p>@((MarkupString)Localizer["MultiSelectVirtualizeDescription"].Value)</p>
309+
<div class="row g-3">
310+
<div class="col-12 col-sm-6">
311+
<BootstrapInputGroup>
312+
<BootstrapInputGroupLabel DisplayText="ShowSearch" />
313+
<Checkbox @bind-Value="@_showSearch" />
314+
</BootstrapInputGroup>
315+
</div>
316+
<div class="col-12 col-sm-6">
317+
<BootstrapInputGroup>
318+
<BootstrapInputGroupLabel DisplayText="IsFixedSearch" />
319+
<Checkbox @bind-Value="@_isFixedSearch" />
320+
</BootstrapInputGroup>
321+
</div>
322+
<div class="col-12 col-sm-6">
323+
<BootstrapInputGroup>
324+
<BootstrapInputGroupLabel DisplayText="ShowToolbar" />
325+
<Checkbox @bind-Value="@_showToolbar" />
326+
</BootstrapInputGroup>
327+
</div>
328+
<div class="col-12 col-sm-6">
329+
<BootstrapInputGroup>
330+
<BootstrapInputGroupLabel DisplayText="IsClearable" />
331+
<Checkbox @bind-Value="@_isClearable" />
332+
</BootstrapInputGroup>
333+
</div>
334+
</div>
335+
</section>
336+
337+
<p class="code-label">1. 使用 OnQueryAsync 作为数据源</p>
338+
<div class="row mb-3">
339+
<div class="col-6">
340+
<MultiSelect IsVirtualize="true" @bind-Value="_virtualItemString1" OnQueryAsync="OnQueryAsync"
341+
ShowSearch="_showSearch" ShowToolbar="_showToolbar"
342+
IsFixedSearch="_isFixedSearch" IsClearable="_isClearable">
343+
</MultiSelect>
344+
</div>
345+
<div class="col-6">
346+
<Display TValue="string" Value="@_virtualItemString1"></Display>
347+
</div>
348+
</div>
349+
350+
<p class="code-label">2. 使用 Items 作为数据源</p>
351+
<div class="row">
352+
<div class="col-6">
353+
<MultiSelect IsVirtualize="true" @bind-Value="_virtualItemString2" Items="VirtualItems"
354+
ShowSearch="_showSearch" ShowToolbar="_showToolbar"
355+
IsFixedSearch="_isFixedSearch" IsClearable="_isClearable">
356+
</MultiSelect>
357+
</div>
358+
<div class="col-6">
359+
<Display TValue="string" Value="@_virtualItemString2"></Display>
360+
</div>
361+
</div>
362+
</DemoBlock>
363+
298364
<AttributeTable Items="@GetAttributes()"></AttributeTable>
299365

300366
<EventTable Items="@GetEvents()"></EventTable>

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

Lines changed: 53 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ namespace BootstrapBlazor.Server.Components.Samples;
1010
/// </summary>
1111
public partial class MultiSelects
1212
{
13+
[Inject]
14+
[NotNull]
15+
private IStringLocalizer<Foo>? LocalizerFoo { get; set; }
16+
1317
/// <summary>
1418
/// Foo 类为Demo测试用,如有需要请自行下载源码查阅
1519
/// Foo class is used for Demo tet, please download the source code if necessary
@@ -106,9 +110,21 @@ private enum MultiSelectEnumFoo
106110

107111
private List<SelectedItem> CascadingItems1 { get; set; } = [];
108112

113+
[NotNull]
114+
private List<Foo>? Foos { get; set; }
115+
116+
private string? _virtualItemString1;
117+
118+
private string? _virtualItemString2;
119+
120+
private IEnumerable<SelectedItem> VirtualItems => Foos.Select(i => new SelectedItem(i.Name!, i.Name!)).ToList();
121+
109122
private string? _editString;
110123

111-
private bool _isFixedSearch;
124+
private bool _isFixedSearch = true;
125+
private bool _isClearable = true;
126+
private bool _showToolbar = true;
127+
private bool _showSearch = true;
112128

113129
private async Task<SelectedItem> OnEditCallback(string value)
114130
{
@@ -123,6 +139,21 @@ private async Task<SelectedItem> OnEditCallback(string value)
123139
return item;
124140
}
125141

142+
private async Task<QueryData<SelectedItem>> OnQueryAsync(VirtualizeQueryOption option)
143+
{
144+
await Task.Delay(200);
145+
var items = Foos;
146+
if (!string.IsNullOrEmpty(option.SearchText))
147+
{
148+
items = [.. Foos.Where(i => i.Name!.Contains(option.SearchText, StringComparison.OrdinalIgnoreCase))];
149+
}
150+
return new QueryData<SelectedItem>
151+
{
152+
Items = items.Skip(option.StartIndex).Take(option.Count).Select(i => new SelectedItem(i.Name!, i.Name!)),
153+
TotalCount = items.Count
154+
};
155+
}
156+
126157
private SelectedItem[] GroupItems { get; } =
127158
[
128159
new("Jilin", "吉林") { GroupName = "东北"},
@@ -142,7 +173,7 @@ private async Task<SelectedItem> OnEditCallback(string value)
142173
];
143174

144175
/// <summary>
145-
/// OnInitialized
176+
/// <inheritdoc/>
146177
/// </summary>
147178
protected override void OnInitialized()
148179
{
@@ -183,6 +214,9 @@ protected override void OnInitialized()
183214
LongItems = GenerateDataSource(LongDataSource);
184215

185216
Items = GenerateDataSource(DataSource);
217+
Foos = Foo.GenerateFoo(LocalizerFoo);
218+
_virtualItemString1 = Foos[79].Name;
219+
_virtualItemString2 = Foos[45].Name;
186220
}
187221

188222
private static List<SelectedItem> GenerateItems() =>
@@ -198,7 +232,7 @@ private static List<SelectedItem> GenerateItems() =>
198232
new ("Lianyungang", "连云港")
199233
];
200234

201-
private static List<SelectedItem> GenerateDataSource(List<SelectedItem> source) => source.Select(i => new SelectedItem(i.Value, i.Text)).ToList();
235+
private static List<SelectedItem> GenerateDataSource(List<SelectedItem> source) => [.. source.Select(i => new SelectedItem(i.Value, i.Text))];
202236

203237
private void AddItems()
204238
{
@@ -340,6 +374,22 @@ private AttributeItem[] GetAttributes() =>
340374
DefaultValue = "true"
341375
},
342376
new()
377+
{
378+
Name = "ShowSearch",
379+
Description = Localizer["MultiSelectsAttribute_ShowSearch"],
380+
Type = "bool",
381+
ValueList = "true|false",
382+
DefaultValue = "false"
383+
},
384+
new()
385+
{
386+
Name = "IsFixedSearch",
387+
Description = Localizer["MultiSelectsAttribute_IsFixedSearch"],
388+
Type = "bool",
389+
ValueList = "true|false",
390+
DefaultValue = "false"
391+
},
392+
new()
343393
{
344394
Name = "ShowToolbar",
345395
Description = Localizer["MultiSelectsAttribute_ShowToolbar"],

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -433,13 +433,19 @@
433433
Name="IsVirtualize">
434434
<section ignore>
435435
<p>@((MarkupString)Localizer["SelectsVirtualizeDescription"].Value)</p>
436-
<div class="row mb-3">
436+
<div class="row g-3">
437437
<div class="col-12 col-sm-6">
438438
<BootstrapInputGroup>
439439
<BootstrapInputGroupLabel DisplayText="ShowSearch" />
440440
<Checkbox @bind-Value="@_showSearch" />
441441
</BootstrapInputGroup>
442442
</div>
443+
<div class="col-12 col-sm-6">
444+
<BootstrapInputGroup>
445+
<BootstrapInputGroupLabel DisplayText="IsFixedSearch" />
446+
<Checkbox @bind-Value="@_isFixedSearch" />
447+
</BootstrapInputGroup>
448+
</div>
443449
<div class="col-12 col-sm-6">
444450
<BootstrapInputGroup>
445451
<BootstrapInputGroupLabel DisplayText="IsClearable" />
@@ -452,7 +458,8 @@
452458
<p class="code-label">1. 使用 OnQueryAsync 作为数据源</p>
453459
<div class="row mb-3">
454460
<div class="col-6">
455-
<Select IsVirtualize="true" OnQueryAsync="OnQueryAsync" @bind-Value="VirtualItem1" ShowSearch="_showSearch" IsClearable="_isClearable"></Select>
461+
<Select IsVirtualize="true" OnQueryAsync="OnQueryAsync" @bind-Value="VirtualItem1"
462+
ShowSearch="_showSearch" IsFixedSearch="_isFixedSearch" IsClearable="_isClearable"></Select>
456463
</div>
457464
<div class="col-6">
458465
<Display TValue="string" Value="@VirtualItem1?.Text"></Display>
@@ -462,7 +469,8 @@
462469
<p class="code-label">2. 使用 Items 作为数据源</p>
463470
<div class="row">
464471
<div class="col-6">
465-
<Select IsVirtualize="true" Items="VirtualItems" @bind-Value="VirtualItem2" ShowSearch="_showSearch" IsClearable="_isClearable"></Select>
472+
<Select IsVirtualize="true" Items="VirtualItems" @bind-Value="VirtualItem2"
473+
ShowSearch="_showSearch" IsFixedSearch="_isFixedSearch" IsClearable="_isClearable"></Select>
466474
</div>
467475
<div class="col-6">
468476
<Display TValue="string" Value="@VirtualItem2?.Text"></Display>

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3024,7 +3024,12 @@
30243024
"MultiSelectOptionChangeLog": "Select the collection of items",
30253025
"MultiSelectIsEditableTitle": "Editable",
30263026
"MultiSelectIsEditableIntro": "Make the component editable by setting the <code>IsEditable</code> parameter",
3027-
"MultiSelectIsEditableDescription": "By setting the <code>EditSubmitKey</code> parameter, you can specify whether to submit via <kbd>Enter</kbd> or <kbd>Space</kbd>"
3027+
"MultiSelectIsEditableDescription": "By setting the <code>EditSubmitKey</code> parameter, you can specify whether to submit via <kbd>Enter</kbd> or <kbd>Space</kbd>",
3028+
"MultiSelectVirtualizeTitle": "Virtualize",
3029+
"MultiSelectVirtualizeIntro": "Set <code>IsVirtualize</code> to <b>true</b> enable virtual scroll for large data",
3030+
"MultiSelectVirtualizeDescription": "Component virtual scrolling supports two ways of providing data through <code>Items</code> or <code>OnQueryAsync</code> callback methods",
3031+
"MultiSelectsAttribute_ShowSearch": "Whether to display the search box",
3032+
"MultiSelectsAttribute_IsFixedSearch": "Whether fixed the search box"
30283033
},
30293034
"BootstrapBlazor.Server.Components.Samples.Radios": {
30303035
"RadiosTitle": "Radio",
@@ -3193,7 +3198,7 @@
31933198
"SelectsIsEditableIntro": "By setting <code>IsEditable=\"true\"</code> to make the component editable",
31943199
"SelectsIsEditableDesc": "After the editable function is enabled, if the input value is not in the candidate items, the new value can be returned through the <code>TextConvertToValueCallback</code> callback method, and the <code>Items</code> data source can be updated through the <code>OnInputChangedCallback</code> callback to prevent the input value from being lost after the page is refreshed.",
31953200
"SelectsVirtualizeTitle": "Virtualize",
3196-
"SelectsVirtualizeIntro": "Set <code>IsVirtualize</code> to <b>true</b> enable virtual scroll for larg data",
3201+
"SelectsVirtualizeIntro": "Set <code>IsVirtualize</code> to <b>true</b> enable virtual scroll for large data",
31973202
"SelectsVirtualizeDescription": "Component virtual scrolling supports two ways of providing data through <code>Items</code> or <code>OnQueryAsync</code> callback methods",
31983203
"SelectsGenericTitle": "Generic",
31993204
"SelectsGenericIntro": "Data source <code>Items</code> supports generics when using <code>SelectedItem&lt;TValue&gt;</code>",

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3024,7 +3024,12 @@
30243024
"MultiSelectOptionChangeLog": "选中项集合",
30253025
"MultiSelectIsEditableTitle": "可编辑",
30263026
"MultiSelectIsEditableIntro": "通过设置 <code>IsEditable</code> 参数,使组件可编辑",
3027-
"MultiSelectIsEditableDescription": "通过设置 <code>EditSubmitKey</code> 参数可以指定通过 <kbd>Enter</kbd> 还是 <kbd>Space</kbd> 进行提交"
3027+
"MultiSelectIsEditableDescription": "通过设置 <code>EditSubmitKey</code> 参数可以指定通过 <kbd>Enter</kbd> 还是 <kbd>Space</kbd> 进行提交",
3028+
"MultiSelectVirtualizeTitle": "虚拟滚动",
3029+
"MultiSelectVirtualizeIntro": "通过设置 <code>IsVirtualize</code> 参数开启组件虚拟功能特性",
3030+
"MultiSelectVirtualizeDescription": "组件虚拟滚动支持两种形式通过 <code>Items</code> 或者 <code>OnQueryAsync</code> 回调方法提供数据",
3031+
"MultiSelectsAttribute_ShowSearch": "是否显示搜索框",
3032+
"MultiSelectsAttribute_IsFixedSearch": "是否固定搜索栏"
30283033
},
30293034
"BootstrapBlazor.Server.Components.Samples.Radios": {
30303035
"RadiosTitle": "Radio 单选框",

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.5.0-beta01</Version>
4+
<Version>9.5.0-beta04</Version>
55
</PropertyGroup>
66

77
<ItemGroup>

0 commit comments

Comments
 (0)