mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	Add timestamp as a default typedInput
and update Inject and change nodes to match, and add some tests.
This commit is contained in:
		| @@ -22,7 +22,8 @@ | ||||
|         num: {value:"num",label:"number",icon:"red/images/typedInput/09.png",validate:/^[+-]?[0-9]*\.?[0-9]*([eE][-+]?[0-9]+)?$/}, | ||||
|         bool: {value:"bool",label:"boolean",icon:"red/images/typedInput/bool.png",options:["true","false"]}, | ||||
|         json: {value:"json",label:"JSON",icon:"red/images/typedInput/json.png", validate: function(v) { try{JSON.parse(v);return true;}catch(e){return false;}}}, | ||||
|         re: {value:"re",label:"regular expression",icon:"red/images/typedInput/re.png"} | ||||
|         re: {value:"re",label:"regular expression",icon:"red/images/typedInput/re.png"}, | ||||
|         date: {value:"date",label:"timestamp",hasValue:false} | ||||
|     }; | ||||
|     var nlsd = false; | ||||
|  | ||||
|   | ||||
| @@ -242,7 +242,7 @@ | ||||
|             $("#node-input-payload").typedInput({ | ||||
|                 default: 'str', | ||||
|                 typeField: $("#node-input-payloadType"), | ||||
|                 types:['flow','global','str','num','bool','json',{value:"date",label:this._("inject.timestamp"),hasValue:false}] | ||||
|                 types:['flow','global','str','num','bool','json','date'] | ||||
|             }); | ||||
|  | ||||
|             $("#inject-time-type-select").change(function() { | ||||
|   | ||||
| @@ -46,7 +46,7 @@ module.exports = function(RED) { | ||||
|         } | ||||
|  | ||||
|         if (this.once) { | ||||
|             setTimeout( function(){ node.emit("input",{}); }, 100); | ||||
|             setTimeout( function() { node.emit("input",{}); }, 100 ); | ||||
|         } | ||||
|  | ||||
|         this.on("input",function(msg) { | ||||
|   | ||||
| @@ -206,10 +206,10 @@ module.exports = function(RED) { | ||||
|                 } | ||||
|             }); | ||||
|             this.on("close", function() { | ||||
|                 while(node.outstandingTimers.length > 0) { | ||||
|                 while (node.outstandingTimers.length > 0) { | ||||
|                     clearTimeout(node.outstandingTimers.pop()) | ||||
|                 } | ||||
|                 while(node.outstandingIntervals.length > 0) { | ||||
|                 while (node.outstandingIntervals.length > 0) { | ||||
|                     clearInterval(node.outstandingIntervals.pop()) | ||||
|                 } | ||||
|             }) | ||||
|   | ||||
| @@ -17,14 +17,14 @@ | ||||
| <script type="text/x-red" data-template-name="change"> | ||||
|     <div class="form-row"> | ||||
|         <label for="node-input-name"><i class="fa fa-tag"></i> <span data-i18n="common.label.name"></span></label> | ||||
|         <input type="text" id="node-input-name" style="width: 370px;" data-i18n="[placeholder]common.label.name"> | ||||
|         <input type="text" id="node-input-name" style="width:370px;" data-i18n="[placeholder]common.label.name"> | ||||
|     </div> | ||||
|     <div class="form-row" style="margin-bottom:0;"> | ||||
|         <label><i class="fa fa-list"></i> <span data-i18n="change.label.rules"></span></label> | ||||
|     </div> | ||||
|     <div class="form-row node-input-rule-container-row" style="margin-bottom: 0px;"> | ||||
|         <div id="node-input-rule-container-div" style="box-sizing: border-box; border-radius: 5px; height: 300px; padding: 5px; border: 1px solid #ccc; overflow-y:scroll;"> | ||||
|             <ol id="node-input-rule-container" style=" list-style-type:none; margin: 0;"></ol> | ||||
|     <div class="form-row node-input-rule-container-row" style="margin-bottom:0px;"> | ||||
|         <div id="node-input-rule-container-div" style="box-sizing:border-box; border-radius:5px; height:300px; padding:5px; border:1px solid #ccc; overflow-y:scroll;"> | ||||
|             <ol id="node-input-rule-container" style=" list-style-type:none; margin:0;"></ol> | ||||
|         </div> | ||||
|     </div> | ||||
|     <div class="form-row"> | ||||
| @@ -123,54 +123,54 @@ | ||||
|                     rule.tot = "msg"; | ||||
|                 } | ||||
|  | ||||
|                 var container = $('<li/>',{style:"background: #fff; margin:0; padding:8px 0px; border-bottom: 1px solid #ccc;"}); | ||||
|                 var container = $('<li/>',{style:"background:#fff; margin:0; padding:8px 0px; border-bottom:1px solid #ccc;"}); | ||||
|                 var row1 = $('<div/>').appendTo(container); | ||||
|                 var row2 = $('<div/>',{style:"margin-top:8px;"}).appendTo(container); | ||||
|                 var row3 = $('<div/>',{style:"margin-top:8px;"}).appendTo(container); | ||||
|                 var row4 = $('<div/>',{style:"margin-top:8px;"}).appendTo(container); | ||||
|  | ||||
|                 var selectField = $('<select/>',{class:"node-input-rule-type",style:"width: 110px; margin-right: 10px;"}).appendTo(row1); | ||||
|                 var selectField = $('<select/>',{class:"node-input-rule-type",style:"width:110px; margin-right:10px;"}).appendTo(row1); | ||||
|                 var selectOptions = [{v:"set",l:set},{v:"change",l:change},{v:"delete",l:del},{v:"move",l:move}]; | ||||
|                 for (var i=0;i<4;i++) { | ||||
|                     selectField.append($("<option></option>").val(selectOptions[i].v).text(selectOptions[i].l)); | ||||
|                 } | ||||
|  | ||||
|                 var propertyName = $('<input/>',{style:"width: 250px",class:"node-input-rule-property-name",type:"text"}) | ||||
|                 var propertyName = $('<input/>',{style:"width:250px",class:"node-input-rule-property-name",type:"text"}) | ||||
|                     .appendTo(row1) | ||||
|                     .typedInput({types:['msg','flow','global']}); | ||||
|                 var finalspan = $('<span/>',{style:"float: right; margin-right: 10px;"}) | ||||
|                 var finalspan = $('<span/>',{style:"float:right; margin-right:10px;"}) | ||||
|                     .appendTo(row1); | ||||
|                 var deleteButton = $('<a/>',{href:"#",class:"editor-button editor-button-small", style:"margin-top: 7px; margin-left: 5px;"}) | ||||
|                 var deleteButton = $('<a/>',{href:"#",class:"editor-button editor-button-small", style:"margin-top:7px; margin-left:5px;"}) | ||||
|                     .appendTo(finalspan); | ||||
|                 $('<i/>',{class:"fa fa-remove"}).appendTo(deleteButton); | ||||
|  | ||||
|                 $('<div/>',{style:"display: inline-block;text-align:right; width:120px;padding-right: 10px; box-sizing: border-box;"}) | ||||
|                 $('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"}) | ||||
|                     .text(to) | ||||
|                     .appendTo(row2); | ||||
|                 var propertyValue = $('<input/>',{style:"width: 250px",class:"node-input-rule-property-value",type:"text"}) | ||||
|                 var propertyValue = $('<input/>',{style:"width:250px",class:"node-input-rule-property-value",type:"text"}) | ||||
|                     .appendTo(row2) | ||||
|                     .typedInput({default:'str',types:['msg','flow','global','str','num','bool','json']}); | ||||
|                     .typedInput({default:'str',types:['msg','flow','global','str','num','bool','json','date']}); | ||||
|  | ||||
|                 var row3_1 = $('<div/>').appendTo(row3); | ||||
|                 $('<div/>',{style:"display: inline-block;text-align:right; width:120px;padding-right: 10px; box-sizing: border-box;"}) | ||||
|                 $('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"}) | ||||
|                     .text(search) | ||||
|                     .appendTo(row3_1); | ||||
|                 var fromValue = $('<input/>',{style:"width: 250px",class:"node-input-rule-property-search-value",type:"text"}) | ||||
|                 var fromValue = $('<input/>',{style:"width:250px",class:"node-input-rule-property-search-value",type:"text"}) | ||||
|                     .appendTo(row3_1) | ||||
|                     .typedInput({default:'str',types:['msg','flow','global','str','re','num','bool']}); | ||||
|  | ||||
|                 var row3_2 = $('<div/>',{style:"margin-top:8px;"}).appendTo(row3); | ||||
|                 $('<div/>',{style:"display: inline-block;text-align:right; width:120px;padding-right: 10px; box-sizing: border-box;"}) | ||||
|                 $('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"}) | ||||
|                     .text(replace) | ||||
|                     .appendTo(row3_2); | ||||
|                 var toValue = $('<input/>',{style:"width: 250px",class:"node-input-rule-property-replace-value",type:"text"}) | ||||
|                 var toValue = $('<input/>',{style:"width:250px",class:"node-input-rule-property-replace-value",type:"text"}) | ||||
|                     .appendTo(row3_2) | ||||
|                     .typedInput({default:'str',types:['msg','flow','global','str','num','bool','json']}); | ||||
|  | ||||
|                 $('<div/>',{style:"display: inline-block;text-align:right; width:120px;padding-right: 10px; box-sizing: border-box;"}) | ||||
|                 $('<div/>',{style:"display:inline-block;text-align:right; width:120px; padding-right:10px; box-sizing:border-box;"}) | ||||
|                     .text(to) | ||||
|                     .appendTo(row4); | ||||
|                 var moveValue = $('<input/>',{style:"width: 250px",class:"node-input-rule-property-move-value",type:"text"}) | ||||
|                 var moveValue = $('<input/>',{style:"width:250px",class:"node-input-rule-property-move-value",type:"text"}) | ||||
|                     .appendTo(row4) | ||||
|                     .typedInput({default:'msg',types:['msg','flow','global']}); | ||||
|  | ||||
|   | ||||
| @@ -100,6 +100,8 @@ module.exports = function(RED) { | ||||
|                     value = node.context().flow.get(rule.to); | ||||
|                 } else if (rule.tot === 'global') { | ||||
|                     value = node.context().global.get(rule.to); | ||||
|                 } else if (rule.tot === 'date') { | ||||
|                     value = Date.now(); | ||||
|                 } | ||||
|                 if (rule.t === 'change') { | ||||
|                     if (rule.fromt === 'msg' || rule.fromt === 'flow' || rule.fromt === 'global') { | ||||
|   | ||||
| @@ -222,7 +222,8 @@ | ||||
|             "num": "number", | ||||
|             "re": "regular expression", | ||||
|             "bool": "boolean", | ||||
|             "json": "JSON" | ||||
|             "json": "JSON", | ||||
|             "date": "timestamp" | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -62,7 +62,6 @@ module.exports = { | ||||
|         } | ||||
|         themeSettings = null; | ||||
|         theme = settings.editorTheme; | ||||
|  | ||||
|     }, | ||||
|  | ||||
|     app: function() { | ||||
|   | ||||
| @@ -182,6 +182,8 @@ function evaluateNodeProperty(value, type, node, msg) { | ||||
|         return JSON.parse(value); | ||||
|     } else if (type === 're') { | ||||
|         return new RegExp(value); | ||||
|     } else if (type === 'date') { | ||||
|         return Date.now(); | ||||
|     } else if (type === 'msg' && msg) { | ||||
|         return getMessageProperty(msg,value); | ||||
|     } else if (type === 'flow' && node) { | ||||
|   | ||||
| @@ -242,7 +242,6 @@ describe('change Node', function() { | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|  | ||||
|         it('changes the value to a number', function(done) { | ||||
|             var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"set","p":"payload","to":"123","tot":"num"}],"name":"changeNode","wires":[["helperNode1"]]}, | ||||
|                         {id:"helperNode1", type:"helper", wires:[]}]; | ||||
| @@ -260,6 +259,7 @@ describe('change Node', function() { | ||||
|                 changeNode1.receive({payload:""}); | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|         it('changes the value to a js object', function(done) { | ||||
|             var flow = [{"id":"changeNode1","type":"change",rules:[{"t":"set","p":"payload","to":'{"a":123}',"tot":"json"}],"name":"changeNode","wires":[["helperNode1"]]}, | ||||
|                         {id:"helperNode1", type:"helper", wires:[]}]; | ||||
| @@ -278,6 +278,24 @@ describe('change Node', function() { | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|         it('sets the value of the message property to the current timestamp', function(done) { | ||||
|             var flow = [{"id":"changeNode1","type":"change","rules":[{"t":"set","p":"ts","pt":"msg","to":"","tot":"date"}],"name":"changeNode","wires":[["helperNode1"]]}, | ||||
|                         {id:"helperNode1", type:"helper", wires:[]}]; | ||||
|             helper.load(changeNode, flow, function() { | ||||
|                 var changeNode1 = helper.getNode("changeNode1"); | ||||
|                 var helperNode1 = helper.getNode("helperNode1"); | ||||
|                 var rule = helper.getNode("changeNode1").rules[0]; | ||||
|                 helperNode1.on("input", function(msg) { | ||||
|                     try { | ||||
|                         (Date.now() - msg.ts).should.be.approximately(0,50); | ||||
|                         done(); | ||||
|                     } catch(err) { | ||||
|                         done(err); | ||||
|                     } | ||||
|                 }); | ||||
|                 changeNode1.receive({payload:Date.now()}); | ||||
|             }); | ||||
|         }); | ||||
|  | ||||
|     }); | ||||
|     describe('#change', function() { | ||||
|   | ||||
| @@ -210,6 +210,10 @@ describe("red/util", function() { | ||||
|             var result = util.evaluateNodeProperty('^abc$','re'); | ||||
|             result.toString().should.eql("/^abc$/"); | ||||
|         }); | ||||
|         it('returns date',function() { | ||||
|             var result = util.evaluateNodeProperty('','date'); | ||||
|             (Date.now() - result).should.be.approximately(0,50); | ||||
|         }); | ||||
|         it('returns msg property',function() { | ||||
|             var result = util.evaluateNodeProperty('foo.bar','msg',{},{foo:{bar:"123"}}); | ||||
|             result.should.eql("123"); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user