From e1ce5f153962d7b51a4f9a958b932a114807e969 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 3 Jul 2012 17:14:01 +0200 Subject: [FIX] correct jsonp. backport of revid:chs@openerp.com-20120531132020-ccagkni2dqu6i75u from 6.1 branch bzr revid: chs@openerp.com-20120703151401-tmb3puk00cigfdpl --- addons/web/static/src/js/corelib.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 5af51fa519a..1ed4c4788e3 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -1307,19 +1307,19 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({ } else { // Indirect jsonp request var ifid = _.uniqueId('oe_rpc_iframe'); - var display = options.openerp.debug ? 'block' : 'none'; + var display = self.debug ? 'block' : 'none'; var $iframe = $(_.str.sprintf("", ifid, ifid, display)); var $form = $('
') .attr('method', 'POST') .attr('target', ifid) .attr('enctype', "multipart/form-data") - .attr('action', ajax.url + '?' + $.param(data)) + .attr('action', ajax.url + '?jsonp=1&' + $.param(data)) .append($('').attr('value', payload_str)) .hide() .appendTo($('body')); var cleanUp = function() { if ($iframe) { - $iframe.unbind("load").attr("src", "javascript:false;").remove(); + $iframe.unbind("load").remove(); } $form.remove(); }; -- cgit v1.2.3 From 0fee0cea0079a57d362a5752cf3499a28c58bc43 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 11 Jun 2012 08:45:23 +0200 Subject: [ADD] backbone-ification of Widgets API bzr revid: xmo@openerp.com-20120611064523-gczdqmfes5f1g9kj --- addons/web/static/src/js/corelib.js | 177 +++++++++++++++++++++++++++++------- 1 file changed, 143 insertions(+), 34 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 94c748f839c..8455a183f87 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -238,6 +238,20 @@ instance.web.ParentedMixin = { } }; +/** + * Utility function for APIs which can take either a value or a function which + * returns a value + * + * @param {Object} object + * @param {String} property + * @returns {Object} + */ +var getValue = function (object, property) { + if (object == null) { return null; } + var value = object[property]; + return _.isFunction(value) ? value.call(object) : value; +}; + /** * Backbone's events. Do not ever use it directly, use EventDispatcherMixin instead. * @@ -490,23 +504,19 @@ instance.web.CallbackEnabledMixin = _.extend({}, instance.web.PropertiesMixin, { * * The semantics of this precisely replace closing over the method call. * - * @param {String} method_name name of the method to invoke + * @param {String|Function} method function or name of the method to invoke * @returns {Function} proxied method */ - proxy: function (method_name) { + proxy: function (method) { var self = this; return function () { - return self[method_name].apply(self, arguments); + var fn = (method instanceof String) ? self[method] : method; + return fn.apply(self, arguments); } } }); instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { - /** - * Tag name when creating a default $element. - * @type string - */ - tagName: 'div', /** * Constructs the widget and sets its parent if a parent is given. * @@ -516,14 +526,9 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { * @param {instance.web.Widget} parent Binds the current instance to the given Widget instance. * When that widget is destroyed by calling destroy(), the current instance will be * destroyed too. Can be null. - * @param {String} element_id Deprecated. Sets the element_id. Only useful when you want - * to bind the current Widget to an already existing part of the DOM, which is not compatible - * with the DOM insertion methods provided by the current implementation of Widget. So - * for new components this argument should not be provided any more. */ init: function(parent) { instance.web.CallbackEnabledMixin.init.call(this); - this.$element = $(document.createElement(this.tagName)); this.setParent(parent); }, /** @@ -533,8 +538,8 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { _.each(this.getChildren(), function(el) { el.destroy(); }); - if(this.$element != null) { - this.$element.remove(); + if(this.$el) { + this.$el.remove(); } instance.web.PropertiesMixin.destroy.call(this); }, @@ -546,7 +551,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { appendTo: function(target) { var self = this; return this.__widgetRenderAndInsert(function(t) { - self.$element.appendTo(t); + self.$el.appendTo(t); }, target); }, /** @@ -557,7 +562,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { prependTo: function(target) { var self = this; return this.__widgetRenderAndInsert(function(t) { - self.$element.prependTo(t); + self.$el.prependTo(t); }, target); }, /** @@ -568,7 +573,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { insertAfter: function(target) { var self = this; return this.__widgetRenderAndInsert(function(t) { - self.$element.insertAfter(t); + self.$el.insertAfter(t); }, target); }, /** @@ -579,7 +584,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { insertBefore: function(target) { var self = this; return this.__widgetRenderAndInsert(function(t) { - self.$element.insertBefore(t); + self.$el.insertBefore(t); }, target); }, /** @@ -589,7 +594,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { */ replace: function(target) { return this.__widgetRenderAndInsert(_.bind(function(t) { - this.$element.replaceAll(t); + this.$el.replaceAll(t); }, this), target); }, __widgetRenderAndInsert: function(insertion, target) { @@ -612,6 +617,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { * @returns {jQuery.Deferred} */ start: function() { + return $.when(); } }); @@ -688,12 +694,9 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { * @param {instance.web.Widget} parent Binds the current instance to the given Widget instance. * When that widget is destroyed by calling destroy(), the current instance will be * destroyed too. Can be null. - * @param {String} element_id Deprecated. Sets the element_id. Only useful when you want - * to bind the current Widget to an already existing part of the DOM, which is not compatible - * with the DOM insertion methods provided by the current implementation of Widget. So - * for new components this argument should not be provided any more. */ init: function(parent) { + this._uid = _.uniqueId('-widget-'); instance.web.WidgetMixin.init.call(this,parent); this.session = instance.connection; }, @@ -703,20 +706,126 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { * key that references `this`. */ renderElement: function() { - var rendered = null; - if (this.template) - rendered = instance.web.qweb.render(this.template, {widget: this}); - if (_.str.trim(rendered)) { - var elem = $(rendered); - this.$element.replaceWith(elem); - this.$element = elem; + var $el; + if (this.template) { + $el = $(_.str.trim(instance.web.qweb.render( + this.template, {widget: this}))); + } else { + var attrs = _.extend({}, getValue(this, 'attributes') || {}); + if (this.id) { attrs.id = this.id; } + if (this.className) { attrs['class'] = this.className; } + $el = $(this.make(this.tagName, attrs)) + } + this.setElement($el); + }, + + /** + * Re-sets the widget's root element (el/$el/$element). + * + * Includes: + * * re-delegating events + * * re-binding sub-elements + * * if the widget already had a root element, replacing the pre-existing + * element in the DOM + * + * @param {HTMLElement | jQuery} element new root element for the widget + * @return {*} + */ + setElement: function (element) { + if (this.$el) { + this.undelegateEvents(); + this.unbindElements(); + this.$el.replaceWith(element); } + + this.$element = this.$el = (element instanceof $) ? element : $(element); + this.el = this.$el[0]; + + this.bindElements(); + this.delegateEvents(); + + return this; }, + + // Backbone-ish API + tagName: 'div', + id: null, + className: null, + attributes: {}, /** - * Shortcut for $element.find() like backbone + * Utility function to build small DOM elements. + * + * @param {String} tagName name of the DOM element to create + * @param {Object} [attributes] map of DOM attributes to set on the element + * @param {String} [content] HTML content to set on the element + * @return {Element} + */ + make: function (tagName, attributes, content) { + var el = document.createElement(tagName); + if (attributes) { + $(el).attrs(attributes); + } + if (content) { + $(el).html(content); + } + return el; + }, + events: {}, + delegateEvents: function () { + var events = getValue(this, 'events'); + if (_.isEmpty(events)) { return; } + + for(var key in events) { + if (!events.hasOwnProperty(key)) { continue; } + + var method = this.proxy(events[key]); + + var match = /^(\S+)(\s+(.*))?$/.exec(key); + var event = match[1]; + var selector = match[3]; + + // add namespace for easy un-delegation + event += '.delegated-events' + this._uid; + if (!selector) { + this.$el.on(event, method); + } else { + this.$el.on(event, selector, method); + } + } + }, + undelegateEvents: function () { + this.$el.off('.delegated-events' + this._uid); + }, + elements: {}, + bindElements: function () { + var elements = getValue(this, 'elements'); + if (_.isEmpty(elements)) { return; } + + for (var selector in elements) { + if (!elements.hasOwnProperty(selector)) { continue; } + + // TODO: ensure at least one element matched? + this[elements[selector]] = this.$(selector); + } + }, + unbindElements: function () { + var elements = getValue(this, 'elements'); + if (_.isEmpty(elements)) { return; } + + for (var selector in elements) { + if (!elements.hasOwnProperty(selector)) { continue; } + + delete this[elements[selector]]; + } + }, + /** + * Shortcut for ``this.$el.find(selector)`` + * + * @param {String} selector CSS selector, rooted in $el + * @returns {jQuery} selector match */ - "$": function() { - return this.$element.find.apply(this.$element,arguments); + $: function(selector) { + return this.$el.find(selector); }, /** * Informs the action manager to do an action. This supposes that -- cgit v1.2.3 From 26ec50e0603561128a5470f871d9ea487ed95560 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 11 Jun 2012 11:18:03 +0200 Subject: [FIX] bug in new 'proxy' implementation revealed by searchview tests bzr revid: xmo@openerp.com-20120611091803-kzo5j5t8p82gwr6i --- addons/web/static/src/js/corelib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 8455a183f87..61464a58930 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -510,7 +510,7 @@ instance.web.CallbackEnabledMixin = _.extend({}, instance.web.PropertiesMixin, { proxy: function (method) { var self = this; return function () { - var fn = (method instanceof String) ? self[method] : method; + var fn = (typeof method === 'string') ? self[method] : method; return fn.apply(self, arguments); } } -- cgit v1.2.3 From a0c5057dbacef8e8f1841245c58ad4f52da57ef9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 11 Jun 2012 13:32:38 +0200 Subject: [TEST] Widget#renderElement with no template specified, fix Widget#make's handling of attributes bzr revid: xmo@openerp.com-20120611113238-wz516g9tl0xp1igd --- addons/web/static/src/js/corelib.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 61464a58930..83586ec57d4 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -762,8 +762,8 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { */ make: function (tagName, attributes, content) { var el = document.createElement(tagName); - if (attributes) { - $(el).attrs(attributes); + if (!_.isEmpty(attributes)) { + $(el).attr(attributes); } if (content) { $(el).html(content); -- cgit v1.2.3 From d6f376464516709c7b4ad7631ac1e49e4e39fe5e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 11 Jun 2012 16:41:08 +0200 Subject: [REM] declarative elements binding, not sure there's much point and can add later bzr revid: xmo@openerp.com-20120611144108-pw8pz5p06prsikxe --- addons/web/static/src/js/corelib.js | 24 ------------------------ 1 file changed, 24 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 83586ec57d4..e9fd4e1fedf 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -734,14 +734,12 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { setElement: function (element) { if (this.$el) { this.undelegateEvents(); - this.unbindElements(); this.$el.replaceWith(element); } this.$element = this.$el = (element instanceof $) ? element : $(element); this.el = this.$el[0]; - this.bindElements(); this.delegateEvents(); return this; @@ -796,28 +794,6 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { undelegateEvents: function () { this.$el.off('.delegated-events' + this._uid); }, - elements: {}, - bindElements: function () { - var elements = getValue(this, 'elements'); - if (_.isEmpty(elements)) { return; } - - for (var selector in elements) { - if (!elements.hasOwnProperty(selector)) { continue; } - - // TODO: ensure at least one element matched? - this[elements[selector]] = this.$(selector); - } - }, - unbindElements: function () { - var elements = getValue(this, 'elements'); - if (_.isEmpty(elements)) { return; } - - for (var selector in elements) { - if (!elements.hasOwnProperty(selector)) { continue; } - - delete this[elements[selector]]; - } - }, /** * Shortcut for ``this.$el.find(selector)`` * -- cgit v1.2.3 From f0ad5fedacc2e994ef8ba45b05113278ac72db95 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 12 Jun 2012 15:21:20 +0200 Subject: [IMP] move .replaceWith() back into renderElement * Better formalizes repeated calls to renderElement * Makes setElement cleaner and less surprising to call bzr revid: xmo@openerp.com-20120612132120-egsg4kr5n2riv4zk --- addons/web/static/src/js/corelib.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index e9fd4e1fedf..73fa6839607 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -716,7 +716,11 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { if (this.className) { attrs['class'] = this.className; } $el = $(this.make(this.tagName, attrs)) } + var $oldel = this.$el; this.setElement($el); + if ($oldel && !$oldel.is(this.$el)) { + $oldel.replaceWith(this.$el); + } }, /** @@ -734,7 +738,6 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { setElement: function (element) { if (this.$el) { this.undelegateEvents(); - this.$el.replaceWith(element); } this.$element = this.$el = (element instanceof $) ? element : $(element); -- cgit v1.2.3 From 43fb6b3ee39999fd55a045a961372691b8926e58 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 11 Jul 2012 17:25:58 +0200 Subject: [CHG] require that Widget#attributes be an object if present, not a function bzr revid: xmo@openerp.com-20120711152558-9jm096g7mowgfvf5 --- addons/web/static/src/js/corelib.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 73fa6839607..d71ff91247d 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -711,10 +711,10 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { $el = $(_.str.trim(instance.web.qweb.render( this.template, {widget: this}))); } else { - var attrs = _.extend({}, getValue(this, 'attributes') || {}); + var attrs = _.extend({}, this.attributes || {}); if (this.id) { attrs.id = this.id; } if (this.className) { attrs['class'] = this.className; } - $el = $(this.make(this.tagName, attrs)) + $el = $(this.make(this.tagName, attrs)); } var $oldel = this.$el; this.setElement($el); -- cgit v1.2.3 From a6e85cfd5a533e5d9ff83121ae901978029bc0b5 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Sat, 21 Jul 2012 22:12:53 +0200 Subject: [REM] setValue, event namespacing bzr revid: al@openerp.com-20120721201253-z35xjhao0r1mv6l1 --- addons/web/static/src/js/corelib.js | 35 +++++++++-------------------------- 1 file changed, 9 insertions(+), 26 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 5ecd6dbb07d..dcaaa864fc8 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -237,20 +237,6 @@ instance.web.ParentedMixin = { } }; -/** - * Utility function for APIs which can take either a value or a function which - * returns a value - * - * @param {Object} object - * @param {String} property - * @returns {Object} - */ -var getValue = function (object, property) { - if (object == null) { return null; } - var value = object[property]; - return _.isFunction(value) ? value.call(object) : value; -}; - /** * Backbone's events. Do not ever use it directly, use EventDispatcherMixin instead. * @@ -677,6 +663,12 @@ instance.web.CallbackEnabled = instance.web.Class.extend(instance.web.CallbackEn * That will kill the widget in a clean way and erase its content from the dom. */ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { + // Backbone-ish API + tagName: 'div', + id: null, + className: null, + attributes: {}, + events: {}, /** * 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. @@ -695,7 +687,6 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { * destroyed too. Can be null. */ init: function(parent) { - this._uid = _.uniqueId('-widget-'); instance.web.WidgetMixin.init.call(this,parent); this.session = instance.connection; }, @@ -746,12 +737,6 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { return this; }, - - // Backbone-ish API - tagName: 'div', - id: null, - className: null, - attributes: {}, /** * Utility function to build small DOM elements. * @@ -770,9 +755,8 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { } return el; }, - events: {}, delegateEvents: function () { - var events = getValue(this, 'events'); + var events = this.events; if (_.isEmpty(events)) { return; } for(var key in events) { @@ -784,8 +768,7 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { var event = match[1]; var selector = match[3]; - // add namespace for easy un-delegation - event += '.delegated-events' + this._uid; + event += '.delegated-events'; if (!selector) { this.$el.on(event, method); } else { @@ -794,7 +777,7 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { } }, undelegateEvents: function () { - this.$el.off('.delegated-events' + this._uid); + this.$el.off('.delegated-events'); }, /** * Shortcut for ``this.$el.find(selector)`` -- cgit v1.2.3 From 974d4f4f106762dafb82b6d6f7a7a43fd6cdacdb Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Wed, 25 Jul 2012 10:24:46 +0200 Subject: rename widget event namespace bzr revid: al@openerp.com-20120725082446-eahrub8qigektert --- addons/web/static/src/js/corelib.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index dcaaa864fc8..6c7fd539b38 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -768,7 +768,7 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { var event = match[1]; var selector = match[3]; - event += '.delegated-events'; + event += '.widget_events'; if (!selector) { this.$el.on(event, method); } else { @@ -777,7 +777,7 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { } }, undelegateEvents: function () { - this.$el.off('.delegated-events'); + this.$el.off('.widget_events'); }, /** * Shortcut for ``this.$el.find(selector)`` -- cgit v1.2.3 From 9cc2f4fb2553e7c327cbe97e49ab693813500c4b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 25 Jul 2012 11:19:16 +0200 Subject: [IMP] extract 'set element as new widget root and replace old one in DOM' in its own method also fix OldWidget to use it, as it had not been fixed when #replaceWith was extracted out of setElement bzr revid: xmo@openerp.com-20120725091916-g9t5qmaeeqcceuk1 --- addons/web/static/src/js/corelib.js | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 6c7fd539b38..42e549b5ca1 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -706,13 +706,24 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { if (this.className) { attrs['class'] = this.className; } $el = $(this.make(this.tagName, attrs)); } + this.replaceElement($el); + }, + + /** + * Re-sets the widget's root element and replaces the old root element + * (if any) by the new one in the DOM. + * + * @param {HTMLElement | jQuery} $el + * @returns {*} this + */ + replaceElement: function ($el) { var $oldel = this.$el; this.setElement($el); if ($oldel && !$oldel.is(this.$el)) { $oldel.replaceWith(this.$el); } + return this; }, - /** * Re-sets the widget's root element (el/$el/$element). * @@ -723,7 +734,7 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { * element in the DOM * * @param {HTMLElement | jQuery} element new root element for the widget - * @return {*} + * @return {*} this */ setElement: function (element) { if (this.$el) { -- cgit v1.2.3 From 31621f412a76cdaa04b866d94d94fe0e96f24a12 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Wed, 25 Jul 2012 16:13:33 +0200 Subject: wip bzr revid: nicolas.vanhoren@openerp.com-20120725141333-ueaj3e0i8imlwvre --- addons/web/static/src/js/corelib.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 1ed4c4788e3..a092b670ef1 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -378,7 +378,8 @@ instance.web.PropertiesMixin = _.extend({}, instance.web.EventDispatcherMixin, { instance.web.EventDispatcherMixin.init.call(this); this.__getterSetterInternalMap = {}; }, - set: function(map) { + set: function(map, options) { + options = options || {}; var self = this; var changed = false; _.each(map, function(val, key) { @@ -387,10 +388,11 @@ instance.web.PropertiesMixin = _.extend({}, instance.web.EventDispatcherMixin, { return; changed = true; self.__getterSetterInternalMap[key] = val; - self.trigger("change:" + key, self, { - oldValue: tmp, - newValue: val - }); + if (! options.silent) + self.trigger("change:" + key, self, { + oldValue: tmp, + newValue: val + }); }); if (changed) self.trigger("change", self); -- cgit v1.2.3 From d304f9fbb7765be660ac54d47c5ed2cba6719880 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 26 Jul 2012 09:53:59 +0200 Subject: [CHG] rename this. to this. because why make things simple when you can make them fucked up bzr revid: xmo@openerp.com-20120726075359-b0uvuuagrfsf7nhb --- addons/web/static/src/js/corelib.js | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 42e549b5ca1..b80543a34d8 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -523,8 +523,8 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { _.each(this.getChildren(), function(el) { el.destroy(); }); - if(this.$el) { - this.$el.remove(); + if(this.$element) { + this.$element.remove(); } instance.web.PropertiesMixin.destroy.call(this); }, @@ -536,7 +536,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { appendTo: function(target) { var self = this; return this.__widgetRenderAndInsert(function(t) { - self.$el.appendTo(t); + self.$element.appendTo(t); }, target); }, /** @@ -547,7 +547,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { prependTo: function(target) { var self = this; return this.__widgetRenderAndInsert(function(t) { - self.$el.prependTo(t); + self.$element.prependTo(t); }, target); }, /** @@ -558,7 +558,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { insertAfter: function(target) { var self = this; return this.__widgetRenderAndInsert(function(t) { - self.$el.insertAfter(t); + self.$element.insertAfter(t); }, target); }, /** @@ -569,7 +569,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { insertBefore: function(target) { var self = this; return this.__widgetRenderAndInsert(function(t) { - self.$el.insertBefore(t); + self.$element.insertBefore(t); }, target); }, /** @@ -579,7 +579,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { */ replace: function(target) { return this.__widgetRenderAndInsert(_.bind(function(t) { - this.$el.replaceAll(t); + this.$element.replaceAll(t); }, this), target); }, __widgetRenderAndInsert: function(insertion, target) { @@ -717,10 +717,10 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { * @returns {*} this */ replaceElement: function ($el) { - var $oldel = this.$el; + var $oldel = this.$element; this.setElement($el); - if ($oldel && !$oldel.is(this.$el)) { - $oldel.replaceWith(this.$el); + if ($oldel && !$oldel.is(this.$element)) { + $oldel.replaceWith(this.$element); } return this; }, @@ -737,12 +737,12 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { * @return {*} this */ setElement: function (element) { - if (this.$el) { + if (this.$element) { this.undelegateEvents(); } - this.$element = this.$el = (element instanceof $) ? element : $(element); - this.el = this.$el[0]; + this.$element = (element instanceof $) ? element : $(element); + this.el = this.$element[0]; this.delegateEvents(); @@ -781,23 +781,23 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { event += '.widget_events'; if (!selector) { - this.$el.on(event, method); + this.$element.on(event, method); } else { - this.$el.on(event, selector, method); + this.$element.on(event, selector, method); } } }, undelegateEvents: function () { - this.$el.off('.widget_events'); + this.$element.off('.widget_events'); }, /** - * Shortcut for ``this.$el.find(selector)`` + * Shortcut for ``this.$element.find(selector)`` * * @param {String} selector CSS selector, rooted in $el * @returns {jQuery} selector match */ $: function(selector) { - return this.$el.find(selector); + return this.$element.find(selector); }, /** * Informs the action manager to do an action. This supposes that -- cgit v1.2.3 From 5c0324f3214d95c3a2d34db7d6d145700501c762 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 26 Jul 2012 16:48:17 +0200 Subject: [IMP] Widget#setElement from init to reinstate $element always being there That makes precious little sense, but a bunch of widgets actually expect $element to exist before start() has been called. Also extract creating a node from the widget's node description into a private method, use that where possible. bzr revid: xmo@openerp.com-20120726144817-20caa8jkvg39ycho --- addons/web/static/src/js/corelib.js | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index b80543a34d8..3fafcab26fb 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -514,6 +514,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { */ init: function(parent) { instance.web.CallbackEnabledMixin.init.call(this); + this.setElement(this._make_descriptive()); this.setParent(parent); }, /** @@ -701,10 +702,7 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { $el = $(_.str.trim(instance.web.qweb.render( this.template, {widget: this}))); } else { - var attrs = _.extend({}, this.attributes || {}); - if (this.id) { attrs.id = this.id; } - if (this.className) { attrs['class'] = this.className; } - $el = $(this.make(this.tagName, attrs)); + $el = this._make_descriptive(); } this.replaceElement($el); }, @@ -737,6 +735,8 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { * @return {*} this */ setElement: function (element) { + // NB: completely useless, as WidgetMixin#init creates a $element + // always if (this.$element) { this.undelegateEvents(); } @@ -766,6 +766,19 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { } return el; }, + /** + * Makes a potential root element from the declarative builder of the + * widget + * + * @return {jQuery} + * @private + */ + _make_descriptive: function () { + var attrs = _.extend({}, this.attributes || {}); + if (this.id) { attrs.id = this.id; } + if (this.className) { attrs['class'] = this.className; } + return $(this.make(this.tagName, attrs)); + }, delegateEvents: function () { var events = this.events; if (_.isEmpty(events)) { return; } -- cgit v1.2.3 From 5fe4ff9c49e741c607ae33279552c6ae492f87ab Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 26 Jul 2012 16:57:04 +0200 Subject: [FIX] move setElement init call from WidgetMixin to Widget Widget is the one providing both setElement and _make_descriptive... bzr revid: xmo@openerp.com-20120726145704-uzg7ufntvf24gnyd --- addons/web/static/src/js/corelib.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 3fafcab26fb..370fe74e63e 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -514,7 +514,6 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { */ init: function(parent) { instance.web.CallbackEnabledMixin.init.call(this); - this.setElement(this._make_descriptive()); this.setParent(parent); }, /** @@ -689,6 +688,8 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { */ init: function(parent) { instance.web.WidgetMixin.init.call(this,parent); + // FIXME: this should not be + this.setElement(this._make_descriptive()); this.session = instance.connection; }, /** -- cgit v1.2.3 From f1b6bc35d6bc2682619d3a970375b068e83220af Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 1 Aug 2012 16:44:35 +0200 Subject: [FIX] add current_date to JS evaluation context bzr revid: xmo@openerp.com-20120801144435-h0643av6ju9ncdpx --- addons/web/static/src/js/corelib.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 846ae3e4758..de2b094aacc 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -1135,7 +1135,8 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({ uid: new py.float(this.uid), datetime: datetime, time: time, - relativedelta: relativedelta + relativedelta: relativedelta, + current_date: date.today.__call__().strftime(['%Y-%m-%d']) }; }, /** -- cgit v1.2.3 From 2c57c15491395e9edd0ad0cebcf3b12f6e02ee03 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Thu, 2 Aug 2012 16:46:23 +0200 Subject: [IMP] Mass rename \t to 4 spaces bzr revid: nicolas.vanhoren@openerp.com-20120802144623-ykl5te005ytnv584 --- addons/web/static/src/js/corelib.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index de2b094aacc..a46d6314ebe 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -1377,7 +1377,7 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({ processData: false }, url); if (this.synch) - ajax.async = false; + ajax.async = false; return $.ajax(ajax); }, rpc_jsonp: function(url, payload) { @@ -1396,7 +1396,7 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({ data: data }, url); if (this.synch) - ajax.async = false; + ajax.async = false; var payload_str = JSON.stringify(payload); var payload_url = $.param({r:payload_str}); if(payload_url.length < 2000) { -- cgit v1.2.3 From 63e4d9b572f27a5cdfa347e159ebc7e39f240ce1 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Tue, 14 Aug 2012 17:29:00 +0200 Subject: [IMP] sed -i '' -e 's/connection/session/g' bzr revid: chs@openerp.com-20120814152900-8r84kyz0qy1hwkvz --- addons/web/static/src/js/corelib.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index a46d6314ebe..5da12043994 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -692,7 +692,7 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { instance.web.WidgetMixin.init.call(this,parent); // FIXME: this should not be this.setElement(this._make_descriptive()); - this.session = instance.connection; + this.session = instance.session; }, /** * Renders the element. The default implementation renders the widget using QWeb, @@ -841,7 +841,7 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { rpc: function(url, data, success, error) { var def = $.Deferred().then(success, error); var self = this; - instance.connection.rpc(url, data). then(function() { + instance.session.rpc(url, data). then(function() { if (!self.isDestroyed()) def.resolve.apply(def, arguments); }, function() { @@ -863,7 +863,7 @@ instance.web.Registry = instance.web.Class.extend({ * * An object path is simply a dotted name from the instance root to the * object pointed to (e.g. ``"instance.web.Session"`` for an OpenERP - * connection object). + * session object). * * @constructs instance.web.Registry * @param {Object} mapping a mapping of keys to object-paths -- cgit v1.2.3 From 5e338c591ac76f57453563792fe20e9a20f31edc Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 24 Aug 2012 20:27:07 +0200 Subject: [IMP] made a whole-application replace of $element by $el bzr revid: nicolas.vanhoren@openerp.com-20120824182707-vt91ef40ieeudwyw --- addons/web/static/src/js/corelib.js | 44 ++++++++++++++++++------------------- 1 file changed, 22 insertions(+), 22 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 5da12043994..8a28c0a8a4d 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -525,8 +525,8 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { _.each(this.getChildren(), function(el) { el.destroy(); }); - if(this.$element) { - this.$element.remove(); + if(this.$el) { + this.$el.remove(); } instance.web.PropertiesMixin.destroy.call(this); }, @@ -538,7 +538,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { appendTo: function(target) { var self = this; return this.__widgetRenderAndInsert(function(t) { - self.$element.appendTo(t); + self.$el.appendTo(t); }, target); }, /** @@ -549,7 +549,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { prependTo: function(target) { var self = this; return this.__widgetRenderAndInsert(function(t) { - self.$element.prependTo(t); + self.$el.prependTo(t); }, target); }, /** @@ -560,7 +560,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { insertAfter: function(target) { var self = this; return this.__widgetRenderAndInsert(function(t) { - self.$element.insertAfter(t); + self.$el.insertAfter(t); }, target); }, /** @@ -571,7 +571,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { insertBefore: function(target) { var self = this; return this.__widgetRenderAndInsert(function(t) { - self.$element.insertBefore(t); + self.$el.insertBefore(t); }, target); }, /** @@ -581,7 +581,7 @@ instance.web.WidgetMixin = _.extend({},instance.web.CallbackEnabledMixin, { */ replace: function(target) { return this.__widgetRenderAndInsert(_.bind(function(t) { - this.$element.replaceAll(t); + this.$el.replaceAll(t); }, this), target); }, __widgetRenderAndInsert: function(insertion, target) { @@ -640,8 +640,8 @@ instance.web.CallbackEnabled = instance.web.Class.extend(instance.web.CallbackEn * // stuff that you want to init before the rendering * }, * start: function() { - * // stuff you want to make after the rendering, `this.$element` holds a correct value - * this.$element.find(".my_button").click(/* an example of event binding * /); + * // stuff you want to make after the rendering, `this.$el` holds a correct value + * this.$el.find(".my_button").click(/* an example of event binding * /); * * // if you have some asynchronous operations, it's a good idea to return * // a promise in start() @@ -718,15 +718,15 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { * @returns {*} this */ replaceElement: function ($el) { - var $oldel = this.$element; + var $oldel = this.$el; this.setElement($el); - if ($oldel && !$oldel.is(this.$element)) { - $oldel.replaceWith(this.$element); + if ($oldel && !$oldel.is(this.$el)) { + $oldel.replaceWith(this.$el); } return this; }, /** - * Re-sets the widget's root element (el/$el/$element). + * Re-sets the widget's root element (el/$el/$el). * * Includes: * * re-delegating events @@ -738,14 +738,14 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { * @return {*} this */ setElement: function (element) { - // NB: completely useless, as WidgetMixin#init creates a $element + // NB: completely useless, as WidgetMixin#init creates a $el // always - if (this.$element) { + if (this.$el) { this.undelegateEvents(); } - this.$element = (element instanceof $) ? element : $(element); - this.el = this.$element[0]; + this.$el = (element instanceof $) ? element : $(element); + this.el = this.$el[0]; this.delegateEvents(); @@ -797,23 +797,23 @@ instance.web.Widget = instance.web.Class.extend(instance.web.WidgetMixin, { event += '.widget_events'; if (!selector) { - this.$element.on(event, method); + this.$el.on(event, method); } else { - this.$element.on(event, selector, method); + this.$el.on(event, selector, method); } } }, undelegateEvents: function () { - this.$element.off('.widget_events'); + this.$el.off('.widget_events'); }, /** - * Shortcut for ``this.$element.find(selector)`` + * Shortcut for ``this.$el.find(selector)`` * * @param {String} selector CSS selector, rooted in $el * @returns {jQuery} selector match */ $: function(selector) { - return this.$element.find(selector); + return this.$el.find(selector); }, /** * Informs the action manager to do an action. This supposes that -- cgit v1.2.3 From df6668cd7896956e11fc03dc035e2591cb5ecd41 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Mon, 3 Sep 2012 13:30:59 +0200 Subject: [REM] Session remove on_session bzr revid: al@openerp.com-20120903113059-8jts6776xryjeadl --- addons/web/static/src/js/corelib.js | 6 ------ 1 file changed, 6 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 8a28c0a8a4d..c74c2d5dc03 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -1323,12 +1323,6 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({ deferred.resolve(response["result"], textStatus, jqXHR); } else if (response.error.data.type === "session_invalid") { self.uid = false; - // TODO deprecate or use a deferred on login.do_ask_login() - self.on_session_invalid(function() { - self.rpc(url, payload.params, - function() { deferred.resolve.apply(deferred, arguments); }, - function() { deferred.reject.apply(deferred, arguments); }); - }); } else { deferred.reject(response.error, $.Event()); } -- cgit v1.2.3 From 97b1022f8b6c226110d52329770fb5d82142f212 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Fri, 28 Sep 2012 02:24:51 +0200 Subject: [IMP] callbackenable goodbye part1 bzr revid: al@openerp.com-20120928002451-qhel37u21zswj1f7 --- addons/web/static/src/js/corelib.js | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index c74c2d5dc03..fe23e34748b 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -1310,12 +1310,12 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({ id: _.uniqueId('r') }; var deferred = $.Deferred(); - this.on_rpc_request(); + this.trigger('request', url, payload); var aborter = params.aborter; delete params.aborter; var request = this.rpc_function(url, payload).then( function (response, textStatus, jqXHR) { - self.on_rpc_response(); + self.trigger('response', response); if (!response.error) { if (url.url === '/web/session/eval_domain_and_context') { self.test_eval(params, response.result); @@ -1328,7 +1328,7 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({ } }, function(jqXHR, textStatus, errorThrown) { - self.on_rpc_response(); + self.trigger('error'); var error = { code: -32098, message: "XmlHttpRequestError " + errorThrown, @@ -1436,10 +1436,6 @@ instance.web.JsonRPC = instance.web.CallbackEnabled.extend({ return deferred; } }, - on_rpc_request: function() { - }, - on_rpc_response: function() { - }, on_rpc_error: function(error) { }, get_url: function (file) { -- cgit v1.2.3 From 52dd75a609c958d47b91636fbb63a4d4c06dac57 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Fri, 28 Sep 2012 02:44:49 +0200 Subject: [IMP] corelib eventdispatcher document events in class, example for JsonRpc bzr revid: al@openerp.com-20120928004449-d9cvdmfg0ud701nx --- addons/web/static/src/js/corelib.js | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index fe23e34748b..0096abc3b89 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -972,6 +972,11 @@ instance.web.Registry = instance.web.Class.extend({ }); instance.web.JsonRPC = instance.web.CallbackEnabled.extend({ + events: { + 'request': 'Request sent', + 'response': 'Response received', + 'error': 'HTTP Error response or timeout received', + }, /** * @constructs instance.web.JsonRPC * @extends instance.web.CallbackEnabled -- cgit v1.2.3 From 6d692fac366553a729ab0314e185439df3a9ecab Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Fri, 28 Sep 2012 02:59:50 +0200 Subject: [IMP] corelib eventdispatcher document triggers bzr revid: al@openerp.com-20120928005950-722cfdyjsq1pjwyj --- addons/web/static/src/js/corelib.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'addons/web/static/src/js/corelib.js') diff --git a/addons/web/static/src/js/corelib.js b/addons/web/static/src/js/corelib.js index 0096abc3b89..62ac48f0c61 100644 --- a/addons/web/static/src/js/corelib.js +++ b/addons/web/static/src/js/corelib.js @@ -972,7 +972,7 @@ instance.web.Registry = instance.web.Class.extend({ }); instance.web.JsonRPC = instance.web.CallbackEnabled.extend({ - events: { + triggers: { 'request': 'Request sent', 'response': 'Response received', 'error': 'HTTP Error response or timeout received', -- cgit v1.2.3