mbg-val-input 0.4.2 → 0.4.3

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.
@@ -38,6 +38,8 @@ function sanitizeAndValidateInt(
38
38
  isUserInput: boolean,
39
39
  isSigned = true,
40
40
  ) {
41
+ if (!value) return '';
42
+
41
43
  // allow leading negative sign
42
44
  const signed = value[0] === '-' ? '-' : '';
43
45
  const negative = signed === '-';
@@ -104,6 +106,8 @@ function sanitizeAndValidateFloat(
104
106
  isUserInput: boolean,
105
107
  size: 32 | 64,
106
108
  ) {
109
+ if (!value) return '';
110
+
107
111
  let sanitized = '';
108
112
 
109
113
  // allow leading negative sign
@@ -177,18 +181,20 @@ function sanitizeAndValidateFloat(
177
181
  }
178
182
 
179
183
  function sanitizeOctet(value: string) {
180
- return value.replace(/[^0-9a-fA-F]/g, '');
184
+ return value?.replace(/[^0-9a-fA-F]/g, '');
181
185
  }
182
186
 
183
187
  function sanitizeObjRef(value: string) {
184
- return value.replace(/[^A-Za-z0-9_/$]/g, '');
188
+ return value?.replace(/[^A-Za-z0-9_/$]/g, '');
185
189
  }
186
190
 
187
191
  function sanitizeBitString(value: string) {
188
- return value.replace(/[^01]/g, '');
192
+ return value?.replace(/[^01]/g, '');
189
193
  }
190
194
 
191
195
  function formatTimestamp(input: string) {
196
+ if (!input) return '';
197
+
192
198
  const digits = input.replace(/\D/g, '');
193
199
 
194
200
  // Extract parts
@@ -223,6 +229,8 @@ export class MbgValInput extends LitElement {
223
229
 
224
230
  @property({ type: String }) bType?: string;
225
231
 
232
+ @property({ type: Boolean }) readOnly = false;
233
+
226
234
  // If the DA/BDA is assigned a Val in DataTypeTemplates
227
235
  @property({ type: String }) default = '';
228
236
 
@@ -304,6 +312,7 @@ export class MbgValInput extends LitElement {
304
312
  type="text"
305
313
  value="${validatedDefault ?? nothing}"
306
314
  @input="${this.handleBigIntInput}"
315
+ ?disabled="${this.readOnly}"
307
316
  ></md-outlined-text-field>`;
308
317
  }
309
318
 
@@ -316,6 +325,7 @@ export class MbgValInput extends LitElement {
316
325
  max="${max}"
317
326
  value="${validatedDefault ?? nothing}"
318
327
  @input="${this.handleIntInput}"
328
+ ?disabled="${this.readOnly}"
319
329
  ></md-outlined-text-field>`;
320
330
  }
321
331
 
@@ -353,6 +363,7 @@ export class MbgValInput extends LitElement {
353
363
  type="text"
354
364
  value="${validatedDefault ?? nothing}"
355
365
  @input="${this.handleFloatInput}"
366
+ ?disabled="${this.readOnly}"
356
367
  ></md-outlined-text-field>
357
368
  `;
358
369
  }
@@ -374,6 +385,7 @@ export class MbgValInput extends LitElement {
374
385
  value="${sanitizeOctet(this.default) ?? nothing}"
375
386
  maxlength="${size * 2}"
376
387
  @input="${this.handleOctetInput}"
388
+ ?disabled="${this.readOnly}"
377
389
  ></md-outlined-text-field>
378
390
  `;
379
391
  }
@@ -394,6 +406,7 @@ export class MbgValInput extends LitElement {
394
406
  value="${this.default ?? nothing}"
395
407
  maxlength="${size}"
396
408
  @input="${this.handleStringInput}"
409
+ ?disabled="${this.readOnly}"
397
410
  ></md-outlined-text-field>
398
411
  `;
399
412
  }
@@ -410,7 +423,11 @@ export class MbgValInput extends LitElement {
410
423
  }
411
424
 
412
425
  return html`
413
- <md-filled-select id="input" label="${this.label}">
426
+ <md-filled-select
427
+ id="input"
428
+ label="${this.label}"
429
+ ?disabled="${this.readOnly}"
430
+ >
414
431
  ${ordinals.map(
415
432
  (ordinal, index) => html`
416
433
  <md-select-option
@@ -449,6 +466,7 @@ export class MbgValInput extends LitElement {
449
466
  label="${this.label}"
450
467
  value="${validatedDefault ?? nothing}"
451
468
  @input="${this.handleTimestampInput}"
469
+ ?disabled="${this.readOnly}"
452
470
  ></md-outlined-text-field>
453
471
  `;
454
472
  }
@@ -470,13 +488,14 @@ export class MbgValInput extends LitElement {
470
488
  value="${sanitizeObjRef(this.default) ?? nothing}"
471
489
  maxlength="255"
472
490
  @input="${this.handleObjRefInput}"
491
+ ?disabled="${this.readOnly}"
473
492
  ></md-outlined-text-field>
474
493
  `;
475
494
  }
476
495
 
477
496
  dbposInput() {
478
497
  return html`
479
- <md-filled-select id="input" label="${this.label}">
498
+ <md-filled-select id="input" label="${this.label}" ?disabled="${this.readOnly}">
480
499
  <md-select-option value="0" ?selected=${this.default === '0'}>
481
500
  <div slot="headline">0 - intermediate-state</div>
482
501
  </md-select-option>
@@ -497,7 +516,7 @@ export class MbgValInput extends LitElement {
497
516
 
498
517
  tcmdInput() {
499
518
  return html`
500
- <md-filled-select id="input" label="${this.label}">
519
+ <md-filled-select id="input" label="${this.label}" ?disabled="${this.readOnly}">
501
520
  <md-select-option value="0" ?selected=${this.default === '0'}>
502
521
  <div slot="headline">0 - neutral</div>
503
522
  </md-select-option>
@@ -533,6 +552,7 @@ export class MbgValInput extends LitElement {
533
552
  value="${sanitizeBitString(this.default) ?? nothing}"
534
553
  maxlength="${size}"
535
554
  @input="${this.handleBitStringInput}"
555
+ ?disabled="${this.readOnly}"
536
556
  ></md-outlined-text-field>
537
557
  `;
538
558
  }
@@ -552,7 +572,11 @@ export class MbgValInput extends LitElement {
552
572
  return {
553
573
  BOOLEAN: html`<label
554
574
  >${this.label}
555
- <md-switch id="input" ?selected=${xmlBoolean(this.default)}></md-switch
575
+ <md-switch
576
+ id="input"
577
+ ?disabled="${this.readOnly}"
578
+ ?selected=${xmlBoolean(this.default)}
579
+ ></md-switch
556
580
  ></label>`,
557
581
  INT8: this.intInput(8),
558
582
  INT16: this.intInput(16),
@@ -576,7 +600,7 @@ export class MbgValInput extends LitElement {
576
600
  VisString255: this.stringInput(255),
577
601
  Unicode255: this.stringInput(255),
578
602
  Quality: this.bitstringInput(14),
579
- Currency: currencyInput(this.label, this.default),
603
+ Currency: currencyInput(this.label, this.default, this.readOnly),
580
604
  Enum: this.enumInput(),
581
605
  Timestamp: this.timestampInput(),
582
606
  ObjRef: this.objrefInput(),
@@ -599,6 +623,7 @@ export class MbgValInput extends LitElement {
599
623
  id="input"
600
624
  label="${this.label}"
601
625
  value="${this.default ?? nothing}"
626
+ ?disabled="${this.readOnly}"
602
627
  ></md-outlined-text-field>`
603
628
  );
604
629
  }
@@ -3,9 +3,13 @@ import { html } from 'lit';
3
3
  import '@material/web/select/filled-select.js';
4
4
  import '@material/web/select/select-option.js';
5
5
 
6
- export function currencyInput(label: string, defaultVal: string) {
6
+ export function currencyInput(
7
+ label: string,
8
+ defaultVal: string,
9
+ readOnly: boolean,
10
+ ) {
7
11
  return html`
8
- <md-filled-select id="input" label="${label}">
12
+ <md-filled-select id="input" label="${label}" ?disabled="${readOnly}">
9
13
  <md-select-option value="AED" ?selected=${defaultVal === 'AED'}>
10
14
  <div slot="headline">AED (UAE Dirham)</div>
11
15
  </md-select-option>
@@ -6,6 +6,7 @@ export default {
6
6
  component: 'mbg-val-input',
7
7
  argTypes: {
8
8
  bType: { control: 'text' },
9
+ readOnly: { control: 'boolean' },
9
10
  defaultVal: { control: 'text' },
10
11
  enumOrdinals: { control: 'array' },
11
12
  enumLabels: { control: 'array' },
@@ -22,6 +23,7 @@ interface Story<T> {
22
23
 
23
24
  interface ArgTypes {
24
25
  bType?: string;
26
+ readOnly?: boolean;
25
27
  defaultVal?: string;
26
28
  enumOrdinals?: string[];
27
29
  enumLabels?: string[];
@@ -31,6 +33,7 @@ interface ArgTypes {
31
33
 
32
34
  const Template: Story<ArgTypes> = ({
33
35
  bType,
36
+ readOnly,
34
37
  defaultVal,
35
38
  enumOrdinals,
36
39
  enumLabels,
@@ -39,6 +42,7 @@ const Template: Story<ArgTypes> = ({
39
42
  }: ArgTypes) => html`
40
43
  <mbg-val-input
41
44
  .bType=${bType}
45
+ .readOnly=${readOnly}
42
46
  .default=${defaultVal}
43
47
  .enumOrdinals=${JSON.stringify(enumOrdinals)}
44
48
  .enumLabels=${JSON.stringify(enumLabels)}
@@ -66,6 +70,14 @@ BooleanWithDefault.args = {
66
70
  label: 'Boolean (Default: true)',
67
71
  };
68
72
 
73
+ export const BooleanReadOnly = Template.bind({});
74
+ BooleanReadOnly.args = {
75
+ bType: 'BOOLEAN',
76
+ defaultVal: 'true',
77
+ readOnly: true,
78
+ label: 'Boolean (Default: true)',
79
+ };
80
+
69
81
  export const Int32U = Template.bind({});
70
82
  Int32U.args = {
71
83
  bType: 'INT32U',
@@ -82,6 +94,7 @@ export const Int64WithDefault = Template.bind({});
82
94
  Int64WithDefault.args = {
83
95
  bType: 'INT64',
84
96
  defaultVal: '-42',
97
+ readOnly: true,
85
98
  label: 'INT64 (Default: -42)',
86
99
  };
87
100
 
@@ -116,6 +129,7 @@ Octet16.args = {
116
129
  bType: 'Octet16',
117
130
  defaultVal: '0123456789ABCDEF0123456789ABCDEF',
118
131
  label: 'Octet16',
132
+ readOnly: true,
119
133
  };
120
134
 
121
135
  export const VisString32 = Template.bind({});
@@ -145,6 +159,14 @@ Currency.args = {
145
159
  label: 'Currency',
146
160
  };
147
161
 
162
+ export const CurrencyReadOnly = Template.bind({});
163
+ CurrencyReadOnly.args = {
164
+ bType: 'Currency',
165
+ defaultVal: 'JPY',
166
+ readOnly: true,
167
+ label: 'Currency',
168
+ };
169
+
148
170
  export const EnumHlth = Template.bind({});
149
171
  EnumHlth.args = {
150
172
  bType: 'Enum',
@@ -154,6 +176,16 @@ EnumHlth.args = {
154
176
  defaultVal: '1',
155
177
  };
156
178
 
179
+ export const EnumHlthReadOnly = Template.bind({});
180
+ EnumHlthReadOnly.args = {
181
+ bType: 'Enum',
182
+ enumOrdinals: ['1', '2', '3'],
183
+ enumLabels: ['Ok', 'Warning', 'Alarm'],
184
+ label: 'Enum - HealthKind',
185
+ defaultVal: '1',
186
+ readOnly: true,
187
+ };
188
+
157
189
  export const Timestamp = Template.bind({});
158
190
  Timestamp.args = {
159
191
  bType: 'Timestamp',
@@ -170,9 +202,17 @@ ObjRef.args = {
170
202
 
171
203
  export const Dbpos = Template.bind({});
172
204
  Dbpos.args = {
205
+ bType: 'Dbpos',
206
+ label: 'Double-Point Status',
207
+ defaultVal: '0',
208
+ };
209
+
210
+ export const DbposReadOnly = Template.bind({});
211
+ DbposReadOnly.args = {
173
212
  bType: 'Dbpos',
174
213
  label: 'Double-Point Status',
175
214
  defaultVal: '2',
215
+ readOnly: true,
176
216
  };
177
217
 
178
218
  export const Tcmd = Template.bind({});
@@ -182,6 +222,14 @@ Tcmd.args = {
182
222
  defaultVal: '2',
183
223
  };
184
224
 
225
+ export const TcmdReadOnly = Template.bind({});
226
+ TcmdReadOnly.args = {
227
+ bType: 'Tcmd',
228
+ label: 'Tap Command',
229
+ defaultVal: '3',
230
+ readOnly: true,
231
+ };
232
+
185
233
  export const EntryTime = Template.bind({});
186
234
  EntryTime.args = {
187
235
  bType: 'EntryTime',
@@ -206,6 +254,7 @@ OptFlds.args = {
206
254
  bType: 'OptFlds',
207
255
  label: 'Optional Fields',
208
256
  defaultVal: '0000000011',
257
+ readOnly: false,
209
258
  };
210
259
 
211
260
  export const SvOptFlds = Template.bind({});
@@ -213,6 +262,7 @@ SvOptFlds.args = {
213
262
  bType: 'SvOptFlds',
214
263
  label: 'Sampled Values Optional Fields',
215
264
  defaultVal: '000101',
265
+ readOnly: true,
216
266
  };
217
267
 
218
268
  export const LogOptFlds = Template.bind({});