X-Git-Url: http://git.inspyration.org/?a=blobdiff_plain;f=addons%2Fweb%2Fstatic%2Fsrc%2Fjs%2Fviews.js;h=79d3d4cd16733e0292993ba0dcf9e03d0f98b33f;hb=4ecd07837f5f28d295efd5fe13b6643f863851fc;hp=e4891d65478a4a21542de220fbd1273ad0982081;hpb=b4157132e0559c52117b77226661e9ce79ea54ed;p=odoo%2Fodoo.git diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index e4891d6..79d3d4c 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -63,7 +63,7 @@ session.web.ActionManager = session.web.Widget.extend({ res_model: state.model, res_id: state.id, type: 'ir.actions.act_window', - views: [[false, 'page'], [false, 'form']] + views: [[false, 'form']] }; action_loaded = this.do_action(action); } else if (state.sa) { @@ -204,16 +204,8 @@ session.web.ActionManager = session.web.Widget.extend({ } }); -session.web.ViewManager = session.web.OldWidget.extend({ +session.web.ViewManager = session.web.Widget.extend({ template: "ViewManager", - /** - * @constructs session.web.ViewManager - * @extends session.web.OldWidget - * - * @param parent - * @param dataset - * @param views - */ init: function(parent, dataset, views, flags) { this._super(parent); this.model = dataset ? dataset.model : undefined; @@ -243,7 +235,7 @@ session.web.ViewManager = session.web.OldWidget.extend({ start: function() { this._super(); var self = this; - this.$element.find('.oe_view_manager_switch button').click(function() { + this.$element.find('.oe_view_manager_switch a').click(function() { self.on_mode_switch($(this).data('view-type')); }); var views_ids = {}; @@ -252,7 +244,9 @@ session.web.ViewManager = session.web.OldWidget.extend({ deferred : $.Deferred(), controller : null, options : _.extend({ - sidebar_id : self.element_id + '_sidebar_' + view.view_type, + $buttons : self.$element.find('.oe_view_manager_buttons'), + $sidebar : self.$element.find('.oe_view_manager_sidebar'), + $pager : self.$element.find('.oe_view_manager_pager'), action : self.action, action_views_ids : views_ids }, self.flags, self.flags[view.view_type] || {}, view.options || {}) @@ -260,7 +254,7 @@ session.web.ViewManager = session.web.OldWidget.extend({ views_ids[view.view_type] = view.view_id; }); if (this.flags.views_switcher === false) { - this.$element.find('.oe_vm_switch').hide(); + this.$element.find('.oe_view_manager_switch').hide(); } // 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; @@ -274,9 +268,9 @@ session.web.ViewManager = session.web.OldWidget.extend({ * @returns {jQuery.Deferred} new view loading promise */ on_mode_switch: function(view_type, no_store) { - var self = this, - view = this.views[view_type], - view_promise; + var self = this; + var view = this.views[view_type]; + var view_promise; if(!view) return $.Deferred().reject(); @@ -288,13 +282,22 @@ session.web.ViewManager = session.web.OldWidget.extend({ if (!view.controller) { // Lazy loading of views var controllerclass = this.registry.get_object(view_type); - var controller = new controllerclass(this, this.dataset, view.view_id, view.options); + var options = _.clone(view.options); + if (view_type === "form") { + 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(this.on_mode_switch); controller.do_prev_view.add_last(this.on_prev_view); - var container = $("#" + this.element_id + '_view_' + view_type); + 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); @@ -317,9 +320,10 @@ session.web.ViewManager = session.web.OldWidget.extend({ } this.$element - .find('.oe_vm_switch button').removeAttr('disabled') - .filter('[data-view-type="' + view_type + '"]') - .attr('disabled', true); + .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'); $.when(view_promise).then(function () { _.each(_.keys(self.views), function(view_name) { @@ -354,10 +358,10 @@ session.web.ViewManager = session.web.OldWidget.extend({ if (options.created && current_view === 'form' && previous_view === 'list') { // APR special case: "If creation mode from list (and only from a list), // after saving, go to page view (don't come back in list)" - return this.on_mode_switch('page'); + return this.on_mode_switch('form'); } else if (options.created && !previous_view && this.action && this.action.flags.default_view === 'form') { // APR special case: "If creation from dashboard, we have no previous view - return this.on_mode_switch('page'); + return this.on_mode_switch('form'); } return this.on_mode_switch(previous_view, true); }, @@ -372,12 +376,10 @@ session.web.ViewManager = session.web.OldWidget.extend({ if (this.searchview) { this.searchview.destroy(); } - this.searchview = new session.web.SearchView( - this, this.dataset, - view_id, search_defaults, this.flags.search_view === false); + this.searchview = new session.web.SearchView(this, this.dataset, view_id, search_defaults, this.flags.search_view === false); this.searchview.on_search.add(this.do_searchview_search); - return this.searchview.appendTo($("#" + this.element_id + "_search")); + return this.searchview.appendTo(this.$element.find(".oe_view_manager_view_search")); }, do_searchview_search: function(domains, contexts, groupbys) { var self = this, @@ -556,6 +558,9 @@ session.web.ViewManagerAction = session.web.ViewManager.extend({ }); } break; + case 'toggle_layout_outline': + current_view.rendering_engine.toggle_layout_debugging(); + break; case 'fields': this.dataset.call_and_eval( 'fields_get', [false, {}], null, 1).then(function (fields) { @@ -722,8 +727,6 @@ session.web.Sidebar = session.web.Widget.extend({ init: function(parent) { this._super(parent); var view = this.getParent(); - var view_manager = view.getParent(); - var action = view_manager.action; this.sections = [ { 'name' : 'print', 'label' : _t('Print'), }, { 'name' : 'files', 'label' : _t('Attachement'), }, @@ -754,41 +757,41 @@ session.web.Sidebar = session.web.Widget.extend({ var section = $(this).data('section'); var index = $(this).data('index'); $(this).closest('ul').hide(); - console.log('click item',section,index); var item = self.items[section][index]; if (item.callback) { item.callback.apply(self, [item]); - } - if (item.action) { + } else if (item.action) { self.on_item_action_clicked(item); + } else if (item.url) { + return true; } return false; }); + //this.$div.html(QWeb.render('FormView.sidebar.attachments', this)); + //this.$element.find('.oe-binary-file').change(this.on_attachment_changed); + //this.$element.find('.oe-sidebar-attachment-delete').click(this.on_attachment_delete); }, redraw: function() { var self = this; self.$element.html(QWeb.render('Sidebar', {widget: self})); this.$element.find('ul').hide(); }, - add_default_sections: function() { - var self = this; - }, add_section: function() { var self = this; }, add_toolbar: function(toolbar) { var self = this; - _.each([['print', _t("Reports")], ['action', _t("Actions")], ['relate', _t("Links")]], function(type) { - var items = toolbar[type[0]]; - if (items.length) { + _.each(['print','action','relate'], function(type) { + var items = toolbar[type]; + if (items) { for (var i = 0; i < items.length; i++) { items[i] = { label: items[i]['name'], action: items[i], - classname: 'oe_sidebar_' + type[0] + classname: 'oe_sidebar_' + type } } - self.add_items(type[0], items); + self.add_items(type=='print' ? 'print' : 'other', items); } }); }, @@ -820,11 +823,7 @@ session.web.Sidebar = session.web.Widget.extend({ add_items: function(section_code, items) { var self = this; if (items) { - // generate unique id for items - for (var i = 0; i < items.length; i++) { - items[i].element_id = _.uniqueId(section_code + '_item_'); - this.items[items[i].element_id] = items[i]; - } + this.items[section_code].push.apply(this.items[section_code],items); this.redraw(); } }, @@ -833,7 +832,7 @@ session.web.Sidebar = session.web.Widget.extend({ self.getParent().sidebar_context().then(function (context) { var ids = self.getParent().get_selected_ids(); if (ids.length == 0) { - openerp.web.dialog($("
").text(_t("You must choose at least one record.")), { title: _t("Warning"), modal: true }); + session.web.dialog($("
").text(_t("You must choose at least one record.")), { title: _t("Warning"), modal: true }); return false; } var additional_context = _.extend({ @@ -856,6 +855,57 @@ session.web.Sidebar = session.web.Widget.extend({ }); }); }, + do_attachement_update: function(dataset, model_id) { + if (!model_id) { + this.on_attachments_loaded([]); + } else { + var dom = [ ['res_model', '=', dataset.model], ['res_id', '=', model_id], ['type', 'in', ['binary', 'url']] ]; + var ds = new session.web.DataSetSearch(this, 'ir.attachment', dataset.get_context(), dom); + ds.read_slice(['name', 'url', 'type'], {}).then(this.on_attachments_loaded); + } + }, + on_attachments_loaded: function(attachments) { + var self = this; + var items = []; + // TODO: preprend: _s + + var prefix = '/web/binary/saveas?session_id=' + self.session.session_id + '&model=ir.attachment&field=datas&filename_field=name&id='; + _.each(attachments,function(a) { + a.label = a.name; + if(a.type === "binary") { + a.url = prefix + a.id + '&t=' + (new Date().getTime()); + } + }); + attachments.push( { label: _t("Add..."), callback: self.on_attachment_add } ); + self.items['files'] = attachments; + self.redraw(); + }, + on_attachment_add: function(e) { + this.$element.find('.oe_sidebar_add').show(); + }, + on_attachment_changed: function(e) { + return; + window[this.element_id + '_iframe'] = this.do_update; + var $e = $(e.target); + if ($e.val() != '') { + this.$element.find('form.oe-binary-form').submit(); + $e.parent().find('input[type=file]').prop('disabled', true); + $e.parent().find('button').prop('disabled', true).find('img, span').toggle(); + } + }, + on_attachment_delete: function(e) { + return; + var self = this, $e = $(e.currentTarget); + var name = _.str.trim($e.parent().find('a.oe-sidebar-attachments-link').text()); + if (confirm(_.str.sprintf(_t("Do you really want to delete the attachment %s?"), name))) { + this.rpc('/web/dataset/unlink', { + model: 'ir.attachment', + ids: [parseInt($e.attr('data-id'))] + }, function(r) { + $e.parent().remove(); + self.do_notify("Delete an attachment", "The attachment '" + name + "' has been deleted"); + }); + } + } }); session.web.TranslateDialog = session.web.Dialog.extend({ @@ -974,7 +1024,7 @@ session.web.TranslateDialog = session.web.Dialog.extend({ } }); -session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{ +session.web.View = session.web.Widget.extend({ template: "EmptyComponent", // name displayed in view switchers display_name: '', @@ -1014,11 +1064,13 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{ * Called after a successful call to fields_view_get. * Must return a promise. */ - on_loaded: function(fields_view_get) {}, + on_loaded: function(fields_view_get) { + }, set_default_options: function(options) { this.options = options || {}; _.defaults(this.options, { // All possible views options should be defaulted here + $sidebar: null, sidebar_id: null, sidebar: true, action: null, @@ -1144,9 +1196,6 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{ }, do_search: function(view) { }, - set_common_sidebar_sections: function(sidebar) { - sidebar.add_default_sections(); - }, on_sidebar_import: function() { var import_view = new session.web.DataImport(this, this.dataset); import_view.start(); @@ -1244,6 +1293,26 @@ session.web.xml_to_str = function(node) { return (new XMLSerializer()).serializeToString(node); } } +session.web.str_to_xml = function(s) { + if (window.DOMParser) { + var dp = new DOMParser(); + var r = dp.parseFromString(s, "text/xml"); + if (r.body && r.body.firstChild && r.body.firstChild.nodeName == 'parsererror') { + throw new Error("Could not parse string to xml"); + } + return r; + } + var xDoc; + try { + xDoc = new ActiveXObject("MSXML2.DOMDocument"); + } catch (e) { + throw new Error("Could not find a DOM Parser: " + e.message); + } + xDoc.async = false; + xDoc.preserveWhiteSpace = true; + xDoc.loadXML(s); + return xDoc; +} /** * Registry for all the client actions key: tag value: widget