mirror of
https://github.com/10h30/ultimatemember.git
synced 2026-06-05 15:09:37 +09:00
completely rewritten the JS logic for conditional fields for editing forms
This commit is contained in:
+381
-596
@@ -1,602 +1,387 @@
|
||||
function condition_fields() {
|
||||
var first_group = 0,
|
||||
state_array = [],
|
||||
count = state_array.length,
|
||||
state = 'show';
|
||||
|
||||
jQuery('.um-profile-body .um-field, .um-profile-body .um-field').each(function () {
|
||||
var conds = jQuery(this).attr('data-conds');
|
||||
|
||||
if ( conds ){
|
||||
var array = JSON.parse(conds);
|
||||
|
||||
jQuery.each(array, function() {
|
||||
var action = this[0],
|
||||
field = this[1],
|
||||
op = this[2],
|
||||
val = this[3],
|
||||
group = this[5],
|
||||
depend_field;
|
||||
|
||||
var input = jQuery('.um-profile-body .um-field[data-key="'+field+'"] .um-field-area input'),
|
||||
select = jQuery('.um-profile-body .um-field[data-key="'+field+'"] .um-field-area>select'),
|
||||
textarea = jQuery('.um-profile-body .um-field[data-key="'+field+'"] .um-field-area>textarea'),
|
||||
content_block = jQuery('.um-profile-body .um-field[data-key="'+field+'"] .um-field-block');
|
||||
|
||||
if( input.length > 0 && select.length === 0 ){
|
||||
|
||||
if( input.is(':checkbox') ){
|
||||
var checked = jQuery('.um-profile-body .um-field[data-key="'+field+'"] input:checked');
|
||||
checked.each(function () {
|
||||
var checked_vals = jQuery(this).val();
|
||||
|
||||
if( checked_vals === val ){
|
||||
depend_field = val;
|
||||
}
|
||||
|
||||
});
|
||||
} else if( input.is(':radio')) {
|
||||
depend_field = jQuery('.um-profile-body .um-field[data-key="'+field+'"] input:checked').val();
|
||||
} else {
|
||||
depend_field = input.val();
|
||||
}
|
||||
|
||||
} else if( select.length > 0 ){
|
||||
|
||||
if( jQuery.inArray( val, select.val() ) > 0 ){
|
||||
depend_field = val;
|
||||
} else {
|
||||
depend_field = select.val()
|
||||
}
|
||||
|
||||
} else if( textarea.length > 0 ){
|
||||
|
||||
depend_field = textarea.val();
|
||||
|
||||
} else if( content_block.length > 0 ){
|
||||
|
||||
depend_field = content_block.text();
|
||||
|
||||
}
|
||||
|
||||
if( parseInt(group) !== first_group ){
|
||||
|
||||
if ( action === 'show') {
|
||||
|
||||
switch (op) {
|
||||
case 'equals to':
|
||||
if( depend_field == val ){
|
||||
state = 'show';
|
||||
} else {
|
||||
state = 'hide';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'not equals':
|
||||
if( depend_field != val ){
|
||||
state = 'show';
|
||||
} else {
|
||||
state = 'hide';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'empty':
|
||||
if( !depend_field || depend_field === '' ){
|
||||
state = 'show';
|
||||
} else {
|
||||
state = 'hide';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'not empty':
|
||||
if( depend_field && depend_field !== '' ){
|
||||
state = 'show';
|
||||
} else {
|
||||
state = 'hide';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'greater than':
|
||||
if( jQuery.isNumeric(val) && jQuery.isNumeric(depend_field) ){
|
||||
if( val > depend_field ){
|
||||
state = 'show'
|
||||
} else {
|
||||
state = 'hide'
|
||||
}
|
||||
} else {
|
||||
state = 'hide';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'less than':
|
||||
if( jQuery.isNumeric(val) && jQuery.isNumeric(depend_field) ){
|
||||
if( val < depend_field ){
|
||||
state = 'show'
|
||||
} else {
|
||||
state = 'hide'
|
||||
}
|
||||
} else {
|
||||
state = 'hide';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'contains':
|
||||
if( depend_field.search(val) >= 0 ){
|
||||
state = 'show';
|
||||
} else {
|
||||
state = 'hide';
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
} else { // if hide
|
||||
|
||||
switch (op) {
|
||||
case 'equals to':
|
||||
if (depend_field == val) {
|
||||
state = 'hide';
|
||||
} else {
|
||||
state = 'show';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'not equals':
|
||||
if (depend_field != val) {
|
||||
state = 'hide';
|
||||
} else {
|
||||
state = 'show';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'empty':
|
||||
if (!depend_field || depend_field === '') {
|
||||
state = 'hide';
|
||||
} else {
|
||||
state = 'show';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'not empty':
|
||||
if (depend_field && depend_field !== '') {
|
||||
state = 'hide';
|
||||
} else {
|
||||
state = 'show';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'greater than':
|
||||
if (jQuery.isNumeric(val) && jQuery.isNumeric(depend_field)) {
|
||||
if (val > depend_field) {
|
||||
state = 'hide'
|
||||
} else {
|
||||
state = 'show'
|
||||
}
|
||||
} else {
|
||||
state = 'show';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'less than':
|
||||
if (jQuery.isNumeric(val) && jQuery.isNumeric(depend_field)) {
|
||||
if (val < depend_field) {
|
||||
state = 'hide'
|
||||
} else {
|
||||
state = 'show'
|
||||
}
|
||||
} else {
|
||||
state = 'show';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'contains':
|
||||
if (depend_field.search(val) >= 0) {
|
||||
state = 'hide';
|
||||
} else {
|
||||
state = 'show';
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
first_group++;
|
||||
state_array.push(state);
|
||||
} else {
|
||||
|
||||
if ( action === 'show') {
|
||||
|
||||
switch (op) {
|
||||
case 'equals to':
|
||||
if( depend_field == val ){
|
||||
state = 'show';
|
||||
} else {
|
||||
state = 'not_show';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'not equals':
|
||||
if( depend_field != val ){
|
||||
state = 'show';
|
||||
} else {
|
||||
state = 'not_show';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'empty':
|
||||
if( !depend_field || depend_field === '' ){
|
||||
state = 'show';
|
||||
} else {
|
||||
state = 'not_show';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'not empty':
|
||||
if( depend_field && depend_field !== '' ){
|
||||
state = 'show';
|
||||
} else {
|
||||
state = 'not_show';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'greater than':
|
||||
if( jQuery.isNumeric(val) && jQuery.isNumeric(depend_field) ){
|
||||
if( val > depend_field ){
|
||||
state = 'show'
|
||||
} else {
|
||||
state = 'not_show'
|
||||
}
|
||||
} else {
|
||||
state = 'not_show';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'less than':
|
||||
if( jQuery.isNumeric(val) && jQuery.isNumeric(depend_field) ){
|
||||
if( val < depend_field ){
|
||||
state = 'show'
|
||||
} else {
|
||||
state = 'not_show'
|
||||
}
|
||||
} else {
|
||||
state = 'not_show';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'contains':
|
||||
if( depend_field.search(val) >= 0 ){
|
||||
state = 'show';
|
||||
} else {
|
||||
state = 'not_show';
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
} else { // if hide
|
||||
|
||||
switch (op) {
|
||||
case 'equals to':
|
||||
if (depend_field == val) {
|
||||
state = 'hide';
|
||||
} else {
|
||||
state = 'not_hide';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'not equals':
|
||||
if (depend_field != val) {
|
||||
state = 'hide';
|
||||
} else {
|
||||
state = 'not_hide';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'empty':
|
||||
if (!depend_field || depend_field === '') {
|
||||
state = 'hide';
|
||||
} else {
|
||||
state = 'not_hide';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'not empty':
|
||||
if (depend_field && depend_field !== '') {
|
||||
state = 'hide';
|
||||
} else {
|
||||
state = 'not_hide';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'greater than':
|
||||
if (jQuery.isNumeric(val) && jQuery.isNumeric(depend_field)) {
|
||||
if (val > depend_field) {
|
||||
state = 'hide'
|
||||
} else {
|
||||
state = 'not_hide'
|
||||
}
|
||||
} else {
|
||||
state = 'not_hide';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'less than':
|
||||
if (jQuery.isNumeric(val) && jQuery.isNumeric(depend_field)) {
|
||||
if (val < depend_field) {
|
||||
state = 'hide'
|
||||
} else {
|
||||
state = 'not_hide'
|
||||
}
|
||||
} else {
|
||||
state = 'not_hide';
|
||||
}
|
||||
break;
|
||||
|
||||
case 'contains':
|
||||
if (depend_field.search(val) >= 0) {
|
||||
state = 'hide';
|
||||
} else {
|
||||
state = 'not_hide';
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
if( state_array[count] ){
|
||||
if( state_array[count] === 'show' || state_array[count] === 'not_hide' ){
|
||||
if ( state === 'show' || state === 'not_hide' ){
|
||||
state_array[count] = 'show';
|
||||
} else {
|
||||
state_array[count] = 'hide';
|
||||
}
|
||||
} else {
|
||||
state_array[count] = 'hide';
|
||||
}
|
||||
} else {
|
||||
if ( state === 'show' || state === 'not_hide' ){
|
||||
state_array[count] = 'show';
|
||||
} else {
|
||||
state_array[count] = 'hide';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
if( jQuery.inArray( 'show', state_array ) < 0 ){
|
||||
jQuery(this).hide();
|
||||
} else {
|
||||
jQuery(this).show();
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
jQuery(document).ready( function (){
|
||||
|
||||
var arr_all_conditions = []; //raw
|
||||
var um_field_conditions = {}; // filtered
|
||||
var um_field_default_values = {};
|
||||
condition_fields();
|
||||
|
||||
/**
|
||||
* Get field default value
|
||||
* @param object $dom
|
||||
* @return string
|
||||
*/
|
||||
function um_get_field_default_value( $dom ) {
|
||||
var default_value = '';
|
||||
var type = um_get_field_type($dom);
|
||||
switch ( type ) {
|
||||
|
||||
case 'text':
|
||||
case 'number':
|
||||
case 'date':
|
||||
case 'textarea':
|
||||
case 'select':
|
||||
default_value = $dom.find('input:text,input[type=number],textarea,select').val();
|
||||
break;
|
||||
|
||||
case 'multiselect':
|
||||
default_value = $dom.find('select').val();
|
||||
break;
|
||||
|
||||
case 'radio':
|
||||
if ($dom.find('input[type=radio]:checked').length >= 1) {
|
||||
default_value = $dom.find('input[type=radio]:checked').val();
|
||||
}
|
||||
|
||||
break;
|
||||
case 'checkbox':
|
||||
|
||||
if ($dom.find('input[type=checkbox]:checked').length >= 1) {
|
||||
|
||||
if ($dom.find('input[type=checkbox]:checked').length > 1) {
|
||||
$dom.find('input[type=checkbox]:checked').each(function () {
|
||||
default_value = default_value + jQuery(this).val() + ' ';
|
||||
});
|
||||
} else {
|
||||
default_value = $dom.find('input[type=checkbox]:checked').val();
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return {type: type, value: default_value};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get field element by field wrapper
|
||||
* @param object $dom
|
||||
* @return object
|
||||
*/
|
||||
function um_get_field_element( $dom ) {
|
||||
var default_value = '';
|
||||
var type = um_get_field_type($dom);
|
||||
|
||||
switch ( type ) {
|
||||
|
||||
case 'text':
|
||||
case 'number':
|
||||
case 'date':
|
||||
case 'textarea':
|
||||
case 'select':
|
||||
case 'multiselect':
|
||||
case 'radio':
|
||||
case 'checkbox':
|
||||
return $dom.find('input,textarea,select');
|
||||
break;
|
||||
|
||||
|
||||
}
|
||||
|
||||
return '';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get field type
|
||||
* @param object $dom
|
||||
* @return string
|
||||
*/
|
||||
function um_get_field_type($dom) {
|
||||
var type = '';
|
||||
var classes = $dom.attr( 'class' );
|
||||
jQuery.each( classes.split(' '), function (i, d) {
|
||||
if (d.indexOf('um-field-type') != -1) {
|
||||
type = d.split('_')[1];
|
||||
}
|
||||
});
|
||||
|
||||
return type;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Get field siblings/chidren conditions
|
||||
* @param string field_key
|
||||
* @return array
|
||||
*/
|
||||
function um_get_field_children(field_key) {
|
||||
var arr_conditions = [];
|
||||
jQuery.each(arr_all_conditions, function (ii, condition) {
|
||||
if (condition.field.parent == field_key) {
|
||||
arr_conditions.push(condition.field.condition);
|
||||
}
|
||||
});
|
||||
|
||||
return arr_conditions;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Split single array to multi-dimensional array
|
||||
* @param array arr
|
||||
* @param integer n
|
||||
* @return array
|
||||
*/
|
||||
function um_splitup_array(arr, n) {
|
||||
var rest = arr.length % n,
|
||||
restUsed = rest,
|
||||
partLength = Math.floor(arr.length / n),
|
||||
result = [];
|
||||
|
||||
for (var i = 0; i < arr.length; i += partLength) {
|
||||
var end = partLength + i,
|
||||
add = false;
|
||||
|
||||
if (rest !== 0 && restUsed) {
|
||||
end++;
|
||||
restUsed--;
|
||||
add = true;
|
||||
}
|
||||
|
||||
result.push(arr.slice(i, end));
|
||||
|
||||
if (add) {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
var obj_result = [];
|
||||
jQuery.each(result, function (ii, dd) {
|
||||
obj_result.push({
|
||||
action: dd[0],
|
||||
if_field: dd[1],
|
||||
operator: dd[2],
|
||||
value: dd[3]
|
||||
})
|
||||
});
|
||||
|
||||
return obj_result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get field live value
|
||||
* @param object $dom
|
||||
* @return mixed
|
||||
*/
|
||||
function um_get_field_data($dom) {
|
||||
um_live_field = $dom.parents('.um-field').data('key');
|
||||
um_live_value = $dom.val();
|
||||
|
||||
if ($dom.is(':checkbox')) {
|
||||
|
||||
um_live_value = '';
|
||||
|
||||
if ($dom.parents('.um-field').find('input:checked').length > 1) {
|
||||
$dom.parents('.um-field').find('input:checked').each(function () {
|
||||
um_live_value = um_live_value + jQuery(this).val() + ' ';
|
||||
});
|
||||
} else {
|
||||
if ($dom.parents('.um-field').find('input:checked').length >= 1) {
|
||||
um_live_value = $dom.parents('.um-field').find('input:checked').val();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ($dom.is(':radio')) {
|
||||
um_live_value = $dom.parents('.um-field').find('input[type=radio]:checked').val();
|
||||
}
|
||||
|
||||
return um_live_value;
|
||||
|
||||
}
|
||||
|
||||
function um_in_array(needle, haystack, strict){
|
||||
var found = false, key, strict = !!strict;
|
||||
for (key in haystack) {
|
||||
if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply field conditions
|
||||
* @param object $dom
|
||||
* @param boolean is_single_update
|
||||
*/
|
||||
function um_apply_conditions($dom, is_single_update) {
|
||||
var operators = ['empty', 'not empty', 'equals to', 'not equals', 'greater than', 'less than', 'contains'];
|
||||
var key = $dom.parents('.um-field[data-key]').data('key');
|
||||
var conditions = um_field_conditions[key];
|
||||
|
||||
var live_field_value = um_get_field_data($dom);
|
||||
|
||||
var $owners = {};
|
||||
var $owners_values = {};
|
||||
var $owner_conditions = {};
|
||||
|
||||
jQuery.each(conditions, function (index, condition) {
|
||||
if (typeof $owners_values[condition.owner] == 'undefined') {
|
||||
$owners_values[condition.owner] = [];
|
||||
$owner_conditions[condition.owner] = {}
|
||||
}
|
||||
$owners_values[condition.owner].push(condition.value);
|
||||
$owner_conditions[condition.owner] = condition;
|
||||
});
|
||||
|
||||
jQuery.each(conditions, function (index, condition) {
|
||||
if (typeof $owners[condition.owner] == 'undefined') {
|
||||
$owners[condition.owner] = {};
|
||||
}
|
||||
if (condition.operator == 'empty') {
|
||||
if (!live_field_value || live_field_value == '' && um_in_array(live_field_value, $owners_values[condition.owner])) {
|
||||
$owners[condition.owner][index] = true;
|
||||
} else {
|
||||
$owners[condition.owner][index] = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (condition.operator == 'not empty') {
|
||||
if (live_field_value && live_field_value != '' && !um_in_array(live_field_value, $owners_values[condition.owner])) {
|
||||
$owners[condition.owner][index] = true;
|
||||
} else {
|
||||
$owners[condition.owner][index] = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (condition.operator == 'equals to') {
|
||||
if (condition.value == live_field_value && um_in_array(live_field_value, $owners_values[condition.owner])) {
|
||||
$owners[condition.owner][index] = true;
|
||||
} else {
|
||||
$owners[condition.owner][index] = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (condition.operator == 'not equals') {
|
||||
if (jQuery.isNumeric(condition.value) && parseInt(live_field_value) != parseInt(condition.value) && live_field_value && !um_in_array(live_field_value, $owners_values[condition.owner])) {
|
||||
$owners[condition.owner][index] = true;
|
||||
} else if (condition.value != live_field_value && !um_in_array(live_field_value, $owners_values[condition.owner])) {
|
||||
$owners[condition.owner][index] = true;
|
||||
} else {
|
||||
$owners[condition.owner][index] = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (condition.operator == 'greater than') {
|
||||
if (jQuery.isNumeric(condition.value) && parseInt(live_field_value) > parseInt(condition.value)) {
|
||||
$owners[condition.owner][index] = true;
|
||||
} else {
|
||||
$owners[condition.owner][index] = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (condition.operator == 'less than') {
|
||||
if (jQuery.isNumeric(condition.value) && parseInt(live_field_value) < parseInt(condition.value)) {
|
||||
$owners[condition.owner][index] = true;
|
||||
} else {
|
||||
$owners[condition.owner][index] = false;
|
||||
}
|
||||
}
|
||||
|
||||
if ( condition.operator == 'contains' ) {
|
||||
if ( 'multiselect' == um_get_field_type( $dom.parents('.um-field[data-key]') ) ) {
|
||||
if ( live_field_value && live_field_value.indexOf( condition.value ) >= 0 && um_in_array( condition.value, live_field_value ) ) {
|
||||
$owners[condition.owner][index] = true;
|
||||
} else {
|
||||
$owners[condition.owner][index] = false;
|
||||
}
|
||||
} else if ( 'checkbox' == um_get_field_type( $dom.parents('.um-field[data-key]') ) ) {
|
||||
if ( live_field_value && live_field_value.indexOf( condition.value ) >= 0 ) {
|
||||
$owners[condition.owner][index] = true;
|
||||
} else {
|
||||
$owners[condition.owner][index] = false;
|
||||
}
|
||||
} else {
|
||||
if ( live_field_value && live_field_value.indexOf( condition.value ) >= 0 && um_in_array( live_field_value, $owners_values[ condition.owner ] ) ) {
|
||||
$owners[condition.owner][index] = true;
|
||||
} else {
|
||||
$owners[condition.owner][index] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}); // end foreach `conditions`
|
||||
jQuery.each($owners, function (index, field) {
|
||||
if (um_in_array(true, field)) {
|
||||
um_field_apply_action($dom, $owner_conditions[index], true);
|
||||
} else {
|
||||
um_field_apply_action($dom, $owner_conditions[index], false);
|
||||
}
|
||||
});
|
||||
$dom.trigger('um_fields_change');
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply condition's action
|
||||
* @param object $dom
|
||||
* @param string condition
|
||||
* @param boolean is_true
|
||||
*/
|
||||
function um_field_apply_action($dom, condition, is_true) {
|
||||
var child_dom = jQuery('div.um-field[data-key="' + condition.owner + '"]');
|
||||
var child_dom_input = jQuery('div.um-field[data-key="' + condition.owner + '"] input');
|
||||
|
||||
if (condition.action == 'show' && is_true /*&& child_dom.is(':hidden')*/) {
|
||||
child_dom.show();
|
||||
child_dom_input.removeAttr('disabled');
|
||||
_show_in_ie( child_dom );
|
||||
um_field_restore_default_value(child_dom);
|
||||
}
|
||||
|
||||
if (condition.action == 'show' && !is_true /*&& child_dom.is(':visible') */) {
|
||||
child_dom.hide();
|
||||
child_dom_input.attr('disabled','disabled');
|
||||
_hide_in_ie( child_dom );
|
||||
}
|
||||
|
||||
if (condition.action == 'hide' && is_true /*&& child_dom.is(':visible')*/) {
|
||||
child_dom.hide();
|
||||
child_dom_input.attr('disabled','disabled');
|
||||
_hide_in_ie( child_dom );
|
||||
}
|
||||
|
||||
if (condition.action == 'hide' && !is_true /*&& child_dom.is(':hidden')*/) {
|
||||
child_dom.show();
|
||||
child_dom_input.removeAttr('disabled');
|
||||
_show_in_ie( child_dom );
|
||||
um_field_restore_default_value( child_dom );
|
||||
|
||||
}
|
||||
$dom.removeClass('um-field-has-changed');
|
||||
}
|
||||
|
||||
/**
|
||||
* Restores default field value
|
||||
* @param object $dom
|
||||
*/
|
||||
function um_field_restore_default_value( $dom ) {
|
||||
//um_field_default_values
|
||||
|
||||
var type = um_get_field_type( $dom );
|
||||
var key = $dom.data('key');
|
||||
var field = um_field_default_values[key];
|
||||
switch ( type ) {
|
||||
|
||||
case 'text':
|
||||
case 'number':
|
||||
case 'date':
|
||||
case 'textarea':
|
||||
$dom.find('input:text,input[type=number],textareas').val(field.value);
|
||||
break;
|
||||
|
||||
case 'select':
|
||||
$dom.find('select').find('option').prop('selected', false);
|
||||
$dom.find('select').val(field.value);
|
||||
$dom.find('select').trigger('change');
|
||||
break;
|
||||
|
||||
case 'multiselect':
|
||||
$dom.find('select').find('option').prop('selected', false);
|
||||
jQuery.each(field.value, function (i, value) {
|
||||
$dom.find('select').find('option[value="' + value + '"]').attr('selected', true);
|
||||
});
|
||||
$dom.find('select').trigger('change');
|
||||
break;
|
||||
|
||||
case 'checkbox':
|
||||
|
||||
if ( $dom.find('input[type=checkbox]:checked').length >= 1 ) {
|
||||
|
||||
$dom.find('input[type=checkbox]:checked').removeAttr('checked');
|
||||
$dom.find('span.um-field-checkbox-state i').removeClass('um-icon-android-checkbox-outline');
|
||||
$dom.find('span.um-field-checkbox-state i').addClass('um-icon-android-checkbox-outline-blank');
|
||||
$dom.find('.um-field-checkbox.active').removeClass('active');
|
||||
|
||||
if (jQuery.isArray(field.value)) {
|
||||
jQuery.each(field.value, function (i, value) {
|
||||
var cbox_elem = $dom.find('input[type=checkbox][value="' + value + '"]');
|
||||
cbox_elem.attr('checked', true);
|
||||
cbox_elem.closest('.um-field-checkbox').find('i').removeClass('um-icon-android-checkbox-outline-blank');
|
||||
cbox_elem.closest('.um-field-checkbox').find('i').addClass('um-icon-android-checkbox-outline');
|
||||
cbox_elem.closest('.um-field-checkbox').addClass('active');
|
||||
});
|
||||
} else {
|
||||
var cbox_elem = $dom.find('input[type=checkbox][value="' + field.value + '"]');
|
||||
cbox_elem.attr('checked', true);
|
||||
cbox_elem.closest('.um-field-checkbox').find('i').removeClass('um-icon-android-checkbox-outline-blank');
|
||||
cbox_elem.closest('.um-field-checkbox').find('i').addClass('um-icon-android-checkbox-outline');
|
||||
cbox_elem.closest('.um-field-checkbox').addClass('active');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
case 'radio':
|
||||
|
||||
if ( $dom.find('input[type=radio]:checked').length >= 1 ) {
|
||||
|
||||
setTimeout(function () {
|
||||
|
||||
$dom.find('input[type=radio]:checked').removeAttr('checked');
|
||||
|
||||
$dom.find('span.um-field-radio-state i').removeClass('um-icon-android-radio-button-on');
|
||||
$dom.find('span.um-field-radio-state i').addClass('um-icon-android-radio-button-off');
|
||||
$dom.find('.um-field-radio.active').removeClass('active');
|
||||
|
||||
var radio_elem = $dom.find("input[type=radio][value='" + field.value + "']");
|
||||
radio_elem.attr('checked', true);
|
||||
radio_elem.closest('.um-field-radio').find('i').removeClass('um-icon-android-radio-button-off');
|
||||
radio_elem.closest('.um-field-radio').find('i').addClass('um-icon-android-radio-button-on');
|
||||
radio_elem.closest('.um-field-radio').addClass('active');
|
||||
|
||||
}, 100);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
|
||||
} // end switch type
|
||||
|
||||
|
||||
if ( ! $dom.hasClass( 'um-field-has-changed' ) ) {
|
||||
var me = um_get_field_element( $dom );
|
||||
|
||||
if ( type == 'radio' || type == 'checkbox' ) {
|
||||
me = me.find( ':checked' );
|
||||
}
|
||||
|
||||
if ( me ) {
|
||||
me.trigger( 'change' );
|
||||
$dom.addClass( 'um-field-has-changed' );
|
||||
}
|
||||
|
||||
/*
|
||||
maybe future fix
|
||||
if ( me ) {
|
||||
if ( type == 'radio' || type == 'checkbox' ) {
|
||||
me.each( function() {
|
||||
if ( jQuery(this).is(':checked') ) {
|
||||
jQuery(this).trigger('change');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
me.trigger( 'change' );
|
||||
}
|
||||
|
||||
$dom.addClass( 'um-field-has-changed' );
|
||||
}*/
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Hides sibling/child field when parent field is hidden
|
||||
*/
|
||||
function um_field_hide_siblings() {
|
||||
|
||||
jQuery.each(um_field_conditions, function (index, conditions) {
|
||||
if (jQuery('.um-field[data-key="' + index + '"]:hidden').length >= 1 || jQuery('.um-field[data-key="' + index + '"]').css('display') == 'none') {
|
||||
jQuery.each(conditions, function (key, condition) {
|
||||
jQuery('.um-field[data-key="' + condition.owner + '"]').hide();
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Hides div for IE browser
|
||||
* @param object $dom
|
||||
*/
|
||||
function _hide_in_ie( $dom ){
|
||||
if ( typeof( jQuery.browser ) != 'undefined' && jQuery.browser.msie ) {
|
||||
$dom.css({"visibility":"hidden"});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows div for IE browser
|
||||
* @param object $dom
|
||||
*/
|
||||
function _show_in_ie( $dom ){
|
||||
if ( typeof( jQuery.browser ) != 'undefined' && jQuery.browser.msie ) {
|
||||
$dom.css({"visibility":"visible"});
|
||||
}
|
||||
}
|
||||
|
||||
jQuery(document).on('change', '.um-field select, .um-field input[type="radio"], .um-field input[type="checkbox"]', function () {
|
||||
var me = jQuery(this);
|
||||
um_apply_conditions(me, false);
|
||||
jQuery('.um-profile-body .um-field input, .um-profile-body .um-field textarea').on('change keyup', function () {
|
||||
condition_fields();
|
||||
});
|
||||
jQuery('.um-profile-body .um-field select').on('change', function () {
|
||||
condition_fields();
|
||||
});
|
||||
|
||||
jQuery(document).on('input change', '.um-field input[type="text"]', function () {
|
||||
var me = jQuery(this);
|
||||
um_apply_conditions(me, false);
|
||||
});
|
||||
|
||||
jQuery(document).on('input change', '.um-field input[type="number"]', function () {
|
||||
var me = jQuery(this);
|
||||
um_apply_conditions(me, false);
|
||||
});
|
||||
|
||||
jQuery(document).on('input change', '.um-field input[type="password"]', function () {
|
||||
var me = jQuery(this);
|
||||
um_apply_conditions(me, false);
|
||||
});
|
||||
|
||||
jQuery(document).on('um_fields_change', function () {
|
||||
um_field_hide_siblings();
|
||||
um_field_hide_siblings(); // dupes, issue with false field wrapper's visiblity validations. requires optimization.
|
||||
});
|
||||
|
||||
|
||||
/**
|
||||
* UM Conditional fields Init
|
||||
*/
|
||||
function um_init_field_conditions() {
|
||||
var arr_field_keys = [];
|
||||
|
||||
jQuery( '.um-field[data-key]' ).each( function() {
|
||||
|
||||
var key = jQuery(this).data( 'key' );
|
||||
|
||||
arr_field_keys.push( key );
|
||||
|
||||
var parse_attrs = {};
|
||||
jQuery.each( jQuery(this)[0].attributes, function ( index, attribute ) {
|
||||
if ( attribute.name.indexOf( 'data-cond' ) != -1 ) {
|
||||
// replace "data-cond-"
|
||||
var cond_field_id_and_attr = attribute.name.slice( 10 );
|
||||
// return "n"
|
||||
var cond_field_id = cond_field_id_and_attr.substring( 1, 0 );
|
||||
//replace "n-"
|
||||
var cond_field_attr = cond_field_id_and_attr.slice( 2 );
|
||||
|
||||
if ( typeof parse_attrs[cond_field_id] == 'undefined' )
|
||||
parse_attrs[cond_field_id] = {};
|
||||
|
||||
parse_attrs[cond_field_id][cond_field_attr] = attribute.value;
|
||||
}
|
||||
});
|
||||
|
||||
jQuery.each( parse_attrs, function ( ii, dd ) {
|
||||
var obj = {'field' :{
|
||||
owner: key,
|
||||
action: dd.action,
|
||||
parent: dd.field,
|
||||
operator: dd.operator,
|
||||
value: dd.value,
|
||||
condition: {
|
||||
owner: key,
|
||||
action: dd.action,
|
||||
operator: dd.operator,
|
||||
value: dd.value
|
||||
}
|
||||
}};
|
||||
|
||||
arr_all_conditions.push(obj);
|
||||
});
|
||||
|
||||
um_field_default_values[jQuery(this).data('key')] = um_get_field_default_value( jQuery(this) );
|
||||
});
|
||||
|
||||
jQuery.each( arr_field_keys, function ( i, field_key ) {
|
||||
um_field_conditions[field_key] = um_get_field_children( field_key );
|
||||
});
|
||||
|
||||
jQuery( '.um-field[data-key]:visible' ).each( function() {
|
||||
var $wrap_dom = jQuery(this);
|
||||
var me = um_get_field_element( $wrap_dom );
|
||||
if ( typeof me.trigger !== 'undefined' ) {
|
||||
me.trigger( 'change' );
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
um_init_field_conditions();
|
||||
});
|
||||
Vendored
+1
-1
File diff suppressed because one or more lines are too long
@@ -1220,9 +1220,8 @@ if ( ! class_exists( 'um\core\Fields' ) ) {
|
||||
if (isset( $array['conditions'] ) && is_array( $array['conditions'] ) && !$this->viewing) {
|
||||
$array['conditional'] = '';
|
||||
|
||||
foreach ($array['conditions'] as $cond_id => $cond) {
|
||||
$array['conditional'] .= ' data-cond-' . $cond_id . '-action="' . $cond[0] . '" data-cond-' . $cond_id . '-field="' . $cond[1] . '" data-cond-' . $cond_id . '-operator="' . $cond[2] . '" data-cond-' . $cond_id . '-value="' . $cond[3] . '"';
|
||||
}
|
||||
$cond_data = json_encode($array['conditions']);
|
||||
$array['conditional'] .= " data-conds='".$cond_data."'";
|
||||
|
||||
$array['classes'] .= ' um-is-conditional';
|
||||
|
||||
|
||||
Reference in New Issue
Block a user