Skip to content

Commit 61e7c08

Browse files
authored
feat(Search): remove OnClear callback reuse OnSearch (#6761)
* refactor: 精简代码 * refactor: 微调样式 * refactor: 移动 IsClearable/ClearIcon 到基类 * refactor: 微调右间距 * Revert "refactor: 微调右间距" This reverts commit 584f654. * refactor: 调整 Clear 小图标样式 * refactor: 移除 OnClear 回调方法 * refactor: 调整 search-template 左间距 * refactor: 移除 is-clearable 样式 * refactor: 设置按钮样式 * test: 更新单元测试
1 parent ed2e900 commit 61e7c08

File tree

7 files changed

+42
-54
lines changed

7 files changed

+42
-54
lines changed

src/BootstrapBlazor/Components/AutoComplete/AutoComplete.razor.cs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -68,19 +68,6 @@ public partial class AutoComplete
6868
[Parameter]
6969
public bool ShowNoDataTip { get; set; } = true;
7070

71-
/// <summary>
72-
/// Gets or sets whether the select component is clearable. Default is false.
73-
/// </summary>
74-
[Parameter]
75-
public bool IsClearable { get; set; }
76-
77-
/// <summary>
78-
/// Gets or sets the right-side clear icon. Default is fa-solid fa-angle-up.
79-
/// </summary>
80-
[Parameter]
81-
[NotNull]
82-
public string? ClearIcon { get; set; }
83-
8471
/// <summary>
8572
/// IStringLocalizer service instance
8673
/// </summary>
@@ -143,7 +130,6 @@ protected override void OnParametersSet()
143130
PlaceHolder ??= Localizer[nameof(PlaceHolder)];
144131
Icon ??= IconTheme.GetIconByKey(ComponentIcons.AutoCompleteIcon);
145132
LoadingIcon ??= IconTheme.GetIconByKey(ComponentIcons.LoadingIcon);
146-
ClearIcon ??= IconTheme.GetIconByKey(ComponentIcons.SelectClearIcon);
147133
}
148134

149135
/// <summary>

src/BootstrapBlazor/Components/AutoComplete/PopoverCompleteBase.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,19 @@ public abstract class PopoverCompleteBase<TValue> : BootstrapInputBase<TValue>,
9191
[Parameter]
9292
public RenderFragment<TValue>? ItemTemplate { get; set; }
9393

94+
/// <summary>
95+
/// Gets or sets whether the select component is clearable. Default is false.
96+
/// </summary>
97+
[Parameter]
98+
public bool IsClearable { get; set; }
99+
100+
/// <summary>
101+
/// Gets or sets the right-side clear icon. Default is fa-solid fa-angle-up.
102+
/// </summary>
103+
[Parameter]
104+
[NotNull]
105+
public string? ClearIcon { get; set; }
106+
94107
/// <summary>
95108
/// 获得 是否跳过 ESC 按键字符串
96109
/// </summary>
@@ -155,6 +168,8 @@ protected override void OnParametersSet()
155168
{
156169
base.OnParametersSet();
157170

171+
ClearIcon ??= IconTheme.GetIconByKey(ComponentIcons.InputClearIcon);
172+
158173
Offset ??= "[0, 6]";
159174
}
160175

src/BootstrapBlazor/Components/AutoFill/AutoFill.razor.cs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -119,19 +119,6 @@ public partial class AutoFill<TValue>
119119
[NotNull]
120120
public Func<VirtualizeQueryOption, Task<QueryData<TValue>>>? OnQueryAsync { get; set; }
121121

122-
/// <summary>
123-
/// Gets or sets whether the select component is clearable. Default is false.
124-
/// </summary>
125-
[Parameter]
126-
public bool IsClearable { get; set; }
127-
128-
/// <summary>
129-
/// Gets or sets the right-side clear icon. Default is fa-solid fa-angle-up.
130-
/// </summary>
131-
[Parameter]
132-
[NotNull]
133-
public string? ClearIcon { get; set; }
134-
135122
/// <summary>
136123
/// Gets or sets the callback method when the clear button is clicked. Default is null.
137124
/// </summary>
@@ -178,7 +165,6 @@ protected override void OnParametersSet()
178165
PlaceHolder ??= Localizer[nameof(PlaceHolder)];
179166
Icon ??= IconTheme.GetIconByKey(ComponentIcons.AutoFillIcon);
180167
LoadingIcon ??= IconTheme.GetIconByKey(ComponentIcons.LoadingIcon);
181-
ClearIcon ??= IconTheme.GetIconByKey(ComponentIcons.SelectClearIcon);
182168

183169
_displayText = GetDisplayText(Value);
184170
Items ??= [];

src/BootstrapBlazor/Components/Search/Search.razor

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,15 @@
3232
placeholder="@PlaceHolder" disabled="@Disabled" @ref="FocusElement" />
3333
@if (IsClearable)
3434
{
35-
<div class="search-icon search-clear-icon">
35+
<div class="search-clear-icon">
3636
<i class="@ClearIcon" @onclick="OnClearClick" aria-label="Clear"></i>
3737
</div>
3838
}
3939
@if (IconTemplate != null)
4040
{
41-
@IconTemplate(_context)
41+
<div class="search-template-icon">
42+
@IconTemplate(_context)
43+
</div>
4244
}
4345
</div>
4446
@if (ButtonTemplate != null)

