2013-09-05 16:02:48 +02:00
|
|
|
/**
|
|
|
|
* Copyright 2013 IBM Corp.
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
**/
|
2014-08-08 01:01:35 +02:00
|
|
|
var RED = (function() {
|
2013-09-05 16:02:48 +02:00
|
|
|
|
|
|
|
$('#btn-keyboard-shortcuts').click(function(){showHelp();});
|
2014-02-11 14:21:30 +01:00
|
|
|
|
2014-02-19 11:38:46 +01:00
|
|
|
function hideDropTarget() {
|
|
|
|
$("#dropTarget").hide();
|
|
|
|
RED.keyboard.remove(/* ESCAPE */ 27);
|
|
|
|
}
|
2014-02-11 14:21:30 +01:00
|
|
|
|
2013-12-31 22:32:50 +01:00
|
|
|
$('#chart').on("dragenter",function(event) {
|
|
|
|
if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1) {
|
|
|
|
$("#dropTarget").css({display:'table'});
|
2014-02-19 11:38:46 +01:00
|
|
|
RED.keyboard.add(/* ESCAPE */ 27,hideDropTarget);
|
2013-12-31 22:32:50 +01:00
|
|
|
}
|
|
|
|
});
|
2014-02-11 14:21:30 +01:00
|
|
|
|
2013-12-31 22:32:50 +01:00
|
|
|
$('#dropTarget').on("dragover",function(event) {
|
|
|
|
if ($.inArray("text/plain",event.originalEvent.dataTransfer.types) != -1) {
|
|
|
|
event.preventDefault();
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.on("dragleave",function(event) {
|
2014-02-19 11:38:46 +01:00
|
|
|
hideDropTarget();
|
2013-12-31 22:32:50 +01:00
|
|
|
})
|
|
|
|
.on("drop",function(event) {
|
|
|
|
var data = event.originalEvent.dataTransfer.getData("text/plain");
|
2014-02-19 11:38:46 +01:00
|
|
|
hideDropTarget();
|
2013-12-31 22:32:50 +01:00
|
|
|
RED.view.importNodes(data);
|
2014-02-12 23:33:07 +01:00
|
|
|
event.preventDefault();
|
2013-12-31 22:32:50 +01:00
|
|
|
});
|
2014-02-11 14:21:30 +01:00
|
|
|
|
|
|
|
|
2013-09-05 16:02:48 +02:00
|
|
|
function save(force) {
|
|
|
|
if (RED.view.dirty()) {
|
2013-12-11 23:22:33 +01:00
|
|
|
|
2013-09-05 16:02:48 +02:00
|
|
|
if (!force) {
|
|
|
|
var invalid = false;
|
2013-12-12 16:51:15 +01:00
|
|
|
var unknownNodes = [];
|
2013-09-05 16:02:48 +02:00
|
|
|
RED.nodes.eachNode(function(node) {
|
2014-05-08 15:15:54 +02:00
|
|
|
invalid = invalid || !node.valid;
|
|
|
|
if (node.type === "unknown") {
|
|
|
|
if (unknownNodes.indexOf(node.name) == -1) {
|
|
|
|
unknownNodes.push(node.name);
|
2013-12-11 23:22:33 +01:00
|
|
|
}
|
2014-05-08 15:15:54 +02:00
|
|
|
invalid = true;
|
|
|
|
}
|
2013-09-05 16:02:48 +02:00
|
|
|
});
|
|
|
|
if (invalid) {
|
2013-12-12 16:51:15 +01:00
|
|
|
if (unknownNodes.length > 0) {
|
|
|
|
$( "#node-dialog-confirm-deploy-config" ).hide();
|
|
|
|
$( "#node-dialog-confirm-deploy-unknown" ).show();
|
|
|
|
var list = "<li>"+unknownNodes.join("</li><li>")+"</li>";
|
|
|
|
$( "#node-dialog-confirm-deploy-unknown-list" ).html(list);
|
|
|
|
} else {
|
|
|
|
$( "#node-dialog-confirm-deploy-config" ).show();
|
|
|
|
$( "#node-dialog-confirm-deploy-unknown" ).hide();
|
|
|
|
}
|
2013-09-05 16:02:48 +02:00
|
|
|
$( "#node-dialog-confirm-deploy" ).dialog( "open" );
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
var nns = RED.nodes.createCompleteNodeSet();
|
2014-02-20 18:31:40 +01:00
|
|
|
|
|
|
|
$("#btn-icn-deploy").removeClass('icon-upload');
|
|
|
|
$("#btn-icn-deploy").addClass('spinner');
|
|
|
|
RED.view.dirty(false);
|
|
|
|
|
2014-04-15 23:30:07 +02:00
|
|
|
$.ajax({
|
|
|
|
url:"flows",
|
|
|
|
type: "POST",
|
|
|
|
data: JSON.stringify(nns),
|
|
|
|
contentType: "application/json; charset=utf-8"
|
|
|
|
}).done(function(data,textStatus,xhr) {
|
|
|
|
RED.notify("Successfully deployed","success");
|
|
|
|
RED.nodes.eachNode(function(node) {
|
|
|
|
if (node.changed) {
|
|
|
|
node.dirty = true;
|
|
|
|
node.changed = false;
|
2013-09-05 16:02:48 +02:00
|
|
|
}
|
2014-07-19 01:16:21 +02:00
|
|
|
if(node.credentials) {
|
|
|
|
delete node.credentials;
|
2014-06-24 12:13:19 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
RED.nodes.eachConfig(function (confNode) {
|
2014-07-19 01:16:21 +02:00
|
|
|
if (confNode.credentials) {
|
|
|
|
delete confNode.credentials;
|
2014-06-24 12:13:19 +02:00
|
|
|
}
|
2014-04-15 23:30:07 +02:00
|
|
|
});
|
|
|
|
// Once deployed, cannot undo back to a clean state
|
|
|
|
RED.history.markAllDirty();
|
|
|
|
RED.view.redraw();
|
|
|
|
}).fail(function(xhr,textStatus,err) {
|
|
|
|
RED.view.dirty(true);
|
|
|
|
if (xhr.responseText) {
|
|
|
|
RED.notify("<strong>Error</strong>: "+xhr.responseText,"error");
|
|
|
|
} else {
|
|
|
|
RED.notify("<strong>Error</strong>: no response from server","error");
|
|
|
|
}
|
|
|
|
}).always(function() {
|
|
|
|
$("#btn-icn-deploy").removeClass('spinner');
|
|
|
|
$("#btn-icn-deploy").addClass('icon-upload');
|
2013-09-05 16:02:48 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
$('#btn-deploy').click(function() { save(); });
|
|
|
|
|
|
|
|
$( "#node-dialog-confirm-deploy" ).dialog({
|
|
|
|
title: "Confirm deploy",
|
|
|
|
modal: true,
|
|
|
|
autoOpen: false,
|
|
|
|
width: 530,
|
|
|
|
height: 230,
|
|
|
|
buttons: [
|
|
|
|
{
|
|
|
|
text: "Confirm deploy",
|
|
|
|
click: function() {
|
|
|
|
save(true);
|
|
|
|
$( this ).dialog( "close" );
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
text: "Cancel",
|
|
|
|
click: function() {
|
|
|
|
$( this ).dialog( "close" );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
});
|
|
|
|
|
2014-02-16 01:39:30 +01:00
|
|
|
function loadSettings() {
|
|
|
|
$.get('settings', function(data) {
|
2014-05-08 15:15:54 +02:00
|
|
|
RED.settings = data;
|
2014-07-17 22:32:30 +02:00
|
|
|
console.log("Node-RED: "+data.version);
|
2014-05-08 15:15:54 +02:00
|
|
|
loadNodes();
|
2014-02-16 01:39:30 +01:00
|
|
|
});
|
|
|
|
}
|
2013-09-05 16:02:48 +02:00
|
|
|
function loadNodes() {
|
|
|
|
$.get('nodes', function(data) {
|
2014-05-08 15:15:54 +02:00
|
|
|
$("body").append(data);
|
|
|
|
$(".palette-spinner").hide();
|
|
|
|
$(".palette-scroll").show();
|
|
|
|
$("#palette-search").show();
|
|
|
|
loadFlows();
|
2013-09-05 16:02:48 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function loadFlows() {
|
2014-04-15 23:30:07 +02:00
|
|
|
$.getJSON("flows",function(nodes) {
|
2014-05-08 15:15:54 +02:00
|
|
|
RED.nodes.import(nodes);
|
|
|
|
RED.view.dirty(false);
|
|
|
|
RED.view.redraw();
|
|
|
|
RED.comms.subscribe("status/#",function(topic,msg) {
|
|
|
|
var parts = topic.split("/");
|
|
|
|
var node = RED.nodes.node(parts[1]);
|
|
|
|
if (node) {
|
|
|
|
node.status = msg;
|
2014-05-11 00:33:02 +02:00
|
|
|
if (statusEnabled) {
|
|
|
|
node.dirty = true;
|
|
|
|
RED.view.redraw();
|
|
|
|
}
|
2014-05-08 15:15:54 +02:00
|
|
|
}
|
|
|
|
});
|
2014-08-07 14:46:03 +02:00
|
|
|
RED.comms.subscribe("node/#",function(topic,msg) {
|
2014-08-08 01:01:35 +02:00
|
|
|
var i;
|
2014-08-07 14:46:03 +02:00
|
|
|
if (topic == "node/added") {
|
2014-08-08 01:01:35 +02:00
|
|
|
for (i=0;i<msg.length;i++) {
|
2014-08-07 14:46:03 +02:00
|
|
|
var m = msg[i];
|
|
|
|
var id = m.id;
|
|
|
|
$.get('nodes/'+id, function(data) {
|
|
|
|
$("body").append(data);
|
|
|
|
var typeList = "<ul><li>"+m.types.join("</li><li>")+"</li></ul>";
|
|
|
|
RED.notify("Node"+(m.types.length!=1 ? "s":"")+" added to palette:"+typeList,"success");
|
|
|
|
});
|
|
|
|
}
|
|
|
|
} else if (topic == "node/removed") {
|
|
|
|
if (msg.types) {
|
2014-08-08 01:01:35 +02:00
|
|
|
for (i=0;i<msg.types.length;i++) {
|
2014-08-07 14:46:03 +02:00
|
|
|
RED.palette.remove(msg.types[i]);
|
|
|
|
}
|
|
|
|
var typeList = "<ul><li>"+msg.types.join("</li><li>")+"</li></ul>";
|
|
|
|
RED.notify("Node"+(msg.types.length!=1 ? "s":"")+" removed from palette:"+typeList,"success");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
2013-09-05 16:02:48 +02:00
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2014-05-11 00:33:02 +02:00
|
|
|
$('#btn-node-status').click(function() {toggleStatus();});
|
|
|
|
|
|
|
|
var statusEnabled = false;
|
|
|
|
function toggleStatus() {
|
|
|
|
var btnStatus = $("#btn-node-status");
|
|
|
|
statusEnabled = btnStatus.toggleClass("active").hasClass("active");
|
|
|
|
RED.view.status(statusEnabled);
|
|
|
|
}
|
|
|
|
|
2013-09-05 16:02:48 +02:00
|
|
|
function showHelp() {
|
2013-12-11 23:22:33 +01:00
|
|
|
|
2013-09-05 16:02:48 +02:00
|
|
|
var dialog = $('#node-help');
|
2013-12-11 23:22:33 +01:00
|
|
|
|
2013-09-05 16:02:48 +02:00
|
|
|
//$("#node-help").draggable({
|
|
|
|
// handle: ".modal-header"
|
2013-12-11 23:22:33 +01:00
|
|
|
//});
|
|
|
|
|
2013-09-05 16:02:48 +02:00
|
|
|
dialog.on('show',function() {
|
2014-05-08 15:15:54 +02:00
|
|
|
RED.keyboard.disable();
|
2013-09-05 16:02:48 +02:00
|
|
|
});
|
|
|
|
dialog.on('hidden',function() {
|
2014-05-08 15:15:54 +02:00
|
|
|
RED.keyboard.enable();
|
2013-09-05 16:02:48 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
dialog.modal();
|
|
|
|
}
|
2013-12-11 23:22:33 +01:00
|
|
|
|
2013-09-05 16:02:48 +02:00
|
|
|
$(function() {
|
2014-05-08 15:15:54 +02:00
|
|
|
RED.keyboard.add(/* ? */ 191,{shift:true},function(){showHelp();d3.event.preventDefault();});
|
|
|
|
loadSettings();
|
|
|
|
RED.comms.connect();
|
2013-09-05 16:02:48 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
return {
|
|
|
|
};
|
2014-08-08 01:01:35 +02:00
|
|
|
})();
|