services
feedback
notification
Odoo 19 services — notification (core)
Live preview
Interactive
Source excerpt
web/static/src/core/notifications/notification_service.js
import { registry } from "../registry";
import { NotificationContainer } from "./notification_container";
import { reactive } from "@odoo/owl";
/**
* @typedef {Object} NotificationButton
* @property {string} name
* @property {string} [icon]
* @property {boolean} [primary=false]
* @property {function(): void} onClick
*
* @typedef {Object} NotificationOptions
* @property {string} [title]
* @property {number} [autocloseDelay=4000]
* @property {"warning" | "danger" | "success" | "info"} [type]
* @property {boolean} [sticky=false]
* @property {string} [className]
* @property {function(): void} [onClose]
* @property {NotificationButton[]} [buttons]
*/
export const notificationService = {
notificationContainer: NotificationContainer,
start() {
let notifId = 0;
const notifications = reactive({});
registry.category("main_components").add(
this.notificationContainer.name,
{
Component: this.notificationContainer,
props: { notifications },
},
{ sequence: 100 }
);
/**
* @param {string} message
* @param {NotificationOptions} [options]
*/
function add(message, options = {}) {
const id = ++notifId;
const closeFn = () => close(id);
const props = Object.assign({}, options, { message, close: closeFn });
delete props.onClose;
const notification = {
id,
props,
onClose: options.onClose,
};
notifications[id] = notification;
return closeFn;
}
function close(id) {
if (notifications[id]) {
const notification = notifications[id];
if (notification.onClose) {
notification.onClose();
}
delete notifications[id];
}
}
return { add };
},
};
registry.category("services").add("notification", notificationService);
Registry / API
- Registry name
notification- Category
services- Module
web- Slug
notification- Nav group
feedback