@theotherwillembotha/node-red-plugincore 0.0.50 → 0.0.52

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 (92) hide show
  1. package/README.md +155 -23
  2. package/build/GenerateNodes.js +3 -0
  3. package/build/Nodes.html +174 -250
  4. package/build/Nodes.js +2 -0
  5. package/build/core/NodeConstructor.d.ts +4 -2
  6. package/build/core/NodeConstructor.d.ts.map +1 -1
  7. package/build/core/NodeConstructor.js +5 -3
  8. package/build/core/NodeGenerator.js +8 -8
  9. package/build/core/logger/node/ConsoleLoggerConfigNode.html +20 -61
  10. package/build/core/logger/node/LokiLoggerConfigNode.d.ts +1 -1
  11. package/build/core/logger/node/LokiLoggerConfigNode.html +37 -73
  12. package/build/core/logger/node/LokiLoggerConfigNode.js +1 -1
  13. package/build/core/logger/node/RestLoggerConfigNode.html +51 -77
  14. package/build/core/logger/node/RestLoggerConfigNode.js +1 -1
  15. package/build/core/logger/service/LoggerService.d.ts +1 -1
  16. package/build/core/logger/service/LoggerService.d.ts.map +1 -1
  17. package/build/core/logger/service/LoggerService.js +2 -3
  18. package/build/core/logger/template/LoggerTemplate.d.ts.map +1 -1
  19. package/build/core/logger/template/LoggerTemplate.html +15 -12
  20. package/build/core/logger/template/LoggerTemplate.js +1 -2
  21. package/build/core/metrics/MetricsDecorator.js +2 -2
  22. package/build/core/metrics/node/CounterMetricConfigNode.html +2 -2
  23. package/build/core/metrics/node/GaugeMetricConfigNode.html +2 -2
  24. package/build/core/metrics/node/GaugeMetricConfigNode.js +2 -2
  25. package/build/core/metrics/node/MetricsConfigNode.html +1 -1
  26. package/build/core/metrics/node/TimerMetricConfigNode.html +13 -13
  27. package/build/core/metrics/service/MetricsService.d.ts +1 -1
  28. package/build/core/metrics/service/MetricsService.js +6 -6
  29. package/build/core/metrics/template/CounterMetricTemplate.html +1 -1
  30. package/build/core/metrics/template/GaugeMetricTemplate.html +1 -1
  31. package/build/core/metrics/template/TimerMetricTemplate.html +1 -1
  32. package/build/core/other/node/DelegatedConfigReferenceNode.d.ts +57 -0
  33. package/build/core/other/node/DelegatedConfigReferenceNode.d.ts.map +1 -0
  34. package/build/core/other/node/DelegatedConfigReferenceNode.html +1 -0
  35. package/build/core/other/node/DelegatedConfigReferenceNode.js +79 -0
  36. package/build/core/tagging/NodeDescriptionDecorator.js +1 -1
  37. package/build/core/tagging/service/NodeTypeService.js +1 -1
  38. package/build/core/ui/template/UIHelperTemplate.d.ts +5 -0
  39. package/build/core/ui/template/UIHelperTemplate.d.ts.map +1 -0
  40. package/build/core/ui/template/UIHelperTemplate.html +229 -0
  41. package/build/core/ui/template/UIHelperTemplate.js +11 -0
  42. package/build/core/webhook/node/WebhookServerConfigNode.html +5 -5
  43. package/build/core/webhook/template/WebhookTemplate.html +18 -10
  44. package/build/index.d.ts +2 -1
  45. package/build/index.d.ts.map +1 -1
  46. package/build/index.js +3 -1
  47. package/documentation/ConsoleLoggerConfigNode.png +0 -0
  48. package/documentation/CounterMetricConfigNode.png +0 -0
  49. package/documentation/GaugeMetricConfigNode.png +0 -0
  50. package/documentation/LokiLoggerConfigNode.png +0 -0
  51. package/documentation/MetricsConfigNode.png +0 -0
  52. package/documentation/RestLoggerConfigNode.png +0 -0
  53. package/documentation/TimerMetricConfigNode.png +0 -0
  54. package/documentation/WebhookNode.png +0 -0
  55. package/package.json +20 -8
  56. package/src/GenerateNodes.ts +5 -2
  57. package/src/core/NodeConstructor.ts +7 -4
  58. package/src/core/NodeGenerator.ts +8 -8
  59. package/src/core/logger/node/ConsoleLoggerConfigNode.html +20 -61
  60. package/src/core/logger/node/LokiLoggerConfigNode.html +37 -73
  61. package/src/core/logger/node/LokiLoggerConfigNode.ts +2 -2
  62. package/src/core/logger/node/RestLoggerConfigNode.html +51 -77
  63. package/src/core/logger/node/RestLoggerConfigNode.ts +1 -1
  64. package/src/core/logger/service/LoggerService.ts +3 -4
  65. package/src/core/logger/template/LoggerTemplate.html +15 -12
  66. package/src/core/logger/template/LoggerTemplate.ts +1 -2
  67. package/src/core/metrics/MetricsDecorator.ts +2 -2
  68. package/src/core/metrics/node/CounterMetricConfigNode.html +2 -2
  69. package/src/core/metrics/node/GaugeMetricConfigNode.html +2 -2
  70. package/src/core/metrics/node/GaugeMetricConfigNode.ts +2 -2
  71. package/src/core/metrics/node/MetricsConfigNode.html +1 -1
  72. package/src/core/metrics/node/MetricsConfigNode.ts +1 -1
  73. package/src/core/metrics/node/TimerMetricConfigNode.html +13 -13
  74. package/src/core/metrics/service/MetricsService.ts +6 -6
  75. package/src/core/metrics/template/CounterMetricTemplate.html +1 -1
  76. package/src/core/metrics/template/GaugeMetricTemplate.html +1 -1
  77. package/src/core/metrics/template/TimerMetricTemplate.html +1 -1
  78. package/src/core/other/node/DelegatedConfigReferenceNode.html +1 -0
  79. package/src/core/other/node/DelegatedConfigReferenceNode.ts +70 -0
  80. package/src/core/tagging/NodeDescriptionDecorator.ts +1 -1
  81. package/src/core/tagging/service/NodeTypeService.ts +1 -1
  82. package/src/core/ui/template/UIHelperTemplate.html +229 -0
  83. package/src/core/ui/template/UIHelperTemplate.ts +14 -0
  84. package/src/core/webhook/node/WebhookServerConfigNode.html +5 -5
  85. package/src/core/webhook/template/WebhookTemplate.html +18 -10
  86. package/src/index.ts +3 -1
  87. package/build/core/logger/node/LoggerConfigNode.d.ts +0 -30
  88. package/build/core/logger/node/LoggerConfigNode.d.ts.map +0 -1
  89. package/build/core/logger/node/LoggerConfigNode.html +0 -307
  90. package/build/core/logger/node/LoggerConfigNode.js +0 -60
  91. package/src/core/logger/node/LoggerConfigNode.html +0 -307
  92. package/src/core/logger/node/LoggerConfigNode.ts +0 -95
