/*
//
// Class offers helper functions for
// rendering and organization of assets parameters
//
*/
const AssetsGroups = require('./assetsgroups');
/**
* Class for handling of assets parameters for assets groups and their tabs and orders
* @class
*/
class assetsparametershelper {
/**
* @constructor
*/
constructor() {
// always initialize all instance properties
}
/**
* reads defined tabs for assets parameters from database
* @param {integer} assetGroup id of asset group, asset parameter tabs shall be returned for
* @param {function} callback rows or null
*/
getAssetsParametersTabs(assetGroup, callback) {
let query = "SELECT * FROM assets_parameters_tabs WHERE assetsGroup = ? AND state = 1 ORDER BY `order` ASC";
console.log(`SELECT * FROM assets_parameters_tabs WHERE assetsGroup = ${assetGroup} AND state = 1 ORDER BY \`order\` ASC`)
global.coreDb.all(query, [
assetGroup
], (err, rows) => {
if (err) {
return null;
} else {
console.log('getAssetsParametersTab Count Tabs: ' + rows.length);
return callback(rows);
}
});
}
/**
* returns list of assets parameters for given assetGroup id
* @param {integer} assetGroup id of assets group, parameters shall be returned for
* @param {function} callback rows or null
*/
getAssetsParametersForAssetGroup(assetGroup, callback) {
console.log('getAssetsParametersForAssetGroup');
let query = "SELECT assets_parameters.*, " +
"`assets_parameters_tabs`.`order` AS taborder " +
"FROM assets_parameters " +
"LEFT JOIN assets_parameters_tabs ON assets_parameters.assetsParametersTab = assets_Parameters_tabs.id " +
"WHERE assets_parameters.assetsGroup = ? AND assets_parameters.state = 1 " +
"ORDER BY `assets_parameters_tabs`.`order` ASC";
global.coreDb.all(query, [
assetGroup
], (err, rows) => {
if (err) {
console.log('getAssetsParametersForAssetGroup: Error reading parameters: ' + err.message);
return null;
} else {
console.log('getAssetsParametersForAssetGroup: found ' + rows.length + ' Parameters');
return callback(rows);
}
});
}
/**
* checks weather a value for the given assetsparameter exists in assets_parameters_store
* @param {integer} assetsId id of asset the check shall be run for
* @param {integer} assetsParametersId id of asset parameter the check shall be run for
* @param {function} callback id of asstets_parameter_store if found, or false if not found
*/
doesParameterExistInStore(assetsId, assetsParametersId, callback) {
let query = "SELECT * FROM assets_parameters_store WHERE assetsId = ? AND assetsParametersId = ?";
global.coreDb.all(query, [
assetsId,
assetsParametersId
], (err, rows) => {
if (err) {
return null;
} else {
if (rows.length > 0) {
console.log('Parameter to be updated exists in core database');
return callback(rows[0].id);
} else {
console.log('Parameter to be updated DOES NOT exist in core database');
return callback(false);
}
}
});
}
/**
* updates Value in parameters Store
* @param {integer} storeId id of object in table assets_parameters_store
* @param {string} newValue new value as string
* @param {string} interpretAs type of value as string
* @param {function} callback callback function, success (true or false)
*/
updateParameterInStore(storeId, fieldType, newValue, callback) {
let query = '';
switch (fieldType) {
case 'string':
query = "UPDATE assets_parameters_store SET valueStr = ? WHERE id = ?";
break;
case 'select':
query = "UPDATE assets_parameters_store SET valueSelect = ? WHERE id = ?";
break;
case 'date':
query = "UPDATE assets_parameters_store SET valueDate = ? WHERE id = ?";
break;
case 'integer':
query = "UPDATE assets_parameters_store SET valueInt = ? WHERE id = ?";
break;
default:
break;
}
global.coreDb.run(query,
[
newValue,
storeId
],
function (err) {
if (err) {
console.log('ERROR updating asset parameter in core database: ' + err.message);
callback(false);
} else {
callback(true);
}
});
}
/**
* update parameter value to database table assets_parameters_store
* @param {integer} assetId ID of asset this value has to be stored for
* @param {integer} parameterId ID of parameter, this value is for
* @param {string} parameterType type of parameter (string, select, integer)
* @param {string} value value to be stored
* @param {function} callback callback function (false in case of error, true if successfully written)
*/
updateParameterValuesInDatabase(assetId, formData, parameters, callback) {
var insertValuePart = '';
console.log('updateParameterValuesInDatabase - 1');
var updateQueries = [];
var inserQueries = [];
console.log('parameters: --------------------------------------');
console.log(parameters);
console.log('formData:-----------------------------------------');
console.log(formData);
console.log('--------------------------------------------------');
global.coreDb.serialize(() => {
parameters.forEach((parameter, index) => {
console.log('updateParameterValuesInDatabase - 2');
let fieldValue = formData['ap_' + parameter.alias];
let fieldType = parameter.type;
var interpretAs = '';
var valueStr = null;
var valueSelect = null;
var valueInt = null;
var valueDate = null;
console.log('interpret As: ' + interpretAs);
switch (fieldType) {
case 'string':
interpretAs = 'valueStr';
valueStr = fieldValue;
break;
case 'select':
interpretAs = 'valueSelect';
valueSelect = fieldValue;
break;
case 'integer':
interpretAs = 'valueInt';
valueInt = fieldValue;
break;
case 'date':
interpretAs = "valueDate";
valueDate = fieldValue;
break;
default:
interpretAs = 'valueStr';
valueStr = fieldValue;
break;
}
let queryInsertOrReplace = "INSERT OR REPLACE INTO assets_parameters_store (id, assetsParametersId, assetsId, valueStr, valueInt, valueSelect, valueDate, interpretAs) " +
"VALUES ( " +
"( SELECT id " +
"FROM assets_parameters_store " +
"WHERE assetsParametersId = ? " +
"AND assetsId = ?), " +
"?, " +
"?, " +
"?, " +
"?, " +
"?, " +
"?, " +
"? " +
");"
global.coreDb.run(queryInsertOrReplace, [
parameter.id,
assetId,
parameter.id,
assetId,
valueStr,
valueInt,
valueSelect,
valueDate,
interpretAs
], (err, rows) => {
if (err) {
console.log('Error updating or inserting parameter: ' + err.message);
//return null;
} else {
}
});
})
})
console.log('finished Update of parameters');
callback(true);
}
/**
* writes parameter value to database table assets_parameters_store
* @param {integer} newAssetId
* @param {object} formData
* @param {object} parameters
* @param {function} callback success (true or false)
*/
persistParameterValuesInDatabase(newAssetId, formData, parameters, callback) {
var insertValuePart = '';
parameters.forEach((parameter, index) => {
let fieldValue = formData['ap_' + parameter.alias];
let fieldType = parameter.type;
var insertStr = '';
switch (fieldType) {
case 'string':
insertStr = '(' + parameter.id + ', ' + newAssetId + ', "' + fieldValue + '", null, null, null, "string")';
break;
case 'select':
insertStr = '(' + parameter.id + ', ' + newAssetId + ', null, null, "' + fieldValue + '", null, "select")';
break;
case 'integer':
insertStr = '(' + parameter.id + ', ' + newAssetId + ', null, ' + fieldValue + ', null, null, "integer")';
break;
case 'date':
insertStr = '(' + parameter.id + ', ' + newAssetId + ', null, null, null, "' + fieldValue + '", "date")';
default:
break;
}
var separator = '';
if (index > 0) {
separator = ',';
}
insertValuePart = insertValuePart + separator + insertStr;
console.log(index + ' | ' + parameter.label + ' | ' + parameter.alias + ' | ' + fieldValue + ' | ' + fieldType);
})
if (insertValuePart.length > 0) {
let query = "INSERT INTO `assets_parameters_store` " +
"( " +
"`assetsParametersId`, " +
"`assetsId`, " +
"`valueStr`, " +
"`valueInt`, " +
"`valueSelect`, " +
"`valueDate`, " +
"`interpretAs`) " +
"VALUES " + insertValuePart;
global.coreDb.run(query,
[],
function (err) {
if (err) {
console.log('ERROR persisting new asset parameters to core database: ' + err.message);
callback(false);
} else {
callback(true);
}
});
} else {
// No parameters to be stored
callback(true);
}
}
/**
* Function loads values for asset parameters for given asset with assetId
* @param {integer} assetId
* @param {function} callback rows or null
*/
getAssetParameterValuesForAssetId(assetId, callback) {
console.log('getAssetParameterValuesForAssetId');
let query = "SELECT * FROM assets_parameters_store WHERE assetsId = ?";
global.coreDb.all(query, [
assetId
], (err, rows) => {
if (err) {
console.log('getAssetParameterValuesForAssetId: ERROR loading from core database: ' + err.message);
return null;
} else {
console.log('getAssetParameterValuesForAssetId: found ' + rows.length + ' asset parameter values rows');
if (rows.length > 0) {
return callback(rows);
} else {
return callback(false);
}
}
});
}
/**
* writes parameter value to database table assets_parameters_store
* @param {*} assetId ID of asset this value has to be stored for
* @param {*} parameterId ID of parameter, this value is for
* @param {*} parameterType type of parameter (string, select, integer)
* @param {*} value value to be stored
* @param {*} callback callback function (false in case of error, true if successfully written)
*/
persistParameterValueInDatabase(assetId, parameterId, parameterType, value, callback) {
var interpretAs = '';
switch (parameterType) {
case 'string':
interpretAs = 'valueStr';
break;
case 'select':
interpretAs = 'valueSelect';
break;
case 'integer':
interpretAs = 'valueInt';
break;
case 'date':
interpretAs = 'valueDate';
break;
default:
interpretAs = 'valueStr';
break;
}
let query = "INSERT INTO assets_parameters_store (assetsParametersId, assetsId, " + interpretAs + ") VALUES (" + parameterId + ", " + assetId + ", '" + value + "')";
global.coreDb.run(query,
[],
function (err) {
if (err) {
console.log('MODELS-ASSETPARAMETERSHELPER | Error writing parameter value to database: ' + err.message);
callback(false);
} else {
callback(true);
}
});
}
/**
* writes parameter value to database table assets_parameters_store
* @param {*} req
* @param {*} res
* @param {*} parameterId ID of parameter, this value is for
* @param {*} parameterType type of parameter (string, select, integer)
* @param {*} value value to be stored
* @param {*} callback callback function (false in case of error, true if successfully written)
*/
updateParameterValueInDatabase(parameterStoreId, parameterType, value, callback) {
var interpretAs = '';
switch (parameterType) {
case 'string':
interpretAs = 'valueStr';
break;
case 'select':
interpretAs = 'valueSelect';
break;
case 'integer':
interpretAs = 'valueInt';
break;
case 'date':
interpretAs = 'valueDate';
break;
default:
interpretAs = 'valueStr';
break;
}
let query = "UPDATE `assets_parameters_store` " +
"SET ? = ? WHERE id = ?";
global.coreDb.run(query,
[
interpretAs,
value,
parameterStoreId
],
function (err) {
if (err) {
console.log('MODELS-ASSETPARAMETERSHELPER | Error updating parameter value to database: ' + err.message);
callback(false);
} else {
callback(true);
}
});
}
/**
* Renders HTML Code for Tab navigation for given assetGroup id
* @param {*} assetGroups
* @param {*} callback
*/
renderTabsForAssetGroups(assetGroups, showAlarmingTab, callback) {
console.log('renderTabsForAssetGroups');
var returnHTML = '<nav mt-5>' +
'<div class="nav nav-tabs" id="nav-tab" role="tablist">';
assetGroups.forEach((group, index) => {
var activeClass = ' active';
if (index > 0) {
activeClass = '';
}
var tabId = group.tabalias;
returnHTML = returnHTML + '<a class="nav-item nav-link ' + activeClass + '" id="nav-' + tabId + '-tab" data-toggle="tab" href="#nav-' + tabId + '" role="tab" aria-controls="nav-' + tabId + '" aria-selected="true" style="font-size: 13px">' + group.tabtitle + '</a>';
})
// For Assets in a Group which is declaed as a GearGroup, show alarming tab
if (showAlarmingTab === 1) {
var activeClass = '';
var tabId = 'alarming';
returnHTML = returnHTML + '<a class="nav-item nav-link ' + activeClass + '" id="nav-' + tabId + '-tab" data-toggle="tab" href="#nav-' + tabId + '" role="tab" aria-controls="nav-' + tabId + '" aria-selected="true" style="font-size: 13px">Alarmierung</a>';
}
returnHTML = returnHTML + '</div>' +
'</nav>' +
'<div class="mb-5"></div>';
callback(returnHTML);
}
/**
* builds HTML-form for assets parameters organized in tabs
* @param {*} req
* @param {*} res
* @param {*} assetGroup
* @param {*} callback
*/
getAssetsParametersFormHTMLForAssetGroup(req, res, assetGroup, callback) {
this.getAssetsParametersTabs(assetGroup, (resultTabs) => {
var assetsgroups = new AssetsGroups(req.app.logger);
assetsgroups.getAssetGroup(assetGroup, (rowAssetGroup) => {
this.getAssetsParametersForAssetGroup(assetGroup, (result) => {
if (result === false) {
// Error reading parameters
req.app.logger.error('MODELS-ASSETPARAMETERSHELPER | Error reading asset parameters from database');
callback('ERROR');
} else {
req.app.logger.debug('MODELS-ASSETPARAMETERSHELPER | Successfully read ' + result.length + ' asset parameters from database');
console.log('MODELS-ASSETPARAMETERSHELPER | Successfully read ' + result.length + ' asset parameters from database');
var retValHTML = '';
// Render Navigation Tabs
var showAlarming = 0;
if (rowAssetGroup.length > 0) {
showAlarming = rowAssetGroup[0].isGearGroup;
}
this.renderTabsForAssetGroups(resultTabs, showAlarming, (tabsHTML) => {
//console.log('getAssetsParametersForAssetsGroup: rendered Tabs for Asset Groups: ' + tabsHTML);
var tabId = 0;
retValHTML = tabsHTML;
retValHTML = retValHTML + '<div class="tab-content" id="nav-tabContent">';
resultTabs.forEach((tab, tabIndex) => {
var activeTab = '';
if (tabIndex < 1) {
activeTab = 'active';
}
retValHTML = retValHTML + '<div class="tab-pane fade show ' + activeTab + '" id="nav-' + tab.tabalias + '" role="tabpanel" aria-labelledby="nav-' + tab.tabalias + '-tab"><div class="m-3">';
result.forEach((assetParameter, index) => {
if (assetParameter.assetsParametersTab === tab.id) {
var mandantory = '';
if (assetParameter.mandantory === 1) { mandantory = ' required'; }
switch (assetParameter.type) {
case 'string':
retValHTML = retValHTML +
'<div class="form-group">' +
'<label for="ap_' + assetParameter.alias + '">' + assetParameter.label + '</label>' +
'<input type="text" class="form-control" id="ap_' + assetParameter.alias + '" name="ap_' + assetParameter.alias + '" ' + mandantory + '>' +
'</div>';
break;
case 'select':
var options = JSON.parse(assetParameter.values);
retValHTML = retValHTML + '<div class="form-group">' +
'<label for="ap_' + assetParameter.alias + '">' + assetParameter.label + '</label>' +
'<select class="form-control text-primary" id="ap_' + assetParameter.alias + '" name="ap_' + assetParameter.alias + '" ' + mandantory + '>';
options.forEach(option => {
var keys = Object.keys(option);
retValHTML = retValHTML + '<option value="' + keys[0] + '">' + option[keys[0]] + '</option>';
})
retValHTML = retValHTML + '</select></div>';
break;
case 'integer':
retValHTML = retValHTML +
'<div class="form-group">' +
'<label for="ap_' + assetParameter.alias + '">' + assetParameter.label + '</label>' +
'<input type="text" class="form-control" id="ap_' + assetParameter.alias + '" name="ap_' + assetParameter.alias + '" onkeypress="return isNumberKey(event);" ' + mandantory + '>' +
'</div>';
break;
default:
break;
}
}
})
retValHTML = retValHTML + '</div></div>';
})
if (showAlarming === 1) {
retValHTML = retValHTML + '<div class="tab-pane fade" id="nav-alarming" role="tabpanel" aria-labelledby="nav-alarming-tab"><div class="m-3">';
retValHTML = retValHTML +
'<div class="form-group">' +
'<div class="custom-control custom-switch ml-3 mt-3"> ' +
'<input type="checkbox" class="custom-control-input" id="isGear" name="isGear" checked="">' +
'<label class="custom-control-label" for="isGearGroup">alarmierbares Einsatzmittel</label>' +
'</div>' +
'</div>' +
'<div class="form-group">' +
'<label for="isAlarmableGear">Bezeichner in Alarmquellen</label>' +
'<input type="text" class="form-control" id="gearname" name="gearname">' +
'</div>' +
'<div class="form-group">' +
'<label for="issi">ISSI für Statusausleitung</label>' +
'<input type="text" class="form-control" id="issi" name="issi">' +
'</div>';
retValHTML = retValHTML + '</div></div>';
}
callback(retValHTML);
})
}
})
})
})
}
/**
* builds HTML-form for assets parameters organized in tabs for editing mode
* @param {object} req Request object
* @param {object} res Response object
* @param {integer} assetGroup if of asset group of asset
* @param {integer} assetId if of asset in core database
* @param {integer} isGear 1 if its an alarmable asset, 0 if not
* @param {string} gearname name of gear in alarmings
* @param {function} callback string if HTML form
*/
getAssetsParametersFormHTMLForAssetGroupAndAsset(req, res, assetGroup, assetId, isGear, gearname, issi, callback) {
req.app.logger.debug('MODELS-ASSETPARAMETERSHELPER | start rendering HTML SubForm for Editing for asset with id ' + assetId + ' and asset group with id ' + assetGroup);
this.getAssetsParametersTabs(assetGroup, (resultTabs) => {
var assetsgroups = new AssetsGroups(req.app.logger);
assetsgroups.getAssetGroup(assetGroup, (rowAssetGroup) => {
console.log('... now get assets parameters');
this.getAssetsParametersForAssetGroup(assetGroup, (resultAssetParameters) => {
console.log('... got assets parameters');
if (resultAssetParameters === false) {
// Error reading parameters
req.app.logger.error('MODELS-ASSETPARAMETERSHELPER | Error reading asset parameters from database');
callback('ERROR');
} else {
console.log('... now get assets parameters values for asset');
this.getAssetParameterValuesForAssetId(assetId, (resultAssetParametersValues) => {
console.log('... got assets parameters values');
var showAlarming = 0;
if (rowAssetGroup.length > 0) {
showAlarming = rowAssetGroup[0].isGearGroup;
}
this.renderTabsForAssetGroups(resultTabs, showAlarming, (tabsHTML) => {
console.log('... got tabs HTML');
var retValHTML = tabsHTML;
retValHTML = retValHTML + '<div class="tab-content" id="nav-tabContent">';
resultTabs.forEach((tab, index) => {
var activeTab = '';
if (index < 1) {
activeTab = 'active';
}
retValHTML = retValHTML + '<div class="tab-pane fade show ' + activeTab + '" id="nav-' + tab.tabalias + '" role="tabpanel" aria-labelledby="nav-' + tab.tabalias + '-tab"><div class="m-3">';
// Now iterate through parameters in tab
var tabId = 0;
resultAssetParameters.forEach((assetParameter, index) => {
var theParameter = null;
resultAssetParametersValues.forEach(theValue => {
if (theValue.assetsParametersId === assetParameter.id) {
theParameter = theValue;
}
})
if (assetParameter.assetsParametersTab === tab.id) {
// AssetParameter belongs to currently rendered Tab
var mandantory = '';
if (assetParameter.mandantory === 1) { mandantory = ' required'; }
switch (assetParameter.type) {
case 'string':
var value = '';
if (theParameter !== null) {
value = theParameter.valueStr;
}
retValHTML = retValHTML +
'<div class="form-group">' +
'<label for="ap_' + assetParameter.alias + '">' + assetParameter.label + '</label>' +
'<input type="text" class="form-control" id="ap_' + assetParameter.alias + '" name="ap_' + assetParameter.alias + '" value="' + value + '" ' + mandantory + '>' +
'</div>';
break;
case 'select':
var value = '';
if (theParameter !== null) {
value = theParameter.valueSelect;
}
var options = JSON.parse(assetParameter.values);
retValHTML = retValHTML + '<div class="form-group">' +
'<label for="ap_' + assetParameter.alias + '">' + assetParameter.label + '</label>' +
'<select class="form-control text-primary" id="ap_' + assetParameter.alias + '" name="ap_' + assetParameter.alias + '" ' + mandantory + '>';
options.forEach(option => {
var keys = Object.keys(option);
var selectedState = '';
if (parseInt(keys[0]) === parseInt(value)) {
selectedState = ' selected ';
}
retValHTML = retValHTML + '<option value="' + keys[0] + '" ' + selectedState + '>' + option[keys[0]] + '</option>';
})
retValHTML = retValHTML + '</select></div>';
break;
case 'integer':
var value = '';
if (theParameter !== null) {
value = theParameter.valueInt;
}
retValHTML = retValHTML +
'<div class="form-group">' +
'<label for="ap_' + assetParameter.alias + '">' + assetParameter.label + '</label>' +
'<input type="text" class="form-control" id="ap_' + assetParameter.alias + '" name="ap_' + assetParameter.alias + '" value="' + value + '" onkeypress="return isNumberKey(event);" ' + mandantory + '>' +
'</div>';
break;
case 'date':
var value = '';
if (theParameter !== null) {
value = theParameter.valueDate;
}
retValHTML = retValHTML +
'<div class="form-group">' +
'<label for="ap_' + assetParameter.alias + '">' + assetParameter.label + '</label>' +
'<input type="date" class="form-control" id="ap_' + assetParameter.alias + '" name="ap_' + assetParameter.alias + '" value="' + value + '" ' + mandantory + '>' +
'</div>';
break;
default:
break;
}
}
})
retValHTML = retValHTML + '</div></div>';
})
if (showAlarming === 1) {
var valIsGear = '';
if (isGear === 1) {
valIsGear = ' checked';
}
if (issi === null) {
issi = '';
}
retValHTML = retValHTML + '<div class="tab-pane fade" id="nav-alarming" role="tabpanel" aria-labelledby="nav-alarming-tab"><div class="m-3">';
retValHTML = retValHTML +
'<div class="form-group">' +
'<div class="custom-control custom-switch ml-3 mt-3"> ' +
'<input type="checkbox" class="custom-control-input" id="isGear" name="isGear" ' + valIsGear + '>' +
'<label class="custom-control-label" for="isGear">alarmierbares Einsatzmittel</label>' +
'</div>' +
'</div>' +
'<div class="form-group">' +
'<label for="gername">Bezeichner in Alarmquellen</label>' +
'<input type="text" class="form-control" id="gearname" name="gearname" value="' + gearname + '">' +
'</div>' +
'<div class="form-group">' +
'<label for="issi">ISSI für Statusausleitung</label>' +
'<input type="text" class="form-control" id="issi" name="issi" value="' + issi + '">' +
'</div>';
retValHTML = retValHTML + '</div></div>';
retValHTML = retValHTML + '</div></div>';
}
req.app.logger.debug('MODELS-ASSETPARAMETERSHELPER | Successfully read ' + resultAssetParameters.length + ' asset parameters from database');
callback(retValHTML);
});
})
}
})
})
})
}
}
// export the class
module.exports = assetsparametershelper;