Skip to content

Commit 0289df5

Browse files
ArgoZhangj4587698
andauthored
feat(SelectGeneric): add reset logic when TextConvertToValueCallback return null (#6123)
* feat: 增加 resetValue 方法 * refactor: 移除 tabindex 参数 * refactor: 增加输入 TextConvertToValueCallback 返回空时重置逻辑 * test: 增加单元测试 * test: 更新单元测试 --------- Co-Authored-By: j4587698 <[email protected]>
1 parent dae37ad commit 0289df5

File tree

4 files changed

+42
-10
lines changed

4 files changed

+42
-10
lines changed

src/BootstrapBlazor/Components/Select/Select.razor.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,13 @@ export function hide(id) {
5050
}
5151
}
5252

53+
export function resetValue(id, value) {
54+
const input = document.getElementById(id);
55+
if (input) {
56+
input.value = value;
57+
}
58+
}
59+
5360
export function dispose(id) {
5461
const select = Data.get(id)
5562
Data.remove(id)

src/BootstrapBlazor/Components/SelectGeneric/SelectGeneric.razor

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
<div class="dropdown-toggle" data-bs-toggle="@ToggleString" data-bs-placement="@PlacementString" data-bs-offset="@OffsetString" data-bs-custom-class="@CustomClassString">
1717
@if (DisplayTemplate != null)
1818
{
19-
<div id="@InputId" class="@InputClassString" tabindex="0">
19+
<div id="@InputId" class="@InputClassString">
2020
@DisplayTemplate(SelectedRow)
2121
</div>
2222
}

src/BootstrapBlazor/Components/SelectGeneric/SelectGeneric.razor.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,11 @@ public partial class SelectGeneric<TValue> : ISelectGeneric<TValue>, IModelEqual
7070

7171
/// <summary>
7272
/// 获得/设置 选项输入更新后转换为 Value 回调方法 默认 null
73+
/// <para>返回值为 null 时放弃操作</para>
7374
/// </summary>
7475
/// <remarks>设置 <see cref="IsEditable"/> 后生效</remarks>
7576
[Parameter]
76-
public Func<string, Task<TValue>>? TextConvertToValueCallback { get; set; }
77+
public Func<string, Task<TValue?>>? TextConvertToValueCallback { get; set; }
7778

7879
/// <summary>
7980
/// 获得/设置 选项模板支持静态数据
@@ -486,17 +487,24 @@ private async Task OnChange(ChangeEventArgs args)
486487

487488
if (item == null)
488489
{
489-
TValue val = default!;
490+
TValue? val = default;
490491
if (TextConvertToValueCallback != null)
491492
{
492493
val = await TextConvertToValueCallback(v);
493494
}
494-
item = new SelectedItem<TValue>(val, v);
495495

496-
var items = new List<SelectedItem<TValue>>() { item };
497-
items.AddRange(Items);
498-
Items = items;
499-
CurrentValue = val;
496+
if (val is not null)
497+
{
498+
item = new SelectedItem<TValue>(val, v);
499+
var items = new List<SelectedItem<TValue>>() { item };
500+
items.AddRange(Items);
501+
Items = items;
502+
CurrentValue = val;
503+
}
504+
else
505+
{
506+
await InvokeVoidAsync("resetValue", InputId, SelectedRow?.Text);
507+
}
500508
}
501509
else
502510
{

test/UnitTest/Components/SelectGenericTest.cs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -856,14 +856,31 @@ public async Task IsEditable_Ok()
856856
});
857857
pb.Add(a => a.TextConvertToValueCallback, v =>
858858
{
859-
return Task.FromResult(v);
859+
return Task.FromResult(v)!;
860860
});
861861
});
862862
Assert.False(input.IsReadOnly());
863863

864864
await cut.InvokeAsync(() => { input.Change("Test3"); });
865865
Assert.Equal("Test3", cut.Instance.Value);
866866
Assert.True(updated);
867+
868+
// 覆盖返回 null 逻辑
869+
cut.SetParametersAndRender(pb =>
870+
{
871+
pb.Add(a => a.TextConvertToValueCallback, async v =>
872+
{
873+
await Task.Yield();
874+
return null;
875+
});
876+
});
877+
await cut.InvokeAsync(() => { input.Change("Test4"); });
878+
879+
cut.SetParametersAndRender(pb =>
880+
{
881+
pb.Add(a => a.Value, null);
882+
});
883+
await cut.InvokeAsync(() => { input.Change("Test5"); });
867884
}
868885

869886
[Fact]
@@ -881,7 +898,7 @@ public async Task IsEditable_Generic()
881898
pb.Add(a => a.IsEditable, true);
882899
pb.Add(a => a.TextConvertToValueCallback, v =>
883900
{
884-
return Task.FromResult(new Foo() { Id = 3, Address = "Foo3" });
901+
return Task.FromResult(new Foo() { Id = 3, Address = "Foo3" })!;
885902
});
886903
});
887904

0 commit comments

Comments
 (0)