[FIX] restore attachement, part2 very beginning of add
[odoo/odoo.git] / addons / web / static / src / js / views.js
index e4891d6..79d3d4c 100644 (file)
@@ -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($("<div />").text(_t("You must choose at least one record.")), { title: _t("Warning"), modal: true });
+                session.web.dialog($("<div />").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