Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make UserMenu and LoginMenu extensible to using drivers #14214

Merged
merged 20 commits into from
Aug 31, 2023
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using OrchardCore.DisplayManagement.Handlers;
using OrchardCore.DisplayManagement.Views;
using OrchardCore.Entities;
using OrchardCore.Settings;
using OrchardCore.Users.Models;

namespace OrchardCore.Users.Drivers;

public class ChangeEmailUserMenuDisplayDriver : DisplayDriver<UserMenu>
{
private readonly ISiteService _siteService;

public ChangeEmailUserMenuDisplayDriver(ISiteService siteService)
{
_siteService = siteService;
}

public override IDisplayResult Display(UserMenu model)
{
return View("UserMenuItems__ChangeEmail", model)
.RenderWhen(async () => (await _siteService.GetSiteSettingsAsync()).As<ChangeEmailSettings>().AllowChangeEmail)
.Location("Detail", "Content:20")
.Location("DetailAdmin", "Content:20");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using OrchardCore.DisplayManagement.Handlers;
using OrchardCore.DisplayManagement.Views;
using OrchardCore.Users.Models;

namespace OrchardCore.Users.Drivers;

public class TwoFactorUserMenuDisplayDriver : DisplayDriver<UserMenu>
{
public override IDisplayResult Display(UserMenu model)
{
return View("UserMenuItems__TwoFactor", model)
.Location("Detail", "Content:15")
.Location("DetailAdmin", "Content:15");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using OrchardCore.DisplayManagement.Handlers;
using OrchardCore.DisplayManagement.Views;
using OrchardCore.Users.Models;

namespace OrchardCore.Users.Drivers;

public class UserMenuDisplayDriver : DisplayDriver<UserMenu>
{
private readonly SignInManager<IUser> _signInManager;
private readonly IHttpContextAccessor _httpContextAccessor;

public UserMenuDisplayDriver(
SignInManager<IUser> signInManager,
IHttpContextAccessor httpContextAccessor)
{
_signInManager = signInManager;
_httpContextAccessor = httpContextAccessor;
}

public override IDisplayResult Display(UserMenu model)
{
var results = new List<IDisplayResult>
{
View("UserMenuItems__Profile", model)
.Location("Detail", "Content:5")
.Location("DetailAdmin", "Content:5"),

View("UserMenuItems__SignOut", model)
.Location("Detail", "Content:after")
.Location("DetailAdmin", "Content:after"),

View("UserMenuItems__Title", model)
.Location("Detail", "Header:5")
.Location("DetailAdmin", "Header:5"),

View("UserMenuItems__SignedUser", model)
.Location("Detail", "Content:before")
.Location("DetailAdmin", "Content:before"),

View("UserMenuItems__ExternalLogins", model)
.RenderWhen(async () => (await _signInManager.GetExternalAuthenticationSchemesAsync()).Any())
.Location("Detail", "Content:10")
.Location("DetailAdmin", "Content:10"),
};

if (_httpContextAccessor.HttpContext.User.HasClaim("Permission", "AccessAdminPanel"))
{
results.Add(View("UserMenuItems__Dashboard", model)
.Location("Detail", "Content:1"));
}

return Combine(results);
}
}

This file was deleted.

3 changes: 2 additions & 1 deletion src/OrchardCore.Modules/OrchardCore.Users/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -244,6 +244,7 @@ public override void ConfigureServices(IServiceCollection services)

services.AddTransient<IUsersAdminListFilterProvider, DefaultUsersAdminListFilterProvider>();
services.AddTransient<IConfigureOptions<ResourceManagementOptions>, UserOptionsConfiguration>();
services.AddScoped<IDisplayDriver<UserMenu>, UserMenuDisplayDriver>();
}
}

Expand Down Expand Up @@ -330,7 +331,6 @@ public class ChangeEmailStartup : StartupBase
private const string _changeEmailConfirmationPath = "ChangeEmailConfirmation";
private const string _changeEmailControllerName = "ChangeEmail";


public override void Configure(IApplicationBuilder app, IEndpointRouteBuilder routes, IServiceProvider serviceProvider)
{
routes.MapAreaControllerRoute(
Expand All @@ -357,6 +357,7 @@ public override void ConfigureServices(IServiceCollection services)

services.AddScoped<INavigationProvider, ChangeEmailAdminMenu>();
services.AddScoped<IDisplayDriver<ISite>, ChangeEmailSettingsDisplayDriver>();
services.AddScoped<IDisplayDriver<UserMenu>, ChangeEmailUserMenuDisplayDriver>();
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ public override void ConfigureServices(IServiceCollection services)
services.Configure<MvcOptions>(options =>
{
options.Filters.Add<TwoFactorAuthenticationAuthorizationFilter>();
options.Filters.Add<LoginMenuFilter>();
});

services.AddScoped<IDisplayDriver<UserMenu>, UserMenuDisplayDriver>();
services.AddScoped<IDisplayDriver<ISite>, TwoFactorLoginSettingsDisplayDriver>();
services.AddScoped<IDisplayDriver<TwoFactorMethod>, TwoFactorMethodDisplayDriver>();
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<div class="dropdown">
<a class="dropdown-toggle nav-link" id="navbarDropdown" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" role="button">
@if (Model.Header != null)
{
@await DisplayAsync(Model.Header)
}
</a>

@if (Model.Content != null)
{
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
@await DisplayAsync(Model.Content)
</ul>
}
</div>
52 changes: 23 additions & 29 deletions src/OrchardCore.Modules/OrchardCore.Users/Views/UserMenu.cshtml
Original file line number Diff line number Diff line change
@@ -1,32 +1,26 @@
@using System.Security.Claims
@using OrchardCore.Settings
@using OrchardCore.Users.Models
@using OrchardCore.Entities

@inject ISiteService SiteService
@inject IAuthorizationService AuthorizationService

<div class="dropdown">
<form asp-route-area="OrchardCore.Users" asp-controller="Account" asp-action="LogOff" method="post" class="no-multisubmit">
<a class="dropdown-toggle nav-link" id="navbarDropdown" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" role="button">
<i class="fa-solid fa-fw fa-user" aria-hidden="true" data-bs-toggle="tooltip" data-bs-original-title="@User.Identity.Name"></i>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
<li><h6 class="dropdown-header">@T["Signed in as"]<span class="ms-1 font-weight-bold">@User.Identity.Name</span></h6></li>
<li><hr class="dropdown-divider" /></li>
@if (await AuthorizationService.AuthorizeAsync(User, CommonPermissions.EditOwnUser))
{
<li><a class="dropdown-item" asp-area="OrchardCore.Users" asp-action="Edit" asp-controller="Admin" asp-route-returnUrl="@FullRequestPath"><span><i class="far fa-address-card" aria-hidden="true"></i></span>&nbsp;<span> @T["Profile"]</span></a></li>
}
else if (await AuthorizationService.AuthorizeAsync(User, CommonPermissions.ViewUsers))
@if (User.Identity.IsAuthenticated)
{
<li class="nav-item dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">
@if (Model.Header != null)
{
<li><a class="dropdown-item" asp-area="OrchardCore.Users" asp-action="Display" asp-controller="Admin" asp-route-id="@User.FindFirstValue(ClaimTypes.NameIdentifier)" asp-route-returnUrl="@FullRequestPath"><span><i class="far fa-address-card" aria-hidden="true"></i></span>&nbsp;<span> @T["Profile"]</span></a></li>
@await DisplayAsync(Model.Header)
}
<li><a class="dropdown-item" asp-area="OrchardCore.Users" asp-controller="Account" asp-action="ChangePassword" asp-route-returnUrl="@FullRequestPath"><span><i class="fa-solid fa-key" aria-hidden="true"></i></span>&nbsp;<span> @T["Change password"]</span></a></li>

@await RenderSectionAsync("UserMenuItems", required: false)
</a>

<li><button type="submit" class="dropdown-item"><span><i class="fa-solid fa-sign-out-alt" aria-hidden="true"></i></span>&nbsp;<span> @T["Log off"]</span></button></li>
</ul>
</form>
</div>
@if (Model.Content != null)
{
<ul class="dropdown-menu dropdown-menu-end">
@await DisplayAsync(Model.Content)
</ul>
}
</li>
}
else
{
<li class="nav-item">
<a class="nav-link" asp-route-area="OrchardCore.Users" asp-controller="Account" asp-action="Login">
<i class="fa-solid fa-sign-in-alt fa-fw" aria-hidden="true"></i> @T["Log in"]
</a>
</li>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<li>
<a class="dropdown-item" asp-route-area="OrchardCore.Users" asp-controller="ChangeEmail" asp-action="Index">
<i class="fa-solid fa-envelope fa-fw" aria-hidden="true"></i> @T["Change Email"]
</a>
</li>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<li>
<a class="dropdown-item" asp-route-area="OrchardCore.Users" asp-controller="ChangeEmail" asp-action="Index">
<i class="fa-solid fa-envelope fa-fw" aria-hidden="true"></i> @T["Change Email"]
</a>
</li>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<li>
<a class="dropdown-item" asp-route-area="OrchardCore.Admin" asp-controller="Admin" asp-action="Index">
<i class="fa fa-desktop fa-fw" aria-hidden="true"></i> @T["Dashboard"]
</a>
</li>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<li>
<a class="dropdown-item" asp-route-area="OrchardCore.Users" asp-controller="Account" asp-action="ExternalLogins">
<i class="fa-solid fa-user-lock fa-fw" aria-hidden="true"></i> @T["External Logins"]
</a>
</li>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<li>
<a class="dropdown-item" asp-route-area="OrchardCore.Users" asp-controller="Account" asp-action="ExternalLogins">
<i class="fa-solid fa-user-lock fa-fw" aria-hidden="true"></i> @T["External Logins"]
</a>
</li>
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
@using System.Security.Claims

@inject IAuthorizationService AuthorizationService

@if (await AuthorizationService.AuthorizeAsync(User, CommonPermissions.EditOwnUser))
{
<li>
<a class="dropdown-item" asp-area="OrchardCore.Users" asp-action="Edit" asp-controller="Admin" asp-route-returnUrl="@FullRequestPath">
<span><i class="far fa-address-card" aria-hidden="true"></i></span>&nbsp;<span> @T["Profile"]</span>
</a>
</li>
}
else if (await AuthorizationService.AuthorizeAsync(User, CommonPermissions.ViewUsers))
{
<li>
<a class="dropdown-item" asp-area="OrchardCore.Users" asp-action="Display" asp-controller="Admin" asp-route-id="@User.FindFirstValue(ClaimTypes.NameIdentifier)" asp-route-returnUrl="@FullRequestPath">
<span><i class="far fa-address-card" aria-hidden="true"></i></span>&nbsp;
<span> @T["Profile"]</span>
</a>
</li>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
@using System.Security.Claims

@inject IAuthorizationService AuthorizationService

@if (await AuthorizationService.AuthorizeAsync(User, CommonPermissions.EditOwnUser))
{
<li>
<a class="dropdown-item" asp-area="OrchardCore.Users" asp-action="Edit" asp-controller="Admin" asp-route-returnUrl="@FullRequestPath">
<span><i class="far fa-address-card" aria-hidden="true"></i></span>&nbsp;<span> @T["Profile"]</span>
</a>
</li>
}
else if (await AuthorizationService.AuthorizeAsync(User, CommonPermissions.ViewUsers))
{
<li>
<a class="dropdown-item" asp-area="OrchardCore.Users" asp-action="Display" asp-controller="Admin" asp-route-id="@User.FindFirstValue(ClaimTypes.NameIdentifier)" asp-route-returnUrl="@FullRequestPath">
<span><i class="far fa-address-card" aria-hidden="true"></i></span>&nbsp;
<span> @T["Profile"]</span>
</a>
</li>
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<li>
<a class="dropdown-item" asp-area="OrchardCore.Users" asp-controller="Account" asp-action="ChangePassword" asp-route-returnUrl="@FullRequestPath">
<span><i class="fa-solid fa-key" aria-hidden="true"></i></span>&nbsp;<span> @T["Change password"]</span>
</a>
</li>
<li>
<form asp-route-area="OrchardCore.Users" asp-controller="Account" asp-action="LogOff" method="post" class="no-multisubmit">
<button type="submit" class="dropdown-item">
<span><i class="fa-solid fa-sign-out-alt" aria-hidden="true"></i></span>&nbsp;
<span> @T["Log off"]</span>
</button>
</form>
</li>
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<li>
<a class="dropdown-item" asp-area="OrchardCore.Users" asp-controller="Account" asp-action="ChangePassword" asp-route-returnUrl="@FullRequestPath">
<span><i class="fa-solid fa-key" aria-hidden="true"></i></span>&nbsp;<span> @T["Change password"]</span>
</a>
</li>
<li>
<form asp-route-area="OrchardCore.Users" asp-controller="Account" asp-action="LogOff" method="post" class="no-multisubmit">
<button type="submit" class="dropdown-item">
<span><i class="fa-solid fa-sign-out-alt" aria-hidden="true"></i></span>&nbsp;
<span> @T["Log off"]</span>
</button>
</form>
</li>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<li>
<h6 class="dropdown-header">
@T["Signed in as"]<span class="ms-1 font-weight-bold">@User.Identity.Name</span>
</h6>
</li>
<li><hr class="dropdown-divider" /></li>
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
<li>
<h6 class="dropdown-header">
@T["Signed in as"]<span class="ms-1 font-weight-bold">@User.Identity.Name</span>
</h6>
</li>
<li><hr class="dropdown-divider" /></li>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<i class="fa-solid fa-fw fa-user" aria-hidden="true" data-bs-toggle="tooltip" data-bs-original-title="@User.Identity.Name"></i>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<i class="fa-solid fa-fw fa-user" aria-hidden="true" data-bs-toggle="tooltip" data-bs-original-title="@User.Identity.Name"></i>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<li>
<a class="dropdown-item" asp-route-area="OrchardCore.Users" asp-controller="TwoFactorAuthentication" asp-action="Index">
<i class="fa-solid fa-shield-halved fa-fw" aria-hidden="true"></i> @T["Security"]
</a>
</li>
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<li>
<a class="dropdown-item" asp-route-area="OrchardCore.Users" asp-controller="TwoFactorAuthentication" asp-action="Index">
<i class="fa-solid fa-shield-halved fa-fw" aria-hidden="true"></i> @T["Security"]
</a>
</li>
1 change: 1 addition & 0 deletions src/OrchardCore.Themes/TheAdmin/TheAdmin.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
<ProjectReference Include="..\..\OrchardCore\OrchardCore.ResourceManagement\OrchardCore.ResourceManagement.csproj" />
<ProjectReference Include="..\..\OrchardCore.Modules\OrchardCore.Admin\OrchardCore.Admin.csproj" />
<ProjectReference Include="..\..\OrchardCore.Modules\OrchardCore.Themes\OrchardCore.Themes.csproj" />
<ProjectReference Include="..\..\OrchardCore\OrchardCore.Users.Core\OrchardCore.Users.Core.csproj" />
</ItemGroup>

</Project>
Loading