Skip to content

Commit 265ca6c

Browse files
committed
Shared structure between topbar admin-menu and portal navbar. on:hover effects for topbar dropdowns and changes to copy full username
1 parent d1b2a1e commit 265ca6c

40 files changed

Lines changed: 631 additions & 143 deletions

File tree

OpenModulePlatform.Portal/Pages/Shared/_Layout.cshtml

Lines changed: 19 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
@using OpenModulePlatform.Web.Shared.Navigation
12
@* File: OpenModulePlatform.Portal/Pages/Shared/_Layout.cshtml *@
23
<!doctype html>
34
<html lang="@System.Globalization.CultureInfo.CurrentUICulture.Name">
@@ -25,40 +26,24 @@
2526
<a href="~/">@L["Home"]</a>
2627
@if (ViewData["IsPortalAdmin"] is bool isPortalAdmin && isPortalAdmin)
2728
{
28-
<details class="nav-dropdown">
29-
<summary>@L["Modules"]</summary>
30-
<div class="nav-dropdown__menu">
31-
<a href="~/admin/moduleinstances">@L["Instances"]</a>
32-
<a href="~/admin/modules">@L["Definitions"]</a>
33-
</div>
34-
</details>
35-
<details class="nav-dropdown">
36-
<summary>@L["Apps"]</summary>
37-
<div class="nav-dropdown__menu">
38-
<a href="~/admin/apps">@L["Definitions"]</a>
39-
<a href="~/admin/appinstances">@L["Instances"]</a>
40-
<div class="nav-dropdown__separator" role="separator" aria-hidden="true"></div>
41-
<a href="~/admin/artifacts">@L["Artifacts"]</a>
42-
<a href="~/admin/workers">@L["Workers"]</a>
43-
</div>
44-
</details>
45-
<details class="nav-dropdown">
46-
<summary>@L["Hosts"]</summary>
47-
<div class="nav-dropdown__menu">
48-
<a href="~/admin/hosttemplates">@L["Definitions"]</a>
49-
<a href="~/admin/hosts">@L["Instances"]</a>
50-
</div>
51-
</details>
52-
<details class="nav-dropdown">
53-
<summary>@L["System"]</summary>
54-
<div class="nav-dropdown__menu">
55-
<a href="~/admin/instancetemplates">@L["Definitions"]</a>
56-
<a href="~/admin/instances">@L["Instances"]</a>
57-
<div class="nav-dropdown__separator" role="separator" aria-hidden="true"></div>
58-
<a href="~/admin/security">@L["Security"]</a>
59-
<a href="~/admin/automation">@L["Automation"]</a>
60-
</div>
61-
</details>
29+
var adminSections = PortalAdminNavigation.CreateSections(relativePath => Url.Content($"~{relativePath}"));
30+
31+
foreach (var section in adminSections)
32+
{
33+
<details class="nav-dropdown">
34+
<summary>@L[section.TextKey]</summary>
35+
<div class="nav-dropdown__menu">
36+
@foreach (var item in section.Items)
37+
{
38+
if (item.SeparatorBefore)
39+
{
40+
<div class="nav-dropdown__separator" role="separator" aria-hidden="true"></div>
41+
}
42+
<a href="@item.Href">@L[item.TextKey]</a>
43+
}
44+
</div>
45+
</details>
46+
}
6247
}
6348
</nav>
6449
</div>

OpenModulePlatform.Web.ExampleWebAppBlazorModule/Components/Layout/PortalTopBar.razor

Lines changed: 60 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,31 @@
1919
<nav class="portal-topbar__nav" aria-label="@L["Portal"]" data-portal-topbar>
2020
<a class="portal-topbar__portal-link" href="@_portalTopBar.PortalLink.Href">@L[_portalTopBar.PortalLink.TextKey]</a>
2121

