diff --git a/ts/src/stats/card-counts.ts b/ts/src/stats/card-counts.ts index 9dff8bd9a..4e414bb4b 100644 --- a/ts/src/stats/card-counts.ts +++ b/ts/src/stats/card-counts.ts @@ -81,6 +81,29 @@ interface Reviews { early: number; } +function barColour(idx: number): string { + switch (idx) { + case 0: + return schemeBlues[5][2]; + case 1: + return schemeGreens[5][2]; + case 2: + return schemeGreens[5][3]; + case 3: + return "#FFDC41"; + case 4: + default: + return "grey"; + } +} + +interface SummedDatum { + label: string; + count: number; + idx: number; + total: number; +} + export function renderCards( svgElem: SVGElement, bounds: GraphBounds, @@ -88,11 +111,13 @@ export function renderCards( ): void { const summed = cumsum(sourceData.counts, (d) => d[1]); const data = Array.from(summed).map((n, idx) => { + const count = sourceData.counts[idx]; return { - count: sourceData.counts[idx], + label: count[0], + count: count[1], idx, total: n, - }; + } as SummedDatum; }); // ensuring a non-zero range makes a better animation // in the empty data case @@ -103,20 +128,29 @@ export function renderCards( x.range([bounds.marginLeft, bounds.width - bounds.marginRight - bounds.marginLeft]); - const tooltipText = (d: any): string => { - const pct = ((d.count[1] / xMax) * 100).toFixed(2); - return `${d.count[0]}: ${d.count[1]} (${pct}%)`; + const tooltipText = (current: SummedDatum): string => { + const lines: string[] = []; + for (const [idx, d] of data.entries()) { + const pct = ((d.count / xMax) * 100).toFixed(2); + const colour = ``; + let line = `${colour} ${d.label}: ${d.count} (${pct}%)`; + if (idx === current.idx) { + line = `${line}`; + } + lines.push(line); + } + return lines.join("
"); }; const updateBar = (sel: any): any => { return sel - .on("mousemove", function (this: any, d: any) { + .on("mousemove", function (this: any, d: SummedDatum) { const [x, y] = mouse(document.body); showTooltip(tooltipText(d), x, y); }) .transition(trans) - .attr("x", (d) => x(d.total - d.count[1])) - .attr("width", (d) => x(d.count[1]) - x(0)); + .attr("x", (d: SummedDatum) => x(d.total - d.count)) + .attr("width", (d: SummedDatum) => x(d.count) - x(0)); }; svg.select("g.days") @@ -128,22 +162,8 @@ export function renderCards( .append("rect") .attr("height", 10) .attr("y", bounds.marginTop) - .attr("fill", (d: any): any => { - switch (d.idx) { - case 0: - return schemeBlues[5][2]; - case 1: - return schemeGreens[5][2]; - case 2: - return schemeGreens[5][3]; - case 3: - return "#FFDC41"; - case 4: - return "grey"; - } - }) + .attr("fill", (d: SummedDatum): any => barColour(d.idx)) .on("mouseout", hideTooltip) - .call((d) => updateBar(d)), (update) => update.call((d) => updateBar(d)) );