summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-09-19 00:01:08 +0300
committerKaarle Ritvanen <kaarle.ritvanen@datakunkku.fi>2013-09-19 20:37:10 +0300
commit1b7fc75c13c12d07fb762b9d77e0a07cde4b4433 (patch)
tree0e358071ea37bdd68d451494f377ffbb417b95af
parentacca3809011b16c9f141d0811bb2d0b9adcb0361 (diff)
downloadaconf-1b7fc75c13c12d07fb762b9d77e0a07cde4b4433.tar.bz2
aconf-1b7fc75c13c12d07fb762b9d77e0a07cde4b4433.tar.xz
web client: move field rendering to Widget, Field objects
-rw-r--r--web/client.js183
1 files changed, 89 insertions, 94 deletions
diff --git a/web/client.js b/web/client.js
index c61e5c7..1fefaf7 100644
--- a/web/client.js
+++ b/web/client.js
@@ -353,35 +353,47 @@ $(function() {
+ function formatError(msg, xhr) {
+ msg += " " + xhr.statusCode().status;
+ if (xhr.responseText) msg += ': ' + xhr.responseText;
+ return msg;
+ }
+
+
function href() {
return $("<a>").attr({href: "javascript:void(0);"});
}
var Widget = {
- init: function(value, meta, label, level, update, remove) {
+ init: function(
+ data, name, meta, label, level, editable, removable
+ ) {
- function attachLabel(el) {
- var row = $("<tr>");
- row.append($("<td>").text(label));
- row.append(el);
- return row;
- }
+ var value = data.get(name);
- if (!update) {
+ if (!editable) {
var el = this.staticRender(value, level);
this.setElStatus(el, status);
- if (label) return attachLabel(el);
+ if (label) return this.attachLabel(el, label);
return el;
}
this.el = this.render(value, meta, level);
- this.el.change(update);
- var el = attachLabel(this.wrap());
- if (remove)
- el.append(
- $("<td>").html(href().click(remove).text("Delete"))
- );
+ var el = this.attachLabel(this.wrap(), label);
+ if (removable) {
+ var link = href().click(function() {
+ data.delete(name).done(function(txnValid) {
+ statusBar.validationReady(txnValid)
+ fetchAndRender($.param.fragment());
+ })
+ }).text("Delete");
+ if (el.is("tr")) link = $("<td>").html(link);
+ el.append(link);
+ }
+
+ this.setStatus(data.status(name));
+
return el;
},
@@ -389,6 +401,13 @@ $(function() {
el.prop("class", status);
},
+ attachLabel: function(el, label) {
+ var row = $("<tr>");
+ row.append($("<td>").text(label));
+ row.append(el);
+ return row;
+ },
+
wrap: function() { return this.el; },
setStatus: function(status) {
@@ -397,11 +416,54 @@ $(function() {
}
var Field = Object.create(Widget);
- Field.init = function(value, meta, label, level, update, remove) {
+ Field.init = function(
+ data, name, meta, label, level, editable, removable
+ ) {
var el = _.bind(Widget.init, this)(
- value, meta, label, level, update, remove
+ data, name, meta, label, level, editable, removable
);
- if (!this.field) this.field = this.el;
+
+ if (editable) {
+ if (!this.field) this.field = this.el;
+
+ var self = this;
+
+ function change() {
+ self.msg.text("[checking]");
+ statusBar.setError("Validating changes", "validate");
+
+ data.set(name, self.get()).done(function(txnValid) {
+ self.msg.empty()
+ self.setStatus(data.status(name));
+ statusBar.validationReady(txnValid);
+
+ }).fail(function(xhr) {
+ if (_.isString(xhr)) self.msg.text(xhr);
+
+ else if (xhr.statusCode().status == 422)
+ self.msg.html(
+ _.reduce(
+ _.map(
+ $.parseJSON(xhr.responseText),
+ _.escape
+ ),
+ function(a, b) {
+ return a + "<br/>" + b;
+ }
+ )
+ );
+
+ else self.msg.text(formatError("Error", xhr));
+
+ self.setStatus("invalid");
+ statusBar.validationReady(false);
+ });
+ }
+
+ this.field.change(change);
+ if (data.status(name) == "invalid") change();
+ }
+
return el;
};
Field.staticRender = function(value, level) {
@@ -417,10 +479,6 @@ $(function() {
td.append(this.el);
return td;
};
- Field.setMessage = function(msg, html) {
- if (html) this.msg.html(msg);
- else this.msg.text(msg);
- };
Field.get = function() { return this.field.val() || null; };
var ComboBox = Object.create(Field);
@@ -481,10 +539,7 @@ $(function() {
el.append(obj);
return el;
};
- Inline.wrap = function(el, label, remove) {
- if (remove) el.append(href().click(remove).text("Delete"));
- return {row: el};
- };
+ Inline.attachLabel = function(el, label) { return el; };
Inline.setStatus = function(status) {};
var Reference = Object.create(ComboBox);
@@ -495,11 +550,11 @@ $(function() {
ComboBox.setElStatus(el.find("select"), status);
};
Reference.init = function(
- value, meta, label, level, update, remove
+ data, name, meta, label, level, editable, removable
) {
- this.field = ComboBox.render(value, meta, level);
+ this.field = ComboBox.render(data.get(name), meta, level);
return _.bind(ComboBox.init, this)(
- value, meta, label, level, update, remove
+ data, name, meta, label, level, editable, removable
);
}
Reference.render = function(value, meta, level) {
@@ -529,13 +584,6 @@ $(function() {
}
- function formatError(msg, xhr) {
- msg += " " + xhr.statusCode().status;
- if (xhr.responseText) msg += ': ' + xhr.responseText;
- return msg;
- }
-
-
function renderObject(path, data, target, level) {
target = target || $("#content");
level = level || 1;
@@ -558,69 +606,16 @@ $(function() {
}
function renderField(name, meta, label, editable, removable) {
-
- var value = data.get(name);
- var status = data.status(name);
-
- if (!(meta.widget in widgets))
- return $("<tr>").html($("<td>").text(value));
-
- var widget = Object.create(widgets[meta.widget]);
-
- function change() {
- if (isTreeNode(meta)) return;
-
- widget.setMessage("[checking]");
- statusBar.setError("Validating changes", "validate");
-
- data.set(name, widget.get()).done(function(txnValid) {
- widget.setMessage("");
- widget.setStatus(data.status(name));
- statusBar.validationReady(txnValid);
-
- }).fail(function(xhr) {
- if (_.isString(xhr)) widget.setMessage(xhr);
-
- else if (xhr.statusCode().status == 422)
- widget.setMessage(
- _.reduce(
- _.map(
- $.parseJSON(xhr.responseText),
- _.escape
- ),
- function(a, b) {
- return a + "<br/>" + b;
- }
- ),
- true
- );
-
- else widget.setMessage(formatError("Error", xhr));
-
- widget.setStatus("invalid");
- statusBar.validationReady(false);
- });
- }
-
- var el = widget.init(
- value,
+ var el = Object.create(widgets[meta.widget]).init(
+ data,
+ name,
meta,
label,
level,
- editable ? change : null,
- removable ? function() {
- data.delete(name).done(function(txnValid) {
- statusBar.validationReady(txnValid)
- fetchAndRender(path);
- });
- } : null
+ editable,
+ removable
);
- if (editable) {
- if (status == "invalid") change();
- widget.setStatus(status);
- }
-
if (el.is("tr")) appendRow(el);
else {
table = null;