From 95bd1d12370ed6df3741204a9dc874639da0ba5f Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 31 Mar 2011 15:43:46 +0200 Subject: [PATCH 1/9] [IMP] have action manager correctly stop the view manager bzr revid: xmo@openerp.com-20110331134346-bn5fuq62ypcjs0fz --- addons/base/static/src/js/views.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index b0b79c3e5f7..438f9fac3e4 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -18,7 +18,12 @@ openerp.base.ActionManager = openerp.base.Controller.extend({ do_action: function(action) { // instantiate the right controllers by understanding the action this.action = action; + // TODO: handle target=new + console.log(action); if(action.type == "ir.actions.act_window") { + if (this.viewmanager) { + this.viewmanager.stop(); + } this.viewmanager = new openerp.base.ViewManager(this.session,this.element_id); this.viewmanager.do_action_window(action); this.viewmanager.start(); From 16d580a5732ea13312d295183110cfd17eea461d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 31 Mar 2011 16:54:32 +0200 Subject: [PATCH 2/9] [FIX] generify view management using a registry bzr revid: xmo@openerp.com-20110331145432-qg0kigi1xtgxvk1i --- addons/base/static/src/js/form.js | 1 + addons/base/static/src/js/list.js | 1 + addons/base/static/src/js/views.js | 89 ++++++++++++++++------------- addons/base/static/src/xml/base.xml | 4 +- 4 files changed, 53 insertions(+), 42 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 9c0f8e9bf6b..3bca7be030d 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1,6 +1,7 @@ openerp.base.form = function (openerp) { +openerp.base.views.add('form', 'openerp.base.FormView'); openerp.base.FormView = openerp.base.Controller.extend({ init: function(session, element_id, dataset, view_id) { this._super(session, element_id); diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index f572bbb6eb9..986470e0f0b 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -1,6 +1,7 @@ openerp.base.list = function (openerp) { +openerp.base.views.add('tree', 'openerp.base.ListView'); openerp.base.ListView = openerp.base.Controller.extend({ init: function(session, element_id, dataset, view_id) { this._super(session, element_id); diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 438f9fac3e4..55e99d9fef9 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -19,7 +19,6 @@ openerp.base.ActionManager = openerp.base.Controller.extend({ // instantiate the right controllers by understanding the action this.action = action; // TODO: handle target=new - console.log(action); if(action.type == "ir.actions.act_window") { if (this.viewmanager) { this.viewmanager.stop(); @@ -31,23 +30,27 @@ openerp.base.ActionManager = openerp.base.Controller.extend({ } }); +/** + * Registry for all the main views + */ +openerp.base.views = new openerp.base.Registry(); openerp.base.ViewManager = openerp.base.Controller.extend({ -// This will be ViewManager Abstract/Common + // This will be ViewManager Abstract/Common init: function(session, element_id) { this._super(session, element_id); this.action = null; this.dataset = null; - this.searchview_id = false; this.searchview = null; - this.search_visible = true; // this.views = { "list": { "view_id":1234, "controller": instance} } this.views = {}; }, start: function() { }, on_mode_switch: function(view_type) { - for (var i in this.views) { - this.views[i].controller.$element.toggle(i === view_type); + for (var type in this.views) { + this.views[type].controller.$element.toggle(type === view_type); + this.$element.find('#' + this.element_id + '_button_' + type) + .attr('disabled', type === view_type); } }, /** @@ -67,6 +70,28 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ }); return defaults; }, + /** + * Sets up the current viewmanager's search view. + * + * @param action the action being executed + */ + setup_search_view:function (action) { + if (this.searchview) { + this.searchview.stop(); + } + + var searchview = this.searchview = new openerp.base.SearchView( + this.session, this.element_id + "_search", + this.dataset, action.search_view_id[0] || false, + this.search_defaults()); + searchview.on_search.add(this.do_search); + searchview.start(); + + if (action['auto_search']) { + searchview.on_loaded.add_last( + searchview.do_search); + } + }, do_action_window: function(action) { var self = this; var prefix_id = "#" + this.element_id; @@ -76,42 +101,23 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ this.$element.html(QWeb.render("ViewManager", {"prefix": this.element_id, views: action.views})); - this.searchview_id = false; - 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.dataset, this.searchview_id, - this.search_defaults()); - searchview.on_search.add(this.do_search); - searchview.start(); + this.setup_search_view(action); + + _.each(action.views, function (view_descriptor) { + var view_id = view_descriptor[0], + view_type = view_descriptor[1]; + var view = new (openerp.base.views.get_object(view_type))( + self.session, self.element_id + '_view_' + view_type, + self.dataset, view_id); + view.start(); + self.views[view_type] = { view_id: view_id, controller: view }; + self.$element.find(prefix_id + '_button_' + view_type).click(function () { + self.on_mode_switch(view_type); + }); + }); - if (action['auto_search']) { - searchview.on_loaded.add_last( - searchview.do_search); - } - } - for(var i = 0; i < action.views.length; i++) { - 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.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.start(); - this.views.form = { view_id: view_id, controller: controller }; - this.$element.find(prefix_id + "_button_form").bind('click',function(){ - self.on_mode_switch("form"); - }); - } - } // switch to the first one in sequence - this.on_mode_switch("tree"); + this.on_mode_switch(action.view_mode.split(',')[0]); }, // create when root, also add to parent when o2m on_create: function() { @@ -234,10 +240,12 @@ openerp.base.BaseWidget = openerp.base.Controller.extend({ } }); +openerp.base.views.add('calendar', 'openerp.base.CalendarView'); openerp.base.CalendarView = openerp.base.Controller.extend({ // Dhtmlx scheduler ? }); +openerp.base.views.add('gantt', 'openerp.base.GanttView'); openerp.base.GanttView = openerp.base.Controller.extend({ // Dhtmlx gantt ? }); @@ -246,6 +254,7 @@ openerp.base.DiagramView = openerp.base.Controller.extend({ // }); +openerp.base.views.add('graph', 'openerp.base.GraphView'); openerp.base.GraphView = openerp.base.Controller.extend({ }); diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 006f8106105..5b72291bb0e 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -134,9 +134,9 @@ -
+
-
+
From baf8d2d9a9b46c2216bf90bec48d68efb19d9acb Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 31 Mar 2011 17:25:31 +0200 Subject: [PATCH 3/9] [IMP] server behavior fix: split tree view mode into tree and list based on view_type, nuke view_type bzr revid: xmo@openerp.com-20110331152531-cpff6js0k8v4dtk9 --- addons/base/controllers/main.py | 30 +++++++++++++++++ addons/base/static/src/js/list.js | 2 +- addons/base/static/src/js/views.js | 8 +++++ addons/base/test/test_menu.py | 52 ++++++++++++++++++++++++++++++ 4 files changed, 91 insertions(+), 1 deletion(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 40d1c7f5823..6e99aed0c36 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -230,8 +230,38 @@ class Menu(openerpweb.Controller): req.session.evaluation_context( action['context'])) or [] + self.fix_view_modes(action) + return {"action": actions} + def fix_view_modes(self, action): + """ For historical reasons, OpenERP has weird dealings in relation to + view_mode and the view_type attribute (on window actions): + + * one of the view modes is ``tree``, which stands for both list views + and tree views + * the choice is made by checking ``view_type``, which is either + ``form`` for a list view or ``tree`` for an actual tree view + + This methods simply folds the view_type into view_mode by adding a + new view mode ``list`` which is the result of the ``tree`` view_mode + in conjunction with the ``form`` view_type. + + TODO: this should go into the doc, some kind of "peculiarities" section + + :param dict action: an action descriptor + :returns: nothing, the action is modified in place + """ + if action.pop('view_type') != 'form': + return + + action['view_mode'] = ','.join( + mode if mode != 'tree' else 'list' + for mode in action['view_mode'].split(',')) + action['views'] = [ + [id, mode if mode != 'tree' else 'list'] + for id, mode in action['views'] + ] class DataSet(openerpweb.Controller): _cp_path = "/base/dataset" diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 986470e0f0b..2f82f9b50ed 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -1,7 +1,7 @@ openerp.base.list = function (openerp) { -openerp.base.views.add('tree', 'openerp.base.ListView'); +openerp.base.views.add('list', 'openerp.base.ListView'); openerp.base.ListView = openerp.base.Controller.extend({ init: function(session, element_id, dataset, view_id) { this._super(session, element_id); diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 55e99d9fef9..a66bf3ab4e9 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -250,6 +250,14 @@ openerp.base.GanttView = openerp.base.Controller.extend({ // Dhtmlx gantt ? }); +openerp.base.views.add('tree', 'openerp.base.TreeView'); +/** + * Genuine tree view (the one displayed as a tree, not the list) + */ +openerp.base.TreeView = openerp.base.Controller.extend({ + +}); + openerp.base.DiagramView = openerp.base.Controller.extend({ // }); diff --git a/addons/base/test/test_menu.py b/addons/base/test/test_menu.py index c63b19591aa..8f2c5bc42fc 100644 --- a/addons/base/test/test_menu.py +++ b/addons/base/test/test_menu.py @@ -97,3 +97,55 @@ class LoadTest(unittest2.TestCase): }] }] ) + +class ActionMungerTest(unittest2.TestCase): + def setUp(self): + self.menu = base.controllers.main.Menu() + def test_actual_treeview(self): + action = { + "views": [[False, "tree"], [False, "form"], + [False, "calendar"]], + "view_type": "tree", + "view_id": False, + "view_mode": "tree,form,calendar" + } + changed = action.copy() + del action['view_type'] + self.menu.fix_view_modes(changed) + + self.assertEqual(changed, action) + + def test_list_view(self): + action = { + "views": [[False, "tree"], [False, "form"], + [False, "calendar"]], + "view_type": "form", + "view_id": False, + "view_mode": "tree,form,calendar" + } + self.menu.fix_view_modes(action) + + self.assertEqual(action, { + "views": [[False, "list"], [False, "form"], + [False, "calendar"]], + "view_id": False, + "view_mode": "list,form,calendar" + }) + + def test_redundant_views(self): + + action = { + "views": [[False, "tree"], [False, "form"], + [False, "calendar"], [42, "tree"]], + "view_type": "form", + "view_id": False, + "view_mode": "tree,form,calendar" + } + self.menu.fix_view_modes(action) + + self.assertEqual(action, { + "views": [[False, "list"], [False, "form"], + [False, "calendar"], [42, "list"]], + "view_id": False, + "view_mode": "list,form,calendar" + }) From de1912d2a138d54a085d52007883aa30e5d0e697 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 1 Apr 2011 11:06:53 +0200 Subject: [PATCH 4/9] [IMP] enabling/disabling of switcher buttons on view switch bzr revid: xmo@openerp.com-20110401090653-jr21w79p5e5pdfts --- addons/base/static/src/css/base.css | 2 +- addons/base/static/src/js/views.js | 8 +++++++- addons/base/static/src/xml/base.xml | 2 +- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 4fc11cd1172..a92f80f8f56 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -396,7 +396,7 @@ body.openerp { } /* View Manager */ -.openerp .views_switchers { +.openerp .views-switchers { text-align: right; } diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index 45a823f0181..8fa11b96049 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -55,6 +55,12 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ controller.start(); this.views[view_type].controller = controller; } + + this.$element + .find('.views-switchers button').attr('disabled', true) + .filter('[data-view-type!="' + view_type + '"]') + .removeAttr('disabled'); + for (var i in this.views) { if (this.views[i].controller) { this.views[i].controller.$element.toggle(i === view_type); @@ -108,7 +114,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ this.setup_search_view(action); - this.$element.find('.views_switchers button').click(function() { + this.$element.find('.views-switchers button').click(function() { self.on_mode_switch($(this).data('view-type')); }); _.each(action.views, function(view) { diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 6dac4cb1b94..d610ea001b4 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -126,7 +126,7 @@ -
+