<script type="text/javascript" src="../tests/parser.js"></script>
<script type="text/javascript" src="../tests/pathological_cases.js"></script>
<script type="text/javascript" src="../tests/per_series.js"></script>
+ <script type="text/javascript" src="../tests/plugins.js"></script>
<script type="text/javascript" src="../tests/range_selector.js"></script>
<script type="text/javascript" src="../tests/range_tests.js"></script>
<script type="text/javascript" src="../tests/rolling_average.js"></script>
--- /dev/null
+/**
+ * @fileoverview Tests for the plugins option.
+ *
+ * @author konigsberg@google.com (Robert Konigsberg)
+ */
+var pluginsTestCase = TestCase("plugins");
+
+pluginsTestCase.prototype.setUp = function() {
+ document.body.innerHTML = "<div id='graph'></div>";
+};
+
+pluginsTestCase.prototype.tearDown = function() {
+};
+
+pluginsTestCase.prototype.testWillDrawChart = function() {
+ var draw = 0;
+
+ var plugin = (function() {
+ var p = function() {
+ };
+
+ p.prototype.activate = function(g) {
+ return {
+ willDrawChart: this.willDrawChart
+ };
+ };
+
+ p.prototype.willDrawChart = function(e) {
+ draw++;
+ };
+
+ return p;
+ })();
+
+ var data = "X,Y1,Y2\n" +
+ "0,1,1\n" +
+ "1,1,1\n" +
+ "2,1,1\n" +
+ "3,1,1\n"
+ ;
+
+ var graph = document.getElementById("graph");
+ var g = new Dygraph(graph, data, { plugins : [ plugin ] });
+
+ assertEquals(1, draw);
+};
"labels": ["Series"],
"type": "Object",
"description": "Defines per-series options. Its keys match the y-axis label names, and the values are dictionaries themselves that contain options specific to that series. When this option is missing, it falls back on the old-style of per-series options comingled with global options."
+ },
+ "plugins": {
+ "default": "[]",
+ "labels": ["Configuration"],
+ "type": "Array<plugin>",
+ "description": "Defines per-graph plug-ins. Useful for per-graph customization"
}
}
; // </JSON>
'Value display/formatting',
'Zooming',
'Debugging',
+ 'Configuration',
'Deprecated'
];
var i;
Dygraph.Plotters.linePlotter
],
+ plugins: [ ],
+
// per-axis options
axes: {
x: {
// Activate plugins.
this.plugins_ = [];
- for (var i = 0; i < Dygraph.PLUGINS.length; i++) {
- var Plugin = Dygraph.PLUGINS[i];
+ var plugins = Dygraph.PLUGINS.concat(this.getOption('plugins'));
+ for (var i = 0; i < plugins.length; i++) {
+ var Plugin = plugins[i];
var pluginInstance = new Plugin();
var pluginDict = {
plugin: pluginInstance,
--- /dev/null
+// Copyright (c) 2013 Google, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+
+/**
+ * @fileoverview Plug-in for providing unzoom-on-hover.
+ *
+ * @author konigsberg@google.com (Robert Konigsberg)
+ */
+Dygraph.Plugins.Unzoom = (function() {
+
+ "use strict";
+
+ /**
+ * Create a new instance.
+ *
+ * @constructor
+ */
+ var unzoom = function() {
+ this.button_ = null;
+ this.over_ = false;
+ };
+
+ unzoom.prototype.toString = function() {
+ return 'Unzoom Plugin';
+ };
+
+ unzoom.prototype.activate = function(g) {
+ return {
+ willDrawChart: this.willDrawChart
+ };
+ };
+
+ unzoom.prototype.willDrawChart = function(e) {
+ var g = e.dygraph;
+
+ if (this.button_ != null) {
+ if (g.isZoomed() && this.over_) {
+ this.show(true);
+ }
+ return;
+ }
+
+ this.button_ = document.createElement('button');
+ this.button_.innerHTML = 'Unzoom';
+ this.button_.style.display = 'none';
+ this.button_.style.position = 'absolute';
+ this.button_.style.top = '2px';
+ this.button_.style.left = '59px';
+ this.button_.style.zIndex = 1000;
+ var parent = g.graphDiv;
+ parent.insertBefore(this.button_, parent.firstChild);
+
+ var self = this;
+ this.button_.onclick = function() {
+ // TODO(konigsberg): doUnzoom_ is private.
+ g.doUnzoom_();
+ }
+
+ g.addEvent(parent, 'mouseover', function() {
+ if (g.isZoomed()) {
+ self.show(true);
+ }
+ self.over_ = true;
+ });
+
+ g.addEvent(parent, 'mouseout', function() {
+ self.show(false);
+ self.over_ = false;
+ });
+ };
+
+ unzoom.prototype.show = function(enabled) {
+ this.button_.style.display = enabled ? 'block' : 'none';
+ };
+
+ unzoom.prototype.destroy = function() {
+ this.button_.parentElement.removeChild(this.button_);
+ };
+
+ return unzoom;
+
+})();
--- /dev/null
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7; IE=EmulateIE9">
+ <title>plugins demo</title>
+ <!--[if IE]>
+ <script type="text/javascript" src="../excanvas.js"></script>
+ <![endif]-->
+ <script type="text/javascript" src="../dygraph-dev.js"></script>
+
+ <!-- Include the Javascript for the plug-in -->
+ <script type="text/javascript" src="../plugins/unzoom.js"></script>
+ </head>
+ <body>
+ <h2>Plugins Demo</h2>
+ <table><tr><td>
+ <div id="demodiv"></div>
+ </td><td valign=top>
+ <div id="status" style="width:200px; font-size:0.8em; padding-top:5px;"></div>
+ </td>
+ </tr></table>
+ <script type="text/javascript">
+ g = new Dygraph(
+ document.getElementById("demodiv"),
+ function() {
+ var zp = function(x) { if (x < 10) return "0"+x; else return x; };
+ var r = "date,parabola,line,another line,sine wave\n";
+ for (var i=1; i<=31; i++) {
+ r += "200610" + zp(i);
+ r += "," + 10*(i*(31-i));
+ r += "," + 10*(8*i);
+ r += "," + 10*(250 - 8*i);
+ r += "," + 10*(125 + 125 * Math.sin(0.3*i));
+ r += "\n";
+ }
+ return r;
+ },
+ {
+ labelsDiv: document.getElementById('status'),
+ labelsSeparateLines: true,
+ labelsKMB: true,
+ legend: 'always',
+ colors: ["rgb(51,204,204)",
+ "rgb(255,100,100)",
+ "#00DD55",
+ "rgba(50,50,200,0.4)"],
+ width: 640,
+ height: 480,
+ title: 'Interesting Shapes',
+ xlabel: 'Date',
+ ylabel: 'Count',
+ axisLineColor: 'white',
+
+ // Set the plug-ins in the options.
+ plugins : [
+ Dygraph.Plugins.Unzoom
+ ]
+ }
+ );
+ </script>
+</body>
+</html>