Skip to content

Commit 40a1418

Browse files
authored
feat(Table): add OnAfterCancelSaveAsync parameter (#4757)
* feat: 增加 OnAfterCancelSaveAsync 参数 * test: 增加单元测试 * chore: bump version 9.0.2-beta05 * test: 更新单元测试 * test: 更新单元测试
1 parent 44da935 commit 40a1418

File tree

4 files changed

+125
-3
lines changed

4 files changed

+125
-3
lines changed

src/BootstrapBlazor/BootstrapBlazor.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.NET.Sdk.Razor">
22

33
<PropertyGroup>
4-
<Version>9.0.2-beta04</Version>
4+
<Version>9.0.2-beta05</Version>
55
</PropertyGroup>
66

77
<ItemGroup>

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

+6
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,12 @@ public partial class Table<TItem>
8888
[Parameter]
8989
public Func<TItem, string?>? SetRowClassFormatter { get; set; }
9090

91+
/// <summary>
92+
/// 获得/设置 取消保存后回调委托方法
93+
/// </summary>
94+
[Parameter]
95+
public Func<Task>? OnAfterCancelSaveAsync { get; set; }
96+
9197
/// <summary>
9298
/// 获得/设置 保存后回调委托方法
9399
/// </summary>

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

+18-2
Original file line numberDiff line numberDiff line change
@@ -850,6 +850,7 @@ private void AppendOptions(ITableEditDialogOption<TItem> option, ItemChangedType
850850
protected async Task ShowEditDialog(ItemChangedType changedType)
851851
{
852852
var saved = false;
853+
var triggerFromSave = false;
853854
var option = new EditDialogOption<TItem>()
854855
{
855856
Class = "modal-dialog-table",
@@ -860,10 +861,18 @@ protected async Task ShowEditDialog(ItemChangedType changedType)
860861
IsDraggable = EditDialogIsDraggable,
861862
ShowMaximizeButton = EditDialogShowMaximizeButton,
862863
FullScreenSize = EditDialogFullScreenSize,
863-
OnCloseAsync = () => OnCloseEditDialogCallbackAsync(saved),
864+
OnCloseAsync = async () =>
865+
{
866+
if (triggerFromSave == false && OnAfterCancelSaveAsync != null)
867+
{
868+
await OnAfterCancelSaveAsync();
869+
}
870+
await OnCloseEditDialogCallbackAsync(saved);
871+
},
864872
OnEditAsync = async context =>
865873
{
866874
saved = await OnSaveEditCallbackAsync(context, changedType);
875+
triggerFromSave = true;
867876
return saved;
868877
}
869878
};
@@ -879,7 +888,14 @@ protected async Task ShowEditDrawer(ItemChangedType changedType)
879888
var saved = false;
880889
var editOption = new TableEditDrawerOption<TItem>()
881890
{
882-
OnCloseAsync = () => OnCloseEditDialogCallbackAsync(saved),
891+
OnCloseAsync = async () =>
892+
{
893+
if (OnAfterCancelSaveAsync != null)
894+
{
895+
await OnAfterCancelSaveAsync();
896+
}
897+
await OnCloseEditDialogCallbackAsync(saved);
898+
},
883899
OnEditAsync = async context =>
884900
{
885901
saved = await OnSaveEditCallbackAsync(context, changedType);

test/UnitTest/Components/TableTest.cs

+100
Original file line numberDiff line numberDiff line change
@@ -5505,6 +5505,106 @@ public async Task OnSaveAsync_Ok()
55055505
Assert.True(afterModify);
55065506
}
55075507

5508+
[Fact]
5509+
public async Task OnAfterCancelSaveAsync_Popup()
5510+
{
5511+
var localizer = Context.Services.GetRequiredService<IStringLocalizer<Foo>>();
5512+
var items = Foo.GenerateFoo(localizer, 2);
5513+
var afterCancelSave = false;
5514+
var cut = Context.RenderComponent<BootstrapBlazorRoot>(pb =>
5515+
{
5516+
pb.AddChildContent<Table<Foo>>(pb =>
5517+
{
5518+
pb.Add(a => a.RenderMode, TableRenderMode.Table);
5519+
pb.Add(a => a.Items, items);
5520+
pb.Add(a => a.IsMultipleSelect, true);
5521+
pb.Add(a => a.ShowToolbar, true);
5522+
pb.Add(a => a.ShowExtendButtons, true);
5523+
pb.Add(a => a.EditMode, EditMode.Popup);
5524+
pb.Add(a => a.OnAfterCancelSaveAsync, () =>
5525+
{
5526+
afterCancelSave = true;
5527+
return Task.CompletedTask;
5528+
});
5529+
pb.Add(a => a.TableColumns, foo => builder =>
5530+
{
5531+
builder.OpenComponent<TableColumn<Foo, string>>(0);
5532+
builder.AddAttribute(1, "Field", "Name");
5533+
builder.AddAttribute(2, "FieldExpression", Utility.GenerateValueExpression(foo, "Name", typeof(string)));
5534+
builder.CloseComponent();
5535+
});
5536+
});
5537+
});
5538+
5539+
// test edit button
5540+
var button = cut.FindAll("tbody tr button");
5541+
await cut.InvokeAsync(() => button[0].Click());
5542+
5543+
// 保存按钮
5544+
var saveButton = cut.Find(".bb-editor-footer .btn-primary");
5545+
await cut.InvokeAsync(() => saveButton.Click());
5546+
Assert.False(afterCancelSave);
5547+
5548+
var modal = cut.FindComponent<Modal>();
5549+
await cut.InvokeAsync(modal.Instance.CloseCallback);
5550+
5551+
await cut.InvokeAsync(() => button[0].Click());
5552+
var cancelButton = cut.Find(".bb-editor-footer .btn");
5553+
5554+
// 取消按钮
5555+
await cut.InvokeAsync(() => cancelButton.Click());
5556+
Assert.True(afterCancelSave);
5557+
}
5558+
5559+
[Fact]
5560+
public async Task OnAfterCancelSaveAsync_Drawer()
5561+
{
5562+
var localizer = Context.Services.GetRequiredService<IStringLocalizer<Foo>>();
5563+
var items = Foo.GenerateFoo(localizer, 2);
5564+
var afterCancelSave = false;
5565+
var cut = Context.RenderComponent<BootstrapBlazorRoot>(pb =>
5566+
{
5567+
pb.AddChildContent<Table<Foo>>(pb =>
5568+
{
5569+
pb.Add(a => a.RenderMode, TableRenderMode.Table);
5570+
pb.Add(a => a.Items, items);
5571+
pb.Add(a => a.IsMultipleSelect, true);
5572+
pb.Add(a => a.ShowToolbar, true);
5573+
pb.Add(a => a.ShowExtendButtons, true);
5574+
pb.Add(a => a.EditMode, EditMode.Drawer);
5575+
pb.Add(a => a.OnAfterCancelSaveAsync, () =>
5576+
{
5577+
afterCancelSave = true;
5578+
return Task.CompletedTask;
5579+
});
5580+
pb.Add(a => a.TableColumns, foo => builder =>
5581+
{
5582+
builder.OpenComponent<TableColumn<Foo, string>>(0);
5583+
builder.AddAttribute(1, "Field", "Name");
5584+
builder.AddAttribute(2, "FieldExpression", Utility.GenerateValueExpression(foo, "Name", typeof(string)));
5585+
builder.CloseComponent();
5586+
});
5587+
});
5588+
});
5589+
5590+
// test edit button
5591+
var button = cut.FindAll("tbody tr button");
5592+
await cut.InvokeAsync(() => button[0].Click());
5593+
5594+
// 保存按钮
5595+
var saveButton = cut.Find(".bb-editor-footer .btn-primary");
5596+
await cut.InvokeAsync(() => saveButton.Click());
5597+
Assert.False(afterCancelSave);
5598+
5599+
// 取消按钮
5600+
button = cut.FindAll("tbody tr button");
5601+
await cut.InvokeAsync(() => button[0].Click());
5602+
5603+
var cancelButton = cut.Find(".bb-editor-footer .btn");
5604+
await cut.InvokeAsync(() => cancelButton.Click());
5605+
Assert.True(afterCancelSave);
5606+
}
5607+
55085608
[Theory]
55095609
[InlineData(EditMode.EditForm)]
55105610
[InlineData(EditMode.InCell)]

0 commit comments

Comments
 (0)