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 @@
-