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