Skip to content

Commit d917646

Browse files
committed
Merge branch 'DLS-Release-v1.2.0' into UAT
2 parents 30969ab + 5414198 commit d917646

File tree

8 files changed

+53
-34
lines changed

8 files changed

+53
-34
lines changed

DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1566,7 +1566,13 @@ ManageOptionalCompetenciesViewModel model
15661566

15671567
}
15681568

1569-
if (!selfAssessmentService.HasMinimumOptionalCompetencies(selfAssessmentId, delegateUserId))
1569+
var recentResults = selfAssessmentService.GetMostRecentResults(selfAssessmentId, User.GetCandidateIdKnownNotNull()).ToList();
1570+
1571+
bool isVerificationPending = recentResults?.SelectMany(comp => comp.AssessmentQuestions).Where(quest => quest.Required)
1572+
.Where(quest => quest.Required)
1573+
.All(quest => !((quest.Result == null || quest.Verified == null || quest.SignedOff != true) && quest.Required)) != true;
1574+
1575+
if (!selfAssessmentService.HasMinimumOptionalCompetencies(selfAssessmentId, delegateUserId) || isVerificationPending)
15701576
{
15711577
var supervisorsSignOffs = selfAssessmentService.GetSupervisorSignOffsForCandidateAssessment(selfAssessmentId, delegateUserId);
15721578

DigitalLearningSolutions.Web/Controllers/Support/RequestSupportTicketController.cs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -117,31 +117,36 @@ public IActionResult RequestSummary(DlsSubApplication dlsSubApplication, Request
117117
).GetAwaiter().GetResult(); ;
118118
var model = new RequestSummaryViewModel(data);
119119
data.setRequestSubjectDetails(model);
120+
if (!ModelState.IsValid)
121+
{
122+
ModelState.Clear();
123+
}
120124
return View("RequestSummary", model);
121125
}
122126

