Skip to content

Commit 7eef360

Browse files
committed
Merge branch 'master' into release-v1.0.0
2 parents a8682c5 + f11e883 commit 7eef360

File tree

8 files changed

+155
-105
lines changed

8 files changed

+155
-105
lines changed

DigitalLearningSolutions.Data/Helpers/NewlineSeparatedStringListHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public static string RemoveStringFromNewlineSeparatedList(string list, int index
1717
public static string AddStringToNewlineSeparatedList(string? list, string newItem)
1818
{
1919
var options = list != null ? SplitNewlineSeparatedList(list) : new List<string>();
20-
options.Add(newItem.Trim());
20+
options.Add(newItem?.Trim());
2121
return JoinNewlineSeparatedList(options);
2222
}
2323

DigitalLearningSolutions.Web/Controllers/LearningPortalController/SelfAssessment.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1538,6 +1538,23 @@ ManageOptionalCompetenciesViewModel model
15381538
);
15391539
}
15401540
}
1541+
if (model.GroupOptionalCompetenciesChecked != null)
1542+
{
1543+
var optionalCompetencies =
1544+
selfAssessmentService.GetCandidateAssessmentOptionalCompetencies(selfAssessmentId, delegateUserId);
1545+
foreach (var competencyGroup in model.GroupOptionalCompetenciesChecked)
1546+
{
1547+
var IncludedSelfAssessmentStructureIds = optionalCompetencies.Where(x => x.CompetencyGroup == competencyGroup).Select(x => x.SelfAssessmentStructureId).ToList();
1548+
foreach (var selfAssessmentStructureId in IncludedSelfAssessmentStructureIds)
1549+
{
1550+
selfAssessmentService.UpdateCandidateAssessmentOptionalCompetencies(
1551+
selfAssessmentStructureId.Value,
1552+
delegateUserId
1553+
);
1554+
}
1555+
}
1556+
1557+
}
15411558

15421559
return RedirectToAction("SelfAssessmentOverview", new { selfAssessmentId, vocabulary });
15431560
}

