mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
93 lines
3.4 KiB
CoffeeScript
93 lines
3.4 KiB
CoffeeScript
#= require_tree ../utils
|
|
|
|
{
|
|
matches, getData, setData
|
|
fire, stopEverything
|
|
ajax, isCrossDomain
|
|
serializeElement
|
|
} = Rails
|
|
|
|
# Checks "data-remote" if true to handle the request through a XHR request.
|
|
isRemote = (element) ->
|
|
value = element.getAttribute('data-remote')
|
|
value? and value isnt 'false'
|
|
|
|
# Submits "remote" forms and links with ajax
|
|
Rails.handleRemote = (e) ->
|
|
element = this
|
|
|
|
return true unless isRemote(element)
|
|
unless fire(element, 'ajax:before')
|
|
fire(element, 'ajax:stopped')
|
|
return false
|
|
|
|
withCredentials = element.getAttribute('data-with-credentials')
|
|
dataType = element.getAttribute('data-type') or 'script'
|
|
|
|
if matches(element, Rails.formSubmitSelector)
|
|
# memoized value from clicked submit button
|
|
button = getData(element, 'ujs:submit-button')
|
|
method = getData(element, 'ujs:submit-button-formmethod') or element.method
|
|
url = getData(element, 'ujs:submit-button-formaction') or element.getAttribute('action') or location.href
|
|
|
|
# strip query string if it's a GET request
|
|
url = url.replace(/\?.*$/, '') if method.toUpperCase() is 'GET'
|
|
|
|
if element.enctype is 'multipart/form-data'
|
|
data = new FormData(element)
|
|
data.append(button.name, button.value) if button?
|
|
else
|
|
data = serializeElement(element, button)
|
|
|
|
setData(element, 'ujs:submit-button', null)
|
|
setData(element, 'ujs:submit-button-formmethod', null)
|
|
setData(element, 'ujs:submit-button-formaction', null)
|
|
else if matches(element, Rails.buttonClickSelector) or matches(element, Rails.inputChangeSelector)
|
|
method = element.getAttribute('data-method')
|
|
url = element.getAttribute('data-url')
|
|
data = serializeElement(element, element.getAttribute('data-params'))
|
|
else
|
|
method = element.getAttribute('data-method')
|
|
url = Rails.href(element)
|
|
data = element.getAttribute('data-params')
|
|
|
|
ajax(
|
|
type: method or 'GET'
|
|
url: url
|
|
data: data
|
|
dataType: dataType
|
|
# stopping the "ajax:beforeSend" event will cancel the ajax request
|
|
beforeSend: (xhr, options) ->
|
|
if fire(element, 'ajax:beforeSend', [xhr, options])
|
|
fire(element, 'ajax:send', [xhr])
|
|
else
|
|
fire(element, 'ajax:stopped')
|
|
return false
|
|
success: (args...) -> fire(element, 'ajax:success', args)
|
|
error: (args...) -> fire(element, 'ajax:error', args)
|
|
complete: (args...) -> fire(element, 'ajax:complete', args)
|
|
crossDomain: isCrossDomain(url)
|
|
withCredentials: withCredentials? and withCredentials isnt 'false'
|
|
)
|
|
stopEverything(e)
|
|
|
|
Rails.formSubmitButtonClick = (e) ->
|
|
button = this
|
|
form = button.form
|
|
return unless form
|
|
# Register the pressed submit button
|
|
setData(form, 'ujs:submit-button', name: button.name, value: button.value) if button.name
|
|
# Save attributes from button
|
|
setData(form, 'ujs:formnovalidate-button', button.formNoValidate)
|
|
setData(form, 'ujs:submit-button-formaction', button.getAttribute('formaction'))
|
|
setData(form, 'ujs:submit-button-formmethod', button.getAttribute('formmethod'))
|
|
|
|
Rails.preventInsignificantClick = (e) ->
|
|
link = this
|
|
method = (link.getAttribute('data-method') or 'GET').toUpperCase()
|
|
data = link.getAttribute('data-params')
|
|
metaClick = e.metaKey or e.ctrlKey
|
|
insignificantMetaClick = metaClick and method is 'GET' and not data
|
|
nonPrimaryMouseClick = e.button? and e.button isnt 0
|
|
e.stopImmediatePropagation() if nonPrimaryMouseClick or insignificantMetaClick
|
|
|