Skip to content

Commit b63ed8a

Browse files
authored
feat(TabItem): support ErrorLogger catch exception (#6139)
* refactor: 重构代码 * refactor: 更改 IErrorLogger 接口 * refactor: 改造 Layout 组件 * refactor: 增强 TabItemContent 支持生命周期异常捕获 * chore: bump version 9.7.1-beta03 * wip: 临时提交 * Revert "wip: 临时提交" This reverts commit d841341. * refactor: 撤销更新 * refactor: 代码格式化 * test: 撤销单元测试更改 * test: 更新单元测试 * refactor: 更新 ErrorLogger 是否开启逻辑 * refactor: 移除 IHandlerException 接口 * test: 增加单元测试
1 parent 1f5e494 commit b63ed8a

8 files changed

Lines changed: 51 additions & 34 deletions

File tree

src/BootstrapBlazor/Components/ErrorLogger/ErrorLogger.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -69,10 +69,6 @@ public class ErrorLogger : ComponentBase, IErrorLogger
6969
[NotNull]
7070
private BootstrapBlazorErrorBoundary? _errorBoundary = default;
7171

72-
private bool _enableErrorLogger => EnableErrorLogger ?? Options.CurrentValue.EnableErrorLogger;
73-
74-
private bool _showToast => ShowToast ?? Options.CurrentValue.ShowErrorLoggerToast;
75-
7672
/// <summary>
7773
/// <inheritdoc/>
7874
/// </summary>
@@ -81,6 +77,8 @@ protected override void OnInitialized()
8177
base.OnInitialized();
8278

8379
ToastTitle ??= Localizer[nameof(ToastTitle)];
80+
EnableErrorLogger ??= Options.CurrentValue.EnableErrorLogger;
81+
ShowToast ??= Options.CurrentValue.ShowErrorLoggerToast;
8482
}
8583

8684
/// <summary>
@@ -110,13 +108,13 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
110108
builder.CloseComponent();
111109
}
112110

113-
private RenderFragment? RenderContent => _enableErrorLogger ? RenderError : ChildContent;
111+
private RenderFragment? RenderContent => (EnableErrorLogger ?? false) ? RenderError : ChildContent;
114112

115113
private RenderFragment RenderError => builder =>
116114
{
117115
builder.OpenComponent<BootstrapBlazorErrorBoundary>(0);
118116
builder.AddAttribute(1, nameof(BootstrapBlazorErrorBoundary.OnErrorHandleAsync), OnErrorHandleAsync);
119-
builder.AddAttribute(2, nameof(BootstrapBlazorErrorBoundary.ShowToast), _showToast);
117+
builder.AddAttribute(2, nameof(BootstrapBlazorErrorBoundary.ShowToast), ShowToast);
120118
builder.AddAttribute(3, nameof(BootstrapBlazorErrorBoundary.ToastTitle), ToastTitle);
121119
builder.AddAttribute(4, nameof(BootstrapBlazorErrorBoundary.ErrorContent), ErrorContent);
122120
builder.AddAttribute(5, nameof(BootstrapBlazorErrorBoundary.ChildContent), ChildContent);

src/BootstrapBlazor/Components/Tab/Tab.razor

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,15 +149,15 @@ else
149149
@ContextMenuTemplate(this)
150150
}
151151
</ContextMenu>;
152-
152+
153153
RenderFragment<TabItem> RenderTabItem => item =>
154154
@<CascadingValue Value="item" IsFixed="true">
155155
@RenderTabItemContent(item)
156156
</CascadingValue>;
157157

158-
RenderFragment RenderDisabledHeaderItem(TabItem item) =>
158+
RenderFragment RenderDisabledHeaderItem(TabItem item) =>
159159
@<div @key="@item" class="@GetItemWrapClassString(item)">
160-
<div role="tab" class="@GetClassString(item)"
160+
<div role="tab" class="@GetClassString(item)"
161161
@oncontextmenu="e => OnContextMenu(e, item)" @oncontextmenu:preventDefault="IsPreventDefault">
162162
@RenderHeaderItemContent(item)
163163
</div>

src/BootstrapBlazor/Components/Tab/Tab.razor.cs

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace BootstrapBlazor.Components;
1313
/// <summary>
1414
/// Tab component
1515
/// </summary>
16-
public partial class Tab : IHandlerException
16+
public partial class Tab
1717
{
1818
private bool FirstRender { get; set; } = true;
1919

@@ -454,9 +454,6 @@ public partial class Tab : IHandlerException
454454
[NotNull]
455455
private IIconTheme? IconTheme { get; set; }
456456

457-
[Inject, NotNull]
458-
private DialogService? DialogService { get; set; }
459-
460457
[Inject]
461458
[NotNull]
462459
private FullScreenService? FullScreenService { get; set; }
@@ -477,16 +474,6 @@ public partial class Tab : IHandlerException
477474

478475
private bool IsPreventDefault => _contextMenuZone != null;
479476

480-
/// <summary>
481-
/// <inheritdoc/>
482-
/// </summary>
483-
protected override void OnInitialized()
484-
{
485-
base.OnInitialized();
486-
487-
ErrorLogger?.Register(this);
488-
}
489-
490477
/// <summary>
491478
/// <inheritdoc/>
492479
/// </summary>
@@ -1014,13 +1001,6 @@ private RenderFragment RenderTabItemContent(TabItem item) => builder =>
10141001
}
10151002
};
10161003

