Source: service/InputFieldService.js

(function() {
    /**
     * @typedef {Help4.service.Service.Params} Help4.service.InputFieldService.Params
     */

    /**
     * Contains helper methods for input fields
     * @augments Help4.service.Service
     */
    Help4.service.InputFieldService = class extends Help4.service.Service {
        /**
         * @override
         * @constructor
         * @param {Help4.service.InputFieldService.Params} params
         */
        constructor(params) {
            super(params);
        }

        /**
         * @typedef {Object} Help4.service.InputFieldService.Types
         * @property {'input'} input
         * @property {'textarea'} textarea
         * @property {'contentEditable'} contentEditable
         */
        /**
         * supported input field types
         * @memberof Help4.service.InputFieldService
         * @type {Help4.service.InputFieldService.Types}
         */
        static TYPES = {
            input: 'input',
            textarea: 'textarea',
            contentEditable: 'contentEditable'
        };

        /**
         * @param {HTMLElement} elem
         * @returns {?string}
         */
        static getType(elem) {
            const {TYPES}  = this;
            if (elem.nodeName === 'INPUT') return TYPES.input;
            if (elem.nodeName === 'TEXTAREA') return TYPES.textarea;
            if (Help4.Element.isContentEditable(elem)) return TYPES.contentEditable;

            // extend with more

            return null;
        }

        /**
         * @param {HTMLElement} elem
         * @returns {?string}
         */
        static getValue(elem) {
            const {TYPES}  = this;
            const type = this.getType(elem);

            switch (type) {
                case TYPES.input:
                case TYPES.textarea:
                case TYPES.contentEditable:
                    return Help4.Element.getValue(elem);
                // extend with more

                default:
                    return null;
            }
        }

        /**
         * @param {HTMLElement} elem
         * @param {string} value
         * @returns {boolean}
         */
        static setValue(elem, value) {
            const {TYPES}  = this;

            switch (this.getType(elem)) {
                case TYPES.input:
                case TYPES.textarea:
                    elem.value = value;
                    return true;
                case TYPES.contentEditable:
                    elem.innerText = value;
                    return true;
                // extend with more

                default:
                    return false;
            }
        }
    }
})();