Generalize store quering functions

This commit is contained in:
Zaid Abdulla committed 2018-12-26 00:22:07 -08:00
1 parent 93c6a4dfcd
commit 9b827c5f5e
26 files changed
+1362 -321

No files matched your search

+21 -70
View File
@@ -1,93 +1,44 @@
"use strict";
import m from "mithril";
import config from "./config";
import * as config from "./config";
import * as store from "./store";
import pieChartComponent from "./pie-chart-component";
import * as filterParser from "../common/filter-parser";
function count(filter, limit) {
return new Promise((resolve, reject) => {
function extract(xhr) {
return +xhr.getResponseHeader("x-total-count");
}
m
.request({
method: "HEAD",
url:
"/api/devices/?" +
m.buildQueryString({ filter: filter, limit: limit }),
extract: extract
})
.then(res => {
resolve(res);
})
.catch(err => {
err.message = err.message || "Unknown error";
reject(err);
});
});
}
const GROUPS = config.get("ui.overview.groups");
const CHARTS = {};
for (let group of Object.values(GROUPS))
for (let chartName of Object.values(group["charts"]))
CHARTS[chartName] = config.get("ui.overview.charts")[chartName];
function queryCharts(groups) {
const now = Date.now();
function evalNow(exp) {
if (exp[0] == "FUNC" && exp[1] === "NOW" && exp.length == 2) return now;
}
let calls = [];
groups = Object.assign({}, groups);
for (let [groupName, group] of Object.entries(groups)) {
groups[groupName] = group = Object.assign({}, group);
for (let [chartName, chart] of Object.entries(group.charts)) {
group.charts[chartName] = chart = Object.assign({}, chart);
for (let [sliceName, slice] of Object.entries(chart.slices)) {
chart.slices[sliceName] = slice = Object.assign({}, slice);
calls.push(
new Promise((resolve, reject) => {
let f = filterParser.map(filterParser.parse(slice.filter), evalNow);
count(filterParser.stringify(f))
.then(c => {
slice.count = c;
resolve();
})
.catch(reject);
})
);
}
function queryCharts(charts) {
charts = Object.assign({}, charts);
for (let [chartName, chart] of Object.entries(charts)) {
charts[chartName] = chart = Object.assign({}, chart);
for (let [sliceName, slice] of Object.entries(chart.slices)) {
chart.slices[sliceName] = slice = Object.assign({}, slice);
slice.count = store.count("devices", slice.filter);
}
}
return new Promise((resolve, reject) => {
Promise.all(calls)
.then(() => {
resolve(groups);
})
.catch(reject);
});
return charts;
}
const init = function() {
return new Promise((resolve, reject) => {
queryCharts(config.overview)
.then(charts => {
resolve({ charts: charts });
})
.catch(err => {
err.message = err.message || "Unknown error";
reject(err);
});
return new Promise(resolve => {
resolve({ charts: queryCharts(CHARTS) });
});
};
const component = {
view: vnode => {
view: () => {
document.title = "Overview - GenieACS";
let children = [];
for (let group of Object.values(vnode.attrs.charts)) {
for (let group of Object.values(GROUPS)) {
if (group.label) children.push(m("h1", group.label));
let groupChildren = [];
for (let chart of Object.values(group.charts)) {
for (let chartName of Object.values(group.charts)) {
const chart = CHARTS[chartName];
let chartChildren = [];
if (chart.label) chartChildren.push(m("h2", chart.label));