[FIX] action button on row being *created* in editable list view

Altered action button workflow:

* Action callback (passed to ``do_button_action``) now *takes* a
  record id instead of closing over it, in case the original list does
  not have an id to start with
* ``handle_button`` partially applies the id *it* got to the callback
  via ``_.bind``
* Editable list view override of ``do_button_action`` uses ``id`` it
  got from ``ensure_saved`` in case it got id=false in

bzr revid: xmo@openerp.com-20120807092317-wk0xyfzrhxc89t94
This commit is contained in:
Xavier Morel 2012-08-07 11:23:17 +02:00
parent d9291d50c8
commit 741a1541da
2 changed files with 14 additions and 6 deletions

View File

@ -674,6 +674,10 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
* Base handling of buttons, can be called when overriding do_button_action * Base handling of buttons, can be called when overriding do_button_action
* in order to bypass parent overrides. * in order to bypass parent overrides.
* *
* The callback will be provided with the ``id`` as its parameter, in case
* handle_button's caller had to alter the ``id`` (or even create one)
* while not being ``callback``'s creator.
*
* This method should not be overridden. * This method should not be overridden.
* *
* @param {String} name action name * @param {String} name action name
@ -699,7 +703,8 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
c.add(action.context); c.add(action.context);
} }
action.context = c; action.context = c;
this.do_execute_action(action, this.dataset, id, callback); this.do_execute_action(
action, this.dataset, id, _.bind(callback, null, id));
}, },
/** /**
* Handles the activation of a record (clicking on it) * Handles the activation of a record (clicking on it)
@ -991,8 +996,8 @@ instance.web.ListView.List = instance.web.Class.extend( /** @lends instance.web.
// of digits, nice when storing actual numbers, not nice when // of digits, nice when storing actual numbers, not nice when
// storing strings composed only of digits. Force the action // storing strings composed only of digits. Force the action
// name to be a string // name to be a string
$(self).trigger('action', [field.toString(), record_id, function () { $(self).trigger('action', [field.toString(), record_id, function (id) {
return self.reload_record(self.records.get(record_id)); return self.reload_record(self.records.get(id));
}]); }]);
}) })
.delegate('a', 'click', function (e) { .delegate('a', 'click', function (e) {

View File

@ -135,10 +135,13 @@ openerp.web.list_editable = function (instance) {
make_editor: function () { make_editor: function () {
return new instance.web.list.Editor(this); return new instance.web.list.Editor(this);
}, },
do_button_action: function () { do_button_action: function (name, id, callback) {
var self = this, args = arguments; var self = this, args = arguments;
this.ensure_saved().then(function () { this.ensure_saved().then(function (done) {
self.handle_button.apply(self, args); if (!id && done.created) {
id = done.record.get('id');
}
self.handle_button.call(self, name, id, callback);
}); });
}, },
/** /**