@flowfuse/node-red-dashboard 1.16.1-ee4508a-202409161000.0 → 1.17.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 (77) hide show
  1. package/dist/apple-touch-icon.png +0 -0
  2. package/dist/assets/Tableau10-B-NsZVaP.js +1 -0
  3. package/dist/assets/array-BKyUJesY.js +1 -0
  4. package/dist/assets/blockDiagram-9f4a6865-BY3wYgfY.js +118 -0
  5. package/dist/assets/c4Diagram-ae766693-B-AG7NIy.js +10 -0
  6. package/dist/assets/channel-C_v5mHlo.js +1 -0
  7. package/dist/assets/classDiagram-fb54d2a0-Cve0-MS1.js +2 -0
  8. package/dist/assets/classDiagram-v2-a2b738ad-DikSiPRc.js +2 -0
  9. package/dist/assets/clone-BXaIEimD.js +1 -0
  10. package/dist/assets/createText-ca0c5216-DvPZ4lSa.js +7 -0
  11. package/dist/assets/edges-066a5561-DMO7edq0.js +4 -0
  12. package/dist/assets/erDiagram-09d1c15f-C8g8w-fe.js +51 -0
  13. package/dist/assets/flowDb-c1833063-ByiZML3Q.js +10 -0
  14. package/dist/assets/flowDiagram-b222e15a-B7kVs9sh.js +4 -0
  15. package/dist/assets/flowDiagram-v2-13329dc7-BQ7oM3Wh.js +1 -0
  16. package/dist/assets/flowchart-elk-definition-ae0efee6-CAWlGS57.js +139 -0
  17. package/dist/assets/ganttDiagram-b62c793e-cVXtk4xr.js +257 -0
  18. package/dist/assets/gitGraphDiagram-942e62fe-ytnvaJ2O.js +70 -0
  19. package/dist/assets/graph-Bq9AO4pT.js +1 -0
  20. package/dist/assets/index--pBozGw-.js +245 -0
  21. package/dist/assets/index-01f381cb-CuQuHO3g.js +1 -0
  22. package/dist/assets/index-40_V--R5.css +13 -0
  23. package/dist/assets/infoDiagram-94cd232f-D3qHX83u.js +7 -0
  24. package/dist/assets/init-Gi6I4Gst.js +1 -0
  25. package/dist/assets/journeyDiagram-6625b456-DrDjeExJ.js +139 -0
  26. package/dist/assets/katex-CvgdMzdh.js +261 -0
  27. package/dist/assets/layout-dTROeK7M.js +1 -0
  28. package/dist/assets/line--V00syVo.js +1 -0
  29. package/dist/assets/linear-C2oDpuMJ.js +1 -0
  30. package/dist/assets/logo-DIAzbBuw.png +0 -0
  31. package/dist/assets/materialdesignicons-webfont-B7mPwVP_.ttf +0 -0
  32. package/dist/assets/materialdesignicons-webfont-CSr8KVlo.eot +0 -0
  33. package/dist/assets/materialdesignicons-webfont-Dp5v-WZN.woff2 +0 -0
  34. package/dist/assets/materialdesignicons-webfont-PXm3-2wK.woff +0 -0
  35. package/dist/assets/mindmap-definition-307c710a-CMUeraG8.js +110 -0
  36. package/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  37. package/dist/assets/pieDiagram-bb1d19e5-P5mFu8pA.js +35 -0
  38. package/dist/assets/quadrantDiagram-c759a472-DRSID9uQ.js +7 -0
  39. package/dist/assets/requirementDiagram-87253d64-98AMKGz3.js +52 -0
  40. package/dist/assets/sankeyDiagram-707fac0f-c6m9e_oG.js +8 -0
  41. package/dist/assets/sequenceDiagram-6894f283-z-gVG6uq.js +122 -0
  42. package/dist/assets/stateDiagram-5dee940d-DWfP8BzL.js +1 -0
  43. package/dist/assets/stateDiagram-v2-1992cada-DBpwYzQS.js +1 -0
  44. package/dist/assets/styles-0784dbeb-DIb0daye.js +207 -0
  45. package/dist/assets/styles-483fbfea-DqDTwju_.js +116 -0
  46. package/dist/assets/styles-b83b31c9-CSuCi6iq.js +160 -0
  47. package/dist/assets/svgDrawCommon-5e1cfd1d-CDAD6QkU.js +1 -0
  48. package/dist/assets/timeline-definition-bf702344-Dv2jO1Md.js +61 -0
  49. package/dist/assets/workbox-window.prod.es5-D5gOYdM7.js +2 -0
  50. package/dist/assets/xychartDiagram-f11f50a6-CEl6xRTu.js +7 -0
  51. package/dist/favicon.ico +0 -0
  52. package/dist/favicon.svg +482 -0
  53. package/dist/index.html +22 -0
  54. package/dist/logo-512x512.png +0 -0
  55. package/dist/logo.svg +482 -0
  56. package/dist/manifest.webmanifest +1 -0
  57. package/dist/maskable-icon-512x512.png +0 -0
  58. package/dist/pwa-192x192.png +0 -0
  59. package/dist/pwa-512x512.png +0 -0
  60. package/dist/pwa-64x64.png +0 -0
  61. package/dist/sw.js +2 -0
  62. package/nodes/config/locales/en-US/ui_page.html +7 -0
  63. package/nodes/config/locales/en-US/ui_page.json +5 -0
  64. package/nodes/config/ui_page.html +260 -96
  65. package/nodes/config/ui_page.js +9 -0
  66. package/nodes/widgets/locales/en-US/ui_gauge.html +4 -2
  67. package/nodes/widgets/locales/en-US/ui_gauge.json +2 -1
  68. package/nodes/widgets/locales/en-US/ui_number_input.html +21 -10
  69. package/nodes/widgets/locales/en-US/ui_table.html +8 -3
  70. package/nodes/widgets/locales/en-US/ui_table.json +4 -1
  71. package/nodes/widgets/ui_gauge.html +251 -232
  72. package/nodes/widgets/ui_gauge.js +9 -2
  73. package/nodes/widgets/ui_number_input.html +21 -2
  74. package/nodes/widgets/ui_number_input.js +33 -0
  75. package/nodes/widgets/ui_table.html +13 -1
  76. package/nodes/widgets/ui_table.js +21 -3
  77. package/package.json +5 -4
