summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js/fields
diff options
context:
space:
mode:
authorChristophe Matthieu <chm@odoo.com>2017-08-24 15:27:44 +0200
committerChristophe Matthieu <chm@odoo.com>2017-08-30 14:39:17 +0200
commit2728fe1ec1ac7e99819d0f30f29a1814b00c82a4 (patch)
tree89b1325b1ba3e86bc6ac830462c4694bc99553d2 /addons/web/static/src/js/fields
parent6cf98c4c87d644928897a76b9985947ab2ebc607 (diff)
[IMP] web: onchange x2many with virtual id in create command
When an onchange modifies an x2many field, the line on which the user works remains in editable mode and the cursor is returned to the same position. The second argument of create command is a reference used to reactivate the edited line.
Diffstat (limited to 'addons/web/static/src/js/fields')
-rw-r--r--addons/web/static/src/js/fields/relational_fields.js26
1 files changed, 25 insertions, 1 deletions
diff --git a/addons/web/static/src/js/fields/relational_fields.js b/addons/web/static/src/js/fields/relational_fields.js
index 301717d985d..ba9b947d6a3 100644
--- a/addons/web/static/src/js/fields/relational_fields.js
+++ b/addons/web/static/src/js/fields/relational_fields.js
@@ -20,6 +20,7 @@ var ControlPanel = require('web.ControlPanel');
var dialogs = require('web.view_dialogs');
var core = require('web.core');
var data = require('web.data');
+var dom = require('web.dom');
var Dialog = require('web.Dialog');
var KanbanRenderer = require('web.KanbanRenderer');
var ListRenderer = require('web.ListRenderer');
@@ -684,6 +685,7 @@ var FieldX2Many = AbstractField.extend({
if (command.operation === 'UPDATE' && command.data) {
var state = record.data[this.name];
var fieldNames = state.getFieldNames();
+ this._reset(record, ev);
this.renderer.confirmChange(state, command.id, fieldNames, ev.initialEvent);
return $.when();
}
@@ -895,11 +897,33 @@ var FieldX2Many = AbstractField.extend({
this.lastInitialEvent = undefined;
if (Object.keys(changes).length) {
this.lastInitialEvent = ev;
- this._setValue({
+ // store the cursor position to restore it once potential onchanges have been applied
+ var self = this;
+ var editableID = this.renderer.getEditableRecordID();
+ var datapoint = _.find(this.value.data, {id: editableID});
+
+ var ref = datapoint && datapoint.ref;
+ var cursor = ref && dom.getCursor(ev.target.getFocusableElement());
+ var fieldName = ev.target.name;
+
+ var def = this._setValue({
operation: 'UPDATE',
id: ev.data.dataPointID,
data: changes,
});
+
+ if (ref) {
+ def.then(function () {
+ var nextEditableRecordID = self.renderer.getEditableRecordID();
+ if (nextEditableRecordID && editableID !== nextEditableRecordID) {
+ return;
+ }
+ var datapoint = _.find(self.value.data, {ref: ref});
+ if (datapoint) {
+ self.renderer.focusField(datapoint.id, fieldName, cursor && cursor.offset);
+ }
+ });
+ }
}
},
/**