Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion src/BootstrapBlazor.Server/BootstrapBlazor.Server.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@
<PackageReference Include="BootstrapBlazor.Chart" Version="9.0.0" />
<PackageReference Include="BootstrapBlazor.CherryMarkdown" Version="9.0.0" />
<PackageReference Include="BootstrapBlazor.Dock" Version="9.0.0" />
<PackageReference Include="BootstrapBlazor.DockView" Version="9.1.3" />
<PackageReference Include="BootstrapBlazor.DockView" Version="9.1.5" />
<PackageReference Include="BootstrapBlazor.DriverJs" Version="9.0.3" />
<PackageReference Include="BootstrapBlazor.ElementIcon" Version="9.0.3" />
<PackageReference Include="BootstrapBlazor.FileViewer" Version="9.0.0" />
Expand Down
12 changes: 10 additions & 2 deletions src/BootstrapBlazor.Server/Components/Samples/MultiSelects.razor
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,12 @@ private enum MultiSelectEnumFoo
<Checkbox @bind-Value="@_isFixedSearch" />
</BootstrapInputGroup>
</div>
<div class="col-12 col-sm-6">
<BootstrapInputGroup>
<BootstrapInputGroupLabel DisplayText="ShowToolbar" />
<Checkbox @bind-Value="@_showToolbar" />
</BootstrapInputGroup>
</div>
<div class="col-12 col-sm-6">
<BootstrapInputGroup>
<BootstrapInputGroupLabel DisplayText="IsClearable" />
Expand All @@ -332,7 +338,8 @@ private enum MultiSelectEnumFoo
<div class="row mb-3">
<div class="col-6">
<MultiSelect IsVirtualize="true" @bind-Value="_virtualItemString1" OnQueryAsync="OnQueryAsync"
ShowSearch="_showSearch" IsFixedSearch="_isFixedSearch" IsClearable="_isClearable">
ShowSearch="_showSearch" ShowToolbar="_showToolbar"
IsFixedSearch="_isFixedSearch" IsClearable="_isClearable">
</MultiSelect>
</div>
<div class="col-6">
Expand All @@ -344,7 +351,8 @@ private enum MultiSelectEnumFoo
<div class="row">
<div class="col-6">
<MultiSelect IsVirtualize="true" @bind-Value="_virtualItemString2" Items="VirtualItems"
ShowSearch="_showSearch" IsFixedSearch="_isFixedSearch" IsClearable="_isClearable">
ShowSearch="_showSearch" ShowToolbar="_showToolbar"
IsFixedSearch="_isFixedSearch" IsClearable="_isClearable">
</MultiSelect>
</div>
<div class="col-6">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,9 +121,10 @@ private enum MultiSelectEnumFoo

private string? _editString;

private bool _isFixedSearch;
private bool _isClearable;
private bool _showSearch;
private bool _isFixedSearch = true;
private bool _isClearable = true;
private bool _showToolbar = true;
private bool _showSearch = true;

