/*--------------------------------------------------------- * OpenERP base library *---------------------------------------------------------*/ openerp.base.chrome = function(openerp) { openerp.base.callback = function(obj, method) { var callback = function() { var args = Array.prototype.slice.call(arguments); var r; for(var i = 0; i < callback.callback_chain.length; i++) { var c = callback.callback_chain[i]; if(c.unique) { callback.callback_chain.splice(i, 1); i -= 1; } r = c.callback.apply(c.self, c.args.concat(args)); // TODO special value to stop the chain // openerp.base.callback_stop } return r; }; callback.callback_chain = []; callback.add = function(f) { if(typeof(f) == 'function') { f = { callback: f, args: Array.prototype.slice.call(arguments, 1) }; } f.self = f.self || null; f.args = f.args || []; f.unique = !!f.unique; if(f.position == 'last') { callback.callback_chain.push(f); } else { callback.callback_chain.unshift(f); } return callback; }; callback.add_first = function(f) { return callback.add.apply(null,arguments); }; callback.add_last = function(f) { return callback.add({ callback: f, args: Array.prototype.slice.call(arguments, 1), position: "last" }); }; return callback.add({ callback: method, self:obj, args:Array.prototype.slice.call(arguments, 2) }); }; /** * Base error for lookup failure * * @class */ openerp.base.NotFound = Class.extend( /** @lends openerp.base.NotFound# */ { }); openerp.base.KeyNotFound = openerp.base.NotFound.extend( /** @lends openerp.base.KeyNotFound# */ { /** * Thrown when a key could not be found in a mapping * * @constructs * @extends openerp.base.NotFound * @param {String} key the key which could not be found */ init: function (key) { this.key = key; }, toString: function () { return "The key " + this.key + " was not found"; } }); openerp.base.ObjectNotFound = openerp.base.NotFound.extend( /** @lends openerp.base.ObjectNotFound# */ { /** * Thrown when an object path does not designate a valid class or object * in the openerp hierarchy. * * @constructs * @extends openerp.base.NotFound * @param {String} path the invalid object path */ init: function (path) { this.path = path; }, toString: function () { return "Could not find any object of path " + this.path; } }); openerp.base.Registry = Class.extend( /** @lends openerp.base.Registry# */ { /** * Stores a mapping of arbitrary key (strings) to object paths (as strings * as well). * * Resolves those paths at query time in order to always fetch the correct * object, even if those objects have been overloaded/replaced after the * registry was created. * * An object path is simply a dotted name from the openerp root to the * object pointed to (e.g. ``"openerp.base.Session"`` for an OpenERP * session object). * * @constructs * @param {Object} mapping a mapping of keys to object-paths */ init: function (mapping) { this.map = mapping || {}; }, /** * Retrieves the object matching the provided key string. * * @param {String} key the key to fetch the object for * @returns {Class} the stored class, to initialize * * @throws {openerp.base.KeyNotFound} if the object was not in the mapping * @throws {openerp.base.ObjectNotFound} if the object path was invalid */ get_object: function (key) { var path_string = this.map[key]; if (path_string === undefined) { throw new openerp.base.KeyNotFound(key); } var object_match = openerp; var path = path_string.split('.'); // ignore first section for(var i=1; i').text(v).appendTo($('body')); } if(notify && this.notification) { this.notification.notify("Logging:",v); } } } } }); /** * Generates an inherited class that replaces all the methods by null methods (methods * that does nothing and always return undefined). * * @param {Class} claz * @param {dict} add Additional functions to override. * @return {Class} */ openerp.base.generate_null_object_class = function(claz, add) { var newer = {}; var copy_proto = function(prototype) { for (var name in prototype) { if(typeof prototype[name] == "function") { newer[name] = function() {}; } } if (prototype.prototype) copy_proto(prototype.prototype); }; copy_proto(claz.prototype); newer.init = openerp.base.BasicController.prototype.init; var tmpclass = claz.extend(newer); return tmpclass.extend(add || {}); }; openerp.base.Notification = openerp.base.BasicController.extend({ init: function(element_id) { this._super(element_id); this.$element.notify({ speed: 500, expires: 1500 }); }, notify: function(title, text) { this.$element.notify('create', { title: title, text: text }); }, warn: function(title, text) { this.$element.notify('create', 'oe_notification_alert', { title: title, text: text }); } }); openerp.base.Session = openerp.base.BasicController.extend( /** @lends openerp.base.Session# */{ /** * @constructs * @extends openerp.base.BasicController * @param element_id to use for exception reporting * @param server * @param port */ init: function(element_id, server, port) { this._super(element_id); this.server = (server == undefined) ? location.hostname : server; this.port = (port == undefined) ? location.port : port; this.rpc_mode = (server == location.hostname) ? "ajax" : "jsonp"; this.debug = true; this.db = ""; this.login = ""; this.password = ""; this.uid = false; this.session_id = false; this.module_list = []; this.module_loaded = {"base": true}; this.context = {}; }, start: function() { this.session_restore(); }, /** * Executes an RPC call, registering the provided callbacks. * * Registers a default error callback if none is provided, and handles * setting the correct session id and session context in the parameter * objects * * @param {String} url RPC endpoint * @param {Object} params call parameters * @param {Function} success_callback function to execute on RPC call success * @param {Function} error_callback function to execute on RPC call failure * @returns {jQuery.Deferred} jquery-provided ajax deferred */ rpc: function(url, params, success_callback, error_callback) { var self = this; // Construct a JSON-RPC2 request, method is currently unused params.session_id = this.session_id; // Call using the rpc_mode var deferred = $.Deferred(); this.rpc_ajax(url, { jsonrpc: "2.0", method: "call", params: params, id:null }).then(function () {deferred.resolve.apply(deferred, arguments);}, function(error) {deferred.reject(error, $.Event());}); return deferred.fail(function() { deferred.fail(function(error, event) { if (!event.isDefaultPrevented()) { self.on_rpc_error(error, event); } }); }).then(success_callback, error_callback).promise(); }, /** * Raw JSON-RPC call * * @returns {jQuery.Deferred} ajax-based deferred object */ rpc_ajax: function(url, payload) { var self = this; this.on_rpc_request(); // url can be an $.ajax option object if (_.isString(url)) { url = { url: url } } var ajax = _.extend({ type: "POST", url: url, dataType: 'json', contentType: 'application/json', data: JSON.stringify(payload), processData: false }, url); var deferred = $.Deferred(); $.ajax(ajax).done(function(response, textStatus, jqXHR) { self.on_rpc_response(); if (response.error) { if (response.error.data.type == "session_invalid") { self.uid = false; self.on_session_invalid(function() { self.rpc(url, payload.params, function() {deferred.resolve.apply(deferred, arguments);}, function(error, event) {event.preventDefault(); deferred.reject.apply(deferred, arguments);}); }); } else { deferred.reject(response.error); } } else { deferred.resolve(response["result"], textStatus, jqXHR); } }).fail(function(jqXHR, textStatus, errorThrown) { self.on_rpc_response(); var error = { code: -32098, message: "XmlHttpRequestError " + errorThrown, data: {type: "xhr"+textStatus, debug: jqXHR.responseText, objects: [jqXHR, errorThrown] } }; deferred.reject(error); }); return deferred.promise(); }, on_rpc_request: function() { }, on_rpc_response: function() { }, on_rpc_error: function(error) { }, /** * The session is validated either by login or by restoration of a previous session */ on_session_valid: function() { if(!openerp._modules_loaded) this.load_modules(); }, on_session_invalid: function(contination) { }, session_is_valid: function() { return this.uid; }, session_login: function(db, login, password, success_callback) { var self = this; this.db = db; this.login = login; this.password = password; var params = { db: this.db, login: this.login, password: this.password }; this.rpc("/base/session/login", params, function(result) { self.session_id = result.session_id; self.uid = result.uid; self.session_save(); self.on_session_valid(); if (success_callback) success_callback(); }); }, session_logout: function() { this.uid = false; }, /** * Reloads uid and session_id from local storage, if they exist */ session_restore: function () { this.uid = this.get_cookie('uid'); this.session_id = this.get_cookie('session_id'); // we should do an rpc to confirm that this session_id is valid and if it is retrieve the information about db and login // then call on_session_valid this.on_session_valid(); }, /** * Saves the session id and uid locally */ session_save: function () { this.set_cookie('uid', this.uid); this.set_cookie('session_id', this.session_id); }, logout: function() { this.uid = this.get_cookie('uid'); this.session_id = this.get_cookie('session_id'); this.set_cookie('uid', ''); this.set_cookie('session_id', ''); this.on_session_invalid(function() {}); }, /** * Fetches a cookie stored by an openerp session * * @private * @param name the cookie's name */ get_cookie: function (name) { var nameEQ = this.element_id + '|' + name + '='; var cookies = document.cookie.split(';'); for(var i=0; i', { 'href': file, 'rel': 'stylesheet', 'type': 'text/css' })); }); }, do_load_modules_debug: function(result) { $LAB.setOptions({AlwaysPreserveOrder: true}) .script(result.files) .wait(this.on_modules_loaded); }, do_load_modules_prod: function() { // load merged ones // /base/session/css?mod=mod1,mod2,mod3 // /base/session/js?mod=mod1,mod2,mod3 // use $.getScript(‘your_3rd_party-script.js’); ? i want to keep lineno ! }, on_modules_loaded: function() { for(var j=0; j options.max_width) options.width = options.max_width; if (options.width < options.min_width) options.width = options.min_width; } if (options.height !== 'auto') { if (options.height > options.max_height) options.height = options.max_height; if (options.height < options.min_height) options.height = options.min_height; } if (!options.title && this.dialog_title) { options.title = this.dialog_title; } _.extend(this.options, options); }, get_width: function(val) { return this.get_size(val.toString(), $(window.top).width()); }, get_height: function(val) { return this.get_size(val.toString(), $(window.top).height()); }, get_size: function(val, available_size) { if (val === 'auto') { return val; } else if (val.slice(-1) == "%") { return Math.round(available_size / 100 * parseInt(val.slice(0, -1), 10)); } else { return parseInt(val, 10); } }, start: function (auto_open) { this.$dialog = $('
').dialog(this.options); if (auto_open !== false) { this.open(); } this._super(); }, open: function(options) { // TODO fme: bind window on resize if (this.template) { this.$element.html(this.render()); } this.set_options(options); this.$dialog.dialog(this.options).dialog('open'); }, close: function(options) { this.$dialog.dialog('close'); }, stop: function () { this.close(); this.$dialog.dialog('destroy'); } }); openerp.base.CrashManager = openerp.base.Dialog.extend({ identifier_prefix: 'dialog_crash', init: function(session) { this._super(session); this.session.on_rpc_error.add(this.on_rpc_error); }, on_button_Ok: function() { this.close(); }, on_rpc_error: function(error) { this.error = error; if (error.data.fault_code) { var split = error.data.fault_code.split('\n')[0].split(' -- '); if (split.length > 1) { error.type = split.shift(); error.data.fault_code = error.data.fault_code.substr(error.type.length + 4); } } if (error.code === 200 && error.type) { this.dialog_title = "OpenERP " + _.capitalize(error.type); this.template = 'DialogWarning'; this.open({ width: 'auto', height: 'auto' }); } else { this.dialog_title = "OpenERP Error"; this.template = 'DialogTraceback'; this.open({ width: 'auto', height: 'auto' }); } } }); openerp.base.Loading = openerp.base.Controller.extend({ controller_manifest: { register: ["Loading"] }, init: function(session, element_id) { this._super(session, element_id); this.count = 0; this.session.on_rpc_request.add_first(this.on_rpc_event, 1); this.session.on_rpc_response.add_last(this.on_rpc_event, -1); }, on_rpc_event : function(increment) { this.count += increment; if (this.count) { //this.$element.html(QWeb.render("Loading", {})); this.$element.html("Loading ("+this.count+")"); this.$element.show(); } else { this.$element.fadeOut(); } } }); openerp.base.Database = openerp.base.Controller.extend({ init: function(session, element_id, option_id) { this._super(session, element_id); this.option_id = option_id; this.$option_id = $('#' + option_id); this.$option_id.html(''); }, start: function() { this.$element.html(QWeb.render("Database", this)); this.$element.closest(".openerp").removeClass("login-mode"); this.$element.closest(".openerp").addClass("database_block"); var self = this; this.rpc("/base/database/get_databases_list", {}, function(result) { self.db_list = result.db_list; }); this.rpc("/base/session/get_lang_list", {}, function(result) { self.lang_list = result.lang_list; self.do_db_create(); }); this.$element.find('#db-create').click(this.do_db_create); this.$element.find('#db-drop').click(this.do_db_drop); this.$element.find('#db-backup').click(this.do_db_backup); this.$element.find('#db-restore').click(this.do_db_restore); this.$element.find('#db-change-password').click(this.do_change_password); this.$element.find('#back-to-login').click(function() { self.header = new openerp.base.Header(self.session, "oe_header"); self.header.on_logout(); }); }, do_db_create: function() { var self = this; self.db_string = "CREATE DATABASE"; self.$option_id.html(QWeb.render("CreateDB", self)); $("form[name=create_db_form]").validate(); $("input[name=create_confirm_pwd]").rules("add", { equalTo: 'input[name=create_admin_pwd]', messages: { required: "Password did not match !" } }); $("input[name=super_admin_pwd]").focus(); self.$option_id.find('form[name=create_db_form]').submit(function(ev) { ev.preventDefault(); var super_admin_pwd = self.$option_id.find("input[name=super_admin_pwd]").val(); var db = self.$option_id.find("input[name=db_name]").val(); var demo_data = self.$option_id.find("input[name=demo_data]:checked"); var db_lang = self.$option_id.find("select[name=db_lang]").val(); var admin_pwd = self.$option_id.find("input[name=create_admin_pwd]").val(); var confirm_pwd = self.$option_id.find("input[name=create_confirm_pwd]").val(); if (demo_data.length) demo_data = 'True'; else demo_data = 'False'; self.rpc("/base/database/db_operation", { 'flag': 'create', 'super_admin_pwd': super_admin_pwd, 'db': db, 'demo_data': demo_data, 'db_lang': db_lang, 'admin_pwd': admin_pwd, 'confirm_pwd': confirm_pwd }, function(result) { if (result && !result.error) { } else if(result.error) { var db_error_dialog = _.uniqueId("db_error_dialog"); $('
', {id: db_error_dialog}).dialog({ modal: true, title: result.title, buttons: { Ok: function() { $(this).dialog("close"); } } }).html("
" + result.error + "
"); } }); }); }, do_db_drop: function() { var self = this; self.db_string = "DROP DATABASE"; self.$option_id.html(QWeb.render("DropDB", self)); $("form[name=drop_db_form]").validate(); self.$option_id.find('form[name=drop_db_form]').submit(function(ev) { ev.preventDefault(); var db = self.$option_id.find("select[name=drop_db]").val(); var password = self.$option_id.find("input[name=drop_pwd]").val(); if (confirm("Do you really want to delete the database: " + db + " ?")) { self.rpc("/base/database/db_operation", {'flag': 'drop', 'db': db, 'password': password}, function(result) { if (result && ! result.error) { self.$option_id.find("select[name=drop_db] :selected").remove(); self.notification.notify("Dropping database", "The database '" + db + "' has been dropped"); } else if(result.error) { var db_error_dialog = _.uniqueId("db_error_dialog"); $('
', {id: db_error_dialog}).dialog({ modal: true, title: result.title, buttons: { Ok: function() { $(this).dialog("close"); } } }).html("
" + result.error + "
"); } }); } }); }, do_db_backup: function() { var self = this; self.db_string = "BACKUP DATABASE"; self.$option_id.html(QWeb.render("BackupDB", self)); $("form[name=backup_db_form]").validate(); self.$option_id.find('form[name=backup_db_form]').submit(function(ev) { ev.preventDefault(); var db = self.$option_id.find("select[name=backup_db]").val(); var password = self.$option_id.find("input[name=backup_pwd]").val(); self.rpc("/base/database/db_operation", {'flag': 'backup', 'db': db, 'password': password}, function(result) { if (result && !result.error) { self.notification.notify("Backup Database", "Backup has been created for the database: '" + db + "'"); } else if(result.error) { var db_error_dialog = _.uniqueId("db_error_dialog"); $('
', {id: db_error_dialog}).dialog({ modal: true, title: result.title, buttons: { Ok: function() { $(this).dialog("close"); } } }).html("
" + result.error + "
"); } }); }); }, do_db_restore: function() { var self = this; self.db_string = "RESTORE DATABASE"; self.$option_id.html(QWeb.render("RestoreDB", self)); $("form[name=restore_db_form]").validate(); self.$option_id.find('form[name=restore_db_form]').submit(function(ev) { ev.preventDefault(); var db = self.$option_id.find("input[name=restore_db]").val(); var password = self.$option_id.find("input[name=restore_pwd]").val(); var new_db = self.$option_id.find("input[name=new_db]").val(); self.rpc("/base/database/db_operation", {'flag': 'restore', 'db': db, 'password': password, 'new_db': new_db}, function(result) { if (result && !result.error) { self.notification.notify("Restore Database", "You restored your database as: '" + new_db + "'"); } else if(result.error) { var db_error_dialog = _.uniqueId("db_error_dialog"); $('
', {id: db_error_dialog}).dialog({ modal: true, title: result.title, buttons: { Ok: function() { $(this).dialog("close"); } } }).html("
" + result.error + "
"); } }); }); }, do_change_password: function() { var self = this; self.db_string = "CHANGE DATABASE PASSWORD"; self.$option_id.html(QWeb.render("Change_DB_Pwd", self)); $("form[name=change_pwd_form]").validate(); $("input[name=old_pwd]").rules("add", { minlength: 1, messages: { required: "Please enter password !" } }); $("input[name=new_pwd]").rules("add", { minlength: 1, messages: { required: "Please enter password !" } }); $("input[name=confirm_pwd]").rules("add", { equalTo: 'input[name=new_pwd]', messages: { required: "Password did not match !" } }); $("input[name=old_pwd]").focus(); self.$option_id.find('form[name=change_pwd_form]').submit(function(ev) { ev.preventDefault(); var old_pwd = self.$option_id.find("input[name=old_pwd]").val(); var new_pwd = self.$option_id.find("input[name=new_pwd]").val(); var confirm_pwd = self.$option_id.find("input[name=confirm_pwd]").val(); self.rpc("/base/database/db_operation", {'flag': 'change_password', 'old_password': old_pwd, 'new_password': new_pwd, 'confirm_password': confirm_pwd}, function(result) { if (result && !result.error) { self.notification.notify("Changed Password", "Password has been changed successfully"); } else if(result.error) { var db_error_dialog = _.uniqueId("db_error_dialog"); $('
', {id: db_error_dialog}).dialog({ modal: true, title: result.title, buttons: { Ok: function() { $(this).dialog("close"); } } }).html("
" + result.error + "
"); } }); }); } }); openerp.base.Login = openerp.base.Controller.extend({ remember_creditentials: true, init: function(session, element_id) { this._super(session, element_id); this.has_local_storage = typeof(localStorage) != 'undefined'; this.selected_db = null; this.selected_login = null; if (this.has_local_storage && this.remember_creditentials) { this.selected_db = localStorage.getItem('last_db_login_success'); this.selected_login = localStorage.getItem('last_login_login_success'); } if (jQuery.deparam(jQuery.param.querystring()).debug != undefined) { this.selected_db = this.selected_db || "trunk"; this.selected_login = this.selected_login || "admin"; this.selected_password = this.selected_password || "a"; } }, start: function() { var self = this; this.rpc("/base/database/get_databases_list", {}, function(result) { self.db_list = result.db_list; self.display(); }, function() { self.display(); }); }, display: function() { var self = this; this.$element.html(QWeb.render("Login", this)); this.$element.closest(".openerp").removeClass("database_block"); this.$element.closest(".openerp").addClass("login-mode"); this.$element.find('#oe-db-config').click(function() { self.database = new openerp.base.Database(self.session, "oe_database", "oe_db_options"); self.database.start(); }); this.$element.find("form").submit(this.on_submit); }, on_login_invalid: function() { this.$element.closest(".openerp").addClass("login-mode"); }, on_login_valid: function() { this.$element.closest(".openerp").removeClass("login-mode"); }, on_submit: function(ev) { ev.preventDefault(); var self = this; var $e = this.$element; var db = $e.find("form [name=db]").val(); var login = $e.find("form input[name=login]").val(); var password = $e.find("form input[name=password]").val(); //$e.hide(); // Should hide then call callback this.session.session_login(db, login, password, function() { if(self.session.session_is_valid()) { if (self.has_local_storage) { if(self.remember_creditentials) { localStorage.setItem('last_db_login_success', db); localStorage.setItem('last_login_login_success', login); } else { localStorage.setItem('last_db_login_success', ''); localStorage.setItem('last_login_login_success', ''); } } self.on_login_valid(); } else { self.$element.addClass("login_invalid"); self.on_login_invalid(); } }); }, do_ask_login: function(continuation) { this.on_login_invalid(); this.$element .removeClass("login_invalid"); this.on_login_valid.add({ position: "last", unique: true, callback: continuation }); }, on_logout: function() { this.session.logout(); } }); openerp.base.Header = openerp.base.Controller.extend({ init: function(session, element_id) { this._super(session, element_id); }, start: function() { this.do_update(); }, do_update: function() { this.$element.html(QWeb.render("Header", this)); this.$element.find(".logout").click(this.on_logout); }, on_logout: function() { this.login = new openerp.base.Login(this.session, "oe_login"); this.login.start(); } }); openerp.base.Menu = openerp.base.Controller.extend({ init: function(session, element_id, secondary_menu_id) { this._super(session, element_id); this.secondary_menu_id = secondary_menu_id; this.$secondary_menu = $("#" + secondary_menu_id); this.menu = false; }, start: function() { this.rpc("/base/menu/load", {}, this.on_loaded); }, on_loaded: function(data) { this.data = data; this.$element.html(QWeb.render("Menu", this.data)); for (var i = 0; i < this.data.data.children.length; i++) { var v = { menu : this.data.data.children[i] }; this.$secondary_menu.append(QWeb.render("Menu.secondary", v)); } this.$secondary_menu.find("div.menu_accordion").accordion({ animated : false, autoHeight : false, icons : false }); this.$secondary_menu.find("div.submenu_accordion").accordion({ animated : false, autoHeight : false, active: false, collapsible: true, header: 'h4' }); this.$element.add(this.$secondary_menu).find("a").click(this.on_menu_click); }, on_menu_click: function(ev, id) { id = id || 0; var $menu, $parent, $secondary; if (id) { // We can manually activate a menu with it's id (for hash url mapping) $menu = this.$element.find('a[data-menu=' + id + ']'); if (!$menu.length) { $menu = this.$secondary_menu.find('a[data-menu=' + id + ']'); } } else { $menu = $(ev.currentTarget); id = $menu.data('menu'); } if (this.$secondary_menu.has($menu).length) { $secondary = $menu.parents('.menu_accordion'); $parent = this.$element.find('a[data-menu=' + $secondary.data('menu-parent') + ']'); } else { $parent = $menu; $secondary = this.$secondary_menu.find('.menu_accordion[data-menu-parent=' + $menu.attr('data-menu') + ']'); } this.$secondary_menu.find('.menu_accordion').hide(); // TODO: ui-accordion : collapse submenus and expand the good one $secondary.show(); if (id) { this.rpc('/base/menu/action', {'menu_id': id}, this.on_menu_action_loaded); } $('.active', this.$element.add(this.$secondary_menu)).removeClass('active'); $parent.addClass('active'); $menu.addClass('active'); $menu.parent('h4').addClass('active'); return !$menu.is(".leaf"); }, on_menu_action_loaded: function(data) { var self = this; if (data.action.length) { var action = data.action[0][2]; self.on_action(action); } }, on_action: function(action) { } }); openerp.base.Homepage = openerp.base.Controller.extend({ }); openerp.base.Preferences = openerp.base.Controller.extend({ }); openerp.base.ImportExport = openerp.base.Controller.extend({ }); openerp.base.WebClient = openerp.base.Controller.extend({ init: function(element_id) { var self = this; this._super(null, element_id); QWeb.add_template("xml/base.xml"); var params = {}; if(jQuery.param != undefined && jQuery.deparam(jQuery.param.querystring()).kitten != undefined) { this.$element.addClass("kitten-mode-activated"); } this.$element.html(QWeb.render("Interface", params)); this.session = new openerp.base.Session("oe_errors"); this.loading = new openerp.base.Loading(this.session, "oe_loading"); this.crashmanager = new openerp.base.CrashManager(this.session); this.crashmanager.start(false); // Do you authorize this ? openerp.base.Controller.prototype.notification = new openerp.base.Notification("oe_notification"); this.header = new openerp.base.Header(this.session, "oe_header"); this.login = new openerp.base.Login(this.session, "oe_login"); this.header.on_logout.add(this.login.on_logout); this.session.on_session_invalid.add(this.login.do_ask_login); this.session.on_session_valid.add_last(this.header.do_update); this.session.on_session_valid.add_last(this.on_logged); this.menu = new openerp.base.Menu(this.session, "oe_menu", "oe_secondary_menu"); this.menu.on_action.add(this.on_menu_action); }, start: function() { this.session.start(); this.header.start(); this.login.start(); this.menu.start(); this.notification.notify("OpenERP Client", "The openerp client has been initialized."); }, on_logged: function() { this.action_manager = new openerp.base.ActionManager(this.session, "oe_app"); this.action_manager.start(); // if using saved actions, load the action and give it to action manager var parameters = jQuery.deparam(jQuery.param.querystring()); if(parameters["s_action"] != undefined) { var key = parseInt(parameters["s_action"]); var self = this; this.rpc("/base/session/get_session_action", {key:key}, function(action) { self.action_manager.do_action(action); }); } }, on_menu_action: function(action) { this.action_manager.do_action(action); }, do_about: function() { } }); openerp.base.webclient = function(element_id) { // TODO Helper to start webclient rename it openerp.base.webclient var client = new openerp.base.WebClient(element_id); client.start(); return client; }; }; // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: