Skip to content

Commit 0d51709

Browse files
committed
TD-5216 Adds competency vocabulary to views
1 parent 4b4f529 commit 0d51709

File tree

10 files changed

+251
-217
lines changed

10 files changed

+251
-217
lines changed

DigitalLearningSolutions.Data/Models/Frameworks/Import/ImportCompetenciesResult.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ IReadOnlyCollection<CompetencyTableRow> competencyTableRows
2222
{
2323
ProcessedCount = competencyTableRows.Count;
2424
CompetencyAddedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyInserted | dr.RowStatus == RowStatus.CompetencyGroupAndCompetencyInserted);
25+
CompetencyUpdatedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyUpdated);
2526
GroupAddedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.CompetencyGroupInserted | dr.RowStatus == RowStatus.CompetencyGroupAndCompetencyInserted);
2627
SkippedCount = competencyTableRows.Count(dr => dr.RowStatus == RowStatus.Skipped);
2728
Errors = competencyTableRows.Where(dr => dr.Error.HasValue).Select(dr => (dr.RowNumber, dr.Error!.Value));

DigitalLearningSolutions.Web/Controllers/FrameworksController/ImportCompetencies.cs

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,8 @@ public IActionResult ImportCompetencies(int frameworkId, string tabname, bool is
2020
var userRole = frameworkService.GetAdminUserRoleForFrameworkId(adminId, frameworkId);
2121
if (userRole < 2)
2222
return StatusCode(403);
23-
var model = new ImportCompetenciesViewModel()
24-
{
25-
Framework = framework,
26-
IsNotBlank = isNotBlank
27-
};
23+
var model = new ImportCompetenciesViewModel(framework, isNotBlank);
24+
2825
return View("Developer/Import/Index", model);
2926
}
3027
public IActionResult DownloadCompetencies(int frameworkId, int DownloadOption)
@@ -80,7 +77,7 @@ public IActionResult ImportCompleted()
8077
try
8178
{
8279
var results = importCompetenciesFromFileService.PreProcessCompetenciesTable(workbook);
83-
var resultsModel = new ImportCompetenciesPreProcessViewModel(results) { IsNotBlank = data.IsNotBlank, TabName = data.TabName };
80+
var resultsModel = new ImportCompetenciesPreProcessViewModel(results, data) { IsNotBlank = data.IsNotBlank, TabName = data.TabName };
8481
data.CompetenciesToProcessCount = resultsModel.ToProcessCount;
8582
data.CompetenciesToAddCount = resultsModel.CompetenciesToAddCount;
8683
data.CompetenciesToUpdateCount = resultsModel.CompetenciesToUpdateCount;
@@ -104,8 +101,9 @@ private void setupBulkUploadData(int frameworkId, int adminUserID, string compet
104101
{
105102
TempData.Clear();
106103
multiPageFormService.ClearMultiPageFormData(MultiPageFormDataFeature.AddCustomWebForm("BulkCompetencyDataCWF"), TempData);
104+
var framework = frameworkService.GetFrameworkDetailByFrameworkId(frameworkId, adminUserID);
107105
var today = clockUtility.UtcToday;
108-
var bulkUploadData = new BulkCompetenciesData(frameworkId, adminUserID, competenciessFileName, tabName, isNotBlank);
106+
var bulkUploadData = new BulkCompetenciesData(framework, adminUserID, competenciessFileName, tabName, isNotBlank);
109107
setBulkUploadData(bulkUploadData);
110108
}
111109
private void setBulkUploadData(BulkCompetenciesData bulkUploadData)

DigitalLearningSolutions.Web/Models/BulkCompetenciesData.cs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,28 @@
1-
using System.Collections.Generic;
1+
using DigitalLearningSolutions.Data.Models.Frameworks;
2+
using System.Collections;
3+
using System.Collections.Generic;
24
using System.Linq;
35

46
namespace DigitalLearningSolutions.Web.Models
57
{
68
public class BulkCompetenciesData
79
{
810
public BulkCompetenciesData() { }
9-
public BulkCompetenciesData(int frameworkId, int adminUserId, string competenciesFileName, string tabName, bool isNotBlank)
11+
public BulkCompetenciesData(DetailFramework framework, int adminUserId, string competenciesFileName, string tabName, bool isNotBlank)
1012
{
11-
FrameworkId = frameworkId;
13+
FrameworkId = framework.ID;
14+
FrameworkName = framework.FrameworkName;
15+
PublishStatusID = framework.PublishStatusID;
16+
FrameworkVocubulary = framework.FrameworkConfig;
1217
AdminUserId = adminUserId;
1318
CompetenciesFileName = competenciesFileName;
1419
TabName = tabName;
1520
IsNotBlank = isNotBlank;
1621
}
1722
public int FrameworkId { get; set; }
23+
public string? FrameworkName { get; set; }
24+
public int PublishStatusID { get; set; }
25+
public string FrameworkVocubulary { get; set; }
1826
public string TabName { get; set; }
1927
public int AdminUserId { get; set; }
2028
public bool IsNotBlank { get; set; }

DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/ImportCompetenciesPreProcessViewModel.cs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,29 @@
33
using DigitalLearningSolutions.Web.Models;
44
using System.Linq;
55
using DigitalLearningSolutions.Data.Models.Frameworks.Import;
6+
using DigitalLearningSolutions.Web.Helpers;
67

78
namespace DigitalLearningSolutions.Web.ViewModels.Frameworks.Import
89
{
910
public class ImportCompetenciesPreProcessViewModel
1011
{
11-
public ImportCompetenciesPreProcessViewModel(ImportCompetenciesResult bulkCompetenciesResult)
12+
public ImportCompetenciesPreProcessViewModel(ImportCompetenciesResult bulkCompetenciesResult, BulkCompetenciesData bulkCompetenciesData)
1213
{
14+
FrameworkName = bulkCompetenciesData.FrameworkName;
15+
PublishStatusID = bulkCompetenciesData.PublishStatusID;
16+
FrameworkVocabularySingular = FrameworkVocabularyHelper.VocabularySingular(bulkCompetenciesData.FrameworkVocubulary);
17+
FrameworkVocabularyPlural = FrameworkVocabularyHelper.VocabularyPlural(bulkCompetenciesData.FrameworkVocubulary);
1318
ToProcessCount = bulkCompetenciesResult.ProcessedCount;
1419
CompetenciesToAddCount = bulkCompetenciesResult.CompetencyAddedCount;
15-
CompetenciesToUpdateCount = bulkCompetenciesResult.CompetencyUpdatedCount;
20+
ToUpdateOrSkipCount = bulkCompetenciesResult.CompetencyUpdatedCount;
1621
CompetencyGroupsToAddCount = bulkCompetenciesResult.GroupAddedCount;
1722
CompetencyGroupsToUpdateCount = bulkCompetenciesResult.GroupUpdatedCount;
18-
Errors = bulkCompetenciesResult.Errors.Select(x => (x.RowNumber, MapReasonToErrorMessage(x.Reason)));
23+
Errors = bulkCompetenciesResult.Errors.Select(x => (x.RowNumber, MapReasonToErrorMessage(x.Reason, FrameworkVocabularyHelper.VocabularySingular(bulkCompetenciesData.FrameworkVocubulary))));
1924
}
20-
25+
public string? FrameworkName { get; set; }
26+
public int PublishStatusID { get; set; }
27+
public string FrameworkVocabularySingular { get; set; }
28+
public string FrameworkVocabularyPlural { get; set; }
2129
public IEnumerable<(int RowNumber, string ErrorMessage)> Errors { get; set; }
2230
public int ErrorCount => Errors.Count();
2331
public int ToProcessCount { get; set; }
@@ -30,18 +38,18 @@ public ImportCompetenciesPreProcessViewModel(ImportCompetenciesResult bulkCompet
3038
public bool IsNotBlank { get; set; }
3139
public string TabName { get; set; }
3240

33-
private static string MapReasonToErrorMessage(ImportCompetenciesResult.ErrorReason reason)
41+
private static string MapReasonToErrorMessage(ImportCompetenciesResult.ErrorReason reason, string vocabularySingular)
3442
{
3543
return reason switch
3644
{
3745
ImportCompetenciesResult.ErrorReason.TooLongCompetencyGroupName =>
3846
"Group name must be 255 characters or less.",
3947
ImportCompetenciesResult.ErrorReason.MissingCompetencyName =>
40-
"Competency is blank. Competency is a required field and cannot be left blank",
48+
vocabularySingular + " is blank. " + vocabularySingular + " is a required field and cannot be left blank",
4149
ImportCompetenciesResult.ErrorReason.InvalidId =>
42-
"The ID provided does not match a Competency ID in this Framework",
50+
"The ID provided does not match a " + vocabularySingular + " ID in this Framework",
4351
ImportCompetenciesResult.ErrorReason.TooLongCompetencyName =>
44-
"Competency must be 255 characters or less.",
52+
vocabularySingular + " must be 500 characters or less.",
4553
ImportCompetenciesResult.ErrorReason.InvalidAlwaysShowDescription =>
4654
"Always show description is invalid. The Always show description field must contain 'TRUE' or 'FALSE'",
4755
_ => "Unspecified error.",

DigitalLearningSolutions.Web/ViewModels/Frameworks/Import/ImportCompetenciesResultsViewModel.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ private string MapReasonToErrorMessage(ImportCompetenciesResult.ErrorReason reas
2828
"Competency name was not provided. Competency name is a required field and cannot be left blank",
2929
ImportCompetenciesResult.ErrorReason.TooLongCompetencyName => "Competency name must be 500 characters or fewer",
3030
ImportCompetenciesResult.ErrorReason.TooLongCompetencyGroupName => "Competency group name must be 255 characters or fewer",
31+
_ => "Unknown error",
3132
};
3233
}
3334
}
Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,25 @@
11
namespace DigitalLearningSolutions.Web.ViewModels.Frameworks.Import
22
{
33
using DigitalLearningSolutions.Data.Models.Frameworks;
4-
using DigitalLearningSolutions.Web.Attributes;
5-
using Microsoft.AspNetCore.Http;
6-
using System.ComponentModel.DataAnnotations;
4+
using DigitalLearningSolutions.Web.Helpers;
75

86
public class ImportCompetenciesViewModel : ImportCompetenciesFormData
97
{
10-
public DetailFramework Framework { get; set; }
8+
public ImportCompetenciesViewModel(DetailFramework framework, bool isNotBlank)
9+
{
10+
FrameworkID = framework.ID;
11+
FrameworkName = framework.FrameworkName;
12+
FrameworkVocabularySingular = FrameworkVocabularyHelper.VocabularySingular(framework.FrameworkConfig);
13+
FrameworkVocabularyPlural = FrameworkVocabularyHelper.VocabularyPlural(framework.FrameworkConfig);
14+
PublishStatusID = framework.PublishStatusID;
15+
IsNotBlank = isNotBlank;
16+
}
17+
public int FrameworkID { get; set; }
18+
public string FrameworkName { get; set; }
19+
public string FrameworkVocabularySingular { get; set; }
20+
public string FrameworkVocabularyPlural { get; set; }
21+
public int PublishStatusID { get; set; }
1122
public bool IsNotBlank { get; set; }
23+
1224
}
1325
}

DigitalLearningSolutions.Web/Views/Frameworks/Developer/Import/ImportCompleted.cshtml

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -27,57 +27,59 @@
2727
</nav>
2828
}
2929
<h1 class="nhsuk-heading-xl">Delegate file uploaded</h1>
30-
<p class="nhsuk-body-l">@(Model.ErrorCount == 0 ? "Your file is error free and ready to be processed. Check the information below looks, correct before processing" : "Your file contains the following, including some errors:")</p>
31-
<ul>
32-
<li>@Model.ToProcessCount @(Model.ToProcessCount == 1 ? "row" : "rows") to process</li>
33-
<li>@Model.CompetenciesToAddCount new @(Model.CompetenciesToAddCount == 1 ? "competency" : "competencies") to add</li>
34-
<li>@Model.ToUpdateOrSkipCount delegate @(Model.ToUpdateOrSkipCount == 1 ? "record" : "records") to update (or skip if unchanged)</li>
35-
@if (Model.ErrorCount > 0)
30+
<div class="nhsuk-width-container">
31+
<p class="nhsuk-body-l">@(Model.ErrorCount == 0 ? "Your file is error free and ready to be processed. Check the information below looks, correct before processing" : "Your file contains the following, including some errors:")</p>
32+
<ul>
33+
<li>@Model.ToProcessCount @(Model.ToProcessCount == 1 ? "row" : "rows") to process</li>
34+
<li>@Model.CompetenciesToAddCount new @(Model.CompetenciesToAddCount == 1 ? Model.FrameworkVocabularySingular.ToLower() : Model.FrameworkVocabularyPlural.ToLower()) to add</li>
35+
<li>@Model.ToUpdateOrSkipCount @Model.FrameworkVocabularySingular.ToLower() @(Model.ToUpdateOrSkipCount == 1 ? "record" : "records") to update (or skip if unchanged)</li>
36+
@if (Model.ErrorCount > 0)
37+
{
38+
<li>@Model.ErrorCount @(Model.ErrorCount == 1 ? "row" : "rows") containing errors that cannot be processed</li>
39+
}
40+
else
41+
{
42+
<li>No errors</li>
43+
}
44+
</ul>
45+
@if (Model.ErrorCount == 0)
3646
{
37-
<li>@Model.ErrorCount @(Model.ErrorCount == 1 ? "row" : "rows") containing errors that cannot be processed</li>
47+
<a asp-controller="Frameworks" role="button" asp-route-tabname="Structure" asp-action="AddAssessmentQuestions" class="nhsuk-button">Continue</a>
3848
}
3949
else
4050
{
41-
<li>No errors</li>
42-
}
43-
</ul>
44-
@if (Model.ErrorCount == 0)
45-
{
46-
<a asp-controller="Frameworks" role="button" asp-route-tabname="Structure" asp-action="AddAssessmentQuestions" class="nhsuk-button">Continue</a>
47-
}
48-
else
49-
{
50-
<p class="nhsuk-body-l">Check the information below. You will need fix these errors before continuing or remove the rows with errors from your spreadsheet:</p>
51-
<div class="nhsuk-form-group nhsuk-form-group--error">
52-
<span class="nhsuk-error-message" id="error-list">
53-
<span class="nhsuk-u-visually-hidden">Error:</span> @Model.ErrorCount delegate @(Model.ErrorCount == 1 ? "row" : "rows") contain errors and cannot be processed
54-
</span>
55-
<dl class="nhsuk-summary-list">
56-
@foreach (var (rowNumber, errorMessage) in Model.Errors)
57-
{
58-
<div class="nhsuk-summary-list__row">
59-
<dt class="nhsuk-summary-list__key">
60-
Row @rowNumber
61-
</dt>
62-
<dd class="nhsuk-summary-list__value">
63-
@errorMessage
64-
</dd>
51+
<p class="nhsuk-body-l">Check the information below. You will need fix these errors before continuing or remove the rows with errors from your spreadsheet:</p>
52+
<div class="nhsuk-form-group nhsuk-form-group--error">
53+
<span class="nhsuk-error-message" id="error-list">
54+
<span class="nhsuk-u-visually-hidden">Error:</span> @Model.ErrorCount @Model.FrameworkVocabularySingular.ToLower() @(Model.ErrorCount == 1 ? "row" : "rows") contain errors and cannot be processed
55+
</span>
56+
<dl class="nhsuk-summary-list">
57+
@foreach (var (rowNumber, errorMessage) in Model.Errors)
58+
{
59+
<div class="nhsuk-summary-list__row">
60+
<dt class="nhsuk-summary-list__key">
61+
Row @rowNumber
62+
</dt>
63+
<dd class="nhsuk-summary-list__value">
64+
@errorMessage
65+
</dd>
6566

66-
</div>
67-
}
68-
</dl>
69-
</div>
70-
<h2>Upload corrected file</h2>
71-
<p class="nhsuk-body-m">
72-
Once you have made corrections to the Excel competency workbook to address the errors above, save and restart the upload process.
73-
</p>
74-
<form class="nhsuk-u-margin-bottom-3" method="post" enctype="multipart/form-data">
67+
</div>
68+
}
69+
</dl>
70+
</div>
71+
<h2>Upload corrected file</h2>
72+
<p class="nhsuk-body-m">
73+
Once you have made corrections to the Excel competency workbook to address the errors above, save and restart the upload process.
74+
</p>
75+
<form class="nhsuk-u-margin-bottom-3" method="post" enctype="multipart/form-data">
7576

76-
<vc:file-input asp-for="@nameof(Model.ImportFile)" label="File with corrected competencies information" hint-text="" css-class="nhsuk-u-width-one-half" />
77-
<input type="hidden" asp-for="IsNotBlank" />
78-
<input type="hidden" asp-for="TabName" />
77+
<vc:file-input asp-for="@nameof(Model.ImportFile)" label="File with corrected @Model.FrameworkVocabularyPlural.ToLower() information" hint-text="" css-class="nhsuk-u-width-one-half" />
78+
<input type="hidden" asp-for="IsNotBlank" />
79+
<input type="hidden" asp-for="TabName" />
7980

80-
<button class="nhsuk-button" type="submit">Upload file</button>
81-
</form>
82-
}
83-
<vc:back-link asp-controller="Frameworks" asp-action="Index" asp-all-route-data="@null" link-text="Cancel" />
81+
<button class="nhsuk-button" type="submit">Upload file</button>
82+
</form>
83+
}
84+
<vc:back-link asp-controller="Frameworks" asp-action="Index" asp-all-route-data="@null" link-text="Cancel" />
85+
</div>

0 commit comments

Comments
 (0)