switch to jquery.couch2 for deffereds
This commit is contained in:
parent
d74b6d749d
commit
806ffee304
@ -9,7 +9,7 @@
|
||||
<link rel="stylesheet" href="style/demo.css" media="screen">
|
||||
<script type="text/javascript" src="script/jquery-1.6.1.min.js"></script>
|
||||
<script type="text/javascript" src="script/jquery.mustache.js"></script>
|
||||
<script type="text/javascript" src="script/jquery.request.js"></script>
|
||||
<script type="text/javascript" src="script/jquery.couch2.js"></script>
|
||||
<script type="text/javascript" src="script/sammy-0.6.3.min.js"></script>
|
||||
<script type="text/javascript" src="script/util.js"></script>
|
||||
<script type="text/javascript" src="script/removalist.js"></script>
|
||||
|
||||
63
attachments/script/jquery.couch2.js
Normal file
63
attachments/script/jquery.couch2.js
Normal file
@ -0,0 +1,63 @@
|
||||
(function($) {
|
||||
|
||||
window.couch = {};
|
||||
|
||||
var cache = {};
|
||||
|
||||
var defaults = {
|
||||
headers: {"Accept":"application/json"},
|
||||
dataType:"json",
|
||||
contentType: "application/json",
|
||||
type: "GET",
|
||||
url: "/"
|
||||
};
|
||||
|
||||
couch.request = function(opts) {
|
||||
var key = JSON.stringify(opts);
|
||||
if (cache[key]) {
|
||||
var dfd = $.Deferred();
|
||||
dfd.resolve(jQuery.extend(true, {}, cache[key]));
|
||||
return dfd.promise();
|
||||
} else {
|
||||
var ajaxOpts = $.extend({}, defaults, opts);
|
||||
ajaxOpts.dataFilter = function (data) {
|
||||
cache[key] = JSON.parse(data);
|
||||
return data;
|
||||
};
|
||||
return $.ajax(ajaxOpts).promise();
|
||||
}
|
||||
}
|
||||
|
||||
couch.clearCache = function() {
|
||||
cache = {};
|
||||
};
|
||||
|
||||
couch.get = function(url) {
|
||||
return couch.request({url:url, type:'GET'});
|
||||
};
|
||||
|
||||
couch.db = function(name, couchRoot) {
|
||||
if(!couchRoot) couchRoot = "";
|
||||
return {
|
||||
name: name,
|
||||
uri: couchRoot + "/" + encodeURIComponent(name) + "/",
|
||||
|
||||
get: function(id) {
|
||||
return couch.request({url:this.uri + id, type:"GET"});
|
||||
},
|
||||
|
||||
put: function(id, data) {
|
||||
return couch.request({url:this.uri + id, type:"PUT", data:data});
|
||||
},
|
||||
|
||||
designDocs: function(opts) {
|
||||
return couch.request($.extend(defaults, {
|
||||
url: this.uri + "_all_docs",
|
||||
data: {startkey:'"_design/"', endkey:'"_design0"', include_docs:true}
|
||||
}));
|
||||
}
|
||||
|
||||
};
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
@ -1,215 +0,0 @@
|
||||
(function() {
|
||||
var define = window.define
|
||||
if(!define) define = function(deps, definer) {
|
||||
if(!window.jQuery)
|
||||
throw new Error("Can't find jQuery");
|
||||
return definer(window.jQuery);
|
||||
}
|
||||
|
||||
define(['jquery'], function(jQuery) {
|
||||
|
||||
//
|
||||
// request.jquery
|
||||
//
|
||||
|
||||
var DEFAULT_TIMEOUT = 3 * 60 * 1000; // 3 minutes
|
||||
|
||||
function request(options, callback) {
|
||||
if(typeof options === 'string')
|
||||
options = {'uri':options};
|
||||
else
|
||||
options = JSON.parse(JSON.stringify(options)); // Use a duplicate for mutating.
|
||||
|
||||
if (!options.uri)
|
||||
throw new Error("options.uri is a required argument");
|
||||
else if(typeof options.uri != "string")
|
||||
throw new Error("options.uri must be a string");
|
||||
|
||||
; $.each(['proxy', '_redirectsFollowed', 'maxRedirects', 'followRedirect'], function(i, opt) {
|
||||
if(options[opt])
|
||||
throw new Error("options." + opt + " is not supported");
|
||||
})
|
||||
|
||||
options.method = options.method || 'GET';
|
||||
options.headers = options.headers || {};
|
||||
|
||||
if(options.headers.host)
|
||||
throw new Error("Options.headers.host is not supported");
|
||||
|
||||
/*
|
||||
// Browsers do not like this.
|
||||
if(options.body)
|
||||
options.headers['content-length'] = options.body.length;
|
||||
*/
|
||||
|
||||
var headers = {};
|
||||
var beforeSend = function(xhr, settings) {
|
||||
if(!options.headers.authorization && options.auth) {
|
||||
debugger
|
||||
options.headers.authorization = 'Basic ' + b64_enc(options.auth.username + ':' + options.auth.password);
|
||||
}
|
||||
|
||||
for (var key in options.headers)
|
||||
xhr.setRequestHeader(key, options.headers[key]);
|
||||
}
|
||||
|
||||
// Establish a place where the callback arguments will go.
|
||||
var result = [];
|
||||
|
||||
var onSuccess = function(data, reason, xhr) {
|
||||
result = [null, xhr, data];
|
||||
}
|
||||
|
||||
var onError = function (xhr, reason, er) {
|
||||
var body = undefined;
|
||||
|
||||
if(!er) {
|
||||
if(reason == 'timeout') {
|
||||
er = new Error("Request timeout");
|
||||
} else if(reason == 'error') {
|
||||
if(xhr.status > 299 && xhr.responseText.length > 0) {
|
||||
// Looks like HTTP worked, so there is no error as far as request is concerned. Simulate a success scenario.
|
||||
er = null;
|
||||
body = xhr.responseText;
|
||||
}
|
||||
} else {
|
||||
er = new Error("Unknown error; reason = " + reason);
|
||||
}
|
||||
}
|
||||
|
||||
result = [er, xhr, body];
|
||||
}
|
||||
|
||||
var onComplete = function(xhr, reason) {
|
||||
if(result.length === 0)
|
||||
result = [new Error("Result does not exist at completion time")];
|
||||
return callback && callback.apply(this, result);
|
||||
}
|
||||
|
||||
|
||||
var cors_creds = !!( options.creds || options.withCredentials );
|
||||
|
||||
return jQuery.ajax({ 'async' : true
|
||||
, 'cache' : (options.cache || false)
|
||||
, 'contentType': (options.headers['content-type'] || 'application/x-www-form-urlencoded')
|
||||
, 'type' : options.method
|
||||
, 'url' : options.uri
|
||||
, 'data' : (options.body || undefined)
|
||||
, 'timeout' : (options.timeout || request.DEFAULT_TIMEOUT)
|
||||
, 'dataType' : 'text'
|
||||
, 'processData': false
|
||||
, 'beforeSend' : beforeSend
|
||||
, 'success' : onSuccess
|
||||
, 'error' : onError
|
||||
, 'complete' : onComplete
|
||||
, 'xhrFields' : { 'withCredentials': cors_creds
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
request.withCredentials = false;
|
||||
request.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT;
|
||||
|
||||
var shortcuts = [ 'get', 'put', 'post', 'head' ];
|
||||
$.each(shortcuts, function(i, shortcut) {
|
||||
var method = shortcut.toUpperCase();
|
||||
var func = shortcut.toLowerCase();
|
||||
|
||||
request[func] = function(opts) {
|
||||
if(typeof opts === 'string')
|
||||
opts = {'method':method, 'uri':opts};
|
||||
else {
|
||||
opts = JSON.parse(JSON.stringify(opts));
|
||||
opts.method = method;
|
||||
}
|
||||
|
||||
var args = [opts].concat(Array.prototype.slice.apply(arguments, [1]));
|
||||
return request.apply(this, args);
|
||||
}
|
||||
})
|
||||
|
||||
request.json = function(options, callback) {
|
||||
options = JSON.parse(JSON.stringify(options));
|
||||
options.headers = options.headers || {};
|
||||
options.headers['accept'] = options.headers['accept'] || 'application/json';
|
||||
|
||||
if(options.method !== 'GET')
|
||||
options.headers['content-type'] = 'application/json';
|
||||
|
||||
return request(options, function(er, resp, body) {
|
||||
if(!er)
|
||||
body = JSON.parse(body)
|
||||
return callback && callback(er, resp, body);
|
||||
})
|
||||
}
|
||||
|
||||
request.couch = function(options, callback) {
|
||||
return request.json(options, function(er, resp, body) {
|
||||
if(er)
|
||||
return callback && callback(er, resp, body);
|
||||
|
||||
if((resp.status < 200 || resp.status > 299) && body.error)
|
||||
// The body is a Couch JSON object indicating the error.
|
||||
return callback && callback(body, resp);
|
||||
|
||||
return callback && callback(er, resp, body);
|
||||
})
|
||||
}
|
||||
|
||||
jQuery(document).ready(function() {
|
||||
jQuery.request = request;
|
||||
})
|
||||
|
||||
return request;
|
||||
|
||||
});
|
||||
|
||||
//
|
||||
// Utility
|
||||
//
|
||||
|
||||
// MIT License from http://phpjs.org/functions/base64_encode:358
|
||||
function b64_enc (data) {
|
||||
// Encodes string using MIME base64 algorithm
|
||||
var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
|
||||
var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc="", tmp_arr = [];
|
||||
|
||||
if (!data) {
|
||||
return data;
|
||||
}
|
||||
|
||||
// assume utf8 data
|
||||
// data = this.utf8_encode(data+'');
|
||||
|
||||
do { // pack three octets into four hexets
|
||||
o1 = data.charCodeAt(i++);
|
||||
o2 = data.charCodeAt(i++);
|
||||
o3 = data.charCodeAt(i++);
|
||||
|
||||
bits = o1<<16 | o2<<8 | o3;
|
||||
|
||||
h1 = bits>>18 & 0x3f;
|
||||
h2 = bits>>12 & 0x3f;
|
||||
h3 = bits>>6 & 0x3f;
|
||||
h4 = bits & 0x3f;
|
||||
|
||||
// use hexets to index into b64, and append result to encoded string
|
||||
tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
|
||||
} while (i < data.length);
|
||||
|
||||
enc = tmp_arr.join('');
|
||||
|
||||
switch (data.length % 3) {
|
||||
case 1:
|
||||
enc = enc.slice(0, -2) + '==';
|
||||
break;
|
||||
case 2:
|
||||
enc = enc.slice(0, -1) + '=';
|
||||
break;
|
||||
}
|
||||
|
||||
return enc;
|
||||
}
|
||||
|
||||
})();
|
||||
@ -4,10 +4,9 @@ var removalist = function() {
|
||||
return (parseFloat(bytes)/1024/1024).toString().substr(0,4) + "MB"
|
||||
}
|
||||
|
||||
function renderRows(err, resp, body) {
|
||||
var response = JSON.parse(body);
|
||||
var rows = [];
|
||||
response.rows.map(function(row) {
|
||||
function renderRows(rows) {
|
||||
var tableRows = [];
|
||||
rows.map(function(row) {
|
||||
var cells = [];
|
||||
app.headers.map(function(header) {
|
||||
var value = "";
|
||||
@ -17,25 +16,24 @@ var removalist = function() {
|
||||
}
|
||||
cells.push(value);
|
||||
})
|
||||
rows.push({cells: cells});
|
||||
tableRows.push({cells: cells});
|
||||
})
|
||||
util.render('dataTable', 'dataTableContainer', {
|
||||
rows: rows,
|
||||
rows: tableRows,
|
||||
headers: app.headers
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
function gotHeaders( err, resp, body ) {
|
||||
app.csvUrl = app.baseURL + 'api/csv?headers=' + escape(body);
|
||||
function gotHeaders( headers ) {
|
||||
app.headers = headers;
|
||||
app.csvUrl = app.baseURL + 'api/csv?headers=' + escape(JSON.stringify(headers));
|
||||
util.render( 'actions', 'project-controls', $.extend({}, app.dbInfo, {url: app.csvUrl}) );
|
||||
app.headers = JSON.parse(body);
|
||||
$.request($.extend({}, app.reqOpts, {uri: app.baseURL + 'api/rows?limit=10'}), renderRows);
|
||||
}
|
||||
|
||||
function gotDb( err, resp, body ) {
|
||||
function gotDb( dbInfo ) {
|
||||
|
||||
app.dbInfo = JSON.parse(body);
|
||||
app.dbInfo = dbInfo;
|
||||
|
||||
$.extend(app.dbInfo, {
|
||||
"host": window.location.host,
|
||||
@ -47,9 +45,6 @@ var removalist = function() {
|
||||
util.render('tableContainer', app.container, app.dbInfo);
|
||||
util.render('title', 'project-title', app.dbInfo);
|
||||
util.render( 'generating', 'project-controls' );
|
||||
|
||||
$.request($.extend({}, app.reqOpts, {uri: app.baseURL + 'api/headers'}), gotHeaders);
|
||||
|
||||
}
|
||||
|
||||
return {
|
||||
|
||||
@ -3,13 +3,6 @@ var app = {
|
||||
container: 'main_content'
|
||||
};
|
||||
|
||||
app.reqOpts = {
|
||||
uri: app.baseURL + "api",
|
||||
method: "GET",
|
||||
headers: {"Content-type": "application/json"},
|
||||
cache: true
|
||||
}
|
||||
|
||||
app.handler = function(route) {
|
||||
route = route.path.slice(1, route.path.length);
|
||||
if (route.length < 1) route = "home";
|
||||
@ -17,10 +10,42 @@ app.handler = function(route) {
|
||||
window.scrollTo(0, 0);
|
||||
};
|
||||
|
||||
// var query = {
|
||||
// "descending" : true,
|
||||
// "limit" : 20,
|
||||
// success: function( data ) {
|
||||
// if( data.rows.length === 0 ) {
|
||||
// monocles.oldestDoc = false;
|
||||
// monocles.hideLoader();
|
||||
// posts = [];
|
||||
// } else {
|
||||
// monocles.oldestDoc = data.rows[ data.rows.length - 1 ];
|
||||
// posts = data.rows;
|
||||
// }
|
||||
// renderStream();
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if ( opts.offsetDoc ) {
|
||||
// $.extend( query, {
|
||||
// "startkey": opts.offsetDoc.key,
|
||||
// "startkey_docid": opts.offsetDoc.id,
|
||||
// "skip": 1
|
||||
// })
|
||||
// }
|
||||
|
||||
app.after = {
|
||||
home: function() {
|
||||
|
||||
$.request(app.reqOpts, removalist.gotDb);
|
||||
couch.request({url: app.baseURL + "api"}).then(function(db) {
|
||||
removalist.gotDb(db);
|
||||
couch.request({url: app.baseURL + 'api/headers'}).then(function(headers) {
|
||||
removalist.gotHeaders(headers);
|
||||
couch.request({url: app.baseURL + 'api/rows?limit=10'}).then(function(response) {
|
||||
removalist.renderRows(response.rows);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
$( '.csv' ).live('click', ( function( e ) {
|
||||
window.location.href = app.csvUrl;
|
||||
@ -29,12 +54,12 @@ app.after = {
|
||||
}
|
||||
}
|
||||
|
||||
app.s = $.sammy(function () {
|
||||
app.sammy = $.sammy(function () {
|
||||
this.get('', app.handler);
|
||||
this.get("#/", app.handler);
|
||||
this.get("#:route", app.handler);
|
||||
});
|
||||
|
||||
$(function() {
|
||||
app.s.run();
|
||||
app.sammy.run();
|
||||
})
|
||||
Loading…
x
Reference in New Issue
Block a user