Fixes
This commit is contained in:
parent
bc835eb9d4
commit
75369604a1
@ -99,7 +99,7 @@
|
|||||||
<span class="tb-prompt flex items-center justify-center">{{ 'calculated-fields.no-arguments' | translate }}</span>
|
<span class="tb-prompt flex items-center justify-center">{{ 'calculated-fields.no-arguments' | translate }}</span>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
@if (errorText) {
|
@if (errorText && this.argumentsFormArray.dirty) {
|
||||||
<tb-error noMargin [error]="errorText | translate" class="pl-3"/>
|
<tb-error noMargin [error]="errorText | translate" class="pl-3"/>
|
||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@ -50,7 +50,7 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|||||||
import { EntityId } from '@shared/models/id/entity-id';
|
import { EntityId } from '@shared/models/id/entity-id';
|
||||||
import { EntityType, entityTypeTranslations } from '@shared/models/entity-type.models';
|
import { EntityType, entityTypeTranslations } from '@shared/models/entity-type.models';
|
||||||
import { isDefinedAndNotNull } from '@core/utils';
|
import { isDefinedAndNotNull } from '@core/utils';
|
||||||
import { noLeadTrailSpacesRegex } from '@shared/models/regex.constants';
|
import { charNumRegex } from '@shared/models/regex.constants';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'tb-calculated-field-arguments-table',
|
selector: 'tb-calculated-field-arguments-table',
|
||||||
@ -98,7 +98,11 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces
|
|||||||
this.argumentsFormArray.valueChanges.pipe(takeUntilDestroyed()).subscribe(() => {
|
this.argumentsFormArray.valueChanges.pipe(takeUntilDestroyed()).subscribe(() => {
|
||||||
this.propagateChange(this.getArgumentsObject());
|
this.propagateChange(this.getArgumentsObject());
|
||||||
});
|
});
|
||||||
effect(() => this.calculatedFieldType() && this.argumentsFormArray.updateValueAndValidity());
|
effect(() => {
|
||||||
|
if (this.calculatedFieldType() && this.argumentsFormArray.dirty) {
|
||||||
|
this.argumentsFormArray.updateValueAndValidity();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
registerOnChange(fn: (argumentsObj: Record<string, CalculatedFieldArgument>) => void): void {
|
registerOnChange(fn: (argumentsObj: Record<string, CalculatedFieldArgument>) => void): void {
|
||||||
@ -183,7 +187,7 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces
|
|||||||
private populateArgumentsFormArray(argumentsObj: Record<string, CalculatedFieldArgument>): void {
|
private populateArgumentsFormArray(argumentsObj: Record<string, CalculatedFieldArgument>): void {
|
||||||
Object.keys(argumentsObj).forEach(key => {
|
Object.keys(argumentsObj).forEach(key => {
|
||||||
this.argumentsFormArray.push(this.fb.group({
|
this.argumentsFormArray.push(this.fb.group({
|
||||||
argumentName: [key, [Validators.required, Validators.maxLength(255), Validators.pattern(noLeadTrailSpacesRegex)]],
|
argumentName: [key, [Validators.required, Validators.maxLength(255), Validators.pattern(charNumRegex)]],
|
||||||
...argumentsObj[key],
|
...argumentsObj[key],
|
||||||
...(argumentsObj[key].refEntityId ? {
|
...(argumentsObj[key].refEntityId ? {
|
||||||
refEntityId: this.fb.group({
|
refEntityId: this.fb.group({
|
||||||
@ -202,7 +206,7 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces
|
|||||||
private getArgumentFormGroup(value: CalculatedFieldArgumentValue): AbstractControl {
|
private getArgumentFormGroup(value: CalculatedFieldArgumentValue): AbstractControl {
|
||||||
return this.fb.group({
|
return this.fb.group({
|
||||||
...value,
|
...value,
|
||||||
argumentName: [value.argumentName, [Validators.required, Validators.maxLength(255), Validators.pattern(noLeadTrailSpacesRegex)]],
|
argumentName: [value.argumentName, [Validators.required, Validators.maxLength(255), Validators.pattern(charNumRegex)]],
|
||||||
...(value.refEntityId ? {
|
...(value.refEntityId ? {
|
||||||
refEntityId: this.fb.group({
|
refEntityId: this.fb.group({
|
||||||
entityType: [{ value: value.refEntityId.entityType, disabled: true }],
|
entityType: [{ value: value.refEntityId.entityType, disabled: true }],
|
||||||
|
|||||||
@ -110,7 +110,7 @@ export class CalculatedFieldDialogComponent extends DialogComponent<CalculatedFi
|
|||||||
private applyDialogData(): void {
|
private applyDialogData(): void {
|
||||||
const { configuration = {}, type = CalculatedFieldType.SIMPLE, ...value } = this.data.value;
|
const { configuration = {}, type = CalculatedFieldType.SIMPLE, ...value } = this.data.value;
|
||||||
const { expression, ...restConfig } = configuration as CalculatedFieldConfiguration;
|
const { expression, ...restConfig } = configuration as CalculatedFieldConfiguration;
|
||||||
this.fieldFormGroup.patchValue({ configuration: { ...restConfig, ['expression'+type]: expression }, type, ...value });
|
this.fieldFormGroup.patchValue({ configuration: { ...restConfig, ['expression'+type]: expression }, type, ...value }, {emitEvent: false});
|
||||||
}
|
}
|
||||||
|
|
||||||
private observeTypeChanges(): void {
|
private observeTypeChanges(): void {
|
||||||
@ -131,5 +131,7 @@ export class CalculatedFieldDialogComponent extends DialogComponent<CalculatedFi
|
|||||||
|
|
||||||
private toggleKeyByCalculatedFieldType(type: CalculatedFieldType): void {
|
private toggleKeyByCalculatedFieldType(type: CalculatedFieldType): void {
|
||||||
this.outputFormGroup.get('name')[type === CalculatedFieldType.SIMPLE? 'enable' : 'disable']({emitEvent: false});
|
this.outputFormGroup.get('name')[type === CalculatedFieldType.SIMPLE? 'enable' : 'disable']({emitEvent: false});
|
||||||
|
this.configFormGroup.get('expression'+CalculatedFieldType.SIMPLE)[type === CalculatedFieldType.SIMPLE? 'enable' : 'disable']({emitEvent: false});
|
||||||
|
this.configFormGroup.get('expression'+CalculatedFieldType.SCRIPT)[type === CalculatedFieldType.SCRIPT? 'enable' : 'disable']({emitEvent: false});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -133,7 +133,8 @@
|
|||||||
<mat-option [value]="AttributeScope.SERVER_SCOPE">
|
<mat-option [value]="AttributeScope.SERVER_SCOPE">
|
||||||
{{ 'calculated-fields.server-attributes' | translate }}
|
{{ 'calculated-fields.server-attributes' | translate }}
|
||||||
</mat-option>
|
</mat-option>
|
||||||
@if ((keyEntityType$ | async) === EntityType.DEVICE) {
|
@if (entityType === ArgumentEntityType.Device
|
||||||
|
|| entityType === ArgumentEntityType.Current && entityId.entityType === EntityType.DEVICE) {
|
||||||
<mat-option [value]="AttributeScope.CLIENT_SCOPE">
|
<mat-option [value]="AttributeScope.CLIENT_SCOPE">
|
||||||
{{ 'calculated-fields.client-attributes' | translate }}
|
{{ 'calculated-fields.client-attributes' | translate }}
|
||||||
</mat-option>
|
</mat-option>
|
||||||
|
|||||||
@ -18,7 +18,7 @@ import { ChangeDetectorRef, Component, ElementRef, Input, OnInit, output, ViewCh
|
|||||||
import { TbPopoverComponent } from '@shared/components/popover.component';
|
import { TbPopoverComponent } from '@shared/components/popover.component';
|
||||||
import { PageComponent } from '@shared/components/page.component';
|
import { PageComponent } from '@shared/components/page.component';
|
||||||
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||||
import { noLeadTrailSpacesRegex } from '@shared/models/regex.constants';
|
import { charNumRegex, noLeadTrailSpacesRegex } from '@shared/models/regex.constants';
|
||||||
import {
|
import {
|
||||||
ArgumentEntityType,
|
ArgumentEntityType,
|
||||||
ArgumentEntityTypeTranslations,
|
ArgumentEntityTypeTranslations,
|
||||||
@ -27,7 +27,7 @@ import {
|
|||||||
CalculatedFieldArgumentValue,
|
CalculatedFieldArgumentValue,
|
||||||
CalculatedFieldType
|
CalculatedFieldType
|
||||||
} from '@shared/models/calculated-field.models';
|
} from '@shared/models/calculated-field.models';
|
||||||
import { delay, distinctUntilChanged, filter, map, startWith, throttleTime } from 'rxjs/operators';
|
import { delay, distinctUntilChanged, filter, throttleTime } from 'rxjs/operators';
|
||||||
import { EntityType } from '@shared/models/entity-type.models';
|
import { EntityType } from '@shared/models/entity-type.models';
|
||||||
import { AttributeScope, DataKeyType } from '@shared/models/telemetry/telemetry.models';
|
import { AttributeScope, DataKeyType } from '@shared/models/telemetry/telemetry.models';
|
||||||
import { DatasourceType } from '@shared/models/widget.models';
|
import { DatasourceType } from '@shared/models/widget.models';
|
||||||
@ -57,7 +57,7 @@ export class CalculatedFieldArgumentPanelComponent extends PageComponent impleme
|
|||||||
argumentsDataApplied = output<{ value: CalculatedFieldArgumentValue, index: number }>();
|
argumentsDataApplied = output<{ value: CalculatedFieldArgumentValue, index: number }>();
|
||||||
|
|
||||||
argumentFormGroup = this.fb.group({
|
argumentFormGroup = this.fb.group({
|
||||||
argumentName: ['', [Validators.required, Validators.pattern(noLeadTrailSpacesRegex), Validators.maxLength(255)]],
|
argumentName: ['', [Validators.required, Validators.pattern(charNumRegex), Validators.maxLength(255)]],
|
||||||
refEntityId: this.fb.group({
|
refEntityId: this.fb.group({
|
||||||
entityType: [ArgumentEntityType.Current],
|
entityType: [ArgumentEntityType.Current],
|
||||||
id: ['']
|
id: ['']
|
||||||
@ -74,11 +74,6 @@ export class CalculatedFieldArgumentPanelComponent extends PageComponent impleme
|
|||||||
|
|
||||||
argumentTypes: ArgumentType[];
|
argumentTypes: ArgumentType[];
|
||||||
entityFilter: EntityFilter;
|
entityFilter: EntityFilter;
|
||||||
keyEntityType$ = this.refEntityIdFormGroup.get('entityType').valueChanges
|
|
||||||
.pipe(
|
|
||||||
startWith(this.refEntityIdFormGroup.get('entityType').value),
|
|
||||||
map(type => type === ArgumentEntityType.Current ? this.entityId.entityType : type)
|
|
||||||
);
|
|
||||||
|
|
||||||
readonly argumentEntityTypes = Object.values(ArgumentEntityType) as ArgumentEntityType[];
|
readonly argumentEntityTypes = Object.values(ArgumentEntityType) as ArgumentEntityType[];
|
||||||
readonly ArgumentEntityTypeTranslations = ArgumentEntityTypeTranslations;
|
readonly ArgumentEntityTypeTranslations = ArgumentEntityTypeTranslations;
|
||||||
@ -140,7 +135,7 @@ export class CalculatedFieldArgumentPanelComponent extends PageComponent impleme
|
|||||||
this.argumentFormGroup.get('defaultValue')[isRolling? 'disable' : 'enable']({ emitEvent: false });
|
this.argumentFormGroup.get('defaultValue')[isRolling? 'disable' : 'enable']({ emitEvent: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
private updateEntityFilter(entityType: ArgumentEntityType, onInit = false): void {
|
private updateEntityFilter(entityType: ArgumentEntityType = ArgumentEntityType.Current, onInit = false): void {
|
||||||
let entityId: EntityId;
|
let entityId: EntityId;
|
||||||
switch (entityType) {
|
switch (entityType) {
|
||||||
case ArgumentEntityType.Current:
|
case ArgumentEntityType.Current:
|
||||||
|
|||||||
@ -15,3 +15,5 @@
|
|||||||
///
|
///
|
||||||
|
|
||||||
export const noLeadTrailSpacesRegex = /^\S+(?: \S+)*$/;
|
export const noLeadTrailSpacesRegex = /^\S+(?: \S+)*$/;
|
||||||
|
|
||||||
|
export const charNumRegex = /^[a-zA-Z0-9]+$/;
|
||||||
|
|||||||
@ -1030,7 +1030,7 @@
|
|||||||
"timeseries-key": "Time series key",
|
"timeseries-key": "Time series key",
|
||||||
"device-name": "Device name",
|
"device-name": "Device name",
|
||||||
"latest-telemetry": "Latest telemetry",
|
"latest-telemetry": "Latest telemetry",
|
||||||
"rolling": "Rolling",
|
"rolling": "Time series rolling",
|
||||||
"attribute-scope": "Attribute scope",
|
"attribute-scope": "Attribute scope",
|
||||||
"server-attributes": "Server attributes",
|
"server-attributes": "Server attributes",
|
||||||
"client-attributes": "Client attributes",
|
"client-attributes": "Client attributes",
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user