diff --git a/red/runtime/nodes/flows/index.js b/red/runtime/nodes/flows/index.js index dfd3fb8fb..c52729cb8 100644 --- a/red/runtime/nodes/flows/index.js +++ b/red/runtime/nodes/flows/index.js @@ -257,12 +257,16 @@ function start(type,diff,muteLog) { var id; if (!diff) { if (!activeFlows['global']) { + log.debug("red/nodes/flows.start : starting flow : global"); activeFlows['global'] = Flow.create(activeFlowConfig); } for (id in activeFlowConfig.flows) { if (activeFlowConfig.flows.hasOwnProperty(id)) { - if (!activeFlows[id]) { + if (!activeFlowConfig.flows[id].disabled && !activeFlows[id]) { activeFlows[id] = Flow.create(activeFlowConfig,activeFlowConfig.flows[id]); + log.debug("red/nodes/flows.start : starting flow : "+id); + } else { + log.debug("red/nodes/flows.start : not starting disabled flow : "+id); } } } @@ -270,10 +274,15 @@ function start(type,diff,muteLog) { activeFlows['global'].update(activeFlowConfig,activeFlowConfig); for (id in activeFlowConfig.flows) { if (activeFlowConfig.flows.hasOwnProperty(id)) { - if (activeFlows[id]) { - activeFlows[id].update(activeFlowConfig,activeFlowConfig.flows[id]); + if (!activeFlowConfig.flows[id].disabled) { + if (activeFlows[id]) { + activeFlows[id].update(activeFlowConfig,activeFlowConfig.flows[id]); + } else { + activeFlows[id] = Flow.create(activeFlowConfig,activeFlowConfig.flows[id]); + log.debug("red/nodes/flows.start : starting flow : "+id); + } } else { - activeFlows[id] = Flow.create(activeFlowConfig,activeFlowConfig.flows[id]); + log.debug("red/nodes/flows.start : not starting disabled flow : "+id); } } } @@ -325,8 +334,9 @@ function stop(type,diff,muteLog) { } for (var id in activeFlows) { if (activeFlows.hasOwnProperty(id)) { - promises = promises.concat(activeFlows[id].stop(stopList)); - if (!diff || diff.removed.indexOf(id)!==-1) { + var flowStateChanged = diff && (diff.added.indexOf(id) !== -1 || diff.removed.indexOf(id) !== -1); + promises = promises.concat(activeFlows[id].stop(flowStateChanged?null:stopList)); + if (!diff || flowStateChanged || diff.removed.indexOf(id)!==-1) { delete activeFlows[id]; } } diff --git a/red/runtime/nodes/flows/util.js b/red/runtime/nodes/flows/util.js index a8d877004..cf5f91def 100644 --- a/red/runtime/nodes/flows/util.js +++ b/red/runtime/nodes/flows/util.js @@ -196,60 +196,84 @@ module.exports = { var linkMap = {}; + var changedTabs = {}; + + // Look for tabs that have been disabled + for (id in oldConfig.flows) { + if (oldConfig.flows.hasOwnProperty(id) && newConfig.flows.hasOwnProperty(id)) { + var originalState = oldConfig.flows[id].disabled||false; + var newState = newConfig.flows[id].disabled||false; + if (originalState !== newState) { + changedTabs[id] = true; + if (originalState) { + added[id] = oldConfig.allNodes[id]; + } else { + removed[id] = oldConfig.allNodes[id]; + } + } + } + } + for (id in oldConfig.allNodes) { if (oldConfig.allNodes.hasOwnProperty(id)) { node = oldConfig.allNodes[id]; - // build the map of what this node was previously wired to - if (node.wires) { - linkMap[node.id] = linkMap[node.id] || []; - for (j=0;j