diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 40d1c7f5823..9d65acfb760 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -170,6 +170,24 @@ class Session(openerpweb.Controller): 'domain': domain, 'group_by': group_by_sequence } + +def load_actions_from_ir_values(req, key, key2, models, meta, context): + Values = req.session.model('ir.values') + actions = Values.get(key, key2, models, meta, context) + + for _, _, action in actions: + # values come from the server, we can just eval them + if isinstance(action['context'], basestring): + action['context'] = eval( + action['context'], + req.session.evaluation_context()) or {} + + if isinstance(action['domain'], basestring): + action['domain'] = eval( + action['domain'], + req.session.evaluation_context( + action['context'])) or [] + return actions class Menu(openerpweb.Controller): _cp_path = "/base/menu" @@ -214,21 +232,8 @@ class Menu(openerpweb.Controller): @openerpweb.jsonrequest def action(self, req, menu_id): - Values = req.session.model('ir.values') - actions = Values.get('action', 'tree_but_open', [('ir.ui.menu', menu_id)], False, {}) - - for _, _, action in actions: - # values come from the server, we can just eval them - if isinstance(action['context'], basestring): - action['context'] = eval( - action['context'], - req.session.evaluation_context()) or {} - - if isinstance(action['domain'], basestring): - action['domain'] = eval( - action['domain'], - req.session.evaluation_context( - action['context'])) or [] + actions = load_actions_from_ir_values(req,'action', 'tree_but_open', + [('ir.ui.menu', menu_id)], False, {}) return {"action": actions} @@ -438,6 +443,15 @@ class SearchView(View): def load(self, req, model, view_id): fields_view = self.fields_view_get(req.session, model, view_id, 'search') return {'fields_view': fields_view} + +class SideBar(View): + _cp_path = "/base/sidebar" + + @openerpweb.jsonrequest + def get_actions(self, request, model, object_id=0): + result = load_actions_from_ir_values(request, "action", "client_action_multi", + [[model, object_id]], False, {}) + return result class Action(openerpweb.Controller): diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 58adf4183e4..531941f85a9 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -431,3 +431,26 @@ body.openerp { .openerp .ui-widget { font-size: 1em; } + +/* Sidebar */ +.openerp .view-manager-main-sidebar { + vertical-align: top; +} + +.openerp .view-manager-main-sidebar .sidebar-main-div { + border: solid 1px #1F1F1F; + border-bottom-width: 0; +} + +.openerp .view-manager-main-sidebar ul { + list-style-type: none; + margin: 0; + padding: 0; + width: 120px; + border-bottom: solid 1px #1F1F1F; +} + +.openerp .view-manager-main-sidebar li { + padding: 3px; +} + diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 9c0f8e9bf6b..8310ca752e7 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -2,8 +2,9 @@ openerp.base.form = function (openerp) { openerp.base.FormView = openerp.base.Controller.extend({ - init: function(session, element_id, dataset, view_id) { + init: function(view_manager, session, element_id, dataset, view_id) { this._super(session, element_id); + this.view_manager; this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index f572bbb6eb9..46402dc6e3e 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -2,8 +2,9 @@ openerp.base.list = function (openerp) { openerp.base.ListView = openerp.base.Controller.extend({ - init: function(session, element_id, dataset, view_id) { + init: function(view_manager, session, element_id, dataset, view_id) { this._super(session, element_id); + this.view_manager = view_manager; this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; @@ -62,6 +63,14 @@ openerp.base.ListView = openerp.base.Controller.extend({ self.$table.setGridWidth(self.$element.width()); self.$element.children().show(); }).trigger('resize'); + + // sidebar stuff + this.rpc("/base/sidebar/get_actions", + {"model": this.model}, function(result) { + self.view_manager.sidebar.sections.push({elements: + _.map(result, function(x) {return {text:x[2].name, action:x}; })}); + self.view_manager.sidebar.refresh(); + }); }, do_fill_table: function(records) { this.log("do_fill_table"); diff --git a/addons/base/static/src/js/search.js b/addons/base/static/src/js/search.js index 5d6b175ac88..45f60372b25 100644 --- a/addons/base/static/src/js/search.js +++ b/addons/base/static/src/js/search.js @@ -1,8 +1,9 @@ openerp.base.search = function(openerp) { openerp.base.SearchView = openerp.base.Controller.extend({ - init: function(session, element_id, dataset, view_id, defaults) { + init: function(view_manager, session, element_id, dataset, view_id, defaults) { this._super(session, element_id); + this.view_manager = view_manager; this.dataset = dataset; this.model = dataset.model; this.view_id = view_id; @@ -382,8 +383,10 @@ openerp.base.search.ExtendedSearch = openerp.base.BaseWidget.extend({ var _this = this; openerp.base.search.add_expand_listener(this.$element); this.add_group(); - this.$element.find('.searchview_extended_add_group').click(function () { + this.$element.find('.searchview_extended_add_group').click(function (e) { _this.add_group(); + e.stopPropagation(); + e.preventDefault(); }); }, get_context: function() { @@ -415,12 +418,16 @@ openerp.base.search.ExtendedSearchGroup = openerp.base.BaseWidget.extend({ this._super(); var _this = this; this.add_prop(); - this.$element.find('.searchview_extended_add_proposition').click(function () { + this.$element.find('.searchview_extended_add_proposition').click(function (e) { _this.add_prop(); + e.stopPropagation(); + e.preventDefault(); }); var delete_btn = this.$element.find('.searchview_extended_delete_group'); delete_btn.click(function (e) { _this.stop(); + e.stopPropagation(); + e.preventDefault(); }); }, get_domain: function() { @@ -460,8 +467,10 @@ openerp.base.search.ExtendedSearchProposition = openerp.base.BaseWidget.extend({ _this.changed(); }); var delete_btn = this.$element.find('.searchview_extended_delete_prop'); - delete_btn.click(function () { + delete_btn.click(function (e) { _this.stop(); + e.stopPropagation(); + e.preventDefault(); }); }, changed: function() { @@ -582,9 +591,11 @@ openerp.base.search.Filter = openerp.base.search.Input.extend({ start: function () { this._super(); var self = this; - this.$element.click(function () { + this.$element.click(function (e) { $(this).toggleClass('enabled'); self.view.do_toggle_filter(self); + e.stopPropagation(); + e.preventDefault(); }); }, /** diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 6c23b248fb8..70615cb5b94 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -83,7 +83,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ if(this.search_visible && action.search_view_id) { this.searchview_id = action.search_view_id[0]; var searchview = this.searchview = new openerp.base.SearchView( - this.session, this.element_id + "_search", + this, this.session, this.element_id + "_search", this.dataset, this.searchview_id, this.search_defaults()); searchview.on_search.add(this.do_search); @@ -98,14 +98,14 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ var view_id, controller; view_id = action.views[i][0]; if(action.views[i][1] == "tree") { - controller = new openerp.base.ListView(this.session, this.element_id + "_view_tree", this.dataset, view_id); + controller = new openerp.base.ListView(this, this.session, this.element_id + "_view_tree", this.dataset, view_id); controller.start(); this.views.tree = { view_id: view_id, controller: controller }; this.$element.find(prefix_id + "_button_tree").bind('click',function(){ self.on_mode_switch("tree"); }); } else if(action.views[i][1] == "form") { - controller = new openerp.base.FormView(this.session, this.element_id + "_view_form", this.dataset, view_id); + controller = new openerp.base.FormView(this, this.session, this.element_id + "_view_form", this.dataset, view_id); controller.start(); this.views.form = { view_id: view_id, controller: controller }; this.$element.find(prefix_id + "_button_form").bind('click',function(){ @@ -238,8 +238,28 @@ openerp.base.BaseWidget = openerp.base.Controller.extend({ }); openerp.base.Sidebar = openerp.base.BaseWidget.extend({ - template: "ViewManager.sidebar" - + template: "ViewManager.sidebar", + init: function(parent) { + this._super(parent); + this.sections = []; + }, + refresh: function() { + this.$element.html(QWeb.render("ViewManager.sidebar.internal", this)); + var self = this; + this.$element.find("a").click(function(e) { + $this = jQuery(this); + var i = $this.attr("data-i"); + var j = $this.attr("data-i"); + var action = self.sections[i].elements[j]; + // TODO: do something with the action + e.stopPropagation(); + e.preventDefault(); + }); + }, + start: function() { + this._super(); + this.refresh(); + } }); openerp.base.CalendarView = openerp.base.Controller.extend({ diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index b7a38c28f21..25bb399fd90 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -417,8 +417,21 @@ -
- + + + + +
    + + +
  • + + +
+ + +