[FIX] web: not possible to show a notification via client action

Before this commit, it was not possible to show a message using a client
action. (e.g. show a success message only with core in Python)

Now, it's possible using a client action. This client action call
displayNotification and so we can use the same options also.

A test is added to be sure that this action do not change the current action

Note: in the future a custom registry may be created in a refactoring
to specific function action registry.

X-original-commit: 8775fd670b6b3ec19a77fc0eab72d2223baa36c8
This commit is contained in:
Romeo Fragomeli
2019-10-14 12:11:23 +00:00
committed by fw-bot
parent 3e5cc15d16
commit 547d2d87fc
3 changed files with 89 additions and 0 deletions
+11
View File
@@ -176,6 +176,17 @@ function logout() {
}
core.action_registry.add("logout", logout);
/**
* @param {ActionManager} parent
* @param {Object} action
* @param {Object} action.params notification params
* @see ServiceMixin.displayNotification
*/
function displayNotification(parent, action) {
parent.displayNotification(action.params);
}
core.action_registry.add("display_notification", displayNotification);
/**
* Client action to refresh the session context (making sure
* HTTP requests will have the right one) then reload the
@@ -2,6 +2,7 @@ odoo.define('web.action_manager_tests', function (require) {
"use strict";
var ReportClientAction = require('report.client_action');
var Notification = require('web.Notification');
var NotificationService = require('web.NotificationService');
var AbstractAction = require('web.AbstractAction');
var AbstractStorageService = require('web.AbstractStorageService');
@@ -1898,6 +1899,64 @@ QUnit.module('ActionManager', {
delete core.action_registry.map.HelloWorldTest;
});
QUnit.test('test display_notification client action', async function (assert) {
assert.expect(6);
testUtils.mock.patch(Notification, {
_animation: false,
});
const actionManager = await createActionManager({
actions: this.actions,
archs: this.archs,
data: this.data,
services: {
notification: NotificationService,
},
});
await actionManager.doAction(1);
assert.containsOnce(actionManager, '.o_kanban_view');
await actionManager.doAction({
type: 'ir.actions.client',
tag: 'display_notification',
params: {
title: 'title',
message: 'message',
sticky: true,
}
});
const notificationSelector = '.o_notification_manager .o_notification';
assert.containsOnce(document.body, notificationSelector,
'a notification should be present');
const notificationElement = document.body.querySelector(notificationSelector);
assert.strictEqual(
notificationElement.querySelector('.o_notification_title').textContent,
'title',
"the notification should have the correct title"
);
assert.strictEqual(
notificationElement.querySelector('.o_notification_content').textContent,
'message',
"the notification should have the correct message"
);
assert.containsOnce(actionManager, '.o_kanban_view');
await testUtils.dom.click(
notificationElement.querySelector('.o_notification_close')
);
assert.containsNone(document.body, notificationSelector,
"the notification should be destroy ");
actionManager.destroy();
testUtils.mock.unpatch(Notification);
});
QUnit.module('Server actions');
QUnit.test('can execute server actions from db ID', async function (assert) {
+19
View File
@@ -1213,6 +1213,10 @@ The notification system in Odoo is designed with the following components:
destroy notifications whenever a request is done (with a custom_event). Note
that the web client is a service provider.
- a client action *display_notification*: this allows to trigger the display
of a notification from python (e.g. in the method called when the user
clicked on a button of type object).
- two helper functions in *ServiceMixin*: *do_notify* and *do_warn*
@@ -1260,6 +1264,21 @@ Here are two examples on how to use these methods:
this.do_warn(_t("Error"), _t("Filter name is required."));
Here an example in python:
.. code-block:: python
# note that we call _(string) on the text to make sure it is properly translated.
def show_notification(self):
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': _('Success'),
'message': _('Your signature request has been sent.'),
'sticky': False,
}
}
Systray
=======