diff --git a/addons/base/static/src/js/list.js b/addons/base/static/src/js/list.js index 7b2514b4b28..89bc2f013ae 100644 --- a/addons/base/static/src/js/list.js +++ b/addons/base/static/src/js/list.js @@ -5,6 +5,8 @@ openerp.base.ListView = openerp.base.Controller.extend( defaults: { // records can be selected one by one 'selectable': true, + // list rows can be deleted + 'deletable': true, // whether the column headers should be displayed 'header': true }, @@ -18,6 +20,7 @@ openerp.base.ListView = openerp.base.Controller.extend( * @param {Object} options A set of options used to configure the view * @param {Boolean} [options.selectable=true] determines whether view rows are selectable (e.g. via a checkbox) * @param {Boolean} [options.header=true] should the list's header be displayed + * @param {Boolean} [options.deletable=true] are the list rows deletable */ init: function(view_manager, session, element_id, dataset, view_id, options) { this._super(session, element_id); @@ -54,6 +57,8 @@ openerp.base.ListView = openerp.base.Controller.extend( // linking feature e.stopImmediatePropagation(); }); + this.$element.find('table').delegate( + 'td.oe-record-delete button', 'click', this.do_delete); this.$element.find('table').delegate( 'tr', 'click', this.on_select_row); @@ -147,6 +152,17 @@ openerp.base.ListView = openerp.base.Controller.extend( var self = this; self.dataset.fetch(self.dataset.fields, 0, self.limit, self.do_fill_table); }, + /** + * Handles the signal to delete a line from the DOM + * + * @param e + */ + do_delete: function (e) { + // don't link to forms + e.stopImmediatePropagation(); + this.dataset.unlink( + [this.rows[$(e.currentTarget).closest('tr').prevAll().length].id]); + }, /** * Gets the ids of all currently selected records, if any * @returns a list of ids, empty if no record is selected (or the list view is not selectable diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 79428989c95..c3682051e54 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -205,6 +205,9 @@ + + +

diff --git a/addons/base/static/test/list.js b/addons/base/static/test/list.js index e7d8152dee1..9e675125004 100644 --- a/addons/base/static/test/list.js +++ b/addons/base/static/test/list.js @@ -72,4 +72,35 @@ $(document).ready(function () { start(); }); }); + asyncTest('render deletion button if list is deletable', 1, function () { + var listview = new openerp.base.ListView( + {}, null, 'qunit-fixture', {model: null}); + + listview.on_loaded(fvg); + + listview.do_fill_table([{id: 1}, {id: 2}, {id: 3}]).then(function () { + equal( + listview.$element.find('tbody tr td.oe-record-delete button').length, + 3); + start(); + }); + }); + asyncTest('deletion button should lead on deletion in the dataset', + 2, function () { + var deleted; + var listview = new openerp.base.ListView( + {}, null, 'qunit-fixture', {model: null, unlink: function (ids) { + deleted = ids; + }}); + + listview.on_loaded(fvg); + + listview.do_fill_table([{id: 1}, {id: 2}, {id: 3}]).then(function () { + listview.$element.find('tbody td.oe-record-delete:eq(2) button').click(); + deepEqual(deleted, [3]); + listview.$element.find('tbody td.oe-record-delete:eq(0) button').click(); + deepEqual(deleted, [1]); + start(); + }); + }); });