chart = {
const data = [
{time: new Date("2019-09-23T09:00Z"), target: 70},
{time: new Date("2019-09-23T13:00Z"), target: 75},
{time: new Date("2019-09-23T17:00Z"), target: 85},
{time: new Date("2019-09-23T18:00Z"), target: 65},
{time: new Date("2019-09-23T01:00Z"), target: 90},
{time: new Date("2019-09-23T08:00Z"), target: 65}
];
const drag = d3.drag()
.subject(d => ({x: x(d.time)}))
.on("start", dragstarted)
.on("drag", dragged)
.on("end", dragended);
const svg = d3.create("svg")
.attr("viewBox", [0, 0, width, height])
.on("click", bgclicked);
svg.append("g")
.call(xAxis);
const datalayer = svg.append("g")
.call(join);
function join(g) {
g.selectAll("g")
.data(data, d => d.time)
.join(enter, update, exit);
}
function enter(enter) {
return enter.append("g")
.attr("transform", d => `translate(${x(d.time)},0)`)
.call(g => g.append("circle")
.attr("cy", 55)
.attr("r", 0)
.attr("fill", "#1D1A34")
.transition()
.attr("r", 30))
.call(g => g.append("text")
.attr("y", 60)
.attr("fill", "white")
.attr("text-anchor", "middle")
.text(d => d.target))
.on("click", clicked)
.on("dblclick", dblclicked)
.call(drag);
}
function update(update) {
return update
.attr("transform", d => `translate(${x(d.time)},0)`);
}
function exit(exit) {
return exit.transition()
.call(g => g.select("circle").attr("r", 0))
.remove();
}
function dblclicked(d) {
data.splice(data.indexOf(d), 1);
datalayer.call(join);
}
function clicked() {
d3.event.stopPropagation();
}
function bgclicked() {
const [mx] = d3.mouse(this);
data.push({time: x.invert(mx), target: 0});
datalayer.call(join);
}
function dragstarted(d) {
d3.select(this).attr("stroke", "#FCE584")
data.splice(data.indexOf(d), 1), data.push(d);
datalayer.call(join);
}
function dragged(d) {
d.time = x.invert(d3.event.x);
datalayer.call(join);
}
function dragended(d) {
d3.select(this).attr("stroke", null);
}
return svg.node();
}