changeset dca540d43496 in sao:default
details: https://hg.tryton.org/sao?cmd=changeset;node=dca540d43496
description:
Manage RETURN key as UP/DOWN on editable tree
The RETURN key should validate and save the current record before
creating a
new one.
And UP/DOWN keys should create new record when they are at the end.
issue8485
review251761002
diffstat:
src/view/tree.js | 83 ++++++++++++++++++++++++++-----------------------------
1 files changed, 40 insertions(+), 43 deletions(-)
diffs (118 lines):
diff -r 8345380bb435 -r dca540d43496 src/view/tree.js
--- a/src/view/tree.js Wed Jul 17 22:40:48 2019 +0200
+++ b/src/view/tree.js Wed Jul 17 22:46:01 2019 +0200
@@ -1435,11 +1435,18 @@
widget.focus();
}
} else if (event_.which == Sao.common.UP_KEYCODE ||
- event_.which == Sao.common.DOWN_KEYCODE) {
+ event_.which == Sao.common.DOWN_KEYCODE ||
+ event_.which == Sao.common.RETURN_KEYCODE) {
if (event_.which == Sao.common.UP_KEYCODE) {
next_row = this.el.prev('tr');
+ } else if (event_.which == Sao.common.DOWN_KEYCODE) {
+ next_row = this.el.next('tr');
} else {
- next_row = this.el.next('tr');
+ if (this.tree.attributes.editable == 'bottom') {
+ next_row = this.el.next('tr');
+ } else {
+ next_row = this.el.prev('tr');
+ }
}
next_column = this.edited_column;
this.record.validate(this.tree.get_fields())
@@ -1456,62 +1463,52 @@
}
}
} else {
- var prm;
+ var prm = jQuery.when();
if (!this.tree.screen.group.parent) {
prm = this.record.save();
} else if
(this.tree.screen.attributes.pre_validate) {
prm = this.record.pre_validate();
}
- if (prm) {
- return prm.fail(function() {
- widget.focus();
- });
+ prm.fail(function() {
+ widget.focus();
+ });
+ if (!next_row.length &&
+ ((event_.which ==
Sao.common.RETURN_KEYCODE) ||
+ ((event_.which ==
Sao.common.UP_KEYCODE) &&
+ (this.tree.attributes.editable ==
'top')) ||
+ ((event_.which ==
Sao.common.DOWN_KEYCODE) &&
+ (this.tree.attributes.editable ==
'bottom')))) {
+ var model = this.tree.screen.group;
+ var access = Sao.common.MODELACCESS.get(
+ this.tree.screen.model_name);
+ var limit = ((this.tree.screen.size_limit
!== null) &&
+ (model.length >=
this.tree.screen.size_limit));
+ if (access.create && !limit) {
+ prm = prm.then(function() {
+ return this.tree.screen.new_();
+ }.bind(this))
+ .then(function() {
+ var rows =
this.tree.tbody.children('tr');
+ if
(this.tree.attributes.editable == 'bottom') {
+ next_row = rows.last();
+ } else {
+ next_row = rows.first();
+ }
+ }.bind(this));
+ }
}
+ return prm;
}
}.bind(this)).then(function() {
window.setTimeout(function() {
this._get_column_td(next_column, next_row)
- .trigger('click');
+ .click()
+ .find(':input,[tabindex=0]').focus();
}.bind(this), 0);
}.bind(this));
} else if (event_.which == Sao.common.ESC_KEYCODE) {
this.tree.edit_row(null);
this.get_static_el().show().find('[tabindex=0]').focus();
- } else if (event_.which == Sao.common.RETURN_KEYCODE) {
- var focus_cell = function(row) {
- this._get_column_td(this.edited_column, row)
- .trigger('click');
- }.bind(this);
- if (this.tree.attributes.editable == 'bottom') {
- next_row = this.el.next('tr');
- } else {
- next_row = this.el.prev('tr');
- }
- if (next_row.length) {
- focus_cell(next_row);
- } else {
- var model = this.tree.screen.group;
- var access = Sao.common.MODELACCESS.get(
- this.tree.screen.model_name);
- var limit = ((this.tree.screen.size_limit !== null) &&
- (model.length >= this.tree.screen.size_limit));
- var prm;
- if (!access.create || limit) {
- prm = jQuery.when();
- } else {
- prm = this.tree.screen.new_();
- }
- prm.done(function() {
- var new_row;
- var rows = this.tree.tbody.children('tr');
- if (this.tree.attributes.editable == 'bottom') {
- new_row = rows.last();
- } else {
- new_row = rows.first();
- }
- focus_cell(new_row);
- }.bind(this));
- }
}
event_.preventDefault();
} else {