prodio
Version:
Simplified project management
207 lines (181 loc) • 5.46 kB
JavaScript
var Pie = module.exports = function(){
var
margin = {top: 20, left: 50, bottom: 20, right: 20},
width = -1,
height = 500,
duration = 500,
identity = '_id',
idx = 1,
ir = 0,
style = false,
onUpdate = false,
container,
getValue = function x(d){
return +d.value;
},
colorRange = false,
getColor = function(d){
return colorRange(getValue(d));
},
getText = function(d){
return d.text||'';
},
getIdentity = function(d){
return d.data[identity] || (d.data[identity] = ++idx);
},
enterSlice = function(node, arc){
node.append('path')
.style('fill', function(d){
return getColor(d.data);
})
;
node.append("text")
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.attr("dy", ".35em")
.style("text-anchor", "middle")
.text(function(d) { return getText(d.data); });
},
updateSlice = function(node, arc){
node.select('path')
.style('fill', function(d){
return getColor(d.data);
})
.attrTween('d', function(d){
this._current = this._current || d;
var interpolate = d3.interpolate(this._current, d);
this._current = interpolate(0);
return function(t) {
return arc(interpolate(t));
};
});
node.select('text')
.attr("transform", function(d) { return "translate(" + arc.centroid(d) + ")"; })
.text(function(d) { return getText(d.data); });
},
exitSlice = function(node, arc){
}
;
var chart = function(selection){
container = selection;
selection.each(function(data){
var wid = width===-1?this.offsetWidth:width;
var w = wid - margin.left - margin.right;
var h = height - margin.top - margin.bottom;
var r = (w>h)?Math.floor(h/2):Math.floor(w/2);
var vis = d3.select(this).select('svg');
var min = d3.min(data, getValue), max = d3.max(data, getValue);
var i=0, l=data.length;
for(;i<l; i++){
data[i][identity] = data[i][identity] || idx++;
}
colorRange = d3.scale.linear().domain([min, max]).range(["#ddd", "#333"]);
if(!vis[0][0]){
vis = d3.select(this).append('svg');
}
vis
.attr('width', wid)
.attr('height', height)
;
var arc = d3.svg.arc()
.outerRadius(r)
.innerRadius(ir);
var pie = d3.layout.pie()
.value(getValue);
var main = vis.select('g');
var slices = main.select('.slices');
if(!main[0][0]){
main = vis.append('g');
slices = main.append('g').attr('class', 'slices');
}
main
.attr('transform', 'translate('+(margin.left+(w/2))+', '+(margin.top+(h/2))+')')
;
var slice = slices.selectAll('g.slice')
.data(pie(data, getIdentity));
;
var sliceEnter = slice.enter()
.append('g')
.attr('class', 'slice')
;
enterSlice(sliceEnter, arc);
updateSlice(slice.transition().duration(duration), arc);
var sliceExit = slice.exit()
.remove()
;
exitSlice(sliceExit);
if(style){
var key;
for(key in style){
vis.selectAll(key).attr('style', style[key]);
}
}
if(onUpdate){
onUpdate(vis);
}
});
};
chart.width = function(_) {
if (!arguments.length) return width;
width = _;
return chart;
};
chart.height = function(_) {
if (!arguments.length) return height;
height = _;
return chart;
};
chart.value = function(_) {
if (!arguments.length) return getValue;
getValue = _;
return chart;
};
chart.text = function(_) {
if (!arguments.length) return getText;
getText = _;
return chart;
};
chart.duration = function(_) {
if (!arguments.length) return duration;
duration = _;
return chart;
};
chart.identity = function(_) {
if (!arguments.length) return identity;
identity = _;
return chart;
};
chart.innerRadius = function(_){
if (!arguments.length) return ir;
ir = _;
return chart;
};
chart.style = function(_) {
if (!arguments.length) return style;
style = _;
return chart;
};
chart.margin = function(_) {
if (!arguments.length) return margin;
margin.top = typeof _.top != 'undefined' ? _.top : margin.top;
margin.right = typeof _.right != 'undefined' ? _.right : margin.right;
margin.bottom = typeof _.bottom != 'undefined' ? _.bottom : margin.bottom;
margin.left = typeof _.left != 'undefined' ? _.left : margin.left;
return chart;
};
chart.updated = function(_){
if (!arguments.length) return onUpdate;
onUpdate = _;
return chart;
};
chart.colorize = function(_){
if (!arguments.length) return getColor;
getColor = _;
return chart;
};
chart.refresh = function() {
};
chart.update = function() {
container.transition().duration(duration).call(chart);
};
return chart;
};