Skip to content

Commit 0632791

Browse files
committed
Implements POST handling for select optional competencies
1 parent ebe8332 commit 0632791

File tree

5 files changed

+73
-31
lines changed

5 files changed

+73
-31
lines changed

DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs

Lines changed: 47 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
{
33
using Dapper;
44
using DigitalLearningSolutions.Data.Models.CompetencyAssessments;
5+
using Microsoft.AspNetCore.Connections;
56
using Microsoft.Extensions.Logging;
67
using System;
78
using System.Collections.Generic;
@@ -68,7 +69,7 @@ string direction
6869
public bool UpdateCompetencyAssessmentFeaturesTaskStatus(int id, bool descriptionStatus, bool providerandCategoryStatus, bool vocabularyStatus,
6970
bool workingGroupStatus, bool AllframeworkCompetenciesStatus);
7071
void UpdateSelfAssessmentFromFramework(int selfAssessmentId, int? frameworkId);
71-
bool UpdateOptionalCompetenciesInAssessment(int selfAssessmentId, int[] selectedStructureIds, int[] groupIds);
72+
bool UpdateOptionalCompetenciesInAssessment(int selfAssessmentId, int[] groupIds, int[] selectedStructureIds);
7273

7374
//INSERT DATA
7475
int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName);
@@ -750,7 +751,7 @@ public void MoveCompetencyInSelfAssessment(int competencyAssessmentId, int compe
750751
new { SelfAssessmentID = competencyAssessmentId, CompetencyID = competencyId, Direction = direction },
751752
commandType: CommandType.StoredProcedure
752753
);
753-
754+
754755
}
755756

756757
public void MoveCompetencyGroupInSelfAssessment(int competencyAssessmentId, int groupId, string direction)
@@ -814,12 +815,12 @@ FROM SelfAssessments s INNER JOIN
814815
WHERE s.ID = @competencyAssessmentId",
815816
new { competencyAssessmentId }
816817
);
817-
818+
818819
}
819820

820-
public void UpdateSelfAssessmentFromFramework( int selfAssessmentId, int? frameworkId)
821+
public void UpdateSelfAssessmentFromFramework(int selfAssessmentId, int? frameworkId)
821822
{
822-
823+
823824
var numberOfAffectedRows = connection.Execute(
824825
@"UPDATE s
825826
SET
@@ -833,22 +834,22 @@ FROM SelfAssessments s
833834
INNER JOIN AdminUsers AU ON F.OwnerAdminID = AU.AdminID
834835
WHERE s.id = @selfAssessmentId;"
835836
,
836-
new {selfAssessmentId, frameworkId }
837+
new { selfAssessmentId, frameworkId }
837838
);
838839
}
839840
public bool InsertSelfAssessmentStructure(int selfAssessmentId, int? frameworkId)
840841
{
841842

842-
var numberOfAffectedRows = connection.Execute(
843-
@"INSERT INTO SelfAssessmentStructure (SelfAssessmentID, CompetencyID, Ordering, CompetencyGroupID)
843+
var numberOfAffectedRows = connection.Execute(
844+
@"INSERT INTO SelfAssessmentStructure (SelfAssessmentID, CompetencyID, Ordering, CompetencyGroupID)
844845
SELECT s.ID, FC.CompetencyID, ROW_NUMBER() OVER( ORDER BY FCG.Ordering, FC.Ordering ), FCG.CompetencyGroupID
845846
FROM FrameworkCompetencies AS FC
846847
INNER JOIN FrameworkCompetencyGroups AS FCG ON FC.FrameworkCompetencyGroupID = FCG.ID INNER JOIN
847848
SelfAssessments s ON s.id = @selfAssessmentId
848849
WHERE FC.FrameworkID = @frameworkId"
849-
,
850-
new { selfAssessmentId, frameworkId }
851-
);
850+
,
851+
new { selfAssessmentId, frameworkId }
852+
);
852853
if (numberOfAffectedRows < 1)
853854
{
854855
logger.LogWarning(
@@ -869,9 +870,42 @@ FROM FrameworkCompetencies AS FC
869870

870871
}
871872

872-
public bool UpdateOptionalCompetenciesInAssessment(int selfAssessmentId, int[] selectedStructureIds, int[] groupIds)
873+
public bool UpdateOptionalCompetenciesInAssessment(int selfAssessmentId, int[] groupIds, int[] selectedStructureIds)
873874
{
874-
throw new NotImplementedException();
875+
const string sql = @"UPDATE sas
876+
SET
877+
Optional =
878+
CASE
879+
WHEN sas.CompetencyGroupID IN @GroupIds THEN 1
880+
WHEN sas.ID IN @SelectedIds THEN 1
881+
ELSE 0
882+
END,
883+
GroupOptionalCompetencies =
884+
CASE
885+
WHEN sas.CompetencyGroupID IN @GroupIds THEN 1
886+
ELSE 0
887+
END
888+
FROM SelfAssessmentStructure sas
889+
WHERE sas.SelfAssessmentID = @SelfAssessmentId;";
890+
891+
var safeGroupIds = (groupIds != null && groupIds.Length > 0)
892+
? groupIds
893+
: [-1];
894+
895+
var safeSelectedIds = (selectedStructureIds != null && selectedStructureIds.Length > 0)
896+
? selectedStructureIds
897+
: [-1];
898+
899+
900+
var rows = connection.Execute(sql, new
901+
{
902+
SelfAssessmentId = selfAssessmentId,
903+
GroupIds = safeGroupIds,
904+
SelectedIds = safeSelectedIds
905+
});
906+
907+
// Returns true if any rows were updated
908+
return rows > 0;
875909
}
876910
}
877911
}

DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -736,7 +736,7 @@ public IActionResult SelectOptionalCompetencies(SelectOptionalCompetenciesFormDa
736736
var viewModel = new SelectOptionalCompetenciesViewModel(competencyAssessmentBase, competencies, model.TaskStatus);
737737
return View("SelectOptionalCompetencies", viewModel);
738738
}
739-
competencyAssessmentService.UpdateOptionalCompetenciesInAssessment(model.ID, model.SelectedCompetencyIds ?? [], model.GroupIds ?? []);
739+
competencyAssessmentService.UpdateOptionalCompetenciesInAssessment(model.ID, model.GroupIds ?? [], model.SelectedCompetencyIds ?? []);
740740
return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId = model.ID });
741741
}
742742
[Route("/CompetencyAssessments/Framework/{frameworkId}/{competencyAssessmentId}/Features")]

DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ string direction
5757
bool UpdateCompetencyAssessmentFeaturesTaskStatus(int id, bool descriptionStatus, bool providerandCategoryStatus, bool vocabularyStatus,
5858
bool workingGroupStatus, bool AllframeworkCompetenciesStatus);
5959
void UpdateSelfAssessmentFromFramework(int selfAssessmentId, int? frameworkId);
60-
bool UpdateOptionalCompetenciesInAssessment(int selfAssessmentId, int[] selectedStructureIds, int[] groupIds);
60+
bool UpdateOptionalCompetenciesInAssessment(int selfAssessmentId, int[] groupIds, int[] selectedStructureIds);
6161

6262
//INSERT DATA
6363
int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName, int? frameworkId);
@@ -292,9 +292,9 @@ public void UpdateSelfAssessmentFromFramework(int selfAssessmentId, int? framewo
292292
return competencyAssessmentDataService.GetSelfAssessmentStructure(competencyAssessmentId);
293293
}
294294

295-
public bool UpdateOptionalCompetenciesInAssessment(int selfAssessmentId, int[] selectedStructureIds, int[] groupIds)
295+
public bool UpdateOptionalCompetenciesInAssessment(int selfAssessmentId, int[] groupIds, int[] selectedStructureIds)
296296
{
297-
return competencyAssessmentDataService.UpdateOptionalCompetenciesInAssessment(selfAssessmentId, selectedStructureIds, groupIds);
297+
return competencyAssessmentDataService.UpdateOptionalCompetenciesInAssessment(selfAssessmentId, groupIds, selectedStructureIds);
298298
}
299299
}
300300
}

