[FIX] pad: improve pad bootstrap, prevent creating useless empty pads, avoid edition...
authorOlivier Dony <odo@openerp.com>
Fri, 14 Mar 2014 13:18:49 +0000 (14:18 +0100)
committerOlivier Dony <odo@openerp.com>
Fri, 14 Mar 2014 13:18:49 +0000 (14:18 +0100)
Added a small method to detect the proper server configuration,
and make it degrade gracefully if the method is not present.
This avoids having to force a pad URL generation in order to
test the config (possibly creating useless pads).
Add a user-friendly message when the pad has not yet been
initialized for a given record, in read-only mode.

bzr revid: odo@openerp.com-20140314131849-rnjvk1pqpiyvtc1c

addons/pad/pad.py
addons/pad/static/src/css/etherpad.css
addons/pad/static/src/js/pad.js

index 22e8931..0a72e2a 100644 (file)
@@ -14,6 +14,10 @@ _logger = logging.getLogger(__name__)
 class pad_common(osv.osv_memory):
     _name = 'pad.common'
 
+    def pad_is_configured(self, cr, uid, context=None):
+        user = self.pool.get('res.users').browse(cr, uid, uid, context=context)
+        return bool(user.company_id.pad_server)
+
     def pad_generate_url(self, cr, uid, context=None):
         company = self.pool.get('res.users').browse(cr, uid, uid, context=context).company_id;
 
index facf15b..d2d8b74 100644 (file)
@@ -71,6 +71,7 @@
 .oe_pad_loading{
     text-align: center;
     opacity: 0.75;
+    font-style: italic;
 }
 
 .etherpad_readonly ul, .etherpad_readonly ol {
index 31ba8c4..e04184b 100644 (file)
@@ -1,63 +1,81 @@
 openerp.pad = function(instance) {
+    var _t = instance.web._t;
     
     instance.web.form.FieldPad = instance.web.form.AbstractField.extend(instance.web.form.ReinitializeWidgetMixin, {
         template: 'FieldPad',
         content: "",
         init: function() {
+            var self = this;
             this._super.apply(this, arguments);
-            this.set("configured", true);
-            this.on("change:configured", this, this.switch_configured);
+            this._configured_deferred = this.view.dataset.call('pad_is_configured').done(function(data) {
+                self.set("configured", !!data);
+            }).fail(function(data, event) {
+                event.preventDefault();
+                self.set("configured", true);
+            });
         },
         initialize_content: function() {
             var self = this;
-            this.switch_configured();
             this.$('.oe_pad_switch').click(function() {
                 self.$el.toggleClass('oe_pad_fullscreen');
                 self.view.$el.find('.oe_chatter').toggle();
             });
+            this._configured_deferred.always(function() {
+                var configured = self.get('configured');
+                self.$(".oe_unconfigured").toggle(!configured);
+                self.$(".oe_configured").toggle(configured);
+            });
             this.render_value();
         },
-        switch_configured: function() {
-            this.$(".oe_unconfigured").toggle(! this.get("configured"));
-            this.$(".oe_configured").toggle(this.get("configured"));
-        },
         render_value: function() {
-            var self  = this;
-            if (this.get("configured") && ! this.get("value")) {
-                self.view.dataset.call('pad_generate_url', {
-                    context: {
-                        model: self.view.model,
-                        field_name: self.name,
-                        object_id: self.view.datarecord.id
-                    },
-                }).done(function(data) {
-                    if (! data.url) {
-                        self.set("configured", false);
+            var self = this;
+            this._configured_deferred.always(function() {
+                if (! self.get('configured')) {
+                    return;
+                };
+                var value = self.get('value');
+                if (self.get('effective_readonly')) {
+                    if (_.str.startsWith(value, 'http')) {
+                        this.pad_loading_request = self.view.dataset.call('pad_get_content', {url: value}).done(function(data) {
+                            self.$('.oe_pad_content').removeClass('oe_pad_loading').html('<div class="oe_pad_readonly"><div>');
+                            self.$('.oe_pad_readonly').html(data);
+                        }).fail(function() {
+                            self.$('.oe_pad_content').text(_t('Unable to load pad'));
+                        });
                     } else {
-                        self.set("value", data.url);
+                        self.$('.oe_pad_content').addClass('oe_pad_loading').show().text(_t("This pad will be initialized on first edit"));
+                    }
+                }
+                else {
+                    var def = $.when();
+                    if (! value || !_.str.startsWith(value, 'http')) {
+                        def = self.view.dataset.call('pad_generate_url', {
+                            context: {
+                                model: self.view.model,
+                                field_name: self.name,
+                                object_id: self.view.datarecord.id
+                            },
+                        }).done(function(data) {
+                            if (! data.url) {
+                                self.set("configured", false);
+                            } else {
+                                self.set("value", data.url);
+                            }
+                        });
                     }
-                });
-            }
-            this.$('.oe_pad_content').html("");
-            var value = this.get('value');
-            if (this.pad_loading_request) {
-                this.pad_loading_request.abort();
-            }
-            if (_.str.startsWith(value, 'http')) {
-                if (! this.get('effective_readonly')) {
-                    var content = '<iframe width="100%" height="100%" frameborder="0" src="' + value + '?showChat=false&userName=' + this.session.username + '"></iframe>';
-                    this.$('.oe_pad_content').html(content);
-                    this._dirty_flag = true;
-                } else {
-                    this.content = '<div class="oe_pad_loading">... Loading pad ...</div>';
-                    this.pad_loading_request = self.view.dataset.call('pad_get_content', {url: value}).done(function(data) {
-                        self.$('.oe_pad_content').html('<div class="oe_pad_readonly"><div>');
-                        self.$('.oe_pad_readonly').html(data);
-                    }).fail(function() {
-                        self.$('.oe_pad_content').text('Unable to load pad');
+                    def.then(function() {
+                        value = self.get('value');
+                        if (_.str.startsWith(value, 'http')) {
+                            var content = '<iframe width="100%" height="100%" frameborder="0" src="' + value + '?showChat=false&userName=' + self.session.username + '"></iframe>';
+                            self.$('.oe_pad_content').html(content);
+                            self._dirty_flag = true;
+                        }
+                        else {
+                            self.$('.oe_pad_content').text(value);
+                        }
                     });
                 }
-            }
+            });
         },
     });