timelineGraph = (timelineEvents) => {
if (timelineEvents.length === 0) return 'Waiting for data...'
const handlers = {
click: (event, {datum}) => window.open(`https://github.com/${repo}/pull/${datum.number}`, "_blank"),
pointerenter: function(event, {datum}) {
if (datum.event === "reviewed" || datum.event === "review_requested") mutable selectedEvent = datum;
d3.select(event.target).style("cursor", "pointer");
},
pointerout: function(event, {datum}) {
d3.select(event.target).style("cursor", "default");
mutable selectedEvent = null;
},
};
return addTooltips(
Plot.plot({
y: {
ticks: [],
label: `PR #`,
type: "band",
},
x: {
axis: "bottom",
label: "Time →",
domain: d3.extent(timelineEvents.map(d => d.date))
},
r: {
domain: d3.extent(timelineEvents.map(d => d.changes)),
range: [3, 8]
},
width: width * .8,
color,
marginTop: 10,
marginLeft: 50,
marks: [
Plot.link(timelineEvents, Plot.selectFirst({
y1: "number",
y2: "number",
x1: "date",
x2: new Date(),
z:"number",
stroke: "#eeeeee"
})),
on(
Plot.tickX(timelineEvents,
{
x: "date", y: "number", stroke: "event",
filter: e => e.event === "reviewed" || e.event === "review_requested" | e.event === "commented",
title: d => extractTooltip(d),
strokeWidth: 1.5
}
), handlers
),
on(
Plot.dot(timelineEvents,
{
x: "date", y: "number", fill: "event",
filter: e => e.event === "committed",
title: d => extractTooltip(d)
}),
handlers
),
on(
Plot.text(timelineEvents, Plot.selectFirst({
x: "date",
y: "number",
z: "number",
text: "number",
dx: -30,
fontSize: 13,
title: d => `${d.title}`
})),
handlers
)
],
style: { paddingRight: 150, overflow: "visible" }
})
, {stroke: "grey" }
)
}