@theotherwillembotha/node-red-plugincore 0.0.55 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (42) hide show
  1. package/README.md +5 -2
  2. package/build/Nodes.html +23 -21
  3. package/build/Plugins.js +0 -1
  4. package/build/core/NodeConstructor.d.ts +1 -0
  5. package/build/core/NodeConstructor.d.ts.map +1 -1
  6. package/build/core/NodeConstructor.js +5 -12
  7. package/build/core/NodeGenerator.d.ts.map +1 -1
  8. package/build/core/NodeGenerator.js +0 -1
  9. package/build/core/webhook/WebhookDecorator.d.ts.map +1 -1
  10. package/build/core/webhook/WebhookDecorator.js +43 -6
  11. package/build/core/webhook/service/ReverseProxyTypeService.d.ts +1 -0
  12. package/build/core/webhook/service/ReverseProxyTypeService.d.ts.map +1 -1
  13. package/build/core/webhook/service/WebhookServerService.d.ts.map +1 -1
  14. package/build/core/webhook/service/WebhookServerService.js +0 -5
  15. package/package.json +2 -3
  16. package/src/core/NodeConstructor.ts +6 -13
  17. package/src/core/NodeGenerator.ts +0 -1
  18. package/src/core/logger/template/LoggerTemplate.html +2 -2
  19. package/src/core/metrics/node/TimerMetricConfigNode.html +2 -2
  20. package/src/core/other/template/BasicTemplate.html +5 -2
  21. package/src/core/webhook/WebhookDecorator.ts +53 -10
  22. package/src/core/webhook/service/ReverseProxyTypeService.ts +1 -0
  23. package/src/core/webhook/service/WebhookServerService.ts +0 -5
  24. package/src/core/webhook/template/WebhookTemplate.html +1 -1
  25. package/build/core/logger/node/ConsoleLoggerConfigNode.html +0 -90
  26. package/build/core/logger/node/RestLoggerConfigNode.html +0 -183
  27. package/build/core/logger/template/LoggerTemplate.html +0 -331
  28. package/build/core/metrics/node/CounterMetricConfigNode.html +0 -48
  29. package/build/core/metrics/node/GaugeMetricConfigNode.html +0 -48
  30. package/build/core/metrics/node/MetricsConfigNode.html +0 -21
  31. package/build/core/metrics/node/TimerMetricConfigNode.html +0 -190
  32. package/build/core/metrics/template/CounterMetricTemplate.html +0 -40
  33. package/build/core/metrics/template/GaugeMetricTemplate.html +0 -39
  34. package/build/core/metrics/template/MetricsTemplate.html +0 -54
  35. package/build/core/metrics/template/TimerMetricTemplate.html +0 -39
  36. package/build/core/other/node/DelegatedConfigReferenceNode.html +0 -1
  37. package/build/core/other/template/BasicTemplate.html +0 -76
  38. package/build/core/other/template/SettingsTemplate.html +0 -128
  39. package/build/core/ui/template/ScriptEditorTemplate.html +0 -50
  40. package/build/core/ui/template/UIHelperTemplate.html +0 -229
  41. package/build/core/webhook/node/WebhookServerConfigNode.html +0 -61
  42. package/build/core/webhook/template/WebhookTemplate.html +0 -442
@@ -95,7 +95,6 @@ export class WebhookServer {
95
95
  this._app.post(endpoint.path, handlerChain);
96
96
  }
97
97
 
98
- console.log("added endpoint to " + endpoint.path);
99
98
  }
100
99
 
101
100
  public detach(configuration:EndpointConfig){
@@ -116,8 +115,6 @@ export class WebhookServer {
116
115
  })
117
116
  });
118
117
 
119
- console.log("ROUTES REMOVED!");
120
- this._app.router.stack.forEach(route => console.log("KNOWN ROUTE", route, route.route?.path, (route.route as any).methods.post));
121
118
  }
122
119
 
