mirror of
				https://github.com/node-red/node-red.git
				synced 2025-03-01 10:36:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			159 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			159 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| 
 | |
| <script type="text/x-red" data-template-name="template">
 | |
|     <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" data-i18n="[placeholder]common.label.name">
 | |
|     </div>
 | |
|     <div class="form-row">
 | |
|         <label for="node-input-field"><i class="fa fa-edit"></i> <span data-i18n="template.label.property"></span></label>
 | |
|         <input type="text" id="node-input-field" placeholder="payload" style="width:250px;">
 | |
|         <input type="hidden" id="node-input-fieldType">
 | |
|     </div>
 | |
|     <div class="form-row">
 | |
|         <label for="node-input-syntax"><i class="fa fa-code"></i> <span data-i18n="template.label.syntax"></span></label>
 | |
|         <select id="node-input-syntax" style="width:180px;">
 | |
|             <option value="mustache" data-i18n="template.label.mustache"></option>
 | |
|             <option value="plain" data-i18n="template.label.plain"></option>
 | |
|         </select>
 | |
|     </div>
 | |
| 
 | |
|     <div class="form-row" style="position: relative; margin-bottom: 0px;">
 | |
|         <label for="node-input-template"><i class="fa fa-file-code-o"></i> <span data-i18n="template.label.template"></span></label>
 | |
|         <input type="hidden" id="node-input-template" autofocus="autofocus">
 | |
|         <div style="position: absolute; right:0;display:inline-block; text-align: right; font-size: 0.8em;">
 | |
|             <span data-i18n="template.label.format"></span>:
 | |
|             <select id="node-input-format" style="width:110px; font-size: 10px !important;  height: 24px; padding:0;">
 | |
|                 <option value="handlebars">mustache</option>
 | |
|                 <option value="html">HTML</option>
 | |
|                 <option value="json">JSON</option>
 | |
|                 <option value="javascript">Javascript</option>
 | |
|                 <option value="css">CSS</option>
 | |
|                 <option value="markdown">Markdown</option>
 | |
|                 <option value="yaml">YAML</option>
 | |
|                 <option value="text" data-i18n="template.label.none"></option>
 | |
|             </select>
 | |
|         </div>
 | |
|     </div>
 | |
|     <div class="form-row node-text-editor-row">
 | |
|         <div style="height: 250px; min-height:150px;" class="node-text-editor" id="node-input-template-editor" ></div>
 | |
|     </div>
 | |
|     <div class="form-row">
 | |
|         <label for="node-input-output"><i class="fa fa-long-arrow-right"></i> <span data-i18n="template.label.output"></span></label>
 | |
|         <select id="node-input-output" style="width:180px;">
 | |
|             <option value="str" data-i18n="template.label.plain"></option>
 | |
|             <option value="json" data-i18n="template.label.json"></option>
 | |
|             <option value="yaml" data-i18n="template.label.yaml"></option>
 | |
|         </select>
 | |
|     </div>
 | |
| 
 | |
| </script>
 | |
| 
 | |
| <script type="text/x-red" data-help-name="template">
 | |
|     <p>Sets a property based on the provided template.</p>
 | |
|     <h3>Inputs</h3>
 | |
|     <dl class="message-properties">
 | |
|         <dt>msg <span class="property-type">object</span></dt>
 | |
|         <dd>A msg object containing information to populate the template.</dd>
 | |
|     </dl>
 | |
|     <h3>Outputs</h3>
 | |
|     <dl class="message-properties">
 | |
|         <dt>msg <span class="property-type">object</span></dt>
 | |
|         <dd>a msg with a property set by populating the configured template with properties from the incoming msg.</dd>
 | |
|     </dl>
 | |
|     <h3>Details</h3>
 | |
|     <p>By default this uses the <i><a href="http://mustache.github.io/mustache.5.html" target="_blank">mustache</a></i>
 | |
|     format, but this can be switched off if required.</p>
 | |
|     <p>For example, when a template of:
 | |
|     <pre>Hello {{payload.name}}. Today is {{date}}</pre>
 | |
