prisme-flow
Version:
prisme platform flow engine
269 lines (226 loc) • 11 kB
HTML
<!--
Created by prisme.io on 09/06/2017.
@author <a href="mailto:hello@prisme.io">savane vamara</a> (prisme.io)
-->
<script type="text/javascript">
RED.nodes.registerType('ISA95-M2MOM', {
category: 'plc',
color: '#FF7030',
defaults: {
machineid: {type: 'ISA-MachineId', required: true},
name: {value: ''},
topic: {value: ''},
register: {value: '1', validate: RED.validators.number()},
mappings: {
value: [{
start: {value: '', validate: RED.validators.number()},
quantity: {value: '', validate: RED.validators.number()},
valueName: '',
valueType: 'UInt16',
typeChange: 'UInt32'
}]
}
},
inputs: 1,
outputs: 3,
icon: "isa95-icon-blue.png",
label: function () {
return this.name || "ISA-95 M2MOM";
},
oneditprepare: function () {
var valueTypes = [{val: 'Boolean', text: 'Boolean'},
{val: 'UInt16', text: 'UInt16'},
{val: 'Int16', text: 'Int16'},
{val: 'UInt32', text: 'UInt32'},
{val: 'Int32', text: 'Int32'},
{val: 'UInt64', text: 'UInt64'},
{val: 'Int64', text: 'Int64'},
{val: 'Real', text: 'Real'},
{val: 'LReal', text: 'LReal'}
];
var typeChanges = [{val: 'Boolean', text: 'Boolean'},
{val: 'UInt16', text: 'UInt16'},
{val: 'Int16', text: 'Int16'},
{val: 'UInt32', text: 'UInt32'},
{val: 'Int32', text: 'Int32'},
{val: 'UInt64', text: 'UInt64'},
{val: 'Int64', text: 'Int64'},
{val: 'Float', text: 'Float'},
{val: 'Double', text: 'Double'},
{val: 'BigDecimal', text: 'BigDecimal'}
];
function resizeButton(mapping, width) {
var lastField = mapping.find(".node-input-mapping-typeChange");
// lastField.width(width - 120);
}
function generateButton(mapping, id) {
var container = $('<li/>', {style: "background: #fff; margin:0; padding:8px 0px; border-bottom: 1px solid #ccc;"});
var row = $('<div id="row' + id + '"/>').appendTo(container);
$('<i style="color: #eee; cursor: move;" class="node-input-mapping-handle fa fa-bars"></i>').appendTo(row);
var startField = $('<input/>', {
id: "node-input-mapping-start",
type: "text",
style: "margin-left:5px;width:50px;",
placeholder: 'start'
}).appendTo(row);
var quantityField = $('<input/>', {
id: "node-input-mapping-quantity",
type: "text",
style: "margin-left:5px;width:50px;",
placeholder: 'quantity'
}).appendTo(row);
var valueNameField = $('<input/>', {
id: "node-input-mapping-valueName",
type: "text",
style: "margin-left:5px;width:150px;",
placeholder: 'MyVariable1'
}).appendTo(row);
var valueTypeField = $('<select/>', {
id: 'node-input-mapping-valueType',
type: 'text'
}).appendTo(row);
valueTypeField.css('margin-left', '5px');
valueTypeField.css('width', '100px');
$(valueTypes).each(function () {
valueTypeField.append($("<option>").attr('value', this.val).text(this.text));
});
var typeChangeField = $('<select/>', {
id: 'node-input-mapping-typeChange',
type: 'text'
}).appendTo(row);
typeChangeField.css('margin-left', '5px');
typeChangeField.css('width', '100px');
$(typeChanges).each(function () {
typeChangeField.append($("<option>").attr('value', this.val).text(this.text));
});
startField.val(mapping.start);
quantityField.val(mapping.quantity);
valueNameField.val(mapping.valueName);
valueTypeField.val(mapping.valueType);
typeChangeField.val(mapping.typeChange);
mapping.start = '';
mapping.quantity = '';
mapping.valueName = '';
mapping.valueType = '';
mapping.typeChange = '';
var finalspan = $('<span/>', {style: "float: right;margin-right: 10px;"}).appendTo(row);
var deleteMapping = $('<a/>', {
href: "#",
class: "editor-button editor-button-small",
style: "margin-top: 7px; margin-left: 5px;"
}).appendTo(finalspan);
$('<i/>', {class: "fa fa-remove"}).appendTo(deleteMapping);
deleteMapping.click(function () {
container.css({"background": "#fee"});
container.fadeOut(300, function () {
$(this).remove();
});
});
$("#node-input-mappings-container").append(container);
var width = $("#node-input-mappings-container").width();
resizeButton(container, width);
}
$("#node-input-add-button").click(function () {
generateButton({
start: '',
quantity: '',
valueName: '',
valueType: '',
typeChange: ''
});
$("#node-input-mappings-container-div").scrollTop($("#node-input-mappings-container-div").get(0).scrollHeight);
});
for (var i = 0; i < this.mappings.length; i++) {
var rule = this.mappings[i];
generateButton(rule, i);
}
function switchDialogResize() {
var rows = $("#dialog-form>div:not(.node-input-mappings-container-row)");
var height = $("#dialog-form").height();
for (var i = 0; i < rows.size(); i++) {
height -= $(rows[i]).outerHeight(true);
}
var editorRow = $("#dialog-form>div.node-input-mappings-container-row");
height -= (parseInt(editorRow.css("marginTop")) + parseInt(editorRow.css("marginBottom")));
$("#node-input-mappings-container-div").css("height", height + "px");
var mappings = $("#node-input-mappings-container").children();
var newWidth = $("#node-input-mappings-container").width();
mappings.each(function (i) {
resizeButton($(this), newWidth);
});
}
$("#node-input-mappings-container").sortable({
axis: "y",
handle: ".node-input-mapping-handle",
cursor: "move"
});
$("#node-input-mappings-container .node-input-mapping-handle").disableSelection();
$("#dialog").on("dialogresize", switchDialogResize);
$("#dialog").one("dialogopen", function (ev) {
var size = $("#dialog").dialog('option', 'sizeCache-switch');
if (size) {
$("#dialog").dialog('option', 'width', size.width);
$("#dialog").dialog('option', 'height', size.height);
switchDialogResize();
} else {
setTimeout(switchDialogResize, 10);
}
});
$("#dialog").one("dialogclose", function (ev, ui) {
$("#dialog").off("dialogresize", switchDialogResize);
});
},
oneditsave: function () {
var mappings = $("#node-input-mappings-container").children();
var node = this;
node.mappings = [];
mappings.each(function (i) {
var mappingEntry = $(this);
var startFieldValue = mappingEntry.find("#node-input-mapping-start").val();
var quantityFieldValue = mappingEntry.find("#node-input-mapping-quantity").val();
var valueNameFieldValue = mappingEntry.find("#node-input-mapping-valueName").val();
var valueTypeFieldValue = mappingEntry.find("#node-input-mapping-valueType").val();
var typeChangeFieldValue = mappingEntry.find("#node-input-mapping-typeChange").val();
node.mappings.push({
start: startFieldValue,
quantity: quantityFieldValue,
valueName: valueNameFieldValue,
valueType: valueTypeFieldValue,
typeChange: typeChangeFieldValue
});
});
}
});
</script>
<script type="text/x-red" data-template-name="ISA95-M2MOM">
<div class="form-row" style="min-width:640px">
<label for="node-input-machineid"><i class="fa fa-table"></i> Machine</label>
<input type="text" id="node-input-machineid">
</div>
<div class="form-row">
<label for="node-input-name"><i class="icon-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
<div class="form-row">
<label for="node-input-topic"><i class="fa fa-tasks"></i> Topic</label>
<input type="text" id="node-input-topic" placeholder="Topic">
</div>
<div class="form-row">
<label for="node-input-register"><i class="fa fa-th"></i> Register</label>
<input type="text" id="node-input-register" placeholder="size to check input data array">
</div>
<div class="form-row node-input-mappings-container-row" style="margin-bottom: 0px;">
<div id="node-input-mappings-container-div" style="box-sizing: border-box; border-radius: 5px; height: 210px; padding: 5px; border: 1px solid #ccc; overflow-y:scroll;">
<ol id="node-input-mappings-container" style=" list-style-type:none; margin: 0;"></ol>
</div>
</div>
<div class="form-row">
<a href="#" class="editor-button editor-button-small" id="node-input-add-button" style="margin-top: 4px;"><i class="fa fa-plus"></i> add</a>
</div>
</script>
<script type="text/x-red" data-help-name="ISA95-M2MOM">
<p>A simple node that work as wrapper for M2MOM to name variables in register</p>
<p><strong>Output 1</strong> RAW</p>
<p><strong>Output 2</strong> JSON of named data</p>
<p><strong>Output 3</strong> Mappings</p>
</script>