diff options
| author | Tristan Zur <tzur@web.web.ccwn.org> | 2014-03-27 22:27:47 +0100 |
|---|---|---|
| committer | Tristan Zur <tzur@web.web.ccwn.org> | 2014-03-27 22:27:47 +0100 |
| commit | b62676ca5d3d6f6ba3f019ea3f99722e165a98d8 (patch) | |
| tree | 86722cb80f07d4569f90088eeaea2fc2f6e2ef94 /js/dojo-1.7.2/dojox/rails.js | |
Diffstat (limited to 'js/dojo-1.7.2/dojox/rails.js')
| -rw-r--r-- | js/dojo-1.7.2/dojox/rails.js | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/js/dojo-1.7.2/dojox/rails.js b/js/dojo-1.7.2/dojox/rails.js new file mode 100644 index 0000000..4e0a79e --- /dev/null +++ b/js/dojo-1.7.2/dojox/rails.js @@ -0,0 +1,148 @@ +//>>built +// wrapped by build app +define("dojox/rails", ["dijit","dojo","dojox","dojo/require!dojo/NodeList-traverse"], function(dijit,dojo,dojox){ +dojo.provide("dojox.rails"); +dojo.require("dojo.NodeList-traverse"); + +dojox.rails.live = function(selector, evtName, fn){ + if (dojo.isIE && evtName.match(/^(on)?submit$/i)){ + dojox.rails.live(selector, "click", function(evt){ + var target = evt.target, tag = target.tagName.toLowerCase(); + if ((tag == "input" || tag == "button") && dojo.attr(target, "type").toLowerCase() == "submit"){ + var form = dojo.query(target).closest("form"); + if (form.length){ + var h = dojo.connect(form[0], "submit", function(evt){ + dojo.disconnect(h); + fn.call(evt.target, evt); + }); + } + } + }); + }else{ + dojo.connect(dojo.body(), evtName, function(evt){ + var nl = dojo.query(evt.target).closest(selector); + if (nl.length){ + fn.call(nl[0], evt); + } + }); + } +}; + +dojo.ready((function(d, dr, dg){ + return function() { + var q = d.query, live = dr.live, + csrfToken = q("meta[name=csrf-token]").attr("content"), + csrfParam = q("meta[name=csrf-param]").attr("content"); + + var createFormForLink = function(url, method){ + var form = '<form style="display:none" method="post" action="'+ url +'">' + + '<input type="hidden" name="_method" value="'+ method +'" />' + + '<input type="hidden" name="'+ csrfParam +'" value="'+ csrfToken +'" />' + + '</form>'; + return dojo.place(form, dojo.body()); + }; + + var disable = function(elements){ + d.forEach(elements, function(node){ + if (!d.attr(node, "disabled")){ + var attr = node.tagName.toLowerCase() == "input" ? "value" : "innerHTML"; + var message = d.attr(node, "data-disable-with"); + var originalValue = d.attr(node, attr); + d.attr(node, "disabled", true); + d.attr(node, "data-original-value", originalValue); + d.attr(node, attr, message); + } + }); + }; + + var typeMap = { + "text": "text", + "json": "application/json", + "json-comment-optional": "text", + "json-comment-filtered": "text", + "javascript": "application/javascript", + "xml": "text/xml" + }; + + var handleRemote = function(evt){ + var el = evt.target, tag = el.tagName.toLowerCase(); + var content = tag.toLowerCase() == "form" ? d.formToObject(el) : {}, + type = d.attr(el, "data-type") || "javascript", + method = (d.attr(el, "method") || d.attr(el, "data-method") || "get").toLowerCase(), + url = d.attr(el, "action") || d.attr(el, "href"); + + if (tag != "form" && method != "get"){ + el = createFormForLink(url, method); + method = "POST"; + } + evt.preventDefault(); + + + // ajax:loading, ajax:loaded, and ajax:interactive are not supported + d.publish("ajax:before", [el]); + var deferred = d.xhr(method, { + url: url, + headers: { "Accept": typeMap[type] }, + content: content, + handleAs: type, + load: function(response, ioArgs) {d.publish("ajax:success", [el, response, ioArgs]);}, + error: function(response, ioArgs) {d.publish("ajax:failure", [el, response, ioArgs]);}, + handle: function(response, ioArgs) {d.publish("ajax:complete", [el, response, ioArgs]);} + }); + d.publish("ajax:after", [el]); + }; + + var handleEnable = function(el){ + q("*[data-disable-with][disabled]", el).forEach(function(node){ + var attr = node.tagName.toLowerCase() == "input" ? "value" : "innerHTML"; + var value = d.attr(node, "data-original-value"); + d.attr(node, "disabled", false); + d.attr(node, "data-original-value", null); + d.attr(node, attr, value); + }); + }; + + var handleDataMethod = function(evt){ + var el = evt.target, form = createFormForLink(el.href, dojo.attr(el, "data-method")); + evt.preventDefault(); + form.submit(); + }; + + var handleFormSubmit = function(evt){ + var el = evt.target, elements = q("*[data-disable-with]", el); + if (elements.length){ disable(elements); } + if (d.attr(el, "data-remote")){ + evt.preventDefault(); + handleRemote(evt); + } + }; + + var handleConfirm = function(evt){ + var proceed = dg.confirm(d.attr(evt.target, "data-confirm")); + if (!proceed){ + evt.preventDefault(); + }else if (d.attr(evt.target, "data-remote")){ + handleRemote(evt); + } + }; + + // Register data-{action} elements. Order is important since the return values + // from previously called functions in the connect chain influence whether + // or not the next function in the chain is called. + + // Register data-confirm elements + live("*[data-confirm]", "click", handleConfirm); + + // data-disable-with only applies to forms + d.subscribe("ajax:complete", handleEnable); + + // Register data-remote elements + live("a[data-remote]:not([data-confirm])", "click", handleRemote); + live("a[data-method]:not([data-remote])", "click", handleDataMethod); + + // Handle form submits + live("form", "submit", handleFormSubmit); + }; +})(dojo, dojox.rails, dojo.global)); + +}); |
