From 37dee90724b3d378f51bac26cff500949ce0480d Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Thu, 8 Dec 2011 13:29:46 +0100 Subject: [PATCH] [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 --- addons/web/static/src/js/view_form.js | 2 +- .../web/static/src/js/view_list_editable.js | 87 +++++++++++-------- 2 files changed, 50 insertions(+), 39 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 4bd74f8f089..145be724d6c 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -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 { diff --git a/addons/web/static/src/js/view_list_editable.js b/addons/web/static/src/js/view_list_editable.js index 37c14d31323..155b183e11f 100644 --- a/addons/web/static/src/js/view_list_editable.js +++ b/addons/web/static/src/js/view_list_editable.js @@ -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();