diff options
| author | Turkesh Patel (Open ERP) <tpa@tinyerp.com> | 2012-04-18 12:11:56 +0530 |
|---|---|---|
| committer | Turkesh Patel (Open ERP) <tpa@tinyerp.com> | 2012-04-18 12:11:56 +0530 |
| commit | 3ad8dad36d2e9a81b6cb9d209c4f1cfab1ba4f6d (patch) | |
| tree | f392a2e6087665097628d276b26746df04cd9133 /addons/web/static/src/js | |
| parent | 8689427cebe3f83b12b9ae0623e54fb688b63f58 (diff) | |
| parent | 79c1e97479535e794f3a298a625b6dd18f5544bd (diff) | |
[MRG] merge with main branch.
bzr revid: tpa@tinyerp.com-20120418064156-4hrx14o263qes4o6
Diffstat (limited to 'addons/web/static/src/js')
| -rw-r--r-- | addons/web/static/src/js/chrome.js | 104 | ||||
| -rw-r--r-- | addons/web/static/src/js/corelib.js | 126 | ||||
| -rw-r--r-- | addons/web/static/src/js/coresetup.js | 28 | ||||
| -rw-r--r-- | addons/web/static/src/js/data.js | 76 | ||||
| -rw-r--r-- | addons/web/static/src/js/data_export.js | 10 | ||||
| -rw-r--r-- | addons/web/static/src/js/data_import.js | 16 | ||||
| -rw-r--r-- | addons/web/static/src/js/dates.js | 14 | ||||
| -rw-r--r-- | addons/web/static/src/js/formats.js | 82 | ||||
| -rw-r--r-- | addons/web/static/src/js/search.js | 262 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_editor.js | 68 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_form.js | 736 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_list.js | 108 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_list_editable.js | 31 | ||||
| -rw-r--r-- | addons/web/static/src/js/view_tree.js | 20 | ||||
| -rw-r--r-- | addons/web/static/src/js/views.js | 104 |
15 files changed, 896 insertions, 889 deletions
diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 892c86f2a92..f1d3faef367 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -1,16 +1,16 @@ /*--------------------------------------------------------- * OpenERP Web chrome *---------------------------------------------------------*/ -openerp.web.chrome = function(openerp) { -var QWeb = openerp.web.qweb, - _t = openerp.web._t; +openerp.web.chrome = function(instance) { +var QWeb = instance.web.qweb, + _t = instance.web._t; -openerp.web.Notification = openerp.web.Widget.extend({ +instance.web.Notification = instance.web.Widget.extend({ template: 'Notification', init: function() { this._super.apply(this, arguments); - // move to openerp.web.notification - openerp.notification = this; + // move to instance.web.notification + instance.notification = this; }, start: function() { this._super.apply(this, arguments); @@ -43,13 +43,13 @@ openerp.web.Notification = openerp.web.Widget.extend({ } }); -openerp.web.dialog = function(element) { +instance.web.dialog = function(element) { var result = element.dialog.apply(element, _.rest(_.toArray(arguments))); result.dialog("widget").addClass("openerp"); return result; } -openerp.web.Dialog = openerp.web.Widget.extend({ +instance.web.Dialog = instance.web.Widget.extend({ dialog_title: "", init: function (parent, options, content) { var self = this; @@ -83,7 +83,7 @@ openerp.web.Dialog = openerp.web.Widget.extend({ if (this.dialog_options.autoOpen) { this.open(); } else { - openerp.web.dialog(this.$element, this.get_options()); + instance.web.dialog(this.$element, this.get_options()); } }, get_options: function(options) { @@ -122,7 +122,7 @@ openerp.web.Dialog = openerp.web.Widget.extend({ this.$element.html(this.renderElement()); } var o = this.get_options(options); - openerp.web.dialog(this.$element, o).dialog('open'); + instance.web.dialog(this.$element, o).dialog('open'); if (o.height === 'auto' && o.max_height) { this.$element.css({ 'max-height': o.max_height, 'overflow-y': 'auto' }); } @@ -146,7 +146,7 @@ openerp.web.Dialog = openerp.web.Widget.extend({ } }); -openerp.web.CrashManager = openerp.web.CallbackEnabled.extend({ +instance.web.CrashManager = instance.web.CallbackEnabled.extend({ on_rpc_error: function(error) { if (error.data.fault_code) { var split = ("" + error.data.fault_code).split('\n')[0].split(' -- '); @@ -162,7 +162,7 @@ openerp.web.CrashManager = openerp.web.CallbackEnabled.extend({ } }, on_managed_error: function(error) { - openerp.web.dialog($('<div>' + QWeb.render('CrashManager.warning', {error: error}) + '</div>'), { + instance.web.dialog($('<div>' + QWeb.render('CrashManager.warning', {error: error}) + '</div>'), { title: "OpenERP " + _.str.capitalize(error.type), buttons: [ {text: _t("Ok"), click: function() { $(this).dialog("close"); }} @@ -172,14 +172,14 @@ openerp.web.CrashManager = openerp.web.CallbackEnabled.extend({ on_traceback: function(error) { var self = this; var buttons = {}; - if (openerp.connection.openerp_entreprise) { + if (instance.connection.openerp_entreprise) { buttons[_t("Send OpenERP Enterprise Report")] = function() { var $this = $(this); var issuename = $('#issuename').val(); var explanation = $('#explanation').val(); var remark = $('#remark').val(); // Call the send method from server to send mail with details - new openerp.web.DataSet(self, 'publisher_warranty.contract').call_and_eval('send', [error.data,explanation,remark,issuename]).then(function(result){ + new instance.web.DataSet(self, 'publisher_warranty.contract').call_and_eval('send', [error.data,explanation,remark,issuename]).then(function(result){ if (result === false) { alert('There was a communication error.') } else { @@ -195,7 +195,7 @@ openerp.web.CrashManager = openerp.web.CallbackEnabled.extend({ $(this).dialog("close"); }; } - var dialog = new openerp.web.Dialog(this, { + var dialog = new instance.web.Dialog(this, { title: "OpenERP " + _.str.capitalize(error.type), width: '80%', height: '50%', @@ -203,11 +203,11 @@ openerp.web.CrashManager = openerp.web.CallbackEnabled.extend({ min_height: '600px', buttons: buttons }).open(); - dialog.$element.html(QWeb.render('CrashManager.error', {session: openerp.connection, error: error})); + dialog.$element.html(QWeb.render('CrashManager.error', {session: instance.connection, error: error})); } }); -openerp.web.Loading = openerp.web.Widget.extend({ +instance.web.Loading = instance.web.Widget.extend({ template: 'Loading', init: function(parent) { this._super(parent); @@ -258,7 +258,7 @@ openerp.web.Loading = openerp.web.Widget.extend({ } }); -openerp.web.DatabaseManager = openerp.web.Widget.extend({ +instance.web.DatabaseManager = instance.web.Widget.extend({ init: function(parent) { this._super(parent); this.unblockUIFunction = $.unblockUI; @@ -344,7 +344,7 @@ openerp.web.DatabaseManager = openerp.web.Widget.extend({ * @param {String} error.error message of the error dialog */ display_error: function (error) { - return openerp.web.dialog($('<div>'), { + return instance.web.dialog($('<div>'), { modal: true, title: error.title, buttons: [ @@ -388,7 +388,7 @@ openerp.web.DatabaseManager = openerp.web.Widget.extend({ success: function () { self.do_notify(_t("Backed"), _t("Database backed up successfully")); }, - error: openerp.webclient.crashmanager.on_rpc_error, + error: instance.webclient.crashmanager.on_rpc_error, complete: function() { self.unblockUI(); } @@ -439,7 +439,7 @@ openerp.web.DatabaseManager = openerp.web.Widget.extend({ } }); -openerp.web.Login = openerp.web.Widget.extend({ +instance.web.Login = instance.web.Widget.extend({ template: "Login", remember_credentials: true, init: function(parent) { @@ -464,7 +464,7 @@ openerp.web.Login = openerp.web.Widget.extend({ self.$element.find('.oe_login_manage_db').click(function() { self.$element.find('.oe_login_bottom').hide(); self.$element.find('.oe_login_pane').hide(); - self.databasemanager = new openerp.web.DatabaseManager(self); + self.databasemanager = new instance.web.DatabaseManager(self); self.databasemanager.appendTo(self.$element); self.databasemanager.do_exit.add_last(function() { self.databasemanager.destroy(); @@ -486,7 +486,7 @@ openerp.web.Login = openerp.web.Widget.extend({ }); }, set_db_list: function (list) { - this.$element.find("[name=db]").replaceWith(openerp.web.qweb.render('Login.dblist', { db_list: list, selected_db: this.selected_db})) + this.$element.find("[name=db]").replaceWith(instance.web.qweb.render('Login.dblist', { db_list: list, selected_db: this.selected_db})) }, on_submit: function(ev) { if(ev) { @@ -538,7 +538,7 @@ openerp.web.Login = openerp.web.Widget.extend({ } }); -openerp.web.Menu = openerp.web.Widget.extend({ +instance.web.Menu = instance.web.Widget.extend({ template: 'Menu', init: function() { this._super.apply(this, arguments); @@ -682,7 +682,7 @@ openerp.web.Menu = openerp.web.Widget.extend({ } }); -openerp.web.UserMenu = openerp.web.Widget.extend({ +instance.web.UserMenu = instance.web.Widget.extend({ template: "UserMenu", init: function(parent) { this._super(parent); @@ -707,7 +707,7 @@ openerp.web.UserMenu = openerp.web.Widget.extend({ }, change_password :function() { var self = this; - this.dialog = new openerp.web.Dialog(this, { + this.dialog = new instance.web.Dialog(this, { title: _t("Change Password"), width : 'auto' }).open(); @@ -721,14 +721,14 @@ openerp.web.UserMenu = openerp.web.Widget.extend({ self.display_error(result); return; } else { - openerp.webclient.on_logout(); + instance.webclient.on_logout(); } }); } }); }, display_error: function (error) { - return openerp.web.dialog($('<div>'), { + return instance.web.dialog($('<div>'), { modal: true, title: error.title, buttons: [ @@ -743,10 +743,10 @@ openerp.web.UserMenu = openerp.web.Widget.extend({ $avatar.attr('src', $avatar.data('default-src')); if (!self.session.uid) return; - var func = new openerp.web.Model("res.users").get_func("read"); + var func = new instance.web.Model("res.users").get_func("read"); return func(self.session.uid, ["name", "company_id"]).pipe(function(res) { // TODO: Show company if multicompany is in use - var topbar_name = _.str.sprintf("%s (%s)", res.name, openerp.connection.db, res.company_id[1]); + var topbar_name = _.str.sprintf("%s (%s)", res.name, instance.connection.db, res.company_id[1]); self.$element.find('.oe_topbar_name').text(topbar_name); var avatar_src = _.str.sprintf('%s/web/binary/image?session_id=%s&model=res.users&field=avatar&id=%s', self.session.prefix, self.session.session_id, self.session.uid); $avatar.attr('src', avatar_src); @@ -760,7 +760,7 @@ openerp.web.UserMenu = openerp.web.Widget.extend({ shortcut_load :function(){ var self = this, sc = self.session.shortcuts, - shortcuts_ds = new openerp.web.DataSet(this, 'ir.ui.view_sc'); + shortcuts_ds = new instance.web.DataSet(this, 'ir.ui.view_sc'); self.$element.find('.oe_dropdown_options a[data-menu=shortcut]').each(function() { $(this).parent().remove(); }); @@ -807,8 +807,8 @@ openerp.web.UserMenu = openerp.web.Widget.extend({ }, on_menu_settings: function() { var self = this; - var action_manager = new openerp.web.ActionManager(this); - var dataset = new openerp.web.DataSet (this,'res.users',this.context); + var action_manager = new instance.web.ActionManager(this); + var dataset = new instance.web.DataSet (this,'res.users',this.context); dataset.call ('action_get','',function (result){ self.rpc('/web/action/load', {action_id:result}, function(result){ action_manager.do_action(_.extend(result['result'], { @@ -825,7 +825,7 @@ openerp.web.UserMenu = openerp.web.Widget.extend({ })); }); }); - this.dialog = new openerp.web.Dialog(this,{ + this.dialog = new instance.web.Dialog(this,{ title: _t("Preferences"), width: '700px', buttons: [ @@ -855,7 +855,7 @@ openerp.web.UserMenu = openerp.web.Widget.extend({ window.location = $.param.querystring( window.location.href, 'debug'); }); - openerp.web.dialog($help, {autoOpen: true, + instance.web.dialog($help, {autoOpen: true, modal: true, width: 960, title: _t("About")}); }); }, @@ -871,11 +871,11 @@ openerp.web.UserMenu = openerp.web.Widget.extend({ } }); -openerp.web.WebClient = openerp.web.Widget.extend({ +instance.web.WebClient = instance.web.Widget.extend({ init: function(parent) { var self = this; this._super(parent); - openerp.webclient = this; + instance.webclient = this; this.querystring = '?' + jQuery.param.querystring(); this._current_state = null; }, @@ -900,7 +900,7 @@ openerp.web.WebClient = openerp.web.Widget.extend({ self.menu.do_reload(); if(self.action_manager) self.action_manager.destroy(); - self.action_manager = new openerp.web.ActionManager(self); + self.action_manager = new instance.web.ActionManager(self); self.action_manager.appendTo(self.$element.find('.oe_application')); self.bind_hashchange(); var version_label = _t("OpenERP - Unsupported/Community Version"); @@ -917,7 +917,7 @@ openerp.web.WebClient = openerp.web.Widget.extend({ var self = this; this.destroy_content(); this.show_common(); - self.login = new openerp.web.Login(self); + self.login = new instance.web.Login(self); self.login.appendTo(self.$element); }, show_application: function() { @@ -926,10 +926,10 @@ openerp.web.WebClient = openerp.web.Widget.extend({ this.show_common(); self.$table = $(QWeb.render("WebClient", {})); self.$element.append(self.$table); - self.menu = new openerp.web.Menu(self); + self.menu = new instance.web.Menu(self); self.menu.replace(this.$element.find('.oe_menu_placeholder')); self.menu.on_action.add(this.proxy('on_menu_action')); - self.user_menu = new openerp.web.UserMenu(self); + self.user_menu = new instance.web.UserMenu(self); self.user_menu.replace(this.$element.find('.oe_user_menu_placeholder')); self.user_menu.on_menu_logout.add(this.proxy('on_logout')); self.user_menu.on_action.add(this.proxy('on_menu_action')); @@ -937,8 +937,8 @@ openerp.web.WebClient = openerp.web.Widget.extend({ show_common: function() { var self = this; if (!this.crashmanager) { - this.crashmanager = new openerp.web.CrashManager(); - openerp.connection.on_rpc_error.add(this.crashmanager.on_rpc_error); + this.crashmanager = new instance.web.CrashManager(); + instance.connection.on_rpc_error.add(this.crashmanager.on_rpc_error); window.onerror = function (message, file, line) { self.crashmanager.on_traceback({ type: _t("Client Error"), @@ -947,9 +947,9 @@ openerp.web.WebClient = openerp.web.Widget.extend({ }); } } - this.notification = new openerp.web.Notification(this); + this.notification = new instance.web.Notification(this); this.notification.appendTo(this.$element); - this.loading = new openerp.web.Loading(this); + this.loading = new instance.web.Loading(this); this.loading.appendTo(this.$element); }, destroy_content: function() { @@ -961,7 +961,7 @@ openerp.web.WebClient = openerp.web.Widget.extend({ do_reload: function() { var self = this; return this.session.session_reload().pipe(function () { - openerp.connection.load_modules(true).pipe( + instance.connection.load_modules(true).pipe( self.menu.proxy('do_reload')); }); }, @@ -1025,14 +1025,14 @@ openerp.web.WebClient = openerp.web.Widget.extend({ } }); -openerp.web.EmbeddedClient = openerp.web.Widget.extend({ +instance.web.EmbeddedClient = instance.web.Widget.extend({ template: 'EmptyComponent', init: function(parent, action_id, options) { this._super(parent); // TODO take the xmlid of a action instead of its id this.action_id = action_id; this.options = options || {}; - this.am = new openerp.web.ActionManager(this); + this.am = new instance.web.ActionManager(this); }, start: function() { var self = this; @@ -1052,7 +1052,7 @@ openerp.web.EmbeddedClient = openerp.web.Widget.extend({ } }); -openerp.web.embed = function (origin, dbname, login, key, action, options) { +instance.web.embed = function (origin, dbname, login, key, action, options) { $('head').append($('<link>', { 'rel': 'stylesheet', 'type': 'text/css', @@ -1063,9 +1063,9 @@ openerp.web.embed = function (origin, dbname, login, key, action, options) { var sc = document.getElementsByTagName('script'); currentScript = sc[sc.length-1]; } - openerp.connection.session_bind(origin).then(function () { - openerp.connection.session_authenticate(dbname, login, key, true).then(function () { - var client = new openerp.web.EmbeddedClient(null, action, options); + instance.connection.session_bind(origin).then(function () { + instance.connection.session_authenticate(dbname, login, key, true).then(function () { + var client = new instance.web.EmbeddedClient(null, action, options); client.insertAfter(currentScript); }); }); diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 2da804c3d2c..5475f4ad53c 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -23,7 +23,7 @@ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -openerp.web.corelib = function(openerp) { +openerp.web.corelib = function(instance) { /** * Improved John Resig's inheritance, based on: @@ -39,7 +39,7 @@ openerp.web.corelib = function(openerp) { * * Example: * - * var Person = openerp.web.Class.extend({ + * var Person = instance.web.Class.extend({ * init: function(isDancing){ * this.dancing = isDancing; * }, @@ -75,14 +75,14 @@ openerp.web.corelib = function(openerp) { var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; // The web Class implementation (does nothing) - openerp.web.Class = function(){}; + instance.web.Class = function(){}; /** * Subclass an existing class * * @param {Object} prop class-level properties (class attributes and instance methods) to set on the new class */ - openerp.web.Class.extend = function() { + instance.web.Class.extend = function() { var _super = this.prototype; // Support mixins arguments var args = _.toArray(arguments); @@ -180,7 +180,7 @@ openerp.web.corelib = function(openerp) { * When an object is destroyed, all its children are destroyed too releasing * any resource they could have reserved before. */ -openerp.web.ParentedMixin = { +instance.web.ParentedMixin = { __parentedMixin : true, init: function() { this.__parentedDestroyed = false; @@ -253,7 +253,7 @@ openerp.web.ParentedMixin = { * events is done in EventDispatcherMixin. * */ -openerp.web.Events = openerp.web.Class.extend({ +instance.web.Events = instance.web.Class.extend({ on : function(events, callback, context) { var ev; @@ -324,11 +324,11 @@ openerp.web.Events = openerp.web.Class.extend({ } }); -openerp.web.EventDispatcherMixin = _.extend({}, openerp.web.ParentedMixin, { +instance.web.EventDispatcherMixin = _.extend({}, instance.web.ParentedMixin, { __eventDispatcherMixin: true, init: function() { - openerp.web.ParentedMixin.init.call(this); - this.__edispatcherEvents = new openerp.web.Events(); + instance.web.ParentedMixin.init.call(this); + this.__edispatcherEvents = new instance.web.Events(); this.__edispatcherRegisteredEvents = []; }, on: function(events, dest, func) { @@ -369,13 +369,13 @@ openerp.web.EventDispatcherMixin = _.extend({}, openerp.web.ParentedMixin, { debugger; } this.__edispatcherEvents.off(); - openerp.web.ParentedMixin.destroy.call(this); + instance.web.ParentedMixin.destroy.call(this); } }); -openerp.web.GetterSetterMixin = _.extend({}, openerp.web.EventDispatcherMixin, { +instance.web.GetterSetterMixin = _.extend({}, instance.web.EventDispatcherMixin, { init: function() { - openerp.web.EventDispatcherMixin.init.call(this); + instance.web.EventDispatcherMixin.init.call(this); this.__getterSetterInternalMap = {}; }, set: function(map) { @@ -400,9 +400,9 @@ openerp.web.GetterSetterMixin = _.extend({}, openerp.web.EventDispatcherMixin, { } }); -openerp.web.CallbackEnabledMixin = _.extend({}, openerp.web.GetterSetterMixin, { +instance.web.CallbackEnabledMixin = _.extend({}, instance.web.GetterSetterMixin, { init: function() { - openerp.web.GetterSetterMixin.init.call(this); + instance.web.GetterSetterMixin.init.call(this); var self = this; var callback_maker = function(obj, name, method) { var callback = function() { @@ -421,7 +421,7 @@ openerp.web.CallbackEnabledMixin = _.extend({}, openerp.web.GetterSetterMixin, { r = result; } // TODO special value to stop the chain - // openerp.web.callback_stop + // instance.web.callback_stop } return r; }; @@ -500,7 +500,7 @@ openerp.web.CallbackEnabledMixin = _.extend({}, openerp.web.GetterSetterMixin, { } }); -openerp.web.WidgetMixin = _.extend({},openerp.web.CallbackEnabledMixin, { +instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { /** * Tag name when creating a default $element. * @type string @@ -509,10 +509,10 @@ openerp.web.WidgetMixin = _.extend({},openerp.web.CallbackEnabledMixin, { /** * Constructs the widget and sets its parent if a parent is given. * - * @constructs openerp.web.Widget - * @extends openerp.web.CallbackEnabled + * @constructs instance.web.Widget + * @extends instance.web.CallbackEnabled * - * @param {openerp.web.Widget} parent Binds the current instance to the given Widget instance. + * @param {instance.web.Widget} parent Binds the current instance to the given Widget instance. * When that widget is destroyed by calling destroy(), the current instance will be * destroyed too. Can be null. * @param {String} element_id Deprecated. Sets the element_id. Only useful when you want @@ -521,7 +521,7 @@ openerp.web.WidgetMixin = _.extend({},openerp.web.CallbackEnabledMixin, { * for new components this argument should not be provided any more. */ init: function(parent) { - openerp.web.CallbackEnabledMixin.init.call(this); + instance.web.CallbackEnabledMixin.init.call(this); this.$element = $(document.createElement(this.tagName)); this.setParent(parent); }, @@ -535,7 +535,7 @@ openerp.web.WidgetMixin = _.extend({},openerp.web.CallbackEnabledMixin, { if(this.$element != null) { this.$element.remove(); } - openerp.web.GetterSetterMixin.destroy.call(this); + instance.web.GetterSetterMixin.destroy.call(this); }, /** * Renders the current widget and appends it to the given jQuery object or Widget. @@ -616,9 +616,9 @@ openerp.web.WidgetMixin = _.extend({},openerp.web.CallbackEnabledMixin, { // Classes -openerp.web.CallbackEnabled = openerp.web.Class.extend(openerp.web.CallbackEnabledMixin, { +instance.web.CallbackEnabled = instance.web.Class.extend(instance.web.CallbackEnabledMixin, { init: function() { - openerp.web.CallbackEnabledMixin.init.call(this); + instance.web.CallbackEnabledMixin.init.call(this); } }); @@ -637,7 +637,7 @@ openerp.web.CallbackEnabled = openerp.web.Class.extend(openerp.web.CallbackEnabl * * Here is a sample child class: * - * MyWidget = openerp.base.Widget.extend({ + * MyWidget = instance.base.Widget.extend({ * // the name of the QWeb template to use for rendering * template: "MyQWebTemplate", * @@ -670,7 +670,7 @@ openerp.web.CallbackEnabled = openerp.web.Class.extend(openerp.web.CallbackEnabl * * That will kill the widget in a clean way and erase its content from the dom. */ -openerp.web.Widget = openerp.web.Class.extend(openerp.web.WidgetMixin, { +instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { /** * The name of the QWeb template that will be used for rendering. Must be * redefined in subclasses or the default render() method can not be used. @@ -681,10 +681,10 @@ openerp.web.Widget = openerp.web.Class.extend(openerp.web.WidgetMixin, { /** * Constructs the widget and sets its parent if a parent is given. * - * @constructs openerp.web.Widget - * @extends openerp.web.CallbackEnabled + * @constructs instance.web.Widget + * @extends instance.web.CallbackEnabled * - * @param {openerp.web.Widget} parent Binds the current instance to the given Widget instance. + * @param {instance.web.Widget} parent Binds the current instance to the given Widget instance. * When that widget is destroyed by calling destroy(), the current instance will be * destroyed too. Can be null. * @param {String} element_id Deprecated. Sets the element_id. Only useful when you want @@ -693,8 +693,8 @@ openerp.web.Widget = openerp.web.Class.extend(openerp.web.WidgetMixin, { * for new components this argument should not be provided any more. */ init: function(parent) { - openerp.web.WidgetMixin.init.call(this,parent); - this.session = openerp.connection; + instance.web.WidgetMixin.init.call(this,parent); + this.session = instance.connection; }, /** * Renders the element. The default implementation renders the widget using QWeb, @@ -704,7 +704,7 @@ openerp.web.Widget = openerp.web.Class.extend(openerp.web.WidgetMixin, { renderElement: function() { var rendered = null; if (this.template) - rendered = openerp.web.qweb.render(this.template, {widget: this}); + rendered = instance.web.qweb.render(this.template, {widget: this}); if (_.str.trim(rendered)) { var elem = $(rendered); this.$element.replaceWith(elem); @@ -737,7 +737,7 @@ openerp.web.Widget = openerp.web.Class.extend(openerp.web.WidgetMixin, { rpc: function(url, data, success, error) { var def = $.Deferred().then(success, error); var self = this; - openerp.connection.rpc(url, data). then(function() { + instance.connection.rpc(url, data). then(function() { if (!self.isDestroyed()) def.resolve.apply(def, arguments); }, function() { @@ -748,7 +748,7 @@ openerp.web.Widget = openerp.web.Class.extend(openerp.web.WidgetMixin, { } }); -openerp.web.Registry = openerp.web.Class.extend({ +instance.web.Registry = instance.web.Class.extend({ /** * Stores a mapping of arbitrary key (strings) to object paths (as strings * as well). @@ -757,11 +757,11 @@ openerp.web.Registry = openerp.web.Class.extend({ * 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.web.Connection"`` for an OpenERP + * An object path is simply a dotted name from the instance root to the + * object pointed to (e.g. ``"instance.web.Connection"`` for an OpenERP * connection object). * - * @constructs openerp.web.Registry + * @constructs instance.web.Registry * @param {Object} mapping a mapping of keys to object-paths */ init: function (mapping) { @@ -785,7 +785,7 @@ openerp.web.Registry = openerp.web.Class.extend({ return null; } - var object_match = openerp; + var object_match = instance; var path = path_string.split('.'); // ignore first section for(var i=1; i<path.length; ++i) { @@ -838,7 +838,7 @@ openerp.web.Registry = openerp.web.Class.extend({ * * @param {String} key * @param {String} object_path fully qualified dotted object path - * @returns {openerp.web.Registry} itself + * @returns {instance.web.Registry} itself */ add: function (key, object_path) { this.map[key] = object_path; @@ -854,7 +854,7 @@ openerp.web.Registry = openerp.web.Class.extend({ * @param {Object} [mapping={}] a mapping of keys to object-paths */ extend: function (mapping) { - var child = new openerp.web.Registry(mapping); + var child = new instance.web.Registry(mapping); child.parent = this; return child; }, @@ -867,10 +867,10 @@ openerp.web.Registry = openerp.web.Class.extend({ } }); -openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp.web.Connection# */{ +instance.web.Connection = instance.web.CallbackEnabled.extend( /** @lends instance.web.Connection# */{ /** - * @constructs openerp.web.Connection - * @extends openerp.web.CallbackEnabled + * @constructs instance.web.Connection + * @extends instance.web.CallbackEnabled * * @param {String} [server] JSON-RPC endpoint hostname * @param {String} [port] JSON-RPC endpoint port @@ -880,7 +880,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. this.server = null; this.debug = ($.deparam($.param.querystring()).debug != undefined); // TODO: session store in cookie should be optional - this.name = openerp._session_id; + this.name = instance._session_id; this.qweb_mutex = new $.Mutex(); }, session_bind: function(origin) { @@ -888,7 +888,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. this.origin = origin ? _.str.rtrim(origin,'/') : window_origin; this.prefix = this.origin; this.server = this.origin; // keep chs happy - openerp.web.qweb.default_dict['_s'] = this.origin; + instance.web.qweb.default_dict['_s'] = this.origin; this.rpc_function = (this.origin == window_origin) ? this.rpc_json : this.rpc_jsonp; this.session_id = false; this.uid = false; @@ -896,7 +896,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. this.user_context= {}; this.db = false; this.openerp_entreprise = false; - this.module_list = openerp._modules.slice(); + this.module_list = instance._modules.slice(); this.module_loaded = {}; _(this.module_list).each(function (mod) { self.module_loaded[mod] = true; @@ -1069,7 +1069,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. try { var ctx = this.test_eval_contexts(source.contexts); if (!_.isEqual(ctx, expected.context)) { - openerp.webclient.notification.warn('Context mismatch, report to xmo', + instance.webclient.notification.warn('Context mismatch, report to xmo', _.str.sprintf(match_template, { source: JSON.stringify(source.contexts), local: JSON.stringify(ctx), @@ -1077,7 +1077,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }), true); } } catch (e) { - openerp.webclient.notification.warn('Context fail, report to xmo', + instance.webclient.notification.warn('Context fail, report to xmo', _.str.sprintf(fail_template, { error: e.message, source: JSON.stringify(source.contexts) @@ -1087,7 +1087,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. try { var dom = this.test_eval_domains(source.domains, this.test_eval_get_context()); if (!_.isEqual(dom, expected.domain)) { - openerp.webclient.notification.warn('Domains mismatch, report to xmo', + instance.webclient.notification.warn('Domains mismatch, report to xmo', _.str.sprintf(match_template, { source: JSON.stringify(source.domains), local: JSON.stringify(dom), @@ -1095,7 +1095,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }), true); } } catch (e) { - openerp.webclient.notification.warn('Domain fail, report to xmo', + instance.webclient.notification.warn('Domain fail, report to xmo', _.str.sprintf(fail_template, { error: e.message, source: JSON.stringify(source.domains) @@ -1105,7 +1105,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. try { var groups = this.test_eval_groupby(source.group_by_seq); if (!_.isEqual(groups, expected.group_by)) { - openerp.webclient.notification.warn('GroupBy mismatch, report to xmo', + instance.webclient.notification.warn('GroupBy mismatch, report to xmo', _.str.sprintf(match_template, { source: JSON.stringify(source.group_by_seq), local: JSON.stringify(groups), @@ -1113,7 +1113,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. }), true); } } catch (e) { - openerp.webclient.notification.warn('GroupBy fail, report to xmo', + instance.webclient.notification.warn('GroupBy fail, report to xmo', _.str.sprintf(fail_template, { error: e.message, source: JSON.stringify(source.group_by_seq) @@ -1369,7 +1369,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. // TODO: session store in cookie should be optional this.session_id = this.get_cookie('session_id'); return this.session_reload().pipe(function(result) { - var modules = openerp._modules.join(','); + var modules = instance._modules.join(','); var deferred = self.rpc('/web/webclient/qweblist', {mods: modules}).pipe(self.do_load_qweb); if(self.session_is_valid()) { return deferred.pipe(function() { return self.load_modules(); }); @@ -1491,7 +1491,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. self.rpc('/web/webclient/csslist', {mods: to_load}, self.do_load_css), self.rpc('/web/webclient/qweblist', {mods: to_load}).pipe(self.do_load_qweb), self.rpc('/web/webclient/translations', params).pipe(function(trans) { - openerp.web._t.database.set_bundle(trans); + instance.web._t.database.set_bundle(trans); var file_list = ["/web/static/lib/datejs/globalization/" + lang.replace("_", "-") + ".js"]; return self.rpc('/web/webclient/jslist', {mods: to_load}).pipe(function(files) { return self.do_load_js(file_list.concat(files)); @@ -1553,7 +1553,7 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. self.qweb_mutex.exec(function() { return self.rpc('/web/proxy/load', {path: file}).pipe(function(xml) { if (!xml) { return; } - openerp.web.qweb.add_template(_.str.trim(xml)); + instance.web.qweb.add_template(_.str.trim(xml)); }); }); }); @@ -1564,10 +1564,10 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. var mod = this.module_list[j]; if(this.module_loaded[mod]) continue; - openerp[mod] = {}; + instance[mod] = {}; // init module mod - if(openerp._openerp[mod] != undefined) { - openerp._openerp[mod](openerp); + if(instance._openerp[mod] != undefined) { + instance._openerp[mod](instance); this.module_loaded[mod] = true; } } @@ -1687,10 +1687,10 @@ openerp.web.Connection = openerp.web.CallbackEnabled.extend( /** @lends openerp. } }); -openerp.web.TranslationDataBase = openerp.web.Class.extend(/** @lends openerp.web.TranslationDataBase# */{ +instance.web.TranslationDataBase = instance.web.Class.extend(/** @lends instance.web.TranslationDataBase# */{ /** - * @constructs openerp.web.TranslationDataBase - * @extends openerp.web.Class + * @constructs instance.web.TranslationDataBase + * @extends instance.web.Class */ init: function() { this.db = {}; @@ -1741,9 +1741,9 @@ openerp.web.TranslationDataBase = openerp.web.Class.extend(/** @lends openerp.we }); /** - * @deprecated use :class:`openerp.web.Widget` + * @deprecated use :class:`instance.web.Widget` */ -openerp.web.OldWidget = openerp.web.Widget.extend({ +instance.web.OldWidget = instance.web.Widget.extend({ init: function(parent, element_id) { this._super(parent); this.element_id = element_id; @@ -1762,7 +1762,7 @@ openerp.web.OldWidget = openerp.web.Widget.extend({ }, render: function (additional) { if (this.template) - return openerp.web.qweb.render(this.template, _.extend({widget: this}, additional || {})); + return instance.web.qweb.render(this.template, _.extend({widget: this}, additional || {})); return null; } }); diff --git a/addons/web/static/src/js/coresetup.js b/addons/web/static/src/js/coresetup.js index a68a7bb3d7e..86040302668 100644 --- a/addons/web/static/src/js/coresetup.js +++ b/addons/web/static/src/js/coresetup.js @@ -9,10 +9,10 @@ if (!console.debug) { console.debug = console.log; } -openerp.web.coresetup = function(openerp) { +openerp.web.coresetup = function(instance) { /** Configure default qweb */ -openerp.web._t = new openerp.web.TranslationDataBase().build_translation_function(); +instance.web._t = new instance.web.TranslationDataBase().build_translation_function(); /** * Lazy translation function, only performs the translation when actually * printed (e.g. inserted into a template) @@ -24,16 +24,16 @@ openerp.web._t = new openerp.web.TranslationDataBase().build_translation_functio * @param {String} s string to translate * @returns {Object} lazy translation object */ -openerp.web._lt = function (s) { - return {toString: function () { return openerp.web._t(s); }} +instance.web._lt = function (s) { + return {toString: function () { return instance.web._t(s); }} }; -openerp.web.qweb = new QWeb2.Engine(); -openerp.web.qweb.debug = ($.deparam($.param.querystring()).debug != undefined); -openerp.web.qweb.default_dict = { +instance.web.qweb = new QWeb2.Engine(); +instance.web.qweb.debug = ($.deparam($.param.querystring()).debug != undefined); +instance.web.qweb.default_dict = { '_' : _, - '_t' : openerp.web._t + '_t' : instance.web._t }; -openerp.web.qweb.preprocess_node = function() { +instance.web.qweb.preprocess_node = function() { // Note that 'this' is the Qweb Node switch (this.node.nodeType) { case 3: @@ -47,7 +47,7 @@ openerp.web.qweb.preprocess_node = function() { if (ts.length === 0) { return; } - var tr = openerp.web._t(ts); + var tr = instance.web._t(ts); if (tr !== ts) { this.node.data = tr; } @@ -57,7 +57,7 @@ openerp.web.qweb.preprocess_node = function() { var attr, attrs = ['label', 'title', 'alt']; while (attr = attrs.pop()) { if (this.attributes[attr]) { - this.attributes[attr] = openerp.web._t(this.attributes[attr]); + this.attributes[attr] = instance.web._t(this.attributes[attr]); } } } @@ -99,8 +99,8 @@ $.Mutex = (function() { })(); /** Setup default connection */ -openerp.connection = new openerp.web.Connection(); -openerp.web.qweb.default_dict['__debug__'] = openerp.connection.debug; +instance.connection = new instance.web.Connection(); +instance.web.qweb.default_dict['__debug__'] = instance.connection.debug; $.async_when = function() { var async = false; @@ -131,7 +131,7 @@ $.async_when = function() { // special tweak for the web client var old_async_when = $.async_when; $.async_when = function() { - if (openerp.connection.synch) + if (instance.connection.synch) return $.when.apply(this, arguments); else return old_async_when.apply(this, arguments); diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js index d9cfc5c4002..4f18a4c53d9 100644 --- a/addons/web/static/src/js/data.js +++ b/addons/web/static/src/js/data.js @@ -1,5 +1,5 @@ -openerp.web.data = function(openerp) { +openerp.web.data = function(instance) { /** * Serializes the sort criterion array of a dataset into a form which can be @@ -8,7 +8,7 @@ openerp.web.data = function(openerp) { * @param {Array} criterion array of fields, from first to last criteria, prefixed with '-' for reverse sorting * @returns {String} SQL-like sorting string (``ORDER BY``) clause */ -openerp.web.serialize_sort = function (criterion) { +instance.web.serialize_sort = function (criterion) { return _.map(criterion, function (criteria) { if (criteria[0] === '-') { @@ -18,7 +18,7 @@ openerp.web.serialize_sort = function (criterion) { }).join(', '); }; -openerp.web.DataGroup = openerp.web.OldWidget.extend( /** @lends openerp.web.DataGroup# */{ +instance.web.DataGroup = instance.web.OldWidget.extend( /** @lends instance.web.DataGroup# */{ /** * Management interface between views and grouped collections of OpenERP * records. @@ -26,13 +26,13 @@ openerp.web.DataGroup = openerp.web.OldWidget.extend( /** @lends openerp.web.Da * The root DataGroup is instantiated with the relevant information * (a session, a model, a domain, a context and a group_by sequence), the * domain and context may be empty. It is then interacted with via - * :js:func:`~openerp.web.DataGroup.list`, which is used to read the + * :js:func:`~instance.web.DataGroup.list`, which is used to read the * content of the current grouping level. * - * @constructs openerp.web.DataGroup - * @extends openerp.web.OldWidget + * @constructs instance.web.DataGroup + * @extends instance.web.OldWidget * - * @param {openerp.web.OldWidget} parent widget + * @param {instance.web.OldWidget} parent widget * @param {String} model name of the model managed by this DataGroup * @param {Array} domain search domain for this DataGroup * @param {Object} context context of the DataGroup's searches @@ -43,9 +43,9 @@ openerp.web.DataGroup = openerp.web.OldWidget.extend( /** @lends openerp.web.Da this._super(parent, null); if (group_by) { if (group_by.length || context['group_by_no_leaf']) { - return new openerp.web.ContainerDataGroup( this, model, domain, context, group_by, level); + return new instance.web.ContainerDataGroup( this, model, domain, context, group_by, level); } else { - return new openerp.web.GrouplessDataGroup( this, model, domain, context, level); + return new instance.web.GrouplessDataGroup( this, model, domain, context, level); } } @@ -57,11 +57,11 @@ openerp.web.DataGroup = openerp.web.OldWidget.extend( /** @lends openerp.web.Da }, cls: 'DataGroup' }); -openerp.web.ContainerDataGroup = openerp.web.DataGroup.extend( /** @lends openerp.web.ContainerDataGroup# */ { +instance.web.ContainerDataGroup = instance.web.DataGroup.extend( /** @lends instance.web.ContainerDataGroup# */ { /** * - * @constructs openerp.web.ContainerDataGroup - * @extends openerp.web.DataGroup + * @constructs instance.web.ContainerDataGroup + * @extends instance.web.DataGroup * * @param session * @param model @@ -146,7 +146,7 @@ openerp.web.ContainerDataGroup = openerp.web.DataGroup.extend( /** @lends opener domain: this.domain, fields: _.uniq(this.group_by.concat(fields)), group_by_fields: this.group_by, - sort: openerp.web.serialize_sort(this.sort) + sort: instance.web.serialize_sort(this.sort) }, function () { }).then(function (response) { var data_groups = _(response).map( _.bind(self.transform_group, self)); @@ -186,7 +186,7 @@ openerp.web.ContainerDataGroup = openerp.web.DataGroup.extend( /** @lends opener ifGroups(_(group_records).map(function (group) { var child_context = _.extend({}, self.context, group.__context); return _.extend( - new openerp.web.DataGroup( + new instance.web.DataGroup( self, self.model, group.__domain, child_context, child_context.group_by, self.level + 1), @@ -195,11 +195,11 @@ openerp.web.ContainerDataGroup = openerp.web.DataGroup.extend( /** @lends opener }); } }); -openerp.web.GrouplessDataGroup = openerp.web.DataGroup.extend( /** @lends openerp.web.GrouplessDataGroup# */ { +instance.web.GrouplessDataGroup = instance.web.DataGroup.extend( /** @lends instance.web.GrouplessDataGroup# */ { /** * - * @constructs openerp.web.GrouplessDataGroup - * @extends openerp.web.DataGroup + * @constructs instance.web.GrouplessDataGroup + * @extends instance.web.DataGroup * * @param session * @param model @@ -212,17 +212,17 @@ openerp.web.GrouplessDataGroup = openerp.web.DataGroup.extend( /** @lends opener }, list: function (fields, ifGroups, ifRecords) { ifRecords(_.extend( - new openerp.web.DataSetSearch(this, this.model), + new instance.web.DataSetSearch(this, this.model), {domain: this.domain, context: this.context, _sort: this.sort})); } }); -openerp.web.StaticDataGroup = openerp.web.GrouplessDataGroup.extend( /** @lends openerp.web.StaticDataGroup# */ { +instance.web.StaticDataGroup = instance.web.GrouplessDataGroup.extend( /** @lends instance.web.StaticDataGroup# */ { /** * A specialization of groupless data groups, relying on a single static * dataset as its records provider. * - * @constructs openerp.web.StaticDataGroup - * @extends openerp.web.GrouplessDataGroup + * @constructs instance.web.StaticDataGroup + * @extends instance.web.GrouplessDataGroup * @param {openep.web.DataSetStatic} dataset a static dataset backing the groups */ init: function (dataset) { @@ -233,13 +233,13 @@ openerp.web.StaticDataGroup = openerp.web.GrouplessDataGroup.extend( /** @lends } }); -openerp.web.DataSet = openerp.web.OldWidget.extend( /** @lends openerp.web.DataSet# */{ +instance.web.DataSet = instance.web.OldWidget.extend( /** @lends instance.web.DataSet# */{ /** * DateaManagement interface between views and the collection of selected * OpenERP records (represents the view's state?) * - * @constructs openerp.web.DataSet - * @extends openerp.web.OldWidget + * @constructs instance.web.DataSet + * @extends instance.web.OldWidget * * @param {String} model the OpenERP model this dataset will manage */ @@ -494,7 +494,7 @@ openerp.web.DataSet = openerp.web.OldWidget.extend( /** @lends openerp.web.Data }, get_context: function(request_context) { if (request_context) { - return new openerp.web.CompoundContext(this.context, request_context); + return new instance.web.CompoundContext(this.context, request_context); } return this.context; }, @@ -513,7 +513,7 @@ openerp.web.DataSet = openerp.web.OldWidget.extend( /** @lends openerp.web.Data */ sort: function (field, force_reverse) { if (!field) { - return openerp.web.serialize_sort(this._sort); + return instance.web.serialize_sort(this._sort); } var reverse = force_reverse || (this._sort[0] === field); this._sort.splice.apply( @@ -530,7 +530,7 @@ openerp.web.DataSet = openerp.web.OldWidget.extend( /** @lends openerp.web.Data this.ids = n_ids; }, }); -openerp.web.DataSetStatic = openerp.web.DataSet.extend({ +instance.web.DataSetStatic = instance.web.DataSet.extend({ init: function(parent, model, context, ids) { this._super(parent, model, context); // all local records @@ -560,10 +560,10 @@ openerp.web.DataSetStatic = openerp.web.DataSet.extend({ this.set_ids(_.without.apply(null, [this.ids].concat(ids))); } }); -openerp.web.DataSetSearch = openerp.web.DataSet.extend(/** @lends openerp.web.DataSetSearch */{ +instance.web.DataSetSearch = instance.web.DataSet.extend(/** @lends instance.web.DataSetSearch */{ /** - * @constructs openerp.web.DataSetSearch - * @extends openerp.web.DataSet + * @constructs instance.web.DataSetSearch + * @extends instance.web.DataSet * * @param {Object} parent * @param {String} model @@ -612,7 +612,7 @@ openerp.web.DataSetSearch = openerp.web.DataSet.extend(/** @lends openerp.web.D }, get_domain: function (other_domain) { if (other_domain) { - return new openerp.web.CompoundDomain(this.domain, other_domain); + return new instance.web.CompoundDomain(this.domain, other_domain); } return this.domain; }, @@ -635,7 +635,7 @@ openerp.web.DataSetSearch = openerp.web.DataSet.extend(/** @lends openerp.web.D return this._super(); } }); -openerp.web.BufferedDataSet = openerp.web.DataSetStatic.extend({ +instance.web.BufferedDataSet = instance.web.DataSetStatic.extend({ virtual_id_prefix: "one2many_v_id_", debug_mode: true, init: function() { @@ -800,9 +800,9 @@ openerp.web.BufferedDataSet = openerp.web.DataSetStatic.extend({ this.on_change(); }, }); -openerp.web.BufferedDataSet.virtual_id_regex = /^one2many_v_id_.*$/; +instance.web.BufferedDataSet.virtual_id_regex = /^one2many_v_id_.*$/; -openerp.web.ProxyDataSet = openerp.web.DataSetSearch.extend({ +instance.web.ProxyDataSet = instance.web.DataSetSearch.extend({ init: function() { this._super.apply(this, arguments); this.create_function = null; @@ -848,13 +848,13 @@ openerp.web.ProxyDataSet = openerp.web.DataSetSearch.extend({ on_unlink: function(ids) {} }); -openerp.web.Model = openerp.web.CallbackEnabled.extend({ +instance.web.Model = instance.web.CallbackEnabled.extend({ init: function(model_name) { this._super(); this.model_name = model_name; }, rpc: function() { - var c = openerp.connection; + var c = instance.connection; return c.rpc.apply(c, arguments); }, /* @@ -876,7 +876,7 @@ openerp.web.Model = openerp.web.CallbackEnabled.extend({ } }); -openerp.web.CompoundContext = openerp.web.Class.extend({ +instance.web.CompoundContext = instance.web.Class.extend({ init: function () { this.__ref = "compound_context"; this.__contexts = []; @@ -899,7 +899,7 @@ openerp.web.CompoundContext = openerp.web.Class.extend({ } }); -openerp.web.CompoundDomain = openerp.web.Class.extend({ +instance.web.CompoundDomain = instance.web.Class.extend({ init: function () { this.__ref = "compound_domain"; this.__domains = []; diff --git a/addons/web/static/src/js/data_export.js b/addons/web/static/src/js/data_export.js index 3d15a4e3607..ebe82ddb4b4 100644 --- a/addons/web/static/src/js/data_export.js +++ b/addons/web/static/src/js/data_export.js @@ -1,14 +1,14 @@ -openerp.web.data_export = function(openerp) { -var QWeb = openerp.web.qweb, - _t = openerp.web._t; -openerp.web.DataExport = openerp.web.Dialog.extend({ +openerp.web.data_export = function(instance) { +var QWeb = instance.web.qweb, + _t = instance.web._t; +instance.web.DataExport = instance.web.Dialog.extend({ template: 'ExportTreeView', dialog_title: {toString: function () { return _t("Export Data"); }}, init: function(parent, dataset) { this._super(parent); this.records = {}; this.dataset = dataset; - this.exports = new openerp.web.DataSetSearch( + this.exports = new instance.web.DataSetSearch( this, 'ir.exports', this.dataset.get_context()); }, start: function() { diff --git a/addons/web/static/src/js/data_import.js b/addons/web/static/src/js/data_import.js index 3054a7784c4..30f9323f723 100644 --- a/addons/web/static/src/js/data_import.js +++ b/addons/web/static/src/js/data_import.js @@ -1,6 +1,6 @@ -openerp.web.data_import = function(openerp) { -var QWeb = openerp.web.qweb, - _t = openerp.web._t; +openerp.web.data_import = function(instance) { +var QWeb = instance.web.qweb, + _t = instance.web._t; /** * Safari does not deal well at all with raw JSON data being returned. As a * result, we're going to cheat by using a pseudo-jsonp: instead of getting @@ -29,7 +29,7 @@ function jsonp(form, attributes, callback) { $(form).ajaxSubmit(attributes); } -openerp.web.DataImport = openerp.web.Dialog.extend({ +instance.web.DataImport = instance.web.Dialog.extend({ template: 'ImportDataView', dialog_title: {toString: function () { return _t("Import Data"); }}, init: function(parent, dataset){ @@ -79,10 +79,10 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ this.$element.delegate('fieldset legend', 'click', function() { $(this).parent().toggleClass('oe-closed'); }); - this.ready.push(new openerp.web.DataSet(this, this.model).call( + this.ready.push(new instance.web.DataSet(this, this.model).call( 'fields_get', [], function (fields) { self.graft_fields(fields); - self.ready.push(new openerp.web.DataSet(self, self.model) + self.ready.push(new instance.web.DataSet(self, self.model) .default_get(_.pluck(self.fields, 'id')).then(function (fields) { _.each(fields, function(val, key) { if (val) { @@ -140,7 +140,7 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ f.fields = []; // only fetch sub-fields to a depth of 2 levels if (level < 2) { - self.ready.push(new openerp.web.DataSet(self, field.relation).call( + self.ready.push(new instance.web.DataSet(self, field.relation).call( 'fields_get', [], function (fields) { self.graft_fields(fields, f, level+1); })); @@ -151,7 +151,7 @@ openerp.web.DataImport = openerp.web.Dialog.extend({ }); }, toggle_import_button: function (newstate) { - openerp.web.dialog(this.$element, 'widget') + instance.web.dialog(this.$element, 'widget') .find('.oe-dialog-import-button') .button('option', 'disabled', !newstate); }, diff --git a/addons/web/static/src/js/dates.js b/addons/web/static/src/js/dates.js index d61223113f8..3db48c8412a 100644 --- a/addons/web/static/src/js/dates.js +++ b/addons/web/static/src/js/dates.js @@ -1,5 +1,5 @@ -openerp.web.dates = function(openerp) { +openerp.web.dates = function(instance) { /** * Converts a string to a Date javascript object using OpenERP's @@ -11,7 +11,7 @@ openerp.web.dates = function(openerp) { * @param {String} str A string representing a datetime. * @returns {Date} */ -openerp.web.str_to_datetime = function(str) { +instance.web.str_to_datetime = function(str) { if(!str) { return str; } @@ -38,7 +38,7 @@ openerp.web.str_to_datetime = function(str) { * @param {String} str A string representing a date. * @returns {Date} */ -openerp.web.str_to_date = function(str) { +instance.web.str_to_date = function(str) { if(!str) { return str; } @@ -65,7 +65,7 @@ openerp.web.str_to_date = function(str) { * @param {String} str A string representing a time. * @returns {Date} */ -openerp.web.str_to_time = function(str) { +instance.web.str_to_time = function(str) { if(!str) { return str; } @@ -104,7 +104,7 @@ var zpad = function(str, size) { * @param {Date} obj * @returns {String} A string representing a datetime. */ -openerp.web.datetime_to_str = function(obj) { +instance.web.datetime_to_str = function(obj) { if (!obj) { return false; } @@ -124,7 +124,7 @@ openerp.web.datetime_to_str = function(obj) { * @param {Date} obj * @returns {String} A string representing a date. */ -openerp.web.date_to_str = function(obj) { +instance.web.date_to_str = function(obj) { if (!obj) { return false; } @@ -143,7 +143,7 @@ openerp.web.date_to_str = function(obj) { * @param {Date} obj * @returns {String} A string representing a time. */ -openerp.web.time_to_str = function(obj) { +instance.web.time_to_str = function(obj) { if (!obj) { return false; } diff --git a/addons/web/static/src/js/formats.js b/addons/web/static/src/js/formats.js index 53863e63e97..107a923b625 100644 --- a/addons/web/static/src/js/formats.js +++ b/addons/web/static/src/js/formats.js @@ -1,6 +1,6 @@ -openerp.web.formats = function(openerp) { -var _t = openerp.web._t; +openerp.web.formats = function(instance) { +var _t = instance.web._t; /** * Intersperses ``separator`` in ``str`` at the positions indicated by @@ -23,7 +23,7 @@ var _t = openerp.web._t; * @param {String} separator * @returns {String} */ -openerp.web.intersperse = function (str, indices, separator) { +instance.web.intersperse = function (str, indices, separator) { separator = separator || ''; var result = [], last = str.length; @@ -55,10 +55,10 @@ openerp.web.intersperse = function (str, indices, separator) { * @param {String} num * @returns {String} */ -openerp.web.insert_thousand_seps = function (num) { +instance.web.insert_thousand_seps = function (num) { var negative = num[0] === '-'; num = (negative ? num.slice(1) : num); - return (negative ? '-' : '') + openerp.web.intersperse( + return (negative ? '-' : '') + instance.web.intersperse( num, _t.database.parameters.grouping, _t.database.parameters.thousands_sep); }; @@ -69,7 +69,7 @@ openerp.web.insert_thousand_seps = function (num) { * * @param {String} value original format */ -openerp.web.strip_raw_chars = function (value) { +instance.web.strip_raw_chars = function (value) { var isletter = /[a-zA-Z]/, output = []; for(var index=0; index < value.length; ++index) { var character = value[index]; @@ -81,7 +81,7 @@ openerp.web.strip_raw_chars = function (value) { return output.join(''); }; var normalize_format = function (format) { - return Date.normalizeFormat(openerp.web.strip_raw_chars(format)); + return Date.normalizeFormat(instance.web.strip_raw_chars(format)); }; /** * Formats a single atomic value based on a field descriptor @@ -93,7 +93,7 @@ var normalize_format = function (format) { * @param {Object} [descriptor.digits] used for the formatting of floats * @param {String} [value_if_empty=''] returned if the ``value`` argument is considered empty */ -openerp.web.format_value = function (value, descriptor, value_if_empty) { +instance.web.format_value = function (value, descriptor, value_if_empty) { // If NaN value, display as with a `false` (empty cell) if (typeof value === 'number' && isNaN(value)) { value = false; @@ -115,12 +115,12 @@ openerp.web.format_value = function (value, descriptor, value_if_empty) { case 'id': return value.toString(); case 'integer': - return openerp.web.insert_thousand_seps( + return instance.web.insert_thousand_seps( _.str.sprintf('%d', value)); case 'float': var precision = descriptor.digits ? descriptor.digits[1] : 2; var formatted = _.str.sprintf('%.' + precision + 'f', value).split('.'); - formatted[0] = openerp.web.insert_thousand_seps(formatted[0]); + formatted[0] = instance.web.insert_thousand_seps(formatted[0]); return formatted.join(l10n.decimal_point); case 'float_time': var pattern = '%02d:%02d'; @@ -136,17 +136,17 @@ openerp.web.format_value = function (value, descriptor, value_if_empty) { return value[1]; case 'datetime': if (typeof(value) == "string") - value = openerp.web.auto_str_to_date(value); + value = instance.web.auto_str_to_date(value); return value.toString(normalize_format(l10n.date_format) + ' ' + normalize_format(l10n.time_format)); case 'date': if (typeof(value) == "string") - value = openerp.web.auto_str_to_date(value); + value = instance.web.auto_str_to_date(value); return value.toString(normalize_format(l10n.date_format)); case 'time': if (typeof(value) == "string") - value = openerp.web.auto_str_to_date(value); + value = instance.web.auto_str_to_date(value); return value.toString(normalize_format(l10n.time_format)); case 'selection': case 'statusbar': // Each choice is [value, label] @@ -163,7 +163,7 @@ openerp.web.format_value = function (value, descriptor, value_if_empty) { } }; -openerp.web.parse_value = function (value, descriptor, value_if_empty) { +instance.web.parse_value = function (value, descriptor, value_if_empty) { var date_pattern = normalize_format(_t.database.parameters.date_format), time_pattern = normalize_format(_t.database.parameters.time_format); switch (value) { @@ -176,7 +176,7 @@ openerp.web.parse_value = function (value, descriptor, value_if_empty) { var tmp; do { tmp = value; - value = value.replace(openerp.web._t.database.parameters.thousands_sep, ""); + value = value.replace(instance.web._t.database.parameters.thousands_sep, ""); } while(tmp !== value); tmp = Number(value); if (isNaN(tmp)) @@ -190,9 +190,9 @@ openerp.web.parse_value = function (value, descriptor, value_if_empty) { var tmp2 = value; do { tmp = tmp2; - tmp2 = tmp.replace(openerp.web._t.database.parameters.thousands_sep, ""); + tmp2 = tmp.replace(instance.web._t.database.parameters.thousands_sep, ""); } while(tmp !== tmp2); - var reformatted_value = tmp.replace(openerp.web._t.database.parameters.decimal_point, "."); + var reformatted_value = tmp.replace(instance.web._t.database.parameters.decimal_point, "."); var parsed = Number(reformatted_value); if (isNaN(parsed)) throw new Error(value + " is not a correct float"); @@ -205,62 +205,62 @@ openerp.web.parse_value = function (value, descriptor, value_if_empty) { } var float_time_pair = value.split(":"); if (float_time_pair.length != 2) - return factor * openerp.web.parse_value(value, {type: "float"}); - var hours = openerp.web.parse_value(float_time_pair[0], {type: "integer"}); - var minutes = openerp.web.parse_value(float_time_pair[1], {type: "integer"}); + return factor * instance.web.parse_value(value, {type: "float"}); + var hours = instance.web.parse_value(float_time_pair[0], {type: "integer"}); + var minutes = instance.web.parse_value(float_time_pair[1], {type: "integer"}); return factor * (hours + (minutes / 60)); case 'progressbar': - return openerp.web.parse_value(value, {type: "float"}); + return instance.web.parse_value(value, {type: "float"}); case 'datetime': var datetime = Date.parseExact( value, (date_pattern + ' ' + time_pattern)); if (datetime !== null) - return openerp.web.datetime_to_str(datetime); + return instance.web.datetime_to_str(datetime); datetime = Date.parse(value); if (datetime !== null) - return openerp.web.datetime_to_str(datetime); + return instance.web.datetime_to_str(datetime); throw new Error(value + " is not a valid datetime"); case 'date': var date = Date.parseExact(value, date_pattern); if (date !== null) - return openerp.web.date_to_str(date); + return instance.web.date_to_str(date); date = Date.parse(value); if (date !== null) - return openerp.web.date_to_str(date); + return instance.web.date_to_str(date); throw new Error(value + " is not a valid date"); case 'time': var time = Date.parseExact(value, time_pattern); if (time !== null) - return openerp.web.time_to_str(time); + return instance.web.time_to_str(time); time = Date.parse(value); if (time !== null) - return openerp.web.time_to_str(time); + return instance.web.time_to_str(time); throw new Error(value + " is not a valid time"); } return value; }; -openerp.web.auto_str_to_date = function(value, type) { +instance.web.auto_str_to_date = function(value, type) { try { - return openerp.web.str_to_datetime(value); + return instance.web.str_to_datetime(value); } catch(e) {} try { - return openerp.web.str_to_date(value); + return instance.web.str_to_date(value); } catch(e) {} try { - return openerp.web.str_to_time(value); + return instance.web.str_to_time(value); } catch(e) {} throw new Error("'" + value + "' is not a valid date, datetime nor time"); }; -openerp.web.auto_date_to_str = function(value, type) { +instance.web.auto_date_to_str = function(value, type) { switch(type) { case 'datetime': - return openerp.web.datetime_to_str(value); + return instance.web.datetime_to_str(value); case 'date': - return openerp.web.date_to_str(value); + return instance.web.date_to_str(value); case 'time': - return openerp.web.time_to_str(value); + return instance.web.time_to_str(value); default: throw new Error(type + " is not convertible to date, datetime nor time"); } @@ -290,7 +290,7 @@ openerp.web.auto_date_to_str = function(value, type) { * @param {Number} [options.id] current record's id * */ -openerp.web.format_cell = function (row_data, column, options) { +instance.web.format_cell = function (row_data, column, options) { options = options || {}; var attrs = {}; if (options.process_modifiers !== false) { @@ -303,9 +303,9 @@ openerp.web.format_cell = function (row_data, column, options) { '<img src="<%-prefix%>/web/static/src/img/icons/<%-icon%>.png" alt="<%-alt%>"/>' + '</button>', { title: column.string || '', - additional_attributes: isNaN(row_data["id"].value) && openerp.web.BufferedDataSet.virtual_id_regex.test(row_data["id"].value) ? + additional_attributes: isNaN(row_data["id"].value) && instance.web.BufferedDataSet.virtual_id_regex.test(row_data["id"].value) ? 'disabled="disabled" class="oe-listview-button-disabled"' : '', - prefix: openerp.connection.prefix, + prefix: instance.connection.prefix, icon: column.icon, alt: column.string || '' }); @@ -320,11 +320,11 @@ openerp.web.format_cell = function (row_data, column, options) { row_data[column.id].value ? 'checked="checked"' : ''); case "binary": var text = _t("Download"), - download_url = _.str.sprintf('/web/binary/saveas?session_id=%s&model=%s&field=%s&id=%d', openerp.connection.session_id, options.model, column.id, options.id); + download_url = _.str.sprintf('/web/binary/saveas?session_id=%s&model=%s&field=%s&id=%d', instance.connection.session_id, options.model, column.id, options.id); if (column.filename) { download_url += '&filename_field=' + column.filename; if (row_data[column.filename]) { - text = _.str.sprintf(_t("Download \"%s\""), openerp.web.format_value( + text = _.str.sprintf(_t("Download \"%s\""), instance.web.format_value( row_data[column.filename].value, {type: 'char'})); } } @@ -340,7 +340,7 @@ openerp.web.format_cell = function (row_data, column, options) { }); } - return _.escape(openerp.web.format_value( + return _.escape(instance.web.format_value( row_data[column.id].value, column, options.value_if_empty)); } diff --git a/addons/web/static/src/js/search.js b/addons/web/static/src/js/search.js index 6e1026b48a1..18ac6b78de5 100644 --- a/addons/web/static/src/js/search.js +++ b/addons/web/static/src/js/search.js @@ -1,7 +1,7 @@ -openerp.web.search = function(openerp) { -var QWeb = openerp.web.qweb, - _t = openerp.web._t, - _lt = openerp.web._lt; +openerp.web.search = function(instance) { +var QWeb = instance.web.qweb, + _t = instance.web._t, + _lt = instance.web._lt; _.mixin({ sum: function (obj) { return _.reduce(obj, function (a, b) { return a + b; }, 0); } }); @@ -70,11 +70,11 @@ _.extend(VS.model.SearchFacet.prototype, { } }); -openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.SearchView# */{ +instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.SearchView# */{ template: "SearchView", /** - * @constructs openerp.web.SearchView - * @extends openerp.web.OldWidget + * @constructs instance.web.SearchView + * @extends instance.web.OldWidget * * @param parent * @param element_id @@ -178,7 +178,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search var running_count = 0; // get total filters count - var is_group = function (i) { return i instanceof openerp.web.search.FilterGroup; }; + var is_group = function (i) { return i instanceof instance.web.search.FilterGroup; }; var filters_count = _(this.controls).chain() .flatten() .filter(is_group) @@ -212,12 +212,12 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search name: _t("Custom Filters"), filters: _.map(this.custom_filters, function (filter) { // FIXME: handling of ``disabled`` being set - var f = new openerp.web.search.Filter({attrs: { + var f = new instance.web.search.Filter({attrs: { string: filter.name, context: filter.context, domain: filter.domain }}, self); - return new openerp.web.search.FilterGroup([f], self); + return new instance.web.search.FilterGroup([f], self); }), length: 3 }); @@ -225,7 +225,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search return $.when( this.render_column(col1, $('<div>').appendTo($filters)), this.render_column(col2, $('<div>').appendTo($filters)), - (new openerp.web.search.Advanced(this).appendTo($drawer))); + (new instance.web.search.Advanced(this).appendTo($drawer))); }, render_column: function (column, $el) { return $.when.apply(null, _(column).map(function (group) { @@ -314,10 +314,10 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search * @param {VS.model.SearchFacet} options.model facet object to render */ make_visualsearch_facet: function (options) { - return new openerp.web.search.FilterGroupFacet(options); + return new instance.web.search.FilterGroupFacet(options); -// if (options.model.get('field') instanceof openerp.web.search.FilterGroup) { -// return new openerp.web.search.FilterGroupFacet(options); +// if (options.model.get('field') instanceof instance.web.search.FilterGroup) { +// return new instance.web.search.FilterGroupFacet(options); // } // return new VS.ui.SearchFacet(options); }, @@ -363,7 +363,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search var filters = []; _.each(items, function (item) { if (filters.length && item.tag !== 'filter') { - group.push(new openerp.web.search.FilterGroup(filters, this)); + group.push(new instance.web.search.FilterGroup(filters, this)); filters = []; } @@ -371,7 +371,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search case 'separator': case 'newline': break; case 'filter': - filters.push(new openerp.web.search.Filter(item, this)); + filters.push(new instance.web.search.Filter(item, this)); break; case 'group': self.make_widgets(item.children, fields, item.attrs.string); @@ -385,7 +385,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search }, this); if (filters.length) { - group.push(new openerp.web.search.FilterGroup(filters, this)); + group.push(new instance.web.search.FilterGroup(filters, this)); } }, /** @@ -394,10 +394,10 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search * * @param {Object} item fields_view_get node for the field * @param {Object} field fields_get result for the field - * @returns openerp.web.search.Field + * @returns instance.web.search.Field */ make_field: function (item, field) { - var obj = openerp.web.search.fields.get_any( [item.attrs.widget, field.type]); + var obj = instance.web.search.fields.get_any( [item.attrs.widget, field.type]); if(obj) { return new (obj) (item, field, this); } else { @@ -460,11 +460,11 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search break; case 'save_filter': var data = this.build_search_data(); - var context = new openerp.web.CompoundContext(); + var context = new instance.web.CompoundContext(); _.each(data.contexts, function(x) { context.add(x); }); - var domain = new openerp.web.CompoundDomain(); + var domain = new instance.web.CompoundDomain(); _.each(data.domains, function(x) { domain.add(x); }); @@ -472,7 +472,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search context.add({"group_by": groupbys}); var dial_html = QWeb.render("SearchView.managed-filters.add"); var $dial = $(dial_html); - openerp.web.dialog($dial, { + instance.web.dialog($dial, { modal: true, title: _t("Filter Entry"), buttons: [ @@ -525,13 +525,13 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search on_add_to_dashboard: function() { this.$element.find(".oe_search-view-filters-management")[0].selectedIndex = 0; var self = this, - menu = openerp.webclient.menu, + menu = instance.webclient.menu, $dialog = $(QWeb.render("SearchView.add_to_dashboard", { dashboards : menu.data.data.children, selected_menu_id : menu.$element.find('a.active').data('menu') })); $dialog.find('input').val(this.fields_view.name); - openerp.web.dialog($dialog, { + instance.web.dialog($dialog, { modal: true, title: _t("Add to Dashboard"), buttons: [ @@ -543,8 +543,8 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search var menu_id = $(this).find("select").val(), title = $(this).find("input").val(), data = self.build_search_data(), - context = new openerp.web.CompoundContext(), - domain = new openerp.web.CompoundDomain(); + context = new instance.web.CompoundContext(), + domain = new instance.web.CompoundDomain(); _.each(data.contexts, function(x) { context.add(x); }); @@ -573,10 +573,10 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search * Performs the search view collection of widget data. * * If the collection went well (all fields are valid), then triggers - * :js:func:`openerp.web.SearchView.on_search`. + * :js:func:`instance.web.SearchView.on_search`. * * If at least one field failed its validation, triggers - * :js:func:`openerp.web.SearchView.on_invalid` instead. + * :js:func:`instance.web.SearchView.on_invalid` instead. * * @param e jQuery event object coming from the "Search" button */ @@ -599,7 +599,7 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search groupbys.push.apply(groupbys, group_by); } } catch (e) { - if (e instanceof openerp.web.search.Invalid) { + if (e instanceof instance.web.search.Invalid) { errors.push(e); } else { throw e; @@ -648,9 +648,9 @@ openerp.web.SearchView = openerp.web.Widget.extend(/** @lends openerp.web.Search }); /** @namespace */ -openerp.web.search = {}; +instance.web.search = {}; -openerp.web.search.FilterGroupFacet = VS.ui.SearchFacet.extend({ +instance.web.search.FilterGroupFacet = VS.ui.SearchFacet.extend({ events: _.extend({ 'click': 'selectFacet' }, VS.ui.SearchFacet.prototype.events), @@ -682,30 +682,30 @@ openerp.web.search.FilterGroupFacet = VS.ui.SearchFacet.extend({ } }); /** - * Registry of search fields, called by :js:class:`openerp.web.SearchView` to + * Registry of search fields, called by :js:class:`instance.web.SearchView` to * find and instantiate its field widgets. */ -openerp.web.search.fields = new openerp.web.Registry({ - 'char': 'openerp.web.search.CharField', - 'text': 'openerp.web.search.CharField', - 'boolean': 'openerp.web.search.BooleanField', - 'integer': 'openerp.web.search.IntegerField', - 'id': 'openerp.web.search.IntegerField', - 'float': 'openerp.web.search.FloatField', - 'selection': 'openerp.web.search.SelectionField', - 'datetime': 'openerp.web.search.DateTimeField', - 'date': 'openerp.web.search.DateField', - 'many2one': 'openerp.web.search.ManyToOneField', - 'many2many': 'openerp.web.search.CharField', - 'one2many': 'openerp.web.search.CharField' +instance.web.search.fields = new instance.web.Registry({ + 'char': 'instance.web.search.CharField', + 'text': 'instance.web.search.CharField', + 'boolean': 'instance.web.search.BooleanField', + 'integer': 'instance.web.search.IntegerField', + 'id': 'instance.web.search.IntegerField', + 'float': 'instance.web.search.FloatField', + 'selection': 'instance.web.search.SelectionField', + 'datetime': 'instance.web.search.DateTimeField', + 'date': 'instance.web.search.DateField', + 'many2one': 'instance.web.search.ManyToOneField', + 'many2many': 'instance.web.search.CharField', + 'one2many': 'instance.web.search.CharField' }); -openerp.web.search.Invalid = openerp.web.Class.extend( /** @lends openerp.web.search.Invalid# */{ +instance.web.search.Invalid = instance.web.Class.extend( /** @lends instance.web.search.Invalid# */{ /** * Exception thrown by search widgets when they hold invalid values, * which they can not return when asked. * - * @constructs openerp.web.search.Invalid - * @extends openerp.web.Class + * @constructs instance.web.search.Invalid + * @extends instance.web.Class * * @param field the name of the field holding an invalid value * @param value the invalid value @@ -723,13 +723,13 @@ openerp.web.search.Invalid = openerp.web.Class.extend( /** @lends openerp.web.se ); } }); -openerp.web.search.Widget = openerp.web.OldWidget.extend( /** @lends openerp.web.search.Widget# */{ +instance.web.search.Widget = instance.web.OldWidget.extend( /** @lends instance.web.search.Widget# */{ template: null, /** * Root class of all search widgets * - * @constructs openerp.web.search.Widget - * @extends openerp.web.OldWidget + * @constructs instance.web.search.Widget + * @extends instance.web.OldWidget * * @param view the ancestor view of this widget */ @@ -738,14 +738,14 @@ openerp.web.search.Widget = openerp.web.OldWidget.extend( /** @lends openerp.web this.view = view; } }); -openerp.web.search.add_expand_listener = function($root) { +instance.web.search.add_expand_listener = function($root) { $root.find('a.searchview_group_string').click(function (e) { $root.toggleClass('folded expanded'); e.stopPropagation(); e.preventDefault(); }); }; -openerp.web.search.Group = openerp.web.search.Widget.extend({ +instance.web.search.Group = instance.web.search.Widget.extend({ template: 'SearchView.group', init: function (view_section, view, fields) { this._super(view); @@ -755,10 +755,10 @@ openerp.web.search.Group = openerp.web.search.Widget.extend({ } }); -openerp.web.search.Input = openerp.web.search.Widget.extend( /** @lends openerp.web.search.Input# */{ +instance.web.search.Input = instance.web.search.Widget.extend( /** @lends instance.web.search.Input# */{ /** - * @constructs openerp.web.search.Input - * @extends openerp.web.search.Widget + * @constructs instance.web.search.Input + * @extends instance.web.search.Widget * * @param view */ @@ -784,7 +784,7 @@ openerp.web.search.Input = openerp.web.search.Widget.extend( /** @lends openerp. * they apply to this widget, or null if they don't. * * This default implementation will try calling - * :js:func:`openerp.web.search.Input#facet_for` if the widget's name + * :js:func:`instance.web.search.Input#facet_for` if the widget's name * matches the input key * * @param {Object} defaults @@ -820,17 +820,17 @@ openerp.web.search.Input = openerp.web.search.Widget.extend( /** @lends openerp. this.attrs = attrs; } }); -openerp.web.search.FilterGroup = openerp.web.search.Input.extend(/** @lends openerp.web.search.FilterGroup# */{ +instance.web.search.FilterGroup = instance.web.search.Input.extend(/** @lends instance.web.search.FilterGroup# */{ template: 'SearchView.filters', /** * Inclusive group of filters, creates a continuous "button" with clickable * sections (the normal display for filters is to be a self-contained button) * - * @constructs openerp.web.search.FilterGroup - * @extends openerp.web.search.Input + * @constructs instance.web.search.FilterGroup + * @extends instance.web.search.Input * - * @param {Array<openerp.web.search.Filter>} filters elements of the group - * @param {openerp.web.SearchView} view view in which the filters are contained + * @param {Array<instance.web.search.Filter>} filters elements of the group + * @param {instance.web.SearchView} view view in which the filters are contained */ init: function (filters, view) { this._super(view); @@ -868,7 +868,7 @@ openerp.web.search.FilterGroup = openerp.web.search.Input.extend(/** @lends open if (!contexts.length) { return; } if (contexts.length === 1) { return contexts[0]; } - return _.extend(new openerp.web.CompoundContext, { + return _.extend(new instance.web.CompoundContext, { __contexts: contexts }); }, @@ -901,7 +901,7 @@ openerp.web.search.FilterGroup = openerp.web.search.Input.extend(/** @lends open for (var i=domains.length; --i;) { domains.unshift(['|']); } - return _.extend(new openerp.web.CompoundDomain(), { + return _.extend(new instance.web.CompoundDomain(), { __domains: domains }); }, @@ -945,7 +945,7 @@ openerp.web.search.FilterGroup = openerp.web.search.Input.extend(/** @lends open }); } }); -openerp.web.search.Filter = openerp.web.search.Input.extend(/** @lends openerp.web.search.Filter# */{ +instance.web.search.Filter = instance.web.search.Input.extend(/** @lends instance.web.search.Filter# */{ template: 'SearchView.filter', /** * Implementation of the OpenERP filters (button with a context and/or @@ -955,8 +955,8 @@ openerp.web.search.Filter = openerp.web.search.Input.extend(/** @lends openerp.w * domains and contexts, converting between facets and filters) is * performed by the filter group. * - * @constructs openerp.web.search.Filter - * @extends openerp.web.search.Input + * @constructs instance.web.search.Filter + * @extends instance.web.search.Input * * @param node * @param view @@ -969,12 +969,12 @@ openerp.web.search.Filter = openerp.web.search.Input.extend(/** @lends openerp.w get_context: function () { }, get_domain: function () { }, }); -openerp.web.search.Field = openerp.web.search.Input.extend( /** @lends openerp.web.search.Field# */ { +instance.web.search.Field = instance.web.search.Input.extend( /** @lends instance.web.search.Field# */ { template: 'SearchView.field', default_operator: '=', /** - * @constructs openerp.web.search.Field - * @extends openerp.web.search.Input + * @constructs instance.web.search.Field + * @extends instance.web.search.Input * * @param view_section * @param field @@ -1005,7 +1005,7 @@ openerp.web.search.Field = openerp.web.search.Input.extend( /** @lends openerp.w if (!(has_value && context)) { return; } - return new openerp.web.CompoundContext(context) + return new instance.web.CompoundContext(context) .set_eval_context({self: val}); }, get_groupby: function () { }, @@ -1036,7 +1036,7 @@ openerp.web.search.Field = openerp.web.search.Input.extend( /** @lends openerp.w this.attrs.operator || this.default_operator, facet); } - return new openerp.web.CompoundDomain(domain) + return new instance.web.CompoundDomain(domain) .set_eval_context({self: val}); } }); @@ -1048,9 +1048,9 @@ openerp.web.search.Field = openerp.web.search.Input.extend( /** @lends openerp.w * * The Javascript and the HTML values are identical (strings) * * @class - * @extends openerp.web.search.Field + * @extends instance.web.search.Field */ -openerp.web.search.CharField = openerp.web.search.Field.extend( /** @lends openerp.web.search.CharField# */ { +instance.web.search.CharField = instance.web.search.Field.extend( /** @lends instance.web.search.CharField# */ { default_operator: 'ilike', complete: function (value) { if (_.isEmpty(value)) { return $.when(null); } @@ -1066,7 +1066,7 @@ openerp.web.search.CharField = openerp.web.search.Field.extend( /** @lends opene }]); } }); -openerp.web.search.NumberField = openerp.web.search.Field.extend(/** @lends openerp.web.search.NumberField# */{ +instance.web.search.NumberField = instance.web.search.Field.extend(/** @lends instance.web.search.NumberField# */{ get_value: function () { if (!this.$element.val()) { return null; @@ -1075,7 +1075,7 @@ openerp.web.search.NumberField = openerp.web.search.Field.extend(/** @lends open check = Number(this.$element.val()); if (isNaN(val) || val !== check) { this.$element.addClass('error'); - throw new openerp.web.search.Invalid( + throw new instance.web.search.Invalid( this.attrs.name, this.$element.val(), this.error_message); } this.$element.removeClass('error'); @@ -1084,13 +1084,13 @@ openerp.web.search.NumberField = openerp.web.search.Field.extend(/** @lends open }); /** * @class - * @extends openerp.web.search.NumberField + * @extends instance.web.search.NumberField */ -openerp.web.search.IntegerField = openerp.web.search.NumberField.extend(/** @lends openerp.web.search.IntegerField# */{ +instance.web.search.IntegerField = instance.web.search.NumberField.extend(/** @lends instance.web.search.IntegerField# */{ error_message: _t("not a valid integer"), parse: function (value) { try { - return openerp.web.parse_value(value, {'widget': 'integer'}); + return instance.web.parse_value(value, {'widget': 'integer'}); } catch (e) { return NaN; } @@ -1098,13 +1098,13 @@ openerp.web.search.IntegerField = openerp.web.search.NumberField.extend(/** @len }); /** * @class - * @extends openerp.web.search.NumberField + * @extends instance.web.search.NumberField */ -openerp.web.search.FloatField = openerp.web.search.NumberField.extend(/** @lends openerp.web.search.FloatField# */{ +instance.web.search.FloatField = instance.web.search.NumberField.extend(/** @lends instance.web.search.FloatField# */{ error_message: _t("not a valid number"), parse: function (value) { try { - return openerp.web.parse_value(value, {'widget': 'float'}); + return instance.web.parse_value(value, {'widget': 'float'}); } catch (e) { return NaN; } @@ -1112,9 +1112,9 @@ openerp.web.search.FloatField = openerp.web.search.NumberField.extend(/** @lends }); /** * @class - * @extends openerp.web.search.Field + * @extends instance.web.search.Field */ -openerp.web.search.SelectionField = openerp.web.search.Field.extend(/** @lends openerp.web.search.SelectionField# */{ +instance.web.search.SelectionField = instance.web.search.Field.extend(/** @lends instance.web.search.SelectionField# */{ // This implementation is a basic <select> field, but it may have to be // altered to be more in line with the GTK client, which uses a combo box // (~ jquery.autocomplete): @@ -1171,10 +1171,10 @@ openerp.web.search.SelectionField = openerp.web.search.Field.extend(/** @lends o return facet.get('json'); } }); -openerp.web.search.BooleanField = openerp.web.search.SelectionField.extend(/** @lends openerp.web.search.BooleanField# */{ +instance.web.search.BooleanField = instance.web.search.SelectionField.extend(/** @lends instance.web.search.BooleanField# */{ /** - * @constructs openerp.web.search.BooleanField - * @extends openerp.web.search.BooleanField + * @constructs instance.web.search.BooleanField + * @extends instance.web.search.BooleanField */ init: function () { this._super.apply(this, arguments); @@ -1193,16 +1193,16 @@ openerp.web.search.BooleanField = openerp.web.search.SelectionField.extend(/** @ }); /** * @class - * @extends openerp.web.search.DateField + * @extends instance.web.search.DateField */ -openerp.web.search.DateField = openerp.web.search.Field.extend(/** @lends openerp.web.search.DateField# */{ +instance.web.search.DateField = instance.web.search.Field.extend(/** @lends instance.web.search.DateField# */{ get_value: function (facet) { - return openerp.web.date_to_str(facet.get('json')); + return instance.web.date_to_str(facet.get('json')); }, complete: function (needle) { var d = Date.parse(needle); if (!d) { return $.when(null); } - var value = openerp.web.format_value(d, this.attrs); + var value = instance.web.format_value(d, this.attrs); var label = _.str.sprintf(_.str.escapeHTML( _t("Search %(field)s at: %(value)s")), { field: '<em>' + this.attrs.string + '</em>', @@ -1225,17 +1225,17 @@ openerp.web.search.DateField = openerp.web.search.Field.extend(/** @lends opener * spanning the whole day selected by the date widget * * @class - * @extends openerp.web.DateField + * @extends instance.web.DateField */ -openerp.web.search.DateTimeField = openerp.web.search.DateField.extend(/** @lends openerp.web.search.DateTimeField# */{ +instance.web.search.DateTimeField = instance.web.search.DateField.extend(/** @lends instance.web.search.DateTimeField# */{ get_value: function (facet) { - return openerp.web.datetime_to_str(facet.get('json')); + return instance.web.datetime_to_str(facet.get('json')); } }); -openerp.web.search.ManyToOneField = openerp.web.search.CharField.extend({ +instance.web.search.ManyToOneField = instance.web.search.CharField.extend({ init: function (view_section, field, view) { this._super(view_section, field, view); - this.model = new openerp.web.Model(this.attrs.relation); + this.model = new instance.web.Model(this.attrs.relation); }, complete: function (needle) { var self = this; @@ -1289,7 +1289,7 @@ openerp.web.search.ManyToOneField = openerp.web.search.CharField.extend({ } }); -openerp.web.search.Advanced = openerp.web.search.Input.extend({ +instance.web.search.Advanced = instance.web.search.Input.extend({ template: 'SearchView.advanced', start: function () { var self = this; @@ -1314,7 +1314,7 @@ openerp.web.search.Advanced = openerp.web.search.Input.extend({ }); }, append_proposition: function () { - return (new openerp.web.search.ExtendedSearchProposition(this, this.fields)) + return (new instance.web.search.ExtendedSearchProposition(this, this.fields)) .appendTo(this.$element.find('ul')); }, commit_search: function () { @@ -1323,14 +1323,14 @@ openerp.web.search.Advanced = openerp.web.search.Input.extend({ var children = this.getChildren(), domain = _.invoke(children, 'get_proposition'); var filters = _(domain).map(function (section) { - return new openerp.web.search.Filter({attrs: { + return new instance.web.search.Filter({attrs: { string: _.str.sprintf('%s(%s)%s', section[0], section[1], section[2]), domain: [section] }}, self.view); }); // Create Filter (& FilterGroup around it) with that domain - var f = new openerp.web.search.FilterGroup(filters, this.view); + var f = new instance.web.search.FilterGroup(filters, this.view); // add group to query this.view.vs.searchQuery.add({ category: _t("Advanced"), @@ -1349,11 +1349,11 @@ openerp.web.search.Advanced = openerp.web.search.Input.extend({ } }); -openerp.web.search.ExtendedSearchProposition = openerp.web.OldWidget.extend(/** @lends openerp.web.search.ExtendedSearchProposition# */{ +instance.web.search.ExtendedSearchProposition = instance.web.OldWidget.extend(/** @lends instance.web.search.ExtendedSearchProposition# */{ template: 'SearchView.extended_search.proposition', /** - * @constructs openerp.web.search.ExtendedSearchProposition - * @extends openerp.web.OldWidget + * @constructs instance.web.search.ExtendedSearchProposition + * @extends instance.web.OldWidget * * @param parent * @param fields @@ -1401,10 +1401,10 @@ openerp.web.search.ExtendedSearchProposition = openerp.web.OldWidget.extend(/** } var type = field.type; - var obj = openerp.web.search.custom_filters.get_object(type); + var obj = instance.web.search.custom_filters.get_object(type); if(obj === null) { console.log('Unknow field type ' + e.key); - obj = openerp.web.search.custom_filters.get_object("char"); + obj = instance.web.search.custom_filters.get_object("char"); } this.value = new (obj) (this); if(this.value.set_field) { @@ -1430,12 +1430,12 @@ openerp.web.search.ExtendedSearchProposition = openerp.web.OldWidget.extend(/** } }); -openerp.web.search.ExtendedSearchProposition.Field = openerp.web.OldWidget.extend({ +instance.web.search.ExtendedSearchProposition.Field = instance.web.OldWidget.extend({ start: function () { this.$element = $("#" + this.element_id); } }); -openerp.web.search.ExtendedSearchProposition.Char = openerp.web.search.ExtendedSearchProposition.Field.extend({ +instance.web.search.ExtendedSearchProposition.Char = instance.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.char', operators: [ {value: "ilike", text: _lt("contains")}, @@ -1447,7 +1447,7 @@ openerp.web.search.ExtendedSearchProposition.Char = openerp.web.search.ExtendedS return this.$element.val(); } }); -openerp.web.search.ExtendedSearchProposition.DateTime = openerp.web.search.ExtendedSearchProposition.Field.extend({ +instance.web.search.ExtendedSearchProposition.DateTime = instance.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.empty', operators: [ {value: "=", text: _lt("is equal to")}, @@ -1462,11 +1462,11 @@ openerp.web.search.ExtendedSearchProposition.DateTime = openerp.web.search.Exten }, start: function() { this._super(); - this.datewidget = new openerp.web.DateTimeWidget(this); + this.datewidget = new instance.web.DateTimeWidget(this); this.datewidget.prependTo(this.$element); } }); -openerp.web.search.ExtendedSearchProposition.Date = openerp.web.search.ExtendedSearchProposition.Field.extend({ +instance.web.search.ExtendedSearchProposition.Date = instance.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.empty', operators: [ {value: "=", text: _lt("is equal to")}, @@ -1481,11 +1481,11 @@ openerp.web.search.ExtendedSearchProposition.Date = openerp.web.search.ExtendedS }, start: function() { this._super(); - this.datewidget = new openerp.web.DateWidget(this); + this.datewidget = new instance.web.DateWidget(this); this.datewidget.prependTo(this.$element); } }); -openerp.web.search.ExtendedSearchProposition.Integer = openerp.web.search.ExtendedSearchProposition.Field.extend({ +instance.web.search.ExtendedSearchProposition.Integer = instance.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.integer', operators: [ {value: "=", text: _lt("is equal to")}, @@ -1497,16 +1497,16 @@ openerp.web.search.ExtendedSearchProposition.Integer = openerp.web.search.Extend ], get_value: function() { try { - return openerp.web.parse_value(this.$element.val(), {'widget': 'integer'}); + return instance.web.parse_value(this.$element.val(), {'widget': 'integer'}); } catch (e) { return ""; } } }); -openerp.web.search.ExtendedSearchProposition.Id = openerp.web.search.ExtendedSearchProposition.Integer.extend({ +instance.web.search.ExtendedSearchProposition.Id = instance.web.search.ExtendedSearchProposition.Integer.extend({ operators: [{value: "=", text: _lt("is")}] }); -openerp.web.search.ExtendedSearchProposition.Float = openerp.web.search.ExtendedSearchProposition.Field.extend({ +instance.web.search.ExtendedSearchProposition.Float = instance.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.float', operators: [ {value: "=", text: _lt("is equal to")}, @@ -1518,13 +1518,13 @@ openerp.web.search.ExtendedSearchProposition.Float = openerp.web.search.Extended ], get_value: function() { try { - return openerp.web.parse_value(this.$element.val(), {'widget': 'float'}); + return instance.web.parse_value(this.$element.val(), {'widget': 'float'}); } catch (e) { return ""; } } }); -openerp.web.search.ExtendedSearchProposition.Selection = openerp.web.search.ExtendedSearchProposition.Field.extend({ +instance.web.search.ExtendedSearchProposition.Selection = instance.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.selection', operators: [ {value: "=", text: _lt("is")}, @@ -1537,7 +1537,7 @@ openerp.web.search.ExtendedSearchProposition.Selection = openerp.web.search.Exte return this.$element.val(); } }); -openerp.web.search.ExtendedSearchProposition.Boolean = openerp.web.search.ExtendedSearchProposition.Field.extend({ +instance.web.search.ExtendedSearchProposition.Boolean = instance.web.search.ExtendedSearchProposition.Field.extend({ template: 'SearchView.extended_search.proposition.boolean', operators: [ {value: "=", text: _lt("is true")}, @@ -1548,21 +1548,21 @@ openerp.web.search.ExtendedSearchProposition.Boolean = openerp.web.search.Extend } }); -openerp.web.search.custom_filters = new openerp.web.Registry({ - 'char': 'openerp.web.search.ExtendedSearchProposition.Char', - 'text': 'openerp.web.search.ExtendedSearchProposition.Char', - 'one2many': 'openerp.web.search.ExtendedSearchProposition.Char', - 'many2one': 'openerp.web.search.ExtendedSearchProposition.Char', - 'many2many': 'openerp.web.search.ExtendedSearchProposition.Char', +instance.web.search.custom_filters = new instance.web.Registry({ + 'char': 'instance.web.search.ExtendedSearchProposition.Char', + 'text': 'instance.web.search.ExtendedSearchProposition.Char', + 'one2many': 'instance.web.search.ExtendedSearchProposition.Char', + 'many2one': 'instance.web.search.ExtendedSearchProposition.Char', + 'many2many': 'instance.web.search.ExtendedSearchProposition.Char', - 'datetime': 'openerp.web.search.ExtendedSearchProposition.DateTime', - 'date': 'openerp.web.search.ExtendedSearchProposition.Date', - 'integer': 'openerp.web.search.ExtendedSearchProposition.Integer', - 'float': 'openerp.web.search.ExtendedSearchProposition.Float', - 'boolean': 'openerp.web.search.ExtendedSearchProposition.Boolean', - 'selection': 'openerp.web.search.ExtendedSearchProposition.Selection', + 'datetime': 'instance.web.search.ExtendedSearchProposition.DateTime', + 'date': 'instance.web.search.ExtendedSearchProposition.Date', + 'integer': 'instance.web.search.ExtendedSearchProposition.Integer', + 'float': 'instance.web.search.ExtendedSearchProposition.Float', + 'boolean': 'instance.web.search.ExtendedSearchProposition.Boolean', + 'selection': 'instance.web.search.ExtendedSearchProposition.Selection', - 'id': 'openerp.web.search.ExtendedSearchProposition.Id' + 'id': 'instance.web.search.ExtendedSearchProposition.Id' }); }; diff --git a/addons/web/static/src/js/view_editor.js b/addons/web/static/src/js/view_editor.js index ae531c8c925..6a14c0ef7f9 100644 --- a/addons/web/static/src/js/view_editor.js +++ b/addons/web/static/src/js/view_editor.js @@ -1,15 +1,15 @@ -openerp.web.view_editor = function(openerp) { -var _t = openerp.web._t; -var QWeb = openerp.web.qweb; -openerp.web.ViewEditor = openerp.web.OldWidget.extend({ +openerp.web.view_editor = function(instance) { +var _t = instance.web._t; +var QWeb = instance.web.qweb; +instance.web.ViewEditor = instance.web.OldWidget.extend({ init: function(parent, element_id, dataset, view, options) { this._super(parent); this.element_id = element_id; this.parent = parent; - this.dataset = new openerp.web.DataSetSearch(this, 'ir.ui.view', null, null), + this.dataset = new instance.web.DataSetSearch(this, 'ir.ui.view', null, null), this.model = dataset.model; this.xml_element_id = 0; - this.property = openerp.web.ViewEditor.property_widget; + this.property = instance.web.ViewEditor.property_widget; this.one_object = false; }, start: function() { @@ -39,7 +39,7 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ select_view_id: self.parent.fields_view.view_id } }; - this.view_edit_dialog = new openerp.web.Dialog(this, { + this.view_edit_dialog = new instance.web.Dialog(this, { title: action_title, width: 850, buttons: [ @@ -51,7 +51,7 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ }).open(); this.view_edit_dialog.on_close.add_last(function(){window.location.reload();}); this.main_view_id = this.parent.fields_view.view_id; - this.action_manager = new openerp.web.ActionManager(this); + this.action_manager = new instance.web.ActionManager(this); this.action_manager.appendTo(this.view_edit_dialog); $.when(this.action_manager.do_action(action)).then(function() { var viewmanager = self.action_manager.inner_viewmanager, @@ -67,7 +67,7 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ }, on_create_view: function() { var self = this; - this.create_view_dialog = new openerp.web.Dialog(this, { + this.create_view_dialog = new instance.web.Dialog(this, { title: _.str.sprintf(_t("Create a view (%s)"), self.model), buttons: [ {text: _t("Save"), click: function () { @@ -115,8 +115,8 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ }, do_save_view: function(values) { def = $.Deferred(); - var field_dataset = new openerp.web.DataSetSearch(this, this.model, null, null); - var model_dataset = new openerp.web.DataSetSearch(this, 'ir.model', null, null); + var field_dataset = new instance.web.DataSetSearch(this, this.model, null, null); + var model_dataset = new instance.web.DataSetSearch(this, 'ir.model', null, null); var view_string = "", field_name = false, self = this; field_dataset.call( 'fields_get', [], function(fields) { _.each(['name', 'x_name'], function(value) { @@ -360,7 +360,7 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ edit_view: function(one_object) { var self = this; this.one_object = one_object; - this.edit_xml_dialog = new openerp.web.Dialog(this, { + this.edit_xml_dialog = new instance.web.Dialog(this, { title: _.str.sprintf(_t("View Editor %d - %s"), self.main_view_id, self.model), height: '90%', buttons: [ @@ -392,7 +392,7 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ action_buttons: false } }; - var action_manager = new openerp.web.ActionManager(self); + var action_manager = new instance.web.ActionManager(self); action_manager.do_action(action); }}, {text: _t("Close"), click: function(){ @@ -517,7 +517,7 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ var self = this; var tr = self.get_object_by_id(this.one_object.clicked_tr_id, this.one_object['main_object'], [])[0].att_list[0]; var parent_tr = ($(side).prevAll("tr[level=" + String(this.one_object.clicked_tr_level - 1) + "]"))[0]; - var field_dataset = new openerp.web.DataSetSearch(this, this.model, null, null); + var field_dataset = new instance.web.DataSetSearch(this, this.model, null, null); parent_tr = $(parent_tr).find('a').text(); field_dataset.call( 'fields_get', [], function(result) { var fields = _.keys(result); @@ -811,7 +811,7 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ }, on_edit_node: function(properties){ var self = this; - this.edit_node_dialog = new openerp.web.Dialog(this,{ + this.edit_node_dialog = new instance.web.Dialog(this,{ title: _t("Properties"), width: 450, buttons: [ @@ -881,7 +881,7 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ this.edit_widget = []; self.ready = $.when(self.on_groups(properties)).then(function () { _PROPERTIES_ATTRIBUTES['groups']['selection'] = self.groups; - var values = _.keys( openerp.web.form.widgets.map); + var values = _.keys( instance.web.form.widgets.map); values.push(''); values.sort(); _PROPERTIES_ATTRIBUTES['widget']['selection'] = values; @@ -909,8 +909,8 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ def.resolve(); } var group_ids = [], group_names = {}, groups = []; - var res_groups = new openerp.web.DataSetSearch(this,'res.groups', null, null), - model_data = new openerp.web.DataSetSearch(self,'ir.model.data', null, null); + var res_groups = new instance.web.DataSetSearch(this,'res.groups', null, null), + model_data = new instance.web.DataSetSearch(self,'ir.model.data', null, null); res_groups.read_slice([], {}).done(function (res_grp) { _.each(res_grp, function (res) { var key = res.id; @@ -936,7 +936,7 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ {'name': 'field_value','selection': fields, 'value': false, 'string': '','type': 'selection'}, {'name': 'position','selection': ['After','Before','Inside'], 'value': false, 'string': 'Position','type': 'selection'}]; this.add_widget = []; - this.add_node_dialog = new openerp.web.Dialog(this,{ + this.add_node_dialog = new instance.web.Dialog(this,{ title: _t("Properties"), width: 450, buttons: [ @@ -981,7 +981,7 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ }); table_selector.find("td[id^=]").attr("width","100px"); self.add_node_dialog.$element.find('#new_field').click(function() { - model_data = new openerp.web.DataSetSearch(self,'ir.model', null, null); + model_data = new instance.web.DataSetSearch(self,'ir.model', null, null); model_data.read_slice([], {domain: [['model','=', self.model]]}).then(function(result) { self.render_new_field(result[0].id); }); @@ -999,7 +999,7 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ action_buttons: true } }; - var action_manager = new openerp.web.ActionManager(self); + var action_manager = new instance.web.ActionManager(self); $.when(action_manager.do_action(action)).then(function() { var controller = action_manager.dialog_viewmanager.views['form'].controller; controller.on_button_cancel.add_last(function(){ @@ -1016,7 +1016,7 @@ openerp.web.ViewEditor = openerp.web.OldWidget.extend({ }); } }); -openerp.web.ViewEditor.Field = openerp.web.Class.extend({ +instance.web.ViewEditor.Field = instance.web.Class.extend({ init: function(view, widget) { this.$element = view.$element; this.dirty = false; @@ -1042,7 +1042,7 @@ openerp.web.ViewEditor.Field = openerp.web.Class.extend({ validate: function() { this.is_invalid = false; try { - var value = openerp.web.parse_value(this.get_value(), this, ''); + var value = instance.web.parse_value(this.get_value(), this, ''); this.is_invalid = this.required && value === ''; } catch(e) { this.is_invalid = true; @@ -1052,7 +1052,7 @@ openerp.web.ViewEditor.Field = openerp.web.Class.extend({ return _.str.sprintf("<td id = %s>%s</td>", this.name, QWeb.render(this.template, {widget: this})) } }); -openerp.web.ViewEditor.FieldBoolean = openerp.web.ViewEditor.Field.extend({ +instance.web.ViewEditor.FieldBoolean = instance.web.ViewEditor.Field.extend({ template : "vieweditor_boolean", start: function() { var self = this; @@ -1070,7 +1070,7 @@ openerp.web.ViewEditor.FieldBoolean = openerp.web.ViewEditor.Field.extend({ return this.$element.find("input[id=" + this.name + "]").is(':checked')? "1" : null; } }); -openerp.web.ViewEditor.FieldChar = openerp.web.ViewEditor.Field.extend({ +instance.web.ViewEditor.FieldChar = instance.web.ViewEditor.Field.extend({ template : "vieweditor_char", start: function () { var self = this; @@ -1086,7 +1086,7 @@ openerp.web.ViewEditor.FieldChar = openerp.web.ViewEditor.Field.extend({ return this.$element.find("input[id=" + this.name + "]").val(); } }); -openerp.web.ViewEditor.FieldSelect = openerp.web.ViewEditor.Field.extend({ +instance.web.ViewEditor.FieldSelect = instance.web.ViewEditor.Field.extend({ template : "vieweditor_selection", start: function () { var self = this; @@ -1116,7 +1116,7 @@ openerp.web.ViewEditor.FieldSelect = openerp.web.ViewEditor.Field.extend({ return this.$element.find("select[id=" + this.name + "]").val(); } }); -openerp.web.ViewEditor.FieldSelectMulti = openerp.web.ViewEditor.FieldSelect.extend({ +instance.web.ViewEditor.FieldSelectMulti = instance.web.ViewEditor.FieldSelect.extend({ start: function () { this._super(); this.$element.find("select[id=" + this.name + "]").css('height', '100px').attr("multiple", true); @@ -1132,7 +1132,7 @@ openerp.web.ViewEditor.FieldSelectMulti = openerp.web.ViewEditor.FieldSelect.ext }); } }); -openerp.web.ViewEditor.FieldFloat = openerp.web.ViewEditor.FieldChar.extend({ +instance.web.ViewEditor.FieldFloat = instance.web.ViewEditor.FieldChar.extend({ }); var _PROPERTIES = { @@ -1197,11 +1197,11 @@ var _ICONS = ['','STOCK_ABOUT', 'STOCK_ADD', 'STOCK_APPLY', 'STOCK_BOLD', 'terp-sale', 'terp-tools', 'terp-administration', 'terp-hr', 'terp-partner', 'terp-project', 'terp-report', 'terp-stock', 'terp-calendar', 'terp-graph' ]; -openerp.web.ViewEditor.property_widget = new openerp.web.Registry({ - 'boolean' : 'openerp.web.ViewEditor.FieldBoolean', - 'selection_multi' : 'openerp.web.ViewEditor.FieldSelectMulti', - 'selection' : 'openerp.web.ViewEditor.FieldSelect', - 'char' : 'openerp.web.ViewEditor.FieldChar', - 'float' : 'openerp.web.ViewEditor.FieldFloat' +instance.web.ViewEditor.property_widget = new instance.web.Registry({ + 'boolean' : 'instance.web.ViewEditor.FieldBoolean', + 'selection_multi' : 'instance.web.ViewEditor.FieldSelectMulti', + 'selection' : 'instance.web.ViewEditor.FieldSelect', + 'char' : 'instance.web.ViewEditor.FieldChar', + 'float' : 'instance.web.ViewEditor.FieldFloat' }); }; diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index a3f0d82bb63..3f9ef8301fd 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -1,13 +1,13 @@ -openerp.web.form = function (openerp) { -var _t = openerp.web._t, - _lt = openerp.web._lt; -var QWeb = openerp.web.qweb; +openerp.web.form = function (instance) { +var _t = instance.web._t, + _lt = instance.web._lt; +var QWeb = instance.web.qweb; /** @namespace */ -openerp.web.form = {}; +instance.web.form = {}; -openerp.web.views.add('form', 'openerp.web.FormView'); -openerp.web.FormView = openerp.web.View.extend({ +instance.web.views.add('form', 'instance.web.FormView'); +instance.web.FormView = instance.web.View.extend({ /** * Indicates that this view is not searchable, and thus that no search * view should be displayed (if there is one active). @@ -17,17 +17,17 @@ openerp.web.FormView = openerp.web.View.extend({ display_name: _lt('Form'), view_type: "form", /** - * @constructs openerp.web.FormView - * @extends openerp.web.View + * @constructs instance.web.FormView + * @extends instance.web.View * - * @param {openerp.web.Session} session the current openerp session - * @param {openerp.web.DataSet} dataset the dataset this view will work with + * @param {instance.web.Session} session the current openerp session + * @param {instance.web.DataSet} dataset the dataset this view will work with * @param {String} view_id the identifier of the OpenERP view object * @param {Object} options * - sidebar : [true|false] * - resize_textareas : [true|false|max_height] * - * @property {openerp.web.Registry} registry=openerp.web.form.widgets widgets registry for this form view instance + * @property {instance.web.Registry} registry=instance.web.form.widgets widgets registry for this form view instance */ init: function(parent, dataset, view_id, options) { this._super(parent); @@ -41,8 +41,8 @@ openerp.web.FormView = openerp.web.View.extend({ this.datarecord = {}; this.default_focus_field = null; this.default_focus_button = null; - this.fields_registry = openerp.web.form.widgets; - this.tags_registry = openerp.web.form.tags; + this.fields_registry = instance.web.form.widgets; + this.tags_registry = instance.web.form.tags; this.has_been_loaded = $.Deferred(); this.translatable_fields = []; _.defaults(this.options, { @@ -54,7 +54,7 @@ openerp.web.FormView = openerp.web.View.extend({ this.on_change_mutex = new $.Mutex(); this.reload_mutex = new $.Mutex(); this.mode = null; - this.rendering_engine = new openerp.web.form.FormRenderingEngineReadonly(this); + this.rendering_engine = new instance.web.form.FormRenderingEngineReadonly(this); this.qweb = null; // A QWeb instance will be created if the view is a QWeb template }, destroy: function() { @@ -110,9 +110,11 @@ openerp.web.FormView = openerp.web.View.extend({ }); if (!this.sidebar && this.options.sidebar) { - this.sidebar = new openerp.web.Sidebar(this); + this.sidebar = new instance.web.Sidebar(this); this.sidebar.appendTo(this.$sidebar); - this.sidebar.add_toolbar(this.fields_view.toolbar); + if(this.fields_view.toolbar) { + this.sidebar.add_toolbar(this.fields_view.toolbar); + } this.sidebar.add_items('other', [{ label: _t('Set Default'), form: this, @@ -131,7 +133,7 @@ openerp.web.FormView = openerp.web.View.extend({ var child = fvg.arch.children[i]; if (child.tag === "templates") { this.qweb = new QWeb2.Engine(); - this.qweb.add_template(openerp.web.json_node_to_xml(child)); + this.qweb.add_template(instance.web.json_node_to_xml(child)); if (!this.qweb.has_template('form')) { throw new Error("No QWeb template found for form view"); } @@ -144,20 +146,20 @@ openerp.web.FormView = openerp.web.View.extend({ get_fvg_from_qweb: function(record) { var view = this.qweb.render('form', this.get_qweb_context(record)); var fvg = _.clone(this.fields_view); - fvg.arch = openerp.web.xml_to_json(openerp.web.str_to_xml(view).firstChild); + fvg.arch = instance.web.xml_to_json(instance.web.str_to_xml(view).firstChild); return fvg; }, get_qweb_context: function(record) { var self = this, new_record = {}; - _.each(record, function(value, name) { + _.each(record, function(value_, name) { var r = _.clone(self.fields_view.fields[name] || {}); - if ((r.type === 'date' || r.type === 'datetime') && value) { - r.raw_value = openerp.web.auto_str_to_date(value); + if ((r.type === 'date' || r.type === 'datetime') && value_) { + r.raw_value = instance.web.auto_str_to_date(value_); } else { - r.raw_value = value; + r.raw_value = value_; } - r.value = openerp.web.format_value(value, r); + r.value = instance.web.format_value(value_, r); new_record[name] = r; }); return { @@ -337,7 +339,7 @@ openerp.web.FormView = openerp.web.View.extend({ 'None': function () {return null;}, 'context': function (i) { context_index = i; - var ctx = new openerp.web.CompoundContext(self.dataset.get_context(), widget.build_context() ? widget.build_context() : {}); + var ctx = new instance.web.CompoundContext(self.dataset.get_context(), widget.build_context() ? widget.build_context() : {}); return ctx; } }; @@ -355,8 +357,8 @@ openerp.web.FormView = openerp.web.View.extend({ } // form field if (self.fields[field]) { - var value = self.fields[field].get_value(); - return value == null ? false : value; + var value_ = self.fields[field].get_value(); + return value_ == null ? false : value_; } // parent field var splitted = field.split('.'); @@ -419,17 +421,17 @@ openerp.web.FormView = openerp.web.View.extend({ } if (widget.field['change_default']) { - var fieldname = widget.name, value; + var fieldname = widget.name, value_; if (response.value && (fieldname in response.value)) { // Use value from onchange if onchange executed - value = response.value[fieldname]; + value_ = response.value[fieldname]; } else { // otherwise get form value for field - value = self.fields[fieldname].get_value(); + value_ = self.fields[fieldname].get_value(); } - var condition = fieldname + '=' + value; + var condition = fieldname + '=' + value_; - if (value) { + if (value_) { can_process_onchange = self.rpc({ url: '/web/dataset/call', async: false @@ -470,9 +472,9 @@ openerp.web.FormView = openerp.web.View.extend({ var field = this.fields[f]; // If field is not defined in the view, just ignore it if (field) { - var value = result.value[f]; - if (field.get_value() != value) { - field.set_value(value); + var value_ = result.value[f]; + if (field.get_value() != value_) { + field.set_value(value_); field.dirty = true; if (!_.contains(processed, field.name)) { this.do_onchange(field, processed); @@ -483,7 +485,7 @@ openerp.web.FormView = openerp.web.View.extend({ this.on_form_changed(); } if (!_.isEmpty(result.warning)) { - openerp.web.dialog($(QWeb.render("CrashManagerWarning", result.warning)), { + instance.web.dialog($(QWeb.render("CrashManagerWarning", result.warning)), { modal: true, buttons: [ {text: _t("Ok"), click: function() { $(this).dialog("close"); }} @@ -703,7 +705,7 @@ openerp.web.FormView = openerp.web.View.extend({ if (this.sidebar) { this.sidebar.do_attachement_update(this.dataset, this.datarecord.id); } - //openerp.log("The record has been created with id #" + this.datarecord.id); + //instance.log("The record has been created with id #" + this.datarecord.id); this.reload(); return $.when(_.extend(r, {created: true})).then(success); } @@ -729,7 +731,7 @@ openerp.web.FormView = openerp.web.View.extend({ }, get_widgets: function() { return _.filter(this.getChildren(), function(obj) { - return obj instanceof openerp.web.form.Widget; + return obj instanceof instance.web.form.Widget; }); }, get_fields_values: function(blacklist) { @@ -737,10 +739,10 @@ openerp.web.FormView = openerp.web.View.extend({ var values = {}; var ids = this.get_selected_ids(); values["id"] = ids.length > 0 ? ids[0] : false; - _.each(this.fields, function(value, key) { + _.each(this.fields, function(value_, key) { if (_.include(blacklist, key)) return; - var val = value.get_value(); + var val = value_.get_value(); values[key] = val; }); return values; @@ -757,8 +759,8 @@ openerp.web.FormView = openerp.web.View.extend({ }); }, is_dirty: function() { - return _.any(this.fields, function (value) { - return value.is_dirty(); + return _.any(this.fields, function (value_) { + return value_.is_dirty(); }); }, is_interactible_record: function() { @@ -767,7 +769,7 @@ openerp.web.FormView = openerp.web.View.extend({ if (this.options.not_interactible_on_create) return false; } else if (typeof(id) === "string") { - if(openerp.web.BufferedDataSet.virtual_id_regex.test(id)) + if(instance.web.BufferedDataSet.virtual_id_regex.test(id)) return false; } return true; @@ -779,10 +781,10 @@ openerp.web.FormView = openerp.web.View.extend({ var self = this; var fields = _.chain(this.fields) .map(function (field, name) { - var value = field.get_value(); + var value_ = field.get_value(); // ignore fields which are empty, invisible, readonly, o2m // or m2m - if (!value + if (!value_ || field.get('invisible') || field.get("readonly") || field.field.type === 'one2many' @@ -793,20 +795,20 @@ openerp.web.FormView = openerp.web.View.extend({ switch(field.field.type) { case 'selection': displayed = _(field.values).find(function (option) { - return option[0] === value; + return option[0] === value_; })[1]; break; case 'many2one': - displayed = field.value[1] || value; + displayed = value_; break; default: - displayed = value; + displayed = value_; } return { name: name, string: field.node_atts.string, - value: value, + value: value_, displayed: displayed, // convert undefined to false change_default: !!field.field.change_default @@ -819,7 +821,7 @@ openerp.web.FormView = openerp.web.View.extend({ .filter(function (field) { return field.change_default; }) .value(); - var d = new openerp.web.Dialog(this, { + var d = new instance.web.Dialog(this, { title: _t("Set Default"), args: { fields: fields, @@ -836,7 +838,7 @@ openerp.web.FormView = openerp.web.View.extend({ } var condition = d.$element.find('#formview_default_conditions').val(), all_users = d.$element.find('#formview_default_all').is(':checked'); - new openerp.web.DataSet(self, 'ir.values').call( + new instance.web.DataSet(self, 'ir.values').call( 'set_default', [ self.dataset.model, field_to_set, @@ -850,13 +852,26 @@ openerp.web.FormView = openerp.web.View.extend({ }); d.template = 'FormView.set_default'; d.open(); - } + }, + register_field: function(field, name) { + this.fields[name] = field; + this.fields_order.push(name); + if (this.get_field(name).translate) { + this.translatable_fields.push(field); + } + }, + get_field: function(field_name) { + return this.fields_view.fields[field_name]; + }, + is_create_mode: function() { + return !this.datarecord.id; + }, }); /** * Interface to be implemented by rendering engines for the form view. */ -openerp.web.form.FormRenderingEngineInterface = { +instance.web.form.FormRenderingEngineInterface = { set_fields_view: function(fields_view) {}, set_fields_registry: function(fields_registry) {}, render_to: function($element) {}, @@ -867,7 +882,7 @@ openerp.web.form.FormRenderingEngineInterface = { * * It is necessary to set the view using set_view() before usage. */ -openerp.web.form.FormRenderingEngine = openerp.web.Class.extend({ +instance.web.form.FormRenderingEngine = instance.web.Class.extend({ init: function(view) { this.view = view; }, @@ -886,7 +901,7 @@ openerp.web.form.FormRenderingEngine = openerp.web.Class.extend({ // TODO: I know this will save the world and all the kitten for a moment, // but one day, we will have to get rid of xml2json - var xml = openerp.web.json_node_to_xml(this.fvg.arch); + var xml = instance.web.json_node_to_xml(this.fvg.arch); this.$form = $('<div class="oe_form">' + xml + '</div>'); if (this.fvg.arch.attrs && this.fvg.arch.attrs['layout'] !== 'manual') { this.$form.attr('layout', 'auto'); @@ -908,18 +923,19 @@ openerp.web.form.FormRenderingEngine = openerp.web.Class.extend({ if (!obj) { throw new Error("Widget type '"+ key + "' is not implemented"); } - var w = new (obj)(self.view, openerp.web.xml_to_json($elem[0])); + var w = new (obj)(self.view, instance.web.xml_to_json($elem[0])); var $label = self.labels[$elem.attr("name")]; if ($label) { w.set_input_id($label.attr("for")); } self.alter_field(w); + self.view.register_field(w, $elem.attr("name")); w.replace($elem); }); _.each(this.tags_to_init, function($elem) { var tag_name = $elem[0].tagName.toLowerCase(); var obj = self.tags_registry.get_object(tag_name); - var w = new (obj)(self.view, openerp.web.xml_to_json($elem[0])); + var w = new (obj)(self.view, instance.web.xml_to_json($elem[0])); w.replace($elem); }) // TODO: return a deferred @@ -1178,18 +1194,18 @@ openerp.web.form.FormRenderingEngine = openerp.web.Class.extend({ var str_modifiers = $node.attr("modifiers") || "{}" var modifiers = JSON.parse(str_modifiers); if (modifiers.invisible !== undefined) - new openerp.web.form.InvisibilityChanger(this.view, this.view, modifiers.invisible, $new_element); + new instance.web.form.InvisibilityChanger(this.view, this.view, modifiers.invisible, $new_element); $new_element.addClass($node.attr("class") || ""); }, }); -openerp.web.form.FormRenderingEngineReadonly = openerp.web.form.FormRenderingEngine.extend({ +instance.web.form.FormRenderingEngineReadonly = instance.web.form.FormRenderingEngine.extend({ alter_field: function(field) { field.set({"force_readonly": true}); }, }); -openerp.web.form.FormDialog = openerp.web.Dialog.extend({ +instance.web.form.FormDialog = instance.web.Dialog.extend({ init: function(parent, options, view_id, dataset) { this._super(parent, options); this.dataset = dataset; @@ -1198,7 +1214,7 @@ openerp.web.form.FormDialog = openerp.web.Dialog.extend({ }, start: function() { this._super(); - this.form = new openerp.web.FormView(this, this.dataset, this.view_id, { + this.form = new instance.web.FormView(this, this.dataset, this.view_id, { sidebar: false, pager: false }); @@ -1220,7 +1236,7 @@ openerp.web.form.FormDialog = openerp.web.Dialog.extend({ } }); -openerp.web.form.compute_domain = function(expr, fields) { +instance.web.form.compute_domain = function(expr, fields) { var stack = []; for (var i = expr.length - 1; i >= 0; i--) { var ex = expr[i]; @@ -1249,7 +1265,7 @@ openerp.web.form.compute_domain = function(expr, fields) { _t("Unknown field %s in domain %s"), ex[0], JSON.stringify(expr))); } - var field_value = field.get_value ? fields[ex[0]].get_value() : fields[ex[0]].value; + var field_value = field.get_value(); var op = ex[1]; var val = ex[2]; @@ -1296,13 +1312,13 @@ openerp.web.form.compute_domain = function(expr, fields) { * * Apply the result of the "invisible" domain to this.$element. */ -openerp.web.form.InvisibilityChangerMixin = { +instance.web.form.InvisibilityChangerMixin = { init: function(field_manager, invisible_domain) { this._ic_field_manager = field_manager this._ic_invisible_modifier = invisible_domain; this._ic_field_manager.on("view_content_has_changed", this, function() { var result = this._ic_invisible_modifier === undefined ? false : - openerp.web.form.compute_domain(this._ic_invisible_modifier, this._ic_field_manager.fields); + instance.web.form.compute_domain(this._ic_invisible_modifier, this._ic_field_manager.fields); this.set({"invisible": result}); }); this.set({invisible: this._ic_invisible_modifier === true}); @@ -1320,20 +1336,20 @@ openerp.web.form.InvisibilityChangerMixin = { }, }; -openerp.web.form.InvisibilityChanger = openerp.web.Class.extend(_.extend({}, openerp.web.GetterSetterMixin, openerp.web.form.InvisibilityChangerMixin, { +instance.web.form.InvisibilityChanger = instance.web.Class.extend(_.extend({}, instance.web.GetterSetterMixin, instance.web.form.InvisibilityChangerMixin, { init: function(parent, field_manager, invisible_domain, $element) { this.setParent(parent); - openerp.web.GetterSetterMixin.init.call(this); - openerp.web.form.InvisibilityChangerMixin.init.call(this, field_manager, invisible_domain); + instance.web.GetterSetterMixin.init.call(this); + instance.web.form.InvisibilityChangerMixin.init.call(this, field_manager, invisible_domain); this.$element = $element; this.start(); }, })); -openerp.web.form.Widget = openerp.web.Widget.extend(_.extend({}, openerp.web.form.InvisibilityChangerMixin, { +instance.web.form.Widget = instance.web.Widget.extend(_.extend({}, instance.web.form.InvisibilityChangerMixin, { /** - * @constructs openerp.web.form.Widget - * @extends openerp.web.Widget + * @constructs instance.web.form.Widget + * @extends instance.web.Widget * * @param view * @param node @@ -1343,7 +1359,7 @@ openerp.web.form.Widget = openerp.web.Widget.extend(_.extend({}, openerp.web.for this.view = view; this.node = node; this.modifiers = JSON.parse(this.node.attrs.modifiers || '{}'); - openerp.web.form.InvisibilityChangerMixin.init.call(this, view, this.modifiers.invisible); + instance.web.form.InvisibilityChangerMixin.init.call(this, view, this.modifiers.invisible); this.view.on("view_content_has_changed", this, this.process_modifiers); }, @@ -1353,14 +1369,14 @@ openerp.web.form.Widget = openerp.web.Widget.extend(_.extend({}, openerp.web.for }, start: function() { this._super(); - openerp.web.form.InvisibilityChangerMixin.start.call(this); + instance.web.form.InvisibilityChangerMixin.start.call(this); }, destroy: function() { $.fn.tipsy.clear(); this._super.apply(this, arguments); }, process_modifiers: function() { - var compute_domain = openerp.web.form.compute_domain; + var compute_domain = instance.web.form.compute_domain; var to_set = {}; for (var a in this.modifiers) { if (!_.include(["invisible"], a)) { @@ -1385,7 +1401,7 @@ openerp.web.form.Widget = openerp.web.Widget.extend(_.extend({}, openerp.web.for template = 'WidgetLabel.tooltip'; } return QWeb.render(template, { - debug: openerp.connection.debug, + debug: instance.connection.debug, widget: widget })}, gravity: $.fn.tipsy.autoBounds(50, 'nw'), @@ -1412,7 +1428,7 @@ openerp.web.form.Widget = openerp.web.Widget.extend(_.extend({}, openerp.web.for }, _build_eval_context: function(blacklist) { var a_dataset = this.view.dataset; - return new openerp.web.CompoundContext(a_dataset.get_context(), this._build_view_fields_values(blacklist)); + return new instance.web.CompoundContext(a_dataset.get_context(), this._build_view_fields_values(blacklist)); }, /** * Builds a new context usable for operations related to fields by merging @@ -1427,7 +1443,7 @@ openerp.web.form.Widget = openerp.web.Widget.extend(_.extend({}, openerp.web.for if (v_context.__ref || true) { //TODO: remove true var fields_values = this._build_eval_context(blacklist); - v_context = new openerp.web.CompoundContext(v_context).set_eval_context(fields_values); + v_context = new instance.web.CompoundContext(v_context).set_eval_context(fields_values); } return v_context; }, @@ -1438,13 +1454,13 @@ openerp.web.form.Widget = openerp.web.Widget.extend(_.extend({}, openerp.web.for var final_domain = n_domain !== null ? n_domain : f_domain; if (!(final_domain instanceof Array) || true) { //TODO: remove true var fields_values = this._build_eval_context(); - final_domain = new openerp.web.CompoundDomain(final_domain).set_eval_context(fields_values); + final_domain = new instance.web.CompoundDomain(final_domain).set_eval_context(fields_values); } return final_domain; } })); -openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({ +instance.web.form.WidgetButton = instance.web.form.Widget.extend({ template: 'WidgetButton', init: function(view, node) { this._super(view, node); @@ -1458,7 +1474,7 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({ start: function() { this._super.apply(this, arguments); this.$element.click(this.on_click); - if (this.node.attrs.help || openerp.connection.debug) { + if (this.node.attrs.help || instance.connection.debug) { this.do_attach_tooltip(); } }, @@ -1476,7 +1492,7 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({ var exec_action = function() { if (self.node.attrs.confirm) { var def = $.Deferred(); - var dialog = openerp.web.dialog($('<div/>').text(self.node.attrs.confirm), { + var dialog = instance.web.dialog($('<div/>').text(self.node.attrs.confirm), { title: _t('Confirm'), modal: true, buttons: [ @@ -1510,7 +1526,7 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({ var context = this.node.attrs.context; if (context && context.__ref) { - context = new openerp.web.CompoundContext(context); + context = new instance.web.CompoundContext(context); context.set_eval_context(this._build_eval_context()); } @@ -1541,8 +1557,19 @@ openerp.web.form.WidgetButton = openerp.web.form.Widget.extend({ * - view_content_has_changed : when the values of the fields have changed. When * this event is triggered all fields should reprocess their modifiers. */ -openerp.web.form.FieldManagerInterface = { - +instance.web.form.FieldManagerInterface = { + /** + * Must return the asked field as in fields_get. + */ + get_field: function(field_name) {}, + /** + * Called by the field when the translate button is clicked. + */ + open_translate_dialog: function(field) {}, + /** + * Returns true when the view is in create mode. + */ + is_create_mode: function() {}, }; /** @@ -1556,7 +1583,7 @@ openerp.web.form.FieldManagerInterface = { * - ... * */ -openerp.web.form.FieldInterface = { +instance.web.form.FieldInterface = { /** * Constructor takes 2 arguments: * - field_manager: Implements FieldManagerInterface @@ -1579,7 +1606,7 @@ openerp.web.form.FieldInterface = { * as well as any format commonly returned in a on_change. It must be able to autodetect those formats as * no information is ever given to know which format is used. */ - set_value: function(value) {}, + set_value: function(value_) {}, /** * Get the current value of the widget. * @@ -1613,21 +1640,20 @@ openerp.web.form.FieldInterface = { * the values of the "readonly" property and the "force_readonly" property on the field manager. * */ -openerp.web.form.AbstractField = openerp.web.form.Widget.extend(/** @lends openerp.web.form.AbstractField# */{ +instance.web.form.AbstractField = instance.web.form.Widget.extend(/** @lends instance.web.form.AbstractField# */{ /** - * @constructs openerp.web.form.AbstractField - * @extends openerp.web.form.Widget + * @constructs instance.web.form.AbstractField + * @extends instance.web.form.Widget * * @param field_manager * @param node */ init: function(field_manager, node) { this._super(field_manager, node); + this.field_manager = field_manager; this.name = this.node.attrs.name; - this.value = false; - this.view.fields[this.name] = this; - this.view.fields_order.push(this.name); - this.field = this.view.fields_view.fields[this.name] || {}; + this.set({'value': false}); + this.field = this.field_manager.get_field(this.name); this.set({required: this.modifiers['required'] === true}); this.invalid = this.dirty = false; @@ -1640,16 +1666,22 @@ openerp.web.form.AbstractField = openerp.web.form.Widget.extend(/** @lends opene this.on("change:readonly", this, test_effective_readonly); this.on("change:force_readonly", this, test_effective_readonly); _.bind(test_effective_readonly, this)(); + + this.on("change:value", this, function() { + if (this._field_is_started && ! this._inhibit_on_change) + this._on_ui_change(); + }); }, start: function() { this._super.apply(this, arguments); + // quick hack, will change later + this._field_is_started = true; if (this.field.translate) { - this.view.translatable_fields.push(this); this.$element.addClass('oe_form_field_translatable'); this.$element.find('.oe_field_translate').click(this.on_translate); } - if (this.node.attrs.nolabel && openerp.connection.debug) { - this.do_attach_tooltip(this, this.$label || this.$element); + if (instance.connection.debug) { + this.do_attach_tooltip(this, this.$element); } if (!this.disable_utility_classes) { var set_required = function() { @@ -1659,22 +1691,18 @@ openerp.web.form.AbstractField = openerp.web.form.Widget.extend(/** @lends opene _.bind(set_required, this)(); } }, - set_value: function(value) { - this.value = value; + set_value: function(value_) { + this._inhibit_on_change = true; + this.set({'value': value_}); + this._inhibit_on_change = false; this.invalid = false; this.update_dom(); - this.on_value_changed(); - }, - set_value_from_ui: function() { - this.on_value_changed(); - }, - on_value_changed: function() { }, on_translate: function() { - this.view.open_translate_dialog(this); + this.field_manager.open_translate_dialog(this); }, get_value: function() { - return this.value; + return this.get('value'); }, is_valid: function() { return !this.invalid; @@ -1685,7 +1713,7 @@ openerp.web.form.AbstractField = openerp.web.form.Widget.extend(/** @lends opene update_dom: function(show_invalid) { this._super.apply(this, arguments); if (this.field.translate) { - this.$element.find('.oe_field_translate').toggle(!!this.view.datarecord.id); + this.$element.find('.oe_field_translate').toggle(!this.field_manager.is_create_mode()); } if (!this.disable_utility_classes) { if (show_invalid) { @@ -1693,11 +1721,10 @@ openerp.web.form.AbstractField = openerp.web.form.Widget.extend(/** @lends opene } } }, - on_ui_change: function() { + _on_ui_change: function() { this.dirty = true; this.validate(); if (this.is_valid()) { - this.set_value_from_ui(); this.view.do_onchange(this); this.view.on_form_changed(true); this.view.do_notify_change(); @@ -1734,7 +1761,7 @@ openerp.web.form.AbstractField = openerp.web.form.Widget.extend(/** @lends opene * A mixin to apply on any field that has to completely re-render when its readonly state * switch. */ -openerp.web.form.ReinitializeFieldMixin = { +instance.web.form.ReinitializeFieldMixin = { /** * Default implementation of start(), use it or call explicitly initialize_field(). */ @@ -1767,21 +1794,24 @@ openerp.web.form.ReinitializeFieldMixin = { render_value: function() {}, }; -openerp.web.form.FieldChar = openerp.web.form.AbstractField.extend(_.extend({}, openerp.web.form.ReinitializeFieldMixin, { +instance.web.form.FieldChar = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, { template: 'FieldChar', init: function (view, node) { this._super(view, node); this.password = this.node.attrs.password === 'True' || this.node.attrs.password === '1'; }, initialize_content: function() { - this.$element.find('input').change(this.on_ui_change); + var self = this; + this.$element.find('input').change(function() { + self.set({'value': instance.web.parse_value(self.$element.find('input').val(), self)}); + }); }, - set_value: function(value) { - this._super.apply(this, arguments); + set_value: function(value_) { + this._super(value_); this.render_value(); }, render_value: function() { - var show_value = openerp.web.format_value(this.value, this, ''); + var show_value = instance.web.format_value(this.get('value'), this, ''); if (!this.get("effective_readonly")) { this.$element.find('input').val(show_value); } else { @@ -1791,16 +1821,12 @@ openerp.web.form.FieldChar = openerp.web.form.AbstractField.extend(_.extend({}, this.$element.text(show_value); } }, - set_value_from_ui: function() { - this.value = openerp.web.parse_value(this.$element.find('input').val(), this); - this._super(); - }, validate: function() { this.invalid = false; if (!this.get("effective_readonly")) { try { - var value = openerp.web.parse_value(this.$element.find('input').val(), this, ''); - this.invalid = this.get("required") && value === ''; + var value_ = instance.web.parse_value(this.$element.find('input').val(), this, ''); + this.invalid = this.get("required") && value_ === ''; } catch(e) { this.invalid = true; } @@ -1811,11 +1837,11 @@ openerp.web.form.FieldChar = openerp.web.form.AbstractField.extend(_.extend({}, } })); -openerp.web.form.FieldID = openerp.web.form.FieldChar.extend({ +instance.web.form.FieldID = instance.web.form.FieldChar.extend({ }); -openerp.web.form.FieldEmail = openerp.web.form.FieldChar.extend({ +instance.web.form.FieldEmail = instance.web.form.FieldChar.extend({ template: 'FieldEmail', initialize_content: function() { this._super(); @@ -1826,20 +1852,20 @@ openerp.web.form.FieldEmail = openerp.web.form.FieldChar.extend({ this._super(); } else { this.$element.find('a') - .attr('href', 'mailto:' + this.value) - .text(this.value); + .attr('href', 'mailto:' + this.get('value')) + .text(this.get('value')); } }, on_button_clicked: function() { - if (!this.value || !this.is_valid()) { + if (!this.get('value') || !this.is_valid()) { this.do_warn("E-mail error", "Can't send email to invalid e-mail address"); } else { - location.href = 'mailto:' + this.value; + location.href = 'mailto:' + this.get('value'); } } }); -openerp.web.form.FieldUrl = openerp.web.form.FieldChar.extend({ +instance.web.form.FieldUrl = instance.web.form.FieldChar.extend({ template: 'FieldUrl', initialize_content: function() { this._super(); @@ -1849,19 +1875,19 @@ openerp.web.form.FieldUrl = openerp.web.form.FieldChar.extend({ if (!this.get("effective_readonly")) { this._super(); } else { - var tmp = this.value; + var tmp = this.get('value'); var s = /(\w+):(.+)/.exec(tmp); if (!s) { - tmp = "http://" + this.value; + tmp = "http://" + this.get('value'); } this.$element.find('a').attr('href', tmp).text(tmp); } }, on_button_clicked: function() { - if (!this.value) { + if (!this.get('value')) { this.do_warn("Resource error", "This resource is empty"); } else { - var url = $.trim(this.value); + var url = $.trim(this.get('value')); if(/^www\./i.test(url)) url = 'http://'+url; window.open(url); @@ -1869,27 +1895,27 @@ openerp.web.form.FieldUrl = openerp.web.form.FieldChar.extend({ } }); -openerp.web.form.FieldFloat = openerp.web.form.FieldChar.extend({ +instance.web.form.FieldFloat = instance.web.form.FieldChar.extend({ is_field_number: true, init: function (view, node) { this._super(view, node); - this.value = 0; + this.set({'value': 0}); if (this.node.attrs.digits) { this.digits = py.eval(node.attrs.digits); } else { this.digits = this.field.digits; } }, - set_value: function(value) { - if (value === false || value === undefined) { + set_value: function(value_) { + if (value_ === false || value_ === undefined) { // As in GTK client, floats default to 0 - value = 0; + value_ = 0; } - this._super.apply(this, [value]); + this._super.apply(this, [value_]); } }); -openerp.web.DateTimeWidget = openerp.web.OldWidget.extend({ +instance.web.DateTimeWidget = instance.web.OldWidget.extend({ template: "web.datetimepicker", jqueryui_object: 'datetimepicker', type_of_date: "datetime", @@ -1911,32 +1937,32 @@ openerp.web.DateTimeWidget = openerp.web.OldWidget.extend({ }); this.$element.find('img.oe_datepicker_trigger').click(function() { if (!self.get("effective_readonly") && !self.picker('widget').is(':visible')) { - self.picker('setDate', self.value ? openerp.web.auto_str_to_date(self.value) : new Date()); + self.picker('setDate', self.get('value') ? instance.web.auto_str_to_date(self.get('value')) : new Date()); self.$input_picker.show(); self.picker('show'); self.$input_picker.hide(); } }); this.set_readonly(false); - this.value = false; + this.set({'value': false}); }, picker: function() { return $.fn[this.jqueryui_object].apply(this.$input_picker, arguments); }, - on_picker_select: function(text, instance) { + on_picker_select: function(text, instance_) { var date = this.picker('getDate'); this.$input.val(date ? this.format_client(date) : '').change(); }, - set_value: function(value) { - this.value = value; - this.$input.val(value ? this.format_client(value) : ''); + set_value: function(value_) { + this.set({'value': value_}); + this.$input.val(value_ ? this.format_client(value_) : ''); }, get_value: function() { - return this.value; + return this.get('value'); }, - set_value_from_ui: function() { - var value = this.$input.val() || false; - this.value = this.parse_client(value); + set_value_from_ui_: function() { + var value_ = this.$input.val() || false; + this.set({'value': this.parse_client(value_)}); }, set_readonly: function(readonly) { this.readonly = readonly; @@ -1944,12 +1970,12 @@ openerp.web.DateTimeWidget = openerp.web.OldWidget.extend({ this.$element.find('img.oe_datepicker_trigger').toggleClass('oe_input_icon_disabled', readonly); }, is_valid: function() { - var value = this.$input.val(); - if (value === "") { + var value_ = this.$input.val(); + if (value_ === "") { return true; } else { try { - this.parse_client(value); + this.parse_client(value_); return true; } catch(e) { return false; @@ -1957,27 +1983,27 @@ openerp.web.DateTimeWidget = openerp.web.OldWidget.extend({ } }, parse_client: function(v) { - return openerp.web.parse_value(v, {"widget": this.type_of_date}); + return instance.web.parse_value(v, {"widget": this.type_of_date}); }, format_client: function(v) { - return openerp.web.format_value(v, {"widget": this.type_of_date}); + return instance.web.format_value(v, {"widget": this.type_of_date}); }, on_change: function() { if (this.is_valid()) { - this.set_value_from_ui(); + this.set_value_from_ui_(); } } }); -openerp.web.DateWidget = openerp.web.DateTimeWidget.extend({ +instance.web.DateWidget = instance.web.DateTimeWidget.extend({ jqueryui_object: 'datepicker', type_of_date: "date" }); -openerp.web.form.FieldDatetime = openerp.web.form.AbstractField.extend(_.extend({}, openerp.web.form.ReinitializeFieldMixin, { +instance.web.form.FieldDatetime = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, { template: "EmptyComponent", build_widget: function() { - return new openerp.web.DateTimeWidget(this); + return new instance.web.DateTimeWidget(this); }, destroy_content: function() { if (this.datewidget) { @@ -1988,26 +2014,21 @@ openerp.web.form.FieldDatetime = openerp.web.form.AbstractField.extend(_.extend( initialize_content: function() { if (!this.get("effective_readonly")) { this.datewidget = this.build_widget(); - this.datewidget.on_change.add_last(this.on_ui_change); + this.datewidget.on_change.add_last(_.bind(function() { + this.set({'value': this.datewidget.get_value()}); + }, this)); this.datewidget.appendTo(this.$element); } }, - set_value: function(value) { - this._super(value); + set_value: function(value_) { + this._super(value_); this.render_value(); }, render_value: function() { if (!this.get("effective_readonly")) { - this.datewidget.set_value(this.value); - } else { - this.$element.text(openerp.web.format_value(this.value, this, '')); - } - }, - get_value: function() { - if (!this.get("effective_readonly")) { - return this.datewidget.get_value(); + this.datewidget.set_value(this.get('value')); } else { - return this.value; + this.$element.text(instance.web.format_value(this.get('value'), this, '')); } }, validate: function() { @@ -2021,27 +2042,30 @@ openerp.web.form.FieldDatetime = openerp.web.form.AbstractField.extend(_.extend( } })); -openerp.web.form.FieldDate = openerp.web.form.FieldDatetime.extend({ +instance.web.form.FieldDate = instance.web.form.FieldDatetime.extend({ build_widget: function() { - return new openerp.web.DateWidget(this); + return new instance.web.DateWidget(this); } }); -openerp.web.form.FieldText = openerp.web.form.AbstractField.extend(_.extend({}, openerp.web.form.ReinitializeFieldMixin, { +instance.web.form.FieldText = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, { template: 'FieldText', initialize_content: function() { this.$textarea = undefined; if (!this.get("effective_readonly")) { - this.$textarea = this.$element.find('textarea').change(this.on_ui_change); + this.$textarea = this.$element.find('textarea'); + this.$textarea.change(_.bind(function() { + this.set({'value': instance.web.parse_value(this.$textarea.val(), this)}); + }, this)); this.resized = false; } }, - set_value: function(value) { + set_value: function(value_) { this._super.apply(this, arguments); this.render_value(); }, render_value: function() { - var show_value = openerp.web.format_value(this.value, this, ''); + var show_value = instance.web.format_value(this.get('value'), this, ''); if (!this.get("effective_readonly")) { this.$textarea.val(show_value); if (!this.resized && this.view.options.resize_textareas) { @@ -2052,16 +2076,12 @@ openerp.web.form.FieldText = openerp.web.form.AbstractField.extend(_.extend({}, this.$element.text(show_value); } }, - set_value_from_ui: function() { - this.value = openerp.web.parse_value(this.$textarea.val(), this); - this._super(); - }, validate: function() { this.invalid = false; if (!this.get("effective_readonly")) { try { - var value = openerp.web.parse_value(this.$textarea.val(), this, ''); - this.invalid = this.get("required") && value === ''; + var value_ = instance.web.parse_value(this.$textarea.val(), this, ''); + this.invalid = this.get("required") && value_ === ''; } catch(e) { this.invalid = true; } @@ -2095,56 +2115,54 @@ openerp.web.form.FieldText = openerp.web.form.AbstractField.extend(_.extend({}, } })); -openerp.web.form.FieldBoolean = openerp.web.form.AbstractField.extend({ +instance.web.form.FieldBoolean = instance.web.form.AbstractField.extend({ template: 'FieldBoolean', start: function() { this._super.apply(this, arguments); this.$checkbox = $("input", this.$element); - this.$element.click(this.on_ui_change); + this.$element.click(_.bind(function() { + this.set({'value': this.$checkbox.is(':checked')}); + }, this)); var check_readonly = function() { this.$checkbox.prop('disabled', this.get("effective_readonly")); }; this.on("change:effective_readonly", this, check_readonly); _.bind(check_readonly, this)(); }, - set_value: function(value) { - this._super.apply(this, arguments); - this.$checkbox[0].checked = value; - }, - set_value_from_ui: function() { - this.value = this.$checkbox.is(':checked'); + set_value: function(value_) { this._super.apply(this, arguments); + this.$checkbox[0].checked = value_; }, focus: function($element) { this._super($element || this.$checkbox); } }); -openerp.web.form.FieldProgressBar = openerp.web.form.AbstractField.extend({ +instance.web.form.FieldProgressBar = instance.web.form.AbstractField.extend({ template: 'FieldProgressBar', start: function() { this._super.apply(this, arguments); this.$element.progressbar({ - value: this.value, + value: this.get('value'), disabled: this.get("effective_readonly") }); }, - set_value: function(value) { + set_value: function(value_) { this._super.apply(this, arguments); - var show_value = Number(value); + var show_value = Number(value_); if (isNaN(show_value)) { show_value = 0; } - var formatted_value = openerp.web.format_value(show_value, { type : 'float' }, '0'); + var formatted_value = instance.web.format_value(show_value, { type : 'float' }, '0'); this.$element.progressbar('option', 'value', show_value).find('span').html(formatted_value + '%'); } }); -openerp.web.form.FieldTextXml = openerp.web.form.AbstractField.extend({ +instance.web.form.FieldTextXml = instance.web.form.AbstractField.extend({ // to replace view editor }); -openerp.web.form.FieldSelection = openerp.web.form.AbstractField.extend(_.extend({}, openerp.web.form.ReinitializeFieldMixin, { +instance.web.form.FieldSelection = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, { template: 'FieldSelection', init: function(view, node) { var self = this; @@ -2171,7 +2189,9 @@ openerp.web.form.FieldSelection = openerp.web.form.AbstractField.extend(_.extend // row var ischanging = false; this.$element.find('select') - .change(this.on_ui_change) + .change(_.bind(function() { + this.set({'value': this.values[this.$element.find('select')[0].selectedIndex][0]}); + }, this)) .change(function () { ischanging = true; }) .click(function () { ischanging = false; }) .keyup(function (e) { @@ -2180,37 +2200,33 @@ openerp.web.form.FieldSelection = openerp.web.form.AbstractField.extend(_.extend ischanging = false; }); }, - set_value: function(value) { - value = value === null ? false : value; - value = value instanceof Array ? value[0] : value; - this._super(value); + set_value: function(value_) { + value_ = value_ === null ? false : value_; + value_ = value_ instanceof Array ? value_[0] : value_; + this._super(value_); this.render_value(); }, render_value: function() { if (!this.get("effective_readonly")) { var index = 0; for (var i = 0, ii = this.values.length; i < ii; i++) { - if (this.values[i][0] === this.value) index = i; + if (this.values[i][0] === this.get('value')) index = i; } this.$element.find('select')[0].selectedIndex = index; } else { var self = this; var option = _(this.values) - .detect(function (record) { return record[0] === self.value; }); + .detect(function (record) { return record[0] === self.get('value'); }); this.$element.text(option ? option[1] : this.values[0][1]); } }, - set_value_from_ui: function() { - this.value = this.values[this.$element.find('select')[0].selectedIndex][0]; - this._super(); - }, validate: function() { if (this.get("effective_readonly")) { this.invalid = false; return; } - var value = this.values[this.$element.find('select')[0].selectedIndex]; - this.invalid = !(value && !(this.get("required") && value[0] === false)); + var value_ = this.values[this.$element.find('select')[0].selectedIndex]; + this.invalid = !(value_ && !(this.get("required") && value_[0] === false)); }, focus: function($element) { this._super($element || this.$element.find('select:first')); @@ -2224,8 +2240,8 @@ openerp.web.form.FieldSelection = openerp.web.form.AbstractField.extend(_.extend function filter( array, term ) { var matcher = new RegExp( $.ui.autocomplete.escapeRegex(term), "i" ); - return $.grep( array, function(value) { - return matcher.test( $( "<div>" ).html( value.label || value.value || value ).text() ); + return $.grep( array, function(value_) { + return matcher.test( $( "<div>" ).html( value_.label || value_.value || value_ ).text() ); }); } @@ -2249,22 +2265,22 @@ openerp.web.form.FieldSelection = openerp.web.form.AbstractField.extend(_.extend }); })(); -openerp.web.form.dialog = function(content, options) { +instance.web.form.dialog = function(content, options) { options = _.extend({ width: '90%', height: 'auto', min_width: '800px' }, options || {}); - var dialog = new openerp.web.Dialog(null, options, content).open(); + var dialog = new instance.web.Dialog(null, options, content).open(); return dialog.$element; }; -openerp.web.form.FieldMany2One = openerp.web.form.AbstractField.extend(_.extend({}, openerp.web.form.ReinitializeFieldMixin, { +instance.web.form.FieldMany2One = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, { template: "FieldMany2One", init: function(view, node) { this._super(view, node); this.limit = 7; - this.set({value: false}); + this.set({'value': false}); this.display_value = {}; this.last_search = []; this.floating = false; @@ -2272,13 +2288,10 @@ openerp.web.form.FieldMany2One = openerp.web.form.AbstractField.extend(_.extend( }, start: function() { this._super(); - openerp.web.form.ReinitializeFieldMixin.start.call(this); + instance.web.form.ReinitializeFieldMixin.start.call(this); this.on("change:value", this, function() { this.floating = false; this.render_value(); - if (! this.inhibit_on_change) { - this.on_ui_change(); - } }); }, initialize_content: function() { @@ -2305,7 +2318,7 @@ openerp.web.form.FieldMany2One = openerp.web.form.AbstractField.extend(_.extend( if (!self.get('value')) { return; } - var pop = new openerp.web.form.FormOpenPopup(self.view); + var pop = new instance.web.form.FormOpenPopup(self.view); pop.show_element( self.field.relation, self.get("value"), @@ -2424,7 +2437,7 @@ openerp.web.form.FieldMany2One = openerp.web.form.AbstractField.extend(_.extend( this.abort_last(); delete this.abort_last; } - var dataset = new openerp.web.DataSetStatic(this, this.field.relation, self.build_context()); + var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.build_context()); dataset.name_search(search_val, self.build_domain(), 'ilike', this.limit + 1, function(data) { @@ -2474,7 +2487,7 @@ openerp.web.form.FieldMany2One = openerp.web.form.AbstractField.extend(_.extend( self._search_create_popup("form", undefined, {"default_name": name}); }; if (self.get_definition_options().quick_create === undefined || self.get_definition_options().quick_create) { - var dataset = new openerp.web.DataSetStatic(this, this.field.relation, self.build_context()); + var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.build_context()); dataset.name_create(name, function(data) { self.display_value = {}; self.display_value["" + data[0]] = data[1]; @@ -2489,7 +2502,7 @@ openerp.web.form.FieldMany2One = openerp.web.form.AbstractField.extend(_.extend( // all search/create popup handling _search_create_popup: function(view, ids, context) { var self = this; - var pop = new openerp.web.form.SelectCreatePopup(this); + var pop = new instance.web.form.SelectCreatePopup(this); pop.select_element( self.field.relation, { @@ -2499,7 +2512,7 @@ openerp.web.form.FieldMany2One = openerp.web.form.AbstractField.extend(_.extend( disable_multiple_selection: true }, self.build_domain(), - new openerp.web.CompoundContext(self.build_context(), context || {}) + new instance.web.CompoundContext(self.build_context(), context || {}) ); pop.on_select_elements.add(function(element_ids) { self.set({value: element_ids[0]}); @@ -2517,7 +2530,7 @@ openerp.web.form.FieldMany2One = openerp.web.form.AbstractField.extend(_.extend( return; } if (! no_recurse) { - var dataset = new openerp.web.DataSetStatic(this, this.field.relation, self.view.dataset.get_context()); + var dataset = new instance.web.DataSetStatic(this, this.field.relation, self.view.dataset.get_context()); dataset.name_get([self.get("value")], function(data) { self.display_value["" + self.get("value")] = data[0][1]; self.render_value(true); @@ -2545,21 +2558,17 @@ openerp.web.form.FieldMany2One = openerp.web.form.AbstractField.extend(_.extend( }); } }, - set_value: function(value) { + set_value: function(value_) { var self = this; - if (value instanceof Array) { + if (value_ instanceof Array) { this.display_value = {}; - this.display_value["" + value[0]] = value[1]; - value = value[0]; + this.display_value["" + value_[0]] = value_[1]; + value_ = value_[0]; } - value = value || false; + value_ = value_ || false; this.inhibit_on_change = true; - this.set({value: value}); + this._super(value_); this.inhibit_on_change = false; - this._super(value); - }, - get_value: function() { - return this.get("value"); }, validate: function() { this.invalid = this.get("required") && ! this.get("value"); @@ -2614,7 +2623,7 @@ var commands = { return [6, false, ids]; } }; -openerp.web.form.FieldOne2Many = openerp.web.form.AbstractField.extend({ +instance.web.form.FieldOne2Many = instance.web.form.AbstractField.extend({ multi_selection: false, disable_utility_classes: true, init: function(view, node) { @@ -2631,7 +2640,7 @@ openerp.web.form.FieldOne2Many = openerp.web.form.AbstractField.extend({ var self = this; - this.dataset = new openerp.web.form.One2ManyDataSet(this, this.field.relation); + this.dataset = new instance.web.form.One2ManyDataSet(this, this.field.relation); this.dataset.o2m = this; this.dataset.parent_view = this.view; this.dataset.child_name = this.name; @@ -2657,7 +2666,7 @@ openerp.web.form.FieldOne2Many = openerp.web.form.AbstractField.extend({ trigger_on_change: function() { var tmp = this.doing_on_change; this.doing_on_change = true; - this.on_ui_change(); + this._on_ui_change(); this.doing_on_change = tmp; }, load_views: function() { @@ -2692,12 +2701,12 @@ openerp.web.form.FieldOne2Many = openerp.web.form.AbstractField.extend({ }); this.views = views; - this.viewmanager = new openerp.web.ViewManager(this, this.dataset, views, {}); + this.viewmanager = new instance.web.ViewManager(this, this.dataset, views, {}); this.viewmanager.template = 'One2Many.viewmanager'; - this.viewmanager.registry = openerp.web.views.extend({ - list: 'openerp.web.form.One2ManyListView', - form: 'openerp.web.form.One2ManyFormView', - kanban: 'openerp.web.form.One2ManyKanbanView', + this.viewmanager.registry = instance.web.views.extend({ + list: 'instance.web.form.One2ManyListView', + form: 'instance.web.form.One2ManyFormView', + kanban: 'instance.web.form.One2ManyKanbanView', }); var once = $.Deferred().then(function() { self.init_form_last_update.resolve(); @@ -2759,13 +2768,13 @@ openerp.web.form.FieldOne2Many = openerp.web.form.AbstractField.extend({ } }, undefined); }, - set_value: function(value) { - value = value || []; + set_value: function(value_) { + value_ = value_ || []; var self = this; this.dataset.reset_ids([]); - if(value.length >= 1 && value[0] instanceof Array) { + if(value_.length >= 1 && value_[0] instanceof Array) { var ids = []; - _.each(value, function(command) { + _.each(value_, function(command) { var obj = {values: command[2]}; switch (command[0]) { case commands.CREATE: @@ -2794,10 +2803,10 @@ openerp.web.form.FieldOne2Many = openerp.web.form.AbstractField.extend({ }); this._super(ids); this.dataset.set_ids(ids); - } else if (value.length >= 1 && typeof(value[0]) === "object") { + } else if (value_.length >= 1 && typeof(value_[0]) === "object") { var ids = []; this.dataset.delete_all = true; - _.each(value, function(command) { + _.each(value_, function(command) { var obj = {values: command}; obj['id'] = _.uniqueId(self.dataset.virtual_id_prefix); obj.defaults = {}; @@ -2808,8 +2817,8 @@ openerp.web.form.FieldOne2Many = openerp.web.form.AbstractField.extend({ this._super(ids); this.dataset.set_ids(ids); } else { - this._super(value); - this.dataset.reset_ids(value); + this._super(value_); + this.dataset.reset_ids(value_); } if (this.dataset.index === null && this.dataset.ids.length > 0) { this.dataset.index = 0; @@ -2891,21 +2900,21 @@ openerp.web.form.FieldOne2Many = openerp.web.form.AbstractField.extend({ } }); -openerp.web.form.One2ManyDataSet = openerp.web.BufferedDataSet.extend({ +instance.web.form.One2ManyDataSet = instance.web.BufferedDataSet.extend({ get_context: function() { this.context = this.o2m.build_context([this.o2m.name]); return this.context; } }); -openerp.web.form.One2ManyListView = openerp.web.ListView.extend({ +instance.web.form.One2ManyListView = instance.web.ListView.extend({ _template: 'One2Many.listview', do_add_record: function () { if (this.options.editable) { this._super.apply(this, arguments); } else { var self = this; - var pop = new openerp.web.form.SelectCreatePopup(this); + var pop = new instance.web.form.SelectCreatePopup(this); pop.on_default_get.add(self.dataset.on_default_get); pop.select_element( self.o2m.field.relation, @@ -2936,7 +2945,7 @@ openerp.web.form.One2ManyListView = openerp.web.ListView.extend({ }, do_activate_record: function(index, id) { var self = this; - var pop = new openerp.web.form.FormOpenPopup(self.o2m.view); + var pop = new instance.web.form.FormOpenPopup(self.o2m.view); pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), { title: _t("Open: ") + self.name, auto_write: false, @@ -2962,7 +2971,7 @@ openerp.web.form.One2ManyListView = openerp.web.ListView.extend({ } }); -openerp.web.form.One2ManyFormView = openerp.web.FormView.extend({ +instance.web.form.One2ManyFormView = instance.web.FormView.extend({ form_template: 'One2Many.formview', on_loaded: function(data) { this._super(data); @@ -2981,12 +2990,12 @@ openerp.web.form.One2ManyFormView = openerp.web.FormView.extend({ }); var lazy_build_o2m_kanban_view = function() { -if (! openerp.web_kanban || openerp.web.form.One2ManyKanbanView) +if (! instance.web_kanban || instance.web.form.One2ManyKanbanView) return; -openerp.web.form.One2ManyKanbanView = openerp.web_kanban.KanbanView.extend({ +instance.web.form.One2ManyKanbanView = instance.web_kanban.KanbanView.extend({ open_record: function(id) { var self = this; - var pop = new openerp.web.form.FormOpenPopup(self.o2m.view); + var pop = new instance.web.form.FormOpenPopup(self.o2m.view); pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(), { title: _t("Open: ") + self.name, auto_write: false, @@ -3012,7 +3021,7 @@ openerp.web.form.One2ManyKanbanView = openerp.web_kanban.KanbanView.extend({ /* * TODO niv: clean those deferred stuff, it could be better */ -openerp.web.form.FieldMany2Many = openerp.web.form.AbstractField.extend({ +instance.web.form.FieldMany2Many = instance.web.form.AbstractField.extend({ multi_selection: false, disable_utility_classes: true, init: function(view, node) { @@ -3026,10 +3035,10 @@ openerp.web.form.FieldMany2Many = openerp.web.form.AbstractField.extend({ var self = this; - this.dataset = new openerp.web.form.Many2ManyDataSet(this, this.field.relation); + this.dataset = new instance.web.form.Many2ManyDataSet(this, this.field.relation); this.dataset.m2m = this; this.dataset.on_unlink.add_last(function(ids) { - self.on_ui_change(); + self.dataset_changed(); }); this.is_setted.then(function() { @@ -3046,26 +3055,23 @@ openerp.web.form.FieldMany2Many = openerp.web.form.AbstractField.extend({ }); }) }, - set_value: function(value) { - value = value || []; - if (value.length >= 1 && value[0] instanceof Array) { - value = value[0][2]; + set_value: function(value_) { + value_ = value_ || []; + if (value_.length >= 1 && value_[0] instanceof Array) { + value_ = value_[0][2]; } - this._super(value); - this.dataset.set_ids(value); + this._super(value_); + this.dataset.set_ids(value_); var self = this; self.reload_content(); this.is_setted.resolve(); }, - get_value: function() { - return [commands.replace_with(this.dataset.ids)]; - }, validate: function() { this.invalid = false; }, load_view: function() { var self = this; - this.list_view = new openerp.web.form.Many2ManyListView(this, this.dataset, false, { + this.list_view = new instance.web.form.Many2ManyListView(this, this.dataset, false, { 'addable': self.get("effective_readonly") ? null : _t("Add"), 'deletable': self.get("effective_readonly") ? false : true, 'selectable': self.multi_selection, @@ -3092,9 +3098,12 @@ openerp.web.form.FieldMany2Many = openerp.web.form.AbstractField.extend({ return self.list_view.reload_content(); }); }, + dataset_changed: function() { + this.set({'value': [commands.replace_with(this.dataset.ids)]}); + }, }); -openerp.web.form.Many2ManyDataSet = openerp.web.DataSetStatic.extend({ +instance.web.form.Many2ManyDataSet = instance.web.DataSetStatic.extend({ get_context: function() { this.context = this.m2m.build_context(); return this.context; @@ -3103,17 +3112,17 @@ openerp.web.form.Many2ManyDataSet = openerp.web.DataSetStatic.extend({ /** * @class - * @extends openerp.web.ListView + * @extends instance.web.ListView */ -openerp.web.form.Many2ManyListView = openerp.web.ListView.extend(/** @lends openerp.web.form.Many2ManyListView# */{ +instance.web.form.Many2ManyListView = instance.web.ListView.extend(/** @lends instance.web.form.Many2ManyListView# */{ do_add_record: function () { - var pop = new openerp.web.form.SelectCreatePopup(this); + var pop = new instance.web.form.SelectCreatePopup(this); pop.select_element( this.model, { title: _t("Add: ") + this.name }, - new openerp.web.CompoundDomain(this.m2m_field.build_domain(), ["!", ["id", "in", this.m2m_field.dataset.ids]]), + new instance.web.CompoundDomain(this.m2m_field.build_domain(), ["!", ["id", "in", this.m2m_field.dataset.ids]]), this.m2m_field.build_context() ); var self = this; @@ -3121,7 +3130,7 @@ openerp.web.form.Many2ManyListView = openerp.web.ListView.extend(/** @lends open _.each(element_ids, function(one_id) { if(! _.detect(self.dataset.ids, function(x) {return x == one_id;})) { self.dataset.set_ids([].concat(self.dataset.ids, [one_id])); - self.m2m_field.on_ui_change(); + self.m2m_field.dataset_changed(); self.reload_content(); } }); @@ -3129,7 +3138,7 @@ openerp.web.form.Many2ManyListView = openerp.web.ListView.extend(/** @lends open }, do_activate_record: function(index, id) { var self = this; - var pop = new openerp.web.form.FormOpenPopup(this); + var pop = new instance.web.form.FormOpenPopup(this); pop.show_element(this.dataset.model, id, this.m2m_field.build_context(), { title: _t("Open: ") + this.name, readonly: this.getParent().get("effective_readonly") @@ -3142,9 +3151,9 @@ openerp.web.form.Many2ManyListView = openerp.web.ListView.extend(/** @lends open /** * @class - * @extends openerp.web.OldWidget + * @extends instance.web.OldWidget */ -openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends openerp.web.form.SelectCreatePopup# */{ +instance.web.form.SelectCreatePopup = instance.web.OldWidget.extend(/** @lends instance.web.form.SelectCreatePopup# */{ template: "SelectCreatePopup", /** * options: @@ -3170,7 +3179,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope this.initial_ids = this.options.initial_ids; this.created_elements = []; this.renderElement(); - openerp.web.form.dialog(this.$element, { + instance.web.form.dialog(this.$element, { close: function() { self.check_exit(); }, @@ -3181,7 +3190,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope start: function() { this._super(); var self = this; - this.dataset = new openerp.web.ProxyDataSet(this, this.model, + this.dataset = new instance.web.ProxyDataSet(this, this.model, this.context); this.dataset.create_function = function() { return self.options.create_function.apply(null, arguments).then(function(r) { @@ -3201,10 +3210,10 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope contexts: [this.context] }, function (results) { var search_defaults = {}; - _.each(results.context, function (value, key) { + _.each(results.context, function (value_, key) { var match = /^search_default_(.*)$/.exec(key); if (match) { - search_defaults[match[1]] = value; + search_defaults[match[1]] = value_; } }); self.setup_search_view(search_defaults); @@ -3222,7 +3231,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope if (this.searchview) { this.searchview.destroy(); } - this.searchview = new openerp.web.SearchView(this, + this.searchview = new instance.web.SearchView(this, this.dataset, false, search_defaults); this.searchview.on_search.add(function(domains, contexts, groupbys) { if (self.initial_ids) { @@ -3234,7 +3243,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope } }); this.searchview.on_loaded.add_last(function () { - self.view_list = new openerp.web.form.SelectCreateListView(self, + self.view_list = new instance.web.form.SelectCreateListView(self, self.dataset, false, _.extend({'deletable': false, 'selectable': !self.options.disable_multiple_selection @@ -3276,14 +3285,14 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope }, create_row: function() { var self = this; - var wdataset = new openerp.web.DataSetSearch(this, this.model, this.context, this.domain); + var wdataset = new instance.web.DataSetSearch(this, this.model, this.context, this.domain); wdataset.parent_view = this.options.parent_view; wdataset.child_name = this.options.child_name; return wdataset.create.apply(wdataset, arguments); }, write_row: function() { var self = this; - var wdataset = new openerp.web.DataSetSearch(this, this.model, this.context, this.domain); + var wdataset = new instance.web.DataSetSearch(this, this.model, this.context, this.domain); wdataset.parent_view = this.options.parent_view; wdataset.child_name = this.options.child_name; return wdataset.write.apply(wdataset, arguments); @@ -3307,7 +3316,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope this.view_list.$element.hide(); } this.dataset.index = null; - this.view_form = new openerp.web.FormView(this, this.dataset, false, self.options.form_view_options); + this.view_form = new instance.web.FormView(this, this.dataset, false, self.options.form_view_options); if (this.options.alternative_form_view) { this.view_form.set_embedded_view(this.options.alternative_form_view); } @@ -3347,7 +3356,7 @@ openerp.web.form.SelectCreatePopup = openerp.web.OldWidget.extend(/** @lends ope on_default_get: function(res) {} }); -openerp.web.form.SelectCreateListView = openerp.web.ListView.extend({ +instance.web.form.SelectCreateListView = instance.web.ListView.extend({ do_add_record: function () { this.popup.new_object(); }, @@ -3363,9 +3372,9 @@ openerp.web.form.SelectCreateListView = openerp.web.ListView.extend({ /** * @class - * @extends openerp.web.OldWidget + * @extends instance.web.OldWidget */ -openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp.web.form.FormOpenPopup# */{ +instance.web.form.FormOpenPopup = instance.web.OldWidget.extend(/** @lends instance.web.form.FormOpenPopup# */{ template: "FormOpenPopup", /** * options: @@ -3383,7 +3392,7 @@ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp this.context = context || {}; this.options = _.defaults(options || {}, {"auto_write": true}); this.renderElement(); - openerp.web.dialog(this.$element, { + instance.web.dialog(this.$element, { title: options.title || '', modal: true, width: 960, @@ -3393,7 +3402,7 @@ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp }, start: function() { this._super(); - this.dataset = new openerp.web.form.FormOpenDataset(this, this.model, this.context); + this.dataset = new instance.web.form.FormOpenDataset(this, this.model, this.context); this.dataset.fop = this; this.dataset.ids = [this.row_id]; this.dataset.index = 0; @@ -3405,7 +3414,7 @@ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp if (!this.options.auto_write) return; var self = this; - var wdataset = new openerp.web.DataSetSearch(this, this.model, this.context, this.domain); + var wdataset = new instance.web.DataSetSearch(this, this.model, this.context, this.domain); wdataset.parent_view = this.options.parent_view; wdataset.child_name = this.options.child_name; wdataset.write(id, data, {}, function(r) { @@ -3415,7 +3424,7 @@ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp on_write_completed: function() {}, setup_form_view: function() { var self = this; - var FormClass = openerp.web.views.get_object('form'); + var FormClass = instance.web.views.get_object('form'); var options = _.clone(self.options.form_view_options); options.initial_mode = this.options.readonly ? "view" : "edit"; this.view_form = new FormClass(this, this.dataset, false, options); @@ -3446,7 +3455,7 @@ openerp.web.form.FormOpenPopup = openerp.web.OldWidget.extend(/** @lends openerp } }); -openerp.web.form.FormOpenDataset = openerp.web.ProxyDataSet.extend({ +instance.web.form.FormOpenDataset = instance.web.ProxyDataSet.extend({ read_ids: function() { if (this.fop.options.read_function) { return this.fop.options.read_function.apply(null, arguments); @@ -3456,7 +3465,7 @@ openerp.web.form.FormOpenDataset = openerp.web.ProxyDataSet.extend({ } }); -openerp.web.form.FieldReference = openerp.web.form.AbstractField.extend(_.extend({}, openerp.web.form.ReinitializeFieldMixin, { +instance.web.form.FieldReference = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, { template: 'FieldReference', init: function(view, node) { this._super(view, node); @@ -3485,7 +3494,7 @@ openerp.web.form.FieldReference = openerp.web.form.AbstractField.extend(_.extend if (this.reference_ready) { var sel = this.selection.get_value(); this.m2o.field.relation = sel; - this.m2o.set_value(null); + this.m2o.set_value(false); this.m2o.$element.toggle(sel !== false); } }, @@ -3500,22 +3509,22 @@ openerp.web.form.FieldReference = openerp.web.form.AbstractField.extend(_.extend } }, initialize_content: function() { - this.selection = new openerp.web.form.FieldSelection(this, { attrs: { + this.selection = new instance.web.form.FieldSelection(this, { attrs: { name: 'selection', widget: 'selection' }}); this.selection.set({readonly: this.get('effective_readonly')}); - this.selection.on_value_changed.add_last(this.on_selection_changed); + this.selection.on("change:value", this, this.on_selection_changed); this.selection.$element = $(".oe_form_view_reference_selection", this.$element); this.selection.renderElement(); this.selection.start(); - this.m2o = new openerp.web.form.FieldMany2One(this, { attrs: { + this.m2o = new instance.web.form.FieldMany2One(this, { attrs: { name: 'm2o', widget: 'many2one' }}); this.m2o.set({"readonly": this.get("effective_readonly")}); - this.m2o.on_ui_change.add_last(this.on_ui_change); + this.m2o.on("change:value", this, this.data_changed); this.m2o.$element = $(".oe_form_view_reference_m2o", this.$element); this.m2o.renderElement(); this.m2o.start(); @@ -3526,15 +3535,15 @@ openerp.web.form.FieldReference = openerp.web.form.AbstractField.extend(_.extend is_dirty: function() { return this.selection.is_dirty() || this.m2o.is_dirty(); }, - set_value: function(value) { - this._super(value); + set_value: function(value_) { + this._super(value_); this.render_value(); }, render_value: function() { this.reference_ready = false; var vals = [], sel_val, m2o_val; - if (typeof(this.value) === 'string') { - vals = this.value.split(','); + if (typeof(this.get('value')) === 'string') { + vals = this.get('value').split(','); } sel_val = vals[0] || false; m2o_val = vals[1] ? parseInt(vals[1], 10) : false; @@ -3546,18 +3555,18 @@ openerp.web.form.FieldReference = openerp.web.form.AbstractField.extend(_.extend this.m2o.$element.toggle(sel_val !== false); this.reference_ready = true; }, - get_value: function() { + data_changed: function() { var model = this.selection.get_value(), id = this.m2o.get_value(); if (typeof(model) === 'string' && typeof(id) === 'number') { - return model + ',' + id; + this.set({'value': model + ',' + id}); } else { - return false; + this.set({'value': false}); } - } + }, })); -openerp.web.form.FieldBinary = openerp.web.form.AbstractField.extend(_.extend({}, openerp.web.form.ReinitializeFieldMixin, { +instance.web.form.FieldBinary = instance.web.form.AbstractField.extend(_.extend({}, instance.web.form.ReinitializeFieldMixin, { init: function(view, node) { this._super(view, node); this.iframe = this.element_id + '_iframe'; @@ -3597,7 +3606,6 @@ openerp.web.form.FieldBinary = openerp.web.form.AbstractField.extend(_.extend({} console.warn("Error while uploading file : ", name); } else { this.on_file_uploaded_and_valid.apply(this, arguments); - this.on_ui_change(); } this.$element.find('.oe-binary-progress').hide(); this.$element.find('.oe-binary').show(); @@ -3616,34 +3624,33 @@ openerp.web.form.FieldBinary = openerp.web.form.AbstractField.extend(_.extend({} context: this.view.dataset.get_context() })}, complete: $.unblockUI, - error: openerp.webclient.crashmanager.on_rpc_error + error: instance.webclient.crashmanager.on_rpc_error }); }, on_clear: function() { - if (this.value !== false) { - this.value = false; + if (this.get('value') !== false) { this.binary_value = false; - this.on_ui_change(); + this.set({'value': false}); } return false; } })); -openerp.web.form.FieldBinaryFile = openerp.web.form.FieldBinary.extend({ +instance.web.form.FieldBinaryFile = instance.web.form.FieldBinary.extend({ template: 'FieldBinaryFile', initialize_content: function() { this._super(); if (this.get("effective_readonly")) { var self = this; this.$element.find('a').click(function() { - if (self.value) { + if (self.get('value')) { self.on_save_as(); } return false; }); } }, - set_value: function(value) { + set_value: function(value_) { this._super.apply(this, arguments); this.render_value(); }, @@ -3653,29 +3660,28 @@ openerp.web.form.FieldBinaryFile = openerp.web.form.FieldBinary.extend({ if (this.node.attrs.filename) { show_value = this.view.datarecord[this.node.attrs.filename] || ''; } else { - show_value = (this.value != null && this.value !== false) ? this.value : ''; + show_value = (this.get('value') != null && this.get('value') !== false) ? this.get('value') : ''; } this.$element.find('input').eq(0).val(show_value); } else { - this.$element.find('a').show(!!this.value); - if (this.value) { + this.$element.find('a').show(!!this.get('value')); + if (this.get('value')) { var show_value = _t("Download") + " " + (this.view.datarecord[this.node.attrs.filename] || ''); this.$element.find('a').text(show_value); } } }, on_file_uploaded_and_valid: function(size, name, content_type, file_base64) { - this.value = file_base64; this.binary_value = true; + this.set({'value': file_base64}); var show_value = name + " (" + this.human_filesize(size) + ")"; this.$element.find('input').eq(0).val(show_value); this.set_filename(name); }, - set_filename: function(value) { + set_filename: function(value_) { var filename = this.node.attrs.filename; if (this.view.fields[filename]) { - this.view.fields[filename].set_value(value); - this.view.fields[filename].on_ui_change(); + this.view.fields[filename].set({value: value_}); } }, on_clear: function() { @@ -3685,7 +3691,7 @@ openerp.web.form.FieldBinaryFile = openerp.web.form.FieldBinary.extend({ } }); -openerp.web.form.FieldBinaryImage = openerp.web.form.FieldBinary.extend({ +instance.web.form.FieldBinaryImage = instance.web.form.FieldBinary.extend({ template: 'FieldBinaryImage', initialize_content: function() { this._super(); @@ -3695,15 +3701,15 @@ openerp.web.form.FieldBinaryImage = openerp.web.form.FieldBinary.extend({ else this.$element.find('.oe-binary').hide(); }, - set_value: function(value) { + set_value: function(value_) { this._super.apply(this, arguments); this.render_value(); }, render_value: function() { var url; - if (this.value && this.value.substr(0, 10).indexOf(' ') == -1) { - url = 'data:image/png;base64,' + this.value; - } else if (this.value) { + if (this.get('value') && this.get('value').substr(0, 10).indexOf(' ') == -1) { + url = 'data:image/png;base64,' + this.get('value'); + } else if (this.get('value')) { url = '/web/binary/image?session_id=' + this.session.session_id + '&model=' + this.view.dataset.model +'&id=' + (this.view.datarecord.id || '') + '&field=' + this.name + '&t=' + (new Date().getTime()); } else { @@ -3717,7 +3723,7 @@ openerp.web.form.FieldBinaryImage = openerp.web.form.FieldBinary.extend({ this._super.apply(this, arguments); }, on_file_uploaded_and_valid: function(size, name, content_type, file_base64) { - this.value = file_base64; + this.set({'value': file_base64}); this.binary_value = true; this.render_value(); }, @@ -3727,7 +3733,7 @@ openerp.web.form.FieldBinaryImage = openerp.web.form.FieldBinary.extend({ } }); -openerp.web.form.FieldStatus = openerp.web.form.AbstractField.extend({ +instance.web.form.FieldStatus = instance.web.form.AbstractField.extend({ template: "EmptyComponent", start: function() { this._super(); @@ -3735,9 +3741,9 @@ openerp.web.form.FieldStatus = openerp.web.form.AbstractField.extend({ this.render_list(); }, - set_value: function(value) { - this._super(value); - this.selected_value = value; + set_value: function(value_) { + this._super(value_); + this.selected_value = value_; this.render_list(); }, @@ -3755,7 +3761,7 @@ openerp.web.form.FieldStatus = openerp.web.form.AbstractField.extend({ }); } - var content = openerp.web.qweb.render("FieldStatus.content", {widget: this, _:_}); + var content = instance.web.qweb.render("FieldStatus.content", {widget: this, _:_}); this.$element.html(content); var colors = JSON.parse((this.node.attrs || {}).statusbar_colors || "{}"); @@ -3793,34 +3799,34 @@ openerp.web.form.FieldStatus = openerp.web.form.AbstractField.extend({ }); /** - * Registry of form widgets, called by :js:`openerp.web.FormView` + * Registry of form widgets, called by :js:`instance.web.FormView` */ -openerp.web.form.widgets = new openerp.web.Registry({ - 'char' : 'openerp.web.form.FieldChar', - 'id' : 'openerp.web.form.FieldID', - 'email' : 'openerp.web.form.FieldEmail', - 'url' : 'openerp.web.form.FieldUrl', - 'text' : 'openerp.web.form.FieldText', - 'date' : 'openerp.web.form.FieldDate', - 'datetime' : 'openerp.web.form.FieldDatetime', - 'selection' : 'openerp.web.form.FieldSelection', - 'many2one' : 'openerp.web.form.FieldMany2One', - 'many2many' : 'openerp.web.form.FieldMany2Many', - 'one2many' : 'openerp.web.form.FieldOne2Many', - 'one2many_list' : 'openerp.web.form.FieldOne2Many', - 'reference' : 'openerp.web.form.FieldReference', - 'boolean' : 'openerp.web.form.FieldBoolean', - 'float' : 'openerp.web.form.FieldFloat', - 'integer': 'openerp.web.form.FieldFloat', - 'float_time': 'openerp.web.form.FieldFloat', - 'progressbar': 'openerp.web.form.FieldProgressBar', - 'image': 'openerp.web.form.FieldBinaryImage', - 'binary': 'openerp.web.form.FieldBinaryFile', - 'statusbar': 'openerp.web.form.FieldStatus' +instance.web.form.widgets = new instance.web.Registry({ + 'char' : 'instance.web.form.FieldChar', + 'id' : 'instance.web.form.FieldID', + 'email' : 'instance.web.form.FieldEmail', + 'url' : 'instance.web.form.FieldUrl', + 'text' : 'instance.web.form.FieldText', + 'date' : 'instance.web.form.FieldDate', + 'datetime' : 'instance.web.form.FieldDatetime', + 'selection' : 'instance.web.form.FieldSelection', + 'many2one' : 'instance.web.form.FieldMany2One', + 'many2many' : 'instance.web.form.FieldMany2Many', + 'one2many' : 'instance.web.form.FieldOne2Many', + 'one2many_list' : 'instance.web.form.FieldOne2Many', + 'reference' : 'instance.web.form.FieldReference', + 'boolean' : 'instance.web.form.FieldBoolean', + 'float' : 'instance.web.form.FieldFloat', + 'integer': 'instance.web.form.FieldFloat', + 'float_time': 'instance.web.form.FieldFloat', + 'progressbar': 'instance.web.form.FieldProgressBar', + 'image': 'instance.web.form.FieldBinaryImage', + 'binary': 'instance.web.form.FieldBinaryFile', + 'statusbar': 'instance.web.form.FieldStatus' }); -openerp.web.form.tags = new openerp.web.Registry({ - 'button' : 'openerp.web.form.WidgetButton', +instance.web.form.tags = new instance.web.Registry({ + 'button' : 'instance.web.form.WidgetButton', }); }; diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index deec710092c..de8b25fafe8 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -1,9 +1,9 @@ -openerp.web.list = function (openerp) { -var _t = openerp.web._t, - _lt = openerp.web._lt; -var QWeb = openerp.web.qweb; -openerp.web.views.add('list', 'openerp.web.ListView'); -openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# */ { +openerp.web.list = function (instance) { +var _t = instance.web._t, + _lt = instance.web._lt; +var QWeb = instance.web.qweb; +instance.web.views.add('list', 'instance.web.ListView'); +instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListView# */ { _template: 'ListView', display_name: _lt('List'), defaults: { @@ -33,11 +33,11 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# * See constructor parameters and method documentations for information on * the default behaviors and possible options for the list view. * - * @constructs openerp.web.ListView - * @extends openerp.web.View + * @constructs instance.web.ListView + * @extends instance.web.View * * @param parent parent object - * @param {openerp.web.DataSet} dataset the dataset the view should work with + * @param {instance.web.DataSet} dataset the dataset the view should work with * @param {String} view_id the listview's identifier, if any * @param {Object} options A set of options used to configure the view * @param {Boolean} [options.selectable=true] determines whether view rows are selectable (e.g. via a checkbox) @@ -62,12 +62,12 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# this.records = new Collection(); - this.set_groups(new openerp.web.ListView.Groups(this)); + this.set_groups(new instance.web.ListView.Groups(this)); - if (this.dataset instanceof openerp.web.DataSetStatic) { - this.groups.datagroup = new openerp.web.StaticDataGroup(this.dataset); + if (this.dataset instanceof instance.web.DataSetStatic) { + this.groups.datagroup = new instance.web.StaticDataGroup(this.dataset); } else { - this.groups.datagroup = new openerp.web.DataGroup( + this.groups.datagroup = new instance.web.DataGroup( this, this.model, dataset.get_domain(), dataset.get_context(), @@ -105,7 +105,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# /** * Set a custom Group construct as the root of the List View. * - * @param {openerp.web.ListView.Groups} groups + * @param {instance.web.ListView.Groups} groups */ set_groups: function (groups) { var self = this; @@ -330,7 +330,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# // Sidebar if (!this.sidebar && this.options.sidebar && this.options.$sidebar) { - this.sidebar = new openerp.web.Sidebar(this); + this.sidebar = new instance.web.Sidebar(this); this.sidebar.appendTo(this.options.$sidebar); this.sidebar.add_toolbar(this.fields_view.toolbar); } @@ -340,7 +340,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# * * Horrifying side-effect: sets the dataset's data on this.dataset? * - * @param {openerp.web.DataSet} dataset + * @param {instance.web.DataSet} dataset */ configure_pager: function (dataset) { this.dataset.ids = dataset.ids; @@ -364,7 +364,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# * @param {Boolean} [grouped] Should the grouping columns (group and count) be displayed */ setup_columns: function (fields, grouped) { - var domain_computer = openerp.web.form.compute_domain; + var domain_computer = instance.web.form.compute_domain; var noop = function () { return {}; }; var field_to_column = function (field) { @@ -433,7 +433,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# * * The default implementation asks the list view's view manager to switch * to a different view (by calling - * :js:func:`~openerp.web.ViewManager.on_mode_switch`), using the + * :js:func:`~instance.web.ViewManager.on_mode_switch`), using the * provided record index (within the current list view's dataset). * * If the index is null, ``switch_to_record`` asks for the creation of a @@ -554,7 +554,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# */ do_search: function (domain, context, group_by) { this.page = 0; - this.groups.datagroup = new openerp.web.DataGroup( + this.groups.datagroup = new instance.web.DataGroup( this, this.model, domain, context, group_by); this.groups.datagroup.sort = this.dataset._sort; @@ -626,7 +626,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# return; } - var c = new openerp.web.CompoundContext(); + var c = new instance.web.CompoundContext(); c.set_eval_context(_.extend({ active_id: id, active_ids: [id], @@ -643,7 +643,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# * * @param {Number} index index of the record in the dataset * @param {Object} id identifier of the activated record - * @param {openerp.web.DataSet} dataset dataset in which the record is available (may not be the listview's dataset in case of nested groups) + * @param {instance.web.DataSet} dataset dataset in which the record is available (may not be the listview's dataset in case of nested groups) */ do_activate_record: function (index, id, dataset, view) { this.dataset.ids = dataset.ids; @@ -667,11 +667,11 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# /** * Computes the aggregates for the current list view, either on the * records provided or on the records of the internal - * :js:class:`~openerp.web.ListView.Group`, by calling - * :js:func:`~openerp.web.ListView.group.get_records`. + * :js:class:`~instance.web.ListView.Group`, by calling + * :js:func:`~instance.web.ListView.group.get_records`. * * Then displays the aggregates in the table through - * :js:method:`~openerp.web.ListView.display_aggregates`. + * :js:method:`~instance.web.ListView.display_aggregates`. * * @param {Array} [records] */ @@ -747,7 +747,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# } $footer_cells.filter(_.str.sprintf('[data-field=%s]', column.id)) - .html(openerp.web.format_cell(aggregation, column, { + .html(instance.web.format_cell(aggregation, column, { process_modifiers: false })); }); @@ -800,7 +800,7 @@ openerp.web.ListView = openerp.web.View.extend( /** @lends openerp.web.ListView# } } }); -openerp.web.ListView.List = openerp.web.Class.extend( /** @lends openerp.web.ListView.List# */{ +instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web.ListView.List# */{ /** * List display for the ListView, handles basic DOM events and transforms * them in the relevant higher-level events, to which the list view (or @@ -825,10 +825,10 @@ openerp.web.ListView.List = openerp.web.Class.extend( /** @lends openerp.web.Lis * Triggered when a row of the table is clicked, provides the index (in * the rows array) and id of the selected record to the handle function. * - * @constructs openerp.web.ListView.List - * @extends openerp.web.Class + * @constructs instance.web.ListView.List + * @extends instance.web.Class * - * @param {Object} opts display options, identical to those of :js:class:`openerp.web.ListView` + * @param {Object} opts display options, identical to those of :js:class:`instance.web.ListView` */ init: function (group, opts) { var self = this; @@ -943,7 +943,7 @@ openerp.web.ListView.List = openerp.web.Class.extend( /** @lends openerp.web.Lis // to get a correctly displayable value in the field var model = ref_match[1], id = parseInt(ref_match[2], 10); - new openerp.web.DataSet(this.view, model).name_get([id], function(names) { + new instance.web.DataSet(this.view, model).name_get([id], function(names) { if (!names.length) { return; } record.set(column.id, names[0][1]); }); @@ -958,14 +958,14 @@ openerp.web.ListView.List = openerp.web.Class.extend( /** @lends openerp.web.Lis // fetch the name, set it on the record (in the right field) // and let the various registered events handle refreshing the // row - new openerp.web.DataSet(this.view, column.relation) + new instance.web.DataSet(this.view, column.relation) .name_get([value], function (names) { if (!names.length) { return; } record.set(column.id, names[0]); }); } } - return openerp.web.format_cell(record.toForm().data, column, { + return instance.web.format_cell(record.toForm().data, column, { model: this.dataset.model, id: record.get('id') }); @@ -1119,19 +1119,19 @@ openerp.web.ListView.List = openerp.web.Class.extend( /** @lends openerp.web.Lis }); } }); -openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.ListView.Groups# */{ +instance.web.ListView.Groups = instance.web.Class.extend( /** @lends instance.web.ListView.Groups# */{ passtrough_events: 'action deleted row_link', /** * Grouped display for the ListView. Handles basic DOM events and interacts - * with the :js:class:`~openerp.web.DataGroup` bound to it. + * with the :js:class:`~instance.web.DataGroup` bound to it. * * Provides events similar to those of - * :js:class:`~openerp.web.ListView.List` + * :js:class:`~instance.web.ListView.List` * - * @constructs openerp.web.ListView.Groups - * @extends openerp.web.Class + * @constructs instance.web.ListView.Groups + * @extends instance.web.Class * - * @param {openerp.web.ListView} view + * @param {instance.web.ListView} view * @param {Object} [options] * @param {Collection} [options.records] * @param {Object} [options.options] @@ -1242,7 +1242,7 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L self.records.proxy(group.value).reset(); delete self.children[group.value]; } - var child = self.children[group.value] = new openerp.web.ListView.Groups(self.view, { + var child = self.children[group.value] = new instance.web.ListView.Groups(self.view, { records: self.records.proxy(group.value), options: self.options, columns: self.columns @@ -1278,7 +1278,7 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L var group_column = _(self.columns).detect(function (column) { return column.id === group.grouped_on; }); try { - $group_column.html(openerp.web.format_cell( + $group_column.html(instance.web.format_cell( row_data, group_column, { value_if_empty: _t("Undefined"), process_modifiers: false @@ -1315,7 +1315,7 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L var r = {}; r[column.id] = {value: group.aggregates[column.id]}; $('<td class="oe-number">') - .html(openerp.web.format_cell( + .html(instance.web.format_cell( r, column, {process_modifiers: false})) .appendTo($row); } else { @@ -1348,7 +1348,7 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L }, render_dataset: function (dataset) { var self = this, - list = new openerp.web.ListView.List(this, { + list = new instance.web.ListView.List(this, { options: this.options, columns: this.columns, dataset: dataset, @@ -1561,10 +1561,10 @@ var Events = /** @lends Events# */{ return this; } }; -var Record = openerp.web.Class.extend(/** @lends Record# */{ +var Record = instance.web.Class.extend(/** @lends Record# */{ /** * @constructs Record - * @extends openerp.web.Class + * @extends instance.web.Class * * @mixes Events * @param {Object} [data] @@ -1642,7 +1642,7 @@ var Record = openerp.web.Class.extend(/** @lends Record# */{ } }); Record.include(Events); -var Collection = openerp.web.Class.extend(/** @lends Collection# */{ +var Collection = instance.web.Class.extend(/** @lends Collection# */{ /** * Smarter collections, with events, very strongly inspired by Backbone's. * @@ -1650,7 +1650,7 @@ var Collection = openerp.web.Class.extend(/** @lends Collection# */{ * various serious * * @constructs Collection - * @extends openerp.web.Class + * @extends instance.web.Class * * @mixes Events * @param {Array} [records] records to initialize the collection with @@ -1682,19 +1682,19 @@ var Collection = openerp.web.Class.extend(/** @lends Collection# */{ var records = record instanceof Array ? record : [record]; for(var i=0, length=records.length; i<length; ++i) { - var instance = (records[i] instanceof Record) ? records[i] : new Record(records[i]); - instance.bind(null, this._onRecordEvent); - this._byId[instance.get('id')] = instance; + var instance_ = (records[i] instanceof Record) ? records[i] : new Record(records[i]); + instance_.bind(null, this._onRecordEvent); + this._byId[instance_.get('id')] = instance_; if (options.at == undefined) { - this.records.push(instance); + this.records.push(instance_); if (!options.silent) { - this.trigger('add', this, instance, this.records.length-1); + this.trigger('add', this, instance_, this.records.length-1); } } else { var insertion_index = options.at + i; - this.records.splice(insertion_index, 0, instance); + this.records.splice(insertion_index, 0, instance_); if (!options.silent) { - this.trigger('add', this, instance, insertion_index); + this.trigger('add', this, instance_, insertion_index); } } this.length++; @@ -1825,7 +1825,7 @@ var Collection = openerp.web.Class.extend(/** @lends Collection# */{ } }); Collection.include(Events); -openerp.web.list = { +instance.web.list = { Events: Events, Record: Record, Collection: Collection diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index aea7f6837c1..ac19e3f341d 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -2,16 +2,16 @@ * handles editability case for lists, because it depends on form and forms already depends on lists it had to be split out * @namespace */ -openerp.web.list_editable = function (openerp) { +openerp.web.list_editable = function (instance) { var KEY_RETURN = 13, KEY_ESCAPE = 27; - var QWeb = openerp.web.qweb; + var QWeb = instance.web.qweb; // editability status of list rows - openerp.web.ListView.prototype.defaults.editable = null; + instance.web.ListView.prototype.defaults.editable = null; // TODO: not sure second @lends on existing item is correct, to check - openerp.web.ListView.include(/** @lends openerp.web.ListView# */{ + instance.web.ListView.include(/** @lends instance.web.ListView# */{ init: function () { var self = this; this._super.apply(this, arguments); @@ -37,7 +37,7 @@ openerp.web.list_editable = function (openerp) { * * @param {Number} index index of the record in the dataset * @param {Object} id identifier of the record being edited - * @param {openerp.web.DataSet} dataset dataset in which the record is available + * @param {instance.web.DataSet} dataset dataset in which the record is available */ do_edit: function (index, id, dataset) { _.extend(this.dataset, dataset); @@ -93,8 +93,8 @@ openerp.web.list_editable = function (openerp) { } }); - openerp.web.ListView.Groups.include(/** @lends openerp.web.ListView.Groups# */{ - passtrough_events: openerp.web.ListView.Groups.prototype.passtrough_events + " edit saved", + instance.web.ListView.Groups.include(/** @lends instance.web.ListView.Groups# */{ + passtrough_events: instance.web.ListView.Groups.prototype.passtrough_events + " edit saved", new_record: function () { // TODO: handle multiple children this.children[null].new_record(); @@ -113,7 +113,7 @@ openerp.web.list_editable = function (openerp) { } }); - openerp.web.ListView.List.include(/** @lends openerp.web.ListView.List# */{ + instance.web.ListView.List.include(/** @lends instance.web.ListView.List# */{ row_clicked: function (event) { if (!this.options.editable) { return this._super.apply(this, arguments); @@ -236,7 +236,7 @@ openerp.web.list_editable = function (openerp) { self.edition = true; self.edition_id = record_id; $new_row.addClass("oe_form_container"); - self.edition_form = new openerp.web.ListEditableFormView(self.view, self.dataset, false); + self.edition_form = new instance.web.ListEditableFormView(self.view, self.dataset, false); self.edition_form.$element = $new_row; self.edition_form.editable_list = self; // HO HO @@ -274,7 +274,7 @@ openerp.web.list_editable = function (openerp) { // insert after the source record var index = self.records.indexOf( self.records.get(source_record_id)) + 1; - record = new openerp.web.list.Record({id: id}); + record = new instance.web.list.Record({id: id}); self.records.add(record, {at: index}); self.dataset.ids.splice(index, 0, id); } @@ -368,15 +368,15 @@ openerp.web.list_editable = function (openerp) { } }); - openerp.web.ListEditableFormView = openerp.web.FormView.extend({ + instance.web.ListEditableFormView = instance.web.FormView.extend({ init: function() { this._super.apply(this, arguments); - this.rendering_engine = new openerp.web.ListEditableRenderingEngine(this); + this.rendering_engine = new instance.web.ListEditableRenderingEngine(this); }, renderElement: function() {} }); - openerp.web.ListEditableRenderingEngine = openerp.web.Class.extend({ + instance.web.ListEditableRenderingEngine = instance.web.Class.extend({ init: function(view) { this.view = view; }, @@ -392,7 +392,7 @@ openerp.web.list_editable = function (openerp) { render_to: function($element) { var self = this; - var xml = openerp.web.json_node_to_xml(this.fvg.arch); + var xml = instance.web.json_node_to_xml(this.fvg.arch); var $xml = $(xml); if (this.view.editable_list.options.selectable) @@ -412,7 +412,8 @@ openerp.web.list_editable = function (openerp) { key = $(el).attr('widget') || self.fvg.fields[name].type; } var obj = self.view.fields_registry.get_object(key); - var w = new (obj)(self.view, openerp.web.xml_to_json(el)); + var w = new (obj)(self.view, instance.web.xml_to_json(el)); + self.view.register_field(w, $(el).attr("name")); w.appendTo($td); $td.appendTo($element); }); diff --git a/addons/web/static/src/js/view_tree.js b/addons/web/static/src/js/view_tree.js index 72a643b3d51..9e938fe293a 100644 --- a/addons/web/static/src/js/view_tree.js +++ b/addons/web/static/src/js/view_tree.js @@ -2,12 +2,12 @@ * OpenERP web library *---------------------------------------------------------*/ -openerp.web.view_tree = function(openerp) { -var QWeb = openerp.web.qweb, - _lt = openerp.web._lt; +openerp.web.view_tree = function(instance) { +var QWeb = instance.web.qweb, + _lt = instance.web._lt; -openerp.web.views.add('tree', 'openerp.web.TreeView'); -openerp.web.TreeView = openerp.web.View.extend(/** @lends openerp.web.TreeView# */{ +instance.web.views.add('tree', 'instance.web.TreeView'); +instance.web.TreeView = instance.web.View.extend(/** @lends instance.web.TreeView# */{ display_name: _lt('Tree'), /** * Indicates that this view is not searchable, and thus that no search @@ -17,8 +17,8 @@ openerp.web.TreeView = openerp.web.View.extend(/** @lends openerp.web.TreeView# /** * Genuine tree view (the one displayed as a tree, not the list) * - * @constructs openerp.web.TreeView - * @extends openerp.web.View + * @constructs instance.web.TreeView + * @extends instance.web.View * * @param parent * @param dataset @@ -203,7 +203,7 @@ openerp.web.TreeView = openerp.web.View.extend(/** @lends openerp.web.TreeView# 'fields_view': self.fields_view.arch.children, 'fields': self.fields, 'level': $curr_node.data('level') || 0, - 'render': openerp.web.format_value, + 'render': instance.web.format_value, 'color_for': self.color_for }); @@ -226,12 +226,12 @@ openerp.web.TreeView = openerp.web.View.extend(/** @lends openerp.web.TreeView# return this.rpc('/web/treeview/action', { id: id, model: this.dataset.model, - context: new openerp.web.CompoundContext( + context: new instance.web.CompoundContext( this.dataset.get_context(), local_context) }).pipe(function (actions) { if (!actions.length) { return; } var action = actions[0][2]; - var c = new openerp.web.CompoundContext(local_context); + var c = new instance.web.CompoundContext(local_context); if (action.context) { c.add(action.context); } diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 79d3d4cd167..3e4d2056c93 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -2,11 +2,11 @@ * OpenERP web library *---------------------------------------------------------*/ -openerp.web.views = function(session) { -var QWeb = session.web.qweb, - _t = session.web._t; +openerp.web.views = function(instance) { +var QWeb = instance.web.qweb, + _t = instance.web._t; -session.web.ActionManager = session.web.Widget.extend({ +instance.web.ActionManager = instance.web.Widget.extend({ init: function(parent) { this._super(parent); this.inner_action = null; @@ -52,8 +52,8 @@ session.web.ActionManager = session.web.Widget.extend({ if (run_action) { this.null_action(); action_loaded = this.do_action(state.action_id); - session.webclient.menu.has_been_loaded.then(function() { - session.webclient.menu.open_action(state.action_id); + instance.webclient.menu.has_been_loaded.then(function() { + instance.webclient.menu.open_action(state.action_id); }); } } else if (state.model && state.id) { @@ -124,31 +124,31 @@ session.web.ActionManager = session.web.Widget.extend({ .contains(action.res_model)) { var old_close = on_close; on_close = function () { - session.webclient.do_reload().then(old_close); + instance.webclient.do_reload().then(old_close); }; } if (action.target === 'new') { if (this.dialog == null) { - this.dialog = new session.web.Dialog(this, { width: '80%' }); + this.dialog = new instance.web.Dialog(this, { width: '80%' }); if(on_close) this.dialog.on_close.add(on_close); } else { this.dialog_viewmanager.destroy(); } this.dialog.dialog_title = action.name; - this.dialog_viewmanager = new session.web.ViewManagerAction(this, action); + this.dialog_viewmanager = new instance.web.ViewManagerAction(this, action); this.dialog_viewmanager.appendTo(this.dialog.$element); this.dialog.open(); } else { if(action.menu_id) { return this.getParent().do_action(action, function () { - session.webclient.menu.open_menu(action.menu_id); + instance.webclient.menu.open_menu(action.menu_id); }); } this.dialog_stop(); this.content_stop(); this.inner_action = action; - this.inner_viewmanager = new session.web.ViewManagerAction(this, action); + this.inner_viewmanager = new instance.web.ViewManagerAction(this, action); this.inner_viewmanager.appendTo(this.$element); } }, @@ -170,7 +170,7 @@ session.web.ActionManager = session.web.Widget.extend({ ir_actions_client: function (action) { this.content_stop(); this.dialog_stop(); - var ClientWidget = session.web.client_actions.get_object(action.tag); + var ClientWidget = instance.web.client_actions.get_object(action.tag); (this.client_widget = new ClientWidget(this, action.params)).appendTo(this.$element); }, ir_actions_report_xml: function(action, on_closed) { @@ -192,7 +192,7 @@ session.web.ActionManager = session.web.Widget.extend({ } self.dialog_stop(); }, - error: session.webclient.crashmanager.on_rpc_error + error: instance.webclient.crashmanager.on_rpc_error }) }); }, @@ -204,7 +204,7 @@ session.web.ActionManager = session.web.Widget.extend({ } }); -session.web.ViewManager = session.web.Widget.extend({ +instance.web.ViewManager = instance.web.Widget.extend({ template: "ViewManager", init: function(parent, dataset, views, flags) { this._super(parent); @@ -214,7 +214,7 @@ session.web.ViewManager = session.web.Widget.extend({ this.active_view = null; this.views_src = _.map(views, function(x) { if (x instanceof Array) { - var View = session.web.views.get_object(x[1], true); + var View = instance.web.views.get_object(x[1], true); return { view_id: x[0], view_type: x[1], @@ -226,7 +226,7 @@ session.web.ViewManager = session.web.Widget.extend({ }); this.views = {}; this.flags = flags || {}; - this.registry = session.web.views; + this.registry = instance.web.views; this.views_history = []; }, /** @@ -376,7 +376,7 @@ session.web.ViewManager = session.web.Widget.extend({ if (this.searchview) { this.searchview.destroy(); } - this.searchview = new session.web.SearchView(this, this.dataset, view_id, search_defaults, this.flags.search_view === false); + this.searchview = new instance.web.SearchView(this, this.dataset, view_id, search_defaults, this.flags.search_view === false); this.searchview.on_search.add(this.do_searchview_search); return this.searchview.appendTo(this.$element.find(".oe_view_manager_view_search")); @@ -435,13 +435,13 @@ session.web.ViewManager = session.web.Widget.extend({ } }); -session.web.ViewManagerAction = session.web.ViewManager.extend({ +instance.web.ViewManagerAction = instance.web.ViewManager.extend({ template:"ViewManagerAction", /** - * @constructs session.web.ViewManagerAction - * @extends session.web.ViewManager + * @constructs instance.web.ViewManagerAction + * @extends instance.web.ViewManager * - * @param {session.web.ActionManager} parent parent object/widget + * @param {instance.web.ActionManager} parent parent object/widget * @param {Object} action descriptor for the action this viewmanager needs to manage its views. */ init: function(parent, action) { @@ -466,7 +466,7 @@ session.web.ViewManagerAction = session.web.ViewManager.extend({ this._super(parent, null, action.views, flags); this.session = parent.session; this.action = action; - var dataset = new session.web.DataSetSearch(this, action.res_model, action.context, action.domain); + var dataset = new instance.web.DataSetSearch(this, action.res_model, action.context, action.domain); if (action.res_id) { dataset.ids.push(action.res_id); dataset.index = 0; @@ -507,7 +507,7 @@ session.web.ViewManagerAction = session.web.ViewManager.extend({ this.$element.find('.oe_debug_view').change(this.on_debug_changed); if (this.action.help && !this.flags.low_profile) { - var Users = new session.web.DataSet(self, 'res.users'), + var Users = new instance.web.DataSet(self, 'res.users'), $tips = this.$element.find('.oe_view_manager_menu_tips'); $tips.delegate('blockquote button', 'click', function() { var $this = $(this); @@ -541,19 +541,19 @@ session.web.ViewManagerAction = session.web.ViewManager.extend({ current_view = this.views[this.active_view].controller; switch (val) { case 'fvg': - var dialog = new session.web.Dialog(this, { title: _t("Fields View Get"), width: '95%' }).open(); - $('<pre>').text(session.web.json_node_to_xml(current_view.fields_view.arch, true)).appendTo(dialog.$element); + var dialog = new instance.web.Dialog(this, { title: _t("Fields View Get"), width: '95%' }).open(); + $('<pre>').text(instance.web.json_node_to_xml(current_view.fields_view.arch, true)).appendTo(dialog.$element); break; case 'perm_read': var ids = current_view.get_selected_ids(); if (ids.length === 1) { this.dataset.call('perm_read', [ids]).then(function(result) { - var dialog = new session.web.Dialog(this, { + var dialog = new instance.web.Dialog(this, { title: _.str.sprintf(_t("View Log (%s)"), self.dataset.model), width: 400 }, QWeb.render('ViewManagerDebugViewLog', { perm : result[0], - format : session.web.format_value + format : instance.web.format_value })).open(); }); } @@ -578,7 +578,7 @@ session.web.ViewManagerAction = session.web.ViewManager.extend({ .append($('<dd style="white-space: pre-wrap;">').text(def)); }); }); - new session.web.Dialog(self, { + new instance.web.Dialog(self, { title: _.str.sprintf(_t("Model %s fields"), self.dataset.model), width: '95%'}, $root).open(); @@ -586,7 +586,7 @@ session.web.ViewManagerAction = session.web.ViewManager.extend({ break; case 'manage_views': if (current_view.fields_view && current_view.fields_view.arch) { - var view_editor = new session.web.ViewEditor(current_view, current_view.$element, this.dataset, current_view.fields_view.arch); + var view_editor = new instance.web.ViewEditor(current_view, current_view.$element, this.dataset, current_view.fields_view.arch); view_editor.start(); } else { this.do_warn(_t("Manage Views"), @@ -723,7 +723,7 @@ session.web.ViewManagerAction = session.web.ViewManager.extend({ } }); -session.web.Sidebar = session.web.Widget.extend({ +instance.web.Sidebar = instance.web.Widget.extend({ init: function(parent) { this._super(parent); var view = this.getParent(); @@ -832,7 +832,7 @@ session.web.Sidebar = session.web.Widget.extend({ self.getParent().sidebar_context().then(function (context) { var ids = self.getParent().get_selected_ids(); if (ids.length == 0) { - session.web.dialog($("<div />").text(_t("You must choose at least one record.")), { title: _t("Warning"), modal: true }); + instance.web.dialog($("<div />").text(_t("You must choose at least one record.")), { title: _t("Warning"), modal: true }); return false; } var additional_context = _.extend({ @@ -860,7 +860,7 @@ session.web.Sidebar = session.web.Widget.extend({ this.on_attachments_loaded([]); } else { var dom = [ ['res_model', '=', dataset.model], ['res_id', '=', model_id], ['type', 'in', ['binary', 'url']] ]; - var ds = new session.web.DataSetSearch(this, 'ir.attachment', dataset.get_context(), dom); + var ds = new instance.web.DataSetSearch(this, 'ir.attachment', dataset.get_context(), dom); ds.read_slice(['name', 'url', 'type'], {}).then(this.on_attachments_loaded); } }, @@ -908,7 +908,7 @@ session.web.Sidebar = session.web.Widget.extend({ } }); -session.web.TranslateDialog = session.web.Dialog.extend({ +instance.web.TranslateDialog = instance.web.Dialog.extend({ dialog_title: {toString: function () { return _t("Translations"); }}, init: function(view) { // TODO fme: should add the language to fields_view_get because between the fields view get @@ -928,14 +928,14 @@ session.web.TranslateDialog = session.web.Dialog.extend({ this.translatable_fields_keys = _.map(this.view.translatable_fields || [], function(i) { return i.name }); this.languages = null; this.languages_loaded = $.Deferred(); - (new session.web.DataSetSearch(this, 'res.lang', this.view.dataset.get_context(), + (new instance.web.DataSetSearch(this, 'res.lang', this.view.dataset.get_context(), [['translatable', '=', '1']])).read_slice(['code', 'name'], { sort: 'id' }).then(this.on_languages_loaded); }, start: function() { var self = this; this._super(); $.when(this.languages_loaded).then(function() { - self.$element.html(session.web.qweb.render('TranslateDialog', { widget: self })); + self.$element.html(instance.web.qweb.render('TranslateDialog', { widget: self })); self.$fields_form = self.$element.find('.oe_translation_form'); self.$fields_form.find('.oe_trad_field').change(function() { $(this).toggleClass('touched', ($(this).val() != $(this).attr('data-value'))); @@ -1024,7 +1024,7 @@ session.web.TranslateDialog = session.web.Dialog.extend({ } }); -session.web.View = session.web.Widget.extend({ +instance.web.View = instance.web.Widget.extend({ template: "EmptyComponent", // name displayed in view switchers display_name: '', @@ -1048,7 +1048,7 @@ session.web.View = session.web.Widget.extend({ $.async_when().then(function() {def.resolve(self.embedded_view);}); return def.pipe(this.on_loaded); } else { - var context = new session.web.CompoundContext(this.dataset.get_context()); + var context = new instance.web.CompoundContext(this.dataset.get_context()); if (! this.view_type) console.warn("view_type is not defined", this); return this.rpc("/web/view/load", { @@ -1079,7 +1079,7 @@ session.web.View = session.web.Widget.extend({ }, open_translate_dialog: function(field) { if (!this.translate_dialog) { - this.translate_dialog = new session.web.TranslateDialog(this).start(); + this.translate_dialog = new instance.web.TranslateDialog(this).start(); } this.translate_dialog.open(field); }, @@ -1091,7 +1091,7 @@ session.web.View = session.web.Widget.extend({ * @param {String} [action_data.special=null] special action handlers (currently: only ``'cancel'``) * @param {String} [action_data.type='workflow'] the action type, if present, one of ``'object'``, ``'action'`` or ``'workflow'`` * @param {Object} [action_data.context=null] additional action context, to add to the current context - * @param {session.web.DataSet} dataset a dataset object used to communicate with the server + * @param {instance.web.DataSet} dataset a dataset object used to communicate with the server * @param {Object} [record_id] the identifier of the object on which the action is to be applied * @param {Function} on_closed callback to execute when dialog is closed or when the action does not generate any result (no new action) */ @@ -1103,12 +1103,12 @@ session.web.View = session.web.Widget.extend({ return self.getParent().on_action_executed.apply(null, arguments); } }; - var context = new session.web.CompoundContext(dataset.get_context(), action_data.context || {}); + var context = new instance.web.CompoundContext(dataset.get_context(), action_data.context || {}); var handler = function (r) { var action = r.result; if (action && action.constructor == Object) { - var ncontext = new session.web.CompoundContext(context); + var ncontext = new instance.web.CompoundContext(context); if (record_id) { ncontext.add({ active_id: record_id, @@ -1157,7 +1157,7 @@ session.web.View = session.web.Widget.extend({ /** * Directly set a view to use instead of calling fields_view_get. This method must * be called before start(). When an embedded view is set, underlying implementations - * of session.web.View must use the provided view instead of any other one. + * of instance.web.View must use the provided view instead of any other one. * * @param embedded_view A view. */ @@ -1197,11 +1197,11 @@ session.web.View = session.web.Widget.extend({ do_search: function(view) { }, on_sidebar_import: function() { - var import_view = new session.web.DataImport(this, this.dataset); + var import_view = new instance.web.DataImport(this, this.dataset); import_view.start(); }, on_sidebar_export: function() { - var export_view = new session.web.DataExport(this, this.dataset); + var export_view = new instance.web.DataExport(this, this.dataset); export_view.start(); }, on_sidebar_translate: function() { @@ -1226,7 +1226,7 @@ session.web.View = session.web.Widget.extend({ } }); -session.web.xml_to_json = function(node) { +instance.web.xml_to_json = function(node) { switch (node.nodeType) { case 3: case 4: @@ -1244,11 +1244,11 @@ session.web.xml_to_json = function(node) { return { tag: node.tagName.toLowerCase(), attrs: attrs, - children: _.map(node.childNodes, session.web.xml_to_json) + children: _.map(node.childNodes, instance.web.xml_to_json) } } } -session.web.json_node_to_xml = function(node, human_readable, indent) { +instance.web.json_node_to_xml = function(node, human_readable, indent) { // For debugging purpose, this function will convert a json node back to xml // Maybe useful for xml view editor indent = indent || 0; @@ -1277,7 +1277,7 @@ session.web.json_node_to_xml = function(node, human_readable, indent) { r += '>' + cr; var childs = []; for (var i = 0, ii = node.children.length; i < ii; i++) { - childs.push(session.web.json_node_to_xml(node.children[i], human_readable, indent + 1)); + childs.push(instance.web.json_node_to_xml(node.children[i], human_readable, indent + 1)); } r += childs.join(cr); r += cr + sindent + '</' + node.tag + '>'; @@ -1286,14 +1286,14 @@ session.web.json_node_to_xml = function(node, human_readable, indent) { return r + '/>'; } } -session.web.xml_to_str = function(node) { +instance.web.xml_to_str = function(node) { if (window.ActiveXObject) { return node.xml; } else { return (new XMLSerializer()).serializeToString(node); } } -session.web.str_to_xml = function(s) { +instance.web.str_to_xml = function(s) { if (window.DOMParser) { var dp = new DOMParser(); var r = dp.parseFromString(s, "text/xml"); @@ -1317,12 +1317,12 @@ session.web.str_to_xml = function(s) { /** * Registry for all the client actions key: tag value: widget */ -session.web.client_actions = new session.web.Registry(); +instance.web.client_actions = new instance.web.Registry(); /** * Registry for all the main views */ -session.web.views = new session.web.Registry(); +instance.web.views = new instance.web.Registry(); }; |
