From 872d667e66ca9bfc986e2836703505840b602304 Mon Sep 17 00:00:00 2001 From: Robert Haken Date: Wed, 24 Apr 2024 21:33:08 +0200 Subject: [PATCH] fixed #796 [HxTabPanel] When InitialActiveTabId not set, first tab should be default (also #690) --- .../Tabs/HxTabPanel.razor | 56 +++++++++---------- .../Tabs/HxTabPanel.razor.cs | 23 ++++++-- .../Havit.Blazor.Components.Web.Bootstrap.xml | 3 + 3 files changed, 48 insertions(+), 34 deletions(-) diff --git a/Havit.Blazor.Components.Web.Bootstrap/Tabs/HxTabPanel.razor b/Havit.Blazor.Components.Web.Bootstrap/Tabs/HxTabPanel.razor index eb13a13e3..87b962a25 100644 --- a/Havit.Blazor.Components.Web.Bootstrap/Tabs/HxTabPanel.razor +++ b/Havit.Blazor.Components.Web.Bootstrap/Tabs/HxTabPanel.razor @@ -7,38 +7,38 @@ @{ var tabsListOrdered = _tabsList.OrderBy(tab => tab.Order).ToList(); RenderFragment tabsNavigation = - @ - @foreach (HxTab tab in tabsListOrdered) - { - @if (tab.Visible) - { - - @tab.Title - @tab.TitleTemplate - - } - } - ; + @ + @foreach (HxTab tab in tabsListOrdered) + { + @if (tab.Visible) + { + + @tab.Title + @tab.TitleTemplate + + } + } + ; RenderFragment tabsContent = - @
- @foreach (HxTab tab in tabsListOrdered) - { - @if (tab.Visible) - { - if ((RenderMode == TabPanelRenderMode.AllTabs) - || ((RenderMode == TabPanelRenderMode.ActiveTabOnly) && IsActive(tab))) + @
+ @foreach (HxTab tab in tabsListOrdered) { -
- @tab.Content -
- } - } + @if (tab.Visible) + { + if ((RenderMode == TabPanelRenderMode.AllTabs) + || ((RenderMode == TabPanelRenderMode.ActiveTabOnly) && IsActive(tab))) + { +
+ @tab.Content +
+ } } -
; + } +
; } @if (Variant == TabPanelVariant.Standard) diff --git a/Havit.Blazor.Components.Web.Bootstrap/Tabs/HxTabPanel.razor.cs b/Havit.Blazor.Components.Web.Bootstrap/Tabs/HxTabPanel.razor.cs index 9ba9ec808..44e6318a6 100644 --- a/Havit.Blazor.Components.Web.Bootstrap/Tabs/HxTabPanel.razor.cs +++ b/Havit.Blazor.Components.Web.Bootstrap/Tabs/HxTabPanel.razor.cs @@ -52,7 +52,8 @@ public partial class HxTabPanel : ComponentBase, IAsyncDisposable protected virtual Task InvokeActiveTabIdChangedAsync(string newActiveTabId) => ActiveTabIdChanged.InvokeAsync(newActiveTabId); /// - /// ID of the tab which should be active at the very beginning. + /// ID of the tab which should be active at the very beginning.
+ /// We are considering deprecating this parameter. Please use instead (@bind-ActiveTabId). ///
[Parameter] public string InitialActiveTabId { get; set; } @@ -81,8 +82,6 @@ public HxTabPanel() protected override async Task OnInitializedAsync() { - await base.OnInitializedAsync(); - if (!String.IsNullOrWhiteSpace(InitialActiveTabId)) { await SetActiveTabIdAsync(InitialActiveTabId); @@ -91,7 +90,6 @@ protected override async Task OnInitializedAsync() protected override async Task OnParametersSetAsync() { - await base.OnParametersSetAsync(); await NotifyActivationAndDeactivationAsync(); } @@ -134,12 +132,13 @@ protected override async Task OnAfterRenderAsync(bool firstRender) if (firstRender) { // when no tab is active after the initial render, activate the first visible & enabled tab - if (!_tabsList.Any(tab => IsActive(tab)) && (_tabsList.Count > 0)) + if (String.IsNullOrWhiteSpace(ActiveTabId)) { - HxTab tabToActivate = _tabsList.FirstOrDefault(tab => CascadeEnabledComponent.EnabledEffective(tab) && tab.Visible); + var tabToActivate = GetDefaultActiveTab(); if (tabToActivate != null) { await SetActiveTabIdAsync(tabToActivate.Id); + StateHasChanged(); } } } @@ -155,9 +154,21 @@ protected async Task HandleTabClick(HxTab tab) private bool IsActive(HxTab tab) { + if (String.IsNullOrWhiteSpace(ActiveTabId)) + { + // no active tab set, activate the first visible & enabled tab + return tab.Id == GetDefaultActiveTab()?.Id; + } return ActiveTabId == tab.Id; } + private HxTab GetDefaultActiveTab() + { + return _tabsList + .OrderBy(tab => tab.Order) + .FirstOrDefault(t => t.Visible && (((ICascadeEnabledComponent)t).Enabled ?? true)); + } + protected string GetNavCssClassInCardMode() { if (Variant != TabPanelVariant.Card) diff --git a/Havit.Blazor.Documentation/XmlDoc/Havit.Blazor.Components.Web.Bootstrap.xml b/Havit.Blazor.Documentation/XmlDoc/Havit.Blazor.Components.Web.Bootstrap.xml index 1a8871db1..b88a6fbd9 100644 --- a/Havit.Blazor.Documentation/XmlDoc/Havit.Blazor.Components.Web.Bootstrap.xml +++ b/Havit.Blazor.Documentation/XmlDoc/Havit.Blazor.Components.Web.Bootstrap.xml @@ -9458,6 +9458,9 @@ ID of the tab which should be active at the very beginning. + + Obsolete? Use @bind- instead. +