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);