diff --git a/src/app/directives/grafanaGraph.js b/src/app/directives/grafanaGraph.js
index 374d5e34eab..fb506e59b11 100755
--- a/src/app/directives/grafanaGraph.js
+++ b/src/app/directives/grafanaGraph.js
@@ -46,10 +46,6 @@ function (angular, $, kbn, moment, _, GraphTooltip) {
scope.get_data();
});
- scope.$on('toggleLegend', function() {
- render_panel();
- });
-
// Receive render events
scope.$on('render',function(event, renderData) {
data = renderData || data;
diff --git a/src/app/panels/graph/legend.html b/src/app/panels/graph/legend.html
deleted file mode 100755
index 42fbda69de8..00000000000
--- a/src/app/panels/graph/legend.html
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
diff --git a/src/app/panels/graph/legend.js b/src/app/panels/graph/legend.js
new file mode 100644
index 00000000000..3632ee0deb1
--- /dev/null
+++ b/src/app/panels/graph/legend.js
@@ -0,0 +1,98 @@
+define([
+ 'angular',
+ 'app',
+ 'lodash',
+ 'kbn',
+ 'jquery',
+ 'jquery.flot',
+ 'jquery.flot.time',
+],
+function (angular, app, _, kbn, $) {
+ 'use strict';
+
+ var module = angular.module('grafana.panels.graph');
+
+ module.directive('graphLegend', function(popoverSrv) {
+
+ return {
+ link: function(scope, elem) {
+ var $container = $('');
+ var firstRender = true;
+ var panel = scope.panel;
+ var data;
+ var i;
+
+ scope.$on('render', function(event, renderData) {
+ data = renderData || data;
+ if (data) {
+ render();
+ }
+ });
+
+ function getSeriesIndexForElement(el) {
+ return el.parents('[data-series-index]').data('series-index');
+ }
+
+ function openColorSelector(e) {
+ var el = $(e.currentTarget);
+ var index = getSeriesIndexForElement(el);
+ var seriesInfo = data[index].info;
+ var popoverScope = scope.$new();
+ popoverScope.series = seriesInfo;
+ popoverSrv.show({
+ element: $(':first-child', el),
+ templateUrl: 'app/panels/graph/legend.popover.html',
+ scope: popoverScope
+ });
+ }
+
+ function toggleSeries(e) {
+ var el = $(e.currentTarget);
+ var index = getSeriesIndexForElement(el);
+ var seriesInfo = data[index].info;
+ scope.toggleSeries(seriesInfo, e);
+ }
+
+ function render() {
+ if (firstRender) {
+ elem.append($container);
+ $container.on('click', '.graph-legend-icon', openColorSelector);
+ $container.on('click', '.graph-legend-alias', toggleSeries);
+ firstRender = false;
+ }
+
+ $container.empty();
+
+ $container.toggleClass('graph-legend-table', panel.legend.alignAsTable);
+
+ for (i = 0; i < data.length; i++) {
+ var series = data[i];
+ var html = '
';
+ html += '
';
+ html += ' ';
+ html += '
';
+
+ html += '
';
+
+ if (panel.legend.values) {
+ if (panel.legend.min) { html += '
' + series.info.min + '
'; }
+ if (panel.legend.max) { html += '
' + series.info.max + '
'; }
+ if (panel.legend.avg) { html += '
' + series.info.avg + '
'; }
+ if (panel.legend.current) { html += '
' + series.info.current + '
'; }
+ if (panel.legend.total) { html += '
' + series.info.total + '
'; }
+ }
+
+ html += '
';
+ $container.append($(html));
+ }
+ }
+ }
+ };
+ });
+
+});
diff --git a/src/app/panels/graph/legend.popover.html b/src/app/panels/graph/legend.popover.html
new file mode 100644
index 00000000000..ea029429b1c
--- /dev/null
+++ b/src/app/panels/graph/legend.popover.html
@@ -0,0 +1,27 @@
+
+
×
+
+
+ Axis:
+
+ Left
+
+
+ Right
+
+
+
+
+
+
+
+
+
diff --git a/src/app/panels/graph/module.html b/src/app/panels/graph/module.html
index 1f185049800..77aa8a038f9 100644
--- a/src/app/panels/graph/module.html
+++ b/src/app/panels/graph/module.html
@@ -1,25 +1,22 @@
-
-
+
+
-
- No datapoints Can be caused by timezone mismatch between browser and graphite server
- Datapoints outside time range Can be caused by timezone mismatch between browser and graphite server
-
+
+ No datapoints Can be caused by timezone mismatch between browser and graphite server
+ Datapoints outside time range Can be caused by timezone mismatch between browser and graphite server
+
-
-
+
+
-
+
-
-
-
+
+
-
+