diff options
Diffstat (limited to 'web/client.js')
-rw-r--r-- | web/client.js | 40 |
1 files changed, 34 insertions, 6 deletions
diff --git a/web/client.js b/web/client.js index b3261cb..6ccb917 100644 --- a/web/client.js +++ b/web/client.js @@ -138,6 +138,10 @@ $(function() { return data.data[index(name)]; }; + data.metaRequest = function(name) { + return request("/meta" + join(path, name)); + }; + data.match = function(filter) { if (!filter) return true; return _.every(_.map(filter, function(values, key) { @@ -498,6 +502,7 @@ $(function() { init: function(data, name, meta, level, editable, removable) { this.data = data; + this.name = name; this.meta = meta; this.level = level; @@ -511,14 +516,20 @@ $(function() { } this.makeEl(); + this.dynamic = meta.dynamic; var self = this; - var request = this.requestData(value, meta) - .done(function(value, meta) { + var request; + function handleRequest(req) { + request = req; + req.done(function(value, meta) { + if (req != request) return; self.render(value, meta); self.setStatus(status); }); + } + handleRequest(this.requestData(value, meta)); this.wrapped = this.wrap(); this.visible = true; @@ -548,7 +559,9 @@ $(function() { }); this.wrapped.on("updated", function(event, field) { + if (self.dynamic) handleRequest(self.refreshData()); if (!field || + self.dynamic || (meta.condition && field in meta.condition)) validate(); event.stopPropagation(); @@ -563,6 +576,15 @@ $(function() { return $.Deferred().resolve(value, meta); }, + refreshData: function() { + var def = $.Deferred(); + var self = this; + this.data.metaRequest(this.name).done(function(data) { + def.resolve(self.get(), data); + }); + return def; + }, + wrap: function() { return this.el; }, showStatus: true, @@ -588,7 +610,6 @@ $(function() { init: function( data, name, meta, level, editable, removable ) { - this.name = name; this.editable = editable && meta.editable; var el = this.super( @@ -686,7 +707,7 @@ $(function() { createEl: function() { return $("<select>"); }, render: function(value, meta) { - var el = this.field; + var el = this.field.empty(); function opt(value, ui_value, selected) { el.append($("<option>").attr( @@ -756,8 +777,13 @@ $(function() { showStatus: false, requestData: function(value, meta) { + this.path = value; + return this.refreshData(); + }, + + refreshData: function() { var def = $.Deferred(); - txnMgr.query(value).done(function(data) { + txnMgr.query(this.path).done(function(data) { def.resolve(data, data.meta); }); return def; @@ -914,7 +940,7 @@ $(function() { createEl: function() { return $("<div>"); }, render: function(data, meta) { - this.el.append( + this.el.html( $("<h" + this.level + ">").text(data.meta["ui-name"]) ); } @@ -1052,6 +1078,8 @@ $(function() { }, render: function(data, meta) { + this.dynamic = meta.members.dynamic; + this.super(CheckBoxes, "render", data, meta); var table = $("<table>"); |