Skip to content
Snippets Groups Projects
math-table.ts 4.1 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: 'variable' | 'addition' | 'subtraction' | 'multiplication' = 'addition';
    
    rhenck's avatar
    rhenck committed
      terms: string[] = ['123', '456'];
    
      result: string = '';
    
      variableLayoutOptions: {
        allowArithmeticChars: boolean;
        isFirstLineUnderlined: boolean;
        showResultRow: boolean;
        showTopHelperRows: boolean;
        allowFirstLineCrossOut: boolean; } = {
          allowArithmeticChars: false,
          isFirstLineUnderlined: true,
          showResultRow: false,
          showTopHelperRows: false,
          allowFirstLineCrossOut: false
        };
    
    
      styling: BasicStyles & {
    
    
      constructor(element?: MathTableProperties) {
        super(element);
        if (element && isValid(element)) {
          this.operation = element.operation;
          this.terms = [...element.terms];
          this.result = element.result;
    
          this.variableLayoutOptions = { ...element.variableLayoutOptions };
    
          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;
    
          if (element?.variableLayoutOptions !== undefined) this.variableLayoutOptions = { ...element.variableLayoutOptions };
    
          this.styling = {
            ...PropertyGroupGenerators.generateBasicStyleProps(element?.styling),
    
      setProperty(property: string, value: unknown): void {
        if (Object.keys(this.variableLayoutOptions).includes(property)) {
          this.variableLayoutOptions[property as keyof typeof this.variableLayoutOptions] = value as boolean;
        } else {
          super.setProperty(property, value);
        }
      }
    
    
      getAnswerScheme(): AnswerScheme {
        return {
          id: this.id,
          type: 'string',
          format: 'math-table',
          multiple: false,
          nullable: false,
    
          values: [],
          valuesComplete: false
    
        };
      }
    
      getElementComponent(): Type<ElementComponent> {
        return MathTableComponent;
      }
    
      getDuplicate(): MathTableElement {
        return new MathTableElement(this);
      }
    }
    
    export interface MathTableProperties extends UIElementProperties {
    
      operation: 'variable' | 'addition' | 'subtraction' | 'multiplication';
    
      terms: string[];
      result: string;
    
      variableLayoutOptions: {
        allowArithmeticChars: boolean;
        isFirstLineUnderlined: boolean;
        showResultRow: boolean;
        showTopHelperRows: boolean;
        allowFirstLineCrossOut: boolean;
      }
    
      styling: BasicStyles & {
    
    }
    
    function isValid(blueprint?: MathTableProperties): boolean {
      if (!blueprint) return false;
      return blueprint.operation !== undefined &&
             blueprint.terms !== undefined &&
             blueprint.result !== undefined &&
    
             blueprint.variableLayoutOptions !== undefined &&
             blueprint.variableLayoutOptions.allowArithmeticChars !== undefined &&
             blueprint.variableLayoutOptions.isFirstLineUnderlined !== undefined &&
             blueprint.variableLayoutOptions.showResultRow !== undefined &&
             blueprint.variableLayoutOptions.showTopHelperRows !== undefined &&
             blueprint.variableLayoutOptions.allowFirstLineCrossOut !== undefined &&
    
             PropertyGroupValidators.isValidBasicStyles(blueprint.styling);
    }