From de57a2db14f11fc9795a1ccc1926711eb8a775c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexandre=20K=C3=BChn?= Date: Mon, 31 Aug 2020 14:15:58 +0000 Subject: [PATCH] [FIX] mail: message/activity link with dataset oe-id and oe-model MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Task-2328718 closes odoo/odoo#56872 X-original-commit: 430aa0c2ffe242992fb935733d81f6e05a6d2458 Signed-off-by: Sébastien Theys (seb) Signed-off-by: Alexandre Kühn (aku) --- .../src/components/activity/activity.js | 19 ++++++++ .../src/components/activity/activity.xml | 2 +- .../src/components/activity/activity_tests.js | 48 +++++++++++++++++++ .../static/src/components/message/message.js | 25 ++++------ .../src/components/message/message_tests.js | 46 ++++++++++++++++++ .../form_renderer/form_renderer_tests.js | 4 +- 6 files changed, 124 insertions(+), 20 deletions(-) diff --git a/addons/mail/static/src/components/activity/activity.js b/addons/mail/static/src/components/activity/activity.js index 6c70f876160..45fb2d12a8e 100644 --- a/addons/mail/static/src/components/activity/activity.js +++ b/addons/mail/static/src/components/activity/activity.js @@ -130,6 +130,25 @@ class Activity extends Component { this.activity.markAsDone({ attachments: [ev.detail.attachment] }); } + /** + * @private + * @param {MouseEvent} ev + */ + _onClick(ev) { + if ( + ev.target.tagName === 'A' && + ev.target.dataset.oeId && + ev.target.dataset.oeModel + ) { + this.env.messaging.openProfile({ + id: Number(ev.target.dataset.oeId), + model: ev.target.dataset.oeModel, + }); + // avoid following dummy href + ev.preventDefault(); + } + } + /** * @private * @param {MouseEvent} ev diff --git a/addons/mail/static/src/components/activity/activity.xml b/addons/mail/static/src/components/activity/activity.xml index 41d284b9dd6..d8ae1808bf5 100644 --- a/addons/mail/static/src/components/activity/activity.xml +++ b/addons/mail/static/src/components/activity/activity.xml @@ -2,7 +2,7 @@ -
+
diff --git a/addons/mail/static/src/components/activity/activity_tests.js b/addons/mail/static/src/components/activity/activity_tests.js index 7c9b33ce385..dce0969159d 100644 --- a/addons/mail/static/src/components/activity/activity_tests.js +++ b/addons/mail/static/src/components/activity/activity_tests.js @@ -1069,6 +1069,54 @@ QUnit.test('activity mark done popover click on discard', async function (assert ); }); +QUnit.test('data-oe-id & data-oe-model link redirection on click', async function (assert) { + assert.expect(7); + + const bus = new Bus(); + bus.on('do-action', null, payload => { + assert.strictEqual( + payload.action.type, + 'ir.actions.act_window', + "action should open view" + ); + assert.strictEqual( + payload.action.res_model, + 'some.model', + "action should open view on 'some.model' model" + ); + assert.strictEqual( + payload.action.res_id, + 250, + "action should open view on 250" + ); + assert.step('do-action:openFormView_some.model_250'); + }); + await this.start({ env: { bus } }); + const activity = this.env.models['mail.activity'].create({ + canWrite: true, + category: 'not_upload_file', + id: 12, + note: `

some.model_250

`, + }); + await this.createActivityComponent(activity); + assert.containsOnce( + document.body, + '.o_Activity_note', + "activity should have a note" + ); + assert.containsOnce( + document.querySelector('.o_Activity_note'), + 'a', + "activity note should have a link" + ); + + document.querySelector(`.o_Activity_note a`).click(); + assert.verifySteps( + ['do-action:openFormView_some.model_250'], + "should have open form view on related record after click on link" + ); +}); + }); }); }); diff --git a/addons/mail/static/src/components/message/message.js b/addons/mail/static/src/components/message/message.js index 7d314647bb2..499c462efe9 100644 --- a/addons/mail/static/src/components/message/message.js +++ b/addons/mail/static/src/components/message/message.js @@ -435,22 +435,15 @@ class Message extends Component { ev.preventDefault(); return; } - if (ev.target.closest('.o_mention')) { - this.env.messaging.openProfile({ - id: Number(ev.target.dataset.oeId), - model: ev.target.dataset.oeModel, - }); - // avoid following dummy href - ev.preventDefault(); - return; - } - if (ev.target.closest('.o_mail_redirect')) { - this.env.messaging.openProfile({ - id: Number(ev.target.dataset.oeId), - model: ev.target.dataset.oeModel, - }); - // avoid following dummy href - ev.preventDefault(); + if (ev.target.tagName === 'A') { + if (ev.target.dataset.oeId && ev.target.dataset.oeModel) { + this.env.messaging.openProfile({ + id: Number(ev.target.dataset.oeId), + model: ev.target.dataset.oeModel, + }); + // avoid following dummy href + ev.preventDefault(); + } return; } this.state.isClicked = !this.state.isClicked; diff --git a/addons/mail/static/src/components/message/message_tests.js b/addons/mail/static/src/components/message/message_tests.js index cc2764389f0..3d7bf1da396 100644 --- a/addons/mail/static/src/components/message/message_tests.js +++ b/addons/mail/static/src/components/message/message_tests.js @@ -783,6 +783,52 @@ QUnit.test('subtype description should not be displayed if it is similar to body ); }); +QUnit.test('data-oe-id & data-oe-model link redirection on click', async function (assert) { + assert.expect(7); + + const bus = new Bus(); + bus.on('do-action', null, payload => { + assert.strictEqual( + payload.action.type, + 'ir.actions.act_window', + "action should open view" + ); + assert.strictEqual( + payload.action.res_model, + 'some.model', + "action should open view on 'some.model' model" + ); + assert.strictEqual( + payload.action.res_id, + 250, + "action should open view on 250" + ); + assert.step('do-action:openFormView_some.model_250'); + }); + await this.start({ env: { bus } }); + const message = this.env.models['mail.message'].create({ + body: `

some.model_250

`, + id: 100, + }); + await this.createMessageComponent(message); + assert.containsOnce( + document.body, + '.o_Message_content', + "message should have content" + ); + assert.containsOnce( + document.querySelector('.o_Message_content'), + 'a', + "message content should have a link" + ); + + document.querySelector(`.o_Message_content a`).click(); + assert.verifySteps( + ['do-action:openFormView_some.model_250'], + "should have open form view on related record after click on link" + ); +}); + }); }); }); diff --git a/addons/mail/static/src/widgets/form_renderer/form_renderer_tests.js b/addons/mail/static/src/widgets/form_renderer/form_renderer_tests.js index 465745feb41..235c95fb19d 100644 --- a/addons/mail/static/src/widgets/form_renderer/form_renderer_tests.js +++ b/addons/mail/static/src/widgets/form_renderer/form_renderer_tests.js @@ -739,9 +739,7 @@ QUnit.test('read more links becomes read less after being clicked', async functi "read more/less link should contain 'read more' as text" ); - await afterNextRender(() => { - document.querySelector('.o_Message_readMoreLess').click(); - }); + document.querySelector('.o_Message_readMoreLess').click(); assert.strictEqual( document.querySelector('.o_Message_readMoreLess').textContent, 'read less',