123
120
  public config():WebhookServerConfig {
@@ -161,7 +158,6 @@ export class WebhookServerService extends BaseService {
161
158
  // compare the properties.
162
159
  if(!webhookServerNode){
163
160
  // the node has been removed: TODO: alert the listeners that it has been removed.
164
- console.log("Webhook Service Removed", serverServiceConfig)
165
161
  removedServers.push(serverServiceConfig);
166
162
  }
167
163
  else{
@@ -173,7 +169,6 @@ export class WebhookServerService extends BaseService {
173
169
 
174
170
  if(serviceChanged){
175
171
  // TODO: notify the subscribers that the server has chaned.
176
- console.log("Notify the subscribers WebhookServer has changed.", serverServiceConfig, webhookServerNode);
177
172
  removedServers.push(serverServiceConfig);
178
173
  addedServers.push(webhookServerNode);
179
174
  }
@@ -11,7 +11,7 @@ node
11
11
  .addDefault('webhookAuth_apikey_key', {value:"x-api-key", required:false})
12
12
  .addDefault('webhookAuth_apikey_value', {value:"testkey", required:false})
13
13
  .addDefault('reverseProxies_enabled', {required:false})
14
- .addDefault('reverseProxies_connections', { type:"ReverseProxyType[]", maxInstances:10})
14
+ .addDefault('reverseProxies_connections', { type:"DelegatedConfigReferenceNode", list:true, maxInstances:10})
15
15
  </script>
16
16
 
17
17
  <div template-section="onIncludeOnce">
@@ -1,90 +0,0 @@
1
-
2
- <script type="text/javascript" template-section="onCompose">
3
- node
4
- .addDefault("name", {value:"Logger Example", required:true})
5
- .addDefault("platform", {value:"rest", required:true})
6
- .addDefault("template", {value:`message:{{msg}}`, required:true})
7
- .addDefault("level", {value:"info", required:true})
8
- .setPaletteLabel("Console Logger Config Node")
9
- .setLabel(function() {return this.name })
10
- </script>
11
-
12
- <script type="text/javascript" template-section="onIncludeEditPrepare">
13
- {
14
- let node = this;
15
-
16
- let levelSelection = $("#node-config-input-level");
17
- levelSelection.typedInput({type:"level", types:[{
18
- value: "level",
19
- options: [
20
- { value: "DEBUG", label: "debug"},
21
- { value: "INFO", label: "info"},
22
- { value: "WARNING", label: "warning"},
23
- { value: "ERROR", label: "error"},
24
- ]
25
- }]});
26
-
27
- this.editor = RED.editor.createEditor({
28
- id: 'node-config-input-templateEditor',
29
- mode: 'ace/mode/handlebars',
30
- value: this.template
31
- });
32
- }
33
- </script>
34
-
35
- <script type="text/javascript" template-section="onIncludeEditSave">
36
- {
37
- let node = this;
38
-
39
- this.template = this.editor.getValue();
40
- this.editor.destroy();
41
- delete this.editor;
42
- }
43
-
44
- </script>
45
-
46
- <script type="text/html" template-section="onIncludeEditForm">
47
- <div id="LoggerConfig">
48
- <div class="form-row">
49
- <label class="towb_editorlabel" for="node-config-input-name"><i class="fa fa-font"></i> Name</label>
50
- <input type="text" id="node-config-input-name" />
51
- </div>
52
-
53
- <div class="form-row">
54
- <label class="towb_editorlabel" for="node-config-input-level"><i class="fa fa-signal"></i> Level</label>
55
- <input type="text" id="node-config-input-level" />
56
- </div>
57
-
58
- <div class="form-row">
59
- <label class="towb_editorlabel" for="node-config-input-templateEditor"><i class="fa fa-code"></i> Template</label>
60
- <div style="height: 250px; min-height:150px;" class="node-text-editor" id="node-config-input-templateEditor"></div>
61
- </div>
62
- </div>
63
- </script>
64
-
65
- <script type="text/markdown" template-section="onIncludeDocumentation">
66
- Writes log output to the Node-RED runtime console (stdout). Suitable for local development and containerised environments where stdout is captured.
67
-
68
- ### Properties
69
- : *name* (string) : A descriptive name for this logger configuration.
70
- : *level* (level) : The minimum log level. Messages below this threshold are suppressed. Options: DEBUG, INFO, WARNING, ERROR.
71
- : *template* (mustache) : A Mustache/Handlebars template that formats the log message body.
72
-
73
- ### Mustache Templating
74
- Mustache/Handlebars templates build the message string written to the console.
75
-
76
- #### Provided Properties
77
- : *msg* (object) : The Node-RED message object passed through the node.
78
- : *currentTime* (string) : The current time in ISO 8601 format.
79
-
80
- #### Helpers
81
- : *json* (helper) : Serialises an object to a JSON string using `JSON.stringify`.
82
-
83
- #### Examples
84
- - `{{{json msg}}}` — serialises the full message object as JSON.
85
-
86
- #### References
87
- - [Mustache — Wikipedia](https://en.wikipedia.org/wiki/Mustache_(template_system))
88
- - [Mustache — Playground](https://jgonggrijp.gitlab.io/wontache/playground.html)
89
- </script>
90
-
@@ -1,183 +0,0 @@
1
-
2
- <script type="text/javascript" template-section="onCompose">
3
- node
4
- .addDefault("name", {value:"Logger Example", required:true})
5
- .addDefault("template", {value:`message:{{msg}}`, required:true})
6
- .addDefault("level", {value:"info", required:true})
7
-
8
- // platform rest:
9
- .addDefault("rest_url", {})
10
- .addDefault("rest_ignoresslerror", {})
11
- .addDefault("rest_auth_type", {})
12
- .addDefault("rest_auth_basic_username", {})
13
- .addDefault("rest_auth_basic_password", {})
14
- .addDefault("rest_auth_apikey_mechanism", {})
15
- .addDefault("rest_auth_apikey_name", {})
16
- .addDefault("rest_auth_apikey_value", {})
17
-
18
- .setPaletteLabel("Rest Logger Config Node")
19
- .setLabel(function() {return this.name })
20
-
21
- </script>
22
-
23
- <script type="text/javascript" template-section="onIncludeEditPrepare">
24
- {
25
- let node = this;
26
-
27
- let showSelectedRestAuthMethod = (value) => {
28
- $("#LoggerConfig")
29
- .find(".platform.platform-rest").first()
30
- .find(".platform-rest-auth")
31
- .each((i, t) => {
32
- t = $(t);
33
- if(t.hasClass(`auth-${value}`)){ t.show(); }
34
- else { t.hide(); }
35
- });
36
- }
37
-
38
- let levelSelection = $("#node-config-input-level");
39
- levelSelection.typedInput({type:"level", types:[{
40
- value: "level",
41
- options: [
42
- { value: "DEBUG", label: "debug"},
43
- { value: "INFO", label: "info"},
44
- { value: "WARNING", label: "warning"},
45
- { value: "ERROR", label: "error"},
46
- ]
47
- }]});
48
-
49
- let platformRestAuthType = $("#node-config-input-rest_auth_type");
50
- platformRestAuthType.typedInput({type:"authtype", types:[{
51
- value: "authtype",
52
- options: [
53
- { value: "none", label: "None"},
54
- { value: "basic", label: "Basic"},
55
- { value: "apikey", label: "ApiKey"}
56
- ]
57
- }]});
58
- platformRestAuthType.on("change", () => showSelectedRestAuthMethod(platformRestAuthType.val()));
59
-
60
- let apiKeyMechanism = $("#node-config-input-rest_auth_apikey_mechanism");
61
- apiKeyMechanism.typedInput({type:"apikeymechansim", types:[{
62
- value: "apikeymechansim",
63
- options: [
64
- { value: "header", label: "Header"},
65
- { value: "queryparam", label: "Query Param"},
66
- { value: "matrixparam", label: "Matrix Param"}
67
- ]
68
- }]});
69
-
70
- this.editor = RED.editor.createEditor({
71
- id: 'node-config-input-templateEditor',
72
- mode: 'ace/mode/handlebars',
73
- value: this.template
74
- });
75
- }
76
- </script>
77
-
78
- <script type="text/javascript" template-section="onIncludeEditSave">
79
- {
80
- let node = this;
81
- this.template = this.editor.getValue();
82
- this.editor.destroy();
83
- delete this.editor;
84
- }
85
-
86
- </script>
87
-
88
- <script type="text/html" template-section="onIncludeEditForm">
89
- <div id="LoggerConfig">
90
- <div class="form-row">
91
- <label class="towb_editorlabel" for="node-config-input-name"><i class="fa fa-font"></i> Name</label>
92
- <input type="text" id="node-config-input-name" />
93
- </div>
94
-
95
- <div class="form-row">
96
- <label class="towb_editorlabel" for="node-config-input-level"><i class="fa fa-signal"></i> Level</label>
97
- <input type="text" id="node-config-input-level" />
98
- </div>
99
-
100
- <div class="platform platform-rest">
101
- <div class="form-row">
102
- <label class="towb_editorlabel" for="node-config-input-rest_url"><i class="fa fa-link"></i> URL</label>
103
- <input class="platform-rest-input required" type="text" id="node-config-input-rest_url" />
104
- </div>
105
- <div class="form-row">
106
- <label class="towb_editorlabel"></label>
107
- <input type="checkbox" id="node-config-input-rest_ignoresslerror" style="width:20px; margin-right:5px;" />
108
- <label style="width:auto" for="node-config-input-rest_ignoresslerror"><span>Ignore Invalid SSL certificates</span></label>
109
- </div>
110
- <div class="form-row">
111
- <label class="towb_editorlabel" for="node-config-input-rest_auth_type"><i class="fa fa-lock"></i> Authentication</label>
112
- <input class="platform-rest-input required" type="text" id="node-config-input-rest_auth_type" />
113
- </div>
114
- <div class="form-row platform-rest-auth auth-basic">
115
- <label class="towb_editorlabel" for="node-config-input-rest_auth_basic_username"><i class="fa fa-user"></i> Username</label>
116
- <input class="platform-rest-input" type="text" id="node-config-input-rest_auth_basic_username" />
117
- </div>
118
- <div class="form-row platform-rest-auth auth-basic">
119
- <label class="towb_editorlabel" for="node-config-input-rest_auth_basic_password"><i class="fa fa-key"></i> Password</label>
120
- <input class="platform-rest-input" type="password" id="node-config-input-rest_auth_basic_password" />
121
- </div>
122
- <div class="form-row platform-rest-auth auth-apikey">
123
- <label class="towb_editorlabel" for="node-config-input-rest_auth_apikey_mechanism"><i class="fa fa-exchange"></i> Mechanism</label>
124
- <input class="platform-rest-input" type="text" id="node-config-input-rest_auth_apikey_mechanism" />
125
- </div>
126
- <div class="form-row platform-rest-auth auth-apikey">
127
- <label class="towb_editorlabel" for="node-config-input-rest_auth_apikey_name"><i class="fa fa-id-badge"></i> APIKey name</label>
128
- <input class="platform-rest-input" type="text" id="node-config-input-rest_auth_apikey_name" />
129
- </div>
130
- <div class="form-row platform-rest-auth auth-apikey">
131
- <label class="towb_editorlabel" for="node-config-input-rest_auth_apikey_value"><i class="fa fa-lock"></i> APIKey value</label>
132
- <input class="platform-rest-input" type="text" id="node-config-input-rest_auth_apikey_value" />
133
- </div>
134
- </div>
135
-
136
- <div class="form-row">
137
- <label class="towb_editorlabel" for="node-config-input-templateEditor"><i class="fa fa-code"></i> Template</label>
138
- <div style="height: 250px; min-height:150px;" class="node-text-editor" id="node-config-input-templateEditor"></div>
139
- </div>
140
- </div>
141
- </script>
142
-
143
- <script type="text/markdown" template-section="onIncludeDocumentation">
144
- Posts log messages to an HTTP or HTTPS endpoint as a JSON payload.
145
-
146
- ### Properties
147
- : *name* (string) : A descriptive name for this logger configuration.
148
- : *level* (level) : The minimum log level. Messages below this threshold are suppressed. Options: DEBUG, INFO, WARNING, ERROR.
149
- : *url* (url) : The endpoint that log messages will be POSTed to.
150
- : *ignore SSL errors* (boolean) : When enabled, invalid SSL certificates are accepted.
151
- : *authentication* (select) : The authentication strategy applied to each request. Options: None, Basic, ApiKey.
152
- : *template* (mustache) : A Mustache/Handlebars template that formats the log message body.
153
-
154
- ### Authentication
155
- #### Basic
156
- Authenticates using the HTTP `Authorization` header (RFC 7617).
157
- : *username* (string) : The username credential.
158
- : *password* (string) : The password credential.
159
-
160
- #### ApiKey
161
- Authenticates by injecting a key/value pair into the request.
162
- : *mechanism* (select) : Where the key is injected — Header, Query Param, or Matrix Param.
163
- : *APIKey name* (string) : The name of the key (e.g. `x-api-key`).
164
- : *APIKey value* (string) : The value of the key.
165
-
166
- ### Mustache Templating
167
- Mustache/Handlebars templates build the message string POSTed to the endpoint.
168
-
169
- #### Provided Properties
170
- : *msg* (object) : The Node-RED message object passed through the node.
171
- : *currentTime* (string) : The current time in ISO 8601 format.
172
-
173
- #### Helpers
174
- : *json* (helper) : Serialises an object to a JSON string using `JSON.stringify`.
175
-
176
- #### Examples
177
- - `{{{json msg}}}` — serialises the full message object as JSON.
178
-
179
- #### References
180
- - [Mustache — Wikipedia](https://en.wikipedia.org/wiki/Mustache_(template_system))
181
- - [Mustache — Playground](https://jgonggrijp.gitlab.io/wontache/playground.html)
182
- </script>
183
-
@@ -1,331 +0,0 @@
1
- <div template-section="onIncludeOnce">
2
- <style>
3
- .editorgroupborder {
4
- border-width:1px;
5
- border-style:solid;
6
- border-color:lightgray;
7
- padding: 3px;
8
- margin-top: 2px;
9
- margin-bottom: 2px;
10
- }
11
-
12
- .editorsectionheading {
13
- font-weight: 600;
14
- margin-bottom:1px !important;
15
- margin-top:6px !important;
16
- }
17
-
18
- .nomargin {
19
- margin-bottom:1px !important;
20
- margin-top:1px !important;
21
- }
22
-
23
- .slidecontainer {
24
- width: 100%;
25
- }
26
-
27
- .slider {
28
- -webkit-appearance: none;
29
- appearance: none;
30
- width: 100%;
31
- height: 25px;
32
- background: #d3d3d3;
33
- outline: none;
34
- opacity: 0.7;
35
- -webkit-transition: .2s;
36
- transition: opacity .2s;
37
- }
38
-
39
- .slider:hover {
40
- opacity: 1;
41
- }
42
-
43
- .slider::-webkit-slider-thumb {
44
- -webkit-appearance: none;
45
- appearance: none;
46
- width: 25px;
47
- height: 25px;
48
- background: #04AA6D;
49
- cursor: pointer;
50
- }
51
-
52
- .slider::-moz-range-thumb {
53
- width: 25px;
54
- height: 25px;
55
- background: #04AA6D;
56
- cursor: pointer;
57
- }
58
-
59
- .towb_editorlabel {
60
- width: 120px !important;
61
- }
62
- .towb_editorfield {
63
- width: 70% !important;
64
- }
65
- .towb_editorfield_short {
66
- width: 30% !important;
67
- }
68
-
69
- </style>
70
-
71
- <script type="text/javascript">
72
-
73
- // CSS
74
- dropdownStyles = `
75
- .loggertype-dropdown {
76
- position: absolute;
77
- background: white;
78
- border: 1px solid #ccc;
79
- border-radius: 4px;
80
- box-shadow: 0 2px 8px rgba(0,0,0,0.15);
81
- max-height: 150px;
82
- overflow-y: auto;
83
- z-index: 1000;
84
- min-width: 150px;
85
- }
86
- .loggertype-dropdown .dropdown-item {
87
- padding: 6px 12px;
88
- cursor: pointer;
89
- }
90
- .loggertype-dropdown .dropdown-item:hover {
91
- background: #f0f0f0;
92
- }
93
- `;
94
- $('<style>').text(dropdownStyles).appendTo('head');
95
-
96
- </script>
97
-
98
-
99
- </div>
100
-
101
-
102
- <script type="text/javascript" template-section="onCompose">
103
- node
104
- .addDefault("logEnabled", { value:false, required:true})
105
- .addDefault("logger", { required:false, value:'', type:"DelegatedConfigReferenceNode"})
106
- .addDefault("logTemplateOverrideEnabled", {value:false})
107
- .addDefault("logTemplateOverride", {value:"message:{{msg}}"})
108
- </script>
109
-
110
- <script type="text/javascript" template-section="onIncludeEditPrepare">
111
- let node = this;
112
-
113
- // controls.
114
- let logEnabled = $("#{{defaults.logEnabled}}");
115
- let logTemplateEnabled = $("#{{defaults.logTemplateOverrideEnabled}}");
116
- let logTemplateEnabledSection = $("#section_logTemplateOverrideEnabled");
117
- let logEnabledSection = $("#section_logEnabled");
118
-
119
- // functions.
120
- let getLoggerTypes = async function(){
121
- let types = [];
122
- await $.ajax({
123
- url: "nodetypeservice/find?tag=LoggerType",
124
- type: "GET",
125
- contentType: "application/json; charset=utf-8",
126
- data:JSON.stringify({id:node.id}),
127
- success: (response) => {
128
- types = response;
129
- },
130
- error: (jqXHR, textStatus, errorThrown) => {
131
- console.log(jqXHR, textStatus, errorThrown);
132
- },
133
- });
134
- return types;
135
- }
136
-
137
- let getLoggers = async () => {
138
- let loggers = [];
139
-
140
- // get the list of types again.
141
- let loggerTypes = (await getLoggerTypes()).map(type => type.id);
142
-
143
- // add all of the known loggers.
144
- RED.nodes.eachConfig(cfg => {
145
- if(loggerTypes.includes(cfg.type)){
146
- loggers.push({id:cfg.id, name:cfg.label(), type:cfg.type});
147
- }
148
- });
149
-
150
- return loggers;
151
- };
152
-
153
- let updateLoggerSelectorList = async () => {
154
- loggerSelector.empty();
155
- (await getLoggers()).forEach(logger => {
156
- $('<option value="' + logger.id + '">' + logger.name + '</option>').appendTo(loggerSelector);
157
- });
158
- $('<option value="_ADD_">none</option>').appendTo(loggerSelector);
159
- }
160
-
161
- logEnabled.on('change', function() {
162
- if(logEnabled.prop("checked")){
163
- logEnabledSection.show();
164
- node._def.defaults.logger.required = true;
165
- }
166
- else{
167
- logEnabledSection.hide()
168
- node._def.defaults.logger.required = false;
169
- }
170
- });
171
-
172
- logTemplateEnabled.on('change', function() {
173
- if(logTemplateEnabled.prop("checked")){
174
- logTemplateEnabledSection.show();
175
- node._def.defaults.logTemplateOverride.required = true;
176
- }
177
- else{
178
- logTemplateEnabledSection.hide()
179
- node._def.defaults.logTemplateOverride.required = false;
180
- }
181
- });
182
-
183
- node.logTemplateOverrideEditor = RED.editor.createEditor({
184
- id: 'node-input-logTemplateOverrideEditor',
185
- mode: 'ace/mode/handlebars',
186
- value: node.logTemplateOverride
187
- });
188
-
189
- let loggerSelector = $("#logger-selector");
190
- let loggerEditButton = $("#logger-edit-btn");
191
- let loggerAddButton = $("#logger-add-btn");
192
-
193
-
194
- loggerEditButton.on('click', async function(event){
195
- event.stopPropagation();
196
- if(loggerEditButton.hasClass("disabled")){
197
- return;
198
- }
199
-
200
- // figure out what type of logger this is.
201
- let selectedLogger = (await getLoggers()).find(logger => logger.id === loggerSelector.val());
202
- RED.editor.editConfig("#logger-selector", selectedLogger.type, selectedLogger.id);
203
- });
204
-
205
- loggerAddButton.on('click', function(event) {
206
- event.stopPropagation();
207
- let $btn = $(event.target);
208
-
209
- // Remove any existing dropdown
210
- $('.loggertype-dropdown').remove();
211
-
212
- getLoggerTypes().then(loggerTypes => {
213
- let $dropdown = $('<div class="loggertype-dropdown red-ui-editor"></div>');
214
-
215
- loggerTypes.forEach(loggerType => {
216
- $('<div class="dropdown-item"></div>')
217
- .text(loggerType.name)
218
- .data('value', loggerType.id)
219
- .css({
220
- padding: '4px 8px',
221
- cursor: 'pointer'
222
- })
223
- .appendTo($dropdown);
224
- });
225
-
226
- // Append first so outerWidth() is measurable, then position so the
227
- // right edge of the dropdown aligns with the right edge of the button.
228
- $('body').append($dropdown);
229
- $dropdown.css({
230
- top: $btn.offset().top + $btn.outerHeight(),
231
- left: $btn.offset().left + $btn.outerWidth() - $dropdown.outerWidth()
232
- });
233
-
234
- $(document).on('mousedown.dropdown', function(e) {
235
- if (!$(e.target).closest('.loggertype-dropdown').length) {
236
- $dropdown.remove();
237
- $(document).off('mousedown.dropdown'); // Clean up the listener
238
- }
239
- });
240
-
241
- // Handle item selection
242
- $dropdown.on('click', '.dropdown-item', function(e) {
243
- e.stopPropagation();
244
- const selectedValue = $(this).data('value');
245
- const selectedText = $(this).text();
246
-
247
- // Do whatever you need with the selection
248
- console.log('Selected:', selectedValue, selectedText);
249
- $dropdown.remove();
250
- RED.editor.editConfig("#logger-selector", selectedValue, "_ADD_");
251
- });
252
- })
253
- });
254
-
255
- loggerSelector.on("focus", updateLoggerSelectorList);
256
- loggerSelector.on('change', function(event) {
257
- if("_ADD_" === loggerSelector.val()){
258
- loggerEditButton.addClass("disabled")
259
- }
260
- else{
261
- loggerEditButton.removeClass("disabled")
262
- }
263
- });
264
-
265
- // lastly, make sure that we set the correct value on the logger selector.
266
- updateLoggerSelectorList().then(() => {
267
- loggerSelector.val(node.logger);
268
- loggerSelector.trigger('change');
269
- });
270
-
271
- </script>
272
-
273
- <script type="text/javascript" template-section="onIncludeEditSave">
274
- node = this;
275
- var selectedLogger = $("#logger-selector").val();
276
- node.logger = (selectedLogger && selectedLogger !== "_ADD_") ? selectedLogger : '';
277
- node.logTemplateOverride = node.logTemplateOverrideEditor.getValue();
278
- node.logTemplateOverrideEditor.destroy();
279
- delete node.logTemplateOverrideEditor;
280
- </script>
281
-
282
- <script type="text/html" template-section="onIncludeEditForm">
283
- <div id="section_loggerconfig" >
284
- <div class="form-row editorsectionheading">
285
- <i class="w-16 fa fa-eye"></i> <span>Logging</span>
286
- </div>
287
- <div class="editorgroupborder">
288
- <div class="form-row nomargin logEnableCheck">
289
- <input type="checkbox" id="{{defaults.logEnabled}}" placeholder="logEnabled" value="false" style="margin:8px 0 10px 102px; width:20px;">
290
- <label style="width:auto" for="{{defaults.logEnabled}}"><span>Enable Logging</span></label>
291
- </div>
292
-
293
- <div id="section_logEnabled">
294
- <div class="form-row nomargin">
295
- <label for="logger-selector">Logger</label>
296
- <div style="width: 70%; display: inline-flex;">
297
- <select id="logger-selector" style="flex-grow: 1;" class="">
298
- <option value="_ADD_">none</option>
299
- </select>
300
- <a id="logger-edit-btn" class="red-ui-button disabled" style="margin-left: 10px;">
301
- <i class="fa fa-pencil"></i>
302
- </a>
303
- <a id="logger-add-btn" class="red-ui-button" style="margin-left: 10px;">
304
- <i class="fa fa-plus"></i>
305
- </a>
306
- </div>
307
- </div>
308
-
309
- <div class="form-row nomargin">
310
- <input type="checkbox" id="{{defaults.logTemplateOverrideEnabled}}" placeholder="" value="false" style="margin:8px 0 10px 102px; width:20px;">
311
- <label style="width:auto" for="{{defaults.logTemplateOverrideEnabled}}"><span>Override Template</span></label>
312
- </div>
313
-
314
- <div id="section_logTemplateOverrideEnabled">
315
- <div class="form-row">
316
- <label class="towb_editorlabel" for="node-input-logTemplateOverrideEditor"><i class="fa fa-code"></i> Template</label>
317
- <div style="height: 250px; min-height:150px;" class="node-text-editor" id="node-input-logTemplateOverrideEditor"></div>
318
- </div>
319
- </div>
320
- </div>
321
- </div>
322
- </div>
323
- </script>
324
-
325
- <script type="text/markdown" template-section="onIncludeDocumentation">
326
- ### Logging
327
- : *enable logging* (boolean) : if checked, then the node will produce logging output to the specified logger.
328
- : *logger* (logconfig) : the endppoint that the node will log events to.
329
- : *override template* (logconfig) : if checked, a custom logging template can be provided for the log message.
330
- : *logger template* (mustache) : a template in mustache format to generate a message for logging purposes (see LoggerConfig node for more information)
331
- </script>