Skip to content

Commit dba4e03

Browse files
committed
Finishes implementation of set minimum optional competencies validation and posting
1 parent 64e4322 commit dba4e03

File tree

8 files changed

+75
-46
lines changed

8 files changed

+75
-46
lines changed

DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -915,7 +915,7 @@ public void UpdateMinimumOptionalCompetencies(int selfAssessmentId, int minimumO
915915
@"UPDATE SelfAssessments
916916
SET
917917
[MinimumOptionalCompetencies] = @minimumOptionalCompetecies
918-
WHERE id = @selfAssessmentId AND MinimumOptionalCompetencies <> minimumOptionalCompetecies;"
918+
WHERE id = @selfAssessmentId AND MinimumOptionalCompetencies <> @minimumOptionalCompetecies;"
919919
,
920920
new { selfAssessmentId, minimumOptionalCompetecies }
921921
);
@@ -926,7 +926,7 @@ public void UpdateManageOptionalCompetenciesPrompt(int selfAssessmentId, string
926926
@"UPDATE SelfAssessments
927927
SET
928928
[ManageOptionalCompetenciesPrompt] = @manageOptionalCompetenciesPrompt
929-
WHERE id = @selfAssessmentId AND MinimumOptionalCompetencies <> minimumOptionalCompetecies;"
929+
WHERE id = @selfAssessmentId AND ManageOptionalCompetenciesPrompt <> @manageOptionalCompetenciesPrompt;"
930930
,
931931
new { selfAssessmentId, manageOptionalCompetenciesPrompt }
932932
);

DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -747,20 +747,19 @@ public IActionResult SetMinimumOptionalCompetencies(int competencyAssessmentId)
747747
var adminId = GetAdminID();
748748
var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
749749
var competencies = competencyAssessmentService.GetCompetenciesForCompetencyAssessment(competencyAssessmentId);
750-
var competencyAssessmentTaskStatus = competencyAssessmentService.GetCompetencyAssessmentTaskStatus(competencyAssessmentId, null);
751-
var viewModel = new SelectOptionalCompetenciesViewModel(competencyAssessmentBase, competencies, competencyAssessmentTaskStatus.OptionalCompetenciesTaskStatus);
750+
var viewModel = new SetMinimumOptionalCompetenciesViewModel(competencyAssessmentBase, competencies);
752751
return View("SetMinimumOptionalCompetencies", viewModel);
753752
}
754753
[HttpPost]
755754
[Route("/CompetencyAssessments/{competencyAssessmentId}/Competencies/Optional/SetMinimum")]
756-
public IActionResult SetMinimumOptionalCompetencies(SelectOptionalCompetenciesViewModel model)
755+
public IActionResult SetMinimumOptionalCompetencies(SetMinimumOptionalCompetenciesFormData model)
757756
{
758757
if (!ModelState.IsValid)
759758
{
760759
var adminId = GetAdminID();
761760
var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(model.ID, adminId);
762761
var competencies = competencyAssessmentService.GetCompetenciesForCompetencyAssessment(model.ID);
763-
var viewModel = new SelectOptionalCompetenciesViewModel(competencyAssessmentBase, competencies, model.TaskStatus);
762+
var viewModel = new SetMinimumOptionalCompetenciesViewModel(competencyAssessmentBase, competencies);
764763
return View("SetMinimumOptionalCompetencies", viewModel);
765764
}
766765
competencyAssessmentService.UpdateMinimumOptionalCompetencies(model.ID, model.MinimumOptionalCompetencies ?? 0);

DigitalLearningSolutions.Web/Helpers/MaxOptionalCompetenciesAttribute.cs

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,35 @@
22
using System;
33
using System.ComponentModel.DataAnnotations;
44

5-
public class MaxOptionalCompetenciesAttribute : ValidationAttribute
5+
public class MaxOptionalCountAttribute : ValidationAttribute
66
{
7-
private readonly string _selectedIdsProperty;
7+
private readonly string _maxProperty;
88

9-
public MaxOptionalCompetenciesAttribute(string selectedIdsProperty)
9+
public MaxOptionalCountAttribute(string maxProperty)
1010
{
11-
_selectedIdsProperty = selectedIdsProperty;
11+
_maxProperty = maxProperty;
1212
}
1313

1414
protected override ValidationResult? IsValid(object? value, ValidationContext validationContext)
1515
{
16-
// Get the integer value (MinimumOptionalCompetencies)
1716
var number = value as int?;
1817
if (number == null)
1918
{
2019
return ValidationResult.Success;
2120
}
2221

23-
// Get the other property (SelectedCompetencyIds)
24-
var selectedIdsProperty = validationContext.ObjectType.GetProperty(_selectedIdsProperty);
25-
if (selectedIdsProperty == null)
22+
// Get the max property value (OptionalCompetenciesCount)
23+
var maxProp = validationContext.ObjectType.GetProperty(_maxProperty);
24+
if (maxProp == null)
2625
{
27-
return new ValidationResult($"Unknown property {_selectedIdsProperty}");
26+
return new ValidationResult($"Unknown property {_maxProperty}");
2827
}
2928

30-
var selectedIds = (int[])selectedIdsProperty.GetValue(validationContext.ObjectInstance, null)
31-
?? Array.Empty<int>();
29+
var maxValue = (int)maxProp.GetValue(validationContext.ObjectInstance)!;
3230

33-
var maxAllowed = selectedIds.Length;
34-
35-
if (number < 0 || number > maxAllowed)
31+
if (number < 0 || number > maxValue)
3632
{
37-
return new ValidationResult(
38-
$"Value must be between 0 and {maxAllowed}."
39-
);
33+
return new ValidationResult($"Must be between 0 and {maxValue}.");
4034
}
4135

4236
return ValidationResult.Success;

DigitalLearningSolutions.Web/ViewModels/CompetencyAssessments/SelectOptionalCompetenciesFormData.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ public class SelectOptionalCompetenciesFormData
66
{
77
public int ID { get; set; }
88
public bool? TaskStatus { get; set; }
9-
[MaxOptionalCompetencies(nameof(SelectedCompetencyIds))]
109
public int? MinimumOptionalCompetencies { get; set; }
1110
public string? ManageOptionalCompetenciesPrompt { get; set; }
1211
public int[] SelectedCompetencyIds { get; set; } = [];
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using DigitalLearningSolutions.Web.Helpers;
2+
3+
namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments
4+
{
5+
public class SetMinimumOptionalCompetenciesFormData
6+
{
7+
[MaxOptionalCount(nameof(OptionalCompetenciesCount))]
8+
public int? MinimumOptionalCompetencies { get; set; }
9+
public int OptionalCompetenciesCount { get; set; }
10+
public int ID { get; set; }
11+
}
12+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments
2+
{
3+
using DigitalLearningSolutions.Data.Models.CompetencyAssessments;
4+
using DigitalLearningSolutions.Web.Helpers;
5+
using System.Collections.Generic;
6+
using System.Linq;
7+
8+
public class SetMinimumOptionalCompetenciesViewModel : SetMinimumOptionalCompetenciesFormData
9+
{
10+
public SetMinimumOptionalCompetenciesViewModel(CompetencyAssessmentBase competencyAssessmentBase, IEnumerable<Competency> competencies)
11+
{
12+
ID = competencyAssessmentBase.ID;
13+
CompetencyAssessmentName = competencyAssessmentBase.CompetencyAssessmentName;
14+
MinimumOptionalCompetencies = competencyAssessmentBase.MinimumOptionalCompetencies;
15+
UserRole = competencyAssessmentBase.UserRole;
16+
VocabularySingular = FrameworkVocabularyHelper.VocabularySingular(competencyAssessmentBase.Vocabulary);
17+
VocabularyPlural = FrameworkVocabularyHelper.VocabularyPlural(competencyAssessmentBase.Vocabulary);
18+
OptionalCompetenciesCount = competencies.Count(c => c.Optional == true);
19+
}
20+
public string CompetencyAssessmentName { get; set; }
21+
public int UserRole { get; set; }
22+
public string VocabularySingular { get; set; }
23+
public string VocabularyPlural { get; set; }
24+
}
25+
}

DigitalLearningSolutions.Web/Views/CompetencyAssessments/ManageOptionalCompetencies.cshtml

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,31 @@
2121
</div>
2222
</nav>
2323
}
24-
<h1>Manage optional competencies</h1>
24+
<h1>Manage optional @Model.VocabularyPlural.ToLower()</h1>
2525
<p class="nhsuk-lede-text">
26-
Manage optional competencies for the assessment @Model.CompetencyAssessmentName.
27-
Optional competencies can be selected for inclusion in a self assessment by a learner if required.
26+
Manage optional @Model.VocabularyPlural.ToLower() for the assessment @Model.CompetencyAssessmentName.
27+
Optional @Model.VocabularyPlural.ToLower() can be selected for inclusion in a self assessment by a learner if required.
2828
</p>
2929
<dl class="nhsuk-summary-list">
3030
<div class="nhsuk-summary-list__row">
3131
<dt class="nhsuk-summary-list__key">
32-
Optional competencies
32+
Optional @Model.VocabularyPlural.ToLower()
3333
</dt>
3434
<dd class="nhsuk-summary-list__value">
3535
@if (!Model.SelectedCompetencyIds.Any())
3636
{
37-
<text>No competencies have been made optional for this self assessment.</text>
37+
<text>No @Model.VocabularyPlural.ToLower() have been made optional for this self assessment.</text>
3838
}
3939
else
4040
{
4141
<text>
4242
@(Model.CompetencyGroups.Count(g =>
4343
g.Any(c => c.GroupOptionalCompetencies)
44-
)) optional competency groups
44+
)) optional @Model.VocabularySingular.ToLower() groups
4545
<br />
4646
@(Model.CompetencyGroups
4747
.Where(g => g.All(c => !c.GroupOptionalCompetencies))
48-
.Sum(g => g.Count())) individual optional competencies from
48+
.Sum(g => g.Count())) individual optional @Model.VocabularyPlural.ToLower() from
4949
@(Model.CompetencyGroups.Count(g =>
5050
g.All(c => !c.GroupOptionalCompetencies)
5151
)) groups
@@ -54,25 +54,25 @@
5454
}
5555
</dd>
5656
<dd class="nhsuk-summary-list__actions">
57-
<a class="nhsuk-link" asp-route-competencyAssessmentId="@Model.ID" asp-action="SelectOptionalCompetencies">Change<span class="nhsuk-u-visually-hidden"> optional competencies</span></a>
57+
<a class="nhsuk-link" asp-route-competencyAssessmentId="@Model.ID" asp-action="SelectOptionalCompetencies">Change<span class="nhsuk-u-visually-hidden"> optional @Model.VocabularyPlural.ToLower()</span></a>
5858
</dd>
5959
</div>
6060
@if (Model.SelectedCompetencyIds.Any())
6161
{
6262
<div class="nhsuk-summary-list__row">
6363
<dt class="nhsuk-summary-list__key">
64-
Minimum optional competencies
64+
Minimum optional @Model.VocabularyPlural.ToLower()
6565
</dt>
6666
<dd class="nhsuk-summary-list__value">
6767
@(Model.MinimumOptionalCompetencies == null | Model.MinimumOptionalCompetencies == 0 ? "No minimum set" : Model.MinimumOptionalCompetencies.ToString())
6868
</dd>
6969
<dd class="nhsuk-summary-list__actions">
70-
<a class="nhsuk-link" asp-route-competencyAssessmentId="@Model.ID" asp-action="SetMinimumOptionalCompetencies">Change<span class="nhsuk-u-visually-hidden"> minimum optional competencies</span></a>
70+
<a class="nhsuk-link" asp-route-competencyAssessmentId="@Model.ID" asp-action="SetMinimumOptionalCompetencies">Change<span class="nhsuk-u-visually-hidden"> minimum optional @Model.VocabularyPlural.ToLower()</span></a>
7171
</dd>
7272
</div>
7373
<div class="nhsuk-summary-list__row">
7474
<dt class="nhsuk-summary-list__key">
75-
Optional competency learner guidance
75+
Optional @Model.VocabularySingular.ToLower() learner guidance
7676
</dt>
7777
<dd class="nhsuk-summary-list__value">
7878
@Html.Raw(Model.ManageOptionalCompetenciesPrompt == null ? "No guidance text specified" : Model.ManageOptionalCompetenciesPrompt.ToString())
@@ -89,6 +89,7 @@
8989
<input type="hidden" asp-for="MinimumOptionalCompetencies" />
9090
<input type="hidden" asp-for="ManageOptionalCompetenciesPrompt" />
9191
<input type="hidden" asp-for="SelectedCompetencyIds" />
92+
<input type="hidden" asp-for="GroupIds" />
9293
<vc:single-checkbox asp-for="@nameof(Model.TaskStatus)" label="Mark this task as complete" hint-text="You will still be able to make changes after marking this task as complete."></vc:single-checkbox>
9394
</nhs-form-group>
9495
<button class="nhsuk-button" type="submit">

DigitalLearningSolutions.Web/Views/CompetencyAssessments/SetMinimumOptionalCompetencies.cshtml

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
@using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments
2-
@model SelectOptionalCompetenciesViewModel;
2+
@model SetMinimumOptionalCompetenciesViewModel;
33
@{
44
ViewData["Title"] = "Select Optional Competencies";
55
ViewData["Application"] = "Framework Service";
@@ -21,25 +21,24 @@
2121
</div>
2222
</nav>
2323
}
24-
<h1>Set a minimum number of optional competencies</h1>
24+
<h1>Set a minimum number of optional @Model.VocabularyPlural.ToLower()</h1>
2525

2626
<p class="nhsuk-lede-text">
27-
If appropriate, you can specify a minimum number of optional competencies that a learner must select when completing their self assessment.
27+
If required, you can specify a minimum number of optional @Model.VocabularyPlural.ToLower() that a learner must select when completing their @Model.CompetencyAssessmentName self assessment.
2828
</p>
29-
<form method="post">
30-
<div class="nhsuk-form-group">
29+
<form method="post" asp-action="SetMinimumOptionalCompetencies">
30+
<nhs-form-group nhs-validation-for="MinimumOptionalCompetencies">
3131
<label class="nhsuk-label" for="minimum-comps-input">
32-
Minimum optional competencies
32+
Minimum optional @Model.VocabularyPlural.ToLower()
3333
</label>
3434
<div id="minimum-comps-input-hint" class="nhsuk-hint">
35-
Specify a number between 0 and @Model.SelectedCompetencyIds.Count().
35+
Specify a number between 0 and @Model.OptionalCompetenciesCount.
3636
</div>
3737
<input class="nhsuk-input nhsuk-input--width-3" id="minimum-comps-input" asp-for="MinimumOptionalCompetencies" aria-describedby="minimum-comps-input-hint" type="number">
38-
</div>
38+
<span nhs-validation-for="MinimumOptionalCompetencies"></span>
39+
</nhs-form-group>
3940
<input type="hidden" asp-for="ID" />
40-
<input type="hidden" asp-for="GroupIds" />
41-
<input type="hidden" asp-for="SelectedCompetencyIds" />
42-
<input type="hidden" asp-for="ManageOptionalCompetenciesPrompt" />
41+
<input type="hidden" asp-for="OptionalCompetenciesCount" />
4342
<button class="nhsuk-button" type="submit">
4443
Save
4544
</button>

0 commit comments

Comments
 (0)