From 6b6cd671965b074aa81beaf27c3f7d987f44f166 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 3 Jul 2012 18:17:20 +0200 Subject: [PATCH 01/24] [WIP] Breadcrumb bzr revid: fme@openerp.com-20120703161720-kiavze0kmxs6v5uq --- addons/web/static/src/js/views.js | 58 ++++++++++++++++++++++++++++-- addons/web/static/src/xml/base.xml | 14 +++++++- 2 files changed, 68 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 98df8a0af0d..d623c889e55 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -15,6 +15,10 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.dialog_viewmanager = null; this.client_widget = null; }, + start: function() { + this._super.apply(this, arguments); + this.bread_crumb = new instance.web.BreadCrumb(this); + }, dialog_stop: function () { if (this.dialog) { this.dialog_viewmanager.destroy(); @@ -150,7 +154,8 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.dialog.open(); } else { this.dialog_stop(); - this.content_stop(); + //this.content_stop(); + this.bread_crumb.hide_all(); if(action.menu_id) { return this.getParent().do_action(action, function () { instance.webclient.menu.open_menu(action.menu_id); @@ -160,6 +165,11 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.inner_viewmanager = new instance.web.ViewManagerAction(this, action); this.inner_viewmanager.appendTo(this.$element); this.inner_viewmanager.$element.addClass("oe_view_manager_" + action.target); + this.bread_crumb.add({ + view_manager: this.inner_viewmanager, + action: action, + title: action.name + }); } }, ir_actions_act_window_close: function (action, on_closed) { @@ -214,6 +224,43 @@ instance.web.ActionManager = instance.web.Widget.extend({ } }); +instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ + init: function(parent) { + this._super(parent); + this.action_manager = parent; + this.items = []; + this.action_manager.$element.on('click', '.oe_breadcrumb_item', this.on_item_clicked); + }, + add: function(item) { + this.items.push(item); + }, + hide_all: function() { + _.each(this.items, function(i) { + i.view_manager.$element.hide(); + }); + }, + get_title: function() { + return QWeb.render('BreadCrumb', { widget: this }); + }, + on_item_clicked: function(ev) { + var $e = $(ev.target); + var index = $e.data('index'); + this.select_item(index); + }, + select_item: function(index) { + for (var i = index + 1; i < this.items.length; i += 1) { + this.remove_item(i); + } + this.items[index].view_manager.$element.show(); + }, + remove_item: function(index) { + var item = this.items.splice(index, 1)[0]; + if (item) { + item.view_manager.destroy(); + } + } +}); + instance.web.ViewManager = instance.web.Widget.extend({ template: "ViewManager", init: function(parent, dataset, views, flags) { @@ -350,7 +397,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ } }); - self.$element.find('.oe_view_title_text:first').text( + self.$element.find('.oe_view_title_text:first').html( self.display_title()); }); return view_promise; @@ -703,7 +750,12 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ }); }, display_title: function () { - return this.action.name; + var am = this.getParent(); + if (am) { + return am.bread_crumb.get_title(); + } else { + return _.escape(this.action.name); + } } }); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 29a7a61aa30..45cf3acafb3 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -396,6 +396,18 @@ + + + + + + / + + + + + +
@@ -405,7 +417,7 @@

- +

From 7af6fa7e8f78bef83d161325db7d4268b9bd0222 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 4 Jul 2012 11:56:55 +0200 Subject: [PATCH 02/24] [WIP] breadcrumb bzr revid: fme@openerp.com-20120704095655-kxdhcsb5n7i0i7i6 --- addons/web/static/src/js/views.js | 45 ++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index d623c889e55..56b85f0b876 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -17,7 +17,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ }, start: function() { this._super.apply(this, arguments); - this.bread_crumb = new instance.web.BreadCrumb(this); + this.breadcrumb = new instance.web.BreadCrumb(this); }, dialog_stop: function () { if (this.dialog) { @@ -28,6 +28,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ } }, content_stop: function () { + // TODO: problem with bread crumb here. Check if those references are needed if (this.inner_viewmanager) { this.inner_viewmanager.destroy(); this.inner_viewmanager = null; @@ -124,6 +125,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ console.error("Action manager can't handle action of type " + action.type, action); return; } + console.log("Action", action); return this[type](action, on_close); }, null_action: function() { @@ -155,7 +157,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ } else { this.dialog_stop(); //this.content_stop(); - this.bread_crumb.hide_all(); + this.breadcrumb.hide_all(); if(action.menu_id) { return this.getParent().do_action(action, function () { instance.webclient.menu.open_menu(action.menu_id); @@ -165,8 +167,8 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.inner_viewmanager = new instance.web.ViewManagerAction(this, action); this.inner_viewmanager.appendTo(this.$element); this.inner_viewmanager.$element.addClass("oe_view_manager_" + action.target); - this.bread_crumb.add({ - view_manager: this.inner_viewmanager, + this.breadcrumb.add({ + widget: this.inner_viewmanager, action: action, title: action.name }); @@ -188,10 +190,16 @@ instance.web.ActionManager = instance.web.Widget.extend({ }); }, ir_actions_client: function (action) { - this.content_stop(); + //this.content_stop(); this.dialog_stop(); + this.breadcrumb.hide_all(); var ClientWidget = instance.web.client_actions.get_object(action.tag); (this.client_widget = new ClientWidget(this, action.params)).appendTo(this.$element); + this.breadcrumb.add({ + widget: this.client_widget, + action: action, + title: action.name + }); }, ir_actions_report_xml: function(action, on_closed) { var self = this; @@ -233,10 +241,11 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ }, add: function(item) { this.items.push(item); + console.log("BreadCrumb: add ", item); }, hide_all: function() { _.each(this.items, function(i) { - i.view_manager.$element.hide(); + i.widget.$element.hide(); }); }, get_title: function() { @@ -251,14 +260,30 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ for (var i = index + 1; i < this.items.length; i += 1) { this.remove_item(i); } - this.items[index].view_manager.$element.show(); + var item = this.items[index]; + if (item) { + item.widget.$element.show(); + } else { + console.warn("Breadcrumb: Can't select item at index", index); + } }, remove_item: function(index) { var item = this.items.splice(index, 1)[0]; if (item) { - item.view_manager.destroy(); + item.widget.destroy(); + } else { + console.warn("Breadcrumb: Can't remove item at index", index); } - } + }, + clear: function() { + while (this.items.length) { + this.remove_item(0); + } + }, + back: function() { + this.remove_item(this.items.length - 1); + this.select_item(this.items.length - 1); + }, }); instance.web.ViewManager = instance.web.Widget.extend({ @@ -752,7 +777,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ display_title: function () { var am = this.getParent(); if (am) { - return am.bread_crumb.get_title(); + return am.breadcrumb.get_title(); } else { return _.escape(this.action.name); } From 575455c135ac0f61da2cc4b83fe427308556eed7 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 4 Jul 2012 16:53:11 +0200 Subject: [PATCH 03/24] [WIP] Breadcrumb bzr revid: fme@openerp.com-20120704145311-k7akbzz0gv9lf3ps --- addons/web/static/src/js/chrome.js | 1 + addons/web/static/src/js/views.js | 51 +++++++++++++++++++++++------- addons/web/static/src/xml/base.xml | 4 +-- 3 files changed, 43 insertions(+), 13 deletions(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index b87ebe56856..7aea1cdd5e3 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -1036,6 +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.do_action(action); }); }, diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 56b85f0b876..368dd5e840c 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -125,7 +125,6 @@ instance.web.ActionManager = instance.web.Widget.extend({ console.error("Action manager can't handle action of type " + action.type, action); return; } - console.log("Action", action); return this[type](action, on_close); }, null_action: function() { @@ -167,11 +166,15 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.inner_viewmanager = new instance.web.ViewManagerAction(this, action); this.inner_viewmanager.appendTo(this.$element); this.inner_viewmanager.$element.addClass("oe_view_manager_" + action.target); - this.breadcrumb.add({ + this.breadcrumb.push({ widget: this.inner_viewmanager, action: action, title: action.name }); + // show + // hide + // destroy + // title // all view get_title ?? } }, ir_actions_act_window_close: function (action, on_closed) { @@ -195,7 +198,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.breadcrumb.hide_all(); var ClientWidget = instance.web.client_actions.get_object(action.tag); (this.client_widget = new ClientWidget(this, action.params)).appendTo(this.$element); - this.breadcrumb.add({ + this.breadcrumb.push({ widget: this.client_widget, action: action, title: action.name @@ -239,13 +242,37 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ this.items = []; this.action_manager.$element.on('click', '.oe_breadcrumb_item', this.on_item_clicked); }, - add: function(item) { + push: function(item) { + if (!item.show) { + item.show = function() { + item.widget.$element.show(); + }; + } + if (!item.hide) { + item.hide = function() { + return item.widget.$element.hide(); + }; + } + if (!item.destroy) { + item.destroy = function() { + return item.widget.destroy(); + }; + } + if (!item.get_title) { + item.get_title = function() { + return item.action.name; + }; + } this.items.push(item); console.log("BreadCrumb: add ", item); }, + pop: function() { + this.remove_item(this.items.length - 1); + this.select_item(this.items.length - 1); + }, hide_all: function() { _.each(this.items, function(i) { - i.widget.$element.hide(); + i.hide(); }); }, get_title: function() { @@ -262,7 +289,7 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ } var item = this.items[index]; if (item) { - item.widget.$element.show(); + item.show(); } else { console.warn("Breadcrumb: Can't select item at index", index); } @@ -270,7 +297,7 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ remove_item: function(index) { var item = this.items.splice(index, 1)[0]; if (item) { - item.widget.destroy(); + item.destroy(); } else { console.warn("Breadcrumb: Can't remove item at index", index); } @@ -280,10 +307,6 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ this.remove_item(0); } }, - back: function() { - this.remove_item(this.items.length - 1); - this.select_item(this.items.length - 1); - }, }); instance.web.ViewManager = instance.web.Widget.extend({ @@ -1141,6 +1164,12 @@ instance.web.View = instance.web.Widget.extend({ } this.translate_dialog.open(field); }, + /** + * Get the title of the view + */ + get_title: function() { + return ""; + }, /** * Fetches and executes the action identified by ``action_data``. * diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index 45cf3acafb3..b5b4c708b97 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -400,11 +400,11 @@ - + / - + From 1a2c33faa2fcd3112c76b287c19cd3be0538e728 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 5 Jul 2012 10:04:50 +0200 Subject: [PATCH 04/24] [WIP] breadcrumb bzr revid: fme@openerp.com-20120705080450-j1o7p0vebjtd4ch3 --- addons/web/static/src/js/view_form.js | 2 ++ addons/web/static/src/js/views.js | 45 +++++++++++++++++---------- 2 files changed, 31 insertions(+), 16 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index d40a1760e81..607f3283179 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -287,10 +287,12 @@ instance.web.FormView = instance.web.View.extend(instance.web.form.FieldManagerM on_record_loaded: function(record) { var self = this, set_values = []; if (!record) { + this.set({ 'title' : undefined }); this.do_warn("Form", "The record could not be found in the database.", true); return $.Deferred().reject(); } this.datarecord = record; + this.set({ 'title' : record.id ? record.name : "New record" }); if (this.qweb) { this.kill_current_form(); diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 368dd5e840c..f4ec3d4458d 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -156,25 +156,44 @@ instance.web.ActionManager = instance.web.Widget.extend({ } else { this.dialog_stop(); //this.content_stop(); - this.breadcrumb.hide_all(); + this.breadcrumb.hide_items(); if(action.menu_id) { return this.getParent().do_action(action, function () { instance.webclient.menu.open_menu(action.menu_id); }); } this.inner_action = action; - this.inner_viewmanager = new instance.web.ViewManagerAction(this, action); + var inner_viewmanager = this.inner_viewmanager = new instance.web.ViewManagerAction(this, action); this.inner_viewmanager.appendTo(this.$element); this.inner_viewmanager.$element.addClass("oe_view_manager_" + action.target); + this.breadcrumb.push({ - widget: this.inner_viewmanager, + widget: inner_viewmanager, + show: function() { + inner_viewmanager.$element.show(); + inner_viewmanager.on_mode_switch(action.view_mode.split(',')[0]); + }, action: action, title: action.name }); - // show - // hide - // destroy - // title // all view get_title ?? + inner_viewmanager.on_mode_switch.add_first(function(mode) { + if (mode === 'form' && !inner_viewmanager.views[mode].controller) { + self.breadcrumb.push({ + widget: inner_viewmanager, + show: function() { + inner_viewmanager.$element.show(); + inner_viewmanager.on_mode_switch('form'); + }, + action: action, + get_title: function() { + var form = inner_viewmanager.views['form'].controller; + if (form) { + return form.get('title'); + } + } + }); + } + }); } }, ir_actions_act_window_close: function (action, on_closed) { @@ -195,7 +214,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ ir_actions_client: function (action) { //this.content_stop(); this.dialog_stop(); - this.breadcrumb.hide_all(); + this.breadcrumb.hide_items(); var ClientWidget = instance.web.client_actions.get_object(action.tag); (this.client_widget = new ClientWidget(this, action.params)).appendTo(this.$element); this.breadcrumb.push({ @@ -260,7 +279,7 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ } if (!item.get_title) { item.get_title = function() { - return item.action.name; + return item.title || item.action.name; }; } this.items.push(item); @@ -270,7 +289,7 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ this.remove_item(this.items.length - 1); this.select_item(this.items.length - 1); }, - hide_all: function() { + hide_items: function() { _.each(this.items, function(i) { i.hide(); }); @@ -1164,12 +1183,6 @@ instance.web.View = instance.web.Widget.extend({ } this.translate_dialog.open(field); }, - /** - * Get the title of the view - */ - get_title: function() { - return ""; - }, /** * Fetches and executes the action identified by ``action_data``. * From 17b09849fb6c4d54796bc7e953264315d8f16acf Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 5 Jul 2012 16:22:46 +0200 Subject: [PATCH 05/24] [WIP] Breakpoint commit. Gonna refactor everything bzr revid: fme@openerp.com-20120705142246-yelkx5eqxxzyf45i --- addons/web/static/src/js/views.js | 108 ++++++++++++++--------------- addons/web/static/src/xml/base.xml | 2 +- 2 files changed, 54 insertions(+), 56 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index f4ec3d4458d..73dd9002a52 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -166,34 +166,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ var inner_viewmanager = this.inner_viewmanager = new instance.web.ViewManagerAction(this, action); this.inner_viewmanager.appendTo(this.$element); this.inner_viewmanager.$element.addClass("oe_view_manager_" + action.target); - - this.breadcrumb.push({ - widget: inner_viewmanager, - show: function() { - inner_viewmanager.$element.show(); - inner_viewmanager.on_mode_switch(action.view_mode.split(',')[0]); - }, - action: action, - title: action.name - }); - inner_viewmanager.on_mode_switch.add_first(function(mode) { - if (mode === 'form' && !inner_viewmanager.views[mode].controller) { - self.breadcrumb.push({ - widget: inner_viewmanager, - show: function() { - inner_viewmanager.$element.show(); - inner_viewmanager.on_mode_switch('form'); - }, - action: action, - get_title: function() { - var form = inner_viewmanager.views['form'].controller; - if (form) { - return form.get('title'); - } - } - }); - } - }); + this.breadcrumb.push_actionmanager(inner_viewmanager); } }, ir_actions_act_window_close: function (action, on_closed) { @@ -219,7 +192,6 @@ instance.web.ActionManager = instance.web.Widget.extend({ (this.client_widget = new ClientWidget(this, action.params)).appendTo(this.$element); this.breadcrumb.push({ widget: this.client_widget, - action: action, title: action.name }); }, @@ -269,34 +241,62 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ } if (!item.hide) { item.hide = function() { - return item.widget.$element.hide(); + item.widget.$element.hide(); }; } if (!item.destroy) { item.destroy = function() { - return item.widget.destroy(); + item.widget.destroy(); }; } if (!item.get_title) { item.get_title = function() { - return item.title || item.action.name; + return item.title || item.widget.get('title'); }; } this.items.push(item); - console.log("BreadCrumb: add ", item); + }, + push_actionmanager: function(am) { + var self = this; + var bookmarked_view = am.active_view; + this.push({ + widget: am, + show: function() { + am.$element.show(); + am.on_mode_switch(current_view); + } + }); + am.on_mode_switch.add_first(function(mode) { + if (mode === 'form' && !am.views[mode].controller) { + self.push({ + widget: am, + show: function() { + am.$element.show(); + inner_viewmanager.on_mode_switch('form'); + }, + action: action, + get_title: function() { + var form = inner_viewmanager.views['form'].controller; + if (form) { + return form.get('title'); + } + } + }); + } + }); }, pop: function() { this.remove_item(this.items.length - 1); this.select_item(this.items.length - 1); }, + get_title: function() { + return QWeb.render('BreadCrumb', { widget: this }); + }, hide_items: function() { _.each(this.items, function(i) { i.hide(); }); }, - get_title: function() { - return QWeb.render('BreadCrumb', { widget: this }); - }, on_item_clicked: function(ev) { var $e = $(ev.target); var index = $e.data('index'); @@ -380,6 +380,14 @@ instance.web.ViewManager = instance.web.Widget.extend({ if (this.flags.views_switcher === false) { this.$element.find('.oe_view_manager_switch').hide(); } + this.on('change:title', this, function() { + var breadcrumb = self.getParent().breadcrumb; + if (breadcrumb) { + self.$element.find('.oe_view_title_text:first').html(breadcrumb.get_title()); + } else { + self.$element.find('.oe_view_title_text:first').text(self.get('title')); + } + }); // If no default view defined, switch to the first one in sequence var default_view = this.flags.default_view || this.views_src[0].view_type; return this.on_mode_switch(default_view); @@ -416,10 +424,16 @@ instance.web.ViewManager = instance.web.Widget.extend({ } } var controller = new controllerclass(this, this.dataset, view.view_id, options); + controller.on("change:title", this, function() { + if (self.active_view === view_type) { + self.set({ 'title' : controller.get('title') }); + } + }); if (view.embedded_view) { controller.set_embedded_view(view.embedded_view); } controller.do_switch_view.add_last(_.bind(this.switch_view, this)); + controller.do_prev_view.add_last(this.on_prev_view); var container = this.$element.find(".oe_view_manager_view_" + view_type); view_promise = controller.appendTo(container); @@ -463,9 +477,6 @@ instance.web.ViewManager = instance.web.Widget.extend({ } } }); - - self.$element.find('.oe_view_title_text:first').html( - self.display_title()); }); return view_promise; }, @@ -561,14 +572,6 @@ instance.web.ViewManager = instance.web.Widget.extend({ */ on_action_executed: function () { }, - display_title: function () { - var view = this.views[this.active_view]; - if (view) { - // ick - return view.controller.fields_view.arch.attrs.string; - } - return ''; - } }); instance.web.ViewManagerAction = instance.web.ViewManager.extend({ @@ -613,7 +616,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ if (this.session.hidden_menutips) { return; } - this.session.hidden_menutips = {} + this.session.hidden_menutips = {}; }, /** * Initializes the ViewManagerAction: sets up the searchview (if the @@ -816,13 +819,8 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ self.views[self.active_view].controller.do_load_state(state, warm); }); }, - display_title: function () { - var am = this.getParent(); - if (am) { - return am.breadcrumb.get_title(); - } else { - return _.escape(this.action.name); - } + set_title: function (title) { + this.getParent().breadcrumb.update(); } }); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index b5b4c708b97..c81b00d623c 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -417,7 +417,7 @@

- +

From 4f04c1b80b76eaf885cc298fc87554a1372a8cc2 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 5 Jul 2012 21:22:27 +0200 Subject: [PATCH 06/24] [WIP] Refactor views title managment + lazy loading bzr revid: fme@openerp.com-20120705192227-r4hu0kcq3ngqsud4 --- addons/web/static/src/js/views.js | 154 ++++++++++++++++------------- addons/web/static/src/xml/base.xml | 2 +- 2 files changed, 86 insertions(+), 70 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 73dd9002a52..dfb63808fac 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -164,9 +164,9 @@ instance.web.ActionManager = instance.web.Widget.extend({ } this.inner_action = action; var inner_viewmanager = this.inner_viewmanager = new instance.web.ViewManagerAction(this, action); + this.breadcrumb.push_actionmanager(inner_viewmanager); this.inner_viewmanager.appendTo(this.$element); this.inner_viewmanager.$element.addClass("oe_view_manager_" + action.target); - this.breadcrumb.push_actionmanager(inner_viewmanager); } }, ir_actions_act_window_close: function (action, on_closed) { @@ -254,36 +254,34 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ return item.title || item.widget.get('title'); }; } + console.log("breadcrumb push", item); this.items.push(item); }, - push_actionmanager: function(am) { + push_actionmanager: function(am, view_type) { var self = this; - var bookmarked_view = am.active_view; + var bookmarked_view = view_type || am.active_view || am.views_src[0].view_type; this.push({ widget: am, show: function() { am.$element.show(); - am.on_mode_switch(current_view); - } - }); - am.on_mode_switch.add_first(function(mode) { - if (mode === 'form' && !am.views[mode].controller) { - self.push({ - widget: am, - show: function() { - am.$element.show(); - inner_viewmanager.on_mode_switch('form'); - }, - action: action, - get_title: function() { - var form = inner_viewmanager.views['form'].controller; - if (form) { - return form.get('title'); - } - } - }); + if (am.active_view !== bookmarked_view) { + am.on_mode_switch(bookmarked_view); + am.set_title(); + } + }, + get_title: function() { + return am.views[bookmarked_view].controller.get('title'); } }); + if (bookmarked_view !== 'form') { + am.on_mode_switch.add_first(function(mode) { + if (mode === 'form') { + self.push_actionmanager(am, 'form'); + } else { + // select previous to form and remove form + } + }); + } }, pop: function() { this.remove_item(this.items.length - 1); @@ -314,9 +312,16 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ } }, remove_item: function(index) { + console.log("Breadcrumb remove index", index); var item = this.items.splice(index, 1)[0]; if (item) { - item.destroy(); + var dups = _.filter(this.items, function(it) { + return item.widget === it.widget; + }); + if (dups.length === 0) { + console.log("Breadcrumb Destroy", item); + item.destroy(); + } } else { console.warn("Breadcrumb: Can't remove item at index", index); } @@ -380,14 +385,6 @@ instance.web.ViewManager = instance.web.Widget.extend({ if (this.flags.views_switcher === false) { this.$element.find('.oe_view_manager_switch').hide(); } - this.on('change:title', this, function() { - var breadcrumb = self.getParent().breadcrumb; - if (breadcrumb) { - self.$element.find('.oe_view_title_text:first').html(breadcrumb.get_title()); - } else { - self.$element.find('.oe_view_title_text:first').text(self.get('title')); - } - }); // If no default view defined, switch to the first one in sequence var default_view = this.flags.default_view || this.views_src[0].view_type; return this.on_mode_switch(default_view); @@ -412,41 +409,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ this.active_view = view_type; if (!view.controller) { - // Lazy loading of views - var controllerclass = this.registry.get_object(view_type); - var options = _.clone(view.options); - if (view_type === "form" && this.action) { - switch (this.action.target) { - case 'new': - case 'inline': - options.initial_mode = 'edit'; - break; - } - } - var controller = new controllerclass(this, this.dataset, view.view_id, options); - controller.on("change:title", this, function() { - if (self.active_view === view_type) { - self.set({ 'title' : controller.get('title') }); - } - }); - if (view.embedded_view) { - controller.set_embedded_view(view.embedded_view); - } - controller.do_switch_view.add_last(_.bind(this.switch_view, this)); - - controller.do_prev_view.add_last(this.on_prev_view); - var container = this.$element.find(".oe_view_manager_view_" + view_type); - view_promise = controller.appendTo(container); - this.views[view_type].controller = controller; - this.views[view_type].deferred.resolve(view_type); - $.when(view_promise).then(function() { - self.on_controller_inited(view_type, controller); - if (self.searchview - && self.flags.auto_search - && view.controller.searchable !== false) { - self.searchview.ready.then(self.searchview.do_search); - } - }); + view_promise = this.do_create_view(view_type); } else if (this.searchview && self.flags.auto_search && view.controller.searchable !== false) { @@ -480,6 +443,50 @@ instance.web.ViewManager = instance.web.Widget.extend({ }); return view_promise; }, + do_create_view: function(view_type) { + // Lazy loading of views + var self = this; + var view = this.views[view_type]; + var controllerclass = this.registry.get_object(view_type); + var options = _.clone(view.options); + if (view_type === "form" && this.action) { + switch (this.action.target) { + case 'new': + case 'inline': + options.initial_mode = 'edit'; + break; + } + } + var controller = new controllerclass(this, this.dataset, view.view_id, options); + + controller.on("change:title", this, function() { + if (self.active_view === view_type) { + self.set_title(controller.get('title')); + } + }); + + if (view.embedded_view) { + controller.set_embedded_view(view.embedded_view); + } + controller.do_switch_view.add_last(_.bind(this.switch_view, this)); + + controller.do_prev_view.add_last(this.on_prev_view); + var container = this.$element.find(".oe_view_manager_view_" + view_type); + var view_promise = controller.appendTo(container); + this.views[view_type].controller = controller; + this.views[view_type].deferred.resolve(view_type); + return $.when(view_promise).then(function() { + self.on_controller_inited(view_type, controller); + if (self.searchview + && self.flags.auto_search + && view.controller.searchable !== false) { + self.searchview.ready.then(self.searchview.do_search); + } + }); + }, + set_title: function(title) { + this.$element.find('.oe_view_title_text:first').text(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 @@ -798,6 +805,18 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ }); }, + do_create_view: function(view_type) { + var r = this._super.apply(this, arguments); + var view = this.views[view_type].controller; + view.set({ 'title': this.action.name }); + return r; + }, + set_title: function(title) { + var breadcrumb = this.getParent().breadcrumb; + if (breadcrumb) { + this.$element.find('.oe_breadcrumb_title:first').html(breadcrumb.get_title()); + } + }, do_push_state: function(state) { if (this.getParent() && this.getParent().do_push_state) { state["view_type"] = this.active_view; @@ -819,9 +838,6 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ self.views[self.active_view].controller.do_load_state(state, warm); }); }, - set_title: function (title) { - this.getParent().breadcrumb.update(); - } }); instance.web.Sidebar = instance.web.Widget.extend({ diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index c81b00d623c..7dbf3bd4d7a 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -399,7 +399,7 @@ - + / From 648ea3e7ca278796ac781f1ba918235fe31cbf4a Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 5 Jul 2012 21:27:01 +0200 Subject: [PATCH 07/24] [WIP] Breadcrumb: compact code, fix client actions bzr revid: fme@openerp.com-20120705192701-3lzkdadaqtjo7wm0 --- addons/web/static/src/js/views.js | 35 +++++++++++++------------------ 1 file changed, 14 insertions(+), 21 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index dfb63808fac..e6d404701a1 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -189,11 +189,12 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.dialog_stop(); this.breadcrumb.hide_items(); var ClientWidget = instance.web.client_actions.get_object(action.tag); - (this.client_widget = new ClientWidget(this, action.params)).appendTo(this.$element); + this.client_widget = new ClientWidget(this, action.params); this.breadcrumb.push({ widget: this.client_widget, title: action.name }); + this.client_widget.appendTo(this.$element); }, ir_actions_report_xml: function(action, on_closed) { var self = this; @@ -234,26 +235,18 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ this.action_manager.$element.on('click', '.oe_breadcrumb_item', this.on_item_clicked); }, push: function(item) { - if (!item.show) { - item.show = function() { - item.widget.$element.show(); - }; - } - if (!item.hide) { - item.hide = function() { - item.widget.$element.hide(); - }; - } - if (!item.destroy) { - item.destroy = function() { - item.widget.destroy(); - }; - } - if (!item.get_title) { - item.get_title = function() { - return item.title || item.widget.get('title'); - }; - } + 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'); + }; console.log("breadcrumb push", item); this.items.push(item); }, From 607730850992b8b1bbf27a4172fb99c5e5ec9c24 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Mon, 9 Jul 2012 12:32:15 +0200 Subject: [PATCH 08/24] [WIP] Pop breadcrumb on mode switch != form bzr revid: fme@openerp.com-20120709103215-bemcmt5silu5u4je --- addons/web/static/src/js/views.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index e6d404701a1..7bf462faf51 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -130,6 +130,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ null_action: function() { this.dialog_stop(); this.content_stop(); + this.breadcrumb.clear(); }, ir_actions_act_window: function (action, on_close) { var self = this; @@ -255,6 +256,7 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ var bookmarked_view = view_type || am.active_view || am.views_src[0].view_type; this.push({ widget: am, + view: bookmarked_view, show: function() { am.$element.show(); if (am.active_view !== bookmarked_view) { @@ -271,7 +273,10 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ if (mode === 'form') { self.push_actionmanager(am, 'form'); } else { - // select previous to form and remove form + var last = self.items[self.items.length - 1]; + if (last.widget === am && last.view === 'form') { + self.pop(); + } } }); } From f6d6f85a089188c3eaf6b6ad7e57df2866122242 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 10 Jul 2012 10:36:33 +0200 Subject: [PATCH 09/24] [WIP] breakpoint bzr revid: fme@openerp.com-20120710083633-ti8s1qg5s0tuhwla --- addons/web/static/src/js/views.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 7bf462faf51..dcd29211db1 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -261,6 +261,7 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ am.$element.show(); if (am.active_view !== bookmarked_view) { am.on_mode_switch(bookmarked_view); + console.log("breadcrunb pushaction man ager set title on show"); am.set_title(); } }, @@ -273,8 +274,8 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ if (mode === 'form') { self.push_actionmanager(am, 'form'); } else { - var last = self.items[self.items.length - 1]; - if (last.widget === am && last.view === 'form') { + var previous = self.items[self.items.length - 1]; + if (previous.widget === am && previous && previous.view === 'form') { self.pop(); } } @@ -459,6 +460,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ controller.on("change:title", this, function() { if (self.active_view === view_type) { + console.log("controller.on change:title"); self.set_title(controller.get('title')); } }); From 14c66c73767c293d99145a60d8dca5ffe2ffa512 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 10 Jul 2012 18:29:13 +0200 Subject: [PATCH 10/24] [WIP] Refactor again bzr revid: fme@openerp.com-20120710162913-6gyda8y3e6vu86ph --- addons/web/static/src/js/views.js | 96 ++++++++++++++++++------------ addons/web/static/src/xml/base.xml | 12 ---- 2 files changed, 57 insertions(+), 51 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index eaf9487473e..df57dc8e9be 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -165,7 +165,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ } this.inner_action = action; var inner_viewmanager = this.inner_viewmanager = new instance.web.ViewManagerAction(this, action); - this.breadcrumb.push_actionmanager(inner_viewmanager); + this.breadcrumb.push_viewmanager(inner_viewmanager); this.inner_viewmanager.appendTo(this.$element); this.inner_viewmanager.$element.addClass("oe_view_manager_" + (action.target || 'current')); } @@ -236,6 +236,7 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ 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(); }; @@ -251,43 +252,58 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ console.log("breadcrumb push", item); this.items.push(item); }, - push_actionmanager: function(am, view_type) { + push_viewmanager: function(vm, view_type) { var self = this; - var bookmarked_view = view_type || am.active_view || am.views_src[0].view_type; + var bookmarked_view = view_type || vm.active_view || vm.views_src[0].view_type; + var views = [bookmarked_view]; + 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); + } + console.log(views); + }); this.push({ - widget: am, + widget: vm, view: bookmarked_view, - show: function() { - am.$element.show(); - if (am.active_view !== bookmarked_view) { - am.on_mode_switch(bookmarked_view); - console.log("breadcrunb pushaction man ager set title on show"); - am.set_title(); + show: function($e) { + var index = $e.parent().find('.oe_breadcrumb_item[data-id=' + $e.data('id') + ']').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 am.views[bookmarked_view].controller.get('title'); + return _.map(views, function(v) { + return vm.views[v].controller.get('title'); + }); } }); - if (bookmarked_view !== 'form') { - am.on_mode_switch.add_first(function(mode) { - if (mode === 'form') { - self.push_actionmanager(am, 'form'); - } else { - var previous = self.items[self.items.length - 1]; - if (previous.widget === am && previous && previous.view === 'form') { - self.pop(); - } - } - }); - } - }, - pop: function() { - this.remove_item(this.items.length - 1); - this.select_item(this.items.length - 1); }, get_title: function() { - return QWeb.render('BreadCrumb', { widget: this }); + 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 t= tit[j]; + var label = _.escape(t); + 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) { @@ -296,16 +312,19 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ }, on_item_clicked: function(ev) { var $e = $(ev.target); - var index = $e.data('index'); - this.select_item(index); - }, - select_item: function(index) { - for (var i = index + 1; i < this.items.length; i += 1) { - this.remove_item(i); + 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) { + this.remove_item(i); + } } - var item = this.items[index]; if (item) { - item.show(); + item.show($e); } else { console.warn("Breadcrumb: Can't select item at index", index); } @@ -315,9 +334,9 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ var item = this.items.splice(index, 1)[0]; if (item) { var dups = _.filter(this.items, function(it) { - return item.widget === it.widget; + return item.widget === it.widget; }); - if (dups.length === 0) { + if (!dups.length) { console.log("Breadcrumb Destroy", item); item.destroy(); } @@ -460,7 +479,6 @@ instance.web.ViewManager = instance.web.Widget.extend({ controller.on("change:title", this, function() { if (self.active_view === view_type) { - console.log("controller.on change:title"); self.set_title(controller.get('title')); } }); diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml index fe640ee4085..42ca90c4df4 100644 --- a/addons/web/static/src/xml/base.xml +++ b/addons/web/static/src/xml/base.xml @@ -396,18 +396,6 @@
- - - - - - / - - - - - -
From d17a664875f70b44cf068e0816fc9580a445a67c Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 10 Jul 2012 18:43:44 +0200 Subject: [PATCH 11/24] [WIP] Clean code bzr revid: fme@openerp.com-20120710164344-pnnvl7ygs7e96pnx --- addons/web/static/src/js/views.js | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index df57dc8e9be..3b5f3466cf1 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -231,8 +231,8 @@ instance.web.ActionManager = instance.web.Widget.extend({ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ init: function(parent) { this._super(parent); - this.action_manager = parent; this.items = []; + this.action_manager = parent; this.action_manager.$element.on('click', '.oe_breadcrumb_item', this.on_item_clicked); }, push: function(item) { @@ -249,13 +249,11 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ item.get_title = item.get_title || function() { return item.title || item.widget.get('title'); }; - console.log("breadcrumb push", item); this.items.push(item); }, - push_viewmanager: function(vm, view_type) { + push_viewmanager: function(vm) { var self = this; - var bookmarked_view = view_type || vm.active_view || vm.views_src[0].view_type; - var views = [bookmarked_view]; + 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) { @@ -264,11 +262,9 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ } views.push(mode); } - console.log(views); }); this.push({ widget: vm, - view: bookmarked_view, show: function($e) { var index = $e.parent().find('.oe_breadcrumb_item[data-id=' + $e.data('id') + ']').index($e); var view_to_select = views[index]; @@ -294,8 +290,7 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ tit = [tit]; } for (var j = 0; j < tit.length; j += 1) { - var t= tit[j]; - var label = _.escape(t); + var label = _.escape(tit[j]); if (i === this.items.length - 1 && j === tit.length - 1) { titles.push(label); } else { @@ -320,28 +315,21 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ continue; } if (item) { + // Remove items after selected item this.remove_item(i); } } - if (item) { - item.show($e); - } else { - console.warn("Breadcrumb: Can't select item at index", index); - } + item.show($e); }, remove_item: function(index) { - console.log("Breadcrumb remove index", index); var item = this.items.splice(index, 1)[0]; if (item) { var dups = _.filter(this.items, function(it) { - return item.widget === it.widget; + return item.widget === it.widget; }); if (!dups.length) { - console.log("Breadcrumb Destroy", item); item.destroy(); } - } else { - console.warn("Breadcrumb: Can't remove item at index", index); } }, clear: function() { From 88a8f5b5bd9fe4bf351fed00690f6bde1a6f694a Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 11 Jul 2012 14:47:43 +0200 Subject: [PATCH 12/24] [WIP] Rename client_widget and inner_viewmanager to inner_widget bzr revid: fme@openerp.com-20120711124743-subh6412gul0v0k9 --- addons/web/static/src/js/chrome.js | 4 +-- addons/web/static/src/js/view_editor.js | 8 ++--- addons/web/static/src/js/views.js | 34 ++++++++----------- .../web_dashboard/static/src/js/dashboard.js | 6 ++-- addons/web_process/static/src/js/process.js | 2 +- 5 files changed, 24 insertions(+), 30 deletions(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 7aea1cdd5e3..e49e9ce1cbd 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -822,8 +822,8 @@ instance.web.UserMenu = instance.web.Widget.extend({ {text: _t("Change password"), click: function(){ self.change_password(); }}, {text: _t("Cancel"), click: function(){ $(this).dialog('destroy'); }}, {text: _t("Save"), click: function(){ - var inner_viewmanager = action_manager.inner_viewmanager; - inner_viewmanager.views[inner_viewmanager.active_view].controller.do_save() + var inner_widget = action_manager.inner_widget; + inner_widget.views[inner_widget.active_view].controller.do_save() .then(function() { self.dialog.destroy(); // needs to refresh interface in case language changed diff --git a/addons/web/static/src/js/view_editor.js b/addons/web/static/src/js/view_editor.js index 8733a191b21..7c333dccbfc 100644 --- a/addons/web/static/src/js/view_editor.js +++ b/addons/web/static/src/js/view_editor.js @@ -53,7 +53,7 @@ instance.web.ViewEditor = instance.web.OldWidget.extend({ this.main_view_id = this.parent.fields_view.view_id; this.action_manager = new instance.web.ActionManager(this); $.when(this.action_manager.do_action(action)).then(function() { - var viewmanager = self.action_manager.inner_viewmanager, + var viewmanager = self.action_manager.inner_widget, controller = viewmanager.views[viewmanager.active_view].controller; self.action_manager.appendTo(self.view_edit_dialog.$element); self.action_manager.renderElement(self.view_edit_dialog); @@ -88,7 +88,7 @@ instance.web.ViewEditor = instance.web.OldWidget.extend({ } else { $.when(self.do_save_view(view_values)).then(function() { self.create_view_dialog.close(); - var controller = self.action_manager.inner_viewmanager.views[self.action_manager.inner_viewmanager.active_view].controller; + var controller = self.action_manager.inner_widget.views[self.action_manager.inner_widget.active_view].controller; controller.reload_content(); }); } @@ -167,7 +167,7 @@ instance.web.ViewEditor = instance.web.OldWidget.extend({ do_delete_view: function() { var self = this; if (confirm(_t("Do you really want to remove this view?"))) { - var controller = this.action_manager.inner_viewmanager.views[this.action_manager.inner_viewmanager.active_view].controller; + var controller = this.action_manager.inner_widget.views[this.action_manager.inner_widget.active_view].controller; this.dataset.unlink([this.main_view_id]).then(function() { controller.reload_content(); self.main_view_id = self.parent.fields_view.view_id; @@ -397,7 +397,7 @@ instance.web.ViewEditor = instance.web.OldWidget.extend({ action_manager.do_action(action); }}, {text: _t("Close"), click: function(){ - self.action_manager.inner_viewmanager.views[self.action_manager.inner_viewmanager.active_view].controller.reload_content(); + self.action_manager.inner_widget.views[self.action_manager.inner_widget.active_view].controller.reload_content(); self.edit_xml_dialog.close(); }} ] diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 3b5f3466cf1..640044e1742 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -10,10 +10,9 @@ instance.web.ActionManager = instance.web.Widget.extend({ init: function(parent) { this._super(parent); this.inner_action = null; - this.inner_viewmanager = null; + this.inner_widget = null; this.dialog = null; this.dialog_viewmanager = null; - this.client_widget = null; }, start: function() { this._super.apply(this, arguments); @@ -28,14 +27,9 @@ instance.web.ActionManager = instance.web.Widget.extend({ } }, content_stop: function () { - // TODO: problem with bread crumb here. Check if those references are needed - if (this.inner_viewmanager) { - this.inner_viewmanager.destroy(); - this.inner_viewmanager = null; - } - if (this.client_widget) { - this.client_widget.destroy(); - this.client_widget = null; + if (this.inner_widget) { + this.inner_widget.destroy(); + this.inner_widget = null; } }, do_push_state: function(state) { @@ -54,7 +48,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ var self = this, action_loaded; if (state.action_id) { - var run_action = (!this.inner_viewmanager) || this.inner_viewmanager.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); @@ -94,8 +88,8 @@ instance.web.ActionManager = instance.web.Widget.extend({ } $.when(action_loaded || null).then(function() { - if (self.inner_viewmanager) { - self.inner_viewmanager.do_load_state(state, warm); + if (self.inner_widget && self.inner_widget.do_load_state) { + self.inner_widget.do_load_state(state, warm); } }); }, @@ -164,10 +158,10 @@ instance.web.ActionManager = instance.web.Widget.extend({ }); } this.inner_action = action; - var inner_viewmanager = this.inner_viewmanager = new instance.web.ViewManagerAction(this, action); - this.breadcrumb.push_viewmanager(inner_viewmanager); - this.inner_viewmanager.appendTo(this.$element); - this.inner_viewmanager.$element.addClass("oe_view_manager_" + (action.target || 'current')); + var inner_widget = this.inner_widget = new instance.web.ViewManagerAction(this, action); + this.breadcrumb.push_viewmanager(inner_widget); + this.inner_widget.appendTo(this.$element); + this.inner_widget.$element.addClass("oe_view_manager_" + (action.target || 'current')); } }, ir_actions_act_window_close: function (action, on_closed) { @@ -190,12 +184,12 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.dialog_stop(); this.breadcrumb.hide_items(); var ClientWidget = instance.web.client_actions.get_object(action.tag); - this.client_widget = new ClientWidget(this, action.params); + this.inner_widget = new ClientWidget(this, action.params); this.breadcrumb.push({ - widget: this.client_widget, + widget: this.inner_widget, title: action.name }); - this.client_widget.appendTo(this.$element); + this.inner_widget.appendTo(this.$element); }, ir_actions_report_xml: function(action, on_closed) { var self = this; diff --git a/addons/web_dashboard/static/src/js/dashboard.js b/addons/web_dashboard/static/src/js/dashboard.js index 651c3808c2f..0754bfd7e2b 100644 --- a/addons/web_dashboard/static/src/js/dashboard.js +++ b/addons/web_dashboard/static/src/js/dashboard.js @@ -209,8 +209,8 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({ } }); } - if (am.inner_viewmanager) { - am.inner_viewmanager.on_mode_switch.add(function(mode) { + if (am.inner_widget) { + am.inner_widget.on_mode_switch.add(function(mode) { var new_views = []; _.each(action_orig.views, function(view) { new_views[view[1] === mode ? 'unshift' : 'push'](view); @@ -219,7 +219,7 @@ instance.web.form.DashBoard = instance.web.form.FormWidget.extend({ new_views.unshift([false, mode]); } action_orig.views = new_views; - action_orig.res_id = am.inner_viewmanager.dataset.ids[am.inner_viewmanager.dataset.index]; + action_orig.res_id = am.inner_widget.dataset.ids[am.inner_widget.dataset.index]; self.do_action(action_orig); }); } diff --git a/addons/web_process/static/src/js/process.js b/addons/web_process/static/src/js/process.js index 2a2e13ca196..bb32d300be8 100644 --- a/addons/web_process/static/src/js/process.js +++ b/addons/web_process/static/src/js/process.js @@ -260,7 +260,7 @@ openerp.web_process = function (instance) { buttons : [ {text: _t("Cancel"), click: function() { $(this).dialog('destroy'); }}, {text: _t("Save"), click: function() { - var form_view = action_manager.inner_viewmanager.views.form.controller; + var form_view = action_manager.inner_widget.views.form.controller; form_view.do_save(function() { self.initialize_process_view(); From 4f51eac39299e93533afbfe60aa3279ba3a9e568 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 11 Jul 2012 14:55:11 +0200 Subject: [PATCH 13/24] [WIP] Removed content_stop() bzr revid: fme@openerp.com-20120711125511-b5ku6gigunx2csgz --- addons/web/static/src/js/views.js | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 640044e1742..9829b89b7a6 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -3,6 +3,7 @@ *---------------------------------------------------------*/ openerp.web.views = function(instance) { + this.action_manager.inner_widget = item.widget; var QWeb = instance.web.qweb, _t = instance.web._t; @@ -26,12 +27,6 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.dialog = null; } }, - content_stop: function () { - if (this.inner_widget) { - this.inner_widget.destroy(); - this.inner_widget = null; - } - }, do_push_state: function(state) { if (this.getParent() && this.getParent().do_push_state) { if (this.inner_action) { @@ -123,7 +118,6 @@ instance.web.ActionManager = instance.web.Widget.extend({ }, null_action: function() { this.dialog_stop(); - this.content_stop(); this.breadcrumb.clear(); }, ir_actions_act_window: function (action, on_close) { @@ -150,7 +144,6 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.dialog.open(); } else { this.dialog_stop(); - //this.content_stop(); this.breadcrumb.hide_items(); if(action.menu_id) { return this.getParent().do_action(action, function () { @@ -180,7 +173,6 @@ instance.web.ActionManager = instance.web.Widget.extend({ }); }, ir_actions_client: function (action) { - //this.content_stop(); this.dialog_stop(); this.breadcrumb.hide_items(); var ClientWidget = instance.web.client_actions.get_object(action.tag); @@ -259,8 +251,7 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ }); this.push({ widget: vm, - show: function($e) { - var index = $e.parent().find('.oe_breadcrumb_item[data-id=' + $e.data('id') + ']').index($e); + show: function(index, $e) { var view_to_select = views[index]; vm.$element.show(); if (vm.active_view !== view_to_select) { @@ -313,7 +304,9 @@ instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ this.remove_item(i); } } - item.show($e); + 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]; From 1144a72e143c1d279e01addc709626708f3b5fdb Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 11 Jul 2012 15:02:52 +0200 Subject: [PATCH 14/24] [WIP] Move view manager addClass to ViewManagerAction#start bzr revid: fme@openerp.com-20120711130252-i9erdzo93p6siteq --- addons/web/static/src/js/views.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 9829b89b7a6..07ee5c53e3e 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -140,7 +140,6 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.dialog.dialog_title = action.name; this.dialog_viewmanager = new instance.web.ViewManagerAction(this.dialog, action); this.dialog_viewmanager.appendTo(this.dialog.$element); - this.dialog_viewmanager.$element.addClass("oe_view_manager_" + (action.target || 'current')); this.dialog.open(); } else { this.dialog_stop(); @@ -154,7 +153,6 @@ instance.web.ActionManager = instance.web.Widget.extend({ var inner_widget = this.inner_widget = new instance.web.ViewManagerAction(this, action); this.breadcrumb.push_viewmanager(inner_widget); this.inner_widget.appendTo(this.$element); - this.inner_widget.$element.addClass("oe_view_manager_" + (action.target || 'current')); } }, ir_actions_act_window_close: function (action, on_closed) { @@ -644,6 +642,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ var manager_ready = $.when(searchview_loaded, main_view_loaded); this.$element.find('.oe_debug_view').change(this.on_debug_changed); + this.$element.addClass("oe_view_manager_" + (this.action.target || 'current')); if (this.action.help && !this.flags.low_profile) { var Users = new instance.web.DataSet(self, 'res.users'), From 7564a0c1b1d396159bdb89f4ba6d80b911966897 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 11 Jul 2012 15:05:25 +0200 Subject: [PATCH 15/24] [WIP] Renamed dialog_viewmanager to dialog_widget bzr revid: fme@openerp.com-20120711130525-qpmsh7qtmtbl65xw --- addons/web/static/src/js/view_editor.js | 2 +- addons/web/static/src/js/views.js | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/web/static/src/js/view_editor.js b/addons/web/static/src/js/view_editor.js index 7c333dccbfc..6df78679ecb 100644 --- a/addons/web/static/src/js/view_editor.js +++ b/addons/web/static/src/js/view_editor.js @@ -998,7 +998,7 @@ instance.web.ViewEditor = instance.web.OldWidget.extend({ }; var action_manager = new instance.web.ActionManager(self); $.when(action_manager.do_action(action)).then(function() { - var controller = action_manager.dialog_viewmanager.views['form'].controller; + var controller = action_manager.dialog_widget.views['form'].controller; controller.on_button_cancel.add_last(function(){ action_manager.destroy() }); diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 07ee5c53e3e..fe9ce582c96 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -13,7 +13,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.inner_action = null; this.inner_widget = null; this.dialog = null; - this.dialog_viewmanager = null; + this.dialog_widget = null; }, start: function() { this._super.apply(this, arguments); @@ -21,8 +21,8 @@ instance.web.ActionManager = instance.web.Widget.extend({ }, dialog_stop: function () { if (this.dialog) { - this.dialog_viewmanager.destroy(); - this.dialog_viewmanager = null; + this.dialog_widget.destroy(); + this.dialog_widget = null; this.dialog.destroy(); this.dialog = null; } @@ -135,11 +135,11 @@ instance.web.ActionManager = instance.web.Widget.extend({ if(on_close) this.dialog.on_close.add(on_close); } else { - this.dialog_viewmanager.destroy(); + this.dialog_widget.destroy(); } this.dialog.dialog_title = action.name; - this.dialog_viewmanager = new instance.web.ViewManagerAction(this.dialog, action); - this.dialog_viewmanager.appendTo(this.dialog.$element); + this.dialog_widget = new instance.web.ViewManagerAction(this.dialog, action); + this.dialog_widget.appendTo(this.dialog.$element); this.dialog.open(); } else { this.dialog_stop(); From 571648e4cf246f7b38560780718ade1c13faddcf Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 11 Jul 2012 15:38:30 +0200 Subject: [PATCH 16/24] [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) { From 7bc912723985fbef0aab7856b30597806a29696b Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 12 Jul 2012 11:17:56 +0200 Subject: [PATCH 17/24] [FIX] Hide only last item on push bzr revid: fme@openerp.com-20120712091756-g8gsmdxuvte9phse --- addons/web/static/src/js/views.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 931019ce627..d2afb80ff23 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -28,9 +28,10 @@ instance.web.ActionManager = instance.web.Widget.extend({ } }, push_breadcrumb: function(item) { - _.each(this.breadcrumbs, function(i) { - i.hide(); - }); + var last = this.breadcrumbs.slice(-1)[0]; + if (last) { + last.hide(); + } item.id = _.uniqueId('breadcrumb_'); item.show = item.show || function() { item.widget.$element.show(); @@ -282,9 +283,6 @@ instance.web.ActionManager = instance.web.Widget.extend({ } }); -instance.web.BreadCrumb = instance.web.CallbackEnabled.extend({ -}); - instance.web.ViewManager = instance.web.Widget.extend({ template: "ViewManager", init: function(parent, dataset, views, flags) { From bdd6d0e5994045d6eadc443cd5d4d8d7549965fe Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 12 Jul 2012 11:37:08 +0200 Subject: [PATCH 18/24] [IMP] Use _.defaults bzr revid: fme@openerp.com-20120712093708-b5p58jzdn8y78xy4 --- addons/web/static/src/js/views.js | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index d2afb80ff23..62adafb2c05 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -33,18 +33,20 @@ instance.web.ActionManager = instance.web.Widget.extend({ last.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'); - }; + _.defaults(item, { + show: function() { + item.widget.$element.show(); + }, + hide: function() { + item.widget.$element.hide(); + }, + destroy: function() { + item.widget.destroy(); + }, + get_title: function() { + return item.title || item.widget.get('title'); + } + }); this.breadcrumbs.push(item); }, on_breadcrumb_clicked: function(ev) { From 76c0b261983c07147e875f41be9fdf54e7bc9063 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 12 Jul 2012 11:55:17 +0200 Subject: [PATCH 19/24] [ADD] Added doc to breadcrumb items callback bzr revid: fme@openerp.com-20120712095517-itzfdh52fd0zuzi4 --- addons/web/static/src/js/views.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 62adafb2c05..bf385ff97f3 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -34,16 +34,36 @@ instance.web.ActionManager = instance.web.Widget.extend({ } item.id = _.uniqueId('breadcrumb_'); _.defaults(item, { - show: function() { + show: function(index) { + /* + * This callback is used whenever the widget should be shown. + * If multiple titles are used, the index can be used in order + * to define which item of the breadcrumb has been trigerred. + */ item.widget.$element.show(); }, hide: function() { + /* + * This callback is used whenever the widget should be hidden. + * Called on the last pushed item before pusing a new + * breadcrumb. + */ item.widget.$element.hide(); }, destroy: function() { + /* + * This callback is used whenever the widget should be + * destroyed. Happens when the breadcrumb is cleared. + */ item.widget.destroy(); }, get_title: function() { + /* + * Should return the title of the widget as a string. If an + * array is returned, multiple titles can be used (eg: a + * widget switching views). The #show() callback will receive + * the index of the selected title. + */ return item.title || item.widget.get('title'); } }); From 0aaa77339598e3ff14879b81ccafd61bd61fc9a5 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 12 Jul 2012 11:56:54 +0200 Subject: [PATCH 20/24] [REM] Removed useless argument causing problem in case of buggy load_state bzr revid: fme@openerp.com-20120712095654-32pj8yrwubf2up1w --- addons/web/static/src/js/views.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index bf385ff97f3..9a998d78545 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -800,7 +800,7 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ view: controller, view_manager: self })); - self.set_title(fvg.arch.attrs.string || fvg.name); + self.set_title(); }); }, do_create_view: function(view_type) { From b4b5321738cf39dfd5c2ba3b15c31625e2440e0c Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 12 Jul 2012 12:27:25 +0200 Subject: [PATCH 21/24] [ADD] Added jsdoc bzr revid: fme@openerp.com-20120712102725-fjd8izjibbbe0ljg --- addons/web/static/src/js/views.js | 40 +++++++++++++++---------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 9a998d78545..1197ca2b4c8 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -27,6 +27,17 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.dialog = null; } }, + /** + * Add a new item to the breadcrumb + * + * @param {Object} item breadcrumb item + * @param {Object} item.widget widget containing the view(s) to be added to the breadcrumb added + * @param {null|Function} item.show callback triggered whenever the widget should be shown back + * @param {null|Function} item.hide callback triggered whenever the widget should be shown hidden + * @param {null|Function} item.destroy callback triggered whenever the widget should be destroyed + * @param {null|String|Array} item.title title(s) of the view(s) to be displayed in the breadcrumb + * @param {null|Function} item.get_title function returning the title(s) of the view(s) to be displayed in the breadcrumb + */ push_breadcrumb: function(item) { var last = this.breadcrumbs.slice(-1)[0]; if (last) { @@ -35,35 +46,24 @@ instance.web.ActionManager = instance.web.Widget.extend({ item.id = _.uniqueId('breadcrumb_'); _.defaults(item, { show: function(index) { - /* - * This callback is used whenever the widget should be shown. - * If multiple titles are used, the index can be used in order - * to define which item of the breadcrumb has been trigerred. - */ + // If multiple titles are used, the index can be used in order + // to define which item of the breadcrumb has been trigerred. item.widget.$element.show(); }, hide: function() { - /* - * This callback is used whenever the widget should be hidden. - * Called on the last pushed item before pusing a new - * breadcrumb. - */ + // Called on the last pushed item before pusing a new breadcrumb. item.widget.$element.hide(); }, destroy: function() { - /* - * This callback is used whenever the widget should be - * destroyed. Happens when the breadcrumb is cleared. - */ + // Called on all breadcrumbs items when it should be cleared. + // Eg: new action triggered from menu item.widget.destroy(); }, get_title: function() { - /* - * Should return the title of the widget as a string. If an - * array is returned, multiple titles can be used (eg: a - * widget switching views). The #show() callback will receive - * the index of the selected title. - */ + // Should return the title(s) of the widget as a string. + // If an array is returned, multiple titles can be used + // (eg: a widget switching views). The #show() callback will receive + // the index of the selected title. return item.title || item.widget.get('title'); } }); From 87cf418d788c05adeaca0a31083f81bb51e52b98 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 12 Jul 2012 14:12:46 +0200 Subject: [PATCH 22/24] [FIX] Fixed loop bug bzr revid: fme@openerp.com-20120712121246-m16bo4d0cw7o7oz4 --- addons/web/static/src/js/views.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 1197ca2b4c8..842536f5d67 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -71,17 +71,15 @@ instance.web.ActionManager = instance.web.Widget.extend({ }, on_breadcrumb_clicked: function(ev) { var $e = $(ev.target); + var id = $e.data('id'); var item; - for (var i = 0; i < this.breadcrumbs.length; i += 1) { + for (var i = this.breadcrumbs.length - 1; i >= 0; i--) { var it = this.breadcrumbs[i]; - if (it.id == $e.data('id')) { + if (it.id == id) { item = it; - continue; - } - if (item) { - // Remove items after selected item - this.remove_breadcrumb(i); + break; } + this.remove_breadcrumb(i); } var index = $e.parent().find('.oe_breadcrumb_item[data-id=' + $e.data('id') + ']').index($e); item.show(index, $e); From 279c349344f15cca198ca4bf8d2341107d8edb95 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 12 Jul 2012 16:46:23 +0200 Subject: [PATCH 23/24] [IMP] Do not edit in place pushed breadcrumb items bzr revid: fme@openerp.com-20120712144623-ttfejkrxv7ep4y12 --- addons/web/static/src/js/views.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 842536f5d67..87017bbe0bd 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -43,30 +43,30 @@ instance.web.ActionManager = instance.web.Widget.extend({ if (last) { last.hide(); } - item.id = _.uniqueId('breadcrumb_'); - _.defaults(item, { + var item = _.extend({ show: function(index) { // If multiple titles are used, the index can be used in order // to define which item of the breadcrumb has been trigerred. - item.widget.$element.show(); + this.widget.$element.show(); }, hide: function() { // Called on the last pushed item before pusing a new breadcrumb. - item.widget.$element.hide(); + this.widget.$element.hide(); }, destroy: function() { // Called on all breadcrumbs items when it should be cleared. // Eg: new action triggered from menu - item.widget.destroy(); + this.widget.destroy(); }, get_title: function() { // Should return the title(s) of the widget as a string. // If an array is returned, multiple titles can be used // (eg: a widget switching views). The #show() callback will receive // the index of the selected title. - return item.title || item.widget.get('title'); + return this.title || this.widget.get('title'); } - }); + }, item); + item.id = _.uniqueId('breadcrumb_'); this.breadcrumbs.push(item); }, on_breadcrumb_clicked: function(ev) { From 048d96fa636036665b2bb0f523a48900e2e36e35 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 12 Jul 2012 17:05:48 +0200 Subject: [PATCH 24/24] [IMP] Improved jsdoc bzr revid: fme@openerp.com-20120712150548-w1m47j9op8p46xpy --- addons/web/static/src/js/views.js | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 87017bbe0bd..ffa78f315e5 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -30,13 +30,18 @@ instance.web.ActionManager = instance.web.Widget.extend({ /** * Add a new item to the breadcrumb * + * If the title of an item is an array, the multiple title mode is in use. + * (eg: a widget with multiple views might need to display a title for each view) + * In multiple title mode, the show() callback can check the index it receives + * in order to detect which of its titles has been clicked on by the user. + * * @param {Object} item breadcrumb item * @param {Object} item.widget widget containing the view(s) to be added to the breadcrumb added - * @param {null|Function} item.show callback triggered whenever the widget should be shown back - * @param {null|Function} item.hide callback triggered whenever the widget should be shown hidden - * @param {null|Function} item.destroy callback triggered whenever the widget should be destroyed - * @param {null|String|Array} item.title title(s) of the view(s) to be displayed in the breadcrumb - * @param {null|Function} item.get_title function returning the title(s) of the view(s) to be displayed in the breadcrumb + * @param {Function} [item.show] triggered whenever the widget should be shown back + * @param {Function} [item.hide] triggered whenever the widget should be shown hidden + * @param {Function} [item.destroy] triggered whenever the widget should be destroyed + * @param {String|Array} [item.title] title(s) of the view(s) to be displayed in the breadcrumb + * @param {Function} [item.get_title] should return the title(s) of the view(s) to be displayed in the breadcrumb */ push_breadcrumb: function(item) { var last = this.breadcrumbs.slice(-1)[0]; @@ -45,24 +50,15 @@ instance.web.ActionManager = instance.web.Widget.extend({ } var item = _.extend({ show: function(index) { - // If multiple titles are used, the index can be used in order - // to define which item of the breadcrumb has been trigerred. this.widget.$element.show(); }, hide: function() { - // Called on the last pushed item before pusing a new breadcrumb. this.widget.$element.hide(); }, destroy: function() { - // Called on all breadcrumbs items when it should be cleared. - // Eg: new action triggered from menu this.widget.destroy(); }, get_title: function() { - // Should return the title(s) of the widget as a string. - // If an array is returned, multiple titles can be used - // (eg: a widget switching views). The #show() callback will receive - // the index of the selected title. return this.title || this.widget.get('title'); } }, item);