From 571648e4cf246f7b38560780718ade1c13faddcf Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 11 Jul 2012 15:38:30 +0200 Subject: [PATCH] [WIP] Merge breadcrumb to actionmanager bzr revid: fme@openerp.com-20120711133830-677ug7jcoz2y1zoe --- addons/web/static/src/js/chrome.js | 2 +- addons/web/static/src/js/views.js | 233 +++++++++++++---------------- 2 files changed, 109 insertions(+), 126 deletions(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index e49e9ce1cbd..db696ac65f0 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -1036,7 +1036,7 @@ instance.web.WebClient = instance.web.Widget.extend({ if (options.needaction) { action.context.search_default_needaction_pending = true; } - self.action_manager.breadcrumb.clear(); + self.action_manager.clear_breadcrumbs(); self.action_manager.do_action(action); }); }, diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index fe9ce582c96..931019ce627 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -3,7 +3,6 @@ *---------------------------------------------------------*/ openerp.web.views = function(instance) { - this.action_manager.inner_widget = item.widget; var QWeb = instance.web.qweb, _t = instance.web._t; @@ -14,10 +13,11 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.inner_widget = null; this.dialog = null; this.dialog_widget = null; + this.breadcrumbs = []; }, start: function() { this._super.apply(this, arguments); - this.breadcrumb = new instance.web.BreadCrumb(this); + this.$element.on('click', '.oe_breadcrumb_item', this.on_breadcrumb_clicked); }, dialog_stop: function () { if (this.dialog) { @@ -27,6 +27,78 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.dialog = null; } }, + push_breadcrumb: function(item) { + _.each(this.breadcrumbs, function(i) { + i.hide(); + }); + item.id = _.uniqueId('breadcrumb_'); + item.show = item.show || function() { + item.widget.$element.show(); + }; + item.hide = item.hide || function() { + item.widget.$element.hide(); + }; + item.destroy = item.destroy || function() { + item.widget.destroy(); + }; + item.get_title = item.get_title || function() { + return item.title || item.widget.get('title'); + }; + this.breadcrumbs.push(item); + }, + on_breadcrumb_clicked: function(ev) { + var $e = $(ev.target); + var item; + for (var i = 0; i < this.breadcrumbs.length; i += 1) { + var it = this.breadcrumbs[i]; + if (it.id == $e.data('id')) { + item = it; + continue; + } + if (item) { + // Remove items after selected item + this.remove_breadcrumb(i); + } + } + var index = $e.parent().find('.oe_breadcrumb_item[data-id=' + $e.data('id') + ']').index($e); + item.show(index, $e); + this.inner_widget = item.widget; + }, + clear_breadcrumbs: function() { + while (this.breadcrumbs.length) { + this.remove_breadcrumb(0); + } + }, + remove_breadcrumb: function(index) { + var item = this.breadcrumbs.splice(index, 1)[0]; + if (item) { + var dups = _.filter(this.breadcrumbs, function(it) { + return item.widget === it.widget; + }); + if (!dups.length) { + item.destroy(); + } + } + }, + get_title: function() { + var titles = []; + for (var i = 0; i < this.breadcrumbs.length; i += 1) { + var item = this.breadcrumbs[i]; + var tit = item.get_title(); + if (!_.isArray(tit)) { + tit = [tit]; + } + for (var j = 0; j < tit.length; j += 1) { + var label = _.escape(tit[j]); + if (i === this.breadcrumbs.length - 1 && j === tit.length - 1) { + titles.push(label); + } else { + titles.push(_.str.sprintf('%s', item.id, label)); + } + } + } + return titles.join(' / '); + }, do_push_state: function(state) { if (this.getParent() && this.getParent().do_push_state) { if (this.inner_action) { @@ -43,7 +115,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ var self = this, action_loaded; if (state.action_id) { - var run_action = (!this.inner_widget && !this.inner_widget.action) || this.inner_widget.action.id !== state.action_id; + var run_action = (!this.inner_widget || !this.inner_widget.action) || this.inner_widget.action.id !== state.action_id; if (run_action) { this.null_action(); action_loaded = this.do_action(state.action_id); @@ -118,7 +190,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ }, null_action: function() { this.dialog_stop(); - this.breadcrumb.clear(); + this.clear_breadcrumbs(); }, ir_actions_act_window: function (action, on_close) { var self = this; @@ -143,7 +215,6 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.dialog.open(); } else { this.dialog_stop(); - this.breadcrumb.hide_items(); if(action.menu_id) { return this.getParent().do_action(action, function () { instance.webclient.menu.open_menu(action.menu_id); @@ -151,7 +222,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ } this.inner_action = action; var inner_widget = this.inner_widget = new instance.web.ViewManagerAction(this, action); - this.breadcrumb.push_viewmanager(inner_widget); + inner_widget.add_breadcrumb(); this.inner_widget.appendTo(this.$element); } }, @@ -172,10 +243,9 @@ instance.web.ActionManager = instance.web.Widget.extend({ }, ir_actions_client: function (action) { this.dialog_stop(); - this.breadcrumb.hide_items(); var ClientWidget = instance.web.client_actions.get_object(action.tag); this.inner_widget = new ClientWidget(this, action.params); - this.breadcrumb.push({ + this.push_breadcrumb({ widget: this.inner_widget, title: action.name }); @@ -213,115 +283,6 @@ instance.web.ActionManager = instance.web.Widget.extend({ }); instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ - init: function(parent) { - this._super(parent); - this.items = []; - this.action_manager = parent; - this.action_manager.$element.on('click', '.oe_breadcrumb_item', this.on_item_clicked); - }, - push: function(item) { - item.id = _.uniqueId('breadcrumb_'); - item.show = item.show || function() { - item.widget.$element.show(); - }; - item.hide = item.hide || function() { - item.widget.$element.hide(); - }; - item.destroy = item.destroy || function() { - item.widget.destroy(); - }; - item.get_title = item.get_title || function() { - return item.title || item.widget.get('title'); - }; - this.items.push(item); - }, - push_viewmanager: function(vm) { - var self = this; - var views = [vm.active_view || vm.views_src[0].view_type]; - vm.on_mode_switch.add(function(mode) { - var last = views.slice(-1)[0]; - if (mode !== last) { - if (mode !== 'form') { - views.length = 0; - } - views.push(mode); - } - }); - this.push({ - widget: vm, - show: function(index, $e) { - var view_to_select = views[index]; - vm.$element.show(); - if (vm.active_view !== view_to_select) { - vm.on_mode_switch(view_to_select); - vm.set_title(); - } - }, - get_title: function() { - return _.map(views, function(v) { - return vm.views[v].controller.get('title'); - }); - } - }); - }, - get_title: function() { - var titles = []; - for (var i = 0; i < this.items.length; i += 1) { - var item = this.items[i]; - var tit = item.get_title(); - if (!_.isArray(tit)) { - tit = [tit]; - } - for (var j = 0; j < tit.length; j += 1) { - var label = _.escape(tit[j]); - if (i === this.items.length - 1 && j === tit.length - 1) { - titles.push(label); - } else { - titles.push(_.str.sprintf('%s', item.id, label)); - } - } - } - return titles.join(' / '); - }, - hide_items: function() { - _.each(this.items, function(i) { - i.hide(); - }); - }, - on_item_clicked: function(ev) { - var $e = $(ev.target); - var item; - for (var i = 0; i < this.items.length; i += 1) { - var it = this.items[i]; - if (it.id == $e.data('id')) { - item = it; - continue; - } - if (item) { - // Remove items after selected item - this.remove_item(i); - } - } - var index = $e.parent().find('.oe_breadcrumb_item[data-id=' + $e.data('id') + ']').index($e); - item.show(index, $e); - this.action_manager.inner_widget = item.widget; - }, - remove_item: function(index) { - var item = this.items.splice(index, 1)[0]; - if (item) { - var dups = _.filter(this.items, function(it) { - return item.widget === it.widget; - }); - if (!dups.length) { - item.destroy(); - } - } - }, - clear: function() { - while (this.items.length) { - this.remove_item(0); - } - }, }); instance.web.ViewManager = instance.web.Widget.extend({ @@ -478,6 +439,34 @@ instance.web.ViewManager = instance.web.Widget.extend({ set_title: function(title) { this.$element.find('.oe_view_title_text:first').text(title); }, + add_breadcrumb: function() { + var self = this; + var views = [this.active_view || this.views_src[0].view_type]; + this.on_mode_switch.add(function(mode) { + var last = views.slice(-1)[0]; + if (mode !== last) { + if (mode !== 'form') { + views.length = 0; + } + views.push(mode); + } + }); + this.getParent().push_breadcrumb({ + widget: this, + show: function(index, $e) { + var view_to_select = views[index]; + self.$element.show(); + if (self.active_view !== view_to_select) { + self.on_mode_switch(view_to_select); + } + }, + get_title: function() { + return _.map(views, function(v) { + return self.views[v].controller.get('title'); + }); + } + }); + }, /** * Method used internally when a view asks to switch view. This method is meant * to be extended by child classes to change the default behavior, which simply @@ -791,10 +780,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ view: controller, view_manager: self })); - if (!self.action.name && fvg) { - self.$element.find('.oe_view_title_text').text(fvg.arch.attrs.string || fvg.name); - } - + self.set_title(fvg.arch.attrs.string || fvg.name); }); }, do_create_view: function(view_type) { @@ -804,10 +790,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ return r; }, set_title: function(title) { - var breadcrumb = this.getParent().breadcrumb; - if (breadcrumb) { - this.$element.find('.oe_breadcrumb_title:first').html(breadcrumb.get_title()); - } + this.$element.find('.oe_breadcrumb_title:first').html(this.getParent().get_title()); }, do_push_state: function(state) { if (this.getParent() && this.getParent().do_push_state) {