diff --git a/odoo/addons/base/static/src/js/res_config_settings.js b/odoo/addons/base/static/src/js/res_config_settings.js
index 9ad0a2c9196..802fdaced6f 100644
--- a/odoo/addons/base/static/src/js/res_config_settings.js
+++ b/odoo/addons/base/static/src/js/res_config_settings.js
@@ -353,6 +353,9 @@ var BaseSettingRenderer = FormRenderer.extend({
});
var BaseSettingController = FormController.extend({
+ custom_events: _.extend({}, FormController.prototype.custom_events, {
+ button_clicked: '_onButtonClicked',
+ }),
init: function () {
this._super.apply(this, arguments);
this.disableAutofocus = true;
@@ -367,6 +370,28 @@ var BaseSettingController = FormController.extend({
willRestore: function () {
this.mode = 'edit';
},
+
+ //--------------------------------------------------------------------------
+ // Handlers
+ //--------------------------------------------------------------------------
+
+ /**
+ * @private
+ */
+ _onButtonClicked: function (ev) {
+ var self = this;
+ if (ev.data.attrs.name !== 'execute' && ev.data.attrs.name !== 'cancel') {
+ var recordID = ev.data.recordID;
+ var _super = this._super;
+ var args = arguments;
+ this._discardChanges(recordID).then(function () {
+ _super.apply(self, args);
+ });
+ } else {
+ this._super.apply(this, arguments);
+ }
+ },
+
});
var BaseSettingsModel = BasicModel.extend({
diff --git a/odoo/addons/base/static/tests/base_settings_tests.js b/odoo/addons/base/static/tests/base_settings_tests.js
index 98d68b1281e..fa9b92c49e2 100644
--- a/odoo/addons/base/static/tests/base_settings_tests.js
+++ b/odoo/addons/base/static/tests/base_settings_tests.js
@@ -143,6 +143,103 @@ QUnit.module('base_settings_tests', {
actionManager.destroy();
});
+ QUnit.test('clicking on any button in setting should show discard warning if setting form is dirty', async function (assert) {
+ assert.expect(11);
+
+ var actions = [{
+ id: 1,
+ name: 'Settings view',
+ res_model: 'project',
+ type: 'ir.actions.act_window',
+ views: [[1, 'form']],
+ }, {
+ id: 4,
+ name: 'Other action',
+ res_model: 'project',
+ type: 'ir.actions.act_window',
+ views: [[2, 'list']],
+ }];
+ var archs = {
+ 'project,1,form': '
',
+ 'project,2,list': '',
+ 'project,false,search': '',
+ };
+
+ var actionManager = await createActionManager({
+ actions: actions,
+ archs: archs,
+ data: this.data,
+ mockRPC: function (route, args) {
+ if (route === '/web/dataset/call_button') {
+ if (args.method === "execute") {
+ assert.ok("execute method called");
+ return Promise.resolve(true);
+ }
+ if (args.method === "cancel") {
+ assert.ok("cancel method called");
+ return Promise.resolve(true);
+ }
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ await actionManager.doAction(1);
+ assert.containsNone(actionManager, '.o_field_boolean input:checked',
+ "checkbox should not be checked");
+
+ await testUtils.dom.click(actionManager.$("input[type='checkbox']"));
+ assert.containsOnce(actionManager, '.o_field_boolean input:checked',
+ "checkbox should be checked");
+
+ await testUtils.dom.click(actionManager.$('button[name="4"]'));
+ assert.containsOnce(document.body, '.modal', "should open a warning dialog");
+
+ await testUtils.dom.click($('.modal button:contains(Ok)'));
+ assert.containsOnce(actionManager, '.o_list_view', "should be open list view");
+
+ await testUtils.dom.click($('.o_control_panel .breadcrumb-item a'));
+ assert.containsNone(actionManager, '.o_field_boolean input:checked',
+ "checkbox should not be checked");
+
+ await testUtils.dom.click(actionManager.$("input[type='checkbox']"));
+ await testUtils.dom.click(actionManager.$('button[name="4"]'));
+ assert.containsOnce(document.body, '.modal', "should open a warning dialog");
+
+ await testUtils.dom.click($('.modal button:contains(Cancel)'));
+ assert.containsOnce(actionManager, '.o_form_view' ,"should be remain on form view");
+
+ await testUtils.dom.click(actionManager.$("button[name='execute']"));
+ assert.containsNone(document.body, '.modal', "should not open a warning dialog");
+
+ await testUtils.dom.click(actionManager.$("input[type='checkbox']"));
+ await testUtils.dom.click(actionManager.$("button[name='cancel']"));
+ assert.containsNone(document.body, '.modal', "should not open a warning dialog");
+
+ actionManager.destroy();
+ });
+
QUnit.test('settings view does not display other settings after reload', async function (assert) {
assert.expect(2);