Skip to content

Commit

Permalink
work on rails3 driver dom events
Browse files Browse the repository at this point in the history
  • Loading branch information
ttilley committed Feb 27, 2010
1 parent 245e52f commit 5620cc6
Show file tree
Hide file tree
Showing 3 changed files with 101 additions and 7 deletions.
16 changes: 9 additions & 7 deletions rails/ujs.js → rails/_util/ujs.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
dojo.require('plugd.trigger');
dojo.provide('rails._util.ujs');
dojo.require('rails._util.xhrDomEvents');
dojo.require('dojo.NodeList-traverse');

// main handlers:
Expand Down Expand Up @@ -40,24 +41,25 @@ dojo.require('dojo.NodeList-traverse');
method = el.attr('method') || 'post';
url = el.attr('action');
params = dojo.formToObject(el);
hasBody = true;
hasBody = true;
}
else {
method = el.attr('data-method') || 'get';
url = el.attr('data-url') || el.attr('href');
params = {};
hasBody = false;
hasBody = false;
}

if (!dojo.trigger(el, 'ajax:before')) {
return false;
}

dojo.xhr(method, {
url: url,
handleAs: 'javascript',
content: params
}, hasBody);
url: url,
handleAs: 'javascript',
content: params,
domEvents: el
}, hasBody);

dojo.trigger(el, 'ajax:after');
};
Expand Down
63 changes: 63 additions & 0 deletions rails/_util/xhrDomEvents.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
dojo.provide('rails._util.xhrDomEvents');
dojo.require('rails._util.xhrReadyState');
dojo.require('plugd.trigger');

(function(){
var _xhr = dojo.xhr;

var _xhrDomEventHandler = function(element, customEvent){
var handler = dojo.hitch(element, dojo.trigger, element, customEvent);
return function(xhr){
handler({request: xhr});
}
};

var _xhrDomEventsFor = function(element){
return {
onLoading: _xhrDomEventHandler(element, 'ajax:loading'),
onLoaded: _xhrDomEventHandler(element, 'ajax:loaded'),
onInteractive: _xhrDomEventHandler(element, 'ajax:interactive'),
onComplete: _xhrDomEventHandler(element, 'ajax:complete')
}
};

dojo.xhr = function(method, args, hasBody){
if (args && args.domEvents) {
var element = args.domEvents;
delete args.domEvents;

var readyStateCallbacks = _xhrDomEventsFor(element);
if (args.readyStateCallbacks) {
var overWrite = args.readyStateCallbacks;
dojo.mixin(readyStateCallbacks, overWrite);
}
args.readyStateCallbacks = readyStateCallbacks;

var dfd;

// TODO: find a way to return a sane deferred before xhr is even
// called...
// if (!dojo.trigger(element, 'ajax:before')) {
// dfd = new dojo.Deferred();
// dfd.cancel();
// return dfd;
// }

dfd = _xhr(method, args, hasBody);

var ajaxSuccess = _xhrDomEventHandler(element, 'ajax:success');
var ajaxFailure = _xhrDomEventHandler(element, 'ajax:failure');

dfd.addCallbacks(function(dfd){
ajaxSuccess(dfd.ioArgs.xhr);
}, function(dfd){
ajaxFailure(dfd.ioArgs.xhr);
});

// dojo.trigger(element, 'ajax:after');

return dfd;
}
};

})();
29 changes: 29 additions & 0 deletions rails/_util/xhrReadyState.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
dojo.provide('rails._util.xhrReadyState');

(function(){
var _xhrObj = dojo._xhrObj;
var _readyStates = ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];

var _readyStateHandler = function(callbacks, readyState){
var state = _readyStates[readyState];
var callback = callbacks['on' + state];
if (callback && dojo.isFunction(callback)) {
callback(this);
}
}

dojo._xhrObj = function(args){
var http = _xhrObj();
if (callbacks = args.readyStateCallbacks) {
delete args.readyStateCallbacks;
try {
http.onreadystatechange = dojo.hitch(http, _readyStateHandler, callbacks);
}
catch (e) {
console.error("Unable to setup ready state handler:");
console.error(e);
}
}
return http;
}
})();

0 comments on commit 5620cc6

Please sign in to comment.