shinkan-jinkendo/frontend/src/utils/trainingModuleListHelpers.js
Lars 2d187447bb
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
Enhance Framework Programs Filtering and UI Components
- 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.
2026-05-21 10:23:05 +02:00

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
}