From 88a84788a5775cc18073b5a9be792f92afe0ad33 Mon Sep 17 00:00:00 2001 From: Zaid Abdulla Date: Sun, 24 Oct 2021 18:17:03 -0700 Subject: [PATCH] Evaluate component attrs before use --- ui/components/all-parameters.ts | 3 ++- ui/components/device-link.ts | 10 +++++++--- ui/components/overview-dot.ts | 7 ++++--- ui/components/parameter-list.ts | 4 +++- ui/components/parameter-table.ts | 13 +++++++------ ui/components/parameter.ts | 2 +- ui/components/tags.ts | 3 ++- 7 files changed, 26 insertions(+), 16 deletions(-) diff --git a/ui/components/all-parameters.ts b/ui/components/all-parameters.ts index f1eb2c1..ac3a8a7 100644 --- a/ui/components/all-parameters.ts +++ b/ui/components/all-parameters.ts @@ -23,6 +23,7 @@ import * as taskQueue from "../task-queue"; import { parse } from "../../lib/common/expression-parser"; import memoize from "../../lib/common/memoize"; import { getIcon } from "../icons"; +import { evaluateExpression } from "../store"; const memoizedParse = memoize(parse); @@ -55,7 +56,7 @@ const component: ClosureComponent = (): Component => { view: (vnode) => { const device = vnode.attrs["device"]; - const limit = vnode.attrs["limit"] > 0 ? vnode.attrs["limit"] : 100; + const limit = evaluateExpression(vnode.attrs["limit"], device) || 100; const search = m("input", { type: "text", diff --git a/ui/components/device-link.ts b/ui/components/device-link.ts index 991bd9c..d06a92d 100644 --- a/ui/components/device-link.ts +++ b/ui/components/device-link.ts @@ -19,18 +19,22 @@ import { ClosureComponent, Component } from "mithril"; import { m } from "../components"; +import { evaluateExpression } from "../store"; const component: ClosureComponent = (): Component => { return { view: (vnode) => { let deviceId; - if (vnode.attrs["device"]) - deviceId = vnode.attrs["device"]["DeviceID.ID"].value[0]; + const device = vnode.attrs["device"]; + if (device) deviceId = device["DeviceID.ID"].value[0]; const children = Object.values(vnode.attrs["components"]).map((c) => { + if (Array.isArray(c)) c = evaluateExpression(c, device || {}); if (typeof c !== "object") return `${c}`; + const type = evaluateExpression(c["type"], device || {}); + if (!type) return null; const attrs = Object.assign({}, vnode.attrs, c); - return m(attrs["type"], attrs); + return m(type as string, attrs); }); if (deviceId) { return m( diff --git a/ui/components/overview-dot.ts b/ui/components/overview-dot.ts index a525c6b..46f47ac 100644 --- a/ui/components/overview-dot.ts +++ b/ui/components/overview-dot.ts @@ -20,7 +20,7 @@ import { ClosureComponent, Component } from "mithril"; import { m } from "../components"; import config from "../config"; -import * as store from "../store"; +import { evaluateExpression } from "../store"; const CHARTS = config.ui.overview.charts; @@ -28,11 +28,12 @@ const component: ClosureComponent = (): Component => { return { view: (vnode) => { const device = vnode.attrs["device"]; - const chart = CHARTS[vnode.attrs["chart"]] as Record; + const chartName = evaluateExpression(vnode.attrs["chart"], device || {}); + const chart = CHARTS[chartName as string] as Record; if (!chart) return null; for (const slice of Object.values(chart.slices)) { const filter = slice["filter"]; - if (store.evaluateExpression(filter, device)) { + if (evaluateExpression(filter, device || {})) { const dot = m( "svg", { diff --git a/ui/components/parameter-list.ts b/ui/components/parameter-list.ts index 8e2fa42..5ba3118 100644 --- a/ui/components/parameter-list.ts +++ b/ui/components/parameter-list.ts @@ -19,6 +19,7 @@ import { ClosureComponent, Component, VnodeDOM } from "mithril"; import { m } from "../components"; +import { evaluateExpression } from "../store"; const component: ClosureComponent = (): Component => { return { @@ -26,12 +27,13 @@ const component: ClosureComponent = (): Component => { const device = vnode.attrs["device"]; const rows = Object.values(vnode.attrs["parameters"]).map((parameter) => { + const type = evaluateExpression(parameter["type"], device); const p = m.context( { device: device, parameter: parameter["parameter"], }, - parameter["type"] || "parameter", + (type as string) || "parameter", parameter ); diff --git a/ui/components/parameter-table.ts b/ui/components/parameter-table.ts index 3d3baea..42644f1 100644 --- a/ui/components/parameter-table.ts +++ b/ui/components/parameter-table.ts @@ -20,7 +20,7 @@ import { ClosureComponent, Component } from "mithril"; import { m } from "../components"; import * as taskQueue from "../task-queue"; -import * as store from "../store"; +import { evaluateExpression } from "../store"; import * as expressionParser from "../../lib/common/expression-parser"; import { getIcon } from "../icons"; @@ -35,7 +35,7 @@ const component: ClosureComponent = (): Component => { }, view: (vnode) => { const device = vnode.attrs["device"]; - const object = store.evaluateExpression(vnode.state["object"], device); + const object = evaluateExpression(vnode.state["object"], device); const parameters = vnode.state["parameters"]; if (typeof object !== "string" || !device[object]) return null; @@ -56,8 +56,7 @@ const component: ClosureComponent = (): Component => { const rows = []; for (const i of instances) { - let filter = - vnode.attrs["filter"] != null ? vnode.attrs["filter"] : true; + let filter = "filter" in vnode.attrs ? vnode.attrs["filter"] : true; filter = expressionParser.map(filter, (e) => { if (Array.isArray(e) && e[0] === "PARAM") @@ -65,7 +64,7 @@ const component: ClosureComponent = (): Component => { return e; }); - if (!store.evaluateExpression(filter, device)) continue; + if (!evaluateExpression(filter, device)) continue; const row = parameters.map((p) => { const param = expressionParser.map(p.parameter, (e) => { @@ -147,7 +146,9 @@ const component: ClosureComponent = (): Component => { } let label; - if (vnode.attrs["label"]) label = m("h2", vnode.attrs["label"]); + + const l = evaluateExpression(vnode.attrs["label"], device); + if (l != null) label = m("h2", l); return [ label, diff --git a/ui/components/parameter.ts b/ui/components/parameter.ts index a15dead..1c6cb1c 100644 --- a/ui/components/parameter.ts +++ b/ui/components/parameter.ts @@ -77,7 +77,7 @@ const component: ClosureComponent = (): Component => { const { value, timestamp, parameter } = evaluateParam( vnode.attrs["parameter"], - vnode.attrs["device"], + device, store.getTimestamp() + store.getClockSkew() ); diff --git a/ui/components/tags.ts b/ui/components/tags.ts index e53ba26..113225c 100644 --- a/ui/components/tags.ts +++ b/ui/components/tags.ts @@ -29,7 +29,8 @@ const component: ClosureComponent = (): Component => { view: (vnode) => { const device = vnode.attrs["device"]; let writable = true; - if (vnode.attrs["writable"] != null) writable = vnode.attrs["writable"]; + if ("writable" in vnode.attrs) + writable = !!store.evaluateExpression(vnode.attrs["writable"], device); const tags = []; for (const p of Object.keys(device))