ソースを参照

starting to get something working with the graphite target editor

Torkel Ödegaard 12 年 前
コミット
5dded7e0f4

+ 85 - 21
src/app/controllers/graphiteTarget.js

@@ -11,15 +11,11 @@ function (angular, _, config) {
   module.controller('GraphiteTargetCtrl', function($scope, $http) {
   module.controller('GraphiteTargetCtrl', function($scope, $http) {
 
 
     $scope.init = function() {
     $scope.init = function() {
-      $scope.segments = [];
-      var strSegments = $scope.target.target.split('.');
-      _.each(strSegments, function (segment, index) {
-        if (segment === '*') {
-          $scope.segments[index] = { val: segment, html: '<i class="icon-asterisk"><i>' };
-          return;
-        }
-
-        $scope.segments[index] = { val: segment, html: segment};
+      $scope.segments = _.map($scope.target.target.split('.'), function (segmentStr) {
+        return {
+          val: segmentStr,
+          html: segmentStr === '*' ? '<i class="icon-asterisk"><i>' : segmentStr
+        };
       });
       });
     };
     };
 
 
@@ -31,31 +27,99 @@ function (angular, _, config) {
       }, null);
       }, null);
     }
     }
 
 
-    $scope.getItems = function (index) {
+    function graphiteMetricQuery(query) {
+      var url = config.graphiteUrl + '/metrics/find/?query=' + query;
+      return $http.get(url);
+    }
+
+    function checkOtherSegments(fromIndex) {
+      var path = getSegmentPathUpTo(fromIndex + 1);
+      return graphiteMetricQuery(path)
+        .then(function(result) {
+          if (result.data.length === 0) {
+            $scope.segments = $scope.segments.splice(0, fromIndex);
+            $scope.segments.push({html: 'select metric'});
+            return;
+          }
+          if (result.data[0].expandable) {
+            if ($scope.segments.length === fromIndex) {
+              $scope.segments.push({html: 'select metric'});
+            }
+            else {
+              return checkOtherSegments(fromIndex + 1);
+            }
+          }
+        });
+    }
+
+    function setSegmentFocus(segmentIndex) {
+      _.each($scope.segments, function(segment, index) {
+        segment.focus = segmentIndex == index;
+      });
+    }
+
+    $scope.getAltSegments = function (index) {
       $scope.altSegments = [];
       $scope.altSegments = [];
-      var metricPath = getSegmentPathUpTo(index) + '.*';
-      var url = config.graphiteUrl + '/metrics/find/?query=' + metricPath;
-      return $http.get(url)
+
+      return graphiteMetricQuery(getSegmentPathUpTo(index) + '.*')
         .then(function(result) {
         .then(function(result) {
-          $scope.altSegments = result.data;
+          var altSegments = _.map(result.data, function(altSegment) {
+            return {
+              val: altSegment.text,
+              html: altSegment.text,
+              expandable: altSegment.expandable
+            }
+          });
+
+          altSegments.unshift({val: '*', html: '<i class="icon-asterisk"></i>' })
+          $scope.altSegments = altSegments;
         });
         });
     };
     };
 
 
     $scope.setSegment = function (altIndex, segmentIndex) {
     $scope.setSegment = function (altIndex, segmentIndex) {
-      $scope.segments[segmentIndex].val = $scope.altSegments[altIndex].text;
-      $scope.segments[segmentIndex].html = $scope.altSegments[altIndex].text;
-      $scope.target.target = getSegmentPathUpTo($scope.segments.length);
+      $scope.segments[segmentIndex].val = $scope.altSegments[altIndex].val;
+      $scope.segments[segmentIndex].html = $scope.altSegments[altIndex].html;
+
+      if ($scope.altSegments[altIndex].expandable) {
+        return checkOtherSegments(segmentIndex + 1)
+          .then(function () {
+            setSegmentFocus(segmentIndex + 1);
+            $scope.targetChanged();
+          });
+      }
+
+      setSegmentFocus(segmentIndex + 1);
       $scope.targetChanged();
       $scope.targetChanged();
     };
     };
 
 
     $scope.targetChanged = function() {
     $scope.targetChanged = function() {
+      $scope.target.target = getSegmentPathUpTo($scope.segments.length);
       $scope.$parent.get_data();
       $scope.$parent.get_data();
-      $scope.editMode = false;
     };
     };
 
 
