Review comments resolving and refactoring
This commit is contained in:
		
							parent
							
								
									84b9bde577
								
							
						
					
					
						commit
						9e19fab11d
					
				@ -22,7 +22,7 @@ import { PageData } from '@shared/models/page/page-data';
 | 
			
		||||
import { CalculatedField, CalculatedFieldTestScriptInputParams } from '@shared/models/calculated-field.models';
 | 
			
		||||
import { PageLink } from '@shared/models/page/page-link';
 | 
			
		||||
import { EntityId } from '@shared/models/id/entity-id';
 | 
			
		||||
import { TestScriptResult } from '@shared/models/entity.models';
 | 
			
		||||
import { EntityTestScriptResult } from '@shared/models/entity.models';
 | 
			
		||||
 | 
			
		||||
@Injectable({
 | 
			
		||||
  providedIn: 'root'
 | 
			
		||||
@ -50,7 +50,7 @@ export class CalculatedFieldsService {
 | 
			
		||||
      defaultHttpOptionsFromConfig(config));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  public testScript(inputParams: CalculatedFieldTestScriptInputParams, config?: RequestConfig): Observable<TestScriptResult> {
 | 
			
		||||
    return this.http.post<TestScriptResult>('/api/calculatedField/testScript', inputParams, defaultHttpOptionsFromConfig(config));
 | 
			
		||||
  public testScript(inputParams: CalculatedFieldTestScriptInputParams, config?: RequestConfig): Observable<EntityTestScriptResult> {
 | 
			
		||||
    return this.http.post<EntityTestScriptResult>('/api/calculatedField/testScript', inputParams, defaultHttpOptionsFromConfig(config));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -35,6 +35,7 @@ import {
 | 
			
		||||
  RuleNodeConfiguration,
 | 
			
		||||
  ScriptLanguage,
 | 
			
		||||
  TestScriptInputParams,
 | 
			
		||||
  TestScriptResult
 | 
			
		||||
} from '@app/shared/models/rule-node.models';
 | 
			
		||||
import { componentTypeBySelector, ResourcesService } from '../services/resources.service';
 | 
			
		||||
import { catchError, map, mergeMap } from 'rxjs/operators';
 | 
			
		||||
@ -43,7 +44,6 @@ import { deepClone, snakeCase } from '@core/utils';
 | 
			
		||||
import { DebugRuleNodeEventBody } from '@app/shared/models/event.models';
 | 
			
		||||
import { Edge } from '@shared/models/edge.models';
 | 
			
		||||
import { IModulesMap } from '@modules/common/modules-map.models';
 | 
			
		||||
import { TestScriptResult } from '@shared/models/entity.models';
 | 
			
		||||
 | 
			
		||||
@Injectable({
 | 
			
		||||
  providedIn: 'root'
 | 
			
		||||
 | 
			
		||||
@ -34,12 +34,12 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
 | 
			
		||||
import { TbPopoverService } from '@shared/components/popover.service';
 | 
			
		||||
import { EntityDebugSettingsPanelComponent } from '@home/components/entity/debug/entity-debug-settings-panel.component';
 | 
			
		||||
import { CalculatedFieldsService } from '@core/http/calculated-fields.service';
 | 
			
		||||
import { catchError, filter, switchMap } from 'rxjs/operators';
 | 
			
		||||
import { catchError, filter, switchMap, tap } from 'rxjs/operators';
 | 
			
		||||
import {
 | 
			
		||||
  CalculatedField,
 | 
			
		||||
  CalculatedFieldDebugDialogData,
 | 
			
		||||
  CalculatedFieldDialogData,
 | 
			
		||||
  CalculatedFieldScriptTestDialogData
 | 
			
		||||
  CalculatedFieldTestScriptInputParams,
 | 
			
		||||
} from '@shared/models/calculated-field.models';
 | 
			
		||||
import {
 | 
			
		||||
  CalculatedFieldDebugDialogComponent,
 | 
			
		||||
@ -47,7 +47,6 @@ import {
 | 
			
		||||
  CalculatedFieldScriptTestDialogComponent
 | 
			
		||||
} from './components/public-api';
 | 
			
		||||
import { ImportExportService } from '@shared/import-export/import-export.service';
 | 
			
		||||
import { CalculatedFieldId } from '@shared/models/id/calculated-field-id';
 | 
			
		||||
 | 
			
		||||
export class CalculatedFieldsTableConfig extends EntityTableConfig<CalculatedField, PageLink> {
 | 
			
		||||
 | 
			
		||||
@ -58,7 +57,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig<CalculatedFie
 | 
			
		||||
  readonly tenantId = getCurrentAuthUser(this.store).tenantId;
 | 
			
		||||
  additionalDebugActionConfig = {
 | 
			
		||||
    title: this.translate.instant('calculated-fields.see-debug-events'),
 | 
			
		||||
    action: (id?: CalculatedFieldId, expression?: string) => this.openDebugDialog.call(this, id, expression),
 | 
			
		||||
    action: (calculatedField: CalculatedField) => this.openDebugDialog.call(this, calculatedField),
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  constructor(private calculatedFieldsService: CalculatedFieldsService,
 | 
			
		||||
@ -139,10 +138,11 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig<CalculatedFie
 | 
			
		||||
    return this.calculatedFieldsService.getCalculatedFields(this.entityId, pageLink);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onOpenDebugConfig($event: Event, { debugSettings = {}, configuration, id }: CalculatedField): void {
 | 
			
		||||
  onOpenDebugConfig($event: Event, calculatedField: CalculatedField): void {
 | 
			
		||||
    const { debugSettings = {}, id } = calculatedField;
 | 
			
		||||
    const additionalActionConfig = {
 | 
			
		||||
      ...this.additionalDebugActionConfig,
 | 
			
		||||
      action: () => this.openDebugDialog(id, configuration?.expression)
 | 
			
		||||
      action: () => this.openDebugDialog(calculatedField)
 | 
			
		||||
    };
 | 
			
		||||
    const { viewContainerRef } = this.getTable();
 | 
			
		||||
    if ($event) {
 | 
			
		||||
@ -178,8 +178,8 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig<CalculatedFie
 | 
			
		||||
      )
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private editCalculatedField(calculatedField: CalculatedField): void {
 | 
			
		||||
    this.getCalculatedFieldDialog(calculatedField, 'action.apply')
 | 
			
		||||
  private editCalculatedField(calculatedField: CalculatedField, isDirty = false): void {
 | 
			
		||||
    this.getCalculatedFieldDialog(calculatedField, 'action.apply', isDirty)
 | 
			
		||||
      .pipe(
 | 
			
		||||
        filter(Boolean),
 | 
			
		||||
        switchMap((updatedCalculatedField) => this.calculatedFieldsService.saveCalculatedField({ ...calculatedField, ...updatedCalculatedField })),
 | 
			
		||||
@ -191,7 +191,7 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig<CalculatedFie
 | 
			
		||||
      });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private getCalculatedFieldDialog(value?: CalculatedField, buttonTitle = 'action.add'): Observable<CalculatedField> {
 | 
			
		||||
  private getCalculatedFieldDialog(value?: CalculatedField, buttonTitle = 'action.add', isDirty = false): Observable<CalculatedField> {
 | 
			
		||||
    return this.dialog.open<CalculatedFieldDialogComponent, CalculatedFieldDialogData, CalculatedField>(CalculatedFieldDialogComponent, {
 | 
			
		||||
      disableClose: true,
 | 
			
		||||
      panelClass: ['tb-dialog', 'tb-fullscreen-dialog'],
 | 
			
		||||
@ -204,21 +204,20 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig<CalculatedFie
 | 
			
		||||
        entityName: this.entityName,
 | 
			
		||||
        additionalDebugActionConfig: this.additionalDebugActionConfig,
 | 
			
		||||
        testScriptFn: this.getTestScriptDialog.bind(this),
 | 
			
		||||
        isDirty
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
      .afterClosed();
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private openDebugDialog(id: CalculatedFieldId, expression: string): void {
 | 
			
		||||
  private openDebugDialog(calculatedField: CalculatedField): void {
 | 
			
		||||
    this.dialog.open<CalculatedFieldDebugDialogComponent, CalculatedFieldDebugDialogData, null>(CalculatedFieldDebugDialogComponent, {
 | 
			
		||||
      disableClose: true,
 | 
			
		||||
      panelClass: ['tb-dialog', 'tb-fullscreen-dialog'],
 | 
			
		||||
      data: {
 | 
			
		||||
        tenantId: this.tenantId,
 | 
			
		||||
        entityId: this.entityId,
 | 
			
		||||
        id,
 | 
			
		||||
        expression,
 | 
			
		||||
        testScriptFn: this.getTestScriptDialog.bind(this),
 | 
			
		||||
        value: calculatedField,
 | 
			
		||||
        getTestScriptDialogFn: this.getTestScriptDialog.bind(this),
 | 
			
		||||
      }
 | 
			
		||||
    })
 | 
			
		||||
      .afterClosed()
 | 
			
		||||
@ -260,16 +259,21 @@ export class CalculatedFieldsTableConfig extends EntityTableConfig<CalculatedFie
 | 
			
		||||
    ).subscribe(() => this.updateData());
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private getTestScriptDialog(argumentsObj: Record<string, unknown>, expression: string, withApply = false): Observable<string> {
 | 
			
		||||
    return this.dialog.open<CalculatedFieldScriptTestDialogComponent, CalculatedFieldScriptTestDialogData, string>(CalculatedFieldScriptTestDialogComponent,
 | 
			
		||||
  private getTestScriptDialog(calculatedField: CalculatedField, argumentsObj?: Record<string, unknown>): Observable<string> {
 | 
			
		||||
    return this.dialog.open<CalculatedFieldScriptTestDialogComponent, CalculatedFieldTestScriptInputParams, string>(CalculatedFieldScriptTestDialogComponent,
 | 
			
		||||
      {
 | 
			
		||||
        disableClose: true,
 | 
			
		||||
        panelClass: ['tb-dialog', 'tb-fullscreen-dialog', 'tb-fullscreen-dialog-gt-xs'],
 | 
			
		||||
        data: {
 | 
			
		||||
          arguments: argumentsObj,
 | 
			
		||||
          expression,
 | 
			
		||||
          withApply,
 | 
			
		||||
          arguments: argumentsObj ?? Object.keys(calculatedField.configuration.arguments).reduce((acc, key) => ({...acc, [key]: '' }), {}),
 | 
			
		||||
          expression: calculatedField.configuration.expression,
 | 
			
		||||
        }
 | 
			
		||||
      }).afterClosed();
 | 
			
		||||
      }).afterClosed()
 | 
			
		||||
      .pipe(
 | 
			
		||||
        filter(Boolean),
 | 
			
		||||
        tap(expression =>
 | 
			
		||||
          this.editCalculatedField({...calculatedField, configuration: {...calculatedField.configuration, expression } }, true)
 | 
			
		||||
        ),
 | 
			
		||||
      );
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -32,7 +32,7 @@
 | 
			
		||||
      [disabledEventTypes]="[EventType.LC_EVENT, EventType.ERROR, EventType.STATS]"
 | 
			
		||||
      [defaultEventType]="DebugEventType.DEBUG_CALCULATED_FIELD"
 | 
			
		||||
      [active]="true"
 | 
			
		||||
      [entityId]="data.id"
 | 
			
		||||
      [entityId]="data.value.id"
 | 
			
		||||
      [functionTestButtonLabel]="'common.test-function' | translate"
 | 
			
		||||
      (debugEventSelected)="onDebugEventSelected($event)"
 | 
			
		||||
    />
 | 
			
		||||
 | 
			
		||||
@ -22,14 +22,14 @@ import { Router } from '@angular/router';
 | 
			
		||||
import { DialogComponent } from '@shared/components/dialog.component';
 | 
			
		||||
import { CalculatedFieldEventBody, DebugEventType, EventType } from '@shared/models/event.models';
 | 
			
		||||
import { EventTableComponent } from '@home/components/event/event-table.component';
 | 
			
		||||
import { CalculatedFieldDebugDialogData } from '@shared/models/calculated-field.models';
 | 
			
		||||
import { CalculatedFieldDebugDialogData, CalculatedFieldType } from '@shared/models/calculated-field.models';
 | 
			
		||||
 | 
			
		||||
@Component({
 | 
			
		||||
  selector: 'tb-calculated-field-debug-dialog',
 | 
			
		||||
  styleUrls: ['calculated-field-debug-dialog.component.scss'],
 | 
			
		||||
  templateUrl: './calculated-field-debug-dialog.component.html',
 | 
			
		||||
})
 | 
			
		||||
export class CalculatedFieldDebugDialogComponent extends DialogComponent<CalculatedFieldDebugDialogComponent, null> implements AfterViewInit {
 | 
			
		||||
export class CalculatedFieldDebugDialogComponent extends DialogComponent<CalculatedFieldDebugDialogComponent, string> implements AfterViewInit {
 | 
			
		||||
 | 
			
		||||
  @ViewChild(EventTableComponent, {static: true}) eventsTable: EventTableComponent;
 | 
			
		||||
 | 
			
		||||
@ -40,12 +40,13 @@ export class CalculatedFieldDebugDialogComponent extends DialogComponent<Calcula
 | 
			
		||||
  constructor(protected store: Store<AppState>,
 | 
			
		||||
              protected router: Router,
 | 
			
		||||
              @Inject(MAT_DIALOG_DATA) public data: CalculatedFieldDebugDialogData,
 | 
			
		||||
              protected dialogRef: MatDialogRef<CalculatedFieldDebugDialogComponent, null>) {
 | 
			
		||||
              protected dialogRef: MatDialogRef<CalculatedFieldDebugDialogComponent, string>) {
 | 
			
		||||
    super(store, router, dialogRef);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ngAfterViewInit(): void {
 | 
			
		||||
    this.eventsTable.entitiesTable.updateData();
 | 
			
		||||
    this.eventsTable.entitiesTable.cellActionDescriptors[0].isEnabled = () => this.data.value.type === CalculatedFieldType.SCRIPT;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  cancel(): void {
 | 
			
		||||
@ -53,6 +54,7 @@ export class CalculatedFieldDebugDialogComponent extends DialogComponent<Calcula
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onDebugEventSelected(event: CalculatedFieldEventBody): void {
 | 
			
		||||
    this.data.testScriptFn(JSON.parse(event.arguments), this.data.expression);
 | 
			
		||||
    this.data.getTestScriptDialogFn(this.data.value, JSON.parse(event.arguments))
 | 
			
		||||
      .subscribe(expression => this.dialogRef.close(expression));
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -99,7 +99,7 @@
 | 
			
		||||
              [functionArgs]="functionArgs$ | async"
 | 
			
		||||
              [disableUndefinedCheck]="true"
 | 
			
		||||
              [scriptLanguage]="ScriptLanguage.TBEL"
 | 
			
		||||
              helpId="[TODO]: [Calculated Fields] add valid link"
 | 
			
		||||
              helpId="calculated-field/expression_fn"
 | 
			
		||||
            />
 | 
			
		||||
            <div>
 | 
			
		||||
              <button mat-button mat-raised-button color="primary"
 | 
			
		||||
 | 
			
		||||
@ -14,7 +14,7 @@
 | 
			
		||||
/// limitations under the License.
 | 
			
		||||
///
 | 
			
		||||
 | 
			
		||||
import { Component, Inject } from '@angular/core';
 | 
			
		||||
import { AfterViewInit, Component, Inject } from '@angular/core';
 | 
			
		||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
 | 
			
		||||
import { Store } from '@ngrx/store';
 | 
			
		||||
import { AppState } from '@core/core.state';
 | 
			
		||||
@ -41,7 +41,7 @@ import { ScriptLanguage } from '@shared/models/rule-node.models';
 | 
			
		||||
  selector: 'tb-calculated-field-dialog',
 | 
			
		||||
  templateUrl: './calculated-field-dialog.component.html',
 | 
			
		||||
})
 | 
			
		||||
export class CalculatedFieldDialogComponent extends DialogComponent<CalculatedFieldDialogComponent, CalculatedField> {
 | 
			
		||||
export class CalculatedFieldDialogComponent extends DialogComponent<CalculatedFieldDialogComponent, CalculatedField> implements AfterViewInit {
 | 
			
		||||
 | 
			
		||||
  fieldFormGroup = this.fb.group({
 | 
			
		||||
    name: ['', [Validators.required, Validators.pattern(noLeadTrailSpacesRegex), Validators.maxLength(255)]],
 | 
			
		||||
@ -67,7 +67,7 @@ export class CalculatedFieldDialogComponent extends DialogComponent<CalculatedFi
 | 
			
		||||
 | 
			
		||||
  additionalDebugActionConfig = this.data.value?.id ? {
 | 
			
		||||
    ...this.data.additionalDebugActionConfig,
 | 
			
		||||
    action: () => this.data.additionalDebugActionConfig.action(this.data.value.id, this.data.value.configuration.expression)
 | 
			
		||||
    action: () => this.data.additionalDebugActionConfig.action({ id: this.data.value.id, ...this.fromGroupValue }),
 | 
			
		||||
  } : null;
 | 
			
		||||
 | 
			
		||||
  readonly OutputTypeTranslations = OutputTypeTranslations;
 | 
			
		||||
@ -98,24 +98,31 @@ export class CalculatedFieldDialogComponent extends DialogComponent<CalculatedFi
 | 
			
		||||
    return this.fieldFormGroup.get('configuration').get('output') as FormGroup;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  get fromGroupValue(): CalculatedField {
 | 
			
		||||
    const { configuration, type, ...rest } = this.fieldFormGroup.value;
 | 
			
		||||
    const { expressionSIMPLE, expressionSCRIPT, ...restConfig } = configuration;
 | 
			
		||||
    return { configuration: { ...restConfig, type, expression: configuration['expression'+type] }, ...rest, type } as CalculatedField;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ngAfterViewInit(): void {
 | 
			
		||||
    if (this.data.isDirty) {
 | 
			
		||||
      this.fieldFormGroup.markAsDirty();
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  cancel(): void {
 | 
			
		||||
    this.dialogRef.close(null);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  add(): void {
 | 
			
		||||
    if (this.fieldFormGroup.valid) {
 | 
			
		||||
      const { configuration, type, ...rest } = this.fieldFormGroup.value;
 | 
			
		||||
      const { expressionSIMPLE, expressionSCRIPT, ...restConfig } = configuration;
 | 
			
		||||
      this.dialogRef.close({ configuration: { ...restConfig, type, expression: configuration['expression'+type] }, ...rest, type } as CalculatedField);
 | 
			
		||||
      this.dialogRef.close(this.fromGroupValue);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  onTestScript(): void {
 | 
			
		||||
    this.data.testScriptFn(
 | 
			
		||||
        Object.fromEntries(Object.keys(this.configFormGroup.get('arguments').value).map(k => [k, ''])),
 | 
			
		||||
        this.configFormGroup.get('expressionSCRIPT').value,
 | 
			
		||||
        true
 | 
			
		||||
    ).pipe(filter(Boolean)).subscribe((expression: string) => {
 | 
			
		||||
    this.data.testScriptFn(this.fromGroupValue)
 | 
			
		||||
      .pipe(filter(Boolean)).subscribe((expression: string) => {
 | 
			
		||||
      this.configFormGroup.get('expressionSCRIPT').setValue(expression);
 | 
			
		||||
      this.configFormGroup.get('expressionSCRIPT').markAsDirty();
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@
 | 
			
		||||
-->
 | 
			
		||||
<form class="test-dialog-container size-full" [formGroup]="calculatedFieldScriptTestFormGroup">
 | 
			
		||||
  <mat-toolbar class="flex justify-between" color="primary">
 | 
			
		||||
    <h2>{{ 'calculated-fields.test-script-function' | translate }} ({{ 'TBEL' }})</h2>
 | 
			
		||||
    <h2>{{ 'calculated-fields.test-script-function' | translate }} ({{ 'api-usage.tbel' | translate }})</h2>
 | 
			
		||||
    <button mat-icon-button
 | 
			
		||||
            (click)="cancel()"
 | 
			
		||||
            type="button">
 | 
			
		||||
@ -29,7 +29,7 @@
 | 
			
		||||
      <div class="tb-fullscreen-panel flex size-full flex-row">
 | 
			
		||||
        <div #leftPanel class="test-block-content overflow-hidden">
 | 
			
		||||
          <div class="relative size-full min-w-64">
 | 
			
		||||
            <div class="absolute right-28 top-[9px] z-10 text-[12px] font-bold">
 | 
			
		||||
            <div class="block-label-container left">
 | 
			
		||||
              <span class="block-label">{{ 'calculated-fields.expression' | translate }}</span>
 | 
			
		||||
            </div>
 | 
			
		||||
            <tb-js-func
 | 
			
		||||
@ -41,14 +41,14 @@
 | 
			
		||||
              [fillHeight]="true"
 | 
			
		||||
              [scriptLanguage]="ScriptLanguage.TBEL"
 | 
			
		||||
              resultType="object"
 | 
			
		||||
              helpId="[TODO]: [Calculated Fields] add valid link"
 | 
			
		||||
              helpId="calculated-field/test-expression_fn"
 | 
			
		||||
            />
 | 
			
		||||
          </div>
 | 
			
		||||
        </div>
 | 
			
		||||
        <div #rightPanel>
 | 
			
		||||
          <div #topRightPanel class="test-block-content">
 | 
			
		||||
            <div class="relative flex size-full min-w-96 gap-2">
 | 
			
		||||
              <div class="absolute right-2 top-[6px] z-10 text-[12px] font-bold">
 | 
			
		||||
              <div class="block-label-container right-top">
 | 
			
		||||
                <span class="block-label">{{ 'calculated-fields.arguments' | translate }}</span>
 | 
			
		||||
              </div>
 | 
			
		||||
              <tb-calculated-field-test-arguments class="size-full" formControlName="arguments"/>
 | 
			
		||||
@ -56,7 +56,7 @@
 | 
			
		||||
          </div>
 | 
			
		||||
          <div #bottomRightPanel class="test-block-content">
 | 
			
		||||
            <div class="relative size-full">
 | 
			
		||||
              <div class="absolute right-10 top-[6px] z-10 text-[12px] font-bold">
 | 
			
		||||
              <div class="block-label-container right-bottom">
 | 
			
		||||
                <span class="block-label" translate>common.output</span>
 | 
			
		||||
              </div>
 | 
			
		||||
              <tb-json-content
 | 
			
		||||
@ -89,13 +89,11 @@
 | 
			
		||||
            (click)="cancel()">
 | 
			
		||||
      {{ 'action.cancel' | translate }}
 | 
			
		||||
    </button>
 | 
			
		||||
    @if (data.withApply) {
 | 
			
		||||
      <button mat-button mat-raised-button color="primary"
 | 
			
		||||
              type="submit"
 | 
			
		||||
              (click)="save()"
 | 
			
		||||
              [disabled]="(isLoading$ | async) || calculatedFieldScriptTestFormGroup.get('expression').invalid || !calculatedFieldScriptTestFormGroup.get('expression').dirty">
 | 
			
		||||
        {{ 'action.save' | translate }}
 | 
			
		||||
      </button>
 | 
			
		||||
    }
 | 
			
		||||
    <button mat-button mat-raised-button color="primary"
 | 
			
		||||
            type="submit"
 | 
			
		||||
            (click)="save()"
 | 
			
		||||
            [disabled]="(isLoading$ | async) || calculatedFieldScriptTestFormGroup.get('expression').invalid || !calculatedFieldScriptTestFormGroup.get('expression').dirty">
 | 
			
		||||
      {{ 'action.save' | translate }}
 | 
			
		||||
    </button>
 | 
			
		||||
  </div>
 | 
			
		||||
</form>
 | 
			
		||||
 | 
			
		||||
@ -27,6 +27,28 @@
 | 
			
		||||
      padding-left: 5px;
 | 
			
		||||
      border: 1px solid #c0c0c0;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    .block-label-container {
 | 
			
		||||
      position: absolute;
 | 
			
		||||
      z-index: 10;
 | 
			
		||||
      font-size: 12px;
 | 
			
		||||
      font-weight: bold;
 | 
			
		||||
 | 
			
		||||
      &.left {
 | 
			
		||||
        right: 112px;
 | 
			
		||||
        top: 9px;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.right-bottom {
 | 
			
		||||
        right: 40px;
 | 
			
		||||
        top: 6px;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      &.right-top {
 | 
			
		||||
        right: 8px;
 | 
			
		||||
        top: 2px;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,7 @@ import {
 | 
			
		||||
  Inject,
 | 
			
		||||
  ViewChild,
 | 
			
		||||
} from '@angular/core';
 | 
			
		||||
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
 | 
			
		||||
import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dialog';
 | 
			
		||||
import { Store } from '@ngrx/store';
 | 
			
		||||
import { AppState } from '@core/core.state';
 | 
			
		||||
import { FormBuilder } from '@angular/forms';
 | 
			
		||||
@ -36,8 +36,8 @@ import { ActionNotificationShow } from '@core/notification/notification.actions'
 | 
			
		||||
import { beautifyJs } from '@shared/models/beautify.models';
 | 
			
		||||
import { CalculatedFieldsService } from '@core/http/calculated-fields.service';
 | 
			
		||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
 | 
			
		||||
import { CalculatedFieldScriptTestDialogData } from '@shared/models/calculated-field.models';
 | 
			
		||||
import { filter } from 'rxjs/operators';
 | 
			
		||||
import { CalculatedFieldTestScriptInputParams } from '@shared/models/calculated-field.models';
 | 
			
		||||
 | 
			
		||||
@Component({
 | 
			
		||||
  selector: 'tb-calculated-field-script-test-dialog',
 | 
			
		||||
@ -66,8 +66,9 @@ export class CalculatedFieldScriptTestDialogComponent extends DialogComponent<Ca
 | 
			
		||||
 | 
			
		||||
  constructor(protected store: Store<AppState>,
 | 
			
		||||
              protected router: Router,
 | 
			
		||||
              @Inject(MAT_DIALOG_DATA) public data: CalculatedFieldScriptTestDialogData,
 | 
			
		||||
              @Inject(MAT_DIALOG_DATA) public data: CalculatedFieldTestScriptInputParams,
 | 
			
		||||
              protected dialogRef: MatDialogRef<CalculatedFieldScriptTestDialogComponent, string>,
 | 
			
		||||
              private dialog: MatDialog,
 | 
			
		||||
              private fb: FormBuilder,
 | 
			
		||||
              private destroyRef: DestroyRef,
 | 
			
		||||
              private calculatedFieldService: CalculatedFieldsService) {
 | 
			
		||||
@ -101,13 +102,13 @@ export class CalculatedFieldScriptTestDialogComponent extends DialogComponent<Ca
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  save(): void {
 | 
			
		||||
    this.testScript().pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
 | 
			
		||||
    this.testScript(true).pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {
 | 
			
		||||
      this.calculatedFieldScriptTestFormGroup.get('expression').markAsPristine();
 | 
			
		||||
      this.dialogRef.close(this.calculatedFieldScriptTestFormGroup.get('expression').value);
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  private testScript(): Observable<string> {
 | 
			
		||||
  private testScript(onSave = false): Observable<string> {
 | 
			
		||||
    if (this.checkInputParamErrors()) {
 | 
			
		||||
      return this.calculatedFieldService.testScript({
 | 
			
		||||
        expression: this.calculatedFieldScriptTestFormGroup.get('expression').value,
 | 
			
		||||
@ -122,6 +123,9 @@ export class CalculatedFieldScriptTestDialogComponent extends DialogComponent<Ca
 | 
			
		||||
              }));
 | 
			
		||||
            return NEVER;
 | 
			
		||||
          } else {
 | 
			
		||||
            if (onSave) {
 | 
			
		||||
              this.dialog.closeAll();
 | 
			
		||||
            }
 | 
			
		||||
            return of(result.output);
 | 
			
		||||
          }
 | 
			
		||||
        }),
 | 
			
		||||
 | 
			
		||||
@ -127,7 +127,7 @@ export interface CalculatedFieldArgumentValue extends CalculatedFieldArgument {
 | 
			
		||||
  argumentName: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type CalculatedFieldTestScriptFn = (argumentsObj: Record<string, unknown>, expression: string, withApply?: boolean) => Observable<string>;
 | 
			
		||||
export type CalculatedFieldTestScriptFn = (calculatedField: CalculatedField, argumentsObj?: Record<string, unknown>) => Observable<string>;
 | 
			
		||||
 | 
			
		||||
export interface CalculatedFieldDialogData {
 | 
			
		||||
  value?: CalculatedField;
 | 
			
		||||
@ -136,20 +136,15 @@ export interface CalculatedFieldDialogData {
 | 
			
		||||
  debugLimitsConfiguration: string;
 | 
			
		||||
  tenantId: string;
 | 
			
		||||
  entityName?: string;
 | 
			
		||||
  additionalDebugActionConfig: AdditionalDebugActionConfig;
 | 
			
		||||
  additionalDebugActionConfig: AdditionalDebugActionConfig<(calculatedField: CalculatedField) => void>;
 | 
			
		||||
  testScriptFn: CalculatedFieldTestScriptFn;
 | 
			
		||||
  isDirty?: boolean;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface CalculatedFieldDebugDialogData {
 | 
			
		||||
  id?: CalculatedFieldId;
 | 
			
		||||
  entityId: EntityId;
 | 
			
		||||
  tenantId: string;
 | 
			
		||||
  expression?: string;
 | 
			
		||||
  testScriptFn: CalculatedFieldTestScriptFn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface CalculatedFieldScriptTestDialogData extends CalculatedFieldTestScriptInputParams {
 | 
			
		||||
  withApply: boolean;
 | 
			
		||||
  value: CalculatedField;
 | 
			
		||||
  getTestScriptDialogFn: CalculatedFieldTestScriptFn;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface CalculatedFieldTestScriptInputParams {
 | 
			
		||||
 | 
			
		||||
@ -203,13 +203,13 @@ export interface EntityDebugSettings {
 | 
			
		||||
  allEnabledUntil?: number;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface TestScriptResult {
 | 
			
		||||
export interface EntityTestScriptResult {
 | 
			
		||||
  output: string;
 | 
			
		||||
  error: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export interface AdditionalDebugActionConfig {
 | 
			
		||||
  action?: (id?: EntityId, ...restArguments: unknown[]) => void;
 | 
			
		||||
export interface AdditionalDebugActionConfig<Action = (...args: unknown[]) => void> {
 | 
			
		||||
  action?: Action;
 | 
			
		||||
  title: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -27,7 +27,7 @@ import { AppState } from '@core/core.state';
 | 
			
		||||
import { AbstractControl, UntypedFormGroup } from '@angular/forms';
 | 
			
		||||
import { RuleChainType } from '@shared/models/rule-chain.models';
 | 
			
		||||
import { DebugRuleNodeEventBody } from '@shared/models/event.models';
 | 
			
		||||
import { HasEntityDebugSettings } from '@shared/models/entity.models';
 | 
			
		||||
import { EntityTestScriptResult, HasEntityDebugSettings } from '@shared/models/entity.models';
 | 
			
		||||
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
 | 
			
		||||
 | 
			
		||||
export interface RuleNodeConfiguration {
 | 
			
		||||
@ -374,6 +374,8 @@ export interface TestScriptInputParams {
 | 
			
		||||
  msgType: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type TestScriptResult = EntityTestScriptResult;
 | 
			
		||||
 | 
			
		||||
export enum MessageType {
 | 
			
		||||
  POST_ATTRIBUTES_REQUEST = 'POST_ATTRIBUTES_REQUEST',
 | 
			
		||||
  POST_TELEMETRY_REQUEST = 'POST_TELEMETRY_REQUEST',
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1 @@
 | 
			
		||||
<!-- [TODO]: [Calculated Fields] add content -->
 | 
			
		||||
@ -0,0 +1 @@
 | 
			
		||||
<!-- [TODO]: [Calculated Fields] add content -->
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user