|     <p>receives a message containing:
 | |
|     <pre>{
 | |
|   date: "Monday"
 | |
|   payload: {
 | |
|     name: "Fred",
 | |
|   }
 | |
| }</pre>
 | |
|     <p>The resulting property will be:
 | |
|     <pre>Hello Fred. Today is Monday</pre>
 | |
|     <p>It is possible to use a property from the flow context or global context. Just use <code>{{flow.name}}</code> or <code>{{global.name}}</code>.
 | |
|     <p><b>Note: </b>By default, <i>mustache</i> will escape any HTML entities in the values it substitutes.
 | |
|        To prevent this, use <code>{{{triple}}}</code> braces.
 | |
| </script>
 | |
| 
 | |
| <script type="text/javascript">
 | |
|     RED.nodes.registerType('template',{
 | |
|         color:"rgb(243, 181, 103)",
 | |
|         category: 'function',
 | |
|         defaults: {
 | |
|             name: {value:""},
 | |
|             field: {value:"payload", validate: RED.validators.typedInput("fieldType")},
 | |
|             fieldType: {value:"msg"},
 | |
|             format: {value:"handlebars"},
 | |
|             syntax: {value:"mustache"},
 | |
|             template: {value:"This is the payload: {{payload}} !"},
 | |
|             output: {value:"str"}
 | |
|         },
 | |
|         inputs:1,
 | |
|         outputs:1,
 | |
|         icon: "template.png",
 | |
|         label: function() {
 | |
|             return this.name;
 | |
|         },
 | |
|         oneditprepare: function() {
 | |
|             var that = this;
 | |
|             if (!this.fieldType) {
 | |
|                 this.fieldType = 'msg';
 | |
|             }
 | |
|             if (!this.syntax) {
 | |
|                 this.syntax = 'mustache';
 | |
|                 $("#node-input-syntax").val(this.syntax);
 | |
|             }
 | |
|             $("#node-input-field").typedInput({
 | |
|                 default: 'msg',
 | |
|                 types: ['msg','flow','global'],
 | |
|                 typeField: $("#node-input-fieldType")
 | |
|             });
 | |
| 
 | |
|             this.editor = RED.editor.createEditor({
 | |
|                 id: 'node-input-template-editor',
 | |
|                 mode: 'ace/mode/html',
 | |
|                 value: $("#node-input-template").val()
 | |
|             });
 | |
|             RED.library.create({
 | |
|                 url:"functions", // where to get the data from
 | |
|                 type:"function", // the type of object the library is for
 | |
|                 editor:that.editor, // the field name the main text body goes to
 | |
|                 fields:['name','outputs']
 | |
|             });
 | |
|             this.editor.focus();
 | |
| 
 | |
|             $("#node-input-format").change(function() {
 | |
|                 var mod = "ace/mode/"+$("#node-input-format").val();
 | |
|                 that.editor.getSession().setMode({
 | |
|                     path: mod,
 | |
|                     v: Date.now()
 | |
|                 });
 | |
|             });
 | |
|         },
 | |
|         oneditsave: function() {
 | |
|             $("#node-input-template").val(this.editor.getValue());
 | |
|             this.editor.destroy();
 | |
|             delete this.editor;
 | |
|         },
 | |
|         oneditcancel: function() {
 | |
|             this.editor.destroy();
 | |
|             delete this.editor;
 | |
|         },
 | |
|         oneditresize: function(size) {
 | |
|             var rows = $("#dialog-form>div:not(.node-text-editor-row)");
 | |
|             var height = $("#dialog-form").height();
 | |
|             for (var i=0; i<rows.size(); i++) {
 | |
|                 height -= $(rows[i]).outerHeight(true);
 | |
|             }
 | |
|             var editorRow = $("#dialog-form>div.node-text-editor-row");
 | |
|             height -= (parseInt(editorRow.css("marginTop"))+parseInt(editorRow.css("marginBottom")));
 | |
|             $(".node-text-editor").css("height",height+"px");
 | |
|             this.editor.resize();
 | |
|         }
 | |
|     });
 | |
| </script>
 |