Skip to content

Commit 33cc7ce

Browse files
authored
feat(Layout): add ShowTabInHeader parameter (#5762)
* feat: 增加 RenderTabHeader 方法 * chore: 增加 ShowTabInHeader 方法 * feat: 实现 TabHeader 再其他地方渲染逻辑 * refactor: 精简代码逻辑 * refactor: 增加 Layout 参数用于接管 RenderTabHeader 方法 * refactor: 脚本兼容 * test: 更新单元测试
1 parent 721f6a0 commit 33cc7ce

File tree

8 files changed

+255
-132
lines changed

8 files changed

+255
-132
lines changed

src/BootstrapBlazor/Components/Layout/Layout.razor

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<CascadingValue Value="this" IsFixed="true">
88
@if (IsAuthenticated)
99
{
10-
<section @attributes="AdditionalAttributes" class="@ClassString" style="@StyleString">
10+
<section @attributes="AdditionalAttributes" id="@Id" class="@ClassString" style="@StyleString">
1111
@if (Side == null)
1212
{
1313
if (Header != null)
@@ -79,6 +79,12 @@
7979
@CollapseBarTemplate
8080
}
8181
}
82+
@if (ShowTabInHeader)
83+
{
84+
<div class="tabs tabs-chrome">
85+
@RenderTabHeader()
86+
</div>
87+
}
8288
@Header
8389
</header>;
8490

@@ -137,7 +143,7 @@
137143
ShowRefreshToolbarButton="ShowRefreshToolbarButton" ShowFullscreenToolbarButton="ShowFullscreenToolbarButton"
138144
RefreshToolbarButtonIcon="@RefreshToolbarButtonIcon" FullscreenToolbarButtonIcon="@FullscreenToolbarButtonIcon"
139145
RefreshToolbarTooltipText="@RefreshToolbarTooltipText" FullscreenToolbarTooltipText="@FullscreenToolbarTooltipText"
140-
OnToolbarRefreshCallback="OnToolbarRefreshCallback"
146+
OnToolbarRefreshCallback="OnToolbarRefreshCallback" Layout="this"
141147
Body="@Main" NotAuthorized="NotAuthorized!" NotFound="NotFound!" NotFoundTabText="@NotFoundTabText">
142148
</Tab>;
143149

src/BootstrapBlazor/Components/Layout/Layout.razor.cs

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,12 @@ public partial class Layout : IHandlerException
345345
[Parameter]
346346
public Func<TabItem, Task<bool>>? OnBeforeShowContextMenu { get; set; }
347347

348+
/// <summary>
349+
/// Gets or sets whether show the tab in header. Default is false.
350+
/// </summary>
351+
[Parameter]
352+
public bool ShowTabInHeader { get; set; }
353+
348354
[Inject]
349355
[NotNull]
350356
private NavigationManager? Navigation { get; set; }
@@ -451,7 +457,8 @@ public partial class Layout : IHandlerException
451457
private IStringLocalizer<Layout>? Localizer { get; set; }
452458

453459
private bool _init;
454-
private Tab _tab = null!;
460+
private Tab? _tab = null;
461+
private ITabHeader? _tabHeader = null;
455462

456463
/// <summary>
457464
/// <inheritdoc/>
@@ -627,6 +634,18 @@ public virtual Task HandlerException(Exception ex, RenderFragment<Exception> err
627634

628635
private string? GetTargetString() => IsFixedTabHeader ? ".tabs-body" : null;
629636

637+
private RenderFragment RenderTabHeader() => builder =>
638+
{
639+
builder.OpenComponent<LayoutHeader>(0);
640+
builder.AddComponentReferenceCapture(1, instance => _tabHeader = (ITabHeader)instance);
641+
builder.CloseComponent();
642+
};
643+
644+
internal void RegisterTab(Tab tab)
645+
{
646+
tab.TabHeader = _tabHeader;
647+
}
648+
630649
/// <summary>
631650
/// <inheritdoc/>
632651
/// </summary>
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the Apache 2.0 License
3+
// See the LICENSE file in the project root for more information.
4+
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone
5+
6+
namespace BootstrapBlazor.Components;
7+
8+
internal class LayoutHeader : IComponent, ITabHeader
9+
{
10+
private RenderHandle _renderHandle;
11+
12+
void IComponent.Attach(RenderHandle renderHandle)
13+
{
14+
_renderHandle = renderHandle;
15+
}
16+
17+
/// <summary>
18+
/// <inheritdoc/>
19+
/// </summary>
20+
/// <param name="parameters"></param>
21+
/// <returns></returns>
22+
Task IComponent.SetParametersAsync(ParameterView parameters)
23+
{
24+
return Task.CompletedTask;
25+
}
26+
27+
/// <summary>
28+
/// render tab header method.
29+
/// </summary>
30+
public void Render(RenderFragment renderFragment)
31+
{
32+
_renderHandle.Render(builder =>
33+
{
34+
builder.AddContent(0, renderFragment);
35+
});
36+
}
37+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the Apache 2.0 License
3+
// See the LICENSE file in the project root for more information.
4+
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone
5+
6+
namespace BootstrapBlazor.Components;
7+
8+
/// <summary>
9+
/// ITabHeader interface
10+
/// </summary>
11+
public interface ITabHeader
12+
{
13+
/// <summary>
14+
/// Render method
15+
/// </summary>
16+
/// <param name="renderFragment"></param>
17+
void Render(RenderFragment renderFragment);
18+
}

0 commit comments

Comments
 (0)