diff options
Diffstat (limited to 'web/client.js')
-rw-r--r-- | web/client.js | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/web/client.js b/web/client.js index fbb2cd8..fc352c7 100644 --- a/web/client.js +++ b/web/client.js @@ -41,12 +41,20 @@ $(function() { return res; } - function join(path, name) { + function join() { + var arg = _.toArray(arguments); + if (arg.length == 1) return arg[0]; + + var path = arg.shift(); + var name = arg.shift(); + if (_.isString(name)) { name = name.replace(/([\\\/])/g, "\\$1"); if (!isNaN(Number(name))) name = "\\" + name; } - return (path == "/" ? "" : path) + "/" + name; + arg.unshift((path == "/" ? "" : path) + "/" + name); + + return join.apply(undefined, arg); } function isRealSubordinate(p1, p2) { @@ -689,12 +697,17 @@ $(function() { } function fetchAndRender(path, target, level) { + var def = $.Deferred(); txnMgr.query(path).done(function(data) { renderObject(path, data, target, level); - }); + def.resolve(); + }).fail(function() { def.reject(); }); + return def; } + function redirect(path) { $.bbq.pushState("#" + path); } + function render() { var path = $.param.fragment(); @@ -742,7 +755,13 @@ $(function() { renderMenu(tabs, "/" + comps[0], comps[1], true) .done(function(first) { - fetchAndRender(topLevel ? join(path, first) : path); + fetchAndRender( + topLevel ? join(path, first) : path + ).fail(function() { + comps.pop(); + comps.unshift("/"); + redirect(join.apply(undefined, comps)); + }); }) .fail(function(data) { if (topLevel) renderObject(path, data); @@ -778,7 +797,7 @@ $(function() { $("#content").empty(); $(window).bind("hashchange", render); - $.bbq.pushState("#/"); + redirect("/"); }).fail(function() { statusBar.setError("Login failed", "login"); |