mirror of
https://github.com/node-red/node-red.git
synced 2023-10-10 13:36:53 +02:00
Enable config nodes to reference other config nodes
This commit is contained in:
parent
1861c1feb6
commit
819e48b03a
@ -173,6 +173,7 @@ RED.nodes = (function() {
|
|||||||
if (type && type.category == "config") {
|
if (type && type.category == "config") {
|
||||||
var configNode = configNodes[n[d]];
|
var configNode = configNodes[n[d]];
|
||||||
if (configNode) {
|
if (configNode) {
|
||||||
|
if (configNode.users.indexOf(n) === -1) {
|
||||||
updatedConfigNode = true;
|
updatedConfigNode = true;
|
||||||
configNode.users.push(n);
|
configNode.users.push(n);
|
||||||
}
|
}
|
||||||
@ -180,6 +181,7 @@ RED.nodes = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (updatedConfigNode) {
|
if (updatedConfigNode) {
|
||||||
// TODO: refresh config tab?
|
// TODO: refresh config tab?
|
||||||
}
|
}
|
||||||
@ -517,7 +519,7 @@ RED.nodes = (function() {
|
|||||||
if ((exportable == null || exportable)) {
|
if ((exportable == null || exportable)) {
|
||||||
if (!(node[d] in exportedConfigNodes)) {
|
if (!(node[d] in exportedConfigNodes)) {
|
||||||
exportedConfigNodes[node[d]] = true;
|
exportedConfigNodes[node[d]] = true;
|
||||||
nns.unshift(RED.nodes.convertNode(confNode));
|
set.push(confNode);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
convertedNode[d] = "";
|
convertedNode[d] = "";
|
||||||
@ -663,6 +665,9 @@ RED.nodes = (function() {
|
|||||||
var new_links = [];
|
var new_links = [];
|
||||||
var nid;
|
var nid;
|
||||||
var def;
|
var def;
|
||||||
|
var configNode;
|
||||||
|
|
||||||
|
// Find all tabs and subflow templates
|
||||||
for (i=0;i<newNodes.length;i++) {
|
for (i=0;i<newNodes.length;i++) {
|
||||||
n = newNodes[i];
|
n = newNodes[i];
|
||||||
// TODO: remove workspace in next release+1
|
// TODO: remove workspace in next release+1
|
||||||
@ -706,6 +711,8 @@ RED.nodes = (function() {
|
|||||||
addSubflow(n,createNewIds);
|
addSubflow(n,createNewIds);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add a tab if there isn't one there already
|
||||||
if (defaultWorkspace == null) {
|
if (defaultWorkspace == null) {
|
||||||
defaultWorkspace = { type:"tab", id:getID(), label:RED._('workspace.defaultName',{number:1})};
|
defaultWorkspace = { type:"tab", id:getID(), label:RED._('workspace.defaultName',{number:1})};
|
||||||
addWorkspace(defaultWorkspace);
|
addWorkspace(defaultWorkspace);
|
||||||
@ -714,6 +721,7 @@ RED.nodes = (function() {
|
|||||||
activeWorkspace = RED.workspaces.active();
|
activeWorkspace = RED.workspaces.active();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Find all config nodes and add them
|
||||||
for (i=0;i<newNodes.length;i++) {
|
for (i=0;i<newNodes.length;i++) {
|
||||||
n = newNodes[i];
|
n = newNodes[i];
|
||||||
def = registry.getNodeType(n.type);
|
def = registry.getNodeType(n.type);
|
||||||
@ -750,7 +758,7 @@ RED.nodes = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!existingConfigNode) { //} || !compareNodes(existingConfigNode,n,true) || existingConfigNode._def.exclusive || existingConfigNode.z !== n.z) {
|
if (!existingConfigNode) { //} || !compareNodes(existingConfigNode,n,true) || existingConfigNode._def.exclusive || existingConfigNode.z !== n.z) {
|
||||||
var configNode = {id:n.id, z:n.z, type:n.type, users:[]};
|
configNode = {id:n.id, z:n.z, type:n.type, users:[]};
|
||||||
for (var d in def.defaults) {
|
for (var d in def.defaults) {
|
||||||
if (def.defaults.hasOwnProperty(d)) {
|
if (def.defaults.hasOwnProperty(d)) {
|
||||||
configNode[d] = n[d];
|
configNode[d] = n[d];
|
||||||
@ -768,6 +776,7 @@ RED.nodes = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Find regular flow nodes and subflow instances
|
||||||
for (i=0;i<newNodes.length;i++) {
|
for (i=0;i<newNodes.length;i++) {
|
||||||
n = newNodes[i];
|
n = newNodes[i];
|
||||||
// TODO: remove workspace in next release+1
|
// TODO: remove workspace in next release+1
|
||||||
@ -839,12 +848,6 @@ RED.nodes = (function() {
|
|||||||
for (var d2 in node._def.defaults) {
|
for (var d2 in node._def.defaults) {
|
||||||
if (node._def.defaults.hasOwnProperty(d2)) {
|
if (node._def.defaults.hasOwnProperty(d2)) {
|
||||||
if (node._def.defaults[d2].type) {
|
if (node._def.defaults[d2].type) {
|
||||||
if (node_map[n[d2]]) {
|
|
||||||
node[d2] = node_map[n[d2]].id;
|
|
||||||
} else {
|
|
||||||
node[d2] = n[d2];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
node[d2] = n[d2];
|
node[d2] = n[d2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -860,6 +863,7 @@ RED.nodes = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Remap all wires and config node references
|
||||||
for (i=0;i<new_nodes.length;i++) {
|
for (i=0;i<new_nodes.length;i++) {
|
||||||
n = new_nodes[i];
|
n = new_nodes[i];
|
||||||
if (n.wires) {
|
if (n.wires) {
|
||||||
@ -875,6 +879,19 @@ RED.nodes = (function() {
|
|||||||
}
|
}
|
||||||
delete n.wires;
|
delete n.wires;
|
||||||
}
|
}
|
||||||
|
for (var d3 in n._def.defaults) {
|
||||||
|
if (n._def.defaults.hasOwnProperty(d3)) {
|
||||||
|
if (n._def.defaults[d3].type && node_map[n[d3]]) {
|
||||||
|
n[d3] = node_map[n[d3]].id;
|
||||||
|
configNode = RED.nodes.node(n[d3]);
|
||||||
|
if (configNode && configNode.users.indexOf(n) === -1) {
|
||||||
|
configNode.users.push(n);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
for (i=0;i<new_subflows.length;i++) {
|
for (i=0;i<new_subflows.length;i++) {
|
||||||
n = new_subflows[i];
|
n = new_subflows[i];
|
||||||
|
@ -181,16 +181,16 @@ RED.editor = (function() {
|
|||||||
* @param property - the name of the field
|
* @param property - the name of the field
|
||||||
* @param type - the type of the config-node
|
* @param type - the type of the config-node
|
||||||
*/
|
*/
|
||||||
function prepareConfigNodeSelect(node,property,type) {
|
function prepareConfigNodeSelect(node,property,type,prefix) {
|
||||||
var input = $("#node-input-"+property);
|
var input = $("#"+prefix+"-"+property);
|
||||||
var node_def = RED.nodes.getType(type);
|
var node_def = RED.nodes.getType(type);
|
||||||
|
|
||||||
input.replaceWith('<select style="width: 60%;" id="node-input-'+property+'"></select>');
|
input.replaceWith('<select style="width: 60%;" id="'+prefix+'-'+property+'"></select>');
|
||||||
updateConfigNodeSelect(property,type,node[property]);
|
updateConfigNodeSelect(property,type,node[property],prefix);
|
||||||
var select = $("#node-input-"+property);
|
var select = $("#"+prefix+"-"+property);
|
||||||
select.after(' <a id="node-input-lookup-'+property+'" class="editor-button"><i class="fa fa-pencil"></i></a>');
|
select.after(' <a id="'+prefix+'-lookup-'+property+'" class="editor-button"><i class="fa fa-pencil"></i></a>');
|
||||||
$('#node-input-lookup-'+property).click(function(e) {
|
$('#'+prefix+'-lookup-'+property).click(function(e) {
|
||||||
showEditConfigNodeDialog(property,type,select.find(":selected").val());
|
showEditConfigNodeDialog(property,type,select.find(":selected").val(),prefix);
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
});
|
});
|
||||||
var label = "";
|
var label = "";
|
||||||
@ -211,12 +211,12 @@ RED.editor = (function() {
|
|||||||
* @param property - the name of the field
|
* @param property - the name of the field
|
||||||
* @param type - the type of the config-node
|
* @param type - the type of the config-node
|
||||||
*/
|
*/
|
||||||
function prepareConfigNodeButton(node,property,type) {
|
function prepareConfigNodeButton(node,property,type,prefix) {
|
||||||
var input = $("#node-input-"+property);
|
var input = $("#"+prefix+"-"+property);
|
||||||
input.val(node[property]);
|
input.val(node[property]);
|
||||||
input.attr("type","hidden");
|
input.attr("type","hidden");
|
||||||
|
|
||||||
var button = $("<a>",{id:"node-input-edit-"+property, class:"editor-button"});
|
var button = $("<a>",{id:prefix+"-edit-"+property, class:"editor-button"});
|
||||||
input.after(button);
|
input.after(button);
|
||||||
|
|
||||||
if (node[property]) {
|
if (node[property]) {
|
||||||
@ -226,7 +226,7 @@ RED.editor = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
button.click(function(e) {
|
button.click(function(e) {
|
||||||
showEditConfigNodeDialog(property,type,input.val()||"_ADD_");
|
showEditConfigNodeDialog(property,type,input.val()||"_ADD_",prefix);
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -347,9 +347,9 @@ RED.editor = (function() {
|
|||||||
var configTypeDef = RED.nodes.getType(definition.defaults[d].type);
|
var configTypeDef = RED.nodes.getType(definition.defaults[d].type);
|
||||||
if (configTypeDef) {
|
if (configTypeDef) {
|
||||||
if (configTypeDef.exclusive) {
|
if (configTypeDef.exclusive) {
|
||||||
prepareConfigNodeButton(node,d,definition.defaults[d].type);
|
prepareConfigNodeButton(node,d,definition.defaults[d].type,prefix);
|
||||||
} else {
|
} else {
|
||||||
prepareConfigNodeSelect(node,d,definition.defaults[d].type);
|
prepareConfigNodeSelect(node,d,definition.defaults[d].type,prefix);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
console.log("Unknown type:", definition.defaults[d].type);
|
console.log("Unknown type:", definition.defaults[d].type);
|
||||||
@ -670,8 +670,9 @@ RED.editor = (function() {
|
|||||||
* name - name of the property that holds this config node
|
* name - name of the property that holds this config node
|
||||||
* type - type of config node
|
* type - type of config node
|
||||||
* id - id of config node to edit. _ADD_ for a new one
|
* id - id of config node to edit. _ADD_ for a new one
|
||||||
|
* prefix - the input prefix of the parent property
|
||||||
*/
|
*/
|
||||||
function showEditConfigNodeDialog(name,type,id) {
|
function showEditConfigNodeDialog(name,type,id,prefix) {
|
||||||
var adding = (id == "_ADD_");
|
var adding = (id == "_ADD_");
|
||||||
var node_def = RED.nodes.getType(type);
|
var node_def = RED.nodes.getType(type);
|
||||||
var editing_config_node = RED.nodes.node(id);
|
var editing_config_node = RED.nodes.node(id);
|
||||||
@ -688,7 +689,7 @@ RED.editor = (function() {
|
|||||||
}
|
}
|
||||||
if (editing_config_node == null) {
|
if (editing_config_node == null) {
|
||||||
editing_config_node = {
|
editing_config_node = {
|
||||||
id: (1+Math.random()*4294967295).toString(16),
|
id: RED.nodes.id(),
|
||||||
_def: node_def,
|
_def: node_def,
|
||||||
type: type,
|
type: type,
|
||||||
z: activeWorkspace.id,
|
z: activeWorkspace.id,
|
||||||
@ -814,13 +815,37 @@ RED.editor = (function() {
|
|||||||
var d;
|
var d;
|
||||||
var input;
|
var input;
|
||||||
var scope = $("#node-config-dialog-scope").val();
|
var scope = $("#node-config-dialog-scope").val();
|
||||||
|
|
||||||
|
if (configTypeDef.oneditsave) {
|
||||||
|
configTypeDef.oneditsave.call(editing_config_node);
|
||||||
|
}
|
||||||
|
|
||||||
for (d in configTypeDef.defaults) {
|
for (d in configTypeDef.defaults) {
|
||||||
if (configTypeDef.defaults.hasOwnProperty(d)) {
|
if (configTypeDef.defaults.hasOwnProperty(d)) {
|
||||||
|
var newValue;
|
||||||
input = $("#node-config-input-"+d);
|
input = $("#node-config-input-"+d);
|
||||||
if (input.attr('type') === "checkbox") {
|
if (input.attr('type') === "checkbox") {
|
||||||
editing_config_node[d] = input.prop('checked');
|
newValue = input.prop('checked');
|
||||||
} else {
|
} else {
|
||||||
editing_config_node[d] = input.val();
|
newValue = input.val();
|
||||||
|
}
|
||||||
|
if (newValue !== editing_config_node[d]) {
|
||||||
|
if (editing_config_node._def.defaults[d].type) {
|
||||||
|
if (newValue == "_ADD_") {
|
||||||
|
newValue = "";
|
||||||
|
}
|
||||||
|
// Change to a related config node
|
||||||
|
var configNode = RED.nodes.node(editing_config_node[d]);
|
||||||
|
if (configNode) {
|
||||||
|
var users = configNode.users;
|
||||||
|
users.splice(users.indexOf(editing_config_node),1);
|
||||||
|
}
|
||||||
|
configNode = RED.nodes.node(newValue);
|
||||||
|
if (configNode) {
|
||||||
|
configNode.users.push(editing_config_node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
editing_config_node[d] = newValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -828,6 +853,8 @@ RED.editor = (function() {
|
|||||||
editing_config_node.z = scope;
|
editing_config_node.z = scope;
|
||||||
|
|
||||||
if (scope) {
|
if (scope) {
|
||||||
|
// Search for nodes that use this one that are no longer
|
||||||
|
// in scope, so must be removed
|
||||||
editing_config_node.users = editing_config_node.users.filter(function(n) {
|
editing_config_node.users = editing_config_node.users.filter(function(n) {
|
||||||
var keep = true;
|
var keep = true;
|
||||||
for (var d in n._def.defaults) {
|
for (var d in n._def.defaults) {
|
||||||
@ -836,6 +863,8 @@ RED.editor = (function() {
|
|||||||
n[d] === editing_config_node.id &&
|
n[d] === editing_config_node.id &&
|
||||||
n.z !== scope) {
|
n.z !== scope) {
|
||||||
keep = false;
|
keep = false;
|
||||||
|
// Remove the reference to this node
|
||||||
|
// and revalidate
|
||||||
n[d] = null;
|
n[d] = null;
|
||||||
n.dirty = true;
|
n.dirty = true;
|
||||||
n.changed = true;
|
n.changed = true;
|
||||||
@ -851,9 +880,6 @@ RED.editor = (function() {
|
|||||||
RED.nodes.add(editing_config_node);
|
RED.nodes.add(editing_config_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (configTypeDef.oneditsave) {
|
|
||||||
configTypeDef.oneditsave.call(editing_config_node);
|
|
||||||
}
|
|
||||||
if (configTypeDef.credentials) {
|
if (configTypeDef.credentials) {
|
||||||
updateNodeCredentials(editing_config_node,configTypeDef.credentials,"node-config-input");
|
updateNodeCredentials(editing_config_node,configTypeDef.credentials,"node-config-input");
|
||||||
}
|
}
|
||||||
@ -865,7 +891,7 @@ RED.editor = (function() {
|
|||||||
RED.nodes.dirty(true);
|
RED.nodes.dirty(true);
|
||||||
RED.view.redraw(true);
|
RED.view.redraw(true);
|
||||||
RED.tray.close(function() {
|
RED.tray.close(function() {
|
||||||
updateConfigNodeSelect(configProperty,configType,editing_config_node.id);
|
updateConfigNodeSelect(configProperty,configType,editing_config_node.id,prefix);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -937,7 +963,7 @@ RED.editor = (function() {
|
|||||||
RED.view.redraw();
|
RED.view.redraw();
|
||||||
RED.history.push(historyEvent);
|
RED.history.push(historyEvent);
|
||||||
RED.tray.close(function() {
|
RED.tray.close(function() {
|
||||||
updateConfigNodeSelect(configProperty,configType,"");
|
updateConfigNodeSelect(configProperty,configType,"",prefix);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -947,18 +973,20 @@ RED.editor = (function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
function updateConfigNodeSelect(name,type,value) {
|
function updateConfigNodeSelect(name,type,value,prefix) {
|
||||||
var button = $("#node-input-edit-"+name);
|
// if prefix is null, there is no config select to update
|
||||||
|
if (prefix) {
|
||||||
|
var button = $("#"+prefix+"-edit-"+name);
|
||||||
if (button.length) {
|
if (button.length) {
|
||||||
if (value) {
|
if (value) {
|
||||||
button.text(RED._("editor.configEdit"));
|
button.text(RED._("editor.configEdit"));
|
||||||
} else {
|
} else {
|
||||||
button.text(RED._("editor.configAdd"));
|
button.text(RED._("editor.configAdd"));
|
||||||
}
|
}
|
||||||
$("#node-input-"+name).val(value);
|
$("#"+prefix+"-"+name).val(value);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
var select = $("#node-input-"+name);
|
var select = $("#"+prefix+"-"+name);
|
||||||
var node_def = RED.nodes.getType(type);
|
var node_def = RED.nodes.getType(type);
|
||||||
select.children().remove();
|
select.children().remove();
|
||||||
|
|
||||||
@ -998,6 +1026,7 @@ RED.editor = (function() {
|
|||||||
window.setTimeout(function() { select.change();},50);
|
window.setTimeout(function() { select.change();},50);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function showEditSubflowDialog(subflow) {
|
function showEditSubflowDialog(subflow) {
|
||||||
var editing_node = subflow;
|
var editing_node = subflow;
|
||||||
|
@ -334,7 +334,7 @@ RED.view = (function() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var nn = { id:(1+Math.random()*4294967295).toString(16),z:RED.workspaces.active()};
|
var nn = { id:RED.nodes.id(),z:RED.workspaces.active()};
|
||||||
|
|
||||||
nn.type = selected_tool;
|
nn.type = selected_tool;
|
||||||
nn._def = RED.nodes.getType(nn.type);
|
nn._def = RED.nodes.getType(nn.type);
|
||||||
|
Loading…
Reference in New Issue
Block a user