Skip to content

Commit e25a178

Browse files
committed
TD-5135-Universal fix implemented for handling non-matching stored filter values
1 parent 28f843b commit e25a178

File tree

13 files changed

+185
-389
lines changed

13 files changed

+185
-389
lines changed

DigitalLearningSolutions.Data/Helpers/FilteringHelper.cs

Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ public static string BuildFilterValueString(string group, string propertyName, s
3636
{
3737
return existingFilterString;
3838
}
39-
40-
return existingFilterString + FilterSeparator + newFilterToAdd;
39+
var filterString = existingFilterString + FilterSeparator + newFilterToAdd;
40+
return RemoveDuplicateFilters(filterString, newFilterToAdd);
4141
}
4242

4343
public static string? GetFilterString(
@@ -46,7 +46,8 @@ public static string BuildFilterValueString(string group, string propertyName, s
4646
bool clearFilters,
4747
HttpRequest request,
4848
string cookieName,
49-
string? defaultFilterValue = null
49+
string? defaultFilterValue = null,
50+
IEnumerable<FilterModel>? availableFilters = null
5051
)
5152
{
5253
var cookieHasBeenSet = request.Cookies.ContainsKey(cookieName);
@@ -59,17 +60,19 @@ public static string BuildFilterValueString(string group, string propertyName, s
5960

6061
if (cookieHasBeenSet && noFiltersInQueryParams)
6162
{
62-
return request.Cookies[cookieName] == EmptyFiltersCookieValue ? null : request.Cookies[cookieName];
63+
return request.Cookies[cookieName] == EmptyFiltersCookieValue ? null : GetValidFilters(request.Cookies[cookieName], availableFilters);
6364
}
6465

65-
return noFiltersInQueryParams
66-
? defaultFilterValue
67-
: AddNewFilterToFilterString(existingFilterString, newFilterToAdd);
66+
var filterString = noFiltersInQueryParams
67+
? defaultFilterValue
68+
: AddNewFilterToFilterString(existingFilterString, newFilterToAdd);
69+
70+
return GetValidFilters(filterString, availableFilters);
6871
}
69-
public static string? GetCategoryAndTopicFilterString(
70-
string? categoryFilterString,
71-
string? topicFilterString
72-
)
72+
public static string? GetCategoryAndTopicFilterString(
73+
string? categoryFilterString,
74+
string? topicFilterString
75+
)
7376
{
7477
if (categoryFilterString == null && topicFilterString == null)
7578
{
@@ -167,34 +170,33 @@ public static string GetFilterValueForRegistrationPrompt(int promptNumber, strin
167170
: answer;
168171
return BuildFilterValueString(group, group.Split('(')[0], propertyValue);
169172
}
170-
public static string? GetValidFilters(string existingFilterString, string newFilterToAdd, IEnumerable<FilterModel> availableFilters, HttpRequest request, string cookieName)
173+
174+
public static string? GetValidFilters(string? existingFilterString, IEnumerable<FilterModel>? availableFilters)
171175
{
172-
var cookieValue = request.Cookies[cookieName];
173-
if (string.IsNullOrEmpty(cookieValue) || cookieValue == EmptyFiltersCookieValue)
176+
if (string.IsNullOrEmpty(existingFilterString) || availableFilters == null)
174177
{
175-
return existingFilterString;
178+
return null;
176179
}
177-
var existingFilters = cookieValue.Split(FilterSeparator);
180+
var existingFilters = existingFilterString.Split(FilterSeparator);
178181
var validFilterValues = availableFilters
179-
.SelectMany(filter => filter.FilterOptions)
180-
.Select(option => option.FilterValue)
181-
.ToHashSet();
182-
182+
.SelectMany(filter => filter.FilterOptions)
183+
.Select(option => option.FilterValue)
184+
.ToHashSet();
185+
183186
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);
187+
.Where(entry => IsFilterInvalid(entry, validFilterValues))
188+
.ToList();
189+
var newFilterString = string.Join(FilterSeparator, filteredResults);
190+
191+
return string.IsNullOrEmpty(newFilterString) ? null : newFilterString;
190192
}
191193

192-
private static bool IsFilterInvalid(string filterEntry, HashSet<string> validFilterValues)
194+
private static bool IsFilterInvalid(string filterEntry, HashSet<string> validFilterValues)
193195
{
194196
if (validFilterValues.Contains(filterEntry)) return true;
195197
return false;
196198
}
197-
public static string RemoveDuplicateFilters(string newFilterToAdd, string? existingFilterString)
199+
public static string RemoveDuplicateFilters(string? existingFilterString, string newFilterToAdd)
198200
{
199201
if (string.IsNullOrEmpty(existingFilterString))
200202
{

DigitalLearningSolutions.Web/Controllers/FindYourCentreController.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -57,25 +57,27 @@ public async Task<IActionResult> Index(
5757
return View("Index", model);
5858
}
5959

60-
existingFilterString = FilteringHelper.GetFilterString(
61-
existingFilterString,
62-
newFilterToAdd,
63-
clearFilters,
64-
Request,
65-
FindCentreFilterCookieName
66-
);
67-
6860
var centreSummaries = centresService.GetAllCentreSummariesForFindCentre();
6961
var regions = regionService.GetRegionsAlphabetical();
7062

7163
var availableFilters = FindYourCentreViewModelFilterOptions
7264
.GetFindCentreFilterModels(regions).ToList();
7365

66+
var filterString = FilteringHelper.GetFilterString(
67+
existingFilterString,
68+
newFilterToAdd,
69+
clearFilters,
70+
Request,
71+
FindCentreFilterCookieName,
72+
null,
73+
availableFilters
74+
);
75+
7476
var searchSortPaginationOptions = new SearchSortFilterAndPaginateOptions(
7577
new SearchOptions(searchString, searchMatchCutoff: 90),
7678
null,
7779
new FilterOptions(
78-
existingFilterString,
80+
filterString,
7981
availableFilters
8082
),
8183
new PaginationOptions(page, itemsPerPage)

DigitalLearningSolutions.Web/Controllers/LearningContentController.cs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,14 +53,6 @@ public IActionResult Index(
5353
}
5454

5555
sortBy ??= DefaultSortByOptions.Name.PropertyName;
56-
existingFilterString = FilteringHelper.GetFilterString(
57-
existingFilterString,
58-
newFilterToAdd,
59-
clearFilters,
60-
Request,
61-
BrandCoursesFilterCookieName
62-
);
63-
6456
var tutorials = tutorialService.GetPublicTutorialSummariesForBrand(brandId);
6557
var applications = courseService.GetApplicationsThatHaveSectionsByBrandId(brandId).ToList();
6658

@@ -69,11 +61,21 @@ public IActionResult Index(
6961
var availableFilters = LearningContentViewModelFilterOptions
7062
.GetFilterOptions(categories, topics).ToList();
7163

64+
var filterString = FilteringHelper.GetFilterString(
65+
existingFilterString,
66+
newFilterToAdd,
67+
clearFilters,
68+
Request,
69+
BrandCoursesFilterCookieName,
70+
null,
71+
availableFilters
72+
);
73+
7274
var searchSortPaginationOptions = new SearchSortFilterAndPaginateOptions(
7375
null,
7476
new SortOptions(sortBy, sortDirection),
7577
new FilterOptions(
76-
existingFilterString,
78+
filterString,
7779
availableFilters
7880
),
7981
new PaginationOptions(page)

DigitalLearningSolutions.Web/Controllers/TrackingSystem/Centre/Administrator/AdministratorController.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,13 +61,6 @@ public IActionResult Index(
6161
int? itemsPerPage = null
6262
)
6363
{
64-
existingFilterString = FilteringHelper.GetFilterString(
65-
existingFilterString,
66-
newFilterToAdd,
67-
clearFilters,
68-
Request,
69-
AdminFilterCookieName
70-
);
7164
searchString = searchString == null ? null : searchString.Trim();
7265
var centreId = User.GetCentreIdKnownNotNull();
7366
var adminsAtCentre = userService.GetAdminsByCentreId(centreId);
@@ -77,10 +70,20 @@ public IActionResult Index(
7770
var availableFilters =
7871
AdministratorsViewModelFilterOptions.GetAllAdministratorsFilterModels(categories);
7972

73+
var filterString = FilteringHelper.GetFilterString(
74+
existingFilterString,
75+
newFilterToAdd,
76+
clearFilters,
77+
Request,
78+
AdminFilterCookieName,
79+
null,
80+
availableFilters
81+
);
82+
8083
var searchSortPaginationOptions = new SearchSortFilterAndPaginateOptions(
8184
new SearchOptions(searchString),
8285
new SortOptions(GenericSortingHelper.DefaultSortOption, GenericSortingHelper.Ascending),
83-
new FilterOptions(existingFilterString, availableFilters),
86+
new FilterOptions(filterString, availableFilters),
8487
new PaginationOptions(page, itemsPerPage)
8588
);
8689

DigitalLearningSolutions.Web/Controllers/TrackingSystem/CourseSetup/CourseSetupController.cs

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -92,47 +92,33 @@ public IActionResult Index(
9292
sortBy ??= DefaultSortByOptions.Name.PropertyName;
9393
sortDirection ??= GenericSortingHelper.Ascending;
9494

95-
existingFilterString = FilteringHelper.GetFilterString(
95+
var centreId = User.GetCentreIdKnownNotNull();
96+
var categoryId = User.GetAdminCategoryId();
97+
var courseCategoryName = this.activityService.GetCourseCategoryNameForActivityFilter(categoryId);
98+
var Categories = courseCategoriesService.GetCategoriesForCentreAndCentrallyManagedCourses(centreId).Select(c => c.CategoryName);
99+
var Topics = courseTopicsService.GetCourseTopicsAvailableAtCentre(centreId).Select(c => c.CourseTopic);
100+
101+
var availableFilters = CourseStatisticsViewModelFilterOptions
102+
.GetFilterOptions(categoryId.HasValue ? new string[] { } : Categories, Topics).ToList();
103+
104+
var filterString = FilteringHelper.GetFilterString(
96105
existingFilterString,
97106
newFilterToAdd,
98107
clearFilters,
99108
Request,
100109
CourseFilterCookieName,
101-
CourseStatusFilterOptions.IsActive.FilterValue
110+
CourseStatusFilterOptions.IsActive.FilterValue,
111+
availableFilters
102112
);
103113

104-
var centreId = User.GetCentreIdKnownNotNull();
105-
var categoryId = User.GetAdminCategoryId();
106-
var courseCategoryName = this.activityService.GetCourseCategoryNameForActivityFilter(categoryId);
107-
var Categories = courseCategoriesService.GetCategoriesForCentreAndCentrallyManagedCourses(centreId).Select(c => c.CategoryName);
108-
var Topics = courseTopicsService.GetCourseTopicsAvailableAtCentre(centreId).Select(c => c.CourseTopic);
109-
110114
int offSet = ((page - 1) * itemsPerPage) ?? 0;
111115
string isActive, categoryName, courseTopic, hasAdminFields;
112116
isActive = categoryName = courseTopic = hasAdminFields = "Any";
113117
bool? hideInLearnerPortal = null;
114118

115-
if (!string.IsNullOrEmpty(existingFilterString))
119+
if (!string.IsNullOrEmpty(filterString))
116120
{
117-
var selectedFilters = existingFilterString.Split(FilteringHelper.FilterSeparator).ToList();
118-
119-
if (!string.IsNullOrEmpty(newFilterToAdd))
120-
{
121-
var filterHeader = newFilterToAdd.Split(FilteringHelper.Separator)[0];
122-
var dupfilters = selectedFilters.Where(x => x.Contains(filterHeader));
123-
if (dupfilters.Count() > 1)
124-
{
125-
foreach (var filter in selectedFilters)
126-
{
127-
if (filter.Contains(filterHeader))
128-
{
129-
selectedFilters.Remove(filter);
130-
existingFilterString = string.Join(FilteringHelper.FilterSeparator, selectedFilters);
131-
break;
132-
}
133-
}
134-
}
135-
}
121+
var selectedFilters = filterString.Split(FilteringHelper.FilterSeparator).ToList();
136122

137123
if (selectedFilters.Count > 0)
138124
{
@@ -173,14 +159,11 @@ public IActionResult Index(
173159
isActive, categoryName, courseTopic, hasAdminFields);
174160
}
175161

176-
var availableFilters = CourseStatisticsViewModelFilterOptions
177-
.GetFilterOptions(categoryId.HasValue ? new string[] { } : Categories, Topics).ToList();
178-
179162
var result = paginateService.Paginate(
180163
courses,
181164
resultCount,
182165
new PaginationOptions(page, itemsPerPage),
183-
new FilterOptions(existingFilterString, availableFilters),
166+
new FilterOptions(filterString, availableFilters),
184167
searchString,
185168
sortBy,
186169
sortDirection

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

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -95,34 +95,31 @@ public IActionResult Index(
9595

9696
sortBy ??= DefaultSortByOptions.Name.PropertyName;
9797
sortDirection ??= GenericSortingHelper.Ascending;
98-
existingFilterString = FilteringHelper.GetFilterString(
99-
existingFilterString,
100-
newFilterToAdd,
101-
clearFilters,
102-
Request,
103-
filterCookieName,
104-
CourseDelegateAccountStatusFilterOptions.Active.FilterValue
105-
);
106-
107-
if (isCourseDelegate)
108-
{
109-
if (TempData["actDelCustomisationId"] != null && TempData["actDelCustomisationId"].ToString() != customisationId.ToString()
110-
&& existingFilterString != null && existingFilterString.Contains("Answer"))
111-
{
112-
var availableCourseFilters = CourseDelegateViewModelFilterOptions.GetAllCourseDelegatesFilterViewModels(courseAdminFieldsService.GetCourseAdminFieldsForCourse(customisationId.Value).AdminFields);
113-
existingFilterString = FilterHelper.RemoveNonExistingPromptFilters(availableCourseFilters, existingFilterString);
114-
}
115-
}
116-
else
98+
99+
var availableFilters = isCourseDelegate
100+
? CourseDelegateViewModelFilterOptions.GetAllCourseDelegatesFilterViewModels(courseAdminFieldsService.GetCourseAdminFieldsForCourse(customisationId.Value).AdminFields)
101+
: SelfAssessmentDelegateViewModelFilterOptions.GetAllSelfAssessmentDelegatesFilterViewModels();
102+
103+
var filterString = FilteringHelper.GetFilterString(
104+
existingFilterString,
105+
newFilterToAdd,
106+
clearFilters,
107+
Request,
108+
filterCookieName,
109+
CourseDelegateAccountStatusFilterOptions.Active.FilterValue,
110+
availableFilters
111+
);
112+
113+
if (!isCourseDelegate)
117114
{
118115
isUnsupervisedSelfAssessment = selfAssessmentService.IsUnsupervisedSelfAssessment((int)selfAssessmentId);
119-
if (existingFilterString != null)
116+
if (filterString != null)
120117
{
121118
var existingfilterList = isUnsupervisedSelfAssessment ?
122-
existingFilterString!.Split(FilteringHelper.FilterSeparator).Where(filter => !filter.Contains("SignedOff")).ToList() :
123-
existingFilterString!.Split(FilteringHelper.FilterSeparator).Where(filter => !filter.Contains("SubmittedDate")).ToList();
119+
filterString!.Split(FilteringHelper.FilterSeparator).Where(filter => !filter.Contains("SignedOff")).ToList() :
120+
filterString!.Split(FilteringHelper.FilterSeparator).Where(filter => !filter.Contains("SubmittedDate")).ToList();
124121

125-
existingFilterString = existingfilterList.Any() ? string.Join(FilteringHelper.FilterSeparator, existingfilterList) : null;
122+
filterString = existingfilterList.Any() ? string.Join(FilteringHelper.FilterSeparator, existingfilterList) : null;
126123
}
127124
}
128125

@@ -138,10 +135,10 @@ public IActionResult Index(
138135
string? answer1, answer2, answer3;
139136
answer1 = answer2 = answer3 = null;
140137

141-
if (!string.IsNullOrEmpty(existingFilterString))
138+
if (!string.IsNullOrEmpty(filterString))
142139
{
143-
var selectedFilters = existingFilterString.Split(FilteringHelper.FilterSeparator).ToList();
144-
existingFilterString = FilteringHelper.RemoveDuplicateFilters(newFilterToAdd, existingFilterString);
140+
var selectedFilters = filterString.Split(FilteringHelper.FilterSeparator).ToList();
141+
145142
if (selectedFilters.Count > 0)
146143
{
147144
foreach (var filter in selectedFilters)
@@ -250,24 +247,17 @@ public IActionResult Index(
250247
}
251248
}
252249

253-
var availableFilters = isCourseDelegate
254-
? CourseDelegateViewModelFilterOptions.GetAllCourseDelegatesFilterViewModels(courseDelegatesData.CourseAdminFields)
255-
: SelfAssessmentDelegateViewModelFilterOptions.GetAllSelfAssessmentDelegatesFilterViewModels();
256-
257250
var activityName = isCourseDelegate
258251
? courseService.GetCourseNameAndApplication((int)customisationId).CourseName
259252
: selfAssessmentService.GetSelfAssessmentNameById((int)selfAssessmentId);
260-
if (!string.IsNullOrEmpty(existingFilterString))
261-
{
262-
existingFilterString = FilteringHelper.GetValidFilters(existingFilterString, newFilterToAdd, availableFilters, Request, filterCookieName);
263-
}
253+
264254
if (isCourseDelegate)
265255
{
266256
var result = paginateService.Paginate(
267257
courseDelegatesData.Delegates,
268258
(int)resultCount,
269259
new PaginationOptions(page, itemsPerPage),
270-
new FilterOptions(existingFilterString, availableFilters, CourseDelegateAccountStatusFilterOptions.Active.FilterValue),
260+
new FilterOptions(filterString, availableFilters, CourseDelegateAccountStatusFilterOptions.Active.FilterValue),
271261
searchString,
272262
sortBy,
273263
sortDirection);
@@ -285,7 +275,7 @@ public IActionResult Index(
285275
selfAssessmentDelegatesData.Delegates,
286276
(int)resultCount,
287277
new PaginationOptions(page, itemsPerPage),
288-
new FilterOptions(existingFilterString, availableFilters, CourseDelegateAccountStatusFilterOptions.Active.FilterValue),
278+
new FilterOptions(filterString, availableFilters, CourseDelegateAccountStatusFilterOptions.Active.FilterValue),
289279
searchString,
290280
sortBy,
291281
sortDirection);

0 commit comments

Comments
 (0)