Skip to content

Commit

Permalink
refactor(Table): refactor logic for event callback selected row (#4084)
Browse files Browse the repository at this point in the history
* test: 更新单元测试

* refactor: 更改逻辑

* refactor: 移除回调方法

* refactor: 精简代码

* refactor: 重构代码提高代码可读性

* refactor: 简化逻辑提高代码可读性

* doc: 增加注释文档

* refactor: 重构代码提高代码可读性

* refactor: 重构代码提高代码可读性

* refactor: 更新代码消除警告信息

* refactor: add SelectedRowsChanged callback

* chore: bump version 8.8.3-beta05

* revert: 撤销更改

Co-authored-by: Amos <[email protected]>

---------

Co-authored-by: Amos <[email protected]>
  • Loading branch information
ArgoZhang and izanhzh authored Aug 16, 2024
1 parent c492c6f commit 90c3487
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 105 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -52,5 +52,5 @@ private IDispatchService&lt;GiteePostBody&gt;? DispatchService { get; set; }</Pr
public string? Message { get; set; }
}</Pre>
</section>
<Button IsAsync="true" Icon="fa-regular fa-paper-plane" Text="@Localizer["DispatchNoticeButtonText"]" OnClickWithoutRender="OnDispatch" />
<Button IsAsync="true" Icon="fa-regular fa-paper-plane" Text="@Localizer["DispatchNoticeButtonText"]" OnClickWithoutRender="OnDispatch"></Button>
</DemoBlock>
2 changes: 1 addition & 1 deletion src/BootstrapBlazor/BootstrapBlazor.csproj
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk.Razor">

<PropertyGroup>
<Version>8.8.3-beta04</Version>
<Version>8.8.3-beta05</Version>
</PropertyGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'net5.0'">
Expand Down
10 changes: 4 additions & 6 deletions src/BootstrapBlazor/Components/Table/Table.razor.Edit.cs
Original file line number Diff line number Diff line change
Expand Up @@ -461,12 +461,6 @@ protected async Task QueryData()
ResetSelectedRows(Items);
RowsCache = null;
}

// 更新 SelectedRow 状态
if (SelectedRowsChanged.HasDelegate)
{
await SelectedRowsChanged.InvokeAsync(SelectedRows);
}
return;

async Task OnQuery(QueryPageOptions queryOption)
Expand Down Expand Up @@ -614,6 +608,10 @@ private void ResetSelectedRows(IEnumerable<TItem> items)
if (SelectedRows.Count > 0)
{
SelectedRows = items.Where(i => SelectedRows.Any(row => Equals(i, row))).ToList();
if (SelectedRowsChanged.HasDelegate)
{
_ = SelectedRowsChanged.InvokeAsync(SelectedRows);
}
}
}

Expand Down
155 changes: 64 additions & 91 deletions src/BootstrapBlazor/Components/Table/Table.razor.Toolbar.cs
Original file line number Diff line number Diff line change
Expand Up @@ -475,16 +475,21 @@ public IEnumerable<ITableColumn> GetVisibleColumns()
/// </summary>
public async Task AddAsync()
{
if (IsExcel || DynamicContext != null)
if (DynamicContext != null)
{
await AddDynamicObjectExcelModelAsync();
// 数据源为 DataTable 新建后重建行与列
await DynamicContext.AddAsync(SelectedRows.OfType<IDynamicObject>());
ResetDynamicContext();
SelectedRows.Clear();
await OnSelectedRowsChanged();
}
else
else if (IsExcel)
{
await AddItemAsync();
await InternalOnAddAsync();
await QueryAsync(false);
await OnSelectedRowsChanged();
}

async Task AddItemAsync()
else
{
await ToggleLoading(true);
await InternalOnAddAsync();
Expand All @@ -511,24 +516,6 @@ async Task AddItemAsync()
await OnSelectedRowsChanged();
await ToggleLoading(false);
}

async Task AddDynamicObjectExcelModelAsync()
{
if (DynamicContext != null)
{
// 数据源为 DataTable 新建后重建行与列
await DynamicContext.AddAsync(SelectedRows.OfType<IDynamicObject>());
ResetDynamicContext();
SelectedRows.Clear();
await OnSelectedRowsChanged();
}
else
{
await InternalOnAddAsync();
await QueryAsync(false);
await OnSelectedRowsChanged();
}
}
}

private bool ShowEditForm { get; set; }
Expand All @@ -544,12 +531,26 @@ public async Task EditAsync()
if (ShowExtendEditButtonCallback != null && !ShowExtendEditButtonCallback(SelectedRows[0]))
{
// 提示不可编辑
await ShowToastAsync(EditButtonToastReadonlyContent);
await ShowToastAsync(EditButtonToastTitle, EditButtonToastReadonlyContent);
}
else
{
await ToggleLoading(true);
await InternalOnEditAsync();

// 跟踪模式与动态类型时使用原始数据,否则使用克隆数据
EditModel = (IsTracking || DynamicContext != null) ? SelectedRows[0] : Utility.Clone(SelectedRows[0]);
if (OnEditAsync != null)
{
await OnEditAsync(EditModel);
}
else
{
var d = DataService ?? InjectDataService;
if (d is IEntityFrameworkCoreDataService ef)
{
await ef.EditAsync(EditModel);
}
}
EditModalTitleString = EditModalTitle;

// 显示编辑框
Expand All @@ -562,7 +563,6 @@ public async Task EditAsync()
ShowEditForm = true;
ShowAddForm = false;
StateHasChanged();

}
else if (EditMode == EditMode.InCell)
{
Expand All @@ -579,37 +579,32 @@ public async Task EditAsync()
}
else
{
// 不选或者多选弹窗提示
var content = SelectedRows.Count == 0 ? EditButtonToastNotSelectContent : EditButtonToastMoreSelectContent;
await ShowToastAsync(content);
await ShowToastAsync(EditButtonToastTitle, content);
}
}

