From c58cfe7a534e2cdfc3d2584273c5902ba3d67ce8 Mon Sep 17 00:00:00 2001 From: binon Date: Fri, 14 Feb 2025 11:11:54 +0000 Subject: [PATCH 01/61] Configure OpenID Connect authentication using the Moodle user ID, retrieve the currently logged-in user ID, and display enrolled courses on the Learning Hub dashboard. --- .../Controllers/BaseController.cs | 6 + .../Controllers/HomeController.cs | 8 + .../Extensions/ClaimsPrincipalExtensions.cs | 17 ++ .../Interfaces/IDashboardService.cs | 9 + .../Interfaces/IMoodleApiService.cs | 21 +++ .../Interfaces/IMoodleHttpClient.cs | 23 +++ .../Models/DashboardViewModel.cs | 6 + .../Models/MoodleCourseResponseViewModel.cs | 155 ++++++++++++++++++ .../Models/MoodleUserResponseViewModel.cs | 121 ++++++++++++++ .../ServiceCollectionExtension.cs | 2 +- .../Services/DashboardService.cs | 25 ++- .../Services/MoodleApiService.cs | 62 +++++++ .../Services/MoodleHttpClient.cs | 87 ++++++++++ .../Startup/AuthenticationConfiguration.cs | 1 + .../Startup/ServiceMappings.cs | 10 ++ .../Views/Home/_CourseEnrolled.cshtml | 76 +++++++++ .../Views/Home/_MyAccessedLearningTray.cshtml | 22 ++- LearningHub.Nhs.WebUI/appsettings.json | 7 +- 18 files changed, 653 insertions(+), 5 deletions(-) create mode 100644 LearningHub.Nhs.WebUI/Interfaces/IMoodleApiService.cs create mode 100644 LearningHub.Nhs.WebUI/Interfaces/IMoodleHttpClient.cs create mode 100644 LearningHub.Nhs.WebUI/Models/MoodleCourseResponseViewModel.cs create mode 100644 LearningHub.Nhs.WebUI/Models/MoodleUserResponseViewModel.cs create mode 100644 LearningHub.Nhs.WebUI/Services/MoodleApiService.cs create mode 100644 LearningHub.Nhs.WebUI/Services/MoodleHttpClient.cs create mode 100644 LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml diff --git a/LearningHub.Nhs.WebUI/Controllers/BaseController.cs b/LearningHub.Nhs.WebUI/Controllers/BaseController.cs index 8972fa822..6b3ad9a20 100644 --- a/LearningHub.Nhs.WebUI/Controllers/BaseController.cs +++ b/LearningHub.Nhs.WebUI/Controllers/BaseController.cs @@ -3,6 +3,7 @@ using System.Net.Http; using LearningHub.Nhs.Models.Extensions; using LearningHub.Nhs.WebUI.Configuration; + using LearningHub.Nhs.WebUI.Extensions; using LearningHub.Nhs.WebUI.Filters; using LearningHub.Nhs.WebUI.Helpers; using LearningHub.Nhs.WebUI.Models; @@ -76,6 +77,11 @@ protected BaseController( /// protected int CurrentUserId => this.User.Identity.GetCurrentUserId(); + /// + /// Gets the CurrentUserId. + /// + protected int CurrentMoodleUserId => this.User.Identity.GetMoodleUserId(); + /// /// The OnActionExecuting. /// diff --git a/LearningHub.Nhs.WebUI/Controllers/HomeController.cs b/LearningHub.Nhs.WebUI/Controllers/HomeController.cs index 87d01e668..af3164ec2 100644 --- a/LearningHub.Nhs.WebUI/Controllers/HomeController.cs +++ b/LearningHub.Nhs.WebUI/Controllers/HomeController.cs @@ -207,6 +207,13 @@ public async Task Index(string myLearningDashboard = "my-in-progr var resourcesTask = this.dashboardService.GetResourcesAsync(resourceDashboard, 1); var cataloguesTask = this.dashboardService.GetCataloguesAsync(catalogueDashboard, 1); + var enrolledCoursesTask = Task.FromResult(new List()); + + if (myLearningDashboard == "my-enrolled-courses") + { + enrolledCoursesTask = this.dashboardService.GetEnrolledCoursesFromMoodleAsync(this.CurrentMoodleUserId, 1); + } + await Task.WhenAll(learningTask, resourcesTask, cataloguesTask); var model = new DashboardViewModel() @@ -214,6 +221,7 @@ public async Task Index(string myLearningDashboard = "my-in-progr MyLearnings = await learningTask, Resources = await resourcesTask, Catalogues = await cataloguesTask, + EnrolledCourses = await enrolledCoursesTask, }; if (!string.IsNullOrEmpty(this.Request.Query["preview"]) && Convert.ToBoolean(this.Request.Query["preview"])) diff --git a/LearningHub.Nhs.WebUI/Extensions/ClaimsPrincipalExtensions.cs b/LearningHub.Nhs.WebUI/Extensions/ClaimsPrincipalExtensions.cs index 30653fcbc..186c54eb8 100644 --- a/LearningHub.Nhs.WebUI/Extensions/ClaimsPrincipalExtensions.cs +++ b/LearningHub.Nhs.WebUI/Extensions/ClaimsPrincipalExtensions.cs @@ -2,6 +2,7 @@ { using System; using System.Security.Claims; + using System.Security.Principal; /// /// Defines the . @@ -23,5 +24,21 @@ public static string GetTimezoneOffsetCacheKey(this ClaimsPrincipal claimsPrinci return $"usr_{userId}_tz"; } + + /// + /// Get MoodleUserId. + /// + /// The identity. + /// The System.Int32. + public static int GetMoodleUserId(this IIdentity identity) + { + Claim claim = (identity as ClaimsIdentity)?.FindFirst("moodle_username"); + if (claim != null) + { + return int.Parse(claim.Value); + } + + return 0; + } } } \ No newline at end of file diff --git a/LearningHub.Nhs.WebUI/Interfaces/IDashboardService.cs b/LearningHub.Nhs.WebUI/Interfaces/IDashboardService.cs index de8996766..9eb8c3266 100644 --- a/LearningHub.Nhs.WebUI/Interfaces/IDashboardService.cs +++ b/LearningHub.Nhs.WebUI/Interfaces/IDashboardService.cs @@ -1,5 +1,6 @@ namespace LearningHub.Nhs.WebUI.Interfaces { + using System.Collections.Generic; using System.Threading.Tasks; using LearningHub.Nhs.Models.Dashboard; using LearningHub.Nhs.WebUI.Models; @@ -39,5 +40,13 @@ public interface IDashboardService /// dashboardEventViewModel. /// A representing the result of the asynchronous operation. Task RecordDashBoardEventAsync(DashboardEventViewModel dashboardEventViewModel); + + /// + /// GetEnrolledCoursesFromMoodleAsync. + /// + /// The current User Id type. + /// The page Number. + /// A representing the result of the asynchronous operation. + Task> GetEnrolledCoursesFromMoodleAsync(int currentUserId, int pageNumber); } } diff --git a/LearningHub.Nhs.WebUI/Interfaces/IMoodleApiService.cs b/LearningHub.Nhs.WebUI/Interfaces/IMoodleApiService.cs new file mode 100644 index 000000000..78611e622 --- /dev/null +++ b/LearningHub.Nhs.WebUI/Interfaces/IMoodleApiService.cs @@ -0,0 +1,21 @@ +namespace LearningHub.Nhs.WebUI.Interfaces +{ + using System.Collections.Generic; + using System.Threading.Tasks; + using LearningHub.Nhs.Models.Dashboard; + using LearningHub.Nhs.WebUI.Models; + + /// + /// IMoodleApiService. + /// + public interface IMoodleApiService + { + /// + /// GetEnrolledCoursesAsync. + /// + /// Moodle user id. + /// pageNumber. + /// List of MoodleCourseResponseViewModel. + Task> GetEnrolledCoursesAsync(int currentUserId, int pageNumber); + } +} diff --git a/LearningHub.Nhs.WebUI/Interfaces/IMoodleHttpClient.cs b/LearningHub.Nhs.WebUI/Interfaces/IMoodleHttpClient.cs new file mode 100644 index 000000000..3348a20a9 --- /dev/null +++ b/LearningHub.Nhs.WebUI/Interfaces/IMoodleHttpClient.cs @@ -0,0 +1,23 @@ +namespace LearningHub.Nhs.Services.Interface +{ + using System.Net.Http; + using System.Threading.Tasks; + + /// + /// The Moodle Http Client interface. + /// + public interface IMoodleHttpClient + { + /// + /// The get cient async. + /// + /// The . + Task GetClient(); + + /// + /// GetDefaultParameters. + /// + /// defaultParameters. + string GetDefaultParameters(); + } +} \ No newline at end of file diff --git a/LearningHub.Nhs.WebUI/Models/DashboardViewModel.cs b/LearningHub.Nhs.WebUI/Models/DashboardViewModel.cs index c1358827f..9ac98c7e0 100644 --- a/LearningHub.Nhs.WebUI/Models/DashboardViewModel.cs +++ b/LearningHub.Nhs.WebUI/Models/DashboardViewModel.cs @@ -1,5 +1,6 @@ namespace LearningHub.Nhs.WebUI.Models { + using System.Collections.Generic; using LearningHub.Nhs.Models.Dashboard; /// @@ -28,5 +29,10 @@ public DashboardViewModel() /// Gets or sets a list of catalogues to be displayed in the dashboard. /// public DashboardCatalogueResponseViewModel Catalogues { get; set; } + + /// + /// Gets or sets a list of enrolled courses to be displayed in the dashboard. + /// + public List EnrolledCourses { get; set; } } } diff --git a/LearningHub.Nhs.WebUI/Models/MoodleCourseResponseViewModel.cs b/LearningHub.Nhs.WebUI/Models/MoodleCourseResponseViewModel.cs new file mode 100644 index 000000000..7142f8137 --- /dev/null +++ b/LearningHub.Nhs.WebUI/Models/MoodleCourseResponseViewModel.cs @@ -0,0 +1,155 @@ +namespace LearningHub.Nhs.WebUI.Models +{ + using System.Collections.Generic; + + /// + /// MoodleCourseResponseViewModel. + /// + public class MoodleCourseResponseViewModel + { + /// + /// Gets or sets the ID. + /// + public int? Id { get; set; } + + /// + /// Gets or sets the short name. + /// + public string ShortName { get; set; } + + /// + /// Gets or sets the full name. + /// + public string FullName { get; set; } + + /// + /// Gets or sets the display name. + /// + public string DisplayName { get; set; } + + /// + /// Gets or sets the enrolled user count. + /// + public int? EnrolledUserCount { get; set; } + + /// + /// Gets or sets the ID number. + /// + public string IdNumber { get; set; } + + /// + /// Gets or sets the visibility status. + /// + public int? Visible { get; set; } + + /// + /// Gets or sets the summary. + /// + public string Summary { get; set; } + + /// + /// Gets or sets the summary format. + /// + public int? SummaryFormat { get; set; } + + /// + /// Gets or sets the format. + /// + public string Format { get; set; } + + /// + /// Gets or sets the course image URL. + /// + public string CourseImage { get; set; } + + /// + /// Gets or sets a value indicating whether grades are shown. + /// + public bool? ShowGrades { get; set; } + + /// + /// Gets or sets the language. + /// + public string Lang { get; set; } + + /// + /// Gets or sets a value indicating whether completion is enabled. + /// + public bool? EnableCompletion { get; set; } + + /// + /// Gets or sets a value indicating whether completion has criteria. + /// + public bool? CompletionHasCriteria { get; set; } + + /// + /// Gets or sets a value indicating whether completion is user-tracked. + /// + public bool? CompletionUserTracked { get; set; } + + /// + /// Gets or sets the category ID. + /// + public int? Category { get; set; } + + /// + /// Gets or sets the progress. + /// + public int? Progress { get; set; } + + /// + /// Gets or sets the completion status. + /// + public bool? Completed { get; set; } + + /// + /// Gets or sets the start date (Unix timestamp). + /// + public long? StartDate { get; set; } + + /// + /// Gets or sets the end date. + /// + public int? EndDate { get; set; } + + /// + /// Gets or sets the marker. + /// + public int? Marker { get; set; } + + /// + /// Gets or sets the last access timestamp. + /// + public int? LastAccess { get; set; } + + /// + /// Gets or sets a value indicating whether the course is a favorite. + /// + public bool? IsFavourite { get; set; } + + /// + /// Gets or sets a value indicating whether the course is hidden. + /// + public bool? Hidden { get; set; } + + /// + /// Gets or sets the overview files. + /// + public List OverviewFiles { get; set; } + + /// + /// Gets or sets a value indicating whether activity dates are shown. + /// + public bool? ShowActivityDates { get; set; } + + /// + /// Gets or sets a value indicating whether completion conditions are shown. + /// + public bool? ShowCompletionConditions { get; set; } + + /// + /// Gets or sets the last modified timestamp (Unix timestamp). + /// + public long? TimeModified { get; set; } + } +} diff --git a/LearningHub.Nhs.WebUI/Models/MoodleUserResponseViewModel.cs b/LearningHub.Nhs.WebUI/Models/MoodleUserResponseViewModel.cs new file mode 100644 index 000000000..7940dc725 --- /dev/null +++ b/LearningHub.Nhs.WebUI/Models/MoodleUserResponseViewModel.cs @@ -0,0 +1,121 @@ +namespace LearningHub.Nhs.WebUI.Models +{ + using System.Collections.Generic; + + /// + /// MoodleUserResponseViewModel. + /// + public class MoodleUserResponseViewModel + { + /// + /// Gets or sets the list of users. + /// + public List Users { get; set; } + + /// + /// Gets or sets the warnings. + /// + public List Warnings { get; set; } + + /// + /// MoodleUser. + /// + public class MoodleUser + { + /// + /// Gets or sets the user ID. + /// + public int Id { get; set; } + + /// + /// Gets or sets the username. + /// + public string Username { get; set; } + + /// + /// Gets or sets the first name. + /// + public string FirstName { get; set; } + + /// + /// Gets or sets the last name. + /// + public string LastName { get; set; } + + /// + /// Gets or sets the full name. + /// + public string FullName { get; set; } + + /// + /// Gets or sets the email. + /// + public string Email { get; set; } + + /// + /// Gets or sets the department. + /// + public string Department { get; set; } + + /// + /// Gets or sets the first access timestamp. + /// + public long FirstAccess { get; set; } + + /// + /// Gets or sets the last access timestamp. + /// + public long LastAccess { get; set; } + + /// + /// Gets or sets the authentication method. + /// + public string Auth { get; set; } + + /// + /// Gets or sets a value indicating whether the user is suspended. + /// + public bool Suspended { get; set; } + + /// + /// Gets or sets a value indicating whether the user is confirmed. + /// + public bool Confirmed { get; set; } + + /// + /// Gets or sets the language. + /// + public string Lang { get; set; } + + /// + /// Gets or sets the theme. + /// + public string Theme { get; set; } + + /// + /// Gets or sets the timezone. + /// + public string Timezone { get; set; } + + /// + /// Gets or sets the mail format. + /// + public int MailFormat { get; set; } + + /// + /// Gets or sets the forum tracking preference. + /// + public int TrackForums { get; set; } + + /// + /// Gets or sets the small profile image URL. + /// + public string ProfileImageUrlSmall { get; set; } + + /// + /// Gets or sets the profile image URL. + /// + public string ProfileImageUrl { get; set; } + } + } +} diff --git a/LearningHub.Nhs.WebUI/ServiceCollectionExtension.cs b/LearningHub.Nhs.WebUI/ServiceCollectionExtension.cs index aa90f135e..1ffbc216f 100644 --- a/LearningHub.Nhs.WebUI/ServiceCollectionExtension.cs +++ b/LearningHub.Nhs.WebUI/ServiceCollectionExtension.cs @@ -132,8 +132,8 @@ public static void ConfigureServices(this IServiceCollection services, IConfigur }); services.AddControllersWithViews().AddNewtonsoftJson(); - services.AddControllersWithViews().AddRazorRuntimeCompilation(); + // services.AddControllersWithViews().AddRazorRuntimeCompilation(); services.AddFeatureManagement(); } } diff --git a/LearningHub.Nhs.WebUI/Services/DashboardService.cs b/LearningHub.Nhs.WebUI/Services/DashboardService.cs index f3ffdbc3a..55f5153bf 100644 --- a/LearningHub.Nhs.WebUI/Services/DashboardService.cs +++ b/LearningHub.Nhs.WebUI/Services/DashboardService.cs @@ -1,10 +1,15 @@ namespace LearningHub.Nhs.WebUI.Services { using System; + using System.Collections.Generic; + using System.Net.Http; + using System.Runtime.InteropServices.WindowsRuntime; using System.Text; using System.Threading.Tasks; using LearningHub.Nhs.Models.Dashboard; using LearningHub.Nhs.Models.Entities.Analytics; + using LearningHub.Nhs.Models.Entities.Reporting; + using LearningHub.Nhs.Services.Interface; using LearningHub.Nhs.WebUI.Interfaces; using LearningHub.Nhs.WebUI.Models; using Microsoft.Extensions.Logging; @@ -15,14 +20,18 @@ /// public class DashboardService : BaseService, IDashboardService { + private readonly IMoodleHttpClient moodleHttpClient; + /// /// Initializes a new instance of the class. /// /// learningHubHttpClient. /// logger. - public DashboardService(ILearningHubHttpClient learningHubHttpClient, ILogger logger) + /// MoodleHttpClient. + public DashboardService(ILearningHubHttpClient learningHubHttpClient, ILogger logger, IMoodleHttpClient moodleHttpClient) : base(learningHubHttpClient, logger) { + this.moodleHttpClient = moodleHttpClient; } /// @@ -112,6 +121,20 @@ public async Task GetResourcesAsync(string d return viewmodel; } + /// + /// GetEnrolledCoursesFromMoodleAsync. + /// + /// The dashboard type. + /// The page Number. + /// A representing the result of the asynchronous operation. + public async Task> GetEnrolledCoursesFromMoodleAsync(int currentUserId, int pageNumber) + { + List viewmodel = new List { }; + MoodleApiService moodleApiService = new MoodleApiService(this.moodleHttpClient); + viewmodel = await moodleApiService.GetEnrolledCoursesAsync(currentUserId, pageNumber); + return viewmodel; + } + /// /// Logs Dashboared viewed event. /// diff --git a/LearningHub.Nhs.WebUI/Services/MoodleApiService.cs b/LearningHub.Nhs.WebUI/Services/MoodleApiService.cs new file mode 100644 index 000000000..f46163d89 --- /dev/null +++ b/LearningHub.Nhs.WebUI/Services/MoodleApiService.cs @@ -0,0 +1,62 @@ +namespace LearningHub.Nhs.WebUI.Services +{ + using System; + using System.Collections.Generic; + using System.Net.Http; + using System.Threading.Tasks; + using LearningHub.Nhs.Services.Interface; + using LearningHub.Nhs.WebUI.Interfaces; + using LearningHub.Nhs.WebUI.Models; + using Microsoft.Extensions.Configuration; + using Microsoft.Extensions.Logging; + using Newtonsoft.Json; + + /// + /// MoodleApiService. + /// + public class MoodleApiService : IMoodleApiService + { + private readonly IMoodleHttpClient moodleHttpClient; + + /// + /// Initializes a new instance of the class. + /// + /// moodleHttpClient. + public MoodleApiService(IMoodleHttpClient moodleHttpClient) + { + this.moodleHttpClient = moodleHttpClient; + } + + /// + /// GetEnrolledCoursesAsync. + /// + /// Moodle user id. + /// The page Number. + /// A representing the result of the asynchronous operation. + public async Task> GetEnrolledCoursesAsync(int userId, int pageNumber) + { + List viewmodel = new List { }; + MoodleApiService moodleApiService = new MoodleApiService(this.moodleHttpClient); + + var client = await this.moodleHttpClient.GetClient(); + string additionalParameters = $"userid={userId}"; + string defaultParameters = this.moodleHttpClient.GetDefaultParameters(); + string url = $"&wsfunction=core_enrol_get_users_courses&{additionalParameters}"; + + HttpResponseMessage response = await client.GetAsync("?" + defaultParameters + url); + + if (response.IsSuccessStatusCode) + { + var result = response.Content.ReadAsStringAsync().Result; + viewmodel = JsonConvert.DeserializeObject>(result); + } + else if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized || + response.StatusCode == System.Net.HttpStatusCode.Forbidden) + { + throw new Exception("AccessDenied"); + } + + return viewmodel; + } + } +} diff --git a/LearningHub.Nhs.WebUI/Services/MoodleHttpClient.cs b/LearningHub.Nhs.WebUI/Services/MoodleHttpClient.cs new file mode 100644 index 000000000..9ffe8a8fd --- /dev/null +++ b/LearningHub.Nhs.WebUI/Services/MoodleHttpClient.cs @@ -0,0 +1,87 @@ +namespace LearningHub.Nhs.Services +{ + using System; + using System.Net.Http; + using System.Net.Http.Headers; + using System.Threading.Tasks; + using LearningHub.Nhs.Services.Interface; + using Microsoft.Extensions.Configuration; + + /// + /// The Moodle Http Client. + /// + public class MoodleHttpClient : IMoodleHttpClient, IDisposable + { + private readonly HttpClient httpClient = new (); + private bool initialised = false; + private string moodleAPIBaseUrl; + private string moodleAPIMoodleWSRestFormat; + private string moodleAPIWSToken; + + /// + /// Initializes a new instance of the class. + /// + /// httpClient. + /// config. + public MoodleHttpClient(HttpClient httpClient, IConfiguration config) + { + this.httpClient = httpClient; + this.moodleAPIBaseUrl = config["MoodleAPIConfig:BaseUrl"]; + this.moodleAPIMoodleWSRestFormat = config["MoodleAPIConfig:MoodleWSRestFormat"]; + this.moodleAPIWSToken = config["MoodleAPIConfig:WSToken"]; + } + + /// + /// The Get Client method. + /// + /// The . + public async Task GetClient() + { + this.Initialise(this.moodleAPIBaseUrl); + return this.httpClient; + } + + /// + /// GetDefaultParameters. + /// + /// defaultParameters. + public string GetDefaultParameters() + { + string defaultParameters = $"wstoken={this.moodleAPIWSToken}" + + $"&moodlewsrestformat={this.moodleAPIMoodleWSRestFormat}"; + + return defaultParameters; + } + + /// + public void Dispose() + { + this.Dispose(true); + GC.SuppressFinalize(this); + } + + /// + /// The dispoase. + /// + /// disposing. + protected virtual void Dispose(bool disposing) + { + if (disposing) + { + this.httpClient.Dispose(); + } + } + + private void Initialise(string httpClientUrl) + { + if (this.initialised == false) + { + this.httpClient.BaseAddress = new Uri(httpClientUrl); + this.httpClient.DefaultRequestHeaders.Accept.Clear(); + this.httpClient.DefaultRequestHeaders.Accept.Add( + new MediaTypeWithQualityHeaderValue("application/json")); + this.initialised = true; + } + } + } +} diff --git a/LearningHub.Nhs.WebUI/Startup/AuthenticationConfiguration.cs b/LearningHub.Nhs.WebUI/Startup/AuthenticationConfiguration.cs index 40caab241..5664f7929 100644 --- a/LearningHub.Nhs.WebUI/Startup/AuthenticationConfiguration.cs +++ b/LearningHub.Nhs.WebUI/Startup/AuthenticationConfiguration.cs @@ -68,6 +68,7 @@ public static void ConfigureAuthentication(this IServiceCollection services, Lea options.ClaimActions.MapUniqueJsonKey("role", "role"); options.ClaimActions.MapUniqueJsonKey("name", "elfh_userName"); + options.ClaimActions.MapUniqueJsonKey("moodle_username", "preferred_username"); options.TokenValidationParameters = new TokenValidationParameters { NameClaimType = JwtClaimTypes.Name, diff --git a/LearningHub.Nhs.WebUI/Startup/ServiceMappings.cs b/LearningHub.Nhs.WebUI/Startup/ServiceMappings.cs index a0cc16237..fdab0fc8a 100644 --- a/LearningHub.Nhs.WebUI/Startup/ServiceMappings.cs +++ b/LearningHub.Nhs.WebUI/Startup/ServiceMappings.cs @@ -3,6 +3,8 @@ using System.Net.Http; using GDS.MultiPageFormData; using LearningHub.Nhs.Models.OpenAthens; + using LearningHub.Nhs.Services; + using LearningHub.Nhs.Services.Interface; using LearningHub.Nhs.WebUI.Filters; using LearningHub.Nhs.WebUI.Helpers; using LearningHub.Nhs.WebUI.Interfaces; @@ -52,12 +54,20 @@ public static void AddLearningHubMappings(this IServiceCollection services, ICon ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator, }); + services.AddHttpClient() + .ConfigurePrimaryHttpMessageHandler( + () => new HttpClientHandler + { + ServerCertificateCustomValidationCallback = + HttpClientHandler.DangerousAcceptAnyServerCertificateValidator, + }); } else { services.AddHttpClient(); services.AddHttpClient(); services.AddHttpClient(); + services.AddHttpClient(); } // Config diff --git a/LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml b/LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml new file mode 100644 index 000000000..becbbf8a4 --- /dev/null +++ b/LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml @@ -0,0 +1,76 @@ +@using LearningHub.Nhs.Models.Dashboard +@using LearningHub.Nhs.WebUI.Extensions +@using LearningHub.Nhs.WebUI.Helpers +@model MoodleCourseResponseViewModel +@{ + bool providerExists = false; + string cardStyle = "card-provider-details--blank"; +} +
+
+ @if (!string.IsNullOrWhiteSpace(Model.CourseImage)) + { + @Model.CourseImage + } + else + { +
+ } +
+ @if (providerExists) + { +
+
+ } + else + { +
+ } + +
+

+ @Model.DisplayName +

+
+ +
+ @UtilityHelper.StripHtmlFromString(Model.Summary) +
+ +
+ Completed: @Model.Completed +
+ +
+
+
+ @* @if (Model.RestrictedAccess) + { +
@((Model.HasAccess || this.User.IsInRole("Administrator")) ? "Access granted" : "Access restricted")
+ } *@ +
+ +
+
+ @* @if (providerExists) + { + var provider = @Model.Providers.First(); + @provider.Name catalogue badge + } + else if (!string.IsNullOrEmpty(Model.BadgeUrl)) + { + Provider's catalogue badge + } *@ +
+
+
+
+
\ No newline at end of file diff --git a/LearningHub.Nhs.WebUI/Views/Home/_MyAccessedLearningTray.cshtml b/LearningHub.Nhs.WebUI/Views/Home/_MyAccessedLearningTray.cshtml index adefabd93..cd58e33b2 100644 --- a/LearningHub.Nhs.WebUI/Views/Home/_MyAccessedLearningTray.cshtml +++ b/LearningHub.Nhs.WebUI/Views/Home/_MyAccessedLearningTray.cshtml @@ -14,6 +14,8 @@ return "Certificates"; case "my-catalogues": return "Catalogues"; + case "my-enrolled-courses": + return "Enrolled Courses"; default: return "In Progress"; } @@ -37,7 +39,7 @@
-
@@ -90,7 +96,19 @@ } } - + + } + else if (Model.EnrolledCourses?.Count() > 0) + { +
    + + @foreach (var enrolledCourses in Model.EnrolledCourses) + { +
  • + +
  • + } +
} else { diff --git a/LearningHub.Nhs.WebUI/appsettings.json b/LearningHub.Nhs.WebUI/appsettings.json index af3d9e063..57c00c7be 100644 --- a/LearningHub.Nhs.WebUI/appsettings.json +++ b/LearningHub.Nhs.WebUI/appsettings.json @@ -126,6 +126,11 @@ "ClientId": "LearningHubOAClient" } }, + "MoodleAPIConfig": { + "BaseUrl": "", + "MoodleWSRestFormat": "json", + "WSToken": "" + }, "AssetDetails": { "FilePath1": "145b58b5-2f3c-4c56-850e-ea5bd6dd232b", "FileName1": "Learning Hub Resource structure for search.docx", @@ -158,5 +163,5 @@ "FeatureManagement": { "ContributeAudioVideoResource": true, "DisplayAudioVideoResource": true - } + } } From 0930d3f37e2377051e79b9a4d635549089370b92 Mon Sep 17 00:00:00 2001 From: binon Date: Fri, 14 Feb 2025 15:07:45 +0000 Subject: [PATCH 02/61] Updated the completion status logic --- .../Interfaces/IMoodleApiService.cs | 9 ++ .../MoodleCompletionResponseViewModel.cs | 28 +++++ .../Models/MoodleCourseCompletionViewModel.cs | 103 ++++++++++++++++++ .../Models/MoodleCourseResponseViewModel.cs | 5 + .../Services/MoodleApiService.cs | 45 ++++++++ .../Views/Home/_CourseEnrolled.cshtml | 13 ++- 6 files changed, 201 insertions(+), 2 deletions(-) create mode 100644 LearningHub.Nhs.WebUI/Models/MoodleCompletionResponseViewModel.cs create mode 100644 LearningHub.Nhs.WebUI/Models/MoodleCourseCompletionViewModel.cs diff --git a/LearningHub.Nhs.WebUI/Interfaces/IMoodleApiService.cs b/LearningHub.Nhs.WebUI/Interfaces/IMoodleApiService.cs index 78611e622..d92c01fad 100644 --- a/LearningHub.Nhs.WebUI/Interfaces/IMoodleApiService.cs +++ b/LearningHub.Nhs.WebUI/Interfaces/IMoodleApiService.cs @@ -17,5 +17,14 @@ public interface IMoodleApiService /// pageNumber. /// List of MoodleCourseResponseViewModel. Task> GetEnrolledCoursesAsync(int currentUserId, int pageNumber); + + /// + /// GetEnrolledCoursesAsync. + /// + /// Moodle user id. + /// Moodle course id. + /// pageNumber. + /// List of MoodleCourseResponseViewModel. + Task GetCourseCompletionAsync(int userId, int courseId, int pageNumber); } } diff --git a/LearningHub.Nhs.WebUI/Models/MoodleCompletionResponseViewModel.cs b/LearningHub.Nhs.WebUI/Models/MoodleCompletionResponseViewModel.cs new file mode 100644 index 000000000..1692a32e6 --- /dev/null +++ b/LearningHub.Nhs.WebUI/Models/MoodleCompletionResponseViewModel.cs @@ -0,0 +1,28 @@ +namespace LearningHub.Nhs.WebUI.Models +{ + /// + /// MoodleCompletionResponseViewModel. + /// + public class MoodleCompletionResponseViewModel + { + /// + /// Gets or sets the completion status. + /// + public string Exception { get; set; } + + /// + /// Gets or sets error code. + /// + public string Errorcode { get; set; } + + /// + /// Gets or sets Error message. + /// + public string Message { get; set; } + + /// + /// Gets or sets Debug info. + /// + public string Debuginfo { get; set; } + } +} diff --git a/LearningHub.Nhs.WebUI/Models/MoodleCourseCompletionViewModel.cs b/LearningHub.Nhs.WebUI/Models/MoodleCourseCompletionViewModel.cs new file mode 100644 index 000000000..06eb5cb8f --- /dev/null +++ b/LearningHub.Nhs.WebUI/Models/MoodleCourseCompletionViewModel.cs @@ -0,0 +1,103 @@ +namespace LearningHub.Nhs.WebUI.Models +{ + using System.Collections.Generic; + + /// + /// MoodleCourseCompletionViewModel. + /// + public class MoodleCourseCompletionViewModel + { + /// + /// Gets or sets the completion status. + /// + public CompletStatus CompletionStatus { get; set; } + + /// + /// Gets or sets the list of warnings. + /// + public List Warnings { get; set; } + + /// + /// CompletionStatus. + /// + public class CompletStatus + { + /// + /// Gets or sets a value indicating whether the course is completed. + /// + public bool Completed { get; set; } + + /// + /// Gets or sets the aggregation method. + /// + public int Aggregation { get; set; } + + /// + /// Gets or sets the list of completions. + /// + public List Completions { get; set; } + + /// + /// Completion. + /// + public class Completion + { + /// + /// Gets or sets the type of completion. + /// + public int Type { get; set; } + + /// + /// Gets or sets the title of the completion requirement. + /// + public string Title { get; set; } + + /// + /// Gets or sets the status of the completion. + /// + public string Status { get; set; } + + /// + /// Gets or sets a value indicating whether the requirement is complete. + /// + public bool Complete { get; set; } + + /// + /// Gets or sets the timestamp when completion was achieved. + /// + public long? TimeCompleted { get; set; } + + /// + /// Gets or sets the completion details. + /// + public CompletionDetails Details { get; set; } + + /// + /// CompletionDetails. + /// + public class CompletionDetails + { + /// + /// Gets or sets the type of completion requirement. + /// + public string Type { get; set; } + + /// + /// Gets or sets the criteria for completion. + /// + public string Criteria { get; set; } + + /// + /// Gets or sets the requirement for completion. + /// + public string Requirement { get; set; } + + /// + /// Gets or sets the status of the requirement. + /// + public string Status { get; set; } + } + } + } + } +} \ No newline at end of file diff --git a/LearningHub.Nhs.WebUI/Models/MoodleCourseResponseViewModel.cs b/LearningHub.Nhs.WebUI/Models/MoodleCourseResponseViewModel.cs index 7142f8137..ae253d60a 100644 --- a/LearningHub.Nhs.WebUI/Models/MoodleCourseResponseViewModel.cs +++ b/LearningHub.Nhs.WebUI/Models/MoodleCourseResponseViewModel.cs @@ -151,5 +151,10 @@ public class MoodleCourseResponseViewModel /// Gets or sets the last modified timestamp (Unix timestamp). /// public long? TimeModified { get; set; } + + /// + /// Gets or sets the moodle course completion view model. + /// + public MoodleCourseCompletionViewModel CourseCompletionViewModel { get; set; } } } diff --git a/LearningHub.Nhs.WebUI/Services/MoodleApiService.cs b/LearningHub.Nhs.WebUI/Services/MoodleApiService.cs index f46163d89..4296d915d 100644 --- a/LearningHub.Nhs.WebUI/Services/MoodleApiService.cs +++ b/LearningHub.Nhs.WebUI/Services/MoodleApiService.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Net.Http; using System.Threading.Tasks; + using LearningHub.Nhs.Models.Entities.Reporting; using LearningHub.Nhs.Services.Interface; using LearningHub.Nhs.WebUI.Interfaces; using LearningHub.Nhs.WebUI.Models; @@ -49,6 +50,50 @@ public async Task> GetEnrolledCoursesAsync(i { var result = response.Content.ReadAsStringAsync().Result; viewmodel = JsonConvert.DeserializeObject>(result); + + foreach (var course in viewmodel) + { + course.CourseCompletionViewModel = await moodleApiService.GetCourseCompletionAsync(userId, course.Id.Value, pageNumber); + } + } + else if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized || + response.StatusCode == System.Net.HttpStatusCode.Forbidden) + { + throw new Exception("AccessDenied"); + } + + return viewmodel; + } + + /// + /// GetEnrolledCoursesAsync. + /// + /// Moodle user id. + /// Moodle course id. + /// pageNumber. + /// List of MoodleCourseResponseViewModel. + public async Task GetCourseCompletionAsync(int userId, int courseId, int pageNumber) + { + MoodleCourseCompletionViewModel viewmodel = new MoodleCourseCompletionViewModel { }; + MoodleApiService moodleApiService = new MoodleApiService(this.moodleHttpClient); + + var client = await this.moodleHttpClient.GetClient(); + string additionalParameters = $"userid={userId}&courseid={courseId}"; + string defaultParameters = this.moodleHttpClient.GetDefaultParameters(); + string url = $"&wsfunction=core_completion_get_course_completion_status&{additionalParameters}"; + + HttpResponseMessage response = await client.GetAsync("?" + defaultParameters + url); + + if (response.IsSuccessStatusCode) + { + var result = response.Content.ReadAsStringAsync().Result; + + var canViewReport = JsonConvert.DeserializeObject(result); + + if (string.IsNullOrEmpty(canViewReport.Exception)) + { + viewmodel = JsonConvert.DeserializeObject(result); + } } else if (response.StatusCode == System.Net.HttpStatusCode.Unauthorized || response.StatusCode == System.Net.HttpStatusCode.Forbidden) diff --git a/LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml b/LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml index becbbf8a4..b9047a766 100644 --- a/LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml +++ b/LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml @@ -5,6 +5,15 @@ @{ bool providerExists = false; string cardStyle = "card-provider-details--blank"; + + string GetUrl(int courseId) + { + string host = $"http://localhost"; + string path = $"course/view.php"; + string returnUrl = $@"{host}/{path}?id={courseId}"; + + return returnUrl; + } }
@@ -29,7 +38,7 @@

