diff --git a/assets/js/um-conditional.js b/assets/js/um-conditional.js index dab69342..b9f05cae 100644 --- a/assets/js/um-conditional.js +++ b/assets/js/um-conditional.js @@ -6,11 +6,11 @@ var um_field_default_values = {}; * Get field default value * * @param {object} $dom - * @return {string} + * @return {object} */ function um_get_field_default_value( $dom ) { var default_value = ''; - var type = um_get_field_type($dom); + var type = um_get_field_type( $dom ); switch ( type ) { case 'text': @@ -18,35 +18,37 @@ function um_get_field_default_value( $dom ) { case 'date': case 'textarea': case 'select': - default_value = $dom.find('input:text,input[type=number],textarea,select').val(); + default_value = $dom.find('input:text,input[type="number"],textarea,select').val(); break; case 'multiselect': - case 'user_tags': 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(); + 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 ) { - if ($dom.find('input[type=checkbox]:checked').length > 1) { + if ( $dom.find('input[type="checkbox"]:checked').length > 1 ) { var arr_values = []; arr_values.push( default_value ); - $dom.find('input[type=checkbox]:checked').each(function () { + $dom.find('input[type="checkbox"]:checked').each( function() { arr_values.push( jQuery(this).val() ); }); default_value = arr_values; } else { - default_value = $dom.find('input[type=checkbox]:checked').val(); + default_value = $dom.find('input[type="checkbox"]:checked').val(); } } break; + default: + default_value = wp.hooks.applyFilters( 'um_conditional_logic_default_value', default_value, type, $dom ); + break; } return {type: type, value: default_value}; @@ -60,7 +62,8 @@ function um_get_field_default_value( $dom ) { */ function um_get_field_element( $dom ) { - var type = um_get_field_type($dom); + var type = um_get_field_type( $dom ); + var field_element = ''; switch ( type ) { @@ -70,10 +73,12 @@ function um_get_field_element( $dom ) { case 'textarea': case 'select': case 'multiselect': - case 'user_tags': case 'radio': case 'checkbox': - return $dom.find('input,textarea,select'); + field_element = $dom.find( 'input,textarea,select' ); + break; + default: + field_element = wp.hooks.applyFilters( 'um_conditional_logic_field_element', field_element, type, $dom ); break; } @@ -86,12 +91,13 @@ function um_get_field_element( $dom ) { * @param {object} $dom * @return {string} */ -function um_get_field_type($dom) { +function um_get_field_type( $dom ) { var type = ''; var classes = $dom.attr( 'class' ).split(' '); - jQuery.each( classes, function (i, d) { - if (/um-field-type_/.test(d)) { - type = d.replace('um-field-type_', '').trim(); + + jQuery.each( classes, function ( i, d ) { + if ( /um-field-type_/.test( d ) ) { + type = d.replace( 'um-field-type_', '' ).trim(); } }); @@ -104,11 +110,11 @@ function um_get_field_type($dom) { * @param {string} field_key * @return {array} */ -function um_get_field_children(field_key) { +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); + jQuery.each( arr_all_conditions, function ( ii, condition ) { + if ( condition.field.parent === field_key ) { + arr_conditions.push( condition.field.condition ); } }); @@ -119,10 +125,10 @@ function um_get_field_children(field_key) { * Split single array to multi-dimensional array * * @param {array} arr - * @param {nteger} n + * @param {integer} n * @return {array} */ -function um_splitup_array(arr, n) { +function um_splitup_array( arr, n ) { var rest = arr.length % n, restUsed = rest, partLength = Math.floor(arr.length / n), @@ -164,7 +170,7 @@ function um_splitup_array(arr, n) { * @param {object} $dom * @return {mixed} */ -function um_get_field_data($dom) { +function um_get_field_data( $dom ) { um_live_field = $dom.parents('.um-field').data('key'); um_live_value = $dom.val(); @@ -199,11 +205,11 @@ function um_get_field_data($dom) { * @param {Boolean} strict * @returns {Boolean} */ -function um_in_array(needle, haystack, strict){ +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)) { + for ( key in haystack ) { + if ( ( strict && haystack[ key ] === needle ) || ( ! strict && haystack[ key ] == needle ) ) { found = true; break; } @@ -235,113 +241,120 @@ function um_apply_conditions( $dom, is_single_update ) { 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] = {} + 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; + $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] = {}; + jQuery.each( conditions, function ( index, condition ) { + if ( typeof $owners[ condition.owner ] == 'undefined' ) { + $owners[ condition.owner ] = {}; } - if (condition.operator === 'empty') { - var field_value = jQuery.isArray(live_field_value) ? live_field_value.join('') : live_field_value; - if (!field_value || field_value === '') { - $owners[condition.owner][index] = true; + if ( condition.operator === 'empty' ) { + var field_value = jQuery.isArray( live_field_value ) ? live_field_value.join('') : live_field_value; + if ( ! field_value || field_value === '' ) { + $owners[ condition.owner ][ index ] = true; } else { - $owners[condition.owner][index] = false; + $owners[ condition.owner ][ index ] = false; } } - if (condition.operator === 'not empty') { - var field_value = jQuery.isArray(live_field_value) ? live_field_value.join('') : live_field_value; - if (field_value && field_value !== '') { - $owners[condition.owner][index] = true; + if ( condition.operator === 'not empty' ) { + var field_value = jQuery.isArray( live_field_value ) ? live_field_value.join('') : live_field_value; + if ( field_value && field_value !== '' ) { + $owners[ condition.owner ][ index ] = true; } else { - $owners[condition.owner][index] = false; + $owners[ condition.owner ][ index ] = false; } } - if (condition.operator === 'equals to') { - var field_value = (jQuery.isArray(live_field_value) && live_field_value.length === 1) ? live_field_value[0] : live_field_value; - if (condition.value === field_value && um_in_array(field_value, $owners_values[condition.owner])) { - $owners[condition.owner][index] = true; + if ( condition.operator === 'equals to' ) { + var field_value = ( jQuery.isArray( live_field_value ) && live_field_value.length === 1 ) ? live_field_value[0] : live_field_value; + if ( condition.value === field_value && um_in_array( field_value, $owners_values[ condition.owner ] ) ) { + $owners[ condition.owner ][ index ] = true; } else { - $owners[condition.owner][index] = false; + $owners[ condition.owner ][ index ] = false; } } - if (condition.operator === 'not equals') { - var field_value = (jQuery.isArray(live_field_value) && live_field_value.length === 1) ? live_field_value[0] : live_field_value; - if (jQuery.isNumeric(condition.value) && parseInt(field_value) !== parseInt(condition.value) && field_value && !um_in_array(field_value, $owners_values[condition.owner])) { - $owners[condition.owner][index] = true; - } else if (condition.value != field_value && !um_in_array(field_value, $owners_values[condition.owner])) { - $owners[condition.owner][index] = true; + if ( condition.operator === 'not equals' ) { + var field_value = ( jQuery.isArray( live_field_value ) && live_field_value.length === 1 ) ? live_field_value[0] : live_field_value; + if ( jQuery.isNumeric(condition.value) && parseInt(field_value) !== parseInt( condition.value ) && field_value && ! um_in_array( field_value, $owners_values[ condition.owner ] ) ) { + $owners[ condition.owner ][ index ] = true; + } else if ( condition.value != field_value && ! um_in_array( field_value, $owners_values[ condition.owner ] ) ) { + $owners[ condition.owner ][ index ] = true; } else { - $owners[condition.owner][index] = false; + $owners[ condition.owner ][ index ] = false; } } - if (condition.operator === 'greater than') { - var field_value = (jQuery.isArray(live_field_value) && live_field_value.length === 1) ? live_field_value[0] : live_field_value; - if (jQuery.isNumeric(condition.value) && parseInt(field_value) > parseInt(condition.value)) { - $owners[condition.owner][index] = true; + if ( condition.operator === 'greater than' ) { + var field_value = ( jQuery.isArray( live_field_value ) && live_field_value.length === 1 ) ? live_field_value[0] : live_field_value; + if ( jQuery.isNumeric( condition.value ) && parseInt( field_value ) > parseInt( condition.value ) ) { + $owners[ condition.owner ][ index ] = true; } else { - $owners[condition.owner][index] = false; + $owners[ condition.owner ][ index ] = false; } } - if (condition.operator === 'less than') { - var field_value = (jQuery.isArray(live_field_value) && live_field_value.length === 1) ? live_field_value[0] : live_field_value; - if (jQuery.isNumeric(condition.value) && parseInt(field_value) < parseInt(condition.value)) { - $owners[condition.owner][index] = true; + if ( condition.operator === 'less than' ) { + var field_value = ( jQuery.isArray( live_field_value ) && live_field_value.length === 1 ) ? live_field_value[0] : live_field_value; + if ( jQuery.isNumeric( condition.value ) && parseInt( field_value ) < parseInt( condition.value ) ) { + $owners[ condition.owner ][ index ] = true; } else { - $owners[condition.owner][index] = false; + $owners[ condition.owner ][ index ] = false; } } if ( condition.operator === 'contains' ) { - switch (field_type) { + switch ( field_type ) { case 'multiselect': - case 'user_tags': if ( live_field_value && live_field_value.indexOf( condition.value ) >= 0 && um_in_array( condition.value, live_field_value ) ) { - $owners[condition.owner][index] = true; + $owners[ condition.owner ][ index ] = true; } else { - $owners[condition.owner][index] = false; + $owners[ condition.owner ][ index ] = false; } break; case 'checkbox': if ( live_field_value && live_field_value.indexOf( condition.value ) >= 0 ) { - $owners[condition.owner][index] = true; + $owners[ condition.owner ][ index ] = true; } else { - $owners[condition.owner][index] = false; + $owners[ condition.owner ][ index ] = false; } break; default: - 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; + + $owners = wp.hooks.applyFilters( 'um_conditional_logic_contains_operator_owners', $owners, field_type, live_field_value, condition, index ); + if ( typeof $owners[ condition.owner ][ index ] == 'undefined' ) { + 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; + } } + + break; } } }); // end foreach `conditions` - jQuery.each($owners, function (index, field) { - if (um_in_array(true, field)) { - um_field_apply_action($dom, $owner_conditions[index], true); + + 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); + um_field_apply_action( $dom, $owner_conditions[ index ], false ); } }); - $dom.trigger('um_fields_change'); + + $dom.trigger( 'um_fields_change' ); } @@ -356,31 +369,32 @@ function um_apply_conditions( $dom, is_single_update ) { function um_field_apply_action($dom, condition, is_true) { var child_dom = jQuery('div.um-field[data-key="' + condition.owner + '"]'); - if (condition.action === 'show' && is_true /*&& child_dom.is(':hidden')*/) { + if ( condition.action === 'show' && is_true /*&& child_dom.is(':hidden')*/ ) { child_dom.show(); _show_in_ie( child_dom ); um_field_restore_default_value(child_dom); } - if (condition.action === 'show' && !is_true /*&& child_dom.is(':visible') */) { + if ( condition.action === 'show' && ! is_true /*&& child_dom.is(':visible') */ ) { child_dom.hide(); _hide_in_ie( child_dom ); } - if (condition.action === 'hide' && is_true /*&& child_dom.is(':visible')*/) { + if ( condition.action === 'hide' && is_true /*&& child_dom.is(':visible')*/ ) { child_dom.hide(); _hide_in_ie( child_dom ); } - if (condition.action === 'hide' && !is_true /*&& child_dom.is(':hidden')*/) { + if ( condition.action === 'hide' && ! is_true /*&& child_dom.is(':hidden')*/ ) { child_dom.show(); _show_in_ie( child_dom ); um_field_restore_default_value( child_dom ); } - return $dom.removeClass('um-field-has-changed'); + return $dom.removeClass( 'um-field-has-changed' ); } + /** * Restores default field value * @@ -390,14 +404,15 @@ function um_field_restore_default_value( $dom ) { var type = um_get_field_type( $dom ); var key = $dom.data('key'); - var field = um_field_default_values[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); + $dom.find('input:text,input[type="number"],textareas').val(field.value); break; case 'select': @@ -407,7 +422,6 @@ function um_field_restore_default_value( $dom ) { break; case 'multiselect': - case 'user_tags': $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); @@ -416,52 +430,57 @@ function um_field_restore_default_value( $dom ) { 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').removeAttr('checked'); + $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 + '"]'); + 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 + '"]'); + 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 () { + if ( $dom.find('input[type="radio"]:checked').length >= 1 ) { - $dom.find('input[type=radio]:checked').removeAttr('checked'); + 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 + "']"); + 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); + }, 100 ); } break; + default: + wp.hooks.doAction( 'um_conditional_logic_restore_default_value', type, $dom, field ); + break; + } // end switch type diff --git a/assets/js/um-conditional.min.js b/assets/js/um-conditional.min.js index ca8a80ab..66e35019 100644 --- a/assets/js/um-conditional.min.js +++ b/assets/js/um-conditional.min.js @@ -1 +1 @@ -var arr_all_conditions=[],um_field_conditions={},um_field_default_values={};function um_get_field_default_value(e){var i="",a=um_get_field_type(e);switch(a){case"text":case"number":case"date":case"textarea":case"select":i=e.find("input:text,input[type=number],textarea,select").val();break;case"multiselect":case"user_tags":i=e.find("select").val();break;case"radio":1<=e.find("input[type=radio]:checked").length&&(i=e.find("input[type=radio]:checked").val());break;case"checkbox":if(1<=e.find("input[type=checkbox]:checked").length)if(1parseInt(i.value)?r[i.owner][e]=!0:r[i.owner][e]=!1}if("less than"===i.operator){a=jQuery.isArray(u)&&1===u.length?u[0]:u;jQuery.isNumeric(i.value)&&parseInt(a)parseInt(i.value)?r[i.owner][e]=!0:r[i.owner][e]=!1}if("less than"===i.operator){a=jQuery.isArray(u)&&1===u.length?u[0]:u;jQuery.isNumeric(i.value)&&parseInt(a)js_baseurl . 'um-responsive' . $this->suffix . '.js', array( 'jquery', 'um_functions', 'um_crop' ), ultimatemember_version, true ); wp_register_script( 'um-gdpr', $this->js_baseurl . 'um-gdpr' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, false ); - wp_register_script('um_conditional', $this->js_baseurl . 'um-conditional' . $this->suffix . '.js', array( 'jquery' ), ultimatemember_version, true ); + wp_register_script('um_conditional', $this->js_baseurl . 'um-conditional' . $this->suffix . '.js', array( 'jquery', 'wp-hooks' ), ultimatemember_version, true ); wp_register_script('um_scripts', $this->js_baseurl . 'um-scripts' . $this->suffix . '.js', array( 'jquery', 'wp-util', 'um_conditional', 'um_datetime', 'um_datetime_date', 'um_datetime_time', 'um_datetime_legacy', 'select2' ), ultimatemember_version, true ); /** * UM hook diff --git a/readme.txt b/readme.txt index f1b6a1ff..c21b5820 100644 --- a/readme.txt +++ b/readme.txt @@ -153,6 +153,7 @@ The plugin works with popular caching plugins by automatically excluding Ultimat - Added layout changes to show email notification description in Settings > Email screen - Added member directory option 'Exclude specific users' - Added filter for the changing redirect after profile edited 'um_update_profile_redirect_after' + - Added JS filters for conditional logic - Tweak: apply_shortcodes() function support * Bugfixes: @@ -165,6 +166,7 @@ The plugin works with popular caching plugins by automatically excluding Ultimat - Fixed Erase User Data field on the Account page - Fixed SkypeID field - Fixed clickable links in the UM forms which are displayed in a modal window + - Fixed disabling select and textarea fields in inactive tabs on Account - Fixed some translations - Small PHP notices fixes