summaryrefslogtreecommitdiff
path: root/query/chart_factory.js
diff options
context:
space:
mode:
authorJosh Blum2013-05-11 19:56:48 -0700
committerJosh Blum2013-05-11 19:56:48 -0700
commit9e9308df1599bd13e808cacc6b3cea5a5c697df3 (patch)
treef01f195141a26a27b1c34f9cd2e03b92041a2a37 /query/chart_factory.js
parenta847dd8414816158d11e142a002b67596719813c (diff)
downloadsandhi-9e9308df1599bd13e808cacc6b3cea5a5c697df3.tar.gz
sandhi-9e9308df1599bd13e808cacc6b3cea5a5c697df3.tar.bz2
sandhi-9e9308df1599bd13e808cacc6b3cea5a5c697df3.zip
gras: moved query app to top level
Diffstat (limited to 'query/chart_factory.js')
-rw-r--r--query/chart_factory.js281
1 files changed, 281 insertions, 0 deletions
diff --git a/query/chart_factory.js b/query/chart_factory.js
new file mode 100644
index 0000000..8b9656a
--- /dev/null
+++ b/query/chart_factory.js
@@ -0,0 +1,281 @@
+/***********************************************************************
+ * Some constants
+ **********************************************************************/
+var GRAS_CHARTS_STD_WIDTH = 250;
+
+/***********************************************************************
+ * Chart registry for now chart types
+ **********************************************************************/
+var gras_chart_get_registry = function()
+{
+ return [
+ {key:'overhead_compare', name:'Overhead Compare', factory:GrasChartOverheadCompare},
+ {key:'overall_throughput', name:'Overall Throughput', factory:GrasChartOverallThroughput},
+ {key:'handler_breakdown', name:'Handler Breakdown', factory:GrasChartHandlerBreakdown},
+ {key:'port_counters', name:'Port Counters', factory:GrasChartPortCounts},
+ {key:'global_counters', name:'Global Counters', factory:GrasChartGlobalCounts},
+ {key:'port_downtime', name:'Port downtime', factory:GrasChartPortDowntime},
+ ];
+}
+
+/***********************************************************************
+ * get blocks that need active querying
+ **********************************************************************/
+function gras_chart_factory_active_blocks(registry)
+{
+ var block_ids = new Array();
+ $.each(registry.active_charts, function(index, chart_info)
+ {
+ $.merge(block_ids, chart_info.args.block_ids);
+ });
+ return $.unique(block_ids);
+}
+
+/***********************************************************************
+ * update after new query event
+ **********************************************************************/
+function gras_chart_factory_update(registry, point)
+{
+ registry.point = point; //store last data point
+ $.each(registry.active_charts, function(index, chart_info)
+ {
+ chart_info.chart.update(point);
+ });
+}
+
+/***********************************************************************
+ * chart factory input handler
+ **********************************************************************/
+function gras_chart_factory_handle_input(registry)
+{
+ //get a list of the selected blocks
+ var selected_blocks = new Array();
+ $.each($('#chart_designer_blocks input'), function(index, input)
+ {
+ var input = $(input);
+ if (input.is(':checked'))
+ {
+ selected_blocks.push(input.attr('name'));
+ }
+ });
+
+ //get the type of chart to create
+ var chart_type = $('#chart_type_selector').val();
+
+ //create args for the factory make
+ var args = {
+ block_ids:selected_blocks,
+ chart_type:chart_type,
+ };
+
+ //call into the factory with args
+ gras_chart_factory_make(registry, args);
+}
+
+/***********************************************************************
+ * save/load to/from local storage
+ **********************************************************************/
+function gras_chart_save(registry)
+{
+ if (typeof(Storage) === "undefined") return;
+ var all_args = new Array();
+ $.each(registry.active_charts, function(index, info)
+ {
+ all_args.push(info.args);
+ });
+ localStorage.setItem(registry.top_id, JSON.stringify({
+ chart_args: all_args,
+ overall_rate: registry.overall_rate,
+ overall_active: registry.overall_active,
+ }));
+}
+
+function gras_chart_load(registry)
+{
+ if (typeof(Storage) === "undefined") return;
+ var storage = JSON.parse(localStorage.getItem(registry.top_id));
+ if (!storage) return;
+
+ //restore misc settings in storage
+ registry.overall_rate = storage.overall_rate;
+ registry.overall_active = storage.overall_active;
+
+ //rebuild all charts from args
+ $.each(storage.chart_args, function(args_i, args)
+ {
+ //check that the blocks saved in the args actually exist
+ var do_make = true;
+ $.each(args.block_ids, function(block_id_i, block_id)
+ {
+ if ($.inArray(block_id, registry.block_ids) < 0)
+ {
+ do_make = false;
+ }
+ });
+ if (do_make) gras_chart_factory_make(registry, args);
+ });
+}
+
+/***********************************************************************
+ * chart factory make routine
+ **********************************************************************/
+function gras_chart_factory_make(registry, args)
+{
+ //create containers
+ var chart_box = $('<table />').attr({class:'chart_container'});
+ var tr = $('<tr />');
+ var td = $('<td />');
+ tr.append(td);
+
+ //call into the factory
+ try
+ {
+ var chart = new registry.chart_factories[args.chart_type](args, td.get(0));
+ }
+ catch(err)
+ {
+ return;
+ }
+
+ //setup the title
+ var tr_title = $('<tr />');
+ var th_title = $('<th />');
+ tr_title.append(th_title);
+ th_title.text(chart.title);
+
+ //register the chart
+ var chart_info = {chart:chart,args:args,panel:chart_box};
+ registry.active_charts.push(chart_info);
+ $('#charts_panel').append(chart_box);
+
+ //close button
+ var close_div = $('<div/>').attr({class:'chart_designer_block_close'});
+ var close_href = $('<a />').attr({href:'#', class:"ui-dialog-titlebar-close ui-corner-all", role:"button"});
+ var close_span = $('<span />').attr({class:"ui-icon ui-icon-closethick"}).text('close');
+ close_div.append(close_href);
+ close_href.append(close_span);
+ th_title.append(close_div);
+ $(close_href).click(function()
+ {
+ var index = $.inArray(chart_info, registry.active_charts);
+ registry.active_charts.splice(index, 1);
+ chart_box.remove();
+ gras_chart_save(registry);
+ });
+ gras_chart_save(registry);
+
+ //finish gui building
+ chart_box.append(tr_title);
+ chart_box.append(tr);
+
+ //implement draggable and resizable from jquery ui
+ var handle_stop = function(event, ui)
+ {
+ args['width'] = chart_box.width();
+ args['height'] = chart_box.height();
+ args['position'] = chart_box.offset();
+ chart.gc_resize = false;
+ chart.update(registry.point);
+ gras_chart_save(registry);
+ };
+
+ if ('default_width' in chart) chart_box.width(chart.default_width);
+ chart_box.resizable({stop: handle_stop, create: function(event, ui)
+ {
+ if ('width' in args) chart_box.width(args.width);
+ if ('height' in args) chart_box.height(args.height);
+ },
+ start: function(event, ui)
+ {
+ chart.gc_resize = true;
+ chart.update(registry.point);
+ }});
+
+ chart_box.css('position', 'absolute');
+ chart_box.draggable({stop: handle_stop, create: function(event, ui)
+ {
+ if ('position' in args) chart_box.offset(args.position);
+ }, cursor: "move"});
+
+ //set the cursor on the title bar so its obvious
+ tr_title.hover(
+ function(){$(this).css('cursor','move'); close_div.show();},
+ function(){$(this).css('cursor','auto'); close_div.hide();}
+ );
+ close_div.hide();
+}
+
+/***********************************************************************
+ * chart factory init
+ **********************************************************************/
+function gras_chart_factory_init(registry)
+{
+ //init registry containers
+ registry.active_charts = new Array();
+ registry.chart_factories = new Array();
+
+ //install callback for chart factory
+ $('#chart_factory_button').click(function()
+ {
+ gras_chart_factory_handle_input(registry);
+ });
+
+ //init the chart selection input
+ $.each(gras_chart_get_registry(), function(index, options)
+ {
+ registry.chart_factories[options.key] = options.factory;
+ var option = $('<option />').attr({value: options.key});
+ option.text(options.name);
+ $('#chart_type_selector').append(option);
+ });
+
+ //init chart overall gui controls
+ var overall_rate = $('#chart_update_rate').attr({size:3});
+ overall_rate.spinner({
+ min: 1, max: 10, step: 0.5, stop: function(event, ui){$(this).change();}
+ });
+ var overall_active = $('#chart_active_state');
+ overall_active.button();
+
+ //callback for overall gui events
+ function handle_gui_event()
+ {
+ registry.overall_active = overall_active.is(':checked');
+ registry.overall_rate = overall_rate.val();
+ gras_chart_save(registry);
+ }
+ overall_rate.change(handle_gui_event);
+ overall_active.change(handle_gui_event);
+
+ //block registry and checkboxes init
+ $.getJSON('/blocks.json', function(data)
+ {
+ var container = $('#chart_designer_blocks');
+ $.each(data.blocks, function(index, id)
+ {
+ registry.block_ids.push(id);
+ var cb_id = "chart_designer_blocks " + id;
+ var div = $('<div />');
+ var label = $('<label />').text(id).attr({'for':cb_id});
+ var input = $('<input />').attr({
+ type: 'checkbox',
+ name: id,
+ id: cb_id,
+ });
+ input.attr('checked', false);
+ div.append(input);
+ div.append(label);
+ container.append(div);
+ });
+ //container.buttonset();
+
+ //try to load last settings
+ try{gras_chart_load(registry);}catch(e){}
+
+ //init gui elements after settings restore
+ overall_rate.val(registry.overall_rate);
+ overall_active.attr('checked', registry.overall_active);
+ handle_gui_event();
+ gras_query_stats(registry);
+ });
+}