From 68ce109cc1609b7277a1afebcdee1cd424d8e9a9 Mon Sep 17 00:00:00 2001 From: Kaarle Ritvanen Date: Wed, 11 Dec 2013 14:17:31 +0200 Subject: web client: refresh filtered reference choices on field updates --- web/client.js | 40 ++++++++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 6 deletions(-) (limited to 'web/client.js') 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 $("