open-orchestra/open-orchestra-cms-bundle

View on GitHub
BackofficeBundle/Resources/public/ecmascript/OpenOrchestra/Service/Form/Behavior/AbstractBehavior.js

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * @class AbstractBehavior
 */
class AbstractBehavior
{
    /**
     * get extra events
     *
     * @return {Object}
     */
    getExtraEvents() {
        return {};
    }

    /**
     * bind extra events
     *
     * @param {Object} view - instance of AbstractFormView
     */
    bindExtraEvents(view) {
        let delegateEventSplitter = /^(\S+)\s*(.*)$/;
        let events = this.getExtraEvents();
        for (let key in events) {
            let method = events[key];
            if (!_.isFunction(method)) method = this[method];
            if (!method) continue;
            let match = key.match(delegateEventSplitter);
            let context = this;
            view.delegate(match[1], this.getSelector() + ' ' + match[2], function() {
                let mainArguments = Array.prototype.slice.call(arguments);
                mainArguments.push(context);
                return method.apply(view, mainArguments);
            });
        }
    }

    /**
     * return selector
     *
     * @return {String}
     */
    getSelector() {
        throw new TypeError("Please implement abstract method getSelector.");
    }

    /**
     * activate global behavior
     *
     * @param {Object} view - instance of AbstractFormView
     */
    activateBehavior(view) {
        let behavior = this;
        this.bindExtraEvents(view);
        $(this.getSelector(), view.$el).each(function(){
            behavior.activate($(this), view);
        });
    }

    /**
     * activate behavior on each instance
     *
     * @param {Object} element - JQuery object
     * @param {AbstractFormView} view
     */
    activate(element, view) {
    }

    /**
     * deactivate global behavior
     *
     * @param {Object} view - instance of AbstractFormView
     */
    deactivateBehavior(view) {
        let behavior = this;
        view.undelegateEvents();
        $(this.getSelector(), view.$el).each(function(){
            behavior.deactivate($(this));
        });
        view.delegateEvents();
    }

    /**
     * deactivate behavior on each instance
     *
     * @param {Object} element - JQuery object
     * @param {AbstractFormView} view
     */
    deactivate(element, view) {
    }
}

export default AbstractBehavior;