Skip to content

Commit b89943d

Browse files
authored
feat(Table): IsKeepSelectedRows effect in add method (#4414)
* feat: 增加 IsKeepSelectedRowAfterAdd 参数 * refactor: 重构代码 * chore: bump version 8.10.2-beta04 * test: 更新单元测试 * doc: 增加 IsKeepSelectedRowAfterAdd 参数文档 * Revert "refactor: 重构代码" This reverts commit b6d77cf. * refactor: 代码重构
1 parent fe032c9 commit b89943d

File tree

8 files changed

+73
-17
lines changed

8 files changed

+73
-17
lines changed

src/BootstrapBlazor.Server/Components/Samples/Table/Tables.razor.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -646,6 +646,22 @@ private AttributeItem[] GetAttributes() =>
646646
DefaultValue = "false"
647647
},
648648
new()
649+
{
650+
Name = nameof(Table<Foo>.IsKeepSelectedRows),
651+
Description = Localizer["IsKeepSelectedRowsAttr"],
652+
Type = "boolean",
653+
ValueList = "true / false",
654+
DefaultValue = "false"
655+
},
656+
new()
657+
{
658+
Name = nameof(Table<Foo>.IsKeepSelectedRowAfterAdd),
659+
Description = Localizer["IsKeepSelectedRowAfterAddAttr"],
660+
Type = "boolean",
661+
ValueList = "true / false",
662+
DefaultValue = "false"
663+
},
664+
new()
649665
{
650666
Name = "ClickToSelect",
651667
Description = Localizer["ClickToSelectAttr"],

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4894,6 +4894,8 @@
48944894
"IsTreeAttr": "Is it tree data",
48954895
"IsDetailsAttr": "Whether it is a detail row table, use DetailRowTemplate for logical judgment when not set",
48964896
"IsHideFooterWhenNoDataAttr": "Whether to show Footer when no data is available",
4897+
"IsKeepSelectedRowsAttr": "Whether to keep the selected row after switch page index",
4898+
"IsKeepSelectedRowAfterAddAttr": "Whether to keep the selected row after call add method",
48974899
"ClickToSelectAttr": "Click on the line to select the line",
48984900
"ShowCheckboxTextAttr": "Selection column that displays text",
48994901
"ShowFooterAttr": "Show feet",

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4894,6 +4894,8 @@
48944894
"IsTreeAttr": "是否为树形数据",
48954895
"IsDetailsAttr": "是否为明细行表格,未设置时使用 DetailRowTemplate 进行逻辑判断",
48964896
"IsHideFooterWhenNoDataAttr": "无数据时是否显示 Footer",
4897+
"IsKeepSelectedRowsAttr": "翻页后是否保持选中行数据",
4898+
"IsKeepSelectedRowAfterAddAttr": "新建数据后是否保持选中行",
48974899
"ClickToSelectAttr": "点击行即选中本行",
48984900
"ShowCheckboxTextAttr": "显示文字的选择列",
48994901
"ShowFooterAttr": "是否显示表脚",

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>8.10.2-beta03</Version>
4+
<Version>8.10.2-beta04</Version>
55
</PropertyGroup>
66

77
<ItemGroup Condition="'$(TargetFramework)' == 'net6.0'">

src/BootstrapBlazor/Components/Table/Table.razor.Checkbox.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@ public partial class Table<TItem>
2424
[Parameter]
2525
public bool IsKeepSelectedRows { get; set; }
2626

27+
/// <summary>
28+
/// 获得/设置 新建数据是否保持原选择行,默认为 false 不保持
29+
/// </summary>
30+
[Parameter]
31+
public bool IsKeepSelectedRowAfterAdd { get; set; }
32+
2733
/// <summary>
2834
/// 获得 表头行是否选中状态
2935
/// </summary>

src/BootstrapBlazor/Components/Table/Table.razor.Edit.cs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -287,21 +287,18 @@ private async Task InternalOnAddAsync()
287287
[Parameter]
288288
public Func<TItem>? CreateItemCallback { get; set; }
289289

290-
private TItem CreateTItem()
290+
private TItem CreateTItem() => CreateItemCallback?.Invoke() ?? CreateInstance();
291+
292+
private TItem CreateInstance()
291293
{
292-
var item = CreateItemCallback?.Invoke();
293-
if (item == null)
294+
try
294295
{
295-
try
296-
{
297-
item = Activator.CreateInstance<TItem>();
298-
}
299-
catch (Exception)
300-
{
301-
throw new InvalidOperationException($"{typeof(TItem)} missing new() method. Please provider {nameof(CreateItemCallback)} create the {typeof(TItem)} instance. {typeof(TItem)} 未提供无参构造函数 new() 请通过 {nameof(CreateItemCallback)} 回调方法创建实例");
302-
}
296+
return Activator.CreateInstance<TItem>();
297+
}
298+
catch (Exception)
299+
{
300+
throw new InvalidOperationException($"{typeof(TItem)} missing new() method. Please provider {nameof(CreateItemCallback)} create the {typeof(TItem)} instance. {typeof(TItem)} 未提供无参构造函数 new() 请通过 {nameof(CreateItemCallback)} 回调方法创建实例");
303301
}
304-
return item;
305302
}
306303

307304
/// <summary>

src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -486,8 +486,12 @@ public async Task AddAsync()
486486
// 数据源为 DataTable 新建后重建行与列
487487
await DynamicContext.AddAsync(SelectedRows.OfType<IDynamicObject>());
488488
ResetDynamicContext();
489-
SelectedRows.Clear();
490-
await OnSelectedRowsChanged();
489+
490+
if (!IsKeepSelectedRowAfterAdd)
491+
{
492+
SelectedRows.Clear();
493+
await OnSelectedRowsChanged();
494+
}
491495
}
492496
else if (IsExcel)
493497
{

test/UnitTest/Components/TableTest.cs

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -185,7 +185,7 @@ await cut.InvokeAsync(() =>
185185
[Theory]
186186
[InlineData(InsertRowMode.First)]
187187
[InlineData(InsertRowMode.Last)]
188-
public void Items_EditForm_Add(InsertRowMode insertMode)
188+
public async Task Items_EditForm_Add(InsertRowMode insertMode)
189189
{
190190
var updated = false;
191191
var localizer = Context.Services.GetRequiredService<IStringLocalizer<Foo>>();
@@ -206,7 +206,7 @@ public void Items_EditForm_Add(InsertRowMode insertMode)
206206
});
207207
});
208208
var table = cut.FindComponent<Table<Foo>>();
209-
_ = table.Instance.AddAsync();
209+
await cut.InvokeAsync(table.Instance.AddAsync);
210210
Assert.True(updated);
211211
Assert.Equal(2, table.Instance.Rows.Count);
212212
}
@@ -6046,6 +6046,35 @@ public async Task DynamicContext_Add()
60466046
await cut.InvokeAsync(() => delete.Instance.OnConfirm());
60476047
}
60486048

