gradebook-base
Version:
Defines simple interfaces for gradebook projects.
91 lines (89 loc) • 3.54 kB
JavaScript
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