Skip to content
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 @@ -89,7 +89,7 @@
<PackageReference Include="HtmlSanitizer" Version="6.0.453" />
<PackageReference Include="IdentityModel" Version="4.6.0" />
<PackageReference Include="LearningHub.Nhs.Caching" Version="2.0.2" />
<PackageReference Include="LearningHub.Nhs.Models" Version="3.0.52" />
<PackageReference Include="LearningHub.Nhs.Models" Version="3.0.53" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.19.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="6.0.36" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.36" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
<ItemGroup>
<PackageReference Include="elfhHub.Nhs.Models" Version="3.0.11" />
<PackageReference Include="FluentAssertions" Version="6.12.0" />
<PackageReference Include="LearningHub.Nhs.Models" Version="3.0.52" />
<PackageReference Include="LearningHub.Nhs.Models" Version="3.0.53" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="3.1.13" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
<PackageReference Include="Selenium.Axe" Version="4.0.19" />
Expand Down
30 changes: 12 additions & 18 deletions LearningHub.Nhs.WebUI/Controllers/HomeController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -203,38 +203,31 @@ public IActionResult HomepageWithAuthentication()
/// <summary>
/// Index.
/// </summary>
/// <param name="dashboardTrayLearningResourceType">The resource type.</param>
/// <param name="myLearningDashboard">The my learning dashboard type.</param>
/// <param name="resourceDashboard">The resource dashboard type.</param>
/// <param name="catalogueDashboard">The catalogue dashboard type.</param>
/// <returns>Home page.</returns>
public async Task<IActionResult> Index(string myLearningDashboard = "my-in-progress", string resourceDashboard = "popular-resources", string catalogueDashboard = "popular-catalogues")
public async Task<IActionResult> Index(string dashboardTrayLearningResourceType = "all", string myLearningDashboard = "my-in-progress", string resourceDashboard = "popular-resources", string catalogueDashboard = "popular-catalogues")
{
if (this.User?.Identity.IsAuthenticated == true)
{
this.Logger.LogInformation("User is authenticated: User is {fullname} and userId is: {lhuserid}", this.User.Identity.GetCurrentName(), this.User.Identity.GetCurrentUserId());
if (this.User.IsInRole("Administrator") || this.User.IsInRole("BlueUser") || this.User.IsInRole("ReadOnly") || this.User.IsInRole("BasicUser"))
{
var learningTask = this.dashboardService.GetMyAccessLearningsAsync(myLearningDashboard, 1);
var learningTask = this.dashboardService.GetMyCoursesAndElearning(dashboardTrayLearningResourceType, myLearningDashboard, 1);
var resourcesTask = this.dashboardService.GetResourcesAsync(resourceDashboard, 1);
var cataloguesTask = this.dashboardService.GetCataloguesAsync(catalogueDashboard, 1);
var userGroupsTask = this.userGroupService.UserHasCatalogueContributionPermission();

var enrolledCoursesTask = Task.FromResult(new List<MoodleCourseResponseModel>());
(bool enableMoodle, int currentMoodleUserId) = await this.GetMoodleFeatureStateAsync();

if (enableMoodle && myLearningDashboard == "my-enrolled-courses")
{
enrolledCoursesTask = this.dashboardService.GetEnrolledCoursesFromMoodleAsync(currentMoodleUserId, 1);
}

await Task.WhenAll(learningTask, resourcesTask, cataloguesTask, userGroupsTask);

var model = new DashboardViewModel()
{
MyLearnings = await learningTask,
Resources = await resourcesTask,
Catalogues = await cataloguesTask,
EnrolledCourses = await enrolledCoursesTask,
DashboardTrayLearningResourceType = dashboardTrayLearningResourceType,
};
var userHasContributePermission = await userGroupsTask;
this.ViewBag.userHasContributePermission = userHasContributePermission;
Expand All @@ -261,15 +254,16 @@ public async Task<IActionResult> Index(string myLearningDashboard = "my-in-progr
/// <summary>
/// Load the specified dashobard page.
/// </summary>
/// <param name="dashboardTrayLearningResourceType">dashboardTrayLearningResourceType.</param>
/// <param name="dashBoardTray">dashBoardTray.</param>
/// <param name="myLearningDashBoard">myLearningDashBoard.</param>
/// <param name="resourceDashBoard">resourceDashBoard.</param>
/// <param name="catalogueDashBoard">catalogueDashBoard.</param>
/// <param name="pageNumber">pageNumber.</param>
/// <returns>Dashboard page.</returns>
[Authorize]
[Route("/Home/loadpage/{dashBoardTray}/{myLearningDashBoard}/{resourceDashBoard}/{catalogueDashBoard}/{pageNumber:int}")]
public async Task<IActionResult> LoadPage(string dashBoardTray = "my-learning", string myLearningDashBoard = "in-progress", string resourceDashBoard = "popular-resources", string catalogueDashBoard = "recent-catalogues", int pageNumber = 1)
[Route("/Home/loadpage/{dashboardTrayLearningResourceType}/{dashBoardTray}/{myLearningDashBoard}/{resourceDashBoard}/{catalogueDashBoard}/{pageNumber:int}")]
public async Task<IActionResult> LoadPage(string dashboardTrayLearningResourceType = "all", string dashBoardTray = "my-learning", string myLearningDashBoard = "in-progress", string resourceDashBoard = "popular-resources", string catalogueDashBoard = "recent-catalogues", int pageNumber = 1)
{
if (this.User.IsInRole("Administrator") || this.User.IsInRole("BlueUser") || this.User.IsInRole("ReadOnly") || this.User.IsInRole("BasicUser"))
{
Expand All @@ -278,19 +272,18 @@ public async Task<IActionResult> LoadPage(string dashBoardTray = "my-learning",
MyLearnings = new Nhs.Models.Dashboard.DashboardMyLearningResponseViewModel { Type = myLearningDashBoard },
Resources = new Nhs.Models.Dashboard.DashboardResourceResponseViewModel { Type = resourceDashBoard },
Catalogues = new Nhs.Models.Dashboard.DashboardCatalogueResponseViewModel { Type = catalogueDashBoard },
DashboardTrayLearningResourceType = dashboardTrayLearningResourceType,
};

(bool enableMoodle, int currentMoodleUserId) = await this.GetMoodleFeatureStateAsync();

bool isAjax = this.HttpContext.Request.Headers["X-Requested-With"] == "XMLHttpRequest";

if (isAjax)
{
switch (dashBoardTray)
{
case "my-learning":
model.MyLearnings = await this.dashboardService.GetMyAccessLearningsAsync(myLearningDashBoard, pageNumber);
return this.PartialView("_MyAccessedLearningTray", model);
model.MyLearnings = await this.dashboardService.GetMyCoursesAndElearning(dashboardTrayLearningResourceType, myLearningDashBoard, pageNumber);
return this.PartialView("_MyCoursesAndElearning", model);
case "resources":
model.Resources = await this.dashboardService.GetResourcesAsync(resourceDashBoard, pageNumber);
return this.PartialView("_ResourceTray", model);
Expand All @@ -301,13 +294,14 @@ public async Task<IActionResult> LoadPage(string dashBoardTray = "my-learning",
}
else
{
var learningTask = this.dashboardService.GetMyAccessLearningsAsync(myLearningDashBoard, dashBoardTray == "my-learning" ? pageNumber : 1);
var learningTask = this.dashboardService.GetMyCoursesAndElearning(dashboardTrayLearningResourceType, myLearningDashBoard, dashBoardTray == "my-learning" ? pageNumber : 1);
var resourcesTask = this.dashboardService.GetResourcesAsync(resourceDashBoard, dashBoardTray == "resources" ? pageNumber : 1);
var cataloguesTask = this.dashboardService.GetCataloguesAsync(catalogueDashBoard, dashBoardTray == "catalogues" ? pageNumber : 1);
await Task.WhenAll(learningTask, resourcesTask, cataloguesTask);
model.MyLearnings = await learningTask;
model.Resources = await resourcesTask;
model.Catalogues = await cataloguesTask;
model.DashboardTrayLearningResourceType = dashboardTrayLearningResourceType;
return this.View("Dashboard", model);
}
}
Expand Down
9 changes: 9 additions & 0 deletions LearningHub.Nhs.WebUI/Interfaces/IDashboardService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,15 @@ public interface IDashboardService
/// <returns>A <see cref="Task{TResult}"/> representing the result of the asynchronous operation.</returns>
Task<DashboardMyLearningResponseViewModel> GetMyAccessLearningsAsync(string dashboardType, int pageNumber);

/// <summary>
/// GetResourcesAsync.
/// </summary>
/// <param name="dashboardTrayLearningResourceType">The dashboardTrayLearningResource type.</param>
/// <param name="dashboardType">The dashboard type.</param>
/// <param name="pageNumber">The page Number.</param>
/// <returns>A <see cref="Task{TResult}"/> representing the result of the asynchronous operation.</returns>
Task<DashboardMyLearningResponseViewModel> GetMyCoursesAndElearning(string dashboardTrayLearningResourceType, string dashboardType, int pageNumber);

/// <summary>
/// GetCataloguesAsync.
/// </summary>
Expand Down
2 changes: 1 addition & 1 deletion LearningHub.Nhs.WebUI/LearningHub.Nhs.WebUI.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@
<PackageReference Include="HtmlAgilityPack" Version="1.11.72" />
<PackageReference Include="IdentityModel" Version="4.6.0" />
<PackageReference Include="LearningHub.Nhs.Caching" Version="2.0.0" />
<PackageReference Include="LearningHub.Nhs.Models" Version="3.0.52" />
<PackageReference Include="LearningHub.Nhs.Models" Version="3.0.53" />
<PackageReference Include="linqtotwitter" Version="6.9.0" />
<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.19.0" />
<PackageReference Include="Microsoft.ApplicationInsights.EventCounterCollector" Version="2.21.0" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,11 @@ public class DashBoardPagingViewModel
/// </summary>
public int TotalCount { get; set; }

/// <summary>
/// Gets or sets the dashboard tray Learning resource type.
/// </summary>
public string DashboardTrayLearningResourceType { get; set; }

/// <summary>
/// Gets the display message.
/// </summary>
Expand Down
5 changes: 5 additions & 0 deletions LearningHub.Nhs.WebUI/Models/DashboardViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,10 @@ public DashboardViewModel()
/// Gets or sets a list of enrolled courses to be displayed in the dashboard.
/// </summary>
public List<MoodleCourseResponseModel> EnrolledCourses { get; set; }

/// <summary>
/// Gets or sets the dashboard tray Learning resource type.
/// </summary>
public string DashboardTrayLearningResourceType { get; set; }
}
}
30 changes: 30 additions & 0 deletions LearningHub.Nhs.WebUI/Services/DashboardService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,36 @@ public async Task<DashboardMyLearningResponseViewModel> GetMyAccessLearningsAsyn
return viewmodel;
}

/// <summary>
/// GetCataloguesAsync.
/// </summary>
/// <param name="dashboardTrayLearningResourceType">The dashboard Tray Learning Resource type.</param>
/// <param name="dashboardType">The dashboard type.</param>
/// <param name="pageNumber">The page Number.</param>
/// <returns>A <see cref="Task{TResult}"/> representing the result of the asynchronous operation.</returns>
public async Task<DashboardMyLearningResponseViewModel> GetMyCoursesAndElearning(string dashboardTrayLearningResourceType, string dashboardType, int pageNumber)
{
DashboardMyLearningResponseViewModel viewmodel = new DashboardMyLearningResponseViewModel { };

var client = await this.OpenApiHttpClient.GetClientAsync();

var request = $"dashboard/GetMyCoursesAndElearning/{dashboardTrayLearningResourceType}/{dashboardType}/{pageNumber}";
var response = await client.GetAsync(request).ConfigureAwait(false);

if (response.IsSuccessStatusCode)
{
var result = response.Content.ReadAsStringAsync().Result;
viewmodel = JsonConvert.DeserializeObject<DashboardMyLearningResponseViewModel>(result);
}
else if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized ||
response.StatusCode == System.Net.HttpStatusCode.Forbidden)
{
throw new Exception("AccessDenied");
}

return viewmodel;
}

/// <summary>
/// GetCataloguesAsync.
/// </summary>
Expand Down
25 changes: 25 additions & 0 deletions LearningHub.Nhs.WebUI/Styles/nhsuk/layout.scss
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,32 @@ body {
color: $color_nhsuk-white;
}

.nhs-item-row {
display: flex;
justify-content: space-between;
align-items: center;
}
.nhs-progress-container {
display: flex;
height: 10px;
overflow: hidden;
line-height: 0;
font-size: 0.75rem;
background-color: #e9ecef;
border-radius: 0.25rem;
}

.nhs-progress-bar {
display: flex;
flex-direction: column;
justify-content: center;
overflow: hidden;
color: #fff;
text-align: center;
white-space: nowrap;
background-color: $nhsuk-green;
transition: width .6s ease;
}
.nhsuk-width-container.app-width-container {
max-width: px2rem(1208);
margin: 0 auto;
Expand Down
2 changes: 1 addition & 1 deletion LearningHub.Nhs.WebUI/Views/Home/Dashboard.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@

<div class="nhsuk-width-container app-width-container">
<div id="my-learning">
<partial name="_MyAccessedLearningTray" model="Model" />
<partial name="_mycoursesandelearning" model="Model" />
</div>
</div>
</div>
Expand Down
84 changes: 84 additions & 0 deletions LearningHub.Nhs.WebUI/Views/Home/_CertificateCard.cshtml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
@using LearningHub.Nhs.Models.Dashboard
@using LearningHub.Nhs.Models.Provider
@using LearningHub.Nhs.Models.MyLearning;
@using LearningHub.Nhs.Models.Enums
@using LearningHub.Nhs.WebUI.Extensions
@using LearningHub.Nhs.WebUI.Models
@using System.Linq
@using System.Collections.Generic;
@using LearningHub.Nhs.WebUI.Helpers
@inject LearningHub.Nhs.WebUI.Interfaces.IMoodleApiService moodleApiService;
@model Tuple<string, UserCertificateViewModel>

@{
string cardStyle = Model.Item1.Contains("my-learning") ? "card-provider-details--darkblank" : "card-provider-details--blank";
var activityDate = Model.Item2.AwardedDate.Date;
var today = DateTime.Today;
var dateTimeText = activityDate == today ? "Today"
: activityDate == today.AddDays(-1) ? "Yesterday"
: activityDate.ToString("dd MMM yyyy");
string GetMoodleCourseUrl(int courseId)
{
return moodleApiService.GetCourseUrl(courseId);
}
}
@functions {
public string CertificatePreviewUrl(int resourceReferenceId) =>
Url.Action("Certificate", "MyLearning", new { resourceReferenceId });

public string DownloadCertificateUrl(
int resourceReferenceId,
int? majorVersion = 1,
int? minorVersion = 0
) =>
Url.Action(
"DownloadCertificate",
"MyLearning",
new
{
resourceReferenceId,
majorVersion,
minorVersion,
}
);
}
<div class="nhsuk-card dashboard-card">
<div class="nhsuk-card__content dashboard-card-content">
<div>
<h3 class="nhsuk-card__heading nhsuk-heading-m line-clamp-2">

@if ((ResourceTypeEnum)Model.Item2.ResourceTypeId == ResourceTypeEnum.Moodle)
{
<a class="nhsuk-card__link" title="@Model.Item2.Title" target="_blank" href="@(Model.Item2.CertificatePreviewUrl)">@Model.Item2.Title</a>
}
else
{
<a class="nhsuk-card__link" title="@Model.Item2.Title" target="_blank" href="@CertificatePreviewUrl(Model.Item2.ResourceReferenceId)">@Model.Item2.Title</a>
}
</h3>
</div>
<div class="nhsuk-card__description dashboard-card-body">


<div class="nhs-item-row nhsuk-u-padding-bottom-3 nhsuk-u-padding-top-2">
<div>
<span class="nhsuk-u-secondary-text-color nhsuk-u-font-size-16 nhsuk-u-font-weight-bold nhsuk-u-padding-right-2">Type:</span>

<span class="nhsuk-u-padding-right-3 nhsuk-u-font-size-16 nhsuk-u-secondary-text-color">
@UtilityHelper.GetPrettifiedResourceTypeName((ResourceTypeEnum)Model.Item2.ResourceTypeId)
</span>
</div>
</div>
<div>
<span class="nhsuk-u-padding-right-2 nhsuk-u-font-size-16 nhsuk-u-secondary-text-color nhsuk-u-font-weight-bold">
Awarded:
</span>

<span class="nhsuk-u-font-size-16 nhsuk-u-secondary-text-color">
@dateTimeText
</span>
</div>
</div>
</div>
@* <div class="card-provider-details @cardStyle"></div> *@
</div>
6 changes: 3 additions & 3 deletions LearningHub.Nhs.WebUI/Views/Home/_DashboardPaging.cshtml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@
@model DashBoardPagingViewModel;
@{
var pagingModel = Model;
var previousUrl = $"/home/loadpage/{@pagingModel.DashboardTrayType}/{@pagingModel.MyLearningDashboard}/{@pagingModel.ResourceDashboard}/{@pagingModel.CatalogueDashboard}/{@Model.PreviousPage}";
var nextUrl = $"/home/loadpage/{@pagingModel.DashboardTrayType}/{@pagingModel.MyLearningDashboard}/{@pagingModel.ResourceDashboard}/{@pagingModel.CatalogueDashboard}/{@Model.NextPage}";
var queryParams = $"/?myLearningDashboard={@pagingModel.MyLearningDashboard}&resourceDashboard={@pagingModel.ResourceDashboard}&catalogueDashboard={@pagingModel.CatalogueDashboard}#{@pagingModel.DashboardTrayType}";
var previousUrl = $"/home/loadpage/{@pagingModel.DashboardTrayLearningResourceType}/{@pagingModel.DashboardTrayType}/{@pagingModel.MyLearningDashboard}/{@pagingModel.ResourceDashboard}/{@pagingModel.CatalogueDashboard}/{@Model.PreviousPage}";
var nextUrl = $"/home/loadpage/{@pagingModel.DashboardTrayLearningResourceType}/{@pagingModel.DashboardTrayType}/{@pagingModel.MyLearningDashboard}/{@pagingModel.ResourceDashboard}/{@pagingModel.CatalogueDashboard}/{@Model.NextPage}";
var queryParams = $"/?dashboardTrayLearningResourceType={@pagingModel.DashboardTrayLearningResourceType}&myLearningDashboard={@pagingModel.MyLearningDashboard}&resourceDashboard={@pagingModel.ResourceDashboard}&catalogueDashboard={@pagingModel.CatalogueDashboard}#{@pagingModel.DashboardTrayType}";
}

<nav class="nhsuk-u-width-full display--no-js-hide" role="navigation" aria-label="Pagination">
Expand Down
Loading
Loading