app/assets/javascripts/prevent_double_submission.js.coffee

Summary

Maintainability
Test Coverage
App.PreventDoubleSubmission =
  disable_buttons: (buttons) ->
    setTimeout ->
      buttons.each ->
        button = $(this)
        unless button.hasClass('disabled')
          loading = button.data('loading') ? '...'
          button.addClass('disabled').attr('disabled', 'disabled')
          button.data('text', button.val())
          button.val(loading)
    , 1

  reset_buttons: (buttons) ->
    buttons.each ->
      button = $(this)
      if button.hasClass('disabled')
        button_text = button.data('text')
        button.removeClass('disabled').attr('disabled', null)
        if button_text
          button.val(button_text)
          button.data('text', null)

  initialize: ->
    $('form').on('submit', (event) ->
      unless event.target.id == "new_officing_voter" || 
             event.target.id == "admin_download_emails"

        buttons = $(this).find(':button, :submit')
        App.PreventDoubleSubmission.disable_buttons(buttons)
    ).on('ajax:success', (event) ->
      unless event.target.id == "new_officing_voter" || 
             event.target.id == "admin_download_emails"
             
        buttons = $(this).find(':button, :submit')
        App.PreventDoubleSubmission.reset_buttons(buttons)
    )

    false