22-
@if (_portalTopBar.IsPortalAdmin && _portalTopBar.PortalAdminLinks.Count > 0)
22+
@if (_portalTopBar.IsPortalAdmin && _portalTopBar.PortalAdminSections.Count > 0)
2323
{
24-
<details class="portal-topbar__admin" data-portal-topbar-overlay>
24+
<details class="portal-topbar__admin" data-portal-topbar-overlay data-portal-topbar-hover-menu>
2525
<summary title="@L[_portalTopBar.PortalAdminToggleTextKey]" aria-label="@L[_portalTopBar.PortalAdminToggleTextKey]">
2626
<span aria-hidden="true">&#9881;</span>
2727
<span class="visually-hidden">@L[_portalTopBar.PortalAdminToggleTextKey]</span>
2828
</summary>
29-
<div class="portal-topbar__admin-menu">
30-
@foreach (var link in _portalTopBar.PortalAdminLinks)
29+
<div class="portal-topbar__admin-menu" data-portal-topbar-admin-menu>
30+
@foreach (var section in _portalTopBar.PortalAdminSections)
3131
{
32-
<a class="portal-topbar__admin-link" href="@link.Href">@L[link.TextKey]</a>
32+
<details class="portal-topbar__admin-submenu" data-portal-topbar-admin-submenu data-portal-topbar-overlay>
33+
<summary class="portal-topbar__admin-submenu-trigger">
34+
<span>@L[section.TextKey]</span>
35+
</summary>
36+
<div class="portal-topbar__admin-submenu-menu">
37+
@foreach (var item in section.Items)
38+
{
39+
if (item.SeparatorBefore)
40+
{
41+
<div class="portal-topbar__admin-separator" role="separator" aria-hidden="true"></div>
42+
}
43+
<a class="portal-topbar__admin-link" href="@item.Href">@L[item.TextKey]</a>
44+
}
45+
</div>
46+
</details>
3347
}
3448
</div>
3549
</details>
@@ -69,7 +83,7 @@
6983
<div class="portal-topbar__actions">
7084
@if (_portalTopBar.LanguageOptions.Count > 1)
7185
{
72-
<details class="portal-topbar__language" data-portal-topbar-overlay>
86+
<details class="portal-topbar__language" data-portal-topbar-overlay data-portal-topbar-hover-menu>
7387
<summary title="@L[_portalTopBar.LanguageToggleTextKey]" aria-label="@L[_portalTopBar.LanguageToggleTextKey]">
7488
<span class="portal-topbar__summary-icon">
7589
<span class="portal-topbar__icon" aria-hidden="true">
@@ -109,7 +123,7 @@
109123

110124
@if (!string.IsNullOrWhiteSpace(_portalTopBar.CurrentUserName))
111125
{
112-
<details class="portal-topbar__profile" data-portal-topbar-overlay>
126+
<details class="portal-topbar__profile" data-portal-topbar-overlay data-portal-topbar-hover-menu>
113127
<summary title="@L["User"]" aria-label="@L["User"]">
114128
<span class="portal-topbar__icon" aria-hidden="true">
115129
<svg viewBox="0 0 24 24" focusable="false" aria-hidden="true">
@@ -123,7 +137,32 @@
123137
<div class="portal-topbar__profile-identity">
124138
<span class="portal-topbar__profile-roles-heading">@L["User"]</span>
125139
<div class="portal-topbar__profile-user-row">
126-
<div class="portal-topbar__profile-current-user" title="@_portalTopBar.CurrentUserName">@_portalTopBar.CurrentUserName</div>
140+
<button type="button"
141+
class="portal-topbar__profile-copy-name"
142+
title="@L["Copy full user name"]"
143+
aria-label="@L["Copy full user name"]"
144+
data-copy-to-clipboard="true"
145+
data-copy-text="@_portalTopBar.CurrentUserName">
146+
<span class="portal-topbar__profile-current-user" title="@_portalTopBar.CurrentUserName">@DisplayUserName(_portalTopBar.CurrentUserName)</span>
147+
<span class="portal-topbar__profile-copy-inline-icon" aria-hidden="true">
148+
<svg viewBox="0 0 24 24" focusable="false" aria-hidden="true">
149+
<rect x="9" y="9" width="10" height="10" rx="2"></rect>
150+
<path d="M7 15H6a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2h7a2 2 0 0 1 2 2v1"></path>
151+
</svg>
152+
</span>
153+
</button>
154+
<button type="button"
155+
class="portal-topbar__profile-action-button"
156+
title="@L["Log out"]"
157+
aria-label="@L["Log out"]">
158+
<span class="portal-topbar__icon" aria-hidden="true">
159+
<svg viewBox="0 0 24 24" focusable="false" aria-hidden="true">
160+
<path d="M14 8l4 4-4 4"></path>
161+
<path d="M18 12H9"></path>
162+
<path d="M11 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5"></path>
163+
</svg>
164+
</span>
165+
</button>
127166
</div>
128167
</div>
129168
<div class="portal-topbar__profile-section">
@@ -245,4 +284,17 @@
245284

246285
private string CultureText(string? text)
247286
=> string.IsNullOrWhiteSpace(text) ? string.Empty : L[text];
287+
288+
private static string DisplayUserName(string? value)
289+
{
290+
if (string.IsNullOrWhiteSpace(value))
291+
{
292+
return string.Empty;
293+
}
294+
295+
var separatorIndex = value.LastIndexOf('\\');
296+
return separatorIndex >= 0 && separatorIndex < value.Length - 1
297+
? value[(separatorIndex + 1)..]
298+
: value;
299+
}
248300
}

OpenModulePlatform.Web.ExampleWebAppBlazorModule/i/Release/net10.0/OpenModulePlatform.Web.ExampleWebAppBlazorModule.AssemblyInfo.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenModulePlatform")]
1414
[assembly: System.Reflection.AssemblyConfigurationAttribute("Release")]
1515
[assembly: System.Reflection.AssemblyFileVersionAttribute("0.1.0.0")]
16-
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("0.1.0+8b1f5008f9c27b5784c60310a285602c9ef60004")]
16+
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("0.1.0+d1b2a1e6d91bc4165f0b4b06b58888163bddd158")]
1717
[assembly: System.Reflection.AssemblyProductAttribute("OpenModulePlatform")]
1818
[assembly: System.Reflection.AssemblyTitleAttribute("OpenModulePlatform.Web.ExampleWebAppBlazorModule")]
1919
[assembly: System.Reflection.AssemblyVersionAttribute("0.1.0.0")]
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"documents":{"C:\\Users\\Alfons\\Documents\\GitHub\\OpenModulePlatform\\*":"https://raw.githubusercontent.com/Optimal2/OpenModulePlatform/8b1f5008f9c27b5784c60310a285602c9ef60004/*"}}
1+
{"documents":{"C:\\Users\\Alfons\\Documents\\GitHub\\OpenModulePlatform\\*":"https://raw.githubusercontent.com/Optimal2/OpenModulePlatform/d1b2a1e6d91bc4165f0b4b06b58888163bddd158/*"}}
Binary file not shown.

