summaryrefslogtreecommitdiffstats
path: root/web/client.js
diff options
context:
space:
mode:
Diffstat (limited to 'web/client.js')
-rw-r--r--web/client.js149
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();
}
});