pareto-anywhere
Version:
Open source IoT middleware suite that makes the data from just about anything usable. We believe in an open Internet of Things.
160 lines (129 loc) • 4.6 kB
JavaScript
/**
* Copyright reelyActive 2021-2026
* We believe in an open Internet of Things
*/
let cuttlefishStatid = (function() {
// Standard data properties (property: {icon, suffix}) in alphabetical order
const STANDARD_DATA_PROPERTIES = {
appearance: { icon: "fas fa-eye" },
deviceIds: { icon: "fas fa-barcode", transform: "idList" },
deviceType: { icon: "fas fa-info-circle" },
firmwareVersion: { icon: "fas fa-info", transform: "firmwareVersion" },
hardwareVersion: { icon: "fas fa-info", transform: "hardwareVersion" },
languages: { icon: "fas fa-language", transform: "stringArray" },
name: { icon: "fas fa-id-card" },
uri: { icon: "fas fa-link", transform: "uri" },
uuids: { icon: "fas fa-barcode", transform: "idList" },
version: { icon: "fas fa-info", transform: "version" }
};
// Render a statid
function render(statid, target, options) {
let tbody = createElement('tbody');
let table = createElement('table', 'table', tbody);
for(const property in statid) {
let tr = renderAsRow(property, statid[property]);
if(tr) {
tbody.appendChild(tr);
}
}
if(target) {
target.replaceChildren(table);
}
return table;
}
// Render a table row
function renderAsRow(property, data) {
let isKnownProperty = STANDARD_DATA_PROPERTIES.hasOwnProperty(property);
if(isKnownProperty) {
let dataRender = STANDARD_DATA_PROPERTIES[property];
let content = renderAsTransform(dataRender.transform, data,
dataRender.suffix);
let icon = createElement('i', dataRender.icon);
let th = createElement('th', 'text-center', icon);
let td = createElement('td', 'align-middle', content);
let tr = createElement('tr', null, [ th, td ]);
return tr;
}
return null; // TODO: handle unknown property
}
// Render property as per given transform
function renderAsTransform(transform, data, suffix) {
suffix = suffix || '';
switch(transform) {
case 'uri':
return renderUri(data);
case 'idList':
return renderListGroupArray(data);
case 'stringArray':
return renderStringArray(data);
case 'firmwareVersion':
return renderVersion(data, 'FW v');
case 'hardwareVersion':
return renderVersion(data, 'HW v');
case 'version':
return renderVersion(data, 'v');
default:
return data.toString() + suffix;
}
}
// Render a URI
function renderUri(data) {
let a = createElement('a', 'text-truncate', data);
a.setAttribute('href', data);
a.setAttribute('target', '_blank');
return a;
}
// Render an identifier array in list group format
function renderListGroupArray(data) {
if(data.length === 1) {
return createElement('span', 'font-monospace', data[0].toString());
}
let items = [];
data.forEach(function(entry) {
items.push(createElement('li', 'list-group-item font-monospace', entry));
});
return createElement('ul', 'list-group list-group-flush', items);
}
// Render an array of strings
function renderStringArray(elements) {
let lis = [];
for(const element of elements) {
lis.push(createElement('li', 'list-inline-item', element));
}
return createElement('ul', 'list-inline mb-0', lis);
}
// Render a version
function renderVersion(data, type) {
let typeString = createElement('span', 'text-body-secondary', type || 'v');
let versionString = createElement('span', 'font-monospace', data);
return createElement('span', null, [ typeString, versionString ]);
}
// Create an element as specified, appending optional content as child(ren)
function createElement(elementName, classNames, content) {
let element = document.createElement(elementName);
if(classNames) {
element.setAttribute('class', classNames);
}
if((content instanceof Element) || (content instanceof DocumentFragment)) {
element.appendChild(content);
}
else if(Array.isArray(content)) {
content.forEach(function(item) {
if((item instanceof Element) || (item instanceof DocumentFragment)) {
element.appendChild(item);
}
else {
element.appendChild(document.createTextNode(item));
}
});
}
else if(content) {
element.appendChild(document.createTextNode(content));
}
return element;
}
// Expose the following functions and variables
return {
render: render
}
}());