Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1426,11 +1426,34 @@ public int InsertAssessmentQuestionRoleRequirementForSelfAssessment(int assessme
{
var numberOfAffectedRows = connection.Execute(
@"INSERT INTO CompetencyAssessmentQuestionRoleRequirements
(SelfAssessmentID, CompetencyID, AssessmentQuestionID, LevelValue, LevelRAG)
SELECT sas.SelfAssessmentID, sas.CompetencyID, caq.AssessmentQuestionID, @levelValue AS LevelValue, @levelRAG AS LevelRAG
FROM SelfAssessmentStructure AS sas INNER JOIN
CompetencyAssessmentQuestions AS caq ON sas.CompetencyID = caq.CompetencyID
WHERE (sas.SelfAssessmentID = @assessmentId) AND (caq.AssessmentQuestionID = @assessmentQuestionId);"
(
SelfAssessmentID,
CompetencyID,
AssessmentQuestionID,
LevelValue,
LevelRAG
)
SELECT DISTINCT
sas.SelfAssessmentID,
sas.CompetencyID,
caq.AssessmentQuestionID,
@levelValue,
@levelRAG
FROM SelfAssessmentStructure AS sas
INNER JOIN CompetencyAssessmentQuestions AS caq
ON sas.CompetencyID = caq.CompetencyID
WHERE
sas.SelfAssessmentID = @assessmentId
AND caq.AssessmentQuestionID = @assessmentQuestionId
AND NOT EXISTS
(
SELECT 1
FROM CompetencyAssessmentQuestionRoleRequirements existing
WHERE existing.SelfAssessmentID = sas.SelfAssessmentID
AND existing.CompetencyID = sas.CompetencyID
AND existing.AssessmentQuestionID = caq.AssessmentQuestionID
AND existing.LevelValue = @levelValue
);"
,
new { assessmentId, assessmentQuestionId, levelValue, levelRAG }
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,8 @@ public static class ConfigurationExtensions
private const string LearningHubOpenApiKey = "LearningHubOpenAPIKey";
private const string LearningHubOpenApiBaseUrl = "LearningHubOpenAPIBaseUrl";
private const string PricingPageEnabled = "FeatureManagement:PricingPage";

private const string ShowDlsLoginButton = "FeatureManagement:ShowDlsLoginButton";

private const string LearningHubAuthBaseUrl = "BaseUrl";
private const string LearningHubAuthLoginEndpoint = "LoginEndpoint";
private const string LearningHubAuthLinkingEndpoint = "LinkingEndpoint";
Expand Down Expand Up @@ -118,7 +119,11 @@ public static bool IsPricingPageEnabled(this IConfiguration config)
bool.TryParse(config[PricingPageEnabled], out bool isEnabled);
return isEnabled;
}

public static bool IsDlsLoginButtonShown(this IConfiguration config)
{
bool.TryParse(config[ShowDlsLoginButton], out bool isEnabled);
return isEnabled;
}
public static int GetLearningHubSsoHashTolerance(this IConfiguration config)
{
int.TryParse(config[$"{LearningHubSsoSectionKey}:{LearningHubSsoToleranceKey}"], out int ssoHashTolerance);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -438,6 +438,11 @@ public IActionResult SelectFrameworkSources(SelectFrameworkSourcesFormData model
competencyAssessmentService.InsertSelfAssessmentFramework(adminId, competencyAssessmentId, model.FrameworkId.Value);
return RedirectToAction("SelectFrameworkSources", new { competencyAssessmentId, actionName = "Summary" });
}
else if (actionName == "ViewSelected")
{
competencyAssessmentService.InsertSelfAssessmentFramework(adminId, competencyAssessmentId, model.FrameworkId.Value);
return RedirectToAction("ViewSelectedCompetencies", new { competencyAssessmentId });
}
else
{
competencyAssessmentService.UpdateFrameworkLinksTaskStatus(model.CompetencyAssessmentId, model.TaskStatus ?? false, null);
Expand Down Expand Up @@ -484,7 +489,7 @@ public IActionResult ViewSelectedCompetencies(int competencyAssessmentId)
var linkedFrameworks = competencyAssessmentService.GetLinkedFrameworksForCompetencyAssessment(competencyAssessmentId);
if (!linkedFrameworks.Any())
{
return RedirectToAction("AddCompetenciesSelectFramework", new { competencyAssessmentId });
return RedirectToAction("SelectFrameworkSources", new { competencyAssessmentId, actionName = "ViewSelected" });
}
var adminId = GetAdminID();
var competencyAssessmentBase = competencyAssessmentService.GetCompetencyAssessmentBaseById(competencyAssessmentId, adminId);
Expand All @@ -496,7 +501,8 @@ public IActionResult ViewSelectedCompetencies(int competencyAssessmentId)
return View(model);
}
[Route("/Self-Assessment/{competencyAssessmentId}/Competencies/Add/SelectFramework")]
public IActionResult AddCompetenciesSelectFramework(int competencyAssessmentId)
[Route("/Self-Assessment/{competencyAssessmentId}/{actionName}/Competencies/Add/SelectFramework")]
public IActionResult AddCompetenciesSelectFramework(int competencyAssessmentId, string? actionName)
{
var linkedFrameworks = competencyAssessmentService.GetLinkedFrameworksForCompetencyAssessment(competencyAssessmentId);
if (!linkedFrameworks.Any())
Expand All @@ -513,6 +519,7 @@ public IActionResult AddCompetenciesSelectFramework(int competencyAssessmentId)
}
[HttpPost]
[Route("/Self-Assessment/{competencyAssessmentId}/Competencies/Add/SelectFramework")]
[Route("/Self-Assessment/{competencyAssessmentId}/{actionName}/Competencies/Add/SelectFramework")]
public IActionResult AddCompetenciesSelectFramework(AddCompetenciesSelectFrameworkFormData formdata)
{
if (!ModelState.IsValid)
Expand Down Expand Up @@ -579,6 +586,9 @@ public IActionResult AddComptencies(AddCompetenciesFormData model, int competenc
competency.CompetencyFlags = competencyFlags.Where(f => f.CompetencyId == competency.CompetencyID);
}
var models = new AddCompetenciesViewModel(competencyAssessmentBase, groupedCompetencies, ungroupedCompetencies, frameworkId, framework.FrameworkName, model.SelectedCompetencyIds);
ModelState.Clear();
ModelState.AddModelError("SelectedCompetencyIds", $"You must select at least one {models.VocabularySingular}");
ViewBag.RequiredCheckboxMessage = "You must select at least one "+ models.VocabularySingular;
return View("AddCompetencies", models);
}
if (model.SelectedCompetencyIds != null)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
using System.ComponentModel.DataAnnotations;

namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments
namespace DigitalLearningSolutions.Web.ViewModels.CompetencyAssessments
{
public class AddCompetenciesFormData
{
public int ID { get; set; }
[Required(ErrorMessage = "Select at least one competency")]
public int[] SelectedCompetencyIds { get; set; }
public int FrameworkId { get; set; }
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public AddCompetenciesViewModel(CompetencyAssessmentBase competencyAssessmentBas
public string VocabularyPlural { get; set; }
public IEnumerable<FrameworkCompetencyGroup> GroupedCompetencies { get; set; }
public IEnumerable<FrameworkCompetency> UngroupedCompetencies { get; set; }
[Required(ErrorMessage = "Select at least one competency")]
[Required]
public int[] SelectedCompetencyIds { get; set; }
public int FrameworkId { get; set; }
public string? FrameworkName { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public SelectFrameworkSourcesViewModel(CompetencyAssessmentBase competencyAssess
Frameworks = [.. frameworks
.Where(f => !excludedIds.Contains(f.ID))
.OrderBy(f => f.FrameworkName)];
AdditionalFrameworks = [.. additionalFrameworksIds.Select(id => frameworks.First(f => f.ID == id))];
AdditionalFrameworks = [.. additionalFrameworksIds.Select(id => frameworks.FirstOrDefault(f => f.ID == id))];
ActionName = actionName;
}
public IEnumerable<BrandedFramework> Frameworks { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@
ViewData["Title"] = $"Add {@Model.VocabularyPlural.ToLower()} to self-assessment";
ViewData["Application"] = "Framework service";
var errorHasOccurred = !ViewData.ModelState.IsValid;
var noSelection = Model.SelectedCompetencyIds == null || !Model.SelectedCompetencyIds.Any();
var isFirst = true;
}
<link rel="stylesheet" href="@Url.Content("~/css/frameworks/frameworksShared.css")" asp-append-version="true">
@section NavMenuItems {
Expand Down Expand Up @@ -40,6 +42,11 @@
Add @Model.VocabularyPlural.ToLower() to assessment
</h1>
</legend>
<div class="nhsuk-u-padding-top-1 nhsuk-u-padding-bottom-3">
<span class="error-message--margin-bottom-1 nhsuk-error-message">
<span>@ViewBag.RequiredCheckboxMessage</span>
</span>
</div>
@if (Model.GroupedCompetencies.Count() > 0)
{
@foreach (var competencyGroup in Model.GroupedCompetencies)
Expand All @@ -62,8 +69,18 @@
<div class="nhsuk-checkboxes">
@foreach (var competency in competencyGroup.FrameworkCompetencies)
{
var shouldAutofocus = noSelection && isFirst;
isFirst = false;
<div class="nhsuk-checkboxes__item">
<input class="nhsuk-checkboxes__input select-all-checkbox" data-group="@competencyGroup.CompetencyGroupID" id="competency-check-@competencyGroup.CompetencyGroupID-@competency.CompetencyID" name="SelectedCompetencyIds" checked="@(Model.SelectedCompetencyIds != null ? Model.SelectedCompetencyIds.Contains((int)competency.CompetencyID) : false)" type="checkbox" value="@competency.CompetencyID">
<input class="nhsuk-checkboxes__input select-all-checkbox"
data-group="@competencyGroup.CompetencyGroupID"
id="competency-check-@competencyGroup.CompetencyGroupID-@competency.CompetencyID"
name="SelectedCompetencyIds"
checked="@(Model.SelectedCompetencyIds != null ?
Model.SelectedCompetencyIds.Contains((int)competency.CompetencyID) : false)"
type="checkbox"
@(shouldAutofocus ? "autofocus" : "")
value="@competency.CompetencyID">
<label class="nhsuk-label nhsuk-checkboxes__label" for="competency-check-@competencyGroup.CompetencyGroupID-@competency.CompetencyID">
@foreach (var flag in competency.CompetencyFlags)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,45 +73,48 @@
}
</div>
}
@if (Model.AdditionalFrameworks.Count() > 0)
@if (Model?.AdditionalFrameworks != null && Model.AdditionalFrameworks.Any())
{
for (int i = 0; i < Model.AdditionalFrameworks.Count(); i++)
int i = 0;
foreach (var framework in Model.AdditionalFrameworks)
{
if (framework == null) continue;

<div class="nhsuk-summary-list__row">
<dt class="nhsuk-summary-list__key">
Additional framework @(i + 1)
</dt>
<dd class="nhsuk-summary-list__value">
@Model.AdditionalFrameworks.ElementAt(i).FrameworkName
@framework.FrameworkName
</dd>
@if (Model.UserRole > 1)
{
<dd class="nhsuk-summary-list__actions">
<ul class="nhsuk-summary-list__actions-list nhsuk-summary-list__actions-list--inline left-align-actions">
<li class="nhsuk-summary-list__actions-list-item">
<a asp-action="RemoveFramework"
asp-route-frameworkId="@Model.AdditionalFrameworks.ElementAt(i).ID"
asp-route-frameworkId="@framework.ID"
asp-route-competencyAssessmentId="@ViewContext.RouteData.Values["competencyAssessmentId"]">
Remove <span class="nhsuk-u-visually-hidden">@Model.AdditionalFrameworks.ElementAt(i).FrameworkName</span>
Remove <span class="nhsuk-u-visually-hidden">@framework.FrameworkName</span>
</a>
</li>
<li class="nhsuk-summary-list__actions-list-item">
<a asp-action="ConfirmMaKePrimaryFramework"
asp-route-frameworkId="@Model.AdditionalFrameworks.ElementAt(i).ID"
<a asp-action="ConfirmMakePrimaryFramework"
asp-route-frameworkId="@framework.ID"
asp-route-competencyAssessmentId="@ViewContext.RouteData.Values["competencyAssessmentId"]">
Make primary <span class="nhsuk-u-visually-hidden">@Model.AdditionalFrameworks.ElementAt(i).FrameworkName</span>
Make primary <span class="nhsuk-u-visually-hidden">@framework.FrameworkName</span>
</a>
</li>

</ul>
</dd>
}
</div>
i++;
}
}
</dl>
}
@if (Model.ActionName == "AddFramework")
@if (Model.ActionName == "AddFramework" || Model.ActionName == "ViewSelected")
{
<form method="post">
<div class="nhsuk-form-group">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,14 @@
}
else
{
@if (Configuration.IsDlsLoginButtonShown())
{
<li class="nhsuk-header__navigation-item @Html.GetSelectedCssClassIfTabSelected(NavMenuTab.LogIn)">
<a class="nhsuk-header__navigation-link" asp-controller="Login" asp-action="Index">
Log in
</a>
</li>
}
<li class="nhsuk-header__navigation-item @Html.GetSelectedCssClassIfTabSelected(NavMenuTab.Register)">
<a class="nhsuk-header__navigation-link" asp-controller="Register" asp-action="Start">
Register
Expand Down
3 changes: 2 additions & 1 deletion DigitalLearningSolutions.Web/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
"PricingPage": true,
"ShowSelfAssessmentProgressButtons": false,
"LoginWithLearningHub": true,
"TableauSelfAssessmentDashboards": true
"TableauSelfAssessmentDashboards": true,
"ShowDlsLoginButton": false
},
"LearningHubOpenAPIBaseUrl": "https://uks-learninghubnhsuk-openapi-test.azurewebsites.net",
"LearningHubOpenAPIKey": "",
Expand Down
Loading