sharetribe/sharetribe

View on GitHub
app/assets/javascripts/admin2/listing_shapes.js

Summary

Maintainability
F
3 days
Test Coverage
window.ST = window.ST || {};

window.ST.initializeListingShapeForm = function(formId) {
    $(formId).validate({
        errorPlacement: function(error, element) {
            if (element.hasClass("js-custom-unit-kind-radio")) {
                error.appendTo($(".js-custom-unit-kind-container"));
            } else if ($(element).parents('.multiple-languages-input').length) {
                $(error).insertAfter($(element).parents('.multiple-languages-input'));
                error.addClass('form-text');
                $(element).parents('.multiple-languages-input').find('.input-group-text').addClass('attention');
            } else {
                error.insertAfter(element);
            }
        }
    });

    var initializeState = function(state) {
        toggleOnlinePaymentEnabled(state.priceEnabled);
        toggleUnitsEnabled(state.priceEnabled && !state.availabilityEnabled);
        toggleShippingEnabled(state.onlinePaymentsEnabled);
        toggleAvailabilityEnabled(state.onlinePaymentsEnabled);
        toggleAvailabilityUnitsEnabled(state.availabilityEnabled);
    };

    var isChecked = function(el) {
        return el.is(':checked');
    };

    var isPriceEnabled = isChecked;
    var isOnlinePaymentsEnabled = isChecked;
    var isAvailabilityEnabled = isChecked;

    var priceChanged = function(currentEl) {
        var enabled = isPriceEnabled(currentEl);

        if(enabled) {
            toggleOnlinePaymentEnabled(true);
            toggleUnitsEnabled(true);
        } else {
            toggleOnlinePaymentEnabled(false);
            toggleShippingEnabled(false);
            toggleUnitsEnabled(false);
            toggleAvailabilityEnabled(false);
            toggleAvailabilityUnitsEnabled(false);
        }
    };

    var onlinePaymentsChanged = function(currentEl) {
        var enabled = isOnlinePaymentsEnabled(currentEl);

        if(enabled) {
            toggleAvailabilityEnabled(true);
            toggleShippingEnabled(true);
            toggleUnitsEnabled(true);
        } else {
            toggleAvailabilityEnabled(false);
            toggleAvailabilityUnitsEnabled(false);
            toggleShippingEnabled(false);
            toggleUnitsEnabled(true);
        }
    };

    var availabilityChanged = function(currentEl) {
        var enabled = isAvailabilityEnabled(currentEl);

        if(enabled) {
            toggleAvailabilityUnitsEnabled(true);
            toggleUnitsEnabled(false);
        } else {
            toggleAvailabilityUnitsEnabled(false)
            toggleUnitsEnabled(true);
        }
    }

    var toggleOnlinePaymentEnabled = function(enabled) {
        toggleCheckboxEnabled($(".js-online-payments"), enabled);
        toggleLabelEnabled($(".js-online-payments-label"), enabled);
    };

    var toggleShippingEnabled = function(enabled) {
        toggleCheckboxEnabled($(".js-shipping-enabled"), enabled);
        toggleLabelEnabled($(".js-shipping-enabled-label"), enabled);
    };

    var toggleUnitsEnabled = function(enabled) {
        toggleCheckboxEnabled($(".js-unit-checkbox"), enabled);
        toggleLabelEnabled($(".js-unit-label"), enabled);
        toggleInfoEnabled($('.js-pricing-units-info'), enabled);
        toggleCustomUnitsEnabled(enabled);
    };

    var toggleCustomUnitsEnabled = function(enabled) {
        toggleLabelEnabled($(".js-listing-shape-add-custom-unit-link"), enabled);
        toggleInputEnabled($('.hidden-unit-div input:hidden'), enabled);
    };

    var toggleAvailabilityEnabled = function(enabled) {
        toggleCheckboxEnabled($(".js-availability"), enabled);
        toggleLabelEnabled($(".js-availability-label"), enabled);
    };

    var toggleAvailabilityUnitsEnabled = function(enabled) {
        toggleRadioEnabled($(".js-availability-unit"), enabled);
        toggleLabelEnabled($(".js-availability-unit-label"), enabled);
        toggleInfoEnabled($('.js-pricing-units-disabled-info'), enabled)
    };

    var removeCustomUnit = function() {
        var index = $(this).data("customunitindex");
        if (typeof index !== "undefined") {
            $('.js-custom-unit-' + index).remove();
        }
    };

    var closeCustomUnitForm = function() {
        this.parentElement.remove();
    };

    var toggleCheckboxEnabled = function(el, state) {
        toggleInputEnabled(el, state);

        if (!state) {
            el.prop('checked', false);
        }
    };

    var toggleInputEnabled = function(el, state) {
        if(state) {
            el.prop('disabled', false);
        } else {
            el.prop('disabled', true);
        }
    };

    var toggleRadioEnabled = function(el, state) {
        if(state) {
            el.prop('disabled', false);

            // Check the first one if none of the radiobuttons is checked
            if (!el.is(":checked")) {
                el.first().prop('checked', true);
            }
        } else {
            el.prop('disabled', true);
            el.prop('checked', false);
        }
    };

    var toggleInfoEnabled = function(el, state) {
        if (state) {
            el.show();
        } else {
            el.hide();
        }
    };

    var toggleLabelEnabled = function(el, state) {
        el.toggleClass('opacity_035', !state);
    };

    $('.js-price-enabled').change(function() {
        priceChanged($(this));
    });
    $('.js-online-payments').change(function() {
        onlinePaymentsChanged($(this));
    });
    $('.js-availability').click(function() {
        availabilityChanged($(this));
    });

    $('.js-listing-shape-close-custom-unit-form').click(closeCustomUnitForm);
    $('.js-remove-custom-unit').click(removeCustomUnit);

    // Run once on init
    initializeState({
        priceEnabled: isPriceEnabled($('.js-price-enabled')),
        onlinePaymentsEnabled: isOnlinePaymentsEnabled($('.js-online-payments')),
        availabilityEnabled: isAvailabilityEnabled($('.js-availability')),
    })
};