Procházet zdrojové kódy

Added collapsable rows, error handling in table panel, ground work for new kinds of binding, refactored view a bit

Rashid Khan před 13 roky
rodič
revize
a73242cae5

+ 0 - 1
common/css/main.css

@@ -17,7 +17,6 @@
 .panel-error {
 .panel-error {
   opacity: 0.9;
   opacity: 0.9;
   position:absolute;
   position:absolute;
-  top:10px;
   z-index: 99999;
   z-index: 99999;
 }
 }
 
 

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 7 - 0
common/lib/angular-strap.min.js


+ 12 - 4
dashboards.js

@@ -3,7 +3,8 @@ var dashboards =
   title: "Infinite Monkey Dashboard",
   title: "Infinite Monkey Dashboard",
   rows: [
   rows: [
     {
     {
-      height: "20px",
+      title:  "Query Control",  
+      height: "30px",
       panels: [
       panels: [
         {
         {
           type    : "stringquery",
           type    : "stringquery",
@@ -18,15 +19,21 @@ var dashboards =
       ]
       ]
     },
     },
     {
     {
+      title:  "Monkey Monitoring",
+      collapse: false,
       height: "300px",
       height: "300px",
       panels: [
       panels: [
         {
         {
           title   : "Monkey Shakespeare Lines",
           title   : "Monkey Shakespeare Lines",
           type    : "histogram",
           type    : "histogram",
           span    : 6,
           span    : 6,
-          show    : ['lines','stack'],
-          fill    : 1,
-          query   : [{ label : "lines", query : "*", color: '#86B32D' } ],
+          show    : ['lines','points'],
+          fill    : 0,
+          query   : [
+            { label : "Query", query : "*", color: '#86B32D' },
+            { label : "Hamlet", query : "play_name:Hamlet" },
+            { label : "Macbeth", query : "play_name:macbeth" },
+          ],
           group   : "main"
           group   : "main"
         },
         },
         {
         {
@@ -43,6 +50,7 @@ var dashboards =
       ]
       ]
     },
     },
     {
     {
+      title:  "Lines of Plays",
       height: "300px",
       height: "300px",
       panels: [
       panels: [
         {
         {

+ 4 - 2
index.html

@@ -31,12 +31,14 @@
   <div class="navbar navbar-fixed-top">
   <div class="navbar navbar-fixed-top">
     <div class="navbar-inner">
     <div class="navbar-inner">
       <div class="container-fluid">
       <div class="container-fluid">
-        <span class="brand">Kibana Dashboard</span>
-        <span class="brand"><small>Real time metrics</small></span>
+        <span class="brand">{{dashboards.title}}</span>
+        <span class="brand"><small><small>Kibana Preview</small></small></span>
+        <div class='pull-right' style="padding-top: 5px; padding-left: 10px"><input type="file" id="upload" upload /></div>
         <div  class="btn-group pull-right">
         <div  class="btn-group pull-right">
           <button class="btn" ng-click="pause()"><i ng-class="{'icon-pause': playing,'icon-play': !playing}"></i></button>
           <button class="btn" ng-click="pause()"><i ng-class="{'icon-pause': playing,'icon-play': !playing}"></i></button>
           <button class="btn" ng-repeat='timespan in time_options' ng-click="set_timespan(timespan)">{{timespan}}</button>
           <button class="btn" ng-repeat='timespan in time_options' ng-click="set_timespan(timespan)">{{timespan}}</button>
         </div>
         </div>
+        
       </div>
       </div>
     </div>
     </div>
   </div>
   </div>

+ 1 - 0
js/app.js

@@ -19,6 +19,7 @@ var labjs = $LAB
   .script("common/lib/modernizr-2.6.1.min.js")
   .script("common/lib/modernizr-2.6.1.min.js")
   .script("common/lib/underscore.min.js")
   .script("common/lib/underscore.min.js")
   .script("common/lib/angular.min.js")
   .script("common/lib/angular.min.js")
+  .script("common/lib/angular-strap.min.js")
   .script("common/lib/elastic.min.js")
   .script("common/lib/elastic.min.js")
   .script("common/lib/elastic-angular-client.min.js")
   .script("common/lib/elastic-angular-client.min.js")
   .script("common/lib/dateformat.js")
   .script("common/lib/dateformat.js")

+ 5 - 0
js/controllers.js

@@ -47,6 +47,11 @@ angular.module('kibana.controllers', [])
   // point to your ElasticSearch server
   // point to your ElasticSearch server
   var ejs = $scope.ejs = ejsResource(config.elasticsearch);  
   var ejs = $scope.ejs = ejsResource(config.elasticsearch);  
 
 
+  $scope.toggle_row = function(row) {
+    $scope.$broadcast('toggle_row',row)
+    row.collapse = row.collapse ? false : true;
+  }
+
   $scope.set_timespan = function(timespan) {
   $scope.set_timespan = function(timespan) {
     $scope.timespan = timespan;
     $scope.timespan = timespan;
     $scope.from = time_ago($scope.timespan);
     $scope.from = time_ago($scope.timespan);

+ 1 - 1
panels/histogram/module.html

@@ -1,4 +1,4 @@
-<div ng-controller='histogram'>
+<div ng-controller='histogram' style="height:{{row.height}}">
   <h4>{{panel.title}}</h4>
   <h4>{{panel.title}}</h4>
   <div histogram params="{{panel}}" style="height:{{row.height}}"></div>
   <div histogram params="{{panel}}" style="height:{{row.height}}"></div>
 </div>         
 </div>         

+ 5 - 2
panels/histogram/module.js

@@ -87,12 +87,15 @@ angular.module('kibana.histogram', [])
     restrict: 'A',
     restrict: 'A',
     link: function(scope, elem, attrs, ctrl) {
     link: function(scope, elem, attrs, ctrl) {
 
 
-      scope.$watch('data', function() {
+      // If the data or row state changes, re-render
+      scope.$watch(function () {
+        return angular.toJson([scope.data, scope.row]) 
+      }, function() {
         if(!(_.isUndefined(scope.data)))
         if(!(_.isUndefined(scope.data)))
           render_panel(scope,elem,attrs);
           render_panel(scope,elem,attrs);
       });
       });
 
 
-      // Re-render if the window is
+      // Re-render if the window is resized
       angular.element(window).bind('resize', function(){
       angular.element(window).bind('resize', function(){
           render_panel(scope,elem,attrs);
           render_panel(scope,elem,attrs);
       });
       });

+ 6 - 3
panels/map/module.js

@@ -63,9 +63,12 @@ angular.module('kibana.map', [])
     restrict: 'A',
     restrict: 'A',
     link: function(scope, elem, attrs) {
     link: function(scope, elem, attrs) {
 
 
-      // Re-rending panel if data changes
-      scope.$watch('data', function() {
-        render_panel(scope,elem,attrs);
+      // If the data or row state changes, re-render
+      scope.$watch(function () {
+        return angular.toJson([scope.data, scope.row]) 
+      }, function() {
+        if(!(_.isUndefined(scope.data)))
+          render_panel(scope,elem,attrs);
       });
       });
 
 
       // Or if the window is resized
       // Or if the window is resized

+ 8 - 4
panels/pie/module.js

@@ -112,13 +112,15 @@ angular.module('kibana.pie', [])
     restrict: 'A',
     restrict: 'A',
     link: function(scope, elem, attrs) {
     link: function(scope, elem, attrs) {
 
 
-      // Re-rending the panel if it is resized,
-      scope.$watch('data', function() {
+      // Watch if data or row state changes
+      scope.$watch(function () {
+        return angular.toJson([scope.data, scope.row]) 
+      }, function() {
         if(!(_.isUndefined(scope.data)))
         if(!(_.isUndefined(scope.data)))
           render_panel(scope,elem,attrs);
           render_panel(scope,elem,attrs);
       });
       });
 
 
-      // Or if the model changes
+      // Or if the window is resized
       angular.element(window).bind('resize', function(){
       angular.element(window).bind('resize', function(){
           render_panel(scope,elem,attrs);
           render_panel(scope,elem,attrs);
       });
       });
@@ -152,7 +154,9 @@ angular.module('kibana.pie', [])
         };
         };
 
 
         // Populate element
         // Populate element
-        $.plot(elem, scope.data, pie);
+        if(elem.is(":visible")){
+          $.plot(elem, scope.data, pie);
+        }
         //elem.show();
         //elem.show();
       }
       }
     }
     }

+ 3 - 3
panels/sort/module.html

@@ -1,5 +1,5 @@
-<div ng-controller='sort'>
-  <h4 ng-hide="_.isUndefined(panel.title)">{{panel.title}}</h4>
-  <select ng-model="panel.sort[0]" ng-options="f for f in fields"></select>
+<div ng-controller='sort' style="white-space: nowrap;">
+  <h4 ng-class="{'ng-cloak': !panel.title}">{{panel.title}}</h4>
   <i ng-click="toggle_sort()" ng-class="{'icon-chevron-up': panel.sort[1] == 'asc','icon-chevron-down': panel.sort[1] == 'desc'}"></i>
   <i ng-click="toggle_sort()" ng-class="{'icon-chevron-up': panel.sort[1] == 'asc','icon-chevron-down': panel.sort[1] == 'desc'}"></i>
+  <select ng-model="panel.sort[0]" ng-options="f for f in fields"></select>
 </div>
 </div>

+ 2 - 2
panels/stringquery/module.html

@@ -1,6 +1,6 @@
 <div ng-controller='stringquery'>
 <div ng-controller='stringquery'>
-  <h4 ng-hide="_.isUndefined(panel.title)">{{panel.title}}</h4>
-  <form class="form-search">
+  <h4 ng-class="{'ng-cloak': !panel.title}">{{panel.title}}</h4>
+  <form class="form-search" style="margin-bottom:0px">
     <input type="text" class="input-medium search-query" ng-model="query" style="width:85%">
     <input type="text" class="input-medium search-query" ng-model="query" style="width:85%">
     <button type="submit" class="btn" ng-click="send_query(query)">Search</button>
     <button type="submit" class="btn" ng-click="send_query(query)">Search</button>
   </form>
   </form>

+ 23 - 12
partials/dashboard.html

@@ -1,17 +1,28 @@
 
 
-<div class="row-fluid" style="margin-top:50px">
-  <div class="row-fluid">
-    <div class="span8"><h2>{{dashboards.title}} <small>Last {{timespan}}</small></h2></div>
-    <div class="span4"><div><input type="file" id="upload" upload /></div></div>
-  </div>
-  <div class="row-fluid" ng-repeat="(row_name, row) in dashboards.rows" style="height:{{row.height}}">
-    <div ng-repeat="(name, panel) in row.panels">
-      <div class="span{{panel.span}}" style="position:relative">
-        <div class="span12 alert alert-error panel-error" ng-class="{'ng-cloak': !panel.error}">
-          <a class="close" ng-click="panel.error=false">&times;</a>
-          <i class="icon-exclamation-sign"></i> <strong>Oops!</strong> {{panel.error}}
+<div class="row-fluid container" style="margin-top:50px">
+  <!-- Rows -->
+  <div class="row-fluid" ng-repeat="(row_name, row) in dashboards.rows">
+    <div class="span12">
+      <div class="row-fluid" style="padding:0px;margin:0px;height:0px">
+        <div class="span12" style="min-height:5px;vertical-align:bottom">
+          <i class="pointer" ng-class="{'icon-minus': !row.collapse,'icon-plus': row.collapse}" ng-click="toggle_row(row)"></i>
+          <span ng-click="toggle_row(row)" class="pointer"><small>{{row.title}}</small></span>
         </div>
         </div>
-        <div class="span12" style="padding: 10px;height={{row.height}}" ng-include="'panels/'+panel.type+'/module.html'">
+      </div>
+      <div class="row-fluid" style="padding-top:10px" ng-hide="row.collapse">
+        <!-- Panels -->
+        <div ng-repeat="(name, panel) in row.panels" class="span{{panel.span}}" style="min-height:{{row.height}}; position:relative">
+          <!-- Error Panel -->
+          <div class="row-fluid">
+            <div class="span12 alert alert-error panel-error" ng-class="{'ng-cloak': !panel.error}">
+              <a class="close" ng-click="panel.error=false">&times;</a>
+              <i class="icon-exclamation-sign"></i> <strong>Oops!</strong> {{panel.error}}
+            </div>
+          </div>
+          <!-- Content Panel -->
+          <div class="row-fluid">
+            <div class="span12" style="margin-top:0px" ng-include="'panels/'+panel.type+'/module.html'"></div>
+          </div>
         </div>
         </div>
       </div>
       </div>
     </div>
     </div>

Některé soubory nejsou zobrazeny, neboť je v těchto rozdílových datech změněno mnoho souborů