6049+
[Fact]
6050+
public async Task IsKeepSelectedRowAfterAdd_Ok()
6051+
{
6052+
var localizer = Context.Services.GetRequiredService<IStringLocalizer<Foo>>();
6053+
var items = Foo.GenerateFoo(localizer, 2);
6054+
var cut = Context.RenderComponent<BootstrapBlazorRoot>(pb =>
6055+
{
6056+
pb.AddChildContent<Table<DynamicObject>>(pb =>
6057+
{
6058+
pb.Add(a => a.RenderMode, TableRenderMode.Table);
6059+
pb.Add(a => a.IsMultipleSelect, true);
6060+
pb.Add(a => a.IsKeepSelectedRowAfterAdd, true);
6061+
pb.Add(a => a.DynamicContext, CreateDynamicContext(localizer));
6062+
});
6063+
});
6064+
6065+
var table = cut.FindComponent<Table<DynamicObject>>();
6066+
6067+
// 选中第一行数据
6068+
var input = cut.Find("tbody .form-check-input");
6069+
await cut.InvokeAsync(() => input.Click());
6070+
var selectedRow = table.Instance.SelectedRows.FirstOrDefault();
6071+
Assert.NotNull(selectedRow);
6072+
6073+
await cut.InvokeAsync(() => table.Instance.AddAsync());
6074+
selectedRow = table.Instance.SelectedRows.FirstOrDefault();
6075+
Assert.NotNull(selectedRow);
6076+
}
6077+
60496078
[Fact]
60506079
public async Task DynamicContext_Edit()
60516080
{

0 commit comments

Comments
 (0)