Merge pull request #12150 from vvlladd28/feature/edit-alias/datasource-widgets
Add edit alias from dasource widgets
This commit is contained in:
commit
404ab062a0
@ -31,6 +31,14 @@
|
|||||||
(click)="clear()">
|
(click)="clear()">
|
||||||
<mat-icon class="material-icons">close</mat-icon>
|
<mat-icon class="material-icons">close</mat-icon>
|
||||||
</button>
|
</button>
|
||||||
|
<button *ngIf="selectEntityAliasFormGroup.get('entityAlias').value?.id && !disabled"
|
||||||
|
type="button"
|
||||||
|
matSuffix mat-icon-button aria-label="Edit"
|
||||||
|
matTooltip="{{ 'device-profile.edit' | translate }}"
|
||||||
|
matTooltipPosition="above"
|
||||||
|
(click)="editEntityAlias($event)">
|
||||||
|
<mat-icon class="material-icons">edit</mat-icon>
|
||||||
|
</button>
|
||||||
<button *ngIf="!selectEntityAliasFormGroup.get('entityAlias').value && !disabled"
|
<button *ngIf="!selectEntityAliasFormGroup.get('entityAlias').value && !disabled"
|
||||||
style="margin-right: 8px;"
|
style="margin-right: 8px;"
|
||||||
type="button"
|
type="button"
|
||||||
|
|||||||
@ -20,4 +20,5 @@ import { EntityAlias } from '@shared/models/alias.models';
|
|||||||
|
|
||||||
export interface EntityAliasSelectCallbacks {
|
export interface EntityAliasSelectCallbacks {
|
||||||
createEntityAlias: (alias: string, allowedEntityTypes: Array<EntityType>) => Observable<EntityAlias>;
|
createEntityAlias: (alias: string, allowedEntityTypes: Array<EntityType>) => Observable<EntityAlias>;
|
||||||
|
editEntityAlias: (alias: EntityAlias, allowedEntityTypes: Array<EntityType>) => Observable<EntityAlias>;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -14,24 +14,22 @@
|
|||||||
/// limitations under the License.
|
/// limitations under the License.
|
||||||
///
|
///
|
||||||
|
|
||||||
import { AfterViewInit, Component, ElementRef, forwardRef, Input, OnInit, SkipSelf, ViewChild } from '@angular/core';
|
import { Component, ElementRef, forwardRef, Input, OnInit, SkipSelf, ViewChild } from '@angular/core';
|
||||||
import {
|
import {
|
||||||
ControlValueAccessor,
|
ControlValueAccessor,
|
||||||
UntypedFormBuilder,
|
FormBuilder,
|
||||||
UntypedFormControl,
|
FormControl,
|
||||||
UntypedFormGroup,
|
FormGroup,
|
||||||
FormGroupDirective,
|
FormGroupDirective,
|
||||||
NG_VALUE_ACCESSOR,
|
NG_VALUE_ACCESSOR,
|
||||||
NgForm
|
NgForm,
|
||||||
} from '@angular/forms';
|
} from '@angular/forms';
|
||||||
import { Observable, of } from 'rxjs';
|
import { Observable, of } from 'rxjs';
|
||||||
import { map, mergeMap, share, tap } from 'rxjs/operators';
|
import { map, mergeMap, share, tap } from 'rxjs/operators';
|
||||||
import { Store } from '@ngrx/store';
|
|
||||||
import { AppState } from '@app/core/core.state';
|
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { EntityType } from '@shared/models/entity-type.models';
|
import { EntityType } from '@shared/models/entity-type.models';
|
||||||
import { EntityService } from '@core/http/entity.service';
|
import { EntityService } from '@core/http/entity.service';
|
||||||
import { coerceBooleanProperty } from '@angular/cdk/coercion';
|
import { coerceBoolean } from '@shared/decorators/coercion';
|
||||||
import { EntityAlias } from '@shared/models/alias.models';
|
import { EntityAlias } from '@shared/models/alias.models';
|
||||||
import { IAliasController } from '@core/api/widget-api.models';
|
import { IAliasController } from '@core/api/widget-api.models';
|
||||||
import { TruncatePipe } from '@shared/pipe/truncate.pipe';
|
import { TruncatePipe } from '@shared/pipe/truncate.pipe';
|
||||||
@ -54,9 +52,9 @@ import { ErrorStateMatcher } from '@angular/material/core';
|
|||||||
useExisting: EntityAliasSelectComponent
|
useExisting: EntityAliasSelectComponent
|
||||||
}*/]
|
}*/]
|
||||||
})
|
})
|
||||||
export class EntityAliasSelectComponent implements ControlValueAccessor, OnInit, AfterViewInit, ErrorStateMatcher {
|
export class EntityAliasSelectComponent implements ControlValueAccessor, OnInit, ErrorStateMatcher {
|
||||||
|
|
||||||
selectEntityAliasFormGroup: UntypedFormGroup;
|
selectEntityAliasFormGroup: FormGroup;
|
||||||
|
|
||||||
modelValue: string | null;
|
modelValue: string | null;
|
||||||
|
|
||||||
@ -75,15 +73,9 @@ export class EntityAliasSelectComponent implements ControlValueAccessor, OnInit,
|
|||||||
@ViewChild('entityAliasAutocomplete') entityAliasAutocomplete: MatAutocomplete;
|
@ViewChild('entityAliasAutocomplete') entityAliasAutocomplete: MatAutocomplete;
|
||||||
@ViewChild('autocomplete', { read: MatAutocompleteTrigger }) autoCompleteTrigger: MatAutocompleteTrigger;
|
@ViewChild('autocomplete', { read: MatAutocompleteTrigger }) autoCompleteTrigger: MatAutocompleteTrigger;
|
||||||
|
|
||||||
|
|
||||||
private requiredValue: boolean;
|
|
||||||
get tbRequired(): boolean {
|
|
||||||
return this.requiredValue;
|
|
||||||
}
|
|
||||||
@Input()
|
@Input()
|
||||||
set tbRequired(value: boolean) {
|
@coerceBoolean()
|
||||||
this.requiredValue = coerceBooleanProperty(value);
|
tbRequired: boolean;
|
||||||
}
|
|
||||||
|
|
||||||
@Input()
|
@Input()
|
||||||
disabled: boolean;
|
disabled: boolean;
|
||||||
@ -98,16 +90,13 @@ export class EntityAliasSelectComponent implements ControlValueAccessor, OnInit,
|
|||||||
|
|
||||||
private dirty = false;
|
private dirty = false;
|
||||||
|
|
||||||
private creatingEntityAlias = false;
|
private propagateChange = (_v: any) => { };
|
||||||
|
|
||||||
private propagateChange = (v: any) => { };
|
constructor(@SkipSelf() private errorStateMatcher: ErrorStateMatcher,
|
||||||
|
|
||||||
constructor(private store: Store<AppState>,
|
|
||||||
@SkipSelf() private errorStateMatcher: ErrorStateMatcher,
|
|
||||||
private entityService: EntityService,
|
private entityService: EntityService,
|
||||||
public translate: TranslateService,
|
public translate: TranslateService,
|
||||||
public truncate: TruncatePipe,
|
public truncate: TruncatePipe,
|
||||||
private fb: UntypedFormBuilder) {
|
private fb: FormBuilder) {
|
||||||
this.selectEntityAliasFormGroup = this.fb.group({
|
this.selectEntityAliasFormGroup = this.fb.group({
|
||||||
entityAlias: [null]
|
entityAlias: [null]
|
||||||
});
|
});
|
||||||
@ -117,7 +106,7 @@ export class EntityAliasSelectComponent implements ControlValueAccessor, OnInit,
|
|||||||
this.propagateChange = fn;
|
this.propagateChange = fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
registerOnTouched(fn: any): void {
|
registerOnTouched(_fn: any): void {
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
@ -134,7 +123,7 @@ export class EntityAliasSelectComponent implements ControlValueAccessor, OnInit,
|
|||||||
this.filteredEntityAliases = this.selectEntityAliasFormGroup.get('entityAlias').valueChanges
|
this.filteredEntityAliases = this.selectEntityAliasFormGroup.get('entityAlias').valueChanges
|
||||||
.pipe(
|
.pipe(
|
||||||
tap(value => {
|
tap(value => {
|
||||||
let modelValue;
|
let modelValue: EntityAlias;
|
||||||
if (typeof value === 'string' || !value) {
|
if (typeof value === 'string' || !value) {
|
||||||
modelValue = null;
|
modelValue = null;
|
||||||
} else {
|
} else {
|
||||||
@ -151,14 +140,12 @@ export class EntityAliasSelectComponent implements ControlValueAccessor, OnInit,
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
isErrorState(control: UntypedFormControl | null, form: FormGroupDirective | NgForm | null): boolean {
|
isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
|
||||||
const originalErrorState = this.errorStateMatcher.isErrorState(control, form);
|
const originalErrorState = this.errorStateMatcher.isErrorState(control, form);
|
||||||
const customErrorState = this.tbRequired && !this.modelValue;
|
const customErrorState = this.tbRequired && !this.modelValue;
|
||||||
return originalErrorState || customErrorState;
|
return originalErrorState || customErrorState;
|
||||||
}
|
}
|
||||||
|
|
||||||
ngAfterViewInit(): void {}
|
|
||||||
|
|
||||||
setDisabledState(isDisabled: boolean): void {
|
setDisabledState(isDisabled: boolean): void {
|
||||||
this.disabled = isDisabled;
|
this.disabled = isDisabled;
|
||||||
if (this.disabled) {
|
if (this.disabled) {
|
||||||
@ -225,7 +212,7 @@ export class EntityAliasSelectComponent implements ControlValueAccessor, OnInit,
|
|||||||
}
|
}
|
||||||
|
|
||||||
textIsNotEmpty(text: string): boolean {
|
textIsNotEmpty(text: string): boolean {
|
||||||
return (text && text != null && text.length > 0) ? true : false;
|
return text?.length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
entityAliasEnter($event: KeyboardEvent) {
|
entityAliasEnter($event: KeyboardEvent) {
|
||||||
@ -237,10 +224,23 @@ export class EntityAliasSelectComponent implements ControlValueAccessor, OnInit,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editEntityAlias($event: Event) {
|
||||||
|
$event.preventDefault();
|
||||||
|
$event.stopPropagation();
|
||||||
|
if (this.callbacks && this.callbacks.editEntityAlias) {
|
||||||
|
this.callbacks.editEntityAlias(this.selectEntityAliasFormGroup.get('entityAlias').value,
|
||||||
|
this.allowedEntityTypes).subscribe((alias) => {
|
||||||
|
if (alias) {
|
||||||
|
this.modelValue = alias.id;
|
||||||
|
this.selectEntityAliasFormGroup.get('entityAlias').patchValue(alias, {emitEvent: true});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
createEntityAlias($event: Event, alias: string, focusOnCancel = true) {
|
createEntityAlias($event: Event, alias: string, focusOnCancel = true) {
|
||||||
$event.preventDefault();
|
$event.preventDefault();
|
||||||
$event.stopPropagation();
|
$event.stopPropagation();
|
||||||
this.creatingEntityAlias = true;
|
|
||||||
if (this.callbacks && this.callbacks.createEntityAlias) {
|
if (this.callbacks && this.callbacks.createEntityAlias) {
|
||||||
this.callbacks.createEntityAlias(alias, this.allowedEntityTypes).subscribe((newAlias) => {
|
this.callbacks.createEntityAlias(alias, this.allowedEntityTypes).subscribe((newAlias) => {
|
||||||
if (!newAlias) {
|
if (!newAlias) {
|
||||||
|
|||||||
@ -136,8 +136,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<ng-template #searchNotEmpty>
|
<ng-template #searchNotEmpty>
|
||||||
<span>
|
<span>
|
||||||
{{ translate.get('entity.no-key-matching',
|
{{ 'entity.no-key-matching' | translate : {key: searchText | truncate: true: 6: '...'} }}
|
||||||
{key: truncate.transform(searchText, true, 6, '...')}) | async }}
|
|
||||||
</span>
|
</span>
|
||||||
<span *ngIf="!isEntityDatasource; else createEntityKey">
|
<span *ngIf="!isEntityDatasource; else createEntityKey">
|
||||||
<a translate (click)="createKey(searchText)">entity.create-new-key</a>
|
<a translate (click)="createKey(searchText)">entity.create-new-key</a>
|
||||||
|
|||||||
@ -16,8 +16,8 @@
|
|||||||
|
|
||||||
import { COMMA, ENTER, SEMICOLON } from '@angular/cdk/keycodes';
|
import { COMMA, ENTER, SEMICOLON } from '@angular/cdk/keycodes';
|
||||||
import {
|
import {
|
||||||
ChangeDetectorRef,
|
|
||||||
Component,
|
Component,
|
||||||
|
DestroyRef,
|
||||||
ElementRef,
|
ElementRef,
|
||||||
forwardRef,
|
forwardRef,
|
||||||
Input,
|
Input,
|
||||||
@ -33,20 +33,18 @@ import {
|
|||||||
import {
|
import {
|
||||||
AbstractControl,
|
AbstractControl,
|
||||||
ControlValueAccessor,
|
ControlValueAccessor,
|
||||||
|
FormBuilder,
|
||||||
|
FormControl,
|
||||||
|
FormGroup,
|
||||||
FormGroupDirective,
|
FormGroupDirective,
|
||||||
NG_VALIDATORS,
|
NG_VALIDATORS,
|
||||||
NG_VALUE_ACCESSOR,
|
NG_VALUE_ACCESSOR,
|
||||||
NgForm,
|
NgForm,
|
||||||
UntypedFormBuilder,
|
|
||||||
UntypedFormControl,
|
|
||||||
UntypedFormGroup,
|
|
||||||
ValidationErrors,
|
ValidationErrors,
|
||||||
Validator
|
Validator
|
||||||
} from '@angular/forms';
|
} from '@angular/forms';
|
||||||
import { Observable, of } from 'rxjs';
|
import { Observable, of, ReplaySubject } from 'rxjs';
|
||||||
import { filter, map, mergeMap, publishReplay, refCount, share, tap } from 'rxjs/operators';
|
import { filter, map, mergeMap, share, tap } from 'rxjs/operators';
|
||||||
import { Store } from '@ngrx/store';
|
|
||||||
import { AppState } from '@app/core/core.state';
|
|
||||||
import { TranslateService } from '@ngx-translate/core';
|
import { TranslateService } from '@ngx-translate/core';
|
||||||
import { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
|
import { MatAutocomplete, MatAutocompleteTrigger } from '@angular/material/autocomplete';
|
||||||
import { MatChipGrid, MatChipInputEvent, MatChipRow } from '@angular/material/chips';
|
import { MatChipGrid, MatChipInputEvent, MatChipRow } from '@angular/material/chips';
|
||||||
@ -58,7 +56,6 @@ import { DataKeySettingsFunction } from './data-keys.component.models';
|
|||||||
import { alarmFields } from '@shared/models/alarm.models';
|
import { alarmFields } from '@shared/models/alarm.models';
|
||||||
import { UtilsService } from '@core/services/utils.service';
|
import { UtilsService } from '@core/services/utils.service';
|
||||||
import { ErrorStateMatcher } from '@angular/material/core';
|
import { ErrorStateMatcher } from '@angular/material/core';
|
||||||
import { TruncatePipe } from '@shared/pipe/truncate.pipe';
|
|
||||||
import { MatDialog } from '@angular/material/dialog';
|
import { MatDialog } from '@angular/material/dialog';
|
||||||
import {
|
import {
|
||||||
DataKeyConfigDialogComponent,
|
DataKeyConfigDialogComponent,
|
||||||
@ -74,6 +71,7 @@ import { DatasourceComponent } from '@home/components/widget/config/datasource.c
|
|||||||
import { ColorPickerPanelComponent } from '@shared/components/color-picker/color-picker-panel.component';
|
import { ColorPickerPanelComponent } from '@shared/components/color-picker/color-picker-panel.component';
|
||||||
import { TbPopoverService } from '@shared/components/popover.service';
|
import { TbPopoverService } from '@shared/components/popover.service';
|
||||||
import { WidgetConfigCallbacks } from '@home/components/widget/config/widget-config.component.models';
|
import { WidgetConfigCallbacks } from '@home/components/widget/config/widget-config.component.models';
|
||||||
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'tb-data-keys',
|
selector: 'tb-data-keys',
|
||||||
@ -115,11 +113,10 @@ export class DataKeysComponent implements ControlValueAccessor, OnInit, OnChange
|
|||||||
return this.datasourceComponent.hideDataKeyDecimals;
|
return this.datasourceComponent.hideDataKeyDecimals;
|
||||||
}
|
}
|
||||||
|
|
||||||
datasourceTypes = DatasourceType;
|
|
||||||
widgetTypes = widgetType;
|
widgetTypes = widgetType;
|
||||||
dataKeyTypes = DataKeyType;
|
dataKeyTypes = DataKeyType;
|
||||||
|
|
||||||
keysListFormGroup: UntypedFormGroup;
|
keysListFormGroup: FormGroup;
|
||||||
|
|
||||||
modelValue: Array<DataKey> | null;
|
modelValue: Array<DataKey> | null;
|
||||||
|
|
||||||
@ -218,23 +215,21 @@ export class DataKeysComponent implements ControlValueAccessor, OnInit, OnChange
|
|||||||
|
|
||||||
private dirty = false;
|
private dirty = false;
|
||||||
|
|
||||||
private propagateChange = (v: any) => { };
|
private propagateChange = (_v: any) => { };
|
||||||
|
|
||||||
private keysRequired = this._keysRequired.bind(this);
|
private keysRequired = this._keysRequired.bind(this);
|
||||||
private keysValidator = this._keysValidator.bind(this);
|
private keysValidator = this._keysValidator.bind(this);
|
||||||
|
|
||||||
constructor(private store: Store<AppState>,
|
constructor(@SkipSelf() private errorStateMatcher: ErrorStateMatcher,
|
||||||
@SkipSelf() private errorStateMatcher: ErrorStateMatcher,
|
|
||||||
private datasourceComponent: DatasourceComponent,
|
private datasourceComponent: DatasourceComponent,
|
||||||
public translate: TranslateService,
|
private translate: TranslateService,
|
||||||
private utils: UtilsService,
|
private utils: UtilsService,
|
||||||
private dialog: MatDialog,
|
private dialog: MatDialog,
|
||||||
private fb: UntypedFormBuilder,
|
private fb: FormBuilder,
|
||||||
private cd: ChangeDetectorRef,
|
|
||||||
private popoverService: TbPopoverService,
|
private popoverService: TbPopoverService,
|
||||||
private viewContainerRef: ViewContainerRef,
|
private viewContainerRef: ViewContainerRef,
|
||||||
private renderer: Renderer2,
|
private renderer: Renderer2,
|
||||||
public truncate: TruncatePipe) {
|
private destroyRef: DestroyRef) {
|
||||||
}
|
}
|
||||||
|
|
||||||
updateValidators() {
|
updateValidators() {
|
||||||
@ -246,7 +241,7 @@ export class DataKeysComponent implements ControlValueAccessor, OnInit, OnChange
|
|||||||
this.keysListFormGroup.get('keys').updateValueAndValidity();
|
this.keysListFormGroup.get('keys').updateValueAndValidity();
|
||||||
}
|
}
|
||||||
|
|
||||||
private _keysRequired(control: AbstractControl): ValidationErrors | null {
|
private _keysRequired(_control: AbstractControl): ValidationErrors | null {
|
||||||
const value = this.modelValue;
|
const value = this.modelValue;
|
||||||
if (value && Array.isArray(value) && value.length) {
|
if (value && Array.isArray(value) && value.length) {
|
||||||
return null;
|
return null;
|
||||||
@ -255,7 +250,7 @@ export class DataKeysComponent implements ControlValueAccessor, OnInit, OnChange
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private _keysValidator(control: AbstractControl): ValidationErrors | null {
|
private _keysValidator(_control: AbstractControl): ValidationErrors | null {
|
||||||
const value = this.modelValue;
|
const value = this.modelValue;
|
||||||
if (value && Array.isArray(value)) {
|
if (value && Array.isArray(value)) {
|
||||||
if (value.some(v => isObject(v) && (!v.type || !v.name))) {
|
if (value.some(v => isObject(v) && (!v.type || !v.name))) {
|
||||||
@ -274,7 +269,7 @@ export class DataKeysComponent implements ControlValueAccessor, OnInit, OnChange
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
registerOnTouched(fn: any): void {
|
registerOnTouched(_fn: any): void {
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
@ -314,6 +309,15 @@ export class DataKeysComponent implements ControlValueAccessor, OnInit, OnChange
|
|||||||
mergeMap(name => this.fetchKeys(name) ),
|
mergeMap(name => this.fetchKeys(name) ),
|
||||||
share()
|
share()
|
||||||
);
|
);
|
||||||
|
|
||||||
|
this.aliasController.entityAliasesChanged.pipe(
|
||||||
|
takeUntilDestroyed(this.destroyRef)
|
||||||
|
).subscribe(aliasIds => {
|
||||||
|
if (aliasIds.includes(this.entityAliasId)) {
|
||||||
|
this.clearSearchCache();
|
||||||
|
this.dirty = true;
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
public maxDataKeysText(): string {
|
public maxDataKeysText(): string {
|
||||||
@ -413,7 +417,7 @@ export class DataKeysComponent implements ControlValueAccessor, OnInit, OnChange
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
isErrorState(control: UntypedFormControl | null, form: FormGroupDirective | NgForm | null): boolean {
|
isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
|
||||||
const originalErrorState = this.errorStateMatcher.isErrorState(control, form);
|
const originalErrorState = this.errorStateMatcher.isErrorState(control, form);
|
||||||
const customErrorState = this.keysListFormGroup.get('keys').hasError('dataKey');
|
const customErrorState = this.keysListFormGroup.get('keys').hasError('dataKey');
|
||||||
return originalErrorState || customErrorState;
|
return originalErrorState || customErrorState;
|
||||||
@ -442,7 +446,7 @@ export class DataKeysComponent implements ControlValueAccessor, OnInit, OnChange
|
|||||||
this.dirty = true;
|
this.dirty = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
validate(c: UntypedFormControl) {
|
validate(_c: FormControl) {
|
||||||
return (this.keysListFormGroup.get('keys').hasError('dataKey')) ? {
|
return (this.keysListFormGroup.get('keys').hasError('dataKey')) ? {
|
||||||
dataKeys: {
|
dataKeys: {
|
||||||
valid: false,
|
valid: false,
|
||||||
@ -637,8 +641,12 @@ export class DataKeysComponent implements ControlValueAccessor, OnInit, OnChange
|
|||||||
fetchObservable = of([]);
|
fetchObservable = of([]);
|
||||||
}
|
}
|
||||||
this.fetchObservable$ = fetchObservable.pipe(
|
this.fetchObservable$ = fetchObservable.pipe(
|
||||||
publishReplay(1),
|
share({
|
||||||
refCount()
|
connector: () => new ReplaySubject(1),
|
||||||
|
resetOnError: false,
|
||||||
|
resetOnComplete: false,
|
||||||
|
resetOnRefCountZero: false
|
||||||
|
})
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
return this.fetchObservable$;
|
return this.fetchObservable$;
|
||||||
@ -650,7 +658,7 @@ export class DataKeysComponent implements ControlValueAccessor, OnInit, OnChange
|
|||||||
}
|
}
|
||||||
|
|
||||||
textIsNotEmpty(text: string): boolean {
|
textIsNotEmpty(text: string): boolean {
|
||||||
return text && text.length > 0;
|
return text?.length > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
clear(value: string = '', focus = true) {
|
clear(value: string = '', focus = true) {
|
||||||
|
|||||||
@ -165,6 +165,7 @@ export class WidgetConfigComponent extends PageComponent implements OnInit, OnDe
|
|||||||
|
|
||||||
widgetConfigCallbacks: WidgetConfigCallbacks = {
|
widgetConfigCallbacks: WidgetConfigCallbacks = {
|
||||||
createEntityAlias: this.createEntityAlias.bind(this),
|
createEntityAlias: this.createEntityAlias.bind(this),
|
||||||
|
editEntityAlias: this.editEntityAlias.bind(this),
|
||||||
createFilter: this.createFilter.bind(this),
|
createFilter: this.createFilter.bind(this),
|
||||||
generateDataKey: this.generateDataKey.bind(this),
|
generateDataKey: this.generateDataKey.bind(this),
|
||||||
fetchEntityKeysForDevice: this.fetchEntityKeysForDevice.bind(this),
|
fetchEntityKeysForDevice: this.fetchEntityKeysForDevice.bind(this),
|
||||||
@ -841,6 +842,27 @@ export class WidgetConfigComponent extends PageComponent implements OnInit, OnDe
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private editEntityAlias(alias: EntityAlias, allowedEntityTypes: Array<EntityType>): Observable<EntityAlias> {
|
||||||
|
return this.dialog.open<EntityAliasDialogComponent, EntityAliasDialogData,
|
||||||
|
EntityAlias>(EntityAliasDialogComponent, {
|
||||||
|
disableClose: true,
|
||||||
|
panelClass: ['tb-dialog', 'tb-fullscreen-dialog'],
|
||||||
|
data: {
|
||||||
|
isAdd: false,
|
||||||
|
allowedEntityTypes,
|
||||||
|
entityAliases: this.dashboard.configuration.entityAliases,
|
||||||
|
alias: deepClone(alias)
|
||||||
|
}
|
||||||
|
}).afterClosed().pipe(
|
||||||
|
tap((entityAlias) => {
|
||||||
|
if (entityAlias) {
|
||||||
|
this.dashboard.configuration.entityAliases[entityAlias.id] = entityAlias;
|
||||||
|
this.aliasController.updateEntityAliases(this.dashboard.configuration.entityAliases);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
private createFilter(filter: string): Observable<Filter> {
|
private createFilter(filter: string): Observable<Filter> {
|
||||||
const singleFilter: Filter = {id: null, filter, keyFilters: [], editable: true};
|
const singleFilter: Filter = {id: null, filter, keyFilters: [], editable: true};
|
||||||
return this.dialog.open<FilterDialogComponent, FilterDialogData,
|
return this.dialog.open<FilterDialogComponent, FilterDialogData,
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user