Home Reference Source

js/template/TIO/TIOOutputTemplate.js

import Template, {TemplateType} from '~/template/Template';
import ErrorManager from '~/helpers/ErrorManager';
import {filter, forEach} from '~/modern/array';

/**
 * TIO output template. **Unique** instance per template.
 */
export default class TIOOutputTemplate extends Template {
    /** @override */
    constructor() {
        let elem = document.createElement("div");
        elem.classList.add('result');

        let textHolder = document.createElement("div");
        elem.appendChild(textHolder);

        super(elem, TemplateType.none);

        this._textbox = textHolder;
    }

    /**
     * Sets the text
     * @type {string} text - String to set to
     */
    setText(text) {
        while (this._textbox.hasChildNodes()) {
            this._textbox.removeChild(this._textbox.firstChild);
        }
        this._textbox.appendChild(document.createTextNode(text));
    }

    /**
     * Sets the TIO state.
     * @param {TIOOutputState} state - output state
     */
    setState(state) {
        let node = this.underlyingNode;

        node.classList
            ::filter(className => className.indexOf('state-') === 0)
            ::forEach(::node.classList.remove);

        switch (state) {
            case TIOOutputState.Default:
                break;
            case TIOOutputState.STDOUT:
                node.classList.add('state-stdout');
                break;
            case TIOOutputState.STDERR:
                node.classList.add('state-stderr');
                break;
            default:
                ErrorManager.raise(`Invalid state ${state} given.`, TIOOutputBadState);
        }
    }
}

export const TIOOutputBadState = Symbol('TIO.TIOOutputTemplateError.BadState');
export const TIOOutputState = {
    Default: 0,
    STDOUT: 1,
    STDERR: 2
};