diff --git a/addons/base/static/src/js/list-editable.js b/addons/base/static/src/js/list-editable.js
index 8d94bb0f601..1cd43fd6ea8 100644
--- a/addons/base/static/src/js/list-editable.js
+++ b/addons/base/static/src/js/list-editable.js
@@ -92,7 +92,7 @@ openerp.base.list_editable = function (openerp) {
if (!this.options.editable) {
return this._super(event);
}
- this.edit_record();
+ this.edit_record($(event.currentTarget).data('id'));
},
/**
* Checks if a record is being edited, and if so cancels it
@@ -104,8 +104,8 @@ openerp.base.list_editable = function (openerp) {
return cancelled.promise();
}
- if (this.edition_index !== null) {
- this.reload_record_at_index(this.edition_index).then(function () {
+ if (this.edition_id != null) {
+ this.reload_record(self.records.get(this.edition_id)).then(function () {
cancelled.resolve();
});
} else {
@@ -115,13 +115,14 @@ openerp.base.list_editable = function (openerp) {
self.edition_form.stop();
self.edition_form.$element.remove();
delete self.edition_form;
- delete self.edition_index;
+ delete self.edition_id;
delete self.edition;
});
return cancelled.promise();
},
/**
- * Adapts this list's view description to be suitable to the inner form view of a row being edited.
+ * Adapts this list's view description to be suitable to the inner form
+ * view of a row being edited.
*
* @returns {Object} fields_view_get's view section suitable for putting into form view of editable rows.
*/
@@ -140,9 +141,10 @@ openerp.base.list_editable = function (openerp) {
render_row_as_form: function (row) {
var self = this;
this.cancel_pending_edition().then(function () {
+ var record_id = $(row).data('id');
var $new_row = $('
', {
id: _.uniqueId('oe-editable-row-'),
- 'data-id': $(row).data('id'),
+ 'data-id': record_id,
'class': $(row).attr('class') + ' oe_forms',
click: function (e) {e.stopPropagation();}
})
@@ -175,7 +177,7 @@ openerp.base.list_editable = function (openerp) {
self.$current.append($new_row);
}
self.edition = true;
- self.edition_index = self.dataset.index;
+ self.edition_id = record_id;
self.edition_form = _.extend(new openerp.base.FormView(
self, $new_row.attr('id'), self.dataset, false), {
template: 'ListView.row.form',
@@ -208,8 +210,9 @@ openerp.base.list_editable = function (openerp) {
_(ids).each(function (id) {
var record = self.records.get(id);
if (!record) {
+ // insert after the source record
var index = self.records.indexOf(
- self.records.get(source_record_id));
+ self.records.get(source_record_id)) + 1;
record = new openerp.base.list.Record({id: id});
self.records.add(record, {at: index});
self.dataset.ids.splice(index, 0, id);
@@ -227,12 +230,16 @@ openerp.base.list_editable = function (openerp) {
save_row: function (edit_next) {
var self = this;
this.edition_form.do_save(function (result) {
- if (result.created && !self.edition_index) {
+ if (result.created && !self.edition_id) {
self.records.add({id: result.result},
{at: self.options.editable === 'top' ? 0 : null});
- self.edition_index = self.dataset.index;
+ self.edition_id = result.result;
}
- self.handle_onwrite(self.dataset.ids[self.dataset.index]);
+ var edited_record = self.records.get(self.edition_id),
+ next_record = self.records.at(
+ self.records.indexOf(edited_record) + 1);
+
+ self.handle_onwrite(self.edition_id);
self.cancel_pending_edition().then(function () {
$(self).trigger('saved', [self.dataset]);
if (!edit_next) {
@@ -242,8 +249,16 @@ openerp.base.list_editable = function (openerp) {
self.new_record();
return;
}
- self.dataset.next();
- self.edit_record();
+ var next_record_id;
+ if (next_record) {
+ next_record_id = next_record.get('id');
+ self.dataset.index = _(self.dataset.ids)
+ .indexOf(next_record_id);
+ } else {
+ self.dataset.index = 0;
+ next_record_id = self.records.at(0).get('id');
+ }
+ self.edit_record(next_record_id);
});
}, this.options.editable === 'top');
},
@@ -256,12 +271,12 @@ openerp.base.list_editable = function (openerp) {
/**
* Edits record currently selected via dataset
*/
- edit_record: function () {
+ edit_record: function (record_id) {
this.render_row_as_form(
- this.$current.children(':eq(' + this.dataset.index + ')'));
+ this.$current.find('[data-id=' + record_id + ']'));
$(this).trigger(
'edit',
- [this.records.at(this.dataset.index).get('id'), this.dataset]);
+ [record_id, this.dataset]);
},
new_record: function () {
this.dataset.index = null;
diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js
index b84c286fd57..0e5544961b4 100644
--- a/addons/base/static/src/js/list.js
+++ b/addons/base/static/src/js/list.js
@@ -644,9 +644,19 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base.
$row.replaceWith(self.render_record(record));
},
'add': function (ev, records, record, index) {
- $('
').attr({
+ var $new_row = $('
').attr({
'data-id': record.get('id')
- }).insertAfter(self.$current.children(':eq(' + index + ')'));
+ });
+
+ if (index === 0) {
+ $new_row.prependTo(self.$current);
+ } else {
+ var previous_record = records.at(index-1),
+ $previous_sibling = self.$current.find(
+ '[data-id=' + previous_record.get('id') + ']');
+ $new_row.insertAfter($previous_sibling);
+ }
+
self.refresh_zebra(index, 1);
}
};
@@ -746,17 +756,6 @@ openerp.base.ListView.List = openerp.base.Class.extend( /** @lends openerp.base.
return {count: 1, values: record.attributes};
});
},
- /**
- * Reloads the record at index ``row_index`` in the list's rows.
- *
- * @param {Number} record_index index of the record to reload
- * @returns {$.Deferred} promise to the finalization of the reloading
- */
- reload_record_at_index: function (record_index) {
- var r = this.records.at(record_index);
-
- return this.reload_record(r);
- },
/**
* Reloads the provided record by re-reading its content from the server.
*