mbg-val-input 0.4.2 → 0.5.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.
package/README.md CHANGED
@@ -2,6 +2,27 @@
2
2
 
3
3
  This webcomponent follows the [open-wc](https://github.com/open-wc/open-wc) recommendation.
4
4
 
5
+ ## Table of contents
6
+
7
+ - [Installation](#installation)
8
+ - [Usage](#usage)
9
+ - [Theming](#theming)
10
+ - [Supported basic types (bTypes)](#supported-basic-types-btypes)
11
+ - [Boolean](#boolean)
12
+ - [Integers](#integers)
13
+ - [Floats](#floats)
14
+ - [Octet strings](#octet-strings)
15
+ - [Visible and Unicode strings](#visible-and-unicode-strings)
16
+ - [Bit strings](#bit-strings)
17
+ - [Enumerations](#enumerations)
18
+ - [Other](#other)
19
+ - [Development Workflow](#development-workflow)
20
+ - [Linting and formatting](#linting-and-formatting)
21
+ - [Testing with Web Test Runner](#testing-with-web-test-runner)
22
+ - [Demoing with Storybook](#demoing-with-storybook)
23
+ - [Tooling configs](#tooling-configs)
24
+ - [Local Demo with web-dev-server](#local-demo-with-web-dev-server)
25
+
5
26
  ## Installation
6
27
 
7
28
  ```bash
@@ -18,7 +39,116 @@ npm i mbg-val-input
18
39
  <mbg-val-input></mbg-val-input>
19
40
  ```
20
41
 
21
- ## Linting and formatting
42
+ ## Theming
43
+
44
+ `<mbg-val-input>` exposes CSS custom properties (design tokens) so you can adjust its appearance without overriding internal styles. The default values are based on what is defined in the Material Web toolkit.
45
+
46
+ | Token | Default | Description |
47
+ | --- | --- | --- |
48
+ | `--mbg-val-input-shape` | `4px` | Border radius of the input container |
49
+ | `--mbg-val-input-space` | `16px` | Top and bottom padding inside the field |
50
+ | `--mbg-val-input-height` | `56px` | Height of the component |
51
+ | `--mbg-val-input-width` | `auto` | Width of the component |
52
+ | `--mbg-val-input-min-width` | `100px` | Minimum width |
53
+ | `--mbg-val-input-max-width` | `100%` | Maximum width |
54
+
55
+ Set any of these on the element or a parent selector:
56
+
57
+ ```css
58
+ mbg-val-input {
59
+ --mbg-val-input-shape: 8px;
60
+ --mbg-val-input-height: 48px;
61
+ --mbg-val-input-width: 320px;
62
+ }
63
+ ```
64
+
65
+ ## Supported basic types (bTypes)
66
+
67
+ `<mbg-val-input>` supports the following basic types, as defined in the IEC 61850 standard. Pass the type via the `bType` attribute.
68
+
69
+ ### Boolean
70
+
71
+ | bType | Input | Notes |
72
+ | --- | --- | --- |
73
+ | `BOOLEAN` | Toggle switch | Accepts `true`/`1` or `false`/`0` as default value |
74
+
75
+ ### Integers
76
+
77
+ | bType | Input | Range |
78
+ | --- | --- | --- |
79
+ | `INT8` | Number field | -128 to 127 |
80
+ | `INT16` | Number field | -32,768 to 32,767 |
81
+ | `INT24` | Number field | -8,388,608 to 8,388,607 |
82
+ | `INT32` | Number field | -2,147,483,648 to 2,147,483,647 |
83
+ | `INT64` | Text field | 64-bit signed (parsed as BigInt) |
84
+ | `INT128` | Text field | 128-bit signed (parsed as BigInt) |
85
+ | `INT8U` | Number field | 0 to 255 |
86
+ | `INT16U` | Number field | 0 to 65,535 |
87
+ | `INT24U` | Number field | 0 to 16,777,215 |
88
+ | `INT32U` | Number field | 0 to 4,294,967,295 |
89
+ | `Check` | Number field | 8-bit unsigned (0 to 255) |
90
+
91
+ ### Floats
92
+
93
+ | bType | Input | Range |
94
+ | --- | --- | --- |
95
+ | `FLOAT32` | Text field | IEEE 754 single precision |
96
+ | `FLOAT64` | Text field | IEEE 754 double precision |
97
+
98
+ ### Octet strings
99
+
100
+ Accepts hexadecimal characters only. Max length is `size × 2` hex characters.
101
+
102
+ | bType | Input | Max length |
103
+ | --- | --- | --- |
104
+ | `Octet6` | Text field | 12 hex chars |
105
+ | `Octet16` | Text field | 32 hex chars |
106
+ | `Octet64` | Text field | 128 hex chars |
107
+ | `EntryID` | Text field | 16 hex chars |
108
+ | `EntryTime` | Text field | 12 hex chars |
109
+
110
+ ### Visible and Unicode strings
111
+
112
+ | bType | Input | Max length |
113
+ | --- | --- | --- |
114
+ | `VisString32` | Text field | 32 |
115
+ | `VisString64` | Text field | 64 |
116
+ | `VisString65` | Text field | 65 |
117
+ | `VisString129` | Text field | 129 |
118
+ | `VisString255` | Text field | 255 |
119
+ | `Unicode255` | Text field | 255 |
120
+
121
+ ### Bit strings
122
+
123
+ Accepts only `0` and `1` characters.
124
+
125
+ | bType | Input | Length |
126
+ | --- | --- | --- |
127
+ | `Quality` | Text field | 14 bits |
128
+ | `TrgOps` | Text field | 6 bits |
129
+ | `OptFlds` | Text field | 10 bits |
130
+ | `SvOptFlds` | Text field | 6 bits |
131
+ | `LogOptFlds` | Text field | 5 bits |
132
+
133
+ ### Enumerations
134
+
135
+ | bType | Input | Notes |
136
+ | --- | --- | --- |
137
+ | `Enum` | Dropdown | Options driven by `enumOrdinals` and `enumLabels` properties |
138
+ | `Dbpos` | Dropdown | Fixed: `0` intermediate-state, `1` off, `2` on, `3` bad-state |
139
+ | `Tcmd` | Dropdown | Fixed: `0` neutral, `1` lower, `2` higher, `3` reserved |
140
+
141
+ ### Other
142
+
143
+ | bType | Input | Notes |
144
+ | --- | --- | --- |
145
+ | `Timestamp` | Text field | Format: `YYYY-MM-DDTHH:MM:SS.sss` |
146
+ | `ObjRef` | Text field | Alphanumeric and `_`, `/`, `$`; max 255 chars |
147
+ | `Currency` | Currency field | Custom currency input |
148
+
149
+ ## Development Workflow
150
+
151
+ ### Linting and formatting
22
152
 
23
153
  To scan the project for linting and formatting errors, run
24
154
 
@@ -32,7 +162,7 @@ To automatically fix linting and formatting errors, run
32
162
  npm run format
33
163
  ```
34
164
 
35
- ## Testing with Web Test Runner
165
+ ### Testing with Web Test Runner
36
166
 
37
167
  To execute a single test run:
38
168
 
@@ -46,7 +176,7 @@ To run the tests in interactive watch mode run:
46
176
  npm run test:watch
47
177
  ```
48
178
 
49
- ## Demoing with Storybook
179
+ ### Demoing with Storybook
50
180
 
51
181
  To run a local instance of Storybook for your component, run
52
182
 
@@ -60,14 +190,13 @@ To build a production version of Storybook, run
60
190
  npm run storybook:build
61
191
  ```
62
192
 
63
-
64
- ## Tooling configs
193
+ ### Tooling configs
65
194
 
66
195
  For most of the tools, the configuration is in the `package.json` to reduce the amount of files in your project.
67
196
 
68
197
  If you customize the configuration a lot, you can consider moving them to individual files.
69
198
 
70
- ## Local Demo with `web-dev-server`
199
+ ### Local Demo with `web-dev-server`
71
200
 
72
201
  ```bash
73
202
  npm start
package/demo/index.html CHANGED
@@ -4,6 +4,12 @@
4
4
  <meta charset="utf-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0, viewport-fit=cover" />
6
6
  <style>
7
+ * {
8
+ --mbg-val-input-shape: 10px;
9
+ --mbg-val-input-space: 8px;
10
+ --mbg-val-input-height: 40px;
11
+ }
12
+
7
13
  body {
8
14
  background: #fafafa;
9
15
  font-family: sans-serif;
@@ -1,12 +1,13 @@
1
1
  import { LitElement, TemplateResult } from 'lit';
2
2
  import '@material/web/textfield/outlined-text-field.js';
3
- import '@material/web/select/filled-select.js';
3
+ import '@material/web/select/outlined-select.js';
4
4
  import '@material/web/select/select-option.js';
5
5
  import '@material/web/switch/switch.js';
6
6
  /** Web Component for inputting IEC61850-6 "Val" values */
7
7
  export declare class MbgValInput extends LitElement {
8
- static styles: import("lit").CSSResult;
8
+ static styles: import("lit").CSSResult[];
9
9
  bType?: string;
10
+ readOnly: boolean;
10
11
  default: string;
11
12
  enumOrdinals: string[];
12
13
  enumLabels: string[];
@@ -3,8 +3,9 @@ import { __decorate } from "tslib";
3
3
  import { html, css, LitElement, nothing } from 'lit';
4
4
  import { property, query } from 'lit/decorators.js';
5
5
  import { currencyInput } from './currency-input.js';
6
+ import { designTokens } from './design-tokens.js';
6
7
  import '@material/web/textfield/outlined-text-field.js';
7
- import '@material/web/select/filled-select.js';
8
+ import '@material/web/select/outlined-select.js';
8
9
  import '@material/web/select/select-option.js';
9
10
  import '@material/web/switch/switch.js';
10
11
  function xmlBoolean(val) {
@@ -26,6 +27,8 @@ function isValidBigInt(value, size) {
26
27
  return false;
27
28
  }
28
29
  function sanitizeAndValidateInt(value, size, isUserInput, isSigned = true) {
30
+ if (!value)
31
+ return '';
29
32
  // allow leading negative sign
30
33
  const signed = value[0] === '-' ? '-' : '';
31
34
  const negative = signed === '-';
@@ -79,6 +82,8 @@ function isValidFloat(value, size) {
79
82
  }
80
83
  /** Removes invalid characters and validates the float value input */
81
84
  function sanitizeAndValidateFloat(value, isUserInput, size) {
85
+ if (!value)
86
+ return '';
82
87
  let sanitized = '';
83
88
  // allow leading negative sign
84
89
  const signed = value[0] === '-' ? '-' : '';
@@ -140,15 +145,17 @@ function sanitizeAndValidateFloat(value, isUserInput, size) {
140
145
  return sanitized;
141
146
  }
142
147
  function sanitizeOctet(value) {
143
- return value.replace(/[^0-9a-fA-F]/g, '');
148
+ return value?.replace(/[^0-9a-fA-F]/g, '');
144
149
  }
145
150
  function sanitizeObjRef(value) {
146
- return value.replace(/[^A-Za-z0-9_/$]/g, '');
151
+ return value?.replace(/[^A-Za-z0-9_/$]/g, '');
147
152
  }
148
153
  function sanitizeBitString(value) {
149
- return value.replace(/[^01]/g, '');
154
+ return value?.replace(/[^01]/g, '');
150
155
  }
151
156
  function formatTimestamp(input) {
157
+ if (!input)
158
+ return '';
152
159
  const digits = input.replace(/\D/g, '');
153
160
  // Extract parts
154
161
  const year = digits.slice(0, 4);
@@ -177,6 +184,7 @@ function formatTimestamp(input) {
177
184
  export class MbgValInput extends LitElement {
178
185
  constructor() {
179
186
  super(...arguments);
187
+ this.readOnly = false;
180
188
  // If the DA/BDA is assigned a Val in DataTypeTemplates
181
189
  this.default = '';
182
190
  // if bType === "Enum" - ordinal values
@@ -225,6 +233,7 @@ export class MbgValInput extends LitElement {
225
233
  type="text"
226
234
  value="${validatedDefault ?? nothing}"
227
235
  @input="${this.handleBigIntInput}"
236
+ ?disabled="${this.readOnly}"
228
237
  ></md-outlined-text-field>`;
229
238
  }
230
239
  return html `<md-outlined-text-field
@@ -236,6 +245,7 @@ export class MbgValInput extends LitElement {
236
245
  max="${max}"
237
246
  value="${validatedDefault ?? nothing}"
238
247
  @input="${this.handleIntInput}"
248
+ ?disabled="${this.readOnly}"
239
249
  ></md-outlined-text-field>`;
240
250
  }
241
251
  handleFloatInput(event) {
@@ -257,6 +267,7 @@ export class MbgValInput extends LitElement {
257
267
  type="text"
258
268
  value="${validatedDefault ?? nothing}"
259
269
  @input="${this.handleFloatInput}"
270
+ ?disabled="${this.readOnly}"
260
271
  ></md-outlined-text-field>
261
272
  `;
262
273
  }
@@ -276,6 +287,7 @@ export class MbgValInput extends LitElement {
276
287
  value="${sanitizeOctet(this.default) ?? nothing}"
277
288
  maxlength="${size * 2}"
278
289
  @input="${this.handleOctetInput}"
290
+ ?disabled="${this.readOnly}"
279
291
  ></md-outlined-text-field>
280
292
  `;
281
293
  }
@@ -294,6 +306,7 @@ export class MbgValInput extends LitElement {
294
306
  value="${this.default ?? nothing}"
295
307
  maxlength="${size}"
296
308
  @input="${this.handleStringInput}"
309
+ ?disabled="${this.readOnly}"
297
310
  ></md-outlined-text-field>
298
311
  `;
299
312
  }
@@ -307,16 +320,21 @@ export class MbgValInput extends LitElement {
307
320
  labels = JSON.parse(this.enumLabels);
308
321
  }
309
322
  return html `
310
- <md-filled-select id="input" label="${this.label}">
323
+ <md-outlined-select
324
+ id="input"
325
+ label="${this.label}"
326
+ ?disabled="${this.readOnly}"
327
+ >
311
328
  ${ordinals.map((ordinal, index) => html `
312
329
  <md-select-option
313
330
  value="${labels[index]}"
314
- ?selected=${(this.default === labels[index]) || (this.default === ordinal)}
331
+ ?selected=${this.default === labels[index] ||
332
+ this.default === ordinal}
315
333
  >
316
334
  <div slot="headline">${ordinal} - ${labels[index]}</div>
317
335
  </md-select-option>
318
336
  `)}
319
- </md-filled-select>
337
+ </md-outlined-select>
320
338
  `;
321
339
  }
322
340
  handleTimestampInput(event) {
@@ -339,6 +357,7 @@ export class MbgValInput extends LitElement {
339
357
  label="${this.label}"
340
358
  value="${validatedDefault ?? nothing}"
341
359
  @input="${this.handleTimestampInput}"
360
+ ?disabled="${this.readOnly}"
342
361
  ></md-outlined-text-field>
343
362
  `;
344
363
  }
@@ -358,12 +377,13 @@ export class MbgValInput extends LitElement {
358
377
  value="${sanitizeObjRef(this.default) ?? nothing}"
359
378
  maxlength="255"
360
379
  @input="${this.handleObjRefInput}"
380
+ ?disabled="${this.readOnly}"
361
381
  ></md-outlined-text-field>
362
382
  `;
363
383
  }
364
384
  dbposInput() {
365
385
  return html `
366
- <md-filled-select id="input" label="${this.label}">
386
+ <md-outlined-select id="input" label="${this.label}" ?disabled="${this.readOnly}">
367
387
  <md-select-option value="0" ?selected=${this.default === '0'}>
368
388
  <div slot="headline">0 - intermediate-state</div>
369
389
  </md-select-option>
@@ -378,12 +398,12 @@ export class MbgValInput extends LitElement {
378
398
  <md-select-option value="3" ?selected=${this.default === '3'}>
379
399
  <div slot="headline">3 - bad-state</div>
380
400
  </md-select-option>
381
- </md-filled-select>
401
+ </md-outlined-select>
382
402
  `;
383
403
  }
384
404
  tcmdInput() {
385
405
  return html `
386
- <md-filled-select id="input" label="${this.label}">
406
+ <md-outlined-select id="input" label="${this.label}" ?disabled="${this.readOnly}">
387
407
  <md-select-option value="0" ?selected=${this.default === '0'}>
388
408
  <div slot="headline">0 - neutral</div>
389
409
  </md-select-option>
@@ -398,7 +418,7 @@ export class MbgValInput extends LitElement {
398
418
  <md-select-option value="3" ?selected=${this.default === '3'}>
399
419
  <div slot="headline">3 - reserved</div>
400
420
  </md-select-option>
401
- </md-filled-select>
421
+ </md-outlined-select>
402
422
  `;
403
423
  }
404
424
  handleBitStringInput(event) {
@@ -417,6 +437,7 @@ export class MbgValInput extends LitElement {
417
437
  value="${sanitizeBitString(this.default) ?? nothing}"
418
438
  maxlength="${size}"
419
439
  @input="${this.handleBitStringInput}"
440
+ ?disabled="${this.readOnly}"
420
441
  ></md-outlined-text-field>
421
442
  `;
422
443
  }
@@ -431,9 +452,14 @@ export class MbgValInput extends LitElement {
431
452
  }
432
453
  get inputs() {
433
454
  return {
434
- BOOLEAN: html `<label
455
+ BOOLEAN: html `<label class="boolean-input"
435
456
  >${this.label}
436
- <md-switch id="input" ?selected=${xmlBoolean(this.default)}></md-switch
457
+ <md-switch
458
+ id="input"
459
+ ?disabled="${this.readOnly}"
460
+ ?selected=${xmlBoolean(this.default)}
461
+ icons
462
+ ></md-switch
437
463
  ></label>`,
438
464
  INT8: this.intInput(8),
439
465
  INT16: this.intInput(16),
@@ -457,7 +483,7 @@ export class MbgValInput extends LitElement {
457
483
  VisString255: this.stringInput(255),
458
484
  Unicode255: this.stringInput(255),
459
485
  Quality: this.bitstringInput(14),
460
- Currency: currencyInput(this.label, this.default),
486
+ Currency: currencyInput(this.label, this.default, this.readOnly),
461
487
  Enum: this.enumInput(),
462
488
  Timestamp: this.timestampInput(),
463
489
  ObjRef: this.objrefInput(),
@@ -478,19 +504,32 @@ export class MbgValInput extends LitElement {
478
504
  id="input"
479
505
  label="${this.label}"
480
506
  value="${this.default ?? nothing}"
507
+ ?disabled="${this.readOnly}"
481
508
  ></md-outlined-text-field>`);
482
509
  }
483
510
  }
484
- MbgValInput.styles = css `
485
- md-outlined-text-field.Timestamp {
486
- min-width: 250px;
487
- max-width: 100%;
488
- width: auto;
489
- }
490
- `;
511
+ MbgValInput.styles = [
512
+ designTokens,
513
+ css `
514
+ md-outlined-text-field.Timestamp {
515
+ min-width: 250px;
516
+ max-width: 100%;
517
+ width: auto;
518
+ }
519
+
520
+ .boolean-input {
521
+ display: flex;
522
+ align-items: center;
523
+ gap: 0.5rem;
524
+ }
525
+ `,
526
+ ];
491
527
  __decorate([
492
528
  property({ type: String })
493
529
  ], MbgValInput.prototype, "bType", void 0);
530
+ __decorate([
531
+ property({ type: Boolean })
532
+ ], MbgValInput.prototype, "readOnly", void 0);
494
533
  __decorate([
495
534
  property({ type: String })
496
535
  ], MbgValInput.prototype, "default", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"MbgValInput.js","sourceRoot":"","sources":["../../src/MbgValInput.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { html, css, LitElement, TemplateResult, nothing } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport type { MdSwitch } from '@material/web/switch/switch.js';\nimport { currencyInput } from './currency-input.js';\n\nimport '@material/web/textfield/outlined-text-field.js';\nimport '@material/web/select/filled-select.js';\nimport '@material/web/select/select-option.js';\nimport '@material/web/switch/switch.js';\n\nfunction xmlBoolean(val?: string) {\n return ['true', '1'].includes(val?.toLowerCase().trim() ?? 'false');\n}\n\nfunction isValidInt(value: number, size: number, signed: boolean): boolean {\n const min = signed ? -(2 ** (size - 1)) : 0;\n const max = signed ? 2 ** (size - 1) - 1 : 2 ** size - 1;\n return value >= min && value <= max;\n}\n\nfunction isValidBigInt(value: bigint, size: 64 | 128): boolean {\n if (size === 64) {\n return value >= -9223372036854775808n && value <= 9223372036854775807n;\n }\n if (size === 128) {\n return (\n value >= -170141183460469231731687303715884105728n &&\n value <= 170141183460469231731687303715884105727n\n );\n }\n return false;\n}\n\nfunction sanitizeAndValidateInt(\n value: string,\n size: number,\n isUserInput: boolean,\n isSigned = true,\n) {\n // allow leading negative sign\n const signed = value[0] === '-' ? '-' : '';\n const negative = signed === '-';\n\n // remove leading zeros and invalid characters\n let sanitized = value.replace(/[^0-9]/g, '').replace(/^0+(?=\\d)/, '');\n\n // handle special cases\n if (negative && !sanitized.startsWith('-')) {\n sanitized = signed + sanitized;\n }\n if (sanitized === '-0') {\n sanitized = '0';\n }\n\n // ensure input was properly sanitized\n const intRegex = /^-?\\d*$/;\n if (!intRegex.test(sanitized)) {\n return '';\n }\n\n // allow leading negative sign only if it is from user input\n if (sanitized === '') {\n if (isUserInput) {\n return sanitized;\n }\n return '';\n }\n\n // parse and validate\n if (sanitized !== '') {\n if (size === 64 || size === 128) {\n const parsedValue = BigInt(sanitized);\n if (Number.isNaN(parsedValue) || !isValidBigInt(parsedValue, size)) {\n return '';\n }\n } else {\n const parsedValue = Number(sanitized);\n if (\n Number.isNaN(parsedValue) ||\n !isValidInt(parsedValue, size, isSigned)\n ) {\n return '';\n }\n }\n }\n\n return sanitized;\n}\n\nfunction isValidFloat(value: number, size: 32 | 64): boolean {\n if (size === 32) {\n return value >= -3.4028235e38 && value <= 3.4028235e38;\n }\n if (size === 64) {\n return value >= -1.7976931348623157e308 && value <= 1.7976931348623157e308;\n }\n return false;\n}\n\n/** Removes invalid characters and validates the float value input */\nfunction sanitizeAndValidateFloat(\n value: string,\n isUserInput: boolean,\n size: 32 | 64,\n) {\n let sanitized = '';\n\n // allow leading negative sign\n const signed = value[0] === '-' ? '-' : '';\n const negative = signed === '-';\n\n // account for Euler's number\n if (value === 'e' || value === '-e') {\n sanitized = '2.7182818284590452354';\n return signed + sanitized;\n }\n\n // remove leading zeros and invalid characters\n sanitized = value\n .replace(/[^0-9eE.+-]/g, '')\n .replace(/(?<![eE])\\+|(?<![eE])-/, '');\n\n // handle multiple exponents\n const numExponents = sanitized.split(/[eE]/).length - 1;\n if (numExponents > 1) {\n sanitized = sanitized.replace(/[eE].*?[eE]/g, 'E0');\n }\n if (sanitized.endsWith('e') || sanitized.endsWith('E')) {\n sanitized += '0';\n }\n\n // handle multiple decimal points\n const numDecimalPoints = sanitized.split('.').length - 1;\n if (numDecimalPoints > 1) {\n sanitized = sanitized.replace(/\\.(?=.*\\.)/g, '');\n }\n\n // remove leading zeros\n sanitized = sanitized.replace(/^0+(?=\\d)/, '');\n sanitized = sanitized.replace(/^-0+(?=\\d)/, '-');\n\n // handle special cases\n if (sanitized === '0e' || sanitized === '-0e') {\n return '0';\n }\n if (negative && !sanitized.startsWith('-')) {\n sanitized = signed + sanitized;\n }\n if (sanitized === '.') {\n sanitized = '0.';\n }\n\n // ensure input was properly sanitized\n const floatRegex = /^-?\\d*(\\.\\d*)?([eE][-+]?\\d*)?$/;\n if (!floatRegex.test(sanitized)) {\n return '';\n }\n\n // allow leading negative sign only if it is from user input\n if (sanitized === '-') {\n if (isUserInput) {\n return sanitized;\n }\n return '';\n }\n\n // parse into float and validate\n if (sanitized !== '') {\n const parsedValue = parseFloat(sanitized);\n if (Number.isNaN(parsedValue) || !isValidFloat(parsedValue, size)) {\n return '';\n }\n }\n\n return sanitized;\n}\n\nfunction sanitizeOctet(value: string) {\n return value.replace(/[^0-9a-fA-F]/g, '');\n}\n\nfunction sanitizeObjRef(value: string) {\n return value.replace(/[^A-Za-z0-9_/$]/g, '');\n}\n\nfunction sanitizeBitString(value: string) {\n return value.replace(/[^01]/g, '');\n}\n\nfunction formatTimestamp(input: string) {\n const digits = input.replace(/\\D/g, '');\n\n // Extract parts\n const year = digits.slice(0, 4);\n const month = digits.slice(4, 6);\n const day = digits.slice(6, 8);\n const hour = digits.slice(8, 10);\n const minute = digits.slice(10, 12);\n const second = digits.slice(12, 14);\n const millisecond = digits.slice(14, 17); // Optional milliseconds\n\n let formatted = `${year}`;\n if (month) formatted += `-${month}`;\n if (day) formatted += `-${day}`;\n if (hour) formatted += `T${hour}`;\n if (minute) formatted += `:${minute}`;\n if (second) formatted += `:${second}`;\n if (millisecond) formatted += `.${millisecond}`;\n\n return formatted;\n}\n\n/** Web Component for inputting IEC61850-6 \"Val\" values */\nexport class MbgValInput extends LitElement {\n static styles = css`\n md-outlined-text-field.Timestamp {\n min-width: 250px;\n max-width: 100%;\n width: auto;\n }\n `;\n\n @property({ type: String }) bType?: string;\n\n // If the DA/BDA is assigned a Val in DataTypeTemplates\n @property({ type: String }) default = '';\n\n // if bType === \"Enum\" - ordinal values\n @property({ type: Array }) enumOrdinals: string[] = [];\n\n // if bType === \"Enum\" - string labels\n @property({ type: Array }) enumLabels: string[] = [];\n\n @property({ type: String }) label = 'Val';\n\n @query('#input') input?: HTMLInputElement;\n\n private updateValue(event: Event, userValue: string) {\n this.value = userValue;\n // eslint-disable-next-line no-param-reassign\n (event.target as HTMLInputElement).value = userValue;\n }\n\n private parseBTypeSize() {\n const match = this.bType?.match(/INT(\\d+)/);\n return match ? parseInt(match[1], 10) : 0;\n }\n\n private handleBigIntInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n const validatedInput = sanitizeAndValidateInt(\n input,\n this.parseBTypeSize(),\n true,\n );\n const validatedDefault = sanitizeAndValidateInt(\n this.default,\n this.parseBTypeSize(),\n false,\n );\n\n if (validatedInput === '') {\n this.updateValue(event, validatedDefault ?? '0');\n return;\n }\n\n this.updateValue(event, validatedInput);\n }\n\n private handleIntInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n const signed = !(this.bType?.endsWith('U') || this.bType === 'Check');\n const size = this.bType === 'Check' ? 8 : this.parseBTypeSize();\n\n const validatedDefault = sanitizeAndValidateInt(\n this.default,\n size,\n false,\n signed,\n );\n\n // set default if input is empty\n if (input === '') {\n this.updateValue(event, validatedDefault ?? 0);\n }\n }\n\n intInput(size: 8 | 16 | 24 | 32 | 64 | 128, signed = true) {\n const min = signed ? -(2 ** (size - 1)) : 0;\n const max = signed ? 2 ** (size - 1) - 1 : 2 ** size - 1;\n\n const validatedDefault = sanitizeAndValidateInt(\n this.default,\n size,\n false,\n signed,\n );\n\n if (size > 52) {\n return html`<md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n type=\"text\"\n value=\"${validatedDefault ?? nothing}\"\n @input=\"${this.handleBigIntInput}\"\n ></md-outlined-text-field>`;\n }\n\n return html`<md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n type=\"number\"\n step=\"1\"\n min=\"${min}\"\n max=\"${max}\"\n value=\"${validatedDefault ?? nothing}\"\n @input=\"${this.handleIntInput}\"\n ></md-outlined-text-field>`;\n }\n\n private handleFloatInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n const validatedInput = sanitizeAndValidateFloat(\n input,\n true,\n this.bType === 'FLOAT32' ? 32 : 64,\n );\n const validatedDefault = sanitizeAndValidateFloat(\n this.default,\n false,\n this.bType === 'FLOAT32' ? 32 : 64,\n );\n\n if (validatedInput === '') {\n this.updateValue(event, validatedDefault ?? '0');\n return;\n }\n\n this.updateValue(event, validatedInput);\n }\n\n floatInput() {\n const validatedDefault = sanitizeAndValidateFloat(\n this.default,\n false,\n this.bType === 'FLOAT32' ? 32 : 64,\n );\n return html`\n <md-outlined-text-field\n id=\"$input\"\n label=\"${this.label}\"\n type=\"text\"\n value=\"${validatedDefault ?? nothing}\"\n @input=\"${this.handleFloatInput}\"\n ></md-outlined-text-field>\n `;\n }\n\n private handleOctetInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n let sanitizedInput = sanitizeOctet(input);\n if (sanitizedInput === '') {\n sanitizedInput = sanitizeOctet(this.default) ?? '';\n }\n this.updateValue(event, sanitizedInput);\n }\n\n octetInput(size: 6 | 8 | 16 | 64) {\n return html`\n <md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n value=\"${sanitizeOctet(this.default) ?? nothing}\"\n maxlength=\"${size * 2}\"\n @input=\"${this.handleOctetInput}\"\n ></md-outlined-text-field>\n `;\n }\n\n private handleStringInput(event: Event) {\n let input = (event.target as HTMLInputElement).value;\n if (input === '') {\n input = this.default ?? '';\n }\n this.updateValue(event, input);\n }\n\n stringInput(size: 32 | 64 | 65 | 129 | 255) {\n return html`\n <md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n value=\"${this.default ?? nothing}\"\n maxlength=\"${size}\"\n @input=\"${this.handleStringInput}\"\n ></md-outlined-text-field>\n `;\n }\n\n enumInput() {\n let ordinals: string[] = [];\n let labels: string[] = [];\n\n if (typeof this.enumOrdinals === 'string') {\n ordinals = JSON.parse(this.enumOrdinals) as string[];\n }\n if (typeof this.enumLabels === 'string') {\n labels = JSON.parse(this.enumLabels) as string[];\n }\n\n return html`\n <md-filled-select id=\"input\" label=\"${this.label}\">\n ${ordinals.map(\n (ordinal, index) => html`\n <md-select-option\n value=\"${labels[index]}\"\n ?selected=${(this.default === labels[index]) || (this.default === ordinal)}\n >\n <div slot=\"headline\">${ordinal} - ${labels[index]}</div>\n </md-select-option>\n `,\n )}\n </md-filled-select>\n `;\n }\n\n private handleTimestampInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n const validatedInput = formatTimestamp(input);\n\n if (validatedInput === '') {\n const validatedDefault = formatTimestamp(this.default);\n this.updateValue(event, validatedDefault ?? '');\n return;\n }\n\n this.updateValue(event, validatedInput);\n }\n\n timestampInput() {\n const validatedDefault = formatTimestamp(this.default);\n return html`\n <md-outlined-text-field\n class=\"Timestamp\"\n id=\"input\"\n placeholder=\"YYYY-MM-DDTHH:MM:SS.sss\"\n label=\"${this.label}\"\n value=\"${validatedDefault ?? nothing}\"\n @input=\"${this.handleTimestampInput}\"\n ></md-outlined-text-field>\n `;\n }\n\n private handleObjRefInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n let sanitizedInput = sanitizeObjRef(input);\n if (sanitizedInput === '') {\n sanitizedInput = sanitizeObjRef(this.default) ?? '';\n }\n this.updateValue(event, sanitizedInput);\n }\n\n objrefInput() {\n return html`\n <md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n value=\"${sanitizeObjRef(this.default) ?? nothing}\"\n maxlength=\"255\"\n @input=\"${this.handleObjRefInput}\"\n ></md-outlined-text-field>\n `;\n }\n\n dbposInput() {\n return html`\n <md-filled-select id=\"input\" label=\"${this.label}\">\n <md-select-option value=\"0\" ?selected=${this.default === '0'}>\n <div slot=\"headline\">0 - intermediate-state</div>\n </md-select-option>\n <md-select-option value=\"1\" ?selected=${this.default === '1'}>\n <div slot=\"headline\">1 - off</div>\n </md-select-option>\n </md-select-option>\n <md-select-option value=\"2\" ?selected=${this.default === '2'}>\n <div slot=\"headline\">2 - on</div>\n </md-select-option>\n </md-select-option>\n <md-select-option value=\"3\" ?selected=${this.default === '3'}>\n <div slot=\"headline\">3 - bad-state</div>\n </md-select-option>\n </md-filled-select>\n `;\n }\n\n tcmdInput() {\n return html`\n <md-filled-select id=\"input\" label=\"${this.label}\">\n <md-select-option value=\"0\" ?selected=${this.default === '0'}>\n <div slot=\"headline\">0 - neutral</div>\n </md-select-option>\n <md-select-option value=\"1\" ?selected=${this.default === '1'}>\n <div slot=\"headline\">1 - lower</div>\n </md-select-option>\n </md-select-option>\n <md-select-option value=\"2\" ?selected=${this.default === '2'}>\n <div slot=\"headline\">2 - higher</div>\n </md-select-option>\n </md-select-option>\n <md-select-option value=\"3\" ?selected=${this.default === '3'}>\n <div slot=\"headline\">3 - reserved</div>\n </md-select-option>\n </md-filled-select>\n `;\n }\n\n private handleBitStringInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n let sanitizedInput = sanitizeBitString(input);\n if (sanitizedInput === '') {\n sanitizedInput = sanitizeBitString(this.default) ?? '';\n }\n this.updateValue(event, sanitizedInput);\n }\n\n bitstringInput(size: 5 | 6 | 10 | 14) {\n return html`\n <md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n value=\"${sanitizeBitString(this.default) ?? nothing}\"\n maxlength=\"${size}\"\n @input=\"${this.handleBitStringInput}\"\n ></md-outlined-text-field>\n `;\n }\n\n get value() {\n if (this.bType === 'BOOLEAN') {\n return (this.input as unknown as MdSwitch).selected ? 'true' : 'false';\n }\n return this.input?.value ?? '';\n }\n\n set value(val: string) {\n this.input?.setAttribute('value', val);\n }\n\n get inputs(): Partial<Record<string, TemplateResult>> {\n return {\n BOOLEAN: html`<label\n >${this.label}\n <md-switch id=\"input\" ?selected=${xmlBoolean(this.default)}></md-switch\n ></label>`,\n INT8: this.intInput(8),\n INT16: this.intInput(16),\n INT24: this.intInput(24),\n INT32: this.intInput(32),\n INT64: this.intInput(64),\n INT128: this.intInput(128),\n INT8U: this.intInput(8, false),\n INT16U: this.intInput(16, false),\n INT24U: this.intInput(24, false),\n INT32U: this.intInput(32, false),\n FLOAT32: this.floatInput(),\n FLOAT64: this.floatInput(),\n Octet6: this.octetInput(6),\n Octet16: this.octetInput(16),\n Octet64: this.octetInput(64),\n VisString32: this.stringInput(32),\n VisString64: this.stringInput(64),\n VisString65: this.stringInput(65),\n VisString129: this.stringInput(129),\n VisString255: this.stringInput(255),\n Unicode255: this.stringInput(255),\n Quality: this.bitstringInput(14),\n Currency: currencyInput(this.label, this.default),\n Enum: this.enumInput(),\n Timestamp: this.timestampInput(),\n ObjRef: this.objrefInput(),\n Dbpos: this.dbposInput(),\n Tcmd: this.tcmdInput(),\n EntryTime: this.octetInput(6),\n Check: this.intInput(8, false),\n TrgOps: this.bitstringInput(6),\n OptFlds: this.bitstringInput(10),\n SvOptFlds: this.bitstringInput(6),\n LogOptFlds: this.bitstringInput(5),\n EntryID: this.octetInput(8),\n };\n }\n\n render() {\n return (\n this.inputs[this.bType ?? ''] ??\n html`<md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n value=\"${this.default ?? nothing}\"\n ></md-outlined-text-field>`\n );\n }\n}\n"]}
1
+ {"version":3,"file":"MbgValInput.js","sourceRoot":"","sources":["../../src/MbgValInput.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-extraneous-dependencies */\nimport { html, css, LitElement, TemplateResult, nothing } from 'lit';\nimport { property, query } from 'lit/decorators.js';\nimport type { MdSwitch } from '@material/web/switch/switch.js';\nimport { currencyInput } from './currency-input.js';\n\nimport { designTokens } from './design-tokens.js';\n\nimport '@material/web/textfield/outlined-text-field.js';\nimport '@material/web/select/outlined-select.js';\nimport '@material/web/select/select-option.js';\nimport '@material/web/switch/switch.js';\n\nfunction xmlBoolean(val?: string) {\n return ['true', '1'].includes(val?.toLowerCase().trim() ?? 'false');\n}\n\nfunction isValidInt(value: number, size: number, signed: boolean): boolean {\n const min = signed ? -(2 ** (size - 1)) : 0;\n const max = signed ? 2 ** (size - 1) - 1 : 2 ** size - 1;\n return value >= min && value <= max;\n}\n\nfunction isValidBigInt(value: bigint, size: 64 | 128): boolean {\n if (size === 64) {\n return value >= -9223372036854775808n && value <= 9223372036854775807n;\n }\n if (size === 128) {\n return (\n value >= -170141183460469231731687303715884105728n &&\n value <= 170141183460469231731687303715884105727n\n );\n }\n return false;\n}\n\nfunction sanitizeAndValidateInt(\n value: string,\n size: number,\n isUserInput: boolean,\n isSigned = true,\n) {\n if (!value) return '';\n\n // allow leading negative sign\n const signed = value[0] === '-' ? '-' : '';\n const negative = signed === '-';\n\n // remove leading zeros and invalid characters\n let sanitized = value.replace(/[^0-9]/g, '').replace(/^0+(?=\\d)/, '');\n\n // handle special cases\n if (negative && !sanitized.startsWith('-')) {\n sanitized = signed + sanitized;\n }\n if (sanitized === '-0') {\n sanitized = '0';\n }\n\n // ensure input was properly sanitized\n const intRegex = /^-?\\d*$/;\n if (!intRegex.test(sanitized)) {\n return '';\n }\n\n // allow leading negative sign only if it is from user input\n if (sanitized === '') {\n if (isUserInput) {\n return sanitized;\n }\n return '';\n }\n\n // parse and validate\n if (sanitized !== '') {\n if (size === 64 || size === 128) {\n const parsedValue = BigInt(sanitized);\n if (Number.isNaN(parsedValue) || !isValidBigInt(parsedValue, size)) {\n return '';\n }\n } else {\n const parsedValue = Number(sanitized);\n if (\n Number.isNaN(parsedValue) ||\n !isValidInt(parsedValue, size, isSigned)\n ) {\n return '';\n }\n }\n }\n\n return sanitized;\n}\n\nfunction isValidFloat(value: number, size: 32 | 64): boolean {\n if (size === 32) {\n return value >= -3.4028235e38 && value <= 3.4028235e38;\n }\n if (size === 64) {\n return value >= -1.7976931348623157e308 && value <= 1.7976931348623157e308;\n }\n return false;\n}\n\n/** Removes invalid characters and validates the float value input */\nfunction sanitizeAndValidateFloat(\n value: string,\n isUserInput: boolean,\n size: 32 | 64,\n) {\n if (!value) return '';\n\n let sanitized = '';\n\n // allow leading negative sign\n const signed = value[0] === '-' ? '-' : '';\n const negative = signed === '-';\n\n // account for Euler's number\n if (value === 'e' || value === '-e') {\n sanitized = '2.7182818284590452354';\n return signed + sanitized;\n }\n\n // remove leading zeros and invalid characters\n sanitized = value\n .replace(/[^0-9eE.+-]/g, '')\n .replace(/(?<![eE])\\+|(?<![eE])-/, '');\n\n // handle multiple exponents\n const numExponents = sanitized.split(/[eE]/).length - 1;\n if (numExponents > 1) {\n sanitized = sanitized.replace(/[eE].*?[eE]/g, 'E0');\n }\n if (sanitized.endsWith('e') || sanitized.endsWith('E')) {\n sanitized += '0';\n }\n\n // handle multiple decimal points\n const numDecimalPoints = sanitized.split('.').length - 1;\n if (numDecimalPoints > 1) {\n sanitized = sanitized.replace(/\\.(?=.*\\.)/g, '');\n }\n\n // remove leading zeros\n sanitized = sanitized.replace(/^0+(?=\\d)/, '');\n sanitized = sanitized.replace(/^-0+(?=\\d)/, '-');\n\n // handle special cases\n if (sanitized === '0e' || sanitized === '-0e') {\n return '0';\n }\n if (negative && !sanitized.startsWith('-')) {\n sanitized = signed + sanitized;\n }\n if (sanitized === '.') {\n sanitized = '0.';\n }\n\n // ensure input was properly sanitized\n const floatRegex = /^-?\\d*(\\.\\d*)?([eE][-+]?\\d*)?$/;\n if (!floatRegex.test(sanitized)) {\n return '';\n }\n\n // allow leading negative sign only if it is from user input\n if (sanitized === '-') {\n if (isUserInput) {\n return sanitized;\n }\n return '';\n }\n\n // parse into float and validate\n if (sanitized !== '') {\n const parsedValue = parseFloat(sanitized);\n if (Number.isNaN(parsedValue) || !isValidFloat(parsedValue, size)) {\n return '';\n }\n }\n\n return sanitized;\n}\n\nfunction sanitizeOctet(value: string) {\n return value?.replace(/[^0-9a-fA-F]/g, '');\n}\n\nfunction sanitizeObjRef(value: string) {\n return value?.replace(/[^A-Za-z0-9_/$]/g, '');\n}\n\nfunction sanitizeBitString(value: string) {\n return value?.replace(/[^01]/g, '');\n}\n\nfunction formatTimestamp(input: string) {\n if (!input) return '';\n\n const digits = input.replace(/\\D/g, '');\n\n // Extract parts\n const year = digits.slice(0, 4);\n const month = digits.slice(4, 6);\n const day = digits.slice(6, 8);\n const hour = digits.slice(8, 10);\n const minute = digits.slice(10, 12);\n const second = digits.slice(12, 14);\n const millisecond = digits.slice(14, 17); // Optional milliseconds\n\n let formatted = `${year}`;\n if (month) formatted += `-${month}`;\n if (day) formatted += `-${day}`;\n if (hour) formatted += `T${hour}`;\n if (minute) formatted += `:${minute}`;\n if (second) formatted += `:${second}`;\n if (millisecond) formatted += `.${millisecond}`;\n\n return formatted;\n}\n\n/** Web Component for inputting IEC61850-6 \"Val\" values */\nexport class MbgValInput extends LitElement {\n static styles = [\n designTokens,\n css`\n md-outlined-text-field.Timestamp {\n min-width: 250px;\n max-width: 100%;\n width: auto;\n }\n\n .boolean-input {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n }\n `,\n ];\n\n @property({ type: String }) bType?: string;\n\n @property({ type: Boolean }) readOnly = false;\n\n // If the DA/BDA is assigned a Val in DataTypeTemplates\n @property({ type: String }) default = '';\n\n // if bType === \"Enum\" - ordinal values\n @property({ type: Array }) enumOrdinals: string[] = [];\n\n // if bType === \"Enum\" - string labels\n @property({ type: Array }) enumLabels: string[] = [];\n\n @property({ type: String }) label = 'Val';\n\n @query('#input') input?: HTMLInputElement;\n\n private updateValue(event: Event, userValue: string) {\n this.value = userValue;\n // eslint-disable-next-line no-param-reassign\n (event.target as HTMLInputElement).value = userValue;\n }\n\n private parseBTypeSize() {\n const match = this.bType?.match(/INT(\\d+)/);\n return match ? parseInt(match[1], 10) : 0;\n }\n\n private handleBigIntInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n const validatedInput = sanitizeAndValidateInt(\n input,\n this.parseBTypeSize(),\n true,\n );\n const validatedDefault = sanitizeAndValidateInt(\n this.default,\n this.parseBTypeSize(),\n false,\n );\n\n if (validatedInput === '') {\n this.updateValue(event, validatedDefault ?? '0');\n return;\n }\n\n this.updateValue(event, validatedInput);\n }\n\n private handleIntInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n const signed = !(this.bType?.endsWith('U') || this.bType === 'Check');\n const size = this.bType === 'Check' ? 8 : this.parseBTypeSize();\n\n const validatedDefault = sanitizeAndValidateInt(\n this.default,\n size,\n false,\n signed,\n );\n\n // set default if input is empty\n if (input === '') {\n this.updateValue(event, validatedDefault ?? 0);\n }\n }\n\n intInput(size: 8 | 16 | 24 | 32 | 64 | 128, signed = true) {\n const min = signed ? -(2 ** (size - 1)) : 0;\n const max = signed ? 2 ** (size - 1) - 1 : 2 ** size - 1;\n\n const validatedDefault = sanitizeAndValidateInt(\n this.default,\n size,\n false,\n signed,\n );\n\n if (size > 52) {\n return html`<md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n type=\"text\"\n value=\"${validatedDefault ?? nothing}\"\n @input=\"${this.handleBigIntInput}\"\n ?disabled=\"${this.readOnly}\"\n ></md-outlined-text-field>`;\n }\n\n return html`<md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n type=\"number\"\n step=\"1\"\n min=\"${min}\"\n max=\"${max}\"\n value=\"${validatedDefault ?? nothing}\"\n @input=\"${this.handleIntInput}\"\n ?disabled=\"${this.readOnly}\"\n ></md-outlined-text-field>`;\n }\n\n private handleFloatInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n const validatedInput = sanitizeAndValidateFloat(\n input,\n true,\n this.bType === 'FLOAT32' ? 32 : 64,\n );\n const validatedDefault = sanitizeAndValidateFloat(\n this.default,\n false,\n this.bType === 'FLOAT32' ? 32 : 64,\n );\n\n if (validatedInput === '') {\n this.updateValue(event, validatedDefault ?? '0');\n return;\n }\n\n this.updateValue(event, validatedInput);\n }\n\n floatInput() {\n const validatedDefault = sanitizeAndValidateFloat(\n this.default,\n false,\n this.bType === 'FLOAT32' ? 32 : 64,\n );\n return html`\n <md-outlined-text-field\n id=\"$input\"\n label=\"${this.label}\"\n type=\"text\"\n value=\"${validatedDefault ?? nothing}\"\n @input=\"${this.handleFloatInput}\"\n ?disabled=\"${this.readOnly}\"\n ></md-outlined-text-field>\n `;\n }\n\n private handleOctetInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n let sanitizedInput = sanitizeOctet(input);\n if (sanitizedInput === '') {\n sanitizedInput = sanitizeOctet(this.default) ?? '';\n }\n this.updateValue(event, sanitizedInput);\n }\n\n octetInput(size: 6 | 8 | 16 | 64) {\n return html`\n <md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n value=\"${sanitizeOctet(this.default) ?? nothing}\"\n maxlength=\"${size * 2}\"\n @input=\"${this.handleOctetInput}\"\n ?disabled=\"${this.readOnly}\"\n ></md-outlined-text-field>\n `;\n }\n\n private handleStringInput(event: Event) {\n let input = (event.target as HTMLInputElement).value;\n if (input === '') {\n input = this.default ?? '';\n }\n this.updateValue(event, input);\n }\n\n stringInput(size: 32 | 64 | 65 | 129 | 255) {\n return html`\n <md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n value=\"${this.default ?? nothing}\"\n maxlength=\"${size}\"\n @input=\"${this.handleStringInput}\"\n ?disabled=\"${this.readOnly}\"\n ></md-outlined-text-field>\n `;\n }\n\n enumInput() {\n let ordinals: string[] = [];\n let labels: string[] = [];\n\n if (typeof this.enumOrdinals === 'string') {\n ordinals = JSON.parse(this.enumOrdinals) as string[];\n }\n if (typeof this.enumLabels === 'string') {\n labels = JSON.parse(this.enumLabels) as string[];\n }\n\n return html`\n <md-outlined-select\n id=\"input\"\n label=\"${this.label}\"\n ?disabled=\"${this.readOnly}\"\n >\n ${ordinals.map(\n (ordinal, index) => html`\n <md-select-option\n value=\"${labels[index]}\"\n ?selected=${this.default === labels[index] ||\n this.default === ordinal}\n >\n <div slot=\"headline\">${ordinal} - ${labels[index]}</div>\n </md-select-option>\n `,\n )}\n </md-outlined-select>\n `;\n }\n\n private handleTimestampInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n const validatedInput = formatTimestamp(input);\n\n if (validatedInput === '') {\n const validatedDefault = formatTimestamp(this.default);\n this.updateValue(event, validatedDefault ?? '');\n return;\n }\n\n this.updateValue(event, validatedInput);\n }\n\n timestampInput() {\n const validatedDefault = formatTimestamp(this.default);\n return html`\n <md-outlined-text-field\n class=\"Timestamp\"\n id=\"input\"\n placeholder=\"YYYY-MM-DDTHH:MM:SS.sss\"\n label=\"${this.label}\"\n value=\"${validatedDefault ?? nothing}\"\n @input=\"${this.handleTimestampInput}\"\n ?disabled=\"${this.readOnly}\"\n ></md-outlined-text-field>\n `;\n }\n\n private handleObjRefInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n let sanitizedInput = sanitizeObjRef(input);\n if (sanitizedInput === '') {\n sanitizedInput = sanitizeObjRef(this.default) ?? '';\n }\n this.updateValue(event, sanitizedInput);\n }\n\n objrefInput() {\n return html`\n <md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n value=\"${sanitizeObjRef(this.default) ?? nothing}\"\n maxlength=\"255\"\n @input=\"${this.handleObjRefInput}\"\n ?disabled=\"${this.readOnly}\"\n ></md-outlined-text-field>\n `;\n }\n\n dbposInput() {\n return html`\n <md-outlined-select id=\"input\" label=\"${this.label}\" ?disabled=\"${this.readOnly}\">\n <md-select-option value=\"0\" ?selected=${this.default === '0'}>\n <div slot=\"headline\">0 - intermediate-state</div>\n </md-select-option>\n <md-select-option value=\"1\" ?selected=${this.default === '1'}>\n <div slot=\"headline\">1 - off</div>\n </md-select-option>\n </md-select-option>\n <md-select-option value=\"2\" ?selected=${this.default === '2'}>\n <div slot=\"headline\">2 - on</div>\n </md-select-option>\n </md-select-option>\n <md-select-option value=\"3\" ?selected=${this.default === '3'}>\n <div slot=\"headline\">3 - bad-state</div>\n </md-select-option>\n </md-outlined-select>\n `;\n }\n\n tcmdInput() {\n return html`\n <md-outlined-select id=\"input\" label=\"${this.label}\" ?disabled=\"${this.readOnly}\">\n <md-select-option value=\"0\" ?selected=${this.default === '0'}>\n <div slot=\"headline\">0 - neutral</div>\n </md-select-option>\n <md-select-option value=\"1\" ?selected=${this.default === '1'}>\n <div slot=\"headline\">1 - lower</div>\n </md-select-option>\n </md-select-option>\n <md-select-option value=\"2\" ?selected=${this.default === '2'}>\n <div slot=\"headline\">2 - higher</div>\n </md-select-option>\n </md-select-option>\n <md-select-option value=\"3\" ?selected=${this.default === '3'}>\n <div slot=\"headline\">3 - reserved</div>\n </md-select-option>\n </md-outlined-select>\n `;\n }\n\n private handleBitStringInput(event: Event) {\n const input = (event.target as HTMLInputElement).value;\n let sanitizedInput = sanitizeBitString(input);\n if (sanitizedInput === '') {\n sanitizedInput = sanitizeBitString(this.default) ?? '';\n }\n this.updateValue(event, sanitizedInput);\n }\n\n bitstringInput(size: 5 | 6 | 10 | 14) {\n return html`\n <md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n value=\"${sanitizeBitString(this.default) ?? nothing}\"\n maxlength=\"${size}\"\n @input=\"${this.handleBitStringInput}\"\n ?disabled=\"${this.readOnly}\"\n ></md-outlined-text-field>\n `;\n }\n\n get value() {\n if (this.bType === 'BOOLEAN') {\n return (this.input as unknown as MdSwitch).selected ? 'true' : 'false';\n }\n return this.input?.value ?? '';\n }\n\n set value(val: string) {\n this.input?.setAttribute('value', val);\n }\n\n get inputs(): Partial<Record<string, TemplateResult>> {\n return {\n BOOLEAN: html`<label class=\"boolean-input\"\n >${this.label}\n <md-switch\n id=\"input\"\n ?disabled=\"${this.readOnly}\"\n ?selected=${xmlBoolean(this.default)}\n icons\n ></md-switch\n ></label>`,\n INT8: this.intInput(8),\n INT16: this.intInput(16),\n INT24: this.intInput(24),\n INT32: this.intInput(32),\n INT64: this.intInput(64),\n INT128: this.intInput(128),\n INT8U: this.intInput(8, false),\n INT16U: this.intInput(16, false),\n INT24U: this.intInput(24, false),\n INT32U: this.intInput(32, false),\n FLOAT32: this.floatInput(),\n FLOAT64: this.floatInput(),\n Octet6: this.octetInput(6),\n Octet16: this.octetInput(16),\n Octet64: this.octetInput(64),\n VisString32: this.stringInput(32),\n VisString64: this.stringInput(64),\n VisString65: this.stringInput(65),\n VisString129: this.stringInput(129),\n VisString255: this.stringInput(255),\n Unicode255: this.stringInput(255),\n Quality: this.bitstringInput(14),\n Currency: currencyInput(this.label, this.default, this.readOnly),\n Enum: this.enumInput(),\n Timestamp: this.timestampInput(),\n ObjRef: this.objrefInput(),\n Dbpos: this.dbposInput(),\n Tcmd: this.tcmdInput(),\n EntryTime: this.octetInput(6),\n Check: this.intInput(8, false),\n TrgOps: this.bitstringInput(6),\n OptFlds: this.bitstringInput(10),\n SvOptFlds: this.bitstringInput(6),\n LogOptFlds: this.bitstringInput(5),\n EntryID: this.octetInput(8),\n };\n }\n\n render() {\n return (\n this.inputs[this.bType ?? ''] ??\n html`<md-outlined-text-field\n id=\"input\"\n label=\"${this.label}\"\n value=\"${this.default ?? nothing}\"\n ?disabled=\"${this.readOnly}\"\n ></md-outlined-text-field>`\n );\n }\n}\n"]}
@@ -1,3 +1,3 @@
1
- import '@material/web/select/filled-select.js';
1
+ import '@material/web/select/outlined-select.js';
2
2
  import '@material/web/select/select-option.js';
3
- export declare function currencyInput(label: string, defaultVal: string): import("lit-html").TemplateResult<1>;
3
+ export declare function currencyInput(label: string, defaultVal: string, readOnly: boolean): import("lit-html").TemplateResult<1>;
@@ -1,9 +1,9 @@
1
1
  import { html } from 'lit';
2
- import '@material/web/select/filled-select.js';
2
+ import '@material/web/select/outlined-select.js';
3
3
  import '@material/web/select/select-option.js';
4
- export function currencyInput(label, defaultVal) {
4
+ export function currencyInput(label, defaultVal, readOnly) {
5
5
  return html `
6
- <md-filled-select id="input" label="${label}">
6
+ <md-outlined-select id="input" label="${label}" ?disabled="${readOnly}">
7
7
  <md-select-option value="AED" ?selected=${defaultVal === 'AED'}>
8
8
  <div slot="headline">AED (UAE Dirham)</div>
9
9
  </md-select-option>
@@ -490,7 +490,7 @@ export function currencyInput(label, defaultVal) {
490
490
  <md-select-option value="ZWG" ?selected=${defaultVal === 'ZWG'}>
491
491
  <div slot="headline">ZWG (Zimbabwe Gold)</div>
492
492
  </md-select-option>
493
- </md-filled-select>
493
+ </md-outlined-select>
494
494
  `;
495
495
  }
496
496
  //# sourceMappingURL=currency-input.js.map