123127
[HttpPost]
124128
[Route("/{dlsSubApplication}/RequestSupport/SetRequestSummary")]
125129
public IActionResult SetRequestSummary(DlsSubApplication dlsSubApplication, RequestSummaryViewModel requestDetailsmodel)
126130
{
127-
if (requestDetailsmodel.RequestSubject == null)
128-
{
129-
ModelState.AddModelError("RequestSubject", "Please enter request summary");
130-
return View("RequestSummary", requestDetailsmodel);
131-
}
132-
if (requestDetailsmodel.RequestDescription == null)
131+
var data = multiPageFormService.GetMultiPageFormData<RequestSupportTicketData>(
132+
MultiPageFormDataFeature.AddCustomWebForm("RequestSupportTicketCWF"),
133+
TempData
134+
).GetAwaiter().GetResult();
135+
requestDetailsmodel.RequestType = data.RequestType;
136+
137+
// Check if RequestDescription is null or contains any default empty tags ("<p><br></p>").
138+
// This ensures that when a user navigates to the submit page and returns to SetRequestSummary,
139+
// removing the description completely results in an actual empty value rather than leftover HTML tags.
140+
if (requestDetailsmodel.RequestDescription == "<p><br></p>")
133141
{
134142
ModelState.AddModelError("RequestDescription", "Please enter request description");
135-
return View("RequestSummary", requestDetailsmodel);
136143
}
144+
137145
if (!ModelState.IsValid)
138146
{
139147
return View("RequestSummary", requestDetailsmodel);
140148
}
141-
var data = multiPageFormService.GetMultiPageFormData<RequestSupportTicketData>(
142-
MultiPageFormDataFeature.AddCustomWebForm("RequestSupportTicketCWF"),
143-
TempData
144-
).GetAwaiter().GetResult(); ;
149+
145150
data.setRequestSubjectDetails(requestDetailsmodel);
146151
setRequestSupportTicketData(data);
147152
return RedirectToAction("RequestAttachment", new { dlsSubApplication });

DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/SelfAssessmentReports/SelfAssessmentReportsController.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,10 @@ public IActionResult DownloadSelfAssessmentReport(int selfAssessmentId)
8787
public IActionResult TableauCompetencyDashboard()
8888
{
8989
var userEmail = User.GetUserPrimaryEmail();
90-
var jwt = tableauConnectionHelper.GetTableauJwt(userEmail);
90+
var adminId = User.GetAdminId();
91+
var jwt = tableauConnectionHelper.GetTableauJwt();
92+
ViewBag.Email = userEmail;
93+
ViewBag.AdminId = adminId;
9194
ViewBag.SiteName = tableauSiteName;
9295
ViewBag.TableauServerUrl = tableauUrl;
9396
ViewBag.WorkbookName = workbookName;

DigitalLearningSolutions.Web/Helpers/ExternalApis/TableauConnectionHelper.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
public interface ITableauConnectionHelperService
1111
{
12-
string GetTableauJwt(string email);
12+
string GetTableauJwt();
1313
}
1414
public class TableauConnectionHelper : ITableauConnectionHelperService
1515
{
@@ -24,7 +24,7 @@ public TableauConnectionHelper(IConfiguration config)
2424
connectedAppSecretKey = config.GetTableauClientSecret();
2525
user = config.GetTableauUser();
2626
}
27-
public string GetTableauJwt(string email)
27+
public string GetTableauJwt()
2828
{
2929
var key = Encoding.UTF8.GetBytes(connectedAppSecretKey);
3030
var signingCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256);
@@ -41,8 +41,7 @@ public string GetTableauJwt(string email)
4141
{ "aud", "tableau" },
4242
{ "exp", new DateTimeOffset(DateTime.UtcNow.AddMinutes(5)).ToUnixTimeSeconds() },
4343
{ "sub", user },
44-
{ "scp", new[] { "tableau:views:embed" } },
45-
{ "ExernalUserEmail", new [] { email } }
44+
{ "scp", new[] { "tableau:views:embed" } }
4645
};
4746
var token = new JwtSecurityToken(header, payload);
4847
var tokenHandler = new JwtSecurityTokenHandler();

DigitalLearningSolutions.Web/ViewModels/Support/RequestSupportTicket/RequestSummaryViewModel.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,14 @@ public RequestSummaryViewModel(RequestSupportTicketData data)
1818
RequestDescription = data.RequestDescription;
1919
}
2020
[MaxLength(250, ErrorMessage = "Summary must be 250 characters or fewer")]
21+
[Required(ErrorMessage = "Please enter request summary")]
2122
public string? RequestSubject { get; set; }
23+
24+
[Required(ErrorMessage = "Please enter request description")]
2225
public string? RequestDescription { get; set; }
26+
2327
public int? RequestTypeId { get; set; }
28+
2429
public string? RequestType { get; set; }
2530
}
2631
}

