[IMP] API for ListView#save_row (better use returned deferred)

* Deferred now provides creation flag and which record was edited on resolution
* Moved logic for editing next record (or creating a new one) to keyboard event handler
* Extracted keyboard even handler to prepare for new edition keys

bzr revid: xmo@openerp.com-20111208122946-221yve4amubqo1be
This commit is contained in:
Xavier Morel
2011-12-08 13:29:46 +01:00
parent 0ce87ab853
commit 37dee90724
2 changed files with 50 additions and 39 deletions
+1 -1
View File
@@ -431,7 +431,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
} else if (_.isEmpty(values)) {
openerp.log("FormView(", self, ") : Nothing to save");
if (success) {
success();
success({});
}
return $.Deferred().resolve({}).promise();
} else {
+49 -38
View File
@@ -166,6 +166,35 @@ openerp.web.list_editable = function (openerp) {
view.arch.attrs.col = 2 * view.arch.children.length;
return view;
},
on_row_keyup: function (e) {
var self = this;
switch (e.which) {
case KEY_RETURN:
this.save_row().then(function (result) {
if (result.created) {
self.new_record();
return;
}
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_ESCAPE:
this.cancel_edition();
break;
}
},
render_row_as_form: function (row) {
var self = this;
this.cancel_pending_edition().then(function () {
@@ -182,18 +211,7 @@ openerp.web.list_editable = function (openerp) {
.delegate('button', 'keyup', function (e) {
e.stopImmediatePropagation();
})
.keyup(function (e) {
switch (e.which) {
case KEY_RETURN:
self.save_row(true);
break;
case KEY_ESCAPE:
self.cancel_edition();
break;
default:
return;
}
});
.keyup($.proxy(self, 'on_row_keyup'));
if (row) {
$new_row.replaceAll(row);
} else if (self.options.editable) {
@@ -269,13 +287,20 @@ openerp.web.list_editable = function (openerp) {
});
},
/**
* Saves the current row, and triggers the edition of its following
* sibling if asked.
* Saves the current row, and returns a Deferred resolving to an object
* with the following properties:
*
* @param {Boolean} [edit_next=false] should the next row become editable
* @returns {$.Deferred}
* ``created``
* Boolean flag indicating whether the record saved was being created
* (``true`` or edited (``false``)
* ``edited_record``
* The result of saving the record (either the newly created record,
* or the post-edition record), after insertion in the Collection if
* needs be.
*
* @returns {$.Deferred<{created: Boolean, edited_record: Record}>}
*/
save_row: function (edit_next) {
save_row: function () {
//noinspection JSPotentiallyInvalidConstructorUsage
var self = this, done = $.Deferred();
this.edition_form.do_save(function (result) {
@@ -284,33 +309,19 @@ openerp.web.list_editable = function (openerp) {
{at: self.options.editable === 'top' ? 0 : null});
self.edition_id = result.result;
}
var edited_record = self.records.get(self.edition_id),
next_record = self.records.at(
self.records.indexOf(edited_record) + 1);
var edited_record = self.records.get(self.edition_id);
$.when(
self.handle_onwrite(self.edition_id),
self.cancel_pending_edition().then(function () {
$(self).trigger('saved', [self.dataset]);
if (!edit_next) {
return;
}
if (result.created) {
self.new_record();
return;
}
var next_record_id;
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);
})).then(function () {
done.resolve();
done.resolve({
created: result.created || false,
edited_record: edited_record
});
}, function () {
done.reject();
});
}, this.options.editable === 'top').fail(function () {
done.reject();