From cf1459322db25381ee77c82d38d0467e157ef9b1 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Apr 2025 15:12:11 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=20RenderTabHeade?= =?UTF-8?q?r=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Tab/Tab.razor | 245 +++++++++--------- .../Components/Tab/Tab.razor.cs | 2 +- 2 files changed, 125 insertions(+), 122 deletions(-) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index a503659557a..4530de61550 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -40,151 +40,154 @@ else @code { RenderFragment RenderTab => @
-
-
- @if (BeforeNavigatorTemplate != null) + @RenderTabHeader +
+ + @if (IsOnlyRenderActiveTab) { - - @BeforeNavigatorTemplate - + var item = Items.FirstOrDefault(i => i.IsActive); + if (item != null) + { + @RenderTabItem(item) + } } - @if (ShowNavigatorButtons) + else { - + foreach (var item in Items) + { + @RenderTabItem(item) + } } -
-
- - @ChildContent - - - @if (!Items.Any() && !string.IsNullOrEmpty(DefaultUrl)) - { - if (ClickTabToNavigation) - { - Navigator.NavigateTo(DefaultUrl); - } - else - { - AddTabItem(DefaultUrl); - } - } - @if (FirstRender) + +
+
; + + internal RenderFragment RenderTabHeader => + @
+
+ @if (BeforeNavigatorTemplate != null) + { + + @BeforeNavigatorTemplate + + } + @if (ShowNavigatorButtons) + { + + } +
+
+ + @ChildContent + + + @if (!Items.Any() && !string.IsNullOrEmpty(DefaultUrl)) + { + if (ClickTabToNavigation) { - if (!Items.Any(t => t.IsActive)) - { - Items.FirstOrDefault(i => i.IsDisabled == false)?.SetActive(true); - } + Navigator.NavigateTo(DefaultUrl); } - @foreach (var item in Items) + else { - @if (item.HeaderTemplate != null) - { -
- @item.HeaderTemplate(item) -
- } - else if (item.IsDisabled) - { - @RenderDisabledHeaderItem(item) - } - else - { - @RenderHeaderItem(item) - } + AddTabItem(DefaultUrl); } - @if (IsCard || IsBorderCard) + } + @if (FirstRender) + { + if (!Items.Any(t => t.IsActive)) { -
+ Items.FirstOrDefault(i => i.IsDisabled == false)?.SetActive(true); } -
- @if (!IsCard && !IsBorderCard && ShowActiveBar) - { -
} -
-
- - @if (ButtonTemplate != null) - { - @ButtonTemplate - } - @if (ShowToolbar) - { -
- @if (ShowRefreshToolbarButton) + @foreach (var item in Items) + { + @if (item.HeaderTemplate != null) { - +
+ @item.HeaderTemplate(item) +
} - @if (ShowFullscreenToolbarButton) + else if (item.IsDisabled) { -
- -
+ @RenderDisabledHeaderItem(item) } - @if (ToolbarTemplate != null) + else { - @ToolbarTemplate + @RenderHeaderItem(item) } -
- } - @if (ShowNavigatorButtons) - { - - } - @if (ShouldShowExtendButtons()) - { - - - } - @if (AfterNavigatorTemplate != null) + } + @if (IsCard || IsBorderCard) + { +
+ } + + @if (!IsCard && !IsBorderCard && ShowActiveBar) { - @AfterNavigatorTemplate +
} -
+
-
-
- @if (IsOnlyRenderActiveTab) + @if (ButtonTemplate != null) { - var item = Items.FirstOrDefault(i => i.IsActive); - if (item != null) - { - @RenderTabItem(item) - } + @ButtonTemplate } - else + @if (ShowToolbar) { - foreach (var item in Items) - { - @RenderTabItem(item) - } +
+ @if (ShowRefreshToolbarButton) + { + + } + @if (ShowFullscreenToolbarButton) + { +
+ +
+ } + @if (ToolbarTemplate != null) + { + @ToolbarTemplate + } +
+ } + @if (ShowNavigatorButtons) + { + + } + @if (ShouldShowExtendButtons()) + { + + + } + @if (AfterNavigatorTemplate != null) + { + @AfterNavigatorTemplate }
diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index 13f511925f1..dbbc4682808 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -42,7 +42,7 @@ public partial class Tab : IHandlerException .AddClass("tabs-vertical", Placement == Placement.Left || Placement == Placement.Right) .AddClass("tabs-chrome", TabStyle == TabStyle.Chrome) .AddClass("tabs-capsule", TabStyle == TabStyle.Capsule) - .AddClassFromAttributes(AdditionalAttributes) + .AddClassFromAttributes(AdditionalAttributes) .Build(); private string? StyleString => CssBuilder.Default() From 23d5b3e1fd4aaaa263a763e3207c897c5aff16e8 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Apr 2025 15:12:42 +0800 Subject: [PATCH 2/7] =?UTF-8?q?chore:=20=E5=A2=9E=E5=8A=A0=20ShowTabInHead?= =?UTF-8?q?er=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Layout/Layout.razor | 9 +++++++++ src/BootstrapBlazor/Components/Layout/Layout.razor.cs | 6 ++++++ 2 files changed, 15 insertions(+) diff --git a/src/BootstrapBlazor/Components/Layout/Layout.razor b/src/BootstrapBlazor/Components/Layout/Layout.razor index 75d823a6a9e..dc52f6c1554 100644 --- a/src/BootstrapBlazor/Components/Layout/Layout.razor +++ b/src/BootstrapBlazor/Components/Layout/Layout.razor @@ -79,6 +79,15 @@ @CollapseBarTemplate } } + @if (ShowTabInHeader) + { +
+ @if(_tab != null) + { + @_tab.RenderTabHeader + } +
+ } @Header ; diff --git a/src/BootstrapBlazor/Components/Layout/Layout.razor.cs b/src/BootstrapBlazor/Components/Layout/Layout.razor.cs index dfa088ec917..aa3a798b4ae 100644 --- a/src/BootstrapBlazor/Components/Layout/Layout.razor.cs +++ b/src/BootstrapBlazor/Components/Layout/Layout.razor.cs @@ -345,6 +345,12 @@ public partial class Layout : IHandlerException [Parameter] public Func>? OnBeforeShowContextMenu { get; set; } + /// + /// Gets or sets whether show the tab in header. Default is false. + /// + [Parameter] + public bool ShowTabInHeader { get; set; } + [Inject] [NotNull] private NavigationManager? Navigation { get; set; } From cbfc040451f747743faf515605c12a623ccc756f Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Apr 2025 16:16:41 +0800 Subject: [PATCH 3/7] =?UTF-8?q?feat:=20=E5=AE=9E=E7=8E=B0=20TabHeader=20?= =?UTF-8?q?=E5=86=8D=E5=85=B6=E4=BB=96=E5=9C=B0=E6=96=B9=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Layout/Layout.razor | 5 +- .../Components/Layout/Layout.razor.cs | 15 +++++- .../Components/Layout/LayoutTabHeader.cs | 51 +++++++++++++++++++ src/BootstrapBlazor/Components/Tab/Tab.razor | 11 +++- .../Components/Tab/Tab.razor.cs | 7 +++ 5 files changed, 82 insertions(+), 7 deletions(-) create mode 100644 src/BootstrapBlazor/Components/Layout/LayoutTabHeader.cs diff --git a/src/BootstrapBlazor/Components/Layout/Layout.razor b/src/BootstrapBlazor/Components/Layout/Layout.razor index dc52f6c1554..1bdf370a658 100644 --- a/src/BootstrapBlazor/Components/Layout/Layout.razor +++ b/src/BootstrapBlazor/Components/Layout/Layout.razor @@ -82,10 +82,7 @@ @if (ShowTabInHeader) {
- @if(_tab != null) - { - @_tab.RenderTabHeader - } + @RenderTabHeader()
} @Header diff --git a/src/BootstrapBlazor/Components/Layout/Layout.razor.cs b/src/BootstrapBlazor/Components/Layout/Layout.razor.cs index aa3a798b4ae..92bcd4b9529 100644 --- a/src/BootstrapBlazor/Components/Layout/Layout.razor.cs +++ b/src/BootstrapBlazor/Components/Layout/Layout.razor.cs @@ -457,7 +457,8 @@ public partial class Layout : IHandlerException private IStringLocalizer? Localizer { get; set; } private bool _init; - private Tab _tab = null!; + private Tab? _tab = null; + private LayoutTabHeader? _tabHeader = null; /// /// @@ -633,6 +634,18 @@ public virtual Task HandlerException(Exception ex, RenderFragment err private string? GetTargetString() => IsFixedTabHeader ? ".tabs-body" : null; + private RenderFragment RenderTabHeader() => builder => + { + builder.OpenComponent(0); + builder.AddComponentReferenceCapture(1, instance => _tabHeader = (LayoutTabHeader)instance); + builder.CloseComponent(); + }; + + internal void RegisterTab(Tab tab) + { + tab.layoutTabHeader = _tabHeader; + } + /// /// /// diff --git a/src/BootstrapBlazor/Components/Layout/LayoutTabHeader.cs b/src/BootstrapBlazor/Components/Layout/LayoutTabHeader.cs new file mode 100644 index 00000000000..b81f2aaed77 --- /dev/null +++ b/src/BootstrapBlazor/Components/Layout/LayoutTabHeader.cs @@ -0,0 +1,51 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +using Microsoft.AspNetCore.Components.Rendering; + +namespace BootstrapBlazor.Components; + +internal class LayoutTabHeader : IComponent +{ + private RenderHandle _renderHandle; + + void IComponent.Attach(RenderHandle renderHandle) + { + _renderHandle = renderHandle; + } + + /// + /// + /// + /// + /// + Task IComponent.SetParametersAsync(ParameterView parameters) + { + return Task.CompletedTask; + } + + private RenderFragment? _renderFragment; + + /// + /// render tab header method. + /// + public void RenderHeader(RenderFragment renderFragment) + { + _renderFragment = renderFragment; + _renderHandle.Render(BuildRenderTree); + } + + /// + /// + /// + /// + private void BuildRenderTree(RenderTreeBuilder builder) + { + if (_renderFragment != null) + { + builder.AddContent(0, _renderFragment); + } + } +} diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index 4530de61550..413843dc9c3 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -40,7 +40,14 @@ else @code { RenderFragment RenderTab => @
- @RenderTabHeader + @if (layoutTabHeader != null) + { + layoutTabHeader.RenderHeader(RenderTabHeader); + } + else + { + @RenderTabHeader + }
@if (IsOnlyRenderActiveTab) @@ -62,7 +69,7 @@ else
; - internal RenderFragment RenderTabHeader => + RenderFragment RenderTabHeader => @
@if (BeforeNavigatorTemplate != null) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index dbbc4682808..0d789551c87 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -465,6 +465,8 @@ public partial class Tab : IHandlerException private bool IsPreventDefault => _contextMenuZone != null; + internal LayoutTabHeader? layoutTabHeader = null; + /// /// /// @@ -473,6 +475,11 @@ protected override void OnInitialized() base.OnInitialized(); ErrorLogger?.Register(this); + + if (Layout is { ShowTabInHeader: true }) + { + Layout.RegisterTab(this); + } } /// From 10a44cb8e9c3cd7dd85eff730b6c81dfba4befb8 Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Apr 2025 16:21:51 +0800 Subject: [PATCH 4/7] =?UTF-8?q?refactor:=20=E7=B2=BE=E7=AE=80=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Layout/LayoutTabHeader.cs | 22 ++++--------------- src/BootstrapBlazor/Components/Tab/Tab.razor | 2 +- 2 files changed, 5 insertions(+), 19 deletions(-) diff --git a/src/BootstrapBlazor/Components/Layout/LayoutTabHeader.cs b/src/BootstrapBlazor/Components/Layout/LayoutTabHeader.cs index b81f2aaed77..bd4caff4241 100644 --- a/src/BootstrapBlazor/Components/Layout/LayoutTabHeader.cs +++ b/src/BootstrapBlazor/Components/Layout/LayoutTabHeader.cs @@ -3,8 +3,6 @@ // See the LICENSE file in the project root for more information. // Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone -using Microsoft.AspNetCore.Components.Rendering; - namespace BootstrapBlazor.Components; internal class LayoutTabHeader : IComponent @@ -26,26 +24,14 @@ Task IComponent.SetParametersAsync(ParameterView parameters) return Task.CompletedTask; } - private RenderFragment? _renderFragment; - /// /// render tab header method. /// - public void RenderHeader(RenderFragment renderFragment) - { - _renderFragment = renderFragment; - _renderHandle.Render(BuildRenderTree); - } - - /// - /// - /// - /// - private void BuildRenderTree(RenderTreeBuilder builder) + public void Render(RenderFragment renderFragment) { - if (_renderFragment != null) + _renderHandle.Render(builder => { - builder.AddContent(0, _renderFragment); - } + builder.AddContent(0, renderFragment); + }); } } diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index 413843dc9c3..4c69be33b96 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -42,7 +42,7 @@ else @
@if (layoutTabHeader != null) { - layoutTabHeader.RenderHeader(RenderTabHeader); + layoutTabHeader.Render(RenderTabHeader); } else { From 0b482012a9eac0cb5f1e21ecae8ee63e16b0b70f Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Apr 2025 17:30:48 +0800 Subject: [PATCH 5/7] =?UTF-8?q?refactor:=20=E5=A2=9E=E5=8A=A0=20Layout=20?= =?UTF-8?q?=E5=8F=82=E6=95=B0=E7=94=A8=E4=BA=8E=E6=8E=A5=E7=AE=A1=20Render?= =?UTF-8?q?TabHeader=20=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Components/Layout/Layout.razor | 2 +- .../Components/Layout/Layout.razor.cs | 8 ++++---- .../{LayoutTabHeader.cs => LayoutHeader.cs} | 2 +- .../Components/Tab/ITabHeader.cs | 18 ++++++++++++++++++ src/BootstrapBlazor/Components/Tab/Tab.razor | 4 ++-- .../Components/Tab/Tab.razor.cs | 16 ++++++++++++---- 6 files changed, 38 insertions(+), 12 deletions(-) rename src/BootstrapBlazor/Components/Layout/{LayoutTabHeader.cs => LayoutHeader.cs} (94%) create mode 100644 src/BootstrapBlazor/Components/Tab/ITabHeader.cs diff --git a/src/BootstrapBlazor/Components/Layout/Layout.razor b/src/BootstrapBlazor/Components/Layout/Layout.razor index 1bdf370a658..254ebce9b58 100644 --- a/src/BootstrapBlazor/Components/Layout/Layout.razor +++ b/src/BootstrapBlazor/Components/Layout/Layout.razor @@ -143,7 +143,7 @@ ShowRefreshToolbarButton="ShowRefreshToolbarButton" ShowFullscreenToolbarButton="ShowFullscreenToolbarButton" RefreshToolbarButtonIcon="@RefreshToolbarButtonIcon" FullscreenToolbarButtonIcon="@FullscreenToolbarButtonIcon" RefreshToolbarTooltipText="@RefreshToolbarTooltipText" FullscreenToolbarTooltipText="@FullscreenToolbarTooltipText" - OnToolbarRefreshCallback="OnToolbarRefreshCallback" + OnToolbarRefreshCallback="OnToolbarRefreshCallback" Layout="this" Body="@Main" NotAuthorized="NotAuthorized!" NotFound="NotFound!" NotFoundTabText="@NotFoundTabText"> ; diff --git a/src/BootstrapBlazor/Components/Layout/Layout.razor.cs b/src/BootstrapBlazor/Components/Layout/Layout.razor.cs index 92bcd4b9529..617254755b1 100644 --- a/src/BootstrapBlazor/Components/Layout/Layout.razor.cs +++ b/src/BootstrapBlazor/Components/Layout/Layout.razor.cs @@ -458,7 +458,7 @@ public partial class Layout : IHandlerException private bool _init; private Tab? _tab = null; - private LayoutTabHeader? _tabHeader = null; + private ITabHeader? _tabHeader = null; /// /// @@ -636,14 +636,14 @@ public virtual Task HandlerException(Exception ex, RenderFragment err private RenderFragment RenderTabHeader() => builder => { - builder.OpenComponent(0); - builder.AddComponentReferenceCapture(1, instance => _tabHeader = (LayoutTabHeader)instance); + builder.OpenComponent(0); + builder.AddComponentReferenceCapture(1, instance => _tabHeader = (ITabHeader)instance); builder.CloseComponent(); }; internal void RegisterTab(Tab tab) { - tab.layoutTabHeader = _tabHeader; + tab.TabHeader = _tabHeader; } /// diff --git a/src/BootstrapBlazor/Components/Layout/LayoutTabHeader.cs b/src/BootstrapBlazor/Components/Layout/LayoutHeader.cs similarity index 94% rename from src/BootstrapBlazor/Components/Layout/LayoutTabHeader.cs rename to src/BootstrapBlazor/Components/Layout/LayoutHeader.cs index bd4caff4241..3d2d97f4b4d 100644 --- a/src/BootstrapBlazor/Components/Layout/LayoutTabHeader.cs +++ b/src/BootstrapBlazor/Components/Layout/LayoutHeader.cs @@ -5,7 +5,7 @@ namespace BootstrapBlazor.Components; -internal class LayoutTabHeader : IComponent +internal class LayoutHeader : IComponent, ITabHeader { private RenderHandle _renderHandle; diff --git a/src/BootstrapBlazor/Components/Tab/ITabHeader.cs b/src/BootstrapBlazor/Components/Tab/ITabHeader.cs new file mode 100644 index 00000000000..5b4ec19111f --- /dev/null +++ b/src/BootstrapBlazor/Components/Tab/ITabHeader.cs @@ -0,0 +1,18 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the Apache 2.0 License +// See the LICENSE file in the project root for more information. +// Maintainer: Argo Zhang(argo@live.ca) Website: https://www.blazor.zone + +namespace BootstrapBlazor.Components; + +/// +/// ITabHeader interface +/// +public interface ITabHeader +{ + /// + /// Render method + /// + /// + void Render(RenderFragment renderFragment); +} diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index 4c69be33b96..d86840e722c 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -40,9 +40,9 @@ else @code { RenderFragment RenderTab => @
- @if (layoutTabHeader != null) + @if (TabHeader != null) { - layoutTabHeader.Render(RenderTabHeader); + TabHeader.Render(RenderTabHeader); } else { diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index 0d789551c87..0b15579049e 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -419,8 +419,14 @@ public partial class Tab : IHandlerException [Parameter] public Func>? OnBeforeShowContextMenu { get; set; } + /// + /// Gets or sets the instance. Default is null. + /// + [Parameter] + public Layout? Layout { get; set; } + [CascadingParameter] - private Layout? Layout { get; set; } + private Layout? CascadeLayout { get; set; } [Inject] [NotNull] @@ -465,7 +471,7 @@ public partial class Tab : IHandlerException private bool IsPreventDefault => _contextMenuZone != null; - internal LayoutTabHeader? layoutTabHeader = null; + internal ITabHeader? TabHeader { get; set; } /// /// @@ -786,6 +792,8 @@ public void AddTab(string url, string text, string? icon = null, bool active = t StateHasChanged(); } + private Layout? LayoutInstance => Layout ?? CascadeLayout; + private void AddTabItem(string url) { var parameters = new Dictionary @@ -823,7 +831,7 @@ private void AddTabItem(string url) builder.AddAttribute(1, nameof(BootstrapBlazorAuthorizeView.Type), context.Handler); builder.AddAttribute(2, nameof(BootstrapBlazorAuthorizeView.Parameters), context.Parameters); builder.AddAttribute(3, nameof(BootstrapBlazorAuthorizeView.NotAuthorized), NotAuthorized); - builder.AddAttribute(4, nameof(BootstrapBlazorAuthorizeView.Resource), Layout?.Resource); + builder.AddAttribute(4, nameof(BootstrapBlazorAuthorizeView.Resource), LayoutInstance?.Resource); builder.CloseComponent(); })); } @@ -1005,7 +1013,7 @@ private RenderFragment RenderTabItemContent(TabItem item) => builder => private IEnumerable? _menuItems; private MenuItem? GetMenuItem(string url) { - _menuItems ??= (Menus ?? Layout?.Menus).GetAllItems(); + _menuItems ??= (Menus ?? LayoutInstance?.Menus).GetAllItems(); return _menuItems?.FirstOrDefault(i => !string.IsNullOrEmpty(i.Url) && (i.Url.TrimStart('/').Equals(url.TrimStart('/'), StringComparison.OrdinalIgnoreCase))); } From 2e49c84c4a7f5dd75377cf884993a254cb1ecdaa Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Apr 2025 17:37:17 +0800 Subject: [PATCH 6/7] =?UTF-8?q?refactor:=20=E8=84=9A=E6=9C=AC=E5=85=BC?= =?UTF-8?q?=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/BootstrapBlazor/Components/Layout/Layout.razor | 2 +- src/BootstrapBlazor/Components/Tab/Tab.razor.cs | 2 +- src/BootstrapBlazor/Components/Tab/Tab.razor.js | 12 +++++++++--- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/BootstrapBlazor/Components/Layout/Layout.razor b/src/BootstrapBlazor/Components/Layout/Layout.razor index 254ebce9b58..137af65e4b1 100644 --- a/src/BootstrapBlazor/Components/Layout/Layout.razor +++ b/src/BootstrapBlazor/Components/Layout/Layout.razor @@ -7,7 +7,7 @@ @if (IsAuthenticated) { -
+
@if (Side == null) { if (Header != null) diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index 0b15579049e..ce030c1cbbb 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -580,7 +580,7 @@ protected override async Task OnAfterRenderAsync(bool firstRender) /// ///
/// - protected override Task InvokeInitAsync() => InvokeVoidAsync("init", Id, Interop, nameof(DragItemCallback)); + protected override Task InvokeInitAsync() => InvokeVoidAsync("init", Id, Interop, nameof(DragItemCallback), Layout?.Id); private void RemoveLocationChanged() { diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.js b/src/BootstrapBlazor/Components/Tab/Tab.razor.js index fe95d87df5a..cd20c1a4fd6 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.js +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.js @@ -171,7 +171,7 @@ const disposeDragItems = items => { }) } -export function init(id, invoke, method) { +export function init(id, invoke, method, layoutId) { const el = document.getElementById(id) if (el === null) { return @@ -180,11 +180,17 @@ export function init(id, invoke, method) { const tab = { el, invoke, method } Data.set(id, tab) - tab.header = el.firstChild + if (layoutId) { + const layout = document.getElementById(layoutId) + tab.header = layout.querySelector('.layout-header .tabs > .tabs-header'); + } + else { + tab.header = el.firstChild + } + tab.wrap = tab.header.firstChild tab.scroll = tab.wrap.querySelector('.tabs-nav-scroll') tab.tabNav = tab.scroll.firstChild - tab.resizeHandler = () => { resize(tab) } From ca2b51a8ba5b0a7993805e2ac3a367c512611b2b Mon Sep 17 00:00:00 2001 From: Argo Zhang Date: Tue, 1 Apr 2025 18:56:06 +0800 Subject: [PATCH 7/7] =?UTF-8?q?test:=20=E6=9B=B4=E6=96=B0=E5=8D=95?= =?UTF-8?q?=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/UnitTest/Components/LayoutTest.cs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/UnitTest/Components/LayoutTest.cs b/test/UnitTest/Components/LayoutTest.cs index 0d129c591a8..2238326bf5e 100644 --- a/test/UnitTest/Components/LayoutTest.cs +++ b/test/UnitTest/Components/LayoutTest.cs @@ -92,6 +92,18 @@ public async Task TabStyle_Ok() Assert.True(show); } + [Fact] + public void ShowTabInHeader_Ok() + { + var cut = Context.RenderComponent(pb => + { + pb.Add(a => a.UseTabSet, true); + pb.Add(a => a.ShowTabInHeader, true); + pb.Add(a => a.Header, CreateHeader()); + }); + cut.Contains("tabs tabs-chrome"); + } + [Fact] public void ShowFooter_OK() {