mirror of
				https://github.com/beestat/app.git
				synced 2025-10-31 10:07:01 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			160 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			160 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * Runtime sensor detail occupancy chart.
 | |
|  *
 | |
|  * @param {object} data The chart data.
 | |
|  */
 | |
| beestat.component.chart.runtime_sensor_detail_occupancy = function(data) {
 | |
|   this.data_ = data;
 | |
| 
 | |
|   beestat.component.chart.apply(this, arguments);
 | |
| };
 | |
| beestat.extend(beestat.component.chart.runtime_sensor_detail_occupancy, beestat.component.chart);
 | |
| 
 | |
| /**
 | |
|  * Override for get_options_xAxis_labels_formatter_.
 | |
|  *
 | |
|  * @return {Function} xAxis labels formatter.
 | |
|  */
 | |
| beestat.component.chart.runtime_sensor_detail_occupancy.prototype.get_options_xAxis_labels_formatter_ = function() {
 | |
|   return function() {
 | |
|     return null;
 | |
|   };
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Override for get_options_series_.
 | |
|  *
 | |
|  * @return {Array} All of the series to display on the chart.
 | |
|  */
 | |
| beestat.component.chart.runtime_sensor_detail_occupancy.prototype.get_options_series_ = function() {
 | |
|   var self = this;
 | |
|   var series = [];
 | |
| 
 | |
|   /**
 | |
|    * This chart does not need the entire dummy series, but it does need the
 | |
|    * first series to have *some* non-null data or Highcharts does not find a
 | |
|    * valid point to reference when trying to sync the crosshair between
 | |
|    * series. The easiest way to fix that seems to be throwing a mostly-empty
 | |
|    * series up top.
 | |
|    */
 | |
|   series.push({
 | |
|     'name': '',
 | |
|     'data': [0],
 | |
|     'yAxis': 0,
 | |
|     'type': 'line',
 | |
|     'lineWidth': 0
 | |
|   });
 | |
| 
 | |
|   // Sensors
 | |
|   this.data_.metadata.sensors.forEach(function(sensor, i) {
 | |
|     series.push({
 | |
|       'name': 'occupancy_' + sensor.sensor_id,
 | |
|       'data': self.data_.series['occupancy_' + sensor.sensor_id],
 | |
|       'color': self.data_.metadata.series['occupancy_' + sensor.sensor_id].color,
 | |
|       'yAxis': 0,
 | |
|       'type': 'line',
 | |
|       'lineWidth': beestat.component.chart.runtime_sensor_detail_occupancy.get_swimlane_properties(self.data_.metadata.sensors.length, 1).line_width,
 | |
|       'linecap': 'square',
 | |
|       'className': 'crisp_edges'
 | |
|     });
 | |
|   });
 | |
| 
 | |
|   return series;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Override for get_options_yAxis_.
 | |
|  *
 | |
|  * @return {Array} The y-axis options.
 | |
|  */
 | |
| beestat.component.chart.runtime_sensor_detail_occupancy.prototype.get_options_yAxis_ = function() {
 | |
|   return [
 | |
|     {
 | |
|       'min': 0,
 | |
|       'max': 50,
 | |
| 
 | |
|       // Keeps the chart from ending on a multiple of whatever the tick interval gets set to.
 | |
|       'endOnTick': false,
 | |
| 
 | |
|       'reversed': true,
 | |
|       'gridLineWidth': 0,
 | |
|       'title': {'text': null},
 | |
|       'labels': {'enabled': false},
 | |
|       'plotBands': [
 | |
|         {
 | |
|           'zIndex': 2,
 | |
|           'color': beestat.style.color.bluegray.dark,
 | |
|           'from': 0,
 | |
|           'to': 50
 | |
|         }
 | |
|       ]
 | |
|     }
 | |
|   ];
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Get properties of swimlane series.
 | |
|  *
 | |
|  * @param {number} count The number of swimlanes present.
 | |
|  * @param {number} i Which swimlane this is.
 | |
|  *
 | |
|  * @return {Object} The swimlane line width and y position.
 | |
|  */
 | |
| beestat.component.chart.runtime_sensor_detail_occupancy.get_swimlane_properties = function(count, i) {
 | |
|   // Available height for all swimlanes
 | |
|   var height = 50;
 | |
| 
 | |
|   // Some sensible max height if you have very few sensors.
 | |
|   var max_line_width = 16;
 | |
| 
 | |
|   // Spacing. This is arbitrary...spacing decreases to 0 after you hit 15 sensors.
 | |
|   var spacing = Math.floor(15 / count);
 | |
|   spacing = Math.min(spacing, 4);
 | |
| 
 | |
|   // Base line width is a percentage height of the container.
 | |
|   var line_width = Math.floor(height / count);
 | |
| 
 | |
|   // Cap to a max line width.
 | |
|   line_width = Math.min(line_width, max_line_width);
 | |
| 
 | |
|   // Set y, then shift it up slightly because the width expands out from the center.
 | |
|   var y = (line_width * i);
 | |
|   y += Math.round((line_width / 2));
 | |
| 
 | |
|   // Make the lines slightly less tall to create space between them.
 | |
|   line_width -= spacing;
 | |
| 
 | |
|   return {
 | |
|     'line_width': line_width,
 | |
|     'y': y
 | |
|   };
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Get the height of the chart. For really precise charts, make sure to
 | |
|  * include relevant spacing.
 | |
|  *
 | |
|  * @return {number} The height of the chart.
 | |
|  */
 | |
| beestat.component.chart.runtime_sensor_detail_occupancy.prototype.get_options_chart_height_ = function() {
 | |
|   return 50 + this.get_options_chart_spacing_()[0] + this.get_options_chart_spacing_()[2];
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Get the legend enabled options.
 | |
|  *
 | |
|  * @return {Function} The legend enabled options.
 | |
|  */
 | |
| beestat.component.chart.runtime_sensor_detail_occupancy.prototype.get_options_legend_enabled_ = function() {
 | |
|   return false;
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Get the left margin for the chart.
 | |
|  *
 | |
|  * @return {number} The left margin for the chart.
 | |
|  */
 | |
| beestat.component.chart.runtime_sensor_detail_occupancy.prototype.get_options_chart_marginLeft_ = function() {
 | |
|   return 45;
 | |
| };
 |