standaardisation of EVOLV eco

This commit is contained in:
znetsixe
2025-06-24 10:48:40 +02:00
parent d05d521408
commit 0f855a8d2f
2 changed files with 49 additions and 21 deletions

View File

@@ -51,21 +51,54 @@
setTimeout(waitForMenuData, 50); setTimeout(waitForMenuData, 50);
} }
}; };
// Wait for the menu data to be ready before initializing the editor
waitForMenuData(); waitForMenuData();
// --------------- Initialize the dropdowns and other specific UI elements -------------- this should be derived from the config in the future (make config based menu)
// Populate smoothing methods dropdown
const smoothMethodSelect = document.getElementById('node-input-smooth_method');
const options = window.EVOLV?.nodes?.measurement?.config?.smoothing?.smoothMethod?.rules?.values || [];
console.log("Smoothing methods options:", options);
// Clear existing options
smoothMethodSelect.innerHTML = '';
// Add empty option
const emptyOption = document.createElement('option');
emptyOption.value = '';
emptyOption.textContent = 'Select method...';
smoothMethodSelect.appendChild(emptyOption);
// Add smoothing method options
options.forEach(option => {
const optionElement = document.createElement('option');
optionElement.value = option.value;
optionElement.textContent = option.value;
optionElement.title = option.description; // Add tooltip with full description
smoothMethodSelect.appendChild(optionElement);
});
// Set current value if it exists
if (this.smooth_method) {
smoothMethodSelect.value = this.smooth_method;
}
//------------------- END OF CUSTOM config UI ELEMENTS ------------------- //
}, },
oneditsave: function () { oneditsave: function () {
const node = this; const node = this;
console.log(`------------ Saving changes to node ------------`); // Validate asset properties using the asset menu
console.log(`${node.uuid}`); if (window.EVOLV?.nodes?.measurement?.assetMenu?.saveEditor) {
success = window.EVOLV.nodes.measurement.assetMenu.saveEditor(this);
}
// Save basic properties // Save basic properties
["name", "supplier", "category", "assetType", "model", "unit", "smooth_method"].forEach( ["name", "smooth_method"].forEach(
(field) => (node[field] = document.getElementById(`node-input-${field}`).value || "") (field) => (node[field] = document.getElementById(`node-input-${field}`).value || "")
); );
// Save numeric and boolean properties // Save numeric and boolean properties
["scaling", "enableLog", "simulator"].forEach( ["scaling", "simulator"].forEach(
(field) => (node[field] = document.getElementById(`node-input-${field}`).checked) (field) => (node[field] = document.getElementById(`node-input-${field}`).checked)
); );
@@ -74,23 +107,15 @@
); );
node.logLevel = document.getElementById("node-input-logLevel").value || "info"; node.logLevel = document.getElementById("node-input-logLevel").value || "info";
node.enableLog = document.getElementById("node-input-enableLog").checked;
// Validation checks // Validation checks
if (node.scaling && (isNaN(node.i_min) || isNaN(node.i_max))) { if (node.scaling && (isNaN(node.i_min) || isNaN(node.i_max))) {
RED.notify("Scaling enabled, but input range is incomplete!", "error"); RED.notify("Scaling enabled, but input range is incomplete!", "error");
} }
if (!node.unit) {
RED.notify("Unit selection is required.", "error");
}
// Validation checks - FIXED
if (node.assetType && !node.unit) {
RED.notify("Unit must be set when specifying a type.", "error");
}
console.log("stored node modelData", node.modelMetadata);
console.log("------------ Changes saved to measurement node preparing to save to API ------------");
}, },
}); });

View File

@@ -1,7 +1,8 @@
/** /**
* measurement.class.js * measurement.class.js
* *
* Encapsulates all Measurement node logic in a reusable class. * Encapsulates all node logic in a reusable class. In future updates we can split this into multiple generic classes and use the config to specifiy which ones to use.
* This allows us to keep the Node-RED node clean and focused on wiring up the UI and event handlers.
*/ */
const { outputUtils, configManager } = require('generalFunctions'); const { outputUtils, configManager } = require('generalFunctions');
const Measurement = require("../dependencies/measurement/measurement"); const Measurement = require("../dependencies/measurement/measurement");
@@ -12,17 +13,17 @@ const Measurement = require("../dependencies/measurement/measurement");
class MeasurementNode { class MeasurementNode {
/** /**
* Create a MeasurementNode. * Create a MeasurementNode.
* @param {object} config - Node-RED node configuration. * @param {object} uiConfig - Node-RED node configuration.
* @param {object} RED - Node-RED runtime API. * @param {object} RED - Node-RED runtime API.
*/ */
constructor(config, RED, nodeInstance) { constructor(uiConfig, RED, nodeInstance) {
// Preserve RED reference for HTTP endpoints if needed // Preserve RED reference for HTTP endpoints if needed
this.node = nodeInstance; this.node = nodeInstance;
this.RED = RED; this.RED = RED;
// Load default & UI config // Load default & UI config
this._loadConfig(config); this._loadConfig(uiConfig);
// Instantiate core Measurement class // Instantiate core Measurement class
this._setupMeasurementClass(); this._setupMeasurementClass();
@@ -57,8 +58,10 @@ class MeasurementNode {
asset: { asset: {
tagCode: uiConfig.assetTagCode, tagCode: uiConfig.assetTagCode,
supplier: uiConfig.supplier, supplier: uiConfig.supplier,
subType: uiConfig.subType, category: uiConfig.category,
model: uiConfig.model type: uiConfig.assetType,
model: uiConfig.model,
unit: uiConfig.unit
}, },
scaling: { scaling: {
enabled: uiConfig.scaling, enabled: uiConfig.scaling,
@@ -89,7 +92,7 @@ class MeasurementNode {
} }
/** /**
* Bind Measurement events to Node-RED status updates. * Bind Measurement events to Node-RED status updates. Using internal emitter.
*/ */
_bindEvents() { _bindEvents() {
this.source.emitter.on('mAbs', (val) => { this.source.emitter.on('mAbs', (val) => {