diff --git a/Oqtane.Client/Themes/Controls/Login.razor b/Oqtane.Client/Themes/Controls/Login.razor
index e23467e9..55d975aa 100644
--- a/Oqtane.Client/Themes/Controls/Login.razor
+++ b/Oqtane.Client/Themes/Controls/Login.razor
@@ -1,9 +1,5 @@
@namespace Oqtane.Themes.Controls
-@inherits ThemeControlBase
-@inject NavigationManager NavigationManager
-@inject IUserService UserService
-@inject IJSRuntime jsRuntime
-@inject IServiceProvider ServiceProvider
+@inherits LoginBase
@@ -16,38 +12,3 @@
-
-
-@code {
- private void LoginUser()
- {
- var returnurl = PageState.Alias.Path;
- if (PageState.Page.Path != "/")
- {
- returnurl += "/" + PageState.Page.Path;
- }
-
- NavigationManager.NavigateTo(NavigateUrl("login", "returnurl=" + returnurl));
- }
-
- private async Task LogoutUser()
- {
- await UserService.LogoutUserAsync(PageState.User);
-
- if (PageState.Runtime == Runtime.Server)
- {
- // server-side Blazor
- var interop = new Interop(jsRuntime);
- string antiforgerytoken = await interop.GetElementByName("__RequestVerificationToken");
- var fields = new { __RequestVerificationToken = antiforgerytoken, returnurl = (PageState.Alias.Path + "/" + PageState.Page.Path) };
- await interop.SubmitForm("/pages/logout/", fields);
- }
- else
- {
- // client-side Blazor
- var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider));
- authstateprovider.NotifyAuthenticationChanged();
- NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, "reload"));
- }
- }
-}
diff --git a/Oqtane.Client/Themes/Controls/LoginBase.cs b/Oqtane.Client/Themes/Controls/LoginBase.cs
new file mode 100644
index 00000000..a4282c08
--- /dev/null
+++ b/Oqtane.Client/Themes/Controls/LoginBase.cs
@@ -0,0 +1,49 @@
+using System;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Components;
+using Microsoft.JSInterop;
+using Oqtane.Providers;
+using Oqtane.Services;
+using Oqtane.UI;
+
+namespace Oqtane.Themes.Controls
+{
+ public class LoginBase : ThemeControlBase
+ {
+ [Inject] public NavigationManager NavigationManager {get;set;}
+ [Inject]public IUserService UserService {get;set;}
+ [Inject]public IJSRuntime jsRuntime {get;set;}
+ [Inject]public IServiceProvider ServiceProvider {get;set;}
+
+ protected void LoginUser()
+ {
+ var returnurl = PageState.Alias.Path;
+ if (PageState.Page.Path != "/")
+ {
+ returnurl += "/" + PageState.Page.Path;
+ }
+ NavigationManager.NavigateTo(NavigateUrl("login", "returnurl=" + returnurl));
+ }
+
+ protected async Task LogoutUser()
+ {
+ await UserService.LogoutUserAsync(PageState.User);
+
+ if (PageState.Runtime == Runtime.Server)
+ {
+ // server-side Blazor
+ var interop = new Interop(jsRuntime);
+ string antiforgerytoken = await interop.GetElementByName("__RequestVerificationToken");
+ var fields = new { __RequestVerificationToken = antiforgerytoken, returnurl = (PageState.Alias.Path + "/" + PageState.Page.Path) };
+ await interop.SubmitForm("/pages/logout/", fields);
+ }
+ else
+ {
+ // client-side Blazor
+ var authstateprovider = (IdentityAuthenticationStateProvider)ServiceProvider.GetService(typeof(IdentityAuthenticationStateProvider));
+ authstateprovider.NotifyAuthenticationChanged();
+ NavigationManager.NavigateTo(NavigateUrl(PageState.Page.Path, "reload"));
+ }
+ }
+ }
+}
diff --git a/Oqtane.Client/Themes/Controls/Menu.razor b/Oqtane.Client/Themes/Controls/Menu.razor
index 442729d6..0f2610cc 100644
--- a/Oqtane.Client/Themes/Controls/Menu.razor
+++ b/Oqtane.Client/Themes/Controls/Menu.razor
@@ -1,133 +1,20 @@
@namespace Oqtane.Themes.Controls
-@inherits ThemeControlBase
-@if (menu != string.Empty)
+@switch (Orientation)
{
-
+ case "Horizontal":
+
+ break;
+ default: // Vertical
+ {
+
+ break;
+ }
}
-@code {
- private string menu = string.Empty;
-
+@code{
+
[Parameter]
public string Orientation { get; set; }
- protected override void OnParametersSet()
- {
- switch (Orientation)
- {
- case "Horizontal":
- CreateHorizontalMenu();
- break;
- default: // Vertical
- CreateVerticalMenu();
- break;
- }
- }
-
- private void CreateVerticalMenu()
- {
- var level = -1;
- var securitylevel = int.MaxValue;
-
- menu = "";
- }
-
- private void CreateHorizontalMenu()
- {
- var url = String.Empty;
- var target = String.Empty;
-
- menu = "";
- menu += "";
- }
}
diff --git a/Oqtane.Client/Themes/Controls/MenuBase.cs b/Oqtane.Client/Themes/Controls/MenuBase.cs
new file mode 100644
index 00000000..03eecdef
--- /dev/null
+++ b/Oqtane.Client/Themes/Controls/MenuBase.cs
@@ -0,0 +1,45 @@
+using System.Collections.Generic;
+using System.Linq;
+using Oqtane.Models;
+using Oqtane.Security;
+using Oqtane.Shared;
+
+namespace Oqtane.Themes.Controls
+{
+ public class MenuBase : ThemeControlBase
+ {
+ private List _menuPages;
+
+ protected IEnumerable MenuPages => _menuPages ?? (_menuPages = GetMenuPages().ToList());
+
+ protected string GetTarget(Page page)
+ {
+ return page.Url.StartsWith("http") ? "_new" : string.Empty;
+ }
+
+ protected string GetUrl(Page page)
+ {
+ return string.IsNullOrEmpty(page.Url) ? NavigateUrl(page.Path) : page.Url;
+ }
+
+ private IEnumerable GetMenuPages()
+ {
+ var securityLevel = int.MaxValue;
+ foreach (Page p in PageState.Pages.Where(item => item.IsNavigation && !item.IsDeleted))
+ {
+ if (p.Level <= securityLevel && UserSecurity.IsAuthorized(PageState.User, PermissionNames.View, p.Permissions))
+ {
+ securityLevel = int.MaxValue;
+ yield return p;
+ }
+ else
+ {
+ if (securityLevel == int.MaxValue)
+ {
+ securityLevel = p.Level;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/Oqtane.Client/Themes/Controls/MenuHorizontal.Razor b/Oqtane.Client/Themes/Controls/MenuHorizontal.Razor
new file mode 100644
index 00000000..708a3059
--- /dev/null
+++ b/Oqtane.Client/Themes/Controls/MenuHorizontal.Razor
@@ -0,0 +1,42 @@
+@namespace Oqtane.Themes.Controls
+@inherits MenuBase
+@if (MenuPages.Any())
+{
+
+}
diff --git a/Oqtane.Client/Themes/Controls/MenuVertical.razor b/Oqtane.Client/Themes/Controls/MenuVertical.razor
new file mode 100644
index 00000000..8991b277
--- /dev/null
+++ b/Oqtane.Client/Themes/Controls/MenuVertical.razor
@@ -0,0 +1,27 @@
+@namespace Oqtane.Themes.Controls
+@inherits MenuBase
+@if (MenuPages.Any())
+{
+
+}