/** * Home comparison settings. * * @param {number} thermostat_id The thermostat_id this card is displaying * data for. */ beestat.component.card.comparison_settings = function(thermostat_id) { var self = this; this.thermostat_id_ = thermostat_id; /* * If the thermostat changes that means the property_type could change and * thus need to rerender. */ beestat.dispatcher.addEventListener( [ 'cache.thermostat', 'cache.data.metrics' ], function() { self.rerender(); } ); beestat.component.card.apply(this, arguments); }; beestat.extend(beestat.component.card.comparison_settings, beestat.component.card); /** * Decorate * * @param {rocket.Elements} parent */ beestat.component.card.comparison_settings.prototype.decorate_contents_ = function(parent) { var thermostat = beestat.cache.thermostat[this.thermostat_id_]; var row; // Row row = $.createElement('div').addClass('row'); parent.appendChild(row); var column_region = $.createElement('div').addClass([ 'column', 'column_4' ]); row.appendChild(column_region); this.decorate_region_(column_region); var column_property = $.createElement('div').addClass([ 'column', 'column_8' ]); row.appendChild(column_property); this.decorate_property_(column_property); row = $.createElement('div').addClass('row'); parent.appendChild(row); var column_detail = $.createElement('div').addClass([ 'column', 'column_12' ]); row.appendChild(column_detail); this.decorate_detail_(column_detail); const sync_progress = beestat.thermostat.get_sync_progress(this.thermostat_id_); if (sync_progress === null || sync_progress < 100) { this.show_loading_('Fetching'); window.setTimeout(function() { var api = new beestat.api(); api.add_call( 'thermostat', 'read_id', { 'attributes': { 'inactive': 0 } }, 'thermostat' ); api.set_callback(function(response) { beestat.cache.set('thermostat', response); }); api.send(); }, 10000); } else { if (thermostat.profile === null) { this.show_loading_('Fetching'); new beestat.api() .add_call( 'thermostat', 'generate_profile', { 'thermostat_id': this.thermostat_id_ } ) .add_call( 'thermostat', 'read_id', { 'attributes': { 'inactive': 0 } }, 'thermostat' ) .set_callback(function(response) { beestat.cache.set('thermostat', response.thermostat); }) .send(); } else if (beestat.cache.data.metrics === undefined) { this.show_loading_('Fetching'); new beestat.api() .add_call( 'thermostat', 'get_metrics', { 'thermostat_id': this.thermostat_id_, 'attributes': beestat.comparisons.get_attributes() } ) .set_callback(function(response) { beestat.cache.set('data.metrics', response); }) .send(); } } }; /** * Decorate the region options. * * @param {rocket.ELements} parent */ beestat.component.card.comparison_settings.prototype.decorate_region_ = function(parent) { var self = this; (new beestat.component.title('Region')).render(parent); var regions = [ 'nearby', 'global' ]; var current_region = beestat.setting('comparison_region'); var color = beestat.style.color.green.base; var tile_group = new beestat.component.tile_group(); regions.forEach(function(region) { var button = new beestat.component.tile() .set_background_hover_color(color) .set_text_color('#fff') .set_text(region.charAt(0).toUpperCase() + region.slice(1)); if (current_region === region) { button.set_background_color(color); } else { button .set_background_color(beestat.style.color.bluegray.light) .addEventListener('click', function() { // Delete from the cache to trigger the metrics loading screen beestat.cache.delete('data.metrics'); // Update the setting beestat.setting('comparison_region', region); // Rerender real quick to change the selected button self.rerender(); // Open up the loading window. self.show_loading_('Fetching'); new beestat.api() .add_call( 'thermostat', 'get_metrics', { 'thermostat_id': self.thermostat_id_, 'attributes': beestat.comparisons.get_attributes() } ) .set_callback(function(response) { beestat.cache.set('data.metrics', response); }) .send(); }); } tile_group.add_tile(button); }); tile_group.render(parent); }; /** * Decorate the property type options. * * @param {rocket.ELements} parent */ beestat.component.card.comparison_settings.prototype.decorate_property_ = function(parent) { var self = this; var thermostat = beestat.cache.thermostat[this.thermostat_id_]; (new beestat.component.title('Property')).render(parent); var property_types = []; property_types.push({ 'value': 'similar', 'text': 'Very Similar' }); if (thermostat.property.structure_type !== null) { property_types.push({ 'value': 'same_structure', 'text': 'Type: ' + thermostat.property.structure_type.charAt(0).toUpperCase() + thermostat.property.structure_type.slice(1) }); } property_types.push({ 'value': 'all', 'text': 'All' }); var current_property_type = beestat.setting('comparison_property_type'); var color = beestat.style.color.purple.base; var tile_group = new beestat.component.tile_group(); property_types.forEach(function(property_type) { var button = new beestat.component.tile() .set_background_hover_color(color) .set_text_color('#fff') .set_text(property_type.text); if (current_property_type === property_type.value) { button.set_background_color(color); } else { button .set_background_color(beestat.style.color.bluegray.light) .addEventListener('click', function() { // Delete from the cache to trigger the metrics loading screen beestat.cache.delete('data.metrics'); // Update the setting beestat.setting('comparison_property_type', property_type.value); // Rerender real quick to change the selected button self.rerender(); // Open up the loading window. self.show_loading_('Fetching'); new beestat.api() .add_call( 'thermostat', 'get_metrics', { 'thermostat_id': self.thermostat_id_, 'attributes': beestat.comparisons.get_attributes() } ) .set_callback(function(response) { beestat.cache.set('data.metrics', response); }) .send(); }); } tile_group.add_tile(button); }); tile_group.render(parent); }; beestat.component.card.comparison_settings.prototype.decorate_detail_ = function(parent) { var strings = []; strings.push('Matching system type and stages'); var comparison_attributes = beestat.comparisons.get_attributes(); if (comparison_attributes.property_structure_type !== undefined) { strings.push('Property Type: ' + this.get_comparison_string_(comparison_attributes.property_structure_type)); } else { strings.push('Any property type'); } if (comparison_attributes.property_age !== undefined) { strings.push(this.get_comparison_string_(comparison_attributes.property_age, 'years old')); } else { strings.push('Any property age'); } if (comparison_attributes.property_square_feet !== undefined) { strings.push(this.get_comparison_string_(comparison_attributes.property_square_feet, 'ft²')); } else { strings.push('Any square footage'); } if (comparison_attributes.property_stories !== undefined) { strings.push(this.get_comparison_string_(comparison_attributes.property_stories, 'stories')); } else { strings.push('Any number of stories'); } if (comparison_attributes.radius !== undefined) { strings.push('Within ' + comparison_attributes.radius.value + ' miles of your location'); } else { strings.push('Any region'); } (new beestat.component.title('Comparing to homes like...')).render(parent); strings.forEach(function(string) { var div = $.createElement('div'); div.innerText(string); if (string.match('Any') !== null) { div.style({'color': beestat.style.color.gray.base}); } parent.appendChild(div); }); }; /** * Get the title of the card. * * @return {string} The title of the card. */ beestat.component.card.comparison_settings.prototype.get_title_ = function() { return 'Comparison Settings'; }; /** * Decorate the menu. * * @param {rocket.Elements} parent */ beestat.component.card.comparison_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/596040eadd014928830b4d1d54692761'); })); }; /** * Helper function to display various comparison strings in a human-readable * way. * * @param {mixed} comparison_attribute The attribute * @param {string} suffix If a suffix (ex: "years") should be placed on the * end. * * @return {string} The human-readable string. */ beestat.component.card.comparison_settings.prototype.get_comparison_string_ = function(comparison_attribute, suffix) { var s = (suffix !== undefined ? (' ' + suffix) : ''); if (comparison_attribute.operator !== undefined) { if (comparison_attribute.operator === 'between') { return 'Between ' + comparison_attribute.value[0] + ' and ' + comparison_attribute.value[1] + s; } else if (comparison_attribute.operator === '>=') { return 'At least ' + comparison_attribute.value + s; } else if (comparison_attribute.operator === '<=') { return 'Less than or equal than ' + comparison_attribute.value + s; } else if (comparison_attribute.operator === '>') { return 'Greater than ' + comparison_attribute.value + s; } else if (comparison_attribute.operator === '<') { return 'Less than' + comparison_attribute.value + s; } return comparison_attribute.operator + ' ' + comparison_attribute.value + s; } else if (Array.isArray(comparison_attribute.value) === true) { return 'One of ' + comparison_attribute.value.join(', ') + s; } return comparison_attribute + s; };