From 65ac59f42a9501b2ba3129e3229e6b46bd1f5596 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Wed, 18 Jul 2012 15:07:51 +0200 Subject: [PATCH] [ADD] when tabbing from the last field in an edition row, go to next edition as if we'd hit [return] extract common code for 'save current edition and move on to next edition' to a private method bzr revid: xmo@openerp.com-20120718130751-g8htb78n54z1b9hv --- .../web/static/src/js/view_list_editable.js | 53 ++++++++++++------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index d8a1e26dfa6..58925a11ba1 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -380,16 +380,29 @@ openerp.web.list_editable = function (instance) { self[method](e); }); }, - keyup_ENTER: function () { + /** + * Saves the current record, and goes to the next one (creation or + * edition) + * + * @private + * @param {String} [next_record='succ'] method to call on the records collection to get the next record to edit + * @return {*} + */ + _next: function (next_record) { + next_record = next_record || 'succ'; var self = this; return this.save_edition().pipe(function (saveInfo) { if (saveInfo.created) { return self.start_edition(); } return self.start_edition( - self.records.succ(saveInfo.record, {wraparound: true})); + self.records[next_record]( + saveInfo.record, {wraparound: true})); }); }, + keyup_ENTER: function () { + return this._next(); + }, keyup_ESCAPE: function () { return this.cancel_edition(); }, @@ -415,34 +428,38 @@ openerp.web.list_editable = function (instance) { return selection.start; }, keydown_UP: function (e) { - if (!this.editor.is_editing('edit')) { return; } + if (!this.editor.is_editing('edit')) { return $.when(); } // FIXME: assumes editable widgets are input-type elements var index = this._text_cursor(e.target); // If selecting or not at the start of the input - if (index === null || index !== 0) { return; } + if (index === null || index !== 0) { return $.when(); } - var self = this; e.preventDefault(); - return this.save_edition().pipe(function (saveInfo) { - // Should not happen when creating, ignore saveInfo.created - return self.start_edition( - self.records.pred(saveInfo.record, {wraparound: true})); - }); + return this._next('pred'); }, keydown_DOWN: function (e) { - if (!this.editor.is_editing('edit')) { return; } + if (!this.editor.is_editing('edit')) { return $.when(); } // FIXME: assumes editable widgets are input-type elements var index = this._text_cursor(e.target); // If selecting or not at the end of the input - if (index === null || index !== e.target.value.length) { return; } + if (index === null || index !== e.target.value.length) { return $.when(); } - var self = this; e.preventDefault(); - return this.save_edition().pipe(function (saveInfo) { - // Should not happen when creating, ignore saveInfo.created - return self.start_edition( - self.records.succ(saveInfo.record, {wraparound: true})); - }); + return this._next(); + }, + keydown_TAB: function (e) { + var form = this.editor.form; + var last_field = _(form.fields_order).chain() + .map(function (name) { return form.fields[name]; }) + .filter(function (field) { return field.$element.is(':visible'); }) + .last() + .value(); + // tabbed from last field in form + if (last_field && last_field.$element.has(e.target).length) { + e.preventDefault(); + return this._next(); + } + return $.when(); } });