1017-
/// <summary>
1018-
/// HandlerException 错误处理方法
1019-
/// </summary>
1020-
/// <param name="ex"></param>
1021-
/// <param name="errorContent"></param>
1022-
public Task HandlerException(Exception ex, RenderFragment<Exception> errorContent) => DialogService.ShowErrorHandlerDialog(errorContent(ex));
1023-
10241004
private IEnumerable<MenuItem>? _menuItems;
10251005
private MenuItem? GetMenuItem(string url)
10261006
{
@@ -1228,7 +1208,6 @@ protected override async ValueTask DisposeAsync(bool disposing)
12281208
if (disposing)
12291209
{
12301210
RemoveLocationChanged();
1231-
ErrorLogger?.UnRegister(this);
12321211
}
12331212
}
12341213
}

src/BootstrapBlazor/Components/Tab/TabItemContent.cs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ internal class TabItemContent : IComponent
1515
[Parameter, NotNull]
1616
public TabItem? Item { get; set; }
1717

18+
[CascadingParameter]
19+
private Layout? Layout { get; set; }
20+
1821
private RenderHandle _renderHandle;
1922

2023
void IComponent.Attach(RenderHandle renderHandle)
@@ -43,10 +46,22 @@ private void BuildRenderTree(RenderTreeBuilder builder)
4346
builder.SetKey(_key);
4447
builder.AddAttribute(5, "class", ClassString);
4548
builder.AddAttribute(6, "id", Item.Id);
46-
builder.AddContent(10, Item.ChildContent);
49+
builder.AddContent(10, RenderItemContent(Item.ChildContent));
4750
builder.CloseElement();
4851
}
4952

53+
private RenderFragment RenderItemContent(RenderFragment? content) => builder =>
54+
{
55+
builder.OpenComponent<ErrorLogger>(0);
56+
builder.AddAttribute(1, nameof(ErrorLogger.ChildContent), content);
57+
58+
var enableErrorLogger = Layout?.EnableErrorLogger;
59+
var showToast = Layout?.ShowErrorLoggerToast;
60+
builder.AddAttribute(2, nameof(ErrorLogger.EnableErrorLogger), enableErrorLogger);
61+
builder.AddAttribute(3, nameof(ErrorLogger.ShowToast), showToast);
62+
builder.CloseComponent();
63+
};
64+
5065
private string? ClassString => CssBuilder.Default("tabs-body-content")
5166
.AddClass("d-none", !Item.IsActive)
5267
.Build();

src/BootstrapBlazor/Extensions/DialogServiceExtensions.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,4 +263,23 @@ public static async Task ShowErrorHandlerDialog(this DialogService service, Rend
263263
};
264264
await service.Show(option, dialog);
265265
}
266+
267+
/// <summary>
268+
/// 显示异常信息对话框扩展方法
269+
/// </summary>
270+
/// <param name="service"></param>
271+
/// <param name="exception"></param>
272+
/// <param name="dialog"></param>
273+
/// <returns></returns>
274+
public static async Task ShowExceptionDialog(this DialogService service, Exception exception, Dialog? dialog = null)
275+
{
276+
RenderFragment fragment = builder =>
277+
{
278+
builder.OpenElement(0, "div");
279+
builder.AddAttribute(10, "class", "error-stack");
280+
builder.AddContent(20, new MarkupString(exception.Message));
281+
builder.CloseElement();
282+
};
283+
await ShowErrorHandlerDialog(service, fragment, dialog);
284+
}
266285
}

test/UnitTest/Components/DialogTest.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,11 @@ await cut.InvokeAsync(() => dialog.ShowCloseDialog<MockValidateFormDialog>("Clos
578578
await cut.InvokeAsync(() => dialog.Show<MockValidateFormDialog>("Test Title"));
579579
await cut.InvokeAsync(() => modal.Instance.CloseCallback());
580580
#endregion
581+
582+
#region ShowExceptionDialog Method
583+
await cut.InvokeAsync(() => dialog.ShowExceptionDialog(new Exception("Test")));
584+
await cut.InvokeAsync(() => modal.Instance.CloseCallback());
585+
#endregion
581586
}
582587

583588
private class MockValidateFormDialog : ComponentBase

test/UnitTest/Components/ErrorLoggerTest.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,9 @@ public void OnErrorHandleAsync_Tab()
122122
cut.Contains("errorLogger-click");
123123
var button = cut.Find("button");
124124
button.TriggerEvent("onclick", EventArgs.Empty);
125-
cut.Contains("<div class=\"modal-body\"><div class=\"error-stack\">TimeStamp:");
125+
126+
// TabItem 内显示异常信息
127+
cut.Contains("error-stack");
126128
}
127129

128130
[Fact]

test/UnitTest/Components/LayoutTest.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,7 +535,6 @@ public void IHandlerException_Ok()
535535
pb.Add(a => a.EnableErrorLogger, true);
536536
pb.AddChildContent<Layout>(pb =>
537537
{
538-
pb.Add(a => a.EnableErrorLogger, true);
539538
// 按钮触发异常
540539
pb.Add(a => a.Main, new RenderFragment(builder =>
541540
{

0 commit comments

Comments
 (0)