InputNumber.js 4.54 KB
import template from "./InputNumber.html";

class InputNumber {
    props = {
        defaultValue: Number,
        min: Number,
        max: Number,
        onChange: Function,
        value: Number,
        precision: Number,
        key: Number,
        step: Number,
        formatter: Function,
        parser: Function,
        disabled: Boolean,
    };

    state = {
        value: this.props.value || this.props.defaultValue,
        min: Number(this.props.min),
        max: Number(this.props.max),
        precision: Number(this.props.precision) || 0,
        key: Number(this.props.key),
        step: this.props.step || 1,
    };

    watch = {
        value: function (newVal) {
            this.setValue(newVal);
        },
        disabled: function (newVal) {
            if (newVal === undefined || newVal === "false" || newVal === "0") {
                this.state.disabled = false;
            } else if (
                newVal === "true" ||
                newVal === "1" ||
                newVal === "disabled"
            ) {
                this.state.disabled = true;
            }
        },
    };

    constructor() {
        this.inputElement = $element[0].querySelector("input");
        $element[0].removeAttribute("ng-class");
        $element[0].removeAttribute("value");
        $element[0].removeAttribute("formatter");
        $element[0].removeAttribute("parser");
        $element[0].removeAttribute("on-change");
        $element[0].removeAttribute("disabled");
    }

    multiply(num1, num2) {
        let baseNum = 0;
        try {
            baseNum += num1.toString().split(".")[1].length;
        } catch (e) {}
        try {
            baseNum += num2.toString().split(".")[1].length;
        } catch (e) {}
        return (
            (Number(num1.toString().replace(".", "")) *
                Number(num2.toString().replace(".", ""))) /
            Math.pow(10, baseNum)
        );
    }

    toFixed(value, number = 2) {
        return parseFloat(
            Math.floor(this.multiply(value, Math.pow(10, number))) /
                Math.pow(10, number)
        ).toFixed(number);
    }

    setValue(value) {
        if (this.props.parser({ value: value }) !== undefined) {
            value = this.props.parser({ value: value });
        }
        if (
            this.state.max !== null &&
            this.state.max !== undefined &&
            value !== "" &&
            value > this.state.max
        ) {
            value = this.state.max;
        }
        if (
            this.state.min !== null &&
            this.state.min !== undefined &&
            value !== "" &&
            value < this.state.min
        ) {
            value = this.state.min;
        }
        
        if (!/\d+/.test(value)) {
            this.state.value = "";
            value = "";
        }

        if (this.state.precision === 0 && value !== "") {
            value = parseInt(value);
        }
        if (this.state.precision > 0 && value !== "") {
            value = this.toFixed(value, this.state.precision);
        }
        if (this.props.formatter({ value: value }) !== undefined) {
            value = this.props.formatter({ value: value });
        }
        this.state.value = value;
        if (this.props.parser({ value: value || "" }) !== undefined) {
            value = this.props.parser({ value: value || "" });
        }
        this.props.onChange({ value: value });
    }

    sum(num1, num2) {
        return ((this.pow(num1) + this.pow(num2)) / this.pow(1)).toFixed(
            this.props.precision
        );
    }

    reduce(num1, num2) {
        return ((this.pow(num1) - this.pow(num2)) / this.pow(1)).toFixed(
            this.props.precision
        );
    }

    pow(number, baseNum) {
        let str = String(number);
        if (str.indexOf(".") !== -1) {
            return parseInt(str.replace(".", ""));
        } else {
            return number * Math.pow(10, baseNum || this.props.precision || 0);
        }
    }

    handleClick(type) {
        let value = null;
        if (!this.state.value) {
            value = 0;
        } else {
            value = this.state.value;
        }
        if (this.props.parser({ value: value || "" })) {
            value = this.props.parser({ value: value || "" });
        }
        if (type === "up") {
            this.setValue(this.sum(value, this.state.step));
        } else {
            this.setValue(this.reduce(value, this.state.step));
        }
    }

    handleClickInput(event) {
        this.state.inputEvent = event;
    }

    handleBlur(event) {
        this.setValue(event.target.value);
    }
}