Commit cfa9a5778a9ae7b26c92dc80cb7e4d9265a8a11f

Authored by nickAS21
1 parent efb671f4

Lwm2m: front: refactoring

Showing 19 changed files with 778 additions and 718 deletions
... ... @@ -90,9 +90,14 @@
90 90 serverFormGroup.get('securityMode').value === securityConfigLwM2MType.X509">
91 91 <mat-form-field class="mat-block">
92 92 <mat-label>{{ 'device-profile.lwm2m.server-public-key' | translate }}</mat-label>
93   - <textarea matInput type="text" rows="3" cols="1" required
94   - formControlName="serverPublicKey" #serverPublicKey
  93 + <textarea matInput
  94 + #serverPublicKey
95 95 maxlength="{{lenMaxServerPublicKey}}"
  96 + cdkTextareaAutosize
  97 + cdkAutosizeMinRows="1"
  98 + cols="1" required
  99 + style="overflow:hidden"
  100 + formControlName="serverPublicKey"
96 101 matTooltip="{{'device-profile.lwm2m.server-public-key-tip' | translate}}"
97 102 ></textarea>
98 103 <mat-hint align="end">{{serverPublicKey.value?.length || 0}}/{{lenMaxServerPublicKey}}</mat-hint>
... ... @@ -101,14 +106,18 @@
101 106 <strong>{{ 'device-profile.lwm2m.required' | translate }}</strong>
102 107 </mat-error>
103 108 <mat-error *ngIf="serverFormGroup.get('serverPublicKey').hasError('pattern') &&
104   - serverFormGroup.get('securityMode').value === securityConfigLwM2MType.RPK">
105   - {{ 'device-profile.lwm2m.client-key' | translate }}
106   - <strong>{{ 'device-profile.lwm2m.pattern_hex_dec_182' | translate }}</strong>
  109 + (serverFormGroup.get('securityMode').value === securityConfigLwM2MType.RPK ||
  110 + serverFormGroup.get('securityMode').value === securityConfigLwM2MType.X509)">
  111 + {{ 'device-profile.lwm2m.server-public-key' | translate }}
  112 + <strong>{{ translate.get('device-profile.lwm2m.pattern_hex_dec', {
  113 + count: 0}) | async }}</strong>
107 114 </mat-error>
108   - <mat-error *ngIf="serverFormGroup.get('serverPublicKey').hasError('pattern') &&
109   - serverFormGroup.get('securityMode').value === securityConfigLwM2MType.X509">
110   - {{ 'device-profile.lwm2m.client-key' | translate }}
111   - <strong>{{ 'device-profile.lwm2m.pattern_hex_dec' | translate }}</strong>
  115 + <mat-error *ngIf="(serverFormGroup.get('serverPublicKey').hasError('maxlength') ||
  116 + serverFormGroup.get('serverPublicKey').hasError('minlength')) &&
  117 + serverFormGroup.get('securityMode').value === securityConfigLwM2MType.RPK">
  118 + {{ 'device-profile.lwm2m.server-public-key' | translate }}
  119 + <strong>{{ translate.get('device-profile.lwm2m.pattern_hex_dec', {
  120 + count: lenMaxServerPublicKey }) | async }}</strong>
112 121 </mat-error>
113 122 </mat-form-field>
114 123 </div>
... ...
... ... @@ -14,31 +14,28 @@
14 14 /// limitations under the License.
15 15 ///
16 16
17   -import { Component, forwardRef, Inject, Input, OnInit } from "@angular/core";
  17 +import { Component, forwardRef, Inject, Input, OnInit } from '@angular/core';
18 18
19 19 import {
20 20 ControlValueAccessor,
21   - FormBuilder, FormGroup, NG_VALUE_ACCESSOR, NgModel, Validators
22   -} from "@angular/forms";
  21 + FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators
  22 +} from '@angular/forms';
23 23 import {
24 24 SECURITY_CONFIG_MODE,
25 25 SECURITY_CONFIG_MODE_NAMES,
26   - KEY_PUBLIC_REGEXP_PSK,
27 26 ServerSecurityConfig,
28   - LEN_MAX_PUBLIC_KEY_PSK,
29   - LEN_MAX_PUBLIC_KEY_RPK_X509,
30   - KEY_PUBLIC_REGEXP_X509,
31 27 DEFAULT_PORT_BOOTSTRAP_NO_SEC,
32 28 DEFAULT_PORT_SERVER_NO_SEC,
33 29 DEFAULT_CLIENT_HOLD_OFF_TIME,
34   - DEFAULT_ID_SERVER
35   -} from "./profile-config.models";
36   -import { Store } from "@ngrx/store";
37   -import { AppState } from "@core/core.state";
38   -import { coerceBooleanProperty } from "@angular/cdk/coercion";
39   -import { WINDOW } from "@core/services/window.service";
  30 + DEFAULT_ID_SERVER, LEN_MAX_PUBLIC_KEY_RPK, LEN_MAX_PUBLIC_KEY_X509, KEY_REGEXP_HEX_DEC
  31 +} from './profile-config.models';
  32 +import { Store } from '@ngrx/store';
  33 +import { AppState } from '@core/core.state';
  34 +import { coerceBooleanProperty } from '@angular/cdk/coercion';
  35 +import { WINDOW } from '@core/services/window.service';
40 36 import { pairwise, startWith } from 'rxjs/operators';
41 37 import { DeviceProfileService } from '@core/http/device-profile.service';
  38 +import { TranslateService } from '@ngx-translate/core';
