Skip to content

Commit 4ae7907

Browse files
authored
Merge pull request #3136 from TechnologyEnhancedLearning/Develop/Features/TD-5309-assessment-vocabulary
TD-5309 Implements edit assessment vocabulary page
2 parents db460eb + 6276a88 commit 4ae7907

File tree

6 files changed

+187
-2
lines changed

6 files changed

+187
-2
lines changed

DigitalLearningSolutions.Data/DataServices/CompetencyAssessmentDataService.cs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ int categoryId
4040
bool UpdateCompetencyAssessmentDescription(int competencyAssessmentId, int adminId, string competencyAssessmentDescription);
4141
bool UpdateIntroductoryTextTaskStatus(int assessmentId, bool taskStatus);
4242
bool UpdateBrandingTaskStatus(int assessmentId, bool taskStatus);
43+
bool UpdateVocabularyTaskStatus(int assessmentId, bool taskStatus);
4344
//INSERT DATA
4445
int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName);
4546
bool InsertSelfAssessmentFramework(int adminId, int selfAssessmentId, int frameworkId);
@@ -399,5 +400,23 @@ public bool UpdateBrandingTaskStatus(int assessmentId, bool taskStatus)
399400
}
400401
return true;
401402
}
403+
404+
public bool UpdateVocabularyTaskStatus(int assessmentId, bool taskStatus)
405+
{
406+
var numberOfAffectedRows = connection.Execute(
407+
@"UPDATE SelfAssessmentTaskStatus SET VocabularyTaskStatus = @taskStatus
408+
WHERE SelfAssessmentId = @assessmentId",
409+
new { assessmentId, taskStatus }
410+
);
411+
if (numberOfAffectedRows < 1)
412+
{
413+
logger.LogWarning(
414+
"Not updating VocabularyTaskStatus as db update failed. " +
415+
$"assessmentId: {assessmentId}, taskStatus: {taskStatus}"
416+
);
417+
return false;
418+
}
419+
return true;
420+
}
402421
}
403422
}

DigitalLearningSolutions.Web/Controllers/CompetencyAssessmentsController/CompetencyAssessments.cs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,5 +335,36 @@ public IActionResult EditBranding(EditBrandingViewModel model)
335335
competencyAssessmentService.UpdateBrandingTaskStatus(model.ID, model.TaskStatus ?? false);
336336
return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId = model.ID });
337337
}
338+
[Route("/CompetencyAssessments/{competencyAssessmentId}/Vocabulary/")]
339+
public IActionResult EditVocabulary(int competencyAssessmentId)
340+
{
341+
var adminId = GetAdminID();
342+
CompetencyAssessmentBase? competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
343+
if (competencyAssessmentBase == null)
344+
{
345+
logger.LogWarning($"Failed to load Vocabulary page for competencyAssessmentId: {competencyAssessmentId} adminId: {adminId}");
346+
return StatusCode(500);
347+
}
348+
if (competencyAssessmentBase.UserRole < 2)
349+
{
350+
return StatusCode(403);
351+
}
352+
var competencyAssessmentTaskStatus = competencyAssessmentService.GetCompetencyAssessmentTaskStatus(competencyAssessmentId, null);
353+
var model = new EditVocabularyViewModel(competencyAssessmentBase, competencyAssessmentTaskStatus.VocabularyTaskStatus);
354+
return View(model);
355+
}
356+
[HttpPost]
357+
[Route("/CompetencyAssessments/{competencyAssessmentId}/Vocabulary/")]
358+
public IActionResult SaveVocabulary(EditVocabularyViewModel model)
359+
{
360+
if (!ModelState.IsValid)
361+
{
362+
return View("EditVocabulary", model);
363+
}
364+
var adminId = GetAdminID();
365+
var isUpdated = competencyAssessmentService.UpdateCompetencyAssessmentVocabulary(model.ID, adminId, model.Vocabulary);
366+
competencyAssessmentService.UpdateVocabularyTaskStatus(model.ID, model.TaskStatus ?? false);
367+
return RedirectToAction("ManageCompetencyAssessment", new { competencyAssessmentId = model.ID });
368+
}
338369
}
339370
}

DigitalLearningSolutions.Web/Services/CompetencyAssessmentService.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using DigitalLearningSolutions.Data.DataServices;
2+
using DigitalLearningSolutions.Data.Models.Common;
23
using DigitalLearningSolutions.Data.Models.CompetencyAssessments;
34
using System.Collections.Generic;
45

