25 changed files with 1720 additions and 26 deletions
File diff suppressed because one or more lines are too long
@ -0,0 +1,84 @@ |
|||
<!-- |
|||
|
|||
Copyright © 2016-2022 The Thingsboard Authors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
--> |
|||
<section class="tb-widget-settings" [formGroup]="deviceClaimingWidgetSettingsForm" fxLayout="column"> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.general-settings</legend> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.widget-title</mat-label> |
|||
<input matInput formControlName="widgetTitle"> |
|||
</mat-form-field> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.claim-button-label</mat-label> |
|||
<input matInput formControlName="labelClaimButon"> |
|||
</mat-form-field> |
|||
<mat-slide-toggle class="slide-block" formControlName="deviceSecret"> |
|||
{{ 'widgets.input-widgets.show-secret-key-field' | translate }} |
|||
</mat-slide-toggle> |
|||
</fieldset> |
|||
<fieldset class="fields-group fields-group-slider"> |
|||
<legend class="group-title" translate>widgets.input-widgets.labels-settings</legend> |
|||
<mat-expansion-panel class="tb-settings" [expanded]="deviceClaimingWidgetSettingsForm.get('showLabel').value"> |
|||
<mat-expansion-panel-header fxLayout="row wrap"> |
|||
<mat-panel-title> |
|||
<mat-slide-toggle formControlName="showLabel" (click)="$event.stopPropagation()" |
|||
fxLayoutAlign="center"> |
|||
{{ 'widgets.input-widgets.show-labels' | translate }} |
|||
</mat-slide-toggle> |
|||
</mat-panel-title> |
|||
<mat-panel-description fxLayoutAlign="end center" fxHide.xs translate> |
|||
widget-config.advanced-settings |
|||
</mat-panel-description> |
|||
</mat-expansion-panel-header> |
|||
<ng-template matExpansionPanelContent> |
|||
<section fxLayout="column"> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.device-name-label</mat-label> |
|||
<input matInput formControlName="deviceLabel"> |
|||
</mat-form-field> |
|||
<mat-form-field [fxShow]="deviceClaimingWidgetSettingsForm.get('deviceSecret').value" fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.secret-key-label</mat-label> |
|||
<input matInput formControlName="secretKeyLabel"> |
|||
</mat-form-field> |
|||
</section> |
|||
</ng-template> |
|||
</mat-expansion-panel> |
|||
</fieldset> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.messages-settings</legend> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.claim-device-success-message</mat-label> |
|||
<input matInput formControlName="successfulClaimDevice"> |
|||
</mat-form-field> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.claim-device-not-found-message</mat-label> |
|||
<input matInput formControlName="deviceNotFound"> |
|||
</mat-form-field> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.claim-device-failed-message</mat-label> |
|||
<input matInput formControlName="failedClaimDevice"> |
|||
</mat-form-field> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.claim-device-name-required-message</mat-label> |
|||
<input matInput formControlName="requiredErrorDevice"> |
|||
</mat-form-field> |
|||
<mat-form-field [fxShow]="deviceClaimingWidgetSettingsForm.get('deviceSecret').value" fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.claim-device-secret-key-required-message</mat-label> |
|||
<input matInput formControlName="requiredErrorSecretKey"> |
|||
</mat-form-field> |
|||
</fieldset> |
|||
</section> |
|||
@ -0,0 +1,110 @@ |
|||
///
|
|||
/// Copyright © 2016-2022 The Thingsboard Authors
|
|||
///
|
|||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|||
/// you may not use this file except in compliance with the License.
|
|||
/// You may obtain a copy of the License at
|
|||
///
|
|||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|||
///
|
|||
/// Unless required by applicable law or agreed to in writing, software
|
|||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
/// See the License for the specific language governing permissions and
|
|||
/// limitations under the License.
|
|||
///
|
|||
|
|||
import { Component } from '@angular/core'; |
|||
import { WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models'; |
|||
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; |
|||
import { Store } from '@ngrx/store'; |
|||
import { AppState } from '@core/core.state'; |
|||
|
|||
@Component({ |
|||
selector: 'tb-device-claiming-widget-settings', |
|||
templateUrl: './device-claiming-widget-settings.component.html', |
|||
styleUrls: ['./../widget-settings.scss'] |
|||
}) |
|||
export class DeviceClaimingWidgetSettingsComponent extends WidgetSettingsComponent { |
|||
|
|||
deviceClaimingWidgetSettingsForm: FormGroup; |
|||
|
|||
constructor(protected store: Store<AppState>, |
|||
private fb: FormBuilder) { |
|||
super(store); |
|||
} |
|||
|
|||
protected settingsForm(): FormGroup { |
|||
return this.deviceClaimingWidgetSettingsForm; |
|||
} |
|||
|
|||
protected defaultSettings(): WidgetSettings { |
|||
return { |
|||
widgetTitle: '', |
|||
labelClaimButon: '', |
|||
deviceSecret: false, |
|||
showLabel: true, |
|||
deviceLabel: '', |
|||
secretKeyLabel: '', |
|||
successfulClaimDevice: '', |
|||
deviceNotFound: '', |
|||
failedClaimDevice: '', |
|||
requiredErrorDevice: '', |
|||
requiredErrorSecretKey: '' |
|||
}; |
|||
} |
|||
|
|||
protected onSettingsSet(settings: WidgetSettings) { |
|||
this.deviceClaimingWidgetSettingsForm = this.fb.group({ |
|||
|
|||
// General settings
|
|||
|
|||
widgetTitle: [settings.widgetTitle, []], |
|||
labelClaimButon: [settings.labelClaimButon, []], |
|||
deviceSecret: [settings.deviceSecret, []], |
|||
|
|||
// Labels settings
|
|||
|
|||
showLabel: [settings.showLabel, []], |
|||
deviceLabel: [settings.deviceLabel, []], |
|||
secretKeyLabel: [settings.secretKeyLabel, []], |
|||
|
|||
// Message settings
|
|||
|
|||
successfulClaimDevice: [settings.successfulClaimDevice, []], |
|||
deviceNotFound: [settings.deviceNotFound, []], |
|||
failedClaimDevice: [settings.failedClaimDevice, []], |
|||
requiredErrorDevice: [settings.requiredErrorDevice, []], |
|||
requiredErrorSecretKey: [settings.requiredErrorSecretKey, []] |
|||
}); |
|||
} |
|||
|
|||
protected validatorTriggers(): string[] { |
|||
return ['deviceSecret', 'showLabel']; |
|||
} |
|||
|
|||
protected updateValidators(emitEvent: boolean) { |
|||
const deviceSecret: boolean = this.deviceClaimingWidgetSettingsForm.get('deviceSecret').value; |
|||
const showLabel: boolean = this.deviceClaimingWidgetSettingsForm.get('showLabel').value; |
|||
if (deviceSecret) { |
|||
if (showLabel) { |
|||
this.deviceClaimingWidgetSettingsForm.get('secretKeyLabel').enable(); |
|||
} else { |
|||
this.deviceClaimingWidgetSettingsForm.get('secretKeyLabel').disable(); |
|||
} |
|||
this.deviceClaimingWidgetSettingsForm.get('requiredErrorSecretKey').enable(); |
|||
} else { |
|||
this.deviceClaimingWidgetSettingsForm.get('requiredErrorSecretKey').disable(); |
|||
this.deviceClaimingWidgetSettingsForm.get('secretKeyLabel').disable(); |
|||
} |
|||
if (showLabel) { |
|||
this.deviceClaimingWidgetSettingsForm.get('deviceLabel').enable(); |
|||
} else { |
|||
this.deviceClaimingWidgetSettingsForm.get('deviceLabel').disable(); |
|||
} |
|||
this.deviceClaimingWidgetSettingsForm.get('secretKeyLabel').updateValueAndValidity({emitEvent}); |
|||
this.deviceClaimingWidgetSettingsForm.get('deviceLabel').updateValueAndValidity({emitEvent}); |
|||
this.deviceClaimingWidgetSettingsForm.get('requiredErrorSecretKey').updateValueAndValidity({emitEvent}); |
|||
} |
|||
|
|||
} |
|||
@ -0,0 +1,59 @@ |
|||
<!-- |
|||
|
|||
Copyright © 2016-2022 The Thingsboard Authors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
--> |
|||
<section class="tb-widget-settings" [formGroup]="photoCameraInputWidgetSettingsForm"> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.general-settings</legend> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.widget-title</mat-label> |
|||
<input matInput formControlName="widgetTitle"> |
|||
</mat-form-field> |
|||
</fieldset> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.image-settings</legend> |
|||
<section fxLayout="column" fxLayout.gt-sm="row" fxLayoutGap="8px" fxLayoutAlign.gt-sm="start center"> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.image-format</mat-label> |
|||
<mat-select formControlName="imageFormat"> |
|||
<mat-option [value]="'image/jpeg'"> |
|||
{{ 'widgets.input-widgets.image-format-jpeg' | translate }} |
|||
</mat-option> |
|||
<mat-option [value]="'image/png'"> |
|||
{{ 'widgets.input-widgets.image-format-png' | translate }} |
|||
</mat-option> |
|||
<mat-option [value]="'image/webp'"> |
|||
{{ 'widgets.input-widgets.image-format-webp' | translate }} |
|||
</mat-option> |
|||
</mat-select> |
|||
</mat-form-field> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.image-quality</mat-label> |
|||
<input matInput type="number" min="0" max="1" formControlName="imageQuality"> |
|||
</mat-form-field> |
|||
</section> |
|||
<section fxLayout="column" fxLayout.gt-sm="row" fxLayoutGap="8px" fxLayoutAlign.gt-sm="start center"> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.max-image-width</mat-label> |
|||
<input matInput type="number" min="1" formControlName="maxWidth"> |
|||
</mat-form-field> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.max-image-height</mat-label> |
|||
<input matInput type="number" min="1" formControlName="maxHeight"> |
|||
</mat-form-field> |
|||
</section> |
|||
</fieldset> |
|||
</section> |
|||
@ -0,0 +1,67 @@ |
|||
///
|
|||
/// Copyright © 2016-2022 The Thingsboard Authors
|
|||
///
|
|||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|||
/// you may not use this file except in compliance with the License.
|
|||
/// You may obtain a copy of the License at
|
|||
///
|
|||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|||
///
|
|||
/// Unless required by applicable law or agreed to in writing, software
|
|||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
/// See the License for the specific language governing permissions and
|
|||
/// limitations under the License.
|
|||
///
|
|||
|
|||
import { Component } from '@angular/core'; |
|||
import { WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models'; |
|||
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; |
|||
import { Store } from '@ngrx/store'; |
|||
import { AppState } from '@core/core.state'; |
|||
|
|||
@Component({ |
|||
selector: 'tb-photo-camera-input-widget-settings', |
|||
templateUrl: './photo-camera-input-widget-settings.component.html', |
|||
styleUrls: ['./../widget-settings.scss'] |
|||
}) |
|||
export class PhotoCameraInputWidgetSettingsComponent extends WidgetSettingsComponent { |
|||
|
|||
photoCameraInputWidgetSettingsForm: FormGroup; |
|||
|
|||
constructor(protected store: Store<AppState>, |
|||
private fb: FormBuilder) { |
|||
super(store); |
|||
} |
|||
|
|||
protected settingsForm(): FormGroup { |
|||
return this.photoCameraInputWidgetSettingsForm; |
|||
} |
|||
|
|||
protected defaultSettings(): WidgetSettings { |
|||
return { |
|||
widgetTitle: '', |
|||
|
|||
imageFormat: 'image/png', |
|||
imageQuality: 0.92, |
|||
maxWidth: 640, |
|||
maxHeight: 480 |
|||
}; |
|||
} |
|||
|
|||
protected onSettingsSet(settings: WidgetSettings) { |
|||
this.photoCameraInputWidgetSettingsForm = this.fb.group({ |
|||
|
|||
// General settings
|
|||
|
|||
widgetTitle: [settings.widgetTitle, []], |
|||
|
|||
// Image settings
|
|||
|
|||
imageFormat: [settings.imageFormat, []], |
|||
imageQuality: [settings.imageQuality, [Validators.min(0), Validators.max(1)]], |
|||
maxWidth: [settings.maxWidth, [Validators.min(1)]], |
|||
maxHeight: [settings.maxHeight, [Validators.min(1)]] |
|||
}); |
|||
} |
|||
} |
|||
@ -0,0 +1,47 @@ |
|||
<!-- |
|||
|
|||
Copyright © 2016-2022 The Thingsboard Authors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
--> |
|||
<section class="tb-widget-settings" [formGroup]="updateAttributeGeneralSettingsFormGroup"> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.general-settings</legend> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.widget-title</mat-label> |
|||
<input matInput formControlName="widgetTitle"> |
|||
</mat-form-field> |
|||
<section fxLayout="column" fxLayout.gt-sm="row" fxLayoutGap="8px" fxLayoutAlign.gt-sm="start center"> |
|||
<mat-slide-toggle fxFlex fxFlex.gt-sm="20" formControlName="showLabel"> |
|||
{{ 'widgets.input-widgets.show-label' | translate }} |
|||
</mat-slide-toggle> |
|||
<mat-form-field *ngIf="hasLabelValue" fxFlex fxFlex.gt-sm="80" class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.label</mat-label> |
|||
<input matInput formControlName="labelValue"> |
|||
</mat-form-field> |
|||
</section> |
|||
<section fxLayout="column" fxLayout.gt-sm="row" fxLayoutGap="8px" fxLayoutAlign.gt-sm="start center"> |
|||
<mat-slide-toggle fxFlex fxFlex.gt-sm="20" formControlName="isRequired"> |
|||
{{ 'widgets.input-widgets.required' | translate }} |
|||
</mat-slide-toggle> |
|||
<mat-form-field fxFlex fxFlex.gt-sm="80" class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.required-error-message</mat-label> |
|||
<input matInput formControlName="requiredErrorMessage"> |
|||
</mat-form-field> |
|||
</section> |
|||
<mat-slide-toggle formControlName="showResultMessage" class="slide-block"> |
|||
{{ 'widgets.input-widgets.show-result-message' | translate }} |
|||
</mat-slide-toggle> |
|||
</fieldset> |
|||
</section> |
|||
@ -0,0 +1,172 @@ |
|||
///
|
|||
/// Copyright © 2016-2022 The Thingsboard Authors
|
|||
///
|
|||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|||
/// you may not use this file except in compliance with the License.
|
|||
/// You may obtain a copy of the License at
|
|||
///
|
|||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|||
///
|
|||
/// Unless required by applicable law or agreed to in writing, software
|
|||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
/// See the License for the specific language governing permissions and
|
|||
/// limitations under the License.
|
|||
///
|
|||
|
|||
import { Component, forwardRef, Input, OnInit } from '@angular/core'; |
|||
import { |
|||
ControlValueAccessor, |
|||
FormBuilder, |
|||
FormControl, |
|||
FormGroup, |
|||
NG_VALIDATORS, |
|||
NG_VALUE_ACCESSOR, |
|||
Validator |
|||
} from '@angular/forms'; |
|||
import { PageComponent } from '@shared/components/page.component'; |
|||
import { Store } from '@ngrx/store'; |
|||
import { AppState } from '@core/core.state'; |
|||
import { TranslateService } from '@ngx-translate/core'; |
|||
|
|||
export interface UpdateAttributeGeneralSettings { |
|||
widgetTitle: string; |
|||
showLabel: boolean; |
|||
labelValue?: string; |
|||
isRequired: boolean; |
|||
requiredErrorMessage: string; |
|||
showResultMessage: boolean; |
|||
} |
|||
|
|||
export function updateAttributeGeneralDefaultSettings(hasLabelValue = true): UpdateAttributeGeneralSettings { |
|||
const updateAttributeGeneralSettings: UpdateAttributeGeneralSettings = { |
|||
widgetTitle: '', |
|||
showLabel: true, |
|||
isRequired: true, |
|||
requiredErrorMessage: '', |
|||
showResultMessage: true |
|||
}; |
|||
if (hasLabelValue) { |
|||
updateAttributeGeneralSettings.labelValue = ''; |
|||
} |
|||
return updateAttributeGeneralSettings; |
|||
} |
|||
|
|||
@Component({ |
|||
selector: 'tb-update-attribute-general-settings', |
|||
templateUrl: './update-attribute-general-settings.component.html', |
|||
styleUrls: ['./../widget-settings.scss'], |
|||
providers: [ |
|||
{ |
|||
provide: NG_VALUE_ACCESSOR, |
|||
useExisting: forwardRef(() => UpdateAttributeGeneralSettingsComponent), |
|||
multi: true |
|||
}, |
|||
{ |
|||
provide: NG_VALIDATORS, |
|||
useExisting: forwardRef(() => UpdateAttributeGeneralSettingsComponent), |
|||
multi: true |
|||
} |
|||
] |
|||
}) |
|||
export class UpdateAttributeGeneralSettingsComponent extends PageComponent implements OnInit, ControlValueAccessor, Validator { |
|||
|
|||
@Input() |
|||
disabled: boolean; |
|||
|
|||
@Input() |
|||
hasLabelValue = true; |
|||
|
|||
private modelValue: UpdateAttributeGeneralSettings; |
|||
|
|||
private propagateChange = null; |
|||
|
|||
public updateAttributeGeneralSettingsFormGroup: FormGroup; |
|||
|
|||
constructor(protected store: Store<AppState>, |
|||
private translate: TranslateService, |
|||
private fb: FormBuilder) { |
|||
super(store); |
|||
} |
|||
|
|||
ngOnInit(): void { |
|||
this.updateAttributeGeneralSettingsFormGroup = this.fb.group({ |
|||
widgetTitle: ['', []], |
|||
showLabel: [true, []], |
|||
isRequired: [true, []], |
|||
requiredErrorMessage: ['', []], |
|||
showResultMessage: [true, []] |
|||
}); |
|||
if (this.hasLabelValue) { |
|||
this.updateAttributeGeneralSettingsFormGroup.addControl('labelValue', this.fb.control('', [])); |
|||
this.updateAttributeGeneralSettingsFormGroup.get('showLabel').valueChanges.subscribe(() => { |
|||
this.updateValidators(true); |
|||
}); |
|||
} |
|||
this.updateAttributeGeneralSettingsFormGroup.get('isRequired').valueChanges.subscribe(() => { |
|||
this.updateValidators(true); |
|||
}); |
|||
this.updateAttributeGeneralSettingsFormGroup.valueChanges.subscribe(() => { |
|||
this.updateModel(); |
|||
}); |
|||
this.updateValidators(false); |
|||
} |
|||
|
|||
registerOnChange(fn: any): void { |
|||
this.propagateChange = fn; |
|||
} |
|||
|
|||
registerOnTouched(fn: any): void { |
|||
} |
|||
|
|||
setDisabledState(isDisabled: boolean): void { |
|||
this.disabled = isDisabled; |
|||
if (isDisabled) { |
|||
this.updateAttributeGeneralSettingsFormGroup.disable({emitEvent: false}); |
|||
} else { |
|||
this.updateAttributeGeneralSettingsFormGroup.enable({emitEvent: false}); |
|||
} |
|||
} |
|||
|
|||
writeValue(value: UpdateAttributeGeneralSettings): void { |
|||
this.modelValue = value; |
|||
this.updateAttributeGeneralSettingsFormGroup.patchValue( |
|||
value, {emitEvent: false} |
|||
); |
|||
this.updateValidators(false); |
|||
} |
|||
|
|||
public validate(c: FormControl) { |
|||
return this.updateAttributeGeneralSettingsFormGroup.valid ? null : { |
|||
updateAttributeGeneralSettings: { |
|||
valid: false, |
|||
}, |
|||
}; |
|||
} |
|||
|
|||
private updateModel() { |
|||
const value: UpdateAttributeGeneralSettings = this.updateAttributeGeneralSettingsFormGroup.value; |
|||
this.modelValue = value; |
|||
this.propagateChange(this.modelValue); |
|||
} |
|||
|
|||
private updateValidators(emitEvent?: boolean): void { |
|||
if (this.hasLabelValue) { |
|||
const showLabel: boolean = this.updateAttributeGeneralSettingsFormGroup.get('showLabel').value; |
|||
if (showLabel) { |
|||
this.updateAttributeGeneralSettingsFormGroup.get('labelValue').enable({emitEvent}); |
|||
} else { |
|||
this.updateAttributeGeneralSettingsFormGroup.get('labelValue').disable({emitEvent}); |
|||
} |
|||
this.updateAttributeGeneralSettingsFormGroup.get('labelValue').updateValueAndValidity({emitEvent: false}); |
|||
} |
|||
|
|||
const isRequired: boolean = this.updateAttributeGeneralSettingsFormGroup.get('isRequired').value; |
|||
if (isRequired) { |
|||
this.updateAttributeGeneralSettingsFormGroup.get('requiredErrorMessage').enable({emitEvent}); |
|||
} else { |
|||
this.updateAttributeGeneralSettingsFormGroup.get('requiredErrorMessage').disable({emitEvent}); |
|||
} |
|||
this.updateAttributeGeneralSettingsFormGroup.get('requiredErrorMessage').updateValueAndValidity({emitEvent: false}); |
|||
} |
|||
} |
|||
@ -0,0 +1,42 @@ |
|||
<!-- |
|||
|
|||
Copyright © 2016-2022 The Thingsboard Authors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
--> |
|||
<section class="tb-widget-settings" [formGroup]="updateBooleanAttributeWidgetSettingsForm"> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.general-settings</legend> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.widget-title</mat-label> |
|||
<input matInput formControlName="widgetTitle"> |
|||
</mat-form-field> |
|||
<mat-slide-toggle formControlName="showResultMessage" class="slide-block"> |
|||
{{ 'widgets.input-widgets.show-result-message' | translate }} |
|||
</mat-slide-toggle> |
|||
</fieldset> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.checkbox-settings</legend> |
|||
<section fxLayout="row" fxLayoutGap="8px" fxLayoutAlign="start center"> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.true-label</mat-label> |
|||
<input matInput formControlName="trueValue"> |
|||
</mat-form-field> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.false-label</mat-label> |
|||
<input matInput formControlName="falseValue"> |
|||
</mat-form-field> |
|||
</section> |
|||
</fieldset> |
|||
</section> |
|||
@ -0,0 +1,58 @@ |
|||
///
|
|||
/// Copyright © 2016-2022 The Thingsboard Authors
|
|||
///
|
|||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|||
/// you may not use this file except in compliance with the License.
|
|||
/// You may obtain a copy of the License at
|
|||
///
|
|||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|||
///
|
|||
/// Unless required by applicable law or agreed to in writing, software
|
|||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
/// See the License for the specific language governing permissions and
|
|||
/// limitations under the License.
|
|||
///
|
|||
|
|||
import { Component } from '@angular/core'; |
|||
import { WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models'; |
|||
import { FormBuilder, FormGroup } from '@angular/forms'; |
|||
import { Store } from '@ngrx/store'; |
|||
import { AppState } from '@core/core.state'; |
|||
|
|||
@Component({ |
|||
selector: 'tb-update-boolean-attribute-widget-settings', |
|||
templateUrl: './update-boolean-attribute-widget-settings.component.html', |
|||
styleUrls: ['./../widget-settings.scss'] |
|||
}) |
|||
export class UpdateBooleanAttributeWidgetSettingsComponent extends WidgetSettingsComponent { |
|||
|
|||
updateBooleanAttributeWidgetSettingsForm: FormGroup; |
|||
|
|||
constructor(protected store: Store<AppState>, |
|||
private fb: FormBuilder) { |
|||
super(store); |
|||
} |
|||
|
|||
protected settingsForm(): FormGroup { |
|||
return this.updateBooleanAttributeWidgetSettingsForm; |
|||
} |
|||
|
|||
protected defaultSettings(): WidgetSettings { |
|||
return { |
|||
widgetTitle: '', |
|||
showResultMessage: true, |
|||
trueValue: '', |
|||
falseValue: '' |
|||
}; |
|||
} |
|||
|
|||
protected onSettingsSet(settings: WidgetSettings) { |
|||
this.updateBooleanAttributeWidgetSettingsForm = this.fb.group({ |
|||
widgetTitle: [settings.widgetTitle, []], |
|||
showResultMessage: [settings.showResultMessage, []], |
|||
trueValue: [settings.trueValue, []], |
|||
falseValue: [settings.falseValue, []] |
|||
}); |
|||
} |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
<!-- |
|||
|
|||
Copyright © 2016-2022 The Thingsboard Authors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
--> |
|||
|
|||
<section class="tb-widget-settings" [formGroup]="updateDateAttributeWidgetSettingsForm" fxLayout="column"> |
|||
<tb-update-attribute-general-settings |
|||
[hasLabelValue]="false" |
|||
formControlName="updateAttributeGeneralSettings"> |
|||
</tb-update-attribute-general-settings> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.datetime-field-settings</legend> |
|||
<mat-slide-toggle formControlName="showTimeInput" class="slide-block"> |
|||
{{ 'widgets.input-widgets.display-time-input' | translate }} |
|||
</mat-slide-toggle> |
|||
</fieldset> |
|||
</section> |
|||
@ -0,0 +1,73 @@ |
|||
///
|
|||
/// Copyright © 2016-2022 The Thingsboard Authors
|
|||
///
|
|||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|||
/// you may not use this file except in compliance with the License.
|
|||
/// You may obtain a copy of the License at
|
|||
///
|
|||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|||
///
|
|||
/// Unless required by applicable law or agreed to in writing, software
|
|||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
/// See the License for the specific language governing permissions and
|
|||
/// limitations under the License.
|
|||
///
|
|||
|
|||
import { Component } from '@angular/core'; |
|||
import { WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models'; |
|||
import { FormBuilder, FormGroup } from '@angular/forms'; |
|||
import { Store } from '@ngrx/store'; |
|||
import { AppState } from '@core/core.state'; |
|||
import { deepClone } from '@core/utils'; |
|||
import { |
|||
updateAttributeGeneralDefaultSettings |
|||
} from '@home/components/widget/lib/settings/input/update-attribute-general-settings.component'; |
|||
|
|||
@Component({ |
|||
selector: 'tb-update-date-attribute-widget-settings', |
|||
templateUrl: './update-date-attribute-widget-settings.component.html', |
|||
styleUrls: ['./../widget-settings.scss'] |
|||
}) |
|||
export class UpdateDateAttributeWidgetSettingsComponent extends WidgetSettingsComponent { |
|||
|
|||
updateDateAttributeWidgetSettingsForm: FormGroup; |
|||
|
|||
constructor(protected store: Store<AppState>, |
|||
private fb: FormBuilder) { |
|||
super(store); |
|||
} |
|||
|
|||
protected settingsForm(): FormGroup { |
|||
return this.updateDateAttributeWidgetSettingsForm; |
|||
} |
|||
|
|||
protected defaultSettings(): WidgetSettings { |
|||
return { |
|||
...updateAttributeGeneralDefaultSettings(false), |
|||
showTimeInput: true |
|||
}; |
|||
} |
|||
|
|||
protected onSettingsSet(settings: WidgetSettings) { |
|||
this.updateDateAttributeWidgetSettingsForm = this.fb.group({ |
|||
updateAttributeGeneralSettings: [settings.updateAttributeGeneralSettings, []], |
|||
showTimeInput: [settings.showTimeInput, []] |
|||
}); |
|||
} |
|||
|
|||
protected prepareInputSettings(settings: WidgetSettings): WidgetSettings { |
|||
const updateAttributeGeneralSettings = deepClone(settings, ['showTimeInput']); |
|||
return { |
|||
updateAttributeGeneralSettings, |
|||
showTimeInput: settings.showTimeInput |
|||
}; |
|||
} |
|||
|
|||
protected prepareOutputSettings(settings: any): WidgetSettings { |
|||
return { |
|||
...settings.updateAttributeGeneralSettings, |
|||
showTimeInput: settings.showTimeInput |
|||
}; |
|||
} |
|||
} |
|||
@ -0,0 +1,36 @@ |
|||
<!-- |
|||
|
|||
Copyright © 2016-2022 The Thingsboard Authors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
--> |
|||
|
|||
<section class="tb-widget-settings" [formGroup]="updateDoubleAttributeWidgetSettingsForm" fxLayout="column"> |
|||
<tb-update-attribute-general-settings |
|||
formControlName="updateAttributeGeneralSettings"> |
|||
</tb-update-attribute-general-settings> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.double-field-settings</legend> |
|||
<section fxLayout="row" fxLayoutGap="8px" fxLayoutAlign="start center"> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.min-value</mat-label> |
|||
<input matInput type="number" step="any" formControlName="minValue"> |
|||
</mat-form-field> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.max-value</mat-label> |
|||
<input matInput type="number" step="any" formControlName="maxValue"> |
|||
</mat-form-field> |
|||
</section> |
|||
</fieldset> |
|||
</section> |
|||
@ -0,0 +1,77 @@ |
|||
///
|
|||
/// Copyright © 2016-2022 The Thingsboard Authors
|
|||
///
|
|||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|||
/// you may not use this file except in compliance with the License.
|
|||
/// You may obtain a copy of the License at
|
|||
///
|
|||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|||
///
|
|||
/// Unless required by applicable law or agreed to in writing, software
|
|||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
/// See the License for the specific language governing permissions and
|
|||
/// limitations under the License.
|
|||
///
|
|||
|
|||
import { Component } from '@angular/core'; |
|||
import { WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models'; |
|||
import { FormBuilder, FormGroup } from '@angular/forms'; |
|||
import { Store } from '@ngrx/store'; |
|||
import { AppState } from '@core/core.state'; |
|||
import { deepClone } from '@core/utils'; |
|||
import { |
|||
updateAttributeGeneralDefaultSettings |
|||
} from '@home/components/widget/lib/settings/input/update-attribute-general-settings.component'; |
|||
|
|||
@Component({ |
|||
selector: 'tb-update-double-attribute-widget-settings', |
|||
templateUrl: './update-double-attribute-widget-settings.component.html', |
|||
styleUrls: ['./../widget-settings.scss'] |
|||
}) |
|||
export class UpdateDoubleAttributeWidgetSettingsComponent extends WidgetSettingsComponent { |
|||
|
|||
updateDoubleAttributeWidgetSettingsForm: FormGroup; |
|||
|
|||
constructor(protected store: Store<AppState>, |
|||
private fb: FormBuilder) { |
|||
super(store); |
|||
} |
|||
|
|||
protected settingsForm(): FormGroup { |
|||
return this.updateDoubleAttributeWidgetSettingsForm; |
|||
} |
|||
|
|||
protected defaultSettings(): WidgetSettings { |
|||
return { |
|||
...updateAttributeGeneralDefaultSettings(), |
|||
minValue: null, |
|||
maxValue: null |
|||
}; |
|||
} |
|||
|
|||
protected onSettingsSet(settings: WidgetSettings) { |
|||
this.updateDoubleAttributeWidgetSettingsForm = this.fb.group({ |
|||
updateAttributeGeneralSettings: [settings.updateAttributeGeneralSettings, []], |
|||
minValue: [settings.minValue, []], |
|||
maxValue: [settings.maxValue, []] |
|||
}); |
|||
} |
|||
|
|||
protected prepareInputSettings(settings: WidgetSettings): WidgetSettings { |
|||
const updateAttributeGeneralSettings = deepClone(settings, ['minValue', 'maxValue']); |
|||
return { |
|||
updateAttributeGeneralSettings, |
|||
minValue: settings.minValue, |
|||
maxValue: settings.maxValue |
|||
}; |
|||
} |
|||
|
|||
protected prepareOutputSettings(settings: any): WidgetSettings { |
|||
return { |
|||
...settings.updateAttributeGeneralSettings, |
|||
minValue: settings.minValue, |
|||
maxValue: settings.maxValue |
|||
}; |
|||
} |
|||
} |
|||
@ -0,0 +1,46 @@ |
|||
<!-- |
|||
|
|||
Copyright © 2016-2022 The Thingsboard Authors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
--> |
|||
<section class="tb-widget-settings" [formGroup]="updateImageAttributeWidgetSettingsForm"> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.general-settings</legend> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.widget-title</mat-label> |
|||
<input matInput formControlName="widgetTitle"> |
|||
</mat-form-field> |
|||
<mat-slide-toggle formControlName="showResultMessage" class="slide-block"> |
|||
{{ 'widgets.input-widgets.show-result-message' | translate }} |
|||
</mat-slide-toggle> |
|||
</fieldset> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.image-input-settings</legend> |
|||
<section fxLayout="column"> |
|||
<mat-slide-toggle formControlName="displayPreview" class="slide-block"> |
|||
{{ 'widgets.input-widgets.display-preview' | translate }} |
|||
</mat-slide-toggle> |
|||
<mat-slide-toggle formControlName="displayClearButton" class="slide-block"> |
|||
{{ 'widgets.input-widgets.display-clear-button' | translate }} |
|||
</mat-slide-toggle> |
|||
<mat-slide-toggle formControlName="displayApplyButton" class="slide-block"> |
|||
{{ 'widgets.input-widgets.display-apply-button' | translate }} |
|||
</mat-slide-toggle> |
|||
<mat-slide-toggle formControlName="displayDiscardButton" class="slide-block"> |
|||
{{ 'widgets.input-widgets.display-discard-button' | translate }} |
|||
</mat-slide-toggle> |
|||
</section> |
|||
</fieldset> |
|||
</section> |
|||
@ -0,0 +1,62 @@ |
|||
///
|
|||
/// Copyright © 2016-2022 The Thingsboard Authors
|
|||
///
|
|||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|||
/// you may not use this file except in compliance with the License.
|
|||
/// You may obtain a copy of the License at
|
|||
///
|
|||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|||
///
|
|||
/// Unless required by applicable law or agreed to in writing, software
|
|||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
/// See the License for the specific language governing permissions and
|
|||
/// limitations under the License.
|
|||
///
|
|||
|
|||
import { Component } from '@angular/core'; |
|||
import { WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models'; |
|||
import { FormBuilder, FormGroup } from '@angular/forms'; |
|||
import { Store } from '@ngrx/store'; |
|||
import { AppState } from '@core/core.state'; |
|||
|
|||
@Component({ |
|||
selector: 'tb-update-image-attribute-widget-settings', |
|||
templateUrl: './update-image-attribute-widget-settings.component.html', |
|||
styleUrls: ['./../widget-settings.scss'] |
|||
}) |
|||
export class UpdateImageAttributeWidgetSettingsComponent extends WidgetSettingsComponent { |
|||
|
|||
updateImageAttributeWidgetSettingsForm: FormGroup; |
|||
|
|||
constructor(protected store: Store<AppState>, |
|||
private fb: FormBuilder) { |
|||
super(store); |
|||
} |
|||
|
|||
protected settingsForm(): FormGroup { |
|||
return this.updateImageAttributeWidgetSettingsForm; |
|||
} |
|||
|
|||
protected defaultSettings(): WidgetSettings { |
|||
return { |
|||
widgetTitle: '', |
|||
showResultMessage: true, |
|||
displayPreview: true, |
|||
displayClearButton: false, |
|||
displayApplyButton: true, |
|||
displayDiscardButton: true |
|||
}; |
|||
} |
|||
|
|||
protected onSettingsSet(settings: WidgetSettings) { |
|||
this.updateImageAttributeWidgetSettingsForm = this.fb.group({ |
|||
widgetTitle: [settings.widgetTitle, []], |
|||
showResultMessage: [settings.showResultMessage, []], |
|||
displayPreview: [settings.displayPreview, []], |
|||
displayClearButton: [settings.displayClearButton, []], |
|||
displayApplyButton: [settings.displayApplyButton, []], |
|||
displayDiscardButton: [settings.displayDiscardButton, []] |
|||
}); |
|||
} |
|||
} |
|||
@ -0,0 +1,36 @@ |
|||
<!-- |
|||
|
|||
Copyright © 2016-2022 The Thingsboard Authors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
--> |
|||
|
|||
<section class="tb-widget-settings" [formGroup]="updateIntegerAttributeWidgetSettingsForm" fxLayout="column"> |
|||
<tb-update-attribute-general-settings |
|||
formControlName="updateAttributeGeneralSettings"> |
|||
</tb-update-attribute-general-settings> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.integer-field-settings</legend> |
|||
<section fxLayout="row" fxLayoutGap="8px" fxLayoutAlign="start center"> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.min-value</mat-label> |
|||
<input matInput type="number" step="1" formControlName="minValue"> |
|||
</mat-form-field> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.max-value</mat-label> |
|||
<input matInput type="number" step="1" formControlName="maxValue"> |
|||
</mat-form-field> |
|||
</section> |
|||
</fieldset> |
|||
</section> |
|||
@ -0,0 +1,77 @@ |
|||
///
|
|||
/// Copyright © 2016-2022 The Thingsboard Authors
|
|||
///
|
|||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|||
/// you may not use this file except in compliance with the License.
|
|||
/// You may obtain a copy of the License at
|
|||
///
|
|||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|||
///
|
|||
/// Unless required by applicable law or agreed to in writing, software
|
|||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
/// See the License for the specific language governing permissions and
|
|||
/// limitations under the License.
|
|||
///
|
|||
|
|||
import { Component } from '@angular/core'; |
|||
import { WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models'; |
|||
import { FormBuilder, FormGroup } from '@angular/forms'; |
|||
import { Store } from '@ngrx/store'; |
|||
import { AppState } from '@core/core.state'; |
|||
import { deepClone } from '@core/utils'; |
|||
import { |
|||
updateAttributeGeneralDefaultSettings |
|||
} from '@home/components/widget/lib/settings/input/update-attribute-general-settings.component'; |
|||
|
|||
@Component({ |
|||
selector: 'tb-update-integer-attribute-widget-settings', |
|||
templateUrl: './update-integer-attribute-widget-settings.component.html', |
|||
styleUrls: ['./../widget-settings.scss'] |
|||
}) |
|||
export class UpdateIntegerAttributeWidgetSettingsComponent extends WidgetSettingsComponent { |
|||
|
|||
updateIntegerAttributeWidgetSettingsForm: FormGroup; |
|||
|
|||
constructor(protected store: Store<AppState>, |
|||
private fb: FormBuilder) { |
|||
super(store); |
|||
} |
|||
|
|||
protected settingsForm(): FormGroup { |
|||
return this.updateIntegerAttributeWidgetSettingsForm; |
|||
} |
|||
|
|||
protected defaultSettings(): WidgetSettings { |
|||
return { |
|||
...updateAttributeGeneralDefaultSettings(), |
|||
minValue: null, |
|||
maxValue: null, |
|||
}; |
|||
} |
|||
|
|||
protected onSettingsSet(settings: WidgetSettings) { |
|||
this.updateIntegerAttributeWidgetSettingsForm = this.fb.group({ |
|||
updateAttributeGeneralSettings: [settings.updateAttributeGeneralSettings, []], |
|||
minValue: [settings.minValue, []], |
|||
maxValue: [settings.maxValue, []] |
|||
}); |
|||
} |
|||
|
|||
protected prepareInputSettings(settings: WidgetSettings): WidgetSettings { |
|||
const updateAttributeGeneralSettings = deepClone(settings, ['minValue', 'maxValue']); |
|||
return { |
|||
updateAttributeGeneralSettings, |
|||
minValue: settings.minValue, |
|||
maxValue: settings.maxValue |
|||
}; |
|||
} |
|||
|
|||
protected prepareOutputSettings(settings: any): WidgetSettings { |
|||
return { |
|||
...settings.updateAttributeGeneralSettings, |
|||
minValue: settings.minValue, |
|||
maxValue: settings.maxValue |
|||
}; |
|||
} |
|||
} |
|||
@ -0,0 +1,68 @@ |
|||
<!-- |
|||
|
|||
Copyright © 2016-2022 The Thingsboard Authors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
--> |
|||
<section class="tb-widget-settings" [formGroup]="updateJsonAttributeWidgetSettingsForm"> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.general-settings</legend> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.widget-title</mat-label> |
|||
<input matInput formControlName="widgetTitle"> |
|||
</mat-form-field> |
|||
<section fxLayout="column" fxLayout.gt-sm="row" fxLayoutGap="8px" fxLayoutAlign.gt-sm="start center"> |
|||
<mat-slide-toggle fxFlex fxFlex.gt-sm="20" formControlName="showLabel"> |
|||
{{ 'widgets.input-widgets.show-label' | translate }} |
|||
</mat-slide-toggle> |
|||
<mat-form-field fxFlex fxFlex.gt-sm="80" class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.label</mat-label> |
|||
<input matInput formControlName="labelValue"> |
|||
</mat-form-field> |
|||
</section> |
|||
<mat-slide-toggle formControlName="showResultMessage" class="slide-block"> |
|||
{{ 'widgets.input-widgets.show-result-message' | translate }} |
|||
</mat-slide-toggle> |
|||
</fieldset> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.attribute-settings</legend> |
|||
<section fxLayout="column" fxLayout.gt-sm="row" fxLayoutGap="8px" fxLayoutAlign.gt-sm="start center"> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.widget-mode</mat-label> |
|||
<mat-select formControlName="widgetMode"> |
|||
<mat-option [value]="'ATTRIBUTE'"> |
|||
{{ 'widgets.input-widgets.widget-mode-update-attribute' | translate }} |
|||
</mat-option> |
|||
<mat-option [value]="'TIME_SERIES'"> |
|||
{{ 'widgets.input-widgets.widget-mode-update-timeseries' | translate }} |
|||
</mat-option> |
|||
</mat-select> |
|||
</mat-form-field> |
|||
<mat-form-field [fxShow]="updateJsonAttributeWidgetSettingsForm.get('widgetMode').value === 'ATTRIBUTE'" fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.attribute-scope</mat-label> |
|||
<mat-select formControlName="attributeScope"> |
|||
<mat-option [value]="'SERVER_SCOPE'"> |
|||
{{ 'widgets.input-widgets.attribute-scope-server' | translate }} |
|||
</mat-option> |
|||
<mat-option [value]="'SHARED_SCOPE'"> |
|||
{{ 'widgets.input-widgets.attribute-scope-shared' | translate }} |
|||
</mat-option> |
|||
</mat-select> |
|||
</mat-form-field> |
|||
</section> |
|||
<mat-slide-toggle formControlName="attributeRequired" class="slide-block"> |
|||
{{ 'widgets.input-widgets.value-required' | translate }} |
|||
</mat-slide-toggle> |
|||
</fieldset> |
|||
</section> |
|||
@ -0,0 +1,93 @@ |
|||
///
|
|||
/// Copyright © 2016-2022 The Thingsboard Authors
|
|||
///
|
|||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|||
/// you may not use this file except in compliance with the License.
|
|||
/// You may obtain a copy of the License at
|
|||
///
|
|||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|||
///
|
|||
/// Unless required by applicable law or agreed to in writing, software
|
|||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
/// See the License for the specific language governing permissions and
|
|||
/// limitations under the License.
|
|||
///
|
|||
|
|||
import { Component } from '@angular/core'; |
|||
import { WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models'; |
|||
import { FormBuilder, FormGroup } from '@angular/forms'; |
|||
import { Store } from '@ngrx/store'; |
|||
import { AppState } from '@core/core.state'; |
|||
|
|||
@Component({ |
|||
selector: 'tb-update-json-attribute-widget-settings', |
|||
templateUrl: './update-json-attribute-widget-settings.component.html', |
|||
styleUrls: ['./../widget-settings.scss'] |
|||
}) |
|||
export class UpdateJsonAttributeWidgetSettingsComponent extends WidgetSettingsComponent { |
|||
|
|||
updateJsonAttributeWidgetSettingsForm: FormGroup; |
|||
|
|||
constructor(protected store: Store<AppState>, |
|||
private fb: FormBuilder) { |
|||
super(store); |
|||
} |
|||
|
|||
protected settingsForm(): FormGroup { |
|||
return this.updateJsonAttributeWidgetSettingsForm; |
|||
} |
|||
|
|||
protected defaultSettings(): WidgetSettings { |
|||
return { |
|||
widgetTitle: '', |
|||
showLabel: true, |
|||
labelValue: '', |
|||
showResultMessage: true, |
|||
|
|||
widgetMode: 'ATTRIBUTE', |
|||
attributeScope: 'SERVER_SCOPE', |
|||
attributeRequired: true |
|||
}; |
|||
} |
|||
|
|||
protected onSettingsSet(settings: WidgetSettings) { |
|||
this.updateJsonAttributeWidgetSettingsForm = this.fb.group({ |
|||
|
|||
// General settings
|
|||
|
|||
widgetTitle: [settings.widgetTitle, []], |
|||
showLabel: [settings.showLabel, []], |
|||
labelValue: [settings.labelValue, []], |
|||
showResultMessage: [settings.showResultMessage, []], |
|||
|
|||
// Attribute settings
|
|||
|
|||
widgetMode: [settings.widgetMode, []], |
|||
attributeScope: [settings.attributeScope, []], |
|||
attributeRequired: [settings.attributeRequired, []] |
|||
}); |
|||
} |
|||
|
|||
protected validatorTriggers(): string[] { |
|||
return ['showLabel', 'widgetMode']; |
|||
} |
|||
|
|||
protected updateValidators(emitEvent: boolean) { |
|||
const showLabel: boolean = this.updateJsonAttributeWidgetSettingsForm.get('showLabel').value; |
|||
const widgetMode: string = this.updateJsonAttributeWidgetSettingsForm.get('widgetMode').value; |
|||
|
|||
if (showLabel) { |
|||
this.updateJsonAttributeWidgetSettingsForm.get('labelValue').enable(); |
|||
} else { |
|||
this.updateJsonAttributeWidgetSettingsForm.get('labelValue').disable(); |
|||
} |
|||
if (widgetMode === 'ATTRIBUTE') { |
|||
this.updateJsonAttributeWidgetSettingsForm.get('attributeScope').enable(); |
|||
} else { |
|||
this.updateJsonAttributeWidgetSettingsForm.get('attributeScope').disable(); |
|||
} |
|||
this.updateJsonAttributeWidgetSettingsForm.get('labelValue').updateValueAndValidity({emitEvent}); |
|||
this.updateJsonAttributeWidgetSettingsForm.get('attributeScope').updateValueAndValidity({emitEvent}); |
|||
} |
|||
} |
|||
@ -0,0 +1,84 @@ |
|||
<!-- |
|||
|
|||
Copyright © 2016-2022 The Thingsboard Authors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
--> |
|||
<section class="tb-widget-settings" [formGroup]="updateLocationAttributeWidgetSettingsForm"> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.general-settings</legend> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.widget-title</mat-label> |
|||
<input matInput formControlName="widgetTitle"> |
|||
</mat-form-field> |
|||
<mat-slide-toggle formControlName="showResultMessage" class="slide-block"> |
|||
{{ 'widgets.input-widgets.show-result-message' | translate }} |
|||
</mat-slide-toggle> |
|||
<section fxLayout="row" fxLayoutGap="8px" fxLayoutAlign="start center"> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.latitude-key-name</mat-label> |
|||
<input matInput formControlName="latKeyName"> |
|||
</mat-form-field> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.longitude-key-name</mat-label> |
|||
<input matInput formControlName="lngKeyName"> |
|||
</mat-form-field> |
|||
</section> |
|||
<mat-slide-toggle formControlName="showGetLocation" class="slide-block"> |
|||
{{ 'widgets.input-widgets.show-get-location-button' | translate }} |
|||
</mat-slide-toggle> |
|||
<mat-slide-toggle formControlName="enableHighAccuracy" class="slide-block"> |
|||
{{ 'widgets.input-widgets.use-high-accuracy' | translate }} |
|||
</mat-slide-toggle> |
|||
</fieldset> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.location-fields-settings</legend> |
|||
<mat-slide-toggle formControlName="showLabel" class="slide-block"> |
|||
{{ 'widgets.input-widgets.show-label' | translate }} |
|||
</mat-slide-toggle> |
|||
<section fxLayout="row" fxLayoutGap="8px" fxLayoutAlign="start center"> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.latitude-label</mat-label> |
|||
<input matInput formControlName="latLabel"> |
|||
</mat-form-field> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.longitude-label</mat-label> |
|||
<input matInput formControlName="lngLabel"> |
|||
</mat-form-field> |
|||
</section> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.input-fields-alignment</mat-label> |
|||
<mat-select formControlName="inputFieldsAlignment"> |
|||
<mat-option [value]="'column'"> |
|||
{{ 'widgets.input-widgets.input-fields-alignment-column' | translate }} |
|||
</mat-option> |
|||
<mat-option [value]="'row'"> |
|||
{{ 'widgets.input-widgets.input-fields-alignment-row' | translate }} |
|||
</mat-option> |
|||
</mat-select> |
|||
</mat-form-field> |
|||
<section fxLayout="row" fxLayoutGap="8px" fxLayoutAlign="start center"> |
|||
<mat-slide-toggle fxFlex formControlName="isLatRequired"> |
|||
{{ 'widgets.input-widgets.latitude-field-required' | translate }} |
|||
</mat-slide-toggle> |
|||
<mat-slide-toggle fxFlex formControlName="isLngRequired"> |
|||
{{ 'widgets.input-widgets.longitude-field-required' | translate }} |
|||
</mat-slide-toggle> |
|||
</section> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.required-error-message</mat-label> |
|||
<input matInput formControlName="requiredErrorMessage"> |
|||
</mat-form-field> |
|||
</fieldset> |
|||
</section> |
|||
@ -0,0 +1,109 @@ |
|||
///
|
|||
/// Copyright © 2016-2022 The Thingsboard Authors
|
|||
///
|
|||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|||
/// you may not use this file except in compliance with the License.
|
|||
/// You may obtain a copy of the License at
|
|||
///
|
|||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|||
///
|
|||
/// Unless required by applicable law or agreed to in writing, software
|
|||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
/// See the License for the specific language governing permissions and
|
|||
/// limitations under the License.
|
|||
///
|
|||
|
|||
import { Component } from '@angular/core'; |
|||
import { WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models'; |
|||
import { FormBuilder, FormGroup } from '@angular/forms'; |
|||
import { Store } from '@ngrx/store'; |
|||
import { AppState } from '@core/core.state'; |
|||
|
|||
@Component({ |
|||
selector: 'tb-update-location-attribute-widget-settings', |
|||
templateUrl: './update-location-attribute-widget-settings.component.html', |
|||
styleUrls: ['./../widget-settings.scss'] |
|||
}) |
|||
export class UpdateLocationAttributeWidgetSettingsComponent extends WidgetSettingsComponent { |
|||
|
|||
updateLocationAttributeWidgetSettingsForm: FormGroup; |
|||
|
|||
constructor(protected store: Store<AppState>, |
|||
private fb: FormBuilder) { |
|||
super(store); |
|||
} |
|||
|
|||
protected settingsForm(): FormGroup { |
|||
return this.updateLocationAttributeWidgetSettingsForm; |
|||
} |
|||
|
|||
protected defaultSettings(): WidgetSettings { |
|||
return { |
|||
widgetTitle: '', |
|||
showResultMessage: true, |
|||
latKeyName: 'latitude', |
|||
lngKeyName: 'longitude', |
|||
showGetLocation: true, |
|||
enableHighAccuracy: false, |
|||
|
|||
showLabel: true, |
|||
latLabel: '', |
|||
lngLabel: '', |
|||
inputFieldsAlignment: 'column', |
|||
isLatRequired: true, |
|||
isLngRequired: true, |
|||
requiredErrorMessage: '' |
|||
}; |
|||
} |
|||
|
|||
protected onSettingsSet(settings: WidgetSettings) { |
|||
this.updateLocationAttributeWidgetSettingsForm = this.fb.group({ |
|||
|
|||
// General settings
|
|||
|
|||
widgetTitle: [settings.widgetTitle, []], |
|||
showResultMessage: [settings.showResultMessage, []], |
|||
latKeyName: [settings.latKeyName, []], |
|||
lngKeyName: [settings.lngKeyName, []], |
|||
showGetLocation: [settings.showGetLocation, []], |
|||
enableHighAccuracy: [settings.enableHighAccuracy, []], |
|||
|
|||
// Location fields settings
|
|||
|
|||
showLabel: [settings.showLabel, []], |
|||
latLabel: [settings.latLabel, []], |
|||
lngLabel: [settings.lngLabel, []], |
|||
inputFieldsAlignment: [settings.inputFieldsAlignment, []], |
|||
isLatRequired: [settings.isLatRequired, []], |
|||
isLngRequired: [settings.isLngRequired, []], |
|||
requiredErrorMessage: [settings.requiredErrorMessage, []] |
|||
}); |
|||
} |
|||
|
|||
protected validatorTriggers(): string[] { |
|||
return ['showLabel', 'isLatRequired', 'isLngRequired']; |
|||
} |
|||
|
|||
protected updateValidators(emitEvent: boolean) { |
|||
const showLabel: boolean = this.updateLocationAttributeWidgetSettingsForm.get('showLabel').value; |
|||
const isLatRequired: boolean = this.updateLocationAttributeWidgetSettingsForm.get('isLatRequired').value; |
|||
const isLngRequired: boolean = this.updateLocationAttributeWidgetSettingsForm.get('isLngRequired').value; |
|||
|
|||
if (showLabel) { |
|||
this.updateLocationAttributeWidgetSettingsForm.get('latLabel').enable(); |
|||
this.updateLocationAttributeWidgetSettingsForm.get('lngLabel').enable(); |
|||
} else { |
|||
this.updateLocationAttributeWidgetSettingsForm.get('latLabel').disable(); |
|||
this.updateLocationAttributeWidgetSettingsForm.get('lngLabel').disable(); |
|||
} |
|||
if (isLatRequired || isLngRequired) { |
|||
this.updateLocationAttributeWidgetSettingsForm.get('requiredErrorMessage').enable(); |
|||
} else { |
|||
this.updateLocationAttributeWidgetSettingsForm.get('requiredErrorMessage').disable(); |
|||
} |
|||
this.updateLocationAttributeWidgetSettingsForm.get('latLabel').updateValueAndValidity({emitEvent}); |
|||
this.updateLocationAttributeWidgetSettingsForm.get('lngLabel').updateValueAndValidity({emitEvent}); |
|||
this.updateLocationAttributeWidgetSettingsForm.get('requiredErrorMessage').updateValueAndValidity({emitEvent}); |
|||
} |
|||
} |
|||
@ -0,0 +1,36 @@ |
|||
<!-- |
|||
|
|||
Copyright © 2016-2022 The Thingsboard Authors |
|||
|
|||
Licensed under the Apache License, Version 2.0 (the "License"); |
|||
you may not use this file except in compliance with the License. |
|||
You may obtain a copy of the License at |
|||
|
|||
http://www.apache.org/licenses/LICENSE-2.0 |
|||
|
|||
Unless required by applicable law or agreed to in writing, software |
|||
distributed under the License is distributed on an "AS IS" BASIS, |
|||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|||
See the License for the specific language governing permissions and |
|||
limitations under the License. |
|||
|
|||
--> |
|||
|
|||
<section class="tb-widget-settings" [formGroup]="updateStringAttributeWidgetSettingsForm" fxLayout="column"> |
|||
<tb-update-attribute-general-settings |
|||
formControlName="updateAttributeGeneralSettings"> |
|||
</tb-update-attribute-general-settings> |
|||
<fieldset class="fields-group"> |
|||
<legend class="group-title" translate>widgets.input-widgets.text-field-settings</legend> |
|||
<section fxLayout="row" fxLayoutGap="8px" fxLayoutAlign="start center"> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.min-length</mat-label> |
|||
<input matInput type="number" step="1" min="0" formControlName="minLength"> |
|||
</mat-form-field> |
|||
<mat-form-field fxFlex class="mat-block"> |
|||
<mat-label translate>widgets.input-widgets.max-length</mat-label> |
|||
<input matInput type="number" step="1" min="1" formControlName="maxLength"> |
|||
</mat-form-field> |
|||
</section> |
|||
</fieldset> |
|||
</section> |
|||
@ -0,0 +1,77 @@ |
|||
///
|
|||
/// Copyright © 2016-2022 The Thingsboard Authors
|
|||
///
|
|||
/// Licensed under the Apache License, Version 2.0 (the "License");
|
|||
/// you may not use this file except in compliance with the License.
|
|||
/// You may obtain a copy of the License at
|
|||
///
|
|||
/// http://www.apache.org/licenses/LICENSE-2.0
|
|||
///
|
|||
/// Unless required by applicable law or agreed to in writing, software
|
|||
/// distributed under the License is distributed on an "AS IS" BASIS,
|
|||
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||
/// See the License for the specific language governing permissions and
|
|||
/// limitations under the License.
|
|||
///
|
|||
|
|||
import { Component } from '@angular/core'; |
|||
import { WidgetSettings, WidgetSettingsComponent } from '@shared/models/widget.models'; |
|||
import { FormBuilder, FormGroup, Validators } from '@angular/forms'; |
|||
import { Store } from '@ngrx/store'; |
|||
import { AppState } from '@core/core.state'; |
|||
import { deepClone } from '@core/utils'; |
|||
import { |
|||
updateAttributeGeneralDefaultSettings |
|||
} from '@home/components/widget/lib/settings/input/update-attribute-general-settings.component'; |
|||
|
|||
@Component({ |
|||
selector: 'tb-update-string-attribute-widget-settings', |
|||
templateUrl: './update-string-attribute-widget-settings.component.html', |
|||
styleUrls: ['./../widget-settings.scss'] |
|||
}) |
|||
export class UpdateStringAttributeWidgetSettingsComponent extends WidgetSettingsComponent { |
|||
|
|||
updateStringAttributeWidgetSettingsForm: FormGroup; |
|||
|
|||
constructor(protected store: Store<AppState>, |
|||
private fb: FormBuilder) { |
|||
super(store); |
|||
} |
|||
|
|||
protected settingsForm(): FormGroup { |
|||
return this.updateStringAttributeWidgetSettingsForm; |
|||
} |
|||
|
|||
protected defaultSettings(): WidgetSettings { |
|||
return { |
|||
...updateAttributeGeneralDefaultSettings(), |
|||
minLength: null, |
|||
maxLength: null, |
|||
}; |
|||
} |
|||
|
|||
protected onSettingsSet(settings: WidgetSettings) { |
|||
this.updateStringAttributeWidgetSettingsForm = this.fb.group({ |
|||
updateAttributeGeneralSettings: [settings.updateAttributeGeneralSettings, []], |
|||
minLength: [settings.minLength, [Validators.min(0)]], |
|||
maxLength: [settings.maxLength, [Validators.min(1)]] |
|||
}); |
|||
} |
|||
|
|||
protected prepareInputSettings(settings: WidgetSettings): WidgetSettings { |
|||
const updateAttributeGeneralSettings = deepClone(settings, ['minLength', 'maxLength']); |
|||
return { |
|||
updateAttributeGeneralSettings, |
|||
minLength: settings.minLength, |
|||
maxLength: settings.maxLength |
|||
}; |
|||
} |
|||
|
|||
protected prepareOutputSettings(settings: any): WidgetSettings { |
|||
return { |
|||
...settings.updateAttributeGeneralSettings, |
|||
minLength: settings.minLength, |
|||
maxLength: settings.maxLength |
|||
}; |
|||
} |
|||
} |
|||
Loading…
Reference in new issue