in src/components/SignatureDetail/index.ts [9:51]
export default function SignatureDetail(props: {
signature: SignatureInfo,
filterInfo: FilterInfo,
}) {
const sparkline = createMemo(() => {
const pingData = allPings();
const crashesPerDate = props.signature.pings.reduce((map, ping) => {
const date = pingData.date.values[ping];
map.set(date, (map.get(date) || 0) + 1);
return map;
}, new Map<number, number>());
const dates = new Set(sources().map(s => s.date));
const sparklineData = crashesPerDate.entries()
.map(([date, value]) => { return { date: pingData.date.strings[date], value }; })
.filter(v => dates.has(v.date))
.toArray()
.sort((a, b) => a.date.localeCompare(b.date));
const inRangeCount = sparklineData.reduce((cur, v) => cur + v.value, 0);
const removedCount = props.signature.pingCount - inRangeCount;
const tooltip = removedCount > 0 ? `${removedCount} ping(s) omitted with crash dates out-of-range.` : null;
return html`<${Sparkline} data=${sparklineData} title=${tooltip} />`;
});
const filterCounts = () => props.filterInfo.countFilterValues(props.signature.pings)
.map(filter => {
const values = filter.counts.flatMap(v => [html`<span title=${`${v.count} crashes`}>${v.label}</span>`, ", "]);
values.length -= 1; // drop the last ", "
return html`
<p><b>${filter.filterLabel}</b>: ${values}</p>
`;
});
return html`
<h3><tt>${() => props.signature.signature}</tt></h3>
${sparkline}
${filterCounts}
`;
};