diff --git a/LearningHub.Nhs.WebUI/Controllers/MyLearningController.cs b/LearningHub.Nhs.WebUI/Controllers/MyLearningController.cs index a1762ec7..921d1e16 100644 --- a/LearningHub.Nhs.WebUI/Controllers/MyLearningController.cs +++ b/LearningHub.Nhs.WebUI/Controllers/MyLearningController.cs @@ -458,6 +458,7 @@ public async Task LearningHistory(MyLearningUserActivitiesViewMod Viewed = learningRequest.Viewed, Launched = learningRequest.Launched, CertificateEnabled = learningRequest.CertificateEnabled, + Courses = learningRequest.Courses, }; if (myLearningDashboard != null) @@ -627,6 +628,50 @@ public async Task ExportToPDF(MyLearningRequestModel myLearningRe return this.View(new Tuple(userDetails, response)); } + /// + /// Function to export activity report to pdf. + /// + /// myLearningRequestModel. + /// A representing the result of the asynchronous operation. + [Route("/MyLearning/DownloadActivities")] + [HttpPost] + public async Task DownloadActivities(MyLearningRequestModel myLearningRequestModel) + { + var filter = myLearningRequestModel; + filter.Skip = 0; + filter.Take = 999; + var userDetails = await this.userService.GetCurrentUserBasicDetailsAsync(); + var response = new MyLearningUserActivitiesViewModel(); + var result = await this.myLearningService.GetUserLearningHistory(filter); + if (result != null) + { + response.TotalCount = result.TotalCount; + response.Activities = result.Activities; + } + + Tuple modelData = Tuple.Create(userDetails, response); + var renderedViewHTML = RenderRazorViewToString(this, "DownloadActivityRecords", modelData); + ReportStatusModel reportStatusModel = new ReportStatusModel(); + var pdfReportResponse = await this.pdfReportService.PdfReport(renderedViewHTML, userDetails.Id); + if (pdfReportResponse != null) + { + do + { + reportStatusModel = await this.pdfReportService.PdfReportStatus(pdfReportResponse); + } + while (reportStatusModel.Id == 1); + + var pdfReportFile = await this.pdfReportService.GetPdfReportFile(pdfReportResponse); + if (pdfReportFile != null) + { + var fileName = "ActivityReport.pdf"; + return this.File(pdfReportFile, FileHelper.GetContentTypeFromFileName(fileName), fileName); + } + } + + return this.View(new Tuple(userDetails, response)); + } + /// /// Gets the played segment data for the progress modal in My Learning screen. /// diff --git a/LearningHub.Nhs.WebUI/Controllers/MyRecentLearningController.cs b/LearningHub.Nhs.WebUI/Controllers/MyRecentLearningController.cs deleted file mode 100644 index 2d909f83..00000000 --- a/LearningHub.Nhs.WebUI/Controllers/MyRecentLearningController.cs +++ /dev/null @@ -1,495 +0,0 @@ -namespace LearningHub.Nhs.WebUI.Controllers -{ - using System; - using System.Collections.Generic; - using System.IO; - using System.Linq; - using System.Net.Http; - using System.Threading.Tasks; - using LearningHub.Nhs.Models.MyLearning; - using LearningHub.Nhs.Models.Report; - using LearningHub.Nhs.WebUI.Configuration; - using LearningHub.Nhs.WebUI.Extensions; - using LearningHub.Nhs.WebUI.Filters; - using LearningHub.Nhs.WebUI.Helpers; - using LearningHub.Nhs.WebUI.Interfaces; - using LearningHub.Nhs.WebUI.Models; - using LearningHub.Nhs.WebUI.Models.Learning; - using Microsoft.AspNetCore.Authorization; - using Microsoft.AspNetCore.Hosting; - using Microsoft.AspNetCore.Mvc; - using Microsoft.AspNetCore.Mvc.Rendering; - using Microsoft.AspNetCore.Mvc.ViewEngines; - using Microsoft.AspNetCore.Mvc.ViewFeatures; - using Microsoft.Extensions.Logging; - using Microsoft.Extensions.Options; - - /// - /// The MyLearningController. - /// - [Authorize] - [ServiceFilter(typeof(LoginWizardFilter))] - public class MyRecentLearningController : BaseController - { - private const int MyLearningPageSize = 10; - private readonly IMyLearningService myLearningService; - private readonly IResourceService resourceService; - private readonly IHierarchyService hierarchyService; - private readonly IUserService userService; - private readonly IPDFReportService pdfReportService; - private readonly IFileService fileService; - private readonly string filePath; - - /// - /// Initializes a new instance of the class. - /// - /// The hostingEnvironment. - /// The logger. - /// The settings. - /// The httpClientFactory. - /// myLearning service. - /// resource Service. - /// hierarchy Service. - /// user Service. - /// PDF Report Service. - /// fileService. - public MyRecentLearningController(IWebHostEnvironment hostingEnvironment, ILogger logger, IOptions settings, IHttpClientFactory httpClientFactory, IMyLearningService myLearningService, IResourceService resourceService, IHierarchyService hierarchyService, IUserService userService, IPDFReportService pdfReportService, IFileService fileService) - : base(hostingEnvironment, httpClientFactory, logger, settings.Value) - { - this.myLearningService = myLearningService; - this.resourceService = resourceService; - this.userService = userService; - this.pdfReportService = pdfReportService; - this.hierarchyService = hierarchyService; - this.fileService = fileService; - this.filePath = "CatalogueImageDirectory"; - } - - /// - /// RenderRazorViewToString. - /// - /// controller. - /// viewName. - /// model. - /// Html as string. - public static string RenderRazorViewToString(Controller controller, string viewName, object model = null) - { - controller.ViewData.Model = model; - using (var sw = new StringWriter()) - { - IViewEngine viewEngine = - controller.HttpContext.RequestServices.GetService(typeof(ICompositeViewEngine)) as - ICompositeViewEngine; - ViewEngineResult viewResult = viewEngine.FindView(controller.ControllerContext, viewName, false); - - ViewContext viewContext = new ViewContext( - controller.ControllerContext, - viewResult.View, - controller.ViewData, - controller.TempData, - sw, - new HtmlHelperOptions()); - viewResult.View.RenderAsync(viewContext); - return sw.GetStringBuilder().ToString(); - } - } - - /// - /// Index. - /// - /// learningRequest. - /// The my learning dashboard type. - /// IActionResult. - [Route("MyRecentLearning")] - [Route("MyRecentLearning/activity")] - [HttpGet] - [HttpPost] - public async Task Index(MyLearningViewModel learningRequest = null, string myLearningDashboard = null) - { - var myLearningRequestModel = new MyLearningRequestModel - { - SearchText = learningRequest.SearchText?.Trim(), - Skip = learningRequest.CurrentPageIndex * MyLearningPageSize, - Take = MyLearningPageSize, - TimePeriod = !string.IsNullOrWhiteSpace(learningRequest.TimePeriod) ? learningRequest.TimePeriod : "allDates", - StartDate = learningRequest.StartDate, - EndDate = learningRequest.EndDate, - Weblink = learningRequest.Weblink, - File = learningRequest.File, - Video = learningRequest.Video, - Article = learningRequest.Article, - Case = learningRequest.Case, - Image = learningRequest.Image, - Audio = learningRequest.Audio, - Elearning = learningRequest.Elearning, - Html = learningRequest.Html, - Assessment = learningRequest.Assessment, - Complete = learningRequest.Complete, - Incomplete = learningRequest.Incomplete, - Passed = learningRequest.Passed, - Failed = learningRequest.Failed, - Downloaded = learningRequest.Downloaded, - Viewed = learningRequest.Viewed, - Launched = learningRequest.Launched, - CertificateEnabled = learningRequest.CertificateEnabled, - }; - - if (myLearningDashboard != null) - { - if (myLearningDashboard == "my-in-progress") - { - myLearningRequestModel.Incomplete = true; - myLearningRequestModel.Failed = true; - } - else if (myLearningDashboard == "my-recent-completed") - { - myLearningRequestModel.Complete = true; - myLearningRequestModel.Passed = true; - myLearningRequestModel.Downloaded = true; - } - else if (myLearningDashboard == "my-certificates") - { - myLearningRequestModel.CertificateEnabled = true; - myLearningRequestModel.Complete = true; - myLearningRequestModel.Passed = true; - myLearningRequestModel.Downloaded = true; - } - } - - switch (learningRequest.MyLearningFormActionType) - { - case MyLearningFormActionTypeEnum.NextPageChange: - learningRequest.CurrentPageIndex += 1; - myLearningRequestModel.Skip = learningRequest.CurrentPageIndex * MyLearningPageSize; - break; - - case MyLearningFormActionTypeEnum.PreviousPageChange: - learningRequest.CurrentPageIndex -= 1; - myLearningRequestModel.Skip = learningRequest.CurrentPageIndex * MyLearningPageSize; - break; - case MyLearningFormActionTypeEnum.BasicSearch: - - myLearningRequestModel = new MyLearningRequestModel - { - SearchText = learningRequest.SearchText?.Trim(), - TimePeriod = !string.IsNullOrWhiteSpace(learningRequest.TimePeriod) ? learningRequest.TimePeriod : "allDates", - Skip = learningRequest.CurrentPageIndex * MyLearningPageSize, - Take = MyLearningPageSize, - }; - break; - - case MyLearningFormActionTypeEnum.ApplyWeekFilter: - myLearningRequestModel = new MyLearningRequestModel - { - SearchText = learningRequest.SearchText?.Trim(), - TimePeriod = "thisWeek", - Skip = learningRequest.CurrentPageIndex * MyLearningPageSize, - Take = MyLearningPageSize, - }; - break; - case MyLearningFormActionTypeEnum.ApplyMonthFilter: - myLearningRequestModel = new MyLearningRequestModel - { - SearchText = learningRequest.SearchText?.Trim(), - TimePeriod = "thisMonth", - Skip = learningRequest.CurrentPageIndex * MyLearningPageSize, - Take = MyLearningPageSize, - }; - break; - - case MyLearningFormActionTypeEnum.ApplyTwelveMonthFilter: - myLearningRequestModel = new MyLearningRequestModel - { - SearchText = learningRequest.SearchText?.Trim(), - TimePeriod = "last12Months", - Skip = learningRequest.CurrentPageIndex * MyLearningPageSize, - Take = MyLearningPageSize, - }; - break; - - case MyLearningFormActionTypeEnum.ApplyMajorFilters: - if (learningRequest.TimePeriod == "dateRange") - { - if (!this.ModelState.IsValid) - { - break; - } - - myLearningRequestModel.TimePeriod = learningRequest.TimePeriod; - myLearningRequestModel.StartDate = learningRequest.GetStartDate().HasValue ? learningRequest.GetStartDate().Value : null; - myLearningRequestModel.EndDate = learningRequest.GetEndDate().HasValue ? learningRequest.GetEndDate().Value : null; - } - - break; - - case MyLearningFormActionTypeEnum.ClearAllFilters: - - myLearningRequestModel = new MyLearningRequestModel - { - SearchText = learningRequest.SearchText?.Trim(), - Skip = learningRequest.CurrentPageIndex * MyLearningPageSize, - TimePeriod = "allDates", - Take = MyLearningPageSize, - }; - break; - } - - var result = await this.myLearningService.GetUserRecentMyLearningActivities(myLearningRequestModel); - var response = new MyLearningUserActivitiesViewModel(myLearningRequestModel); - - if (result != null) - { - response.TotalCount = result.TotalCount; - response.Activities = result.Activities; - } - - response.MyLearningPaging = new MyLearningPagingModel() { CurrentPage = learningRequest.CurrentPageIndex, PageSize = MyLearningPageSize, TotalItems = response.TotalCount, HasItems = response.TotalCount > 0 }; - this.ViewBag.MyLearningHelpUrl = this.Settings.SupportUrls.MyLearningHelpUrl; - return this.View(response); - } - - /// - /// Function to export activity report to pdf. - /// - /// myLearningRequestModel. - /// A representing the result of the asynchronous operation. - [Route("/MyLearning/ExportToPDF")] - [HttpPost] - public async Task ExportToPDF(MyLearningRequestModel myLearningRequestModel) - { - var filter = myLearningRequestModel; - filter.Skip = 0; - filter.Take = 999; - var userDetails = await this.userService.GetCurrentUserBasicDetailsAsync(); - var response = new MyLearningViewModel(); - var result = await this.myLearningService.GetActivityDetailed(filter); - if (result != null) - { - response.TotalCount = result.TotalCount; - response.Activities = result.Activities.Select(entry => new ActivityDetailedItemViewModel(entry)).ToList(); - if (response.Activities.Any()) - { - foreach (var activity in response.Activities) - { - if (!response.MostRecentResources.Contains(activity.ResourceId)) - { - activity.IsMostRecent = true; - response.MostRecentResources.Add(activity.ResourceId); - } - } - } - } - - Tuple modelData = Tuple.Create(userDetails, response); - var renderedViewHTML = RenderRazorViewToString(this, "ExportToPDF", modelData); - ReportStatusModel reportStatusModel = new ReportStatusModel(); - var pdfReportResponse = await this.pdfReportService.PdfReport(renderedViewHTML, userDetails.Id); - if (pdfReportResponse != null) - { - do - { - reportStatusModel = await this.pdfReportService.PdfReportStatus(pdfReportResponse); - } - while (reportStatusModel.Id == 1); - - var pdfReportFile = await this.pdfReportService.GetPdfReportFile(pdfReportResponse); - if (pdfReportFile != null) - { - var fileName = "ActivityReport.pdf"; - return this.File(pdfReportFile, FileHelper.GetContentTypeFromFileName(fileName), fileName); - } - } - - return this.View(new Tuple(userDetails, response)); - } - - /// - /// Gets the played segment data for the progress modal in My Learning screen. - /// - /// The resourceId. - /// The resourceVersionId. - /// The majorVersion. - /// The max time. - /// Return url. - /// The . - [HttpGet] - [Route("my-learning/activity/{resourceId}/view-progress")] - public async Task ViewProgress(int resourceId, int resourceReferenceId, int version, long maxTime, string returnUrl = "/") - { - this.ViewBag.ReturnUrl = returnUrl; - var playedSegments = await this.myLearningService.GetPlayedSegments(resourceId, version); - - var allSegments = new List(); - var currentTime = 0; - var mediaLengthInSeconds = maxTime / 1000M; - - foreach (var segment in playedSegments.OrderBy(p => p.SegmentStartTime)) - { - if (segment.SegmentStartTime > currentTime) - { - allSegments.Add(new ResourcePlayedSegment - { - SegmentStartTime = currentTime, - SegmentEndTime = segment.SegmentStartTime, - Played = false, - }); - } - - allSegments.Add(new ResourcePlayedSegment - { - SegmentStartTime = segment.SegmentStartTime, - SegmentEndTime = segment.SegmentEndTime, - Played = true, - }); - - currentTime = segment.SegmentEndTime; - } - - if (currentTime < mediaLengthInSeconds) - { - allSegments.Add(new ResourcePlayedSegment - { - SegmentStartTime = currentTime, - SegmentEndTime = (int)mediaLengthInSeconds, - Played = false, - }); - } - - allSegments.ForEach(s => s.Percentage = Math.Round((s.SegmentEndTime - s.SegmentStartTime) / mediaLengthInSeconds * 100, 2)); - - var vm = new ActivityViewProgress - { - ResourceReferenceId = resourceReferenceId, - Segments = allSegments, - MediaLength = ResourcePlayedSegment.GetDurationHhmmss((int)mediaLengthInSeconds), - }; - - return this.View(vm); - } - - /// - /// Gets the certificate details of an activity. - /// - /// The resourceReferenceId. - /// The majorVersion. - /// The minorVersion. - /// The user Id. - /// The downloadCert flag. - /// The . - [HttpGet] - [Route("mylearning/certificate/{resourceReferenceId}")] - [Route("mylearning/certificate/{resourceReferenceId}/{userId}")] - [Route("mylearning/certificate/{*path}")] - public async Task GetCertificateDetails(int resourceReferenceId, int? majorVersion = 0, int? minorVersion = 0, int? userId = 0, bool downloadCert = false) - { - CertificateDetails certificateDetails = null; - string base64Image = string.Empty; - var activity = await this.myLearningService.GetResourceCertificateDetails(resourceReferenceId, majorVersion, minorVersion, userId); - if (activity.Item1 > 0 && activity.Item2 != null && ViewActivityHelper.CanDownloadCertificate(new ActivityDetailedItemViewModel(activity.Item2))) - { - var resource = await this.resourceService.GetItemByIdAsync(resourceReferenceId); - var nodePathNodes = await this.hierarchyService.GetNodePathNodes(resource.NodePathId); - var currentUser = await this.userService.GetUserByUserIdAsync((userId == 0) ? this.CurrentUserId : (int)userId); - var userEmployment = await this.userService.GetUserEmploymentByIdAsync(currentUser.PrimaryUserEmploymentId ?? 0); - if (activity.Item2.CertificateUrl != null && downloadCert) - { - var file = await this.fileService.DownloadFileAsync(this.filePath, activity.Item2.CertificateUrl); - if (file != null) - { - byte[] imageArray = new BinaryReader(file.Content).ReadBytes((int)file.ContentLength); - base64Image = Convert.ToBase64String(imageArray); - } - } - - certificateDetails = new CertificateDetails { AccessCount = activity.Item1, ProfessionalRegistrationNumber = userEmployment?.MedicalCouncilNo, NodeViewModels = nodePathNodes, UserViewModel = currentUser, ResourceItemViewModel = resource, ActivityDetailedItemViewModel = new ActivityDetailedItemViewModel(activity.Item2), DownloadCertificate = downloadCert, CertificateBase64Image = base64Image }; - } - - return this.View("LearningCertificate", certificateDetails); - } - - /// - /// Gets the certificate details of an activity. - /// - /// The resourceReferenceId. - /// The majorVersion. - /// The minorVersion. - /// The userId. - /// The . - [HttpPost] - [Route("mylearning/downloadcertificate")] - public async Task DownloadCertificate(int resourceReferenceId, int? majorVersion = 0, int? minorVersion = 0, int? userId = 0) - { - CertificateDetails certificateDetails = null; - string base64Image = string.Empty; - var activity = await this.myLearningService.GetResourceCertificateDetails(resourceReferenceId, majorVersion, minorVersion, userId); - if (activity.Item1 > 0 && activity.Item2 != null && ViewActivityHelper.CanDownloadCertificate(new ActivityDetailedItemViewModel(activity.Item2))) - { - var resource = await this.resourceService.GetItemByIdAsync(resourceReferenceId); - var nodePathNodes = await this.hierarchyService.GetNodePathNodes(resource.NodePathId); - var currentUser = await this.userService.GetUserByUserIdAsync((userId == 0) ? this.CurrentUserId : (int)userId); - var userEmployment = await this.userService.GetUserEmploymentByIdAsync(currentUser.PrimaryUserEmploymentId ?? 0); - var resourceItemUrl = this.Settings.LearningHubWebUiUrl.Trim() + "Resource/" + resourceReferenceId + "/Item"; - if (activity.Item2.CertificateUrl != null) - { - var file = await this.fileService.DownloadFileAsync(this.filePath, activity.Item2.CertificateUrl); - if (file != null) - { - byte[] imageArray = new BinaryReader(file.Content).ReadBytes((int)file.ContentLength); - base64Image = Convert.ToBase64String(imageArray); - } - } - - certificateDetails = new CertificateDetails { AccessCount = activity.Item1, ProfessionalRegistrationNumber = userEmployment?.MedicalCouncilNo, NodeViewModels = nodePathNodes, UserViewModel = currentUser, ResourceItemViewModel = resource, ActivityDetailedItemViewModel = new ActivityDetailedItemViewModel(activity.Item2), DownloadCertificate = true, CertificateBase64Image = base64Image, PdfResoureItemUrl = resourceItemUrl }; - var renderedViewHTML = new List(); - certificateDetails.PageNo++; - renderedViewHTML.Add(RenderRazorViewToString(this, "LearningCertificate", certificateDetails)); - certificateDetails.PageNo++; - renderedViewHTML.Add(RenderRazorViewToString(this, "LearningCertificate", certificateDetails)); - - ReportStatusModel reportStatusModel = new ReportStatusModel(); - var pdfReportResponse = await this.pdfReportService.PdfReport(renderedViewHTML, currentUser.Id); - if (pdfReportResponse != null) - { - do - { - reportStatusModel = await this.pdfReportService.PdfReportStatus(pdfReportResponse); - } - while (reportStatusModel.Id == 1); - - var pdfReportFile = await this.pdfReportService.GetPdfReportFile(pdfReportResponse); - if (pdfReportFile != null) - { - string fileName = this.GenerateCertificateName(certificateDetails.ActivityDetailedItemViewModel.Title); - return this.File(pdfReportFile, FileHelper.GetContentTypeFromFileName(fileName), fileName); - } - } - } - - return this.View("LearningCertificate", certificateDetails); - } - - /// - /// Gets the Certificate name. - /// - /// The resourceTitile. - /// The . - private string GenerateCertificateName(string resourceTitile) - { - if (!string.IsNullOrEmpty(resourceTitile)) - { - if (resourceTitile.Length <= 71) - { - string filename = "LH_Certificate_" + resourceTitile + ".pdf"; - return filename; - } - else if (resourceTitile.Length > 71) - { - string filename = "LH_Certificate_" + resourceTitile.Truncate(67, true) + "_ " + ".pdf"; - return filename; - } - } - - return "LearningCertificate.pdf"; - } - } -} \ No newline at end of file diff --git a/LearningHub.Nhs.WebUI/Interfaces/IMyLearningService.cs b/LearningHub.Nhs.WebUI/Interfaces/IMyLearningService.cs index 773b4791..ad61e4ef 100644 --- a/LearningHub.Nhs.WebUI/Interfaces/IMyLearningService.cs +++ b/LearningHub.Nhs.WebUI/Interfaces/IMyLearningService.cs @@ -48,5 +48,12 @@ public interface IMyLearningService /// The userId. /// The . Task> GetResourceCertificateDetails(int resourceReferenceId, int? majorVersion = 0, int? minorVersion = 0, int? userId = 0); + + /// + /// Gets the resource URL for a given resource reference ID. + /// + /// resourceReferenceId. + /// The . + string GetResourceUrl(int resourceReferenceId); } } \ No newline at end of file diff --git a/LearningHub.Nhs.WebUI/Models/MyLearningUserActivitiesViewModel.cs b/LearningHub.Nhs.WebUI/Models/MyLearningUserActivitiesViewModel.cs index 8aa35c88..0042021c 100644 --- a/LearningHub.Nhs.WebUI/Models/MyLearningUserActivitiesViewModel.cs +++ b/LearningHub.Nhs.WebUI/Models/MyLearningUserActivitiesViewModel.cs @@ -68,5 +68,55 @@ public MyLearningUserActivitiesViewModel(MyLearningRequestModel requestModel) /// Gets or sets the learning result paging. /// public PagingViewModel MyLearningPaging { get; set; } + + /// + /// sets the list of certificate checkboxes. + /// + /// The . + public List CertificateFilterCheckbox() + { + var checkboxes = new List() + { + new CheckboxListItemViewModel("CertificateEnabled", "Certificate", null), + }; + return checkboxes; + } + + /// + /// sets the list of status checkboxes. + /// + /// The . + public List StatusFilterCheckbox() + { + var checkboxes = new List() + { + new CheckboxListItemViewModel("Complete", "Completed", null), + new CheckboxListItemViewModel("Incomplete", "In progress", null), + }; + return checkboxes; + } + + /// + /// sets the list of type checkboxes. + /// + /// The . + public List TypeFilterCheckbox() + { + var checkboxes = new List() + { + new CheckboxListItemViewModel("Article", "Article", null), + new CheckboxListItemViewModel("Assessment", "Assessment", null), + new CheckboxListItemViewModel("Audio", "Audio", null), + new CheckboxListItemViewModel("Case", "Case", null), + new CheckboxListItemViewModel("Elearning", "elearning", null), + new CheckboxListItemViewModel("File", "File", null), + new CheckboxListItemViewModel("Html", "HTML", null), + new CheckboxListItemViewModel("Image", "Image", null), + new CheckboxListItemViewModel("Video", "Video", null), + new CheckboxListItemViewModel("Weblink", "Weblink", null), + new CheckboxListItemViewModel("Courses", "Courses", null), + }; + return checkboxes; + } } } diff --git a/LearningHub.Nhs.WebUI/Services/MyLearningService.cs b/LearningHub.Nhs.WebUI/Services/MyLearningService.cs index df38b15e..0dfa182e 100644 --- a/LearningHub.Nhs.WebUI/Services/MyLearningService.cs +++ b/LearningHub.Nhs.WebUI/Services/MyLearningService.cs @@ -7,8 +7,10 @@ using System.Threading.Tasks; using elfhHub.Nhs.Models.Common; using LearningHub.Nhs.Models.MyLearning; + using LearningHub.Nhs.WebUI.Configuration; using LearningHub.Nhs.WebUI.Interfaces; using Microsoft.Extensions.Logging; + using Microsoft.Extensions.Options; using Newtonsoft.Json; /// @@ -16,15 +18,19 @@ /// public class MyLearningService : BaseService, IMyLearningService { + private readonly Settings settings; + /// /// Initializes a new instance of the class. /// /// The learningHubHttpClient. /// The Open Api Http Client. /// The logger. - public MyLearningService(ILearningHubHttpClient learningHubHttpClient, IOpenApiHttpClient openApiHttpClient, ILogger logger) + /// The settings. + public MyLearningService(ILearningHubHttpClient learningHubHttpClient, IOpenApiHttpClient openApiHttpClient, ILogger logger, IOptions settings) : base(learningHubHttpClient, openApiHttpClient, logger) { + this.settings = settings.Value; } /// @@ -182,5 +188,15 @@ public async Task> GetResourceCertif return viewModel; } + + /// + /// GetCourseUrl. + /// + /// resourceReference Id. + /// return course URL. + public string GetResourceUrl(int resourceReferenceId) + { + return this.settings.LearningHubWebUiUrl.Trim() + "Resource/" + resourceReferenceId + "/Item"; + } } } diff --git a/LearningHub.Nhs.WebUI/Views/MyLearning/DownloadActivityRecords.cshtml b/LearningHub.Nhs.WebUI/Views/MyLearning/DownloadActivityRecords.cshtml new file mode 100644 index 00000000..02bb9482 --- /dev/null +++ b/LearningHub.Nhs.WebUI/Views/MyLearning/DownloadActivityRecords.cshtml @@ -0,0 +1,1222 @@ +@using LearningHub.Nhs.Models.Enums +@using LearningHub.Nhs.Models.Hierarchy +@using LearningHub.Nhs.Models.Resource.ResourceDisplay +@using LearningHub.Nhs.WebUI.Configuration; +@using LearningHub.Nhs.WebUI.Models +@using LearningHub.Nhs.WebUI.Models.Learning +@using LearningHub.Nhs.WebUI.Helpers; +@using Microsoft.Extensions.Options; +@inject IOptions settings +@model Tuple +@inject LearningHub.Nhs.WebUI.Interfaces.IMoodleApiService moodleApiService; +@inject LearningHub.Nhs.WebUI.Interfaces.IMyLearningService myLearningService; +@{ + ViewData["Title"] = "My learning activity"; + string spacer = string.Empty; + string GetMoodleCourseUrl(int courseId) + { + return moodleApiService.GetCourseUrl(courseId); + } + + string GetResourceUrl(int resourceReferenceId) + { + return myLearningService.GetResourceUrl(resourceReferenceId); + } +} + + + + + + @ViewData["Title"] + + + + + + +
+
+
+
+

