X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=addons%2Fweb%2Fstatic%2Fsrc%2Fjs%2Fviews.js;h=e6d404701a1b6bc272bc78a057b1030b3b36f7fd;hb=648ea3e7ca278796ac781f1ba918235fe31cbf4a;hp=de3062726139736ba080cd3b9cad10042e860052;hpb=752fe6171f3e5aedd420301bbdb2689976080b8b;p=odoo%2Fodoo.git diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index de30627..e6d4047 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.breadcrumb = new instance.web.BreadCrumb(this); + }, dialog_stop: function () { if (this.dialog) { this.dialog_viewmanager.destroy(); @@ -24,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; @@ -36,6 +41,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ do_push_state: function(state) { if (this.getParent() && this.getParent().do_push_state) { if (this.inner_action) { + state['title'] = this.inner_action.name; state['model'] = this.inner_action.res_model; if (this.inner_action.id) { state['action_id'] = this.inner_action.id; @@ -81,7 +87,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ if(_.isString(action)) { action = { tag: action, - params: $.deparam($.param.querystring()), + params: state, }; } this.ir_actions_client(action); @@ -135,7 +141,7 @@ instance.web.ActionManager = instance.web.Widget.extend({ }; } if (action.target === 'new') { - if (this.dialog == null) { + if (this.dialog === null) { this.dialog = new instance.web.Dialog(this, { width: '80%' }); if(on_close) this.dialog.on_close.add(on_close); @@ -143,20 +149,24 @@ instance.web.ActionManager = instance.web.Widget.extend({ this.dialog_viewmanager.destroy(); } this.dialog.dialog_title = action.name; - this.dialog_viewmanager = new instance.web.ViewManagerAction(this, action); + 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); this.dialog.open(); } else { this.dialog_stop(); - this.content_stop(); + //this.content_stop(); + 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.breadcrumb.push_actionmanager(inner_viewmanager); this.inner_viewmanager.appendTo(this.$element); + this.inner_viewmanager.$element.addClass("oe_view_manager_" + action.target); } }, ir_actions_act_window_close: function (action, on_closed) { @@ -175,10 +185,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_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; @@ -211,6 +227,105 @@ 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); + }, + push: function(item) { + 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); + }, + push_actionmanager: function(am, view_type) { + var self = this; + var bookmarked_view = view_type || am.active_view || am.views_src[0].view_type; + this.push({ + widget: am, + show: function() { + am.$element.show(); + 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); + 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(); + }); + }, + 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 = this.items[index]; + if (item) { + item.show(); + } else { + console.warn("Breadcrumb: Can't select item at index", index); + } + }, + 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; + }); + if (dups.length === 0) { + console.log("Breadcrumb Destroy", item); + item.destroy(); + } + } else { + console.warn("Breadcrumb: Can't remove item at index", index); + } + }, + clear: function() { + while (this.items.length) { + this.remove_item(0); + } + }, +}); + instance.web.ViewManager = instance.web.Widget.extend({ template: "ViewManager", init: function(parent, dataset, views, flags) { @@ -287,35 +402,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); - 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) { @@ -327,7 +414,7 @@ instance.web.ViewManager = instance.web.Widget.extend({ } this.$element - .find('.oe_view_manager_switch a').parent().removeClass('active') + .find('.oe_view_manager_switch a').parent().removeClass('active'); this.$element .find('.oe_view_manager_switch a').filter('[data-view-type="' + view_type + '"]') .parent().addClass('active'); @@ -336,19 +423,63 @@ instance.web.ViewManager = instance.web.Widget.extend({ _.each(_.keys(self.views), function(view_name) { var controller = self.views[view_name].controller; if (controller) { + var container = self.$element.find(".oe_view_manager_view_" + view_name + ":first"); if (view_name === view_type) { + container.show(); controller.do_show(view_options || {}); } else { + container.hide(); controller.do_hide(); } } }); - - self.$element.find('.oe_view_title_text:first').text( - self.display_title()); }); 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 @@ -441,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({ @@ -493,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 @@ -675,6 +798,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; @@ -696,9 +831,6 @@ instance.web.ViewManagerAction = instance.web.ViewManager.extend({ self.views[self.active_view].controller.do_load_state(state, warm); }); }, - display_title: function () { - return this.action.name; - } }); instance.web.Sidebar = instance.web.Widget.extend({ @@ -735,18 +867,9 @@ instance.web.Sidebar = instance.web.Widget.extend({ var self = this; this._super(this); this.redraw(); - this.$element.on('click','.oe_dropdown_toggle',function(event) { - self.$('ul').hide(); - $(this).parent().find('ul').toggle(); - return false; - }); - instance.web.bus.on('click', self, function(ev) { - self.$('ul').hide(); - }); this.$element.on('click','.oe_dropdown_menu li a', function(event) { var section = $(this).data('section'); var index = $(this).data('index'); - $(this).closest('ul').hide(); var item = self.items[section][index]; if (item.callback) { item.callback.apply(self, [item]); @@ -755,13 +878,12 @@ instance.web.Sidebar = instance.web.Widget.extend({ } else if (item.url) { return true; } - return false; + event.preventDefault(); }); }, redraw: function() { var self = this; self.$element.html(QWeb.render('Sidebar', {widget: self})); - this.$element.find('ul').hide(); // Hides Sidebar sections when item list is empty this.$('.oe_form_dropdown_section').each(function() { @@ -867,13 +989,13 @@ instance.web.Sidebar = instance.web.Widget.extend({ }); self.items['files'] = attachments; self.redraw(); - this.$('.oe_sidebar_add_attachment .oe-binary-file').change(this.on_attachment_changed); + this.$('.oe_sidebar_add_attachment .oe_form_binary_file').change(this.on_attachment_changed); this.$element.find('.oe_sidebar_delete_item').click(this.on_attachment_delete); }, on_attachment_changed: function(e) { var $e = $(e.target); if ($e.val() !== '') { - this.$element.find('form.oe-binary-form').submit(); + this.$element.find('form.oe_form_binary_form').submit(); $e.parent().find('input[type=file]').prop('disabled', true); $e.parent().find('button').prop('disabled', true).find('img, span').toggle(); this.$('.oe_sidebar_add_attachment span').text(_t('Uploading...')); @@ -900,8 +1022,8 @@ instance.web.TranslateDialog = instance.web.Dialog.extend({ // TODO fme: should add the language to fields_view_get because between the fields view get // and the moment the user opens the translation dialog, the user language could have been changed this.view_language = view.session.user_context.lang; - this['on_button' + _t("Save")] = this.on_button_Save; - this['on_button' + _t("Close")] = this.on_button_Close; + this['on_button_' + _t("Save")] = this.on_btn_save; + this['on_button_' + _t("Close")] = this.on_btn_close; this._super(view, { width: '80%', height: '80%' @@ -982,7 +1104,7 @@ instance.web.TranslateDialog = instance.web.Dialog.extend({ } }); }, - on_button_Save: function() { + on_btn_save: function() { var trads = {}, self = this, trads_mutex = new $.Mutex(); @@ -1005,7 +1127,7 @@ instance.web.TranslateDialog = instance.web.Dialog.extend({ }); this.close(); }, - on_button_Close: function() { + on_btn_close: function() { this.close(); } });