OWL
overlay
Session Expired Dialog
Odoo 19 OWL component — Session Expired Dialog (core)
Live preview
Interactive
Source excerpt
web/static/src/core/errors/error_dialogs.js
import { browser } from "../browser/browser";
import { Dialog } from "../dialog/dialog";
import { _t } from "@web/core/l10n/translation";
import { registry } from "../registry";
import { Tooltip } from "@web/core/tooltip/tooltip";
import { usePopover } from "@web/core/popover/popover_hook";
import { useService } from "@web/core/utils/hooks";
import { capitalize } from "../utils/strings";
import { Component, useRef, useState, markup } from "@odoo/owl";
const { DateTime } = luxon;
// This props are added by the error handler
export const standardErrorDialogProps = {
traceback: { type: [String, { value: null }], optional: true },
message: { type: String, optional: true },
name: { type: String, optional: true },
exceptionName: { type: [String, { value: null }], optional: true },
data: { type: [Object, { value: null }], optional: true },
subType: { type: [String, { value: null }], optional: true },
code: { type: [Number, String, { value: null }], optional: true },
type: { type: [String, { value: null }], optional: true },
serverHost: { type: [String, { value: null }], optional: true },
id: { type: [Number, { value: null }], optional: true },
model: { type: [String, { value: null }], optional: true },
close: Function, // prop added by the Dialog service
};
export const odooExceptionTitleMap = new Map(
Object.entries({
"odoo.addons.base.models.ir_mail_server.MailDeliveryException": _t("MailDeliveryException"),
"odoo.exceptions.AccessDenied": _t("Access Denied"),
"odoo.exceptions.MissingError": _t("Missing Record"),
"odoo.addons.web.controllers.action.MissingActionError": _t("Missing Action"),
"odoo.addons.base.models.ir_actions.ServerActionWithWarningsError": _t("Invalid Operation"),
"odoo.exceptions.UserError": _t("Invalid Operation"),
"odoo.exceptions.ValidationError": _t("Validation Error"),
"odoo.exceptions.AccessError": _t("Access Error"),
"odoo.exceptions.Warning": _t("Warning"),
})
);
// -----------------------------------------------------------------------------
// Generic Error Dialog
// -----------------------------------------------------------------------------
export class ErrorDialog extends Component {
static template = "web.ErrorDialog";
static components = { Dialog };
static title = _t("Odoo Error");
static showTracebackButtonText = _t("See technical details");
static hideTracebackButtonText = _t("Hide technical details");
static props = { ...standardErrorDialogProps };
setup() {
this.state = useState({
showTraceback: false,
});
this.copyButtonRef = useRef("copyButton");
this.popover = usePopover(Tooltip);
this.contextDetails = "Occured ";
if (this.props.serverHost) {
this.contextDetails += `on ${this.props.serverHost} `;
}
if (this.props.model) {
this.contextDetails += `on model ${this.props.model} `;
}
this.contextDetails += `on ${DateTime.now()
.setZone("UTC")
.toFormat("yyyy-MM-dd HH:mm:ss")} GMT`;
}
showTooltip() {
this.popover.open(this.copyButtonRef.el, { tooltip: _t("Copied") });
browser.setTimeout(this.popover.close, 800);
}
onClickClipboard() {
browser.navigator.clipboard.writeText(
`${this.props.name}\n\n${this.props.message}\n\n${this.contextDetails}\n\n${this.props.traceback}`
);
this.showTooltip();
}
}
// -----------------------------------------------------------------------------
// Client Error Dialog
// -----------------------------------------------------------------------------
export class ClientErrorDialog extends ErrorDialog {}
ClientErrorDialog.title = _t("Odoo Client Error");
// -----------------------------------------------------------------------------
// Network Error Dialog
// -----------------------------------------------------------------------------
export class NetworkErrorDialog extends ErrorDialog {}
NetworkErrorDialog.title = _t("Odoo Network Error");
// -----------------------------------------------------------------------------
// Request Entity Too Large Dialog
// -----------------------------------------------------------------------------
export class RequestEntityTooLargeErrorDialog extends ErrorDialog {}
RequestEntityTooLargeErrorDialog.title = _t("The request sent to the server was too large");
// -----------------------------------------------------------------------------
// RPC Error Dialog
// -----------------------------------------------------------------------------
export class RPCErrorDialog extends ErrorDialog {
setup() {
super.setup();
this.inferTitle();
this.traceback = this.props.traceback;
if (this.props.data && this.props.data.debug) {
this.traceback = `${this.props.data.debug}\nThe above server error caused the following client error:\n${this.traceback}`;
}
}
inferTitle() {
// If the server provides an exception name that we have in a registry.
if (this.props.exceptionName && odooExceptionTitleMap.has(this.props.exceptionName)) {
this.title = odooExceptionTitleMap.get(this.props.exceptionName).toString();
return;
Registry / API
- Registry name
SessionExpiredDialog- Category
—- Module
web- Slug
session-expired-dialog- Nav group
overlay