1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/actionview/app/assets/javascripts/rails-ujs/features/remote.coffee

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