diff --git a/better_exposed_filters.libraries.yml b/better_exposed_filters.libraries.yml index 4db82b9..c175cf7 100644 --- a/better_exposed_filters.libraries.yml +++ b/better_exposed_filters.libraries.yml @@ -16,6 +16,7 @@ auto_submit: - core/drupal - core/jquery.once - core/drupal.debounce + - core/drupalSettings select_all_none: version: 3.x js: diff --git a/js/auto_submit.js b/js/auto_submit.js index b28f63a..df706b3 100644 --- a/js/auto_submit.js +++ b/js/auto_submit.js @@ -81,13 +81,23 @@ // Use debounce to prevent excessive submits on text field changes. // Navigation key presses are ignored. else if ($target.is(':text:not(.hasDatepicker), textarea') && $.inArray(e.keyCode, ignoredKeyCodes) === -1) { - Drupal.debounce(triggerSubmit, 500)($target); + return; } // Only trigger submit if a change was the trigger (no keyup). else if (e.type === 'change') { triggerSubmit($target); } }); + + $(selectors, context).addBack(selectors).find('input:text:not(.hasDatepicker), textarea').once('bef-auto-submit-text').on('change keyup keypress', Drupal.debounce(function (e) { + var $target = $(e.target); + + // Don't submit on changes to excluded elements or a submit element. + if ($target.is('[data-bef-auto-submit-exclude], :submit')) { + return true; + } + triggerSubmit($target); + }, drupalSettings.data.better_exposed_filters.autosubmitTextfieldDelay)); } } diff --git a/src/Plugin/views/exposed_form/BetterExposedFilters.php b/src/Plugin/views/exposed_form/BetterExposedFilters.php index fbcb258..6108d57 100644 --- a/src/Plugin/views/exposed_form/BetterExposedFilters.php +++ b/src/Plugin/views/exposed_form/BetterExposedFilters.php @@ -100,6 +100,19 @@ class BetterExposedFilters extends InputRequired { ), ); + $bef_options['general']['autosubmit_textfield_delay'] = array( + '#type' => 'textfield', + '#title' => $this->t('Delay for textfield autosubmit'), + '#description' => $this->t('Configure a delay in ms before triggering autosubmit on textfields.'), + '#default_value' => $existing['general']['autosubmit_textfield_delay'], + '#states' => array( + 'visible' => array( + ':input[name="exposed_form_options[bef][general][autosubmit]"]' => array('checked' => TRUE), + ':input[name="exposed_form_options[bef][general][autosubmit_exclude_textfield]"]' => array('checked' => FALSE), + ), + ), + ); + $bef_options['general']['autosubmit_hide'] = array( '#type' => 'checkbox', '#title' => $this->t('Hide submit button'), @@ -655,6 +668,9 @@ Title Desc|Z -> A Leave the replacement text blank to remove an option alt $form = array_merge_recursive($form, array('#attributes' => array('data-bef-auto-submit-full-form' => ''))); $form['actions']['submit']['#attributes']['data-bef-auto-submit-click'] = ''; $form['#attached']['library'][] = 'better_exposed_filters/auto_submit'; + $form['#attached']['drupalSettings']['data']['better_exposed_filters'] = [ + 'autosubmitTextfieldDelay' => $settings['general']['autosubmit_textfield_delay'], + ]; if (!empty($settings['general']['autosubmit_exclude_textfield'])) { foreach ($form as &$element) { @@ -1527,6 +1543,7 @@ Title Desc|Z -> A Leave the replacement text blank to remove an option alt 'secondary_label' => $this->t('Advanced options'), 'autosubmit' => FALSE, 'autosubmit_exclude_textfield' => FALSE, + 'autosubmit_textfield_delay' => 500, 'autosubmit_hide' => FALSE, ), 'sort' => array(