async Task InternalOnEditAsync()
private async Task ShowToastAsync(string title, string content, ToastCategory category = ToastCategory.Information)
{
var option = new ToastOption
{
EditModel = (IsTracking || DynamicContext != null) ? SelectedRows[0] : Utility.Clone(SelectedRows[0]);
if (OnEditAsync != null)
{
await OnEditAsync(EditModel);
}
else
{
var d = DataService ?? InjectDataService;
if (d is IEntityFrameworkCoreDataService ef)
{
await ef.EditAsync(EditModel);
}
}
}
Category = category,
Title = title,
Content = content
};
await Toast.Show(option);
}

async Task ShowToastAsync(string content)
private async Task ShowDeleteToastAsync(string title, string content, ToastCategory category = ToastCategory.Information)
{
var option = new ToastOption
{
var option = new ToastOption
{
Category = ToastCategory.Information,
Title = EditButtonToastTitle,
Content = content
};
await Toast.Show(option);
}
Category = category,
Title = title
};
option.Content = string.Format(content, Math.Ceiling(option.Delay / 1000.0));
await Toast.Show(option);
}

/// <summary>
Expand Down Expand Up @@ -952,41 +947,35 @@ protected async Task<bool> ConfirmDelete()
var ret = false;
if (SelectedRows.Count == 0)
{
await ShowToastAsync(DeleteButtonToastContent);
await ShowDeleteToastAsync(DeleteButtonToastTitle, DeleteButtonToastContent);
}
else
else if (ShowExtendDeleteButtonCallback != null && SelectedRows.Any(i => !ShowExtendDeleteButtonCallback(i)))
{
if (ShowExtendDeleteButtonCallback != null && SelectedRows.Any(i => !ShowExtendDeleteButtonCallback(i)))
{
await ShowToastAsync(DeleteButtonToastCanNotDeleteContent);
}
else
{
ret = true;
}
await ShowDeleteToastAsync(DeleteButtonToastTitle, DeleteButtonToastCanNotDeleteContent);
}
return ret;

async Task ShowToastAsync(string content)
else
{
var option = new ToastOption
{
Category = ToastCategory.Information,
Title = DeleteButtonToastTitle
};
option.Content = string.Format(content, Math.Ceiling(option.Delay / 1000.0));
await Toast.Show(option);
ret = true;
}
return ret;
}

/// <summary>
/// 删除数据方法
/// </summary>
protected async Task DeleteAsync()
{
if (IsExcel || DynamicContext != null)
if (DynamicContext != null)
{
await DeleteDynamicObjectExcelModelAsync();
await DynamicContext.DeleteAsync(SelectedRows.OfType<IDynamicObject>());
ResetDynamicContext();
SelectedRows.Clear();
await OnSelectedRowsChanged();
}
else if (IsExcel)
{
await InternalOnDeleteAsync();
await QueryAsync();
}
else
{
Expand Down Expand Up @@ -1048,27 +1037,11 @@ async Task<bool> DeleteItemsAsync()
}
return ret;
}

async Task DeleteDynamicObjectExcelModelAsync()
{
if (DynamicContext != null)
{
await DynamicContext.DeleteAsync(SelectedRows.AsEnumerable().OfType<IDynamicObject>());
ResetDynamicContext();
SelectedRows.Clear();
await OnSelectedRowsChanged();
}
else
{
await InternalOnDeleteAsync();
await QueryAsync();
}
}
}

private void ResetDynamicContext()
{
if (DynamicContext != null && typeof(TItem).IsAssignableTo(typeof(IDynamicObject)))
if (DynamicContext != null)
{
AutoGenerateColumns = false;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,18 @@
namespace BootstrapBlazor.Components;

/// <summary>
///
/// IEntityFrameworkCoreDataService 接口
/// </summary>
public interface IEntityFrameworkCoreDataService
{
/// <summary>
///
/// 取消方法,由于编辑时使用的是克隆数据,常见取消用法不需要写任何代码,可用于保存数据下次编辑时恢复
/// </summary>
/// <returns></returns>
Task CancelAsync();

/// <summary>
///
/// 编辑方法,可对未提供编辑 UI 的数据进行填充
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
Expand Down
3 changes: 0 additions & 3 deletions test/UnitTest/Components/ButtonTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -390,9 +390,6 @@ public void IsAutoFocus_Ok()
{
pb.Add(a => a.IsAutoFocus, true);
});

var button = cut.Find("button");
Context.JSInterop.VerifyFocusAsyncInvoke().Arguments[0].ShouldBeElementReferenceTo(button);
}

[Fact]
Expand Down

0 comments on commit 90c3487

Please sign in to comment.