function generateGradebook(data) {
if (!data || data.length === 0) {
return htl.html`<div>Data is empty or null!</div>`;
}
const _data = JSON.parse(JSON.stringify(data));
const gradeSlider = (max, value, task, index) => {
const slider = Inputs.range([0, max], {
step: 1,
value: value,
width: 50
});
slider.oninput = () => {
task.taskScore = parseInt(slider.value);
updateScore(index);
};
return slider;
};
const gradeButton = (task, index) => {
const slider = gradeSlider(task.taskTotalScore, 0, task, index);
slider.style.display = "none";
const button = htl.html`<button>Not graded yet</button>`;
button.onclick = () => {
slider.style.display = "inline-block";
button.style.display = "none";
task.taskScore = 0;
updateScore(index);
};
return htl.html`${button}${slider}`;
};
const updateScore = (index) => {
const total = document.querySelector(`.total-score.group${index}`);
const score = sumScore(_data[index].tasks);
const totalScore = sumTotalScore(_data[index].tasks);
total.innerText = `Group ${index+1} total score: ${score}/${totalScore}`
_data[index].groupScore = score;
_data[index].groupTotalScore = totalScore;
result.value = _data;
result.dispatchEvent(new CustomEvent("input", { bubbles: true }));
};
const tableRows = (tasks, index) => {
if (!tasks || tasks.length === 0) {
return "";
}
return tasks.map((task) => {
return html`
<tr>
<td>${task.taskName}</td>
<td>
${
task.taskScore
? gradeSlider(task.taskTotalScore, task.taskScore, task, index)
: gradeButton(task, index)
}
</td>
<td>${task.taskTotalScore}</td>
</tr>
`;
});
};
const sumScore = (tasks) => {
let sum = 0;
tasks.forEach((task) => {
sum += task.taskScore;
});
return sum;
};
const sumTotalScore = (tasks) => {
let sum = 0;
tasks.forEach((task) => {
sum += task.taskTotalScore;
});
return sum;
};
const groupView = (tasks, index) => {
return htl.html`
<table>
<thead>
<tr>
<th>Task Name</th>
<th>Score</th>
<th>Total Score</th>
</tr>
</thead>
<tbody>
${tableRows(tasks, index)}
</tbody>
</table>
<div class="total-score group${index}">
Group ${index+1} total score: ${sumScore(tasks)}/${sumTotalScore(tasks)}
</div>
`;
};
const groupTabs = _data.map((group, index) => {
return details(`Group${index + 1}`, groupView(group.tasks, index));
});
const result = tabbed(htl.html`${groupTabs}`, { selected: 0 });
result.value = _data;
return result;
}