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;
