diff options
| author | Xavier Morel <xmo@openerp.com> | 2012-01-24 15:19:27 +0100 |
|---|---|---|
| committer | Xavier Morel <xmo@openerp.com> | 2012-01-24 15:19:27 +0100 |
| commit | 084bf9fb3fee99f1049fc9e0a3865ad242edcfd0 (patch) | |
| tree | 1caaaec3f70f55bf2b04332947189c8e174cd0e6 /addons/web/static/src/js | |
| parent | b39e6ae7f122c98afb79e5bcb4ced467f472cbc5 (diff) | |
[FIX] in m2o fields, abort previous name_get when new one (for same field) arrives in order to limit the number of requests in-flight
lp bug: https://launchpad.net/bugs/920884 fixed
bzr revid: xmo@openerp.com-20120124141927-wznbkd2tf3mngq31
Diffstat (limited to 'addons/web/static/src/js')
| -rw-r--r-- | addons/web/static/src/js/core.js | 14 | ||||
| -rw-r--r-- | addons/web/static/src/js/data.js | 4 | ||||
| -rw-r--r-- | addons/web/static/src/js/search.js | 5 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_form.js | 5 |
4 files changed, 26 insertions, 2 deletions
diff --git a/addons/web/static/src/js/core.js b/addons/web/static/src/js/core.js index c735f113991..098c6da104a 100644 --- a/addons/web/static/src/js/core.js +++ b/addons/web/static/src/js/core.js @@ -443,7 +443,9 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }; var deferred = $.Deferred(); this.on_rpc_request(); - this.rpc_function(url, payload).then( + var aborter = params.aborter; + delete params.aborter; + var request = this.rpc_function(url, payload).then( function (response, textStatus, jqXHR) { self.on_rpc_response(); if (!response.error) { @@ -469,6 +471,16 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }; deferred.reject(error, $.Event()); }); + if (aborter) { + aborter.abort_last = function () { + if (!(request.isResolved() || request.isRejected())) { + deferred.fail(function (error, event) { + event.preventDefault(); + }); + request.abort(); + } + }; + } // Allow deferred user to disable on_rpc_error in fail deferred.fail(function() { deferred.fail(function(error, event) { diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js index 0cf36fbf2f5..be7d707c91c 100644 --- a/addons/web/static/src/js/data.js +++ b/addons/web/static/src/js/data.js @@ -430,7 +430,9 @@ openerp.web.DataSet = openerp.web.OldWidget.extend( /** @lends openerp.web.Data method: method, domain_id: domain_index == undefined ? null : domain_index, context_id: context_index == undefined ? null : context_index, - args: args || [] + args: args || [], + // FIXME: API which does not suck for aborting requests in-flight + aborter: this }, callback, error_callback); }, /** diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 564dd09ae4a..251bd22cd39 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -989,12 +989,17 @@ openerp.web.search.ManyToOneField = openerp.web.search.CharField.extend({ var self = this; this.$element.autocomplete({ source: function (req, resp) { + if (self.abort_last) { + self.abort_last(); + delete self.abort_last; + } self.dataset.name_search( req.term, self.attrs.domain, 'ilike', 8, function (data) { resp(_.map(data, function (result) { return {id: result[0], label: result[1]} })); }); + self.abort_last = self.dataset.abort_last; }, select: function (event, ui) { self.id = ui.item.id; diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 743a1ecdf4e..e296fcc1955 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -1873,6 +1873,10 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ var search_val = request.term; var self = this; + if (this.abort_last) { + this.abort_last(); + delete this.abort_last; + } var dataset = new openerp.web.DataSetStatic(this, this.field.relation, self.build_context()); dataset.name_search(search_val, self.build_domain(), 'ilike', @@ -1912,6 +1916,7 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ response(values); }); + this.abort_last = dataset.abort_last; }, _quick_create: function(name) { var self = this; |
