Skip to content

Commit b1dd40f

Browse files
authored
Merge pull request #12 from neozhu/feature/dynamicmenu
Add Dynamic Menu Generation with Status, Description
2 parents cfec1ea + e641b0d commit b1dd40f

File tree

8 files changed

+260
-211
lines changed

8 files changed

+260
-211
lines changed

src/CleanAspire.Api/Endpoints/FileUploadEndpointRegistrar.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public void RegisterRoutes(IEndpointRouteBuilder routes)
141141
}
142142
if (!File.Exists(filePath))
143143
{
144-
return TypedResults.NotFound($"File '{path}' does not exist.");
144+
return TypedResults.NotFound($"File '{filePath}' does not exist.");
145145
}
146146
FileStream fileStream;
147147
try

src/CleanAspire.ClientApp/Layout/NavMenu.razor

Lines changed: 0 additions & 39 deletions
This file was deleted.

src/CleanAspire.ClientApp/Layout/NavMenu.razor.css

Lines changed: 0 additions & 83 deletions
This file was deleted.
Lines changed: 74 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,96 +1,84 @@
1-
<MudPaper Elevation="1" Square="true">
1+
@using CleanAspire.ClientApp.Services.Navigation
2+
<MudPaper Elevation="1" Square="true">
23
<MudToolBar Class="gap-2" Style="height:50px">
34
<MudButton StartIcon="@Icons.Material.Filled.Home" Href="/" Variant="Variant.Text">@L["Home"]</MudButton>
4-
<MudHidden Breakpoint="Breakpoint.SmAndDown" Invert="true">
5-
<MudMenu Color="Color.Inherit" StartIcon="@Icons.Material.Filled.AppRegistration" Variant="Variant.Text" Class="mx-1 px-3" ListClass="d-flex px-4 pb-2" LockScroll="true" Label="@L["Application"]" EndIcon="@Icons.Material.Filled.KeyboardArrowDown" AnchorOrigin="Origin.BottomLeft" TransformOrigin="Origin.BottomRight">
6-
<MudList T="string">
7-
<MudListSubheader Class="pt-4 pb-2">
8-
@L["Products"]
9-
</MudListSubheader>
10-
<MudListItem Href="/products/index">
11-
<div class="d-flex">
12-
<MudText Color="Color.Primary">@L["Product overview"]</MudText>
13-
</div>
14-
<MudText Typo="Typo.body2">@L["View all products"]</MudText>
15-
</MudListItem>
16-
<MudListItem>
17-
<div class="d-flex">
18-
<MudText Color="Color.Primary">@L["Categories"]</MudText>
19-
</div>
20-
<MudText Typo="Typo.body2">@L["Browse product categories"]</MudText>
21-
</MudListItem>
22-
<MudListItem>
23-
<div class="d-flex">
24-
<MudText Color="Color.Primary">@L["Top Sellers"]</MudText>
25-
</div>
26-
<MudText Typo="Typo.body2">@L["Best selling products"]</MudText>
27-
</MudListItem>
28-
</MudList>
29-
30-
</MudMenu>
31-
</MudHidden>
32-
<MudHidden Breakpoint="Breakpoint.SmAndDown">
33-
<MudMenu Color="Color.Inherit" StartIcon="@Icons.Material.Filled.AppRegistration" Variant="Variant.Text" Class="mx-1 px-3" ListClass="d-flex px-4 pb-2" LockScroll="true" Label="@L["Application"]" EndIcon="@Icons.Material.Filled.KeyboardArrowDown" AnchorOrigin="Origin.BottomLeft" TransformOrigin="Origin.BottomRight">
34-
<MudList T="string">
35-
<MudListSubheader Class="pt-4 pb-2">
36-
@L["Products"]
37-
</MudListSubheader>
38-
<MudListItem Href="/products/index">
39-
<div class="d-flex">
40-
<MudText Color="Color.Primary">@L["Product overview"]</MudText>
41-
</div>
42-
<MudText Typo="Typo.body2">@L["View all products"]</MudText>
43-
</MudListItem>
44-
<MudListItem>
45-
<div class="d-flex">
46-
<MudText Color="Color.Primary">@L["Categories"]</MudText>
47-
</div>
48-
<MudText Typo="Typo.body2">@L["Browse product categories"]</MudText>
49-
</MudListItem>
50-
<MudListItem>
51-
<div class="d-flex">
52-
<MudText Color="Color.Primary">@L["Top Sellers"]</MudText>
53-
</div>
54-
<MudText Typo="Typo.body2">@L["Best selling products"]</MudText>
55-
</MudListItem>
56-
</MudList>
57-
<MudList T="string" Class="relative">
58-
<MudListSubheader Class="pt-4 pb-2">
59-
@L["Inventory Management"]
60-
</MudListSubheader>
61-
<MudOverlay Visible="true" LightBackground="true" Absolute="true" Class="docs-menu-overlay" />
62-
<MudListItem>
63-
<MudBadge Class="d-flex mr-20" Origin="Origin.CenterRight" Content="@L["coming soon"]" Color="Color.Info" Overlap="true" BadgeClass="ml-5">
64-
<MudText>@L["Stock Overview"]</MudText>
65-
</MudBadge>
66-
<MudText Typo="Typo.body2">@L["View current stock levels"]</MudText>
67-
</MudListItem>
68-
<MudListItem>
69-
<MudBadge Class="d-flex mr-20" Origin="Origin.CenterRight" Content="@L["coming soon"]" Color="Color.Info" Overlap="true" BadgeClass="ml-5">
70-
<MudText>@L["Incoming Shipments"]</MudText>
71-
</MudBadge>
72-
<MudText Typo="Typo.body2">@L["Track incoming stock"]</MudText>
73-
</MudListItem>
74-
</MudList>
75-
</MudMenu>
76-
<MudMenu AnchorOrigin="Origin.BottomLeft" Label="@L["Reports"]" StartIcon="@Icons.Material.Filled.Dashboard" EndIcon="@Icons.Material.Filled.KeyboardArrowDown">
77-
<MudMenuItem IconSize="Size.Small" IconColor="Color.Secondary" Icon="@Icons.Material.Filled.AreaChart">@L["Overview"]</MudMenuItem>
78-
<MudMenuItem>@L["Statistics"]</MudMenuItem>
79-
<MudMenuItem>@L["Activity Log"]</MudMenuItem>
80-
</MudMenu>
5+
@foreach (var item in Menus)
6+
{
7+
@if (item.SpecialMenu)
8+
{
9+
<MudMenu Color="Color.Inherit"
10+
PopoverClass="layout-menu-shadow"
11+
StartIcon="@item.StartIcon"
12+
Variant="Variant.Text" Class="mx-1 px-3"
13+
ListClass="d-flex px-4 pb-2 appbar-special-menu"
14+
LockScroll="true" Label="@L[item.Label]"
15+
EndIcon="@item.EndIcon"
16+
AnchorOrigin="Origin.BottomCenter"
17+
TransformOrigin="Origin.TopCenter">
8118

82-
<MudMenu AnchorOrigin="Origin.BottomLeft" Label="@L["Help"]" StartIcon="@Icons.Material.Filled.Help" EndIcon="@Icons.Material.Filled.KeyboardArrowDown">
83-
<MudMenuItem>@L["Documentaion"]</MudMenuItem>
84-
<MudMenuItem>@L["Changelog"]</MudMenuItem>
85-
<MudMenuItem Href="https://github.com/neozhu/BlazorPocketApp">@L["Source code"]</MudMenuItem>
86-
<MudMenuItem IconSize="Size.Small" IconColor="Color.Secondary" Icon="@Icons.Material.Filled.FavoriteBorder">@L["Sponsor project!"]</MudMenuItem>
87-
</MudMenu>
88-
</MudHidden>
19+
@foreach (var sub in item.SubItems)
20+
{
21+
<MudList T="string">
22+
<MudListSubheader Class="pt-4 pb-2">
23+
@L[sub.Label]
24+
</MudListSubheader>
25+
@if(sub.SubItems.Any(x=>x.Status== PageStatus.ComingSoon))
26+
{
27+
<MudOverlay Visible="true" LightBackground="true" Absolute="true" Class="layout-menu-shadow" />
28+
}
29+
@foreach(var nav in sub.SubItems)
30+
{
31+
@if (nav.Status== PageStatus.ComingSoon)
32+
{
33+
<MudListItem>
34+
<MudBadge Class="d-flex mr-20" Origin="Origin.CenterRight" Content="@_badgeTextSoon" Color="Color.Info" Overlap="true" BadgeClass="ml-5">
35+
<MudText>@L[nav.Label]</MudText>
36+
</MudBadge>
37+
<MudText Typo="Typo.body2">@L[nav.Description]</MudText>
38+
</MudListItem>
39+
}
40+
else if (nav.Status == PageStatus.New)
41+
{
42+
<MudListItem>
43+
<MudBadge Class="d-flex mr-20" Origin="Origin.CenterRight" Content="@_badgeTextNew" Color="Color.Success" Overlap="true" BadgeClass="ml-5">
44+
<MudText>@L[nav.Label]</MudText>
45+
</MudBadge>
46+
<MudText Typo="Typo.body2">@L[nav.Description]</MudText>
47+
</MudListItem>
48+
}
49+
else
50+
{
51+
<MudListItem Href="@nav.Href">
52+
<div class="d-flex">
53+
<MudText Typo="Typo.body1" Color="Color.Primary">@L[nav.Label]</MudText>
54+
</div>
55+
<MudText Typo="Typo.body2">@L[nav.Description]</MudText>
56+
</MudListItem>
57+
}
58+
59+
}
60+
</MudList>
61+
}
62+
</MudMenu>
63+
}
64+
else
65+
{
66+
<MudMenu AnchorOrigin="Origin.BottomLeft" Label="@L[item.Label]" StartIcon="@item.StartIcon" EndIcon="@item.EndIcon">
67+
@foreach(var sub in item.SubItems)
68+
{
69+
<MudMenuItem>@L[sub.Label]</MudMenuItem>
70+
}
71+
</MudMenu>
72+
}
73+
}
74+
8975
<MudSpacer />
9076
<MudIconButton Icon="@Icons.Material.Outlined.MoreVert" Color="Color.Inherit" />
9177
</MudToolBar>
9278
</MudPaper>
9379

9480
@code {
95-
81+
private string _badgeTextSoon = "coming soon";
82+
private string _badgeTextNew = "new";
83+
public List<MenuItem> Menus => NavbarMenu.Default;
9684
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using System.ComponentModel;
6+
7+
namespace CleanAspire.ClientApp.Services.Navigation;
8+
9+
public class MenuItem
10+
{
11+
public string Label { get; set; }=string.Empty;
12+
public string? Description { get; set; }
13+
public string? Href { get; set; }
14+
public string? StartIcon { get; set; }
15+
public string? EndIcon { get; set; }
16+
public List<MenuItem> SubItems { get; set; } = new List<MenuItem>();
17+
public PageStatus Status { get; set; } = PageStatus.Completed; // Default to Completed
18+
public bool SpecialMenu => SubItems.Any() && SubItems.First().IsParent;
19+
public bool IsParent => SubItems.Any();
20+
}
21+
22+
23+
public enum PageStatus
24+
{
25+
[Description("Coming Soon")] ComingSoon,
26+
[Description("New")] New,
27+
[Description("Completed")] Completed
28+
}

0 commit comments

Comments
 (0)