private async Task<SelectedItem> OnEditCallback(string value)
{
Expand Down Expand Up @@ -373,6 +374,22 @@ private AttributeItem[] GetAttributes() =>
DefaultValue = "true"
},
new()
{
Name = "ShowSearch",
Description = Localizer["MultiSelectsAttribute_ShowSearch"],
Type = "bool",
ValueList = "true|false",
DefaultValue = "false"
},
new()
{
Name = "IsFixedSearch",
Description = Localizer["MultiSelectsAttribute_IsFixedSearch"],
Type = "bool",
ValueList = "true|false",
DefaultValue = "false"
},
new()
{
Name = "ShowToolbar",
Description = Localizer["MultiSelectsAttribute_ShowToolbar"],
Expand Down
9 changes: 7 additions & 2 deletions src/BootstrapBlazor.Server/Locales/en-US.json
Original file line number Diff line number Diff line change
Expand Up @@ -3024,7 +3024,12 @@
"MultiSelectOptionChangeLog": "Select the collection of items",
"MultiSelectIsEditableTitle": "Editable",
"MultiSelectIsEditableIntro": "Make the component editable by setting the <code>IsEditable</code> parameter",
"MultiSelectIsEditableDescription": "By setting the <code>EditSubmitKey</code> parameter, you can specify whether to submit via <kbd>Enter</kbd> or <kbd>Space</kbd>"
"MultiSelectIsEditableDescription": "By setting the <code>EditSubmitKey</code> parameter, you can specify whether to submit via <kbd>Enter</kbd> or <kbd>Space</kbd>",
"MultiSelectVirtualizeTitle": "Virtualize",
"MultiSelectVirtualizeIntro": "Set <code>IsVirtualize</code> to <b>true</b> enable virtual scroll for large data",
"MultiSelectVirtualizeDescription": "Component virtual scrolling supports two ways of providing data through <code>Items</code> or <code>OnQueryAsync</code> callback methods",
"MultiSelectsAttribute_ShowSearch": "Whether to display the search box",
"MultiSelectsAttribute_IsFixedSearch": "Whether fixed the search box"
},
"BootstrapBlazor.Server.Components.Samples.Radios": {
"RadiosTitle": "Radio",
Expand Down Expand Up @@ -3193,7 +3198,7 @@
"SelectsIsEditableIntro": "By setting <code>IsEditable=\"true\"</code> to make the component editable",
"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.",
"SelectsVirtualizeTitle": "Virtualize",
"SelectsVirtualizeIntro": "Set <code>IsVirtualize</code> to <b>true</b> enable virtual scroll for larg data",
"SelectsVirtualizeIntro": "Set <code>IsVirtualize</code> to <b>true</b> enable virtual scroll for large data",
"SelectsVirtualizeDescription": "Component virtual scrolling supports two ways of providing data through <code>Items</code> or <code>OnQueryAsync</code> callback methods",
"SelectsGenericTitle": "Generic",
"SelectsGenericIntro": "Data source <code>Items</code> supports generics when using <code>SelectedItem&lt;TValue&gt;</code>",
Expand Down
7 changes: 6 additions & 1 deletion src/BootstrapBlazor.Server/Locales/zh-CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -3024,7 +3024,12 @@
"MultiSelectOptionChangeLog": "选中项集合",
"MultiSelectIsEditableTitle": "可编辑",
"MultiSelectIsEditableIntro": "通过设置 <code>IsEditable</code> 参数,使组件可编辑",
"MultiSelectIsEditableDescription": "通过设置 <code>EditSubmitKey</code> 参数可以指定通过 <kbd>Enter</kbd> 还是 <kbd>Space</kbd> 进行提交"
"MultiSelectIsEditableDescription": "通过设置 <code>EditSubmitKey</code> 参数可以指定通过 <kbd>Enter</kbd> 还是 <kbd>Space</kbd> 进行提交",
"MultiSelectVirtualizeTitle": "虚拟滚动",
"MultiSelectVirtualizeIntro": "通过设置 <code>IsVirtualize</code> 参数开启组件虚拟功能特性",
"MultiSelectVirtualizeDescription": "组件虚拟滚动支持两种形式通过 <code>Items</code> 或者 <code>OnQueryAsync</code> 回调方法提供数据",
"MultiSelectsAttribute_ShowSearch": "是否显示搜索框",
"MultiSelectsAttribute_IsFixedSearch": "是否固定搜索栏"
},
"BootstrapBlazor.Server.Components.Samples.Radios": {
"RadiosTitle": "Radio 单选框",
Expand Down
2 changes: 1 addition & 1 deletion src/BootstrapBlazor/BootstrapBlazor.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Razor">

<PropertyGroup>
<Version>9.5.0-beta02</Version>
<Version>9.5.0-beta03</Version>
</PropertyGroup>

<ItemGroup>
Expand Down
26 changes: 13 additions & 13 deletions src/BootstrapBlazor/Components/Select/MultiSelect.razor
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@
{
<span class="@ClearClassString" @onclick="OnClearValue"><i class="@ClearableIcon"></i></span>
}
<div class="@DropdownMenuClassString">
<div class="@MultipleDropdownMenuClassString">
@if (ShowSearch)
{
<div class="dropdown-menu-search">
Expand All @@ -62,6 +62,18 @@
<i class="@SearchLoadingIconString"></i>
</div>
}
@if (ShowToolbar)
{
<div class="toolbar">
@if (ShowDefaultButtons)
{
<DynamicElement TagName="button" type="button" class="btn" OnClick="SelectAll">@SelectAllText</DynamicElement>
<DynamicElement TagName="button" type="button" class="btn" OnClick="InvertSelect">@ReverseSelectText</DynamicElement>
<DynamicElement TagName="button" type="button" class="btn" OnClick="Clear">@ClearText</DynamicElement>
}
@ButtonTemplate
</div>
}
@if (IsVirtualize)
{
<div class="dropdown-menu-body dropdown-virtual">
Expand All @@ -85,18 +97,6 @@
else
{
<div class="dropdown-menu-body">
@if (ShowToolbar)
{
<div class="toolbar">
@if (ShowDefaultButtons)
{
<DynamicElement TagName="button" type="button" class="btn" OnClick="SelectAll">@SelectAllText</DynamicElement>
<DynamicElement TagName="button" type="button" class="btn" OnClick="InvertSelect">@ReverseSelectText</DynamicElement>
<DynamicElement TagName="button" type="button" class="btn" OnClick="Clear">@ClearText</DynamicElement>
}
@ButtonTemplate
</div>
}
@foreach (var itemGroup in Rows.GroupBy(i => i.GroupName))
{
if (!string.IsNullOrEmpty(itemGroup.Key))
Expand Down
10 changes: 10 additions & 0 deletions src/BootstrapBlazor/Components/Select/MultiSelect.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ public partial class MultiSelect<TValue>
.AddClass("is-clearable", IsClearable)
.Build();

private string? MultipleDropdownMenuClassString => CssBuilder.Default(DropdownMenuClassString)
.AddClass("is-fixed-toolbar", ShowToolbar)
.Build();

private string? EditSubmitKeyString => EditSubmitKey == EditSubmitKey.Space ? EditSubmitKey.ToDescriptionString() : null;

private string? ToggleClassString => CssBuilder.Default("dropdown-toggle scroll")
Expand Down Expand Up @@ -291,6 +295,12 @@ protected override List<SelectedItem> GetRowsByItems()
return items;
}

/// <summary>
/// <inheritdoc/>
/// </summary>
/// <returns></returns>
protected override bool CheckFixedSearch() => ShowToolbar ? true : base.CheckFixedSearch();

/// <summary>
/// 客户端回车回调方法
/// </summary>
Expand Down
50 changes: 35 additions & 15 deletions src/BootstrapBlazor/Components/Select/MultiSelect.razor.scss
Original file line number Diff line number Diff line change
Expand Up @@ -119,24 +119,44 @@
}
}

.dropdown-menu .toolbar {
--bb-multi-select-toolbar-padding: 6px 10px;
--bb-multi-select-toolbar-button-padding: 3px 10px;
padding: var(--bb-multi-select-toolbar-padding);
white-space: nowrap;

.btn {
padding: var(--bb-multi-select-toolbar-button-padding);
border: 1px solid var(--bs-border-color);
transition: border-color .3s linear, color .3s linear;
.dropdown-menu {
&.is-fixed-toolbar {
--bb-dropdown-max-height: 330px;

&:hover {
border: 1px solid var(--bb-border-hover-color);
color: var(--bs-primary);
.dropdown-menu-body {
max-height: calc(var(--bb-dropdown-max-height) - 48px);
overflow: auto;
}
}

&.is-fixed-search.is-fixed-toolbar {
.dropdown-menu-body {
max-height: calc(var(--bb-dropdown-max-height) - 117px);
overflow: auto;
}
}

&:not(:last-child) {
margin-inline-end: .5rem;
.toolbar {
--bb-multi-select-toolbar-padding: 0 16px 8px 16px;
--bb-multi-select-toolbar-button-padding: 3px 10px;
padding: var(--bb-multi-select-toolbar-padding);
white-space: nowrap;
border-block-end: var(--bs-border-width) solid var(--bb-select-search-border-color);
margin-block-end: var(--bb-select-search-margin-bottom);

.btn {
padding: var(--bb-multi-select-toolbar-button-padding);
border: 1px solid var(--bs-border-color);
transition: border-color .3s linear, color .3s linear;

&:hover {
border: 1px solid var(--bb-border-hover-color);
color: var(--bs-primary);
}

&:not(:last-child) {
margin-inline-end: .5rem;
}
}
}
}
Expand Down
14 changes: 7 additions & 7 deletions src/BootstrapBlazor/Components/Select/Select.razor.scss
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,13 @@
}

.dropdown-menu {
&.is-fixed-search {
.dropdown-menu-body {
max-height: calc(var(--bb-dropdown-max-height) - 76px);
overflow: auto;
}
}

.dropdown-menu-search {
padding: var(--bb-select-search-padding);
position: relative;
Expand Down Expand Up @@ -240,13 +247,6 @@
top: var(--bb-select-search-icon-top);
color: var(--bb-select-search-icon-color);
}

&.is-fixed-search {
.dropdown-menu-body {
max-height: calc(var(--bb-dropdown-max-height) - 76px);
overflow: auto;
}
}
}

.select:not(.multi-select) .dropdown-toggle {
Expand Down
8 changes: 7 additions & 1 deletion src/BootstrapBlazor/Components/Select/SelectBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ public abstract class SelectBase<TValue> : PopoverSelectBase<TValue>
/// Gets the dropdown menu class string.
/// </summary>
protected string? DropdownMenuClassString => CssBuilder.Default("dropdown-menu")
.AddClass("is-fixed-search", ShowSearch && IsFixedSearch)
.AddClass("is-fixed-search", CheckFixedSearch())
.Build();

/// <summary>
Expand Down Expand Up @@ -243,4 +243,10 @@ protected virtual async Task OnClearValue()
}
CurrentValue = default;
}

/// <summary>
/// Gets whether to show the search box.
/// </summary>
/// <returns></returns>
protected virtual bool CheckFixedSearch() => ShowSearch && IsFixedSearch;
}
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,7 @@ $bb-dropdown-link-pre-active-bg: #498ff7;
$bb-select-focus-shadow: none;
$bb-select-padding-right: 2.25rem;
$bb-select-padding: 6px 0.75rem;
$bb-select-search-padding: 7px 10px;
$bb-select-search-padding: .5rem 1rem;
$bb-select-search-margin-bottom: .5rem;
$bb-select-search-border-color: var(--bs-border-color);
$bb-select-search-padding-right: 30px;
Expand Down
4 changes: 2 additions & 2 deletions test/UnitTest/Components/MultiSelectTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -239,8 +239,8 @@ public void ButtonTemplate_Ok()
pb.Add(a => a.ButtonTemplate, builder => builder.AddContent(0, new MarkupString("<button class=\"btn-test\">ButtonTemplate</button>")));
});

// 没有数据不显示 Toolbar
Assert.DoesNotContain("btn-test", cut.Markup);
// 没有数据也显示 Toolbar
Assert.Contains("btn-test", cut.Markup);

cut.SetParametersAndRender(pb =>
{
Expand Down