@@ -28,10 +29,12 @@ public interface ICompetencyAssessmentService
2829
bool UpdateCompetencyAssessmentDescription(int assessmentId, int adminId, string description);
2930
bool UpdateCompetencyAssessmentBranding(int assessmentId, int adminId, int brandID, int categoryID);
3031
bool UpdateBrandingTaskStatus(int assessmentId, bool taskStatus);
32+
bool UpdateCompetencyAssessmentVocabulary(int assessmentId, int adminId, string vocabulary);
33+
bool UpdateVocabularyTaskStatus(int assessmentId, bool taskStatus);
3134

3235
//INSERT DATA
3336
int InsertCompetencyAssessment(int adminId, int centreId, string competencyAssessmentName, int? frameworkId);
34-
37+
3538
}
3639
public class CompetencyAssessmentService : ICompetencyAssessmentService
3740
{
@@ -119,5 +122,15 @@ public bool UpdateBrandingTaskStatus(int assessmentId, bool taskStatus)
119122
{
120123
return competencyAssessmentDataService.UpdateBrandingTaskStatus(assessmentId, taskStatus);
121124
}
125+
126+
bool ICompetencyAssessmentService.UpdateCompetencyAssessmentVocabulary(int assessmentId, int adminId, string vocabulary)
127+
{
128+
return competencyAssessmentDataService.UpdateCompetencyAssessmentVocabulary(assessmentId, adminId, vocabulary);
129+
}
130+
131+
bool ICompetencyAssessmentService.UpdateVocabularyTaskStatus(int assessmentId, bool taskStatus)
132+
{
133+
return competencyAssessmentDataService.UpdateVocabularyTaskStatus(assessmentId, taskStatus);
134+
}
122135
}
123136
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using DigitalLearningSolutions.Data.Models.CompetencyAssessments;
2+
using System.ComponentModel.DataAnnotations;
3+
4+
namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments
5+
{
6+
public class EditVocabularyViewModel
7+
{
8+
public EditVocabularyViewModel() { }
9+
public EditVocabularyViewModel(CompetencyAssessmentBase competencyAssessmentBase, bool? taskStatus)
10+
{
11+
ID = competencyAssessmentBase.ID;
12+
CompetencyAssessmentName = competencyAssessmentBase.CompetencyAssessmentName;
13+
Vocabulary = competencyAssessmentBase.Vocabulary;
14+
UserRole = competencyAssessmentBase.UserRole;
15+
TaskStatus = taskStatus;
16+
}
17+
public int ID { get; set; }
18+
public string CompetencyAssessmentName { get; set; } = string.Empty;
19+
[Required(ErrorMessage = "Select a vocabulary option")]
20+
public string Vocabulary { get; set; }
21+
public int UserRole { get; set; }
22+
public bool? TaskStatus { get; set; }
23+
}
24+
}
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
@using DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments
2+
@model EditVocabularyViewModel
3+
@{
4+
ViewData["Title"] = "Assessment Branding";
5+
ViewData["Application"] = "Framework Service";
6+
ViewData["HeaderPathName"] = "Framework Service";
7+
}
8+
9+
@section NavMenuItems {
10+
<partial name="Shared/_NavMenuItems" />
11+
}
12+
@section NavBreadcrumbs {
13+
<nav class="nhsuk-breadcrumb" aria-label="Breadcrumb">
14+
<div class="nhsuk-width-container">
15+
<ol class="nhsuk-breadcrumb__list">
16+
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ViewCompetencyAssessments" asp-route-tabname="Mine">Competency Assessments</a></li>
17+
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ManageCompetencyAssessment" asp-route-competencyAssessmentId="@Model.ID">Manage Competency Assessment</a></li>
18+
<li class="nhsuk-breadcrumb__item">Brand and category</li>
19+
</ol>
20+
<p class="nhsuk-breadcrumb__back"><a class="nhsuk-breadcrumb__backlink" asp-action="ManageCompetencyAssessment" asp-route-competencyAssessmentId="@Model.ID">Back to competency assessment detail</a></p>
21+
</div>
22+
</nav>
23+
}
24+
25+
<h1>Edit @Model.CompetencyAssessmentName vocabulary</h1>
26+
<form method="post">
27+
@if (!ViewData.ModelState.IsValid)
28+
{
29+
<partial name="_ErrorSummary" />
30+
}
31+
<nhs-form-group nhs-validation-for="Vocabulary">
32+
<fieldset class="nhsuk-fieldset">
33+
<legend class="nhsuk-fieldset__legend nhsuk-fieldset__legend--s">
34+
<h2 class="nhsuk-fieldset__heading">
35+
Choose assessment vocabulary - the name given to the building blocks of your assessment.
36+
</h2>
37+
</legend>
38+
<div class="nhsuk-radios">
39+
<div class="nhsuk-radios__item">
40+
<input class="nhsuk-radios__input" asp-for="Vocabulary" type="radio" value="Capability" aria-describedby="vocabulary-item-1-hint">
41+
<label class="nhsuk-label nhsuk-radios__label" for="Vocabulary">
42+
Capability | Capabilities
43+
</label>
44+
<div class="nhsuk-hint nhsuk-radios__hint" id="vocabulary-item-1-hint">
45+
The attributes (skills, knowledge and behaviours) which individuals bring to the workplace.
46+
</div>
47+
</div>
48+
49+
<div class="nhsuk-radios__item">
50+
<input class="nhsuk-radios__input" asp-for="Vocabulary" type="radio" value="Competence" aria-describedby="vocabulary-item-3-hint">
51+
<label class="nhsuk-label nhsuk-radios__label" for="Vocabulary">
52+
Competence | Competences
53+
</label>
54+
<div class="nhsuk-hint nhsuk-radios__hint" id="vocabulary-item-3-hint">
55+
Defined standards of performance, focused on the outputs of work and observable performance.
56+
</div>
57+
</div>
58+
<div class="nhsuk-radios__item">
59+
<input class="nhsuk-radios__input" asp-for="Vocabulary" type="radio" value="Proficiency" aria-describedby="vocabulary-item-4-hint">
60+
<label class="nhsuk-label nhsuk-radios__label" for="Vocabulary">
61+
Proficiency | Proficiencies
62+
</label>
63+
<div class="nhsuk-hint nhsuk-radios__hint" id="vocabulary-item-4-hint">
64+
The knowledge and skills that registered nurses must demonstrate when caring for people of all ages and across all care settings.
65+
</div>
66+
</div>
67+
<div class="nhsuk-radios__item">
68+
<input class="nhsuk-radios__input" asp-for="Vocabulary" type="radio" value="Competency" aria-describedby="vocabulary-item-2-hint">
69+
<label class="nhsuk-label nhsuk-radios__label" for="Vocabulary">
70+
Competency | Competencies
71+
</label>
72+
<div class="nhsuk-hint nhsuk-radios__hint" id="vocabulary-item-2-hint">
73+
The same as capability | capabilities.<br />
74+
The term capabilities is recommended to make a clear distinction from competences.
75+
</div>
76+
</div>
77+
</div>
78+
</fieldset>
79+
<span nhs-validation-for="Vocabulary"></span>
80+
</nhs-form-group>
81+
<nhs-form-group nhs-validation-for="TaskStatus">
82+
<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>
83+
</nhs-form-group>
84+
<input name="ID" type="hidden" asp-for="ID" />
85+
<input name="CompetencyAssessmentName" type="hidden" asp-for="CompetencyAssessmentName" />
86+
<input name="userRole" type="hidden" asp-for="UserRole" />
87+
<button class="nhsuk-button" type="submit">
88+
Save
89+
</button>
90+
<div class="nhsuk-back-link">
91+
<a class="nhsuk-back-link__link" asp-action="ManageCompetencyAssessment" asp-route-competencyAssessmentId="@Model.ID">
92+
<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">
93+
<path d="M13.41 12l5.3-5.29a1 1 0 1 0-1.42-1.42L12 10.59l-5.29-5.3a1 1 0 0 0-1.42 1.42l5.3 5.29-5.3 5.29a1 1 0 0 0 0 1.42 1 1 0 0 0 1.42 0l5.29-5.3 5.29 5.3a1 1 0 0 0 1.42 0 1 1 0 0 0 0-1.42z"></path>
94+
</svg>
95+
Cancel
96+
</a>
97+
</div>
98+
</form>

DigitalLearningSolutions.Web/Views/CompetencyAssessments/ManageCompetencyAssessment.cshtml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@
8787
</li>
8888
<li class="nhsuk-task-list__item nhsuk-task-list__item--with-link">
8989
<div class="nhsuk-task-list__name-and-hint" aria-describedby="vocabulary-status">
90-
<a class="nhsuk-link nhsuk-task-list__link" asp-action="AssessmentVocabulary" asp-route-competencyAssessmentId="@ViewContext.RouteData.Values["competencyAssessmentId"]">
90+
<a class="nhsuk-link nhsuk-task-list__link" asp-action="EditVocabulary" asp-route-competencyAssessmentId="@ViewContext.RouteData.Values["competencyAssessmentId"]">
9191
Select assessment vocabulary (@Model.Vocabulary)
9292
</a>
9393
</div>

0 commit comments

Comments
 (0)