Skip to content

Commit 8be64c1

Browse files
authored
Merge pull request #2974 from TechnologyEnhancedLearning/Develop/Fixes/TD-4893-Delegateactivities-viewcoursedelegatesresultedin500errorwhencourseadminfieldappliedfiltersgotdeleted
TD-4893 Delegate activities - view course delegates resulted in 500 error when course admin field applied filters got deleted
2 parents ef382c3 + 01bde99 commit 8be64c1

File tree

4 files changed

+64
-28
lines changed

4 files changed

+64
-28
lines changed

DigitalLearningSolutions.Data/DataServices/CourseDataService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ int EnrolOnActivitySelfAssessment(int selfAssessmentId, int candidateId, int sup
139139
public IEnumerable<DelegateAssessmentStatistics> GetDelegateAssessmentStatisticsAtCentre(string searchString, int centreId, string categoryName, string isActive, int? categoryId);
140140

141141
bool IsSelfEnrollmentAllowed(int customisationId);
142-
Customisation? GetCourse(int customisationId);
142+
Customisation? GetCourse(int? customisationId);
143143
}
144144

145145
public class CourseDataService : ICourseDataService
@@ -2024,7 +2024,7 @@ public bool IsSelfEnrollmentAllowed(int customisationId)
20242024
return selfRegister > 0;
20252025
}
20262026

