From eec959b820a17b5584d149c62bdfd9f0c7cf8976 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandre=20D=2E=20D=C3=ADaz?= Date: Tue, 29 Dec 2020 19:59:34 +0100 Subject: [PATCH] [IMP] web_widget_one2many_product_picker: Prevent lost search input focus --- .../views/One2ManyProductPicker/renderer.js | 31 ++++++++++--------- .../widgets/field_one2many_product_picker.js | 11 +++++-- 2 files changed, 26 insertions(+), 16 deletions(-) diff --git a/web_widget_one2many_product_picker/static/src/js/views/One2ManyProductPicker/renderer.js b/web_widget_one2many_product_picker/static/src/js/views/One2ManyProductPicker/renderer.js index bc42ad57e..01b0b4828 100644 --- a/web_widget_one2many_product_picker/static/src/js/views/One2ManyProductPicker/renderer.js +++ b/web_widget_one2many_product_picker/static/src/js/views/One2ManyProductPicker/renderer.js @@ -154,7 +154,7 @@ odoo.define("web_widget_one2many_product_picker.One2ManyProductPickerRenderer", false, true, search_record_index - ) + )[0] ); } } @@ -233,7 +233,7 @@ odoo.define("web_widget_one2many_product_picker.One2ManyProductPickerRenderer", // Need add a new one? if (!exists && search_record_index !== -1) { var new_search_record = _.extend({}, search_record, {__id: state.id}); - defs.push(this.appendSearchRecords([new_search_record], false, true, search_record_index)); + defs.push(this.appendSearchRecords([new_search_record], false, true, search_record_index)[0]); } } this.widgets = _.compact(this.widgets); @@ -254,7 +254,8 @@ odoo.define("web_widget_one2many_product_picker.One2ManyProductPickerRenderer", this.$extraButtonsContainer = $(qweb.render("One2ManyProductPicker.ExtraButtons")); this.$btnLoadMore = this.$extraButtonsContainer.find("#productPickerLoadMore"); return $.Deferred(function (d) { - self.appendSearchRecords(self.search_data, true).then(function () { + var defs = self.appendSearchRecords(self.search_data, true); + defs[0].then(function () { _.invoke(oldWidgets, "destroy"); self.$el.empty(); self.$el.append(self.$recordsContainer); @@ -263,7 +264,7 @@ odoo.define("web_widget_one2many_product_picker.One2ManyProductPickerRenderer", if (self._isInDom) { _.invoke(self.widgets, "on_attach_callback"); } - d.resolve(); + d.resolve(defs[1]); }); }); }, @@ -398,7 +399,7 @@ odoo.define("web_widget_one2many_product_picker.One2ManyProductPickerRenderer", * @param {Boolean} no_attach_widgets * @param {Boolean} no_process_records * @param {Number} position - * @returns {Deferred} + * @returns {Array[Deferred]} */ appendSearchRecords: function (search_records, no_attach_widgets, no_process_records, position) { var self = this; @@ -411,15 +412,17 @@ odoo.define("web_widget_one2many_product_picker.One2ManyProductPickerRenderer", delete this.defs; var defsVirtualState = this.defsVirtualState; delete this.defsVirtualState; - $.when.apply($, defsVirtualState).then(function () { - self.trigger_up("loading_records", {finished:true}); - }); - return $.when.apply($, defs).then(function () { - if (!no_attach_widgets && self._isInDom) { - var new_widgets = self.widgets.slice(cur_widget_index); - _.invoke(new_widgets, "on_attach_callback"); - } - }); + return [ + $.when.apply($, defs).then(function () { + if (!no_attach_widgets && self._isInDom) { + var new_widgets = self.widgets.slice(cur_widget_index); + _.invoke(new_widgets, "on_attach_callback"); + } + }), + $.when.apply($, defsVirtualState).then(function () { + self.trigger_up("loading_records", {finished:true}); + }), + ]; }, /** diff --git a/web_widget_one2many_product_picker/static/src/js/widgets/field_one2many_product_picker.js b/web_widget_one2many_product_picker/static/src/js/widgets/field_one2many_product_picker.js index bcfb772a6..510a9df03 100644 --- a/web_widget_one2many_product_picker/static/src/js/widgets/field_one2many_product_picker.js +++ b/web_widget_one2many_product_picker/static/src/js/widgets/field_one2many_product_picker.js @@ -270,7 +270,11 @@ odoo.define("web_widget_one2many_product_picker.FieldOne2ManyProductPicker", fun return $.Deferred(function (d) { self._getSearchRecords().then(function () { self.renderer.$el.scrollTop(0); - self.renderer._renderView().then(d.resolve); + self.renderer._renderView().then(function (virtualStateDefs) { + virtualStateDefs.then(function () { + d.resolve(); + }); + }); }); }); }, @@ -546,8 +550,11 @@ odoo.define("web_widget_one2many_product_picker.FieldOne2ManyProductPicker", fun * @private */ _onClickSearchEraser: function () { + var self = this; this._clearSearchInput(); - this.doRenderSearchRecords(); + this.doRenderSearchRecords().then(function () { + self.$searchInput.focus(); + }); }, /**