-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[12.0] web_notify: improve popup UI (OCA#1231)
* [ADD]: all available bootstrap notifications (success/danger/warning/info/default) * [IMP] use black color for text for default notification. * [FIX] reverted require string for `bus.Longpolling` and rename `on_message_received` to `on_message` to prevent collisions.
- Loading branch information
1 parent
c1b2055
commit 09c5395
Showing
15 changed files
with
310 additions
and
107 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
# pylint: disable=missing-docstring | ||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). | ||
|
||
from . import models |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
# pylint: disable=missing-docstring | ||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). | ||
|
||
from . import res_users |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,46 +1,87 @@ | ||
# pylint: disable=missing-docstring | ||
# Copyright 2016 ACSONE SA/NV | ||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). | ||
|
||
from odoo import api, exceptions, fields, models, _ | ||
from odoo import _, api, exceptions, fields, models | ||
|
||
DEFAULT_MESSAGE = "Default message" | ||
|
||
SUCCESS = "success" | ||
DANGER = "danger" | ||
WARNING = "warning" | ||
INFO = "info" | ||
DEFAULT = "default" | ||
|
||
|
||
class ResUsers(models.Model): | ||
_inherit = 'res.users' | ||
_inherit = "res.users" | ||
|
||
@api.depends('create_date') | ||
@api.depends("create_date") | ||
def _compute_channel_names(self): | ||
for record in self: | ||
res_id = record.id | ||
record.notify_info_channel_name = 'notify_info_%s' % res_id | ||
record.notify_warning_channel_name = 'notify_warning_%s' % res_id | ||
record.notify_success_channel_name = "notify_success_%s" % res_id | ||
record.notify_danger_channel_name = "notify_danger_%s" % res_id | ||
record.notify_warning_channel_name = "notify_warning_%s" % res_id | ||
record.notify_info_channel_name = "notify_info_%s" % res_id | ||
record.notify_default_channel_name = "notify_default_%s" % res_id | ||
|
||
notify_success_channel_name = fields.Char(compute="_compute_channel_names") | ||
notify_danger_channel_name = fields.Char(compute="_compute_channel_names") | ||
notify_warning_channel_name = fields.Char(compute="_compute_channel_names") | ||
notify_info_channel_name = fields.Char(compute="_compute_channel_names") | ||
notify_default_channel_name = fields.Char(compute="_compute_channel_names") | ||
|
||
def notify_success( | ||
self, message="Default message", title=None, sticky=False | ||
): | ||
title = title or _("Success") | ||
self._notify_channel(SUCCESS, message, title, sticky) | ||
|
||
notify_info_channel_name = fields.Char( | ||
compute='_compute_channel_names') | ||
notify_warning_channel_name = fields.Char( | ||
compute='_compute_channel_names') | ||
def notify_danger( | ||
self, message="Default message", title=None, sticky=False | ||
): | ||
title = title or _("Danger") | ||
self._notify_channel(DANGER, message, title, sticky) | ||
|
||
def notify_warning( | ||
self, message="Default message", title=None, sticky=False | ||
): | ||
title = title or _("Warning") | ||
self._notify_channel(WARNING, message, title, sticky) | ||
|
||
def notify_info(self, message="Default message", title=None, sticky=False): | ||
title = title or _('Information') | ||
self._notify_channel( | ||
'notify_info_channel_name', message, title, sticky) | ||
|
||
def notify_warning(self, message="Default message", | ||
title=None, sticky=False): | ||
title = title or _('Warning') | ||
self._notify_channel( | ||
'notify_warning_channel_name', message, title, sticky) | ||
|
||
def _notify_channel(self, channel_name_field, message, title, sticky): | ||
if (not self.env.user._is_admin() | ||
and any(user.id != self.env.uid for user in self)): | ||
title = title or _("Information") | ||
self._notify_channel(INFO, message, title, sticky) | ||
|
||
def notify_default( | ||
self, message="Default message", title=None, sticky=False | ||
): | ||
title = title or _("Default") | ||
self._notify_channel(DEFAULT, message, title, sticky) | ||
|
||
def _notify_channel( | ||
self, | ||
type_message=DEFAULT, | ||
message=DEFAULT_MESSAGE, | ||
title=None, | ||
sticky=False, | ||
): | ||
# pylint: disable=protected-access | ||
if not self.env.user._is_admin() and any( | ||
user.id != self.env.uid for user in self | ||
): | ||
raise exceptions.UserError( | ||
_('Sending a notification to another user is forbidden.') | ||
_("Sending a notification to another user is forbidden.") | ||
) | ||
channel_name_field = "notify_{}_channel_name".format(type_message) | ||
bus_message = { | ||
'message': message, | ||
'title': title, | ||
'sticky': sticky | ||
"type": type_message, | ||
"message": message, | ||
"title": title, | ||
"sticky": sticky, | ||
} | ||
notifications = [(record[channel_name_field], bus_message) | ||
for record in self] | ||
self.env['bus.bus'].sendmany(notifications) | ||
notifications = [ | ||
(record[channel_name_field], bus_message) for record in self | ||
] | ||
self.env["bus.bus"].sendmany(notifications) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,4 @@ | ||
* Laurent Mignon <[email protected]> | ||
* Serpent Consulting Services Pvt. Ltd.<[email protected]> | ||
* Aitor Bouzas <[email protected]> | ||
* Aitor Bouzas <[email protected]> | ||
* Shepilov Vladislav <[email protected]> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,10 @@ | ||
Send instant notification messages to the user in live. | ||
|
||
This technical module allows you to send instant notification messages from the server to the user in live. | ||
This technical module allows you to send instant notification messages from the server to the user in live. | ||
Two kinds of notification are supported. | ||
|
||
* Warning: Displayed in a red flying popup div | ||
* Information: Displayed in a light yellow flying popup div | ||
* Success: Displayed in a `success` theme color flying popup div | ||
* Danger: Displayed in a `danger` theme color flying popup div | ||
* Warning: Displayed in a `warning` theme color flying popup div | ||
* Information: Displayed in a `info` theme color flying popup div | ||
* Default: Displayed in a `default` theme color flying popup div |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
This module is based on the Instant Messaging Bus. To work properly, the server must be launched in gevent mode. | ||
This module is based on the Instant Messaging Bus. To work properly, the server must be launched in gevent mode. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,44 +1,53 @@ | ||
odoo.define('web_notify.WebClient', function (require) { | ||
"use strict"; | ||
"use strict"; | ||
|
||
var WebClient = require('web.WebClient'); | ||
var base_bus = require('bus.Longpolling'); | ||
var session = require('web.session'); | ||
require('bus.BusService'); | ||
var WebClient = require('web.WebClient'); | ||
var base_bus = require('bus.Longpolling'); | ||
var session = require('web.session'); | ||
require('bus.BusService'); | ||
|
||
|
||
WebClient.include({ | ||
show_application: function() { | ||
var res = this._super(); | ||
this.start_polling(); | ||
return res | ||
}, | ||
start_polling: function() { | ||
this.channel_warning = 'notify_warning_' + session.uid; | ||
this.channel_info = 'notify_info_' + session.uid; | ||
this.call('bus_service', 'addChannel', this.channel_warning); | ||
this.call('bus_service', 'addChannel', this.channel_info); | ||
this.call('bus_service', 'on', 'notification', this, this.bus_notification); | ||
this.call('bus_service', 'startPolling'); | ||
}, | ||
bus_notification: function(notifications) { | ||
var self = this; | ||
_.each(notifications, function (notification) { | ||
var channel = notification[0]; | ||
var message = notification[1]; | ||
if (channel === self.channel_warning) { | ||
self.on_message_warning(message); | ||
} else if (channel === self.channel_info) { | ||
self.on_message_info(message); | ||
} | ||
}); | ||
}, | ||
on_message_warning: function(message){ | ||
this.do_warn(message.title, message.message, message.sticky); | ||
}, | ||
on_message_info: function(message){ | ||
this.do_notify(message.title, message.message, message.sticky); | ||
} | ||
}); | ||
WebClient.include({ | ||
show_application: function () { | ||
var res = this._super(); | ||
this.start_polling(); | ||
return res; | ||
}, | ||
start_polling: function () { | ||
this.channel_success = 'notify_success_' + session.uid; | ||
this.channel_danger = 'notify_danger_' + session.uid; | ||
this.channel_warning = 'notify_warning_' + session.uid; | ||
this.channel_info = 'notify_info_' + session.uid; | ||
this.channel_default = 'notify_default_' + session.uid; | ||
this.call('bus_service', 'addChannel', this.channel_success); | ||
this.call('bus_service', 'addChannel', this.channel_danger); | ||
this.call('bus_service', 'addChannel', this.channel_warning); | ||
this.call('bus_service', 'addChannel', this.channel_info); | ||
this.call('bus_service', 'addChannel', this.channel_default); | ||
this.call( | ||
'bus_service', 'on', 'notification', | ||
this, this.bus_notification); | ||
this.call('bus_service', 'startPolling'); | ||
}, | ||
bus_notification: function (notifications) { | ||
var self = this; | ||
_.each(notifications, function (notification) { | ||
// Not used: var channel = notification[0]; | ||
var message = notification[1]; | ||
self.on_message(message); | ||
}); | ||
}, | ||
on_message: function (message) { | ||
return this.call( | ||
'notification', 'notify', { | ||
type: message.type, | ||
title: message.title, | ||
message: message.message, | ||
sticky: message.sticky, | ||
className: message.className, | ||
} | ||
); | ||
}, | ||
}); | ||
|
||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,26 @@ | ||
odoo.define('web_notify.Notification', function (require) { | ||
"use strict"; | ||
|
||
var Notification = require('web.Notification'); | ||
|
||
Notification.include({ | ||
icon_mapping: { | ||
'success': 'fa-thumbs-up', | ||
'danger': 'fa-exclamation-triangle', | ||
'warning': 'fa-exclamation', | ||
'info': 'fa-info', | ||
'default': 'fa-lightbulb-o', | ||
}, | ||
init: function () { | ||
this._super.apply(this, arguments); | ||
// Delete default classes | ||
this.className = this.className.replace(' o_error', ''); | ||
// Add custom icon and custom class | ||
this.icon = (this.type in this.icon_mapping) ? | ||
this.icon_mapping[this.type] : | ||
this.icon_mapping['default']; | ||
this.className += ' o_' + this.type; | ||
}, | ||
}); | ||
|
||
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
.o_notification_manager { | ||
.o_notification { | ||
&.o_success { | ||
color: white; | ||
background-color: theme-color('success'); | ||
} | ||
&.o_danger { | ||
color: white; | ||
background-color: theme-color('danger'); | ||
} | ||
&.o_warning { | ||
color: white; | ||
background-color: theme-color('warning'); | ||
} | ||
&.o_info { | ||
color: white; | ||
background-color: theme-color('info'); | ||
} | ||
&.o_default { | ||
color: black; | ||
background-color: theme-color('default'); | ||
} | ||
} | ||
} |
Oops, something went wrong.