diff --git a/gravity-forms/gw-prevent-duplicate-selections.php b/gravity-forms/gw-prevent-duplicate-selections.php index 32640fe36..c88d44b7e 100644 --- a/gravity-forms/gw-prevent-duplicate-selections.php +++ b/gravity-forms/gw-prevent-duplicate-selections.php @@ -30,6 +30,7 @@ public function __construct() { public function init() { add_filter( 'gform_pre_render', array( $this, 'load_form_script' ), 10, 2 ); + add_action( 'gform_register_init_scripts', array( $this, 'add_init_script' ), 10, 2 ); } public function load_form_script( $form, $is_ajax_enabled ) { @@ -42,25 +43,65 @@ public function load_form_script( $form, $is_ajax_enabled ) { return $form; } + public function add_init_script( $form ) { + if ( ! $this->is_applicable_form( $form ) ) { + return; + } + + $args = array(); + + $script = 'new ' . __CLASS__ . '( ' . json_encode( $args ) . ' );'; + $slug = implode( '_', array( strtolower( __CLASS__ ) ) ); + + GFFormDisplay::add_init_script( $form['id'], $slug, GFFormDisplay::ON_PAGE_RENDER, $script ); + } + public function output_script() { ?> - <script type="text/javascript" defer> + <script type="text/javascript"> + window.<?php echo __CLASS__; ?> = function() { + var $ = jQuery; + + $( document ).on( 'gppa_updated_batch_fields', function( event, formId, fieldIds ) { + $( gwDisableDuplicates ); + }) - jQuery( function( $ ) { window.gform.addFilter( 'gplc_excluded_input_selectors', function( selectors ) { selectors.push( '.gw-disable-duplicates-disabled' ); return selectors; }); - $inputs = $( '.gw-prevent-duplicates' ).find( 'input, select' ); - - $inputs.change( function( event, selected ) { - gwDisableDuplicates( $( this ), $inputs, selected ); + // Bind events, use .on with delegation and always get fresh selectors for AJAX-refreshed fields + $( '.gw-prevent-duplicates' ).on( 'change', 'input, select', function( event, selected ) { + gwDisableDuplicates( $( this ), $( '.gw-prevent-duplicates' ).find( 'input, select' ), selected ); } ); + // Event listener for post conditional logic + $(document).on('gform_post_conditional_logic', function(event, formId, fields, isInit){ + // Check each field affected by conditional logic + $.each(fields, function(index, fieldId){ + var $field = $('#field_' + formId + '_' + fieldId); + var $inputs = $field.find('input, select'); + + // Check if the field contains input/select elements and if has been hidden or is now visible + if($inputs.length > 0 && $field.is(':hidden') ){ + // Field has been hidden + $('.gw-disable-duplicates-disabled').removeClass('gw-disable-duplicates-disabled gf-default-disabled').prop('disabled', false); + gwDisableDuplicates($inputs, $('.gw-prevent-duplicates').find('input, select').not($field.find('input, select'))); + } + if($inputs.length > 0 && ! $field.is(':hidden') ){ + // Field has been shown + gwDisableDuplicates($inputs, $('.gw-prevent-duplicates').find('input, select')); + } + }); + }); + + // Handle on-load + $inputs = $( '.gw-prevent-duplicates' ).find( 'input, select' ); + $inputs.each( function( event ) { - gwDisableDuplicates( $( this ), $inputs ); + gwDisableDuplicates( $( this ), $inputs.not('.gw-disable-duplicates-disabled') ); } ); /** @@ -96,7 +137,7 @@ function getChangedOptionElFromSelect( $select, selected ) { /** * Handle multi select fields with GP Advanced Select enabled. - */ + */ if ($select.siblings('.ts-wrapper').length) { const val = $select.val(); @@ -136,7 +177,7 @@ function getChangedOptionElFromSelect( $select, selected ) { * @param {array} arr2 * * @returns {string} - */ + */ function getArrayDiff( arr1, arr2 ) { return arr1.filter( x => ! arr2.includes( x ) )[ 0 ]; } @@ -146,11 +187,10 @@ function findOptionByValue( $select, value ) { } function gwDisableDuplicates( $elem, $group, selected ) { - // Some elements have a parent element (e.g. a <select>) that contains the actual elements (e.g. <option>) we want enable/disable. let $parent = $elem; - if ( $elem.is( 'select' ) ) { + if ( $elem.is( 'select' ) && !$elem.is(':hidden') ) { $elem = getChangedOptionElFromSelect( $elem, selected ); // Note: This prevents selects from working with other field types. @@ -203,7 +243,7 @@ function gwDisableDuplicates( $elem, $group, selected ) { } } - } ); + }; </script> <?php