diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 36dd21901a9..da471499087 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -264,7 +264,7 @@ def clean_action(action, session): action['domain'] = eval( action['domain'], session.evaluation_context( - action['context'])) or [] + action.get('context', {}))) or [] if 'flags' not in action: # Set empty flags dictionary for web client. action['flags'] = dict() diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 5cdc5a9a605..1dee53ecdd9 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -162,8 +162,8 @@ openerp.base.generate_null_object_class = function(claz, add) { }; openerp.base.Notification = openerp.base.BasicController.extend({ - init: function(element_id) { - this._super(element_id); + init: function(parent, element_id) { + this._super(parent, element_id); this.$element.notify({ speed: 500, expires: 1500 @@ -183,6 +183,7 @@ openerp.base.Notification = openerp.base.BasicController.extend({ } }); +// Session should be a Class not Controller openerp.base.Session = openerp.base.BasicController.extend( /** @lends openerp.base.Session# */{ /** * @constructs @@ -191,7 +192,7 @@ openerp.base.Session = openerp.base.BasicController.extend( /** @lends openerp.b * @param server * @param port */ - init: function(element_id, server, port) { + init: function(parent, element_id, server, port) { this._super(element_id); this.server = (server == undefined) ? location.hostname : server; this.port = (port == undefined) ? location.port : port; @@ -449,21 +450,10 @@ openerp.base.Controller = openerp.base.BasicController.extend( /** @lends opener * @constructs * @extends openerp.base.BasicController */ - init: function(parent_or_session, element_id) { - this._super(element_id); - this.controller_parent = null; - this.controller_children = []; - if(parent_or_session) { - if(parent_or_session.session) { - this.parent = parent_or_session; - this.session = this.parent.session; - if(this.parent.children) { - this.parent.children.push(this); - } - } else { - // TODO remove Backward compatilbility - this.session = parent_or_session; - } + init: function(parent, element_id) { + this._super(parent, element_id); + if(this.parent && this.parent.session) { + this.session = this.parent.session; } }, /** @@ -476,7 +466,6 @@ openerp.base.Controller = openerp.base.BasicController.extend( /** @lends opener * @returns {jQuery.Deferred} deferred object for the RPC call */ rpc: function(url, data, success, error) { - // TODO: support additional arguments ? return this.session.rpc(url, data, success, error); } }); @@ -510,11 +499,8 @@ openerp.base.BaseWidget = openerp.base.Controller.extend({ * @constructs * @params {openerp.base.search.BaseWidget} parent The parent widget. */ - init: function (parent, session) { - this._super(session); - this.children = []; - this.parent = null; - this.set_parent(parent); + init: function (parent) { + this._super(parent); this.make_id(this.identifier_prefix); }, /** @@ -542,31 +528,9 @@ openerp.base.BaseWidget = openerp.base.Controller.extend({ * lets the widgets clean up after themselves. */ stop: function () { - var tmp_children = this.children; - this.children = []; - _.each(tmp_children, function(x) { - x.stop(); - }); if(this.$element != null) { this.$element.remove(); } - this.set_parent(null); - this._super(); - }, - /** - * Set the parent of this component, also un-register the previous parent - * if there was one. - * - * @param {openerp.base.BaseWidget} parent The new parent. - */ - set_parent: function(parent) { - if(this.parent) { - this.parent.children = _.without(this.parent.children, this); - } - this.parent = parent; - if(this.parent) { - parent.children.push(this); - } }, /** * Render the widget. This.template must be defined. @@ -582,8 +546,8 @@ openerp.base.BaseWidget = openerp.base.Controller.extend({ openerp.base.Dialog = openerp.base.BaseWidget.extend({ dialog_title: "", identifier_prefix: 'dialog', - init: function (session, options) { - this._super(null, session); + init: function (parent, options) { + this._super(parent); this.options = { modal: true, width: 'auto', @@ -667,8 +631,8 @@ openerp.base.Dialog = openerp.base.BaseWidget.extend({ openerp.base.CrashManager = openerp.base.Dialog.extend({ identifier_prefix: 'dialog_crash', - init: function(session) { - this._super(session); + init: function(parent) { + this._super(parent); this.session.on_rpc_error.add(this.on_rpc_error); }, on_button_Ok: function() { @@ -702,11 +666,8 @@ openerp.base.CrashManager = openerp.base.Dialog.extend({ }); openerp.base.Loading = openerp.base.Controller.extend({ - controller_manifest: { - register: ["Loading"] - }, - init: function(session, element_id) { - this._super(session, element_id); + init: function(parent, element_id) { + this._super(parent, element_id); this.count = 0; this.session.on_rpc_request.add_first(this.on_rpc_event, 1); this.session.on_rpc_response.add_last(this.on_rpc_event, -1); @@ -728,8 +689,8 @@ openerp.base.Database = openerp.base.Controller.extend({ openerp.base.Login = openerp.base.Controller.extend({ remember_creditentials: true, - init: function(session, element_id) { - this._super(session, element_id); + init: function(parent, element_id) { + this._super(parent, element_id); this.has_local_storage = typeof(localStorage) != 'undefined'; this.selected_db = null; this.selected_login = null; @@ -805,8 +766,8 @@ openerp.base.Login = openerp.base.Controller.extend({ }); openerp.base.Header = openerp.base.Controller.extend({ - init: function(session, element_id) { - this._super(session, element_id); + init: function(parent, element_id) { + this._super(parent, element_id); }, start: function() { this.do_update(); @@ -819,8 +780,8 @@ openerp.base.Header = openerp.base.Controller.extend({ }); openerp.base.Menu = openerp.base.Controller.extend({ - init: function(session, element_id, secondary_menu_id) { - this._super(session, element_id); + init: function(parent, element_id, secondary_menu_id) { + this._super(parent, element_id); this.secondary_menu_id = secondary_menu_id; this.$secondary_menu = $("#" + secondary_menu_id); this.menu = false; @@ -910,34 +871,32 @@ openerp.base.ImportExport = openerp.base.Controller.extend({ openerp.base.WebClient = openerp.base.Controller.extend({ init: function(element_id) { - var self = this; this._super(null, element_id); QWeb.add_template("xml/base.xml"); var params = {}; - if(jQuery.param != undefined && - jQuery.deparam(jQuery.param.querystring()).kitten != undefined) { + if(jQuery.param != undefined && jQuery.deparam(jQuery.param.querystring()).kitten != undefined) { this.$element.addClass("kitten-mode-activated"); } this.$element.html(QWeb.render("Interface", params)); - this.session = new openerp.base.Session("oe_errors"); - this.loading = new openerp.base.Loading(this.session, "oe_loading"); - this.crashmanager = new openerp.base.CrashManager(this.session); + this.session = new openerp.base.Session(this,"oe_errors"); + this.loading = new openerp.base.Loading(this,"oe_loading"); + this.crashmanager = new openerp.base.CrashManager(this); this.crashmanager.start(false); // Do you autorize this ? - openerp.base.Controller.prototype.notification = new openerp.base.Notification("oe_notification"); + openerp.base.Controller.prototype.notification = new openerp.base.Notification(this, "oe_notification"); - this.header = new openerp.base.Header(this.session, "oe_header"); - this.login = new openerp.base.Login(this.session, "oe_login"); + this.header = new openerp.base.Header(this, "oe_header"); + this.login = new openerp.base.Login(this, "oe_login"); this.header.on_logout.add(this.login.on_logout); this.session.on_session_invalid.add(this.login.do_ask_login); this.session.on_session_valid.add_last(this.header.do_update); this.session.on_session_valid.add_last(this.on_logged); - this.menu = new openerp.base.Menu(this.session, "oe_menu", "oe_secondary_menu"); + this.menu = new openerp.base.Menu(this, "oe_menu", "oe_secondary_menu"); this.menu.on_action.add(this.on_menu_action); }, start: function() { @@ -948,7 +907,7 @@ openerp.base.WebClient = openerp.base.Controller.extend({ this.notification.notify("OpenERP Client", "The openerp client has been initialized."); }, on_logged: function() { - this.action_manager = new openerp.base.ActionManager(this.session, "oe_app"); + this.action_manager = new openerp.base.ActionManager(this, "oe_app"); this.action_manager.start(); // if using saved actions, load the action and give it to action manager diff --git a/addons/base/static/src/js/controller.js b/addons/base/static/src/js/controller.js index aca7c5fe004..a5c7bca4b53 100644 --- a/addons/base/static/src/js/controller.js +++ b/addons/base/static/src/js/controller.js @@ -130,12 +130,19 @@ instance.base.BasicController = instance.base.Class.extend( /** @lends instance. * * @constructs */ - init: function(element_id) { + init: function(parent, element_id) { this.element_id = element_id; this.$element = $('#' + element_id); if (element_id) { instance.screen[element_id] = this; } + // save the parent children relationship + this.controller_parent = null; + this.controller_children = []; + this.parent = parent; + if(this.parent && this.parent.children) { + this.parent.children.push(this); + } // Transform on_* method into openerp.base.callbacks for (var name in this) { diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index c1b64b93307..c9892ff4706 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -39,18 +39,16 @@ openerp.base.DataGroup = openerp.base.Controller.extend( /** @lends openerp.bas * @param {Array} group_by sequence of fields by which to group * @param {Number} [level=0] nesting level of the group */ - init: function(session, model, domain, context, group_by, level) { + init: function(parent, model, domain, context, group_by, level) { + this._super(parent, null); if (group_by) { if (group_by.length || context['group_by_no_leaf']) { - return new openerp.base.ContainerDataGroup( - session, model, domain, context, group_by, level); + return new openerp.base.ContainerDataGroup( this, model, domain, context, group_by, level); } else { - return new openerp.base.GrouplessDataGroup( - session, model, domain, context, level); + return new openerp.base.GrouplessDataGroup( this, model, domain, context, level); } } - this._super(session, null); this.model = model; this.context = context; this.domain = domain; @@ -59,8 +57,7 @@ openerp.base.DataGroup = openerp.base.Controller.extend( /** @lends openerp.bas }, cls: 'DataGroup' }); -openerp.base.ContainerDataGroup = openerp.base.DataGroup.extend( - /** @lends openerp.base.ContainerDataGroup# */ { +openerp.base.ContainerDataGroup = openerp.base.DataGroup.extend( /** @lends openerp.base.ContainerDataGroup# */ { /** * * @constructs @@ -73,8 +70,8 @@ openerp.base.ContainerDataGroup = openerp.base.DataGroup.extend( * @param group_by * @param level */ - init: function (session, model, domain, context, group_by, level) { - this._super(session, model, domain, context, null, level); + init: function (parent, model, domain, context, group_by, level) { + this._super(parent, model, domain, context, null, level); this.group_by = group_by; }, @@ -189,7 +186,7 @@ openerp.base.ContainerDataGroup = openerp.base.DataGroup.extend( var child_context = _.extend({}, self.context, group.__context); return _.extend( new openerp.base.DataGroup( - self.session, self.model, group.__domain, + self, self.model, group.__domain, child_context, child_context.group_by, self.level + 1), group, {sort: self.sort}); @@ -197,8 +194,7 @@ openerp.base.ContainerDataGroup = openerp.base.DataGroup.extend( }); } }); -openerp.base.GrouplessDataGroup = openerp.base.DataGroup.extend( - /** @lends openerp.base.GrouplessDataGroup# */ { +openerp.base.GrouplessDataGroup = openerp.base.DataGroup.extend( /** @lends openerp.base.GrouplessDataGroup# */ { /** * * @constructs @@ -210,18 +206,16 @@ openerp.base.GrouplessDataGroup = openerp.base.DataGroup.extend( * @param context * @param level */ - init: function (session, model, domain, context, level) { - this._super(session, model, domain, context, null, level); + init: function (parent, model, domain, context, level) { + this._super(parent, model, domain, context, null, level); }, list: function (fields, ifGroups, ifRecords) { ifRecords(_.extend( - new openerp.base.DataSetSearch(this.session, this.model), + new openerp.base.DataSetSearch(this, this.model), {domain: this.domain, context: this.context, _sort: this.sort})); } }); - -openerp.base.StaticDataGroup = openerp.base.GrouplessDataGroup.extend( - /** @lends openerp.base.StaticDataGroup# */ { +openerp.base.StaticDataGroup = openerp.base.GrouplessDataGroup.extend( /** @lends openerp.base.StaticDataGroup# */ { /** * A specialization of groupless data groups, relying on a single static * dataset as its records provider. @@ -249,8 +243,8 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base. * @param {openerp.base.Session} session current OpenERP session * @param {String} model the OpenERP model this dataset will manage */ - init: function(session, model, context) { - this._super(session); + init: function(parent, model, context) { + this._super(parent); this.model = model; this.context = context || {}; this.index = null; @@ -382,15 +376,11 @@ openerp.base.DataSet = openerp.base.Controller.extend( /** @lends openerp.base. return this.context; } }); - openerp.base.DataSetStatic = openerp.base.DataSet.extend({ - init: function(session, model, context, ids) { - this._super(session, model, context); + init: function(parent, model, context, ids) { + this._super(parent, model, context); // all local records this.ids = ids || []; - if (this.ids.length) { - this.index = 0; - } }, read_slice: function (fields, offset, limit, callback) { var self = this; @@ -400,8 +390,10 @@ openerp.base.DataSetStatic = openerp.base.DataSet.extend({ }, set_ids: function (ids) { this.ids = ids; - this.index = this.index <= this.ids.length - 1 ? - this.index : (this.ids.length > 0 ? this.length - 1 : 0); + if (this.index !== null) { + this.index = this.index <= this.ids.length - 1 ? + this.index : (this.ids.length > 0 ? this.length - 1 : 0); + } }, unlink: function(ids) { this.on_unlink(ids); @@ -411,10 +403,9 @@ openerp.base.DataSetStatic = openerp.base.DataSet.extend({ this.set_ids(_.without.apply(null, [this.ids].concat(ids))); } }); - openerp.base.DataSetSearch = openerp.base.DataSet.extend({ - init: function(session, model, context, domain) { - this._super(session, model, context); + init: function(parent, model, context, domain) { + this._super(parent, model, context); this.domain = domain || []; this._sort = []; this.offset = 0; @@ -478,14 +469,15 @@ openerp.base.DataSetSearch = openerp.base.DataSet.extend({ var self = this; return this._super(ids, function(result) { self.ids = _.without.apply(_, [self.ids].concat(ids)); - self.index = self.index <= self.ids.length - 1 ? - self.index : (self.ids.length > 0 ? self.ids.length -1 : 0); + if (this.index !== null) { + self.index = self.index <= self.ids.length - 1 ? + self.index : (self.ids.length > 0 ? self.ids.length -1 : 0); + } if (callback) callback(result); }, error_callback); } }); - openerp.base.BufferedDataSet = openerp.base.DataSetStatic.extend({ virtual_id_prefix: "one2many_v_id_", virtual_id_regex: /one2many_v_id_.*/, @@ -590,7 +582,6 @@ openerp.base.BufferedDataSet = openerp.base.DataSetStatic.extend({ return completion.promise(); } }); - openerp.base.ReadOnlyDataSetSearch = openerp.base.DataSetSearch.extend({ create: function(data, callback, error_callback) { this.on_create(data); diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 19f5e271858..b304fca8d64 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -17,9 +17,9 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV * * @property {openerp.base.Registry} registry=openerp.base.form.widgets widgets registry for this form view instance */ - init: function(view_manager, session, element_id, dataset, view_id) { - this._super(session, element_id); - this.view_manager = view_manager || new openerp.base.NullViewManager(); + init: function(parent, element_id, dataset, view_id, options) { + this._super(parent, element_id); + this.view_manager = parent || new openerp.base.NullViewManager(); this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; @@ -37,6 +37,8 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV this.registry = openerp.base.form.widgets; this.has_been_loaded = $.Deferred(); this.$form_header = null; + this.options = options || {}; + _.defaults(this.options, {"always_show_new_button": true}); }, start: function() { //this.log('Starting FormView '+this.model+this.view_id) @@ -83,19 +85,23 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV $('' + openerp.base.json_node_to_xml(self.fields_view.arch, true) + '').dialog({ width: '95%', height: 600}); }); - this.view_manager.sidebar.set_toolbar(data.fields_view.toolbar); + if(this.view_manager.sidebar) + this.view_manager.sidebar.set_toolbar(data.fields_view.toolbar); this.has_been_loaded.resolve(); }, do_show: function () { var self = this; + var promise; if (this.dataset.index === null) { // null index means we should start a new record - this.on_button_new(); + promise = this.on_button_new(); } else { - this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded); + promise = this.dataset.read_index(_.keys(this.fields_view.fields), this.on_record_loaded); } self.$element.show(); - this.view_manager.sidebar.do_refresh(true); + if(this.view_manager.sidebar) + this.view_manager.sidebar.do_refresh(true); + return promise; }, do_hide: function () { this.$element.hide(); @@ -107,7 +113,9 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV if (!record.id) { this.$form_header.find('.oe_form_on_create').show(); this.$form_header.find('.oe_form_on_update').hide(); - this.$form_header.find('button.oe_form_button_new').hide(); + if (!this.options["always_show_new_button"]) { + this.$form_header.find('button.oe_form_button_new').hide(); + } } else { this.$form_header.find('.oe_form_on_create').hide(); this.$form_header.find('.oe_form_on_update').show(); @@ -271,10 +279,14 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV }, on_button_new: function() { var self = this; + var def = $.Deferred(); $.when(this.has_been_loaded).then(function() { self.dataset.default_get( - _.keys(self.fields_view.fields), self.on_record_loaded); + _.keys(self.fields_view.fields)).then(self.on_record_loaded).then(function() { + def.resolve(); + }); }); + return def.promise(); }, /** * Triggers saving the form's record. Chooses between creating a new @@ -403,7 +415,7 @@ openerp.base.FormView = openerp.base.View.extend( /** @lends openerp.base.FormV } else { // TODO fme: modify this so it doesn't try to load attachments when there is not sidebar /*(new openerp.base.DataSetSearch( - this.session, 'ir.attachment', this.dataset.get_context(), + this, 'ir.attachment', this.dataset.get_context(), [['res_model', '=', this.dataset.model], ['res_id', '=', this.datarecord.id], ['type', 'in', ['binary', 'url']]])).read_slice( @@ -529,7 +541,7 @@ openerp.base.form.Widget = openerp.base.Controller.extend({ this.element_name = this.element_name || this.type; this.element_id = [this.view.element_id, this.element_name, this.view.widgets_counter++].join("_"); - this._super(this.view.session, this.element_id); + this._super(view, this.element_id); this.view.widgets[this.element_id] = this; this.children = node.children; @@ -1289,7 +1301,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ if (!self.value) { return; } - var pop = new openerp.base.form.FormOpenPopup(null, self.view.session); + var pop = new openerp.base.form.FormOpenPopup(self.view); pop.show_element(self.field.relation, self.value[0],self.build_context(), {}); pop.on_write_completed.add_last(function() { self.set_value(self.value[0]); @@ -1377,7 +1389,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ var search_val = request.term; var self = this; - var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, self.build_context()); + var dataset = new openerp.base.DataSetStatic(this, this.field.relation, self.build_context()); dataset.name_search(search_val, self.build_domain(), 'ilike', this.limit + 1, function(data) { @@ -1419,7 +1431,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ }, _quick_create: function(name) { var self = this; - var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, self.build_context()); + var dataset = new openerp.base.DataSetStatic(this, this.field.relation, self.build_context()); dataset.name_create(name, function(data) { self._change_int_ext_value(data); }).fail(function(error, event) { @@ -1431,7 +1443,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ // all search/create popup handling _search_create_popup: function(view, ids, context) { var self = this; - var pop = new openerp.base.form.SelectCreatePopup(null, self.view.session); + var pop = new openerp.base.form.SelectCreatePopup(this); pop.select_element(self.field.relation,{ initial_ids: ids ? _.map(ids, function(x) {return x[0]}) : undefined, initial_view: view, @@ -1439,7 +1451,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ }, self.build_domain(), new openerp.base.CompoundContext(self.build_context(), context || {})); pop.on_select_elements.add(function(element_ids) { - var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, self.build_context()); + var dataset = new openerp.base.DataSetStatic(this, this.field.relation, self.build_context()); dataset.name_get([element_ids[0]], function(data) { self._change_int_ext_value(data[0]); pop.stop(); @@ -1477,7 +1489,7 @@ openerp.base.form.FieldMany2One = openerp.base.form.Field.extend({ self._change_int_ext_value(rval); }; if(typeof(value) === "number") { - var dataset = new openerp.base.DataSetStatic(this.session, this.field.relation, self.build_context()); + var dataset = new openerp.base.DataSetStatic(this, this.field.relation, self.build_context()); dataset.name_get([value], function(data) { real_set_value(data[0]); }).fail(function() {self.tmp_value = undefined;}); @@ -1555,13 +1567,14 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ this._super(view, node); this.template = "FieldOne2Many"; this.is_started = $.Deferred(); + this.form_last_update = $.Deferred(); }, start: function() { this._super.apply(this, arguments); var self = this; - this.dataset = new openerp.base.form.One2ManyDataSet(this.session, this.field.relation); + this.dataset = new openerp.base.form.One2ManyDataSet(this, this.field.relation); this.dataset.o2m = this; this.dataset.parent_view = this.view; this.dataset.on_change.add_last(function() { @@ -1585,17 +1598,21 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ }); this.views = views; - this.viewmanager = new openerp.base.ViewManager(this.view.session, - this.element_id, this.dataset, views); + this.viewmanager = new openerp.base.ViewManager(this, this.element_id, this.dataset, views); this.viewmanager.registry = openerp.base.views.clone({ - list: 'openerp.base.form.One2ManyListView' + list: 'openerp.base.form.One2ManyListView', + form: 'openerp.base.form.One2ManyFormView' + }); + var once = $.Deferred().then(function() { + self.form_last_update.resolve(); }); - this.viewmanager.on_controller_inited.add_last(function(view_type, controller) { if (view_type == "list") { controller.o2m = self; } else if (view_type == "form") { - // TODO niv + controller.on_record_loaded.add_last(function() { + once.resolve(); + }); } self.is_started.resolve(); }); @@ -1609,7 +1626,12 @@ openerp.base.form.FieldOne2Many = openerp.base.form.Field.extend({ if(self.viewmanager.active_view === "list") { view.reload_content(); } else if (self.viewmanager.active_view === "form") { - // TODO niv: implement + if (this.dataset.index === null && this.dataset.ids.length >= 1) { + this.dataset.index = 0; + } + this.form_last_update.then(function() { + this.form_last_update = view.do_show(); + }); } }, set_value_from_ui: function() {}, @@ -1700,13 +1722,17 @@ openerp.base.form.One2ManyDataSet = openerp.base.BufferedDataSet.extend({ } }); +openerp.base.form.One2ManyFormView = openerp.base.FormView.extend({ + +}); + openerp.base.form.One2ManyListView = openerp.base.ListView.extend({ do_add_record: function () { if (this.options.editable) { this._super.apply(this, arguments); } else { var self = this; - var pop = new openerp.base.form.SelectCreatePopup(null, self.o2m.view.session); + var pop = new openerp.base.form.SelectCreatePopup(this); pop.select_element(self.o2m.field.relation,{ initial_view: "form", alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined, @@ -1725,7 +1751,7 @@ openerp.base.form.One2ManyListView = openerp.base.ListView.extend({ }, do_activate_record: function(index, id) { var self = this; - var pop = new openerp.base.form.FormOpenPopup(null, self.o2m.view.session); + var pop = new openerp.base.form.FormOpenPopup(self.o2m.view); pop.show_element(self.o2m.field.relation, id, self.o2m.build_context(),{ auto_write: false, alternative_form_view: self.o2m.field.views ? self.o2m.field.views["form"] : undefined, @@ -1752,15 +1778,13 @@ openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({ var self = this; - this.dataset = new openerp.base.form.Many2ManyDataSet( - this.session, this.field.relation); + this.dataset = new openerp.base.form.Many2ManyDataSet( this, this.field.relation); this.dataset.m2m = this; this.dataset.on_unlink.add_last(function(ids) { self.on_ui_change(); }); - this.list_view = new openerp.base.form.Many2ManyListView( - null, this.view.session, this.list_id, this.dataset, false, { + this.list_view = new openerp.base.form.Many2ManyListView(this.view.view_manager, this.list_id, this.dataset, false, { 'addable': 'Add', 'selectable': self.multi_selection }); @@ -1803,8 +1827,7 @@ openerp.base.form.Many2ManyDataSet = openerp.base.DataSetStatic.extend({ openerp.base.form.Many2ManyListView = openerp.base.ListView.extend({ do_add_record: function () { - var pop = new openerp.base.form.SelectCreatePopup( - null, this.m2m_field.view.session); + var pop = new openerp.base.form.SelectCreatePopup(this); pop.select_element(this.model, {}, new openerp.base.CompoundDomain(this.m2m_field.build_domain(), ["!", ["id", "in", this.m2m_field.dataset.ids]]), this.m2m_field.build_context()); @@ -1822,7 +1845,7 @@ openerp.base.form.Many2ManyListView = openerp.base.ListView.extend({ }, do_activate_record: function(index, id) { var self = this; - var pop = new openerp.base.form.FormOpenPopup(null, this.m2m_field.view.session); + var pop = new openerp.base.form.FormOpenPopup(this); pop.show_element(this.dataset.model, id, this.m2m_field.build_context(), {}); pop.on_write_completed.add_last(function() { self.reload_content(); @@ -1853,7 +1876,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ }, start: function() { this._super(); - this.dataset = new openerp.base.ReadOnlyDataSetSearch(this.session, this.model, + this.dataset = new openerp.base.ReadOnlyDataSetSearch(this, this.model, this.context); this.dataset.parent_view = this.options.parent_view; if (this.options.initial_view == "search") { @@ -1867,7 +1890,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ if (this.searchview) { this.searchview.stop(); } - this.searchview = new openerp.base.SearchView(null, this.session, + this.searchview = new openerp.base.SearchView(this, this.element_id + "_search", this.dataset, false, { "selectable": !this.options.disable_multiple_selection, "deletable": false @@ -1895,7 +1918,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ $sbutton.click(function() { self.on_select_elements(self.selected_ids); }); - self.view_list = new openerp.base.form.SelectCreateListView( null, self.session, + self.view_list = new openerp.base.form.SelectCreateListView(this, self.element_id + "_view_list", self.dataset, false, {'deletable': false}); self.view_list.popup = self; @@ -1910,7 +1933,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ if (!this.options.auto_create) return; var self = this; - var wdataset = new openerp.base.DataSetSearch(this.session, this.model, this.context, this.domain); + var wdataset = new openerp.base.DataSetSearch(this, this.model, this.context, this.domain); wdataset.parent_view = this.options.parent_view; wdataset.create(data, function(r) { self.on_select_elements([r.result]); @@ -1935,8 +1958,7 @@ openerp.base.form.SelectCreatePopup = openerp.base.BaseWidget.extend({ this.view_list.$element.hide(); } this.dataset.index = null; - this.view_form = new openerp.base.FormView(null, this.session, - this.element_id + "_view_form", this.dataset, false); + this.view_form = new openerp.base.FormView(this, this.element_id + "_view_form", this.dataset, false); if (this.options.alternative_form_view) { this.view_form.set_embedded_view(this.options.alternative_form_view); } @@ -1993,8 +2015,7 @@ openerp.base.form.FormOpenPopup = openerp.base.BaseWidget.extend({ }, start: function() { this._super(); - this.dataset = new openerp.base.ReadOnlyDataSetSearch(this.session, this.model, - this.context); + this.dataset = new openerp.base.ReadOnlyDataSetSearch(this, this.model, this.context); this.dataset.ids = [this.row_id]; this.dataset.index = 0; this.dataset.parent_view = this.options.parent_view; @@ -2005,7 +2026,7 @@ openerp.base.form.FormOpenPopup = openerp.base.BaseWidget.extend({ if (!this.options.auto_write) return; var self = this; - var wdataset = new openerp.base.DataSetSearch(this.session, this.model, this.context, this.domain); + var wdataset = new openerp.base.DataSetSearch(this, this.model, this.context, this.domain); wdataset.parent_view = this.options.parent_view; wdataset.write(id, data, function(r) { self.on_write_completed(); @@ -2014,8 +2035,7 @@ openerp.base.form.FormOpenPopup = openerp.base.BaseWidget.extend({ on_write_completed: function() {}, setup_form_view: function() { var self = this; - this.view_form = new openerp.base.FormView(null, this.session, - this.element_id + "_view_form", this.dataset, false); + this.view_form = new openerp.base.FormView(this, this.element_id + "_view_form", this.dataset, false); if (this.options.alternative_form_view) { this.view_form.set_embedded_view(this.options.alternative_form_view); } diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 84b605f1114..6812d4fac09 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -87,9 +87,9 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi * * @borrows openerp.base.ActionExecutor#execute_action as #execute_action */ - init: function(view_manager, session, element_id, dataset, view_id, options) { - this._super(session, element_id); - this.view_manager = view_manager || new openerp.base.NullViewManager(); + init: function(parent, element_id, dataset, view_id, options) { + this._super(parent, element_id); + this.view_manager = parent || new openerp.base.NullViewManager(); this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; @@ -100,7 +100,7 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi this.flags = this.view_manager.flags || {}; this.set_groups(new openerp.base.ListView.Groups(this)); - + if (this.dataset instanceof openerp.base.DataSetStatic) { this.groups.datagroup = new openerp.base.StaticDataGroup(this.dataset); } @@ -254,8 +254,9 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi }) .val(self._limit || 'NaN'); }); + if(this.view_manager.sidebar) + this.view_manager.sidebar.set_toolbar(data.fields_view.toolbar); - this.view_manager.sidebar.set_toolbar(data.fields_view.toolbar); }, /** * Configures the ListView pager based on the provided dataset's information @@ -451,7 +452,7 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi this.dataset.context = results.context; this.dataset.domain = results.domain; this.groups.datagroup = new openerp.base.DataGroup( - this.session, this.model, + this, this.model, results.domain, results.context, results.group_by); this.groups.datagroup.sort = this.dataset._sort; diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js index f5b66774384..fcf4a175b3c 100644 --- a/addons/base/static/src/js/search.js +++ b/addons/base/static/src/js/search.js @@ -1,9 +1,9 @@ openerp.base.search = function(openerp) { openerp.base.SearchView = openerp.base.Controller.extend({ - init: function(view_manager, session, element_id, dataset, view_id, defaults) { - this._super(session, element_id); - this.view_manager = view_manager || new openerp.base.NullViewManager(); + init: function(parent, element_id, dataset, view_id, defaults) { + this._super(parent, element_id); + this.view_manager = parent || new openerp.base.NullViewManager(); this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; @@ -115,7 +115,7 @@ openerp.base.SearchView = openerp.base.Controller.extend({ data.fields_view.fields); // for extended search view - var ext = new openerp.base.search.ExtendedSearch(null, this.session, this.model); + var ext = new openerp.base.search.ExtendedSearch(this, this.model); lines.push([ext]); this.inputs.push(ext); @@ -124,6 +124,7 @@ openerp.base.SearchView = openerp.base.Controller.extend({ 'lines': lines, 'defaults': this.defaults }); + // We don't understand why the following commented line does not work in Chrome but // the non-commented line does. As far as we investigated, only God knows. //this.$element.html(render); @@ -301,8 +302,7 @@ openerp.base.search.fields = new openerp.base.Registry({ 'many2one': 'openerp.base.search.ManyToOneField', 'many2many': 'openerp.base.search.ManyToManyField' }); -openerp.base.search.Invalid = openerp.base.Class.extend( - /** @lends openerp.base.search.Invalid# */{ +openerp.base.search.Invalid = openerp.base.Class.extend( /** @lends openerp.base.search.Invalid# */{ /** * Exception thrown by search widgets when they hold invalid values, * which they can not return when asked. @@ -322,8 +322,7 @@ openerp.base.search.Invalid = openerp.base.Class.extend( ': [' + this.value + '] is ' + this.message); } }); -openerp.base.search.Widget = openerp.base.Controller.extend( - /** @lends openerp.base.search.Widget# */{ +openerp.base.search.Widget = openerp.base.Controller.extend( /** @lends openerp.base.search.Widget# */{ template: null, /** * Root class of all search widgets @@ -420,8 +419,7 @@ openerp.base.search.Group = openerp.base.search.Widget.extend({ } }); -openerp.base.search.Input = openerp.base.search.Widget.extend( - /** @lends openerp.base.search.Input# */{ +openerp.base.search.Input = openerp.base.search.Widget.extend( /** @lends openerp.base.search.Input# */{ /** * @constructs * @extends openerp.base.search.Widget @@ -491,8 +489,7 @@ openerp.base.search.Filter = openerp.base.search.Input.extend({ return this.attrs.domain; } }); -openerp.base.search.Field = openerp.base.search.Input.extend( - /** @lends openerp.base.search.Field# */ { +openerp.base.search.Field = openerp.base.search.Input.extend( /** @lends openerp.base.search.Field# */ { template: 'SearchView.field', default_operator: '=', /** @@ -557,8 +554,7 @@ openerp.base.search.Field = openerp.base.search.Input.extend( * @class * @extends openerp.base.search.Field */ -openerp.base.search.CharField = openerp.base.search.Field.extend( - /** @lends openerp.base.search.CharField# */ { +openerp.base.search.CharField = openerp.base.search.Field.extend( /** @lends openerp.base.search.CharField# */ { default_operator: 'ilike', get_value: function () { return this.$element.val(); @@ -631,12 +627,7 @@ openerp.base.search.SelectionField = openerp.base.search.Field.extend({ return this.$element.val(); } }); -/** - * @class - * @extends openerp.base.search.Field - */ -openerp.base.search.DateField = openerp.base.search.Field.extend( - /** @lends openerp.base.search.DateField# */{ +openerp.base.search.DateField = openerp.base.search.Field.extend( /** @lends openerp.base.search.DateField# */{ template: 'SearchView.fields.date', /** * enables date picker on the HTML widgets @@ -724,7 +715,7 @@ openerp.base.search.ManyToOneField = openerp.base.search.CharField.extend({ self.$element.val(self.name); }); this.dataset = new openerp.base.DataSet( - this.view.session, this.attrs['relation']); + this.view, this.attrs['relation']); }, start: function () { this._super(); @@ -791,8 +782,8 @@ openerp.base.search.ManyToManyField = openerp.base.search.CharField.extend({ openerp.base.search.ExtendedSearch = openerp.base.BaseWidget.extend({ template: 'SearchView.extended_search', identifier_prefix: 'extended-search', - init: function (parent, session, model) { - this._super(parent, session); + init: function (parent, model) { + this._super(parent); this.model = model; }, add_group: function() { diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 3c566d64145..fa00607a68a 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -6,13 +6,13 @@ openerp.base.views = function(openerp) { openerp.base.ActionManager = openerp.base.Controller.extend({ // process all kind of actions - init: function(session, element_id) { - this._super(session, element_id); + init: function(parent, element_id) { + this._super(parent, element_id); this.viewmanager = null; this.current_dialog = null; // Temporary linking view_manager to session. // Will use controller_parent to find it when implementation will be done. - session.action_manager = this; + this.session.action_manager = this; }, /** * Process an action @@ -35,15 +35,12 @@ openerp.base.ActionManager = openerp.base.Controller.extend({ action.flags.new_window = true; } if (action.target == 'new') { - var dialog = this.current_dialog = new openerp.base.ActionDialog(this.session, { - title: action.name, - width: '50%' - }); + var dialog = this.current_dialog = new openerp.base.ActionDialog(this, { title: action.name, width: '90%' }); if (on_closed) { dialog.close_callback = on_closed; } dialog.start(false); - var viewmanager = dialog.viewmanager = new openerp.base.ViewManagerAction(this.session, dialog.element_id, action); + var viewmanager = dialog.viewmanager = new openerp.base.ViewManagerAction(this, dialog.element_id, action); viewmanager.start(); dialog.open(); } else if (action.flags.new_window) { @@ -57,7 +54,7 @@ openerp.base.ActionManager = openerp.base.Controller.extend({ if (this.viewmanager) { this.viewmanager.stop(); } - this.viewmanager = new openerp.base.ViewManagerAction(this.session, this.element_id, action); + this.viewmanager = new openerp.base.ViewManagerAction(this, this.element_id, action); this.viewmanager.start(); } break; @@ -85,8 +82,8 @@ openerp.base.ActionManager = openerp.base.Controller.extend({ }); openerp.base.ViewManager = openerp.base.Controller.extend({ - init: function(session, element_id, dataset, views) { - this._super(session, element_id); + init: function(parent, element_id, dataset, views) { + this._super(parent, element_id); this.model = dataset.model; this.dataset = dataset; this.searchview = null; @@ -133,7 +130,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ if (!view.controller) { // Lazy loading of views var controllerclass = this.registry.get_object(view_type); - var controller = new controllerclass( this, this.session, this.element_id + "_view_" + view_type, + var controller = new controllerclass( this, this.element_id + "_view_" + view_type, this.dataset, view.view_id, view.options); if (view.embedded_view) { controller.set_embedded_view(view.embedded_view); @@ -216,7 +213,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ if (this.searchview) { this.searchview.stop(); } - this.searchview = new openerp.base.SearchView(this, this.session, this.element_id + "_search", this.dataset, view_id, search_defaults); + this.searchview = new openerp.base.SearchView(this, this.element_id + "_search", this.dataset, view_id, search_defaults); if (this.flags.search_view === false) { this.searchview.hide(); } @@ -266,18 +263,19 @@ openerp.base.NullViewManager = openerp.base.generate_null_object_class(openerp.b }); openerp.base.ViewManagerAction = openerp.base.ViewManager.extend({ - init: function(session, element_id, action) { + init: function(parent, element_id, action) { + this.session = parent.session; var dataset; if (!action.res_id) { - dataset = new openerp.base.DataSetSearch(session, action.res_model, action.context || null); + dataset = new openerp.base.DataSetSearch(this, action.res_model, action.context || null); } else { - dataset = new openerp.base.DataSetStatic(session, action.res_model, {}, [action.res_id]); + dataset = new openerp.base.DataSetStatic(this, action.res_model, {}, [action.res_id]); if (action.context) { // TODO fme: should normalize all DataSets constructors to (session, model, context, ...) dataset.context = action.context; } } - this._super(session, element_id, dataset, action.views); + this._super(parent, element_id, dataset, action.views); this.action = action; this.flags = this.action.flags || {}; if (action.res_model == 'board.board' && action.views.length == 1 && action.views) { @@ -415,7 +413,6 @@ openerp.base.Sidebar = openerp.base.BaseWidget.extend({ } }); - openerp.base.NullSidebar = openerp.base.generate_null_object_class(openerp.base.Sidebar); openerp.base.Export = openerp.base.Dialog.extend({ diff --git a/addons/base_dashboard/static/src/js/dashboard.js b/addons/base_dashboard/static/src/js/dashboard.js index 3a70aa649ea..6b65b588d35 100644 --- a/addons/base_dashboard/static/src/js/dashboard.js +++ b/addons/base_dashboard/static/src/js/dashboard.js @@ -89,7 +89,7 @@ openerp.base.form.DashBoard = openerp.base.form.Widget.extend({ } } }); - new openerp.base.ViewManagerAction(this.session, dialog_id, action).start(); + new openerp.base.ViewManagerAction(this, dialog_id, action).start(); // TODO: should bind ListView#select_record in order to catch record clicking }, do_add_widget : function(action_manager) { @@ -227,7 +227,7 @@ openerp.base.form.DashBoard = openerp.base.form.Widget.extend({ action_buttons : false, pager: false }; - new openerp.base.ViewManagerAction(this.session, + new openerp.base.ViewManagerAction(this, this.view.element_id + '_action_' + action.id, action).start(); }, render: function() { diff --git a/addons/base_graph/static/src/js/graph.js b/addons/base_graph/static/src/js/graph.js index fdf3585449c..cf4cca20e59 100644 --- a/addons/base_graph/static/src/js/graph.js +++ b/addons/base_graph/static/src/js/graph.js @@ -16,9 +16,9 @@ QWeb.add_template('/base_graph/static/src/xml/base_graph.xml'); openerp.base.views.add('graph', 'openerp.base_graph.GraphView'); openerp.base_graph.GraphView = openerp.base.View.extend({ - init: function(view_manager, session, element_id, dataset, view_id) { - this._super(session, element_id); - this.view_manager = view_manager; + init: function(parent, element_id, dataset, view_id) { + this._super(parent, element_id); + this.view_manager = parent; this.dataset = dataset; this.dataset_index = 0; this.model = this.dataset.model;