From ccb48c8f4b2bab8345e1e80379b54b2f093954e8 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 28 Jul 2011 16:34:13 +0200 Subject: [imp] changed a lot of things in controller but stick with retro-compatibility bzr revid: nicolas.vanhoren@openerp.com-20110728143413-7z0an78q6k5ytsiy --- addons/base/static/src/js/controller.js | 352 +++++--------------------------- 1 file changed, 54 insertions(+), 298 deletions(-) (limited to 'addons/base/static/src/js/controller.js') diff --git a/addons/base/static/src/js/controller.js b/addons/base/static/src/js/controller.js index 1a13ab18607..a9bf99f8764 100644 --- a/addons/base/static/src/js/controller.js +++ b/addons/base/static/src/js/controller.js @@ -148,33 +148,14 @@ instance.base.generate_null_object_class = function(claz, add) { // -------------------------------------------------------- // OLD // -------------------------------------------------------- - /** - * OpenERP Controller - * TODO merge BaseWidget with Controller + * Class for OpenERP session aware classes to extend. Also provides callback mechanism and logging + * facility. */ -instance.base.Controller = instance.base.Class.extend( /** @lends instance.base.Controller# */{ - /** - * @constructs - * rpc operations, event binding and callback calling should be done in - * start() instead of init so that events can be hooked in between. - */ - init: function(parent, element_id) { - this.element_id = element_id; - this.$element = $('#' + element_id); - if (element_id) { - instance.screen[element_id] = this; - } - // save the parent children relationship - this.controller_parent = parent; - this.controller_children = []; - if(parent && parent.controller_children) { - parent.controller_children.push(this); - } - // backward compatibility - this.parent = this.controller_parent; - this.children = this.controller_children; - +instance.base.SessionAware = instance.base.Class.extend({ + init: function(session) { + this.session = session; + // Transform on_* method into openerp.base.callbacks for (var name in this) { if(typeof(this[name]) == "function") { @@ -186,78 +167,6 @@ instance.base.Controller = instance.base.Class.extend( /** @lends instance.base. } } }, - /** - * Event binding, rpc and callback calling required to initialize the - * object should happen here - * - * Returns a promise object letting callers (subclasses and direct callers) - * know when this component is done starting - * - * @returns {jQuery.Deferred} - */ - start: function() { - // returns an already fulfilled promise. Maybe we could return nothing? - // $.when can take non-deferred and in that case it simply considers - // them all as fulfilled promises. - // But in thise case we *have* to ensure callers use $.when and don't - // try to call deferred methods on this return value. - return $.Deferred().done().promise(); - }, - stop: function() { - if (this.parent && this.parent.children) { - this.parent.children = _.without(this.parent.children, this); - this.parent.controller_children = this.parent.children; - } - this.parent = null; - this.controller_parent = null; - }, - log: function() { - var args = Array.prototype.slice.call(arguments); - var caller = arguments.callee.caller; - // TODO add support for line number using - // https://github.com/emwendelin/javascript-stacktrace/blob/master/stacktrace.js - // args.unshift("" + caller.debug_name); - this.on_log.apply(this,args); - }, - on_log: function() { - if(window.openerp.debug || (window.location.search.indexOf('?debug') !== -1)) { - var notify = false; - var body = false; - if(window.console) { - console.log(arguments); - } else { - body = true; - } - var a = Array.prototype.slice.call(arguments, 0); - for(var i = 0; i < a.length; i++) { - var v = a[i]==null ? "null" : a[i].toString(); - if(i==0) { - notify = v.match(/^not/); - body = v.match(/^bod/); - } - if(body) { - $('
').text(v).appendTo($('body'));
-                }
-                if(notify && this.notification) {
-                    this.notification.notify("Logging:",v);
-                }
-            }
-        }
-
-    }
-});
-
-/**
- * OpenERP session aware controller
- * a controller takes an already existing dom element and manage it
- */
-instance.base.Controller = instance.base.Controller.extend( /** @lends openerp.base.Controller# */{
-    init: function(parent, element_id) {
-        this._super(parent, element_id);
-        if(this.controller_parent && this.controller_parent.session) {
-            this.session = this.controller_parent.session;
-        }
-    },
     /**
      * Performs a JSON-RPC call
      *
@@ -270,126 +179,6 @@ instance.base.Controller = instance.base.Controller.extend( /** @lends openerp.b
     rpc: function(url, data, success, error) {
         return this.session.rpc(url, data, success, error);
     },
-    do_action: function(action, on_finished) {
-        return this.parent.do_action(action, on_finished);
-    }
-});
-
-/**
- * OpenERP session aware widget
- * A widget is a controller that doesnt take an element_id
- * it render its own html render() that you should insert into the dom
- * and bind it at start()
- */
-instance.base.BaseWidget = instance.base.Controller.extend({
-    /**
-     * The name of the QWeb template that will be used for rendering. Must be
-     * redefined in subclasses or the render() method can not be used.
-     * 
-     * @type string
-     */
-    template: null,
-    /**
-     * The prefix used to generate an id automatically. Should be redefined in
-     * subclasses. If it is not defined, a default identifier will be used.
-     * 
-     * @type string
-     */
-    identifier_prefix: 'generic-identifier',
-    /**
-     * Base class for widgets. Handle rendering (based on a QWeb template),
-     * identifier generation, parenting and destruction of the widget.
-     * Also initialize the identifier.
-     *
-     * @constructs
-     * @params {openerp.base.search.BaseWidget} parent The parent widget.
-     */
-    init: function (parent) {
-        this._super(parent);
-        this.make_id(this.identifier_prefix);
-    },
-    /**
-     * Sets and returns a globally unique identifier for the widget.
-     *
-     * If a prefix is appended, the identifier will be appended to it.
-     *
-     * @params sections prefix sections, empty/falsy sections will be removed
-     */
-    make_id: function () {
-        this.element_id = _.uniqueId(_.toArray(arguments).join('_'));
-        return this.element_id;
-    },
-    /**
-     * Render the widget. This.template must be defined.
-     * The content of the current object is passed as context to the template.
-     * 
-     * @param {object} additional Additional context arguments to pass to the template.
-     */
-    render: function (additional) {
-        return QWeb.render(this.template, _.extend({}, this, additional != null ? additional : {}));
-    },
-    /**
-     * "Starts" the widgets. Called at the end of the rendering, this allows
-     * to get a jQuery object referring to the DOM ($element attribute).
-     */
-    start: function () {
-        this._super();
-        var tmp = document.getElementById(this.element_id);
-        this.$element = tmp ? $(tmp) : null;
-    },
-    /**
-     * "Stops" the widgets. Called when the view destroys itself, this
-     * lets the widgets clean up after themselves.
-     */
-    stop: function () {
-        if(this.$element != null) {
-            this.$element.remove();
-        }
-        this._super();
-    }
-});
-
-// --------------------------------------------------------
-// N-style aka New-Style or Niv-Style
-// --------------------------------------------------------
-
-instance.base.NivController = instance.base.Class.extend({
-    init: function(parent) {
-        this.controller_parent = parent;
-        // Take the session of the parent if defined
-        if(this.controller_parent && this.controller_parent.session) {
-            this.session = this.controller_parent.session;
-        }
-        // Transform on_* method into openerp.base.callbacks
-        for (var name in this) {
-            if(typeof(this[name]) == "function") {
-                this[name].debug_name = name;
-                // bind ALL function to this not only on_and _do ?
-                if((/^on_|^do_/).test(name)) {
-                    this[name] = instance.base.callback(this, this[name]);
-                }
-            }
-        }
-    },
-    /**
-     * Event binding, rpc and callback calling required to initialize the
-     * object should happen here
-     *
-     * Returns a promise object letting callers (subclasses and direct callers)
-     * know when this component is done starting
-     *
-     * @returns {jQuery.Deferred}
-     */
-    start: function() {
-        // returns an already fulfilled promise. Maybe we could return nothing?
-        // $.when can take non-deferred and in that case it simply considers
-        // them all as fulfilled promises.
-        // But in thise case we *have* to ensure callers use $.when and don't
-        // try to call deferred methods on this return value.
-        return $.Deferred().done().promise();
-    },
-    stop: function() {
-    },
     log: function() {
         var args = Array.prototype.slice.call(arguments);
         var caller = arguments.callee.caller;
@@ -422,65 +211,54 @@ instance.base.NivController = instance.base.Class.extend({
                 }
             }
         }
-
-    },
-    /**
-     * Performs a JSON-RPC call
-     *
-     * @param {String} url endpoint url
-     * @param {Object} data RPC parameters
-     * @param {Function} success RPC call success callback
-     * @param {Function} error RPC call error callback
-     * @returns {jQuery.Deferred} deferred object for the RPC call
-     */
-    rpc: function(url, data, success, error) {
-        return this.session.rpc(url, data, success, error);
-    },
-    do_action: function(action, on_finished) {
-        return this.controller_parent.do_action(action, on_finished);
     }
 });
 
-instance.base.NivWidget = instance.base.Controller.extend({
+instance.base.Controller = instance.base.SessionAware.extend({
     /**
      * The name of the QWeb template that will be used for rendering. Must be
-     * redefined in subclasses or the render() method can not be used.
+     * redefined in subclasses or the default render() method can not be used.
      * 
      * @type string
      */
     template: null,
     /**
      * The prefix used to generate an id automatically. Should be redefined in
-     * subclasses. If it is not defined, a default identifier will be used.
+     * subclasses. If it is not defined, a generic identifier will be used.
      * 
      * @type string
      */
     identifier_prefix: 'generic-identifier',
     /**
-     * Base class for widgets. Handle rendering (based on a QWeb template),
-     * identifier generation, parenting and destruction of the widget.
-     * Also initialize the identifier.
-     *
      * @constructs
-     * @params {openerp.base.search.BaseWidget} parent The parent widget.
+     * rpc operations, event binding and callback calling should be done in
+     * start() instead of init so that events can be hooked in between.
      */
     init: function(parent, element_id) {
-        this._super(parent);
-        this.make_id(this.identifier_prefix);
-        // this.element_id = element_id;
-        // this.$element = $('#' + element_id);
-        // if (element_id) {
-        //     instance.screen[element_id] = this;
-        // }
+        this._super((parent || {}).session);
+        //TODO niv: get away the possibility to specify an id
+        this.element_id = element_id;
+        this.element_id = this.element_id || _.uniqueId(this.identifier_prefix);
+        
+        this.$element = $('#' + element_id);
+        if (element_id) {
+            instance.screen[element_id] = this;
+        }
         // save the parent children relationship
-        this.controller_children = [];
-        if(parent && parent.controller_children) {
-            parent.controller_children.push(this);
+        this.widget_parent = parent;
+        this.widget_children = [];
+        if(parent && parent.widget_children) {
+            parent.widget_children.push(this);
         }
-        // backward compatibility
-        this.parent = this.controller_parent;
-        this.children = this.controller_children;
-
+    },
+    /**
+     * Render the widget. This.template must be defined.
+     * The content of the current object is passed as context to the template.
+     * 
+     * @param {object} additional Additional context arguments to pass to the template.
+     */
+    render: function (additional) {
+        return QWeb.render(this.template, _.extend({widget: this}, additional || {}));
     },
     /**
      * Event binding, rpc and callback calling required to initialize the
@@ -491,59 +269,37 @@ instance.base.NivWidget = instance.base.Controller.extend({
      *
      * @returns {jQuery.Deferred}
      */
-    /**
-     * "Starts" the widgets. Called at the end of the rendering, this allows
-     * to get a jQuery object referring to the DOM ($element attribute).
-     */
-    start: function () {
-        this._super();
+    start: function() {
         var tmp = document.getElementById(this.element_id);
         this.$element = tmp ? $(tmp) : null;
+        return $.Deferred().done().promise();
     },
     stop: function() {
+        _.each(_.clone(this.widget_children), function(el) {
+            el.stop();
+        });
         if(this.$element != null) {
             this.$element.remove();
         }
-        if (this.parent && this.parent.children) {
-            this.parent.children = _.without(this.parent.children, this);
-            this.parent.controller_children = this.parent.children;
+        if (this.widget_parent && this.widget_parent.widget_children) {
+            this.widget_parent.widget_children = _.without(this.widget_parent.widget_children, this);
         }
-        this.parent = null;
-        this.controller_parent = null;
-    },
-    /**
-     * Sets and returns a globally unique identifier for the widget.
-     *
-     * If a prefix is appended, the identifier will be appended to it.
-     *
-     * @params sections prefix sections, empty/falsy sections will be removed
-     */
-    make_id: function () {
-        this.element_id = _.uniqueId(_.toArray(arguments).join('_'));
-        return this.element_id;
-    },
-    /**
-     * Render the widget. This.template must be defined.
-     * The content of the current object is passed as context to the template.
-     * 
-     * @param {object} additional Additional context arguments to pass to the template.
-     */
-    render: function (additional) {
-        return QWeb.render(this.template, _.extend({}, this, additional != null ? additional : {}));
-    },
-    widget_add: function(element, addfunc) {
-    },
-    widget_append: function(element) {
-    },
-    widget_prepend: function(element) {
-    },
-    widget_append2: function(element) {
-    },
-    widget_prepend2: function(element) {
+        this.widget_parent = null;
     },
+    do_action: function(action, on_finished) {
+        return this.widget_parent.do_action(action, on_finished);
+    }
 });
 
+/*
+ * For retro compatibility only, the only difference with is that render takes
+ * directly this instead of 
+ */
+instance.base.BaseWidget = instance.base.Controller.extend({
+    render: function (additional) {
+        return QWeb.render(this.template, _.extend(_.extend({}, this), additional || {}));
+    }
+});
 
-};
-
+}
 // vim:et fdc=0 fdl=0 foldnestmax=3 fdm=syntax:
-- 
cgit v1.2.3


From 8e8ca695cb7136048e8d5c428c1daaf06af7f476 Mon Sep 17 00:00:00 2001
From: niv-openerp 
Date: Thu, 28 Jul 2011 16:49:12 +0200
Subject: [imp] changed Controller to Widget and BaseWidget to OldWidget

bzr revid: nicolas.vanhoren@openerp.com-20110728144912-t3kml1yo8gt261ga
---
 addons/base/static/src/js/controller.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

(limited to 'addons/base/static/src/js/controller.js')

diff --git a/addons/base/static/src/js/controller.js b/addons/base/static/src/js/controller.js
index a9bf99f8764..2ed00f29ff9 100644
--- a/addons/base/static/src/js/controller.js
+++ b/addons/base/static/src/js/controller.js
@@ -140,7 +140,7 @@ instance.base.generate_null_object_class = function(claz, add) {
             copy_proto(prototype.prototype);
     };
     copy_proto(claz.prototype);
-    newer.init = instance.base.Controller.prototype.init;
+    newer.init = instance.base.Widget.prototype.init;
     var tmpclass = claz.extend(newer);
     return tmpclass.extend(add || {});
 };
@@ -214,7 +214,7 @@ instance.base.SessionAware = instance.base.Class.extend({
     }
 });
 
-instance.base.Controller = instance.base.SessionAware.extend({
+instance.base.Widget = instance.base.SessionAware.extend({
     /**
      * The name of the QWeb template that will be used for rendering. Must be
      * redefined in subclasses or the default render() method can not be used.
@@ -295,7 +295,7 @@ instance.base.Controller = instance.base.SessionAware.extend({
  * For retro compatibility only, the only difference with is that render takes
  * directly this instead of 
  */
-instance.base.BaseWidget = instance.base.Controller.extend({
+instance.base.OldWidget = instance.base.Widget.extend({
     render: function (additional) {
         return QWeb.render(this.template, _.extend(_.extend({}, this), additional || {}));
     }
-- 
cgit v1.2.3