All files / lib/dynamic-form-element dynamic-form-element.ts

100% Statements 40/40
100% Branches 16/16
100% Functions 20/20
100% Lines 40/40

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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120                                                  536x                   536x 536x                   536x 536x 536x 536x 536x 536x 535x 535x 535x 535x     7x   59x 161x   40x 244x     199x 199x 199x           47x       199x 199x       9x       201x       535x 535x 3x 4x 2x 3x 1x   535x       172x       641x 352x   289x   184x   105x        
import { Subject } from 'rxjs';
import { DynamicFormClassType } from '../dynamic-form-config/dynamic-form-class-type';
import { DynamicFormExpressionChange } from '../dynamic-form-expression/dynamic-form-expression-change';
import { assignExpressions, assignExpressionData } from '../dynamic-form-expression/dynamic-form-expression-helpers';
import { DynamicFormField } from '../dynamic-form-field/dynamic-form-field';
import { DynamicForm } from '../dynamic-form/dynamic-form';
import { DynamicFormBuilder } from '../dynamic-form/dynamic-form.builder';
import { DynamicFormElementDefinition } from './dynamic-form-element-definition';
import { DynamicFormElementExpressionData } from './dynamic-form-element-expression-data';
import { DynamicFormElementExpressions } from './dynamic-form-element-expressions';
import { DynamicFormElementTemplate } from './dynamic-form-element-template';
import { DynamicFormElementType } from './dynamic-form-element-type';
 
export class DynamicFormElement<
  Template extends DynamicFormElementTemplate = DynamicFormElementTemplate,
  Definition extends DynamicFormElementDefinition<Template> = DynamicFormElementDefinition<Template>,
  Child extends DynamicFormElement<DynamicFormElementTemplate, DynamicFormElementDefinition, any> =
    DynamicFormElement<DynamicFormElementTemplate, DynamicFormElementDefinition, any>,
  ExpressionData extends DynamicFormElementExpressionData = DynamicFormElementExpressionData,
  Expressions extends DynamicFormElementExpressions<ExpressionData> = DynamicFormElementExpressions<ExpressionData>,
  Type extends DynamicFormElementType = DynamicFormElementType
> {
 
  protected readonly _builder: DynamicFormBuilder;
  protected _expressions: Expressions;
  protected _children: Child[] = [];
 
  readonly root: DynamicForm;
  readonly parent: DynamicFormElement;
  readonly parentField: DynamicFormField;
 
  readonly definition: Definition;
  readonly template: Template;
  readonly type: Type;
 
  readonly expressionChangesSubject = new Subject<DynamicFormExpressionChange>();
  readonly expressionChanges = this.expressionChangesSubject.asObservable();
  readonly expressionData: ExpressionData;
 
  constructor(
    builder: DynamicFormBuilder,
    root: DynamicForm,
    parent: DynamicFormElement,
    definition: Definition,
    type: Type,
  ) {
    this._builder = builder;
    this.root = root || (this as unknown as DynamicForm);
    this.parent = parent;
    this.parentField = DynamicFormElement.getParentField(root, parent);
    this.definition = definition;
    this.definition.template = definition.template || {} as Template;
    this.template = definition.template as Template;
    this.type = type;
    this.expressionData = this.createExpressionData();
    this._expressions = {} as Expressions;
  }
 
  get classType(): DynamicFormClassType { return 'element'; }
 
  get id(): string { return this.definition.id; }
  get hidden(): boolean { return this.template.hidden || this.parentField.hidden || false; }
 
  get expressions(): Expressions { return this._expressions; }
  get children(): Child[] { return this._children; }
 
  init(): void {
    this.initId();
    this.initExpressions();
    this.initChildren();
  }
 
  protected initId(): void {}
 
  protected getExpressions(): Expressions {
    return this._builder.createElementExpressions(this) as Expressions;
  }
 
  protected initExpressions(): void {
    this._expressions = this.getExpressions() || {} as Expressions;
    assignExpressions(this.template, this._expressions);
  }
 
  protected getChildren(): Child[] {
    return this._builder.createFormElements(this.root, this, this.definition.children) as Child[];
  }
 
  protected initChildren(): void {
    this._children = this.getChildren() || [];
  }
 
  protected createExpressionData(): ExpressionData {
    const expressionData = {} as ExpressionData;
    assignExpressionData(expressionData, {
      root: () => this.root.expressionData,
      parent: () => this.parent ? this.parent.expressionData : undefined,
      parentField: () => this.parentField.expressionData,
      id: () => this.id,
      hidden: () => this.hidden,
    });
    return expressionData;
  }
 
  protected extendExpressionData(expressions: { [key: string]: () => any }): void {
    assignExpressionData(this.expressionData, expressions);
  }
 
  private static getParentField(root: DynamicForm, parent: DynamicFormElement): DynamicFormField {
    if (!parent) {
      return root;
    }
    switch (parent.classType) {
      case 'field':
        return parent as DynamicFormField;
      default:
        return DynamicFormElement.getParentField(root, parent.parent);
    }
  }
}