Activity report: @Model.Item1.FirstName @Model.Item1.LastName (@Model.Item1.UserName)

+
+ + + +
+
+
+
+
+ @foreach (var activity in Model.Item2.Activities) + { + + var isCompleted = ViewActivityHelper.GetActivityStatusDisplayText(activity) == ActivityStatusEnum.Completed.ToString(); + + var typeLabelClass = isCompleted ? "nhsuk-u-primary-text-color" : "nhsuk-u-secondary-text-color"; + var accessedLabelClass = typeLabelClass; + var tagColorClass = isCompleted ? "nhsuk-tag--green" : "nhsuk-tag--blue"; + var statusText = isCompleted ? "Completed" : "In progress"; + var displayText = isCompleted ? "Completed" : "Accessed"; + + var activityDate = activity.ActivityDate.Date; + var today = DateTime.Today; + var dateTimeText = activityDate == today ? "Today" + : activityDate == today.AddDays(-1) ? "Yesterday" + : activityDate.ToString("dd MMM yyyy"); + +
+ + @if (ViewActivityHelper.GetResourceTypeDesc(activity.ResourceType) == "Course") + { + @activity.Title + } + else + { + @activity.Title + } + +
+
+
+ Type: + + + @ViewActivityHelper.GetResourceTypeDesc(activity.ResourceType) + + + + @displayText: + + + + @dateTimeText + +
+
+ + + @statusText + + +
+
+ @if (ViewActivityHelper.GetResourceTypeDesc(activity.ResourceType) == "Course") + { +
+
+
+ } + + + @if (ViewActivityHelper.CanCertificateawarded(activity)) + { + +
+ + + + + + + + + + + + + + + Certificate: + awarded [@dateTimeText] + +
+ + } + else + { +
+ @if (ViewActivityHelper.GetResourceTypeDesc(activity.ResourceType) == "Course") + { +
@activity.TotalActivities of @activity.CompletedActivities activities completed
+ } + else + { +
+ No certificate available +
+ } + @if (activity.CertificateEnabled == true) + { +
+ Includes a certificate + + + + + + + + + + + + + + + + + +
+ } +
+ } +
+
+
+
+
+ } +
+
+
+
+
\ No newline at end of file diff --git a/LearningHub.Nhs.WebUI/Views/MyLearning/Index.cshtml b/LearningHub.Nhs.WebUI/Views/MyLearning/Index.cshtml index 93df45e8..3c44a837 100644 --- a/LearningHub.Nhs.WebUI/Views/MyLearning/Index.cshtml +++ b/LearningHub.Nhs.WebUI/Views/MyLearning/Index.cshtml @@ -1,9 +1,11 @@ @using LearningHub.Nhs.Models.Enums @using LearningHub.Nhs.WebUI.Helpers @using LearningHub.Nhs.WebUI.Models +@using LearningHub.Nhs.WebUI.Models.Learning @inject LearningHub.Nhs.WebUI.Interfaces.IMoodleApiService moodleApiService; @model MyLearningUserActivitiesViewModel; @{ + ViewData["Title"] = "Recent learning"; var returnUrl = $"{Context.Request.Path}{Context.Request.QueryString}"; string GetMoodleCourseUrl(int courseId) { @@ -38,42 +40,60 @@
-
+
-
+
@await Component.InvokeAsync("SideNav", new { groupTitle = "Activity" })
-
-
-

Recent learning

+
+
+

Recent learning

-
- Show - - - All - - - - In progress - - - - Completed - +
+
+
+
+ No certificate available +
+ + Clear all filters + +
+
+ + + + Filter results + + + +
+
+ +
+ +
+ +
+ +
+
-
-
+
+ +
+
+
@@ -141,22 +161,22 @@ @if (ViewActivityHelper.CanCertificateawarded(activity)) { -
+
- - - - - - - + + + + + + + - - + + - Certificate: + Certificate: awarded [@dateTimeText]
@@ -164,10 +184,10 @@ } else { -
+
@if (ViewActivityHelper.GetResourceTypeDesc(activity.ResourceType) == "Course") { -
@activity.TotalActivities of @activity.CompletedActivities activities completed
+
@activity.TotalActivities of @activity.CompletedActivities activities completed
} else { @@ -179,6 +199,7 @@ {
Includes a certificate + @@ -193,7 +214,8 @@ - + +
}
@@ -208,7 +230,7 @@
@await Html.PartialAsync("_ActivityTablePaging", Model) -
Not seeing what you are looking for? Go to learning history
+
Not seeing what you are looking for? Go to learning history
diff --git a/LearningHub.Nhs.WebUI/Views/MyLearning/LearningHistory.cshtml b/LearningHub.Nhs.WebUI/Views/MyLearning/LearningHistory.cshtml index 93df45e8..304c466a 100644 --- a/LearningHub.Nhs.WebUI/Views/MyLearning/LearningHistory.cshtml +++ b/LearningHub.Nhs.WebUI/Views/MyLearning/LearningHistory.cshtml @@ -1,14 +1,18 @@ @using LearningHub.Nhs.Models.Enums @using LearningHub.Nhs.WebUI.Helpers @using LearningHub.Nhs.WebUI.Models +@using LearningHub.Nhs.WebUI.Models.Learning @inject LearningHub.Nhs.WebUI.Interfaces.IMoodleApiService moodleApiService; @model MyLearningUserActivitiesViewModel; @{ + ViewData["Title"] = "Learning history"; + var errorHasOccurred = !ViewData.ModelState.IsValid; var returnUrl = $"{Context.Request.Path}{Context.Request.QueryString}"; string GetMoodleCourseUrl(int courseId) { return moodleApiService.GetCourseUrl(courseId); } + var routeData = ViewActivityHelper.GetActivityParameters(Model); } @section styles { @@ -38,43 +42,123 @@
-
+
-
+
@await Component.InvokeAsync("SideNav", new { groupTitle = "Activity" })
-
-
-

Recent learning

+
+
+

Learning history

+ +
+ @if (errorHasOccurred) + { + + } +

+ You can use this page to search and filter learning resources you've accessed, download certificates and generate a report + of your activity. +

+ +
+ + + Learn how to manage My learning + + +
+

My learning displays an itemised activity table. This table details everything you have accessed in the Learning Hub.

+

You can search your learning activity by entering a search term in the search box. This will only search your learning activity and not the entire Learning Hub. Results will be displayed placing your search term as the filter. To return to your full Itemised activity, either select clear all filters or uncheck your search term(s).

+
+
+ +

+ Download a report of your learning. +

+ @if (Model.TotalCount != 0) + { +
+ +
+ } + else + { + + } + +
+ +

Search within My learning

+
+ + + + +
+

@Model.TotalCount activity result@(Model.TotalCount > 1 ? "s" : "")

+
+
+
-
- Show - - - All - - - - In progress - - - - Completed - +
+
+ +
+
+ Sorted by Date order +
+ + Clear all filters + +
+
+ + + Filter results + + + +
+
+ +
+ +
+ +
+
+ +
+ +
+
-
-
-
+
+ +
+
@foreach (var activity in Model.Activities) @@ -141,22 +225,22 @@ @if (ViewActivityHelper.CanCertificateawarded(activity)) { -
+
- - - - - - - + + + + + + + - - + + - Certificate: + Certificate: awarded [@dateTimeText]
@@ -164,7 +248,7 @@ } else { -
+
@if (ViewActivityHelper.GetResourceTypeDesc(activity.ResourceType) == "Course") {
@activity.TotalActivities of @activity.CompletedActivities activities completed
@@ -179,21 +263,23 @@ {
Includes a certificate - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + +
}
@@ -207,8 +293,7 @@
- @await Html.PartialAsync("_ActivityTablePaging", Model) -
Not seeing what you are looking for? Go to learning history
+ @await Html.PartialAsync("LearningHistoryPaging", Model)
diff --git a/LearningHub.Nhs.WebUI/Views/MyLearning/LearningHistoryPaging.cshtml b/LearningHub.Nhs.WebUI/Views/MyLearning/LearningHistoryPaging.cshtml new file mode 100644 index 00000000..0a4b5ccb --- /dev/null +++ b/LearningHub.Nhs.WebUI/Views/MyLearning/LearningHistoryPaging.cshtml @@ -0,0 +1,76 @@ +@using System.Web; +@using LearningHub.Nhs.WebUI.Models.Learning +@using LearningHub.Nhs.WebUI.Models.Search; +@model MyLearningUserActivitiesViewModel; + + +@{ + var pagingModel = Model.MyLearningPaging; + var showPaging = pagingModel.CurrentPage >= 0 && pagingModel.CurrentPage <= pagingModel.TotalPages - 1; + var previousMessage = $"{pagingModel.CurrentPage} of {pagingModel.TotalPages}"; + int CurrentPageNumber = pagingModel.CurrentPage + 1; + var nextMessage = string.Empty; + if (CurrentPageNumber <= pagingModel.TotalPages) + { + nextMessage = $"{CurrentPageNumber + 1} of {pagingModel.TotalPages}"; + } + else + { + previousMessage = $"{CurrentPageNumber - 1} of {pagingModel.TotalPages}"; + nextMessage = $"{CurrentPageNumber} of {pagingModel.TotalPages}"; + } + + var routeData = ViewActivityHelper.GetActivityParameters(Model); + routeData["CurrentPageIndex"] = pagingModel.CurrentPage.ToString(); + var nextRouteData = new Dictionary(routeData); + var previousRouteData = new Dictionary(routeData); + nextRouteData["MyLearningFormActionType"] = MyLearningFormActionTypeEnum.NextPageChange.ToString(); + previousRouteData["MyLearningFormActionType"] = MyLearningFormActionTypeEnum.PreviousPageChange.ToString(); +} + +@if (pagingModel.TotalPages > 1) +{ + +} \ No newline at end of file diff --git a/LearningHub.Nhs.WebUI/Views/Shared/Components/SideNav/Default.cshtml b/LearningHub.Nhs.WebUI/Views/Shared/Components/SideNav/Default.cshtml index bef06e64..9cd547e6 100644 --- a/LearningHub.Nhs.WebUI/Views/Shared/Components/SideNav/Default.cshtml +++ b/LearningHub.Nhs.WebUI/Views/Shared/Components/SideNav/Default.cshtml @@ -3,8 +3,8 @@ @foreach (var group in Model.Groups) { - - + +