diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index a29f320b79c..6d566f4de0a 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -183,6 +183,15 @@ openerp.base.DataSetSearch = openerp.base.DataSet.extend({ openerp.base.DataSetRelational = openerp.base.DataSet.extend( /** @lends openerp.base.DataSet# */{ }); +openerp.base.DataSetMany2Many = openerp.base.DataSetStatic.extend({ + /* should extend DataSetStatic instead, but list view still does not support it + */ + + unlink: function(ids) { + // just do nothing + }, +}); + }; // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax: diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 84d7fe0babd..3ea5697c77f 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -896,6 +896,73 @@ openerp.base.form.FieldMany2Many = openerp.base.form.Field.extend({ init: function(view, node) { this._super(view, node); this.template = "FieldMany2Many"; + this.list_id = _.uniqueId("many2many"); + }, + start: function() { + this._super.apply(this, arguments); + this.dataset = new openerp.base.DataSetMany2Many(this.session, this.field.relation); + this.list_view = new openerp.base.form.Many2ManyListView(undefined, this.view.session, + this.list_id, this.dataset, false, {'selected': false, 'addable': 'Add'}); + var self = this; + this.list_view.m2m_field = this; + this.list_view.start(); + }, + set_value: function(value) { + if (value != false) { + this.dataset.ids = value; + this.dataset.count = value.length; + this.list_view.do_reload(); + } + }, + get_value: function() { + return [[6,false,this.dataset.ids]]; + } +}); + +openerp.base.form.Many2ManyListView = openerp.base.ListView.extend({ + do_delete: function (e) { + e.stopImmediatePropagation(); + var ids = [this.rows[$(e.currentTarget).closest('tr').prevAll().length].data.id.value]; + this.dataset.ids = _.without.apply(null, [this.dataset.ids].concat(ids)); + this.dataset.count = this.dataset.ids.length; + // there may be a faster way + this.do_reload(); + + this.m2m_field.on_ui_change(); + }, + do_reload: function () { + /* Dear xmo, according to your comments, this method's implementation in list view seems + * to be a little bit bullshit. + * I assume the list view will be changed later, so I hope it will support static datasets. + */ + return this.rpc('/base/listview/fill', { + 'model': this.dataset.model, + 'id': this.view_id, + 'domain': [["id", "in", this.dataset.ids]], + 'context': this.dataset.context + }, this.do_fill_table); + }, + do_add_record: function (e) { + e.stopImmediatePropagation(); + // TODO: need to open a popup with search view + }, + on_select_row: function(event) { + var $target = $(event.currentTarget); + var row = this.rows[$target.prevAll().length]; + var id = row.data.id.value; + if(! id) { + return; + } + var action_manager = this.m2m_field.view.session.action_manager; + action_manager.do_action({ + "res_model": this.dataset.model, + "views":[[false,"form"]], + "res_id": id, + "type":"ir.actions.act_window", + "view_type":"form", + "view_mode":"form", + "target":"new" + }); } }); diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 8035616e59a..aa9882aed36 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -64,7 +64,7 @@ openerp.base.ListView = openerp.base.Controller.extend( return this.rpc("/base/listview/load", { model: this.model, view_id: this.view_id, - toolbar: !!this.view_manager.sidebar + toolbar: this.view_manager ? !!this.view_manager.sidebar : false }, this.on_loaded); }, /** @@ -168,7 +168,7 @@ openerp.base.ListView = openerp.base.Controller.extend( 'tr', 'click', this.on_select_row); // sidebar stuff - if (this.view_manager.sidebar) { + if (this.view_manager && this.view_manager.sidebar) { this.view_manager.sidebar.set_toolbar(data.fields_view.toolbar); } }, @@ -262,7 +262,9 @@ openerp.base.ListView = openerp.base.Controller.extend( view = view || 'form'; this.dataset.index = index; _.delay(_.bind(function () { - this.view_manager.on_mode_switch(view); + if(this.view_manager) { + this.view_manager.on_mode_switch(view); + } }, this)); }, /** diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js index 0f4ab8585b8..ae5e8551b93 100644 --- a/addons/base/static/src/js/search.js +++ b/addons/base/static/src/js/search.js @@ -146,7 +146,6 @@ openerp.base.SearchView = openerp.base.Controller.extend({ do_search: function (e) { if (e && e.preventDefault) { e.preventDefault(); } - //debugger; var domains = [], contexts = []; var errors = []; diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 8ef14a3edbf..8b29850d071 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -183,7 +183,14 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ openerp.base.ViewManagerAction = openerp.base.ViewManager.extend({ init: function(session, element_id, action, sidebar) { - var dataset = new openerp.base.DataSetSearch(session, action.res_model); + var dataset; + if(!action.res_id) { + dataset = new openerp.base.DataSetSearch(session, action.res_model); + } else { + dataset = new openerp.base.DataSetStatic(session, action.res_model); + dataset.ids = [action.res_id]; + dataset.count = 1; + } this._super(session, element_id, dataset, action.views); this.action = action; this.sidebar = sidebar; diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index b49ef2c7d6a..ef4cbba46b0 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -351,9 +351,7 @@ -
- Many2Many widget -
+