Merge branch 'development' of https://github.com/novus/nvd3 into development
Conflicts: nv.d3.min.js
This commit is contained in:
commit
9122285ae5
3
.gitignore
vendored
3
.gitignore
vendored
@ -22,3 +22,6 @@ _site
|
||||
ehthumbs.db
|
||||
Icon?
|
||||
Thumbs.db
|
||||
# nodejs packages #
|
||||
######################
|
||||
node_modules
|
||||
|
87
GruntFile.js
Normal file
87
GruntFile.js
Normal file
@ -0,0 +1,87 @@
|
||||
module.exports = function(grunt) {
|
||||
|
||||
//Project configuration.
|
||||
grunt.initConfig({
|
||||
pkg: grunt.file.readJSON('package.json'),
|
||||
concat: {
|
||||
options: {
|
||||
separator: ''
|
||||
},
|
||||
dist: {
|
||||
src: [
|
||||
'src/intro.js',
|
||||
'src/core.js',
|
||||
'src/tooltip.js',
|
||||
'src/utils.js',
|
||||
'src/models/axis.js',
|
||||
'src/models/historicalBar.js',
|
||||
'src/models/bullet.js',
|
||||
'src/models/bulletChart.js',
|
||||
'src/models/cumulativeLineChart.js',
|
||||
'src/models/discreteBar.js',
|
||||
'src/models/discreteBarChart.js',
|
||||
'src/models/distribution.js',
|
||||
'src/models/indentedTree.js',
|
||||
'src/models/legend.js',
|
||||
'src/models/line.js',
|
||||
'src/models/lineChart.js',
|
||||
'src/models/linePlusBarChart.js',
|
||||
'src/models/lineWithFocusChart.js',
|
||||
'src/models/linePlusBarWithFocusChart.js',
|
||||
'src/models/multiBar.js',
|
||||
'src/models/multiBarChart.js',
|
||||
'src/models/multiBarHorizontal.js',
|
||||
'src/models/multiBarHorizontalChart.js',
|
||||
'src/models/multiChart.js',
|
||||
'src/models/ohlcBar.js',
|
||||
'src/models/pie.js',
|
||||
'src/models/pieChart.js',
|
||||
'src/models/scatter.js',
|
||||
'src/models/scatterChart.js',
|
||||
'src/models/scatterPlusLineChart.js',
|
||||
'src/models/sparkline.js',
|
||||
'src/models/sparklinePlus.js',
|
||||
'src/models/stackedArea.js',
|
||||
'src/models/stackedAreaChart.js',
|
||||
'src/outro.js'
|
||||
],
|
||||
dest: 'nv.d3.js'
|
||||
}
|
||||
},
|
||||
uglify: {
|
||||
options: {
|
||||
banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
|
||||
'<%= grunt.template.today("yyyy-mm-dd") %> */'
|
||||
},
|
||||
js: {
|
||||
files: {
|
||||
'nv.d3.min.js': ['nv.d3.js']
|
||||
}
|
||||
}
|
||||
},
|
||||
jshint: {
|
||||
foo: {
|
||||
src: "src/**/*.js"
|
||||
},
|
||||
options: {
|
||||
jshintrc: '.jshintrc'
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
js: {
|
||||
files: ["src/**/*.js"],
|
||||
tasks: ['concat']
|
||||
}
|
||||
},
|
||||
|
||||
});
|
||||
|
||||
grunt.loadNpmTasks('grunt-contrib-watch');
|
||||
grunt.loadNpmTasks('grunt-contrib-concat');
|
||||
grunt.loadNpmTasks('grunt-contrib-jshint');
|
||||
grunt.loadNpmTasks('grunt-contrib-uglify');
|
||||
|
||||
grunt.registerTask('default', ['concat']);
|
||||
grunt.registerTask('production', ['concat', 'uglify']);
|
||||
grunt.registerTask('lint', ['jshint']);
|
||||
};
|
13
README.md
13
README.md
@ -55,6 +55,19 @@ fork's root directory will rebuild both `nv.d3.js` and `nv.d3.min.js`.
|
||||
|
||||
Without UglifyJS, you won't get the minified version when running make.
|
||||
|
||||
## use grunt
|
||||
|
||||
You can use grunt insteadof makefile to build js file. See more about [grunt](http://gruntjs.com/).
|
||||
***[Nodejs](http://nodejs.org/) must be installed before you can use grunt.***
|
||||
Run `npm install` in root dir to install grunt and it's dependencies.
|
||||
|
||||
Then, you can use these commands:
|
||||
|
||||
grunt # build nv.d3.js
|
||||
grunt production # build nv.d3.js and nv.d3.min.js
|
||||
grunt watch # watch file changes in src/, and rebuild nv.d3.js, it's very helpful when delevop nvd3
|
||||
grunt lint # run jshint on src/**/*.js
|
||||
|
||||
**We ask that you DO NOT minify pull requests...
|
||||
If you need to minify please build pull request in separate branch, and
|
||||
merge and minify in your master.
|
||||
|
BIN
examples/images/nvd3_sampleLineChart1.png
Normal file
BIN
examples/images/nvd3_sampleLineChart1.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 51 KiB |
657
nv.d3.js
657
nv.d3.js
@ -3294,6 +3294,7 @@ nv.models.historicalBarChart = function() {
|
||||
, legend = nv.models.legend()
|
||||
;
|
||||
|
||||
|
||||
var margin = {top: 30, right: 90, bottom: 50, left: 90}
|
||||
, color = nv.utils.defaultColor()
|
||||
, width = null
|
||||
@ -3461,6 +3462,7 @@ nv.models.historicalBarChart = function() {
|
||||
.attr("transform", "translate(" + availableWidth + ",0)");
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------
|
||||
// Main Chart Component(s)
|
||||
|
||||
@ -3541,7 +3543,6 @@ nv.models.historicalBarChart = function() {
|
||||
chart.update();
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
legend.dispatch.on('legendMouseover', function(d, i) {
|
||||
d.hover = true;
|
||||
@ -3701,322 +3702,322 @@ nv.models.historicalBarChart = function() {
|
||||
|
||||
return chart;
|
||||
}
|
||||
nv.models.indentedTree = function() {
|
||||
|
||||
//============================================================
|
||||
// Public Variables with Default Settings
|
||||
//------------------------------------------------------------
|
||||
|
||||
var margin = {top: 0, right: 0, bottom: 0, left: 0} //TODO: implement, maybe as margin on the containing div
|
||||
, width = 960
|
||||
, height = 500
|
||||
, color = nv.utils.defaultColor()
|
||||
, id = Math.floor(Math.random() * 10000)
|
||||
, header = true
|
||||
, filterZero = false
|
||||
, noData = "No Data Available."
|
||||
, childIndent = 20
|
||||
, columns = [{key:'key', label: 'Name', type:'text'}] //TODO: consider functions like chart.addColumn, chart.removeColumn, instead of a block like this
|
||||
, tableClass = null
|
||||
, iconOpen = 'images/grey-plus.png' //TODO: consider removing this and replacing with a '+' or '-' unless user defines images
|
||||
, iconClose = 'images/grey-minus.png'
|
||||
, dispatch = d3.dispatch('elementClick', 'elementDblclick', 'elementMouseover', 'elementMouseout')
|
||||
;
|
||||
|
||||
//============================================================
|
||||
|
||||
var idx = 0;
|
||||
|
||||
function chart(selection) {
|
||||
selection.each(function(data) {
|
||||
var depth = 1,
|
||||
container = d3.select(this);
|
||||
|
||||
var tree = d3.layout.tree()
|
||||
.children(function(d) { return d.values })
|
||||
.size([height, childIndent]); //Not sure if this is needed now that the result is HTML
|
||||
|
||||
chart.update = function() { container.transition().duration(600).call(chart) };
|
||||
|
||||
|
||||
//------------------------------------------------------------
|
||||
// Display No Data message if there's nothing to show.
|
||||
if (!data[0]) data[0] = {key: noData};
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
|
||||
var nodes = tree.nodes(data[0]);
|
||||
|
||||
// nodes.map(function(d) {
|
||||
// d.id = i++;
|
||||
// })
|
||||
|
||||
//------------------------------------------------------------
|
||||
// Setup containers and skeleton of chart
|
||||
|
||||
var wrap = d3.select(this).selectAll('div').data([[nodes]]);
|
||||
var wrapEnter = wrap.enter().append('div').attr('class', 'nvd3 nv-wrap nv-indentedtree');
|
||||
var tableEnter = wrapEnter.append('table');
|
||||
var table = wrap.select('table').attr('width', '100%').attr('class', tableClass);
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
|
||||
if (header) {
|
||||
var thead = tableEnter.append('thead');
|
||||
|
||||
var theadRow1 = thead.append('tr');
|
||||
|
||||
columns.forEach(function(column) {
|
||||
theadRow1
|
||||
.append('th')
|
||||
.attr('width', column.width ? column.width : '10%')
|
||||
.style('text-align', column.type == 'numeric' ? 'right' : 'left')
|
||||
.append('span')
|
||||
.text(column.label);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
var tbody = table.selectAll('tbody')
|
||||
.data(function(d) { return d });
|
||||
tbody.enter().append('tbody');
|
||||
|
||||
|
||||
|
||||
//compute max generations
|
||||
depth = d3.max(nodes, function(node) { return node.depth });
|
||||
tree.size([height, depth * childIndent]); //TODO: see if this is necessary at all
|
||||
|
||||
|
||||
// Update the nodes…
|
||||
var node = tbody.selectAll('tr')
|
||||
// .data(function(d) { return d; }, function(d) { return d.id || (d.id == ++i)});
|
||||
.data(function(d) { return d.filter(function(d) { return (filterZero && !d.children) ? filterZero(d) : true; } )}, function(d,i) { return d.id || (d.id || ++idx)});
|
||||
//.style('display', 'table-row'); //TODO: see if this does anything
|
||||
|
||||
node.exit().remove();
|
||||
|
||||
node.select('img.nv-treeicon')
|
||||
.attr('src', icon)
|
||||
.classed('folded', folded);
|
||||
|
||||
var nodeEnter = node.enter().append('tr');
|
||||
|
||||
|
||||
columns.forEach(function(column, index) {
|
||||
|
||||
var nodeName = nodeEnter.append('td')
|
||||
.style('padding-left', function(d) { return (index ? 0 : d.depth * childIndent + 12 + (icon(d) ? 0 : 16)) + 'px' }, 'important') //TODO: check why I did the ternary here
|
||||
.style('text-align', column.type == 'numeric' ? 'right' : 'left');
|
||||
|
||||
|
||||
if (index == 0) {
|
||||
nodeName.append('img')
|
||||
.classed('nv-treeicon', true)
|
||||
.classed('nv-folded', folded)
|
||||
.attr('src', icon)
|
||||
.style('width', '14px')
|
||||
.style('height', '14px')
|
||||
.style('padding', '0 1px')
|
||||
.style('display', function(d) { return icon(d) ? 'inline-block' : 'none'; })
|
||||
.on('click', click);
|
||||
}
|
||||
|
||||
|
||||
nodeName.append('span')
|
||||
.attr('class', d3.functor(column.classes) )
|
||||
.text(function(d) { return column.format ? column.format(d) :
|
||||
(d[column.key] || '-') });
|
||||
|
||||
if (column.showCount) {
|
||||
nodeName.append('span')
|
||||
.attr('class', 'nv-childrenCount');
|
||||
|
||||
node.selectAll('span.nv-childrenCount').text(function(d) {
|
||||
return ((d.values && d.values.length) || (d._values && d._values.length)) ? //If this is a parent
|
||||
'(' + ((d.values && (d.values.filter(function(d) { return filterZero ? filterZero(d) : true; }).length)) //If children are in values check its children and filter
|
||||
|| (d._values && d._values.filter(function(d) { return filterZero ? filterZero(d) : true; }).length) //Otherwise, do the same, but with the other name, _values...
|
||||
|| 0) + ')' //This is the catch-all in case there are no children after a filter
|
||||
: '' //If this is not a parent, just give an empty string
|
||||
});
|
||||
}
|
||||
|
||||
if (column.click)
|
||||
nodeName.select('span').on('click', column.click);
|
||||
|
||||
});
|
||||
|
||||
node
|
||||
.order()
|
||||
.on('click', function(d) {
|
||||
dispatch.elementClick({
|
||||
row: this, //TODO: decide whether or not this should be consistent with scatter/line events or should be an html link (a href)
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
})
|
||||
.on('dblclick', function(d) {
|
||||
dispatch.elementDblclick({
|
||||
row: this,
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
})
|
||||
.on('mouseover', function(d) {
|
||||
dispatch.elementMouseover({
|
||||
row: this,
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
})
|
||||
.on('mouseout', function(d) {
|
||||
dispatch.elementMouseout({
|
||||
row: this,
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// Toggle children on click.
|
||||
function click(d, _, unshift) {
|
||||
d3.event.stopPropagation();
|
||||
|
||||
if(d3.event.shiftKey && !unshift) {
|
||||
//If you shift-click, it'll toggle fold all the children, instead of itself
|
||||
d3.event.shiftKey = false;
|
||||
d.values && d.values.forEach(function(node){
|
||||
if (node.values || node._values) {
|
||||
click(node, 0, true);
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
if(!hasChildren(d)) {
|
||||
//download file
|
||||
//window.location.href = d.url;
|
||||
return true;
|
||||
}
|
||||
if (d.values) {
|
||||
d._values = d.values;
|
||||
d.values = null;
|
||||
} else {
|
||||
d.values = d._values;
|
||||
d._values = null;
|
||||
}
|
||||
chart.update();
|
||||
}
|
||||
|
||||
|
||||
function icon(d) {
|
||||
return (d._values && d._values.length) ? iconOpen : (d.values && d.values.length) ? iconClose : '';
|
||||
}
|
||||
|
||||
function folded(d) {
|
||||
return (d._values && d._values.length);
|
||||
}
|
||||
|
||||
function hasChildren(d) {
|
||||
var values = d.values || d._values;
|
||||
|
||||
return (values && values.length);
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
return chart;
|
||||
}
|
||||
|
||||
|
||||
//============================================================
|
||||
// Expose Public Variables
|
||||
//------------------------------------------------------------
|
||||
|
||||
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.width = function(_) {
|
||||
if (!arguments.length) return width;
|
||||
width = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.height = function(_) {
|
||||
if (!arguments.length) return height;
|
||||
height = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.color = function(_) {
|
||||
if (!arguments.length) return color;
|
||||
color = nv.utils.getColor(_);
|
||||
scatter.color(color);
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.id = function(_) {
|
||||
if (!arguments.length) return id;
|
||||
id = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.header = function(_) {
|
||||
if (!arguments.length) return header;
|
||||
header = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.noData = function(_) {
|
||||
if (!arguments.length) return noData;
|
||||
noData = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.filterZero = function(_) {
|
||||
if (!arguments.length) return filterZero;
|
||||
filterZero = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.columns = function(_) {
|
||||
if (!arguments.length) return columns;
|
||||
columns = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.tableClass = function(_) {
|
||||
if (!arguments.length) return tableClass;
|
||||
tableClass = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.iconOpen = function(_){
|
||||
if (!arguments.length) return iconOpen;
|
||||
iconOpen = _;
|
||||
return chart;
|
||||
}
|
||||
|
||||
chart.iconClose = function(_){
|
||||
if (!arguments.length) return iconClose;
|
||||
iconClose = _;
|
||||
return chart;
|
||||
}
|
||||
|
||||
//============================================================
|
||||
|
||||
|
||||
return chart;
|
||||
nv.models.indentedTree = function() {
|
||||
|
||||
//============================================================
|
||||
// Public Variables with Default Settings
|
||||
//------------------------------------------------------------
|
||||
|
||||
var margin = {top: 0, right: 0, bottom: 0, left: 0} //TODO: implement, maybe as margin on the containing div
|
||||
, width = 960
|
||||
, height = 500
|
||||
, color = nv.utils.defaultColor()
|
||||
, id = Math.floor(Math.random() * 10000)
|
||||
, header = true
|
||||
, filterZero = false
|
||||
, noData = "No Data Available."
|
||||
, childIndent = 20
|
||||
, columns = [{key:'key', label: 'Name', type:'text'}] //TODO: consider functions like chart.addColumn, chart.removeColumn, instead of a block like this
|
||||
, tableClass = null
|
||||
, iconOpen = 'images/grey-plus.png' //TODO: consider removing this and replacing with a '+' or '-' unless user defines images
|
||||
, iconClose = 'images/grey-minus.png'
|
||||
, dispatch = d3.dispatch('elementClick', 'elementDblclick', 'elementMouseover', 'elementMouseout')
|
||||
;
|
||||
|
||||
//============================================================
|
||||
|
||||
var idx = 0;
|
||||
|
||||
function chart(selection) {
|
||||
selection.each(function(data) {
|
||||
var depth = 1,
|
||||
container = d3.select(this);
|
||||
|
||||
var tree = d3.layout.tree()
|
||||
.children(function(d) { return d.values })
|
||||
.size([height, childIndent]); //Not sure if this is needed now that the result is HTML
|
||||
|
||||
chart.update = function() { container.transition().duration(600).call(chart) };
|
||||
|
||||
|
||||
//------------------------------------------------------------
|
||||
// Display No Data message if there's nothing to show.
|
||||
if (!data[0]) data[0] = {key: noData};
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
|
||||
var nodes = tree.nodes(data[0]);
|
||||
|
||||
// nodes.map(function(d) {
|
||||
// d.id = i++;
|
||||
// })
|
||||
|
||||
//------------------------------------------------------------
|
||||
// Setup containers and skeleton of chart
|
||||
|
||||
var wrap = d3.select(this).selectAll('div').data([[nodes]]);
|
||||
var wrapEnter = wrap.enter().append('div').attr('class', 'nvd3 nv-wrap nv-indentedtree');
|
||||
var tableEnter = wrapEnter.append('table');
|
||||
var table = wrap.select('table').attr('width', '100%').attr('class', tableClass);
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
|
||||
if (header) {
|
||||
var thead = tableEnter.append('thead');
|
||||
|
||||
var theadRow1 = thead.append('tr');
|
||||
|
||||
columns.forEach(function(column) {
|
||||
theadRow1
|
||||
.append('th')
|
||||
.attr('width', column.width ? column.width : '10%')
|
||||
.style('text-align', column.type == 'numeric' ? 'right' : 'left')
|
||||
.append('span')
|
||||
.text(column.label);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
var tbody = table.selectAll('tbody')
|
||||
.data(function(d) { return d });
|
||||
tbody.enter().append('tbody');
|
||||
|
||||
|
||||
|
||||
//compute max generations
|
||||
depth = d3.max(nodes, function(node) { return node.depth });
|
||||
tree.size([height, depth * childIndent]); //TODO: see if this is necessary at all
|
||||
|
||||
|
||||
// Update the nodes…
|
||||
var node = tbody.selectAll('tr')
|
||||
// .data(function(d) { return d; }, function(d) { return d.id || (d.id == ++i)});
|
||||
.data(function(d) { return d.filter(function(d) { return (filterZero && !d.children) ? filterZero(d) : true; } )}, function(d,i) { return d.id || (d.id || ++idx)});
|
||||
//.style('display', 'table-row'); //TODO: see if this does anything
|
||||
|
||||
node.exit().remove();
|
||||
|
||||
node.select('img.nv-treeicon')
|
||||
.attr('src', icon)
|
||||
.classed('folded', folded);
|
||||
|
||||
var nodeEnter = node.enter().append('tr');
|
||||
|
||||
|
||||
columns.forEach(function(column, index) {
|
||||
|
||||
var nodeName = nodeEnter.append('td')
|
||||
.style('padding-left', function(d) { return (index ? 0 : d.depth * childIndent + 12 + (icon(d) ? 0 : 16)) + 'px' }, 'important') //TODO: check why I did the ternary here
|
||||
.style('text-align', column.type == 'numeric' ? 'right' : 'left');
|
||||
|
||||
|
||||
if (index == 0) {
|
||||
nodeName.append('img')
|
||||
.classed('nv-treeicon', true)
|
||||
.classed('nv-folded', folded)
|
||||
.attr('src', icon)
|
||||
.style('width', '14px')
|
||||
.style('height', '14px')
|
||||
.style('padding', '0 1px')
|
||||
.style('display', function(d) { return icon(d) ? 'inline-block' : 'none'; })
|
||||
.on('click', click);
|
||||
}
|
||||
|
||||
|
||||
nodeName.append('span')
|
||||
.attr('class', d3.functor(column.classes) )
|
||||
.text(function(d) { return column.format ? column.format(d) :
|
||||
(d[column.key] || '-') });
|
||||
|
||||
if (column.showCount) {
|
||||
nodeName.append('span')
|
||||
.attr('class', 'nv-childrenCount');
|
||||
|
||||
node.selectAll('span.nv-childrenCount').text(function(d) {
|
||||
return ((d.values && d.values.length) || (d._values && d._values.length)) ? //If this is a parent
|
||||
'(' + ((d.values && (d.values.filter(function(d) { return filterZero ? filterZero(d) : true; }).length)) //If children are in values check its children and filter
|
||||
|| (d._values && d._values.filter(function(d) { return filterZero ? filterZero(d) : true; }).length) //Otherwise, do the same, but with the other name, _values...
|
||||
|| 0) + ')' //This is the catch-all in case there are no children after a filter
|
||||
: '' //If this is not a parent, just give an empty string
|
||||
});
|
||||
}
|
||||
|
||||
if (column.click)
|
||||
nodeName.select('span').on('click', column.click);
|
||||
|
||||
});
|
||||
|
||||
node
|
||||
.order()
|
||||
.on('click', function(d) {
|
||||
dispatch.elementClick({
|
||||
row: this, //TODO: decide whether or not this should be consistent with scatter/line events or should be an html link (a href)
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
})
|
||||
.on('dblclick', function(d) {
|
||||
dispatch.elementDblclick({
|
||||
row: this,
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
})
|
||||
.on('mouseover', function(d) {
|
||||
dispatch.elementMouseover({
|
||||
row: this,
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
})
|
||||
.on('mouseout', function(d) {
|
||||
dispatch.elementMouseout({
|
||||
row: this,
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// Toggle children on click.
|
||||
function click(d, _, unshift) {
|
||||
d3.event.stopPropagation();
|
||||
|
||||
if(d3.event.shiftKey && !unshift) {
|
||||
//If you shift-click, it'll toggle fold all the children, instead of itself
|
||||
d3.event.shiftKey = false;
|
||||
d.values && d.values.forEach(function(node){
|
||||
if (node.values || node._values) {
|
||||
click(node, 0, true);
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
if(!hasChildren(d)) {
|
||||
//download file
|
||||
//window.location.href = d.url;
|
||||
return true;
|
||||
}
|
||||
if (d.values) {
|
||||
d._values = d.values;
|
||||
d.values = null;
|
||||
} else {
|
||||
d.values = d._values;
|
||||
d._values = null;
|
||||
}
|
||||
chart.update();
|
||||
}
|
||||
|
||||
|
||||
function icon(d) {
|
||||
return (d._values && d._values.length) ? iconOpen : (d.values && d.values.length) ? iconClose : '';
|
||||
}
|
||||
|
||||
function folded(d) {
|
||||
return (d._values && d._values.length);
|
||||
}
|
||||
|
||||
function hasChildren(d) {
|
||||
var values = d.values || d._values;
|
||||
|
||||
return (values && values.length);
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
return chart;
|
||||
}
|
||||
|
||||
|
||||
//============================================================
|
||||
// Expose Public Variables
|
||||
//------------------------------------------------------------
|
||||
|
||||
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.width = function(_) {
|
||||
if (!arguments.length) return width;
|
||||
width = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.height = function(_) {
|
||||
if (!arguments.length) return height;
|
||||
height = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.color = function(_) {
|
||||
if (!arguments.length) return color;
|
||||
color = nv.utils.getColor(_);
|
||||
scatter.color(color);
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.id = function(_) {
|
||||
if (!arguments.length) return id;
|
||||
id = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.header = function(_) {
|
||||
if (!arguments.length) return header;
|
||||
header = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.noData = function(_) {
|
||||
if (!arguments.length) return noData;
|
||||
noData = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.filterZero = function(_) {
|
||||
if (!arguments.length) return filterZero;
|
||||
filterZero = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.columns = function(_) {
|
||||
if (!arguments.length) return columns;
|
||||
columns = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.tableClass = function(_) {
|
||||
if (!arguments.length) return tableClass;
|
||||
tableClass = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.iconOpen = function(_){
|
||||
if (!arguments.length) return iconOpen;
|
||||
iconOpen = _;
|
||||
return chart;
|
||||
}
|
||||
|
||||
chart.iconClose = function(_){
|
||||
if (!arguments.length) return iconClose;
|
||||
iconClose = _;
|
||||
return chart;
|
||||
}
|
||||
|
||||
//============================================================
|
||||
|
||||
|
||||
return chart;
|
||||
};nv.models.legend = function() {
|
||||
|
||||
//============================================================
|
||||
@ -8483,7 +8484,11 @@ nv.models.multiChart = function() {
|
||||
return '<h3>' + key + '</h3>' +
|
||||
'<p>' + y + ' at ' + x + '</p>'
|
||||
},
|
||||
x, y; //can be accessed via chart.lines.[x/y]Scale()
|
||||
x,
|
||||
y,
|
||||
yDomain1,
|
||||
yDomain2
|
||||
; //can be accessed via chart.lines.[x/y]Scale()
|
||||
|
||||
//============================================================
|
||||
// Private Variables
|
||||
@ -8662,10 +8667,10 @@ nv.models.multiChart = function() {
|
||||
return a.map(function(aVal,i){return {x: aVal.x, y: aVal.y + b[i].y}})
|
||||
}).concat([{x:0, y:0}]) : []
|
||||
|
||||
yScale1 .domain(d3.extent(d3.merge(series1).concat(extraValue1), function(d) { return d.y } ))
|
||||
yScale1 .domain(yDomain1 || d3.extent(d3.merge(series1).concat(extraValue1), function(d) { return d.y } ))
|
||||
.range([0, availableHeight])
|
||||
|
||||
yScale2 .domain(d3.extent(d3.merge(series2).concat(extraValue2), function(d) { return d.y } ))
|
||||
yScale2 .domain(yDomain2 || d3.extent(d3.merge(series2).concat(extraValue2), function(d) { return d.y } ))
|
||||
.range([0, availableHeight])
|
||||
|
||||
lines1.yDomain(yScale1.domain())
|
||||
@ -8865,6 +8870,18 @@ nv.models.multiChart = function() {
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.yDomain1 = function(_) {
|
||||
if (!arguments.length) return yDomain1;
|
||||
yDomain1 = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.yDomain2 = function(_) {
|
||||
if (!arguments.length) return yDomain2;
|
||||
yDomain2 = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.margin = function(_) {
|
||||
if (!arguments.length) return margin;
|
||||
margin = _;
|
||||
|
6
nv.d3.min.js
vendored
6
nv.d3.min.js
vendored
File diff suppressed because one or more lines are too long
11
package.json
Normal file
11
package.json
Normal file
@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "nvd3",
|
||||
"version": "0.0.1",
|
||||
"devDependencies": {
|
||||
"grunt": "~0.4.1",
|
||||
"grunt-contrib-jshint": "~0.3.0",
|
||||
"grunt-contrib-watch": "~0.3.1",
|
||||
"grunt-contrib-uglify": "~0.2.0",
|
||||
"grunt-contrib-concat": "~0.2.0"
|
||||
}
|
||||
}
|
@ -11,6 +11,7 @@ nv.models.historicalBarChart = function() {
|
||||
, legend = nv.models.legend()
|
||||
;
|
||||
|
||||
|
||||
var margin = {top: 30, right: 90, bottom: 50, left: 90}
|
||||
, color = nv.utils.defaultColor()
|
||||
, width = null
|
||||
@ -178,6 +179,7 @@ nv.models.historicalBarChart = function() {
|
||||
.attr("transform", "translate(" + availableWidth + ",0)");
|
||||
}
|
||||
|
||||
|
||||
//------------------------------------------------------------
|
||||
// Main Chart Component(s)
|
||||
|
||||
@ -258,7 +260,6 @@ nv.models.historicalBarChart = function() {
|
||||
chart.update();
|
||||
});
|
||||
|
||||
|
||||
/*
|
||||
legend.dispatch.on('legendMouseover', function(d, i) {
|
||||
d.hover = true;
|
||||
|
@ -1,317 +1,317 @@
|
||||
nv.models.indentedTree = function() {
|
||||
|
||||
//============================================================
|
||||
// Public Variables with Default Settings
|
||||
//------------------------------------------------------------
|
||||
|
||||
var margin = {top: 0, right: 0, bottom: 0, left: 0} //TODO: implement, maybe as margin on the containing div
|
||||
, width = 960
|
||||
, height = 500
|
||||
, color = nv.utils.defaultColor()
|
||||
, id = Math.floor(Math.random() * 10000)
|
||||
, header = true
|
||||
, filterZero = false
|
||||
, noData = "No Data Available."
|
||||
, childIndent = 20
|
||||
, columns = [{key:'key', label: 'Name', type:'text'}] //TODO: consider functions like chart.addColumn, chart.removeColumn, instead of a block like this
|
||||
, tableClass = null
|
||||
, iconOpen = 'images/grey-plus.png' //TODO: consider removing this and replacing with a '+' or '-' unless user defines images
|
||||
, iconClose = 'images/grey-minus.png'
|
||||
, dispatch = d3.dispatch('elementClick', 'elementDblclick', 'elementMouseover', 'elementMouseout')
|
||||
;
|
||||
|
||||
//============================================================
|
||||
|
||||
var idx = 0;
|
||||
|
||||
function chart(selection) {
|
||||
selection.each(function(data) {
|
||||
var depth = 1,
|
||||
container = d3.select(this);
|
||||
|
||||
var tree = d3.layout.tree()
|
||||
.children(function(d) { return d.values })
|
||||
.size([height, childIndent]); //Not sure if this is needed now that the result is HTML
|
||||
|
||||
chart.update = function() { container.transition().duration(600).call(chart) };
|
||||
|
||||
|
||||
//------------------------------------------------------------
|
||||
// Display No Data message if there's nothing to show.
|
||||
if (!data[0]) data[0] = {key: noData};
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
|
||||
var nodes = tree.nodes(data[0]);
|
||||
|
||||
// nodes.map(function(d) {
|
||||
// d.id = i++;
|
||||
// })
|
||||
|
||||
//------------------------------------------------------------
|
||||
// Setup containers and skeleton of chart
|
||||
|
||||
var wrap = d3.select(this).selectAll('div').data([[nodes]]);
|
||||
var wrapEnter = wrap.enter().append('div').attr('class', 'nvd3 nv-wrap nv-indentedtree');
|
||||
var tableEnter = wrapEnter.append('table');
|
||||
var table = wrap.select('table').attr('width', '100%').attr('class', tableClass);
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
|
||||
if (header) {
|
||||
var thead = tableEnter.append('thead');
|
||||
|
||||
var theadRow1 = thead.append('tr');
|
||||
|
||||
columns.forEach(function(column) {
|
||||
theadRow1
|
||||
.append('th')
|
||||
.attr('width', column.width ? column.width : '10%')
|
||||
.style('text-align', column.type == 'numeric' ? 'right' : 'left')
|
||||
.append('span')
|
||||
.text(column.label);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
var tbody = table.selectAll('tbody')
|
||||
.data(function(d) { return d });
|
||||
tbody.enter().append('tbody');
|
||||
|
||||
|
||||
|
||||
//compute max generations
|
||||
depth = d3.max(nodes, function(node) { return node.depth });
|
||||
tree.size([height, depth * childIndent]); //TODO: see if this is necessary at all
|
||||
|
||||
|
||||
// Update the nodes…
|
||||
var node = tbody.selectAll('tr')
|
||||
// .data(function(d) { return d; }, function(d) { return d.id || (d.id == ++i)});
|
||||
.data(function(d) { return d.filter(function(d) { return (filterZero && !d.children) ? filterZero(d) : true; } )}, function(d,i) { return d.id || (d.id || ++idx)});
|
||||
//.style('display', 'table-row'); //TODO: see if this does anything
|
||||
|
||||
node.exit().remove();
|
||||
|
||||
node.select('img.nv-treeicon')
|
||||
.attr('src', icon)
|
||||
.classed('folded', folded);
|
||||
|
||||
var nodeEnter = node.enter().append('tr');
|
||||
|
||||
|
||||
columns.forEach(function(column, index) {
|
||||
|
||||
var nodeName = nodeEnter.append('td')
|
||||
.style('padding-left', function(d) { return (index ? 0 : d.depth * childIndent + 12 + (icon(d) ? 0 : 16)) + 'px' }, 'important') //TODO: check why I did the ternary here
|
||||
.style('text-align', column.type == 'numeric' ? 'right' : 'left');
|
||||
|
||||
|
||||
if (index == 0) {
|
||||
nodeName.append('img')
|
||||
.classed('nv-treeicon', true)
|
||||
.classed('nv-folded', folded)
|
||||
.attr('src', icon)
|
||||
.style('width', '14px')
|
||||
.style('height', '14px')
|
||||
.style('padding', '0 1px')
|
||||
.style('display', function(d) { return icon(d) ? 'inline-block' : 'none'; })
|
||||
.on('click', click);
|
||||
}
|
||||
|
||||
|
||||
nodeName.append('span')
|
||||
.attr('class', d3.functor(column.classes) )
|
||||
.text(function(d) { return column.format ? column.format(d) :
|
||||
(d[column.key] || '-') });
|
||||
|
||||
if (column.showCount) {
|
||||
nodeName.append('span')
|
||||
.attr('class', 'nv-childrenCount');
|
||||
|
||||
node.selectAll('span.nv-childrenCount').text(function(d) {
|
||||
return ((d.values && d.values.length) || (d._values && d._values.length)) ? //If this is a parent
|
||||
'(' + ((d.values && (d.values.filter(function(d) { return filterZero ? filterZero(d) : true; }).length)) //If children are in values check its children and filter
|
||||
|| (d._values && d._values.filter(function(d) { return filterZero ? filterZero(d) : true; }).length) //Otherwise, do the same, but with the other name, _values...
|
||||
|| 0) + ')' //This is the catch-all in case there are no children after a filter
|
||||
: '' //If this is not a parent, just give an empty string
|
||||
});
|
||||
}
|
||||
|
||||
if (column.click)
|
||||
nodeName.select('span').on('click', column.click);
|
||||
|
||||
});
|
||||
|
||||
node
|
||||
.order()
|
||||
.on('click', function(d) {
|
||||
dispatch.elementClick({
|
||||
row: this, //TODO: decide whether or not this should be consistent with scatter/line events or should be an html link (a href)
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
})
|
||||
.on('dblclick', function(d) {
|
||||
dispatch.elementDblclick({
|
||||
row: this,
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
})
|
||||
.on('mouseover', function(d) {
|
||||
dispatch.elementMouseover({
|
||||
row: this,
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
})
|
||||
.on('mouseout', function(d) {
|
||||
dispatch.elementMouseout({
|
||||
row: this,
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// Toggle children on click.
|
||||
function click(d, _, unshift) {
|
||||
d3.event.stopPropagation();
|
||||
|
||||
if(d3.event.shiftKey && !unshift) {
|
||||
//If you shift-click, it'll toggle fold all the children, instead of itself
|
||||
d3.event.shiftKey = false;
|
||||
d.values && d.values.forEach(function(node){
|
||||
if (node.values || node._values) {
|
||||
click(node, 0, true);
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
if(!hasChildren(d)) {
|
||||
//download file
|
||||
//window.location.href = d.url;
|
||||
return true;
|
||||
}
|
||||
if (d.values) {
|
||||
d._values = d.values;
|
||||
d.values = null;
|
||||
} else {
|
||||
d.values = d._values;
|
||||
d._values = null;
|
||||
}
|
||||
chart.update();
|
||||
}
|
||||
|
||||
|
||||
function icon(d) {
|
||||
return (d._values && d._values.length) ? iconOpen : (d.values && d.values.length) ? iconClose : '';
|
||||
}
|
||||
|
||||
function folded(d) {
|
||||
return (d._values && d._values.length);
|
||||
}
|
||||
|
||||
function hasChildren(d) {
|
||||
var values = d.values || d._values;
|
||||
|
||||
return (values && values.length);
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
return chart;
|
||||
}
|
||||
|
||||
|
||||
//============================================================
|
||||
// Expose Public Variables
|
||||
//------------------------------------------------------------
|
||||
|
||||
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.width = function(_) {
|
||||
if (!arguments.length) return width;
|
||||
width = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.height = function(_) {
|
||||
if (!arguments.length) return height;
|
||||
height = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.color = function(_) {
|
||||
if (!arguments.length) return color;
|
||||
color = nv.utils.getColor(_);
|
||||
scatter.color(color);
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.id = function(_) {
|
||||
if (!arguments.length) return id;
|
||||
id = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.header = function(_) {
|
||||
if (!arguments.length) return header;
|
||||
header = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.noData = function(_) {
|
||||
if (!arguments.length) return noData;
|
||||
noData = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.filterZero = function(_) {
|
||||
if (!arguments.length) return filterZero;
|
||||
filterZero = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.columns = function(_) {
|
||||
if (!arguments.length) return columns;
|
||||
columns = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.tableClass = function(_) {
|
||||
if (!arguments.length) return tableClass;
|
||||
tableClass = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.iconOpen = function(_){
|
||||
if (!arguments.length) return iconOpen;
|
||||
iconOpen = _;
|
||||
return chart;
|
||||
}
|
||||
|
||||
chart.iconClose = function(_){
|
||||
if (!arguments.length) return iconClose;
|
||||
iconClose = _;
|
||||
return chart;
|
||||
}
|
||||
|
||||
//============================================================
|
||||
|
||||
|
||||
return chart;
|
||||
nv.models.indentedTree = function() {
|
||||
|
||||
//============================================================
|
||||
// Public Variables with Default Settings
|
||||
//------------------------------------------------------------
|
||||
|
||||
var margin = {top: 0, right: 0, bottom: 0, left: 0} //TODO: implement, maybe as margin on the containing div
|
||||
, width = 960
|
||||
, height = 500
|
||||
, color = nv.utils.defaultColor()
|
||||
, id = Math.floor(Math.random() * 10000)
|
||||
, header = true
|
||||
, filterZero = false
|
||||
, noData = "No Data Available."
|
||||
, childIndent = 20
|
||||
, columns = [{key:'key', label: 'Name', type:'text'}] //TODO: consider functions like chart.addColumn, chart.removeColumn, instead of a block like this
|
||||
, tableClass = null
|
||||
, iconOpen = 'images/grey-plus.png' //TODO: consider removing this and replacing with a '+' or '-' unless user defines images
|
||||
, iconClose = 'images/grey-minus.png'
|
||||
, dispatch = d3.dispatch('elementClick', 'elementDblclick', 'elementMouseover', 'elementMouseout')
|
||||
;
|
||||
|
||||
//============================================================
|
||||
|
||||
var idx = 0;
|
||||
|
||||
function chart(selection) {
|
||||
selection.each(function(data) {
|
||||
var depth = 1,
|
||||
container = d3.select(this);
|
||||
|
||||
var tree = d3.layout.tree()
|
||||
.children(function(d) { return d.values })
|
||||
.size([height, childIndent]); //Not sure if this is needed now that the result is HTML
|
||||
|
||||
chart.update = function() { container.transition().duration(600).call(chart) };
|
||||
|
||||
|
||||
//------------------------------------------------------------
|
||||
// Display No Data message if there's nothing to show.
|
||||
if (!data[0]) data[0] = {key: noData};
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
|
||||
var nodes = tree.nodes(data[0]);
|
||||
|
||||
// nodes.map(function(d) {
|
||||
// d.id = i++;
|
||||
// })
|
||||
|
||||
//------------------------------------------------------------
|
||||
// Setup containers and skeleton of chart
|
||||
|
||||
var wrap = d3.select(this).selectAll('div').data([[nodes]]);
|
||||
var wrapEnter = wrap.enter().append('div').attr('class', 'nvd3 nv-wrap nv-indentedtree');
|
||||
var tableEnter = wrapEnter.append('table');
|
||||
var table = wrap.select('table').attr('width', '100%').attr('class', tableClass);
|
||||
|
||||
//------------------------------------------------------------
|
||||
|
||||
|
||||
if (header) {
|
||||
var thead = tableEnter.append('thead');
|
||||
|
||||
var theadRow1 = thead.append('tr');
|
||||
|
||||
columns.forEach(function(column) {
|
||||
theadRow1
|
||||
.append('th')
|
||||
.attr('width', column.width ? column.width : '10%')
|
||||
.style('text-align', column.type == 'numeric' ? 'right' : 'left')
|
||||
.append('span')
|
||||
.text(column.label);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
var tbody = table.selectAll('tbody')
|
||||
.data(function(d) { return d });
|
||||
tbody.enter().append('tbody');
|
||||
|
||||
|
||||
|
||||
//compute max generations
|
||||
depth = d3.max(nodes, function(node) { return node.depth });
|
||||
tree.size([height, depth * childIndent]); //TODO: see if this is necessary at all
|
||||
|
||||
|
||||
// Update the nodes…
|
||||
var node = tbody.selectAll('tr')
|
||||
// .data(function(d) { return d; }, function(d) { return d.id || (d.id == ++i)});
|
||||
.data(function(d) { return d.filter(function(d) { return (filterZero && !d.children) ? filterZero(d) : true; } )}, function(d,i) { return d.id || (d.id || ++idx)});
|
||||
//.style('display', 'table-row'); //TODO: see if this does anything
|
||||
|
||||
node.exit().remove();
|
||||
|
||||
node.select('img.nv-treeicon')
|
||||
.attr('src', icon)
|
||||
.classed('folded', folded);
|
||||
|
||||
var nodeEnter = node.enter().append('tr');
|
||||
|
||||
|
||||
columns.forEach(function(column, index) {
|
||||
|
||||
var nodeName = nodeEnter.append('td')
|
||||
.style('padding-left', function(d) { return (index ? 0 : d.depth * childIndent + 12 + (icon(d) ? 0 : 16)) + 'px' }, 'important') //TODO: check why I did the ternary here
|
||||
.style('text-align', column.type == 'numeric' ? 'right' : 'left');
|
||||
|
||||
|
||||
if (index == 0) {
|
||||
nodeName.append('img')
|
||||
.classed('nv-treeicon', true)
|
||||
.classed('nv-folded', folded)
|
||||
.attr('src', icon)
|
||||
.style('width', '14px')
|
||||
.style('height', '14px')
|
||||
.style('padding', '0 1px')
|
||||
.style('display', function(d) { return icon(d) ? 'inline-block' : 'none'; })
|
||||
.on('click', click);
|
||||
}
|
||||
|
||||
|
||||
nodeName.append('span')
|
||||
.attr('class', d3.functor(column.classes) )
|
||||
.text(function(d) { return column.format ? column.format(d) :
|
||||
(d[column.key] || '-') });
|
||||
|
||||
if (column.showCount) {
|
||||
nodeName.append('span')
|
||||
.attr('class', 'nv-childrenCount');
|
||||
|
||||
node.selectAll('span.nv-childrenCount').text(function(d) {
|
||||
return ((d.values && d.values.length) || (d._values && d._values.length)) ? //If this is a parent
|
||||
'(' + ((d.values && (d.values.filter(function(d) { return filterZero ? filterZero(d) : true; }).length)) //If children are in values check its children and filter
|
||||
|| (d._values && d._values.filter(function(d) { return filterZero ? filterZero(d) : true; }).length) //Otherwise, do the same, but with the other name, _values...
|
||||
|| 0) + ')' //This is the catch-all in case there are no children after a filter
|
||||
: '' //If this is not a parent, just give an empty string
|
||||
});
|
||||
}
|
||||
|
||||
if (column.click)
|
||||
nodeName.select('span').on('click', column.click);
|
||||
|
||||
});
|
||||
|
||||
node
|
||||
.order()
|
||||
.on('click', function(d) {
|
||||
dispatch.elementClick({
|
||||
row: this, //TODO: decide whether or not this should be consistent with scatter/line events or should be an html link (a href)
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
})
|
||||
.on('dblclick', function(d) {
|
||||
dispatch.elementDblclick({
|
||||
row: this,
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
})
|
||||
.on('mouseover', function(d) {
|
||||
dispatch.elementMouseover({
|
||||
row: this,
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
})
|
||||
.on('mouseout', function(d) {
|
||||
dispatch.elementMouseout({
|
||||
row: this,
|
||||
data: d,
|
||||
pos: [d.x, d.y]
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// Toggle children on click.
|
||||
function click(d, _, unshift) {
|
||||
d3.event.stopPropagation();
|
||||
|
||||
if(d3.event.shiftKey && !unshift) {
|
||||
//If you shift-click, it'll toggle fold all the children, instead of itself
|
||||
d3.event.shiftKey = false;
|
||||
d.values && d.values.forEach(function(node){
|
||||
if (node.values || node._values) {
|
||||
click(node, 0, true);
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
if(!hasChildren(d)) {
|
||||
//download file
|
||||
//window.location.href = d.url;
|
||||
return true;
|
||||
}
|
||||
if (d.values) {
|
||||
d._values = d.values;
|
||||
d.values = null;
|
||||
} else {
|
||||
d.values = d._values;
|
||||
d._values = null;
|
||||
}
|
||||
chart.update();
|
||||
}
|
||||
|
||||
|
||||
function icon(d) {
|
||||
return (d._values && d._values.length) ? iconOpen : (d.values && d.values.length) ? iconClose : '';
|
||||
}
|
||||
|
||||
function folded(d) {
|
||||
return (d._values && d._values.length);
|
||||
}
|
||||
|
||||
function hasChildren(d) {
|
||||
var values = d.values || d._values;
|
||||
|
||||
return (values && values.length);
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
return chart;
|
||||
}
|
||||
|
||||
|
||||
//============================================================
|
||||
// Expose Public Variables
|
||||
//------------------------------------------------------------
|
||||
|
||||
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.width = function(_) {
|
||||
if (!arguments.length) return width;
|
||||
width = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.height = function(_) {
|
||||
if (!arguments.length) return height;
|
||||
height = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.color = function(_) {
|
||||
if (!arguments.length) return color;
|
||||
color = nv.utils.getColor(_);
|
||||
scatter.color(color);
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.id = function(_) {
|
||||
if (!arguments.length) return id;
|
||||
id = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.header = function(_) {
|
||||
if (!arguments.length) return header;
|
||||
header = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.noData = function(_) {
|
||||
if (!arguments.length) return noData;
|
||||
noData = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.filterZero = function(_) {
|
||||
if (!arguments.length) return filterZero;
|
||||
filterZero = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.columns = function(_) {
|
||||
if (!arguments.length) return columns;
|
||||
columns = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.tableClass = function(_) {
|
||||
if (!arguments.length) return tableClass;
|
||||
tableClass = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.iconOpen = function(_){
|
||||
if (!arguments.length) return iconOpen;
|
||||
iconOpen = _;
|
||||
return chart;
|
||||
}
|
||||
|
||||
chart.iconClose = function(_){
|
||||
if (!arguments.length) return iconClose;
|
||||
iconClose = _;
|
||||
return chart;
|
||||
}
|
||||
|
||||
//============================================================
|
||||
|
||||
|
||||
return chart;
|
||||
};
|
@ -14,7 +14,11 @@ nv.models.multiChart = function() {
|
||||
return '<h3>' + key + '</h3>' +
|
||||
'<p>' + y + ' at ' + x + '</p>'
|
||||
},
|
||||
x, y; //can be accessed via chart.lines.[x/y]Scale()
|
||||
x,
|
||||
y,
|
||||
yDomain1,
|
||||
yDomain2
|
||||
; //can be accessed via chart.lines.[x/y]Scale()
|
||||
|
||||
//============================================================
|
||||
// Private Variables
|
||||
@ -193,10 +197,10 @@ nv.models.multiChart = function() {
|
||||
return a.map(function(aVal,i){return {x: aVal.x, y: aVal.y + b[i].y}})
|
||||
}).concat([{x:0, y:0}]) : []
|
||||
|
||||
yScale1 .domain(d3.extent(d3.merge(series1).concat(extraValue1), function(d) { return d.y } ))
|
||||
yScale1 .domain(yDomain1 || d3.extent(d3.merge(series1).concat(extraValue1), function(d) { return d.y } ))
|
||||
.range([0, availableHeight])
|
||||
|
||||
yScale2 .domain(d3.extent(d3.merge(series2).concat(extraValue2), function(d) { return d.y } ))
|
||||
yScale2 .domain(yDomain2 || d3.extent(d3.merge(series2).concat(extraValue2), function(d) { return d.y } ))
|
||||
.range([0, availableHeight])
|
||||
|
||||
lines1.yDomain(yScale1.domain())
|
||||
@ -396,6 +400,18 @@ nv.models.multiChart = function() {
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.yDomain1 = function(_) {
|
||||
if (!arguments.length) return yDomain1;
|
||||
yDomain1 = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.yDomain2 = function(_) {
|
||||
if (!arguments.length) return yDomain2;
|
||||
yDomain2 = _;
|
||||
return chart;
|
||||
};
|
||||
|
||||
chart.margin = function(_) {
|
||||
if (!arguments.length) return margin;
|
||||
margin = _;
|
||||
|
@ -25,15 +25,15 @@
|
||||
font-family: Arial;
|
||||
font-size: 13px;
|
||||
|
||||
/*
|
||||
transition: opacity 500ms linear;
|
||||
/*transition: opacity 500ms linear;
|
||||
-moz-transition: opacity 500ms linear;
|
||||
-webkit-transition: opacity 500ms linear;
|
||||
|
||||
transition-delay: 500ms;
|
||||
-moz-transition-delay: 500ms;
|
||||
-webkit-transition-delay: 500ms;
|
||||
*/
|
||||
|
||||
*/
|
||||
|
||||
-moz-box-shadow: 0 5px 10px rgba(0,0,0,.2);
|
||||
-webkit-box-shadow: 0 5px 10px rgba(0,0,0,.2);
|
||||
|
Loading…
Reference in New Issue
Block a user