streamline how refreshes happen,
add tooltip to sensor field,
add start of an "actions" column for sensors


Project: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/repo
Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/commit/10c5d2b7
Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/tree/10c5d2b7
Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-ui/diff/10c5d2b7

Branch: refs/heads/0.4.0
Commit: 10c5d2b7d53afe5ad285195b04a1d6af3dc81ca1
Parents: 1fd0948
Author: Alex Heneveld <[email protected]>
Authored: Sun May 6 02:40:38 2012 +0300
Committer: Alex Heneveld <[email protected]>
Committed: Sun May 6 02:40:38 2012 +0300

----------------------------------------------------------------------
 .../web/console/TestWebApplication.groovy       | 60 ++++++++++++--------
 .../web/console/entity/SensorSummary.groovy     |  2 +
 .../grails-app/views/detail/_main.gsp           |  4 ++
 .../grails-app/views/detail/_main.haml          |  3 +
 .../web-app/css/console/brooklyn-console.css    |  8 +++
 .../console/detail-tab/detail-tabs/sensors.js   | 46 ++++++++++++---
 .../web-app/js/console/util/brooklyn-util.js    |  5 +-
 7 files changed, 94 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/10c5d2b7/usage/web-console/grails-app/utils/brooklyn/web/console/TestWebApplication.groovy
----------------------------------------------------------------------
diff --git 
a/usage/web-console/grails-app/utils/brooklyn/web/console/TestWebApplication.groovy
 
b/usage/web-console/grails-app/utils/brooklyn/web/console/TestWebApplication.groovy
index db196f7..6612c7f 100644
--- 
a/usage/web-console/grails-app/utils/brooklyn/web/console/TestWebApplication.groovy
+++ 
b/usage/web-console/grails-app/utils/brooklyn/web/console/TestWebApplication.groovy
@@ -1,5 +1,10 @@
 package brooklyn.web.console
 
+import grails.converters.JSON
+import groovy.time.TimeDuration;
+
+import java.util.concurrent.TimeUnit
+
 import brooklyn.entity.Effector
 import brooklyn.entity.Entity
 import brooklyn.entity.ParameterType
@@ -7,19 +12,19 @@ import brooklyn.entity.basic.AbstractApplication
 import brooklyn.entity.basic.AbstractEntity
 import brooklyn.entity.basic.AbstractGroup
 import brooklyn.entity.basic.BasicParameterType
-import brooklyn.entity.basic.EntityLocal;
+import brooklyn.entity.basic.EntityLocal
 import brooklyn.entity.webapp.tomcat.TomcatServer
+import brooklyn.event.AttributeSensor
+import brooklyn.event.Sensor
 import brooklyn.event.basic.BasicAttributeSensor
 import brooklyn.location.Location
 import brooklyn.location.basic.SimulatedLocation
+import brooklyn.management.Task
 import brooklyn.policy.Policy
 import brooklyn.policy.basic.GeneralPurposePolicy
-import brooklyn.management.Task
+import brooklyn.util.internal.TimeExtras;
+import brooklyn.util.task.ScheduledTask
 import brooklyn.web.console.entity.TestEffector
-import grails.converters.JSON
-import brooklyn.event.basic.BasicSensor
-import brooklyn.event.Sensor
-import brooklyn.event.AttributeSensor
 
 // TODO remove these test classes as soon as the group agrees they're 
unnecessary!
 private class TestWebApplication extends AbstractApplication {
@@ -237,14 +242,16 @@ private class TestWebApplication extends 
AbstractApplication {
                                 "Stop Tomcat": stopTomcat,
                                 "Restart Tomcat": restartTomcat])
 
-            for (def i = 0; i < 10; ++i) {
-                this.getExecutionContext().submit([
-                                                      tags:["EFFECTOR"],
-                                                      tag:this,
-                                                      displayName: "Update 
values (test " + i + ")",
-                                                      description: "This 
updates sensor values"],
-                                                  new MyRunnable(this));
-            }
+            //updates sensors (this doesn't seem to be working?)
+            this.getExecutionContext().submit(
+                new ScheduledTask(period: TimeExtras.duration(5, 
TimeUnit.SECONDS),
+                    tags:["EFFECTOR"],
+                    tag:this,
+                    displayName: "Update values",
+                    description: "This updates sensor values",
+                    { updateSensorsWithRandoms(TestTomcatEntity.this); }));
+                
+                updateSensorsWithRandoms(this);
         }
 
         public <T> Task<T> invoke(Effector<T> eff, Map<String, ?> parameters) {
@@ -259,18 +266,23 @@ private class TestWebApplication extends 
AbstractApplication {
             }
             void run() {
                 while (true) {
-                    Map ss = entity.getSensors()
-                    for (String key: hackMeIn.keySet()) {
-                        def s = ss[key]
-                        if (s != null){
-                            entity.setAttribute(s,
-                                hackMeIn[key] + 
ManagementContextService.ID_GENERATOR +
-                                    ((int) 1000 * Math.random()))
-                        }
-                    }
-                    Thread.sleep(5000)
+                    updateSensorsWithRandoms(entity);
+                    Thread.sleep(5000);
                 }
             }
         }
     }