DigitalLearningSolutions.Web/Views/CompetencyAssessments/ManageOptionalCompetencies.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
<a class="nhsuk-link" asp-route-competencyAssessmentId="@Model.ID" asp-action="SelectOptionalCompetencies">Change<span class="nhsuk-u-visually-hidden"> optional competencies</span></a>
5858
</dd>
5959
</div>
60-
@if (!Model.SelectedCompetencyIds.Any())
60+
@if (Model.SelectedCompetencyIds.Any())
6161
{
6262
<div class="nhsuk-summary-list__row">
6363
<dt class="nhsuk-summary-list__key">

DigitalLearningSolutions.Web/Views/CompetencyAssessments/SelectOptionalCompetencies.cshtml

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,27 @@
55
<p class="nhsuk-lede-text">
66
Optional competencies can be added to the assessment individually or as a group.
77
</p>
8-
9-
@foreach (var competencyGroup in Model.CompetencyGroups)
10-
{
11-
@if (competencyGroup.Count() > 1)
8+
<form method="post" asp-action="SelectOptionalCompetencies">
9+
@foreach (var competencyGroup in Model.CompetencyGroups)
1210
{
13-
11+
@if (competencyGroup.Count() > 1)
12+
{
13+
1414
<div class="nhsuk-u-margin-bottom-6">
1515
<h3>
1616
@competencyGroup.Key
1717
</h3>
1818
<div class="nhsuk-checkboxes">
19-
<div class="nhsuk-checkboxes__item">
20-
<input class="nhsuk-checkboxes__input" data-group="@competencyGroup.First().GroupId" id="[email protected]().GroupId" name="GroupIds" checked="@competencyGroup.Any(x => x.GroupOptionalCompetencies)" type="checkbox" value="@competencyGroup.First().GroupId">
21-
<label class="nhsuk-label nhsuk-checkboxes__label" for="[email protected]().GroupId">
22-
<strong>@competencyGroup.Key @Model.VocabularyPlural.ToLower() optional as a group</strong>
23-
</label>
24-
</div>
19+
<div class="nhsuk-checkboxes__item">
20+
<input class="nhsuk-checkboxes__input" data-group="@competencyGroup.First().GroupId" id="[email protected]().GroupId" name="GroupIds" checked="@competencyGroup.Any(x => x.GroupOptionalCompetencies)" type="checkbox" value="@competencyGroup.First().GroupId">
21+
<label class="nhsuk-label nhsuk-checkboxes__label" for="[email protected]().GroupId">
22+
<strong>@competencyGroup.Key @Model.VocabularyPlural.ToLower() optional as a group</strong>
23+
</label>
24+
</div>
2525
@foreach (var competency in competencyGroup)
2626
{
2727
<div class="nhsuk-checkboxes__item">
28-
<input class="nhsuk-checkboxes__input" data-group="@competencyGroup.Key" id="[email protected]" name="SelectedCompetencyIds" checked="@(Model.SelectedCompetencyIds != null ? Model.SelectedCompetencyIds.Contains((int)competency.StructureId) : false)" type="checkbox" value="@competency.StructureId">
28+
<input class="nhsuk-checkboxes__input" data-group="@competencyGroup.Key" id="[email protected]" name="SelectedCompetencyIds" checked="@(Model.SelectedCompetencyIds != null ? Model.SelectedCompetencyIds.Contains((int)competency.CompetencyID) : false)" type="checkbox" value="@competency.StructureId">
2929
<label class="nhsuk-label nhsuk-checkboxes__label" for="[email protected]">
3030
@foreach (var flag in competency.CompetencyFlags)
3131
{
@@ -41,9 +41,17 @@
4141
}
4242
</div>
4343
</div>
44+
}
45+
4446
}
47+
<input type="hidden" asp-for="ID" />
48+
<input type="hidden" asp-for="MinimumOptionalCompetencies" />
49+
<input type="hidden" asp-for="ManageOptionalCompetenciesPrompt" />
50+
<button class="nhsuk-button" type="submit">
51+
Save
52+
</button>
53+
</form>
4554

46-
}
4755
<div class="nhsuk-back-link">
4856
<a class="nhsuk-back-link__link" asp-action="ManageCompetencyAssessment" asp-route-competencyAssessmentId="@Model.ID">
4957
<svg class="nhsuk-icon nhsuk-icon__chevron-left" focusable='false' xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" aria-hidden="true" focusable="false">

0 commit comments

Comments
 (0)