Skip to content
Snippets Groups Projects
math-table.ts 2.62 KiB
Newer Older
  • Learn to ignore specific revisions
  • import { UIElement, UIElementProperties, UIElementType } from 'common/models/elements/element';
    import { AnswerScheme } from 'common/models/elements/answer-scheme-interfaces';
    import { Type } from '@angular/core';
    import { ElementComponent } from 'common/directives/element-component.directive';
    import { MathTableComponent } from 'common/components/input-elements/math-table.component';
    import { environment } from 'common/environment';
    import { InstantiationEror } from 'common/util/errors';
    import {
      BasicStyles,
      PropertyGroupGenerators,
      PropertyGroupValidators
    } from 'common/models/elements/property-group-interfaces';
    
    export class MathTableElement extends UIElement implements MathTableProperties {
      type: UIElementType = 'math-table';
      operation: 'addition' | 'subtraction' | 'multiplication' = 'addition';
      terms: string[] = ['123', '456', '789'];
      result: string = '';
      styling: BasicStyles;
    
      constructor(element?: MathTableProperties) {
        super(element);
        if (element && isValid(element)) {
          this.operation = element.operation;
          this.terms = [...element.terms];
          this.result = element.result;
          this.styling = { ...element.styling };
        } else {
          if (environment.strictInstantiation) {
            throw new InstantiationEror('Error at MathTable instantiation', element);
          }
          if (element?.operation !== undefined) this.operation = element.operation;
          if (element?.terms !== undefined) this.terms = [...element.terms];
          if (element?.result !== undefined) this.result = element.result;
          this.styling = PropertyGroupGenerators.generateBasicStyleProps(element?.styling);
        }
      }
    
      hasAnswerScheme(): boolean {
        return Boolean(this.getAnswerScheme);
      }
    
      getAnswerScheme(): AnswerScheme {
        return {
          id: this.id,
          type: 'string',
          format: 'math-table',
          multiple: false,
          nullable: false,
          values: [], // TODO: list of all possibilities?
          valuesComplete: this.operation !== 'multiplication'
        };
      }
    
      getElementComponent(): Type<ElementComponent> {
        return MathTableComponent;
      }
    
      getDuplicate(): MathTableElement {
        return new MathTableElement(this);
      }
    }
    
    export interface MathTableProperties extends UIElementProperties {
      operation: 'addition' | 'subtraction' | 'multiplication';
      terms: string[];
      result: string;
      styling: BasicStyles;
    }
    
    function isValid(blueprint?: MathTableProperties): boolean {
      if (!blueprint) return false;
      return blueprint.operation !== undefined &&
             blueprint.terms !== undefined &&
             blueprint.result !== undefined &&
             PropertyGroupValidators.isValidBasicStyles(blueprint.styling);
    }