From 4ce473b8dc0dc53467fcd0520bc593866018f34e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 17 Aug 2011 10:55:32 +0200 Subject: [PATCH 01/24] [ADD] basics for smarter collections to back the listview and its components bzr revid: xmo@openerp.com-20110817085532-4chvix1odshuebvc --- addons/base/static/src/js/core.js | 3 + addons/base/static/src/js/list.js | 159 +++++++++++++++++++++++++- addons/base/static/test/list-utils.js | 155 +++++++++++++++++++++++++ addons/base/static/test/test.html | 1 + 4 files changed, 317 insertions(+), 1 deletion(-) create mode 100644 addons/base/static/test/list-utils.js diff --git a/addons/base/static/src/js/core.js b/addons/base/static/src/js/core.js index 96c6cb1372a..5c2e6554785 100644 --- a/addons/base/static/src/js/core.js +++ b/addons/base/static/src/js/core.js @@ -10,6 +10,9 @@ openerp.base.core = function(openerp) { var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/; // The base Class implementation (does nothing) + /** + * @class + */ openerp.base.Class = function(){}; // Create a new Class that inherits from this class diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index a0440221520..7fe995f533f 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -1179,7 +1179,164 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas }); } }); + +/** + * @class + * @extends openerp.base.Class + */ +var Events = { + /** + * @param {String} event event to listen to on the current object, null for all events + * @param {Function} handler event handler to bind to the relevant event + * @returns this + */ + bind: function (event, handler) { + var calls = this['_callbacks'] || (this._callbacks = {}); + + if (event in calls) { + calls[event].push(handler); + } else { + calls[event] = [handler]; + } + return this; + }, + /** + * @param {String} event + * @returns this + */ + trigger: function (event) { + var calls; + if (!(calls = this._callbacks)) { return this; } + var callbacks = (calls[event] || []).concat(calls[null] || []); + for(var i=0, length=callbacks.length; i + From 2f8e6e62e57898168fd67bfb904ec158b34efbe1 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 17 Aug 2011 14:55:41 +0200 Subject: [PATCH 02/24] [FIX] qweb2: incorrect tail call when using foreach() with a number (to iterate over a range) bzr revid: xmo@openerp.com-20110817125541-wh95qu7jjwa7ojef --- addons/base/static/lib/qweb/qweb2.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base/static/lib/qweb/qweb2.js b/addons/base/static/lib/qweb/qweb2.js index 89a77bf1b85..8987f1dc40e 100644 --- a/addons/base/static/lib/qweb/qweb2.js +++ b/addons/base/static/lib/qweb/qweb2.js @@ -169,7 +169,7 @@ var QWeb2 = { for (var i = 0; i < enu; i++) { _enu.push(i); } - this.foreach(context, enu, as, old_dict, callback); + this.foreach(context, _enu, as, old_dict, callback); } else { var index = 0; for (var k in enu) { From bd497353714b3d7b05af941815f649c44a3b394c Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 17 Aug 2011 15:16:35 +0200 Subject: [PATCH 03/24] [IMP] convert listviews (non-editable anyway) to collections bzr revid: xmo@openerp.com-20110817131635-cv3qcbiarmlk5o3o --- addons/base/static/src/js/list.js | 197 +++++++++++++++----------- addons/base/static/src/xml/base.xml | 10 +- addons/base/static/test/list-utils.js | 48 +++++++ 3 files changed, 170 insertions(+), 85 deletions(-) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 7fe995f533f..810f5c4d7d5 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -50,6 +50,8 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi this.columns = []; + this.records = new Collection(); + this.set_groups(new openerp.base.ListView.Groups(this)); if (this.dataset instanceof openerp.base.DataSetStatic) { @@ -535,7 +537,7 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi count += record.count || 1; _(columns).each(function (column) { var field = column.id, - value = record.values[field]; + value = record.values.get(field); switch (column['function']) { case 'sum': sums[field] += value; @@ -621,7 +623,7 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. this.options = opts.options; this.columns = opts.columns; this.dataset = opts.dataset; - this.rows = opts.rows; + this.records = opts.records; this.$_element = $('') .appendTo(document.body) @@ -657,7 +659,7 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. row_clicked: function () { $(this).trigger( 'row_link', - [this.rows[this.dataset.index].data.id.value, + [this.records.at(this.dataset.index).get('id'), this.dataset]); }, render: function () { @@ -677,15 +679,12 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. if (!this.options.selectable) { return []; } - var rows = this.rows; + var records = this.records; var result = {ids: [], records: []}; this.$current.find('th.oe-record-selector input:checked') .closest('tr').each(function () { - var record = {}; - _(rows[$(this).data('index')].data).each(function (obj, key) { - record[key] = obj.value; - }); - result.ids.push(record.id); + var record = records.at($(this).data('index')); + result.ids.push(record.get('id')); result.records.push(record); }); return result; @@ -707,7 +706,7 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. * @returns {Number|String} the identifier of the row's object */ row_id: function (row) { - return this.rows[this.row_position(row)].data.id.value; + return this.records.at(this.row_position(row)).get('id'); }, /** * Death signal, cleans up list @@ -719,41 +718,14 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. this.$_element.remove(); }, get_records: function () { - return _(this.rows).map(function (row) { - var record = {}; - _(row.data).each(function (obj, key) { - record[key] = obj.value; - }); - return {count: 1, values: record}; - }); - }, - /** - * Transforms a record from what is returned by a dataset read (a simple - * mapping of ``$fieldname: $value``) to the format expected by list rows - * and form views: - * - * data: { - * $fieldname: { - * value: $value - * } - * } - * - * This format allows for the insertion of a bunch of metadata (names, - * colors, etc...) - * - * @param {Object} record original record, in dataset format - * @returns {Object} record displayable in a form or list view - */ - transform_record: function (record) { - // TODO: colors handling - var form_data = {}, - form_record = {data: form_data}; - - _(record).each(function (value, key) { - form_data[key] = {value: value}; - }); - - return form_record; + var records = []; + for(var i=0, length=this.records.length; i=0; --i) { + this.records.remove(this.records.get(ids[i])); + } } // drag and drop }); @@ -829,11 +795,20 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas * * Provides events similar to those of * :js:class:`~openerp.base.ListView.List` + * + * @constructs + * @param {openerp.base.ListView} view + * @param {Object} [options] + * @param {Collection} [options.records] + * @param {Object} [options.options] + * @param {Array} [options.columns] */ - init: function (view) { + init: function (view, options) { + options = options || {}; this.view = view; - this.options = view.options; - this.columns = view.columns; + this.records = options.records || view.records; + this.options = options.options || view.options; + this.columns = options.columns || view.columns; this.datagroup = null; this.$row = null; @@ -925,6 +900,7 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas delete self.children[group.value]; } var child = self.children[group.value] = new openerp.base.ListView.Groups(self.view, { + records: self.records.proxy(group.value), options: self.options, columns: self.columns }); @@ -1019,13 +995,12 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas }); }, render_dataset: function (dataset) { - var rows = [], - self = this, + var self = this, list = new openerp.base.ListView.List(this, { options: this.options, columns: this.columns, dataset: dataset, - rows: rows + records: this.records }); this.bind_child_events(list); @@ -1054,11 +1029,7 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas .attr('disabled', page === pages - 1); } - var form_records = _(records).map( - $.proxy(list, 'transform_record')); - - rows.splice(0, rows.length); - rows.push.apply(rows, form_records); + self.records.reset(records); list.render(); d.resolve(list); }); @@ -1078,7 +1049,9 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas var from = ui.item.data('index'), to = ui.item.prev().data('index') || 0; if (from === to) { return; } - list.rows.splice(to, 0, list.rows.splice(from, 1)[0]); + var to_move = list.records.at(from); + list.records.remove(to_move); + list.records.add(to_move, {at: to}); ui.item.parent().children().each(function (i, e) { // reset record-index accelerators on rows and even/odd @@ -1089,17 +1062,16 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas }); // resequencing time! - var data, index = to, + var record, index = to, // if drag to 1st row (to = 0), start sequencing from 0 // (exclusive lower bound) - seq = to ? list.rows[to - 1].data.sequence.value : 0; - while (++seq, list.rows[index]) { - data = list.rows[index].data; - data.sequence.value = seq; + seq = to ? list.records.at(to - 1).get('sequence') : 0; + while (++seq, record = list.records.at(index)) { + record.set('sequence', seq); // write are independent from one another, so we can just // launch them all at the same time and we don't really // give a fig about when they're done - dataset.write(data.id.value, {sequence: seq}); + dataset.write(record.get('id'), {sequence: seq}); list.reload_record(index++); } } @@ -1223,14 +1195,14 @@ var Record = openerp.base.Class.extend(/** @lends Record# */{ * @param {Object} [data] */ init: function (data) { - this.data = data || {}; + this.attributes = data || {}; }, /** * @param {String} key * @returns {Object} */ get: function (key) { - return this.data[key]; + return this.attributes[key]; }, /** * @param key @@ -1238,10 +1210,32 @@ var Record = openerp.base.Class.extend(/** @lends Record# */{ * @returns {Record} */ set: function (key, value) { - this.data[key] = value; + this.attributes[key] = value; this.trigger('change:' + key, this, value); this.trigger('change', this); return this; + }, + /** + * Converts the current record to the format expected by form views: + * + * .. code-block:: javascript + * + * data: { + * $fieldname: { + * value: $value + * } + * } + * + * + * @returns {Object} record displayable in a form view + */ + toForm: function () { + var form_data = {}; + _(this.attributes).each(function (value, key) { + form_data[key] = {value: value}; + }); + + return {data: form_data}; } }); Record.include(Events); @@ -1257,6 +1251,7 @@ var Collection = openerp.base.Class.extend(/** @lends Collection# */{ init: function (records, options) { options = options || {}; _.bindAll(this, '_onRecordEvent'); + this.length = 0; this.records = []; this._byId = {}; this._proxies = {}; @@ -1269,16 +1264,24 @@ var Collection = openerp.base.Class.extend(/** @lends Collection# */{ }, /** * @param {Object|Array} record + * @param {Object} [options] + * @param {Number} [options.at] * @returns this */ - add: function (record) { + add: function (record, options) { + options = options || {}; var records = record instanceof Array ? record : [record]; for(var i=0, length=records.length; i - - + + + + + + @@ -573,7 +577,7 @@ - + diff --git a/addons/base/static/test/list-utils.js b/addons/base/static/test/list-utils.js index 97431acb597..a04ae963932 100644 --- a/addons/base/static/test/list-utils.js +++ b/addons/base/static/test/list-utils.js @@ -107,10 +107,12 @@ $(document).ready(function () { }); test('Fetch from collection', function () { var c = new openerp.base.list.Collection(); + strictEqual(c.length, 0); c.add({id: 1, value: 2}); c.add({id: 2, value: 3}); c.add({id: 3, value: 5}); c.add({id: 4, value: 7}); + strictEqual(c.length, 4); var r = c.at(2), r2 = c.get(1); ok(r instanceof openerp.base.list.Record); @@ -121,6 +123,52 @@ $(document).ready(function () { strictEqual(r2.get('id'), 1); strictEqual(r2.get('value'), 2); }); + test('Add at index', function () { + var c = new openerp.base.list.Collection([ + {id: 1, value: 5}, + {id: 2, value: 10}, + {id: 3, value: 20} + ]); + strictEqual(c.at(1).get('value'), 10); + equal(c.at(3), undefined); + c.add({id:4, value: 55}, {at: 1}); + strictEqual(c.at(1).get('value'), 55); + strictEqual(c.at(3).get('value'), 20); + }); + test('Remove record', function () { + var c = new openerp.base.list.Collection([ + {id: 1, value: 5}, + {id: 2, value: 10}, + {id: 3, value: 20} + ]); + var record = c.get(2); + strictEqual(c.length, 3); + c.remove(record); + strictEqual(c.length, 2); + equal(c.get(2), undefined); + strictEqual(c.at(1).get('value'), 20); + }); + test('Reset', function () { + var event, obj, c = new openerp.base.list.Collection([ + {id: 1, value: 5}, + {id: 2, value: 10}, + {id: 3, value: 20} + ]); + c.bind(null, function (e, instance) { event = e; obj = instance; }); + c.reset(); + strictEqual(c.length, 0); + strictEqual(event, 'reset'); + strictEqual(obj, c); + c.add([ + {id: 1, value: 5}, + {id: 2, value: 10}, + {id: 3, value: 20} + ]); + c.reset([{id: 42, value: 55}]); + strictEqual(c.length, 1); + strictEqual(c.get(42).get('value'), 55); + }); + test('Events propagation', function () { var values = []; var c = new openerp.base.list.Collection([ From d433eada00cbbe3ac3a387b831e4b957b135cbb6 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 17 Aug 2011 15:36:00 +0200 Subject: [PATCH 04/24] [ADD] acknowledgement that the listview backing collections are quite strongly inspired by backbone's bzr revid: xmo@openerp.com-20110817133600-hl93utj2eh7pr5cd --- addons/base/static/src/js/list.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 810f5c4d7d5..e6514de6a24 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -1241,6 +1241,11 @@ var Record = openerp.base.Class.extend(/** @lends Record# */{ Record.include(Events); var Collection = openerp.base.Class.extend(/** @lends Collection# */{ /** + * Smarter collections, with events, very strongly inspired by Backbone's. + * + * Using a "dumb" array of records makes synchronization between the + * various serious + * * @constructs * @extends openerp.base.Class * @borrows Events#bind as this.bind From 10117faf2c466b02488d6017654dc3405ff1ed66 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 18 Aug 2011 12:19:36 +0200 Subject: [PATCH 05/24] [FIX] edit event in editable list: use records collection bzr revid: xmo@openerp.com-20110818101936-4jbnt8rhlsjkxxyt --- addons/base/static/src/js/list-editable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base/static/src/js/list-editable.js b/addons/base/static/src/js/list-editable.js index e56a807bf08..468e043d9a9 100644 --- a/addons/base/static/src/js/list-editable.js +++ b/addons/base/static/src/js/list-editable.js @@ -241,7 +241,7 @@ openerp.base.list.editable = function (openerp) { this.dataset.index))); $(this).trigger( 'edit', - [this.rows[this.dataset.index].data.id.value, this.dataset]); + [this.records.at(this.dataset.index).get('id'), this.dataset]); }, new_record: function () { this.dataset.index = null; From 92e06c997b181cf3f7f3724c3253d70fb981255b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 18 Aug 2011 14:21:06 +0200 Subject: [PATCH 06/24] [ADD] basic implementation of each and map on collections bzr revid: xmo@openerp.com-20110818122106-lt23fl3smbxg4f82 --- addons/base/static/src/js/list.js | 38 ++++++++++---- addons/base/static/test/list-utils.js | 72 +++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 10 deletions(-) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index e6514de6a24..2024b1c9881 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -376,6 +376,7 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi * re-renders the content of the list view */ reload_content: function () { + this.records.reset(); this.$element.find('.oe-listview-content').append( this.groups.apoptosis().render( $.proxy(this, 'compute_aggregates'))); @@ -537,7 +538,7 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi count += record.count || 1; _(columns).each(function (column) { var field = column.id, - value = record.values.get(field); + value = record.values[field]; switch (column['function']) { case 'sum': sums[field] += value; @@ -685,7 +686,7 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. .closest('tr').each(function () { var record = records.at($(this).data('index')); result.ids.push(record.get('id')); - result.records.push(record); + result.records.push(record.attributes); }); return result; }, @@ -718,14 +719,9 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. this.$_element.remove(); }, get_records: function () { - var records = []; - for(var i=0, length=this.records.length; i Date: Thu, 18 Aug 2011 15:27:47 +0200 Subject: [PATCH 07/24] [FIX] reset records on a group apoptosis, cleanout proxies when reseting a Collection bzr revid: xmo@openerp.com-20110818132747-xnsgcugx1nohc7p8 --- addons/base/static/src/js/list.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 2024b1c9881..d6a8808a63d 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -1119,6 +1119,7 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas }); this.children = {}; $(this.elements).remove(); + this.records.reset(); return this; }, get_records: function () { @@ -1339,6 +1340,7 @@ var Collection = openerp.base.Class.extend(/** @lends Collection# */{ _(this._proxies).each(function (proxy) { proxy.reset(); }); + this._proxies = {}; this.length = 0; this.records = []; this._byId = {}; From d69cd3cb155373237117c4de67823028120cc41e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 19 Aug 2011 12:12:08 +0200 Subject: [PATCH 08/24] [???] try to hook some stuff into reset event bzr revid: xmo@openerp.com-20110819101208-nqoroidipedo73rs --- addons/base/static/src/js/list.js | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index d6a8808a63d..6f65b124776 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -338,9 +338,7 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi this.sidebar.$element.show(); } if (this.hidden) { - this.$element.find('.oe-listview-content').append( - this.groups.apoptosis().render()); - this.hidden = false; + this.reload_content(); } }, do_hide: function () { @@ -378,7 +376,7 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi reload_content: function () { this.records.reset(); this.$element.find('.oe-listview-content').append( - this.groups.apoptosis().render( + this.groups.render( $.proxy(this, 'compute_aggregates'))); }, /** @@ -626,6 +624,8 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. this.dataset = opts.dataset; this.records = opts.records; + this.records.bind('reset', $.proxy(this, 'on_records_reset')); + this.$_element = $('') .appendTo(document.body) .delegate('th.oe-record-selector', 'click', function (e) { @@ -710,9 +710,9 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. return this.records.at(this.row_position(row)).get('id'); }, /** - * Death signal, cleans up list + * Death signal, cleans up list display */ - apoptosis: function () { + on_records_reset: function (ev, records) { if (!this.$current) { return; } this.$current.remove(); this.$current = null; @@ -811,6 +811,8 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas this.children = {}; this.page = 0; + + this.records.bind('reset', $.proxy(this, 'on_records_reset')); }, make_fragment: function () { return document.createDocumentFragment(); @@ -871,7 +873,7 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas }, close: function () { this.$row.children().last().empty(); - this.apoptosis(); + this.records.reset(); }, /** * Prefixes ``$node`` with floated spaces in order to indent it relative @@ -892,7 +894,7 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas var placeholder = this.make_fragment(); _(datagroups).each(function (group) { if (self.children[group.value]) { - self.children[group.value].apoptosis(); + self.records.proxy(group.value).reset(); delete self.children[group.value]; } var child = self.children[group.value] = new openerp.base.ListView.Groups(self.view, { @@ -1025,7 +1027,7 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas .attr('disabled', page === pages - 1); } - self.records.reset(records); + self.records.add(records); list.render(); d.resolve(list); }); @@ -1113,14 +1115,9 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas return {ids: ids, records: records}; }, - apoptosis: function () { - _(this.children).each(function (child) { - child.apoptosis(); - }); + on_records_reset: function () { this.children = {}; $(this.elements).remove(); - this.records.reset(); - return this; }, get_records: function () { if (_(this.children).isEmpty()) { @@ -1368,6 +1365,8 @@ var Collection = openerp.base.Class.extend(/** @lends Collection# */{ }, _onRecordEvent: function (event, record, options) { + // don't propagate reset events + if (event === 'reset') { return; } this.trigger.apply(this, arguments); }, From 32e9a10a1e62b580d1da1e2e2c22589eccd658b9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 19 Aug 2011 12:16:44 +0200 Subject: [PATCH 09/24] [IMP] only trigger change events when a field's value was actually changed, provide more information in change event bzr revid: xmo@openerp.com-20110819101644-edovs858qrz1wb3y --- addons/base/static/src/js/list.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 6f65b124776..966f35bbdde 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -1204,9 +1204,12 @@ var Record = openerp.base.Class.extend(/** @lends Record# */{ * @returns {Record} */ set: function (key, value) { + if (this.attributes[key] === value) { + return this; + } this.attributes[key] = value; this.trigger('change:' + key, this, value); - this.trigger('change', this); + this.trigger('change', this, key, value); return this; }, /** From ec9a40c8f53e02db554abdf0bbf012488d0466e9 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 19 Aug 2011 12:17:23 +0200 Subject: [PATCH 10/24] [IMP] add previous field value to change events bzr revid: xmo@openerp.com-20110819101723-p73bts37knut34c8 --- addons/base/static/src/js/list.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 966f35bbdde..cee1adbdb69 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -1204,12 +1204,13 @@ var Record = openerp.base.Class.extend(/** @lends Record# */{ * @returns {Record} */ set: function (key, value) { - if (this.attributes[key] === value) { + var old_value = this.attributes[key]; + if (old_value === value) { return this; } this.attributes[key] = value; - this.trigger('change:' + key, this, value); - this.trigger('change', this, key, value); + this.trigger('change:' + key, this, value, old_value); + this.trigger('change', this, key, value, old_value); return this; }, /** From 1209b60a4268d47acbf84a22b4ff4c91fe8ca21e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 19 Aug 2011 12:39:55 +0200 Subject: [PATCH 11/24] [IMP] bind row and aggregate display refreshes on changes in the underlying model(s) bzr revid: xmo@openerp.com-20110819103955-gx0j7t3kxl8pjy56 --- addons/base/static/src/js/list-editable.js | 2 +- addons/base/static/src/js/list.js | 62 +++++++++++----------- addons/base/static/src/xml/base.xml | 2 +- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/addons/base/static/src/js/list-editable.js b/addons/base/static/src/js/list-editable.js index 468e043d9a9..c89227a05cb 100644 --- a/addons/base/static/src/js/list-editable.js +++ b/addons/base/static/src/js/list-editable.js @@ -105,7 +105,7 @@ openerp.base.list.editable = function (openerp) { } if (this.edition_index !== null) { - this.reload_record(this.edition_index, true).then(function () { + this.reload_record(this.edition_index).then(function () { cancelled.resolve(); }); } else { diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index cee1adbdb69..c4fd56fa3a6 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -42,6 +42,7 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi * @borrows openerp.base.ActionExecutor#execute_action as #execute_action */ init: function(parent, element_id, dataset, view_id, options) { + var self = this; this._super(parent, element_id); this.set_default_options(_.extend({}, this.defaults, options || {})); this.dataset = dataset; @@ -59,6 +60,13 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi } this.page = 0; + this.records.bind('change', function (event, record, key) { + if (!_(self.aggregate_columns).chain() + .pluck('name').contains(key).value()) { + return; + } + self.compute_aggregates(); + }); }, /** * Retrieves the view's number of records per page (|| section) @@ -457,16 +465,11 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi * @param {Function} callback should be called after the action is executed, if non-null */ do_button_action: function (name, id, callback) { - var self = this, - action = _.detect(this.columns, function (field) { + var action = _.detect(this.columns, function (field) { return field.name === name; }); if (!action) { return; } - this.execute_action(action, this.dataset, id, function () { - $.when(callback.apply(this, arguments).then(function () { - self.compute_aggregates(); - })); - }); + this.execute_action(action, this.dataset, id, callback); }, /** * Handles the activation of a record (clicking on it) @@ -625,6 +628,10 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. this.records = opts.records; this.records.bind('reset', $.proxy(this, 'on_records_reset')); + this.records.bind('change', function (event, record) { + var $row = self.$current.find('[data-id=' + record.get('id') + ']'); + $row.replaceWith(self.render_record($row.data('index'))); + }); this.$_element = $('') .appendTo(document.body) @@ -648,7 +655,7 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. index = self.row_position($row); $(self).trigger('action', [field, record_id, function () { - return self.reload_record(index, true); + return self.reload_record(index); }]); }) .delegate('tr', 'click', function (e) { @@ -707,7 +714,7 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. * @returns {Number|String} the identifier of the row's object */ row_id: function (row) { - return this.records.at(this.row_position(row)).get('id'); + return $(row).data('id'); }, /** * Death signal, cleans up list display @@ -732,28 +739,20 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. * @param {Number} record_index index of the record to reload * @param {Boolean} fetch fetches the record from remote before reloading it */ - reload_record: function (record_index, fetch) { - var self = this; - var read_p = null; - if (fetch) { - // save index to restore it later, if already set - var old_index = this.dataset.index; - this.dataset.index = record_index; - read_p = this.dataset.read_index( - _.pluck(_(this.columns).filter(function (r) {return r.tag === 'field';}), 'name'), - function (record) { - var r = self.records.get(record.id); - _(record).each(function (value, key) { - r.set(key, value); - }); - self.dataset.index = old_index; - } - ) - } + reload_record: function (record_index) { + var r = this.records.at(record_index); - return $.when(read_p).then(function () { - self.$current.children().eq(record_index) - .replaceWith(self.render_record(record_index)); }); + return this.dataset.read_ids( + [r.get('id')], + _.pluck(_(this.columns).filter(function (r) { + return r.tag === 'field'; + }), 'name'), + function (record) { + _(record[0]).each(function (value, key) { + r.set(key, value); + }); + } + ); }, /** * Renders a list record to HTML @@ -1065,12 +1064,11 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas // (exclusive lower bound) seq = to ? list.records.at(to - 1).get('sequence') : 0; while (++seq, record = list.records.at(index)) { - record.set('sequence', seq); // write are independent from one another, so we can just // launch them all at the same time and we don't really // give a fig about when they're done dataset.write(record.get('id'), {sequence: seq}); - list.reload_record(index++); + record.set('sequence', seq); } } }); diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 37994228705..d67699ac145 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -563,7 +563,7 @@ + t-att-data-index="row_index" t-att-data-id="record.get('id')"> From 88dfe802fa8965114902e867cef2fead76126446 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 19 Aug 2011 13:59:07 +0200 Subject: [PATCH 12/24] [IMP] use Collection signals to handle record removal bzr revid: xmo@openerp.com-20110819115907-s7sk4n9qd00hz6d0 --- addons/base/static/src/js/list.js | 44 +++++++++++++------------------ 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index c4fd56fa3a6..9294f264588 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -435,7 +435,9 @@ openerp.base.ListView = openerp.base.View.extend( /** @lends openerp.base.ListVi } var self = this; return $.when(this.dataset.unlink(ids)).then(function () { - self.groups.drop_records(ids); + _(ids).each(function (id) { + self.records.remove(self.records.get(id)); + }); self.compute_aggregates(); }); }, @@ -627,6 +629,14 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. this.dataset = opts.dataset; this.records = opts.records; + this.records.bind('remove', function (event, record) { + var $row = self.$current.find('[data-id=' + record.get('id') + ']'); + var index = $row.data('index'); + $row.nextAll().each(function (row) { + $(row).data('index', index++); + }); + $row.remove(); + }); this.records.bind('reset', $.proxy(this, 'on_records_reset')); this.records.bind('change', function (event, record) { var $row = self.$current.find('[data-id=' + record.get('id') + ']'); @@ -769,18 +779,7 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. row_index: record_index, render_cell: openerp.base.format_cell }); - }, - /** - * Stops displaying the records matching the provided ids. - * - * @param {Array} ids identifiers of the records to remove - */ - drop_records: function (ids) { - for(var i=ids.length-1; i>=0; --i) { - this.records.remove(this.records.get(ids[i])); - } } - // drag and drop }); openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.base.ListView.Groups# */{ passtrough_events: 'action deleted row_link', @@ -1129,19 +1128,6 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas return child.get_records(); }).flatten().value(); }, - /** - * Stops displaying the records with the linked ids, assumes these records - * were deleted from the DB. - * - * This is the up-signal from the `deleted` event on groups and lists. - * - * @param {Array} ids list of identifier of the records to remove. - */ - drop_records: function (ids) { - _.each(this.children, function (child) { - child.drop_records(ids); - }); - } }); /** @@ -1356,8 +1342,14 @@ var Collection = openerp.base.Class.extend(/** @lends Collection# */{ * @returns this */ remove: function (record) { + var self = this; var index = _(this.records).indexOf(record); - if (index === -1) { return this; } + if (index === -1) { + _(this._proxies).each(function (proxy) { + proxy.remove(record); + }); + return this; + } this.records.splice(index, 1); delete this._byId[record.get('id')]; From 2d024453a97133609a653cdc1060d65a68913f2d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 19 Aug 2011 15:21:12 +0200 Subject: [PATCH 13/24] [ADD] Collection.indexOf, fix fetching of selected records (use record id, not record index) bzr revid: xmo@openerp.com-20110819132112-y635uaukfrx2s5ii --- addons/base/static/src/js/list.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 9294f264588..996822c4a21 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -701,7 +701,7 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. var result = {ids: [], records: []}; this.$current.find('th.oe-record-selector input:checked') .closest('tr').each(function () { - var record = records.at($(this).data('index')); + var record = records.get($(this).data('id')); result.ids.push(record.get('id')); result.records.push(record.attributes); }); @@ -1381,6 +1381,9 @@ var Collection = openerp.base.Class.extend(/** @lends Collection# */{ results.push(callback(record)); }); return results; + }, + indexOf: function (record) { + return _(this.records).indexOf(record); } }); Collection.include(Events); From c18eff8665d913aaf07c417543c0fb0c611a7cae Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 19 Aug 2011 17:15:10 +0200 Subject: [PATCH 14/24] [IMP] add events unbinging to events mixin, fix Collection.reload() handling by List bzr revid: xmo@openerp.com-20110819151510-7posqx7mznldurd2 --- addons/base/static/src/js/list.js | 56 ++++++++++++++++++++------- addons/base/static/test/list-utils.js | 22 +++++++++++ 2 files changed, 63 insertions(+), 15 deletions(-) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 996822c4a21..642a0743e9a 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -629,19 +629,24 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. this.dataset = opts.dataset; this.records = opts.records; - this.records.bind('remove', function (event, record) { - var $row = self.$current.find('[data-id=' + record.get('id') + ']'); - var index = $row.data('index'); - $row.nextAll().each(function (row) { - $(row).data('index', index++); - }); - $row.remove(); - }); - this.records.bind('reset', $.proxy(this, 'on_records_reset')); - this.records.bind('change', function (event, record) { - var $row = self.$current.find('[data-id=' + record.get('id') + ']'); - $row.replaceWith(self.render_record($row.data('index'))); - }); + this.record_callbacks = { + 'remove': function (event, record) { + var $row = self.$current.find('[data-id=' + record.get('id') + ']'); + var index = $row.data('index'); + $row.nextAll().each(function (row) { + $(row).data('index', index++); + }); + $row.remove(); + }, + 'reset': $.proxy(this, 'on_records_reset'), + 'change': function (event, record) { + var $row = self.$current.find('[data-id=' + record.get('id') + ']'); + $row.replaceWith(self.render_record($row.data('index'))); + } + }; + _(this.record_callbacks).each(function (callback, event) { + this.records.bind(event, callback); + }, this); this.$_element = $('') .appendTo(document.body) @@ -729,7 +734,10 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. /** * Death signal, cleans up list display */ - on_records_reset: function (ev, records) { + on_records_reset: function () { + _(this.record_callbacks).each(function (callback, event) { + this.records.unbind(event, callback); + }, this); if (!this.$current) { return; } this.$current.remove(); this.$current = null; @@ -1127,7 +1135,7 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas .map(function (child) { return child.get_records(); }).flatten().value(); - }, + } }); /** @@ -1150,6 +1158,24 @@ var Events = { } return this; }, + /** + * @param {String} event event to unbind on the current object + * @param {function} [handler] specific event handler to remove (otherwise unbind all handlers for the event) + * @returns this + */ + unbind: function (event, handler) { + var calls = this._callbacks || {}; + if (!(event in calls)) { return this; } + if (!handler) { + delete calls[event]; + } else { + var handlers = calls[event]; + handlers.splice( + _(handlers).indexOf(handler), + 1); + } + return this; + }, /** * @param {String} event * @returns this diff --git a/addons/base/static/test/list-utils.js b/addons/base/static/test/list-utils.js index ffdc3b66b49..0b15b81f544 100644 --- a/addons/base/static/test/list-utils.js +++ b/addons/base/static/test/list-utils.js @@ -65,6 +65,28 @@ $(document).ready(function () { ok(triggered); }); + test('Unbind all handlers', function () { + var e = create(openerp.base.list.Events), passed = 0; + e.bind('foo', function () { passed++; }); + e.trigger('foo'); + strictEqual(passed, 1); + e.unbind('foo'); + e.trigger('foo'); + strictEqual(passed, 1); + }); + test('Unbind one handler', function () { + var e = create(openerp.base.list.Events), p1 = 0, p2 = 0, + h1 = function () { p1++; }, h2 = function () { p2++; }; + e.bind('foo', h1); + e.bind('foo', h2); + e.trigger('foo'); + strictEqual(p1, 1); + strictEqual(p2, 1); + e.unbind('foo', h1); + e.trigger('foo'); + strictEqual(p1, 1); + strictEqual(p2, 2); + }); module('list-records', { setup: function () { From 063e28a83defa420c0ced7667839e84ff5bd4926 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Sat, 20 Aug 2011 04:53:48 +0000 Subject: [PATCH 15/24] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20110820045348-7oh5zs7l4lr3zsq1 --- addons/account/i18n/ca.po | 2 +- addons/account/i18n/es.po | 2 +- addons/account_analytic_plans/i18n/ca.po | 2 +- addons/account_asset/i18n/ca.po | 2 +- addons/account_followup/i18n/ca.po | 2 +- addons/account_payment/i18n/ca.po | 2 +- addons/account_sequence/i18n/ca.po | 2 +- addons/base_module_quality/i18n/ca.po | 4 ++-- addons/caldav/i18n/ca.po | 2 +- addons/crm/i18n/ca.po | 2 +- addons/crm_claim/i18n/ca.po | 2 +- addons/document_webdav/i18n/ca.po | 2 +- addons/email_template/i18n/ca.po | 2 +- addons/hr_payroll_account/i18n/ca.po | 2 +- addons/hr_timesheet_invoice/i18n/ca.po | 2 +- addons/l10n_in/i18n/ca.po | 2 +- addons/l10n_syscohada/i18n/ca.po | 2 +- addons/marketing/i18n/ca.po | 2 +- addons/mrp/i18n/ca.po | 2 +- addons/point_of_sale/i18n/ca.po | 2 +- addons/portal/i18n/ca.po | 2 +- addons/project/i18n/ca.po | 2 +- addons/project_issue/i18n/ca.po | 2 +- addons/project_long_term/i18n/ca.po | 2 +- addons/project_messages/i18n/ca.po | 2 +- addons/project_scrum/i18n/ca.po | 2 +- addons/project_scrum/i18n/zh_CN.po | 2 +- addons/purchase/i18n/ca.po | 2 +- addons/purchase_requisition/i18n/ca.po | 2 +- addons/report_webkit/i18n/ca.po | 2 +- addons/resource/i18n/es_EC.po | 2 +- addons/sale_crm/i18n/ca.po | 2 +- addons/share/i18n/ca.po | 2 +- addons/stock/i18n/ca.po | 2 +- addons/stock_planning/i18n/ca.po | 2 +- 35 files changed, 36 insertions(+), 36 deletions(-) diff --git a/addons/account/i18n/ca.po b/addons/account/i18n/ca.po index 77e73347600..cf110b23577 100644 --- a/addons/account/i18n/ca.po +++ b/addons/account/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: account diff --git a/addons/account/i18n/es.po b/addons/account/i18n/es.po index 90eac677e15..d1cf677ef46 100644 --- a/addons/account/i18n/es.po +++ b/addons/account/i18n/es.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-19 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: account diff --git a/addons/account_analytic_plans/i18n/ca.po b/addons/account_analytic_plans/i18n/ca.po index 39092a2dca7..8c979a5a9bf 100644 --- a/addons/account_analytic_plans/i18n/ca.po +++ b/addons/account_analytic_plans/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: account_analytic_plans diff --git a/addons/account_asset/i18n/ca.po b/addons/account_asset/i18n/ca.po index a4db4530ca7..3f92d51f740 100755 --- a/addons/account_asset/i18n/ca.po +++ b/addons/account_asset/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:36+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: account_asset diff --git a/addons/account_followup/i18n/ca.po b/addons/account_followup/i18n/ca.po index 17a5678a5da..10ee4d15f05 100644 --- a/addons/account_followup/i18n/ca.po +++ b/addons/account_followup/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-19 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:52+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: account_followup diff --git a/addons/account_payment/i18n/ca.po b/addons/account_payment/i18n/ca.po index 5a9d22f486a..75e0067fe1e 100644 --- a/addons/account_payment/i18n/ca.po +++ b/addons/account_payment/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: account_payment diff --git a/addons/account_sequence/i18n/ca.po b/addons/account_sequence/i18n/ca.po index 2ce07730a98..6f7523bf4c8 100644 --- a/addons/account_sequence/i18n/ca.po +++ b/addons/account_sequence/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:36+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: account_sequence diff --git a/addons/base_module_quality/i18n/ca.po b/addons/base_module_quality/i18n/ca.po index 23531a5767a..ba7ac4851ed 100644 --- a/addons/base_module_quality/i18n/ca.po +++ b/addons/base_module_quality/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: base_module_quality @@ -57,7 +57,7 @@ msgstr "" #: code:addons/base_module_quality/speed_test/speed_test.py:127 #, python-format msgid "O(n) or worst" -msgstr "" +msgstr "O(n) o pitjor" #. module: base_module_quality #: selection:module.quality.detail,state:0 diff --git a/addons/caldav/i18n/ca.po b/addons/caldav/i18n/ca.po index bea034b87e2..be755a581a8 100644 --- a/addons/caldav/i18n/ca.po +++ b/addons/caldav/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:36+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: caldav diff --git a/addons/crm/i18n/ca.po b/addons/crm/i18n/ca.po index 48fa2689a0e..6cd1f755618 100644 --- a/addons/crm/i18n/ca.po +++ b/addons/crm/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:52+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: crm diff --git a/addons/crm_claim/i18n/ca.po b/addons/crm_claim/i18n/ca.po index 6021fb287ec..831daf236f9 100644 --- a/addons/crm_claim/i18n/ca.po +++ b/addons/crm_claim/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: crm_claim diff --git a/addons/document_webdav/i18n/ca.po b/addons/document_webdav/i18n/ca.po index f9dbfef689c..7d7d92b786c 100644 --- a/addons/document_webdav/i18n/ca.po +++ b/addons/document_webdav/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: document_webdav diff --git a/addons/email_template/i18n/ca.po b/addons/email_template/i18n/ca.po index 0bc592ef3c6..6b0e49ba10f 100644 --- a/addons/email_template/i18n/ca.po +++ b/addons/email_template/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: email_template diff --git a/addons/hr_payroll_account/i18n/ca.po b/addons/hr_payroll_account/i18n/ca.po index 513d962673e..178543a4bde 100644 --- a/addons/hr_payroll_account/i18n/ca.po +++ b/addons/hr_payroll_account/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: hr_payroll_account diff --git a/addons/hr_timesheet_invoice/i18n/ca.po b/addons/hr_timesheet_invoice/i18n/ca.po index da5c7be1913..a33367afd08 100644 --- a/addons/hr_timesheet_invoice/i18n/ca.po +++ b/addons/hr_timesheet_invoice/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: hr_timesheet_invoice diff --git a/addons/l10n_in/i18n/ca.po b/addons/l10n_in/i18n/ca.po index 567bf939223..dfef5cf2438 100644 --- a/addons/l10n_in/i18n/ca.po +++ b/addons/l10n_in/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: l10n_chart_in diff --git a/addons/l10n_syscohada/i18n/ca.po b/addons/l10n_syscohada/i18n/ca.po index 8b80c907cc1..251c2b9b4ae 100644 --- a/addons/l10n_syscohada/i18n/ca.po +++ b/addons/l10n_syscohada/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:36+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: l10n_syscohada diff --git a/addons/marketing/i18n/ca.po b/addons/marketing/i18n/ca.po index cc523fa4d35..f7afeb06ca4 100644 --- a/addons/marketing/i18n/ca.po +++ b/addons/marketing/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: marketing diff --git a/addons/mrp/i18n/ca.po b/addons/mrp/i18n/ca.po index da40538a345..a841711d6d0 100644 --- a/addons/mrp/i18n/ca.po +++ b/addons/mrp/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:52+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: mrp diff --git a/addons/point_of_sale/i18n/ca.po b/addons/point_of_sale/i18n/ca.po index a48dad4b45a..99dfbcdbd7a 100644 --- a/addons/point_of_sale/i18n/ca.po +++ b/addons/point_of_sale/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:52+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: point_of_sale diff --git a/addons/portal/i18n/ca.po b/addons/portal/i18n/ca.po index d6d5469900a..392ac771b0f 100644 --- a/addons/portal/i18n/ca.po +++ b/addons/portal/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:36+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: portal diff --git a/addons/project/i18n/ca.po b/addons/project/i18n/ca.po index 8cddcd03b1c..e3969112968 100644 --- a/addons/project/i18n/ca.po +++ b/addons/project/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:34+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:52+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: project diff --git a/addons/project_issue/i18n/ca.po b/addons/project_issue/i18n/ca.po index c71bdecf47a..a8a9a4069d8 100644 --- a/addons/project_issue/i18n/ca.po +++ b/addons/project_issue/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: project_issue diff --git a/addons/project_long_term/i18n/ca.po b/addons/project_long_term/i18n/ca.po index fde760c2cd5..6e5b17e27ad 100644 --- a/addons/project_long_term/i18n/ca.po +++ b/addons/project_long_term/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-19 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: project_long_term diff --git a/addons/project_messages/i18n/ca.po b/addons/project_messages/i18n/ca.po index 4a017a2bafe..3e4f91cf3d5 100644 --- a/addons/project_messages/i18n/ca.po +++ b/addons/project_messages/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: project_messages diff --git a/addons/project_scrum/i18n/ca.po b/addons/project_scrum/i18n/ca.po index 6e6a19e504f..4ed0a518f05 100644 --- a/addons/project_scrum/i18n/ca.po +++ b/addons/project_scrum/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-19 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:52+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: project_scrum diff --git a/addons/project_scrum/i18n/zh_CN.po b/addons/project_scrum/i18n/zh_CN.po index 2e69a1eaf66..4480e459b37 100644 --- a/addons/project_scrum/i18n/zh_CN.po +++ b/addons/project_scrum/i18n/zh_CN.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-17 04:41+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:52+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: project_scrum diff --git a/addons/purchase/i18n/ca.po b/addons/purchase/i18n/ca.po index bdafd718842..373dc8765bc 100644 --- a/addons/purchase/i18n/ca.po +++ b/addons/purchase/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:52+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: purchase diff --git a/addons/purchase_requisition/i18n/ca.po b/addons/purchase_requisition/i18n/ca.po index fb7aa059d8a..d6770a1c94f 100644 --- a/addons/purchase_requisition/i18n/ca.po +++ b/addons/purchase_requisition/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:36+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: purchase_requisition diff --git a/addons/report_webkit/i18n/ca.po b/addons/report_webkit/i18n/ca.po index 1411bc43ab4..7550a145bb8 100644 --- a/addons/report_webkit/i18n/ca.po +++ b/addons/report_webkit/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-18 04:36+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: report_webkit diff --git a/addons/resource/i18n/es_EC.po b/addons/resource/i18n/es_EC.po index 24b02ed4a7e..b3e99a2ff2e 100644 --- a/addons/resource/i18n/es_EC.po +++ b/addons/resource/i18n/es_EC.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-17 04:41+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: resource diff --git a/addons/sale_crm/i18n/ca.po b/addons/sale_crm/i18n/ca.po index 344f4d09586..b1ab980b59d 100644 --- a/addons/sale_crm/i18n/ca.po +++ b/addons/sale_crm/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-19 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:52+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: sale_crm diff --git a/addons/share/i18n/ca.po b/addons/share/i18n/ca.po index 2e143294a00..ad46750e101 100644 --- a/addons/share/i18n/ca.po +++ b/addons/share/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-19 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: share diff --git a/addons/stock/i18n/ca.po b/addons/stock/i18n/ca.po index 0f17dc6c433..758e398bfc7 100644 --- a/addons/stock/i18n/ca.po +++ b/addons/stock/i18n/ca.po @@ -13,7 +13,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-19 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:52+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: stock diff --git a/addons/stock_planning/i18n/ca.po b/addons/stock_planning/i18n/ca.po index 73d1940e2d7..b446cfb9606 100644 --- a/addons/stock_planning/i18n/ca.po +++ b/addons/stock_planning/i18n/ca.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-08-19 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-08-20 04:53+0000\n" "X-Generator: Launchpad (build 13697)\n" #. module: stock_planning From 885fa0ded0b7417be2fe2aad28a51f2a53ef92a8 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 22 Aug 2011 11:04:58 +0200 Subject: [PATCH 16/24] [ADD] handling of adding new records to an existing collection, silent option on a bunch of record events bzr revid: xmo@openerp.com-20110822090458-3wdroe4cxyh30k91 --- addons/base/static/src/js/formats.js | 3 ++ addons/base/static/src/js/list-editable.js | 2 ++ addons/base/static/src/js/list.js | 40 ++++++++++++++++++---- 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/addons/base/static/src/js/formats.js b/addons/base/static/src/js/formats.js index 074cabe5eee..abb05ec9dc4 100644 --- a/addons/base/static/src/js/formats.js +++ b/addons/base/static/src/js/formats.js @@ -201,6 +201,9 @@ openerp.base.format_cell = function (row_data, column, value_if_empty) { ].join('') } + if (!row_data[column.id]) { + return value_if_empty === undefined ? '' : value_if_empty; + } return openerp.base.format_value( row_data[column.id].value, column, value_if_empty); } diff --git a/addons/base/static/src/js/list-editable.js b/addons/base/static/src/js/list-editable.js index c89227a05cb..744f3c9a09b 100644 --- a/addons/base/static/src/js/list-editable.js +++ b/addons/base/static/src/js/list-editable.js @@ -209,6 +209,8 @@ openerp.base.list.editable = function (openerp) { var self = this; this.edition_form.do_save(function (result) { if (result.created && !self.edition_index) { + self.records.add({id: result.result}, + {at: self.options.editable === 'top' ? 0 : null}); self.edition_index = self.dataset.index; } self.cancel_pending_edition().then(function () { diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 642a0743e9a..f35d5318cdc 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -642,6 +642,20 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. 'change': function (event, record) { var $row = self.$current.find('[data-id=' + record.get('id') + ']'); $row.replaceWith(self.render_record($row.data('index'))); + }, + 'add': function (ev, records, record, index) { + var $row = $('').attr({ + 'data-id': record.get('id'), + 'data-index': index + }); + if (index === 0) { + $row.prependTo(self.$current); + } else { + $row.insertAfter(self.$current.children().eq(index)); + } + $row.nextAll().each(function (row) { + $(row).data('index', ++index); + }); } }; _(this.record_callbacks).each(function (callback, event) { @@ -767,8 +781,9 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. }), 'name'), function (record) { _(record[0]).each(function (value, key) { - r.set(key, value); + r.set(key, value, {silent: true}); }); + r.trigger('change', r); } ); }, @@ -1033,7 +1048,7 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas .attr('disabled', page === pages - 1); } - self.records.add(records); + self.records.add(records, {silent: true}); list.render(); d.resolve(list); }); @@ -1211,16 +1226,21 @@ var Record = openerp.base.Class.extend(/** @lends Record# */{ /** * @param key * @param value + * @param {Object} [options] + * @param {Boolean} [options.silent=false] * @returns {Record} */ - set: function (key, value) { + set: function (key, value, options) { + options = options || {}; var old_value = this.attributes[key]; if (old_value === value) { return this; } this.attributes[key] = value; - this.trigger('change:' + key, this, value, old_value); - this.trigger('change', this, key, value, old_value); + if (!options.silent) { + this.trigger('change:' + key, this, value, old_value); + this.trigger('change', this, key, value, old_value); + } return this; }, /** @@ -1279,6 +1299,7 @@ var Collection = openerp.base.Class.extend(/** @lends Collection# */{ * @param {Object|Array} record * @param {Object} [options] * @param {Number} [options.at] + * @param {Boolean} [options.silent=false] * @returns this */ add: function (record, options) { @@ -1291,8 +1312,15 @@ var Collection = openerp.base.Class.extend(/** @lends Collection# */{ this._byId[instance.get('id')] = instance; if (options.at === undefined) { this.records.push(instance); + if (!options.silent) { + this.trigger('add', this, instance, this.records.length-1); + } } else { - this.records.splice(options.at + i, 0, instance); + var insertion_index = options.at + i; + this.records.splice(insertion_index, 0, instance); + if (!options.silent) { + this.trigger('add', this, instance, insertion_index); + } } this.length++; } From f4a745e3f779f9a1e18c8a17f10fc03d2b29722e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 22 Aug 2011 12:13:08 +0200 Subject: [PATCH 17/24] [FIX] forgot to increment index in resequencer bzr revid: xmo@openerp.com-20110822101308-2td5peezvg6snmk7 --- addons/base/static/src/js/list.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index f35d5318cdc..d0ee0275c6b 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -1075,7 +1075,7 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas ui.item.parent().children().each(function (i, e) { // reset record-index accelerators on rows and even/odd var even = i%2 === 0; - $(e).data('index', i) + $(e).attr('data-index', i) .toggleClass('even', even) .toggleClass('odd', !even); }); @@ -1085,7 +1085,7 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas // if drag to 1st row (to = 0), start sequencing from 0 // (exclusive lower bound) seq = to ? list.records.at(to - 1).get('sequence') : 0; - while (++seq, record = list.records.at(index)) { + while (++seq, record = list.records.at(index++)) { // write are independent from one another, so we can just // launch them all at the same time and we don't really // give a fig about when they're done From 63d2dcce401521e5cb9a696026f1530579e287bc Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 22 Aug 2011 12:50:28 +0200 Subject: [PATCH 18/24] [IMP] unify refreshing rows striping (and @data-index resetting) bzr revid: xmo@openerp.com-20110822105028-vvzty9jx6nlupq0f --- addons/base/static/src/js/list.js | 51 +++++++++++++++++-------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index d0ee0275c6b..689c65b492f 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -631,12 +631,11 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. this.record_callbacks = { 'remove': function (event, record) { - var $row = self.$current.find('[data-id=' + record.get('id') + ']'); + var $row = self.$current.find( + '[data-id=' + record.get('id') + ']'); var index = $row.data('index'); - $row.nextAll().each(function (row) { - $(row).data('index', index++); - }); $row.remove(); + self.refresh_zebra(index); }, 'reset': $.proxy(this, 'on_records_reset'), 'change': function (event, record) { @@ -644,18 +643,10 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. $row.replaceWith(self.render_record($row.data('index'))); }, 'add': function (ev, records, record, index) { - var $row = $('').attr({ - 'data-id': record.get('id'), - 'data-index': index - }); - if (index === 0) { - $row.prependTo(self.$current); - } else { - $row.insertAfter(self.$current.children().eq(index)); - } - $row.nextAll().each(function (row) { - $(row).data('index', ++index); - }); + $('').attr({ + 'data-id': record.get('id') + }).insertAfter(self.$current.children(':eq(' + index + ')')); + self.refresh_zebra(index, 1); } }; _(this.record_callbacks).each(function (callback, event) { @@ -802,6 +793,26 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base. row_index: record_index, render_cell: openerp.base.format_cell }); + }, + /** + * Fixes @data-index on all table rows, and fixes the even/odd classes + * + * @param {Number} [from_index] index from which to resequence + * @param {Number} [offset = 0] selection offset for DOM, in case there are rows to ignore in the table + */ + refresh_zebra: function (from_index, offset) { + offset = offset || 0; + from_index = from_index || 0; + var dom_offset = offset + from_index; + var sel = dom_offset ? ':gt(' + (dom_offset - 1) + ')' : null; + this.$current.children(sel).each(function (i, e) { + var index = from_index + i; + // reset record-index accelerators on rows and even/odd + var even = index%2 === 0; + $(e).attr('data-index', index) + .toggleClass('even', even) + .toggleClass('odd', !even); + }); } }); openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.base.ListView.Groups# */{ @@ -1072,13 +1083,7 @@ openerp.base.ListView.Groups = openerp.base.Class.extend( /** @lends openerp.bas list.records.remove(to_move); list.records.add(to_move, {at: to}); - ui.item.parent().children().each(function (i, e) { - // reset record-index accelerators on rows and even/odd - var even = i%2 === 0; - $(e).attr('data-index', i) - .toggleClass('even', even) - .toggleClass('odd', !even); - }); + list.refresh_zebra(); // resequencing time! var record, index = to, From 6ccc41fe2bba7c485955e9ea9a3a470cfc6edff4 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 22 Aug 2011 12:56:56 +0200 Subject: [PATCH 19/24] [FIX] insertion at end: 'null' index should be same as 'undefined' for 'at' kwarg to Collection.add bzr revid: xmo@openerp.com-20110822105656-f0x1iweoxbh8hcgu --- addons/base/static/src/js/list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 689c65b492f..c6e50de85ec 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -1315,7 +1315,7 @@ var Collection = openerp.base.Class.extend(/** @lends Collection# */{ var instance = (records[i] instanceof Record) ? records[i] : new Record(records[i]); instance.bind(null, this._onRecordEvent); this._byId[instance.get('id')] = instance; - if (options.at === undefined) { + if (options.at == undefined) { this.records.push(instance); if (!options.silent) { this.trigger('add', this, instance, this.records.length-1); From c76bb492f20f00de2a05b10f7b1c30b1dca57c49 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 22 Aug 2011 13:10:01 +0200 Subject: [PATCH 20/24] [FIX] row edition bzr revid: xmo@openerp.com-20110822111001-mnyyvfund3b3j9bm --- addons/base/static/src/js/list-editable.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/base/static/src/js/list-editable.js b/addons/base/static/src/js/list-editable.js index 744f3c9a09b..a8a4e9d78c6 100644 --- a/addons/base/static/src/js/list-editable.js +++ b/addons/base/static/src/js/list-editable.js @@ -142,6 +142,8 @@ openerp.base.list.editable = function (openerp) { this.cancel_pending_edition().then(function () { var $new_row = $('', { id: _.uniqueId('oe-editable-row-'), + 'data-id': $(row).data('id'), + 'data-index': $(row).data('index'), 'class': $(row).attr('class') + ' oe_forms', click: function (e) {e.stopPropagation();} }) @@ -238,9 +240,7 @@ openerp.base.list.editable = function (openerp) { */ edit_record: function () { this.render_row_as_form( - this.$current.children( - _.sprintf('[data-index=%d]', - this.dataset.index))); + this.$current.children(':eq(' + this.dataset.index + ')')); $(this).trigger( 'edit', [this.records.at(this.dataset.index).get('id'), this.dataset]); From 26b7801355cf0879edb32ac143c82af1e26fb08e Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 22 Aug 2011 15:12:48 +0200 Subject: [PATCH 21/24] [IMP] keep query parameters around (at least debug) when clicking on logo or redirecting from HTTP root to 'correct' root URL bzr revid: xmo@openerp.com-20110822131248-tl9j6flsw38r7p9e --- addons/base/static/src/js/chrome.js | 5 +++++ addons/base/static/src/xml/base.xml | 2 +- openerpweb/openerpweb.py | 7 ++++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 665efa0e3e3..3a8af0a754c 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -566,6 +566,11 @@ openerp.base.Login = openerp.base.Widget.extend({ openerp.base.Header = openerp.base.Widget.extend({ init: function(parent, element_id) { this._super(parent, element_id); + if (jQuery.deparam(jQuery.param.querystring()).debug !== undefined) { + this.qs = '?debug' + } else { + this.qs = '' + } }, start: function() { return this.do_update(); diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index c4396793f95..343e7a1a7c1 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -326,7 +326,7 @@ - +