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