-    $scope.edit = function() {
-      $scope.editMode = true;
-    };
+  });
 
 
+  module.directive('focusMe', function($timeout, $parse) {
+    return {
+      //scope: true,   // optionally create a child scope
+      link: function(scope, element, attrs) {
+        var model = $parse(attrs.focusMe);
+        scope.$watch(model, function(value) {
+          console.log('value=',value);
+          if(value === true) {
+            $timeout(function() {
+              element[0].focus();
+            });
+          }
+        });
+        // to address @blesh's comment, set attribute value to 'false'
+        // on blur event:
+        element.bind('blur', function() {
+           console.log('blur');
+           scope.$apply(model.assign(scope, false));
+        });
+      }
+    };
   });
   });
+
 });
 });

+ 13 - 14
src/app/panels/graphite/editor.html

@@ -16,7 +16,7 @@
       list-style: none;
       list-style: none;
       margin: 0;
       margin: 0;
     }
     }
-    .grafana-segment-list li {
+    .grafana-segment-list > li {
       float: left;
       float: left;
     }
     }
     .grafana-target-segment {
     .grafana-target-segment {
@@ -41,21 +41,20 @@
 
 
     <table style="margin: 0; padding: 0;width:100%;">
     <table style="margin: 0; padding: 0;width:100%;">
       <tr class="grafana-target-top">
       <tr class="grafana-target-top">
-        <td style="padding-left: 10px;"><i class="icon-eye-open"></i></td>
+        <td style="padding-left: 10px;width: 25px;"><i class="icon-eye-open"></i></td>
         <td>
         <td>
-          <ul class="grafana-segment-list">
-          <li class="dropdown" ng-repeat="segment in segments">
-            <a  class="grafana-target-segment dropdown-toggle"
-                data-toggle="dropdown" ng-click="getItems($index)"
-                data-placement="bottom" ng-bind-html-unsafe="segment.html"></a>
-            <ul class="dropdown-menu">
-              <li ng-repeat="altSegment in altSegments">
-                <a ng-click="setSegment($index, $parent.$index)">{{altSegment.text}}</a>
-              </li>
-            </ul>
-          </li>
+          <ul class="grafana-segment-list" role="menu">
+            <li class="dropdown" ng-repeat="segment in segments" role="menuitem">
+              <a tabindex="1" class="grafana-target-segment dropdown-toggle"
+                  data-toggle="dropdown" ng-click="getAltSegments($index)" focus-me="segment.focus"
+                  data-placement="bottom" ng-bind-html-unsafe="segment.html"></a>
+              <ul class="dropdown-menu" role="menu">
+                <li ng-repeat="altSegment in altSegments" role="menuitem">
+                  <a href="javascript:void(0)" tabindex="1" ng-click="setSegment($index, $parent.$index)" ng-bind-html-unsafe="altSegment.html"></a>
+                </li>
+              </ul>
+            </li>
           <ul>
           <ul>
-
         </td>
         </td>
         <td>
         <td>
             <i class="icon-remove"></i>
             <i class="icon-remove"></i>

+ 1 - 0
src/app/panels/graphite/module.html

@@ -40,6 +40,7 @@
       </a> |&nbsp
       </a> |&nbsp
     </span>
     </span>
   </div>
   </div>
+
   <form class="form-inline bordered histogram-options" ng-show="options">
   <form class="form-inline bordered histogram-options" ng-show="options">
     <span>
     <span>
       <div class="checkbox">
       <div class="checkbox">

ファイルの差分が大きいため隠しています
+ 0 - 0
src/css/bootstrap.dark.min.css


+ 1 - 3
src/vendor/bootstrap/less/grafana.less

@@ -76,13 +76,11 @@
   left: 20px;
   left: 20px;
   right: 20px;
   right: 20px;
   top: 25px;
   top: 25px;
+  bottom: 25px;
   outline: 1px solid #101214;
   outline: 1px solid #101214;
   border-top: 1px solid #3e444c;
   border-top: 1px solid #3e444c;
   padding: 0 10px 10px 10px;
   padding: 0 10px 10px 10px;
   background: #202328;
   background: #202328;
-  overflow-y: auto;
-  overflow-x: hidden;
-  height: 600px;
 }
 }
 
 
 .grafana-legend-container {
 .grafana-legend-container {

この差分においてかなりの量のファイルが変更されているため、一部のファイルを表示していません