- @Model.DisplayName + @Model.DisplayName

@@ -38,7 +47,7 @@
- Completed: @Model.Completed + Completed: @Model.CourseCompletionViewModel?.CompletionStatus?.Completed
From fd2937bf2daecf7ecf8352ae28519546a3e0d039 Mon Sep 17 00:00:00 2001 From: binon Date: Wed, 19 Feb 2025 10:52:22 +0000 Subject: [PATCH 03/61] minor tweak on course image display --- .../Views/Home/_CourseEnrolled.cshtml | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml b/LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml index b9047a766..beebfec92 100644 --- a/LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml +++ b/LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml @@ -19,7 +19,16 @@
@if (!string.IsNullOrWhiteSpace(Model.CourseImage)) { - @Model.CourseImage + if (Model.CourseImage.EndsWith(".svg", StringComparison.OrdinalIgnoreCase)) + { + + Fallback image + + } + else + { + Course image + } } else { @@ -48,6 +57,17 @@
Completed: @Model.CourseCompletionViewModel?.CompletionStatus?.Completed + + @if (Model?.CourseCompletionViewModel?.CompletionStatus?.Completions != null) + { + @foreach (var item in Model.CourseCompletionViewModel.CompletionStatus.Completions) + { + if (item.Type == 2) + { +
Target Completion Date: @item.Status
+ } + } + }
From 5ed9358049b436ac0d976288d6c97439f6416b1a Mon Sep 17 00:00:00 2001 From: AnjuJose011 <154979799+AnjuJose011@users.noreply.github.com> Date: Tue, 25 Feb 2025 11:34:35 +0000 Subject: [PATCH 04/61] fixes-TD-5182 --- .../Controllers/PoliciesController.cs | 10 ++++ .../AIGeneratedImagesStatement.cshtml | 56 +++++++++++++++++++ .../Views/Policies/Index.cshtml | 12 ++++ 3 files changed, 78 insertions(+) create mode 100644 LearningHub.Nhs.WebUI/Views/Policies/AIGeneratedImagesStatement.cshtml diff --git a/LearningHub.Nhs.WebUI/Controllers/PoliciesController.cs b/LearningHub.Nhs.WebUI/Controllers/PoliciesController.cs index 4d6a54c4f..9f619e572 100644 --- a/LearningHub.Nhs.WebUI/Controllers/PoliciesController.cs +++ b/LearningHub.Nhs.WebUI/Controllers/PoliciesController.cs @@ -100,5 +100,15 @@ public IActionResult AcceptableUsePolicy() { return this.View(); } + + /// + /// AI-generated images statement. + /// + /// The . + [Route("/policies/ai-generated-images-statement")] + public IActionResult AIGeneratedImagesStatement() + { + return this.View(); + } } } diff --git a/LearningHub.Nhs.WebUI/Views/Policies/AIGeneratedImagesStatement.cshtml b/LearningHub.Nhs.WebUI/Views/Policies/AIGeneratedImagesStatement.cshtml new file mode 100644 index 000000000..ab7b93caa --- /dev/null +++ b/LearningHub.Nhs.WebUI/Views/Policies/AIGeneratedImagesStatement.cshtml @@ -0,0 +1,56 @@ +@inject Microsoft.Extensions.Options.IOptions options +@{ + ViewData["Title"] = " AI-generated images statement"; +} +@section styles { + + +} +
+
+

AI-generated images statement

+
+
+

This statement covers the use of generative AI to create or enhance images, videos and alt text descriptions of images in the production of educational content by the NHS England (NHSE) Technology Enhanced Learning (TEL) Content Development Team.

+

This statement was prepared by the Generative AI Task And Finish Group on behalf of the Content Development Group and approved by the AI Steering Group and reflects the general principles we adhere to regarding the use of generative AI for the creation and enhancement of images.

+

The statement will be reviewed regularly, to consider emerging tools and development of our full governance process and policy, or every year, whichever is sooner. 

+

Statement of principles

+

The NHSE TEL Content Development Team is committed to providing high-quality learning content that improves patient care and provides the best value for taxpayers’ money. Our priority is to ensure accuracy, reliability and trustworthiness in all our educational resources while also improving the quality, speed and efficiency of learning content we produce.

+

Artificial intelligence (AI) refers to the use of digital technology to create systems capable of performing tasks commonly thought to require human intelligence. For more information on AI and its applications in the NHS, please refer to NHS AI Lab and the NHSE AI Guide.

+

Generative AI is a category of AI which can produce content like text, images, music, special effects and video in response to a prompt from a human. Generative AI has the potential to improve the quality, speed or cost-effectiveness of image production.

+

The NHSE TEL team has investigated the image generators currently available and concluded that images entirely generated by AI are not appropriate. However, we have found benefits that can support the content development process and enhance existing images. We are also mindful of the ethical implications of using image generators and carefully considered fairness for creators as well as value for taxpayers' money.

+

While some images, videos or their text descriptions may be entirely created or enhanced by generative AI, all our educational content is verified by our team alongside relevant clinical and subject matter experts to check accuracy, relevance and guard against misrepresentation or misleading content.

+

Please notify us of any factual errors or inaccuracies, or if you have any concerns regarding an image in this session by contacting us through our support page.

+

General principles of use. 

+
    +
  • Images, videos or text descriptions entirely created or enhanced by generative AI will be used solely to enhance the learning experience. 
  • +
  • mages, videos or text descriptions entirely created or enhanced by generative AI are intended for illustrative or decorative purposes and may not depict a real person, place or object.
  • +
  • Images, videos or text descriptions entirely created by generative AI may be used to generate visual concepts which are then used by inhouse designers to produce original content. 
  • +
  • If a specific image, video or text description (not including background art) in the session is created entirely by generative AI, it will clearly be labelled with this information within the session.
  • +
  • If an image, video or text description is enhanced by generative AI (see below for examples) it will not be labelled, but a general statement will be added to the learning content. 
  • +
  • The generative AI technologies we use are procured in strict adherence to our organisation’s information governance, procurement and cybersecurity guidelines, ensuring that all data and processes are secure. 
  • +
  • We are committed to ensuring that the AI we use complies with our organisation’s equality and diversity guidelines. This means that we carefully evaluate these tools to ensure they do not perpetuate biases and are accessible to all users. 
  • +
  • We are conscious of the ethical risks associated with the use of generative AI and are working to mitigate these through processes, principles, standards and guidance. 
  • +
  • We are aware of the emerging consensus around copyright and generative AI and working closely with the Workforce, training and education Knowledge and Library Services to monitor this. 
  • +
  • We will not use AI to knowingly depict real people without consent and clear labelling to indicate the image or video is entirely generated by AI.
  • + +
+

Examples of possible use of AI enhanced images 

+ +
    +
  • Localisation (for example, the removal or replacement of a background to situate the content in an NHS setting).
  • +
  • To adhere to NHS standards (for example, the removal of long-sleeves and gloves, or tying back hair of medical staff in clinical situations).
  • +
  • To improve diversity and inclusivity (combine images to fully represent population).
  • +
  • Create diagrams or infographics.
  • +
+

 Examples of purely AI generated images   

+
    +
  • Backgrounds.
  • +
  • Abstract decorations, motifs and patterns. 
  • +
+
+
+ @await Html.PartialAsync("~/Views/Shared/_PageReviewPartial.cshtml", new PageReviewModel { LastReviewedDate = new DateTime(2025, 01, 01), NextReviewDate = new DateTime(2026, 8, 16) }) +
+ +
diff --git a/LearningHub.Nhs.WebUI/Views/Policies/Index.cshtml b/LearningHub.Nhs.WebUI/Views/Policies/Index.cshtml index be07fbee3..666e8b650 100644 --- a/LearningHub.Nhs.WebUI/Views/Policies/Index.cshtml +++ b/LearningHub.Nhs.WebUI/Views/Policies/Index.cshtml @@ -81,6 +81,18 @@
+
  • + +
  • \ No newline at end of file From fe2f1aa1ea9d596d57ef2c75df5504348c69aeee Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Mar 2025 08:50:57 +0000 Subject: [PATCH 05/61] Bump @babel/core in /AdminUI/LearningHub.Nhs.AdminUI (#1028) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.26.9 to 7.26.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../LearningHub.Nhs.AdminUI/package-lock.json | 62 +++++++++---------- AdminUI/LearningHub.Nhs.AdminUI/package.json | 2 +- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json b/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json index 21a362d26..3c4a2dd4e 100644 --- a/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json +++ b/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json @@ -40,7 +40,7 @@ "vuex": "^3.6.2" }, "devDependencies": { - "@babel/core": "^7.26.9", + "@babel/core": "^7.26.10", "@babel/preset-env": "^7.26.9", "@types/axios": "^0.14.0", "@types/bootstrap": "4.1.3", @@ -117,22 +117,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", + "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -178,14 +178,14 @@ "dev": true }, "node_modules/@babel/generator": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", - "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -485,26 +485,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", - "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/types": "^7.26.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.9" + "@babel/types": "^7.26.10" }, "bin": { "parser": "bin/babel-parser.js" @@ -1927,17 +1927,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", - "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/parser": "^7.26.9", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/types": "^7.26.10", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1969,9 +1969,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", diff --git a/AdminUI/LearningHub.Nhs.AdminUI/package.json b/AdminUI/LearningHub.Nhs.AdminUI/package.json index 2b5f1780e..af71fa375 100644 --- a/AdminUI/LearningHub.Nhs.AdminUI/package.json +++ b/AdminUI/LearningHub.Nhs.AdminUI/package.json @@ -53,7 +53,7 @@ }, "devDependencies": { "@babel/preset-env": "^7.26.9", - "@babel/core": "^7.26.9", + "@babel/core": "^7.26.10", "@types/axios": "^0.14.0", "@types/bootstrap": "4.1.3", "@types/ckeditor": "4.9.10", From a983ccc50cefbc6c852885eb6b3f882da7e9d8c2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Mar 2025 09:08:13 +0000 Subject: [PATCH 06/61] Bump @babel/core from 7.26.9 to 7.26.10 in /LearningHub.Nhs.WebUI (#1029) Bumps [@babel/core](https://github.com/babel/babel/tree/HEAD/packages/babel-core) from 7.26.9 to 7.26.10. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.26.10/packages/babel-core) --- updated-dependencies: - dependency-name: "@babel/core" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- LearningHub.Nhs.WebUI/package-lock.json | 62 ++++++++++++------------- LearningHub.Nhs.WebUI/package.json | 2 +- 2 files changed, 32 insertions(+), 32 deletions(-) diff --git a/LearningHub.Nhs.WebUI/package-lock.json b/LearningHub.Nhs.WebUI/package-lock.json index 7c8e916ad..79ef599ea 100644 --- a/LearningHub.Nhs.WebUI/package-lock.json +++ b/LearningHub.Nhs.WebUI/package-lock.json @@ -44,7 +44,7 @@ "vuex": "^3.6.2" }, "devDependencies": { - "@babel/core": "^7.26.9", + "@babel/core": "^7.26.10", "@babel/preset-env": "^7.26.9", "@types/axios": "^0.14.0", "@types/bootstrap": "4.6.1", @@ -139,22 +139,22 @@ } }, "node_modules/@babel/core": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", - "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", + "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", + "@babel/generator": "^7.26.10", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", - "@babel/helpers": "^7.26.9", - "@babel/parser": "^7.26.9", + "@babel/helpers": "^7.26.10", + "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", - "@babel/traverse": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -223,14 +223,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", - "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz", + "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/parser": "^7.26.10", + "@babel/types": "^7.26.10", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -624,26 +624,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", - "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", + "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9" + "@babel/types": "^7.26.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", - "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", + "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.9" + "@babel/types": "^7.26.10" }, "bin": { "parser": "bin/babel-parser.js" @@ -2057,17 +2057,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", - "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz", + "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.9", - "@babel/parser": "^7.26.9", + "@babel/generator": "^7.26.10", + "@babel/parser": "^7.26.10", "@babel/template": "^7.26.9", - "@babel/types": "^7.26.9", + "@babel/types": "^7.26.10", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2108,9 +2108,9 @@ "dev": true }, "node_modules/@babel/types": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", - "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", + "version": "7.26.10", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", + "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", diff --git a/LearningHub.Nhs.WebUI/package.json b/LearningHub.Nhs.WebUI/package.json index 0ccc3d885..3805b3e15 100644 --- a/LearningHub.Nhs.WebUI/package.json +++ b/LearningHub.Nhs.WebUI/package.json @@ -56,7 +56,7 @@ "vuex": "^3.6.2" }, "devDependencies": { - "@babel/core": "^7.26.9", + "@babel/core": "^7.26.10", "@babel/preset-env": "^7.26.9", "@types/axios": "^0.14.0", "@types/bootstrap": "4.6.1", From 5f3b7a02c76207059cc8acf17a05f67d7e4f0d7f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:02:22 +0000 Subject: [PATCH 07/61] Bump sass from 1.85.1 to 1.86.0 in /AdminUI/LearningHub.Nhs.AdminUI (#1032) Bumps [sass](https://github.com/sass/dart-sass) from 1.85.1 to 1.86.0. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.85.1...1.86.0) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- AdminUI/LearningHub.Nhs.AdminUI/package-lock.json | 8 ++++---- AdminUI/LearningHub.Nhs.AdminUI/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json b/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json index 3c4a2dd4e..dd199a92a 100644 --- a/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json +++ b/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json @@ -63,7 +63,7 @@ "css-loader": "^5.2.4", "file-loader": "^6.2.0", "jest": "^27.5.1", - "sass": "^1.85.1", + "sass": "^1.86.0", "sass-loader": "^11.0.1", "style-loader": "^2.0.0", "ts-jest": "^27.1.5", @@ -16070,9 +16070,9 @@ } }, "node_modules/sass": { - "version": "1.85.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.1.tgz", - "integrity": "sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.0.tgz", + "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==", "dev": true, "license": "MIT", "dependencies": { diff --git a/AdminUI/LearningHub.Nhs.AdminUI/package.json b/AdminUI/LearningHub.Nhs.AdminUI/package.json index af71fa375..e8b76592d 100644 --- a/AdminUI/LearningHub.Nhs.AdminUI/package.json +++ b/AdminUI/LearningHub.Nhs.AdminUI/package.json @@ -75,7 +75,7 @@ "css-loader": "^5.2.4", "file-loader": "^6.2.0", "jest": "^27.5.1", - "sass": "^1.85.1", + "sass": "^1.86.0", "sass-loader": "^11.0.1", "style-loader": "^2.0.0", "ts-jest": "^27.1.5", From 73c451d822ae26c8fafb62467f9160075957336d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:05:14 +0000 Subject: [PATCH 08/61] Bump sass from 1.85.1 to 1.86.0 in /LearningHub.Nhs.WebUI (#1033) Bumps [sass](https://github.com/sass/dart-sass) from 1.85.1 to 1.86.0. - [Release notes](https://github.com/sass/dart-sass/releases) - [Changelog](https://github.com/sass/dart-sass/blob/main/CHANGELOG.md) - [Commits](https://github.com/sass/dart-sass/compare/1.85.1...1.86.0) --- updated-dependencies: - dependency-name: sass dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- LearningHub.Nhs.WebUI/package-lock.json | 8 ++++---- LearningHub.Nhs.WebUI/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/LearningHub.Nhs.WebUI/package-lock.json b/LearningHub.Nhs.WebUI/package-lock.json index 79ef599ea..263333e70 100644 --- a/LearningHub.Nhs.WebUI/package-lock.json +++ b/LearningHub.Nhs.WebUI/package-lock.json @@ -68,7 +68,7 @@ "eslint": "^8.51.0", "file-loader": "^6.2.0", "jest": "^27.5.1", - "sass": "^1.85.1", + "sass": "^1.86.0", "sass-loader": "^11.1.1", "style-loader": "^2.0.0", "ts-jest": "^27.1.5", @@ -16919,9 +16919,9 @@ } }, "node_modules/sass": { - "version": "1.85.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.85.1.tgz", - "integrity": "sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag==", + "version": "1.86.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.86.0.tgz", + "integrity": "sha512-zV8vGUld/+mP4KbMLJMX7TyGCuUp7hnkOScgCMsWuHtns8CWBoz+vmEhoGMXsaJrbUP8gj+F1dLvVe79sK8UdA==", "dev": true, "license": "MIT", "dependencies": { diff --git a/LearningHub.Nhs.WebUI/package.json b/LearningHub.Nhs.WebUI/package.json index 3805b3e15..673640964 100644 --- a/LearningHub.Nhs.WebUI/package.json +++ b/LearningHub.Nhs.WebUI/package.json @@ -80,7 +80,7 @@ "eslint": "^8.51.0", "file-loader": "^6.2.0", "jest": "^27.5.1", - "sass": "^1.85.1", + "sass": "^1.86.0", "sass-loader": "^11.1.1", "style-loader": "^2.0.0", "ts-jest": "^27.1.5", From b70aa005fbd0fc463ba5ea1d2dd0a3ee2fc91bf2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 08:26:24 +0000 Subject: [PATCH 09/61] Bump @mediakind/mkplayer from 1.19.0 to 1.20.0 in /LearningHub.Nhs.WebUI (#1040) --- updated-dependencies: - dependency-name: "@mediakind/mkplayer" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- LearningHub.Nhs.WebUI/package-lock.json | 10 +++++----- LearningHub.Nhs.WebUI/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/LearningHub.Nhs.WebUI/package-lock.json b/LearningHub.Nhs.WebUI/package-lock.json index 263333e70..aaf838cdd 100644 --- a/LearningHub.Nhs.WebUI/package-lock.json +++ b/LearningHub.Nhs.WebUI/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@ckeditor/ckeditor5-build-classic": "16.0.0", "@ckeditor/ckeditor5-vue": "1.0.3", - "@mediakind/mkplayer": "1.19.0", + "@mediakind/mkplayer": "1.20.0", "@types/uuid": "^8.3.4", "axios": "^0.29.0", "babel-polyfill": "^6.26.0", @@ -3818,10 +3818,10 @@ } }, "node_modules/@mediakind/mkplayer": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@mediakind/mkplayer/-/mkplayer-1.19.0.tgz", - "integrity": "sha512-DoRoS+am8/0Chb57DXNR4IPuVTqi5ZBB8rybVqnq4qPvWHGA5l/33iYkToPlLlM5LjJ2Pk3uF7QpFEYoiS0tsA==", - "license": "©2024 Copyright Mediakind Ltd. All Rights Reserved. Including All Downloadable Materials.", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@mediakind/mkplayer/-/mkplayer-1.20.0.tgz", + "integrity": "sha512-8msi65ezI/MjTSakrO8w78tfIdqIDXP8MgIFBlM5H26OtLCdu7ywvsyvszud2rmBhz0GZSd0Km+Wr8SXikAZtQ==", + "license": "©2025 Copyright Mediakind Ltd. All Rights Reserved. Including All Downloadable Materials.", "dependencies": { "bitmovin-player": "8.193.0", "bitmovin-player-ui": "^3.52.0" diff --git a/LearningHub.Nhs.WebUI/package.json b/LearningHub.Nhs.WebUI/package.json index 673640964..bd5081a65 100644 --- a/LearningHub.Nhs.WebUI/package.json +++ b/LearningHub.Nhs.WebUI/package.json @@ -22,7 +22,7 @@ "dependencies": { "@ckeditor/ckeditor5-build-classic": "16.0.0", "@ckeditor/ckeditor5-vue": "1.0.3", - "@mediakind/mkplayer": "1.19.0", + "@mediakind/mkplayer": "1.20.0", "@types/uuid": "^8.3.4", "axios": "^0.29.0", "babel-polyfill": "^6.26.0", From 6b7dad8e72f69f6f67cc63d7663c52edc3ae77cf Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Mar 2025 08:29:34 +0000 Subject: [PATCH 10/61] Bump @mediakind/mkplayer in /AdminUI/LearningHub.Nhs.AdminUI (#1041) --- updated-dependencies: - dependency-name: "@mediakind/mkplayer" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- AdminUI/LearningHub.Nhs.AdminUI/package-lock.json | 10 +++++----- AdminUI/LearningHub.Nhs.AdminUI/package.json | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json b/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json index dd199a92a..59acc2e38 100644 --- a/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json +++ b/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@ckeditor/ckeditor5-build-classic": "16.0.0", "@ckeditor/ckeditor5-vue": "1.0.3", - "@mediakind/mkplayer": "^1.19.0", + "@mediakind/mkplayer": "^1.20.0", "axios": "^0.19.1", "babel-polyfill": "^6.26.0", "bootstrap": "^4.6.2", @@ -3373,10 +3373,10 @@ } }, "node_modules/@mediakind/mkplayer": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/@mediakind/mkplayer/-/mkplayer-1.19.0.tgz", - "integrity": "sha512-DoRoS+am8/0Chb57DXNR4IPuVTqi5ZBB8rybVqnq4qPvWHGA5l/33iYkToPlLlM5LjJ2Pk3uF7QpFEYoiS0tsA==", - "license": "©2024 Copyright Mediakind Ltd. All Rights Reserved. Including All Downloadable Materials.", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/@mediakind/mkplayer/-/mkplayer-1.20.0.tgz", + "integrity": "sha512-8msi65ezI/MjTSakrO8w78tfIdqIDXP8MgIFBlM5H26OtLCdu7ywvsyvszud2rmBhz0GZSd0Km+Wr8SXikAZtQ==", + "license": "©2025 Copyright Mediakind Ltd. All Rights Reserved. Including All Downloadable Materials.", "dependencies": { "bitmovin-player": "8.193.0", "bitmovin-player-ui": "^3.52.0" diff --git a/AdminUI/LearningHub.Nhs.AdminUI/package.json b/AdminUI/LearningHub.Nhs.AdminUI/package.json index e8b76592d..c4948c231 100644 --- a/AdminUI/LearningHub.Nhs.AdminUI/package.json +++ b/AdminUI/LearningHub.Nhs.AdminUI/package.json @@ -22,7 +22,7 @@ "dependencies": { "@ckeditor/ckeditor5-build-classic": "16.0.0", "@ckeditor/ckeditor5-vue": "1.0.3", - "@mediakind/mkplayer": "^1.19.0", + "@mediakind/mkplayer": "^1.20.0", "axios": "^0.19.1", "babel-polyfill": "^6.26.0", "bootstrap": "^4.6.2", From 5c238e55b089ae3f1e5e73a4d99a0895d40e080c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 08:42:26 +0000 Subject: [PATCH 11/61] Bump sanitize-html in /AdminUI/LearningHub.Nhs.AdminUI (#1042) Bumps [sanitize-html](https://github.com/apostrophecms/sanitize-html) from 2.14.0 to 2.15.0. - [Changelog](https://github.com/apostrophecms/sanitize-html/blob/main/CHANGELOG.md) - [Commits](https://github.com/apostrophecms/sanitize-html/compare/2.14.0...2.15.0) --- updated-dependencies: - dependency-name: sanitize-html dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- AdminUI/LearningHub.Nhs.AdminUI/package-lock.json | 9 +++++---- AdminUI/LearningHub.Nhs.AdminUI/package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json b/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json index 59acc2e38..b640a0051 100644 --- a/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json +++ b/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json @@ -23,7 +23,7 @@ "navigator.sendbeacon": "0.0.20", "nhsuk-frontend": "^6.1.2", "openseadragon": "^2.4.2", - "sanitize-html": "^2.14.0", + "sanitize-html": "^2.15.0", "save": "^2.9.0", "ts-debounce": "2.3.0", "tus-js-client": "^2.3.2", @@ -15981,9 +15981,10 @@ "dev": true }, "node_modules/sanitize-html": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.14.0.tgz", - "integrity": "sha512-CafX+IUPxZshXqqRaG9ZClSlfPVjSxI0td7n07hk8QO2oO+9JDnlcL8iM8TWeOXOIBFgIOx6zioTzM53AOMn3g==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.15.0.tgz", + "integrity": "sha512-wIjst57vJGpLyBP8ioUbg6ThwJie5SuSIjHxJg53v5Fg+kUK+AXlb7bK3RNXpp315MvwM+0OBGCV6h5pPHsVhA==", + "license": "MIT", "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", diff --git a/AdminUI/LearningHub.Nhs.AdminUI/package.json b/AdminUI/LearningHub.Nhs.AdminUI/package.json index c4948c231..7e3925598 100644 --- a/AdminUI/LearningHub.Nhs.AdminUI/package.json +++ b/AdminUI/LearningHub.Nhs.AdminUI/package.json @@ -35,7 +35,7 @@ "navigator.sendbeacon": "0.0.20", "nhsuk-frontend": "^6.1.2", "openseadragon": "^2.4.2", - "sanitize-html": "^2.14.0", + "sanitize-html": "^2.15.0", "save": "^2.9.0", "ts-debounce": "2.3.0", "tus-js-client": "^2.3.2", From b4f263e4b0e228c2815cc4ddeac9a1db59185993 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 08:50:45 +0000 Subject: [PATCH 12/61] Bump sanitize-html from 2.14.0 to 2.15.0 in /LearningHub.Nhs.WebUI (#1043) Bumps [sanitize-html](https://github.com/apostrophecms/sanitize-html) from 2.14.0 to 2.15.0. - [Changelog](https://github.com/apostrophecms/sanitize-html/blob/main/CHANGELOG.md) - [Commits](https://github.com/apostrophecms/sanitize-html/compare/2.14.0...2.15.0) --- updated-dependencies: - dependency-name: sanitize-html dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- LearningHub.Nhs.WebUI/package-lock.json | 9 +++++---- LearningHub.Nhs.WebUI/package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/LearningHub.Nhs.WebUI/package-lock.json b/LearningHub.Nhs.WebUI/package-lock.json index aaf838cdd..663f5149f 100644 --- a/LearningHub.Nhs.WebUI/package-lock.json +++ b/LearningHub.Nhs.WebUI/package-lock.json @@ -25,7 +25,7 @@ "nhsuk-frontend": "^7.1.0", "node": "^14.0.0", "openseadragon": "^2.4.2", - "sanitize-html": "^2.14.0", + "sanitize-html": "^2.15.0", "save": "^2.9.0", "ts-debounce": "2.3.0", "tus-js-client": "^2.3.2", @@ -16887,9 +16887,10 @@ "dev": true }, "node_modules/sanitize-html": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.14.0.tgz", - "integrity": "sha512-CafX+IUPxZshXqqRaG9ZClSlfPVjSxI0td7n07hk8QO2oO+9JDnlcL8iM8TWeOXOIBFgIOx6zioTzM53AOMn3g==", + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/sanitize-html/-/sanitize-html-2.15.0.tgz", + "integrity": "sha512-wIjst57vJGpLyBP8ioUbg6ThwJie5SuSIjHxJg53v5Fg+kUK+AXlb7bK3RNXpp315MvwM+0OBGCV6h5pPHsVhA==", + "license": "MIT", "dependencies": { "deepmerge": "^4.2.2", "escape-string-regexp": "^4.0.0", diff --git a/LearningHub.Nhs.WebUI/package.json b/LearningHub.Nhs.WebUI/package.json index bd5081a65..ca6f0deb8 100644 --- a/LearningHub.Nhs.WebUI/package.json +++ b/LearningHub.Nhs.WebUI/package.json @@ -37,7 +37,7 @@ "nhsuk-frontend": "^7.1.0", "node": "^14.0.0", "openseadragon": "^2.4.2", - "sanitize-html": "^2.14.0", + "sanitize-html": "^2.15.0", "save": "^2.9.0", "ts-debounce": "2.3.0", "tus-js-client": "^2.3.2", From 175d83378ab159663e24c17b26120dcbabaf6290 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 09:08:19 +0000 Subject: [PATCH 13/61] Bump axios from 0.29.0 to 0.30.0 in /LearningHub.Nhs.WebUI (#1046) Bumps [axios](https://github.com/axios/axios) from 0.29.0 to 0.30.0. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v0.30.0/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.29.0...v0.30.0) --- updated-dependencies: - dependency-name: axios dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- LearningHub.Nhs.WebUI/package-lock.json | 9 +++++---- LearningHub.Nhs.WebUI/package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/LearningHub.Nhs.WebUI/package-lock.json b/LearningHub.Nhs.WebUI/package-lock.json index 663f5149f..c459b48a4 100644 --- a/LearningHub.Nhs.WebUI/package-lock.json +++ b/LearningHub.Nhs.WebUI/package-lock.json @@ -12,7 +12,7 @@ "@ckeditor/ckeditor5-vue": "1.0.3", "@mediakind/mkplayer": "1.20.0", "@types/uuid": "^8.3.4", - "axios": "^0.29.0", + "axios": "^0.30.0", "babel-polyfill": "^6.26.0", "bootstrap": "^4.6.2", "ckeditor4-vue": "^0.2.0", @@ -5858,9 +5858,10 @@ } }, "node_modules/axios": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.29.0.tgz", - "integrity": "sha512-Kjsq1xisgO5DjjNQwZFsy0gpcU1P2j36dZeQDXVhpIU26GVgkDUnROaHLSuluhMqtDE7aKA2hbKXG5yu5DN8Tg==", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.30.0.tgz", + "integrity": "sha512-Z4F3LjCgfjZz8BMYalWdMgAQUnEtKDmpwNHjh/C8pQZWde32TF64cqnSeyL3xD/aTIASRU30RHTNzRiV/NpGMg==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.4", "form-data": "^4.0.0", diff --git a/LearningHub.Nhs.WebUI/package.json b/LearningHub.Nhs.WebUI/package.json index ca6f0deb8..f07a417de 100644 --- a/LearningHub.Nhs.WebUI/package.json +++ b/LearningHub.Nhs.WebUI/package.json @@ -24,7 +24,7 @@ "@ckeditor/ckeditor5-vue": "1.0.3", "@mediakind/mkplayer": "1.20.0", "@types/uuid": "^8.3.4", - "axios": "^0.29.0", + "axios": "^0.30.0", "babel-polyfill": "^6.26.0", "bootstrap": "^4.6.2", "ckeditor4-vue": "^0.2.0", From 082a4759514fe4a3fe61395d92507ab6e66ac4b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 27 Mar 2025 09:20:17 +0000 Subject: [PATCH 14/61] Bump axios from 0.19.2 to 0.30.0 in /AdminUI/LearningHub.Nhs.AdminUI (#1047) Bumps [axios](https://github.com/axios/axios) from 0.19.2 to 0.30.0. - [Release notes](https://github.com/axios/axios/releases) - [Changelog](https://github.com/axios/axios/blob/v0.30.0/CHANGELOG.md) - [Commits](https://github.com/axios/axios/compare/v0.19.2...v0.30.0) --- updated-dependencies: - dependency-name: axios dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .../LearningHub.Nhs.AdminUI/package-lock.json | 311 ++++++------------ AdminUI/LearningHub.Nhs.AdminUI/package.json | 2 +- 2 files changed, 100 insertions(+), 213 deletions(-) diff --git a/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json b/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json index b640a0051..382c683cb 100644 --- a/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json +++ b/AdminUI/LearningHub.Nhs.AdminUI/package-lock.json @@ -11,7 +11,7 @@ "@ckeditor/ckeditor5-build-classic": "16.0.0", "@ckeditor/ckeditor5-vue": "1.0.3", "@mediakind/mkplayer": "^1.20.0", - "axios": "^0.19.1", + "axios": "^0.30.0", "babel-polyfill": "^6.26.0", "bootstrap": "^4.6.2", "ckeditor4-vue": "^0.2.0", @@ -5198,8 +5198,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, "node_modules/atob": { "version": "2.1.2", @@ -5214,12 +5213,29 @@ } }, "node_modules/axios": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.2.tgz", - "integrity": "sha512-fjgm5MvRHLhx+osE2xoekY70AhARk3a6hkN+3Io1jc00jtquGvxYlKlsFUhmUET0V5te6CcZI7lcv2Ym61mjHA==", - "deprecated": "Critical security vulnerability fixed in v0.21.1. For more information, see https://github.com/axios/axios/pull/3410", + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.30.0.tgz", + "integrity": "sha512-Z4F3LjCgfjZz8BMYalWdMgAQUnEtKDmpwNHjh/C8pQZWde32TF64cqnSeyL3xD/aTIASRU30RHTNzRiV/NpGMg==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.4", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", + "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", + "license": "MIT", "dependencies": { - "follow-redirects": "1.5.10" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" } }, "node_modules/babel-code-frame": { @@ -6636,10 +6652,10 @@ } }, "node_modules/call-bind-apply-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.1.tgz", - "integrity": "sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" @@ -6648,15 +6664,6 @@ "node": ">= 0.4" } }, - "node_modules/call-bind-apply-helpers/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/call-bound": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.3.tgz", @@ -6673,51 +6680,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-bound/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bound/node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bound/node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -6976,7 +6938,6 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -7598,14 +7559,6 @@ "node": ">=0.11.0" } }, - "node_modules/debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "dependencies": { - "ms": "2.0.0" - } - }, "node_modules/decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", @@ -7867,7 +7820,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, "engines": { "node": ">=0.4.0" } @@ -8053,7 +8005,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", @@ -8201,7 +8152,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -8210,7 +8160,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -8225,7 +8174,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "dependencies": { "es-errors": "^1.3.0" }, @@ -8233,6 +8181,21 @@ "node": ">= 0.4" } }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es5-ext": { "version": "0.10.53", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", @@ -9222,14 +9185,23 @@ } }, "node_modules/follow-redirects": { - "version": "1.5.10", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", - "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", - "dependencies": { - "debug": "=3.1.0" - }, + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", "engines": { "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, "node_modules/for-in": { @@ -9311,10 +9283,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/functions-have-names": { "version": "1.2.3", @@ -9343,14 +9318,24 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", - "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9369,7 +9354,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" @@ -9473,7 +9457,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -9538,10 +9521,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", - "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", - "dev": true, + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -9550,12 +9533,12 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -9637,7 +9620,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -9645,15 +9627,6 @@ "node": ">= 0.4" } }, - "node_modules/hasown/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -14204,7 +14177,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -14398,7 +14370,6 @@ "version": "1.47.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -14407,7 +14378,6 @@ "version": "2.1.30", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", - "dev": true, "dependencies": { "mime-db": "1.47.0" }, @@ -14523,7 +14493,8 @@ "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "node_modules/multicast-dns": { "version": "6.2.3", @@ -15540,6 +15511,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", @@ -16401,51 +16378,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel-map/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map/node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map/node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/side-channel-map/node_modules/object-inspect": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", @@ -16477,51 +16409,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/side-channel-weakmap/node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap/node_modules/get-intrinsic": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.7.tgz", - "integrity": "sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==", - "dev": true, - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "function-bind": "^1.1.2", - "get-proto": "^1.0.0", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap/node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/side-channel-weakmap/node_modules/object-inspect": { "version": "1.13.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", diff --git a/AdminUI/LearningHub.Nhs.AdminUI/package.json b/AdminUI/LearningHub.Nhs.AdminUI/package.json index 7e3925598..d65e5e44f 100644 --- a/AdminUI/LearningHub.Nhs.AdminUI/package.json +++ b/AdminUI/LearningHub.Nhs.AdminUI/package.json @@ -23,7 +23,7 @@ "@ckeditor/ckeditor5-build-classic": "16.0.0", "@ckeditor/ckeditor5-vue": "1.0.3", "@mediakind/mkplayer": "^1.20.0", - "axios": "^0.19.1", + "axios": "^0.30.0", "babel-polyfill": "^6.26.0", "bootstrap": "^4.6.2", "ckeditor4-vue": "^0.2.0", From df645f9e9fce4b7aec10300df04435fd2e880663 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 28 Mar 2025 08:31:50 +0000 Subject: [PATCH 15/61] Bump @mediakind/mkplayer from 1.20.0 to 1.21.0 in /LearningHub.Nhs.WebUI --- updated-dependencies: - dependency-name: "@mediakind/mkplayer" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- LearningHub.Nhs.WebUI/package-lock.json | 8 ++++---- LearningHub.Nhs.WebUI/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/LearningHub.Nhs.WebUI/package-lock.json b/LearningHub.Nhs.WebUI/package-lock.json index c459b48a4..779d67c61 100644 --- a/LearningHub.Nhs.WebUI/package-lock.json +++ b/LearningHub.Nhs.WebUI/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@ckeditor/ckeditor5-build-classic": "16.0.0", "@ckeditor/ckeditor5-vue": "1.0.3", - "@mediakind/mkplayer": "1.20.0", + "@mediakind/mkplayer": "1.21.0", "@types/uuid": "^8.3.4", "axios": "^0.30.0", "babel-polyfill": "^6.26.0", @@ -3818,9 +3818,9 @@ } }, "node_modules/@mediakind/mkplayer": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/@mediakind/mkplayer/-/mkplayer-1.20.0.tgz", - "integrity": "sha512-8msi65ezI/MjTSakrO8w78tfIdqIDXP8MgIFBlM5H26OtLCdu7ywvsyvszud2rmBhz0GZSd0Km+Wr8SXikAZtQ==", + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@mediakind/mkplayer/-/mkplayer-1.21.0.tgz", + "integrity": "sha512-6sZwxQObISgmD4z0RV6xoi2bJgnOBtDAa2bPg4H/D095MaUInaDkrCimROst/rWfeMFg2m4h9PSmJV88cYbvQw==", "license": "©2025 Copyright Mediakind Ltd. All Rights Reserved. Including All Downloadable Materials.", "dependencies": { "bitmovin-player": "8.193.0", diff --git a/LearningHub.Nhs.WebUI/package.json b/LearningHub.Nhs.WebUI/package.json index f07a417de..4809135de 100644 --- a/LearningHub.Nhs.WebUI/package.json +++ b/LearningHub.Nhs.WebUI/package.json @@ -22,7 +22,7 @@ "dependencies": { "@ckeditor/ckeditor5-build-classic": "16.0.0", "@ckeditor/ckeditor5-vue": "1.0.3", - "@mediakind/mkplayer": "1.20.0", + "@mediakind/mkplayer": "1.21.0", "@types/uuid": "^8.3.4", "axios": "^0.30.0", "babel-polyfill": "^6.26.0", From 1321ad5f6e936f37f9ea0e79d2d352928398fafd Mon Sep 17 00:00:00 2001 From: Anju Jose Date: Fri, 28 Mar 2025 12:02:14 +0000 Subject: [PATCH 16/61] TD-5146-Fix --- .../Views/Resource/Details.cshtml | 1711 +++++++++-------- 1 file changed, 857 insertions(+), 854 deletions(-) diff --git a/AdminUI/LearningHub.Nhs.AdminUI/Views/Resource/Details.cshtml b/AdminUI/LearningHub.Nhs.AdminUI/Views/Resource/Details.cshtml index 5c7b99069..53d548c59 100644 --- a/AdminUI/LearningHub.Nhs.AdminUI/Views/Resource/Details.cshtml +++ b/AdminUI/LearningHub.Nhs.AdminUI/Views/Resource/Details.cshtml @@ -5,919 +5,922 @@ @inject IOptions webSettings @{ - ViewData["Title"] = "Details"; - var activetab = this.ViewBag.ActiveTab; + ViewData["Title"] = "Details"; + var activetab = this.ViewBag.ActiveTab; } -@section Styles{ - +@section Styles { + }
    - -
    -
    -
    - - @if (Model.ResourceVersionId == 0) - { -
    Resource Version not found
    - } - else - { -
    -
    @Model.Title (@Model.VersionStatusDescription)
    -
    - @if (Model.VersionStatusEnum == VersionStatusEnum.Published) - { - - } - @if (Model.VersionStatusEnum == VersionStatusEnum.Publishing || Model.VersionStatusEnum == VersionStatusEnum.FailedToPublish) - { - - } - -
    -
    - -