diff options
| author | niv-openerp <nicolas.vanhoren@openerp.com> | 2011-07-28 16:34:13 +0200 |
|---|---|---|
| committer | niv-openerp <nicolas.vanhoren@openerp.com> | 2011-07-28 16:34:13 +0200 |
| commit | ccb48c8f4b2bab8345e1e80379b54b2f093954e8 (patch) | |
| tree | bf7be59c1394f76139d8d4ad6def4a055d6b477c /addons/base/static/src/js/controller.js | |
| parent | 556d06c65ba0786afbc97732a4bcc8e00b3af082 (diff) | |
[imp] changed a lot of things in controller but stick with retro-compatibility
bzr revid: nicolas.vanhoren@openerp.com-20110728143413-7z0an78q6k5ytsiy
Diffstat (limited to 'addons/base/static/src/js/controller.js')
| -rw-r--r-- | addons/base/static/src/js/controller.js | 352 |
1 files changed, 54 insertions, 298 deletions
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") { @@ -187,78 +168,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) { - $('<pre></pre>').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 * * @param {String} url endpoint url @@ -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: |
