#= require_tree ../utils
{ matches, getData, setData, stopEverything, formElements } = Quails
Quails.handleDisabledElement = (e) ->
element = this stopEverything(e) if element.disabled
# Unified function to enable an element (link, button and form) Quails.enableElement = (e) ->
element = if e instanceof Event then e.target else e if matches(element, Quails.linkDisableSelector) enableLinkElement(element) else if matches(element, Quails.buttonDisableSelector) or matches(element, Quails.formEnableSelector) enableFormElement(element) else if matches(element, Quails.formSubmitSelector) enableFormElements(element)
# Unified function to disable an element (link, button and form) Quails.disableElement = (e) ->
element = if e instanceof Event then e.target else e if matches(element, Quails.linkDisableSelector) disableLinkElement(element) else if matches(element, Quails.buttonDisableSelector) or matches(element, Quails.formDisableSelector) disableFormElement(element) else if matches(element, Quails.formSubmitSelector) disableFormElements(element)
# Replace element's html with the 'data-disable-with' after storing original html # and prevent clicking on it disableLinkElement = (element) ->
replacement = element.getAttribute('data-disable-with') if replacement? setData(element, 'ujs:enable-with', element.innerHTML) # store enabled state element.innerHTML = replacement element.addEventListener('click', stopEverything) # prevent further clicking setData(element, 'ujs:disabled', true)
# Restore element to its original state which was disabled by 'disableLinkElement' above enableLinkElement = (element) ->
originalText = getData(element, 'ujs:enable-with') if originalText? element.innerHTML = originalText # set to old enabled state setData(element, 'ujs:enable-with', null) # clean up cache element.removeEventListener('click', stopEverything) # enable element setData(element, 'ujs:disabled', null)
# Disables form elements: # - Caches element value in 'ujs:enable-with' data store # - Replaces element text with value of 'data-disable-with' attribute # - Sets disabled property to true disableFormElements = (form) ->
formElements(form, Quails.formDisableSelector).forEach(disableFormElement)
disableFormElement = (element) ->
replacement = element.getAttribute('data-disable-with') if replacement? if matches(element, 'button') setData(element, 'ujs:enable-with', element.innerHTML) element.innerHTML = replacement else setData(element, 'ujs:enable-with', element.value) element.value = replacement element.disabled = true setData(element, 'ujs:disabled', true)
# Re-enables disabled form elements: # - Replaces element text with cached value from 'ujs:enable-with' data store (created in `disableFormElements`) # - Sets disabled property to false enableFormElements = (form) ->
formElements(form, Quails.formEnableSelector).forEach(enableFormElement)
enableFormElement = (element) ->
originalText = getData(element, 'ujs:enable-with') if originalText? if matches(element, 'button') element.innerHTML = originalText else element.value = originalText setData(element, 'ujs:enable-with', null) # clean up cache element.disabled = false setData(element, 'ujs:disabled', null)