[ADD] method forcing the saving of a listview if it's being edited (and not doing anything if it's not)

bzr revid: xmo@openerp.com-20111027082436-46zcjurzxtg5n9zt
This commit is contained in:
Xavier Morel 2011-10-27 10:24:36 +02:00
parent 01dce90eb4
commit 6acbb08aa7
1 changed files with 61 additions and 22 deletions

View File

@ -78,6 +78,17 @@ openerp.web.list_editable = function (openerp) {
// tree/@editable takes priority on everything else if present. // tree/@editable takes priority on everything else if present.
this.options.editable = data.arch.attrs.editable || this.options.editable; this.options.editable = data.arch.attrs.editable || this.options.editable;
return this._super(data, grouped); return this._super(data, grouped);
},
/**
* Ensures the editable list is saved (saves any pending edition if
* needed, or tries to)
*
* Returns a deferred to the end of the saving.
*
* @returns {$.Deferred}
*/
ensure_saved: function () {
return this.groups.ensure_saved();
} }
}); });
@ -86,6 +97,18 @@ openerp.web.list_editable = function (openerp) {
new_record: function () { new_record: function () {
// TODO: handle multiple children // TODO: handle multiple children
this.children[null].new_record(); this.children[null].new_record();
},
/**
* Ensures descendant editable List instances are all saved if they have
* pending editions.
*
* @returns {$.Deferred}
*/
ensure_saved: function () {
return $.when.apply(null,
_.invoke(
_.values(this.children),
'ensure_saved'));
} }
}); });
@ -254,9 +277,11 @@ openerp.web.list_editable = function (openerp) {
* sibling if asked. * sibling if asked.
* *
* @param {Boolean} [edit_next=false] should the next row become editable * @param {Boolean} [edit_next=false] should the next row become editable
* @returns {$.Deferred}
*/ */
save_row: function (edit_next) { save_row: function (edit_next) {
var self = this; //noinspection JSPotentiallyInvalidConstructorUsage
var self = this, done = $.Deferred();
this.edition_form.do_save(function (result) { this.edition_form.do_save(function (result) {
if (result.created && !self.edition_id) { if (result.created && !self.edition_id) {
self.records.add({id: result.result}, self.records.add({id: result.result},
@ -267,28 +292,42 @@ openerp.web.list_editable = function (openerp) {
next_record = self.records.at( next_record = self.records.at(
self.records.indexOf(edited_record) + 1); self.records.indexOf(edited_record) + 1);
self.handle_onwrite(self.edition_id); $.when(
self.cancel_pending_edition().then(function () { self.handle_onwrite(self.edition_id),
$(self).trigger('saved', [self.dataset]); self.cancel_pending_edition().then(function () {
if (!edit_next) { $(self).trigger('saved', [self.dataset]);
return; if (!edit_next) {
} return;
if (result.created) { }
self.new_record(); if (result.created) {
return; self.new_record();
} return;
var next_record_id; }
if (next_record) { var next_record_id;
next_record_id = next_record.get('id'); if (next_record) {
self.dataset.index = _(self.dataset.ids) next_record_id = next_record.get('id');
.indexOf(next_record_id); self.dataset.index = _(self.dataset.ids)
} else { .indexOf(next_record_id);
self.dataset.index = 0; } else {
next_record_id = self.records.at(0).get('id'); self.dataset.index = 0;
} next_record_id = self.records.at(0).get('id');
self.edit_record(next_record_id); }
}); self.edit_record(next_record_id);
})).then(function () {
done.resolve();
});
}, this.options.editable === 'top'); }, this.options.editable === 'top');
return done.promise();
},
/**
* If the current list is being edited, ensures it's saved
*/
ensure_saved: function () {
if (this.edition) {
return this.save_row();
}
//noinspection JSPotentiallyInvalidConstructorUsage
return $.Deferred().resolve().promise();
}, },
/** /**
* Cancels the edition of the row for the current dataset index * Cancels the edition of the row for the current dataset index