+    
+    public void updateSensorsWithRandoms(EntityLocal entity) {
+        Map ss = entity.getSensors()
+        for (String key: entity.hackMeIn.keySet()) {
+            def s = ss[key]
+//                        System.out.println("updating $entity $ss $s");
+            if (s != null){
+                entity.setAttribute(s,
+                    entity.hackMeIn[key] + 
ManagementContextService.ID_GENERATOR +
+                        ((int) 1000 * Math.random()))
+            }
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/10c5d2b7/usage/web-console/grails-app/utils/brooklyn/web/console/entity/SensorSummary.groovy
----------------------------------------------------------------------
diff --git 
a/usage/web-console/grails-app/utils/brooklyn/web/console/entity/SensorSummary.groovy
 
b/usage/web-console/grails-app/utils/brooklyn/web/console/entity/SensorSummary.groovy
index 1d56c87..3fb56b4 100644
--- 
a/usage/web-console/grails-app/utils/brooklyn/web/console/entity/SensorSummary.groovy
+++ 
b/usage/web-console/grails-app/utils/brooklyn/web/console/entity/SensorSummary.groovy
@@ -18,6 +18,7 @@ public class SensorSummary {
     public final String description
     public final String value
     public final String timestamp
+    public final String actions
 
     // formatter is not thread-safe; use thread-local storage
     private static final ThreadLocal<DateFormat> formatter = new 
ThreadLocal<DateFormat>() {
@@ -33,6 +34,7 @@ public class SensorSummary {
         this.description = sensor.description
         this.value = value
         this.timestamp = formatter.get().format(new Date())
+        this.actions = [ "open": "http://www.google.com/"; ]
     }
 
     public SensorSummary(SensorEvent event) {

http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/10c5d2b7/usage/web-console/grails-app/views/detail/_main.gsp
----------------------------------------------------------------------
diff --git a/usage/web-console/grails-app/views/detail/_main.gsp 
b/usage/web-console/grails-app/views/detail/_main.gsp
index 9b687af..c6e7eca 100644
--- a/usage/web-console/grails-app/views/detail/_main.gsp
+++ b/usage/web-console/grails-app/views/detail/_main.gsp
@@ -31,6 +31,10 @@
     <div class='sensor-table'>
       <table class='tab-content-table' id='sensor-data'></table>
     </div>
+    <div class='sensor-bottom-buttons'>
+      <a href='javascript:Brooklyn.sensors.update();'>RELOAD</a>
+      <a 
href='javascript:Brooklyn.sensors.toggleShowEmptySensors();'>FILTER</a>
+    </div>
   </div>
   <div id='effectors' tabindex='2'>
     <g:render template='detail-tabs/effectors'></g:render>

http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/10c5d2b7/usage/web-console/grails-app/views/detail/_main.haml
----------------------------------------------------------------------
diff --git a/usage/web-console/grails-app/views/detail/_main.haml 
b/usage/web-console/grails-app/views/detail/_main.haml
index b5fe7a1..869917d 100644
--- a/usage/web-console/grails-app/views/detail/_main.haml
+++ b/usage/web-console/grails-app/views/detail/_main.haml
@@ -21,6 +21,9 @@
     #sensors{:tabindex=>"1"}
         .sensor-table
             %table{:id=>"sensor-data", :class=>"tab-content-table"}
+        .sensor-bottom-buttons
+            %a{:href=>"javascript:Brooklyn.sensors.update();"}RELOAD
+            
%a{:href=>"javascript:Brooklyn.sensors.toggleShowEmptySensors();"}FILTER
     #effectors{:tabindex=>"2"}
         %g:render{:template=>"detail-tabs/effectors"}
     #location{:tabindex=>"3"}

http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/10c5d2b7/usage/web-console/web-app/css/console/brooklyn-console.css
----------------------------------------------------------------------
diff --git a/usage/web-console/web-app/css/console/brooklyn-console.css 
b/usage/web-console/web-app/css/console/brooklyn-console.css
index ada2589..17ce85e 100644
--- a/usage/web-console/web-app/css/console/brooklyn-console.css
+++ b/usage/web-console/web-app/css/console/brooklyn-console.css
@@ -340,6 +340,14 @@ textarea#logbox{
     min-height: 400px;
     max-height: 400px;
     overflow-y: auto;
+    margin-bottom: 8px;
+}
+.sensor-bottom-buttons {
+       float:right;
+}
+.sensor-bottom-buttons a {
+       margin-left: 8px;
+       text-decoration: none;
 }
 
 .mapbox dl {

http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/10c5d2b7/usage/web-console/web-app/js/console/detail-tab/detail-tabs/sensors.js
----------------------------------------------------------------------
diff --git 
a/usage/web-console/web-app/js/console/detail-tab/detail-tabs/sensors.js 
b/usage/web-console/web-app/js/console/detail-tab/detail-tabs/sensors.js
index 5fce163..a4c8f82 100644
--- a/usage/web-console/web-app/js/console/detail-tab/detail-tabs/sensors.js
+++ b/usage/web-console/web-app/js/console/detail-tab/detail-tabs/sensors.js
@@ -11,34 +11,62 @@ Brooklyn.sensors = (function() {
         };
 
         this.updateTableData = function(json) {
-            // Config
-            var aoColumns = [ { "mDataProp": "name", "sTitle": "name", 
"sWidth":"30%"  },
-                              { "mDataProp": "description", "sTitle": 
"description", "sWidth":"30%" },
-                              { "mDataProp": "value", "sTitle": "value", 
"sWidth":"20%", "bSortable": false },
-                              { "mDataProp": "timestamp", "sTitle": "last 
updated", "sWidth":"20%"}];
-
-            Brooklyn.util.getDataTable('#sensor-data', ".", aoColumns, 
undefined, json, false);
+            for (i in json) {
+              json[i].actionHtml = '<a href="www.google.com" 
target="_new">Open</a>';
+              json[i].nameWithToolTip = '<div 
title="'+json[i].description+'">'+json[i].name+'</div>';
+            }
+            
+            console.log("sensors update"); 
+            console.log(json);
+            var table = Brooklyn.util.getDataTable('#sensor-data');
+            console.log(table);
+            table.fnClearTable(false);
+            table.fnAddData(json);
+            
             $(Brooklyn.eventBus).trigger('update_ok');
         }
 
         this.makeHandlers();
     }
+    
     SensorsTab.prototype = new Brooklyn.tabs.Tab();
 
     function init() {
         var tab = new SensorsTab();
         $(Brooklyn.eventBus).bind("entity_selected", 
tab.handler.entitySelected);
         $(Brooklyn.eventBus).bind("tab_selected", tab.handler.tabSelected);
-
+        
         $('#sensor-data').click(function() {
             Brooklyn.util.pauseUpdate(tab);
         });
+        
+        // Config
+        var aoColumns = [ { "mDataProp": "nameWithToolTip", "sTitle": "Key", 
"sWidth":"25%"  },
+                          { "mDataProp": "value", "sTitle": "Value", 
"sWidth":"40%", "bSortable": false },
+                          { "mDataProp": "actionHtml", "sTitle": "Actions", 
"sWidth":"40%", "bSortable": false },
+                      ];
+        var table = Brooklyn.util.getDataTable('#sensor-data', ".", aoColumns, 
undefined, undefined, false);
+        table.fnFilter( '.+', 1, true );
+    }
+
+    var showEmptySensors = false;
+    function toggleShowEmptySensors() {
+      setShowEmptySensors(!showEmptySensors)
+    }
+    function setShowEmptySensors(filter) {
+      showEmptySensors = filter;
+      var table = Brooklyn.util.getDataTable('#sensor-data');
+      if (filter) table.fnFilter( '.*', 1, true );
+      else table.fnFilter( '.+', 1, true );
     }
 
     return {
-        init: init
+        init: init,
+        toggleShowEmptySensors: toggleShowEmptySensors,
+        setSensorEmptyFilter: setShowEmptySensors
     };
 
 })();
 
 $(document).ready(Brooklyn.sensors.init);
+

http://git-wip-us.apache.org/repos/asf/brooklyn-ui/blob/10c5d2b7/usage/web-console/web-app/js/console/util/brooklyn-util.js
----------------------------------------------------------------------
diff --git a/usage/web-console/web-app/js/console/util/brooklyn-util.js 
b/usage/web-console/web-app/js/console/util/brooklyn-util.js
index ded575c..832f571 100644
--- a/usage/web-console/web-app/js/console/util/brooklyn-util.js
+++ b/usage/web-console/web-app/js/console/util/brooklyn-util.js
@@ -51,6 +51,8 @@ Brooklyn.util = (function(){
 // NOTE: You can simply call getDataTable(id) once the table is initialized
 
     function getDataTable(id, sAjaxDataProp, aoColumns, clickCallback, data, 
paginate) {
+        // TODO looks like paginate argument not used (?) -- remove?
+      
         var table = $(id).dataTable( {
                 "bRetrieve": true, // return existing table if initialized
                 "bAutoWidth": false,
@@ -68,8 +70,9 @@ Brooklyn.util = (function(){
         }
 
         if (data) {
-            table.fnClearTable();
+            table.fnClearTable(false);
             table.fnAddData(data);
+            
         }
 
         return table;

Reply via email to