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

HEEDLS-465 - Implemented basic support page #419

Merged
merged 13 commits into from
Jun 28, 2021
Merged
Show file tree
Hide file tree
Changes from all 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
Expand Up @@ -39,6 +39,7 @@ public void Page_has_no_accessibility_errors(string url, string pageTitle)
[InlineData("/NotificationPreferences/Edit/AdminUser", "Update notification preferences")]
[InlineData("/NotificationPreferences/Edit/DelegateUser", "Update notification preferences")]
[InlineData("/ChangePassword", "Change password")]
[InlineData("/TrackingSystem/Support", "Support")]
public void Authenticated_page_has_no_accessibility_errors(string url, string pageTitle)
{
// when
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
using System.Security.Claims;
using DigitalLearningSolutions.Data.DataServices;
using DigitalLearningSolutions.Data.Services;
using DigitalLearningSolutions.Web.Controllers;
using DigitalLearningSolutions.Web.Controllers.LearningSolutions;
using DigitalLearningSolutions.Web.ViewModels.LearningSolutions;
using FakeItEasy;
using FluentAssertions;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
namespace DigitalLearningSolutions.Web.Tests.Controllers.Support
{
using DigitalLearningSolutions.Web.Controllers.Support;
using FluentAssertions.AspNetCore.Mvc;
using NUnit.Framework;

public class SupportControllerTests
{
private SupportController controller = null!;

[SetUp]
public void SetUp()
{
controller = new SupportController();
}

[TestCase("TrackingSystem")]
[TestCase("Frameworks")]
public void Support_page_should_be_shown_for_valid_application_names(string applicationName)
{
// When
var result = controller.Index(applicationName);

// Then
result.Should().BeViewResult().WithViewName("Support");
}

[Test]
public void Invalid_application_name_should_redirect_to_404_page()
{
// When
var result = controller.Index("Main");

// Then
result.Should().BeNotFoundResult();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
namespace DigitalLearningSolutions.Web.Controllers
namespace DigitalLearningSolutions.Web.Controllers.LearningSolutions
{
using DigitalLearningSolutions.Data.DataServices;
using DigitalLearningSolutions.Data.Services;
using DigitalLearningSolutions.Web.Helpers;
using DigitalLearningSolutions.Web.ViewModels.LearningSolutions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
namespace DigitalLearningSolutions.Web.Controllers.Support
{
using DigitalLearningSolutions.Web.Helpers;
using DigitalLearningSolutions.Web.Models.Enums;
using DigitalLearningSolutions.Web.ViewModels.Support;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

public class SupportController : Controller
{
[Route("/{application}/Support")]
[Authorize(Policy = CustomPolicies.UserCentreAdminOrFrameworksAdmin)]
public IActionResult Index(ApplicationType application)
{
if (ApplicationType.TrackingSystem.Equals(application) ||
ApplicationType.Frameworks.Equals(application))
{
var model = new SupportViewModel(application, SupportPage.Support);
return View("Support", model);
}

return NotFound();
}
}
}
8 changes: 8 additions & 0 deletions DigitalLearningSolutions.Web/Helpers/CustomClaimHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,5 +83,13 @@ public static bool HasCentreManagerPermissions(this ClaimsPrincipal user)
return (user.GetCustomClaimAsBool(CustomClaimTypes.UserCentreManager) ?? false) ||
(user.GetCustomClaimAsBool(CustomClaimTypes.UserUserAdmin) ?? false);
}

public static bool HasFrameworksAdminPermissions(this ClaimsPrincipal user)
{
return user.GetCustomClaimAsBool(CustomClaimTypes.IsFrameworkDeveloper) == true ||
user.GetCustomClaimAsBool(CustomClaimTypes.IsFrameworkContributor) == true ||
user.GetCustomClaimAsBool(CustomClaimTypes.IsWorkforceManager) == true ||
user.GetCustomClaimAsBool(CustomClaimTypes.IsWorkforceContributor) == true;
}
}
}
12 changes: 12 additions & 0 deletions DigitalLearningSolutions.Web/Helpers/CustomPolicies.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public class CustomPolicies
public const string UserCentreAdmin = "UserCentreAdmin";
public const string UserFrameworksAdminOnly = "UserFrameworksAdminOnly";
public const string UserCentreManager = "UserCentreManager";
public const string UserCentreAdminOrFrameworksAdmin = "UserCentreAdminOrFrameworksAdmin";

public static AuthorizationPolicyBuilder ConfigurePolicyUserOnly(AuthorizationPolicyBuilder policy)
{
Expand Down Expand Up @@ -48,5 +49,16 @@ AuthorizationPolicyBuilder policy
context.User.GetCustomClaimAsBool(CustomClaimTypes.UserUserAdmin) == true)
);
}

