Skip to content

Commit 529798b

Browse files
TD-5361 Refactor the learners Response Status Filters method
1 parent 7da04fe commit 529798b

File tree

1 file changed

+58
-15
lines changed

1 file changed

+58
-15
lines changed

DigitalLearningSolutions.Web/Helpers/CompetencyFilterHelper.cs

Lines changed: 58 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public static IEnumerable<Competency> FilterCompetencies(IEnumerable<Competency>
1818
var searchText = search.SearchText?.Trim() ?? string.Empty;
1919
var filters = search.AppliedFilters?.Select(f => int.Parse(f.FilterValue)) ?? Enumerable.Empty<int>();
2020
search.CompetencyFlags = competencyFlags.ToList();
21-
ApplyResponseStatusFilters(ref filteredCompetencies, filters, searchText);
21+
ResponseStatusFilters(ref filteredCompetencies, filters, searchText);
2222
UpdateRequirementsFilterDropdownOptionsVisibility(search, filteredCompetencies);
2323
ApplyRequirementsFilters(ref filteredCompetencies, filters);
2424

@@ -30,6 +30,48 @@ public static IEnumerable<Competency> FilterCompetencies(IEnumerable<Competency>
3030
return filteredCompetencies;
3131
}
3232

33+
public static void ResponseStatusFilters(ref IEnumerable<Competency> competencies, IEnumerable<int> filters, string searchText = "")
34+
{
35+
var appliedResponseStatusFilters = filters.Where(IsResponseStatusFilter).ToList();
36+
37+
if (!appliedResponseStatusFilters.Any() && string.IsNullOrWhiteSpace(searchText))
38+
{
39+
return;
40+
}
41+
42+
// Break search text into words
43+
var wordsInSearchText = searchText?
44+
.Split(' ', StringSplitOptions.RemoveEmptyEntries)
45+
?? Array.Empty<string>();
46+
47+
bool MatchesSearch(Competency c) =>
48+
wordsInSearchText.Length == 0
49+
|| wordsInSearchText.All(w =>
50+
(c.CompetencyGroup?.Contains(w, StringComparison.CurrentCultureIgnoreCase) ?? false)
51+
|| (c.Description?.Contains(w, StringComparison.CurrentCultureIgnoreCase) ?? false)
52+
|| (c.Name?.Contains(w, StringComparison.CurrentCultureIgnoreCase) ?? false));
53+
54+
// Define reusable filter checks
55+
var filterChecks = new Dictionary<SelfAssessmentCompetencyFilter, Func<Competency, bool>>
56+
{
57+
[SelfAssessmentCompetencyFilter.RequiresSelfAssessment] = c => c.AssessmentQuestions.Any(q => q.ResultId == null),
58+
[SelfAssessmentCompetencyFilter.SelfAssessed] = c => c.AssessmentQuestions.Any(q => q.ResultId != null && q.Requested == null && q.SignedOff == null),
59+
[SelfAssessmentCompetencyFilter.ConfirmationRequested] = c => c.AssessmentQuestions.Any(q => q.Verified == null && q.Requested != null),
60+
[SelfAssessmentCompetencyFilter.ConfirmationRejected] = c => c.AssessmentQuestions.Any(q => q.Verified.HasValue && q.SignedOff != true),
61+
[SelfAssessmentCompetencyFilter.Verified] = c => c.AssessmentQuestions.Any(q => q.Verified.HasValue && q.SignedOff == true),
62+
[SelfAssessmentCompetencyFilter.AwaitingConfirmation] = c => c.AssessmentQuestions.Any(q => q.Verified == null && q.Requested != null && q.UserIsVerifier == true),
63+
[SelfAssessmentCompetencyFilter.PendingConfirmation] = c => c.AssessmentQuestions.Any(q => q.ResultId != null && q.Verified == null && q.Requested != null && q.UserIsVerifier == false),
64+
[SelfAssessmentCompetencyFilter.Optional] = c => c.Optional
65+
};
66+
67+
// Require ALL applied filters to match
68+
bool MatchesFilters(Competency c) =>
69+
!appliedResponseStatusFilters.Any()
70+
|| appliedResponseStatusFilters.All(f => filterChecks[(SelfAssessmentCompetencyFilter)f](c));
71+
72+
// Final filtering
73+
competencies = competencies.Where(c => MatchesSearch(c) && MatchesFilters(c));
74+
}
3375
private static void ApplyResponseStatusFilters(ref IEnumerable<Competency> competencies, IEnumerable<int> filters, string searchText = "")
3476
{
3577
var filteredCompetencies = competencies;
@@ -38,20 +80,21 @@ private static void ApplyResponseStatusFilters(ref IEnumerable<Competency> compe
3880
if (appliedResponseStatusFilters.Any() || searchText.Length > 0)
3981
{
4082
var wordsInSearchText = searchText.Split().Where(w => w != string.Empty);
41-
filteredCompetencies = from c in competencies
42-
let searchTextMatchesGroup = wordsInSearchText.All(w => c.CompetencyGroup?.Contains(w, StringComparison.CurrentCultureIgnoreCase) ?? false)
43-
let searchTextMatchesCompetencyDescription = wordsInSearchText.All(w => c.Description?.Contains(w, StringComparison.CurrentCultureIgnoreCase) ?? false)
44-
let searchTextMatchesCompetencyName = wordsInSearchText.All(w => c.Name?.Contains(w, StringComparison.CurrentCultureIgnoreCase) ?? false)
45-
let responseStatusFilterMatchesAll =
46-
(filters.Contains((int)SelfAssessmentCompetencyFilter.RequiresSelfAssessment) && c.AssessmentQuestions.Any(q => q.ResultId == null))
47-
|| (filters.Contains((int)SelfAssessmentCompetencyFilter.SelfAssessed) && c.AssessmentQuestions.Any(q => q.ResultId != null && q.Requested == null && q.SignedOff == null))
48-
|| (filters.Contains((int)SelfAssessmentCompetencyFilter.ConfirmationRequested) && c.AssessmentQuestions.Any(q => q.Verified == null && q.Requested != null))
49-
|| (filters.Contains((int)SelfAssessmentCompetencyFilter.ConfirmationRejected) && c.AssessmentQuestions.Any(q => q.Verified.HasValue && q.SignedOff != true))
50-
|| (filters.Contains((int)SelfAssessmentCompetencyFilter.Verified) && c.AssessmentQuestions.Any(q => q.Verified.HasValue && q.SignedOff == true))
51-
|| (filters.Contains((int)SelfAssessmentCompetencyFilter.Optional) && c.Optional)
52-
where (wordsInSearchText.Count() == 0 || searchTextMatchesGroup || searchTextMatchesCompetencyDescription || searchTextMatchesCompetencyName)
53-
&& (!appliedResponseStatusFilters.Any() || responseStatusFilterMatchesAll)
54-
select c;
83+
filteredCompetencies = from c in competencies
84+
let searchTextMatchesGroup = wordsInSearchText.All(w => c.CompetencyGroup?.Contains(w, StringComparison.CurrentCultureIgnoreCase) ?? false)
85+
let searchTextMatchesCompetencyDescription = wordsInSearchText.All(w => c.Description?.Contains(w, StringComparison.CurrentCultureIgnoreCase) ?? false)
86+
let searchTextMatchesCompetencyName = wordsInSearchText.All(w => c.Name?.Contains(w, StringComparison.CurrentCultureIgnoreCase) ?? false)
87+
let responseStatusFilterMatchesAll =
88+
(filters.Contains((int)SelfAssessmentCompetencyFilter.RequiresSelfAssessment) && c.AssessmentQuestions.Any(q => q.ResultId == null))
89+
|| (filters.Contains((int)SelfAssessmentCompetencyFilter.SelfAssessed) && c.AssessmentQuestions.Any(q => q.ResultId != null && q.Requested == null && q.SignedOff == null))
90+
|| (filters.Contains((int)SelfAssessmentCompetencyFilter.ConfirmationRequested) && c.AssessmentQuestions.Any(q => q.Verified == null && q.Requested != null))
91+
|| (filters.Contains((int)SelfAssessmentCompetencyFilter.ConfirmationRejected) && c.AssessmentQuestions.Any(q => q.Verified.HasValue && q.SignedOff != true))
92+
|| (filters.Contains((int)SelfAssessmentCompetencyFilter.Verified) && c.AssessmentQuestions.Any(q => q.Verified.HasValue && q.SignedOff == true))
93+
|| (filters.Contains((int)SelfAssessmentCompetencyFilter.Optional) && c.Optional)
94+
where (wordsInSearchText.Count() == 0 || searchTextMatchesGroup || searchTextMatchesCompetencyDescription || searchTextMatchesCompetencyName)
95+
&& (!appliedResponseStatusFilters.Any() || responseStatusFilterMatchesAll)
96+
select c;
97+
5598
}
5699
competencies = filteredCompetencies;
57100
}

0 commit comments

Comments
 (0)