summaryrefslogtreecommitdiff
path: root/addons/web/static
diff options
context:
space:
mode:
authorGéry Debongnie <ged@odoo.com>2017-03-24 14:45:09 +0100
committerAaron Bohy <aab@odoo.com>2017-04-11 19:44:38 +0200
commit00cd7052cb21888028a45a25cf66278ac43d3ac3 (patch)
tree9f3d752236bd4969f865cec282cb7593e92c1789 /addons/web/static
parent47bb855c7e92d34a32fff925ab41ff38ed8fb78c (diff)
[FIX] web: better handling of isDirty state
When the view is saved (either directly or via a widget in readonly mode), the flag isDirty was not reset to false. also, use the $ function on widgets insted of $el.find and remove some unused imports
Diffstat (limited to 'addons/web/static')
-rw-r--r--addons/web/static/src/js/views/field_manager_mixin.js4
-rw-r--r--addons/web/static/src/js/views/form/form_controller.js3
-rw-r--r--addons/web/static/test/views/form_tests.js81
3 files changed, 74 insertions, 14 deletions
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 4e61d25f468..10d0c06ad76 100644
--- a/addons/web/static/src/js/views/field_manager_mixin.js
+++ b/addons/web/static/src/js/views/field_manager_mixin.js
@@ -9,10 +9,6 @@ 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;
var FieldManagerMixin = {
custom_events: {
diff --git a/addons/web/static/src/js/views/form/form_controller.js b/addons/web/static/src/js/views/form/form_controller.js
index b4ea40faa3c..f27a47ababc 100644
--- a/addons/web/static/src/js/views/form/form_controller.js
+++ b/addons/web/static/src/js/views/form/form_controller.js
@@ -242,6 +242,7 @@ var FormController = BasicController.extend({
if (!stayInEdit) {
self._toReadOnlyMode();
}
+ self.isDirty = false;
});
}
}
@@ -313,6 +314,7 @@ var FormController = BasicController.extend({
* @param {string} id
*/
_confirmSave: function (id) {
+ this.isDirty = false;
if (id === this.handle) {
this.reload();
} else {
@@ -461,6 +463,7 @@ var FormController = BasicController.extend({
var self = this;
this.canBeDiscarded().then(function () {
self.model.discardChanges(self.handle);
+ self.isDirty = false;
if (!self.model.isNew(self.handle)) {
self._toReadOnlyMode();
} else {
diff --git a/addons/web/static/test/views/form_tests.js b/addons/web/static/test/views/form_tests.js
index ad64148c75a..a00412e577d 100644
--- a/addons/web/static/test/views/form_tests.js
+++ b/addons/web/static/test/views/form_tests.js
@@ -1370,8 +1370,8 @@ QUnit.module('Views', {
},
});
- assert.strictEqual(form.pager.$el.find('.o_pager_value').text(), "1", 'pager value should be 1');
- assert.strictEqual(form.pager.$el.find('.o_pager_limit').text(), "2", 'pager limit should be 2');
+ assert.strictEqual(form.pager.$('.o_pager_value').text(), "1", 'pager value should be 1');
+ assert.strictEqual(form.pager.$('.o_pager_limit').text(), "2", 'pager limit should be 2');
// switch to edit mode
form.$buttons.find('.o_form_button_edit').click();
@@ -1382,23 +1382,84 @@ QUnit.module('Views', {
assert.strictEqual(form.$('.o_form_input').val(), 'new value', 'input should contain new value');
// click on the pager to switch to the next record and cancel the confirm request
- form.pager.$el.find('.o_pager_next').click(); // click on next
+ form.pager.$('.o_pager_next').click(); // click on next
assert.ok($('.modal').length, 'a confirm modal should be displayed');
$('.modal .modal-footer .btn-default').click(); // click on cancel
assert.strictEqual(form.$('.o_form_input').val(), 'new value', 'input should still contain new value');
- assert.strictEqual(form.pager.$el.find('.o_pager_value').text(), "1", 'pager value should still be 1');
+ assert.strictEqual(form.pager.$('.o_pager_value').text(), "1", 'pager value should still be 1');
// click on the pager to switch to the next record and confirm
- form.pager.$el.find('.o_pager_next').click(); // click on next
+ form.pager.$('.o_pager_next').click(); // click on next
assert.ok($('.modal').length, 'a confirm modal should be displayed');
$('.modal .modal-footer .btn-primary').click(); // click on confirm
assert.strictEqual(form.$('.o_form_input').val(), 'blip', 'input should contain blip');
- assert.strictEqual(form.pager.$el.find('.o_pager_value').text(), "2", 'pager value should be 2');
+ assert.strictEqual(form.pager.$('.o_pager_value').text(), "2", 'pager value should be 2');
assert.strictEqual(nbWrite, 0, 'no write RPC should have been done');
form.destroy();
});
+ QUnit.test('handling dirty state: switching to another record', function (assert) {
+ assert.expect(12);
+
+ var form = createView({
+ View: FormView,
+ model: 'partner',
+ data: this.data,
+ arch: '<form string="Partners">' +
+ '<field name="foo"></field>' +
+ '<field name="priority" widget="priority"></field>' +
+ '</form>',
+ viewOptions: {
+ ids: [1, 2],
+ index: 0,
+ },
+ res_id: 1,
+ });
+ assert.strictEqual(form.pager.$('.o_pager_value').text(), "1", 'pager value should be 1');
+
+ // switch to edit mode
+ form.$buttons.find('.o_form_button_edit').click();
+ assert.strictEqual(form.$('.o_form_input').val(), 'yop', 'input should contain yop');
+
+ // edit the foo field
+ form.$('.o_form_input').val('new value').trigger('input');
+ assert.strictEqual(form.$('.o_form_input').val(), 'new value', 'input should contain new value');
+
+ form.$buttons.find('.o_form_button_save').click();
+
+ // click on the pager to switch to the next record and cancel the confirm request
+ form.pager.$('.o_pager_next').click(); // click on next
+ assert.strictEqual($('.modal').length, 0, 'no confirm modal should be displayed');
+ assert.strictEqual(form.pager.$('.o_pager_value').text(), "2", 'pager value should be 2');
+
+ assert.strictEqual(form.$('.o_priority .fa-star-o').length, 2,
+ 'priority widget should have been rendered with correct value');
+
+ // edit the value in readonly
+ form.$('.o_priority .fa-star-o:first').click(); // click on the first star
+ assert.strictEqual(form.$('.o_priority .fa-star').length, 1,
+ 'priority widget should have been updated');
+
+ form.pager.$('.o_pager_next').click(); // click on next
+ assert.strictEqual($('.modal').length, 0, 'no confirm modal should be displayed');
+ assert.strictEqual(form.pager.$('.o_pager_value').text(), "1", 'pager value should be 1');
+
+ // switch to edit mode
+ form.$buttons.find('.o_form_button_edit').click();
+ assert.strictEqual(form.$('.o_form_input').val(), 'new value', 'input should contain yop');
+
+ // edit the foo field
+ form.$('.o_form_input').val('wrong value').trigger('input');
+
+ form.$buttons.find('.o_form_button_cancel').click();
+ assert.strictEqual($('.modal').length, 1, 'a confirm modal should be displayed');
+ $('.modal .modal-footer .btn-primary').click(); // click on confirm
+ form.pager.$('.o_pager_next').click(); // click on next
+ assert.strictEqual(form.pager.$('.o_pager_value').text(), "2", 'pager value should be 2');
+ form.destroy();
+ });
+
QUnit.test('restore local state when switching to another record', function (assert) {
assert.expect(4);
@@ -1432,7 +1493,7 @@ QUnit.module('Views', {
"second tab should be active");
// click on the pager to switch to the next record
- form.pager.$el.find('.o_pager_next').click();
+ form.pager.$('.o_pager_next').click();
assert.notOk(form.$('.o_notebook li:eq(0)').hasClass('active'),
"first tab should not be active");
@@ -1499,10 +1560,10 @@ QUnit.module('Views', {
});
assert.strictEqual(form.mode, 'readonly', 'form view should be in readonly mode');
- assert.strictEqual(form.pager.$el.find('.o_pager_value').text(), "1", 'pager value should be 1');
- form.pager.$el.find('.o_pager_next').click(); // click on next
+ assert.strictEqual(form.pager.$('.o_pager_value').text(), "1", 'pager value should be 1');
+ form.pager.$('.o_pager_next').click(); // click on next
- assert.strictEqual(form.pager.$el.find('.o_pager_value').text(), "2", 'pager value should be 2');
+ assert.strictEqual(form.pager.$('.o_pager_value').text(), "2", 'pager value should be 2');
assert.strictEqual(form.mode, 'readonly', 'form view should be in readonly mode');
assert.strictEqual(pushStateCount, 2, "should have triggered 2 push_state");