odoo.define('web.crash_manager', function (require) { var CrashManager = require('web.CrashManager'); return new CrashManager(); }); odoo.define('web.CrashManager', function (require) { "use strict"; var ajax = require('web.ajax'); var core = require('web.core'); var Dialog = require('web.Dialog'); var session = require('web.session'); var QWeb = core.qweb; var _t = core._t; var _lt = core._lt; var map_title ={ user_error: _lt('Warning'), warning: _lt('Warning'), access_error: _lt('Access Error'), missing_error: _lt('Missing Record'), validation_error: _lt('Validation Error'), except_orm: _lt('Global Business Error'), access_denied: _lt('Access Denied'), }; var CrashManager = core.Class.extend({ init: function() { this.active = true; }, enable: function () { this.active = true; }, disable: function () { this.active = false; }, rpc_error: function(error) { var self = this; if (!this.active) { return; } if (this.$indicator){ return; } if (error.code == -32098) { $.blockUI({ message: '' , overlayCSS: {'z-index': 9999, backgroundColor: '#FFFFFF', opacity: 0.0, cursor: 'wait'}}); this.$indicator = $('
' + _t("Trying to reconnect... ") + '
'); this.$indicator.prependTo("body"); var timeinterval = setInterval(function(){ ajax.jsonRpc('/web/webclient/version_info').then(function() { clearInterval(timeinterval); self.$indicator.html(_t("You are back online")); self.$indicator.delay(2000).fadeOut('slow',function(){ $(this).remove(); self.$indicator.remove(); }); $.unblockUI(); }); }, 2000); return; } var handler = core.crash_registry.get(error.data.name, true); if (handler) { new (handler)(this, error).display(); return; } if (error.data.name === "openerp.http.SessionExpiredException" || error.data.name === "werkzeug.exceptions.Forbidden") { this.show_warning({type: "Session Expired", data: { message: _t("Your Odoo session expired. Please refresh the current web page.") }}); return; } if (_.has(map_title, error.data.exception_type)) { if(error.data.exception_type == 'except_orm'){ if(error.data.arguments[1]) { error = _.extend({}, error, { data: _.extend({}, error.data, { message: error.data.arguments[1], title: error.data.arguments[0] !== 'Warning' ? (" - " + error.data.arguments[0]) : '', }) }); } else { error = _.extend({}, error, { data: _.extend({}, error.data, { message: error.data.arguments[0], title: '', }) }); } } else { error = _.extend({}, error, { data: _.extend({}, error.data, { message: error.data.arguments[0], title: map_title[error.data.exception_type] !== 'Warning' ? (" - " + map_title[error.data.exception_type]) : '', }) }); } this.show_warning(error); //InternalError } else { this.show_error(error); } }, show_warning: function(error) { if (!this.active) { return; } new Dialog(this, { size: 'medium', title: "Odoo " + (_.str.capitalize(error.type) || _t("Warning")), subtitle: error.data.title, $content: $('
').html(QWeb.render('CrashManager.warning', {error: error})) }).open(); }, show_error: function(error) { if (!this.active) { return; } new Dialog(this, { title: "Odoo " + _.str.capitalize(error.type), $content: QWeb.render('CrashManager.error', {session: session, error: error}) }).open(); }, show_message: function(exception) { this.show_error({ type: _t("Client Error"), message: exception, data: {debug: ""} }); }, }); /** An interface to implement to handle exceptions. Register implementation in instance.web.crash_manager_registry. */ var ExceptionHandler = { /** @param parent The parent. @param error The error object as returned by the JSON-RPC implementation. */ init: function(parent, error) {}, /** Called to inform to display the widget, if necessary. A typical way would be to implement this interface in a class extending instance.web.Dialog and simply display the dialog in this method. */ display: function() {}, }; /** * Handle redirection warnings, which behave more or less like a regular * warning, with an additional redirection button. */ var RedirectWarningHandler = Dialog.extend(ExceptionHandler, { init: function(parent, error) { this._super(parent); this.error = error; }, display: function() { var self = this; var error = this.error; error.data.message = error.data.arguments[0]; new Dialog(this, { size: 'medium', title: "Odoo " + (_.str.capitalize(error.type) || "Warning"), buttons: [ {text: error.data.arguments[2], classes : "btn-primary", click: function() { window.location.href = '#action='+error.data.arguments[1]; self.destroy(); }}, {text: _t("Cancel"), click: function() { self.destroy(); }, close: true} ], $content: QWeb.render('CrashManager.warning', {error: error}) }).open(); } }); core.crash_registry.add('openerp.exceptions.RedirectWarning', RedirectWarningHandler); return CrashManager; });