summaryrefslogtreecommitdiff
path: root/addons/web/static/tests
diff options
context:
space:
mode:
authorGéry Debongnie <ged@odoo.com>2017-11-07 10:53:04 +0100
committerGéry Debongnie <ged@odoo.com>2017-11-08 10:50:12 +0100
commit9e97ad8dce4525d6a132b8f8353b5c8fa87caba2 (patch)
tree9422f864b1fbd54684b428150aa282da31519db9 /addons/web/static/tests
parent324d4bfb562a1549f4895fd7d8925a3353edb704 (diff)
[FIX] web: prevent useless discard dialog from showing up
Here is a scenario that could cause an issue: - open a form view with a many2one - click on edit button - click on small external button for many2one. this opens a modal form view - click on save in the modal (without changing anything) - click on save in the main record - exit form view. this opens a discard dialog There were two issues here: - saving the modal dialog automatically marks the many2one field as changed. This was necessary to force reloading the data, because editing a sub value in the modal form view could have changed the display_name of the manyone field. However, this is not necessary when no change was done. - when saving a record, the _isDirty flag was reset to false only if an actual rpc was done. However, it may happen that the flag is set to dirty (for example, when modifying a value inside a many2one), but the main record has no changed fields. In this commit, we also remove the on_save handler in the formviewdialog. This is a small refactoring in a stable version, but no code currently use it, and I believe that it will make the code much easier to maintain (the previous code was really awkward), so I think that the tradeoff is acceptable.
Diffstat (limited to 'addons/web/static/tests')
-rw-r--r--addons/web/static/tests/fields/relational_fields_tests.js92
1 files changed, 92 insertions, 0 deletions
diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js
index 07b58764e30..8f789c88647 100644
--- a/addons/web/static/tests/fields/relational_fields_tests.js
+++ b/addons/web/static/tests/fields/relational_fields_tests.js
@@ -210,6 +210,98 @@ QUnit.module('relational_fields', {
form.destroy();
});
+ QUnit.test('editing a many2one, but not changing anything', function (assert) {
+ assert.expect(2);
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form string="Partners">' +
+ '<sheet>' +
+ '<field name="trululu"/>' +
+ '</sheet>' +
+ '</form>',
+ archs: {
+ 'partner,false,form': '<form string="Partners"><field name="display_name"/></form>',
+ },
+ res_id: 1,
+ mockRPC: function (route, args) {
+ if (args.method === 'get_formview_id') {
+ assert.deepEqual(args.args[0], [4], "should call get_formview_id with correct id");
+ return $.when(false);
+ }
+ return this._super(route, args);
+ },
+ viewOptions: {
+ ids: [1, 2],
+ },
+ });
+
+ form.$buttons.find('.o_form_button_edit').click();
+
+ // click on the external button (should do an RPC)
+ form.$('.o_external_button').click();
+ // save and close modal
+ $('.modal .modal-footer .btn-primary:first').click();
+ // save form
+ form.$buttons.find('.o_form_button_save').click();
+ // click next on pager
+ form.pager.$('.o_pager_next').click();
+
+ // this checks that the view did not ask for confirmation that the
+ // record is dirty
+ assert.strictEqual(form.pager.$el.text().trim(), '2 / 2',
+ 'pager should be at second page');
+ form.destroy();
+ });
+
+ QUnit.test('editing a many2one (with form view opened with external button)', function (assert) {
+ assert.expect(1);
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form string="Partners">' +
+ '<sheet>' +
+ '<field name="trululu"/>' +
+ '</sheet>' +
+ '</form>',
+ archs: {
+ 'partner,false,form': '<form string="Partners"><field name="foo"/></form>',
+ },
+ res_id: 1,
+ mockRPC: function (route, args) {
+ if (args.method === 'get_formview_id') {
+ return $.when(false);
+ }
+ return this._super(route, args);
+ },
+ viewOptions: {
+ ids: [1, 2],
+ },
+ });
+
+ form.$buttons.find('.o_form_button_edit').click();
+
+ // click on the external button (should do an RPC)
+ form.$('.o_external_button').click();
+
+ $('.modal input[name="foo"]').val('brandon').trigger('input');
+
+ // save and close modal
+ $('.modal .modal-footer .btn-primary:first').click();
+ // save form
+ form.$buttons.find('.o_form_button_save').click();
+ // click next on pager
+ form.pager.$('.o_pager_next').click();
+
+ // this checks that the view did not ask for confirmation that the
+ // record is dirty
+ assert.strictEqual(form.pager.$el.text().trim(), '2 / 2',
+ 'pager should be at second page');
+ form.destroy();
+ });
+
QUnit.test('many2ones in form views with show_adress', function (assert) {
assert.expect(4);
var form = createView({