Skip to content

Commit 418ee17

Browse files
authored
refactor: enhance navigation handling and breadcrumb functionality in layout components (#809)
1 parent 611ba15 commit 418ee17

7 files changed

Lines changed: 53 additions & 54 deletions

File tree

src/Masa.Stack.Components/Infrastructure/MicroFrontendNavigationManager.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright (c) MASA Stack All rights reserved.
1+
// Copyright (c) MASA Stack All rights reserved.
22
// Licensed under the Apache License. See LICENSE.txt in the project root for license information.
33

44
namespace Masa.Stack.Components.Infrastructure;
@@ -9,6 +9,13 @@ public class MicroFrontendNavigationManager : NavigationManager
99

1010
public readonly NavigationManager OriginalNavigationManager;
1111

12+
/// <summary>
13+
/// 与注册时 <c>microFrontend: true</c> 一致:<see cref="ProjectPrefix"/> 为 <c>/{project}/</c>;
14+
/// 独立应用为 <c>false</c>(前缀为 <c>/</c>)。
15+
/// </summary>
16+
public bool IsMicroFrontend =>
17+
!string.IsNullOrEmpty(ProjectPrefix) && !string.Equals(ProjectPrefix, "/", StringComparison.Ordinal);
18+
1219
public new event EventHandler<LocationChangedEventArgs> LocationChanged
1320
{
1421
add => OriginalNavigationManager.LocationChanged += value;
@@ -28,7 +35,7 @@ public MicroFrontendNavigationManager(NavigationManager navigationManager, strin
2835

2936
protected override void NavigateToCore(string uri, NavigationOptions options)
3037
{
31-
if (_microFrontend && !IsAbsoluteUrl(uri) && uri.StartsWith("/") && !uri.StartsWith(ProjectPrefix, StringComparison.OrdinalIgnoreCase))
38+
if (IsMicroFrontend && !IsAbsoluteUrl(uri) && uri.StartsWith("/") && !uri.StartsWith(ProjectPrefix, StringComparison.OrdinalIgnoreCase))
3239
{
3340
uri = $"{ProjectPrefix}{uri.TrimStart("/")}";
3441
}
@@ -43,11 +50,4 @@ private bool IsAbsoluteUrl(string url)
4350
return System.Uri.TryCreate(url, UriKind.Absolute, out result) && (result.Scheme == System.Uri.UriSchemeHttp || result.Scheme == System.Uri.UriSchemeHttps);
4451
}
4552

46-
private bool _microFrontend
47-
{
48-
get
49-
{
50-
return !string.IsNullOrEmpty(ProjectPrefix) && ProjectPrefix != "/";
51-
}
52-
}
5353
}

src/Masa.Stack.Components/Infrastructure/NavigationUrlHelper.cs

Lines changed: 8 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,23 @@ namespace Masa.Stack.Components;
22

33
internal static class NavigationUrlHelper
44
{
5-
public static string BuildHref(string? url, string projectPrefix, Uri currentUri)
5+
/// <summary>
6+
/// 相对路径会按 <paramref name="projectPrefix"/> 补全;以 http:// 或 https:// 开头的菜单 URL 原样返回,由浏览器处理。
7+
/// </summary>
8+
public static string BuildHref(string? url, string projectPrefix)
69
{
710
if (string.IsNullOrEmpty(url))
811
{
912
return projectPrefix;
1013
}
11-
12-
if (TryBuildHrefFromAbsoluteUrl(url, projectPrefix, currentUri, out var absoluteHref))
13-
{
14-
return absoluteHref;
15-
}
16-
17-
return BuildHrefFromRelativeUrl(url, projectPrefix);
18-
}
19-
20-
private static bool TryBuildHrefFromAbsoluteUrl(string url, string projectPrefix, Uri currentUri, out string href)
21-
{
22-
href = string.Empty;
23-
24-
if (!url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) &&
25-
!url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
26-
{
27-
return false;
28-
}
2914

30-
if (!Uri.TryCreate(url, UriKind.Absolute, out var absoluteUri))
15+
if (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ||
16+
url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
3117
{
32-
return false;
33-
}
34-
35-
if (!IsSameOrigin(absoluteUri, currentUri))
36-
{
37-
href = url;
38-
return true;
18+
return url;
3919
}
4020

41-
href = EnsureProjectPrefix(absoluteUri.PathAndQuery + absoluteUri.Fragment, projectPrefix);
42-
return true;
43-
}
44-
45-
private static bool IsSameOrigin(Uri targetUri, Uri currentUri)
46-
{
47-
return string.Equals(targetUri.Host, currentUri.Host, StringComparison.OrdinalIgnoreCase) &&
48-
targetUri.Port == currentUri.Port &&
49-
string.Equals(targetUri.Scheme, currentUri.Scheme, StringComparison.OrdinalIgnoreCase);
21+
return BuildHrefFromRelativeUrl(url, projectPrefix);
5022
}
5123

5224
private static string BuildHrefFromRelativeUrl(string url, string projectPrefix)

src/Masa.Stack.Components/MasaComponentBase.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,6 @@ protected string GetIsDisplayStyle(bool show)
6464
return show ? "" : "display:none !important;";
6565
}
6666

67-
protected string BuildHref(string? url)
68-
{
69-
var currentUri = NavigationManager.OriginalNavigationManager.ToAbsoluteUri(NavigationManager.Uri);
70-
return NavigationUrlHelper.BuildHref(url, NavigationManager.ProjectPrefix, currentUri);
71-
}
67+
protected string BuildHref(string? url) =>
68+
NavigationUrlHelper.BuildHref(url, NavigationManager.ProjectPrefix);
7269
}

src/Masa.Stack.Components/Shared/Layouts/Components/Breadcrumbs.razor.cs

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using System.Web;
1+
using System.Web;
22

33
namespace Masa.Stack.Components.Layouts
44
{
@@ -8,7 +8,16 @@ public partial class Breadcrumbs : MasaComponentBase
88

99
[Parameter, EditorRequired] public List<Nav> FlattenedNavs { get; set; } = new();
1010

11+
/// <summary>
12+
/// 微前端(<c>microFrontend: true</c>)时在面包屑路径最前增加当前模块项目展示名。
13+
/// </summary>
14+
[Parameter] public bool PrependModuleProjectBreadcrumb { get; set; }
15+
16+
[Parameter] public string? ModuleProjectDisplayName { get; set; }
17+
1118
private List<Nav>? _previousFlattenedNavs;
19+
private bool _previousPrependModuleProjectBreadcrumb;
20+
private string? _previousModuleProjectDisplayName;
1221
private string? _prevLocation;
1322
private Action? _updateLastBreadcrumb;
1423

@@ -24,9 +33,13 @@ protected override void OnParametersSet()
2433
{
2534
base.OnParametersSet();
2635

27-
if (_previousFlattenedNavs != FlattenedNavs)
36+
if (_previousFlattenedNavs != FlattenedNavs
37+
|| _previousPrependModuleProjectBreadcrumb != PrependModuleProjectBreadcrumb
38+
|| _previousModuleProjectDisplayName != ModuleProjectDisplayName)
2839
{
2940
_previousFlattenedNavs = FlattenedNavs;
41+
_previousPrependModuleProjectBreadcrumb = PrependModuleProjectBreadcrumb;
42+
_previousModuleProjectDisplayName = ModuleProjectDisplayName;
3043
UpdateItems();
3144
}
3245
}
@@ -146,6 +159,16 @@ string GetIntersection(string left, string right)
146159
});
147160
}
148161

