mirror of
				https://github.com/beestat/app.git
				synced 2025-10-31 01:57:01 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			462 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			462 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * Visualize settings.
 | |
|  */
 | |
| beestat.component.card.visualize_settings = function() {
 | |
|   const self = this;
 | |
|   beestat.dispatcher.addEventListener([
 | |
|     'cache.floor_plan',
 | |
|     'cache.data.three_d__runtime_sensor'
 | |
|   ],
 | |
|   function() {
 | |
|     self.rerender();
 | |
|   });
 | |
| 
 | |
|   beestat.component.card.apply(this, arguments);
 | |
| };
 | |
| beestat.extend(beestat.component.card.visualize_settings, beestat.component.card);
 | |
| 
 | |
| /**
 | |
|  * Decorate
 | |
|  *
 | |
|  * @param {rocket.Elements} parent
 | |
|  */
 | |
| beestat.component.card.visualize_settings.prototype.decorate_contents_ = function(parent) {
 | |
|   const grid = document.createElement('div');
 | |
|   Object.assign(grid.style, {
 | |
|     'display': 'grid',
 | |
|     'grid-template-columns': 'repeat(auto-fit, minmax(min(350px, 100%), 1fr))',
 | |
|     'grid-gap': `${beestat.style.size.gutter}px`,
 | |
|     'margin-bottom': `${beestat.style.size.gutter}px`
 | |
|   });
 | |
|   parent.appendChild(grid);
 | |
| 
 | |
|   const left_container = document.createElement('div');
 | |
|   grid.appendChild(left_container);
 | |
|   const right_container = document.createElement('div');
 | |
|   grid.appendChild(right_container);
 | |
| 
 | |
|   const data_type_container = document.createElement('div');
 | |
|   Object.assign(data_type_container.style, {
 | |
|     'margin-bottom': `${beestat.style.size.gutter}px`
 | |
|   });
 | |
|   this.decorate_data_type_(data_type_container);
 | |
|   left_container.appendChild(data_type_container);
 | |
| 
 | |
|   const heat_map_values_container = document.createElement('div');
 | |
|   this.decorate_heat_map_values_(heat_map_values_container);
 | |
|   left_container.appendChild(heat_map_values_container);
 | |
| 
 | |
|   const time_period_container = document.createElement('div');
 | |
|   this.decorate_time_period_(time_period_container);
 | |
|   right_container.appendChild(time_period_container);
 | |
| 
 | |
|   // If at least one sensor is on the floor plan and the data is loading.
 | |
|   if (
 | |
|     beestat.cache.data.three_d__runtime_sensor === undefined &&
 | |
|     Object.keys(beestat.floor_plan.get_sensor_ids_map(
 | |
|       beestat.setting('visualize.floor_plan_id')
 | |
|     )).length > 0
 | |
|   ) {
 | |
|     this.show_loading_('Fetching');
 | |
|   }
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Decorate the type options.
 | |
|  *
 | |
|  * @param {HTMLDivElement} parent
 | |
|  */
 | |
| beestat.component.card.visualize_settings.prototype.decorate_data_type_ = function(parent) {
 | |
|   const self = this;
 | |
| 
 | |
|   (new beestat.component.title('Data Type')).render($(parent));
 | |
| 
 | |
|   const types = [
 | |
|     {
 | |
|       'code': 'temperature',
 | |
|       'name': 'Temperature',
 | |
|       'icon': 'thermometer'
 | |
|     },
 | |
|     {
 | |
|       'code': 'occupancy',
 | |
|       'name': 'Occupancy',
 | |
|       'icon': 'eye'
 | |
|     }
 | |
|   ];
 | |
| 
 | |
|   const color = beestat.style.color.green.base;
 | |
|   const tile_group = new beestat.component.tile_group();
 | |
|   types.forEach(function(type) {
 | |
|     const tile = new beestat.component.tile()
 | |
|       .set_background_hover_color(color)
 | |
|       .set_text_color('#fff')
 | |
|       .set_icon(type.icon)
 | |
|       .set_text(type.name);
 | |
| 
 | |
|     if (beestat.setting('visualize.data_type') === type.code) {
 | |
|       tile.set_background_color(color);
 | |
|     } else {
 | |
|       tile
 | |
|         .set_background_color(beestat.style.color.bluegray.light)
 | |
|         .addEventListener('click', function() {
 | |
|           beestat.setting('visualize.data_type', type.code);
 | |
|           self.rerender();
 | |
|         });
 | |
|     }
 | |
|     tile_group.add_tile(tile);
 | |
|   });
 | |
| 
 | |
|   tile_group.render($(parent));
 | |
| };
 | |
| /**
 | |
|  * Decorate the type options.
 | |
|  *
 | |
|  * @param {HTMLDivElement} parent
 | |
|  */
 | |
| beestat.component.card.visualize_settings.prototype.decorate_heat_map_values_ = function(parent) {
 | |
|   const self = this;
 | |
| 
 | |
|   (new beestat.component.title('Heat Map Values')).render($(parent));
 | |
| 
 | |
|   const types = [
 | |
|     {
 | |
|       'code': 'dynamic',
 | |
|       'name': 'Dynamic',
 | |
|       'icon': 'arrow_expand_horizontal'
 | |
|     },
 | |
|     {
 | |
|       'code': 'static',
 | |
|       'name': 'Static',
 | |
|       'icon': 'arrow_horizontal_lock'
 | |
|     }
 | |
|   ];
 | |
| 
 | |
|   const container = document.createElement('div');
 | |
|   Object.assign(container.style, {
 | |
|     'display': 'flex',
 | |
|     'flex-wrap': 'wrap',
 | |
|     'grid-gap': `${beestat.style.size.gutter}px`
 | |
|   });
 | |
|   parent.appendChild(container);
 | |
| 
 | |
|   const color = beestat.style.color.orange.base;
 | |
|   const tile_group = new beestat.component.tile_group();
 | |
| 
 | |
|   types.forEach(function(type) {
 | |
|     const tile = new beestat.component.tile()
 | |
|       .set_background_hover_color(color)
 | |
|       .set_text_color('#fff')
 | |
|       .set_icon(type.icon)
 | |
|       .set_text(type.name);
 | |
| 
 | |
|     if (beestat.setting('visualize.heat_map_values') === type.code) {
 | |
|       tile.set_background_color(color);
 | |
|     } else {
 | |
|       tile
 | |
|         .set_background_color(beestat.style.color.bluegray.light)
 | |
|         .addEventListener('click', function() {
 | |
|           beestat.setting('visualize.heat_map_values', type.code);
 | |
|           self.rerender();
 | |
|         });
 | |
|     }
 | |
|     tile_group.add_tile(tile);
 | |
|   });
 | |
|   tile_group.render($(container));
 | |
| 
 | |
|   if (beestat.setting('visualize.heat_map_values') === 'static') {
 | |
|     const min_max_container = document.createElement('div');
 | |
|     container.appendChild(min_max_container);
 | |
| 
 | |
|     let type;
 | |
|     let inputmode;
 | |
|     if (beestat.setting('visualize.data_type') === 'temperature') {
 | |
|       type = 'decimal';
 | |
|       inputmode = 'decimal';
 | |
|     } else {
 | |
|       type = 'integer';
 | |
|       inputmode = 'numeric';
 | |
|     }
 | |
| 
 | |
|     const min = new beestat.component.input.text()
 | |
|       .set_maxlength('5')
 | |
|       .set_inputmode(inputmode)
 | |
|       .set_requirements({
 | |
|         'type': type,
 | |
|         'required': true
 | |
|       })
 | |
|       .set_transform({
 | |
|         'type': 'round',
 | |
|         'decimals': 1
 | |
|       })
 | |
|       .set_value(
 | |
|         beestat.temperature(beestat.setting(
 | |
|           'visualize.heat_map_static.' + beestat.setting('visualize.data_type') + '.min'
 | |
|         ))
 | |
|       )
 | |
|       .set_width(50);
 | |
|     min.addEventListener('change', function() {
 | |
|       if (min.meets_requirements() === true) {
 | |
|         beestat.setting(
 | |
|           'visualize.heat_map_static.' + beestat.setting('visualize.data_type') + '.min',
 | |
|           beestat.temperature({
 | |
|             'temperature': min.get_value(),
 | |
|             'input_temperature_unit': beestat.setting('units.temperature'),
 | |
|             'output_temperature_unit': '°F'
 | |
|           })
 | |
|         );
 | |
|       } else {
 | |
|         min.set_value(
 | |
|           beestat.temperature(beestat.setting(
 | |
|             'visualize.heat_map_static.' + beestat.setting('visualize.data_type') + '.min'
 | |
|           )),
 | |
|           false
 | |
|         );
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     const max = new beestat.component.input.text()
 | |
|       .set_maxlength('5')
 | |
|       .set_inputmode(inputmode)
 | |
|       .set_requirements({
 | |
|         'type': type,
 | |
|         'required': true
 | |
|       })
 | |
|       .set_value(
 | |
|         beestat.temperature(beestat.setting(
 | |
|           'visualize.heat_map_static.' + beestat.setting('visualize.data_type') + '.max'
 | |
|         )),
 | |
|         false
 | |
|       )
 | |
|       .set_width(50);
 | |
|     max.addEventListener('change', function() {
 | |
|       if (max.meets_requirements() === true) {
 | |
|         // Round to one decimal.
 | |
|         const value = Math.round(max.get_value() * 10) / 10;
 | |
|         max.set_value(value, false);
 | |
| 
 | |
|         beestat.setting(
 | |
|           'visualize.heat_map_static.' + beestat.setting('visualize.data_type') + '.max',
 | |
|           beestat.temperature({
 | |
|             'temperature': max.get_value(),
 | |
|             'input_temperature_unit': beestat.setting('units.temperature'),
 | |
|             'output_temperature_unit': '°F'
 | |
|           })
 | |
|         );
 | |
|       } else {
 | |
|         max.set_value(
 | |
|           beestat.temperature(beestat.setting(
 | |
|             'visualize.heat_map_static.' + beestat.setting('visualize.data_type') + '.max'
 | |
|           )),
 | |
|           false
 | |
|         );
 | |
|       }
 | |
|     });
 | |
| 
 | |
|     let span;
 | |
| 
 | |
|     span = document.createElement('span');
 | |
|     span.style.display = 'inline-block';
 | |
|     min.render($(span));
 | |
|     min_max_container.appendChild(span);
 | |
| 
 | |
|     span = document.createElement('span');
 | |
|     span.innerText = 'to';
 | |
|     Object.assign(span.style, {
 | |
|       'display': 'inline-block',
 | |
|       'margin-left': `${beestat.style.size.gutter}px`,
 | |
|       'margin-right': `${beestat.style.size.gutter}px`
 | |
|     });
 | |
|     min_max_container.appendChild(span);
 | |
| 
 | |
|     span = document.createElement('span');
 | |
|     span.style.display = 'inline-block';
 | |
|     max.render($(span));
 | |
|     min_max_container.appendChild(span);
 | |
| 
 | |
|     span = document.createElement('span');
 | |
|     switch (beestat.setting('visualize.data_type')) {
 | |
|     case 'temperature':
 | |
|       span.innerText = beestat.setting('units.temperature');
 | |
|       break;
 | |
|     case 'occupancy':
 | |
|       span.innerText = '%';
 | |
|       break;
 | |
|     }
 | |
| 
 | |
|     Object.assign(span.style, {
 | |
|       'display': 'inline-block',
 | |
|       'margin-left': `${beestat.style.size.gutter}px`
 | |
|     });
 | |
|     min_max_container.appendChild(span);
 | |
|   }
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Decorate the type options.
 | |
|  *
 | |
|  * @param {HTMLDivElement} parent
 | |
|  */
 | |
| beestat.component.card.visualize_settings.prototype.decorate_time_period_ = function(parent) {
 | |
|   const self = this;
 | |
| 
 | |
|   (new beestat.component.title('Time Period')).render($(parent));
 | |
| 
 | |
|   const color = beestat.style.color.purple.base;
 | |
| 
 | |
|   const tile_group_dynamic = new beestat.component.tile_group();
 | |
| 
 | |
|   // Current Day
 | |
|   const current_day_tile = new beestat.component.tile()
 | |
|     .set_background_hover_color(color)
 | |
|     .set_text_color('#fff')
 | |
|     .set_icon('calendar')
 | |
|     .set_text('Today');
 | |
| 
 | |
|   if (
 | |
|     beestat.setting('visualize.range_type') === 'dynamic' &&
 | |
|     beestat.setting('visualize.range_dynamic') === 0
 | |
|   ) {
 | |
|     current_day_tile.set_background_color(color);
 | |
|   } else {
 | |
|     current_day_tile
 | |
|       .set_background_color(beestat.style.color.bluegray.light)
 | |
|       .addEventListener('click', function() {
 | |
|         beestat.setting({
 | |
|           'visualize.range_type': 'dynamic',
 | |
|           'visualize.range_dynamic': 0
 | |
|         });
 | |
|         beestat.cache.delete('data.three_d__runtime_sensor');
 | |
|         self.rerender();
 | |
|       });
 | |
|   }
 | |
|   tile_group_dynamic.add_tile(current_day_tile);
 | |
| 
 | |
|   // Yesterday
 | |
|   const yesterday_tile = new beestat.component.tile()
 | |
|     .set_background_hover_color(color)
 | |
|     .set_text_color('#fff')
 | |
|     .set_icon('calendar')
 | |
|     .set_text('Yesterday');
 | |
| 
 | |
|   if (
 | |
|     beestat.setting('visualize.range_type') === 'dynamic' &&
 | |
|     beestat.setting('visualize.range_dynamic') === 1
 | |
|   ) {
 | |
|     yesterday_tile.set_background_color(color);
 | |
|   } else {
 | |
|     yesterday_tile
 | |
|       .set_background_color(beestat.style.color.bluegray.light)
 | |
|       .addEventListener('click', function() {
 | |
|         beestat.setting({
 | |
|           'visualize.range_type': 'dynamic',
 | |
|           'visualize.range_dynamic': 1
 | |
|         });
 | |
|         beestat.cache.delete('data.three_d__runtime_sensor');
 | |
|         self.rerender();
 | |
|       });
 | |
|   }
 | |
|   tile_group_dynamic.add_tile(yesterday_tile);
 | |
| 
 | |
|   // Current Week
 | |
|   const week_tile = new beestat.component.tile()
 | |
|     .set_background_hover_color(color)
 | |
|     .set_text_color('#fff')
 | |
|     .set_icon('calendar_week')
 | |
|     .set_text('7 Day Average');
 | |
| 
 | |
|   if (
 | |
|     beestat.setting('visualize.range_type') === 'dynamic' &&
 | |
|     beestat.setting('visualize.range_dynamic') === 7
 | |
|   ) {
 | |
|     week_tile.set_background_color(color);
 | |
|   } else {
 | |
|     week_tile
 | |
|       .set_background_color(beestat.style.color.bluegray.light)
 | |
|       .addEventListener('click', function() {
 | |
|         beestat.setting({
 | |
|           'visualize.range_type': 'dynamic',
 | |
|           'visualize.range_dynamic': 7
 | |
|         });
 | |
|         beestat.cache.delete('data.three_d__runtime_sensor');
 | |
|         self.rerender();
 | |
|       });
 | |
|   }
 | |
|   tile_group_dynamic.add_tile(week_tile);
 | |
| 
 | |
|   // Custom
 | |
|   const tile_group_static = new beestat.component.tile_group();
 | |
|   const custom_tile = new beestat.component.tile()
 | |
|     .set_background_hover_color(color)
 | |
|     .set_text_color('#fff')
 | |
|     .set_icon('calendar_edit')
 | |
|     .set_text('Custom');
 | |
| 
 | |
|   custom_tile
 | |
|     .addEventListener('click', function() {
 | |
|       new beestat.component.modal.visualize_custom().render();
 | |
|     });
 | |
| 
 | |
|   if (beestat.setting('visualize.range_type') === 'static') {
 | |
|     custom_tile.set_background_color(color);
 | |
|   } else {
 | |
|     custom_tile.set_background_color(beestat.style.color.bluegray.light);
 | |
|   }
 | |
|   tile_group_static.add_tile(custom_tile);
 | |
| 
 | |
|   // Static range
 | |
|   if (beestat.setting('visualize.range_type') === 'static') {
 | |
|     const static_range_tile = new beestat.component.tile()
 | |
|       .set_shadow(false)
 | |
|       .set_text(
 | |
|         beestat.date(beestat.setting('visualize.range_static.begin')) +
 | |
|         ' to ' +
 | |
|         beestat.date(beestat.setting('visualize.range_static.end'))
 | |
|       );
 | |
|     tile_group_static.add_tile(static_range_tile);
 | |
| 
 | |
|     const static_range_edit_tile = new beestat.component.tile()
 | |
|       .set_background_color(beestat.style.color.bluegray.light)
 | |
|       .set_background_hover_color(color)
 | |
|       .set_text_color('#fff')
 | |
|       .set_icon('pencil');
 | |
|     static_range_edit_tile
 | |
|       .addEventListener('click', function() {
 | |
|         new beestat.component.modal.visualize_custom().render();
 | |
|       });
 | |
|     tile_group_static.add_tile(static_range_edit_tile);
 | |
|   }
 | |
| 
 | |
|   tile_group_dynamic
 | |
|     .style({
 | |
|       'margin-bottom': `${beestat.style.size.gutter}px`
 | |
|     })
 | |
|     .render($(parent));
 | |
|   tile_group_static.render($(parent));
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Get the title of the card.
 | |
|  *
 | |
|  * @return {string} The title of the card.
 | |
|  */
 | |
| beestat.component.card.visualize_settings.prototype.get_title_ = function() {
 | |
|   return 'Visualize Settings';
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * Decorate the menu.
 | |
|  *
 | |
|  * @param {rocket.Elements} parent
 | |
|  */
 | |
| beestat.component.card.visualize_settings.prototype.decorate_top_right_ = function(parent) {
 | |
|   var menu = (new beestat.component.menu()).render(parent);
 | |
| 
 | |
|   menu.add_menu_item(new beestat.component.menu_item()
 | |
|     .set_text('Help')
 | |
|     .set_icon('help_circle')
 | |
|     .set_callback(function() {
 | |
|       window.open('https://doc.beestat.io/24f548ddd7fc464d846e113470f80c35');
 | |
|     }));
 | |
| };
 | |
| 
 |