2027-
public Customisation? GetCourse(int customisationId)
2027+
public Customisation? GetCourse(int? customisationId)
20282028
{
20292029
return connection.Query<Customisation>(
20302030
@"SELECT CustomisationID

DigitalLearningSolutions.Data/Helpers/FilteringHelper.cs

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,7 @@ public static string BuildFilterValueString(string group, string propertyName, s
6666
? defaultFilterValue
6767
: AddNewFilterToFilterString(existingFilterString, newFilterToAdd);
6868
}
69-
70-
public static string? GetCategoryAndTopicFilterString(
69+
public static string? GetCategoryAndTopicFilterString(
7170
string? categoryFilterString,
7271
string? topicFilterString
7372
)
@@ -168,7 +167,59 @@ public static string GetFilterValueForRegistrationPrompt(int promptNumber, strin
168167
: answer;
169168
return BuildFilterValueString(group, group.Split('(')[0], propertyValue);
170169
}
170+
public static string? GetValidFilters(string existingFilterString, string newFilterToAdd, IEnumerable<FilterModel> availableFilters, HttpRequest request, string cookieName)
171+
{
172+
var cookieValue = request.Cookies[cookieName];
173+
if (string.IsNullOrEmpty(cookieValue) || cookieValue == EmptyFiltersCookieValue)
174+
{
175+
return existingFilterString;
176+
}
177+
var existingFilters = cookieValue.Split(FilterSeparator);
178+
var validFilterValues = availableFilters
179+
.SelectMany(filter => filter.FilterOptions)
180+
.Select(option => option.FilterValue)
181+
.ToHashSet();
182+
183+
var filteredResults = existingFilters
184+
.Where(entry => IsFilterInvalid(entry, validFilterValues))
185+
.ToList();
186+
var newCookieValue = string.Join(FilterSeparator, filteredResults);
187+
if (string.IsNullOrEmpty(newCookieValue)) return null;
188+
newCookieValue = AddNewFilterToFilterString(newCookieValue, newFilterToAdd);
189+
return RemoveDuplicateFilters( newFilterToAdd, newCookieValue);
190+
}
171191

192+
private static bool IsFilterInvalid(string filterEntry, HashSet<string> validFilterValues)
193+
{
194+
if (validFilterValues.Contains(filterEntry)) return true;
195+
return false;
196+
}
197+
public static string RemoveDuplicateFilters(string newFilterToAdd, string? existingFilterString)
198+
{
199+
if (string.IsNullOrEmpty(existingFilterString))
200+
{
201+
return existingFilterString ?? string.Empty;
202+
}
203+
var selectedFilters = existingFilterString.Split(FilteringHelper.FilterSeparator).ToList();
204+
if (!string.IsNullOrEmpty(newFilterToAdd))
205+
{
206+
var filterHeader = newFilterToAdd.Split(FilteringHelper.Separator)[0];
207+
var dupfilters = selectedFilters.Where(x => x.Contains(filterHeader));
208+
if (dupfilters.Count() > 1)
209+
{
210+
foreach (var filter in selectedFilters)
211+
{
212+
if (filter.Contains(filterHeader))
213+
{
214+
selectedFilters.Remove(filter);
215+
existingFilterString = string.Join(FilteringHelper.FilterSeparator, selectedFilters);
216+
break;
217+
}
218+
}
219+
}
220+
}
221+
return existingFilterString;
222+
}
172223
private static IEnumerable<FilterOptionModel> GetFilterOptionsForPromptWithOptions(Prompt prompt)
173224
{
174225
var group = GetFilterGroupForPrompt(prompt);

DigitalLearningSolutions.Web/Controllers/TrackingSystem/Delegates/ActivityDelegatesController.cs

Lines changed: 7 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,7 @@ public IActionResult Index(
9595

9696
sortBy ??= DefaultSortByOptions.Name.PropertyName;
9797
sortDirection ??= GenericSortingHelper.Ascending;
98-
99-
existingFilterString = FilteringHelper.GetFilterString(
98+
existingFilterString = FilteringHelper.GetFilterString(
10099
existingFilterString,
101100
newFilterToAdd,
102101
clearFilters,
@@ -142,25 +141,7 @@ public IActionResult Index(
142141
if (!string.IsNullOrEmpty(existingFilterString))
143142
{
144143
var selectedFilters = existingFilterString.Split(FilteringHelper.FilterSeparator).ToList();
145-
146-
if (!string.IsNullOrEmpty(newFilterToAdd))
147-
{
148-
var filterHeader = newFilterToAdd.Split(FilteringHelper.Separator)[0];
149-
var dupfilters = selectedFilters.Where(x => x.Contains(filterHeader));
150-
if (dupfilters.Count() > 1)
151-
{
152-
foreach (var filter in selectedFilters)
153-
{
154-
if (filter.Contains(filterHeader))
155-
{
156-
selectedFilters.Remove(filter);
157-
existingFilterString = string.Join(FilteringHelper.FilterSeparator, selectedFilters);
158-
break;
159-
}
160-
}
161-
}
162-
}
163-
144+
existingFilterString = FilteringHelper.RemoveDuplicateFilters(newFilterToAdd, existingFilterString);
164145
if (selectedFilters.Count > 0)
165146
{
166147
foreach (var filter in selectedFilters)
@@ -276,7 +257,10 @@ public IActionResult Index(
276257
var activityName = isCourseDelegate
277258
? courseService.GetCourseNameAndApplication((int)customisationId).CourseName
278259
: selfAssessmentService.GetSelfAssessmentNameById((int)selfAssessmentId);
279-
260+
if (!string.IsNullOrEmpty(existingFilterString))
261+
{
262+
existingFilterString = FilteringHelper.GetValidFilters( existingFilterString, newFilterToAdd, availableFilters, Request, filterCookieName);
263+
}
280264
if (isCourseDelegate)
281265
{
282266
var result = paginateService.Paginate(
@@ -591,6 +575,7 @@ DelegateAccessRoute accessedVia
591575
return RedirectToAction("Index", "ActivityDelegates", routeData, returnPageQuery.Value.ItemIdToReturnTo);
592576
}
593577
}
578+
594579
}
595580
}
596581

DigitalLearningSolutions.Web/Services/CourseService.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ int diagCompletionThreshold
134134
int GetNumberOfActiveCoursesAtCentreFilteredByCategory(int centreId, int? categoryId);
135135
public IEnumerable<Course> GetApplicationsAvailableToCentre(int centreId);
136136
bool IsSelfEnrollmentAllowed(int customisationId);
137-
Customisation? GetCourse(int customisationId);
137+
Customisation? GetCourse(int? customisationId);
138138
}
139139

140140
public class CourseService : ICourseService
@@ -632,7 +632,7 @@ public bool IsSelfEnrollmentAllowed(int customisationId)
632632
return courseDataService.IsSelfEnrollmentAllowed(customisationId);
633633
}
634634

635-
public Customisation? GetCourse(int customisationId)
635+
public Customisation? GetCourse(int? customisationId)
636636
{
637637
return courseDataService.GetCourse(customisationId);
638638
}

0 commit comments

Comments
 (0)