162+
if (PrependModuleProjectBreadcrumb && !string.IsNullOrWhiteSpace(ModuleProjectDisplayName))
163+
{
164+
Items.Insert(0, new BreadcrumbItem()
165+
{
166+
Exact = true,
167+
Text = ModuleProjectDisplayName,
168+
Href = null
169+
});
170+
}
171+
149172
if (_updateLastBreadcrumb != null)
150173
{
151174
_updateLastBreadcrumb();

src/Masa.Stack.Components/Shared/Layouts/SLayout.razor

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,10 @@
4646
</ActivatorContent>
4747
</GlobalNavigation>
4848
}
49-
<Breadcrumbs FlattenedNavs="FlattenedAllNavs" @ref="BreadcrumbsComp"></Breadcrumbs>
49+
<Breadcrumbs FlattenedNavs="FlattenedAllNavs"
50+
PrependModuleProjectBreadcrumb="NavigationManager.IsMicroFrontend"
51+
ModuleProjectDisplayName="@BreadcrumbModuleName"
52+
@ref="BreadcrumbsComp"></Breadcrumbs>
5053
<MSpacer />
5154
<Languages OnChange="() => { }" />
5255
<MSheet Class="d-flex align-center justify-space-around rounded-6 pa-1 mr-n4" Width="100">

src/Masa.Stack.Components/Shared/Layouts/SLayout.razor.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,10 @@ public partial class SLayout
8080
[Parameter]
8181
public bool UseSappNav { get; set; }
8282

83+
/// <summary>微前端时面包屑最前的模块名(Stack 项目枚举名)。</summary>
84+
private string? BreadcrumbModuleName =>
85+
NavigationManager.IsMicroFrontend ? ProjectApp.Project.ToString() : null;
86+
8387
private Breadcrumbs? _breadcrumbsComp;
8488
private Action? _breadcrumbSetCallback;
8589

src/Masa.Stack.Components/wwwroot/css/app.css

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ h1:focus {
114114

115115
.masa-stack-components .global-nav .global-nav-app-box .app-entry-web-full-icon {
116116
max-width: 100%;
117-
max-height: 100%;
117+
max-height: 50px;
118118
width: auto;
119119
height: auto;
120120
object-fit: contain;

0 commit comments

Comments
 (0)