From 5178ecc9dccc38aecb7f7ba07aedfba12d08ee66 Mon Sep 17 00:00:00 2001 From: sherif-olaboye <123654949+sherif-olaboye@users.noreply.github.com> Date: Wed, 8 Oct 2025 10:24:29 +0100 Subject: [PATCH] TD-5361 Seperating the filter method of the leaner and supervisor --- .../Helpers/CompetencyFilterHelper.cs | 2 +- .../SupervisorCompetencyFilterHelper.cs | 35 ++++++++++++++++++- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/DigitalLearningSolutions.Web/Helpers/CompetencyFilterHelper.cs b/DigitalLearningSolutions.Web/Helpers/CompetencyFilterHelper.cs index 7bb467167f..6dccdc57c7 100644 --- a/DigitalLearningSolutions.Web/Helpers/CompetencyFilterHelper.cs +++ b/DigitalLearningSolutions.Web/Helpers/CompetencyFilterHelper.cs @@ -30,7 +30,7 @@ public static IEnumerable FilterCompetencies(IEnumerable return filteredCompetencies; } - public static void ApplyResponseStatusFilters(ref IEnumerable competencies, IEnumerable filters, string searchText = "") + private static void ApplyResponseStatusFilters(ref IEnumerable competencies, IEnumerable filters, string searchText = "") { var appliedResponseStatusFilters = filters.Where(IsResponseStatusFilter).ToList(); diff --git a/DigitalLearningSolutions.Web/Helpers/SupervisorCompetencyFilterHelper.cs b/DigitalLearningSolutions.Web/Helpers/SupervisorCompetencyFilterHelper.cs index b1caaa0860..58dfd9e95e 100644 --- a/DigitalLearningSolutions.Web/Helpers/SupervisorCompetencyFilterHelper.cs +++ b/DigitalLearningSolutions.Web/Helpers/SupervisorCompetencyFilterHelper.cs @@ -17,7 +17,7 @@ public static IEnumerable FilterCompetencies(IEnumerable var searchText = search.SearchText?.Trim() ?? string.Empty; var filters = search.AppliedFilters?.Select(f => int.Parse(f.FilterValue)) ?? Enumerable.Empty(); search.CompetencyFlags = competencyFlags.ToList(); - CompetencyFilterHelper.ApplyResponseStatusFilters(ref filteredCompetencies, filters, searchText); + ApplyResponseStatusFilters(ref filteredCompetencies, filters, searchText); UpdateRequirementsFilterDropdownOptionsVisibility(search, filteredCompetencies); ApplyRequirementsFilters(ref filteredCompetencies, filters); @@ -28,6 +28,39 @@ public static IEnumerable FilterCompetencies(IEnumerable } return filteredCompetencies; } + private static void ApplyResponseStatusFilters(ref IEnumerable competencies, IEnumerable filters, string searchText = "") + { + var appliedFilters = filters.Where(f => IsResponseStatusFilter(f)).ToList(); + var wordsInSearchText = searchText.Split(' ', StringSplitOptions.RemoveEmptyEntries); + + if (!appliedFilters.Any() && string.IsNullOrWhiteSpace(searchText)) + return; + + competencies = competencies.Where(c => + { + // Search text match + bool searchTextMatches = !wordsInSearchText.Any() || + wordsInSearchText.All(w => + (c.CompetencyGroup?.Contains(w, StringComparison.CurrentCultureIgnoreCase) ?? false) || + (c.Description?.Contains(w, StringComparison.CurrentCultureIgnoreCase) ?? false) || + (c.Name?.Contains(w, StringComparison.CurrentCultureIgnoreCase) ?? false) + ); + + // All filters must match (AND) + bool allFiltersMatch = appliedFilters.All(f => + (f == (int)SelfAssessmentCompetencyFilter.Verified && c.AssessmentQuestions.Any(q => q.Verified.HasValue && q.SignedOff == true)) || + (f == (int)SelfAssessmentCompetencyFilter.Optional && c.Optional) || + (f == (int)SelfAssessmentCompetencyFilter.ConfirmationRejected && c.AssessmentQuestions.Any(q => q.Verified.HasValue && q.SignedOff != true)) || + (f == (int)SelfAssessmentCompetencyFilter.PendingConfirmation && c.AssessmentQuestions.Any(q => q.ResultId != null && q.Verified == null && q.Requested != null && q.UserIsVerifier == false)) || + (f == (int)SelfAssessmentCompetencyFilter.AwaitingConfirmation && c.AssessmentQuestions.Any(q => q.Verified == null && q.Requested != null && q.UserIsVerifier == true)) || + (f == (int)SelfAssessmentCompetencyFilter.RequiresSelfAssessment && c.AssessmentQuestions.Any(q => q.ResultId == null)) || + (f == (int)SelfAssessmentCompetencyFilter.SelfAssessed && c.AssessmentQuestions.Any(q => q.ResultId != null && q.Requested == null && q.SignedOff == null)) + ); + + return searchTextMatches && allFiltersMatch; + }).ToList(); + } + private static void ApplyRequirementsFilters(ref IEnumerable competencies, IEnumerable filters) { var filteredCompetencies = competencies;