summaryrefslogtreecommitdiff
path: root/app/assets/javascripts/behaviors/quick_submit.js.coffee
blob: 6e29d374267098f5ddb685ca8a42812d06aa6f33 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# Quick Submit behavior
#
# When a child field of a form with a `js-quick-submit` class receives a
# "Meta+Enter" (Mac) or "Ctrl+Enter" (Linux/Windows) key combination, the form
# is submitted.
#
#= require extensions/jquery
#
# ### Example Markup
#
#   <form action="/foo" class="js-quick-submit">
#     <input type="text" />
#     <textarea></textarea>
#     <input type="submit" value="Submit" />
#   </form>
#
isMac = ->
  navigator.userAgent.match(/Macintosh/)

keyCodeIs = (e, keyCode) ->
  return false if (e.originalEvent && e.originalEvent.repeat) || e.repeat
  return e.keyCode == keyCode

$(document).on 'keydown.quick_submit', '.js-quick-submit', (e) ->
  return unless keyCodeIs(e, 13) # Enter

  return unless (e.metaKey && !e.altKey && !e.ctrlKey && !e.shiftKey) || (e.ctrlKey && !e.altKey && !e.metaKey && !e.shiftKey)

  e.preventDefault()

  $form = $(e.target).closest('form')
  $form.find('input[type=submit], button[type=submit]').disable()
  $form.submit()

# If the user tabs to a submit button on a `js-quick-submit` form, display a
# tooltip to let them know they could've used the hotkey
$(document).on 'keyup.quick_submit', '.js-quick-submit input[type=submit], .js-quick-submit button[type=submit]', (e) ->
  return unless keyCodeIs(e, 9) # Tab

  if isMac()
    title = "You can also press &#8984;-Enter"
  else
    title = "You can also press Ctrl-Enter"

  $this = $(@)
  $this.tooltip(
    container: 'body'
    html: 'true'
    placement: 'auto top'
    title: title
    trigger: 'manual'
  ).tooltip('show').one('blur', -> $this.tooltip('hide'))