[IMP] add ability to change row using up/down key while editing list
* Allow asserting state of record being edited (creating or modifying) through Editor#is_editing * Improve setup_events to also dispatch keydown events bzr revid: xmo@openerp.com-20120718124359-q0udajwbuhzpqjmi
This commit is contained in:
parent
71ede66dce
commit
0f054b57c1
|
@ -368,19 +368,19 @@ openerp.web.list_editable = function (instance) {
|
||||||
},
|
},
|
||||||
setup_events: function () {
|
setup_events: function () {
|
||||||
var self = this;
|
var self = this;
|
||||||
this.editor.$element.on('keyup', function (e) {
|
this.editor.$element.on('keyup keydown', function (e) {
|
||||||
|
if (!self.editor.is_editing()) { return; }
|
||||||
var key = _($.ui.keyCode).chain()
|
var key = _($.ui.keyCode).chain()
|
||||||
.map(function (v, k) { return {name: k, code: v}; })
|
.map(function (v, k) { return {name: k, code: v}; })
|
||||||
.find(function (o) { return o.code === e.which; })
|
.find(function (o) { return o.code === e.which; })
|
||||||
.value();
|
.value();
|
||||||
if (!key) { return; }
|
if (!key) { return; }
|
||||||
var method = 'keyup_' + key.name;
|
var method = e.type + '_' + key.name;
|
||||||
if (!(method in self)) { return; }
|
if (!(method in self)) { return; }
|
||||||
self[method](e);
|
self[method](e);
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
keyup_ENTER: function () {
|
keyup_ENTER: function () {
|
||||||
if (!this.editor.is_editing()) { return; }
|
|
||||||
var self = this;
|
var self = this;
|
||||||
return this.save_edition().pipe(function (saveInfo) {
|
return this.save_edition().pipe(function (saveInfo) {
|
||||||
if (saveInfo.created) {
|
if (saveInfo.created) {
|
||||||
|
@ -391,8 +391,58 @@ openerp.web.list_editable = function (instance) {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
keyup_ESCAPE: function () {
|
keyup_ESCAPE: function () {
|
||||||
if (!this.editor.is_editing()) { return; }
|
|
||||||
return this.cancel_edition();
|
return this.cancel_edition();
|
||||||
|
},
|
||||||
|
_text_selection_range: function (el) {
|
||||||
|
if (el.selectionStart !== undefined) {
|
||||||
|
return {
|
||||||
|
start: el.selectionStart,
|
||||||
|
end: el.selectionEnd
|
||||||
|
};
|
||||||
|
} else if(document.body.createTextRange) {
|
||||||
|
throw new Error("Implement text range handling for MSIE");
|
||||||
|
var sel = document.body.createTextRange();
|
||||||
|
if (sel.parentElement() === el) {
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_text_cursor: function (el) {
|
||||||
|
var selection = this._text_selection_range(el);
|
||||||
|
if (selection.start !== selection.end) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return selection.start;
|
||||||
|
},
|
||||||
|
keydown_UP: function (e) {
|
||||||
|
if (!this.editor.is_editing('edit')) { return; }
|
||||||
|
// 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; }
|
||||||
|
|
||||||
|
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}));
|
||||||
|
});
|
||||||
|
},
|
||||||
|
keydown_DOWN: function (e) {
|
||||||
|
if (!this.editor.is_editing('edit')) { return; }
|
||||||
|
// 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; }
|
||||||
|
|
||||||
|
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}));
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -462,8 +512,23 @@ openerp.web.list_editable = function (instance) {
|
||||||
return edition_view;
|
return edition_view;
|
||||||
},
|
},
|
||||||
|
|
||||||
is_editing: function () {
|
/**
|
||||||
return !!this.record;
|
*
|
||||||
|
* @param {String} [state] either ``new`` or ``edit``
|
||||||
|
* @return {Boolean}
|
||||||
|
*/
|
||||||
|
is_editing: function (state) {
|
||||||
|
if (!this.record) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
switch(state) {
|
||||||
|
case null: case undefined:
|
||||||
|
return true;
|
||||||
|
case 'new': return !this.record.id;
|
||||||
|
case 'edit': return !!this.record.id;
|
||||||
|
}
|
||||||
|
throw new Error("is_editing's state filter must be either `new` or" +
|
||||||
|
" `edit` if provided");
|
||||||
},
|
},
|
||||||
edit: function (record, configureField) {
|
edit: function (record, configureField) {
|
||||||
// TODO: specify sequence of edit calls
|
// TODO: specify sequence of edit calls
|
||||||
|
|
|
@ -287,11 +287,20 @@ formview, delegating instead to its
|
||||||
:type parent: :js:class:`~openerp.web.Widget`
|
:type parent: :js:class:`~openerp.web.Widget`
|
||||||
:param EditorOptions options:
|
:param EditorOptions options:
|
||||||
|
|
||||||
.. js:function:: openerp.web.list.Editor.is_editing
|
.. js:function:: openerp.web.list.Editor.is_editing([record_state])
|
||||||
|
|
||||||
Indicates whether the editor is currently in the process of
|
Indicates whether the editor is currently in the process of
|
||||||
providing edition for a field.
|
providing edition for a record.
|
||||||
|
|
||||||
|
Can be filtered by the state of the record being edited
|
||||||
|
(whether it's a record being *created* or a record being
|
||||||
|
*altered*), in which case it asserts both that an edition is
|
||||||
|
underway and that the record being edited respectively does
|
||||||
|
not yet exist in the database or already exists there.
|
||||||
|
|
||||||
|
:param record_state: state of the record being edited.
|
||||||
|
Either ``"new"`` or ``"edit"``.
|
||||||
|
:type record_state: String
|
||||||
:rtype: Boolean
|
:rtype: Boolean
|
||||||
|
|
||||||
.. js:function:: openerp.web.list.Editor.edit(record, configureField)
|
.. js:function:: openerp.web.list.Editor.edit(record, configureField)
|
||||||
|
|
Loading…
Reference in New Issue