@@ -0,0 +1,57 @@
1
+ /**
2
+ * DelegatedConfigReferenceNode — a framework-internal sentinel type.
3
+ *
4
+ * PROBLEM
5
+ * Node-RED's reference counter (the usage count shown on config nodes in the
6
+ * Config sidebar) is driven by `updateConfigNodeUsers()` in nodes.js. That
7
+ * function only tracks a property as a config-node reference when two conditions
8
+ * are met:
9
+ * 1. `defaults[property].type` is set to a registered node type name.
10
+ * 2. That node type's `category` equals `"config"`.
11
+ *
12
+ * When a node property can reference *any* of several config-node types (e.g.
13
+ * ConsoleLoggerConfigNode, RestLoggerConfigNode, LokiLoggerConfigNode, or a
14
+ * future third-party logger), there is no single concrete type to declare.
15
+ * Leaving `type` blank causes the counter to stay at zero even when references
16
+ * exist, and the config node is incorrectly flagged as unused.
17
+ *
18
+ * WORKAROUND
19
+ * Register this no-op node with `category: "config"` so that its type name can
20
+ * be used as the `type` value in `addDefault(...)` calls where the referenced
21
+ * config node type is not known ahead of time (open/delegated reference).
22
+ * `updateConfigNodeUsers` will then pass both gates, look up the config node by
23
+ * its actual runtime ID, and correctly increment the counter.
24
+ *
25
+ * USAGE
26
+ * In a template or node's onCompose section, declare the property like this:
27
+ *
28
+ * .addDefault("myProp", { value: '', required: false, type: "DelegatedConfigReferenceNode" })
29
+ *
30
+ * Because the property name intentionally does NOT match the `node-input-X` /
31
+ * `node-config-input-X` naming convention, Node-RED will NOT auto-initialise
32
+ * the form element or auto-save the value. You must therefore:
33
+ * - Read the stored value manually in `onIncludeEditPrepare`
34
+ * e.g. $("#my-selector").val(node.myProp);
35
+ * - Write it back manually in `onIncludeEditSave`
36
+ * e.g. node.myProp = $("#my-selector").val();
37
+ *
38
+ * LONG-TERM
39
+ * A proper fix would be a Node-RED PR to make `updateConfigNodeUsers` use the
40
+ * already-parsed `_type.types` array (set by `parseNodePropertyTypeString`) so
41
+ * that pipe-separated multi-type strings such as
42
+ * "ConsoleLoggerConfigNode|RestLoggerConfigNode" work natively.
43
+ * Until that PR is accepted, this sentinel type is the recommended workaround
44
+ * within this framework.
45
+ *
46
+ * NOTE: This node has no UI, no edit form, and no runtime behaviour. It cannot
47
+ * be instantiated by users and should never appear as a flow node.
48
+ */
49
+ import { Node } from "node-red";
50
+ import { ConfigNode, ConfigNodeConfig } from "../../NodeConstructor";
51
+ interface DelegatedConfigReferenceNodeConfig extends ConfigNodeConfig {
52
+ }
53
+ export declare class DelegatedConfigReferenceNode extends ConfigNode<DelegatedConfigReferenceNodeConfig> {
54
+ constructor(node: Node, config: DelegatedConfigReferenceNodeConfig);
55
+ }
56
+ export {};
57
+ //# sourceMappingURL=DelegatedConfigReferenceNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DelegatedConfigReferenceNode.d.ts","sourceRoot":"","sources":["../../../../src/core/other/node/DelegatedConfigReferenceNode.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAIpE,UAAU,kCAAmC,SAAQ,gBAAgB;CAAG;AAExE,qBAOa,4BAA6B,SAAQ,UAAU,CAAC,kCAAkC,CAAC;gBAEhF,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,kCAAkC;CAGrE"}
@@ -0,0 +1 @@
1
+ <!-- This section is intentionally left blank -->
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ /**
3
+ * DelegatedConfigReferenceNode — a framework-internal sentinel type.
4
+ *
5
+ * PROBLEM
6
+ * Node-RED's reference counter (the usage count shown on config nodes in the
7
+ * Config sidebar) is driven by `updateConfigNodeUsers()` in nodes.js. That
8
+ * function only tracks a property as a config-node reference when two conditions
9
+ * are met:
10
+ * 1. `defaults[property].type` is set to a registered node type name.
11
+ * 2. That node type's `category` equals `"config"`.
12
+ *
13
+ * When a node property can reference *any* of several config-node types (e.g.
14
+ * ConsoleLoggerConfigNode, RestLoggerConfigNode, LokiLoggerConfigNode, or a
15
+ * future third-party logger), there is no single concrete type to declare.
16
+ * Leaving `type` blank causes the counter to stay at zero even when references
17
+ * exist, and the config node is incorrectly flagged as unused.
18
+ *
19
+ * WORKAROUND
20
+ * Register this no-op node with `category: "config"` so that its type name can
21
+ * be used as the `type` value in `addDefault(...)` calls where the referenced
22
+ * config node type is not known ahead of time (open/delegated reference).
23
+ * `updateConfigNodeUsers` will then pass both gates, look up the config node by
24
+ * its actual runtime ID, and correctly increment the counter.
25
+ *
26
+ * USAGE
27
+ * In a template or node's onCompose section, declare the property like this:
28
+ *
29
+ * .addDefault("myProp", { value: '', required: false, type: "DelegatedConfigReferenceNode" })
30
+ *
31
+ * Because the property name intentionally does NOT match the `node-input-X` /
32
+ * `node-config-input-X` naming convention, Node-RED will NOT auto-initialise
33
+ * the form element or auto-save the value. You must therefore:
34
+ * - Read the stored value manually in `onIncludeEditPrepare`
35
+ * e.g. $("#my-selector").val(node.myProp);
36
+ * - Write it back manually in `onIncludeEditSave`
37
+ * e.g. node.myProp = $("#my-selector").val();
38
+ *
39
+ * LONG-TERM
40
+ * A proper fix would be a Node-RED PR to make `updateConfigNodeUsers` use the
41
+ * already-parsed `_type.types` array (set by `parseNodePropertyTypeString`) so
42
+ * that pipe-separated multi-type strings such as
43
+ * "ConsoleLoggerConfigNode|RestLoggerConfigNode" work natively.
44
+ * Until that PR is accepted, this sentinel type is the recommended workaround
45
+ * within this framework.
46
+ *
47
+ * NOTE: This node has no UI, no edit form, and no runtime behaviour. It cannot
48
+ * be instantiated by users and should never appear as a flow node.
49
+ */
50
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
51
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
52
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
53
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
54
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
55
+ };
56
+ var __metadata = (this && this.__metadata) || function (k, v) {
57
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
58
+ };
59
+ Object.defineProperty(exports, "__esModule", { value: true });
60
+ exports.DelegatedConfigReferenceNode = void 0;
61
+ const NodeConstructor_1 = require("../../NodeConstructor");
62
+ const NodeGenerator_1 = require("../../NodeGenerator");
63
+ const NodeDescriptionDecorator_1 = require("../../tagging/NodeDescriptionDecorator");
64
+ let DelegatedConfigReferenceNode = class DelegatedConfigReferenceNode extends NodeConstructor_1.ConfigNode {
65
+ constructor(node, config) {
66
+ super(node, config);
67
+ }
68
+ };
69
+ exports.DelegatedConfigReferenceNode = DelegatedConfigReferenceNode;
70
+ exports.DelegatedConfigReferenceNode = DelegatedConfigReferenceNode = __decorate([
71
+ (0, NodeDescriptionDecorator_1.NodeDescription)({
72
+ id: "DelegatedConfigReferenceNode",
73
+ name: "DelegatedConfigReferenceNode",
74
+ group: "config",
75
+ sourceFile: NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "DelegatedConfigReferenceNode.html",
76
+ package: "@theotherwillembotha/node-red-plugincore",
77
+ }),
78
+ __metadata("design:paramtypes", [Object, Object])
79
+ ], DelegatedConfigReferenceNode);
@@ -4,7 +4,7 @@ exports.NodeDescription = NodeDescription;
4
4
  const NodeConstructor_1 = require("../NodeConstructor");
