@frangoteam/fuxa
Version:
Web-based Process Visualization (SCADA/HMI/Dashboard) software
1,079 lines (1,029 loc) • 39.1 kB
JavaScript
/*
* Project manager: read, write, add, remove, ... and save
*/
;
const fs = require('fs');
const path = require('path');
const async = require('async');
var events = require('../events');
var utils = require('../utils');
const prjstorage = require('./prjstorage');
const DeviceType = require('../devices/device').DeviceType;
const version = '1.02';
var settings; // Application settings
var logger; // Application logger
var runtime;
var data = {}; // Project data
/**
* Init Project resource and update project
* @param {*} _settings
* @param {*} log
*/
function init(_settings, log, _runtime) {
settings = _settings;
logger = log;
runtime = _runtime;
// Init Project database
return new Promise(function (resolve, reject) {
prjstorage.init(settings, logger).then(result => {
logger.info('project.prjstorage-init-successful!', true);
if (result) {
resolve();
} else {
prjstorage.setDefault().then(result => {
logger.info('project.prjstorage-set-default-successful!', true);
resolve();
}).catch(function (err) {
logger.error(`project.prjstorage-set-default failed! ${err}`);
resolve();
});
}
}).catch(function (err) {
logger.error(`project.prjstorage-failed-to-init! ${err}`);
reject(err);
});
});
}
/**
* Load project resource in a local data
* Read all storaged sections and fill in local data
*/
function load() {
return new Promise(function (resolve, reject) {
data = { devices: {}, hmi: { views: [] }, texts: [], alarms: [] };
// load general data
prjstorage.getSection(prjstorage.TableType.GENERAL).then(grows => {
for (var ig = 0; ig < grows.length; ig++) {
if (grows[ig].name === ProjectDataCmdType.HmiLayout) {
data.hmi[grows[ig].name] = JSON.parse(grows[ig].value);
} else {
data[grows[ig].name] = JSON.parse(grows[ig].value);
}
}
// load views
prjstorage.getSection(prjstorage.TableType.VIEWS).then(vrows => {
for (var iv = 0; iv < vrows.length; iv++) {
data.hmi.views.push(JSON.parse(vrows[iv].value));
}
// load devices
prjstorage.getSection(prjstorage.TableType.DEVICES).then(drows => {
for (var id = 0; id < drows.length; id++) {
if (drows[id].name === 'server') {
data[drows[id].name] = JSON.parse(drows[id].value);
} else {
data.devices[drows[id].name] = JSON.parse(drows[id].value);
}
}
async.series([
// step 1 get texts
function (callback) {
getTexts().then(texts => {
data.texts = texts;
callback();
}).catch(function (err) {
logger.error(`project.prjstorage-failed-to-load! '${prjstorage.TableType.TEXTS}' ${err}`);
callback(err);
});
},
// step 2 get alarms
function (callback) {
getAlarms().then(alarms => {
data.alarms = alarms;
callback();
}).catch(function (err) {
logger.error(`project.prjstorage-failed-to-load! '${prjstorage.TableType.ALARMS}' ${err}`);
callback(err);
});
},
// step 3 get notifications
function (callback) {
getNotifications().then(notifications => {
data.notifications = notifications;
callback();
}).catch(function (err) {
logger.error(`project.prjstorage-failed-to-load! '${prjstorage.TableType.NOTIFICATIONS}' ${err}`);
callback(err);
});
},
// step 4 get scripts
function (callback) {
getScripts().then(scripts => {
data.scripts = scripts;
callback();
}).catch(function (err) {
logger.error(`project.prjstorage-failed-to-load! '${prjstorage.TableType.SCRIPTS}' ${err}`);
callback(err);
});
},
// step 5 get reports
function (callback) {
getReports().then(reports => {
data.reports = reports;
callback();
}).catch(function (err) {
logger.error(`project.prjstorage-failed-to-load! '${prjstorage.TableType.REPORTS}' ${err}`);
callback(err);
});
},
// step 6 get MapsLocations
function (callback) {
getMapsLocations().then(locations => {
data.mapsLocations = locations;
callback();
}).catch(function (err) {
logger.error(`project.prjstorage-failed-to-load! '${prjstorage.TableType.LOCATIONS}' ${err}`);
callback(err);
});
}
],
async function (err) {
if (err) {
reject(err);
} else {
await _mergeDefaultConfig();
resolve();
}
});
}).catch(function (err) {
logger.error(`project.prjstorage-failed-to-load! '${prjstorage.TableType.DEVICES}' ${err}`);
reject(err);
});
}).catch(function (err) {
logger.error(`project.prjstorage-failed-to-load! '${prjstorage.TableType.VIEWS}' ${err}`);
reject(err);
});
}).catch(function (err) {
logger.error(`project.prjstorage-failed-to-load! '${prjstorage.TableType.GENERAL}' ${err}`);
reject(err);
});
});
}
/**
* Save the value in project storage
* First set the value in local data, then save in storage
* @param {*} cmd
* @param {*} data
*/
function setProjectData(cmd, value) {
return new Promise(function (resolve, reject) {
try {
var toremove = false;
var section = { table: '', name: '', value: value };
if (cmd === ProjectDataCmdType.SetView) {
section.table = prjstorage.TableType.VIEWS;
section.name = value.id;
setView(value);
} else if (cmd === ProjectDataCmdType.DelView) {
section.table = prjstorage.TableType.VIEWS;
section.name = value.id;
toremove = removeView(value);
} else if (cmd === ProjectDataCmdType.HmiLayout) {
section.table = prjstorage.TableType.GENERAL;
section.name = cmd;
setHmiLayout(value);
} else if (cmd === ProjectDataCmdType.SetDevice) {
section.table = prjstorage.TableType.DEVICES;
section.name = value.id;
setDevice(value);
} else if (cmd === ProjectDataCmdType.DelDevice) {
section.table = prjstorage.TableType.DEVICES;
section.name = value.id;
toremove = removeDevice(value);
} else if (cmd === ProjectDataCmdType.Charts) {
section.table = prjstorage.TableType.GENERAL;
section.name = cmd;
setCharts(value);
} else if (cmd === ProjectDataCmdType.Languages) {
section.table = prjstorage.TableType.GENERAL;
section.name = cmd;
setLanguages(value);
} else if (cmd === ProjectDataCmdType.ClientAccess) {
section.table = prjstorage.TableType.GENERAL;
section.name = cmd;
setClientAccess(value);
} else if (cmd === ProjectDataCmdType.Graphs) {
section.table = prjstorage.TableType.GENERAL;
section.name = cmd;
setGraphs(value);
} else if (cmd === ProjectDataCmdType.SetText) {
section.table = prjstorage.TableType.TEXTS;
section.name = value.id;
setText(value);
} else if (cmd === ProjectDataCmdType.DelText) {
section.table = prjstorage.TableType.TEXTS;
section.name = value.id;
toremove = removeText(value);
} else if (cmd === ProjectDataCmdType.SetAlarm) {
section.table = prjstorage.TableType.ALARMS;
section.name = value.name;
setAlarm(value);
} else if (cmd === ProjectDataCmdType.DelAlarm) {
section.table = prjstorage.TableType.ALARMS;
section.name = value.name;
toremove = removeAlarm(value);
} else if (cmd === ProjectDataCmdType.SetNotification) {
section.table = prjstorage.TableType.NOTIFICATIONS;
section.name = value.id;
setNotification(value);
} else if (cmd === ProjectDataCmdType.DelNotification) {
section.table = prjstorage.TableType.NOTIFICATIONS;
section.name = value.id;
toremove = removeNotification(value);
} else if (cmd === ProjectDataCmdType.SetScript) {
section.table = prjstorage.TableType.SCRIPTS;
section.name = value.id;
setScript(value);
} else if (cmd === ProjectDataCmdType.DelScript) {
section.table = prjstorage.TableType.SCRIPTS;
section.name = value.id;
toremove = removeScript(value);
} else if (cmd === ProjectDataCmdType.SetReport) {
section.table = prjstorage.TableType.REPORTS;
section.name = value.id;
setReport(value);
} else if (cmd === ProjectDataCmdType.DelReport) {
section.table = prjstorage.TableType.REPORTS;
section.name = value.id;
toremove = removeReport(value);
} else if (cmd === ProjectDataCmdType.SetMapsLocation) {
section.table = prjstorage.TableType.LOCATIONS;
section.name = value.id;
setMapsLocation(value);
} else if (cmd === ProjectDataCmdType.DelMapsLocation) {
section.table = prjstorage.TableType.LOCATIONS;
section.name = value.id;
toremove = removeMapsLocation(value);
} else {
logger.error(`prjstorage.setdata failed! '${section.table}'`);
reject('prjstorage.failed-to-setdata: Command not found!');
}
if (toremove) {
prjstorage.deleteSection(section).then(result => {
resolve(true);
}).catch(function (err) {
logger.error(`prjstorage.deletedata failed! '${section.table}'`);
reject(err);
});
} else {
prjstorage.setSection(section).then(result => {
resolve(true);
}).catch(function (err) {
logger.error(`prjstorage.setdata failed! '${section.table}'`);
reject(err);
});
}
} catch (err) {
reject(err);
}
});
}
/**
* Set or add if not exist (check with view.id) the View in Project
* @param {*} view
*/
function setView(view) {
var pos = -1;
for (var i = 0; i < data.hmi.views.length; i++) {
if (data.hmi.views[i].id === view.id) {
pos = i;
}
}
if (pos >= 0) {
data.hmi.views[pos] = view;
} else {
data.hmi.views.push(view);
}
}
/**
* Remove the View from Project
* @param {*} view
*/
function removeView(view) {
var pos = -1;
for (var i = 0; i < data.hmi.views.length; i++) {
if (data.hmi.views[i].id === view.id) {
data.hmi.views.splice(i, 1);
return true;
}
}
return false;
}
/**
* Set Device to local data
* @param {*} device
* @param {*} merge merge with exist (tags)
*/
function setDevice(device, merge) {
if (merge && data.devices[device.id]) {
device.enabled = data.devices[device.id].enabled;
data.devices[device.id] = {...data.devices[device.id], ...device};
} else {
data.devices[device.id] = device;
}
}
/**
* Remove Device from local data
* @param {*} device
*/
function removeDevice(device) {
delete data.devices[device.id];
return true;
}
/**
* Set HMI Layout to local data
* @param {*} layout
*/
function setHmiLayout(layout) {
data.hmi.layout = layout;
}
/**
* Set Charts
* @param {*} charts
*/
function setCharts(charts) {
data.charts = charts;
}
/**
* Set Graphs
* @param {*} graphs
*/
function setGraphs(graphs) {
data.graphs = graphs;
}
/**
* Set Languages
* @param {*} languages
*/
function setLanguages(languages) {
data.languages = languages;
}
/**
* Set ClientAccess
* @param {*} clientAccess
*/
function setClientAccess(clientAccess) {
data.clientAccess = clientAccess;
}
/**
* Set or add if not exist (check with taxt.name) the Text in Project
* @param {*} text
*/
function setText(text) {
if (!data.texts) {
data.texts = [];
}
var pos = -1;
for (var i = 0; i < data.texts.length; i++) {
if (data.texts[i].id === text.id) {
pos = i;
}
}
if (pos >= 0) {
data.texts[pos] = text;
} else {
data.texts.push(text);
}
}
/**
* Remove the Text from Project
* @param {*} text
*/
function removeText(text) {
if (data.texts) {
for (var i = 0; i < data.texts.length; i++) {
if (data.texts[i].id === text.id) {
data.texts.splice(i, 1);
return true;
}
}
}
return false;
}
/**
* Set or add if not exist (check with alarm.name) the Alarm in Project
* @param {*} alarm
*/
function setAlarm(alarm) {
if (!data.alarms) {
data.alarms = [];
}
var pos = -1;
for (var i = 0; i < data.alarms.length; i++) {
if (data.alarms[i].name === alarm.name) {
pos = i;
}
}
if (pos >= 0) {
data.alarms[pos] = alarm;
} else {
data.alarms.push(alarm);
}
}
/**
* Remove the Alarm from Project
* @param {*} alarm
*/
function removeAlarm(alarm) {
if (data.alarms) {
for (var i = 0; i < data.alarms.length; i++) {
if (data.alarms[i].name === alarm.name) {
data.alarms.splice(i, 1);
return true;
}
}
}
return false;
}
/**
* Set or add if not exist (check with notification.id) the Notification in Project
* @param {*} notification
*/
function setNotification(notification) {
if (!data.notifications) {
data.notifications = [];
}
var pos = -1;
for (var i = 0; i < data.notifications.length; i++) {
if (data.notifications[i].id === notification.id) {
pos = i;
}
}
if (pos >= 0) {
data.notifications[pos] = notification;
} else {
data.notifications.push(notification);
}
}
/**
* Remove the Notification from Project
* @param {*} notification
*/
function removeNotification(notification) {
if (data.notifications) {
for (var i = 0; i < data.notifications.length; i++) {
if (data.notifications[i].id === notification.id) {
data.notifications.splice(i, 1);
return true;
}
}
}
return false;
}
/**
* Set or add if not exist (check with script.id) the Script in Project
* @param {*} script
*/
function setScript(script) {
if (!data.scripts) {
data.scripts = [];
}
var pos = -1;
for (var i = 0; i < data.scripts.length; i++) {
if (data.scripts[i].id === script.id) {
pos = i;
}
}
if (pos >= 0) {
data.scripts[pos] = script;
} else {
data.scripts.push(script);
}
}
/**
* Remove the Script from Project
* @param {*} script
*/
function removeScript(script) {
if (data.scripts) {
for (var i = 0; i < data.scripts.length; i++) {
if (data.scripts[i].id === script.id) {
data.scripts.splice(i, 1);
return true;
}
}
}
return false;
}
/**
* Set or add if not exist (check with report.id) the Report in Project
* @param {*} report
*/
function setReport(report) {
if (!data.reports) {
data.reports = [];
}
var pos = -1;
for (var i = 0; i < data.reports.length; i++) {
if (data.reports[i].id === report.id) {
pos = i;
}
}
if (pos >= 0) {
data.reports[pos] = report;
} else {
data.reports.push(report);
}
}
/**
* Remove the Report from Project
* @param {*} script
*/
function removeReport(report) {
if (data.reports) {
for (var i = 0; i < data.reports.length; i++) {
if (data.reports[i].id === report.id) {
data.reports.splice(i, 1);
return true;
}
}
}
return false;
}
/**
* Set or add if not exist (check with location.id) the MapsLocation in Project
* @param {*} location
*/
function setMapsLocation(location) {
if (!data.mapsLocations) {
data.mapsLocations = [];
}
var pos = -1;
for (var i = 0; i < data.mapsLocations.length; i++) {
if (data.mapsLocations[i].id === location.id) {
pos = i;
}
}
if (pos >= 0) {
data.mapsLocations[pos] = location;
} else {
data.mapsLocations.push(location);
}
}
/**
* Remove the Maps Locations from Project
* @param {*} location
*/
function removeMapsLocation(location) {
if (data.mapsLocations) {
for (var i = 0; i < data.mapsLocations.length; i++) {
if (data.mapsLocations[i].id === location.id) {
data.mapsLocations.splice(i, 1);
return true;
}
}
}
return false;
}
/**
* Get the project data in accordance with autorization
*/
function getProject(userId, userPermission) {
return new Promise(function (resolve, reject) {
const pdata = _filterProjectPermission(userPermission);
resolve(pdata);
});
}
/**
* Set the new Project, clear all from database and add the new content
* @param {*} prjcontent
*/
function setProject(prjcontent) {
return new Promise(function (resolve, reject) {
try {
prjstorage.clearAll().then(result => {
var scs = [];
Object.keys(prjcontent).forEach((key) => {
if (key === 'devices') {
// devices
var devices = prjcontent[key];
if (devices) {
Object.values(prjcontent[key]).forEach((device) => {
scs.push({ table: prjstorage.TableType.DEVICES, name: device.id, value: device });
});
}
} else if (key === 'hmi') {
// hmi
var hmi = prjcontent[key];
if (hmi) {
Object.keys(hmi).forEach((hk) => {
if (hk === 'views') {
// views
if (hmi[hk] && hmi[hk].length > 0) {
for (var i = 0; i < hmi[hk].length; i++) {
var view = hmi[hk][i];
scs.push({ table: prjstorage.TableType.VIEWS, name: view.id, value: view });
}
}
} else {
// layout
scs.push({ table: prjstorage.TableType.GENERAL, name: hk, value: hmi[hk] });
}
});
}
} else if (key === 'server') {
// server
scs.push({ table: prjstorage.TableType.DEVICES, name: key, value: prjcontent[key] });
} else if (key === 'texts') {
// texts
var texts = prjcontent[key];
if (texts && texts.length) {
for (var i = 0; i < texts.length; i++) {
scs.push({ table: prjstorage.TableType.TEXTS, name: texts[i].name, value: texts[i] });
}
}
} else if (key === 'alarms') {
// alarms
var alarms = prjcontent[key];
if (alarms && alarms.length) {
for (var i = 0; i < alarms.length; i++) {
scs.push({ table: prjstorage.TableType.ALARMS, name: alarms[i].name, value: alarms[i] });
}
}
} else if (key === 'notifications') {
// notifications
var notifications = prjcontent[key];
if (notifications && notifications.length) {
for (var i = 0; i < notifications.length; i++) {
scs.push({ table: prjstorage.TableType.NOTIFICATIONS, name: notifications[i].id, value: notifications[i] });
}
}
} else if (key === 'scripts') {
// scripts
var scripts = prjcontent[key];
if (scripts && scripts.length) {
for (var i = 0; i < scripts.length; i++) {
scs.push({ table: prjstorage.TableType.SCRIPTS, name: scripts[i].id, value: scripts[i] });
}
}
} else if (key === 'reports') {
// reports
var reports = prjcontent[key];
if (reports && reports.length) {
for (var i = 0; i < reports.length; i++) {
scs.push({ table: prjstorage.TableType.REPORTS, name: reports[i].id, value: reports[i] });
}
}
} else if (key === 'mapsLocations') {
var locations = prjcontent[key];
if (locations && locations.length) {
for (var i = 0; i < locations.length; i++) {
scs.push({ table: prjstorage.TableType.LOCATIONS, name: locations[i].id, value: locations[i] });
}
}
} else {
// charts, graphs, version
scs.push({ table: prjstorage.TableType.GENERAL, name: key, value: prjcontent[key] });
}
});
prjstorage.setSections(scs).then(() => {
logger.info(`project.prjstorage.set-project successfull!`, true);
resolve(true);
}).catch(function (err) {
reject(err);
});
}).catch(function (err) {
logger.error(`project.prjstorage.clear failed! '${err}'`);
reject(err);
});
} catch (err) {
reject();
}
});
}
/**
* Return Devices list
*/
function getDevices() {
return data.devices;
}
/**
* Return Device from name
*/
function getDevice(name) {
return Object.values(data.devices).find(device => device.name === name);
}
/**
* Get the device property
*/
function getDeviceProperty(query) {
return new Promise(function (resolve, reject) {
if (query.query === 'security') {
prjstorage.getSection(prjstorage.TableType.DEVICESSECURITY, query.name).then(drows => {
if (drows.length > 0) {
resolve(drows[0]);
} else {
resolve();
}
}).catch(function (err) {
logger.error(`project.prjstorage.getdevice-property failed! '${prjstorage.TableType.DEVICESSECURITY} ${err}'`);
reject(err);
});
} else {
reject();
}
});
}
/**
* Get the texts
*/
function getTexts() {
return new Promise(function (resolve, reject) {
prjstorage.getSection(prjstorage.TableType.TEXTS).then(drows => {
if (drows.length > 0) {
var texts = [];
for (var id = 0; id < drows.length; id++) {
texts.push(JSON.parse(drows[id].value));
}
resolve(texts);
} else {
resolve();
}
}).catch(function (err) {
logger.error(`project.prjstorage.get-texts failed! '${prjstorage.TableType.TEXTS} ${err}'`);
reject(err);
});
});
}
/**
* Get the alarms
*/
function getAlarms() {
return new Promise(function (resolve, reject) {
prjstorage.getSection(prjstorage.TableType.ALARMS).then(drows => {
if (drows.length > 0) {
var alarms = [];
for (var id = 0; id < drows.length; id++) {
alarms.push(JSON.parse(drows[id].value));
}
resolve(alarms);
} else {
resolve();
}
}).catch(function (err) {
logger.error(`project.prjstorage.get-alarms failed! '${prjstorage.TableType.ALARMS} ${err}'`);
reject(err);
});
});
}
/**
* Get the notifications
*/
function getNotifications() {
return new Promise(function (resolve, reject) {
prjstorage.getSection(prjstorage.TableType.NOTIFICATIONS).then(drows => {
if (drows.length > 0) {
var notifications = [];
for (var id = 0; id < drows.length; id++) {
notifications.push(JSON.parse(drows[id].value));
}
resolve(notifications);
} else {
resolve();
}
}).catch(function (err) {
logger.error(`project.prjstorage.get-notifications failed! '${prjstorage.TableType.NOTIFICATIONS} ${err}'`);
reject(err);
});
});
}
/**
* Get the scripts
*/
function getScripts() {
return new Promise(function (resolve, reject) {
prjstorage.getSection(prjstorage.TableType.SCRIPTS).then(drows => {
if (drows.length > 0) {
var scripts = [];
for (var id = 0; id < drows.length; id++) {
scripts.push(JSON.parse(drows[id].value));
}
resolve(scripts);
} else {
resolve();
}
}).catch(function (err) {
logger.error(`project.prjstorage.get-scripts failed! '${prjstorage.TableType.SCRIPTS} ${err}'`);
reject(err);
});
});
}
/**
* Get the reports
*/
function getReports() {
return new Promise(function (resolve, reject) {
prjstorage.getSection(prjstorage.TableType.REPORTS).then(drows => {
if (drows.length > 0) {
var reports = [];
for (var id = 0; id < drows.length; id++) {
reports.push(JSON.parse(drows[id].value));
}
resolve(reports);
} else {
resolve();
}
}).catch(function (err) {
logger.error(`project.prjstorage.get-reports failed! '${prjstorage.TableType.REPORTS} ${err}'`);
reject(err);
});
});
}
/**
* Get the Maps Locations
*/
function getMapsLocations() {
return new Promise(function (resolve, reject) {
prjstorage.getSection(prjstorage.TableType.LOCATIONS).then(drows => {
if (drows.length > 0) {
var locations = [];
for (var id = 0; id < drows.length; id++) {
locations.push(JSON.parse(drows[id].value));
}
resolve(locations);
} else {
resolve();
}
}).catch(function (err) {
logger.error(`project.prjstorage.get-mapsLocations failed! '${prjstorage.TableType.LOCATIONS} ${err}'`);
reject(err);
});
});
}
/**
* Set the device property
*/
function setDeviceProperty(query) {
return new Promise(function (resolve, reject) {
if (query.query === 'security') {
if (!query.value) {
resolve();
return;
}
prjstorage.setSection({ table: prjstorage.TableType.DEVICESSECURITY, name: query.name, value: query.value }).then(() => {
resolve();
}).catch(function (err) {
logger.error(`project.prjstorage.setdevice-property failed! '${prjstorage.TableType.DEVICESSECURITY} ${err}'`);
reject(err);
});
} else {
reject();
}
});
}
/**
* Return Project demo from file
*/
function getProjectDemo() {
var demoProject = path.join(settings.appDir, 'project.demo.fuxap');
return JSON.parse(fs.readFileSync(demoProject, 'utf8'));;
}
function _filterProjectPermission(userPermission) {
var result = JSON.parse(JSON.stringify(data));// = { devices: {}, hmi: { views: [] } };
const projectPermission = runtime.checkPermission(userPermission, false);
if (!projectPermission.show || !projectPermission.enabled) { // is admin or secure disabled
// from device remove the not used (no permission)
// delete result.devices;
delete result.server;
// check navigation permission
if (result.hmi.layout && result.hmi.layout.navigation.items) {
for (var i = result.hmi.layout.navigation.items.length - 1; i >= 0; i--) {
const itemPermission = runtime.checkPermission(userPermission, result.hmi.layout.navigation.items[i]);
if (!itemPermission.enabled) {
result.hmi.layout.navigation.items.splice(i, 1);
}
}
}
// check header permission
if (result.hmi.layout && result.hmi.layout.header.items) {
for (var i = result.hmi.layout.header.items.length - 1; i >= 0; i--) {
const itemPermission = runtime.checkPermission(userPermission, result.hmi.layout.header.items[i].property, true);
if (!itemPermission.enabled || !itemPermission.show) {
result.hmi.layout.header.items.splice(i, 1);
}
}
}
// check view item permission show / enabled
for (var i = 0; i < result.hmi.views.length; i++) {
var view = result.hmi.views[i];
if (result.hmi.views[i].items) {
Object.values(result.hmi.views[i].items).forEach((item) => {
if (item.property) {
const itemPermission = runtime.checkPermission(userPermission, item.property, false, true);
if (!itemPermission.show) {
var position = view.svgcontent.indexOf(item.id);
if (position >= 0) {
position += item.id.length + 1;
var hidetext = ' visibility="hidden" ';
view.svgcontent = view.svgcontent.slice(0, position) + hidetext + view.svgcontent.slice(position);
}
} else if (!itemPermission.enabled) {
item.property.events = [];
// disable the html controls (select, input, button)
const indexInContent = view.svgcontent.indexOf(item.id);
if (indexInContent >= 0) {
var splitted = utils.domStringSplitter(view.svgcontent, 'foreignobject', indexInContent);
if (splitted.tagcontent && splitted.tagcontent.length) {
var disabled = utils.domStringSetAttribute(splitted.tagcontent, ['select', 'input', 'button'], 'disabled');
// disabled = utils.domStringSetOverlay(disabled, ['ngx-switch']);
view.svgcontent = splitted.before + disabled + splitted.after;
}
}
}
}
});
}
}
}
return result;
}
function _mergeDefaultConfig() {
return new Promise(async function (resolve, reject) {
try {
if (process.env.DEVICES && typeof process.env.DEVICES === 'string') {
try {
logger.info('project.merge-config: in progress!');
var devices = JSON.parse(process.env.DEVICES);
devices.forEach(device => {
try {
// check device required
if (!device || !device.id || !device.name || !device.type || !device.configs) {
logger.error(`project.merge-config: DEVICES${JSON.stringify(device)} missing property!`);
} else {
var existDevice = data.devices[device.id];
var deviceToAdd = new Device(device);
if (existDevice) {
deviceToAdd.tags = existDevice.tags;
}
setDevice(deviceToAdd, true);
logger.info(`project.merge-config: Device ${deviceToAdd.name} added!`);
}
} catch (err) {
logger.error(`project.merge-config: DEVICES${JSON.stringify(device)} failed! ${err}`);
reject();
}
});
} catch (err) {
logger.error(`project.merge-config: DEVICES failed! ${err}`);
}
}
resolve();
} catch (err) {
logger.error(`project.merge-config: failed! ${err}`);
reject();
}
});
function Device(device, tags) {
this.id = device.id;
this.name = device.name;
this.enabled = true;
this.type = device.type;
this.polling = 1000 || device.configs.requestIntervalMs;
this.tags = tags || {};
this.property = device.configs;
var a = Object.values(DeviceType);
if (Object.values(DeviceType).indexOf(device.type) === -1) {
throw new Error('DeviceType unknow');
}
}
}
const ProjectDataCmdType = {
SetDevice: 'set-device',
DelDevice: 'del-device',
SetView: 'set-view',
DelView: 'del-view',
HmiLayout: 'layout',
Charts: 'charts',
Graphs: 'graphs',
Languages: 'languages',
ClientAccess: 'client-access',
SetText: 'set-text',
SetText: 'set-text',
DelText: 'del-text',
SetAlarm: 'set-alarm',
DelAlarm: 'del-alarm',
SetNotification: 'set-notification',
DelNotification: 'del-notification',
SetScript: 'set-script',
DelScript: 'del-script',
SetReport: 'set-report',
DelReport: 'del-report',
SetMapsLocation:'set-maps-location',
DelMapsLocation: 'del-maps-location',
}
module.exports = {
init: init,
load: load,
getDevices: getDevices,
getDevice: getDevice,
getAlarms: getAlarms,
getNotifications: getNotifications,
getScripts: getScripts,
getReports: getReports,
getDeviceProperty: getDeviceProperty,
setDeviceProperty: setDeviceProperty,
setProjectData: setProjectData,
getProject: getProject,
setProject: setProject,
getProjectDemo: getProjectDemo,
ProjectDataCmdType, ProjectDataCmdType,
};