public static AuthorizationPolicyBuilder ConfigurePolicyUserCentreAdminOrFrameworksAdmin(
AuthorizationPolicyBuilder policy
)
{
return policy.RequireAssertion(
context => context.User.GetCustomClaimAsInt(CustomClaimTypes.UserAdminId) != null
&& (context.User.HasCentreAdminPermissions()
|| context.User.HasFrameworksAdminPermissions())
);
}
}
}
39 changes: 39 additions & 0 deletions DigitalLearningSolutions.Web/Models/Enums/ApplicationType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
namespace DigitalLearningSolutions.Web.Models.Enums
{
using System;
using DigitalLearningSolutions.Data.Enums;
using DigitalLearningSolutions.Web.Helpers;

public class ApplicationType : Enumeration
{
public static readonly ApplicationType TrackingSystem = new ApplicationType(0, nameof(TrackingSystem), "Tracking System");
public static readonly ApplicationType Frameworks = new ApplicationType(1, nameof(Frameworks), "Frameworks");
public static readonly ApplicationType Main = new ApplicationType(2, nameof(Main), "Main");

private ApplicationType(int id, string name, string applicationName) : base(id, name)
{
ApplicationName = applicationName;

HeaderPath = name.Equals("TrackingSystem")
? $"{ConfigHelper.GetAppConfig()["AppRootPath"]}/TrackingSystem/Centre/Dashboard"
: null;
}

public readonly string ApplicationName;
public readonly string? HeaderPath;

public static implicit operator ApplicationType(string value)
{
try
{
return FromName<ApplicationType>(value);
}
catch (InvalidOperationException e)
{
throw new InvalidCastException(e.Message);
}
}

public static implicit operator string(ApplicationType applicationType) => applicationType.Name;
}
}
12 changes: 12 additions & 0 deletions DigitalLearningSolutions.Web/Models/Enums/SupportPage.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
namespace DigitalLearningSolutions.Web.Models.Enums
{
public enum SupportPage
{
Support,
HelpDocumentation,
Faqs,
Resources,
SupportTickets,
ChangeRequests
}
}
6 changes: 5 additions & 1 deletion DigitalLearningSolutions.Web/Startup.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,10 @@ public void ConfigureServices(IServiceCollection services)
CustomPolicies.UserCentreManager,
policy => CustomPolicies.ConfigurePolicyUserCentreManager(policy)
);
options.AddPolicy(
CustomPolicies.UserCentreAdminOrFrameworksAdmin,
policy => CustomPolicies.ConfigurePolicyUserCentreAdminOrFrameworksAdmin(policy)
);
}
);

Expand Down Expand Up @@ -230,4 +234,4 @@ private Task RedirectToHome(RedirectContext<CookieAuthenticationOptions> context
return Task.CompletedTask;
}
}
}
}
5 changes: 5 additions & 0 deletions DigitalLearningSolutions.Web/Styles/support/support.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
@import "~nhsuk-frontend/packages/core/all";

ol>li {
@include nhsuk-responsive-margin(5, "bottom");
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
namespace DigitalLearningSolutions.Web.ViewModels.Support
{
using DigitalLearningSolutions.Web.Models.Enums;

public class SupportViewModel
{
public SupportViewModel(ApplicationType application, SupportPage currentPage)
{
CurrentPage = currentPage;

Application = application;
}

public SupportPage CurrentPage { get; set; }
public ApplicationType Application { get; set; }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@

@model ApplicationSelectorViewModel

@section NavMenuItems {
<partial name="_NavMenuItems"/>
}

@{
ViewData["Title"] = "Switch Application";
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
ViewData["Title"] = errorHasOccurred ? "Error: Change Your Password" : "Change Your Password";
}

@section NavMenuItems {
<partial name="_NavMenuItems" />
}

<div class="nhsuk-grid-row">
<div class="nhsuk-grid-column-full">
@if (errorHasOccurred) {
Expand Down Expand Up @@ -50,6 +54,6 @@
<button class="nhsuk-button" type="submit">Change password</button>
</form>

<vc:back-link asp-controller="MyAccount" asp-action="Index" asp-all-route-data="@null" link-text="Cancel" />
<vc:back-link asp-controller="MyAccount" asp-action="Index" asp-all-route-data="@null" link-text="Cancel"/>
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@
ViewData["Title"] = "Password Changed Successfully";
}

@section NavMenuItems {
<partial name="_NavMenuItems" />
}

<div class="nhsuk-grid-row">
<div class="nhsuk-grid-column-full nhsuk-u-margin-bottom-8">
<h1 class="nhsuk-heading-xl">Change password</h1>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@
ViewData["Title"] = "Find Your Centre";
}

@section NavMenuItems {
<partial name="_NavMenuItems" />
}

<div class="nhsuk-grid-row">
<div class="nhsuk-grid-column-full">
<h1 class="nhsuk-heading-xl heading-margin-2" id="page-heading">Find your centre</h1>
Expand Down
32 changes: 17 additions & 15 deletions DigitalLearningSolutions.Web/Views/ForgotPassword/Confirm.cshtml
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
@using DigitalLearningSolutions.Web.Helpers
@{
ViewData["Title"] = "Password Reset Email Sent";
}

<div class="nhsuk-grid-row">
<div class="nhsuk-grid-column-full">
<h1 id="page-heading" class="nhsuk-heading-xl nhsuk-u-margin-bottom-6">Password reset email sent</h1>
<p>An email has been sent to you giving details of how to reset your password.</p>
<p>The link provided in that email will expire in two hours.</p>
<p>If you have not received an email, please contact your centre administrator.</p>
<p>To find out your administrator details, <a asp-controller="FindYourCentre" asp-action="Index">search for your centre here</a>.</p>
</div>
</div>

@{
stellake marked this conversation as resolved.
Show resolved Hide resolved
ViewData["Title"] = "Password Reset Email Sent";
}

@section NavMenuItems {
<partial name="_NavMenuItems" />
}

<div class="nhsuk-grid-row">
<div class="nhsuk-grid-column-full">
<h1 id="page-heading" class="nhsuk-heading-xl nhsuk-u-margin-bottom-6">Password reset email sent</h1>
<p>An email has been sent to you giving details of how to reset your password.</p>
<p>The link provided in that email will expire in two hours.</p>
<p>If you have not received an email, please contact your centre administrator.</p>
<p>To find out your administrator details, <a asp-controller="FindYourCentre" asp-action="Index">search for your centre here</a>.</p>
</div>
</div>
Loading