Skip to content

Commit 0c4351d

Browse files
TD-5636 Issue allowing to add duplicate resources on 'Competence Resource signposting' screen
1 parent 0403feb commit 0c4351d

File tree

4 files changed

+110
-73
lines changed

4 files changed

+110
-73
lines changed

DigitalLearningSolutions.Data/DataServices/CompetencyLearningResourcesDataService.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public interface ICompetencyLearningResourcesDataService
1414

1515
IEnumerable<CompetencyResourceAssessmentQuestionParameter> GetCompetencyResourceAssessmentQuestionParameters(IEnumerable<int> competencyLearningResourceIds);
1616
int AddCompetencyLearningResource(int resourceRefID, string originalResourceName, string description, string resourceType, string link, string catalogue, decimal rating, int competencyID, int adminId);
17+
IEnumerable<CompetencyLearningResource> GetActiveCompetencyLearningResourcesByCompetencyIdAndReferenceId(int competencyId, int referenceId);
1718
}
1819

1920
public class CompetencyLearningResourcesDataService : ICompetencyLearningResourcesDataService
@@ -120,5 +121,20 @@ FROM CompetencyResourceAssessmentQuestionParameters
120121
new { competencyLearningResourceIds }
121122
);
122123
}
124+
public IEnumerable<CompetencyLearningResource> GetActiveCompetencyLearningResourcesByCompetencyIdAndReferenceId(int competencyId, int referenceId)
125+
{
126+
return connection.Query<CompetencyLearningResource>(
127+
@"SELECT
128+
clr.ID,
129+
clr.CompetencyID,
130+
clr.LearningResourceReferenceID,
131+
clr.AdminID,
132+
lrr.ResourceRefID AS LearningHubResourceReferenceId
133+
FROM CompetencyLearningResources AS clr
134+
INNER JOIN LearningResourceReferences AS lrr ON lrr.ID = clr.LearningResourceReferenceID
135+
WHERE CompetencyID = @competencyId AND ResourceRefID = @referenceId AND clr.RemovedDate IS NULL",
136+
new { competencyId, referenceId }
137+
);
138+
}
123139
}
124140
}

DigitalLearningSolutions.Web/Controllers/FrameworksController/Signposting.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,13 @@ public IActionResult ConfirmAddCompetencyLearningResourceSummary(CompetencyResou
107107
{
108108
var frameworkCompetency = frameworkService.GetFrameworkCompetencyById(model.FrameworkCompetencyId.Value);
109109
string plainTextDescription = DisplayStringHelper.RemoveMarkup(model.Description);
110+
var competencyLearningResource = competencyLearningResourcesService.GetActiveCompetencyLearningResourcesByCompetencyIdAndReferenceId(frameworkCompetency.CompetencyID, model.ReferenceId);
111+
if (competencyLearningResource.Any())
112+
{
113+
ModelState.Clear();
114+
ModelState.AddModelError("LearningResourceExists", "This learning resource is already signposted to the selected competency.");
115+
return View("Developer/AddCompetencyLearningResourceSummary", model);
116+
}
110117
int competencyLearningResourceId = competencyLearningResourcesService.AddCompetencyLearningResource(model.ReferenceId, model.ResourceName, plainTextDescription, model.ResourceType, model.Link, model.SelectedCatalogue, model.Rating.Value, frameworkCompetency.CompetencyID, GetAdminId());
111118
return RedirectToAction("StartSignpostingParametersSession", "Frameworks", new { model.FrameworkId, model.FrameworkCompetencyId, model.FrameworkCompetencyGroupId, competencyLearningResourceId });
112119
}

DigitalLearningSolutions.Web/Services/CompetencyLearningResourcesService.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public interface ICompetencyLearningResourcesService
1313

1414
IEnumerable<CompetencyResourceAssessmentQuestionParameter> GetCompetencyResourceAssessmentQuestionParameters(IEnumerable<int> competencyLearningResourceIds);
1515
int AddCompetencyLearningResource(int resourceRefID, string originalResourceName, string description, string resourceType, string link, string catalogue, decimal rating, int competencyID, int adminId);
16+
IEnumerable<CompetencyLearningResource> GetActiveCompetencyLearningResourcesByCompetencyIdAndReferenceId(int competencyId, int referenceId);
1617
}
1718
public class CompetencyLearningResourcesService : ICompetencyLearningResourcesService
1819
{
@@ -40,5 +41,9 @@ public IEnumerable<CompetencyResourceAssessmentQuestionParameter> GetCompetencyR
4041
{
4142
return competencyLearningResourcesDataService.GetCompetencyResourceAssessmentQuestionParameters(competencyLearningResourceIds);
4243
}
44+
public IEnumerable<CompetencyLearningResource> GetActiveCompetencyLearningResourcesByCompetencyIdAndReferenceId(int competencyId, int referenceId)
45+
{
46+
return competencyLearningResourcesDataService.GetActiveCompetencyLearningResourcesByCompetencyIdAndReferenceId(competencyId, referenceId);
47+
}
4348
}
4449
}

