text: /* eslint-disable no-param-reassign, func-names, no-var, camelcase, no-unused-vars, object-shorthand, space-before-function-paren, no-return-assign, comma-dangle, consistent-return, one-var, one-var-declaration-per-line, quotes, prefer-template, prefer-arrow-callback, wrap-iife, max-len */
  /* global IssuableIndex */
  
  import IssuableBulkUpdateSidebar from './issuable_bulk_update_sidebar';
  import IssuableBulkUpdateActions from './issuable_bulk_update_actions';
  
  ((global) => {
    var issuable_created;
  
    issuable_created = false;
  
    global.IssuableIndex = {
      init: function(pagePrefix) {
        IssuableIndex.initTemplates();
        IssuableIndex.initSearch();
        IssuableIndex.initBulkUpdate(pagePrefix);
        IssuableIndex.initResetFilters();
        IssuableIndex.resetIncomingEmailToken();
        IssuableIndex.initLabelFilterRemove();
      },
      initTemplates: function() {
        return IssuableIndex.labelRow = _.template('<% _.each(labels, function(label){ %> <span class="label-row btn-group" role="group" aria-label="<%- label.title %>" style="color: <%- label.text_color %>;"> <a href="#" class="btn btn-transparent has-tooltip" style="background-color: <%- label.color %>;" title="<%- label.description %>" data-container="body"> <%- label.title %> </a> <button type="button" class="btn btn-transparent label-remove js-label-filter-remove" style="background-color: <%- label.color %>;" data-label="<%- label.title %>"> <i class="fa fa-times"></i> </button> </span> <% }); %>');
      },
      initSearch: function() {
        const $searchInput = $('#issuable_search');
  
        IssuableIndex.initSearchState($searchInput);
  
        // `immediate` param set to false debounces on the `trailing` edge, lets user finish typing
        const debouncedExecSearch = _.debounce(IssuableIndex.executeSearch, 1000, false);
  
        $searchInput.off('keyup').on('keyup', debouncedExecSearch);
  
        // ensures existing filters are preserved when manually submitted
        $('#issuable_search_form').on('submit', (e) => {
          e.preventDefault();
          debouncedExecSearch(e);
        });
      },
      initSearchState: function($searchInput) {
        const currentSearchVal = $searchInput.val();
  
        IssuableIndex.searchState = {
          elem: $searchInput,
          current: currentSearchVal
        };
  
        IssuableIndex.maybeFocusOnSearch();
      },
      accessSearchPristine: function(set) {
        // store reference to previous value to prevent search on non-mutating keyup
        const state = IssuableIndex.searchState;
        const currentSearchVal = state.elem.val();
  
        if (set) {
          state.current = currentSearchVal;
        } else {
          return state.current === currentSearchVal;
        }
      },
      maybeFocusOnSearch: function() {
        const currentSearchVal = IssuableIndex.searchState.current;
        if (currentSearchVal && currentSearchVal !== '') {
          const queryLength = currentSearchVal.length;
          const $searchInput = IssuableIndex.searchState.elem;
  
        /* The following ensures that the cursor is initially placed at
          * the end of search input when focus is applied. It accounts
          * for differences in browser implementations of `setSelectionRange`
          * and cursor placement for elements in focus.
        */
          $searchInput.focus();
          if ($searchInput.setSelectionRange) {
            $searchInput.setSelectionRange(queryLength, queryLength);
          } else {
            $searchInput.val(currentSearchVal);
          }
        }
      },
      executeSearch: function(e) {
        const $search = $('#issuable_search');
        const $searchName = $search.attr('name');
        const $searchValue = $search.val();
        const $filtersForm = $('.js-filter-form');
        const $input = $(`input[name='${$searchName}']`, $filtersForm);
        const isPristine = IssuableIndex.accessSearchPristine();
  
        if (isPristine) {
          return;
        }
  
        if (!$input.length) {
          $filtersForm.append(`<input type='hidden' name='${$searchName}' value='${_.escape($searchValue)}'/>`);
        } else {
          $input.val($searchValue);
        }
  
        IssuableIndex.filterResults($filtersForm);
      },
      initLabelFilterRemove: function() {
        return $(document).off('click', '.js-label-filter-remove').on('click', '.js-label-filter-remove', function(e) {
          var $button;
          $button = $(this);
          // Remove the label input box
          $('input[name="label_name[]"]').filter(function() {
            return this.value === $button.data('label');
          }).remove();
          // Submit the form to get new data
          IssuableIndex.filterResults($('.filter-form'));
        });
      },
      filterResults: (function(_this) {
        return function(form) {
          var formAction, formData, issuesUrl;
          formData = form.serializeArray();
          formData = formData.filter(function(data) {
            return data.value !== '';
          });
          formData = $.param(formData);
          formAction = form.attr('action');
          issuesUrl = formAction;
          issuesUrl += "" + (formAction.indexOf('?') === -1 ? '?' : '&');
          issuesUrl += formData;
          return gl.utils.visitUrl(issuesUrl);
        };
      })(this),
      initResetFilters: function() {
        $('.reset-filters').on('click', function(e) {
          e.preventDefault();
          const target = e.target;
          const $form = $(target).parents('.js-filter-form');
          const baseIssuesUrl = target.href;
  
          $form.attr('action', baseIssuesUrl);
          gl.utils.visitUrl(baseIssuesUrl);
        });
      },
      initBulkUpdate: function(pagePrefix) {
        const userCanBulkUpdate = $('.issues-bulk-update').length > 0;
        const alreadyInitialized = !!this.bulkUpdateSidebar;
  
        if (userCanBulkUpdate && !alreadyInitialized) {
          IssuableBulkUpdateActions.init({
            prefixId: pagePrefix,
          });
  
          this.bulkUpdateSidebar = new IssuableBulkUpdateSidebar();
        }
      },
      resetIncomingEmailToken: function() {
        $('.incoming-email-token-reset').on('click', function(e) {
          e.preventDefault();
  
          $.ajax({
            type: 'PUT',
            url: $('.incoming-email-token-reset').attr('href'),
            dataType: 'json',
            success: function(response) {
              $('#issue_email').val(response.new_issue_address).focus();
            },
            beforeSend: function() {
              $('.incoming-email-token-reset').text('resetting...');
            },
            complete: function() {
              $('.incoming-email-token-reset').text('reset it');
            }
          });
        });
      }
    };
  })(window);
  