summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAurélien Warnon <awa@odoo.com>2020-12-16 14:26:21 +0000
committerAurélien Warnon <awa@odoo.com>2020-12-16 14:40:41 +0000
commitc5cbb9975897935e9ed4e1bce80335207758fa24 (patch)
tree5f31332f2a59af9e9fd961fde36770d3aec6a7ab
parent47a74f2aaf54bddf51a828c4b5a76c392944bcd5 (diff)
[FIX] crm: fix rainbowman message display conditions
This commit fixes the display of the rainbowman message when leads go through the "won" stage. Currently, some flows don't show the message when they are supposed to or show the message when they are NOT supposed to. This is because the case when the form is saved through the regular "Save" button is not handled at all. The CRM form controller extension was completed with the missing use case and fixed. An additional QUnit test ensures the correct behavior. Task-2418294 closes odoo/odoo#63460 Signed-off-by: Thibault Delavallee (tde) <tde@openerp.com>
-rw-r--r--addons/crm/static/src/js/crm_form.js72
-rw-r--r--addons/crm/static/tests/crm_rainbowman_tests.js24
2 files changed, 79 insertions, 17 deletions
diff --git a/addons/crm/static/src/js/crm_form.js b/addons/crm/static/src/js/crm_form.js
index b8f026e618f..40845647edf 100644
--- a/addons/crm/static/src/js/crm_form.js
+++ b/addons/crm/static/src/js/crm_form.js
@@ -15,27 +15,65 @@ odoo.define("crm.crm_form", function (require) {
var CrmFormController = FormController.extend({
/**
- * After data are saved we display a possible rainbowman
- * message when the stage is won.
+ * Main method used when saving the record hitting the "Save" button.
+ * We check if the stage_id field was altered and if we need to display a rainbowman
+ * message.
+ *
* @override
*/
- _applyChanges: async function (dataPointID, changes, event) {
- var result = await this._super(...arguments);
- if ('stage_id' in changes) {
- const message = await this._rpc({
- model: 'crm.lead',
- method : 'get_rainbowman_message',
- args: [[parseInt(event.target.res_id)]],
- });
- if (message) {
- this.trigger_up('show_effect', {
- message: message,
- type: 'rainbow_man',
- });
+ saveRecord: function () {
+ return this._super(...arguments).then((modifiedFields) => {
+ if (modifiedFields.indexOf('stage_id') !== -1) {
+ this._checkRainbowmanMessage(this.renderer.state.res_id)
}
- }
- return result;
+ });
+ },
+
+ //--------------------------------------------------------------------------
+ // Private
+ //--------------------------------------------------------------------------
+
+ /**
+ * Apply change may be called with 'event.data.force_save' set to True.
+ * This typically happens when directly clicking in the statusbar widget on a new stage.
+ * If it's the case, we check for a modified stage_id field and if we need to display a
+ * rainbowman message.
+ *
+ * @param {string} dataPointID
+ * @param {Object} changes
+ * @param {OdooEvent} event
+ * @override
+ * @private
+ */
+ _applyChanges: function (dataPointID, changes, event) {
+ return this._super(...arguments).then(() => {
+ if (event.data.force_save && 'stage_id' in changes) {
+ this._checkRainbowmanMessage(parseInt(event.target.res_id));
+ }
+ });
},
+
+ /**
+ * When updating a crm.lead, through direct use of the status bar or when saving the
+ * record, we check for a rainbowman message to display.
+ *
+ * (see Widget docstring for more information).
+ *
+ * @param {integer} recordId
+ */
+ _checkRainbowmanMessage: async function(recordId) {
+ const message = await this._rpc({
+ model: 'crm.lead',
+ method : 'get_rainbowman_message',
+ args: [[recordId]],
+ });
+ if (message) {
+ this.trigger_up('show_effect', {
+ message: message,
+ type: 'rainbow_man',
+ });
+ }
+ }
});
var CrmFormView = FormView.extend({
diff --git a/addons/crm/static/tests/crm_rainbowman_tests.js b/addons/crm/static/tests/crm_rainbowman_tests.js
index ff7f91967eb..3a0158d15db 100644
--- a/addons/crm/static/tests/crm_rainbowman_tests.js
+++ b/addons/crm/static/tests/crm_rainbowman_tests.js
@@ -114,6 +114,30 @@ odoo.define('crm.form_rainbowman_tests', function (require) {
form.destroy();
});
+ QUnit.test("first lead won, click on statusbar in edit mode then save", async function (assert) {
+ assert.expect(3);
+
+ const form = await createView(_.extend(this.testFormView, {
+ res_id: 6,
+ mockRPC: async function (route, args) {
+ const result = await this._super(...arguments);
+ if (args.model === 'crm.lead' && args.method === 'get_rainbowman_message') {
+ assert.step(result || "no rainbowman");
+ }
+ return result;
+ },
+ viewOptions: {mode: 'edit'}
+ }));
+
+ await testUtils.dom.click(form.$(".o_statusbar_status button[data-value='3']"));
+ assert.verifySteps([]); // no message displayed yet
+
+ await testUtils.form.clickSave(form);
+ assert.verifySteps(['Go, go, go! Congrats for your first deal.']);
+
+ form.destroy();
+ });
+
QUnit.test("team record 30 days, click on statusbar", async function (assert) {
assert.expect(2);