Fix for issues 236 & 270 from timeu.
authortimeu <uemit.seren@gmail.com>
Thu, 26 Jan 2012 18:53:04 +0000 (13:53 -0500)
committerDan Vanderkam <danvk@google.com>
Thu, 26 Jan 2012 18:53:04 +0000 (13:53 -0500)
Issue 236: Highlight callback will fail if the first data series has visibility=false
Issue 270: Remove onResize event handler in destroy() function

auto_tests/misc/local.html
auto_tests/tests/callback.js [new file with mode: 0644]
dygraph.js

index d24cab8..8e4cfdd 100644 (file)
@@ -39,6 +39,7 @@
   <script type="text/javascript" src="../tests/update_options.js"></script>
   <script type="text/javascript" src="../tests/utils_test.js"></script>
   <script type="text/javascript" src="../tests/multiple_axes.js"></script>
+  <script type="text/javascript" src="../tests/callback.js"></script>
 
 
   <script type="text/javascript">
diff --git a/auto_tests/tests/callback.js b/auto_tests/tests/callback.js
new file mode 100644 (file)
index 0000000..1697e21
--- /dev/null
@@ -0,0 +1,54 @@
+/** 
+ * @fileoverview Test cases for the callbacks.
+ *
+ * @author uemit.seren@gmail.com (Ümit Seren)
+ */
+
+var CallbackTestCase = TestCase("callback");
+
+CallbackTestCase.prototype.setUp = function() {
+  document.body.innerHTML = "<div id='graph'></div>";
+};
+
+CallbackTestCase.prototype.tearDown = function() {
+};
+ var data = "X,a\,b,c\n" +
+ "10,-1,1,2\n" +
+ "11,0,3,1\n" +
+ "12,1,4,2\n" +
+ "13,0,2,3\n";
+ /**
+  * This tests that when the function idxToRow_ returns the proper row and the onHiglightCallback
+  * is properly called when the  first series is hidden (setVisibility = false) 
+  * 
+  */
+ CallbackTestCase.prototype.testHighlightCallbackIsCalled = function() {
+   var h_row;
+   var h_pts;
+
+   var highlightCallback  =  function(e, x, pts, row) {
+         h_row = row;
+         h_pts = pts;
+   }; 
+
+   
+
+   var graph = document.getElementById("graph");
+   var g = new Dygraph(graph, data,
+       {
+         width: 100,
+         height : 100,
+         visibility: [false, true, true],
+         highlightCallback : highlightCallback,
+       });
+
+   DygraphOps.dispatchMouseMove(g, 13, 10);
+
+   //check correct row is returned
+   assertEquals(3, h_row);
+   //check there are only two points (because first series is hidden)
+   assertEquals(2, h_pts.length);
+ };
index e8293ae..c633df7 100644 (file)
@@ -840,11 +840,13 @@ Dygraph.prototype.createInterface_ = function() {
   this.createStatusMessage_();
   this.createDragInterface_();
 
+  this.resizeHandler = function(e) {
+    dygraph.resize();
+  }
+
   // Update when the window is resized.
   // TODO(danvk): drop frames depending on complexity of the chart.
-  Dygraph.addEvent(window, 'resize', function(e) {
-    dygraph.resize();
-  });
+  Dygraph.addEvent(window, 'resize', this.resizeHandler);
 };
 
 /**
@@ -868,7 +870,9 @@ Dygraph.prototype.destroy = function() {
       }
     }
   };
-
+  // remove event handlers
+  Dygraph.removeEvent(window,'resize',this.resizeHandler);
+  this.resizeHandler = null;
   // These may not all be necessary, but it can't hurt...
   nullOut(this.layout_);
   nullOut(this.plotter_);
@@ -1526,11 +1530,20 @@ Dygraph.prototype.mouseMove_ = function(event) {
 Dygraph.prototype.idxToRow_ = function(idx) {
   if (idx < 0) return -1;
 
-  for (var i in this.layout_.datasets) {
-    if (idx < this.layout_.datasets[i].length) {
-      return this.boundaryIds_[0][0]+idx;
+  // make sure that you get the boundaryIds record which is also defined (see bug #236)
+  var boundaryIdx = -1;
+  for (var i = 0; i < this.boundaryIds_.length; i++) {
+    if (this.boundaryIds_[i] !== undefined) {
+      boundaryIdx = i;
+      break;
+    }
+  }
+  if (boundaryIdx < 0) return -1;
+  for (var name in this.layout_.datasets) {
+    if (idx < this.layout_.datasets[name].length) {
+      return this.boundaryIds_[boundaryIdx][0] + idx;
     }
-    idx -= this.layout_.datasets[i].length;
+    idx -= this.layout_.datasets[name].length;
   }
   return -1;
 };