Jelajahi Sumber

Graph: legend sorting while in table mode implemented, panel persisted property, Closes #1030

Torkel Ödegaard 11 tahun lalu
induk
melakukan
0b966b7a28
2 mengubah file dengan 46 tambahan dan 12 penghapusan
  1. 1 1
      src/app/directives/grafanaGraph.js
  2. 45 11
      src/app/panels/graph/legend.js

+ 1 - 1
src/app/directives/grafanaGraph.js

@@ -106,7 +106,7 @@ function (angular, $, kbn, moment, _, GraphTooltip) {
             var series = data[i];
             var axis = yaxis[series.yaxis - 1];
             var formater = kbn.valueFormats[scope.panel.y_formats[series.yaxis - 1]];
-            series.updateLegendValues(formater, axis.tickDecimals, axis.scaledDecimals+ 2);
+            series.updateLegendValues(formater, axis.tickDecimals, axis.scaledDecimals + 2);
             if(!scope.$$phase) { scope.$digest(); }
           }
         }

+ 45 - 11
src/app/panels/graph/legend.js

@@ -20,6 +20,7 @@ function (angular, app, _, kbn, $) {
         var firstRender = true;
         var panel = scope.panel;
         var data;
+        var seriesList;
         var i;
 
         scope.$on('render', function() {
@@ -36,7 +37,7 @@ function (angular, app, _, kbn, $) {
         function openColorSelector(e) {
           var el = $(e.currentTarget);
           var index = getSeriesIndexForElement(el);
-          var seriesInfo = data[index];
+          var seriesInfo = seriesList[index];
           var popoverScope = scope.$new();
           popoverScope.series = seriesInfo;
           popoverSrv.show({
@@ -49,12 +50,35 @@ function (angular, app, _, kbn, $) {
         function toggleSeries(e) {
           var el = $(e.currentTarget);
           var index = getSeriesIndexForElement(el);
-          var seriesInfo = data[index];
+          var seriesInfo = seriesList[index];
           scope.toggleSeries(seriesInfo, e);
         }
 
         function sortLegend(e) {
+          var el = $(e.currentTarget);
+
+          if (panel.legend.sortDesc === false) {
+            panel.legend.sort = null;
+            panel.legend.sortDesc = null;
+            render();
+            return;
+          }
 
+          panel.legend.sortDesc = !panel.legend.sortDesc;
+          panel.legend.sort = el.data('stat');
+          render();
+        }
+
+        function getTableHeaderHtml(statName) {
+          if (!panel.legend[statName]) { return ""; }
+          var html = '<th class="pointer" data-stat="' + statName + '">' + statName;
+
+          if (panel.legend.sort === statName) {
+            var cssClass = panel.legend.sortDesc ? 'icon-caret-down' : 'icon-caret-up' ;
+            html += ' <span class="' + cssClass + '"></span>';
+          }
+
+          return html + '</th>';
         }
 
         function render() {
@@ -66,27 +90,37 @@ function (angular, app, _, kbn, $) {
             firstRender = false;
           }
 
+          seriesList = data;
+
           $container.empty();
 
           $container.toggleClass('graph-legend-table', panel.legend.alignAsTable === true);
 
           if (panel.legend.alignAsTable) {
             var header = '<tr>';
-            header += '<th></th>';
-            header += '<th></th>';
+            header += '<th colspan="2" style="text-align:left"></th>';
             if (panel.legend.values) {
-              if (panel.legend.min) { header += '<th>min</div>'; }
-              if (panel.legend.max) { header += '<th>max</div>'; }
-              if (panel.legend.avg) { header += '<th>avg</div>'; }
-              if (panel.legend.current) { header += '<th>current</div>'; }
-              if (panel.legend.total) { header += '<th>total</div>'; }
+              header += getTableHeaderHtml('min');
+              header += getTableHeaderHtml('max');
+              header += getTableHeaderHtml('avg');
+              header += getTableHeaderHtml('current');
+              header += getTableHeaderHtml('total');
             }
             header += '</tr>';
             $container.append($(header));
           }
 
-          for (i = 0; i < data.length; i++) {
-            var series = data[i];
+          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];
             var html = '<div class="graph-legend-series';
             if (series.yaxis === 2) { html += ' pull-right'; }
             if (scope.hiddenSeries[series.alias]) { html += ' graph-legend-series-hidden'; }