@@ -1,107 +1,256 @@
1
+ <style>
2
+ .red-ui-editableList-header.node-config-list-breakpoints-header {
3
+ display: flex;
4
+ gap: 12px;
5
+ margin: 0 33px 0 5px;
6
+ padding: 6px 0 3px;
7
+ }
8
+ .node-config-list-breakpoints-header > div,
9
+ .node-config-list-breakpoints-item input {
10
+ width: 33.3%;
11
+ }
12
+ .node-config-list-breakpoints-item {
13
+ display: flex;
14
+ align-items: center;
15
+ gap: 12px;
16
+ margin-right: 28px;
17
+ }
18
+ .node-config-list-breakpoints-item label {
19
+ width: 50px;
20
+ }
21
+ #node-config-list-breakpoints li {
22
+ border-bottom: none;
23
+ }
24
+ .node-config-breakpoints-header {
25
+ display: flex;
26
+ justify-content: space-between;
27
+ align-items: center;
28
+ }
29
+ .node-config-breakpoints-actions {
30
+
31
+ }
32
+ </style>
33
+
1
34
  <script type="text/javascript">
2
- RED.nodes.registerType('ui-page', {
3
- category: 'config',
4
- defaults: {
5
- name: {
6
- value: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.pageName'),
7
- required: true
8
- },
9
- ui: {
10
- type: 'ui-base',
11
- value: '',
12
- required: true
13
- },
14
- path: {
15
- value: -1,
16
- required: false
17
- },
18
- icon: {
19
- value: 'home',
20
- required: false
21
- },
22
- layout: {
23
- value: '',
24
- required: true
25
- },
26
- theme: {
27
- type: 'ui-theme',
28
- value: 'default',
29
- required: true
30
- },
31
- order: {
32
- value: -1
35
+ (async function () {
36
+ // convert to i18 text
37
+ function c_ (x) {
38
+ return RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.' + x)
39
+ }
40
+ RED.nodes.registerType('ui-page', {
41
+ category: 'config',
42
+ defaults: {
43
+ name: {
44
+ value: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.pageName'),
45
+ required: true
46
+ },
47
+ ui: {
48
+ type: 'ui-base',
49
+ value: '',
50
+ required: true
51
+ },
52
+ path: {
53
+ value: -1,
54
+ required: false
55
+ },
56
+ icon: {
57
+ value: 'home',
58
+ required: false
59
+ },
60
+ layout: {
61
+ value: '',
62
+ required: true
63
+ },
64
+ theme: {
65
+ type: 'ui-theme',
66
+ value: 'default',
67
+ required: true
68
+ },
69
+ breakpoints: {
70
+ value: [
71
+ { name: 'Default', px: 0, cols: 3 },
72
+ { name: 'Tablet', px: 576, cols: 6 },
73
+ { name: 'Small Desktop', px: 768, cols: 9 },
74
+ { name: 'Desktop', px: 1024, cols: 12 }
75
+ ]
76
+ },
77
+ order: {
78
+ value: -1
79
+ },
80
+ className: { value: '' },
81
+ visible: { value: 'true' },
82
+ disabled: { value: 'false' }
33
83
  },
34
- className: { value: '' },
35
- visible: { value: 'true' },
36
- disabled: { value: 'false' }
37
- },
38
- oneditprepare: function () {
39
- if (this.path === -1) {
84
+ oneditprepare: function () {
85
+ if (this.path === -1) {
40
86
  // we have no path set yet
41
- let pageCount = 0
42
- RED.nodes.eachConfig((cNode) => {
43
- pageCount += cNode.type === 'ui-page' ? 1 : 0
87
+ let pageCount = 0
88
+ RED.nodes.eachConfig((cNode) => {
89
+ pageCount += cNode.type === 'ui-page' ? 1 : 0
90
+ })
91
+ this.path = '/page' + (pageCount + 1)
92
+ $('#node-config-input-path').val(this.path)
93
+ }
94
+
95
+ $('#node-config-input-layout').typedInput({
96
+ type: 'layout',
97
+ types: [{
98
+ value: 'layout',
99
+ options: [
100
+ { value: 'grid', label: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.grid') },
101
+ { value: 'flex', label: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.fixed') },
102
+ { value: 'tabs', label: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.tabs') },
103
+ { value: 'notebook', label: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.notebook') }
104
+ ]
105
+ }],
106
+ typeField: '#node-input-layoutType'
44
107
  })
45
- this.path = '/page' + (pageCount + 1)
46
- $('#node-config-input-path').val(this.path)
47
- }
48
108
 
49
- $('#node-config-input-layout').typedInput({
50
- type: 'layout',
51
- types: [{
52
- value: 'layout',
53
- options: [
54
- { value: 'grid', label: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.grid') },
55
- { value: 'flex', label: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.fixed') },
56
- { value: 'tabs', label: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.tabs') },
57
- { value: 'notebook', label: RED._('@flowfuse/node-red-dashboard/ui-page:ui-page.label.notebook') }
58
- ]
59
- }],
60
- typeField: '#node-input-layoutType'
61
- })
62
-
63
- // backwards compatibility - because NR can't do boolean values on dropdowns
64
- if (this.visible === false || this.visible === 'false') {
65
- this.visible = false
66
- $('#node-config-input-visible').val('false')
67
- } else {
68
- this.visible = true
69
- $('#node-config-input-visible').val('true')
70
- }
109
+ $('#node-config-input-layout').on('change', function (event, type, value) {
110
+ // show for the others
111
+ if (value === 'flex') {
112
+ $('#node-config-container-breakpoints').hide()
113
+ } else {
114
+ $('#node-config-container-breakpoints').show()
115
+ }
116
+ })
71
117
 
72
- // backwards compatibility
73
- if (this.disabled === 'true' || this.disabled === true) {
74
- this.disabled = true
75
- $('#node-config-input-disabled').val('true')
76
- } else {
77
- this.disabled = false
78
- $('#node-config-input-disabled').val('false')
79
- }
80
- },
81
- oneditsave: function () {
82
- // convert string to boolean
83
- const visible = $('#node-config-input-visible').val()
84
- if (visible === 'true') {
85
- this.visible = true
86
- } else {
87
- this.visible = false
88
- }
118
+ // Breakpoints Editable List
119
+ const breakpointsList = $('#node-config-list-breakpoints').editableList({
120
+ header: $('<div>').addClass('node-config-list-breakpoints-header')
121
+ .append($.parseHTML('<div>' + c_('label.name') + '</div>' +
122
+ '<div>' + c_('label.breakpoint') + '</div>' +
123
+ '<div>' + c_('label.columns') + '</div>')),
124
+ addItem: function (container, i, breakpoint) {
125
+ const row = $('<div>').addClass('node-config-list-breakpoints-item').appendTo(container)
126
+ // Value Field
127
+ $('<input/>').addClass('node-input-breakpoint-name')
128
+ .attr('type', 'text')
129
+ .attr('placeholder', 'Mobile (sm)')
130
+ .val(breakpoint.name)
131
+ .attr('disabled', () => {
132
+ return i === 0
133
+ })
134
+ .appendTo(row)
135
+
136
+ $('<input/>').addClass('node-input-breakpoint-px')
137
+ .attr('type', 'text')
138
+ .attr('required', 'true')
139
+ .attr('placeholder', '1024')
140
+ .val(breakpoint.px)
141
+ .attr('disabled', () => {
142
+ return i === 0
143
+ })
144
+ .appendTo(row)
89
145
 
90
- // convert string to boolean
91
- const disabled = $('#node-config-input-disabled').val()
92
- if (disabled === 'true') {
93
- this.disabled = true
94
- } else {
95
- this.disabled = false
146
+ // Label field
147
+ $('<input/>').addClass('node-input-breakpoint-cols')
148
+ .attr('type', 'text')
149
+ .attr('required', 'true')
150
+ .attr('placeholder', '12')
151
+ .val(breakpoint.cols)
152
+ .appendTo(row)
153
+
154
+ // remove button
155
+ const removeButton = $('<a href="#" class="red-ui-editableList-item-remove red-ui-button red-ui-button-small"><i class="fa fa-remove"></i></a>')
156
+ removeButton.on('click', function (e) {
157
+ e.preventDefault()
158
+ if (i > 0) {
159
+ breakpointsList.editableList('removeItem', breakpoint)
160
+ }
161
+ })
162
+ if (i > 0) {
163
+ row.append(removeButton)
164
+ }
165
+ return row
166
+ }
167
+ })
168
+
169
+ // set defaults
170
+ const defaultBreakpoints = [
171
+ { name: 'Default', px: 0, cols: 3 },
172
+ { name: 'Tablet', px: 576, cols: 6 },
173
+ { name: 'Small Desktop', px: 768, cols: 9 },
174
+ { name: 'Desktop', px: 1024, cols: 12 }
175
+ ]
176
+
177
+ if (!this.breakpoints) {
178
+ this.breakpoints = defaultBreakpoints
179
+ }
180
+
181
+ for (let i = 0; i < this.breakpoints.length; i++) {
182
+ const breakpoint = this.breakpoints[i]
183
+ breakpointsList.editableList('addItem', breakpoint)
184
+ }
185
+
186
+ // setup reset to defaults button
187
+ $('#node-config-breakpoints-reset').on('click', function (e) {
188
+ e.preventDefault()
189
+ breakpointsList.editableList('empty')
190
+ for (let i = 0; i < defaultBreakpoints.length; i++) {
191
+ const breakpoint = defaultBreakpoints[i]
192
+ breakpointsList.editableList('addItem', breakpoint)
193
+ }
194
+ })
195
+
196
+ // backwards compatibility - because NR can't do boolean values on dropdowns
197
+ if (this.visible === false || this.visible === 'false') {
198
+ this.visible = false
199
+ $('#node-config-input-visible').val('false')
200
+ } else {
201
+ this.visible = true
202
+ $('#node-config-input-visible').val('true')
203
+ }
204
+
205
+ // backwards compatibility
206
+ if (this.disabled === 'true' || this.disabled === true) {
207
+ this.disabled = true
208
+ $('#node-config-input-disabled').val('true')
209
+ } else {
210
+ this.disabled = false
211
+ $('#node-config-input-disabled').val('false')
212
+ }
213
+ },
214
+ oneditsave: function () {
215
+ const node = this
216
+ // convert string to boolean
217
+ const visible = $('#node-config-input-visible').val()
218
+ if (visible === 'true') {
219
+ this.visible = true
220
+ } else {
221
+ this.visible = false
222
+ }
223
+
224
+ // convert string to boolean
225
+ const disabled = $('#node-config-input-disabled').val()
226
+ if (disabled === 'true') {
227
+ this.disabled = true
228
+ } else {
229
+ this.disabled = false
230
+ }
231
+
232
+ // breakpoints
233
+ const breakpoints = $('#node-config-list-breakpoints').editableList('items')
234
+
235
+ node.breakpoints = []
236
+ breakpoints.each(function (i) {
237
+ const row = $(this)
238
+ const breakpoint = {
239
+ name: row.find('.node-input-breakpoint-name').val(),
240
+ px: row.find('.node-input-breakpoint-px').val(),
241
+ cols: row.find('.node-input-breakpoint-cols').val()
242
+ }
243
+ node.breakpoints.push(breakpoint)
244
+ })
245
+ },
246
+ label: function () {
247
+ const baseNode = RED.nodes.node(this.ui)
248
+ const base = baseNode ? baseNode.path : '/'
249
+ const path = this.path || ''
250
+ return `${this.name} [${base}${path}]` || 'UI Page'
96
251
  }
97
- },
98
- label: function () {
99
- const baseNode = RED.nodes.node(this.ui)
100
- const base = baseNode ? baseNode.path : '/'
101
- const path = this.path || ''
102
- return `${this.name} [${base}${path}]` || 'UI Page'
103
- }
104
- })
252
+ })
253
+ })()
105
254
  </script>
106
255
 
107
256
  <script type="text/html" data-template-name="ui-page">
@@ -134,6 +283,21 @@
134
283
  <label for="node-config-input-className"><i class="w-16 fa fa-code"></i> <span data-i18n="ui-page.label.class"></label>
135
284
  <input type="text" id="node-config-input-className" data-i18n="[placeholder]ui-page.label.classNamePlaceholder"/>
136
285
  </div>
286
+ <div id="node-config-container-breakpoints">
287
+ <div class="form-row node-config-breakpoints-header" style="font-weight: 600;">
288
+ <div>
289
+ <i class="w-16 fa fa-mobile"></i> <span data-i18n="ui-page.label.responsiveness">
290
+ </div>
291
+ <div class="node-config-breakpoints-actions">
292
+ <button id="node-config-breakpoints-reset" type="button" class="red-ui-button red-ui-button-small" style="margin-top: 4px; margin-right: 5px;" title="add an item">
293
+ <i class="fa fa-refresh"></i><span> <span data-i18n="ui-page.label.reset"></span>
294
+ </button>
295
+ </div>
296
+ </div>
297
+ <div class="form-row">
298
+ <ol id="node-config-list-breakpoints"></ol>
299
+ </div>
300
+ </div>
137
301
  <div class="form-row" style="font-weight: 600;">
138
302
  <i class="w-16 fa fa-eye"></i> <span data-i18n="ui-page.label.defaultState">
139
303
  </div>
@@ -28,6 +28,15 @@ module.exports = function (RED) {
28
28
  config.visible = (config.visible === 'true' || config.visible === true)
29
29
  }
30
30
 
31
+ if (!('breakpoints' in config)) {
32
+ config.breakpoints = [
33
+ { name: 'Default', px: 0, cols: 3 },
34
+ { name: 'Tablet', px: 576, cols: 6 },
35
+ { name: 'Small Desktop', px: 768, cols: 9 },
36
+ { name: 'Desktop', px: 1024, cols: 12 }
37
+ ]
38
+ }
39
+
31
40
  const ui = RED.nodes.getNode(config.ui)
32
41
 
33
42
  // register self
@@ -11,7 +11,9 @@
11
11
  <dt>Segments <span class="property-type">list</span></dt>
12
12
  <dd>Collection of objects that define the relevant color for a given value</dd>
13
13
  <dt>Label <span class="property-type">list</span></dt>
14
- <dd>The title text shown above the gauge</dd>
14
+ <dd>The label text shown above the gauge</dd>
15
+ <dt>Defaults <span class="property-type">list</span></dt>
16
+ <dd>Reset to default min/max and segments based on the selected gauge type</dd>
15
17
  </dl>
16
18
  <h3>Properties (Half &amp; 3/4 Gauges Only)</h3>
17
19
  <dl class="message-properties">
@@ -31,7 +33,7 @@
31
33
  <h3>Dynamic Properties (Inputs)</h3>
32
34
  <p>Any of the following can be appended to a <code>msg.ui_update</code> in order to override or set properties on this node at runtime.</p>
33
35
  <dl class="message-properties">
34
- <dt class="optional">title <span class="property-type">string</span></dt>
36
+ <dt class="optional">label <span class="property-type">string</span></dt>
35
37
  <dd>Update the label rendered above the Gauge</dd>
36
38
  <dt class="optional">segments <span class="property-type">array</span></dt>
37
39
  <dd>
@@ -28,7 +28,8 @@
28
28
  "styling": "Styling",
29
29
  "class": "Class",
30
30
  "units": "Units",
31
- "icon": "Icon"
31
+ "icon": "Icon",
32
+ "defaults": "Defaults"
32
33
  },
33
34
  "errors": {
34
35
  "unique": "All 'from' values must be unique."
@@ -3,26 +3,37 @@
3
3
  Adds a single number input row to your dashboard
4
4
  </p>
5
5
  <h3>Dynamic Properties (Inputs)</h3>
6
- <p>Any of the following can be appended to a <code>msg.</code> in order to override or set properties on this node at runtime.</p>
6
+ <p>Any of the following can be appended to <code>msg.ui_update</code> in order to override or set properties on this node at runtime.</p>
7
7
  <dl class="message-properties">
8
8
  <dt class="optional">class <span class="property-type">string</span></dt>
9
- <dd>Add a CSS class, or more, to the Button at runtime.</dd>
10
- <dd>Range <span class="property-type">number</span></dd>
11
- <dd>
12
- min - the minimum value the slider can be changed to; max - the maximum value the
13
- slider can be changed to; step - the increment/decrement value when the slider is moved.
14
- </dd>
9
+ <dd>Add a CSS class, or more, to the number input at runtime.</dd>
15
10
  </dl>
16
11
  <dl class="message-properties">
17
12
  <dt class="optional">min <span class="property-type">number</span></dt>
18
- <dd>The minimum value available on the slider.</dd>
13
+ <dd>Override the minimum value available on the number input.</dd>
19
14
  </dl>
20
15
  <dl class="message-properties">
21
16
  <dt class="optional">step <span class="property-type">number</span></dt>
22
- <dd>The step size to allow a user to select from between the <code>min</code> and <code>max</code> values.</dd>
17
+ <dd>Override the step size to allow a user to select from between the <code>min</code> and <code>max</code> values.</dd>
23
18
  </dl>
24
19
  <dl class="message-properties">
25
20
  <dt class="optional">max <span class="property-type">number</span></dt>
26
- <dd>The maximum value available on the slider.</dd>
21
+ <dd>Override the maximum value available on the number input.</dd>
22
+ </dl>
23
+ <dl class="message-properties">
24
+ <dt class="optional">label <span class="property-type">string</span></dt>
25
+ <dd>Override the label displayed on the number input.</dd>
26
+ </dl>
27
+ <dl class="message-properties">
28
+ <dt class="optional">icon <span class="property-type">string</span></dt>
29
+ <dd>Override the icon defined in the initial configuration.</dd>
30
+ </dl>
31
+ <dl class="message-properties">
32
+ <dt class="optional">clearable <span class="property-type">boolean</span></dt>
33
+ <dd>Controls whether an "x" appears number on input as a user types in order to quickly clear any added numbers.</dd>
34
+ </dl>
35
+ <dl class="message-properties">
36
+ <dt class="optional">spinner <span class="property-type">string</span></dt>
37
+ <dd>Set the spinner layout as <code>inline</code> or <code>stacked</code> to control how the spinners appear in the number input.</dd>
27
38
  </dl>
28
39
  </script>
@@ -4,9 +4,9 @@
4
4
  </p>
5
5
  <h3>Input</h3>
6
6
  <p>
7
- The ui-table widget requires an array of data to be sent via <code>msg.payload</code>.
8
- The table will then render a row for each object within the array, and, by default, a
9
- column for each property in the objects.
7
+ The ui-table widget requires an array or an object of data to be sent via <code>msg.payload</code>.
8
+ If an array is provided, the table will render a row for each object within the array, and, by default, a column for each property in the objects.
9
+ If an object is provided, the table will render a single row with columns for each property in the object.
10
10
  </p>
11
11
  <h3>Properties</h3>
12
12
  <dl class="message-properties">
@@ -15,6 +15,11 @@
15
15
  Defines the maximum number of data-rows to render in the table.
16
16
  Excess rows will be available through pagination control. Set to "0" for no pagination.
17
17
  </dd>
18
+ <dt>Action <span class="property-type">append | replace</span></dt>
19
+ <dd>
20
+ Determines the action taken when new data arrives, and whether the new data is appended
21
+ to the chart, or replaces the existing contents.
22
+ </dd>
18
23
  <dt>Breakpoint <span class="property-type">str | num</span></dt>
19
24
  <dd>
20
25
  Controls when a table will render, instead, as a card, with each column from a row rendering
@@ -18,7 +18,10 @@
18
18
  "selection": "Interaction",
19
19
  "search": "Search",
20
20
  "showSearch": "Show",
21
- "mobileBreakpoint": "Breakpoint"
21
+ "mobileBreakpoint": "Breakpoint",
22
+ "action": "Action",
23
+ "append": "Append",
24
+ "replace": "Replace"
22
25
  },
23
26
  "selection": {
24
27
  "none": "None",