Skip to content

Commit 327badd

Browse files
authored
Merge pull request #3379 from TechnologyEnhancedLearning/Develop/Fixes/TD-5361-SwitchfilterlogicfromANDtoORtomatchanyselectedfilter
TD-5361 Refactor the learners Response Status Filters method
2 parents cc67ddf + b1c6e5f commit 327badd

File tree

1 file changed

+36
-20
lines changed

1 file changed

+36
-20
lines changed

DigitalLearningSolutions.Web/Helpers/CompetencyFilterHelper.cs

Lines changed: 36 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,30 +32,46 @@ public static IEnumerable<Competency> FilterCompetencies(IEnumerable<Competency>
3232

3333
private static void ApplyResponseStatusFilters(ref IEnumerable<Competency> competencies, IEnumerable<int> filters, string searchText = "")
3434
{
35-
var filteredCompetencies = competencies;
36-
var appliedResponseStatusFilters = filters.Where(f => IsResponseStatusFilter(f));
35+
var appliedResponseStatusFilters = filters.Where(IsResponseStatusFilter).ToList();
3736

38-
if (appliedResponseStatusFilters.Any() || searchText.Length > 0)
37+
if (!appliedResponseStatusFilters.Any() && string.IsNullOrWhiteSpace(searchText))
3938
{
40-
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;
39+
return;
5540
}
56-
competencies = filteredCompetencies;
57-
}
5841

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+
}
5975
private static void ApplyRequirementsFilters(ref IEnumerable<Competency> competencies, IEnumerable<int> filters)
6076
{
6177
var filteredCompetencies = competencies;

0 commit comments

Comments
 (0)