diff --git a/src/BootstrapBlazor/BootstrapBlazor.csproj b/src/BootstrapBlazor/BootstrapBlazor.csproj index 85c7bdfde20..5506305d4e0 100644 --- a/src/BootstrapBlazor/BootstrapBlazor.csproj +++ b/src/BootstrapBlazor/BootstrapBlazor.csproj @@ -1,7 +1,7 @@ - 8.10.3 + 8.10.4-beta01 diff --git a/src/BootstrapBlazor/Components/Layout/Layout.razor.cs b/src/BootstrapBlazor/Components/Layout/Layout.razor.cs index c38bbb4bbdf..4388d81e7f5 100644 --- a/src/BootstrapBlazor/Components/Layout/Layout.razor.cs +++ b/src/BootstrapBlazor/Components/Layout/Layout.razor.cs @@ -104,8 +104,9 @@ public partial class Layout : IHandlerException public bool IsFullSide { get; set; } /// - /// 获得/设置 是否为正页面布局 默认为 false + /// 获得/设置 是否为整页面布局 默认为 false /// + /// 为真时增加 is-page 样式 [Parameter] public bool IsPage { get; set; } diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor b/src/BootstrapBlazor/Components/Tab/Tab.razor index 267bd4524a0..0ae2f08fbd3 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor @@ -20,7 +20,14 @@ else @if (!Items.Any() && !string.IsNullOrEmpty(DefaultUrl)) { - AddTabItem(DefaultUrl); + if (ClickTabToNavigation) + { + Navigator.NavigateTo(DefaultUrl); + } + else + { + AddTabItem(DefaultUrl); + } } @if (FirstRender) { diff --git a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs index 8c4a07b64e0..5c4d179c703 100644 --- a/src/BootstrapBlazor/Components/Tab/Tab.razor.cs +++ b/src/BootstrapBlazor/Components/Tab/Tab.razor.cs @@ -1,4 +1,4 @@ -// Copyright (c) Argo Zhang (argo@163.com). All rights reserved. +// Copyright (c) Argo Zhang (argo@live.ca). All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ @@ -600,15 +600,10 @@ private void AddTabItem(string url) SetTabItemParameters(Options.Text, Options.Icon, Options.Closable, Options.IsActive); Options.Reset(); } - else if (Layout != null) - { - // CascadeParameter Menus - var menu = GetMenuItem(url); - SetTabItemParameters(menu?.Text, menu?.Icon, true, true); - } else { - parameters.Add(nameof(TabItem.Text), url.Split("/").FirstOrDefault()); + var menu = GetMenuItem(url) ?? new MenuItem() { Text = url.Split("/").FirstOrDefault() }; + SetTabItemParameters(menu.Text, menu.Icon, true, true); } parameters.Add(nameof(TabItem.Url), url); @@ -679,6 +674,8 @@ private void AddTabItem(Dictionary parameters, int? index = nul /// public async Task RemoveTab(TabItem item) { + Options.Reset(); + if (OnCloseTabItemAsync != null && !await OnCloseTabItemAsync(item)) { return; diff --git a/test/UnitTest/Components/TabTest.cs b/test/UnitTest/Components/TabTest.cs index d444cf44c92..c8633182e3a 100644 --- a/test/UnitTest/Components/TabTest.cs +++ b/test/UnitTest/Components/TabTest.cs @@ -261,7 +261,7 @@ await cut.InvokeAsync(() => tab.AddTab(new Dictionary } [Fact] - public void AddTabByUrl_Ok() + public async Task AddTabByUrl_Ok() { var navMan = Context.Services.GetRequiredService(); navMan.NavigateTo("/"); @@ -290,7 +290,7 @@ public void AddTabByUrl_Ok() }); navMan.NavigateTo("/"); - cut.InvokeAsync(() => cut.Instance.AddTab(new Dictionary + await cut.InvokeAsync(() => cut.Instance.AddTab(new Dictionary { ["Text"] = "Cat", ["Url"] = "Cat" @@ -299,10 +299,10 @@ public void AddTabByUrl_Ok() { pb.Add(a => a.ExcludeUrls, ["/Test"]); }); - cut.InvokeAsync(() => cut.Instance.CloseCurrentTab()); + await cut.InvokeAsync(() => cut.Instance.CloseCurrentTab()); // AddTab - cut.InvokeAsync(() => cut.Instance.AddTab(new Dictionary + await cut.InvokeAsync(() => cut.Instance.AddTab(new Dictionary { ["Text"] = "Cat", ["Url"] = null, @@ -314,14 +314,16 @@ public void AddTabByUrl_Ok() Assert.NotNull(item); Assert.Equal("", item.Url); - cut.InvokeAsync(() => cut.Instance.RemoveTab(item!)); + await cut.InvokeAsync(() => cut.Instance.RemoveTab(item!)); item = cut.Instance.GetActiveTab(); Assert.NotNull(item); Assert.Equal("Cat", item.Url); - cut.InvokeAsync(() => cut.Instance.RemoveTab(item!)); + await cut.InvokeAsync(() => cut.Instance.RemoveTab(item!)); item = cut.Instance.GetActiveTab(); Assert.Null(item); + + await cut.InvokeAsync(() => cut.Instance.CloseCurrentTab()); } [Fact] @@ -534,26 +536,24 @@ public void AlwaysLoad_Ok() } [Fact] - public void ActiveTab_Ok() + public async Task ActiveTab_Ok() { var cut = Context.RenderComponent(pb => { pb.Add(a => a.AdditionalAssemblies, new Assembly[] { GetType().Assembly }); pb.Add(a => a.DefaultUrl, "/"); }); - cut.InvokeAsync(() => cut.Instance.ActiveTab(0)); + await cut.InvokeAsync(() => cut.Instance.ActiveTab(0)); + var item = cut.Instance.GetActiveTab(); Assert.NotNull(item); - cut.InvokeAsync(() => - { - if (item != null) - { - cut.Instance.ActiveTab(item); - } - }); - cut.InvokeAsync(() => cut.Instance.RemoveTab(item!)); + + await cut.InvokeAsync(() => cut.Instance.ActiveTab(item)); + + // 移除标签导航到默认标签 + await cut.InvokeAsync(() => cut.Instance.RemoveTab(item!)); item = cut.Instance.GetActiveTab(); - Assert.Null(item); + Assert.NotNull(item); } [Fact] diff --git a/test/UnitTestDocs/MenuTest.cs b/test/UnitTestDocs/MenuTest.cs index 65c591840cd..1238dbffef4 100644 --- a/test/UnitTestDocs/MenuTest.cs +++ b/test/UnitTestDocs/MenuTest.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Website: https://www.blazor.zone or https://argozhang.github.io/ -using BootstrapBlazor.Localization.Json; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; @@ -13,9 +12,9 @@ namespace UnitTestDocs; public partial class MenuTest { - private ITestOutputHelper _logger; - private IServiceProvider _serviceProvider; - private IEnumerable _routerTable; + private readonly ITestOutputHelper _logger; + private readonly IServiceProvider _serviceProvider; + private readonly IEnumerable _routerTable; public MenuTest(ITestOutputHelper logger) { @@ -149,7 +148,7 @@ static string ReplacePayload(string payload, LocalizedString l) => payload static string RemoveBlockStatement(string payload, string removeString) { - var index = payload.IndexOf(removeString); + var index = payload.IndexOf(removeString, StringComparison.Ordinal); if (index > -1) { var end = payload.IndexOf("\n", index, StringComparison.OrdinalIgnoreCase);