From e4532cfe51238c7763702aee4d8e615aba212462 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?G=C3=A9ry=20Debongnie?= Date: Sun, 30 Apr 2017 18:09:03 +0200 Subject: [FIX] web: various fixes in list view navigation With this commit, we try to improve the way navigation is done in the list view. In particular, we want to make sure that pressing TAB on the last editable cell move the cursor to the next line (and create a new line if necessary). Also, we add a few tests for keyboard navigation (it was almost not tested before this commit, and while working on this commit, it was broken at some point). --- .../static/src/js/views/basic/basic_renderer.js | 39 ++++++++++++++-------- 1 file changed, 26 insertions(+), 13 deletions(-) (limited to 'addons/web/static/src/js/views/basic/basic_renderer.js') diff --git a/addons/web/static/src/js/views/basic/basic_renderer.js b/addons/web/static/src/js/views/basic/basic_renderer.js index ed9726478a0..e150b0b2dd0 100644 --- a/addons/web/static/src/js/views/basic/basic_renderer.js +++ b/addons/web/static/src/js/views/basic/basic_renderer.js @@ -147,32 +147,45 @@ var BasicRenderer = AbstractRenderer.extend({ }, /** * Activates the widget at the given index for the given record if possible - * or the "next" possible one. + * or the "next" possible one. Usually, a widget can be activated if it is + * in edit mode, and if it is visible. * * @private * @param {Object} record * @param {integer} currentIndex - * @param {integer} [inc=1] - the increment to use when searching for the - * "next" possible one + * @param {Object} [options] + * @param {integer} [options.inc=1] - the increment to use when searching for the + * "next" possible one + * @param {boolean} [options.wrap=true] if true, when we arrive at the end of the + * list of widget, we wrap around and try to activate widgets starting at + * the beginning. Otherwise, we just stop trying and return -1 * @returns {integer} the index of the widget that was activated or -1 if - * none was possible to activate + * none was possible to activate */ - _activateFieldWidget: function (record, currentIndex, inc) { - inc = inc === undefined ? 1 : inc; + _activateFieldWidget: function (record, currentIndex, options) { + options = options || {}; + _.defaults(options, {inc: 1, wrap: true}); - var activated; var recordWidgets = this.allFieldWidgets[record.id] || []; for (var i = 0 ; i < recordWidgets.length ; i++) { - activated = recordWidgets[currentIndex].activate(); + var activated = recordWidgets[currentIndex].activate(); if (activated) { return currentIndex; } - currentIndex += inc; + currentIndex += options.inc; if (currentIndex >= recordWidgets.length) { - currentIndex -= recordWidgets.length; + if (options.wrap) { + currentIndex -= recordWidgets.length; + } else { + return -1; + } } else if (currentIndex < 0) { - currentIndex += recordWidgets.length; + if (options.wrap) { + currentIndex += recordWidgets.length; + } else { + return -1; + } } } return -1; @@ -188,7 +201,7 @@ var BasicRenderer = AbstractRenderer.extend({ */ _activateNextFieldWidget: function (record, currentIndex) { currentIndex = (currentIndex + 1) % (this.allFieldWidgets[record.id] || []).length; - return this._activateFieldWidget(record, currentIndex, +1); + return this._activateFieldWidget(record, currentIndex, {inc: 1}); }, /** * This is a wrapper of the {@see _activateFieldWidget} function to select @@ -201,7 +214,7 @@ var BasicRenderer = AbstractRenderer.extend({ */ _activatePreviousFieldWidget: function (record, currentIndex) { currentIndex = currentIndex ? (currentIndex - 1) : ((this.allFieldWidgets[record.id] || []).length - 1); - return this._activateFieldWidget(record, currentIndex, -1); + return this._activateFieldWidget(record, currentIndex, {inc:-1}); }, /** * Does the necessary DOM updates to match the given modifiers data. The -- cgit v1.2.3