Skip to content

Commit f3e9eaa

Browse files
authored
Merge pull request #3045 from TechnologyEnhancedLearning/Develop/Features/TD-5155-AssessmentQuestionsPage
TD-5155 Add assessment questions page
2 parents 96bfc9c + dd93615 commit f3e9eaa

File tree

9 files changed

+270
-60
lines changed

9 files changed

+270
-60
lines changed

DigitalLearningSolutions.Web/Controllers/FrameworksController/ImportCompetencies.cs

Lines changed: 62 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@
44
using DigitalLearningSolutions.Web.Models;
55
using DigitalLearningSolutions.Web.Services;
66
using DigitalLearningSolutions.Web.ViewModels.Frameworks.Import;
7+
using DocumentFormat.OpenXml.Office2010.ExcelAc;
78
using GDS.MultiPageFormData.Enums;
89
using Microsoft.AspNetCore.Mvc;
10+
using Microsoft.AspNetCore.Mvc.Rendering;
11+
using Microsoft.DotNet.Scaffolding.Shared.Project;
12+
using System.Collections.Generic;
913
using System.IO;
14+
using System.Linq;
1015

1116
namespace DigitalLearningSolutions.Web.Controllers.FrameworksController
1217
{
@@ -87,15 +92,69 @@ public IActionResult ImportCompleted()
8792
catch (InvalidHeadersException)
8893
{
8994
FileHelper.DeleteFile(webHostEnvironment, data.CompetenciesFileName);
90-
return View("ImportFailed");
95+
return View("Developer/Import/ImportFailed");
9196
}
9297
}
9398
[Route("/Framework/{frameworkId}/{tabname}/Import/AssessmentQuestions")]
9499
public IActionResult AddAssessmentQuestions()
95100
{
96101
var data = GetBulkUploadData();
97-
98-
return View();
102+
var adminId = GetAdminId();
103+
var defaultQuestions = frameworkService.GetFrameworkDefaultQuestionsById(data.FrameworkId, adminId);
104+
if (!data.DefaultQuestionIDs.Any() && defaultQuestions.Any() && data.AddDefaultAssessmentQuestions == true)
105+
{
106+
var defaultQuestionsList = new List<int>();
107+
foreach (var question in defaultQuestions)
108+
{
109+
defaultQuestionsList.Add(question.ID);
110+
}
111+
data.DefaultQuestionIDs = defaultQuestionsList;
112+
setBulkUploadData(data);
113+
}
114+
var questionList = frameworkService.GetAssessmentQuestions(data.FrameworkId, adminId).ToList();
115+
var questionSelectList = new SelectList(questionList, "ID", "Label");
116+
var model = new AddAssessmentQuestionsViewModel
117+
(
118+
data.FrameworkId,
119+
data.FrameworkName,
120+
data.FrameworkVocubulary,
121+
data.PublishStatusID,
122+
data.CompetenciesToAddCount,
123+
data.CompetenciesToUpdateCount,
124+
defaultQuestions,
125+
questionSelectList
126+
);
127+
model.AddDefaultAssessmentQuestions = data.AddDefaultAssessmentQuestions;
128+
model.AddCustomAssessmentQuestion = data.AddCustomAssessmentQuestion;
129+
model.DefaultAssessmentQuestionIDs = data.DefaultQuestionIDs;
130+
model.CustomAssessmentQuestionID = data.CustomAssessmentQuestionID;
131+
return View("Developer/Import/AddAssessmentQuestions", model);
132+
}
133+
[HttpPost]
134+
[Route("/Framework/{frameworkId}/{tabname}/Import/AssessmentQuestions")]
135+
public IActionResult AddAssessmentQuestions(AddAssessmentQuestionsFormData model)
136+
{
137+
var data = GetBulkUploadData();
138+
data.AddDefaultAssessmentQuestions = model.AddDefaultAssessmentQuestions;
139+
if (model.AddDefaultAssessmentQuestions)
140+
{
141+
data.DefaultQuestionIDs = model.DefaultAssessmentQuestionIDs;
142+
}
143+
else
144+
{
145+
data.DefaultQuestionIDs = [];
146+
}
147+
data.AddCustomAssessmentQuestion = model.AddCustomAssessmentQuestion;
148+
if (model.AddCustomAssessmentQuestion)
149+
{
150+
data.CustomAssessmentQuestionID = model.CustomAssessmentQuestionID;
151+
}
152+
else
153+
{
154+
data.CustomAssessmentQuestionID = null;
155+
}
156+
setBulkUploadData(data);
157+
return RedirectToAction("AddQuestionsToWhichCompetencies");
99158
}
100159
private void setupBulkUploadData(int frameworkId, int adminUserID, string competenciessFileName, string tabName, bool isNotBlank)
101160
{

DigitalLearningSolutions.Web/Models/BulkCompetenciesData.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ public BulkCompetenciesData(DetailFramework framework, int adminUserId, string c
2727
public int AdminUserId { get; set; }
2828
public bool IsNotBlank { get; set; }
2929
public string CompetenciesFileName { get; set; }
30-
public List<int> AssessmentQuestionIDs { get; set; }
31-
public int? AddAssessmentQuestionOption { get; set; }
30+
public List<int> DefaultQuestionIDs { get; set; } = [];
31+
public int? CustomAssessmentQuestionID { get; set; }
32+
public bool AddDefaultAssessmentQuestions { get; set; } = true;
33+
public bool AddCustomAssessmentQuestion { get; set; } = false;
3234
public int CompetenciesToProcessCount { get; set; }
3335
public int CompetenciesToAddCount { get; set; }
3436
public int CompetenciesToUpdateCount { get; set; }
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using System.Collections.Generic;
2+
3+
namespace DigitalLearningSolutions.Web.ViewModels.Frameworks.Import
4+
{
5+
public class AddAssessmentQuestionsFormData
6+
{
7+
public bool AddDefaultAssessmentQuestions { get; set; }
8+
public bool AddCustomAssessmentQuestion { get; set; }
9+
public List<int> DefaultAssessmentQuestionIDs { get; set; }
10+
public int? CustomAssessmentQuestionID { get; set; }
11+
}
12+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using DigitalLearningSolutions.Data.Models.Frameworks;
2+
using DigitalLearningSolutions.Web.Helpers;
3+
using Microsoft.AspNetCore.Mvc.Rendering;
4+
using System.Collections.Generic;
5+
6+
namespace DigitalLearningSolutions.Web.ViewModels.Frameworks.Import
7+
{
8+
public class AddAssessmentQuestionsViewModel(
9+
int frameworkId,
10+
string frameworkName,
11+
string frameworkVocabulary,
12+
int publishStatusId,
13+
int newCompetencies,
14+
int existingCompetencies,
15+
IEnumerable<AssessmentQuestion> defaultQuestions,
16+
SelectList questionSelectList
17+
) : AddAssessmentQuestionsFormData
18+
{
19+
public int FrameworkID { get; set; } = frameworkId;
20+
public string FrameworkName { get; set; } = frameworkName;
21+
public string FrameworkVocabularySingular { get; set; } = FrameworkVocabularyHelper.VocabularySingular(frameworkVocabulary);
22+
public string FrameworkVocabularyPlural { get; set; } = FrameworkVocabularyHelper.VocabularyPlural(frameworkVocabulary);
23+
public int PublishStatusID { get; set; } = publishStatusId;
24+
public int NewCompetencies { get; set; } = newCompetencies;
25+
public int ExistingCompetencies { get; set; } = existingCompetencies;
26+
public IEnumerable<AssessmentQuestion>? DefaultQuestions { get; set; } = defaultQuestions;
27+
public SelectList? QuestionSelectList { get; set; } = questionSelectList;
28+
}
29+
}
Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
@using DigitalLearningSolutions.Web.Extensions
2+
@using DigitalLearningSolutions.Web.ViewModels.Frameworks.Import
3+
4+
@model AddAssessmentQuestionsViewModel
5+
6+
@{
7+
ViewData["Application"] = "Framework Service";
8+
ViewData["HeaderPathName"] = "Framework Service";
9+
var errorHasOccurred = !ViewData.ModelState.IsValid;
10+
var checkListErrorClass = !ViewData.ModelState.IsValid && Model.AddDefaultAssessmentQuestions == null ? "nhsuk-form-group nhsuk-form-group--error" : "nhsuk-form-group";
11+
ViewData["Title"] = errorHasOccurred ? "Error: Add Assessment Questions" : "Add Assessment Questions";
12+
var cancelLinkData = Html.GetRouteValues();
13+
var hintTextString = Model.NewCompetencies != 0 && Model.ExistingCompetencies != 0 ? "new and/or updated " : (Model.NewCompetencies == 0 ? "updated " : "new ");
14+
}
15+
<link rel="stylesheet" href="@Url.Content("~/css/frameworks/frameworksShared.css")" asp-append-version="true">
16+
@section NavMenuItems {
17+
<partial name="Shared/_NavMenuItems" />
18+
}
19+
@section NavBreadcrumbs {
20+
<nav class="nhsuk-breadcrumb" aria-label="Breadcrumb">
21+
<div class="nhsuk-width-container">
22+
<ol class="nhsuk-breadcrumb__list">
23+
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ViewFrameworks" asp-route-tabname="Mine">Frameworks</a></li>
24+
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ViewFramework" asp-route-frameworkId="@ViewContext.RouteData.Values["frameworkId"]" asp-route-tabname="Structure">Framework Structure</a></li>
25+
<li class="nhsuk-breadcrumb__item">Bulk upload</li>
26+
</ol>
27+
<p class="nhsuk-breadcrumb__back"><a class="nhsuk-breadcrumb__backlink" asp-action="ViewFramework" asp-route-frameworkId="@ViewContext.RouteData.Values["frameworkId"]" asp-route-tabname="Structure">Back to framework structure</a></p>
28+
</div>
29+
</nav>
30+
}
31+
<div class="nhsuk-grid-row">
32+
<div class="nhsuk-grid-column-full">
33+
<div class="nhsuk-u-reading-width">
34+
@if (errorHasOccurred)
35+
{
36+
<vc:error-summary order-of-property-names="@(new []{ nameof(AddAssessmentQuestionsFormData.DefaultAssessmentQuestionIDs), nameof(AddAssessmentQuestionsFormData.CustomAssessmentQuestionID) })" />
37+
}
38+
<form enctype="multipart/form-data" method="post">
39+
<div class="nhsuk-form-group">
40+
<fieldset class="nhsuk-fieldset" aria-describedby="@(!ViewData.ModelState.IsValid && Model.AddDefaultAssessmentQuestions == true && !Model.DefaultAssessmentQuestionIDs.Any() ? "check-list-error" : "")">
41+
<legend class="nhsuk-fieldset__legend nhsuk-fieldset__legend--l">
42+
<h1 class="nhsuk-fieldset__heading">
43+
@ViewData["Title"]
44+
</h1>
45+
</legend>
46+
<div class="nhsuk-hint" id="contact-hint">
47+
Which assessment questions would you like to attach to the @hintTextString @Model.FrameworkVocabularyPlural.ToLower()?
48+
</div>
49+
<div class="nhsuk-checkboxes nhsuk-checkboxes--conditional">
50+
@if (Model.DefaultQuestions.Any())
51+
{
52+
<div class="nhsuk-checkboxes__item">
53+
<input class="nhsuk-checkboxes__input" id="defaultQuestions" type="checkbox" asp-for="@Model.AddDefaultAssessmentQuestions" aria-controls="conditional-default-questions" aria-expanded="false">
54+
<label class="nhsuk-label nhsuk-checkboxes__label" for="defaultQuestions">
55+
Default framework questions
56+
</label>
57+
<div class="nhsuk-hint nhsuk-checkboxes__hint" id="custom-question-hint">
58+
choose which default questions associated with this framework to add to the imported and/or updated @Model.FrameworkVocabularyPlural.ToLower()
59+
</div>
60+
<div class="nhsuk-checkboxes__conditional nhsuk-checkboxes__conditional--hidden" id="conditional-default-questions">
61+
62+
<div class="nhsuk-form-group">
63+
<div class="nhsuk-checkboxes">
64+
@foreach (var (defaultQuestion, index) in Model.DefaultQuestions.Select((t, i) => (t, i)))
65+
{
66+
<div class="nhsuk-checkboxes__item">
67+
<input class="nhsuk-checkboxes__input default-question-checkbox"
68+
type="checkbox"
69+
name="DefaultAssessmentQuestionIDs"
70+
71+
checked="@Model.DefaultAssessmentQuestionIDs.Contains(@defaultQuestion.ID)"
72+
value="@defaultQuestion.ID" />
73+
<label class="nhsuk-label nhsuk-checkboxes__label word-break" for="[email protected]">
74+
@defaultQuestion.Question
75+
</label>
76+
</div>
77+
}
78+
</div>
79+
</div>
80+
</div>
81+
</div>
82+
}
83+
<div class="nhsuk-checkboxes__item">
84+
<input class="nhsuk-checkboxes__input" id="customQuestion" type="checkbox" asp-for="@Model.AddCustomAssessmentQuestion" aria-controls="conditional-custom-question" aria-expanded="false" aria-describedby="custom-question-hint">
85+
<label class="nhsuk-label nhsuk-checkboxes__label" for="customQuestion">
86+
Custom assessment question
87+
</label>
88+
</div>
89+
<div class="nhsuk-checkboxes__conditional nhsuk-checkboxes__conditional--hidden" id="conditional-custom-question">
90+
91+
<label class="nhsuk-label" for="select-question">
92+
Add an existing assessment question to the uploaded @Model.FrameworkVocabularyPlural.ToLower()
93+
</label>
94+
<select class="nhsuk-select nhsuk-u-width-three-quarters" id="select-question" asp-items="@Model.QuestionSelectList" asp-for="@Model.CustomAssessmentQuestionID"></select>
95+
</div>
96+
</div>
97+
</fieldset>
98+
</div>
99+
<button class="nhsuk-button" type="submit">Next</button>
100+
</form>
101+
<vc:back-link asp-controller="Frameworks" asp-action="Index" asp-all-route-data="@null" link-text="Cancel" />
102+
</div>
103+
</div>
104+
</div>

0 commit comments

Comments
 (0)