Skip to content

Commit 1052871

Browse files
authored
Merge pull request #1179 from TechnologyEnhancedLearning/RC
Merge Grasslilly release to master
2 parents e9a6e17 + 1a86b09 commit 1052871

File tree

80 files changed

+3941
-279
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+3941
-279
lines changed

AdminUI/LearningHub.Nhs.AdminUI/Controllers/UserGroupController.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,15 @@ public async Task<IActionResult> Details(UserGroupAdminDetailViewModel userGroup
197197
if (userGroup.IsNew())
198198
{
199199
validationResult = await this.userGroupService.CreateUserGroup(userGroup);
200-
userGroup = await this.userGroupService.GetUserGroupAdminDetailbyIdAsync(validationResult.CreatedId.Value);
200+
if (validationResult.IsValid)
201+
{
202+
userGroup = await this.userGroupService.GetUserGroupAdminDetailbyIdAsync(validationResult.CreatedId.Value);
203+
}
204+
else
205+
{
206+
this.ViewBag.ErrorMessage = $"Update failed: {string.Join(Environment.NewLine, validationResult.Details)}";
207+
return this.View("Details", userGroup);
208+
}
201209
}
202210
else
203211
{

AdminUI/LearningHub.Nhs.AdminUI/Views/UserGroup/_UsersModal.cshtml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@
4141
{
4242
<tr>
4343
<td style="vertical-align: middle">
44-
@Html.ActionLink(item.Id.ToString(), "Details", new { id = item.Id })
44+
@Html.ActionLink(item.Id.ToString(), "Details", "User", new { id = item.Id })
4545
</td>
4646
<td style="vertical-align: middle">
47-
@Html.ActionLink(item.UserName.ToString(), "Details", new { id = item.Id })
47+
@Html.ActionLink(item.UserName.ToString(), "Details", "User", new { id = item.Id })
4848
</td>
4949
<td style="vertical-align: middle">
5050
<input type="checkbox" id=@($"user_{item.Id}") class="list-item-checked" />

LearningHub.Nhs.WebUI/Controllers/MyAccountController.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@ public async Task<IActionResult> ChangeGrade([FromQuery] UserGradeUpdateViewMode
810810
viewModel.SelectedMedicalCouncilId = jobRole.MedicalCouncilId;
811811
if (formSubmission)
812812
{
813-
if (this.User.IsInRole("BasicUser") || viewModel.SelectedGradeId.HasValue)
813+
if (this.User.IsInRole("BasicUser") || viewModel.SelectedGradeId != null)
814814
{
815815
var medicalCouncilNoRequired = jobRole.MedicalCouncilId > 0 && jobRole.MedicalCouncilId < 4;
816816
await this.userService.UpdateUserEmployment(
@@ -821,7 +821,7 @@ await this.userService.UpdateUserEmployment(
821821
JobRoleId = viewModel.SelectedJobRoleId,
822822
MedicalCouncilId = medicalCouncilNoRequired ? jobRole.MedicalCouncilId : null,
823823
MedicalCouncilNo = medicalCouncilNoRequired ? (viewModel.SelectedMedicalCouncilNo ?? profile.MedicalCouncilNo) : null,
824-
GradeId = viewModel.SelectedGradeId,
824+
GradeId = Convert.ToInt32(viewModel.SelectedGradeId),
825825
SpecialtyId = profile.SpecialtyId,
826826
StartDate = profile.JobStartDate,
827827
LocationId = profile.LocationId,
@@ -836,6 +836,10 @@ await this.userService.UpdateUserEmployment(
836836
return this.View("ChangeGrade", viewModel);
837837
}
838838
}
839+
else
840+
{
841+
viewModel.SelectedGradeId = profile.GradeId.ToString();
842+
}
839843

840844
return this.View("ChangeGrade", viewModel);
841845
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
namespace LearningHub.Nhs.WebUI.Helpers;
2+
3+
/// <summary>
4+
/// Represents the types of resources available in Moodle.
5+
/// </summary>
6+
public enum ResourceTypeEnumMoodle
7+
{
8+
/// <summary>
9+
/// The undefined resource type.
10+
/// </summary>
11+
Undefined,
12+
13+
/// <summary>
14+
/// The article resource type.
15+
/// </summary>
16+
Article,
17+
18+
/// <summary>
19+
/// The audio resource type.
20+
/// </summary>
21+
Audio,
22+
23+
/// <summary>
24+
/// The embedded resource type.
25+
/// </summary>
26+
Embedded,
27+
28+
/// <summary>
29+
/// The equipment resource type.
30+
/// </summary>
31+
Equipment,
32+
33+
/// <summary>
34+
/// The image resource type.
35+
/// </summary>
36+
Image,
37+
38+
/// <summary>
39+
/// The SCORM resource type.
40+
/// </summary>
41+
Scorm,
42+
43+
/// <summary>
44+
/// The video resource type.
45+
/// </summary>
46+
Video,
47+
48+
/// <summary>
49+
/// The web link resource type.
50+
/// </summary>
51+
WebLink,
52+
53+
/// <summary>
54+
/// The generic file resource type.
55+
/// </summary>
56+
GenericFile,
57+
58+
/// <summary>
59+
/// The clinical case resource type.
60+
/// </summary>
61+
Case,
62+
63+
/// <summary>
64+
/// The assessment resource type.
65+
/// </summary>
66+
Assessment,
67+
68+
/// <summary>
69+
/// The HTML resource type.
70+
/// </summary>
71+
Html,
72+
73+
/// <summary>
74+
/// The Moodle resource type.
75+
/// </summary>
76+
Moodle,
77+
78+
/// <summary>
79+
/// The Moodle course resource type.
80+
/// </summary>
81+
Course,
82+
}

LearningHub.Nhs.WebUI/Helpers/UtilityHelper.cs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,25 @@ public static class UtilityHelper
3232
{ "html", ResourceTypeEnum.Html },
3333
};
3434

35+
/// TODO: Remove this method after adding to Moodle resource types to models project.
36+
/// <summary>
37+
/// Findwise Moodle resource type dictionary.
38+
/// </summary>
39+
public static readonly Dictionary<string, ResourceTypeEnumMoodle> FindwiseResourceMoodleTypeDict = new Dictionary<string, ResourceTypeEnumMoodle>()
40+
{
41+
{ "video", ResourceTypeEnumMoodle.Video },
42+
{ "article", ResourceTypeEnumMoodle.Article },
43+
{ "case", ResourceTypeEnumMoodle.Case },
44+
{ "weblink", ResourceTypeEnumMoodle.WebLink },
45+
{ "audio", ResourceTypeEnumMoodle.Audio },
46+
{ "scorm", ResourceTypeEnumMoodle.Scorm },
47+
{ "assessment", ResourceTypeEnumMoodle.Assessment },
48+
{ "genericfile", ResourceTypeEnumMoodle.GenericFile },
49+
{ "image", ResourceTypeEnumMoodle.Image },
50+
{ "html", ResourceTypeEnumMoodle.Html },
51+
{ "moodle", ResourceTypeEnumMoodle.Course },
52+
};
53+
3554
/// <summary>
3655
/// The FormatTwitterDate.
3756
/// </summary>
@@ -147,6 +166,54 @@ public static string GetPrettifiedResourceTypeName(ResourceTypeEnum resourceType
147166
}
148167
}
149168

169+
/// TODO: Remove this method after adding to Moodle resource types to models project.
170+
/// <summary>
171+
/// Returns a prettified resource type name, suitable for display in the UI. Includes video/audio duration string.
172+
/// </summary>
173+
/// <param name="resourceType">The resource type.</param>
174+
/// <param name="durationInMilliseconds">The media duration in milliseconds.</param>
175+
/// <returns>The resource type name, and duration if applicable.</returns>
176+
public static string GetPrettifiedResourceTypeNameMoodle(ResourceTypeEnumMoodle resourceType, int? durationInMilliseconds = 0)
177+
{
178+
switch (resourceType)
179+
{
180+
case ResourceTypeEnumMoodle.Assessment:
181+
return "Assessment";
182+
case ResourceTypeEnumMoodle.Article:
183+
return "Article";
184+
case ResourceTypeEnumMoodle.Audio:
185+
string durationText = GetDurationText(durationInMilliseconds ?? 0);
186+
durationText = string.IsNullOrEmpty(durationText) ? string.Empty : " - " + durationText;
187+
return "Audio" + durationText;
188+
case ResourceTypeEnumMoodle.Equipment:
189+
return "Equipment";
190+
case ResourceTypeEnumMoodle.Image:
191+
return "Image";
192+
case ResourceTypeEnumMoodle.Scorm:
193+
return "elearning";
194+
case ResourceTypeEnumMoodle.Video:
195+
durationText = GetDurationText(durationInMilliseconds ?? 0);
196+
durationText = string.IsNullOrEmpty(durationText) ? string.Empty : " - " + durationText;
197+
return "Video" + durationText;
198+
case ResourceTypeEnumMoodle.WebLink:
199+
return "Web link";
200+
case ResourceTypeEnumMoodle.GenericFile:
201+
return "File";
202+
case ResourceTypeEnumMoodle.Embedded:
203+
return "Embedded";
204+
case ResourceTypeEnumMoodle.Case:
205+
return "Case";
206+
case ResourceTypeEnumMoodle.Html:
207+
return "HTML";
208+
case ResourceTypeEnumMoodle.Moodle:
209+
return "Course";
210+
case ResourceTypeEnumMoodle.Course:
211+
return "Course";
212+
default:
213+
return "File";
214+
}
215+
}
216+
150217
/// <summary>
151218
/// Returns a prettified resource type name, suitable for display in the UI. Excludes video/audio duration string.
152219
/// </summary>

LearningHub.Nhs.WebUI/Models/MoodleCourseResponseViewModel.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,15 @@ public class MoodleCourseResponseViewModel
9292
/// </summary>
9393
public int? Category { get; set; }
9494

95+
/// <summary>
96+
/// Gets the progress percentage formatted as a string.
97+
/// </summary>
98+
public string ProgressPercentage => $"{System.Math.Round(this.Progress ?? 0)}%";
99+
95100
/// <summary>
96101
/// Gets or sets the progress.
97102
/// </summary>
98-
public int? Progress { get; set; }
103+
public double? Progress { get; set; }
99104

100105
/// <summary>
101106
/// Gets or sets the completion status.

LearningHub.Nhs.WebUI/Models/UserProfile/UserGradeUpdateViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class UserGradeUpdateViewModel
3838
/// <summary>
3939
/// Gets or sets the selected grade id.
4040
/// </summary>
41-
public int? SelectedGradeId { get; set; }
41+
public string SelectedGradeId { get; set; }
4242

4343
/// <summary>
4444
/// Gets or sets the grade list.

LearningHub.Nhs.WebUI/Services/SearchService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -163,10 +163,10 @@ public async Task<SearchResultViewModel> PerformSearch(IPrincipal user, SearchRe
163163
{
164164
var filter = filters.Where(x => x.DisplayName == filteritem).FirstOrDefault();
165165

166-
if (filter != null && UtilityHelper.FindwiseResourceTypeDict.ContainsKey(filter.DisplayName))
166+
if (filter != null && UtilityHelper.FindwiseResourceMoodleTypeDict.ContainsKey(filter.DisplayName))
167167
{
168-
var resourceTypeEnum = UtilityHelper.FindwiseResourceTypeDict[filter.DisplayName];
169-
var searchfilter = new SearchFilterModel() { DisplayName = UtilityHelper.GetPrettifiedResourceTypeName(resourceTypeEnum), Count = filter.Count, Value = filteritem, Selected = searchRequest.Filters?.Contains(filter.DisplayName) ?? false };
168+
var resourceTypeEnum = UtilityHelper.FindwiseResourceMoodleTypeDict[filter.DisplayName];
169+
var searchfilter = new SearchFilterModel() { DisplayName = UtilityHelper.GetPrettifiedResourceTypeNameMoodle(resourceTypeEnum), Count = filter.Count, Value = filteritem, Selected = searchRequest.Filters?.Contains(filter.DisplayName) ?? false };
170170
searchfilters.Add(searchfilter);
171171
}
172172
}

LearningHub.Nhs.WebUI/Views/Catalogue/AccessRequested.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<vc:back-link asp-controller="Catalogue" asp-action="@Model.CatalogueUrl" link-text="Back to: @Model.CatalogueName" />
1414
<h1>Access requested</h1>
1515

16-
<p>Your request to access this cataloque has seen sent to the cataloque administrator.</p>
16+
<p>Your request to access this catalogue has seen sent to the catalogue administrator.</p>
1717

1818
<h2>What happens next?</h2>
1919
<p>The catalogue administrator will review your request and you will be notified of their decision by email.</p>

LearningHub.Nhs.WebUI/Views/Home/_CourseEnrolled.cshtml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
{
1313
var apiBaseUrl = Configuration["MoodleAPIConfig:BaseUrl"];
1414
string path = $"course/view.php";
15-
string returnUrl = $@"{apiBaseUrl}/{path}?id={courseId}";
15+
string returnUrl = $@"{apiBaseUrl}{path}?id={courseId}";
1616

1717
return returnUrl;
1818
}
@@ -21,11 +21,9 @@
2121
<div class="nhsuk-card-banner-container">
2222
@if (!string.IsNullOrWhiteSpace(Model.CourseImage))
2323
{
24-
if (Model.CourseImage.EndsWith(".svg", StringComparison.OrdinalIgnoreCase))
24+
@if (Model.CourseImage.EndsWith(".svg", StringComparison.OrdinalIgnoreCase))
2525
{
26-
<object class="nhsuk-card__img nhsuk-card-banner" type="image/svg+xml" data="@Model.CourseImage">
27-
<img src="/images/default-course.jpg" alt="Fallback image" />
28-
</object>
26+
<img class="nhsuk-card__img nhsuk-card-banner" src="@Model.CourseImage" alt="Course image" onerror="this.onerror=null;this.src='/images/default-course.jpg';" />
2927
}
3028
else
3129
{
@@ -60,7 +58,7 @@
6058
<div class="line-clamp-3 nhsuk-u-margin-bottom-2point5">
6159
@if (@Model?.Progress != null)
6260
{
63-
<div>Progress: @Model.Progress%</div>
61+
<div>Progress: @Model.ProgressPercentage</div>
6462
}
6563
</div>
6664

0 commit comments

Comments
 (0)