diff --git a/addons/web/static/src/js/views/basic/basic_renderer.js b/addons/web/static/src/js/views/basic/basic_renderer.js index f5238a95b33..204c35acaef 100644 --- a/addons/web/static/src/js/views/basic/basic_renderer.js +++ b/addons/web/static/src/js/views/basic/basic_renderer.js @@ -30,6 +30,7 @@ var BasicRenderer = AbstractRenderer.extend({ this.activeActions = params.activeActions; this.viewType = params.viewType; this.mode = params.mode || 'readonly'; + this.widgets = []; }, /** * This method has two responsabilities: find every invalid fields in the @@ -95,6 +96,9 @@ var BasicRenderer = AbstractRenderer.extend({ return this._render().then(_.constant([])); } + // reset all widgets (from the tag) if any: + _.invoke(this.widgets, 'updateState', state); + var defs = []; // Reset all the field widgets that are marked as changed and the ones @@ -605,6 +609,8 @@ var BasicRenderer = AbstractRenderer.extend({ var Widget = widgetRegistry.get(node.attrs.name); var widget = new Widget(this, record); + this.widgets.push(widget); + // Prepare widget rendering and save the related deferred var def = widget.__widgetRenderAndInsert(function () {}); if (def.state() === 'pending') { diff --git a/addons/web/static/tests/views/form_tests.js b/addons/web/static/tests/views/form_tests.js index a4952644e15..8d780d31b58 100644 --- a/addons/web/static/tests/views/form_tests.js +++ b/addons/web/static/tests/views/form_tests.js @@ -6230,6 +6230,41 @@ QUnit.module('Views', { delete widgetRegistry.map.test; }); + QUnit.test('basic support for widgets', function (assert) { + assert.expect(1); + + var MyWidget = Widget.extend({ + init: function (parent, dataPoint) { + this.data = dataPoint.data; + }, + start: function () { + this.$el.text(this.data.foo + "!"); + }, + updateState: function (dataPoint) { + this.$el.text(dataPoint.data.foo + "!"); + }, + }); + widgetRegistry.add('test', MyWidget); + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '' + + '', + }); + + form.$('input[name="foo"]').val("I am alive").trigger('input'); + assert.strictEqual(form.$('.o_widget').text(), 'I am alive!', + "widget should have been updated"); + + form.destroy(); + delete widgetRegistry.map.test; + }); + + QUnit.test('bounce edit button in readonly mode', function (assert) { assert.expect(3);