164 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			164 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
		
			Executable File
		
	
	
	
	
/*=========================================================
 | 
						|
            phpformbuilder dependent fields for jQuery
 | 
						|
            Author : Gilles Migliori
 | 
						|
            Version : 1.0.1
 | 
						|
=========================================================*/
 | 
						|
 | 
						|
(function($) {
 | 
						|
    $.fn.dependentFields = function(options) {
 | 
						|
        var settings = $.extend({
 | 
						|
                // defaults settings.
 | 
						|
                wrapperClass: 'hidden-wrapper',
 | 
						|
                showClass: 'on',
 | 
						|
                hideClass: 'off',
 | 
						|
                parentData: 'data-parent',
 | 
						|
                showValuesData: 'data-show-values',
 | 
						|
                inverseData: 'data-inverse'
 | 
						|
            }, options),
 | 
						|
            i;
 | 
						|
        $(this).each(function() {
 | 
						|
            var parentFieldClean = $(this).attr(settings.parentData).replace('[]', ''),
 | 
						|
                parentFieldFull = parentFieldClean,
 | 
						|
                showValues = $(this).attr(settings.showValuesData),
 | 
						|
                inverseData = $(this).attr(settings.inverseData),
 | 
						|
                that = this;
 | 
						|
 | 
						|
            if ($('*[name="' + parentFieldClean + '[]"]').get(0)) {
 | 
						|
                parentFieldFull = parentFieldClean + '[]';
 | 
						|
            }
 | 
						|
 | 
						|
            // don't split doubled-escaped commas
 | 
						|
            // https://codepen.io/migli/pen/qPOvZM/
 | 
						|
            showValues = showValues.replace('\\,', '{comma}');
 | 
						|
            showValues = showValues.split(/,\s*/);
 | 
						|
            for (var i = 0; i < showValues.length; i++) {
 | 
						|
                showValues[i] = showValues[i].replace('{comma}', ',');
 | 
						|
            }
 | 
						|
 | 
						|
            // convert to boolean
 | 
						|
            inverseData = inverseData == 'true' || inverseData > 0;
 | 
						|
 | 
						|
            // enable LCSwitch events
 | 
						|
            if ($('.lcswitch')[0]) {
 | 
						|
                $('body').delegate('.lcswitch', 'lcs-statuschange', function() {
 | 
						|
                    $(this).trigger('change');
 | 
						|
                });
 | 
						|
            }
 | 
						|
 | 
						|
            // ifChanged = iCheck event, changed.bs.select = bootstrap-select event
 | 
						|
            $('*[name="' + parentFieldFull + '"]').on('change ifChanged changed.bs.select', function() {
 | 
						|
                var isRadio = $(this).is(':radio'),
 | 
						|
                    isCheckbox = $(this).is(':checkbox'),
 | 
						|
                    value;
 | 
						|
 | 
						|
                /*
 | 
						|
                    If inverseData: value is the first non-showValues found, or undefined if none
 | 
						|
                    else, value is the first showValues found, or undefined if none
 | 
						|
                */
 | 
						|
 | 
						|
                if (inverseData !== true) {
 | 
						|
                    if (isRadio) {
 | 
						|
                        // undefined if none checked. Else, checked value.
 | 
						|
                        value = $('input[name="' + parentFieldFull + '"]:checked').val();
 | 
						|
                    } else if (isCheckbox) {
 | 
						|
                        value = [];
 | 
						|
                        $('input[name="' + parentFieldFull + '"]:checked').each(function() {
 | 
						|
                            value.push($(this).val());
 | 
						|
                        });
 | 
						|
                        if (value.length < 1) {
 | 
						|
                            value = undefined;
 | 
						|
                        }
 | 
						|
                    } else {
 | 
						|
                        value = $(this).val();
 | 
						|
                    }
 | 
						|
 | 
						|
                    // if checkbox or multiple select, we loop into selected values to find one corresponding to showValues
 | 
						|
                    if ((typeof value == 'object') & (value !== null)) {
 | 
						|
                        for (i = value.length - 1; i >= 0; i--) {
 | 
						|
                            if ($.inArray(value[i], showValues) > -1) {
 | 
						|
                                value = value[i];
 | 
						|
                                i = -1;
 | 
						|
                            }
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                } else {
 | 
						|
                    value = undefined;
 | 
						|
 | 
						|
                    /* =============================================
 | 
						|
                        register any value non-matching with showValues
 | 
						|
                    ============================================= */
 | 
						|
 | 
						|
                    if (isRadio) {
 | 
						|
                        // if checked value is not in showValues.
 | 
						|
                        if ($.inArray($('input[name="' + parentFieldFull + '"]:checked').val(), showValues) < 0) {
 | 
						|
                            value = $('input[name="' + parentFieldFull + '"]:checked').val();
 | 
						|
                        }
 | 
						|
                    } else if (isCheckbox) {
 | 
						|
                        value = [];
 | 
						|
                        $('input[name="' + parentFieldFull + '"]:checked').each(function() {
 | 
						|
                            if ($.inArray($(this).val(), showValues) < 0) {
 | 
						|
                                value.push($(this).val());
 | 
						|
                            }
 | 
						|
                        });
 | 
						|
                        if (value.length < 1) {
 | 
						|
                            value = undefined;
 | 
						|
                        }
 | 
						|
                    } else {
 | 
						|
                        if ($.inArray($(this).val(), showValues) < 0) {
 | 
						|
                            value = $(this).val();
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
 | 
						|
                    // if checkbox or multiple select, keep only first value as string
 | 
						|
                    if (typeof value == 'object') {
 | 
						|
                        value = value[0];
 | 
						|
                    }
 | 
						|
                }
 | 
						|
                // console.log(parentFieldFull + ' value = ' + value);
 | 
						|
 | 
						|
                if ($.inArray(value, showValues) > -1) {
 | 
						|
                    // if value found in showValues
 | 
						|
                    if (inverseData !== true) {
 | 
						|
                        // Show
 | 
						|
                        $(that).removeClass(settings.hideClass).addClass(settings.showClass);
 | 
						|
                        $(that).children().not('.hidden-wrapper').prop('disabled', false);
 | 
						|
                    }
 | 
						|
                } else {
 | 
						|
                    // if value NOT found in showValues
 | 
						|
                    if (inverseData === true && value !== undefined) {
 | 
						|
                        // Show
 | 
						|
                        $(that).removeClass(settings.hideClass).addClass(settings.showClass);
 | 
						|
                        $(that).children().not('.hidden-wrapper').prop('disabled', false);
 | 
						|
                    } else {
 | 
						|
                        // Hide
 | 
						|
                        $(that).removeClass(settings.showClass).addClass(settings.hideClass);
 | 
						|
                        $(that).children().not('.hidden-wrapper').prop('disabled', true);
 | 
						|
                    }
 | 
						|
                }
 | 
						|
 | 
						|
                return;
 | 
						|
            });
 | 
						|
            var arr = [];
 | 
						|
            var $current = $('*[name="' + parentFieldFull + '"]');
 | 
						|
            $current.each(function() {
 | 
						|
                if ($.inArray(parentFieldClean, arr) === -1) {
 | 
						|
                    if ($(this).next('.iCheck-helper').length > 0 && $(this).is(':checked')) {
 | 
						|
                        // if ICheck
 | 
						|
                        $(this).trigger('ifChanged');
 | 
						|
                        arr.push(parentFieldClean);
 | 
						|
                    } else if ($(this).parent('.bootstrap-select').length > 0 && $(this).val() !== '') {
 | 
						|
                        // if bootstrap-select
 | 
						|
                        $(this).trigger('changed.bs.select');
 | 
						|
                        arr.push(parentFieldClean);
 | 
						|
                    } else {
 | 
						|
                        if ($(this).is(':checked') || ($(this).val() !== '' && !$(this).is(':checkbox') && !$(this).is(':radio'))) {
 | 
						|
                            $(this).trigger('change');
 | 
						|
                            arr.push(parentFieldClean);
 | 
						|
                        }
 | 
						|
                    }
 | 
						|
                }
 | 
						|
            });
 | 
						|
        });
 | 
						|
    };
 | 
						|
})(jQuery);
 |