shinkan-jinkendo/frontend/src/utils/trainingModuleListHelpers.js

58 lines
1.8 KiB
JavaScript
Raw Normal View History

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
}