DigitalLearningSolutions.Web/ViewModels/LearningPortal/SelfAssessments/ManageOptionalCompetenciesViewModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class ManageOptionalCompetenciesViewModel
1010
public CurrentSelfAssessment? SelfAssessment { get; set; }
1111
public IEnumerable<IGrouping<string, Competency>>? CompetencyGroups { get; set; }
1212
public List<int>? IncludedSelfAssessmentStructureIds { get; set; }
13+
public List<string>? GroupOptionalCompetenciesChecked { get; set; }
1314
public string VocabPlural()
1415
{
1516
return FrameworkVocabularyHelper.VocabularyPlural(SelfAssessment.Vocabulary);

DigitalLearningSolutions.Web/ViewModels/TrackingSystem/CourseSetup/AdminFieldAnswersViewModel.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ public AdminFieldAnswersViewModel(
2323

2424
public List<string> Options => NewlineSeparatedStringListHelper.SplitNewlineSeparatedList(OptionsString);
2525

26-
[Required(ErrorMessage = "Enter a response")]
2726
[MaxLength(100, ErrorMessage = "Response must be 100 characters or fewer")]
2827
public string? Answer { get; set; }
2928

DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/ManageOptionalCompetencies.cshtml

Lines changed: 82 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@
88
ViewData["SelfAssessmentTitle"] = @Model.SelfAssessment.Name;
99
var backLinkData = Html.GetRouteValues();
1010
}
11+
<style>
12+
.nhsuk-details__summary-text {
13+
padding: 10px;
14+
}
15+
</style>
1116
@if (ViewBag.FromAddOptionalPage != null)
1217
{
1318
@section breadcrumbs {
@@ -82,67 +87,93 @@ else
8287
@foreach (var competencyGroup in Model.CompetencyGroups)
8388
{
8489
<fieldset class="nhsuk-fieldset nhsuk-u-margin-bottom-4">
85-
<legend class="nhsuk-fieldset__legend nhsuk-fieldset__legend--l">
86-
<span class="nhsuk-fieldset__heading">
87-
@competencyGroup.Key
88-
</span>
89-
</legend>
90+
9091
@if (competencyGroup.Count() > 1)
9192
{
92-
<div class="nhsuk-grid-row nhsuk-u-margin-top-3 nhsuk-u-margin-bottom-1 js-only-block">
93-
<div class="nhsuk-grid-column-full">
94-
<a class="nhsuk-button select-all-button select-all status-tag nhsuk-u-margin-bottom-1" role="button" data-group="@competencyGroup.Key" name="selectAll" value="true">Select all @Model.VocabPlural().ToLower()</a>
95-
<a class="nhsuk-button select-all-button deselect-all status-tag nhsuk-u-margin-bottom-1" role="button" data-group="@competencyGroup.Key" id="" name="selectAll" value="false">Deselect all @Model.VocabPlural().ToLower()</a>
96-
</div>
97-
</div>
98-
}
99-
100-
<div class="nhsuk-checkboxes">
101-
@foreach (var competency in competencyGroup)
93+
@if (competencyGroup.Any(x => x.GroupOptionalCompetencies))
10294
{
103-
@if (competency.GroupOptionalCompetencies)
104-
{
105-
<div class="nhsuk-checkboxes__item">
106-
107-
<input data-group="@competencyGroup.Key" class="nhsuk-checkboxes__input select-all-checkbox" id="[email protected]" name="resultChecked" type="checkbox" value="@competency.SelfAssessmentStructureId">
108-
<label class="nhsuk-label nhsuk-checkboxes__label nhsuk-u-font-size-16" for="[email protected]">
109-
<h3 class="nhsuk-details__summary-text nhsuk-u-margin-bottom-0"> @competencyGroup.Key</h3>
110-
</label>
111-
</div>
11295

113-
<details class="nhsuk-details">
114-
<summary class="nhsuk-details__summary nhsuk-u-padding-0">
96+
<div class="nhsuk-checkboxes__item">
97+
<input data-group="@competencyGroup.Key" class="nhsuk-checkboxes__input select-all-checkbox" id="[email protected]" name="groupOptionalCompetenciesChecked" checked="@(competencyGroup.Any(x => x.IncludedInSelfAssessment == true) ? true : false)" type="checkbox" value="@competencyGroup.Key">
98+
<label class="nhsuk-label nhsuk-checkboxes__label nhsuk-u-font-size-16" for="[email protected]">
99+
<legend class="nhsuk-fieldset__legend nhsuk-fieldset__legend--l">
100+
<span class="nhsuk-fieldset__heading">
101+
@competencyGroup.Key
102+
</span>
103+
</legend>
104+
</label>
105+
</div>
106+
<details class="nhsuk-details">
107+
<summary class="nhsuk-details__summary nhsuk-u-padding-0">
108+
<h3 class="nhsuk-details__summary-text nhsuk-u-margin-bottom-0">
115109
<span class="nhsuk-u-margin-bottom-0">
116-
<span class="nhsuk-details__summary-text"> &nbsp;&nbsp; What&rsquo;s included in the @competency.CompetencyGroup </span>
110+
<span class="nhsuk-details__summary-text" id="@competencyGroup.Key">
111+
What&rsquo;s included in the @competencyGroup.Key
112+
</span>
117113
</span>
118-
</summary>
119114

120-
<div class="nhsuk-details__text nhsuk-u-margin-left-6 nhsuk-u-margin-top-2">
121-
@(Html.Raw(@competency.Name))
122-
</div>
123-
</details>
124-
<br />
125-
}
126-
else
127-
{
128-
<div class="nhsuk-checkboxes__item">
129-
<input class="nhsuk-checkboxes__input select-all-checkbox" data-group="@competencyGroup.Key" id="[email protected]" name="IncludedSelfAssessmentStructureIds" checked="@(Model.IncludedSelfAssessmentStructureIds != null ? Model.IncludedSelfAssessmentStructureIds.Contains((int)competency.SelfAssessmentStructureId) : false)" type="checkbox" value="@competency.SelfAssessmentStructureId">
130-
<label class="nhsuk-label nhsuk-checkboxes__label" for="[email protected]">
131-
@foreach (var flag in competency.CompetencyFlags)
132-
{
133-
<span class="nhsuk-u-padding-right-2 @(ViewData["cssClass"]?.ToString())">
134-
<strong class="nhsuk-tag @flag.FlagTagClass">
135-
@flag.FlagName
136-
</strong>
137-
</span>
138-
}
115+
</h3>
116+
</summary>
139117

140-
@competency.Name
141-
</label>
118+
<div class="nhsuk-details__text nhsuk-card">
119+
<dl class="nhsuk-summary-list">
120+
121+
@foreach (var competency in competencyGroup)
122+
{ <div class="nhsuk-summary-list__row">
123+
124+
<dd class="nhsuk-summary-list__value">
125+
@foreach (var flag in competency.CompetencyFlags)
126+
{
127+
<span class="nhsuk-u-padding-right-2 @(ViewData["cssClass"]?.ToString())">
128+
<strong class="nhsuk-tag @flag.FlagTagClass">
129+
@flag.FlagName
130+
</strong>
131+
</span>
132+
}
133+
@competency.Name
134+
</dd>
135+
</div>
136+
}
137+
</dl>
138+
</div>
139+
</details>
140+
}
141+
else
142+
{
143+
<legend class="nhsuk-fieldset__legend nhsuk-fieldset__legend--l">
144+
<span class="nhsuk-fieldset__heading">
145+
@competencyGroup.Key
146+
</span>
147+
</legend>
148+
<div class="nhsuk-grid-row nhsuk-u-margin-top-3 nhsuk-u-margin-bottom-1 js-only-block">
149+
<div class="nhsuk-grid-column-full">
150+
<a class="nhsuk-button select-all-button select-all status-tag nhsuk-u-margin-bottom-1" role="button" data-group="@competencyGroup.Key" name="selectAll" value="true">Select all @Model.VocabPlural().ToLower()</a>
151+
<a class="nhsuk-button select-all-button deselect-all status-tag nhsuk-u-margin-bottom-1" role="button" data-group="@competencyGroup.Key" id="" name="selectAll" value="false">Deselect all @Model.VocabPlural().ToLower()</a>
142152
</div>
143-
}
153+
</div>
154+
<div class="nhsuk-checkboxes">
155+
@foreach (var competency in competencyGroup)
156+
{
157+
<div class="nhsuk-checkboxes__item">
158+
<input class="nhsuk-checkboxes__input select-all-checkbox" data-group="@competencyGroup.Key" id="[email protected]" name="IncludedSelfAssessmentStructureIds" checked="@(Model.IncludedSelfAssessmentStructureIds != null ? Model.IncludedSelfAssessmentStructureIds.Contains((int)competency.SelfAssessmentStructureId) : false)" type="checkbox" value="@competency.SelfAssessmentStructureId">
159+
<label class="nhsuk-label nhsuk-checkboxes__label" for="[email protected]">
160+
@foreach (var flag in competency.CompetencyFlags)
161+
{
162+
<span class="nhsuk-u-padding-right-2 @(ViewData["cssClass"]?.ToString())">
163+
<strong class="nhsuk-tag @flag.FlagTagClass">
164+
@flag.FlagName
165+
</strong>
166+
</span>
167+
}
168+
169+
@competency.Name
170+
</label>
171+
</div>
172+
173+
}
174+
</div>
144175
}
145-
</div>
176+
}
146177
</fieldset>
147178
}
148179
</nhs-form-group>

DigitalLearningSolutions.Web/Views/LearningPortal/SelfAssessments/SelfAssessmentOverview.cshtml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@
6565
</div>
6666
}
6767
<partial name="_OverviewActionButtons.cshtml" model=Model />
68-
@if ((competencyQuestionsSummary == competencyVerifiedSummary) && (Model.NumberOfSelfAssessedOptionalCompetencies <= Model.SelfAssessment.MinimumOptionalCompetencies))
68+
@if ((competencyQuestionsSummary == competencyVerifiedSummary) && (Model.NumberOfSelfAssessedOptionalCompetencies < Model.SelfAssessment.MinimumOptionalCompetencies))
6969
{
7070
<div class="nhsuk-warning-callout">
7171
<h3 class="nhsuk-warning-callout__label">
@@ -198,6 +198,7 @@
198198
}
199199
@if (!Model.SupervisorSignOffs.Where(x => x.Verified == null).Any()
200200
&& latestResult > latestSignoff
201+
&& (Model.NumberOfSelfAssessedOptionalCompetencies >= Model.SelfAssessment.MinimumOptionalCompetencies)
201202
)
202203
{
203204
<a class="nhsuk-button nhsuk-button--secondary nhsuk-u-margin-bottom-2"

DigitalLearningSolutions.Web/Views/TrackingSystem/CourseSetup/AdminFields/AddAdminField.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
autocomplete=""
5454
hint-text=""
5555
css-class="nhsuk-u-width-full"
56-
required="true" />
56+
required="false" />
5757
<button name="action" class="nhsuk-button nhsuk-button--secondary" value="@AdminFieldsController.AddPromptAction">Add</button>
5858
</div>
5959
</div>

DigitalLearningSolutions.Web/Views/TrackingSystem/CourseSetup/AdminFields/EditAdminField.cshtml

Lines changed: 51 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,65 +6,66 @@
66
<link rel="stylesheet" href="@Url.Content("~/css/shared/cardWithButtons.css")" asp-append-version="true">
77

88
@{
9-
var errorHasOccurred = !ViewData.ModelState.IsValid;
10-
ViewData["Title"] = errorHasOccurred ? "Error: Edit course admin field" : "Edit course admin field";
11-
var cancelLinkData = Html.GetRouteValues();
9+
var errorHasOccurred = !ViewData.ModelState.IsValid;
10+
ViewData["Title"] = errorHasOccurred ? "Error: Edit course admin field" : "Edit course admin field";
11+
var cancelLinkData = Html.GetRouteValues();
1212
}
1313

1414
<div class="nhsuk-grid-row">
15-
<div class="nhsuk-grid-column-full">
16-
@if (errorHasOccurred) {
17-
<vc:error-summary order-of-property-names="@(new []{ nameof(EditAdminFieldViewModel.OptionsString), nameof(EditAdminFieldViewModel.Answer)})" />
18-
}
19-
<h1 class="nhsuk-heading-xl">Edit course admin field</h1>
15+
<div class="nhsuk-grid-column-full">
16+
@if (errorHasOccurred)
17+
{
18+
<vc:error-summary order-of-property-names="@(new []{ nameof(EditAdminFieldViewModel.OptionsString), nameof(EditAdminFieldViewModel.Answer)})" />
19+
}
20+
<h1 class="nhsuk-heading-xl">Edit course admin field</h1>
2021

21-
<form method="post" novalidate asp-action="EditAdminField">
22-
<div class="hidden-submit">
23-
<button name="action" class="nhsuk-button" value="@AdminFieldsController.AddPromptAction" aria-hidden="true" tabindex="-1">Add</button>
24-
</div>
22+
<form method="post" novalidate asp-action="EditAdminField">
23+
<div class="hidden-submit">
24+
<button name="action" class="nhsuk-button" value="@AdminFieldsController.AddPromptAction" aria-hidden="true" tabindex="-1">Add</button>
25+
</div>
2526

26-
<input type="hidden" asp-for="OptionsString" />
27-
<input type="hidden" asp-for="Prompt" />
28-
<input type="hidden" asp-for="PromptNumber" />
27+
<input type="hidden" asp-for="OptionsString" />
28+
<input type="hidden" asp-for="Prompt" />
29+
<input type="hidden" asp-for="PromptNumber" />
2930

30-
<vc:field-name-value-display display-name="Field" field-value="@Model.Prompt" />
31+
<vc:field-name-value-display display-name="Field" field-value="@Model.Prompt" />
3132

32-
@if (string.IsNullOrEmpty(Model.OptionsString))
33-
{
34-
<partial name="_NoConfiguredAnswers" />
35-
}
36-
else
37-
{
38-
<partial name="_AdminFieldAnswerTable" model="Model" />
39-
}
33+
@if (string.IsNullOrEmpty(Model.OptionsString))
34+
{
35+
<partial name="_NoConfiguredAnswers" />
36+
}
37+
else
38+
{
39+
<partial name="_AdminFieldAnswerTable" model="Model" />
40+
}
4041

41-
<div class="nhsuk-grid-row divider">
42-
<div class="nhsuk-grid-column-one-half">
43-
<vc:text-input asp-for="@nameof(Model.Answer)"
44-
label="Add a new response"
45-
populate-with-current-value="true"
46-
type="text"
47-
spell-check="true"
48-
autocomplete=""
49-
hint-text=""
50-
css-class="nhsuk-u-width-full"
51-
required="true" />
52-
<button name="action" class="nhsuk-button nhsuk-button--secondary" value="@AdminFieldsController.AddPromptAction">Add</button>
53-
</div>
54-
</div>
42+
<div class="nhsuk-grid-row divider">
43+
<div class="nhsuk-grid-column-one-half">
44+
<vc:text-input asp-for="@nameof(Model.Answer)"
45+
label="Add a new response"
46+
populate-with-current-value="true"
47+
type="text"
48+
spell-check="true"
49+
autocomplete=""
50+
hint-text=""
51+
css-class="nhsuk-u-width-full"
52+
required="false" />
53+
<button name="action" class="nhsuk-button nhsuk-button--secondary" value="@AdminFieldsController.AddPromptAction">Add</button>
54+
</div>
55+
</div>
5556

56-
<div class="nhsuk-grid-row divider">
57-
<div class="nhsuk-grid-column-one-half">
58-
<p class="nhsuk-label">Want to edit responses in bulk?</p>
59-
<button name="action" class="nhsuk-button nhsuk-button--secondary" value="@AdminFieldsController.BulkAction">Bulk edit</button>
60-
</div>
61-
</div>
57+
<div class="nhsuk-grid-row divider">
58+
<div class="nhsuk-grid-column-one-half">
59+
<p class="nhsuk-label">Want to edit responses in bulk?</p>
60+
<button name="action" class="nhsuk-button nhsuk-button--secondary" value="@AdminFieldsController.BulkAction">Bulk edit</button>
61+
</div>
62+
</div>
6263

63-
<div class="nhsuk-u-margin-bottom-3">
64-
<button name="action" class="nhsuk-button" value="@AdminFieldsController.SaveAction">Save</button>
65-
</div>
66-
</form>
64+
<div class="nhsuk-u-margin-bottom-3">
65+
<button name="action" class="nhsuk-button" value="@AdminFieldsController.SaveAction">Save</button>
66+
</div>
67+
</form>
6768

68-
<vc:cancel-link asp-controller="AdminFields" asp-action="Index" asp-all-route-data="@cancelLinkData" />
69-
</div>
69+
<vc:cancel-link asp-controller="AdminFields" asp-action="Index" asp-all-route-data="@cancelLinkData" />
70+
</div>
7071
</div>

0 commit comments

Comments
 (0)