From 044e7bb59989500bdbdc8ace0402c314534a9975 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Wed, 22 Feb 2017 16:48:20 +0100 Subject: [PATCH] [FIX] web: display error dialog when onchanges fails When the onchange returns a dictionary with a 'warning' key, it is supposed to fail and display a dialog with the content of the warning. --- .../static/src/js/views/basic/basic_model.js | 6 ++- .../src/js/views/field_manager_mixin.js | 10 +++++ addons/web/static/test/views/form_tests.js | 40 ++++++++++++++++++- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index ac82b5bf2e8..c2855c8aaa4 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -951,7 +951,8 @@ var Model = AbstractModel.extend({ * * @param {Object} record * @param {string[]} fields changed fields - * @returns + * @returns {Deferred} The returned deferred can fail, in which case the + * fail value will be the warning message received from the server */ _applyOnChange: function (record, fields) { var self = this; @@ -980,6 +981,9 @@ var Model = AbstractModel.extend({ return this.mutex.exec(function () { var args = [idList, currentData, fields, onchange_spec, context]; return self.performModelRPC(record.model, 'onchange', args, {}).then(function (result) { + if (result.warning) { + return $.Deferred().reject(result.warning); + } var defs = []; _.each(result.value, function (val, name) { var field = record.fields[name]; diff --git a/addons/web/static/src/js/views/field_manager_mixin.js b/addons/web/static/src/js/views/field_manager_mixin.js index f1a238e7316..92c3da6a1fc 100644 --- a/addons/web/static/src/js/views/field_manager_mixin.js +++ b/addons/web/static/src/js/views/field_manager_mixin.js @@ -9,6 +9,10 @@ odoo.define('web.FieldManagerMixin', function (require) { */ var BasicModel = require('web.BasicModel'); +var Dialog = require('web.Dialog'); +var core = require('web.core'); + +var qweb = core.qweb; return { custom_events: { @@ -84,6 +88,12 @@ return { } else { self._confirmChange(dataPointID, result, event); } + }).fail(function (warning) { + new Dialog(self, { + size: 'medium', + title: warning.title, + $content: qweb.render("CrashManager.warning", warning) + }).open(); }); }, /** diff --git a/addons/web/static/test/views/form_tests.js b/addons/web/static/test/views/form_tests.js index 41584bc97e7..4dbf8eb2691 100644 --- a/addons/web/static/test/views/form_tests.js +++ b/addons/web/static/test/views/form_tests.js @@ -1554,6 +1554,42 @@ QUnit.module('Views', { assert.strictEqual(form.$('.o_priority .fa-star').length, 2, 'priority widget should have correct value'); }); -}); -}); + QUnit.test('display a dialog if onchange result is a warning', function (assert) { + assert.expect(2); + + this.data.partner.onchanges = { foo: true }; + + var form = createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '
' + + '' + + '
', + res_id: 2, + mockRPC: function (route, args) { + if (args.method === 'onchange') { + return $.when({ + valu: {}, + warning: { + title: "Warning", + message: "You must first select a partner" + } + }); + } + return this._super.apply(this, arguments); + }, + }); + + form.$buttons.find('.o_form_button_edit').click(); + + form.$('input').first().val("tralala").trigger('input'); + + assert.strictEqual($('.modal .modal-title:contains(Warning)').length, 1, + "should have rendered a modal dialog with correct title"); + assert.strictEqual($('.modal .modal-body:contains(You must first select a partner)').length, 1, + "should have rendered a modal dialog with correct content"); + }); + +});});