42 39
43 40 @Component({
44 41 selector: 'tb-profile-lwm2m-device-config-server',
... ... @@ -55,12 +52,14 @@ import { DeviceProfileService } from '@core/http/device-profile.service';
55 52 export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAccessor, Validators {
56 53
57 54 private requiredValue: boolean;
  55 +
58 56 valuePrev = null;
59 57 serverFormGroup: FormGroup;
60 58 securityConfigLwM2MType = SECURITY_CONFIG_MODE;
61 59 securityConfigLwM2MTypes = Object.keys(SECURITY_CONFIG_MODE);
62 60 credentialTypeLwM2MNamesMap = SECURITY_CONFIG_MODE_NAMES;
63   - lenMaxServerPublicKey = LEN_MAX_PUBLIC_KEY_PSK;
  61 + lenMinServerPublicKey = 0;
  62 + lenMaxServerPublicKey = LEN_MAX_PUBLIC_KEY_RPK;
64 63 currentSecurityMode = null;
65 64
66 65
... ... @@ -80,6 +79,7 @@ export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAcc
80 79 }
81 80
82 81 constructor(protected store: Store<AppState>,
  82 + public translate: TranslateService,
83 83 public fb: FormBuilder,
84 84 private deviceProfileService: DeviceProfileService,
85 85 @Inject(WINDOW) private window: Window) {
... ... @@ -105,7 +105,7 @@ export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAcc
105 105 ngOnInit(): void {
106 106 }
107 107
108   - updateValueFields(serverData: ServerSecurityConfig): void {
  108 + private updateValueFields = (serverData: ServerSecurityConfig): void => {
109 109 serverData.bootstrapServerIs = this.bootstrapServerIs;
110 110 this.serverFormGroup.patchValue(serverData, {emitEvent: false});
111 111 this.serverFormGroup.get('bootstrapServerIs').disable();
... ... @@ -113,40 +113,38 @@ export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAcc
113 113 this.updateValidate(securityMode);
114 114 }
115 115
116   - updateValidate(securityMode: SECURITY_CONFIG_MODE): void {
  116 + private updateValidate = (securityMode: SECURITY_CONFIG_MODE): void => {
117 117 switch (securityMode) {
118 118 case SECURITY_CONFIG_MODE.NO_SEC:
119   - this.serverFormGroup.get('serverPublicKey').setValidators([]);
  119 + this.setValidatorsNoSecPsk();
120 120 break;
121 121 case SECURITY_CONFIG_MODE.PSK:
122   - this.lenMaxServerPublicKey = LEN_MAX_PUBLIC_KEY_PSK;
123   - this.serverFormGroup.get('serverPublicKey').setValidators([]);
  122 + this.setValidatorsNoSecPsk();
124 123 break;
125 124 case SECURITY_CONFIG_MODE.RPK:
126   - this.lenMaxServerPublicKey = LEN_MAX_PUBLIC_KEY_RPK_X509;
127   - this.serverFormGroup.get('serverPublicKey').setValidators([Validators.required, Validators.pattern(KEY_PUBLIC_REGEXP_PSK)]);
  125 + this.lenMinServerPublicKey = LEN_MAX_PUBLIC_KEY_RPK;
  126 + this.lenMaxServerPublicKey = LEN_MAX_PUBLIC_KEY_RPK;
  127 + this.setValidatorsRpkX509();
128 128 break;
129 129 case SECURITY_CONFIG_MODE.X509:
130   - this.lenMaxServerPublicKey = LEN_MAX_PUBLIC_KEY_RPK_X509;
131   - this.serverFormGroup.get('serverPublicKey').setValidators([Validators.required, Validators.pattern(KEY_PUBLIC_REGEXP_X509)]);
  130 + this.lenMinServerPublicKey = 0;
  131 + this.lenMaxServerPublicKey = LEN_MAX_PUBLIC_KEY_X509;
  132 + this.setValidatorsRpkX509();
132 133 break;
133 134 }
134 135 this.serverFormGroup.updateValueAndValidity();
135   - // this.checkValueWithNewValidate();
136 136 }
137 137
138   - // checkValueWithNewValidate(): void {
139   - // this.serverFormGroup.patchValue({
140   - // host: this.serverFormGroup.get('host').value,
141   - // port: this.serverFormGroup.get('port').value,
142   - // bootstrapServerIs: this.serverFormGroup.get('bootstrapServerIs').value,
143   - // serverPublicKey: this.serverFormGroup.get('serverPublicKey').value,
144   - // clientHoldOffTime: this.serverFormGroup.get('clientHoldOffTime').value,
145   - // serverId: this.serverFormGroup.get('serverId').value,
146   - // bootstrapServerAccountTimeout: this.serverFormGroup.get('bootstrapServerAccountTimeout').value,
147   - // },
148   - // {emitEvent: true});
149   - // }
  138 + private setValidatorsNoSecPsk = (): void => {
  139 + this.serverFormGroup.get('serverPublicKey').setValidators([]);
  140 + }
  141 +
  142 + private setValidatorsRpkX509 = (): void => {
  143 + this.serverFormGroup.get('serverPublicKey').setValidators([Validators.required,
  144 + Validators.pattern(KEY_REGEXP_HEX_DEC),
  145 + Validators.minLength(this.lenMinServerPublicKey),
  146 + Validators.maxLength(this.lenMaxServerPublicKey)]);
  147 + }
150 148
151 149 writeValue(value: any): void {
152 150 if (value) {
... ... @@ -160,7 +158,7 @@ export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAcc
160 158 this.propagateChange = fn;
161 159 }
162 160
163   - private propagateChangeState(value: any): void {
  161 + private propagateChangeState = (value: any): void => {
164 162 if (value !== undefined) {
165 163 if (this.valuePrev === null) {
166 164 this.valuePrev = 'init';
... ... @@ -190,7 +188,7 @@ export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAcc
190 188 registerOnTouched(fn: any): void {
191 189 }
192 190
193   - getServerGroup(): FormGroup {
  191 + private getServerGroup = (): FormGroup => {
194 192 const port = this.bootstrapServerIs ? DEFAULT_PORT_BOOTSTRAP_NO_SEC : DEFAULT_PORT_SERVER_NO_SEC;
195 193 return this.fb.group({
196 194 host: [this.window.location.hostname, this.required ? [Validators.required] : []],
... ... @@ -204,7 +202,7 @@ export class Lwm2mDeviceConfigServerComponent implements OnInit, ControlValueAcc
204 202 });
205 203 }
206 204
207   - getLwm2mBootstrapSecurityInfo(mode: string) {
  205 + private getLwm2mBootstrapSecurityInfo = (mode: string): void => {
208 206 this.deviceProfileService.getLwm2mBootstrapSecurityInfo(mode, this.serverFormGroup.get('bootstrapServerIs').value).subscribe(
209 207 (serverSecurityConfig) => {
210 208 this.serverFormGroup.patchValue({
... ...
... ... @@ -19,118 +19,126 @@
19 19 <div mat-dialog-content>
20 20 <mat-tab-group dynamicHeight>
21 21 <mat-tab label="{{ 'device-profile.lwm2m.model-tab' | translate }}">
22   - <div class="mat-padding">
23   - <tb-profile-lwm2m-object-list
24   - (addList)="addObjectsList($event)"
25   - (removeList)="removeObjectsList($event)"
26   - [required]="required"
27   - formControlName="objectIds">
28   - </tb-profile-lwm2m-object-list>
29   - </div>
30   - <div class="mat-padding">
31   - <tb-profile-lwm2m-observe-attr-telemetry
32   - [required]="required"
33   - formControlName="observeAttrTelemetry">
34   - </tb-profile-lwm2m-observe-attr-telemetry>
35   - </div>
  22 + <ng-template matTabContent>
  23 + <div class="mat-padding">
  24 + <tb-profile-lwm2m-object-list
  25 + (addList)="addObjectsList($event)"
  26 + (removeList)="removeObjectsList($event)"
  27 + [required]="required"
  28 + formControlName="objectIds">
  29 + </tb-profile-lwm2m-object-list>
  30 + </div>
  31 + <div class="mat-padding">
  32 + <tb-profile-lwm2m-observe-attr-telemetry
  33 + [required]="required"
  34 + formControlName="observeAttrTelemetry">
  35 + </tb-profile-lwm2m-observe-attr-telemetry>
  36 + </div>
  37 + </ng-template>
36 38 </mat-tab>
37 39 <mat-tab label="{{ 'device-profile.lwm2m.bootstrap-tab' | translate }}">
38   - <div class="mat-padding">
39   - <mat-accordion multi="true" class="mat-body-1">
40   - <mat-expansion-panel>
41   - <mat-expansion-panel-header>
42   - <mat-panel-title>
43   - <div class="tb-panel-title">{{ 'device-profile.lwm2m.servers' | translate | uppercase }}</div>
44   - </mat-panel-title>
45   - </mat-expansion-panel-header>
46   - <div fxLayout="column">
47   - <div fxLayout="row" fxLayoutGap="8px">
48   - <mat-form-field fxFlex>
49   - <mat-label>{{ 'device-profile.lwm2m.short-id' | translate }}</mat-label>
50   - <input matInput type="number" formControlName="shortId" required>
51   - <mat-error *ngIf="lwm2mDeviceProfileTransportConfFormGroup.get('shortId').hasError('required')">
52   - {{ 'device-profile.lwm2m.short-id' | translate }}
53   - <strong>{{ 'device-profile.lwm2m.required' | translate }}</strong>
54   - </mat-error>
55   - </mat-form-field>
56   - <mat-form-field fxFlex>
57   - <mat-label>{{ 'device-profile.lwm2m.lifetime' | translate }}</mat-label>
58   - <input matInput type="number" formControlName="lifetime" required>
59   - <mat-error *ngIf="lwm2mDeviceProfileTransportConfFormGroup.get('lifetime').hasError('required')">
60   - {{ 'device-profile.lwm2m.lifetime' | translate }}
61   - <strong>{{ 'device-profile.lwm2m.required' | translate }}</strong>
62   - </mat-error>
63   - </mat-form-field>
  40 + <ng-template matTabContent>
  41 + <div class="mat-padding">
  42 + <mat-accordion multi="true" class="mat-body-1">
  43 + <mat-expansion-panel>
  44 + <mat-expansion-panel-header>
  45 + <mat-panel-title>
  46 + <div class="tb-panel-title">{{ 'device-profile.lwm2m.servers' | translate | uppercase }}</div>
  47 + </mat-panel-title>
  48 + </mat-expansion-panel-header>
  49 + <div fxLayout="column">
  50 + <div fxLayout="row" fxLayoutGap="8px">
  51 + <mat-form-field fxFlex>
  52 + <mat-label>{{ 'device-profile.lwm2m.short-id' | translate }}</mat-label>
  53 + <input matInput type="number" formControlName="shortId" required>
  54 + <mat-error *ngIf="lwm2mDeviceProfileTransportConfFormGroup.get('shortId').hasError('required')">
  55 + {{ 'device-profile.lwm2m.short-id' | translate }}
  56 + <strong>{{ 'device-profile.lwm2m.required' | translate }}</strong>
  57 + </mat-error>
  58 + </mat-form-field>
  59 + <mat-form-field fxFlex>
  60 + <mat-label>{{ 'device-profile.lwm2m.lifetime' | translate }}</mat-label>
  61 + <input matInput type="number" formControlName="lifetime" required>
  62 + <mat-error *ngIf="lwm2mDeviceProfileTransportConfFormGroup.get('lifetime').hasError('required')">
  63 + {{ 'device-profile.lwm2m.lifetime' | translate }}
  64 + <strong>{{ 'device-profile.lwm2m.required' | translate }}</strong>
  65 + </mat-error>
  66 + </mat-form-field>
  67 + </div>
  68 + <div fxLayout="row" fxLayoutGap="8px">
  69 + <mat-form-field fxFlex>
  70 + <mat-label>{{ 'device-profile.lwm2m.default-min-period' | translate }}</mat-label>
  71 + <input matInput type="number" formControlName="defaultMinPeriod" required>
  72 + <mat-error
  73 + *ngIf="lwm2mDeviceProfileTransportConfFormGroup.get('defaultMinPeriod').hasError('required')">
  74 + {{ 'device-profile.lwm2m.default-min-period' | translate }}
  75 + <strong>{{ 'device-profile.lwm2m.required' | translate }}</strong>
  76 + </mat-error>
  77 + </mat-form-field>
  78 + <mat-form-field fxFlex>
  79 + <mat-label>{{ 'device-profile.lwm2m.binding' | translate }}</mat-label>
  80 + <input matInput type="text" formControlName="binding" required>
  81 + <mat-error *ngIf="lwm2mDeviceProfileTransportConfFormGroup.get('binding').hasError('required')">
  82 + {{ 'device-profile.lwm2m.binding' | translate }}
  83 + <strong>{{ 'device-profile.lwm2m.required' | translate }}</strong>
  84 + </mat-error>
  85 + </mat-form-field>
  86 + </div>
  87 + <div>
  88 + <mat-checkbox formControlName="notifIfDisabled" color="primary">
  89 + {{ 'device-profile.lwm2m.notif-if-disabled' | translate }}
  90 + </mat-checkbox>
  91 + </div>
64 92 </div>
65   - <div fxLayout="row" fxLayoutGap="8px">
66   - <mat-form-field fxFlex>
67   - <mat-label>{{ 'device-profile.lwm2m.default-min-period' | translate }}</mat-label>
68   - <input matInput type="number" formControlName="defaultMinPeriod" required>
69   - <mat-error *ngIf="lwm2mDeviceProfileTransportConfFormGroup.get('defaultMinPeriod').hasError('required')">
70   - {{ 'device-profile.lwm2m.default-min-period' | translate }}
71   - <strong>{{ 'device-profile.lwm2m.required' | translate }}</strong>
72   - </mat-error>
73   - </mat-form-field>
74   - <mat-form-field fxFlex>
75   - <mat-label>{{ 'device-profile.lwm2m.binding' | translate }}</mat-label>
76   - <input matInput type="text" formControlName="binding" required>
77   - <mat-error *ngIf="lwm2mDeviceProfileTransportConfFormGroup.get('binding').hasError('required')">
78   - {{ 'device-profile.lwm2m.binding' | translate }}
79   - <strong>{{ 'device-profile.lwm2m.required' | translate }}</strong>
80   - </mat-error>
81   - </mat-form-field>
  93 + </mat-expansion-panel>
  94 + </mat-accordion>
  95 + <mat-accordion multi="true" class="mat-body-1">
  96 + <mat-expansion-panel>
  97 + <mat-expansion-panel-header>
  98 + <mat-panel-title>
  99 + <div
  100 + class="tb-panel-title">{{ 'device-profile.lwm2m.bootstrap-server' | translate | uppercase }}</div>
  101 + </mat-panel-title>
  102 + </mat-expansion-panel-header>
  103 + <div class="mat-padding">
  104 + <tb-profile-lwm2m-device-config-server
  105 + [required]="required"
  106 + formControlName="bootstrapServer"
  107 + [bootstrapServerIs]=true>
  108 + </tb-profile-lwm2m-device-config-server>
82 109 </div>
83   - <div>
84   - <mat-checkbox formControlName="notifIfDisabled" color="primary">
85   - {{ 'device-profile.lwm2m.notif-if-disabled' | translate }}
86   - </mat-checkbox>
  110 + </mat-expansion-panel>
  111 + </mat-accordion>
  112 + <mat-accordion multi="true" class="mat-body-1">
  113 + <mat-expansion-panel>
  114 + <mat-expansion-panel-header>
  115 + <mat-panel-title>
  116 + <div class="tb-panel-title">{{ 'device-profile.lwm2m.lwm2m-server' | translate | uppercase }}</div>
  117 + </mat-panel-title>
  118 + </mat-expansion-panel-header>
  119 + <div class="mat-padding">
  120 + <tb-profile-lwm2m-device-config-server
  121 + [required]="required"
  122 + formControlName="lwm2mServer"
  123 + [bootstrapServerIs]=false>
  124 + </tb-profile-lwm2m-device-config-server>
87 125 </div>
88   - </div>
89   - </mat-expansion-panel>
90   - </mat-accordion>
91   - <mat-accordion multi="true" class="mat-body-1">
92   - <mat-expansion-panel>
93   - <mat-expansion-panel-header>
94   - <mat-panel-title>
95   - <div class="tb-panel-title">{{ 'device-profile.lwm2m.bootstrap-server' | translate | uppercase }}</div>
96   - </mat-panel-title>
97   - </mat-expansion-panel-header>
98   - <div class="mat-padding">
99   - <tb-profile-lwm2m-device-config-server
100   - [required]="required"
101   - formControlName = "bootstrapServer"
102   - [bootstrapServerIs]=true>
103   - </tb-profile-lwm2m-device-config-server>
104   - </div>
105   - </mat-expansion-panel>
106   - </mat-accordion>
107   - <mat-accordion multi="true" class="mat-body-1">
108   - <mat-expansion-panel>
109   - <mat-expansion-panel-header>
110   - <mat-panel-title>
111   - <div class="tb-panel-title">{{ 'device-profile.lwm2m.lwm2m-server' | translate | uppercase }}</div>
112   - </mat-panel-title>
113   - </mat-expansion-panel-header>
114   - <div class="mat-padding">
115   - <tb-profile-lwm2m-device-config-server
116   - [required]="required"
117   - formControlName="lwm2mServer"
118   - [bootstrapServerIs]=false>
119   - </tb-profile-lwm2m-device-config-server>
120   - </div>
121   - </mat-expansion-panel>
122   - </mat-accordion>
123   - </div>
  126 + </mat-expansion-panel>
  127 + </mat-accordion>
  128 + </div>
  129 + </ng-template>
124 130 </mat-tab>
125 131 <mat-tab label="{{ 'device-profile.lwm2m.config-json-tab' | translate }}">
126   - <div class="mat-padding">
127   - <tb-json-object-edit
128   - [required]="required"
129   - [sort] = "sortFunction"
130   - label="{{ 'device-profile.transport-type-lwm2m' | translate }}"
131   - formControlName="configurationJson">
132   - </tb-json-object-edit>
133   - </div>
  132 + <ng-template matTabContent>
  133 + <div class="mat-padding">
  134 + <tb-json-object-edit
  135 + [required]="required"
  136 + [sort]="sortFunction"
  137 + label="{{ 'device-profile.transport-type-lwm2m' | translate }}"
  138 + formControlName="configurationJson">
  139 + </tb-json-object-edit>
  140 + </div>
  141 + </ng-template>
134 142 </mat-tab>
135 143 </mat-tab-group>
136 144 </div>
... ...
... ... @@ -34,10 +34,10 @@ import {
34 34 OBSERVE_ATTR,
35 35 TELEMETRY,
36 36 ObjectLwM2M, getDefaultProfileConfig, KEY_NAME, Instance, ProfileConfigModels, ResourceLwM2M
37   -} from "./profile-config.models";
38   -import { DeviceProfileService } from "@core/http/device-profile.service";
39   -import { deepClone, isUndefined } from "@core/utils";
40   -import { WINDOW } from "@core/services/window.service";
  37 +} from './profile-config.models';
  38 +import { DeviceProfileService } from '@core/http/device-profile.service';
  39 +import { deepClone, isUndefined } from '@core/utils';
  40 +import { WINDOW } from '@core/services/window.service';
41 41 import { JsonObject } from '@angular/compiler-cli/ngcc/src/packages/entry_point';
42 42 import { isNotNullOrUndefined } from 'codelyzer/util/isNotNullOrUndefined';
43 43
... ... @@ -65,7 +65,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
65 65 bootstrapServers: string;
66 66 bootstrapServer: string;
67 67 lwm2mServer: string;
68   - sortFunction = this.sortObjectKeyPathJson;
  68 + sortFunction: {};
69 69
70 70 get required(): boolean {
71 71 return this.requiredValue;
... ... @@ -76,7 +76,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
76 76 this.requiredValue = coerceBooleanProperty(value);
77 77 }
78 78
79   - private propagateChange = (v: any) => { };
  79 + private propagateChange = (v: any) => { };
80 80
81 81 constructor(private store: Store<AppState>,
82 82 private fb: FormBuilder,
... ... @@ -109,6 +109,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
109 109 }
110 110
111 111 ngOnInit() {
  112 + this.sortFunction = this.sortObjectKeyPathJson;
112 113 }
113 114
114 115 setDisabledState(isDisabled: boolean): void {
... ... @@ -130,22 +131,22 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
130 131 this.initWriteValue();
131 132 }
132 133
133   - private initWriteValue(): void {
  134 + private initWriteValue = (): void => {
134 135 const modelValue = {objectIds: null, objectsList: []};
135 136 modelValue.objectIds = this.getObjectsFromJsonAllConfig();
136 137 if (modelValue.objectIds !== null) {
137 138 this.deviceProfileService.getLwm2mObjects(modelValue.objectIds).subscribe(
138   - (objectsList) => {
139   - modelValue.objectsList = objectsList;
140   - this.updateWriteValue(modelValue);
141   - }
  139 + (objectsList) => {
  140 + modelValue.objectsList = objectsList;
  141 + this.updateWriteValue(modelValue);
  142 + }
142 143 );
143 144 } else {
144 145 this.updateWriteValue(modelValue);
145 146 }
146 147 }
147 148
148   - private updateWriteValue(value: any): void {
  149 + private updateWriteValue = (value: any): void => {
149 150 const objectsList = deepClone(value.objectsList);
150 151 this.lwm2mDeviceProfileTransportConfFormGroup.patchValue({
151 152 objectIds: value,
... ... @@ -161,7 +162,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
161 162 {emitEvent: false});
162 163 }
163 164
164   - private updateModel() {
  165 + private updateModel = (): void => {
165 166 let configuration: DeviceProfileTransportConfiguration = null;
166 167 if (this.lwm2mDeviceProfileTransportConfFormGroup.valid) {
167 168 this.upDateValueToJson();
... ... @@ -171,25 +172,25 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
171 172 this.propagateChange(configuration);
172 173 }
173 174
174   - private updateObserveAttrTelemetryObjectFormGroup(objectsList: ObjectLwM2M[]) {
  175 + private updateObserveAttrTelemetryObjectFormGroup = (objectsList: ObjectLwM2M[]): void => {
175 176 this.lwm2mDeviceProfileTransportConfFormGroup.patchValue({
176   - observeAttrTelemetry: {clientLwM2M: this.getObserveAttrTelemetryObjects(objectsList)}
177   - },
178   - {emitEvent: false});
  177 + observeAttrTelemetry: {clientLwM2M: this.getObserveAttrTelemetryObjects(objectsList)}
  178 + },
  179 + {emitEvent: false});
179 180 this.lwm2mDeviceProfileTransportConfFormGroup.get('observeAttrTelemetry').markAsPristine({
180 181 onlySelf: true
181 182 });
182 183 }
183 184
184   - upDateValueToJson(): void {
185   - this.upDateValueToJsonTab_0();
186   - this.upDateValueToJsonTab_1();
  185 + private upDateValueToJson = (): void => {
  186 + this.upDateValueToJsonTab0();
  187 + this.upDateValueToJsonTab1();
187 188 }
188 189
189   - upDateValueToJsonTab_0(): void {
  190 + private upDateValueToJsonTab0 = (): void => {
190 191 if (!this.lwm2mDeviceProfileTransportConfFormGroup.get('observeAttrTelemetry').pristine) {
191 192 this.upDateObserveAttrTelemetryFromGroupToJson(
192   - this.lwm2mDeviceProfileTransportConfFormGroup.get('observeAttrTelemetry').value.clientLwM2M
  193 + this.lwm2mDeviceProfileTransportConfFormGroup.get('observeAttrTelemetry').value.clientLwM2M
193 194 );
194 195 this.lwm2mDeviceProfileTransportConfFormGroup.get('observeAttrTelemetry').markAsPristine({
195 196 onlySelf: true
... ... @@ -198,7 +199,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
198 199 }
199 200 }
200 201
201   - upDateValueToJsonTab_1(): void {
  202 + private upDateValueToJsonTab1 = (): void => {
202 203 this.upDateValueServersToJson();
203 204 if (!this.lwm2mDeviceProfileTransportConfFormGroup.get('bootstrapServer').pristine) {
204 205 this.configurationValue.bootstrap.bootstrapServer = this.lwm2mDeviceProfileTransportConfFormGroup.get('bootstrapServer').value;
... ... @@ -216,7 +217,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
216 217 }
217 218 }
218 219
219   - upDateValueServersToJson(): void {
  220 + private upDateValueServersToJson = (): void => {
220 221 const bootstrapServers = this.configurationValue.bootstrap.servers;
221 222 if (!this.lwm2mDeviceProfileTransportConfFormGroup.get('shortId').pristine) {
222 223 bootstrapServers.shortId = this.lwm2mDeviceProfileTransportConfFormGroup.get('shortId').value;
... ... @@ -255,7 +256,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
255 256 }
256 257 }
257 258
258   - getObserveAttrTelemetryObjects(listObject: ObjectLwM2M[]): ObjectLwM2M [] {
  259 + private getObserveAttrTelemetryObjects = (listObject: ObjectLwM2M[]): ObjectLwM2M [] => {
259 260 const clientObserveAttr = deepClone(listObject);
260 261 if (this.configurationValue[this.observeAttr]) {
261 262 const observeArray = this.configurationValue[this.observeAttr][this.observe] as Array<string>;
... ... @@ -284,12 +285,13 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
284 285 return clientObserveAttr;
285 286 }
286 287
287   - includesInstancesNo(attributeArray: Array<string>, telemetryArray: Array<string>): boolean {
  288 + private includesInstancesNo = (attributeArray: Array<string>, telemetryArray: Array<string>): boolean => {
288 289 const isIdIndex = (element) => !element.includes('/0/');
289 290 return attributeArray.findIndex(isIdIndex) >= 0 || telemetryArray.findIndex(isIdIndex) >= 0;
290 291 }
291 292
292   - addInstances(attributeArray: Array<string>, telemetryArray: Array<string>, clientObserveAttr: ObjectLwM2M[]): void {
  293 + private addInstances = (attributeArray: Array<string>, telemetryArray: Array<string>,
  294 + clientObserveAttr: ObjectLwM2M[]): void => {
293 295 const attr = [] as Array<string>;
294 296 [...attributeArray].filter(x => (!x.includes('/0/'))).forEach(x => {
295 297 attr.push(this.convertPathToInstance(x));
... ... @@ -310,42 +312,43 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
310 312 });
311 313 }
312 314
313   - convertPathToInstance(path: string): string {
  315 + private convertPathToInstance = (path: string): string => {
314 316 const newX = Array.from(path.substring(1).split('/'), Number);
315 317 return [newX[0], newX[1]].join('/');
316 318 }
317 319
318   - updateObserveAttrTelemetryObjects(isParameter: Array<string>, clientObserveAttr: ObjectLwM2M[], nameParameter: string): void {
  320 + private updateObserveAttrTelemetryObjects = (isParameter: Array<string>, clientObserveAttr: ObjectLwM2M[],
  321 + nameParameter: string): void => {
319 322 isParameter.forEach(attr => {
320 323 const idKeys = Array.from(attr.substring(1).split('/'), Number);
321 324 clientObserveAttr
322   - .forEach(e => {
323   - if (e.id === idKeys[0]) {
324   - const instance = e.instances.find(itrInstance => itrInstance.id === idKeys[1]);
325   - if (isNotNullOrUndefined(instance)) {
326   - instance.resources.find(resource => resource.id === idKeys[2])[nameParameter] = true;
327   - }
  325 + .forEach(e => {
  326 + if (e.id === idKeys[0]) {
  327 + const instance = e.instances.find(itrInstance => itrInstance.id === idKeys[1]);
  328 + if (isNotNullOrUndefined(instance)) {
  329 + instance.resources.find(resource => resource.id === idKeys[2])[nameParameter] = true;
328 330 }
329   - });
  331 + }
  332 + });
330 333 });
331 334 }
332 335
333   - updateKeyNameObjects(nameJson: JsonObject, clientObserveAttr: ObjectLwM2M[]): void {
  336 + private updateKeyNameObjects = (nameJson: JsonObject, clientObserveAttr: ObjectLwM2M[]): void => {
334 337 const keyName = JSON.parse(JSON.stringify(nameJson));
335 338 Object.keys(keyName).forEach(key => {
336 339 const idKeys = Array.from(key.substring(1).split('/'), Number);
337 340 clientObserveAttr
338   - .forEach(e => {
339   - if (e.id === idKeys[0]) {
340   - e.instances
341   - .find(instance => instance.id === idKeys[1]).resources
342   - .find(resource => resource.id === idKeys[2]).keyName = keyName[key];
343   - }
344   - });
  341 + .forEach(e => {
  342 + if (e.id === idKeys[0]) {
  343 + e.instances
  344 + .find(instance => instance.id === idKeys[1]).resources
  345 + .find(resource => resource.id === idKeys[2]).keyName = keyName[key];
  346 + }
  347 + });
345 348 });
346 349 }
347 350
348   - upDateObserveAttrTelemetryFromGroupToJson(val: ObjectLwM2M[]): void {
  351 + private upDateObserveAttrTelemetryFromGroupToJson = (val: ObjectLwM2M[]): void => {
349 352 const observeArray: Array<string> = [];
350 353 const attributeArray: Array<string> = [];
351 354 const telemetryArray: Array<string> = [];
... ... @@ -405,19 +408,22 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
405 408 this.updateKeyName();
406 409 }
407 410
408   - sortObjectKeyPathJson(key, value) {
  411 + sortObjectKeyPathJson = (key: string, value: object): object => {
409 412 if (key === 'keyName') {
410 413 return Object.keys(value).sort((a, b) => {
411 414 const aLC = Array.from(a.substring(1).split('/'), Number);
412 415 const bLC = Array.from(b.substring(1).split('/'), Number);
413 416 return aLC[0] === bLC[0] ? aLC[1] - bLC[1] : aLC[0] - bLC[0];
414   - }).reduce((r, k) => r[k] = value[k], {});
  417 + }).reduce((obj, keySort) => {
  418 + obj[keySort] = value[keySort];
  419 + return obj;
  420 + }, {});
415 421 } else {
416 422 return value;
417 423 }
418 424 }
419 425
420   - updateKeyName(): void {
  426 + private updateKeyName = (): void => {
421 427 const paths = new Set<string>();
422 428 if (this.configurationValue[this.observeAttr][this.attribute]) {
423 429 this.configurationValue[this.observeAttr][this.attribute].forEach(path => {
... ... @@ -431,20 +437,20 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
431 437 }
432 438 const keyNameNew = {};
433 439 paths.forEach(path => {
434   - const pathParameter = this.findIndexsForIds(path);
  440 + const pathParameter = this.findIndexesForIds(path);
435 441 if (pathParameter.length === 3) {
436 442 keyNameNew[path] = this.lwm2mDeviceProfileTransportConfFormGroup.get('observeAttrTelemetry').value
437   - .clientLwM2M[pathParameter[0]].instances[pathParameter[1]].resources[pathParameter[2]][this.keyName];
  443 + .clientLwM2M[pathParameter[0]].instances[pathParameter[1]].resources[pathParameter[2]][this.keyName];
438 444 }
439 445 });
440 446 this.configurationValue[this.observeAttr][this.keyName] = this.sortObjectKeyPathJson('keyName', keyNameNew);
441 447 }
442 448
443   - findIndexsForIds(path: string): number[] {
  449 + private findIndexesForIds = (path: string): number[] => {
444 450 const pathParameter = Array.from(path.substring(1).split('/'), Number);
445 451 const pathParameterIndexes: number[] = [];
446 452 const objectsOld = deepClone(
447   - this.lwm2mDeviceProfileTransportConfFormGroup.get('observeAttrTelemetry').value.clientLwM2M) as ObjectLwM2M[];
  453 + this.lwm2mDeviceProfileTransportConfFormGroup.get('observeAttrTelemetry').value.clientLwM2M) as ObjectLwM2M[];
448 454 let isIdIndex = (element) => element.id === pathParameter[0];
449 455 const objIndex = objectsOld.findIndex(isIdIndex);
450 456 if (objIndex >= 0) {
... ... @@ -463,7 +469,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
463 469 return pathParameterIndexes;
464 470 }
465 471
466   - getObjectsFromJsonAllConfig(): number [] {
  472 + private getObjectsFromJsonAllConfig = (): number [] => {
467 473 const objectsIds = new Set<number>();
468 474 if (this.configurationValue[this.observeAttr]) {
469 475 if (this.configurationValue[this.observeAttr][this.observe]) {
... ... @@ -485,7 +491,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
485 491 return (objectsIds.size > 0) ? Array.from(objectsIds) : null;
486 492 }
487 493
488   - upDateJsonAllConfig(): void {
  494 + private upDateJsonAllConfig = (): void => {
489 495 this.lwm2mDeviceProfileTransportConfFormGroup.patchValue({
490 496 configurationJson: this.configurationValue
491 497 }, {emitEvent: false});
... ... @@ -494,11 +500,11 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
494 500 });
495 501 }
496 502
497   - addObjectsList(value: ObjectLwM2M[]): void {
  503 + addObjectsList = (value: ObjectLwM2M[]): void => {
498 504 this.updateObserveAttrTelemetryObjectFormGroup(deepClone(value));
499 505 }
500 506
501   - removeObjectsList(value: ObjectLwM2M): void {
  507 + removeObjectsList = (value: ObjectLwM2M): void => {
502 508 const objectsOld = deepClone(this.lwm2mDeviceProfileTransportConfFormGroup.get('observeAttrTelemetry').value.clientLwM2M);
503 509 const isIdIndex = (element) => element.id === value.id;
504 510 const index = objectsOld.findIndex(isIdIndex);
... ... @@ -514,7 +520,7 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
514 520 this.upDateJsonAllConfig();
515 521 }
516 522
517   - removeObserveAttrTelemetryFromJson(observeAttrTel: string, id: number): void {
  523 + private removeObserveAttrTelemetryFromJson = (observeAttrTel: string, id: number): void => {
518 524 const isIdIndex = (element) => Array.from(element.substring(1).split('/'), Number)[0] === id;
519 525 let index = this.configurationValue[this.observeAttr][observeAttrTel].findIndex(isIdIndex);
520 526 while (index >= 0) {
... ... @@ -523,12 +529,12 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
523 529 }
524 530 }
525 531
526   - removeKeyNameFromJson(id: number): void {
527   - const keyNmaeJson = this.configurationValue[this.observeAttr][this.keyName];
528   - Object.keys(keyNmaeJson).forEach(key => {
  532 + private removeKeyNameFromJson = (id: number): void => {
  533 + const keyNameJson = this.configurationValue[this.observeAttr][this.keyName];
  534 + Object.keys(keyNameJson).forEach(key => {
529 535 const idKey = Array.from(key.substring(1).split('/'), Number)[0];
530 536 if (idKey === id) {
531   - delete keyNmaeJson[key];
  537 + delete keyNameJson[key];
532 538 }
533 539 });
534 540 }
... ... @@ -538,10 +544,10 @@ export class Lwm2mDeviceProfileTransportConfigurationComponent implements Contro
538 544 if (!isPath) {
539 545 isPath = this.findPathInJson(path, this.telemetry);
540 546 }
541   - return (isPath) ? true : false;
  547 + return !!isPath;
542 548 }
543 549
544   - findPathInJson(path: string, side: string): string {
  550 + private findPathInJson = (path: string, side: string): string => {
545 551 if (this.configurationValue[this.observeAttr]) {
546 552 if (this.configurationValue[this.observeAttr][side]) {
547 553 return this.configurationValue[this.observeAttr][side].find(
... ...
... ... @@ -21,44 +21,45 @@ import {
21 21 OnInit,
22 22 ViewChild,
23 23 ElementRef,
24   -} from "@angular/core";
  24 +} from '@angular/core';
25 25 import {
26 26 ControlValueAccessor,
27 27 FormBuilder,
28 28 FormGroup,
29 29 NG_VALUE_ACCESSOR, Validators
30   -} from "@angular/forms";
31   -import { coerceBooleanProperty } from "@angular/cdk/coercion";
32   -import { Store } from "@ngrx/store";
33   -import { AppState } from "@core/core.state";
  30 +} from '@angular/forms';
  31 +import { coerceBooleanProperty } from '@angular/cdk/coercion';
  32 +import { Store } from '@ngrx/store';
  33 +import { AppState } from '@core/core.state';
34 34 import { MatChipList } from '@angular/material/chips';
35 35 import {
36 36 INSTANCES_ID_VALUE_MAX,
37 37 INSTANCES_ID_VALUE_MIN
38   -} from "./profile-config.models";
39   -import { TranslateService } from "@ngx-translate/core";
40   -import { DeviceProfileService } from "@core/http/device-profile.service";
  38 +} from './profile-config.models';
  39 +import { TranslateService } from '@ngx-translate/core';
  40 +import { DeviceProfileService } from '@core/http/device-profile.service';
41 41
42 42 @Component({
43 43 selector: 'tb-profile-lwm2m-object-add-instances-list',
44 44 templateUrl: './lwm2m-object-add-instances-list.component.html',
45 45 styleUrls: ['./lwm2m-object-add-instances-list.component.scss'],
46 46 providers: [{
47   - provide: NG_VALUE_ACCESSOR,
48   - useExisting: forwardRef(() => Lwm2mObjectAddInstancesListComponent),
49   - multi: true
50   - }]
  47 + provide: NG_VALUE_ACCESSOR,
  48 + useExisting: forwardRef(() => Lwm2mObjectAddInstancesListComponent),
  49 + multi: true
  50 + }]
51 51 })
52 52 export class Lwm2mObjectAddInstancesListComponent implements ControlValueAccessor, OnInit, Validators {
53 53
54   - lwm2mObjectListFormGroup: FormGroup;
55 54 private requiredValue: boolean;
56   - private instancesIdsList: Set<number> | null;
57   - filteredObjectsList: Array<number>;
58 55 private disabled = false as boolean;
59 56 private dirty = false as boolean;
60   - instanceIdValueMin = INSTANCES_ID_VALUE_MIN as number
61   - instanceIdValueMax = INSTANCES_ID_VALUE_MAX as number
  57 +
  58 + lwm2mObjectListFormGroup: FormGroup;
  59 + instancesIdsList: Set<number> | null;
  60 + filteredObjectsList: Array<number>;
  61 + instanceIdValueMin = INSTANCES_ID_VALUE_MIN as number;
  62 + instanceIdValueMax = INSTANCES_ID_VALUE_MAX as number;
62 63
63 64 get required(): boolean {
64 65 return this.requiredValue;
... ... @@ -76,8 +77,7 @@ export class Lwm2mObjectAddInstancesListComponent implements ControlValueAccesso
76 77 @ViewChild('instanceIdInput') instanceIdInput: ElementRef<HTMLInputElement>;
77 78 @ViewChild('chipList', {static: true}) chipList: MatChipList;
78 79
79   - private propagateChange = (v: any) => {
80   - };
  80 + private propagateChange = (v: any) => { };
81 81
82 82 constructor(private store: Store<AppState>,
83 83 public translate: TranslateService,
... ... @@ -89,7 +89,7 @@ export class Lwm2mObjectAddInstancesListComponent implements ControlValueAccesso
89 89 });
90 90 }
91 91
92   - updateValidators() {
  92 + private updateValidators = (): void => {
93 93 this.lwm2mObjectListFormGroup.get('instanceIdInput').setValidators([
94 94 Validators.min(this.instanceIdValueMin),
95 95 Validators.max(this.instanceIdValueMax)]);
... ... @@ -128,41 +128,41 @@ export class Lwm2mObjectAddInstancesListComponent implements ControlValueAccesso
128 128 this.dirty = false;
129 129 }
130 130
131   - add(value: number): void {
  131 + add = (value: number): void => {
132 132 if (!isNaN(value) && this.lwm2mObjectListFormGroup.get('instanceIdInput').valid) {
133 133 this.instancesIdsList.add(value);
134 134 this.lwm2mObjectListFormGroup.get('instancesIdsList').setValue(this.instancesIdsList);
135 135 this.propagateChange(this.instancesIdsList);
136   - this.dirty = true
  136 + this.dirty = true;
137 137 }
138 138 this.clear();
139 139 }
140 140
141   - remove(object: number) {
  141 + remove = (object: number): void => {
142 142 this.instancesIdsList.delete(object);
143 143 this.lwm2mObjectListFormGroup.get('instancesIdsList').setValue(this.instancesIdsList);
144 144 this.propagateChange(this.instancesIdsList);
145   - this.dirty = true
  145 + this.dirty = true;
146 146 this.clear();
147 147 }
  148 + //
  149 + // displayFn(object?: number): number | undefined {
  150 + // return object ? object : undefined;
  151 + // }
148 152
149   - displayFn(object?: number): number | undefined {
150   - return object ? object : undefined;
151   - }
152   -
153   - clear() {
  153 + private clear = (): void => {
154 154 this.lwm2mObjectListFormGroup.get('instanceIdInput').patchValue(null, {emitEvent: true});
155   - this.instanceIdInput.nativeElement.value = "";
  155 + this.instanceIdInput.nativeElement.value = '';
156 156 setTimeout(() => {
157 157 this.instanceIdInput.nativeElement.blur();
158 158 this.instanceIdInput.nativeElement.focus();
159 159 }, 0);
160 160 }
161 161
162   - onkeydown(e: KeyboardEvent) {
163   - if (e.keyCode == 189 || e.keyCode == 187 || e.keyCode == 109 || e.keyCode == 107) {
  162 + onkeydown = (e: KeyboardEvent): boolean => {
  163 + if (e.keyCode === 189 || e.keyCode === 187 || e.keyCode === 109 || e.keyCode === 107) {
164 164 return false;
165   - } else if (e.keyCode == 8) {
  165 + } else if (e.keyCode === 8) {
166 166 if (this.lwm2mObjectListFormGroup.get('instanceIdInput').value == null) {
167 167 this.clear();
168 168 }
... ... @@ -170,7 +170,7 @@ export class Lwm2mObjectAddInstancesListComponent implements ControlValueAccesso
170 170 }
171 171 }
172 172
173   - onFocus() {
  173 + onFocus = (): void => {
174 174 if (this.dirty) {
175 175 this.lwm2mObjectListFormGroup.get('instanceIdInput').updateValueAndValidity({onlySelf: true, emitEvent: true});
176 176 this.dirty = false;
... ...
... ... @@ -42,7 +42,7 @@
42 42 <button mat-button color="primary"
43 43 type="button"
44 44 [disabled]="(isLoading$ | async)"
45   - (click)="cancel()" cdkFocusInitial>
  45 + (click)="cancel()">
46 46 {{ 'action.cancel' | translate }}
47 47 </button>
48 48 <button mat-button mat-raised-button color="primary"
... ...
... ... @@ -36,8 +36,6 @@ export interface Lwm2mObjectAddInstancesData {
36 36 export class Lwm2mObjectAddInstancesComponent extends DialogComponent<Lwm2mObjectAddInstancesComponent, object> implements OnInit {
37 37
38 38 jsonFormGroup: FormGroup;
39   - // title: string;
40   -
41 39 submitted = false;
42 40
43 41 constructor(protected store: Store<AppState>,
... ... @@ -52,7 +50,7 @@ export class Lwm2mObjectAddInstancesComponent extends DialogComponent<Lwm2mObjec
52 50 ngOnInit(): void {
53 51 this.jsonFormGroup = this.fb.group({
54 52 instancesIds: this.data.instancesIds
55   - })
  53 + });
56 54 }
57 55
58 56 cancel(): void {
... ... @@ -60,7 +58,7 @@ export class Lwm2mObjectAddInstancesComponent extends DialogComponent<Lwm2mObjec
60 58 }
61 59
62 60 add(): void {
63   - this.data.instancesIds = this.jsonFormGroup.get('instancesIds').value
  61 + this.data.instancesIds = this.jsonFormGroup.get('instancesIds').value;
64 62 this.dialogRef.close(this.data);
65 63 }
66 64 }
... ...
... ... @@ -23,25 +23,25 @@ import {
23 23 ElementRef,
24 24 Output,
25 25 EventEmitter
26   -} from "@angular/core";
  26 +} from '@angular/core';
27 27 import {
28 28 ControlValueAccessor,
29 29 FormBuilder,
30 30 FormGroup,
31 31 NG_VALUE_ACCESSOR, Validators
32   -} from "@angular/forms";
33   -import {coerceBooleanProperty} from "@angular/cdk/coercion";
34   -import {Store} from "@ngrx/store";
35   -import {AppState} from "@core/core.state";
  32 +} from '@angular/forms';
  33 +import {coerceBooleanProperty} from '@angular/cdk/coercion';
  34 +import {Store} from '@ngrx/store';
  35 +import {AppState} from '@core/core.state';
36 36 import {MatChipList} from '@angular/material/chips';
37   -import {MatAutocomplete} from "@angular/material/autocomplete";
38   -import {Observable} from "rxjs";
  37 +import {MatAutocomplete} from '@angular/material/autocomplete';
  38 +import {Observable} from 'rxjs';
39 39 import {filter, map, mergeMap, share, tap} from 'rxjs/operators';
40   -import {ObjectLwM2M} from "./profile-config.models";
41   -import {TranslateService} from "@ngx-translate/core";
42   -import {DeviceProfileService} from "@core/http/device-profile.service";
43   -import {PageLink} from "@shared/models/page/page-link";
44   -import {Direction} from "@shared/models/page/sort-order";
  40 +import {ObjectLwM2M} from './profile-config.models';
  41 +import {TranslateService} from '@ngx-translate/core';
  42 +import {DeviceProfileService} from '@core/http/device-profile.service';
  43 +import {PageLink} from '@shared/models/page/page-link';
  44 +import {Direction} from '@shared/models/page/sort-order';
45 45
46 46 @Component({
47 47 selector: 'tb-profile-lwm2m-object-list',
... ... @@ -56,14 +56,15 @@ import {Direction} from "@shared/models/page/sort-order";
56 56 })
57 57 export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, Validators {
58 58
59   - lwm2mObjectListFormGroup: FormGroup;
60 59 private requiredValue: boolean;
  60 + private dirty = false as boolean;
  61 +
  62 + lwm2mObjectListFormGroup: FormGroup;
61 63 modelValue: Array<number> | null;
62 64 objectsList: Array<ObjectLwM2M> = [];
63 65 filteredObjectsList: Observable<Array<ObjectLwM2M>>;
64   - private disabled = false as boolean;
  66 + disabled = false as boolean;
65 67 searchText = '' as string;
66   - private dirty = false as boolean;
67 68
68 69 get required(): boolean {
69 70 return this.requiredValue;
... ... @@ -88,8 +89,7 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V
88 89 @ViewChild('objectAutocomplete') matAutocomplete: MatAutocomplete;
89 90 @ViewChild('chipList', {static: true}) chipList: MatChipList;
90 91
91   - private propagateChange = (v: any) => {
92   - };
  92 + private propagateChange = (v: any) => { };
93 93
94 94 constructor(private store: Store<AppState>,
95 95 public translate: TranslateService,
... ... @@ -101,7 +101,7 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V
101 101 });
102 102 }
103 103
104   - updateValidators() {
  104 + private updateValidators = (): void => {
105 105 this.lwm2mObjectListFormGroup.get('objectLwm2m').setValidators(this.required ? [Validators.required] : []);
106 106 this.lwm2mObjectListFormGroup.get('objectLwm2m').updateValueAndValidity();
107 107 }
... ... @@ -130,7 +130,7 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V
130 130 );
131 131 }
132 132
133   - ngAfterViewInit(): void {
  133 + ngAfterViewInit = (): void => {
134 134 }
135 135
136 136 setDisabledState(isDisabled: boolean): void {
... ... @@ -144,9 +144,10 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V
144 144
145 145 writeValue(value: any): void {
146 146 this.searchText = '';
147   - if (value.hasOwnProperty("objectIds") && value["objectIds"] != null && value["objectIds"].length > 0) {
148   - this.modelValue = [...value["objectIds"]];
149   - this.objectsList = value["objectsList"];
  147 + const objectIds = 'objectIds';
  148 + if (value.hasOwnProperty(objectIds) && value[objectIds] != null && value[objectIds].length > 0) {
  149 + this.modelValue = [...value[objectIds]];
  150 + this.objectsList = value.objectsList;
150 151 this.lwm2mObjectListFormGroup.get('objectsList').setValue(this.objectsList);
151 152 } else {
152 153 this.objectsList = [];
... ... @@ -156,19 +157,19 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V
156 157 this.dirty = true;
157 158 }
158 159
159   - reset() {
160   - this.objectsList = [];
161   - this.lwm2mObjectListFormGroup.get('objectsList').setValue(this.objectsList);
162   - this.modelValue = null;
163   - if (this.objectInput) {
164   - this.objectInput.nativeElement.value = '';
165   - }
166   - this.lwm2mObjectListFormGroup.get('objectLwm2m').patchValue('', {emitEvent: false});
167   - this.propagateChange(this.modelValue);
168   - this.dirty = true;
169   - }
  160 + // reset() {
  161 + // this.objectsList = [];
  162 + // this.lwm2mObjectListFormGroup.get('objectsList').setValue(this.objectsList);
  163 + // this.modelValue = null;
  164 + // if (this.objectInput) {
  165 + // this.objectInput.nativeElement.value = '';
  166 + // }
  167 + // this.lwm2mObjectListFormGroup.get('objectLwm2m').patchValue('', {emitEvent: false});
  168 + // this.propagateChange(this.modelValue);
  169 + // this.dirty = true;
  170 + // }
170 171
171   - add(object: ObjectLwM2M): void {
  172 + private add = (object: ObjectLwM2M): void => {
172 173 if (!this.modelValue || this.modelValue.indexOf(object.id) === -1) {
173 174 if (!this.modelValue) {
174 175 this.modelValue = [];
... ... @@ -182,7 +183,7 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V
182 183 this.clear();
183 184 }
184 185
185   - remove(object: ObjectLwM2M) {
  186 + remove = (object: ObjectLwM2M): void => {
186 187 let index = this.objectsList.indexOf(object);
187 188 if (index >= 0) {
188 189 this.objectsList.splice(index, 1);
... ... @@ -198,11 +199,11 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V
198 199 }
199 200 }
200 201
201   - displayObjectLwm2mFn(object?: ObjectLwM2M): string | undefined {
  202 + displayObjectLwm2mFn = (object?: ObjectLwM2M): string | undefined => {
202 203 return object ? object.name : undefined;
203 204 }
204 205
205   - fetchListObjects(searchText?: string): Observable<Array<ObjectLwM2M>> {
  206 + private fetchListObjects = (searchText?: string): Observable<Array<ObjectLwM2M>> => {
206 207 this.searchText = searchText;
207 208 const pageLink = new PageLink(10, 0, searchText, {
208 209 property: 'name',
... ... @@ -210,20 +211,19 @@ export class Lwm2mObjectListComponent implements ControlValueAccessor, OnInit, V
210 211 });
211 212 return this.deviceProfileService.getLwm2mObjectsPage(pageLink, {ignoreLoading: true}).pipe(
212 213 map(pageData => {
213   - let data = pageData.data;
214   - return data;
  214 + return pageData.data;
215 215 })
216 216 );
217 217 }
218 218
219   - onFocus() {
  219 + onFocus = (): void => {
220 220 if (this.dirty) {
221 221 this.lwm2mObjectListFormGroup.get('objectLwm2m').updateValueAndValidity({onlySelf: true, emitEvent: true});
222 222 this.dirty = false;
223 223 }
224 224 }
225 225
226   - clear(value: string = '') {
  226 + private clear = (value: string = ''): void => {
227 227 this.objectInput.nativeElement.value = value;
228 228 this.lwm2mObjectListFormGroup.get('objectLwm2m').patchValue(value, {emitEvent: true});
229 229 setTimeout(() => {
... ...
... ... @@ -14,13 +14,13 @@
14 14 /// limitations under the License.
15 15 ///
16 16
17   -import { Component, forwardRef, Input, OnInit } from "@angular/core";
  17 +import { Component, forwardRef, Input, OnInit } from '@angular/core';
18 18 import {
19 19 ControlValueAccessor,
20 20 FormArray, FormBuilder,
21 21 FormGroup,
22 22 NG_VALUE_ACCESSOR, Validators
23   -} from "@angular/forms";
  23 +} from '@angular/forms';
24 24 import {
25 25 CAMEL_CASE_REGEXP,
26 26 ResourceLwM2M
... ... @@ -45,10 +45,10 @@ import { coerceBooleanProperty } from '@angular/cdk/coercion';
45 45
46 46 export class Lwm2mObserveAttrTelemetryResourceComponent implements ControlValueAccessor, OnInit, Validators {
47 47
48   - resourceFormGroup : FormGroup;
  48 + private requiredValue: boolean;
49 49
  50 + resourceFormGroup: FormGroup;
50 51 disabled = false as boolean;
51   - private requiredValue: boolean;
52 52
53 53 get required(): boolean {
54 54 return this.requiredValue;
... ... @@ -63,7 +63,7 @@ export class Lwm2mObserveAttrTelemetryResourceComponent implements ControlValueA
63 63 }
64 64 constructor(private store: Store<AppState>,
65 65 private fb: FormBuilder) {
66   - this.resourceFormGroup = this.fb.group({'resources': this.fb.array([])});
  66 + this.resourceFormGroup = this.fb.group({resources: this.fb.array([])});
67 67 this.resourceFormGroup.valueChanges.subscribe(value => {
68 68 if (!this.disabled) {
69 69 this.propagateChangeState(value.resources);
... ... @@ -85,7 +85,7 @@ export class Lwm2mObserveAttrTelemetryResourceComponent implements ControlValueA
85 85 return this.resourceFormGroup.get('resources') as FormArray;
86 86 }
87 87
88   - resourceLwm2mFormArray(instance: FormGroup): FormArray {
  88 + resourceLwm2mFormArray = (instance: FormGroup): FormArray => {
89 89 return instance.get('resources') as FormArray;
90 90 }
91 91
... ... @@ -98,28 +98,28 @@ export class Lwm2mObserveAttrTelemetryResourceComponent implements ControlValueA
98 98 }
99 99 }
100 100
101   - getDisabledState(): boolean {
  101 + getDisabledState = (): boolean => {
102 102 return this.disabled;
103 103 }
104 104
105   - updateValueKeyName (event: any, z: number): void {
  105 + updateValueKeyName = (event: any, z: number): void => {
106 106 this.resourceFormArray.at(z).patchValue( {keyName: this.keysToCamel(deepClone(event.target.value))} );
107 107 }
108 108
109   - keysToCamel(o: any): string {
110   - let val = o.split(" ");
111   - let playStore = [];
112   - val.forEach(function (item, k){
  109 + private keysToCamel = (o: any): string => {
  110 + const val = o.split(' ');
  111 + const playStore = [];
  112 + val.forEach((item, k) => {
113 113 item = item.replace(CAMEL_CASE_REGEXP, '');
114   - item = (k===0)? item.charAt(0).toLowerCase() + item.substr(1) : item.charAt(0).toUpperCase() + item.substr(1)
  114 + item = (k === 0) ? item.charAt(0).toLowerCase() + item.substr(1) : item.charAt(0).toUpperCase() + item.substr(1);
115 115 playStore.push(item);
116 116 });
117 117 return playStore.join('');
118 118 }
119 119
120   - createResourceLwM2M(resourcesLwM2MJson: ResourceLwM2M []): void {
121   - if(resourcesLwM2MJson.length === this.resourceFormArray.length) {
122   - this.resourceFormArray.patchValue(resourcesLwM2MJson, {emitEvent: false})
  120 + private createResourceLwM2M = (resourcesLwM2MJson: ResourceLwM2M []): void => {
  121 + if (resourcesLwM2MJson.length === this.resourceFormArray.length) {
  122 + this.resourceFormArray.patchValue(resourcesLwM2MJson, {emitEvent: false});
123 123 } else {
124 124 this.resourceFormArray.clear();
125 125 resourcesLwM2MJson.forEach(resourceLwM2M => {
... ... @@ -131,18 +131,17 @@ export class Lwm2mObserveAttrTelemetryResourceComponent implements ControlValueA
131 131 telemetry: resourceLwM2M.telemetry,
132 132 keyName: [resourceLwM2M.keyName, Validators.required]
133 133 }));
134   - })
  134 + });
135 135 }
136 136 }
137 137
138   - private propagateChange = (v: any) => {
139   - };
  138 + private propagateChange = (v: any) => { };
140 139
141 140 registerOnChange(fn: any): void {
142 141 this.propagateChange = fn;
143 142 }
144 143
145   - private propagateChangeState(value: any): void {
  144 + private propagateChangeState = (value: any): void => {
146 145 if (value && this.resourceFormGroup.valid) {
147 146 this.propagateChange(value);
148 147 } else {
... ... @@ -150,7 +149,7 @@ export class Lwm2mObserveAttrTelemetryResourceComponent implements ControlValueA
150 149 }
151 150 }
152 151
153   - trackByParams(index: number): number {
  152 + trackByParams = (index: number): number => {
154 153 return index;
155 154 }
156 155 }
... ...
... ... @@ -15,7 +15,7 @@
15 15 ///
16 16
17 17
18   -import { Component, forwardRef, Input, OnInit, Output } from "@angular/core";
  18 +import { Component, forwardRef, Input, OnInit } from '@angular/core';
19 19 import {
20 20 AbstractControl,
21 21 ControlValueAccessor,
... ... @@ -24,10 +24,10 @@ import {
24 24 FormGroup,
25 25 NG_VALUE_ACCESSOR,
26 26 Validators
27   -} from "@angular/forms";
28   -import { Store } from "@ngrx/store";
29   -import { AppState } from "@core/core.state";
30   -import { coerceBooleanProperty } from "@angular/cdk/coercion";
  27 +} from '@angular/forms';
  28 +import { Store } from '@ngrx/store';
  29 +import { AppState } from '@core/core.state';
  30 +import { coerceBooleanProperty } from '@angular/cdk/coercion';
31 31 import {
32 32 ATTR,
33 33 Instance,
... ... @@ -35,7 +35,7 @@ import {
35 35 OBSERVE,
36 36 ResourceLwM2M,
37 37 TELEMETRY
38   -} from "./profile-config.models";
  38 +} from './profile-config.models';
39 39 import { isNotNullOrUndefined } from 'codelyzer/util/isNotNullOrUndefined';
40 40 import { deepClone, isUndefined } from '@core/utils';
41 41 import { MatDialog } from '@angular/material/dialog';
... ... @@ -60,12 +60,13 @@ import {
60 60
61 61 export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor, OnInit, Validators {
62 62
  63 + private requiredValue: boolean;
  64 +
63 65 valuePrev = null as any;
64 66 observeAttrTelemetryFormGroup: FormGroup;
65 67 observe = OBSERVE as string;
66 68 attribute = ATTR as string;
67 69 telemetry = TELEMETRY as string;
68   - private requiredValue: boolean;
69 70
70 71 get required(): boolean {
71 72 return this.requiredValue;
... ... @@ -74,6 +75,7 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor,
74 75 @Input()
75 76 disabled: boolean;
76 77
  78 + // tslint:disable-next-line:adjacent-overload-signatures
77 79 @Input()
78 80 set required(value: boolean) {
79 81 const newVal = coerceBooleanProperty(value);
... ... @@ -86,7 +88,7 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor,
86 88 constructor(private store: Store<AppState>,
87 89 private fb: FormBuilder,
88 90 private dialog: MatDialog,
89   - private translate: TranslateService) {
  91 + public translate: TranslateService) {
90 92 this.observeAttrTelemetryFormGroup = this.fb.group({
91 93 clientLwM2M: this.fb.array([])
92 94 });
... ... @@ -100,19 +102,18 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor,
100 102 ngOnInit(): void {
101 103 }
102 104
103   - private propagateChange = (v: any) => {
104   - };
  105 + private propagateChange = (v: any) => { };
105 106
106 107
107 108 registerOnChange(fn: any): void {
108 109 this.propagateChange = fn;
109 110 }
110 111
111   - private propagateChangeState(value: any): void {
  112 + private propagateChangeState = (value: any): void => {
112 113 if (value) {
113 114 if (this.valuePrev === null) {
114   - this.valuePrev = "init";
115   - } else if (this.valuePrev === "init") {
  115 + this.valuePrev = 'init';
  116 + } else if (this.valuePrev === 'init') {
116 117 this.valuePrev = value;
117 118 } else if (JSON.stringify(value) !== JSON.stringify(this.valuePrev)) {
118 119 this.valuePrev = value;
... ... @@ -138,7 +139,7 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor,
138 139 }
139 140 }
140 141
141   - getDisabledState(): boolean {
  142 + getDisabledState = (): boolean => {
142 143 return this.disabled;
143 144 }
144 145
... ... @@ -146,13 +147,13 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor,
146 147 this.buildClientObjectsLwM2M(value.clientLwM2M);
147 148 }
148 149
149   - private buildClientObjectsLwM2M(objectsLwM2M: ObjectLwM2M []): void {
  150 + private buildClientObjectsLwM2M = (objectsLwM2M: ObjectLwM2M []): void => {
150 151 this.observeAttrTelemetryFormGroup.setControl('clientLwM2M',
151 152 this.createObjectsLwM2M(objectsLwM2M)
152 153 );
153 154 }
154 155
155   - createObjectsLwM2M(objectsLwM2MJson: ObjectLwM2M []): FormArray {
  156 + private createObjectsLwM2M = (objectsLwM2MJson: ObjectLwM2M []): FormArray => {
156 157 return this.fb.array(objectsLwM2MJson.map((objectLwM2M) => {
157 158 return this.fb.group({
158 159 id: objectLwM2M.id,
... ... @@ -160,62 +161,62 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor,
160 161 multiple: objectLwM2M.multiple,
161 162 mandatory: objectLwM2M.mandatory,
162 163 instances: this.createInstanceLwM2M(objectLwM2M.instances)
163   - })
164   - }))
  164 + });
  165 + }));
165 166 }
166 167
167   - createInstanceLwM2M(instanceLwM2MJson: Instance []): FormArray {
168   - return this.fb.array(instanceLwM2MJson.map((instanceLwM2M, index) => {
  168 + private createInstanceLwM2M = (instanceLwM2MJson: Instance []): FormArray => {
  169 + return this.fb.array(instanceLwM2MJson.map((instanceLwM2M) => {
169 170 return this.fb.group({
170 171 id: instanceLwM2M.id,
171 172 [this.observe]: {value: false, disabled: this.disabled},
172 173 [this.attribute]: {value: false, disabled: this.disabled},
173 174 [this.telemetry]: {value: false, disabled: this.disabled},
174 175 resources: {value: instanceLwM2M.resources, disabled: this.disabled}
175   - })
176   - }))
  176 + });
  177 + }));
177 178 }
178 179
179   - clientLwM2MFormArray(formGroup: FormGroup): FormArray {
  180 + clientLwM2MFormArray = (formGroup: FormGroup): FormArray => {
180 181 return formGroup.get('clientLwM2M') as FormArray;
181 182 }
182 183
183   - instancesLwm2mFormArray(objectLwM2M: AbstractControl): FormArray {
  184 + instancesLwm2mFormArray = (objectLwM2M: AbstractControl): FormArray => {
184 185 return objectLwM2M.get('instances') as FormArray;
185 186 }
186 187
187   - changeInstanceResourcesCheckBox(value: boolean, instance: AbstractControl, type: string): void {
188   - let resources = instance.get('resources').value as ResourceLwM2M []
  188 + changeInstanceResourcesCheckBox = (value: boolean, instance: AbstractControl, type: string): void => {
  189 + const resources = instance.get('resources').value as ResourceLwM2M [];
189 190 resources.forEach(resource => resource[type] = value);
190 191 instance.get('resources').patchValue(resources);
191 192 this.propagateChange(this.observeAttrTelemetryFormGroup.value);
192 193 }
193 194
194   - updateValidators() {
  195 + private updateValidators = (): void => {
195 196 this.observeAttrTelemetryFormGroup.get('clientLwM2M').setValidators(this.required ? [Validators.required] : []);
196 197 this.observeAttrTelemetryFormGroup.get('clientLwM2M').updateValueAndValidity();
197 198 }
198 199
199   - trackByParams(index: number): number {
  200 + trackByParams = (index: number): number => {
200 201 return index;
201 202 }
202 203
203   - getIndeterminate(instance: AbstractControl, type: string) {
  204 + getIndeterminate = (instance: AbstractControl, type: string): boolean => {
204 205 const resources = instance.get('resources').value as ResourceLwM2M [];
205 206 if (isNotNullOrUndefined(resources)) {
206 207 const isType = (element) => element[type] === true;
207   - let checkedResource = resources.filter(isType);
208   - if (checkedResource.length === 0) return false;
  208 + const checkedResource = resources.filter(isType);
  209 + if (checkedResource.length === 0) { return false; }
209 210 else if (checkedResource.length === resources.length) {
210 211 instance.patchValue({[type]: true});
211 212 return false;
212   - } else return true;
  213 + } else { return true; }
213 214 }
214 215 return false;
215 216 }
216 217
217 218
218   - getChecked(instance: AbstractControl, type: string) {
  219 + getChecked = (instance: AbstractControl, type: string): boolean => {
219 220 const resources = instance.get('resources').value as ResourceLwM2M [];
220 221 if (isNotNullOrUndefined(resources)) {
221 222 return resources.some(resource => resource[type]);
... ... @@ -223,7 +224,7 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor,
223 224 return false;
224 225 }
225 226
226   - getExpended(objectLwM2M: AbstractControl) {
  227 + getExpended = (objectLwM2M: AbstractControl): boolean => {
227 228 return this.instancesLwm2mFormArray(objectLwM2M).length === 1;
228 229 }
229 230
... ... @@ -233,22 +234,24 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor,
233 234 * 2) Field in object: <Mandatory> == Mandatory/Optional
234 235 * If this field is “Multiple” then the number of Object Instance can be from 0 to many (Object Instance ID MAX_ID=65535).
235 236 * If this field is “Single” then the number of Object Instance can be from 0 to 1. (max count == 1)
236   - * If the Object field “Mandatory” is “Mandatory” and the Object field “Instances” is “Single” then, the number of Object Instance MUST be 1.
237   - * 1. <MultipleInstances> == Multiple (true), <Mandatory> == Optional (false) => Object Instance ID MIN_ID=0 MAX_ID=65535 (может ни одного не быть)
238   - * 2. <MultipleInstances> == Multiple (true), <Mandatory> == Mandatory (true) => Object Instance ID MIN_ID=0 MAX_ID=65535 (min один обязательный)
239   - * 3. <MultipleInstances> == Single (false), <Mandatory> == Optional (false) => Object Instance ID cnt_max = 1 cnt_min = 0 (может ни одного не быть)
240   - * 4. <MultipleInstances> == Single (false), <Mandatory> == Mandatory (true) => Object Instance ID cnt_max = cnt_min = 1 (всегда есть один)
241   - * @param $event
242   - * @param objectId
243   - * @param objectName
  237 + * If the Object field “Mandatory” is “Mandatory” and the Object field “Instances” is “Single” then -
  238 + * the number of Object Instance MUST be 1.
  239 + * 1. <MultipleInstances> == Multiple (true), <Mandatory> == Optional (false) -
  240 + * Object Instance ID MIN_ID=0 MAX_ID=65535 (может ни одного не быть)
  241 + * 2. <MultipleInstances> == Multiple (true), <Mandatory> == Mandatory (true) -
  242 + * Object Instance ID MIN_ID=0 MAX_ID=65535 (min один обязательный)
  243 + * 3. <MultipleInstances> == Single (false), <Mandatory> == Optional (false) -
  244 + * Object Instance ID cnt_max = 1 cnt_min = 0 (может ни одного не быть)
  245 + * 4. <MultipleInstances> == Single (false), <Mandatory> == Mandatory (true) -
  246 + * Object Instance ID cnt_max = cnt_min = 1 (всегда есть один)
244 247 */
245 248
246   - addInstances($event: Event, object: ObjectLwM2M): void {
  249 + addInstances = ($event: Event, object: ObjectLwM2M): void => {
247 250 if ($event) {
248 251 $event.stopPropagation();
249 252 $event.preventDefault();
250 253 }
251   - let instancesIds = new Set<number>();
  254 + const instancesIds = new Set<number>();
252 255 object.instances.forEach(inst => {
253 256 instancesIds.add(inst.id);
254 257 });
... ... @@ -269,21 +272,22 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor,
269 272 );
270 273 }
271 274
272   - updateInstancesIds(data: Lwm2mObjectAddInstancesData) {
273   - let valueNew = new Set<number>();
274   - let valueOld = new Set<number>();
  275 + private updateInstancesIds = (data: Lwm2mObjectAddInstancesData): void => {
  276 + const valueNew = new Set<number>();
  277 + const valueOld = new Set<number>();
275 278 data.instancesIds.forEach(value => {
276 279 valueNew.add(value);
277   - })
278   - let oldInstances = (this.observeAttrTelemetryFormGroup.get('clientLwM2M').value as ObjectLwM2M []).find(e => e.id == data.objectId).instances;
  280 + });
  281 + const oldInstances = (this.observeAttrTelemetryFormGroup.get('clientLwM2M').value as ObjectLwM2M []).
  282 + find(e => e.id === data.objectId).instances;
279 283 oldInstances.forEach(inst => {
280 284 valueOld.add(inst.id);
281 285 });
282   - if (JSON.stringify(Array.from(valueOld)) != JSON.stringify(Array.from(valueNew))) {
283   - let idsDel = this.diffBetweenSet(valueNew, this.deepCloneSet(valueOld));
284   - let idsAdd = this.diffBetweenSet(valueOld, this.deepCloneSet(valueNew));
  286 + if (JSON.stringify(Array.from(valueOld)) !== JSON.stringify(Array.from(valueNew))) {
  287 + const idsDel = this.diffBetweenSet(valueNew, this.deepCloneSet(valueOld));
  288 + const idsAdd = this.diffBetweenSet(valueOld, this.deepCloneSet(valueNew));
285 289 if (idsAdd.size) {
286   - this.addInstancesNew(data.objectId, idsAdd)
  290 + this.addInstancesNew(data.objectId, idsAdd);
287 291 }
288 292 if (idsDel.size) {
289 293 this.delInstances(data.objectId, idsDel);
... ... @@ -291,22 +295,25 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor,
291 295 }
292 296 }
293 297
294   - delInstances(objectId: number, idsDel: Set<number>): void {
295   - let isIdIndex = (element) => element.id == objectId;
296   - let objectIndex = (this.observeAttrTelemetryFormGroup.get('clientLwM2M').value as ObjectLwM2M []).findIndex(isIdIndex);
  298 + private delInstances = (objectId: number, idsDel: Set<number>): void => {
  299 + let isIdIndex = (element) => element.id === objectId;
  300 + const objectIndex = (this.observeAttrTelemetryFormGroup.get('clientLwM2M').value as ObjectLwM2M []).findIndex(isIdIndex);
297 301 idsDel.forEach(x => {
298   - isIdIndex = (element) => element.value.id == x;
299   - let instancesFormArray = ((this.observeAttrTelemetryFormGroup.get('clientLwM2M') as FormArray).controls[objectIndex].get("instances") as FormArray);
300   - let instanceIndex = instancesFormArray.controls.findIndex(isIdIndex);
  302 + isIdIndex = (element) => element.value.id === x;
  303 + const instancesFormArray = ((this.observeAttrTelemetryFormGroup.get('clientLwM2M') as FormArray)
  304 + .controls[objectIndex].get('instances') as FormArray);
  305 + const instanceIndex = instancesFormArray.controls.findIndex(isIdIndex);
301 306 instancesFormArray.removeAt(instanceIndex);
302   - })
  307 + });
303 308 }
304 309
305   - addInstancesNew(objectId: number, idsAdd: Set<number>): void {
306   - let instancesValue = (this.observeAttrTelemetryFormGroup.get('clientLwM2M').value as ObjectLwM2M []).find(e => e.id == objectId).instances;
307   - let instancesFormArray = ((this.observeAttrTelemetryFormGroup.get('clientLwM2M') as FormArray).controls.find(e => e.value.id == objectId).get("instances") as FormArray) as FormArray;
  310 + private addInstancesNew = (objectId: number, idsAdd: Set<number>): void => {
  311 + const instancesValue = (this.observeAttrTelemetryFormGroup.get('clientLwM2M').value as ObjectLwM2M [])
  312 + .find(e => e.id === objectId).instances;
  313 + const instancesFormArray = ((this.observeAttrTelemetryFormGroup.get('clientLwM2M') as FormArray).controls
  314 + .find(e => e.value.id === objectId).get('instances') as FormArray) as FormArray;
308 315 idsAdd.forEach(x => {
309   - let instanceNew = deepClone(instancesValue[0]) as Instance;
  316 + const instanceNew = deepClone(instancesValue[0]) as Instance;
310 317 instanceNew.id = x;
311 318 instanceNew.resources.forEach(r => {
312 319 r.attribute = false;
... ... @@ -321,26 +328,26 @@ export class Lwm2mObserveAttrTelemetryComponent implements ControlValueAccessor,
321 328 resources: {value: instanceNew.resources, disabled: this.disabled}
322 329 }));
323 330 });
324   - (instancesFormArray.controls as FormGroup[]).sort((a,b) => a.value.id - b.value.id);
  331 + (instancesFormArray.controls as FormGroup[]).sort((a, b) => a.value.id - b.value.id);
325 332 }
326 333
327   - deepCloneSet(oldSet: Set<any>): Set<any> {
328   - let newSet = new Set<number>();
  334 + private deepCloneSet = (oldSet: Set<any>): Set<any> => {
  335 + const newSet = new Set<number>();
329 336 oldSet.forEach(p => {
330 337 newSet.add(p);
331   - })
  338 + });
332 339 return newSet;
333 340 }
334 341
335   - diffBetweenSet(firstSet: Set<any>, secondSet: Set<any>): Set<any> {
  342 + private diffBetweenSet = (firstSet: Set<any>, secondSet: Set<any>): Set<any> => {
336 343 firstSet.forEach(p => {
337 344 secondSet.delete(p);
338   - })
339   - return secondSet
  345 + });
  346 + return secondSet;
340 347 }
341 348
342   - setInstancesIds(instances: Instance []): Set<number> {
343   - let instancesIds = new Set<number>();
  349 + private setInstancesIds = (instances: Instance []): Set<number> => {
  350 + const instancesIds = new Set<number>();
344 351 if (instances && instances.length) {
345 352 instances.forEach(inst => {
346 353 instancesIds.add(inst.id);
... ...
... ... @@ -14,8 +14,6 @@
14 14 /// limitations under the License.
15 15 ///
16 16
17   -import { AbstractControl, ValidationErrors } from '@angular/forms';
18   -
19 17 export const OBSERVE_ATTR = 'observeAttr';
20 18 export const OBSERVE = 'observe';
21 19 export const ATTR = 'attribute';
... ... @@ -23,33 +21,29 @@ export const TELEMETRY = 'telemetry';
23 21 export const KEY_NAME = 'keyName';
24 22 export const DEFAULT_ID_SERVER = 123;
25 23 export const DEFAULT_ID_BOOTSTRAP = 111;
26   -export const DEFAULT_HOST_NAME = "localhost";
  24 +export const DEFAULT_HOST_NAME = 'localhost';
27 25 export const DEFAULT_PORT_SERVER_NO_SEC = 5685;
28 26 export const DEFAULT_PORT_BOOTSTRAP_NO_SEC = 5691;
29 27 export const DEFAULT_CLIENT_HOLD_OFF_TIME = 1;
30 28 export const DEFAULT_LIFE_TIME = 300;
31   -export const DEFAULT_DEFAULT_MIN_PERIOD = 1;
  29 +export const DEFAULT_MIN_PERIOD = 1;
32 30 export const DEFAULT_NOTIF_IF_DESIBLED = true;
33   -export const DEFAULT_BINDING = "U";
  31 +export const DEFAULT_BINDING = 'U';
34 32 export const DEFAULT_BOOTSTRAP_SERVER_ACCOUNT_TIME_OUT = 0;
35   -export const LEN_MAX_PUBLIC_KEY_PSK = 182;
36   -export const LEN_MAX_PUBLIC_KEY_RPK_X509 = 3000;
37   -export const KEY_IDENT_REGEXP_PSK = /^[0-9a-fA-F]{64,64}$/;
38   -export const KEY_PRIVATE_REGEXP = /^[0-9a-fA-F]{134,134}$/;
39   -export const KEY_PUBLIC_REGEXP_PSK = /^[0-9a-fA-F]{182,182}$/;
40   -export const KEY_PUBLIC_REGEXP_X509 = /^[0-9a-fA-F]{0,3000}$/;
  33 +export const LEN_MAX_PUBLIC_KEY_RPK = 182;
  34 +export const LEN_MAX_PUBLIC_KEY_X509 = 3000;
  35 +export const KEY_REGEXP_HEX_DEC = /^[-+]?[0-9A-Fa-f]+\.?[0-9A-Fa-f]*?$/;
41 36 export const CAMEL_CASE_REGEXP = /[-_&@.,*+!?^${}()|[\]\\]/g;
42 37 export const INSTANCES_ID_VALUE_MIN = 0;
43 38 export const INSTANCES_ID_VALUE_MAX = 65535;
44 39
45   -//ok
46 40 export enum SECURITY_CONFIG_MODE {
47 41 PSK = 'PSK',
48 42 RPK = 'RPK',
49 43 X509 = 'X509',
50 44 NO_SEC = 'NO_SEC'
51 45 }
52   -//ok
  46 +
53 47 export const SECURITY_CONFIG_MODE_NAMES = new Map<SECURITY_CONFIG_MODE, string>(
54 48 [
55 49 [SECURITY_CONFIG_MODE.PSK, 'Pre-Shared Key'],
... ... @@ -58,59 +52,54 @@ export const SECURITY_CONFIG_MODE_NAMES = new Map<SECURITY_CONFIG_MODE, string>(
58 52 [SECURITY_CONFIG_MODE.NO_SEC, 'No Security'],
59 53 ]
60 54 );
61   -//ok
  55 +
62 56 export interface BootstrapServersSecurityConfig {
63   - shortId: number,
64   - lifetime: number,
65   - defaultMinPeriod: number,
66   - notifIfDisabled: boolean,
67   - binding: string
  57 + shortId: number;
  58 + lifetime: number;
  59 + defaultMinPeriod: number;
  60 + notifIfDisabled: boolean;
  61 + binding: string;
68 62 }
69 63
70   -//ok
71 64 export interface ServerSecurityConfig {
72   - host?: string,
73   - port?: number,
74   - bootstrapServerIs?: boolean,
75   - securityMode: string,
76   - clientPublicKeyOrId?: string,
77   - clientSecretKey?: string,
  65 + host?: string;
  66 + port?: number;
  67 + bootstrapServerIs?: boolean;
  68 + securityMode: string;
  69 + clientPublicKeyOrId?: string;
  70 + clientSecretKey?: string;
78 71 serverPublicKey?: string;
79   - clientHoldOffTime?: number,
80   - serverId?: number,
81   - bootstrapServerAccountTimeout: number
  72 + clientHoldOffTime?: number;
  73 + serverId?: number;
  74 + bootstrapServerAccountTimeout: number;
82 75 }
83 76
84   -//ok
85 77 interface BootstrapSecurityConfig {
86   - servers: BootstrapServersSecurityConfig,
87   - bootstrapServer: ServerSecurityConfig,
88   - lwm2mServer: ServerSecurityConfig
  78 + servers: BootstrapServersSecurityConfig;
  79 + bootstrapServer: ServerSecurityConfig;
  80 + lwm2mServer: ServerSecurityConfig;
89 81 }
90 82
91   -//ok
92 83 export interface ProfileConfigModels {
93   - bootstrap: BootstrapSecurityConfig,
  84 + bootstrap: BootstrapSecurityConfig;
94 85 observeAttr: {
95 86 observe: string [],
96 87 attribute: string [],
97 88 telemetry: string [],
98 89 keyName: []
99   - }
  90 + };
100 91 }
101 92
102   -//ok
103 93 export function getDefaultBootstrapServersSecurityConfig(): BootstrapServersSecurityConfig {
104 94 return {
105 95 shortId: DEFAULT_ID_SERVER,
106 96 lifetime: DEFAULT_LIFE_TIME,
107   - defaultMinPeriod: DEFAULT_DEFAULT_MIN_PERIOD,
  97 + defaultMinPeriod: DEFAULT_MIN_PERIOD,
108 98 notifIfDisabled: DEFAULT_NOTIF_IF_DESIBLED,
109 99 binding: DEFAULT_BINDING
110   - }
  100 + };
111 101 }
112 102
113   -//ok
114 103 export function getDefaultBootstrapServerSecurityConfig(hostname: any): ServerSecurityConfig {
115 104 return {
116 105 host: hostname,
... ... @@ -121,9 +110,9 @@ export function getDefaultBootstrapServerSecurityConfig(hostname: any): ServerSe
121 110 clientHoldOffTime: DEFAULT_CLIENT_HOLD_OFF_TIME,
122 111 serverId: DEFAULT_ID_BOOTSTRAP,
123 112 bootstrapServerAccountTimeout: DEFAULT_BOOTSTRAP_SERVER_ACCOUNT_TIME_OUT
124   - }
  113 + };
125 114 }
126   -//ok
  115 +
127 116 export function getDefaultLwM2MServerSecurityConfig(hostname): ServerSecurityConfig {
128 117 const DefaultLwM2MServerSecurityConfig = getDefaultBootstrapServerSecurityConfig(hostname);
129 118 DefaultLwM2MServerSecurityConfig.bootstrapServerIs = false;
... ... @@ -132,19 +121,17 @@ export function getDefaultLwM2MServerSecurityConfig(hostname): ServerSecurityCon
132 121 return DefaultLwM2MServerSecurityConfig;
133 122 }
134 123
135   -//ok
136 124 function getDefaultProfileBootstrapSecurityConfig(hostname: any): BootstrapSecurityConfig {
137 125 return {
138 126 servers: getDefaultBootstrapServersSecurityConfig(),
139 127 bootstrapServer: getDefaultBootstrapServerSecurityConfig(hostname),
140 128 lwm2mServer: getDefaultLwM2MServerSecurityConfig(hostname)
141   - }
  129 + };
142 130 }
143 131
144   -//ok
145 132 export function getDefaultProfileConfig(hostname?: any): ProfileConfigModels {
146 133 return {
147   - bootstrap: getDefaultProfileBootstrapSecurityConfig((hostname)? hostname : DEFAULT_HOST_NAME),
  134 + bootstrap: getDefaultProfileBootstrapSecurityConfig((hostname) ? hostname : DEFAULT_HOST_NAME),
148 135 observeAttr: {
149 136 observe: [],
150 137 attribute: [],
... ... @@ -154,19 +141,18 @@ export function getDefaultProfileConfig(hostname?: any): ProfileConfigModels {
154 141 };
155 142 }
156 143
157   -//ok
158 144 export interface ResourceLwM2M {
159   - id: number,
160   - name: string,
161   - observe: boolean,
162   - attribute: boolean,
163   - telemetry: boolean,
164   - keyName: string
  145 + id: number;
  146 + name: string;
  147 + observe: boolean;
  148 + attribute: boolean;
  149 + telemetry: boolean;
  150 + keyName: string;
165 151 }
166   -//ok
  152 +
167 153 export interface Instance {
168   - id: number,
169   - resources: ResourceLwM2M[]
  154 + id: number;
  155 + resources: ResourceLwM2M[];
170 156 }
171 157
172 158 /**
... ... @@ -176,10 +162,10 @@ export interface Instance {
176 162 * mandatory == false => Optional
177 163 */
178 164 export interface ObjectLwM2M {
179   - id: number,
180   - name: string,
181   - multiple?: boolean,
182   - mandatory?: boolean,
183   - instances?: Instance []
  165 + id: number;
  166 + name: string;
  167 + multiple?: boolean;
  168 + mandatory?: boolean;
  169 + instances?: Instance [];
184 170 }
185 171
... ...
... ... @@ -25,8 +25,7 @@ import { HomeDialogsModule } from '../../dialogs/home-dialogs.module';
25 25 import { HomeComponentsModule } from '@modules/home/components/home-components.module';
26 26 import { DeviceTabsComponent } from '@home/pages/device/device-tabs.component';
27 27 import { SecurityConfigComponent } from '@home/pages/device/lwm2m/security-config.component';
28   -// TODO: @nickAS21 move to device profile
29   -import {SecurityConfigServerComponent} from "@home/pages/device/lwm2m/security-config-server.component";
  28 +import { SecurityConfigServerComponent } from '@home/pages/device/lwm2m/security-config-server.component';
30 29 import { DefaultDeviceConfigurationComponent } from './data/default-device-configuration.component';
31 30 import { DeviceConfigurationComponent } from './data/device-configuration.component';
32 31 import { DeviceDataComponent } from './data/device-data.component';
... ...
... ... @@ -24,7 +24,7 @@
24 24 <mat-select formControlName="securityMode"
25 25 (ngModelChange)="securityModeChanged($event)">
26 26 <mat-option *ngFor="let securityMode of securityConfigLwM2MTypes"
27   - [value]="securityMode" >
  27 + [value]="securityMode">
28 28 {{ credentialTypeLwM2MNamesMap.get(securityConfigLwM2MType[securityMode]) }}
29 29 </mat-option>
30 30 </mat-select>
... ... @@ -35,43 +35,64 @@
35 35 <div [fxShow]="serverFormGroup.get('securityMode').value !== securityConfigLwM2MType.NO_SEC">
36 36 <mat-form-field class="mat-block">
37 37 <mat-label>{{ 'device.lwm2m-security-config.client-publicKey-or-id' | translate }}</mat-label>
38   - <textarea matInput type="text" rows="3" cols="1" formControlName="clientPublicKeyOrId" #clientPublicKeyOrId maxlength={{lenMaxClientPublicKeyOrId}}
39   - [required]="serverFormGroup.get('securityMode').value !== securityConfigLwM2MType.NO_SEC"></textarea>
  38 + <textarea matInput
  39 + #clientPublicKeyOrId
  40 + maxlength={{lenMaxClientPublicKeyOrId}}
  41 + cdkTextareaAutosize
  42 + cdkAutosizeMinRows="1"
  43 + style="overflow:hidden"
  44 + cols="1"
  45 + formControlName="clientPublicKeyOrId"
  46 + [required]="serverFormGroup.get('securityMode').value !== securityConfigLwM2MType.NO_SEC">
  47 + </textarea>
40 48 <mat-hint align="end">{{clientPublicKeyOrId.value?.length || 0}}/{{lenMaxClientPublicKeyOrId}}</mat-hint>
41 49 <mat-error *ngIf="serverFormGroup.get('clientPublicKeyOrId').hasError('required')">
42 50 {{ 'device.lwm2m-security-config.client-publicKey-or-id' | translate }}
43 51 <strong>{{ 'device.lwm2m-security-config.required' | translate }}</strong>
44 52 </mat-error>
45   - <mat-error *ngIf="serverFormGroup.get('clientPublicKeyOrId').hasError('pattern') &&
46   - serverFormGroup.get('securityMode').value === securityConfigLwM2MType.RPK">
  53 + <mat-error *ngIf="serverFormGroup.get('clientPublicKeyOrId').hasError('pattern')">
47 54 {{ 'device.lwm2m-security-config.client-key' | translate }}
48   - <strong>{{ 'device.lwm2m-security-config.pattern_hex_dec_182' | translate }}</strong>
  55 + <strong>{{ translate.get('device.lwm2m-security-config.pattern_hex_dec', {
  56 + count: 0
  57 + }) | async }}</strong>
49 58 </mat-error>
50   - <mat-error *ngIf="serverFormGroup.get('clientPublicKeyOrId').hasError('pattern') &&
51   - serverFormGroup.get('securityMode').value === securityConfigLwM2MType.X509">
  59 + <mat-error *ngIf="(serverFormGroup.get('clientPublicKeyOrId').hasError('maxlength') ||
  60 + serverFormGroup.get('clientPublicKeyOrId').hasError('minlength'))">
52 61 {{ 'device.lwm2m-security-config.client-key' | translate }}
53   - <strong>{{ 'device.lwm2m-security-config.pattern_hex_dec' | translate }}</strong>
  62 + <strong>{{ translate.get('device.lwm2m-security-config.pattern_hex_dec', {
  63 + count: lenMaxClientPublicKeyOrId
  64 + }) | async }}</strong>
54 65 </mat-error>
55 66 </mat-form-field>
56 67 <mat-form-field class="mat-block">
57 68 <mat-label>{{ 'device.lwm2m-security-config.client-secret-key' | translate }}</mat-label>
58   - <textarea matInput type="text" rows="2" cols="1" formControlName="clientSecretKey" #clientSecretKey maxlength={{lenMaxClientSecretKey}}
59   - [required]="serverFormGroup.get('securityMode').value !== securityConfigLwM2MType.NO_SEC"></textarea>
  69 + <textarea matInput
  70 + #clientSecretKey
  71 + maxlength={{lenMaxClientSecretKey}}
  72 + cdkTextareaAutosize
  73 + cdkAutosizeMinRows="1"
  74 + style="overflow:hidden"
  75 + cols="1"
  76 + formControlName="clientSecretKey"
  77 + [required]="serverFormGroup.get('securityMode').value !== securityConfigLwM2MType.NO_SEC">
  78 + </textarea>
60 79 <mat-hint align="end">{{clientSecretKey.value?.length || 0}}/{{lenMaxClientSecretKey}}</mat-hint>
61 80 <mat-error *ngIf="serverFormGroup.get('clientSecretKey').hasError('required')">
62 81 {{ 'device.lwm2m-security-config.client-secret-key' | translate }}
63 82 <strong>{{ 'device.lwm2m-security-config.required' | translate }}</strong>
64 83 </mat-error>
65   - <mat-error *ngIf="serverFormGroup.get('clientSecretKey').hasError('pattern') &&
66   - (serverFormGroup.get('securityMode').value === securityConfigLwM2MType.RPK ||
67   - serverFormGroup.get('securityMode').value === securityConfigLwM2MType.X509)">
  84 + <mat-error *ngIf="serverFormGroup.get('clientSecretKey').hasError('pattern')">
68 85 {{ 'device.lwm2m-security-config.client-key' | translate }}
69   - <strong>{{ 'device.lwm2m-security-config.pattern_hex_dec_134' | translate }}</strong>
  86 + <strong>{{ translate.get('device.lwm2m-security-config.pattern_hex_dec', {
  87 + count: 0
  88 + }) | async }}</strong>
70 89 </mat-error>
71   - <mat-error *ngIf="serverFormGroup.get('clientSecretKey').hasError('pattern') &&
72   - (serverFormGroup.get('securityMode').value === securityConfigLwM2MType.PSK)">
  90 + <mat-error *ngIf="(serverFormGroup.get('clientSecretKey').hasError('maxlength') ||
  91 + serverFormGroup.get('clientSecretKey').hasError('minlength'))">
73 92 {{ 'device.lwm2m-security-config.client-key' | translate }}
74   - <strong>{{ 'device-profile.lwm2m.pattern_hex_dec_64' | translate }}</strong>
  93 + <strong>{{ translate.get('device.lwm2m-security-config.pattern_hex_dec', {
  94 + count: lenMaxClientSecretKey
  95 + }) | async }}</strong>
75 96 </mat-error>
76 97 </mat-form-field>
77 98 </div>
... ...
... ... @@ -14,26 +14,25 @@
14 14 /// limitations under the License.
15 15 ///
16 16
17   -import {Component, forwardRef, Inject, Input, OnInit, ViewChild} from "@angular/core";
  17 +import { Component, forwardRef, Inject, Input, OnInit } from '@angular/core';
18 18
19 19 import {
20 20 ControlValueAccessor,
21 21 FormBuilder, FormGroup, NG_VALUE_ACCESSOR, Validators
22   -} from "@angular/forms";
  22 +} from '@angular/forms';
23 23 import {
24 24 SECURITY_CONFIG_MODE,
25 25 SECURITY_CONFIG_MODE_NAMES,
26   - KEY_IDENT_REGEXP_PSK,
  26 + KEY_REGEXP_HEX_DEC,
27 27 ServerSecurityConfig,
28 28 DeviceCredentialsDialogLwm2mData,
29 29 LEN_MAX_PSK,
30   - LEN_MAX_PRIVATE_KEY, LEN_MAX_PUBLIC_KEY_RPK, KEY_PRIVATE_REGEXP, LEN_MAX_PUBLIC_KEY_X509, KEY_PUBLIC_REGEXP_X509
31   -} from "@home/pages/device/lwm2m/security-config.models";
32   -import {Store} from "@ngrx/store";
33   -import {AppState} from "@core/core.state";
34   -import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog";
35   -import {PageComponent} from "@shared/components/page.component";
36   -import {MatPaginator} from "@angular/material/paginator";
  30 + LEN_MAX_PRIVATE_KEY, LEN_MAX_PUBLIC_KEY_RPK, LEN_MAX_PUBLIC_KEY_X509
  31 +} from '@home/pages/device/lwm2m/security-config.models';
  32 +import { Store } from '@ngrx/store';
  33 +import { AppState } from '@core/core.state';
  34 +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
  35 +import { PageComponent } from '@shared/components/page.component';
37 36 import { TranslateService } from '@ngx-translate/core';
38 37
39 38 @Component({
... ... @@ -54,13 +53,13 @@ export class SecurityConfigServerComponent extends PageComponent implements OnIn
54 53 securityConfigLwM2MType = SECURITY_CONFIG_MODE;
55 54 securityConfigLwM2MTypes = Object.keys(SECURITY_CONFIG_MODE);
56 55 credentialTypeLwM2MNamesMap = SECURITY_CONFIG_MODE_NAMES;
57   - lenMaxClientPublicKeyOrId = LEN_MAX_PSK;
  56 + lenMinClientPublicKeyOrId = 0;
  57 + lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_RPK;
  58 + lenMinClientSecretKey = LEN_MAX_PRIVATE_KEY;
58 59 lenMaxClientSecretKey = LEN_MAX_PRIVATE_KEY;
59 60
60 61 @Input() serverFormGroup: FormGroup;
61 62
62   - @ViewChild(MatPaginator) paginator: MatPaginator;
63   -
64 63 constructor(protected store: Store<AppState>,
65 64 @Inject(MAT_DIALOG_DATA) public data: DeviceCredentialsDialogLwm2mData,
66 65 public dialogRef: MatDialogRef<SecurityConfigServerComponent, object>,
... ... @@ -73,40 +72,59 @@ export class SecurityConfigServerComponent extends PageComponent implements OnIn
73 72 this.registerDisableOnLoadFormControl(this.serverFormGroup.get('securityMode'));
74 73 }
75 74
76   - updateValueFields(serverData: ServerSecurityConfig): void {
  75 + private updateValueFields(serverData: ServerSecurityConfig): void {
77 76 this.serverFormGroup.patchValue(serverData, {emitEvent: false});
78 77 const securityMode = this.serverFormGroup.get('securityMode').value as SECURITY_CONFIG_MODE;
79 78 this.updateValidate(securityMode);
80 79 }
81 80
82   - updateValidate(securityMode: SECURITY_CONFIG_MODE): void {
  81 + private updateValidate(securityMode: SECURITY_CONFIG_MODE): void {
83 82 switch (securityMode) {
84 83 case SECURITY_CONFIG_MODE.NO_SEC:
85 84 this.serverFormGroup.get('clientPublicKeyOrId').setValidators([]);
86 85 this.serverFormGroup.get('clientSecretKey').setValidators([]);
87 86 break;
88 87 case SECURITY_CONFIG_MODE.PSK:
  88 + this.lenMinClientPublicKeyOrId = 0;
89 89 this.lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_RPK;
  90 + this.lenMinClientSecretKey = LEN_MAX_PSK;
90 91 this.lenMaxClientSecretKey = LEN_MAX_PSK;
91   - this.serverFormGroup.get('clientPublicKeyOrId').setValidators([Validators.required]);
92   - this.serverFormGroup.get('clientSecretKey').setValidators([Validators.required, Validators.pattern(KEY_IDENT_REGEXP_PSK)]);
  92 + this.setValidatorsSecurity(securityMode);
93 93 break;
94 94 case SECURITY_CONFIG_MODE.RPK:
95   - this.lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_X509;
  95 + this.lenMinClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_RPK;
  96 + this.lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_RPK;
  97 + this.lenMinClientSecretKey = LEN_MAX_PRIVATE_KEY;
96 98 this.lenMaxClientSecretKey = LEN_MAX_PRIVATE_KEY;
97   - this.serverFormGroup.get('clientPublicKeyOrId').setValidators([Validators.required, Validators.pattern(KEY_PUBLIC_REGEXP_X509)]);
98   - this.serverFormGroup.get('clientSecretKey').setValidators([Validators.required, Validators.pattern(KEY_PRIVATE_REGEXP)]);
  99 + this.setValidatorsSecurity(securityMode);
99 100 break;
100 101 case SECURITY_CONFIG_MODE.X509:
  102 + this.lenMinClientPublicKeyOrId = 0;
101 103 this.lenMaxClientPublicKeyOrId = LEN_MAX_PUBLIC_KEY_X509;
  104 + this.lenMinClientSecretKey = LEN_MAX_PRIVATE_KEY;
102 105 this.lenMaxClientSecretKey = LEN_MAX_PRIVATE_KEY;
103   - this.serverFormGroup.get('clientPublicKeyOrId').setValidators([Validators.required, Validators.pattern(KEY_PUBLIC_REGEXP_X509)]);
104   - this.serverFormGroup.get('clientSecretKey').setValidators([Validators.required, Validators.pattern(KEY_PRIVATE_REGEXP)]);
  106 + this.setValidatorsSecurity(securityMode);
105 107 break;
106 108 }
107 109 this.serverFormGroup.updateValueAndValidity();
108 110 }
109 111
  112 + private setValidatorsSecurity = (securityMode: SECURITY_CONFIG_MODE): void => {
  113 + if (securityMode === SECURITY_CONFIG_MODE.PSK) {
  114 + this.serverFormGroup.get('clientPublicKeyOrId').setValidators([Validators.required]);
  115 + } else {
  116 + this.serverFormGroup.get('clientPublicKeyOrId').setValidators([Validators.required,
  117 + Validators.pattern(KEY_REGEXP_HEX_DEC),
  118 + Validators.minLength(this.lenMinClientPublicKeyOrId),
  119 + Validators.maxLength(this.lenMaxClientPublicKeyOrId)]);
  120 + }
  121 +
  122 + this.serverFormGroup.get('clientSecretKey').setValidators([Validators.required,
  123 + Validators.pattern(KEY_REGEXP_HEX_DEC),
  124 + Validators.minLength(this.lenMinClientSecretKey),
  125 + Validators.maxLength(this.lenMaxClientSecretKey)]);
  126 + }
  127 +
110 128 securityModeChanged(securityMode: SECURITY_CONFIG_MODE): void {
111 129 this.updateValidate(securityMode);
112 130 }
... ...
... ... @@ -35,110 +35,124 @@
35 35 <strong>{{ 'device.lwm2m-security-config.required' | translate }}</strong>
36 36 </mat-error>
37 37 </mat-form-field>
38   - <mat-tab-group dynamicHeight #tabGroup (selectedTabChange)="tabChanged($event)">
  38 + <mat-tab-group dynamicHeight (selectedTabChange)="tabChanged($event)">
39 39 <mat-tab label="{{ 'device.lwm2m-security-config.client-tab' | translate }}">
40   - <div class="mat-padding">
41   - <mat-form-field class="mat-block">
42   - <mat-label translate>device.lwm2m-security-config.mode</mat-label>
43   - <mat-select formControlName="securityConfigClientMode"
44   - (ngModelChange)="securityConfigClientModeChanged($event)">
45   - <mat-option *ngFor="let securityConfigClientMode of securityConfigLwM2MTypes"
46   - [value]="securityConfigClientMode">
47   - {{ credentialTypeLwM2MNamesMap.get(securityConfigLwM2MType[securityConfigClientMode]) }}
48   - </mat-option>
49   - </mat-select>
50   - </mat-form-field>
51   - <div [fxShow]="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK">
  40 + <ng-template matTabContent>
  41 + <div class="mat-padding">
52 42 <mat-form-field class="mat-block">
53   - <mat-label>{{ 'device.lwm2m-security-config.identity' | translate }}</mat-label>
54   - <input matInput type="text" formControlName="identityPSK"
55   - [required]="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK">
56   - <mat-error *ngIf="lwm2mConfigFormGroup.get('identityPSK').hasError('required')">
57   - {{ 'device.lwm2m-security-config.identity' | translate }}
58   - <strong>{{ 'device.lwm2m-security-config.required' | translate }}</strong>
59   - </mat-error>
  43 + <mat-label translate>device.lwm2m-security-config.mode</mat-label>
  44 + <mat-select formControlName="securityConfigClientMode"
  45 + (ngModelChange)="securityConfigClientModeChanged($event)">
  46 + <mat-option *ngFor="let securityConfigClientMode of securityConfigLwM2MTypes"
  47 + [value]="securityConfigClientMode">
  48 + {{ credentialTypeLwM2MNamesMap.get(securityConfigLwM2MType[securityConfigClientMode]) }}
  49 + </mat-option>
  50 + </mat-select>
60 51 </mat-form-field>
61   - </div>
62   - <div [fxShow]="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.RPK ||
  52 + <div *ngIf="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK">
  53 + <mat-form-field class="mat-block">
  54 + <mat-label>{{ 'device.lwm2m-security-config.identity' | translate }}</mat-label>
  55 + <input matInput type="text" formControlName="identityPSK"
  56 + [required]="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK">
  57 + <mat-error *ngIf="lwm2mConfigFormGroup.get('identityPSK').hasError('required')">
  58 + {{ 'device.lwm2m-security-config.identity' | translate }}
  59 + <strong>{{ 'device.lwm2m-security-config.required' | translate }}</strong>
  60 + </mat-error>
  61 + </mat-form-field>
  62 + </div>
  63 + <div *ngIf="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.RPK ||
63 64 lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK">
64   - <mat-form-field class="mat-block">
65   - <mat-label>{{ 'device.lwm2m-security-config.client-key' | translate }}</mat-label>
66   - <textarea matInput #clientKey maxlength={{lenMinMaxClient}} type="text" rows="3" cols="1"
67   - formControlName="clientKey"
68   - [required]="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.RPK ||
69   - lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK"></textarea>
70   - <mat-hint align="end">{{clientKey.value?.length || 0}}/{{lenMaxKeyClient}}</mat-hint>
71   - <mat-error *ngIf="lwm2mConfigFormGroup.get('clientKey').hasError('required')">
72   - {{ 'device.lwm2m-security-config.client-key' | translate }}
73   - <strong>{{ 'device.lwm2m-security-config.required' | translate }}</strong>
74   - </mat-error>
75   - <mat-error *ngIf="lwm2mConfigFormGroup.get('clientKey').hasError('pattern') &&
76   - lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK">
77   - {{ 'device.lwm2m-security-config.client-key' | translate }}
78   - <strong>{{ 'device-profile.lwm2m-security-config.pattern_hex_dec_64' | translate }}</strong>
79   - </mat-error>
80   - <mat-error *ngIf="lwm2mConfigFormGroup.get('clientKey').hasError('pattern') &&
81   - lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.RPK">
82   - {{ 'device.lwm2m-security-config.client-key' | translate }}
83   - <strong>{{ 'device.lwm2m-security-config.pattern_hex_dec_182' | translate }}</strong>
84   - </mat-error>
85   - </mat-form-field>
86   - </div>
87   - <div [fxShow]="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.X509">
88   - <mat-checkbox formControlName="clientCertificate" color="primary">
89   - {{ 'device.lwm2m-security-config.client-certificate' | translate }}
90   - </mat-checkbox>
  65 + <mat-form-field class="mat-block">
  66 + <mat-label>{{ 'device.lwm2m-security-config.client-key' | translate }}</mat-label>
  67 + <textarea matInput
  68 + #clientKey
  69 + maxlength="{{lenMaxKeyClient}}"
  70 + cdkTextareaAutosize
  71 + cdkAutosizeMinRows="1"
  72 + cols="1"
  73 + formControlName="clientKey"
  74 + style="overflow:hidden"
  75 + [required]="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.RPK ||
  76 + lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.PSK">
  77 + </textarea>
  78 + <mat-hint align="end">{{clientKey.value?.length || 0}}/{{lenMaxKeyClient}}</mat-hint>
  79 + <mat-error *ngIf="lwm2mConfigFormGroup.get('clientKey').hasError('required')">
  80 + {{ 'device.lwm2m-security-config.client-key' | translate }}
  81 + <strong>{{ 'device.lwm2m-security-config.required' | translate }}</strong>
  82 + </mat-error>
  83 + <mat-error *ngIf="lwm2mConfigFormGroup.get('clientKey').hasError('pattern')">
  84 + {{ 'device.lwm2m-security-config.client-key' | translate }}
  85 + <strong>{{ translate.get('device.lwm2m-security-config.pattern_hex_dec', {
  86 + count: 0 }) | async }}</strong>
  87 + </mat-error>
  88 + <mat-error *ngIf="(lwm2mConfigFormGroup.get('clientKey').hasError('maxlength') ||
  89 + lwm2mConfigFormGroup.get('clientKey').hasError('minlength'))">
  90 + {{ 'device.lwm2m-security-config.client-key' | translate }}
  91 + <strong>{{ translate.get('device.lwm2m-security-config.pattern_hex_dec', {
  92 + count: lenMaxKeyClient }) | async }}</strong>
  93 + </mat-error>
  94 + </mat-form-field>
  95 + </div>
  96 + <div *ngIf="lwm2mConfigFormGroup.get('securityConfigClientMode').value === securityConfigLwM2MType.X509">
  97 + <mat-checkbox formControlName="clientCertificate" color="primary">
  98 + {{ 'device.lwm2m-security-config.client-certificate' | translate }}
  99 + </mat-checkbox>
  100 + </div>
91 101 </div>
92   - </div>
  102 + </ng-template>
93 103 </mat-tab>
94 104 <mat-tab label="{{ 'device.lwm2m-security-config.bootstrap-tab' | translate }}">
95   - <div class="mat-padding">
96   - <mat-accordion multi="true" class="mat-body-1">
97   - <mat-expansion-panel>
98   - <mat-expansion-panel-header>
99   - <mat-panel-title>
100   - <div
101   - class="tb-panel-title">{{ 'device.lwm2m-security-config.bootstrap-server' | translate | uppercase }}</div>
102   - </mat-panel-title>
103   - </mat-expansion-panel-header>
104   - <div class="mat-padding">
105   - <tb-security-config-server-lwm2m
106   - [formControlName]="bootstrapServer"
107   - [serverFormGroup]="bootstrapFormGroup">
108   - </tb-security-config-server-lwm2m>
109   - </div>
110   - </mat-expansion-panel>
111   - </mat-accordion>
112   - <mat-accordion multi="true" class="mat-body-1">
113   - <mat-expansion-panel>
114   - <mat-expansion-panel-header>
115   - <mat-panel-title>
116   - <div
117   - class="tb-panel-title">{{ 'device.lwm2m-security-config.lwm2m-server' | translate | uppercase }}</div>
118   - </mat-panel-title>
119   - </mat-expansion-panel-header>
120   - <div class="mat-padding">
121   - <tb-security-config-server-lwm2m
122   - [formControlName]="lwm2mServer"
123   - [serverFormGroup]="lwm2mServerFormGroup">
124   - </tb-security-config-server-lwm2m>
125   - </div>
126   - </mat-expansion-panel>
127   - </mat-accordion>
128   - </div>
  105 + <ng-template matTabContent>
  106 + <div class="mat-padding">
  107 + <mat-accordion multi="true" class="mat-body-1">
  108 + <mat-expansion-panel>
  109 + <mat-expansion-panel-header>
  110 + <mat-panel-title>
  111 + <div
  112 + class="tb-panel-title">{{ 'device.lwm2m-security-config.bootstrap-server' | translate | uppercase }}</div>
  113 + </mat-panel-title>
  114 + </mat-expansion-panel-header>
  115 + <div class="mat-padding">
  116 + <tb-security-config-server-lwm2m
  117 + [formControlName]="bootstrapServer"
  118 + [serverFormGroup]="bootstrapFormGroup">
  119 + </tb-security-config-server-lwm2m>
  120 + </div>
  121 + </mat-expansion-panel>
  122 + </mat-accordion>
  123 + <mat-accordion multi="true" class="mat-body-1">
  124 + <mat-expansion-panel>
  125 + <mat-expansion-panel-header>
  126 + <mat-panel-title>
  127 + <div
  128 + class="tb-panel-title">{{ 'device.lwm2m-security-config.lwm2m-server' | translate | uppercase }}</div>
  129 + </mat-panel-title>
  130 + </mat-expansion-panel-header>
  131 + <div class="mat-padding">
  132 + <tb-security-config-server-lwm2m
  133 + [formControlName]="lwm2mServer"
  134 + [serverFormGroup]="lwm2mServerFormGroup">
  135 + </tb-security-config-server-lwm2m>
  136 + </div>
  137 + </mat-expansion-panel>
  138 + </mat-accordion>
  139 + </div>
  140 + </ng-template>
129 141 </mat-tab>
130 142 <mat-tab label="{{ 'device.lwm2m-security-config.config-json-tab' | translate }}">
131   - <div class="mat-padding">
132   - <fieldset [disabled]="isLoading$ | async">
133   - <tb-json-object-edit
134   - [formControlName]="formControlNameJsonAllConfig"
135   - label="{{ 'device.lwm2m-value' | translate }}"
136   - validateContent="true"
137   - [required]="true"
138   - [fillHeight]="false">
139   - </tb-json-object-edit>
140   - </fieldset>
141   - </div>
  143 + <ng-template matTabContent>
  144 + <div class="mat-padding">
  145 + <fieldset [disabled]="isLoading$ | async">
  146 + <tb-json-object-edit
  147 + [formControlName]="formControlNameJsonAllConfig"
  148 + label="{{ 'device.lwm2m-value' | translate }}"
  149 + validateContent="true"
  150 + [required]="true"
  151 + [fillHeight]="false">
  152 + </tb-json-object-edit>
  153 + </fieldset>
  154 + </div>
  155 + </ng-template>
142 156 </mat-tab>
143 157 </mat-tab-group>
144 158 </fieldset>
... ... @@ -148,7 +162,7 @@
148 162 <button mat-button color="primary"
149 163 type="button"
150 164 [disabled]="(isLoading$ | async)"
151   - (click)="cancel()" cdkFocusInitial>
  165 + (click)="cancel()">
152 166 {{ 'action.cancel' | translate }}
153 167 </button>
154 168 <button mat-button mat-raised-button color="primary"
... ...
... ... @@ -15,14 +15,14 @@
15 15 ///
16 16
17 17
18   -import {Component, Inject, OnInit} from '@angular/core';
19   -import {DialogComponent} from '@shared/components/dialog.component';
20   -import {Store} from '@ngrx/store';
21   -import {AppState} from '@core/core.state';
22   -import {Router} from '@angular/router';
23   -import {MAT_DIALOG_DATA, MatDialogRef} from '@angular/material/dialog';
24   -import {FormBuilder, FormGroup, Validators} from '@angular/forms';
25   -import {TranslateService} from '@ngx-translate/core';
  18 +import {Component, Inject, OnInit } from '@angular/core';
  19 +import { DialogComponent } from '@shared/components/dialog.component';
  20 +import { Store } from '@ngrx/store';
  21 +import { AppState } from '@core/core.state';
  22 +import { Router } from '@angular/router';
  23 +import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
  24 +import { FormBuilder, FormGroup, Validators } from '@angular/forms';
  25 +import { TranslateService } from '@ngx-translate/core';
26 26 import {
27 27 SECURITY_CONFIG_MODE_NAMES,
28 28 SECURITY_CONFIG_MODE,
... ... @@ -30,22 +30,20 @@ import {
30 30 ClientSecurityConfigPSK,
31 31 ClientSecurityConfigRPK,
32 32 JSON_ALL_CONFIG,
33   - KEY_IDENT_REGEXP_PSK,
34   - KEY_PUBLIC_REGEXP_PSK,
  33 + KEY_REGEXP_HEX_DEC,
35 34 DeviceCredentialsDialogLwm2mData,
36 35 BOOTSTRAP_SERVER,
37 36 BOOTSTRAP_SERVERS,
38 37 LWM2M_SERVER,
39 38 ClientSecurityConfigX509,
40   - ClientSecurityConfigNO_SEC,
  39 + ClientSecurityConfigNoSEC,
41 40 getDefaultClientSecurityConfigType,
42 41 LEN_MAX_PSK,
43 42 LEN_MAX_PUBLIC_KEY_RPK
44   -} from "./security-config.models";
45   -import {WINDOW} from "@core/services/window.service";
46   -import {MatTabChangeEvent, MatTabGroup} from "@angular/material/tabs";
47   -import {MatTab} from "@angular/material/tabs/tab";
48   -
  43 +} from './security-config.models';
  44 +import { WINDOW } from '@core/services/window.service';
  45 +import { MatTabChangeEvent } from '@angular/material/tabs';
  46 +import { MatTab } from '@angular/material/tabs/tab';
49 47
50 48 @Component({
51 49 selector: 'tb-security-config-lwm2m',
... ... @@ -67,8 +65,8 @@ export class SecurityConfigComponent extends DialogComponent<SecurityConfigCompo
67 65 bootstrapServer: string;
68 66 lwm2mServer: string;
69 67 jsonObserveData: {};
70   - lenMaxKeyClient = LEN_MAX_PSK;
71   - tabPrevious: MatTab
  68 + lenMaxKeyClient = LEN_MAX_PSK as number;
  69 + tabPrevious: MatTab;
72 70 tabIndexPrevious = 0 as number;
73 71
74 72 constructor(protected store: Store<AppState>,
... ... @@ -76,7 +74,7 @@ export class SecurityConfigComponent extends DialogComponent<SecurityConfigCompo
76 74 @Inject(MAT_DIALOG_DATA) public data: DeviceCredentialsDialogLwm2mData,
77 75 public dialogRef: MatDialogRef<SecurityConfigComponent, object>,
78 76 public fb: FormBuilder,
79   - private translate: TranslateService,
  77 + public translate: TranslateService,
80 78 @Inject(WINDOW) private window: Window) {
81 79 super(store, router, dialogRef);
82 80 }
... ... @@ -85,13 +83,13 @@ export class SecurityConfigComponent extends DialogComponent<SecurityConfigCompo
85 83 this.jsonAllConfig = JSON.parse(JSON.stringify(this.data.jsonAllConfig)) as SecurityConfigModels;
86 84 this.initConstants();
87 85 this.lwm2mConfigFormGroup = this.initLwm2mConfigFormGroup();
88   - this.title = this.translate.instant('device.lwm2m-security-info') + ": " + this.data.endPoint
  86 + this.title = this.translate.instant('device.lwm2m-security-info') + ': ' + this.data.endPoint;
89 87 this.lwm2mConfigFormGroup.get('clientCertificate').disable();
90 88 this.initClientSecurityConfig(this.lwm2mConfigFormGroup.get('jsonAllConfig').value);
91 89 this.registerDisableOnLoadFormControl(this.lwm2mConfigFormGroup.get('securityConfigClientMode'));
92 90 }
93 91
94   - initConstants(): void {
  92 + private initConstants = (): void => {
95 93 this.bootstrapServers = BOOTSTRAP_SERVERS;
96 94 this.bootstrapServer = BOOTSTRAP_SERVER;
97 95 this.lwm2mServer = LWM2M_SERVER;
... ... @@ -112,7 +110,7 @@ export class SecurityConfigComponent extends DialogComponent<SecurityConfigCompo
112 110 return this.lwm2mConfigFormGroup.get('observeFormGroup') as FormGroup;
113 111 }
114 112
115   - initClientSecurityConfig(jsonAllConfig: SecurityConfigModels): void {
  113 + private initClientSecurityConfig = (jsonAllConfig: SecurityConfigModels): void => {
116 114 switch (jsonAllConfig.client.securityConfigClientMode.toString()) {
117 115 case SECURITY_CONFIG_MODE.NO_SEC.toString():
118 116 break;
... ... @@ -139,106 +137,110 @@ export class SecurityConfigComponent extends DialogComponent<SecurityConfigCompo
139 137 this.securityConfigClientUpdateValidators(this.lwm2mConfigFormGroup.get('securityConfigClientMode').value);
140 138 }
141 139
142   - securityConfigClientModeChanged(mode: SECURITY_CONFIG_MODE): void {
  140 + securityConfigClientModeChanged = (mode: SECURITY_CONFIG_MODE): void => {
143 141 switch (mode) {
144 142 case SECURITY_CONFIG_MODE.NO_SEC:
145   - let clientSecurityConfigNO_SEC = getDefaultClientSecurityConfigType(mode) as ClientSecurityConfigNO_SEC;
146   - this.jsonAllConfig.client = clientSecurityConfigNO_SEC;
  143 + const clientSecurityConfigNoSEC = getDefaultClientSecurityConfigType(mode) as ClientSecurityConfigNoSEC;
  144 + this.jsonAllConfig.client = clientSecurityConfigNoSEC;
147 145 this.lwm2mConfigFormGroup.patchValue({
148 146 jsonAllConfig: this.jsonAllConfig,
149 147 clientCertificate: false
150   - }, {emitEvent: true});
  148 + }, {emitEvent: false});
151 149 break;
152 150 case SECURITY_CONFIG_MODE.PSK:
153   - let clientSecurityConfigPSK = getDefaultClientSecurityConfigType(mode, this.lwm2mConfigFormGroup.get('endPoint').value) as ClientSecurityConfigPSK;
  151 + const clientSecurityConfigPSK = getDefaultClientSecurityConfigType(mode, this.lwm2mConfigFormGroup.get('endPoint')
  152 + .value) as ClientSecurityConfigPSK;
154 153 clientSecurityConfigPSK.identity = this.data.endPoint;
155 154 clientSecurityConfigPSK.key = this.lwm2mConfigFormGroup.get('clientKey').value;
156 155 this.jsonAllConfig.client = clientSecurityConfigPSK;
157 156 this.lwm2mConfigFormGroup.patchValue({
158 157 identityPSK: clientSecurityConfigPSK.identity,
159 158 clientCertificate: false
160   - }, {emitEvent: true});
  159 + }, {emitEvent: false});
161 160 break;
162 161 case SECURITY_CONFIG_MODE.RPK:
163   - let clientSecurityConfigRPK = getDefaultClientSecurityConfigType(mode) as ClientSecurityConfigRPK;
  162 + const clientSecurityConfigRPK = getDefaultClientSecurityConfigType(mode) as ClientSecurityConfigRPK;
164 163 clientSecurityConfigRPK.key = this.lwm2mConfigFormGroup.get('clientKey').value;
165 164 this.jsonAllConfig.client = clientSecurityConfigRPK;
166 165 this.lwm2mConfigFormGroup.patchValue({
167   - jsonAllConfig: this.jsonAllConfig,
168 166 clientCertificate: false
169   - }, {emitEvent: true})
  167 + }, {emitEvent: false});
170 168 break;
171 169 case SECURITY_CONFIG_MODE.X509:
172   - let clientSecurityConfigX509 = getDefaultClientSecurityConfigType(mode) as ClientSecurityConfigX509;
173   - this.jsonAllConfig.client = clientSecurityConfigX509;
  170 + this.jsonAllConfig.client = getDefaultClientSecurityConfigType(mode) as ClientSecurityConfigX509;
174 171 this.lwm2mConfigFormGroup.patchValue({
175   - jsonAllConfig: this.jsonAllConfig,
176 172 clientCertificate: true
177   - }, {emitEvent: true})
  173 + }, {emitEvent: false});
178 174 break;
179 175 }
180 176 this.securityConfigClientUpdateValidators(mode);
181 177 }
182 178
183   - securityConfigClientUpdateValidators(mode: SECURITY_CONFIG_MODE): void {
  179 + private securityConfigClientUpdateValidators = (mode: SECURITY_CONFIG_MODE): void => {
184 180 switch (mode) {
185 181 case SECURITY_CONFIG_MODE.NO_SEC:
186   - this.lwm2mConfigFormGroup.get('identityPSK').setValidators([]);
187   - this.lwm2mConfigFormGroup.get('identityPSK').updateValueAndValidity();
188   - this.lwm2mConfigFormGroup.get('clientKey').setValidators([]);
189   - this.lwm2mConfigFormGroup.get('clientKey').updateValueAndValidity();
  182 + this.setValidatorsNoSecX509();
190 183 break;
191 184 case SECURITY_CONFIG_MODE.PSK:
192 185 this.lenMaxKeyClient = LEN_MAX_PSK;
193   - this.lwm2mConfigFormGroup.get('identityPSK').setValidators([]);
194   - this.lwm2mConfigFormGroup.get('identityPSK').updateValueAndValidity();
195   - this.lwm2mConfigFormGroup.get('clientKey').setValidators([Validators.required, Validators.pattern(KEY_IDENT_REGEXP_PSK)]);
196   - this.lwm2mConfigFormGroup.get('clientKey').updateValueAndValidity();
  186 + this.setValidatorsPskRpk(mode);
197 187 break;
198 188 case SECURITY_CONFIG_MODE.RPK:
199 189 this.lenMaxKeyClient = LEN_MAX_PUBLIC_KEY_RPK;
200   - this.lwm2mConfigFormGroup.get('identityPSK').setValidators([]);
201   - this.lwm2mConfigFormGroup.get('identityPSK').updateValueAndValidity();
202   - this.lwm2mConfigFormGroup.get('clientKey').setValidators([Validators.required, Validators.pattern(KEY_PUBLIC_REGEXP_PSK)]);
203   - this.lwm2mConfigFormGroup.get('clientKey').updateValueAndValidity();
  190 + this.setValidatorsPskRpk(mode);
204 191 break;
205 192 case SECURITY_CONFIG_MODE.X509:
206 193 this.lenMaxKeyClient = LEN_MAX_PUBLIC_KEY_RPK;
207   - this.lwm2mConfigFormGroup.get('identityPSK').setValidators([]);
208   - this.lwm2mConfigFormGroup.get('identityPSK').updateValueAndValidity();
209   - this.lwm2mConfigFormGroup.get('clientKey').setValidators([]);
210   - this.lwm2mConfigFormGroup.get('clientKey').updateValueAndValidity();
  194 + this.setValidatorsNoSecX509();
211 195 break;
212 196 }
  197 + this.lwm2mConfigFormGroup.updateValueAndValidity();
  198 + }
  199 +
  200 + private setValidatorsNoSecX509 = (): void => {
  201 + this.lwm2mConfigFormGroup.get('identityPSK').setValidators([]);
  202 + this.lwm2mConfigFormGroup.get('clientKey').setValidators([]);
  203 + }
  204 +
  205 + private setValidatorsPskRpk = (mode: SECURITY_CONFIG_MODE): void => {
  206 + if (mode === SECURITY_CONFIG_MODE.PSK) {
  207 + this.lwm2mConfigFormGroup.get('identityPSK').setValidators([Validators.required]);
  208 + } else {
  209 + this.lwm2mConfigFormGroup.get('identityPSK').setValidators([]);
  210 + }
  211 + this.lwm2mConfigFormGroup.get('clientKey').setValidators([Validators.required,
  212 + Validators.pattern(KEY_REGEXP_HEX_DEC),
  213 + Validators.maxLength(this.lenMaxKeyClient), Validators.minLength(this.lenMaxKeyClient)]);
213 214 }
214 215
215 216 tabChanged = (tabChangeEvent: MatTabChangeEvent): void => {
216   - if (this.tabIndexPrevious !== tabChangeEvent.index) this.upDateValueToJson();
  217 + if (this.tabIndexPrevious !== tabChangeEvent.index) { this.upDateValueToJson(); }
217 218 this.tabIndexPrevious = tabChangeEvent.index;
218 219 }
219 220
220   - upDateValueToJson(): void {
  221 + private upDateValueToJson(): void {
221 222 switch (this.tabIndexPrevious) {
222 223 case 0:
223   - this.upDateValueToJsonTab_0();
  224 + this.upDateValueToJsonTab0();
224 225 break;
225 226 case 1:
226   - this.upDateValueToJsonTab_1();
  227 + this.upDateValueToJsonTab1();
227 228 break;
228 229 case 2:
229   - this.upDateValueToJsonTab_2();
  230 + this.upDateValueToJsonTab2();
230 231 break;
231 232 }
232 233 }
233 234
234   - upDateValueToJsonTab_0(): void {
  235 + private upDateValueToJsonTab0 = (): void => {
235 236 if (this.lwm2mConfigFormGroup !== null) {
236 237 if (!this.lwm2mConfigFormGroup.get('endPoint').pristine && this.lwm2mConfigFormGroup.get('endPoint').valid) {
237 238 this.data.endPoint = this.lwm2mConfigFormGroup.get('endPoint').value;
238 239 // Client mode == PSK
239 240 if (this.lwm2mConfigFormGroup.get('securityConfigClientMode').value === SECURITY_CONFIG_MODE.PSK) {
240   - this.jsonAllConfig.client["endpoint"] = this.data.endPoint;
241   - this.jsonAllConfig.client["endpoint"].markAsPristine({
  241 + const endPoint = 'endpoint';
  242 + this.jsonAllConfig.client[endPoint] = this.data.endPoint;
  243 + this.jsonAllConfig.client[endPoint].markAsPristine({
242 244 onlySelf: true
243 245 });
244 246 this.upDateJsonAllConfig();
... ... @@ -261,7 +263,7 @@ export class SecurityConfigComponent extends DialogComponent<SecurityConfigCompo
261 263 }
262 264 }
263 265
264   - upDateValueToJsonTab_1(): void {
  266 + private upDateValueToJsonTab1 = (): void => {
265 267 if (this.lwm2mConfigFormGroup !== null) {
266 268 if (this.bootstrapFormGroup !== null && !this.bootstrapFormGroup.pristine && this.bootstrapFormGroup.valid) {
267 269 this.jsonAllConfig.bootstrap.bootstrapServer = this.bootstrapFormGroup.value;
... ... @@ -281,8 +283,9 @@ export class SecurityConfigComponent extends DialogComponent<SecurityConfigCompo
281 283 }
282 284 }
283 285
284   - upDateValueToJsonTab_2(): void {
285   - if (!this.lwm2mConfigFormGroup.get(this.formControlNameJsonAllConfig).pristine && this.lwm2mConfigFormGroup.get(this.formControlNameJsonAllConfig).valid) {
  286 + private upDateValueToJsonTab2 = (): void => {
  287 + if (!this.lwm2mConfigFormGroup.get(this.formControlNameJsonAllConfig).pristine &&
  288 + this.lwm2mConfigFormGroup.get(this.formControlNameJsonAllConfig).valid) {
286 289 this.jsonAllConfig = this.lwm2mConfigFormGroup.get(this.formControlNameJsonAllConfig).value;
287 290 this.lwm2mConfigFormGroup.get(this.formControlNameJsonAllConfig).markAsPristine({
288 291 onlySelf: true
... ... @@ -290,15 +293,17 @@ export class SecurityConfigComponent extends DialogComponent<SecurityConfigCompo
290 293 }
291 294 }
292 295
293   - updateIdentityPSK(): void {
294   - if (this.lwm2mConfigFormGroup.get('bootstrapServer').value['securityMode'] === SECURITY_CONFIG_MODE.PSK.toString()) {
  296 + private updateIdentityPSK = (): void => {
  297 + const securityMode = 'securityMode';
  298 + if (this.lwm2mConfigFormGroup.get('bootstrapServer').value[securityMode] === SECURITY_CONFIG_MODE.PSK.toString()) {
295 299 this.lwm2mConfigFormGroup.get('bootstrapFormGroup').patchValue({
296 300 clientPublicKeyOrId: this.lwm2mConfigFormGroup.get('identityPSK').value
297 301 });
298   - this.jsonAllConfig.client['identity'] = this.lwm2mConfigFormGroup.get('identityPSK').value;
  302 + const identity = 'identity';
  303 + this.jsonAllConfig.client[identity] = this.lwm2mConfigFormGroup.get('identityPSK').value;
299 304 this.upDateJsonAllConfig();
300 305 }
301   - if (this.lwm2mConfigFormGroup.get('lwm2mServer').value['securityMode'] === SECURITY_CONFIG_MODE.PSK.toString()) {
  306 + if (this.lwm2mConfigFormGroup.get('lwm2mServer').value[securityMode] === SECURITY_CONFIG_MODE.PSK.toString()) {
302 307 this.lwm2mConfigFormGroup.get('lwm2mServerFormGroup').patchValue({
303 308 clientPublicKeyOrId: this.lwm2mConfigFormGroup.get('identityPSK').value
304 309 });
... ... @@ -307,32 +312,26 @@ export class SecurityConfigComponent extends DialogComponent<SecurityConfigCompo
307 312 }
308 313 }
309 314
310   - updateClientKey(): void {
311   - this.jsonAllConfig.client["key"] = this.lwm2mConfigFormGroup.get('clientKey').value;
312   - if (this.lwm2mConfigFormGroup.get('bootstrapServer').value['securityMode'] === SECURITY_CONFIG_MODE.PSK.toString()) {
  315 + private updateClientKey = (): void => {
  316 + const key = 'key';
  317 + const securityMode = 'securityMode';
  318 + this.jsonAllConfig.client[key] = this.lwm2mConfigFormGroup.get('clientKey').value;
  319 + if (this.lwm2mConfigFormGroup.get('bootstrapServer').value[securityMode] === SECURITY_CONFIG_MODE.PSK.toString()) {
313 320 this.lwm2mConfigFormGroup.get('bootstrapServer').patchValue({
314   - clientSecretKey: this.jsonAllConfig.client["key"]
  321 + clientSecretKey: this.jsonAllConfig.client[key]
315 322 }, {emitEvent: false});
316   - this.jsonAllConfig.bootstrap.bootstrapServer.clientSecretKey = this.jsonAllConfig.client["key"];
  323 + this.jsonAllConfig.bootstrap.bootstrapServer.clientSecretKey = this.jsonAllConfig.client[key];
317 324 }
318   - if (this.lwm2mConfigFormGroup.get('lwm2mServer').value['securityMode'] === SECURITY_CONFIG_MODE.PSK.toString()) {
  325 + if (this.lwm2mConfigFormGroup.get('lwm2mServer').value[securityMode] === SECURITY_CONFIG_MODE.PSK.toString()) {
319 326 this.lwm2mConfigFormGroup.get('lwm2mServer').patchValue({
320   - clientSecretKey: this.jsonAllConfig.client["key"]
  327 + clientSecretKey: this.jsonAllConfig.client[key]
321 328 }, {emitEvent: false});
322   - this.jsonAllConfig.bootstrap.lwm2mServer.clientSecretKey = this.jsonAllConfig.client["key"];
  329 + this.jsonAllConfig.bootstrap.lwm2mServer.clientSecretKey = this.jsonAllConfig.client[key];
323 330 }
324 331 this.upDateJsonAllConfig();
325 332 }
326 333
327   - upDateJsonAllConfig(): void {
328   - this.data.jsonAllConfig = JSON.parse(JSON.stringify(this.jsonAllConfig));
329   - this.lwm2mConfigFormGroup.patchValue({
330   - jsonAllConfig: JSON.parse(JSON.stringify(this.jsonAllConfig))
331   - }, {emitEvent: false});
332   - this.lwm2mConfigFormGroup.markAsDirty();
333   - }
334   -
335   - upDateBootstrapFormGroup(): void {
  334 + private upDateJsonAllConfig = (): void => {
336 335 this.data.jsonAllConfig = JSON.parse(JSON.stringify(this.jsonAllConfig));
337 336 this.lwm2mConfigFormGroup.patchValue({
338 337 jsonAllConfig: JSON.parse(JSON.stringify(this.jsonAllConfig))
... ... @@ -340,9 +339,10 @@ export class SecurityConfigComponent extends DialogComponent<SecurityConfigCompo
340 339 this.lwm2mConfigFormGroup.markAsDirty();
341 340 }
342 341
343   - initLwm2mConfigFormGroup(): FormGroup {
  342 + private initLwm2mConfigFormGroup = (): FormGroup => {
344 343 if (SECURITY_CONFIG_MODE[this.jsonAllConfig.client.securityConfigClientMode.toString()] === SECURITY_CONFIG_MODE.PSK) {
345   - this.data.endPoint = this.jsonAllConfig.client['endpoint'];
  344 + const endpoint = 'endpoint';
  345 + this.data.endPoint = this.jsonAllConfig.client[endpoint];
346 346 }
347 347 return this.fb.group({
348 348 securityConfigClientMode: [SECURITY_CONFIG_MODE[this.jsonAllConfig.client.securityConfigClientMode.toString()], []],
... ... @@ -351,27 +351,28 @@ export class SecurityConfigComponent extends DialogComponent<SecurityConfigCompo
351 351 clientCertificate: [false, []],
352 352 bootstrapServer: [this.jsonAllConfig.bootstrap[this.bootstrapServer], []],
353 353 lwm2mServer: [this.jsonAllConfig.bootstrap[this.lwm2mServer], []],
354   - bootstrapFormGroup: this.getServerGroup(true),
355   - lwm2mServerFormGroup: this.getServerGroup(false),
  354 + bootstrapFormGroup: this.getServerGroup(),
  355 + lwm2mServerFormGroup: this.getServerGroup(),
356 356 endPoint: [this.data.endPoint, []],
357 357 jsonAllConfig: [this.jsonAllConfig, []]
358 358 });
359 359 }
360 360
361   - getServerGroup(bootstrapServerIs: boolean): FormGroup {
  361 + private getServerGroup = (): FormGroup => {
362 362 return this.fb.group({
363 363 securityMode: [this.fb.control(SECURITY_CONFIG_MODE.NO_SEC), []],
364 364 clientPublicKeyOrId: ['', []],
365 365 clientSecretKey: ['', []]
366   - })
  366 + });
367 367 }
368 368
369 369 save(): void {
370 370 this.upDateValueToJson();
371   - this.data.endPoint = this.lwm2mConfigFormGroup.get('endPoint').value.split('\"').join('');
  371 + this.data.endPoint = this.lwm2mConfigFormGroup.get('endPoint').value.split('\'').join('');
372 372 this.data.jsonAllConfig = this.jsonAllConfig;
373 373 if (this.lwm2mConfigFormGroup.get('securityConfigClientMode').value === SECURITY_CONFIG_MODE.PSK) {
374   - this.data.endPoint = this.data.jsonAllConfig.client["identity"];
  374 + const identity = 'identity';
  375 + this.data.endPoint = this.data.jsonAllConfig.client[identity];
375 376 }
376 377 this.dialogRef.close(this.data);
377 378 }
... ...
... ... @@ -25,10 +25,8 @@ export const LEN_MAX_PSK = 64;
25 25 export const LEN_MAX_PRIVATE_KEY = 134;
26 26 export const LEN_MAX_PUBLIC_KEY_RPK = 182;
27 27 export const LEN_MAX_PUBLIC_KEY_X509 = 3000;
28   -export const KEY_IDENT_REGEXP_PSK = /^[0-9a-fA-F]{64,64}$/;
29   -export const KEY_PRIVATE_REGEXP = /^[0-9a-fA-F]{134,134}$/;
30   -export const KEY_PUBLIC_REGEXP_PSK = /^[0-9a-fA-F]{182,182}$/;
31   -export const KEY_PUBLIC_REGEXP_X509 = /^[0-9a-fA-F]{0,3000}$/;
  28 +export const KEY_REGEXP_HEX_DEC = /^[-+]?[0-9A-Fa-f]+\.?[0-9A-Fa-f]*?$/;
  29 +
32 30
33 31 export interface DeviceCredentialsDialogLwm2mData {
34 32 jsonAllConfig?: SecurityConfigModels;
... ... @@ -55,43 +53,43 @@ export type ClientSecurityConfigType =
55 53 ClientSecurityConfigPSK
56 54 | ClientSecurityConfigRPK
57 55 | ClientSecurityConfigX509
58   - | ClientSecurityConfigNO_SEC;
  56 + | ClientSecurityConfigNoSEC;
59 57
60 58 export interface ClientSecurityConfigPSK {
61   - securityConfigClientMode: string,
62   - endpoint: string,
63   - identity: string,
64   - key: string
  59 + securityConfigClientMode: string;
  60 + endpoint: string;
  61 + identity: string;
  62 + key: string;
65 63 }
66 64
67 65 export interface ClientSecurityConfigRPK {
68   - securityConfigClientMode: string,
69   - key: string
  66 + securityConfigClientMode: string;
  67 + key: string;
70 68 }
71 69
72 70 export interface ClientSecurityConfigX509 {
73   - securityConfigClientMode: string,
74   - x509: boolean
  71 + securityConfigClientMode: string;
  72 + x509: boolean;
75 73 }
76 74
77   -export interface ClientSecurityConfigNO_SEC {
78   - securityConfigClientMode: string
  75 +export interface ClientSecurityConfigNoSEC {
  76 + securityConfigClientMode: string;
79 77 }
80 78
81 79 export interface ServerSecurityConfig {
82   - securityMode: string,
83   - clientPublicKeyOrId?: string,
84   - clientSecretKey?: string
  80 + securityMode: string;
  81 + clientPublicKeyOrId?: string;
  82 + clientSecretKey?: string;
85 83 }
86 84
87 85 interface BootstrapSecurityConfig {
88   - bootstrapServer: ServerSecurityConfig,
89   - lwm2mServer: ServerSecurityConfig
  86 + bootstrapServer: ServerSecurityConfig;
  87 + lwm2mServer: ServerSecurityConfig;
90 88 }
91 89
92 90 export interface SecurityConfigModels {
93   - client: ClientSecurityConfigType,
94   - bootstrap: BootstrapSecurityConfig
  91 + client: ClientSecurityConfigType;
  92 + bootstrap: BootstrapSecurityConfig;
95 93 }
96 94
97 95 export function getDefaultClientSecurityConfigType(securityConfigMode: SECURITY_CONFIG_MODE, endPoint?: string): ClientSecurityConfigType {
... ... @@ -103,24 +101,24 @@ export function getDefaultClientSecurityConfigType(securityConfigMode: SECURITY_
103 101 endpoint: endPoint,
104 102 identity: endPoint,
105 103 key: ''
106   - }
  104 + };
107 105 break;
108 106 case SECURITY_CONFIG_MODE.RPK:
109 107 security = {
110 108 securityConfigClientMode: '',
111 109 key: ''
112   - }
  110 + };
113 111 break;
114 112 case SECURITY_CONFIG_MODE.X509:
115 113 security = {
116 114 securityConfigClientMode: '',
117 115 x509: true
118   - }
  116 + };
119 117 break;
120 118 case SECURITY_CONFIG_MODE.NO_SEC:
121 119 security = {
122 120 securityConfigClientMode: ''
123   - }
  121 + };
124 122 break;
125 123 }
126 124 security.securityConfigClientMode = securityConfigMode.toString();
... ... @@ -132,14 +130,14 @@ export function getDefaultServerSecurityConfig(): ServerSecurityConfig {
132 130 securityMode: SECURITY_CONFIG_MODE.NO_SEC.toString(),
133 131 clientPublicKeyOrId: '',
134 132 clientSecretKey: ''
135   - }
  133 + };
136 134 }
137 135
138 136 function getDefaultBootstrapSecurityConfig(): BootstrapSecurityConfig {
139 137 return {
140 138 bootstrapServer: getDefaultServerSecurityConfig(),
141 139 lwm2mServer: getDefaultServerSecurityConfig()
142   - }
  140 + };
143 141 }
144 142
145 143 export function getDefaultSecurityConfig(): SecurityConfigModels {
... ...
... ... @@ -61,6 +61,7 @@ export class JsonObjectEditComponent implements OnInit, ControlValueAccessor, Va
61 61
62 62 @Input() editorStyle: { [klass: string]: any };
63 63
  64 + // tslint:disable-next-line:ban-types
64 65 @Input() sort: Function;
65 66
66 67 private requiredValue: boolean;
... ... @@ -226,9 +227,10 @@ export class JsonObjectEditComponent implements OnInit, ControlValueAccessor, Va
226 227 try {
227 228
228 229 if (this.modelValue) {
229   - this.contentValue = JSON.stringify(this.modelValue, isUndefined(this.sort) ? undefined :
  230 + this.contentValue = JSON.stringify(this.modelValue, isUndefined(this.sort) ? null :
  231 + // tslint:disable-next-line:no-shadowed-variable
230 232 (key, value) => {
231   - return this.sort(key, value)
  233 + return this.sort(key, value);
232 234 }, 2);
233 235 this.objectValid = true;
234 236 } else {
... ...
... ... @@ -893,9 +893,8 @@
893 893 "lwm2m-server": "LwM2M Server",
894 894 "client-publicKey-or-id": "Client Public Key or Id",
895 895 "client-secret-key": "Client Secret Key",
896   - "config-json-tab": "Json Client Security Config",
897   - "pattern_hex_dec_64": "must be hex decimal format and 64 characters",
898   - "pattern_hex_dec_182": "must be hex decimal format and 182 characters"
  896 + "config-json-tab": "Json Client Security Config",
  897 + "pattern_hex_dec": "{ count, plural, 0 {must be hex decimal format} other {must be # characters} }"
899 898 },
900 899 "client-id": "Client ID",
901 900 "client-id-pattern": "Contains invalid character.",
... ... @@ -1121,10 +1120,7 @@
1121 1120 "key-name_label": "Key Name in Camel format",
1122 1121 "required": " value is required.",
1123 1122 "mode": "Security config mode",
1124   - "pattern_hex_dec_64": "must be hex decimal format and 64 characters",
1125   - "pattern_hex_dec_134": "must be hex decimal format and 134 characters",
1126   - "pattern_hex_dec_182": "must be hex decimal format and 182 characters",
1127   - "pattern_hex_dec": "must be hex decimal format",
  1123 + "pattern_hex_dec": "{ count, plural, 0 {must be hex decimal format} other {must be # characters} }",
1128 1124 "bootstrap-tab": "Bootstrap",
1129 1125 "servers": "Servers",
1130 1126 "short-id": "Short ID",
... ...