All files / lib/dynamic-form-field dynamic-form-field-expression.ts

100% Statements 16/16
100% Branches 1/1
100% Functions 7/7
100% Lines 16/16

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48                              6x 6x 6x 6x   6x 6x       11x 11x 11x 8x           11x       11x     19x 11x   41x 11x    
import { DynamicFormElementExpression } from '../dynamic-form-element/dynamic-form-element-expression';
import { DynamicFormExpressionMemoization } from '../dynamic-form-expression/dynamic-form-expression-memoization';
import { DynamicFormErrorHandler } from '../dynamic-form-error/dynamic-form-error.handler';
import { DynamicFormField } from './../dynamic-form-field/dynamic-form-field';
import { DynamicFormFieldExpressionData } from './dynamic-form-field-expression-data';
import { DynamicFormFieldExpressionFunc } from './dynamic-form-field-expression-func';
 
export class DynamicFormFieldExpression<
  Data extends DynamicFormFieldExpressionData = DynamicFormFieldExpressionData,
  Func extends DynamicFormFieldExpressionFunc<Data> = DynamicFormFieldExpressionFunc<Data>
> extends DynamicFormElementExpression<Data, Func> {
 
  protected _memo: DynamicFormExpressionMemoization;
 
  constructor(
    override readonly key: string,
    readonly field: DynamicFormField,
    override readonly func: Func,
    protected override errorHandler: DynamicFormErrorHandler,
  ) {
    super(key, field, func, errorHandler);
    this._memo = { previousValue: undefined, currentValue: undefined };
  }
 
  override get value(): any {
    this.previousValue = this.currentValue;
    this.currentValue = this.tryEvaluate();
    if (this.previousValue !== this.currentValue) {
      this.field.expressionChangesSubject.next({
        key: this.key,
        previousValue: this.previousValue,
        currentValue: this.currentValue,
      });
    }
    return this.currentValue;
  }
 
  protected override evaluate(): any {
    return this.func(this.field.expressionData as Data, this._memo);
  }
 
  private get previousValue(): any { return this._memo.previousValue; }
  private set previousValue(value: any) { this._memo.previousValue = value; }
 
  private get currentValue(): any { return this._memo.currentValue; }
  private set currentValue(value: any) { this._memo.currentValue = value; }
}