@@ -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