Skip to content

Commit de9a9f8

Browse files
committed
feat: 增加 ShowSearch 参数
1 parent 4925523 commit de9a9f8

3 files changed

Lines changed: 103 additions & 16 deletions

File tree

src/components/BootstrapBlazor.Region/Components/SelectCity.razor

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,34 @@
1515
{
1616
<span class="@ClearClassString" @onclick="OnClearValue"><i class="@ClearIcon"></i></span>
1717
}
18-
<div class="dropdown-menu">
19-
@foreach (var item in GetProvinces())
18+
<div class="dropdown-menu dropdown-menu-city">
19+
@if (ShowSearch)
2020
{
21-
<div class="bb-region-city-item">
22-
<div class="bb-region-city-title" @onclick="() => OnSelectProvince(item)">@item</div>
23-
<ul>
24-
@foreach (var city in GetCities(item))
25-
{
26-
<li class="@GetActiveClass(city)" @onclick="() => OnSelectCity(city)">@city</li>
27-
}
28-
</ul>
21+
<div class="dropdown-menu-search">
22+
<input type="text" class="search-text form-control" autocomplete="off" value="@_searchText" aria-label="search" />
23+
<i class="@SearchIconString"></i>
24+
<i class="@ClearIconString" @onclick="OnClearSearch"></i>
2925
</div>
26+
<div class="dropdown-menu-city-body">
27+
@RenderCities()
28+
</div>
29+
}
30+
else
31+
{
32+
@RenderCities()
3033
}
3134
</div>
3235
</div>
36+
37+
@code {
38+
RenderFragment RenderItem(string item) =>
39+
@<div class="bb-region-city-item">
40+
<div class="bb-region-city-title" @onclick="() => OnSelectProvince(item)">@item</div>
41+
<ul>
42+
@foreach (var city in GetCities(item))
43+
{
44+
<li class="@GetActiveClass(city)" @onclick="() => OnSelectCity(city)">@city</li>
45+
}
46+
</ul>
47+
</div>;
48+
}

src/components/BootstrapBlazor.Region/Components/SelectCity.razor.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,46 @@ public partial class SelectCity
1515
[Parameter]
1616
public bool IsMultiple { get; set; }
1717

18+
/// <summary>
19+
/// 获得/设置 是否开启搜索功能 默认 true 开启
20+
/// </summary>
21+
[Parameter]
22+
public bool ShowSearch { get; set; } = true;
23+
24+
/// <summary>
25+
/// Gets or sets the search icon.
26+
/// </summary>
27+
[Parameter]
28+
public string? SearchIcon { get; set; }
29+
1830
private string? ClassString => CssBuilder.Default("select bb-city")
1931
.AddClass("disabled", IsDisabled)
2032
.AddClassFromAttributes(AdditionalAttributes)
2133
.Build();
2234

35+
private string? SearchIconString => CssBuilder.Default("icon search-icon")
36+
.AddClass(SearchIcon)
37+
.Build();
38+
39+
private string? ClearIconString => CssBuilder.Default("icon clear-icon")
40+
.AddClass(ClearIcon)
41+
.Build();
42+
2343
private readonly HashSet<string> _values = [];
44+
private string? _searchText;
2445

2546
private string? GetActiveClass(string item) => _values.Contains(item) || CurrentValue == item ? "active" : null;
2647

48+
/// <summary>
49+
/// <inheritdoc/>
50+
/// </summary>
51+
protected override void OnParametersSet()
52+
{
53+
base.OnParametersSet();
54+
55+
SearchIcon ??= IconTheme.GetIconByKey(ComponentIcons.SelectSearchIcon);
56+
}
57+
2758
private async Task OnClearValue()
2859
{
2960
if (IsMultiple)
@@ -38,6 +69,20 @@ private async Task OnClearValue()
3869
}
3970
}
4071

72+
private void OnClearSearch()
73+
{
74+
_searchText = null;
75+
StateHasChanged();
76+
}
77+
78+
private RenderFragment RenderCities() => builder =>
79+
{
80+
foreach (var item in GetProvinces())
81+
{
82+
builder.AddContent(0, RenderItem(item));
83+
}
84+
};
85+
4186
private void OnSelectProvince(string province)
4287
{
4388
if (!IsMultiple)

src/components/BootstrapBlazor.Region/Components/SelectCity.razor.css

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,12 @@
66
display: none;
77
}
88

9-
.dropdown-menu {
9+
.dropdown-menu-city {
1010
--bs-dropdown-padding-y: .5rem;
1111
--bs-dropdown-padding-x: .5rem;
12+
--bb-select-search-padding: .5rem 0;
13+
--bb-select-search-icon-right: 12px;
14+
--bb-select-search-padding-right: 34px;
1215
--bb-region-body-color: #495057;
1316
--bb-region-body-hover-bg-color: #e9ecef;
1417
--bb-region-body-active-bg-color: #dee2e6;
@@ -22,17 +25,18 @@
2225
width: var(--bb-region-body-width);
2326
height: var(--bb-region-body-height);
2427
overflow-y: auto;
28+
flex-direction: column;
2529
}
2630

27-
.dropdown-menu ul {
31+
.dropdown-menu-city ul {
2832
margin: 0;
2933
padding: 0;
3034
display: flex;
3135
flex-wrap: wrap;
3236
gap: var(--bb-region-body-gap);
3337
}
3438

35-
.dropdown-menu li {
39+
.dropdown-menu-city li {
3640
list-style: none;
3741
transition: background-color .3s linear, color .3s linear;
3842
cursor: pointer;
@@ -41,24 +45,46 @@
4145
color: var(--bb-region-body-color);
4246
}
4347

44-
.dropdown-menu li:hover {
48+
.dropdown-menu-city li:hover {
4549
background-color: var(--bb-region-body-hover-bg-color);
4650
color: var(--bb-region-body-hover-color);
4751
}
4852

49-
.dropdown-menu li.active {
53+
.dropdown-menu-city li.active {
5054
background-color: var(--bb-region-body-active-bg-color);
5155
color: var(--bb-region-body-active-color);
5256
}
5357

54-
[data-bs-theme="dark"] .dropdown-menu {
58+
[data-bs-theme="dark"] .dropdown-menu-city {
5559
--bb-region-body-color: #c0c4cc;
5660
--bb-region-body-hover-color: #fff;
5761
--bb-region-body-active-color: #fff;
5862
--bb-region-body-hover-bg-color: #495057;
5963
--bb-region-body-active-bg-color: #6c757d;
6064
}
6165

66+
.show > .dropdown-menu-city {
67+
display: flex;
68+
}
69+
70+
.dropdown-menu-city-body {
71+
flex: 1;
72+
height: 1%;
73+
overflow-y: auto;
74+
}
75+
76+
.dropdown-menu-search .clear-icon {
77+
cursor: pointer;
78+
}
79+
80+
.dropdown-menu-search:hover .search-icon {
81+
display: none;
82+
}
83+
84+
.dropdown-menu-search:not(:hover) .clear-icon {
85+
display: none;
86+
}
87+
6288
.bb-region-city-item:not(:last-child) {
6389
margin-bottom: 3px;
6490
padding-bottom: 3px;

0 commit comments

Comments
 (0)