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

+42 -73
View File
@@ -2,78 +2,50 @@
import m from "mithril";
import config from "./config";
import * as config from "./config";
import filterComponent from "./filter-component";
import * as filterParser from "../common/filter-parser";
function load(filter, limit) {
return new Promise((resolve, reject) => {
m
.request({
url: "/api/devices/",
data: { filter: filter, limit: limit }
})
.then(res => {
resolve(res);
})
.catch(err => {
err.message = err.message || "Unknown error";
reject(err);
});
});
}
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);
});
});
}
import Filter from "../common/filter";
import * as store from "./store";
import * as components from "./components";
function init(args) {
return new Promise((resolve, reject) => {
let filter;
if (args.filter) filter = filterParser.parse(args.filter);
Promise.all([count(args.filter), load(args.filter, config.pageSize)])
.then(res => {
resolve({ filter: filter, total: res[0], devices: res[1] });
})
.catch(reject);
return new Promise(resolve => {
let filter = new Filter(args.filter);
resolve({ filter: filter });
});
}
function renderTable(devices, parameters, total, showMoreCallback) {
let labels = [];
for (let param of parameters) labels.push(m("th", param.label));
labels.push(m("th"));
let rows = [];
for (let device of devices)
rows.push(
m(
"tr",
parameters.map(p => {
if (!device[p.parameter] || !device[p.parameter].value)
return m("td.na");
if (!device[p.parameter].value[0] === "") return m("td.blank");
return m("td", device[p.parameter].value[0]);
})
parameters
.map(p => {
const attrs = Object.assign({ device: device }, p);
const comp = m(components.get("parameter"), attrs);
return m("td", comp);
})
.concat(
m(
"td.table-row-links",
m(
"a",
{
href: `#!/devices/${encodeURIComponent(
device["DeviceID.ID"].value[0]
)}`
},
"Show"
)
)
)
)
);
@@ -84,7 +56,7 @@ function renderTable(devices, parameters, total, showMoreCallback) {
let tfoot = m(
"tfoot",
m("tr", m("td", { colspan: labels.length }, footerElements))
m("tr", m("td", { colspan: labels.length + 1 }, footerElements))
);
return m("table.table", [
@@ -99,18 +71,8 @@ const component = {
document.title = "Devices - GenieACS";
function showMore() {
const lastDevice = vnode.attrs.devices[vnode.attrs.devices.length - 1];
let f = filterParser.and(vnode.attrs.filter, [
">",
"DeviceID.ID",
lastDevice["DeviceID.ID"].value[0]
]);
load(filterParser.stringify(f), config.pageSize).then(res => {
vnode.attrs.devices = vnode.attrs.devices.concat(res);
if (res.length < config.pageSize)
vnode.attrs.total = vnode.attrs.devices.length;
});
vnode.state.showCount = (vnode.state.showCount || 10) + 10;
m.redraw();
}
function onFilterChanged(filter) {
@@ -119,16 +81,23 @@ const component = {
m.route.set("/devices", params);
}
let devs = store.fetch(
"devices",
vnode.attrs.filter,
vnode.state.showCount || 10
);
let count = store.count("devices", vnode.attrs.filter);
return [
m("h1", "Listing devices"),
m(filterComponent, {
filter: vnode.attrs.filter,
filter: vnode.attrs.filter ? vnode.attrs.filter.ast : null,
onChange: onFilterChanged
}),
renderTable(
vnode.attrs.devices,
config.index,
vnode.attrs.total,
devs.value,
Object.values(config.get("ui.index")),
count.value,
showMore
)
];