DigitalLearningSolutions.Web/Views/Frameworks/Developer/_Structure.cshtml

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,18 @@
11
@using DigitalLearningSolutions.Web.ViewModels.Frameworks;
22
@model FrameworkViewModel;
3+
4+
5+
@if (Model.DetailFramework.UserRole > 1)
6+
{
7+
<div class="nhsuk-grid-row nhsuk-u-margin-top-3">
8+
<div class="nhsuk-grid-column-full">
9+
<a class="nhsuk-button" asp-action="AddEditFrameworkCompetencyGroup" asp-route-frameworkId="@(ViewContext.RouteData.Values["frameworkId"])">Add @Model.VocabSingular().ToLower() group</a>
10+
<a class="nhsuk-button nhsuk-button--secondary" asp-action="AddEditFrameworkCompetency" asp-route-frameworkId="@(ViewContext.RouteData.Values["frameworkId"])">Add ungrouped @Model.VocabSingular().ToLower()</a>
11+
<a class="nhsuk-button nhsuk-button--secondary" asp-action="ImportCompetencies" asp-route-frameworkId="@(ViewContext.RouteData.Values["frameworkId"])" asp-route-isNotBlank="@(Model.FrameworkCompetencies.Any()|Model.FrameworkCompetencyGroups.Any())" asp-route-tabname="@(ViewContext.RouteData.Values["tabname"])">Bulk upload/update @Model.VocabPlural().ToLower()</a>
12+
<a class="nhsuk-button nhsuk-button--secondary" asp-action="PrintLayout" asp-route-frameworkId="@(ViewContext.RouteData.Values["frameworkId"])">View for print</a>
13+
</div>
14+
</div>
15+
}
316
<h2>Framework structure</h2>
417
@if (Model.FrameworkCompetencyGroups.Any())
518
{
@@ -75,15 +88,3 @@ else
7588

7689
}
7790
</div>
78-
@if (Model.DetailFramework.UserRole > 1)
79-
{
80-
<div class="nhsuk-grid-row nhsuk-u-margin-top-3">
81-
<div class="nhsuk-grid-column-full">
82-
<a class="nhsuk-button" asp-action="AddEditFrameworkCompetencyGroup" asp-route-frameworkId="@(ViewContext.RouteData.Values["frameworkId"])">Add @Model.VocabSingular().ToLower() group</a>
83-
<a class="nhsuk-button nhsuk-button--secondary" asp-action="AddEditFrameworkCompetency" asp-route-frameworkId="@(ViewContext.RouteData.Values["frameworkId"])">Add ungrouped @Model.VocabSingular().ToLower()</a>
84-
<a class="nhsuk-button nhsuk-button--secondary" asp-action="ImportCompetencies" asp-route-frameworkId="@(ViewContext.RouteData.Values["frameworkId"])" asp-route-isNotBlank="@(Model.FrameworkCompetencies.Any()|Model.FrameworkCompetencyGroups.Any())" asp-route-tabname="@(ViewContext.RouteData.Values["tabname"])">Bulk upload/update @Model.VocabPlural().ToLower()</a>
85-
<a class="nhsuk-button nhsuk-button--secondary" asp-action="PrintLayout" asp-route-frameworkId="@(ViewContext.RouteData.Values["frameworkId"])">View for print</a>
86-
</div>
87-
</div>
88-
}
89-

DigitalLearningSolutions.Web/Views/Support/RequestSupportTicket/RequestSummary.cshtml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,7 @@
44
@using DigitalLearningSolutions.Web.ViewModels.Support.RequestSupportTicket;
55
@model RequestSummaryViewModel;
66
@{
7-
bool errorHasOccurred = false;
8-
@if (Model.RequestSubject == null && !ViewData.ModelState.IsValid)
9-
{
10-
errorHasOccurred = true;
11-
}
7+
var errorHasOccurred = !ViewData.ModelState.IsValid;
128
ViewData["Title"] = "Request details";
139
var cancelLinkData = Html.GetRouteValues();
1410
}

DigitalLearningSolutions.Web/Views/TrackingSystem/Centre/SelfAssessmentReports/TableauCompetencyDashboard.cshtml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
var viewName = ViewBag.ViewName;
66
var jwtToken = ViewBag.JwtToken;
77
var siteName = ViewBag.SiteName;
8+
var aid = ViewBag.AdminId;
9+
var email = ViewBag.Email;
810
var srcUrl = $"{tableauServerUrl}/t/{siteName}/views/{workbookName}/{viewName}";
911
ViewData["Title"] = "Supervised self assessments dashboard";
1012
}
@@ -21,6 +23,8 @@
2123
<tableau-viz id='tableau-viz'
2224
src='@srcUrl' token='@jwtToken' toolbar='bottom'>
2325
If the dashboard doesn't appear after a few seconds, <a href="#">reload the page</a>
26+
<viz-parameter name="aid" value="@aid"></viz-parameter>
27+
<viz-parameter name="email" value="@email"></viz-parameter>
2428
</tableau-viz>
2529
@section scripts {
2630
@* We are not using Yarn/npm for the Tableau JS becaue of errors during installation relating to a missing dependency *@

0 commit comments

Comments
 (0)