diff options
-rw-r--r-- | web/client.js | 149 |
1 files changed, 123 insertions, 26 deletions
diff --git a/web/client.js b/web/client.js index 7f65c51..cde1bb3 100644 --- a/web/client.js +++ b/web/client.js @@ -27,6 +27,22 @@ $(function() { return (path == "/" ? "" : path) + "/" + name; } + function isRealSubordinate(p1, p2) { return !p1.indexOf(p2 + "/"); } + + function isSubordinate(p1, p2) { + return p1 == p2 || isRealSubordinate(p1, p2); + } + + function isTreeNode(meta) { + return _.contains( + ["collection", "list", "model", "set"], meta.type + ); + } + + function href() { + return $("<a>").attr({href: "javascript:void(0);"}); + } + var txnMgr = (function(token) { var txn, changed, invalid; @@ -61,11 +77,14 @@ $(function() { var def = $.Deferred(); objRequest(path).done(function(data) { + function index(name) { + return _.isArray(data.data) ? name - 1 : name; + } + data.get = function(name, valid) { var p = join(path, name); - if (_.isArray(data.data)) name--; return (!valid && p in invalid) ? - invalid[p][0] : data.data[name]; + invalid[p][0] : data.data[index(name)]; }; data.status = function(name) { @@ -73,7 +92,7 @@ $(function() { function scan(objs) { return _.size(_.filter( _.keys(objs), function(obj) { - return obj == p || !obj.indexOf(p + "/"); + return isSubordinate(obj, p); } )); } @@ -99,12 +118,8 @@ $(function() { type: "PUT", data: JSON.stringify(newValue) }; - else { - var savedValue = (mpath in changed) ? - changed[mpath][1] : value; - if (savedValue != null) - options = {type: "DELETE"}; - } + else if (data.get(name, true) != null) + options = {type: "DELETE"}; if (!options) { if (data.meta.type == "model" && _.findWhere( @@ -117,19 +132,42 @@ $(function() { objRequest(mpath, options).done(function() { if (!(mpath in changed)) - changed[mpath] = [value]; - if (!tn && newValue == changed[mpath][0]) + changed[mpath] = value; + if (!tn && newValue == changed[mpath]) delete changed[mpath]; - else changed[mpath][1] = npv; + else { + data.data[index(name)] = npv; + if (npv == null) + _.each(_.keys(changed), function(p) { + if (isRealSubordinate(p, mpath)) + delete changed[p]; + }); + } function resolve() { - var latest = invalid[mpath][1]; - if (latest == def) delete invalid[mpath]; + if (mpath in invalid && + invalid[mpath][1] == def) { + + var del = invalid[mpath][0] == null; + delete invalid[mpath]; + + if (del) + _.each( + _.keys(invalid), + function(p) { + if (isRealSubordinate( + p, mpath + )) delete invalid[p]; + } + ); + } + def.resolve(isValid()); } if (tn) query(mpath).done(function(data) { - if (data.meta.type == "model") + if (mpath in invalid && + data.meta.type == "model") _.each( data.meta.fields, function(field) { @@ -162,6 +200,62 @@ $(function() { return def; }; + data.delete = function(name) { + var def = $.Deferred(); + + var tasks = _.filter( + _.pluck(_.values(invalid), 1), + function(d) { return d.state() == "pending"; } + ); + + if (tasks.length) + tasks[0].always(function() { + data.delete(name).done(function(txnValid) { + def.resolve(txnValid); + }).fail(function() { def.reject(); }); + }); + + else { + var length = data.data.length; + + data.set(name, null).done(function(txnValid) { + if (isTreeNode(data.meta)) { + delete changed[join(path, name)]; + changed[path] = path; + + if (data.meta.type == "list") + for (var i = name; i < length; i++) { + var opath = join(path, i + 1); + var npath = join(path, i); + + _.each( + [changed, invalid], + function(map) { + _.each( + _.keys(map), + function(p) { + if (isSubordinate( + p, opath + )) { + map[npath + + p.substring( + opath.length + )] = map[p]; + delete map[p]; + } + }); + } + ); + } + } + def.resolve(txnValid); + + }).fail(function() { def.reject(); }); + } + + return def; + }; + def.resolve(data); }).fail(function() { def.reject(); }); @@ -254,9 +348,9 @@ $(function() { var Path = Object.create(Field); Path.staticRender = function(value) { - var el = $("<a>"); + var el = href(); if (value) { - el.attr({href: "javascript:void(0);"}).click(function() { + el.click(function() { $.bbq.pushState("#" + value); }).text("Show"); } @@ -325,12 +419,6 @@ $(function() { function render() { var path = $.param.fragment(); - function isTreeNode(meta) { - return _.contains( - ["collection", "list", "model", "set"], meta.type - ); - } - function renderMenu(target, path, current, selectFirst) { var def = $.Deferred(); @@ -460,16 +548,24 @@ $(function() { row.append(td); row.append($("<td>").text(JSON.stringify(meta))); table.append(row); + + return row; } function renderCollectionMember(name, value, meta) { - renderField( + var row = renderField( name, value, meta.members, meta["ui-member"] + " " + name, meta.type != "set" ); + row.append(href().click(function() { + data.delete(name).done(function(txnValid) { + validated(txnValid) + renderObj(path); + }); + }).text("Delete")); } if (data.meta.type == "model") @@ -491,7 +587,6 @@ $(function() { content.append(table); if (_.contains(["collection", "list"], data.meta.type)) { - var len = data.data.length; var keys = _.clone(_.keys(data.data)); var button = $("<input>").attr( @@ -537,7 +632,9 @@ $(function() { table.append(row); } else { - getter = function() { return ++len; }; + getter = function() { + return data.data.length + 1; + }; insert(); } }); |