[ADD] editable list navigation via KEY_UP and KEY_DOWN

Both start by saving the row being edited, then (if the save is successful) going to the record above or below them

bzr revid: xmo@openerp.com-20111208141923-1p1rm4mu0hikls6m
This commit is contained in:
Xavier Morel 2011-12-08 15:19:23 +01:00
parent 54f3f38957
commit 9268a1c680
2 changed files with 47 additions and 8 deletions

View File

@ -1582,7 +1582,7 @@ openerp.web.form.FieldSelection = openerp.web.form.Field.extend({
.change(function () { ischanging = true; })
.click(function () { ischanging = false; })
.keyup(function (e) {
if (e.which !== 13 || !ischanging) { return; }
if (!_([13, 38, 40]).contains(e.which) || !ischanging) { return; }
e.stopPropagation();
ischanging = false;
});
@ -1790,13 +1790,16 @@ openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({
minLength: 0,
delay: 0
});
// used to correct a bug when selecting an element by pushing 'enter' in an editable list
// Don't propagate KEY_UP and KEY_DOWN event to parent (for editable
// list), don't propagate KEY_RETURN either when the autocomplete
// control is currently open
this.$input.keyup(function(e) {
if (e.which === 13) {
if (isSelecting)
e.stopPropagation();
if (e.which === 38 || e.which === 40) {
e.stopPropagation();
} else if (isSelecting && e.which === 13) {
e.stopPropagation();
isSelecting = false;
}
isSelecting = false;
});
},
// autocomplete component content handling

View File

@ -3,8 +3,11 @@
* @namespace
*/
openerp.web.list_editable = function (openerp) {
// https://developer.mozilla.org/en/DOM/KeyboardEvent#Virtual_key_codes
var KEY_RETURN = 13,
KEY_ESCAPE = 27;
KEY_ESCAPE = 27,
KEY_UP = 38,
KEY_DOWN = 40;
var QWeb = openerp.web.qweb;
// editability status of list rows
@ -178,7 +181,7 @@ openerp.web.list_editable = function (openerp) {
var next_record_id,
next_record = self.records.at(
self.records.indexOf(result.edited_record) + 1);
self.records.indexOf(result.edited_record) + 1);
if (next_record) {
next_record_id = next_record.get('id');
self.dataset.index = _(self.dataset.ids)
@ -190,6 +193,39 @@ openerp.web.list_editable = function (openerp) {
self.edit_record(next_record_id);
});
break;
case KEY_DOWN:
this.save_row().then(function (result) {
var next_record_id,
next_record = self.records.at(
self.records.indexOf(result.edited_record) + 1);
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);
});
break;
case KEY_UP:
this.save_row().then(function (result) {
var previous_record_id,
previous_record = self.records.at(
self.records.indexOf(result.edited_record) - 1);
if (previous_record) {
previous_record_id = previous_record.get('id');
self.dataset.index = _(self.dataset.ids)
.indexOf(previous_record_id);
} else {
var last = self.records.length - 1;
self.dataset.index = last;
previous_record_id = self.records.at(last).get('id');
}
self.edit_record(previous_record_id);
});
break;
case KEY_ESCAPE:
this.cancel_edition();
break;