visualizeReminders = function (data) {
const style = {
width: width,
height: 120,
margin: 50,
color: "blue",
opacity: 0.65
}
const stacked_data = d3.cumsum(data),
start = new Date(),
end = new Date().addHours(d3.max(stacked_data)),
date_data = stacked_data.map(d => new Date().addHours(d));
let tScale = d3.scaleTime()
.domain([start, end])
.range([style.margin, width - 2 * style.margin]);
let tAxis = d3.axisBottom(tScale).tickSize(5).tickPadding(10).ticks(5);
const tooltip = d3.select("body")
.append("div")
.attr("class", "svg-tooltip")
.style("position", "absolute")
.style("visibility", "hidden")
.style("font-size", "1rem")
.style("background", "rgba(0,0,0,0.85)")
.style("padding", "0.1rem 0.5rem")
.style("color", "#FFF")
.style("border-radius", "3px");
const svg = d3.create("svg")
.attr("viewbox", [0, 0, style.height, style.width])
.attr("width", style.width)
.attr("height", style.height);
svg
.append("g")
.attr("transform", `translate(0, ${style.margin})`)
.call(tAxis);
const dots = svg.append("g")
.attr("class", "dots")
.selectAll("circle")
.data(date_data)
.enter()
dots
.append("line")
.attr("x1", d => tScale(d))
.attr("x2", d => tScale(d))
.attr("y1", style.margin)
.attr("y2", style.margin - 10)
.attr("stroke", style.color)
.attr("stroke-opacity", style.opacity)
dots
.append("circle")
.attr("cx", d => tScale(d))
.attr("cy", style.margin - 15)
.attr("r", 5)
.attr("fill", style.color)
.attr("opacity", style.opacity)
.on("mouseover", function(d) {
d3.select(this).attr("stroke", "black")
tooltip.style("visibility", "visible").text(displayDateTime(new Date(d)))
})
.on("mousemove", function(d) {
tooltip.style("top", (d3.event.pageY-40)+"px")
tooltip.style("left",(d3.event.pageX-40)+"px");
})
.on("mouseout", function(d) {
d3.select(this).attr("stroke", "none")
tooltip.style("visibility", "hidden")
})
return svg.node();
}