");
Base.render.call(this, data, meta);
this.el.append(this.div);
if (meta.editable &&
_.contains(["collection", "list"], meta.type)) {
if (!this.table) this.makeSortable(this.div);
var self = this;
var button = dom.button("Insert", function() {
var getter, row;
function insert() {
var name = getter();
if (name in data.data) {
statusBar.setError("Already exists: " + name);
return;
}
function render(txnValid) {
statusBar.validationReady(txnValid);
if (row) row.remove();
return self.renderCollectionMember(name, meta);
}
if (type.isTreeNode(meta.members))
data.set(name, {}).done(function(txnValid) {
render(txnValid);
button.show();
}).fail(function(xhr) {
statusBar.setError(
self.formatValidationError(xhr)
);
data.delete(name);
});
else data.set(name, null).always(function() {
var widget = render(false);
function handler(event) {
button.show();
widget.off("validated", handler);
}
widget.on("validated", handler);
});
}
button.hide();
if (meta.type == "collection") {
var field = $("
").attr({type: "text"})
.change(insert);
row = $("
").html($("").html(field));
getter = function() { return field.val(); }
self.appendRow(row);
field.focus();
}
else {
getter = function() {
return data.data.length + 1;
};
insert();
}
});
this.el.append($(" ").html(button));
}
},
addActionButton: function(label, action) {
this.div.append(dom.button(label, action));
},
appendWidget: function(el, label) {
var self = this;
var description = el.data("description");
var labelTd = $(" | ").text(label);
el.on("hasDetails", function(event, path) {
labelTd.html(dom.objectRef(path).text(label));
el.on("statusChanged", function(event, status) {
dom.setStatus(labelTd, status);
event.stopPropagation();
});
event.stopPropagation();
});
el = dom.makeRow(el);
if (el.is("tr")) {
el.prepend(labelTd);
if (description) el.append($(" | ").text(description));
this.appendRow(el);
}
else {
if (el.is("table")) {
this.makeSortable(el.find("tbody"));
var tr;
el.find("tr").each(function(index, row) {
tr = $(row);
tr.prepend($(" | "));
});
tr.children().first().remove();
tr.prepend(labelTd);
this.table = el;
}
else this.table = null;
this.div.append(el);
}
return el;
},
appendRow: function(row) {
if (!this.table) {
this.table = this.makeSortable($(" |
"));
this.div.append($("").html(this.table));
}
this.table.append(row);
},
makeSortable: function(el) {
var data = this.reqData;
if (data.meta.type == "list" && data.meta.editable)
el.sortable({
start: function(event, ui) {
$(":focus").change();
ui.item.data("index", ui.item.index());
},
stop: function(event, ui) {
if (!data.isSubtreeValid()) {
el.sortable("cancel");
return;
}
var oldIndex = ui.item.data("index") + 1;
var newIndex = ui.item.index() + 1;
if (newIndex != oldIndex)
data.move(oldIndex, newIndex)
.done(function(txnValid) {
$("#content").trigger("reload", [txnValid]);
});
}
});
return el;
}
});
}
);