calendar = {
const svg = d3
.create("svg")
.attr("viewBox", [0, 0, width, height * years.length])
.attr("id", "calendar")
.attr("font-family", "sans-serif")
.attr("font-size", 10);
const mouseOverFunction = function (event, d) {
const div = d3.select("#hover").style("opacity", 0);
div
.transition()
.duration(500)
.style("opacity", 0.9)
.attr("class", "tooltip show");
var markup = `<p>${d3.timeFormat("%B %-d")(d.date)}<br>${d.headline}</p>`;
if (d.headlines.length > 1) {
for (var i = 1; i < d.headlines.length; i++) {
markup += `<p>${d.headlines[i]}</p>`;
}
}
div
.html(markup)
.style("left", event.pageX + 5 + "px")
.style("top", event.pageY - 120 + "px");
};
const mouseOutFunction = function (event, d) {
const div = d3.select("#hover");
div
.transition()
.duration(500)
.style("opacity", 0)
.attr("class", "tooltip hide");
};
const year = svg
.selectAll("g")
.data(years)
.join("g")
.attr(
"transform",
(d, i) => `translate(40.5,${height * i + cellSize * 1.5})`
);
year
.append("text")
.attr("x", -5)
.attr("y", -5)
.attr("font-weight", "bold")
.attr("text-anchor", "end")
.text(([key]) => key);
year
.append("g")
.attr("text-anchor", "end")
.selectAll("text")
.data(d3.range(7))
.join("text")
.attr("x", -5)
.attr("y", (i) => (countDay(i) + 0.5) * cellSize)
.attr("dy", "0.31em")
.text(formatDay);
year
.append("g")
.selectAll("rect")
.data(([, values]) => values)
.join("rect")
.attr("width", cellSize - 1)
.attr("height", cellSize - 1)
.attr("class", "cell")
.attr(
"x",
(d) => timeWeek.count(d3.timeYear(d.date), d.date) * cellSize + 0.5
)
.attr("y", (d) => countDay(d.date.getDay()) * cellSize + 0.5)
.attr("fill", (d) => color(d.value))
.on("click", (event, d) => {
console.log(d.url);
window.open(d.url, "test");
})
.on("mouseover", mouseOverFunction)
.on("mouseout", mouseOutFunction);
const month = year
.append("g")
.selectAll("g")
.data(([, values]) =>
d3.timeMonths(
d3.timeMonth(values[values.length - 1].date),
d3.timeMonth(values[0].date)
)
)
.join("g");
month
.filter((d, i) => i)
.append("path")
.attr("fill", "none")
.attr("stroke", "#efefef")
.attr("stroke-width", 3)
.attr("d", pathMonth);
month
.append("text")
.attr(
"x",
(d) => timeWeek.count(d3.timeYear(d), timeWeek.ceil(d)) * cellSize + 2
)
.attr("y", -5)
.text(formatMonth);
return svg.node();
}