Mercurial > hg > thermostat-ng > web-client
view src/app/shared/services/multichart.service.js @ 245:2eb2ae0f3b3f
Transition project to Angular 4 Hybrid
Reviewed-by: jkang
Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2017-October/025266.html
author | Andrew Azores <aazores@redhat.com> |
---|---|
date | Fri, 13 Oct 2017 14:05:09 -0400 |
parents | cb5eb207b5cc |
children |
line wrap: on
line source
/** * Copyright 2012-2017 Red Hat, Inc. * * Thermostat is distributed under the GNU General Public License, * version 2 or any later version (with a special exception described * below, commonly known as the "Classpath Exception"). * * A copy of GNU General Public License (GPL) is included in this * distribution, in the file COPYING. * * Linking Thermostat code with other modules is making a combined work * based on Thermostat. Thus, the terms and conditions of the GPL * cover the whole combination. * * As a special exception, the copyright holders of Thermostat give you * permission to link this code with independent modules to produce an * executable, regardless of the license terms of these independent * modules, and to copy and distribute the resulting executable under * terms of your choice, provided that you also meet, for each linked * independent module, the terms and conditions of the license of that * module. An independent module is a module which is not derived from * or based on Thermostat code. If you modify Thermostat, you may * extend this exception to your version of the software, but you are * not obligated to do so. If you do not wish to do so, delete this * exception statement from your version. */ import servicesModule from 'shared/services/services.module.js'; import _ from 'lodash'; export class MultichartService { constructor ($q, $translate) { this.q = $q; this.translate = $translate; this.charts = new Map(); } get chartNames () { let res = []; for (let key of this.charts.keys()) { res.push(key); } res.sort(); return res; } countServicesForChart (chartName) { if (!this.charts.has(chartName)) { return 0; } return this.charts.get(chartName).length; } getAxesForChart (chartName) { //TODO: make this more intelligent once we start getting extended info //back from gateway about what metrics are, the units and context. //then we can group similar metrics onto the same axis. if (!this.hasChart(chartName)) { return {}; } let charts = this.charts.get(chartName); let ret = {}; for (let i = 0; i < this.countServicesForChart(chartName); i++) { let axis; if (i === 0) { axis = 'y'; } else { axis = 'y2'; } ret[charts[i].svcName] = axis; } return ret; } getServicesForChart (chartName) { if (!this.hasChart(chartName)) { return []; } let charts = this.charts.get(chartName); let res = []; charts.forEach(chart => res.push(chart.svcName)); return res; } addChart (chartName) { if (this.charts.has(chartName)) { return; } this.charts.set(chartName, new Array()); } hasChart (chartName) { return this.charts.has(chartName); } removeChart (chartName) { if (!this.hasChart(chartName)) { return; } this.charts.delete(chartName); } addService (chartName, svcName, getFn) { if (!this.hasChart(chartName) || this.hasServiceForChart(chartName, svcName)) { return; } let svcs = this.charts.get(chartName); svcs.push({ svcName: svcName, getFn: getFn }); } hasServiceForChart (chartName, svcName) { if (!this.hasChart(chartName)) { return false; } let svcs = this.charts.get(chartName); for (let i = 0; i < svcs.length; i++) { if (svcs[i].svcName === svcName) { return true; } } return false; } removeService (chartName, svcName) { if (!this.hasChart(chartName)) { return; } _.remove(this.charts.get(chartName), svc => svc.svcName === svcName); } getData (chartName) { if (!this.hasChart(chartName)) { return new Promise((resolve, reject) => { this.translate('services.multichart.NO_SUCH_MULTICHART_ERROR', { chartName: chartName }).then(s => reject(new Error(s))); }); } let svcs = this.charts.get(chartName); let promises = []; let res = {}; for (let i = 0; i < svcs.length; i++) { let svc = svcs[i]; let key; if (i === 0) { key = 'yData'; } else { key = 'yData' + i; } res[key] = [svc.svcName]; let promise = svc.getFn(); promises.push(promise); promise.then(data => { res[key].push(data); }); } return new Promise(resolve => { Promise.all(promises).then(() => resolve(res)); }); } rename (from, to) { if (!this.hasChart(from) || this.hasChart(to)) { return; } this.charts.set(to, this.charts.get(from)); this.charts.delete(from); } } export function init () { angular .module(servicesModule) .service('multichartService', MultichartService); }