OpenModulePlatform.Web.ExampleWebAppBlazorModule/i/Release/net10.0/en-US/OpenModulePlatform.Web.ExampleWebAppBlazorModule.resources.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenModulePlatform")]
1414
[assembly: System.Reflection.AssemblyCopyrightAttribute(" ")]
1515
[assembly: System.Reflection.AssemblyFileVersionAttribute("0.1.0.0")]
16-
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("0.1.0+8b1f5008f9c27b5784c60310a285602c9ef60004")]
16+
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("0.1.0+d1b2a1e6d91bc4165f0b4b06b58888163bddd158")]
1717
[assembly: System.Reflection.AssemblyProductAttribute("OpenModulePlatform")]
1818
[assembly: System.Reflection.AssemblyTitleAttribute("OpenModulePlatform.Web.ExampleWebAppBlazorModule")]
1919
[assembly: System.Reflection.AssemblyVersionAttribute("0.1.0.0")]

OpenModulePlatform.Web.ExampleWebAppBlazorModule/i/Release/net10.0/en/OpenModulePlatform.Web.ExampleWebAppBlazorModule.resources.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenModulePlatform")]
1414
[assembly: System.Reflection.AssemblyCopyrightAttribute(" ")]
1515
[assembly: System.Reflection.AssemblyFileVersionAttribute("0.1.0.0")]
16-
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("0.1.0+8b1f5008f9c27b5784c60310a285602c9ef60004")]
16+
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("0.1.0+d1b2a1e6d91bc4165f0b4b06b58888163bddd158")]
1717
[assembly: System.Reflection.AssemblyProductAttribute("OpenModulePlatform")]
1818
[assembly: System.Reflection.AssemblyTitleAttribute("OpenModulePlatform.Web.ExampleWebAppBlazorModule")]
1919
[assembly: System.Reflection.AssemblyVersionAttribute("0.1.0.0")]

0 commit comments

Comments
 (0)