UNPKG

gradebook-base

Version:

Defines simple interfaces for gradebook projects.

91 lines (89 loc) 3.54 kB
function createSkill(name, description, comment) { return { name, description, comment }; } function createWeight(name, value) { return { name, value }; } function createMastery(name, level) { return { name, level }; } function createGrade(name, order) { return { name, order }; } function createGradeMastery(grade, mastery) { return { grade, mastery }; } function createSkillConfig(name, skill, weight, gradeMastery = []) { return { name, skill, weight, gradeMastery }; } function createSkillMastery(skill, mastery) { return { skill, mastery }; } function createAssessment(name, grade = [], weight = [], mastery = [], skillConfig = [], skillMastery = []) { return { name, grade, weight, mastery, skillConfig, skillMastery }; } function createCandidate(name, assessment) { return { name, assessment }; } function calculateGradeMasteryScore(skillConfig) { let result = []; return skillConfig.reduce((totals, config) => { config.gradeMastery.forEach((gm) => { const scoreIndex = totals.findIndex((grade) => grade.grade.name === gm.grade.name); if (scoreIndex === -1) { const gradeMasteryTotal = { grade: gm.grade, score: gm.mastery.level, }; totals.push(gradeMasteryTotal); } else { totals[scoreIndex]['score'] += gm.mastery.level * config.weight.value; } }); return totals; }, result); } function calculateSkillMasteryScore(skillMastery, skillConfig) { return skillMastery.reduce((acc, mastery) => { const weight = skillConfig.find((config) => config.skill.name === mastery.skill.name) ?.weight.value || 0; acc += weight * mastery.mastery.level; return acc; }, 0); } function calculateGrade(gradeMasteryScore, score) { let closestMinValue = null; for (let i = 0; i < gradeMasteryScore.length; i++) { let currentValue = gradeMasteryScore[i]; if (currentValue.score <= score && (closestMinValue === null || score - currentValue.score <= score - closestMinValue.score)) { closestMinValue = currentValue; } } return closestMinValue?.grade; } function createAssesmentResult(assessment, grade, score) { return { assessment, grade, score }; } function calculateAssesmentResult(assessment) { const result = createAssesmentResult(assessment, { name: 'N/A', order: 0 }, 0); const gradeMasteryScore = calculateGradeMasteryScore(assessment.skillConfig); const skillMasteryScore = calculateSkillMasteryScore(assessment.skillMastery, assessment.skillConfig); const grade = calculateGrade(gradeMasteryScore, skillMasteryScore); if (grade) { result.grade = grade; result.score = skillMasteryScore; } return result; } function calculateCandidateAssesmentResults(candidate) { const results = []; candidate.assessment.forEach((assessment) => { results.push(calculateAssesmentResult(assessment)); }); return results; } export { calculateAssesmentResult, calculateCandidateAssesmentResults, calculateGrade, calculateGradeMasteryScore, calculateSkillMasteryScore, createAssessment, createCandidate, createGrade, createGradeMastery, createMastery, createSkill, createSkillConfig, createSkillMastery, createWeight }; //# sourceMappingURL=index.js.map