DigitalLearningSolutions.Web/Views/Frameworks/Developer/AddCompetencyLearningResourceSummary.cshtml

Lines changed: 82 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -2,72 +2,81 @@
22
@using DigitalLearningSolutions.Web.Helpers;
33
@model CompetencyResourceSummaryViewModel
44
@{
5-
ViewData["Title"] = "Add Competency Learning Resource Summary";
6-
ViewData["Application"] = "Framework Service";
7-
ViewData["HeaderPathName"] = "Framework Service";
5+
var errorHasOccurred = !ViewData.ModelState.IsValid;
6+
ViewData["Title"] = errorHasOccurred ? "Error: Add Competency Learning Resource Summary" : "Add Competency Learning Resource Summary";
7+
ViewData["Application"] = "Framework Service";
8+
ViewData["HeaderPathName"] = "Framework Service";
89
}
910
<link rel="stylesheet" href="@Url.Content("~/css/frameworks/frameworksShared.css")" asp-append-version="true">
1011

1112
@section NavMenuItems {
12-
<partial name="Shared/_NavMenuItems" />
13+
<partial name="Shared/_NavMenuItems" />
1314
}
14-
@section NavBreadcrumbs {
15-
<nav class="nhsuk-breadcrumb" aria-label="Breadcrumb">
16-
<div class="nhsuk-width-container">
17-
<ol class="nhsuk-breadcrumb__list">
18-
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ViewFrameworks" asp-route-tabname="Mine">Frameworks</a></li>
19-
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ViewFramework" asp-fragment="[email protected]" asp-route-frameworkId="@Model.FrameworkId" asp-route-tabname="Structure">Framework Structure</a></li>
20-
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="EditCompetencyLearningResources" asp-route-frameworkId="@Model.FrameworkId" asp-route-frameworkCompetencyId="@Model.FrameworkCompetencyId" asp-route-frameworkCompetencyGroupId="@Model.FrameworkCompetencyGroupId">Signposting</a></li>
21-
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="SearchLearningResources" asp-route-frameworkId="@Model.FrameworkId" asp-route-frameworkCompetencyId="@Model.FrameworkCompetencyId" asp-route-frameworkCompetencyGroupId="@Model.FrameworkCompetencyGroupId">Add Resource</a></li>
22-
<li class="nhsuk-breadcrumb__item">Summary</li>
23-
</ol>
24-
<p class="nhsuk-breadcrumb__back"><a class="nhsuk-breadcrumb__backlink" asp-action="AddCompetencyLearningResources" asp-route-frameworkId="@Model.FrameworkId" asp-route-frameworkCompetencyId="@Model.FrameworkCompetencyId" asp-route-frameworkCompetencyGroupId="@Model.FrameworkCompetencyGroupId">Back to Add Resource</a></p>
25-
</div>
26-
</nav>
15+
@section NavBreadcrumbs {
16+
<nav class="nhsuk-breadcrumb" aria-label="Breadcrumb">
17+
<div class="nhsuk-width-container">
18+
<ol class="nhsuk-breadcrumb__list">
19+
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ViewFrameworks" asp-route-tabname="Mine">Frameworks</a></li>
20+
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="ViewFramework" asp-fragment="[email protected]" asp-route-frameworkId="@Model.FrameworkId" asp-route-tabname="Structure">Framework Structure</a></li>
21+
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="EditCompetencyLearningResources" asp-route-frameworkId="@Model.FrameworkId" asp-route-frameworkCompetencyId="@Model.FrameworkCompetencyId" asp-route-frameworkCompetencyGroupId="@Model.FrameworkCompetencyGroupId">Signposting</a></li>
22+
<li class="nhsuk-breadcrumb__item"><a class="nhsuk-breadcrumb__link trigger-loader" asp-action="SearchLearningResources" asp-route-frameworkId="@Model.FrameworkId" asp-route-frameworkCompetencyId="@Model.FrameworkCompetencyId" asp-route-frameworkCompetencyGroupId="@Model.FrameworkCompetencyGroupId">Add Resource</a></li>
23+
<li class="nhsuk-breadcrumb__item">Summary</li>
24+
</ol>
25+
<p class="nhsuk-breadcrumb__back"><a class="nhsuk-breadcrumb__backlink" asp-action="AddCompetencyLearningResources" asp-route-frameworkId="@Model.FrameworkId" asp-route-frameworkCompetencyId="@Model.FrameworkCompetencyId" asp-route-frameworkCompetencyGroupId="@Model.FrameworkCompetencyGroupId">Back to Add Resource</a></p>
26+
</div>
27+
</nav>
2728
}
28-
<h1>Add Competency Learning Resource Summary</h1>
29-
<form method="post" role="search" asp-controller="Frameworks">
29+
<div class="nhsuk-grid-row">
30+
<div class="nhsuk-grid-column-full">
31+
@if (errorHasOccurred)
32+
{
33+
<vc:error-summary order-of-property-names="@(new[] { "LearningResourceExists" })" />
34+
}
35+
<h1 class="nhsuk-heading-xl">@ViewData["Title"]</h1>
36+
</div>
37+
</div>
38+
<form method="post" role="search" asp-controller="Frameworks">
3039
<dl class="nhsuk-summary-list nhsuk-u-margin-bottom-3">
31-
<div class="nhsuk-summary-list__row">
32-
<dt class="nhsuk-summary-list__key">Competency</dt>
33-
<dd class="nhsuk-summary-list__value">@Model.NameOfCompetency</dd>
34-
</div>
35-
<div class="nhsuk-summary-list__row">
36-
<dt class="nhsuk-summary-list__key">Resource name</dt>
37-
<dd class="nhsuk-summary-list__value">@Model.ResourceName</dd>
38-
</div>
39-
<div class="nhsuk-summary-list__row">
40-
<dt class="nhsuk-summary-list__key">Resource type</dt>
41-
<dd class="nhsuk-summary-list__value">@Model.ResourceType</dd>
42-
</div>
43-
<div class="nhsuk-summary-list__row">
44-
<dt class="nhsuk-summary-list__key">Catalogue</dt>
45-
<dd class="nhsuk-summary-list__value">@Model.SelectedCatalogue</dd>
46-
</div>
47-
<div class="nhsuk-summary-list__row">
48-
<dt class="nhsuk-summary-list__key">Description</dt>
49-
<dd class="nhsuk-summary-list__value">@DisplayStringHelper.RemoveMarkup(Model.Description)</dd>
50-
</div>
51-
<div class="nhsuk-summary-list__row">
52-
<dd class="nhsuk-summary-list__key">
53-
<div class="nhsuk-u-margin-top-3">
54-
<button asp-action="ConfirmAddCompetencyLearningResourceSummary" class="nhsuk-button nhsuk-u-margin-right-2">
55-
Confirm
56-
</button>
57-
<button class="nhsuk-button nhsuk-button--secondary"
58-
asp-action="SearchLearningResources"
59-
asp-route-frameworkId="@Model.FrameworkId"
60-
asp-route-frameworkCompetencyId="@Model.FrameworkCompetencyId"
61-
asp-route-frameworkCompetencyGroupId="@Model.FrameworkCompetencyGroupId"
62-
asp-route-searchText=""
63-
asp-route-catalogueId="0"
64-
asp-route-page="1">
65-
Restart search
66-
</button>
67-
</div>
68-
</dd>
69-
<dd class="nhsuk-summary-list__value"></dd>
70-
</div>
40+
<div class="nhsuk-summary-list__row">
41+
<dt class="nhsuk-summary-list__key">Competency</dt>
42+
<dd class="nhsuk-summary-list__value">@Model.NameOfCompetency</dd>
43+
</div>
44+
<div class="nhsuk-summary-list__row">
45+
<dt class="nhsuk-summary-list__key">Resource name</dt>
46+
<dd class="nhsuk-summary-list__value">@Model.ResourceName</dd>
47+
</div>
48+
<div class="nhsuk-summary-list__row">
49+
<dt class="nhsuk-summary-list__key">Resource type</dt>
50+
<dd class="nhsuk-summary-list__value">@Model.ResourceType</dd>
51+
</div>
52+
<div class="nhsuk-summary-list__row">
53+
<dt class="nhsuk-summary-list__key">Catalogue</dt>
54+
<dd class="nhsuk-summary-list__value">@Model.SelectedCatalogue</dd>
55+
</div>
56+
<div class="nhsuk-summary-list__row">
57+
<dt class="nhsuk-summary-list__key">Description</dt>
58+
<dd class="nhsuk-summary-list__value">@DisplayStringHelper.RemoveMarkup(Model.Description)</dd>
59+
</div>
60+
<div class="nhsuk-summary-list__row">
61+
<dd class="nhsuk-summary-list__key">
62+
<div class="nhsuk-u-margin-top-3">
63+
<button asp-action="ConfirmAddCompetencyLearningResourceSummary" class="nhsuk-button nhsuk-u-margin-right-2">
64+
Confirm
65+
</button>
66+
<button class="nhsuk-button nhsuk-button--secondary"
67+
asp-action="SearchLearningResources"
68+
asp-route-frameworkId="@Model.FrameworkId"
69+
asp-route-frameworkCompetencyId="@Model.FrameworkCompetencyId"
70+
asp-route-frameworkCompetencyGroupId="@Model.FrameworkCompetencyGroupId"
71+
asp-route-searchText=""
72+
asp-route-catalogueId="0"
73+
asp-route-page="1">
74+
Restart search
75+
</button>
76+
</div>
77+
</dd>
78+
<dd class="nhsuk-summary-list__value"></dd>
79+
</div>
7180
</dl>
7281
@Html.HiddenFor(m => m.FrameworkId)
7382
@Html.HiddenFor(m => m.FrameworkCompetencyGroupId)
@@ -79,19 +88,19 @@
7988
@Html.HiddenFor(m => m.Link)
8089
@Html.HiddenFor(m => m.SelectedCatalogue)
8190
@Html.HiddenFor(m => m.Rating)
82-
</form>
83-
<div class="nhsuk-back-link nhsuk-u-margin-left-1">
91+
</form>
92+
<div class="nhsuk-back-link nhsuk-u-margin-left-1">
8493
<a class="nhsuk-back-link__link"
85-
asp-action="SearchLearningResources"
86-
asp-route-frameworkId="@Model.FrameworkId"
87-
asp-route-frameworkCompetencyId="@Model.FrameworkCompetencyId"
88-
asp-route-frameworkCompetencyGroupId="@Model.FrameworkCompetencyGroupId"
89-
asp-route-searchText="@Model.SearchText"
90-
asp-route-catalogueId="@Model.CatalogueId"
91-
asp-route-page="@Model.Page">
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
94+
asp-action="SearchLearningResources"
95+
asp-route-frameworkId="@Model.FrameworkId"
96+
asp-route-frameworkCompetencyId="@Model.FrameworkCompetencyId"
97+
asp-route-frameworkCompetencyGroupId="@Model.FrameworkCompetencyGroupId"
98+
asp-route-searchText="@Model.SearchText"
99+
asp-route-catalogueId="@Model.CatalogueId"
100+
asp-route-page="@Model.Page">
101+
<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">
102+
<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>
103+
</svg>
104+
Cancel
96105
</a>
97-
</div>
106+
</div>

0 commit comments

Comments
 (0)