src/BootstrapBlazor/Components/Search/Search.razor.cs

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,6 @@ public partial class Search<TValue>
1818
[Parameter]
1919
public RenderFragment<SearchContext<TValue>>? IconTemplate { get; set; }
2020

21-
/// <summary>
22-
/// Gets or sets whether to show the clear button. Default is false.
23-
/// </summary>
24-
[Parameter]
25-
public bool IsClearable { get; set; }
26-
27-
/// <summary>
28-
/// Gets or sets the clear icon. Default is null.
29-
/// </summary>
30-
[Parameter]
31-
public string? ClearIcon { get; set; }
32-
3321
/// <summary>
3422
/// Gets or sets whether to show the clear button. Default is false.
3523
/// </summary>
@@ -146,6 +134,8 @@ public partial class Search<TValue>
146134
/// Gets or sets the event callback when the clear button is clicked. Default is null.
147135
/// </summary>
148136
[Parameter]
137+
[Obsolete("已取消 合并到 OnSearch 方法中; Deprecated. Merged into the OnSearch method")]
138+
[ExcludeFromCodeCoverage]
149139
public Func<Task>? OnClear { get; set; }
150140

151141
[Inject]
@@ -189,7 +179,6 @@ protected override void OnParametersSet()
189179
{
190180
base.OnParametersSet();
191181

192-
ClearIcon ??= IconTheme.GetIconByKey(ComponentIcons.InputClearIcon);
193182
ClearButtonIcon ??= IconTheme.GetIconByKey(ComponentIcons.SearchClearButtonIcon);
194183
SearchButtonIcon ??= IconTheme.GetIconByKey(ComponentIcons.SearchButtonIcon);
195184
SearchButtonLoadingIcon ??= IconTheme.GetIconByKey(ComponentIcons.SearchButtonLoadingIcon);
@@ -239,10 +228,6 @@ private async Task OnClearClick()
239228
await InvokeVoidAsync("setValue", Id, "");
240229

241230
_displayText = null;
242-
if (OnClear != null)
243-
{
244-
await OnClear();
245-
}
246231
await OnSearchClick();
247232
}
248233

src/BootstrapBlazor/Components/Search/Search.razor.scss

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
.search.auto-complete {
1+
.search.auto-complete {
22
--bb-ac-padding-right: #{$bb-search-padding-right};
33
--bb-search-prefix-icon-color: #{$bb-search-prefix-icon-color};
4+
--bb-search-clear-icon-color: var(--bb-select-append-color);
45

56
.form-control-group {
67
display: flex;
@@ -10,7 +11,7 @@
1011

1112
.search-prefix-icon {
1213
color: var(--bb-search-prefix-icon-color);
13-
margin-right: 0.5rem;
14+
margin-inline-end: 0.5rem;
1415
}
1516

1617
.search-input {
@@ -21,13 +22,22 @@
2122
padding: 0;
2223
}
2324

24-
.search-icon {
25+
.search-clear-icon {
2526
cursor: pointer;
26-
margin-left: 0.5rem;
27+
color: var(--bb-search-clear-icon-color);
28+
margin-inline-start: 0.5rem;
2729
}
2830

2931
&:not(:hover) .search-clear-icon {
3032
display: none;
3133
}
34+
35+
.search-template-icon {
36+
margin-inline-start: 0.5rem;
37+
}
38+
}
39+
40+
.input-group button {
41+
cursor: pointer;
3242
}
3343
}

test/UnitTest/Components/SearchTest.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ public async Task OnSearchClick_Ok()
130130
[Fact]
131131
public async Task OnClearClick_Ok()
132132
{
133+
var tcs = new TaskCompletionSource();
133134
var ret = false;
134135
var cut = Context.RenderComponent<Search<string>>(builder =>
135136
{
@@ -138,17 +139,20 @@ public async Task OnClearClick_Ok()
138139
builder.Add(s => s.ClearButtonColor, Color.Secondary);
139140
builder.Add(s => s.ClearButtonIcon, "test-icon");
140141
builder.Add(s => s.ClearButtonText, "Clear");
141-
builder.Add(s => s.OnClear, () =>
142+
builder.Add(s => s.OnSearch, async v =>
142143
{
143144
ret = true;
144-
return Task.CompletedTask;
145+
await Task.Yield();
146+
tcs.TrySetResult();
147+
return new List<string>();
145148
});
146149
});
147150
cut.Contains("test-icon");
148151
cut.Contains("Clear");
149152

150153
var button = cut.Find(".btn-secondary");
151154
await cut.InvokeAsync(() => button.Click());
155+
await tcs.Task;
152156
Assert.True(ret);
153157
}
154158

@@ -227,7 +231,7 @@ public void IsClearable_Ok()
227231
{
228232
pb.Add(a => a.IsClearable, true);
229233
});
230-
cut.Contains("<div class=\"search-icon search-clear-icon\">");
234+
cut.Contains("<div class=\"search-clear-icon\">");
231235
}
232236

233237
[Fact]

0 commit comments

Comments
 (0)