All checks were successful
Deploy Development / deploy (push) Successful in 43s
Test Suite / pytest-backend (push) Successful in 38s
Test Suite / lint-backend (push) Successful in 0s
Test Suite / build-frontend (push) Successful in 13s
Test Suite / k6 /health Baseline (push) Successful in 33s
Test Suite / playwright-tests (push) Successful in 1m14s
- Updated the FrameworkProgramsFilterBlock to include a search input and filter modal, improving user interaction and accessibility. - Refactored CSS styles for filter components to ensure consistent layout and spacing. - Removed deprecated panel open state management, streamlining the component logic. - Integrated new filtering capabilities in the TrainingPlanningFrameworkImportModal and TrainingModulesListPage, enhancing the overall filtering experience. - Improved the display of active filters and results count, providing clearer feedback to users.
58 lines
1.8 KiB
JavaScript
58 lines
1.8 KiB
JavaScript
import {
|
|
maxSelectedSkillClubPercent,
|
|
moduleSkillSummaryKey,
|
|
summaryHasSkill,
|
|
} from './skillProfileListHelpers'
|
|
|
|
export const EMPTY_TRAINING_MODULE_FILTERS = {
|
|
query: '',
|
|
skillIds: [],
|
|
skillSort: 'title',
|
|
skillMinClubPercent: 0,
|
|
skillDisplayLimit: 12,
|
|
}
|
|
|
|
export function hasActiveTrainingModuleFilters(filters = {}) {
|
|
const f = { ...EMPTY_TRAINING_MODULE_FILTERS, ...filters }
|
|
if ((f.query || '').trim()) return true
|
|
if ((f.skillIds || []).length) return true
|
|
if (Number(f.skillMinClubPercent) > 0) return true
|
|
if (f.skillSort === 'skill_strength' && (f.skillIds || []).length) return true
|
|
return false
|
|
}
|
|
|
|
export function filterTrainingModules(rows, filters = {}, skillSummaries = null) {
|
|
const f = { ...EMPTY_TRAINING_MODULE_FILTERS, ...filters }
|
|
const q = (f.query || '').trim().toLowerCase()
|
|
const skillIds = f.skillIds || []
|
|
const minClubPct = Number(f.skillMinClubPercent) || 0
|
|
|
|
let list = (rows || []).filter((r) => {
|
|
if (q) {
|
|
const blob = [r.title, r.summary].filter(Boolean).join(' ').toLowerCase()
|
|
if (!blob.includes(q)) return false
|
|
}
|
|
return true
|
|
})
|
|
|
|
if (skillIds.length && skillSummaries) {
|
|
list = list.filter((r) => {
|
|
const summary = skillSummaries[moduleSkillSummaryKey(r.id)]
|
|
if (!summary) return false
|
|
return skillIds.some((sid) => summaryHasSkill(summary, sid, minClubPct))
|
|
})
|
|
}
|
|
|
|
if (f.skillSort === 'skill_strength' && skillIds.length && skillSummaries) {
|
|
list = [...list].sort((a, b) => {
|
|
const sa = skillSummaries[moduleSkillSummaryKey(a.id)]
|
|
const sb = skillSummaries[moduleSkillSummaryKey(b.id)]
|
|
const pa = maxSelectedSkillClubPercent(sa, skillIds) ?? -1
|
|
const pb = maxSelectedSkillClubPercent(sb, skillIds) ?? -1
|
|
return pb - pa
|
|
})
|
|
}
|
|
|
|
return list
|
|
}
|