summaryrefslogtreecommitdiff
path: root/addons/mail
diff options
context:
space:
mode:
authorAlexandre Kühn <aku@odoo.com>2020-08-31 14:15:58 +0000
committerAlexandre Kühn <aku@odoo.com>2020-09-01 11:00:57 +0000
commitb020e45832a967213c4ea4ae28b3a3d4d0c4e7f3 (patch)
treeaafbe238b4ca85a0d685b2db2e9f9b0643b9faa7 /addons/mail
parent57665a02f7b4cd113f8f40ec47c58a518fe8669c (diff)
[FIX] mail: message/activity link with dataset oe-id and oe-model
Task-2328718 closes odoo/odoo#56864 X-original-commit: 430aa0c2ffe242992fb935733d81f6e05a6d2458 Signed-off-by: Sébastien Theys (seb) <seb@odoo.com> Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
Diffstat (limited to 'addons/mail')
-rw-r--r--addons/mail/static/src/components/activity/activity.js19
-rw-r--r--addons/mail/static/src/components/activity/activity.xml2
-rw-r--r--addons/mail/static/src/components/activity/activity_tests.js48
-rw-r--r--addons/mail/static/src/components/message/message.js25
-rw-r--r--addons/mail/static/src/components/message/message_tests.js46
-rw-r--r--addons/mail/static/src/widgets/form_renderer/form_renderer_tests.js4
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
@@ -134,6 +134,25 @@ class Activity extends Component {
* @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
+ */
_onClickCancel(ev) {
ev.preventDefault();
this.activity.deleteServerRecord();
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 @@
<templates xml:space="preserve">
<t t-name="mail.Activity" owl="1">
- <div class="o_Activity">
+ <div class="o_Activity" t-on-click="_onClick">
<t t-if="activity">
<div class="o_Activity_sidebar">
<div class="o_Activity_user">
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: `<p><a href="#" data-oe-id="250" data-oe-model="some.model">some.model_250</a></p>`,
+ });
+ 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: `<p><a href="#" data-oe-id="250" data-oe-model="some.model">some.model_250</a></p>`,
+ 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',