summaryrefslogtreecommitdiff
path: root/addons/web/static/src
diff options
context:
space:
mode:
authorJulien Mougenot <jum@odoo.com>2019-09-12 09:01:28 +0000
committerJulien Mougenot <jum@odoo.com>2019-09-18 08:24:13 +0000
commita7782cadbec5e3a73b3d2fb7791b2c4b06c8a545 (patch)
tree14e48a7a14917a40a6f5584db4d83e9e1a635085 /addons/web/static/src
parentaf65475a4cd33ca8c6b25ba525d2f59cc28b3f43 (diff)
[FIX] web: lists: focus last edited cell
Gave back focus to the last edited cell to increase usability with key nav. Before this commit, after saving several records with multi edition in a list, focus was lost (given to the body). Now, last edited cell is given back the focus after multi editing.
Diffstat (limited to 'addons/web/static/src')
-rw-r--r--addons/web/static/src/js/views/list/list_controller.js20
-rw-r--r--addons/web/static/src/js/views/list/list_editable_renderer.js11
2 files changed, 26 insertions, 5 deletions
diff --git a/addons/web/static/src/js/views/list/list_controller.js b/addons/web/static/src/js/views/list/list_controller.js
index bd0322c92b0..f99ec19dea7 100644
--- a/addons/web/static/src/js/views/list/list_controller.js
+++ b/addons/web/static/src/js/views/list/list_controller.js
@@ -396,6 +396,7 @@ var ListController = BasicController.extend({
var nbInvalid = recordIds.length - validRecordIds.length;
return new Promise(function (resolve, reject) {
+ var dialog;
var rejectAndDiscard = function () {
self.model.discardChanges(recordId);
return self._confirmSave(recordId).then(reject);
@@ -411,24 +412,33 @@ var ListController = BasicController.extend({
_t("Do you want to set the value on the %d valid selected records? (%d invalid)"),
validRecordIds.length, nbInvalid);
}
- Dialog.confirm(self, message, {
+ dialog = Dialog.confirm(self, message, {
confirm_callback: function () {
- self.model.saveRecords(recordId, validRecordIds, fieldName)
+ return self.model.saveRecords(recordId, validRecordIds, fieldName)
.then(function () {
self._updateButtons('readonly');
var state = self.model.get(self.handle);
- self.renderer.updateState(state, {});
- resolve(Object.keys(changes));
+ return self.renderer.updateState(state, {}).then(function () {
+ resolve(Object.keys(changes));
+ });
})
.guardedCatch(rejectAndDiscard);
},
cancel_callback: rejectAndDiscard,
});
} else {
- Dialog.alert(self, _t("No valid record to save"), {
+ dialog = Dialog.alert(self, _t("No valid record to save"), {
confirm_callback: rejectAndDiscard,
});
}
+ dialog.on('closed', self, function () {
+ // we need to wait for the dialog to be actually closed, but
+ // the 'closed' event is triggered just before, and it prevents
+ // from focussing the cell
+ Promise.resolve().then(function () {
+ self.renderer.focusCell(recordId, node);
+ });
+ });
});
},
/**
diff --git a/addons/web/static/src/js/views/list/list_editable_renderer.js b/addons/web/static/src/js/views/list/list_editable_renderer.js
index cd67feb0b34..b23b7a85e0a 100644
--- a/addons/web/static/src/js/views/list/list_editable_renderer.js
+++ b/addons/web/static/src/js/views/list/list_editable_renderer.js
@@ -277,6 +277,17 @@ ListRenderer.include({
this._selectCell(rowIndex, 0);
},
/**
+ * Gives focus to a specific cell, given its row and its related column.
+ *
+ * @param {string} recordId
+ * @param {Object} column
+ */
+ focusCell: function (recordId, column) {
+ var $row = this._getRow(recordId);
+ var cellIndex = this.columns.indexOf(column);
+ $row.find('.o_data_cell')[cellIndex].focus();
+ },
+ /**
* Returns the recordID associated to the line which is currently in edition
* or null if there is no line in edition.
*