drag = {
function render(event, {items, value, set}) {
const sel = d3.select(this).selectAll("g.drag");
const oldData = sel.data();
const newData = pointers(event, this).filter(validPointers);
sel
.data(joinData(oldData, newData), d => d.id)
.join(enter(value, set), d => d, exit(value, set))
.call(update(value, set));
items.call(renderItems);
}
function dragstart() {
d3.select(this)
.style("cursor", "grabbing")
.call(g => g.selectAll("g.hover").remove())
.call(g => g.select(".instructions")
.call(drawInstructions(dragInstructions)));
}
function dragend() {
d3.select(this)
.style("cursor", "grab")
.call(g => g.select(".instructions")
.attr("opacity", 1)
.call(drawInstructions(initInstructions))
.transition()
.delay(1000)
.duration(1000)
.attr("opacity", 0)
.remove())
}
return d3.drag()
.on("start.init", dragstart)
.on("end.cleanup", dragend)
.on("start drag end", render);
}