5
5
  function NodeDescription(config) {
6
6
  return function (target) {
7
- let descriptor = new NodeConstructor_1.NodeDescriptor(config.group, config.id, config.sourceFile, config.package);
7
+ let descriptor = new NodeConstructor_1.NodeDescriptor(config.group, config.id, config.name, config.sourceFile, config.package);
8
8
  if (config.templates) {
9
9
  for (let template of config.templates) {
10
10
  descriptor.addTemplate(template.template, template.config);
@@ -16,7 +16,7 @@ class NodeTypeService extends NodeConstructor_1.BaseService {
16
16
  let types = this.getNodeTypesForTag(tag).map(type => {
17
17
  let description = type.getNodeDescriptor();
18
18
  return {
19
- "id": description.name(),
19
+ "id": description.id(),
20
20
  "name": description.name(),
21
21
  };
22
22
  });
@@ -0,0 +1,5 @@
1
+ import { Template, TemplateDescriptor } from "../../NodeConstructor";
2
+ export declare class UIHelperTemplate extends Template {
3
+ static getTemplateDescriptor(): TemplateDescriptor;
4
+ }
5
+ //# sourceMappingURL=UIHelperTemplate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UIHelperTemplate.d.ts","sourceRoot":"","sources":["../../../../src/core/ui/template/UIHelperTemplate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAGpE,qBAAa,gBAAiB,SAAQ,QAAQ;WAE5B,qBAAqB,IAAI,kBAAkB;CAQ5D"}
@@ -0,0 +1,229 @@
1
+
2
+ <div template-section="onIncludeOnce">
3
+
4
+ <style>
5
+ /* ─── PluginCore Dialog overlay ─────────────────────────────────────────── */
6
+
7
+ .plugincore-overlay {
8
+ position: fixed;
9
+ top: 0; left: 0; right: 0; bottom: 0;
10
+ background: rgba(0, 0, 0, 0.5);
11
+ z-index: 2000;
12
+ display: flex;
13
+ align-items: center;
14
+ justify-content: center;
15
+ }
16
+
17
+ .plugincore-dialog {
18
+ background: #fff;
19
+ border: 1px solid #aaa;
20
+ border-radius: 4px;
21
+ box-shadow: 0 6px 24px rgba(0, 0, 0, 0.35);
22
+ min-width: 540px;
23
+ max-width: 85vw;
24
+ max-height: 80vh;
25
+ display: flex;
26
+ flex-direction: column;
27
+ overflow: hidden;
28
+ }
29
+
30
+ /* Title bar — matches Node-RED's main nav bar colour */
31
+ .plugincore-dialog-titlebar {
32
+ display: flex;
33
+ align-items: center;
34
+ background: #3d3d3d;
35
+ color: #fff;
36
+ padding: 6px 8px 6px 12px;
37
+ flex-shrink: 0;
38
+ }
39
+
40
+ .plugincore-dialog-title {
41
+ flex: 1;
42
+ font-weight: 600;
43
+ font-size: 13px;
44
+ }
45
+
46
+ /* Close button — jQuery UI styling as used in Node-RED dialogs */
47
+ .plugincore-dialog-close {
48
+ color: #ccc !important;
49
+ background: transparent !important;
50
+ border-color: transparent !important;
51
+ }
52
+
53
+ .plugincore-dialog-close:hover {
54
+ color: #fff !important;
55
+ background: rgba(255, 255, 255, 0.15) !important;
56
+ border-color: rgba(255, 255, 255, 0.3) !important;
57
+ }
58
+
59
+ /* Scrollable body that contains the jQuery UI tab widget */
60
+ .plugincore-dialog-body {
61
+ flex: 1;
62
+ overflow: auto;
63
+ padding: 10px;
64
+ }
65
+
66
+ /* ─── PluginCore Table ───────────────────────────────────────────────────── */
67
+
68
+ .plugincore-table {
69
+ width: 100%;
70
+ border-collapse: collapse;
71
+ font-size: 12px;
72
+ }
73
+
74
+ .plugincore-table th {
75
+ background: #f3f3f3;
76
+ border: 1px solid #ddd;
77
+ padding: 5px 10px;
78
+ text-align: left;
79
+ font-weight: 600;
80
+ white-space: nowrap;
81
+ }
82
+
83
+ .plugincore-table td {
84
+ border: 1px solid #eee;
85
+ padding: 5px 10px;
86
+ vertical-align: middle;
87
+ }
88
+
89
+ .plugincore-table tbody tr:nth-child(even) td {
90
+ background: #fafafa;
91
+ }
92
+
93
+ .plugincore-table tbody tr:hover td {
94
+ background: #f0f6ff;
95
+ }
96
+
97
+ .plugincore-status-enabled { color: #27ae60; }
98
+ .plugincore-status-disabled { color: #c0392b; }
99
+ </style>
100
+
101
+ <script type="text/javascript">
102
+
103
+ window.PluginCore = window.PluginCore || {};
104
+
105
+ /**
106
+ * PluginCore.table(config) → jQuery <table>
107
+ *
108
+ * config: {
109
+ * columns : [{ key, label, render?(value, row) → string | jQuery }],
110
+ * rows : object[]
111
+ * }
112
+ */
113
+ PluginCore.table = function(config) {
114
+ var $table = $('<table class="plugincore-table">');
115
+
116
+ // Header
117
+ var $thead = $('<thead>');
118
+ var $hr = $('<tr>');
119
+ config.columns.forEach(function(col) {
120
+ $hr.append($('<th>').text(col.label));
121
+ });
122
+ $thead.append($hr);
123
+ $table.append($thead);
124
+
125
+ // Body
126
+ var $tbody = $('<tbody>');
127
+ (config.rows || []).forEach(function(row) {
128
+ var $tr = $('<tr>');
129
+ config.columns.forEach(function(col) {
130
+ var $td = $('<td>');
131
+ var val = row[col.key];
132
+ if (col.render) {
133
+ var rendered = col.render(val, row);
134
+ if (rendered && typeof rendered === 'object' && rendered.jquery) {
135
+ $td.append(rendered);
136
+ } else {
137
+ $td.html(rendered != null ? String(rendered) : '');
138
+ }
139
+ } else {
140
+ $td.text(val != null ? String(val) : '');
141
+ }
142
+ $tr.append($td);
143
+ });
144
+ $tbody.append($tr);
145
+ });
146
+ $table.append($tbody);
147
+
148
+ return $table;
149
+ };
150
+
151
+ /**
152
+ * PluginCore.dialog(options) → { close() }
153
+ *
154
+ * options: {
155
+ * title : string,
156
+ * tabs : [{ label: string, render($container) }]
157
+ * }
158
+ *
159
+ * Uses jQuery UI tabs for the tab widget (already bundled with Node-RED).
160
+ * Closes on: close button click, overlay click, or Escape key.
161
+ */
162
+ PluginCore.dialog = function(options) {
163
+ // Only one dialog at a time
164
+ $('.plugincore-overlay').remove();
165
+
166
+ var uid = 'plugincore-' + Date.now();
167
+
168
+ var $overlay = $('<div class="plugincore-overlay">');
169
+ var $dialog = $('<div class="plugincore-dialog">');
170
+
171
+ // ── Title bar ──────────────────────────────────────────────────────
172
+ var $titlebar = $('<div class="plugincore-dialog-titlebar">');
173
+ $titlebar.append(
174
+ $('<span class="plugincore-dialog-title">').text(options.title || '')
175
+ );
176
+ var $closeBtn = $(
177
+ '<button type="button" class="ui-button ui-corner-all ui-widget plugincore-dialog-close" title="Close">' +
178
+ '<span class="ui-icon ui-icon-closethick"></span></button>'
179
+ );
180
+ $titlebar.append($closeBtn);
181
+
182
+ // ── Body + jQuery UI tabs ──────────────────────────────────────────
183
+ var $body = $('<div class="plugincore-dialog-body">');
184
+ var $tabsEl = $('<div>').attr('id', uid + '-tabs');
185
+ var $ul = $('<ul>');
186
+
187
+ (options.tabs || []).forEach(function(tab, i) {
188
+ var paneId = uid + '-pane-' + i;
189
+ $ul.append(
190
+ $('<li>').append($('<a>').attr('href', '#' + paneId).text(tab.label))
191
+ );
192
+ var $pane = $('<div>').attr('id', paneId);
193
+ if (tab.render) { tab.render($pane); }
194
+ $tabsEl.append($pane);
195
+ });
196
+
197
+ $tabsEl.prepend($ul);
198
+ $body.append($tabsEl);
199
+
200
+ // ── Assemble ───────────────────────────────────────────────────────
201
+ $dialog.append($titlebar).append($body);
202
+ $overlay.append($dialog);
203
+ $('body').append($overlay);
204
+
205
+ // Initialise jQuery UI tabs (bundled with Node-RED)
206
+ $tabsEl.tabs();
207
+
208
+ // ── Close logic ───────────────────────────────────────────────────
209
+ var escNs = 'keydown.plugincore-dialog-' + uid;
210
+
211
+ function close() {
212
+ $overlay.fadeOut(150, function() { $overlay.remove(); });
213
+ $(document).off(escNs);
214
+ }
215
+
216
+ $closeBtn.on('click', close);
217
+ $overlay.on('click', function(e) {
218
+ if ($(e.target).is($overlay)) { close(); }
219
+ });
220
+ $(document).on(escNs, function(e) {
221
+ if (e.key === 'Escape') { close(); }
222
+ });
223
+
224
+ return { close: close };
225
+ };
226
+
227
+ </script>
228
+
229
+ </div>
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UIHelperTemplate = void 0;
4
+ const NodeConstructor_1 = require("../../NodeConstructor");
5
+ const NodeGenerator_1 = require("../../NodeGenerator");
6
+ class UIHelperTemplate extends NodeConstructor_1.Template {
7
+ static getTemplateDescriptor() {
8
+ return new NodeConstructor_1.TemplateDescriptor("ui-helper", UIHelperTemplate, NodeGenerator_1.SourceUtility.getSourcePath("/build/", "/src/") + "UIHelperTemplate.html", []);
9
+ }
10
+ }
11
+ exports.UIHelperTemplate = UIHelperTemplate;
@@ -18,25 +18,25 @@
18
18
  </div>
19
19
 
20
20
 
21
- <script type="text/html" template-section="onIncludeEditForm">\
21
+ <script type="text/html" template-section="onIncludeEditForm">
22
22
  <div id="WebhookServerConfig">
23
23
  <div class="form-row">
24
- <label for="node-config-input-name"><i class="fa fa-tag"></i> Name</label>
24
+ <label class="towb_editorlabel" for="node-config-input-name"><i class="fa fa-font"></i> Name</label>
25
25
  <input type="text" id="node-config-input-name" />
26
26
  </div>
27
27
 
28
28
  <div class="form-row">
29
- <label for="node-config-input-port"><i class="fa fa-tag"></i> Port</label>
29
+ <label class="towb_editorlabel" for="node-config-input-port"><i class="fa fa-plug"></i> Port</label>
30
30
  <input type="number" id="node-config-input-port" />
31
31
  </div>
32
32
 
33
33
  <div class="form-row">
34
- <label for="node-config-input-externalHost"><i class="fa fa-tag"></i> External Host</label>
34
+ <label class="towb_editorlabel" for="node-config-input-externalHost"><i class="fa fa-globe"></i> External Host</label>
35
35
  <input type="text" id="node-config-input-externalHost" />
36
36
  </div>
37
37
 
38
38
  <div class="form-row">
39
- <label for="node-config-input-externalPort"><i class="fa fa-tag"></i> External Port</label>
39
+ <label class="towb_editorlabel" for="node-config-input-externalPort"><i class="fa fa-plug"></i> External Port</label>
40
40
  <input type="number" id="node-config-input-externalPort" />
41
41
  </div>
42
42
  <!-- add a button here to autmatically find an open port -->
@@ -133,6 +133,12 @@ node
133
133
  return types;
134
134
  }
135
135
 
136
+ getProxyTypes().then(types => {
137
+ if(types.length === 0){
138
+ $("#section_reverseproxy_feature").hide();
139
+ }
140
+ });
141
+
136
142
  let getProxies = async () => {
137
143
  let proxies = [];
138
144
 
@@ -335,17 +341,17 @@ node
335
341
 
336
342
  <div class="editorgroupborder">
337
343
  <div class="form-row nomargin">
338
- <label for="{{defaults.webhook}}">Server</label>
344
+ <label class="towb_editorlabel" for="{{defaults.webhook}}"><i class="fa fa-server"></i> Server</label>
339
345
  <input id="{{defaults.webhook}}" placeholder="webhook" />
340
346
  </div>
341
-
347
+
342
348
  <div class="form-row">
343
- <label for="{{defaults.webhookPath}}">Path</label>
349
+ <label class="towb_editorlabel" for="{{defaults.webhookPath}}"><i class="fa fa-link"></i> Path</label>
344
350
  <input type="text" id="{{defaults.webhookPath}}" placeholder="/example" />
345
351
  </div>
346
352
 
347
353
  <div class="form-row">
348
- <label for="{{defaults.webhookAuth}}">Authentication</label>
354
+ <label class="towb_editorlabel" for="{{defaults.webhookAuth}}"><i class="fa fa-lock"></i> Authentication</label>
349
355
  <input type="text" id="{{defaults.webhookAuth}}" placeholder="none" />
350
356
  </div>
351
357
 
@@ -354,33 +360,34 @@ node
354
360
 
355
361
  <div class="webhookauth webhookauth-basic">
356
362
  <div class="form-row">
357
- <label for="{{defaults.webhookAuth_basic_username}}">Auth Username:</label>
363
+ <label class="towb_editorlabel" for="{{defaults.webhookAuth_basic_username}}"><i class="fa fa-user"></i> Username</label>
358
364
  <input type="text" id="{{defaults.webhookAuth_basic_username}}" placeholder="testUser" />
359
365
  </div>
360
366
 
361
367
  <div class="form-row">
362
- <label for="{{defaults.webhookAuth_basic_password}}">Auth Password:</label>
368
+ <label class="towb_editorlabel" for="{{defaults.webhookAuth_basic_password}}"><i class="fa fa-key"></i> Password</label>
363
369
  <input type="password" id="{{defaults.webhookAuth_basic_password}}" placeholder="password" />
364
370
  </div>
365
371
  </div>
366
372
 
367
373
  <div class="webhookauth webhookauth-apikey">
368
374
  <div class="form-row">
369
- <label for="{{defaults.webhookAuth_apikey_mechanism}}">APIKey Mechanism:</label>
375
+ <label class="towb_editorlabel" for="{{defaults.webhookAuth_apikey_mechanism}}"><i class="fa fa-exchange"></i> Mechanism</label>
370
376
  <input type="text" id="{{defaults.webhookAuth_apikey_mechanism}}"/>
371
377
  </div>
372
378
 
373
379
  <div class="form-row">
374
- <label for="{{defaults.webhookAuth_apikey_key}}">APIKey Key:</label>
380
+ <label class="towb_editorlabel" for="{{defaults.webhookAuth_apikey_key}}"><i class="fa fa-id-badge"></i> APIKey name</label>
375
381
  <input type="text" id="{{defaults.webhookAuth_apikey_key}}" placeholder="x-api-key" />
376
382
  </div>
377
383
 
378
384
  <div class="form-row">
379
- <label for="{{defaults.webhookAuth_apikey_value}}">APIKey Value</label>
385
+ <label class="towb_editorlabel" for="{{defaults.webhookAuth_apikey_value}}"><i class="fa fa-lock"></i> APIKey value</label>
380
386
  <input type="text" id="{{defaults.webhookAuth_apikey_value}}" placeholder="testvalue" />
381
387
  </div>
382
388
  </div>
383
389
 
390
+ <div id="section_reverseproxy_feature">
384
391
  <div class="form-row">
385
392
  <label>Reverse Proxy</label>
386
393
  <input type="checkbox" id="{{defaults.reverseProxies_enabled}}" style="width:20px; margin-right:5px;" />
@@ -392,8 +399,9 @@ node
392
399
  <ol id="reverseproxylist_table" class="theotherwillembotha-compact-table"></ol>
393
400
  </div>
394
401
  </div>
402
+ </div>
403
+
395
404
 
396
-
397
405
  </div>
398
406
  </div>
399
407
  </script>
package/build/index.d.ts CHANGED
@@ -2,7 +2,6 @@ export * from "./core/Utils";
2
2
  export * from "./core/NodeGenerator";
3
3
  export * from "./core/NodeConstructor";
4
4
  export * from "./core/logger/service/LoggerService";
5
- export * from "./core/logger/node/LoggerConfigNode";
6
5
  export * from "./core/logger/template/LoggerTemplate";
7
6
  export * from "./core/logger/node/ConsoleLoggerConfigNode";
8
7
  export * from "./core/logger/node/RestLoggerConfigNode";
@@ -18,6 +17,8 @@ export * from "./core/metrics/node/TimerMetricConfigNode";
18
17
  export * from "./core/metrics/template/TimerMetricTemplate";
19
18
  export * from "./core/tagging/service/NodeTypeService";
20
19
  export * from "./core/tagging/NodeDescriptionDecorator";
20
+ export * from "./core/ui/template/UIHelperTemplate";
21
+ export * from "./core/other/node/DelegatedConfigReferenceNode";
21
22
  export * from "./core/other/service/InputService";
22
23
  export * from "./core/other/service/SettingsService";
23
24
  export * from "./core/other/template/BasicTemplate";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AAGxD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AACxD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAG5D,cAAc,wCAAwC,CAAC;AACvD,cAAc,yCAAyC,CAAC;AAIxD,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AAGvD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,6CAA6C,CAAC;AAG5D,cAAc,gDAAgD,CAAC;AAG/D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AAGvC,cAAc,qCAAqC,CAAC;AACpD,cAAc,uCAAuC,CAAC;AACtD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,yCAAyC,CAAC;AACxD,cAAc,yCAAyC,CAAC;AAGxD,cAAc,uCAAuC,CAAC;AACtD,cAAc,yCAAyC,CAAC;AACxD,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6CAA6C,CAAC;AAC5D,cAAc,uCAAuC,CAAC;AACtD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,2CAA2C,CAAC;AAC1D,cAAc,6CAA6C,CAAC;AAG5D,cAAc,wCAAwC,CAAC;AACvD,cAAc,yCAAyC,CAAC;AAGxD,cAAc,qCAAqC,CAAC;AAGpD,cAAc,gDAAgD,CAAC;AAC/D,cAAc,mCAAmC,CAAC;AAClD,cAAc,sCAAsC,CAAC;AACrD,cAAc,qCAAqC,CAAC;AACpD,cAAc,wCAAwC,CAAC;AAGvD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,6CAA6C,CAAC;AAG5D,cAAc,gDAAgD,CAAC;AAG/D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,iCAAiC,CAAC;AAChD,cAAc,iCAAiC,CAAC;AAChD,cAAc,6BAA6B,CAAC"}
package/build/index.js CHANGED
@@ -19,7 +19,6 @@ __exportStar(require("./core/NodeGenerator"), exports);
19
19
  __exportStar(require("./core/NodeConstructor"), exports);
20
20
  // LOGGER
21
21
  __exportStar(require("./core/logger/service/LoggerService"), exports);
22
- __exportStar(require("./core/logger/node/LoggerConfigNode"), exports);
23
22
  __exportStar(require("./core/logger/template/LoggerTemplate"), exports);
24
23
  __exportStar(require("./core/logger/node/ConsoleLoggerConfigNode"), exports);
25
24
  __exportStar(require("./core/logger/node/RestLoggerConfigNode"), exports);
@@ -37,7 +36,10 @@ __exportStar(require("./core/metrics/template/TimerMetricTemplate"), exports);
37
36
  // TAGGING
38
37
  __exportStar(require("./core/tagging/service/NodeTypeService"), exports);
39
38
  __exportStar(require("./core/tagging/NodeDescriptionDecorator"), exports);
39
+ // UI
40
+ __exportStar(require("./core/ui/template/UIHelperTemplate"), exports);
40
41
  // OTHER
42
+ __exportStar(require("./core/other/node/DelegatedConfigReferenceNode"), exports);
41
43
  __exportStar(require("./core/other/service/InputService"), exports);
42
44
  __exportStar(require("./core/other/service/SettingsService"), exports);
43
45
  __exportStar(require("./core/other/template/BasicTemplate"), exports);
Binary file