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 seriesList; var i; scope.$on('render', function() { data = scope.seriesList; 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 = seriesList[index]; 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 = seriesList[index]; scope.toggleSeries(seriesInfo, e); } function sortLegend(e) { var el = $(e.currentTarget); var stat = el.data('stat'); if (stat !== panel.legend.sort) { panel.legend.sortDesc = null; } // if already sort ascending, disable sorting if (panel.legend.sortDesc === false) { panel.legend.sort = null; panel.legend.sortDesc = null; render(); return; } panel.legend.sortDesc = !panel.legend.sortDesc; panel.legend.sort = stat; render(); } function getTableHeaderHtml(statName) { if (!panel.legend[statName]) { return ""; } var html = '' + statName; if (panel.legend.sort === statName) { var cssClass = panel.legend.sortDesc ? 'fa fa-caret-down' : 'fa fa-caret-up' ; html += ' '; } return html + ''; } function render() { if (firstRender) { elem.append($container); $container.on('click', '.graph-legend-icon', openColorSelector); $container.on('click', '.graph-legend-alias', toggleSeries); $container.on('click', 'th', sortLegend); firstRender = false; } seriesList = data; $container.empty(); $container.toggleClass('graph-legend-table', panel.legend.alignAsTable === true); if (panel.legend.alignAsTable) { var header = ''; header += ''; if (panel.legend.values) { header += getTableHeaderHtml('min'); header += getTableHeaderHtml('max'); header += getTableHeaderHtml('avg'); header += getTableHeaderHtml('current'); header += getTableHeaderHtml('total'); } header += ''; $container.append($(header)); } if (panel.legend.sort) { seriesList = _.sortBy(seriesList, function(series) { return series.stats[panel.legend.sort]; }); if (panel.legend.sortDesc) { seriesList = seriesList.reverse(); } } for (i = 0; i < seriesList.length; i++) { var series = seriesList[i]; // ignore empty series if (panel.legend.hideEmpty && series.allIsNull) { continue; } var html = '
'; html += '
'; html += ''; html += '
'; html += '
'; html += '' + series.label + ''; html += '
'; var avg = series.formatValue(series.stats.avg); var current = series.formatValue(series.stats.current); var min = series.formatValue(series.stats.min); var max = series.formatValue(series.stats.max); var total = series.formatValue(series.stats.total); if (panel.legend.values) { if (panel.legend.min) { html += '
' + min + '
'; } if (panel.legend.max) { html += '
' + max + '
'; } if (panel.legend.avg) { html += '
' + avg + '
'; } if (panel.legend.current) { html += '
' + current + '
'; } if (panel.legend.total) { html += '
' + total + '
'; } } html += '
'; $container.append($(html)); } } } }; }); });