mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Merge branch 'master' into dev
This commit is contained in:
		| @@ -474,7 +474,7 @@ var RED = (function() { | ||||
|             var parts = topic.split("/"); | ||||
|             var node = RED.nodes.node(parts[1]); | ||||
|             if (node) { | ||||
|                 if (msg.hasOwnProperty("text") && msg.text !== null && /^[a-zA-Z]/.test(msg.text)) { | ||||
|                 if (msg.hasOwnProperty("text") && msg.text !== null && /^[@a-zA-Z]/.test(msg.text)) { | ||||
|                     msg.text = node._(msg.text.toString(),{defaultValue:msg.text.toString()}); | ||||
|                 } | ||||
|                 node.status = msg; | ||||
|   | ||||
| @@ -320,18 +320,22 @@ RED.deploy = (function() { | ||||
|         }); | ||||
|     } | ||||
|     function save(skipValidation, force) { | ||||
|         if (!$("#red-ui-header-button-deploy").hasClass("disabled")) { | ||||
|         if ($("#red-ui-header-button-deploy").hasClass("disabled")) { | ||||
|             return; //deploy is disabled | ||||
|         } | ||||
|         if ($("#red-ui-header-shade").is(":visible")) { | ||||
|             return; //deploy is shaded | ||||
|         } | ||||
|         if (!RED.user.hasPermission("flows.write")) { | ||||
|             RED.notify(RED._("user.errors.deploy"), "error"); | ||||
|             return; | ||||
|         } | ||||
|         let hasUnusedConfig = false; | ||||
|         if (!skipValidation) { | ||||
|                 var hasUnknown = false; | ||||
|                 var hasInvalid = false; | ||||
|                 var hasUnusedConfig = false; | ||||
|  | ||||
|                 var unknownNodes = []; | ||||
|                 var invalidNodes = []; | ||||
|             let hasUnknown = false; | ||||
|             let hasInvalid = false; | ||||
|             const unknownNodes = []; | ||||
|             const invalidNodes = []; | ||||
|  | ||||
|             RED.nodes.eachConfig(function (node) { | ||||
|                 if (node.valid === undefined) { | ||||
| @@ -359,7 +363,7 @@ RED.deploy = (function() { | ||||
|             hasUnknown = unknownNodes.length > 0; | ||||
|             hasInvalid = invalidNodes.length > 0; | ||||
|  | ||||
|                 var unusedConfigNodes = []; | ||||
|             const unusedConfigNodes = []; | ||||
|             RED.nodes.eachConfig(function (node) { | ||||
|                 if ((node._def.hasUsers !== false) && (node.users.length === 0)) { | ||||
|                     unusedConfigNodes.push(getNodeInfo(node)); | ||||
| @@ -367,10 +371,10 @@ RED.deploy = (function() { | ||||
|                 } | ||||
|             }); | ||||
|  | ||||
|                 var showWarning = false; | ||||
|                 var notificationMessage; | ||||
|                 var notificationButtons = []; | ||||
|                 var notification; | ||||
|             let showWarning = false; | ||||
|             let notificationMessage; | ||||
|             let notificationButtons = []; | ||||
|             let notification; | ||||
|             if (hasUnknown && !ignoreDeployWarnings.unknown) { | ||||
|                 showWarning = true; | ||||
|                 notificationMessage = "<p>" + RED._('deploy.confirm.unknown') + "</p>" + | ||||
| @@ -427,14 +431,14 @@ RED.deploy = (function() { | ||||
|             } | ||||
|         } | ||||
|  | ||||
|             var nns = RED.nodes.createCompleteNodeSet(); | ||||
|         const nns = RED.nodes.createCompleteNodeSet(); | ||||
|         const startTime = Date.now(); | ||||
|  | ||||
|             var startTime = Date.now(); | ||||
|         $(".red-ui-deploy-button-content").css('opacity', 0); | ||||
|         $(".red-ui-deploy-button-spinner").show(); | ||||
|         $("#red-ui-header-button-deploy").addClass("disabled"); | ||||
|  | ||||
|             var data = {flows:nns}; | ||||
|         const data = { flows: nns }; | ||||
|  | ||||
|         if (!force) { | ||||
|             data.rev = RED.nodes.version(); | ||||
| @@ -507,7 +511,7 @@ RED.deploy = (function() { | ||||
|             } | ||||
|         }).always(function () { | ||||
|             deployInflight = false; | ||||
|                 var delta = Math.max(0,300-(Date.now()-startTime)); | ||||
|             const delta = Math.max(0, 300 - (Date.now() - startTime)); | ||||
|             setTimeout(function () { | ||||
|                 $(".red-ui-deploy-button-content").css('opacity', 1); | ||||
|                 $(".red-ui-deploy-button-spinner").hide(); | ||||
| @@ -518,7 +522,6 @@ RED.deploy = (function() { | ||||
|             }, delta); | ||||
|         }); | ||||
|     } | ||||
|     } | ||||
|     return { | ||||
|         init: init, | ||||
|         setDeployInflight: function(state) { | ||||
|   | ||||
| @@ -168,7 +168,7 @@ | ||||
|                 'b': { before:"**", after: "**", tooltip: RED._("markdownEditor.bold")}, | ||||
|                 'i': { before:"_", after: "_", tooltip: RED._("markdownEditor.italic")}, | ||||
|                 'code': { before:"`", after: "`", tooltip: RED._("markdownEditor.code")}, | ||||
|                 'ol': { before:" * ", newline: true, tooltip: RED._("markdownEditor.ordered-list")}, | ||||
|                 'ol': { before:" 1. ", newline: true, tooltip: RED._("markdownEditor.ordered-list")}, | ||||
|                 'ul': { before:" - ", newline: true, tooltip: RED._("markdownEditor.unordered-list")}, | ||||
|                 'bq': { before:"> ", newline: true, tooltip: RED._("markdownEditor.quote")}, | ||||
|                 'link': { before:"[", after: "]()", tooltip: RED._("markdownEditor.link")}, | ||||
|   | ||||
| @@ -150,7 +150,6 @@ $popover-button-border-color-hover: #666; | ||||
|  | ||||
| $diff-text-header-color: $secondary-text-color; | ||||
| $diff-text-header-background: #ffd; | ||||
| $diff-text-header-background-hover: #ffc; | ||||
| $diff-state-color: $primary-text-color; | ||||
| $diff-state-prefix-color: $secondary-text-color; | ||||
| $diff-state-added: #009900; | ||||
| @@ -195,7 +194,6 @@ $view-lasso-stroke: #ff7f0e; | ||||
| $view-lasso-fill: rgba(20,125,255,0.1); | ||||
|  | ||||
| $view-background: $secondary-background; | ||||
| $view-select-mode-background: $secondary-background-selected; | ||||
| $view-grid-color: #eee; | ||||
|  | ||||
| $node-label-color: #333; | ||||
|   | ||||
| @@ -26,6 +26,13 @@ | ||||
|     box-shadow: none; | ||||
| } | ||||
|  | ||||
| .ui-widget.ui-widget-content { | ||||
| 	border: 1px solid $tertiary-border-color; | ||||
| } | ||||
| .ui-widget-content { | ||||
| 	border: 1px solid $secondary-border-color; | ||||
| } | ||||
|  | ||||
| .ui-widget-header { | ||||
|     color: $header-text-color; | ||||
| } | ||||
|   | ||||
| @@ -58,7 +58,6 @@ | ||||
| .red-ui-workspace-select-mode { | ||||
|     .red-ui-workspace-chart-background { | ||||
|         opacity: 0.7; | ||||
|         //        fill: $view-select-mode-background; | ||||
|     } | ||||
|     .red-ui-workspace-chart-grid line { | ||||
|         opacity: 0.8; | ||||
|   | ||||
| @@ -108,7 +108,9 @@ module.exports = function(RED) { | ||||
|             } | ||||
|         }) | ||||
|         this.on("input", function(msg, send, done) { | ||||
|             if (hasOwnProperty.call(msg, "status") && hasOwnProperty.call(msg.status, "source") && hasOwnProperty.call(msg.status.source, "id") && (msg.status.source.id === node.id)) { | ||||
|             if (hasOwnProperty.call(msg, "status") && msg.status && | ||||
|                 hasOwnProperty.call(msg.status, "source") && msg.status.source && | ||||
|                 hasOwnProperty.call(msg.status.source, "id") && (msg.status.source.id === node.id)) { | ||||
|                 done(); | ||||
|                 return; | ||||
|             } | ||||
| @@ -129,7 +131,8 @@ module.exports = function(RED) { | ||||
|                             fill = "red"; | ||||
|                             st = msg.error.message; | ||||
|                         } | ||||
|                         if (hasOwnProperty.call(msg, "status")) { | ||||
|                         if (hasOwnProperty.call(msg, "status") && | ||||
|                            msg.status) { | ||||
|                             fill = msg.status.fill || "grey"; | ||||
|                             shape = msg.status.shape || "ring"; | ||||
|                             st = msg.status.text || ""; | ||||
|   | ||||
| @@ -35,8 +35,6 @@ module.exports = function(RED) { | ||||
|         } | ||||
|     } | ||||
|     var listenerNodes = {}; | ||||
|     var activeListenerNodes = 0; | ||||
|  | ||||
|  | ||||
|     // A node red node that sets up a local websocket server | ||||
|     function WebSocketListenerNode(n) { | ||||
| @@ -166,7 +164,6 @@ module.exports = function(RED) { | ||||
|         } | ||||
|  | ||||
|         if (node.isServer) { | ||||
|             activeListenerNodes++; | ||||
|             if (!serverUpgradeAdded) { | ||||
|                 RED.server.on('upgrade', handleServerUpgrade); | ||||
|                 serverUpgradeAdded = true | ||||
| @@ -210,7 +207,7 @@ module.exports = function(RED) { | ||||
|             startconn(); // start outbound connection | ||||
|         } | ||||
|  | ||||
|         node.on("close", function() { | ||||
|         node.on("close", function(done) { | ||||
|             if (node.heartbeatInterval) { | ||||
|                 clearInterval(node.heartbeatInterval); | ||||
|             } | ||||
| @@ -218,19 +215,25 @@ module.exports = function(RED) { | ||||
|                 delete listenerNodes[node.fullPath]; | ||||
|                 node.server.close(); | ||||
|                 node._inputNodes = []; | ||||
|                 activeListenerNodes--; | ||||
|                 // if (activeListenerNodes === 0 && serverUpgradeAdded) { | ||||
|                 //     RED.server.removeListener('upgrade', handleServerUpgrade); | ||||
|                 //     serverUpgradeAdded = false; | ||||
|                 // } | ||||
|             } | ||||
|             else { | ||||
|                 node.closing = true; | ||||
|                 node.server.close(); | ||||
|                 //wait 20*50 (1000ms max) for ws to close.  | ||||
|                 //call done when readyState === ws.CLOSED (or 1000ms, whichever comes fist) | ||||
|                 const closeMonitorInterval = 20; | ||||
|                 let closeMonitorCount = 50; | ||||
|                 let si = setInterval(() => { | ||||
|                     if(node.server.readyState === ws.CLOSED || closeMonitorCount <= 0) { | ||||
|                         if (node.tout) { | ||||
|                             clearTimeout(node.tout); | ||||
|                             node.tout = null; | ||||
|                         } | ||||
|                         clearInterval(si); | ||||
|                         return done(); | ||||
|                     } | ||||
|                     closeMonitorCount--; | ||||
|                 }, closeMonitorInterval); | ||||
|             } | ||||
|         }); | ||||
|     } | ||||
|   | ||||
| @@ -582,7 +582,7 @@ class Flow { | ||||
|             reportingNode = node; | ||||
|         } | ||||
|         if (!muteStatusEvent) { | ||||
|             if (statusMessage.hasOwnProperty("text") && typeof(statusMessage.text !== "string")) { | ||||
|             if (statusMessage.hasOwnProperty("text") && typeof statusMessage.text !== "string") { | ||||
|                 try { | ||||
|                     statusMessage.text = statusMessage.text.toString(); | ||||
|                 } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user