diff --git a/web_widget_one2many_product_picker/static/src/js/views/One2ManyProductPicker/record.js b/web_widget_one2many_product_picker/static/src/js/views/One2ManyProductPicker/record.js index 40502edab..91aea409e 100644 --- a/web_widget_one2many_product_picker/static/src/js/views/One2ManyProductPicker/record.js +++ b/web_widget_one2many_product_picker/static/src/js/views/One2ManyProductPicker/record.js @@ -81,7 +81,12 @@ odoo.define("web_widget_one2many_product_picker.One2ManyProductPickerRecord", fu * @override */ destroy: function () { - this.$card.off("") + this.$el.remove(); + this.$card.off(""); + const model = this.options.basicFieldParams.model; + if (this.state) { + model.removeVirtualRecord(this.state.id); + } this._super.apply(this, arguments); }, @@ -182,12 +187,15 @@ odoo.define("web_widget_one2many_product_picker.One2ManyProductPickerRecord", fu this.fields = this.getParent().state.fields; this.fieldsInfo = this.getParent().state.fieldsInfo.form; + var model = this.options.basicFieldParams.model; + if (this.state) { + model.removeVirtualRecord(this.state.id); + } this.state = viewState; if (recordSearch) { this.recordSearch = recordSearch; } - var model = this.options.basicFieldParams.model; this.is_virtual = this.state && model.isPureVirtual(this.state.id) || false; // Check if has cached qty 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 1b675747c..4cbc64fa8 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 @@ -63,15 +63,6 @@ odoo.define("web_widget_one2many_product_picker.One2ManyProductPickerRenderer", _.invoke(this.widgets, 'on_detach_callback'); }, - /** - * @param {Object} widget - */ - removeWidget: function (widget) { - var index = this.widgets.indexOf(widget); - widget.destroy(); - delete this.widgets[index]; - }, - /** * @override */ diff --git a/web_widget_one2many_product_picker/static/src/js/views/basic_model.js b/web_widget_one2many_product_picker/static/src/js/views/basic_model.js index 9d8fd3f52..0503089a2 100644 --- a/web_widget_one2many_product_picker/static/src/js/views/basic_model.js +++ b/web_widget_one2many_product_picker/static/src/js/views/basic_model.js @@ -51,6 +51,24 @@ odoo.define("web_widget_one2many_product_picker.BasicModel", function (require) }); }, + removeVirtualRecord: function (id) { + if (!this.isPureVirtual(id)) { + return false; + } + + const data = this.localData[id]; + const to_remove = []; + this._visitChildren(data, (item) => { + to_remove.push(item.id); + }); + + to_remove.reverse(); + for (let remove_id of to_remove) { + this.removeLine(remove_id); + delete this.localData[remove_id]; + } + }, + /** * Generates a virtual records without link it * 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 8d97dede8..0021fd3d3 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 @@ -584,7 +584,8 @@ odoo.define("web_widget_one2many_product_picker.FieldOne2ManyProductPicker", fun _onCreateQuickRecord: function (evt) { evt.stopPropagation(); var self = this; - this.parent_controller.model.setPureVirtual(evt.data.id, false); + var model = this.parent_controller.model; + model.setPureVirtual(evt.data.id, false); if (this.options.auto_save) { // Dont trigger state update @@ -593,16 +594,10 @@ odoo.define("web_widget_one2many_product_picker.FieldOne2ManyProductPicker", fun {notifyChange: false} ).then(function () { self.parent_controller.saveRecord(undefined, {stayInEdit: true}).then(function () { - // Because 'create' generates a new state and we can't know these new id we - // need force update all the current states. - self._setValue( - {operation: "UPDATE", id: evt.data.id}, - {doNotSetDirty: true} - ).then(function () { - if (evt.data.callback) { - evt.data.callback(); - } - }); + self.renderer.updateState(model.get(self.parent_controller.handle).data[self.name], {force: true}); + if (evt.data.callback) { + evt.data.callback(); + } }); if (evt.data.callback) { evt.data.callback(); @@ -631,15 +626,10 @@ odoo.define("web_widget_one2many_product_picker.FieldOne2ManyProductPicker", fun {notifyChange: false} ).then(function () { self.parent_controller.saveRecord(undefined, {stayInEdit: true}).then(function () { - // Workaround to get updated values - self.parent_controller.model.reload(self.value.id).then(function (result) { - var new_data = self.parent_controller.model.get(result); - self.value.data = new_data.data; - self.renderer.updateState(self.value, {force: true}); - if (callback) { - callback(); - } - }); + self.renderer.updateState(self.parent_controller.model.get(self.parent_controller.handle).data[self.name], {force: true}); + if (callback) { + callback(); + } }); if (callback) { callback();