diff --git a/src/lib/rendering.ts b/src/lib/rendering.ts index 920e7f3c99f5a8c98632fa4a980e99c54fc6a413..681f47893ac2eadcd0c3760e585274c8008a9c6a 100644 --- a/src/lib/rendering.ts +++ b/src/lib/rendering.ts @@ -685,21 +685,34 @@ export function generateAttendanceHtml( function generateAttendanceRowHtml(name: string, data: Attendance): string { const sum = data.sum() / 100; - - const bar = ` - <div class="percentage-bar"> - <div style="width: ${data.present / sum}%;background-color: darkgreen"></div> - <div style="width: ${data.noshow_excused / sum}%;background-color: yellow"></div> - <div style="width: ${data.noshow / sum}%;background-color: red"></div> - </div>`; - return ` <tr> <td> ${name} </td> - <td> ${bar} </td> + <td> ${generatePercentageBar(data)} </td> <td> ${data.present} </td> <td> ${data.noshow_excused} </td> <td> ${data.noshow}</td> <td> ${(data.present / sum).toFixed(1)}% </td> </tr>`; } + +function generatePercentageBar(data: Attendance): string { + const width = 100 / data.sum(); + + const tagged: { value: number; color: string }[] = [ + ...data.presents.map((value) => ({ value, color: "darkgreen" })), + ...data.noshows.map((value) => ({ value, color: "red" })), + ...data.noshow_excuseds.map((value) => ({ value, color: "yellow" })), + ]; + + // Sort by number + tagged.sort((a, b) => a.value - b.value); + + var barHtml = '<div class="percentage-bar">'; + // Iterate in order + for (const { color } of tagged) { + barHtml += `<div style="width: ${width}%;background-color: ${color}"></div>`; + } + barHtml += "</div>"; + return barHtml; +}