nextcloud/core/js/router.js

82 lines
2.1 KiB
JavaScript
Raw Normal View History

2013-07-31 23:21:02 +04:00
OC.router_base_url = OC.webroot + '/index.php';
2012-10-05 11:42:36 +04:00
OC.Router = {
// register your ajax requests to load after the loading of the routes
// has finished. otherwise you face problems with race conditions
registerLoadedCallback: function(callback){
if (!this.routes_request){
return;
}
this.routes_request.done(callback);
},
routes_request: !window.TESTING && $.ajax(OC.router_base_url + '/core/routes.json', {
2012-10-05 11:42:36 +04:00
dataType: 'json',
success: function(jsondata) {
if (jsondata.status === 'success') {
2012-10-05 11:42:36 +04:00
OC.Router.routes = jsondata.data;
}
}
}),
generate:function(name, opt_params) {
if (!('routes' in this)) {
if(this.routes_request.state() != 'resolved') {
console.warn('To avoid race conditions, please register a callback');// wait
2012-10-05 11:42:36 +04:00
}
}
if (!(name in this.routes)) {
throw new Error('The route "' + name + '" does not exist.');
}
var route = this.routes[name];
var params = opt_params || {};
var unusedParams = $.extend(true, {}, params);
var url = '';
var optional = true;
$(route.tokens).each(function(i, token) {
if ('text' === token[0]) {
url = token[1] + url;
optional = false;
2012-10-05 11:42:36 +04:00
return;
2012-10-05 11:42:36 +04:00
}
if ('variable' === token[0]) {
if (false === optional || !(token[3] in route.defaults)
|| ((token[3] in params) && params[token[3]] != route.defaults[token[3]])) {
2012-10-05 11:42:36 +04:00
var value;
if (token[3] in params) {
value = params[token[3]];
delete unusedParams[token[3]];
2012-10-05 11:42:36 +04:00
} else if (token[3] in route.defaults) {
value = route.defaults[token[3]];
2012-10-05 11:42:36 +04:00
} else if (optional) {
return;
2012-10-05 11:42:36 +04:00
} else {
throw new Error('The route "' + name + '" requires the parameter "' + token[3] + '".');
2012-10-05 11:42:36 +04:00
}
var empty = true === value || false === value || '' === value;
if (!empty || !optional) {
url = token[1] + encodeURIComponent(value).replace(/%2F/g, '/') + url;
2012-10-05 11:42:36 +04:00
}
optional = false;
}
2012-10-05 11:42:36 +04:00
return;
2012-10-05 11:42:36 +04:00
}
throw new Error('The token type "' + token[0] + '" is not supported.');
});
if (url === '') {
url = '/';
}
unusedParams = $.param(unusedParams);
if (unusedParams.length > 0) {
url += '?'+unusedParams;
}
return OC.router_base_url + url;
}
}