Commit 915a0e37 by Zachary Tong

Move directive-level variables out of scope

parent 67d5a457
...@@ -148,6 +148,9 @@ angular.module('kibana.parallelcoordinates', []) ...@@ -148,6 +148,9 @@ angular.module('kibana.parallelcoordinates', [])
restrict: 'A', restrict: 'A',
link: function (scope, elem, attrs) { link: function (scope, elem, attrs) {
//used to store a variety of directive-level variables
var directive = {};
scope.initializing = false; scope.initializing = false;
...@@ -155,7 +158,7 @@ angular.module('kibana.parallelcoordinates', []) ...@@ -155,7 +158,7 @@ angular.module('kibana.parallelcoordinates', [])
* Initialize the panels if new, or render existing panels * Initialize the panels if new, or render existing panels
*/ */
scope.init_or_render = function() { scope.init_or_render = function() {
if (typeof scope.svg === 'undefined') { if (typeof directive.svg === 'undefined') {
//prevent duplicate initialization steps, if render is called again //prevent duplicate initialization steps, if render is called again
//before the svg is setup //before the svg is setup
...@@ -189,9 +192,9 @@ angular.module('kibana.parallelcoordinates', []) ...@@ -189,9 +192,9 @@ angular.module('kibana.parallelcoordinates', [])
*/ */
function init_panel() { function init_panel() {
scope.m = [80, 100, 80, 100]; directive.m = [80, 100, 80, 100];
scope.w = $(elem[0]).width() - scope.m[1] - scope.m[3]; directive.w = $(elem[0]).width() - directive.m[1] - directive.m[3];
scope.h = $(elem[0]).height() - scope.m[0] - scope.m[2]; directive.h = $(elem[0]).height() - directive.m[0] - directive.m[2];
scope.initializing = true; scope.initializing = true;
...@@ -200,22 +203,22 @@ angular.module('kibana.parallelcoordinates', []) ...@@ -200,22 +203,22 @@ angular.module('kibana.parallelcoordinates', [])
scripts.wait(function () { scripts.wait(function () {
directive.x = d3.scale.ordinal().domain(scope.panel.fields).rangePoints([0, directive.w]);
directive.y = {};
scope.x = d3.scale.ordinal().domain(scope.panel.fields).rangePoints([0, scope.w]); directive.line = d3.svg.line().interpolate('cardinal');
scope.y = {}; directive.axis = d3.svg.axis().orient("left");
scope.line = d3.svg.line().interpolate('cardinal');
scope.axis = d3.svg.axis().orient("left");
scope.svg = d3.select(elem[0]).append("svg") var viewbox = "0 0 " + (directive.w + directive.m[1] + directive.m[3]) + " " + (directive.h + directive.m[0] + directive.m[2]);
directive.svg = d3.select(elem[0]).append("svg")
.attr("width", "100%") .attr("width", "100%")
.attr("height", "100%") .attr("height", "100%")
.attr("viewbox", "0 0 " + (scope.w + scope.m[1] + scope.m[3]) + " " + (scope.h + scope.m[0] + scope.m[2])) .attr("viewbox", viewbox)
.append("svg:g") .append("svg:g")
.attr("transform", "translate(" + scope.m[3] + "," + scope.m[0] + ")"); .attr("transform", "translate(" + directive.m[3] + "," + directive.m[0] + ")");
// Add foreground lines. // Add foreground lines.
scope.foreground = scope.svg.append("svg:g") directive.foreground = directive.svg.append("svg:g")
.attr("class", "foreground"); .attr("class", "foreground");
scope.initializing = false; scope.initializing = false;
...@@ -227,16 +230,16 @@ angular.module('kibana.parallelcoordinates', []) ...@@ -227,16 +230,16 @@ angular.module('kibana.parallelcoordinates', [])
// Returns the path for a given data point. // Returns the path for a given data point.
function path(d) { function path(d) {
return scope.line(scope.panel.fields.map(function(p) { return [scope.x(p), scope.y[p](d[p])]; })); return directive.line(scope.panel.fields.map(function(p) { return [directive.x(p), directive.y[p](d[p])]; }));
} }
// Handles a brush event, toggling the display of foreground lines. // Handles a brush event, toggling the display of foreground lines.
function brush() { function brush() {
var actives = scope.panel.fields.filter(function(p) { return !scope.y[p].brush.empty(); }), var actives = scope.panel.fields.filter(function(p) { return !directive.y[p].brush.empty(); }),
extents = actives.map(function(p) { return scope.y[p].brush.extent(); }); extents = actives.map(function(p) { return directive.y[p].brush.extent(); });
//.fade class hides the "inactive" lines, helps speed up rendering significantly //.fade class hides the "inactive" lines, helps speed up rendering significantly
scope.foregroundLines.classed("fade", function(d) { directive.foregroundLines.classed("fade", function(d) {
return !actives.every(function(p, i) { return !actives.every(function(p, i) {
var inside = extents[i][0] <= d[p] && d[p] <= extents[i][1]; var inside = extents[i][0] <= d[p] && d[p] <= extents[i][1];
return inside; return inside;
...@@ -260,25 +263,25 @@ angular.module('kibana.parallelcoordinates', []) ...@@ -260,25 +263,25 @@ angular.module('kibana.parallelcoordinates', [])
//Drag functions are used for dragging the axis aroud //Drag functions are used for dragging the axis aroud
function dragstart(d) { function dragstart(d) {
scope.i = scope.panel.fields.indexOf(d); directive.i = scope.panel.fields.indexOf(d);
} }
function drag(d) { function drag(d) {
scope.x.range()[scope.i] = d3.event.x; directive.x.range()[directive.i] = d3.event.x;
scope.panel.fields.sort(function(a, b) { return scope.x(a) - scope.x(b); }); scope.panel.fields.sort(function(a, b) { return directive.x(a) - directive.x(b); });
scope.foregroundLines.attr("transform", function(d) { return "translate(" + scope.x(d) + ")"; }); directive.foregroundLines.attr("transform", function(d) { return "translate(" + directive.x(d) + ")"; });
scope.traits.attr("transform", function(d) { return "translate(" + scope.x(d) + ")"; }); directive.traits.attr("transform", function(d) { return "translate(" + directive.x(d) + ")"; });
scope.brushes.attr("transform", function(d) { return "translate(" + scope.x(d) + ")"; }); directive.brushes.attr("transform", function(d) { return "translate(" + directive.x(d) + ")"; });
scope.axisLines.attr("transform", function(d) { return "translate(" + scope.x(d) + ")"; }); directive.axisLines.attr("transform", function(d) { return "translate(" + directive.x(d) + ")"; });
scope.foregroundLines.attr("d", path); directive.foregroundLines.attr("d", path);
} }
function dragend(d) { function dragend(d) {
scope.x.domain(scope.panel.fields).rangePoints([0, scope.w]); directive.x.domain(scope.panel.fields).rangePoints([0, directive.w]);
var t = d3.transition().duration(500); var t = d3.transition().duration(500);
t.selectAll(".trait").attr("transform", function(d) { return "translate(" + scope.x(d) + ")"; }); t.selectAll(".trait").attr("transform", function(d) { return "translate(" + directive.x(d) + ")"; });
t.selectAll(".axis").attr("transform", function(d) { return "translate(" + scope.x(d) + ")"; }); t.selectAll(".axis").attr("transform", function(d) { return "translate(" + directive.x(d) + ")"; });
t.selectAll(".brush").attr("transform", function(d) { return "translate(" + scope.x(d) + ")"; }); t.selectAll(".brush").attr("transform", function(d) { return "translate(" + directive.x(d) + ")"; });
t.selectAll(".foregroundlines").attr("d", path); t.selectAll(".foregroundlines").attr("d", path);
} }
...@@ -293,21 +296,21 @@ angular.module('kibana.parallelcoordinates', []) ...@@ -293,21 +296,21 @@ angular.module('kibana.parallelcoordinates', [])
//update the svg if the size has changed //update the svg if the size has changed
scope.w = $(elem[0]).width() - scope.m[1] - scope.m[3]; directive.w = $(elem[0]).width() - directive.m[1] - directive.m[3];
scope.h = $(elem[0]).height() - scope.m[0] - scope.m[2]; directive.h = $(elem[0]).height() - directive.m[0] - directive.m[2];
scope.svg.attr("viewbox", "0 0 " + (scope.w + scope.m[1] + scope.m[3]) + " " + (scope.h + scope.m[0] + scope.m[2])); directive.svg.attr("viewbox", "0 0 " + (directive.w + directive.m[1] + directive.m[3]) + " " + (directive.h + directive.m[0] + directive.m[2]));
scope.x = d3.scale.ordinal().domain(scope.panel.fields).rangePoints([0, scope.w]); directive.x = d3.scale.ordinal().domain(scope.panel.fields).rangePoints([0, directive.w]);
scope.y = {}; directive.y = {};
scope.line = d3.svg.line().interpolate('cardinal'); directive.line = d3.svg.line().interpolate('cardinal');
scope.axis = d3.svg.axis().orient("left"); directive.axis = d3.svg.axis().orient("left");
var colorExtent = d3.extent(scope.data, function(p) { return +p[scope.panel.fields[0]]; }); var colorExtent = d3.extent(scope.data, function(p) { return +p[scope.panel.fields[0]]; });
scope.colors = d3.scale.linear() directive.colors = d3.scale.linear()
.domain([colorExtent[0],colorExtent[1]]) .domain([colorExtent[0],colorExtent[1]])
.range(["#4580FF", "#FF9245"]); .range(["#4580FF", "#FF9245"]);
...@@ -321,19 +324,17 @@ angular.module('kibana.parallelcoordinates', []) ...@@ -321,19 +324,17 @@ angular.module('kibana.parallelcoordinates', [])
var value = function(v) { return v[d]; }; var value = function(v) { return v[d]; };
var values = _.map(_.uniq(scope.data, value),value); var values = _.map(_.uniq(scope.data, value),value);
scope.y[d] = d3.scale.ordinal() directive.y[d] = d3.scale.ordinal()
.domain(values) .domain(values)
.rangeBands([scope.h, 0]); .rangeBands([directive.h, 0]);
} else if (_.isNumber(scope.data[0][d])) { } else if (_.isNumber(scope.data[0][d])) {
scope.y[d] = d3.scale.linear() directive.y[d] = d3.scale.linear()
.domain(d3.extent(scope.data, function(p) { return +p[d]; })) .domain(d3.extent(scope.data, function(p) { return +p[d]; }))
.range([scope.h, 0]); .range([directive.h, 0]);
} }
directive.y[d].brush = d3.svg.brush()
.y(directive.y[d])
scope.y[d].brush = d3.svg.brush()
.y(scope.y[d])
.on("brush", brush); .on("brush", brush);
}); });
...@@ -349,7 +350,7 @@ angular.module('kibana.parallelcoordinates', []) ...@@ -349,7 +350,7 @@ angular.module('kibana.parallelcoordinates', [])
//Lines //Lines
scope.foregroundLines = scope.foreground directive.foregroundLines = directive.foreground
.selectAll(".foregroundlines") .selectAll(".foregroundlines")
.data(activeData, function(d, i){ .data(activeData, function(d, i){
var id = ""; var id = "";
...@@ -358,39 +359,39 @@ angular.module('kibana.parallelcoordinates', []) ...@@ -358,39 +359,39 @@ angular.module('kibana.parallelcoordinates', [])
}); });
return id; return id;
}); });
scope.foregroundLines directive.foregroundLines
.enter().append("svg:path") .enter().append("svg:path")
.attr("d", path) .attr("d", path)
.attr("class", "foregroundlines") .attr("class", "foregroundlines")
.attr("style", function(d) { .attr("style", function(d) {
return "stroke:" + scope.colors(d[scope.panel.fields[0]]) + ";"; return "stroke:" + directive.colors(d[scope.panel.fields[0]]) + ";";
}); });
scope.foregroundLines.exit().remove(); directive.foregroundLines.exit().remove();
//Axis group //Axis group
scope.traits = scope.svg.selectAll(".trait") directive.traits = directive.svg.selectAll(".trait")
.data(scope.panel.fields, String); .data(scope.panel.fields, String);
scope.traits directive.traits
.enter().append("svg:g") .enter().append("svg:g")
.attr("class", "trait") .attr("class", "trait")
.attr("transform", function(d) { return "translate(" + scope.x(d) + ")"; }); .attr("transform", function(d) { return "translate(" + directive.x(d) + ")"; });
scope.traits directive.traits
.exit().remove(); .exit().remove();
//brushes used to select lines //brushes used to select lines
scope.brushes = scope.svg.selectAll(".brush") directive.brushes = directive.svg.selectAll(".brush")
.data(scope.panel.fields, String); .data(scope.panel.fields, String);
scope.brushes directive.brushes
.enter() .enter()
.append("svg:g") .append("svg:g")
.attr("class", "brush") .attr("class", "brush")
.each(function(d) { .each(function(d) {
d3.select(this) d3.select(this)
.call(scope.y[d].brush) .call(directive.y[d].brush)
.attr("transform", function(d) { return "translate(" + scope.x(d) + ")"; }); .attr("transform", function(d) { return "translate(" + directive.x(d) + ")"; });
}) })
.selectAll("rect") .selectAll("rect")
.attr("x", -8) .attr("x", -8)
...@@ -399,29 +400,29 @@ angular.module('kibana.parallelcoordinates', []) ...@@ -399,29 +400,29 @@ angular.module('kibana.parallelcoordinates', [])
//this section is repeated because enter() only works on "new" data, but we always need to //this section is repeated because enter() only works on "new" data, but we always need to
//update the brushes if things change. This just calls the brushing function, so it doesn't //update the brushes if things change. This just calls the brushing function, so it doesn't
//affect currently active rects //affect currently active rects
scope.brushes directive.brushes
.each(function(d) { .each(function(d) {
d3.select(this) d3.select(this)
.call(scope.y[d].brush) .call(directive.y[d].brush)
.attr("transform", function(d) { return "translate(" + scope.x(d) + ")"; }); .attr("transform", function(d) { return "translate(" + directive.x(d) + ")"; });
}); });
scope.brushes directive.brushes
.exit().remove(); .exit().remove();
//vertical axis and labels //vertical axis and labels
scope.axisLines = scope.svg.selectAll(".axis") directive.axisLines = directive.svg.selectAll(".axis")
.data(scope.panel.fields, String); .data(scope.panel.fields, String);
scope.axisLines directive.axisLines
.enter() .enter()
.append("svg:g") .append("svg:g")
.attr("class", "axis") .attr("class", "axis")
.each(function(d) { .each(function(d) {
d3.select(this) d3.select(this)
.call(scope.axis.scale(scope.y[d])) .call(directive.axis.scale(directive.y[d]))
.attr("transform", function(d) { return "translate(" + scope.x(d) + ")"; }); .attr("transform", function(d) { return "translate(" + directive.x(d) + ")"; });
}).call(d3.behavior.drag() }).call(d3.behavior.drag()
.origin(function(d) { return {x: scope.x(d)}; }) .origin(function(d) { return {x: directive.x(d)}; })
.on("dragstart", dragstart) .on("dragstart", dragstart)
.on("drag", drag) .on("drag", drag)
.on("dragend", dragend)) .on("dragend", dragend))
...@@ -430,7 +431,7 @@ angular.module('kibana.parallelcoordinates', []) ...@@ -430,7 +431,7 @@ angular.module('kibana.parallelcoordinates', [])
.attr("text-anchor", "middle") .attr("text-anchor", "middle")
.attr("y", -9) .attr("y", -9)
.text(String); .text(String);
scope.axisLines directive.axisLines
.exit().remove(); .exit().remove();
//Simulate a dragend in case there is new data and we need to rearrange //Simulate a dragend in case there is new data and we need to rearrange
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment