diff options
Diffstat (limited to 'addons/web/static')
| -rw-r--r-- | addons/web/static/src/js/views/graph/graph_renderer.js | 2 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/list/list_controller.js | 24 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/list/list_renderer.js | 6 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/list/list_view.js | 3 | ||||
| -rw-r--r-- | addons/web/static/tests/views/graph_tests.js | 19 | ||||
| -rw-r--r-- | addons/web/static/tests/views/list_tests.js | 39 |
6 files changed, 87 insertions, 6 deletions
diff --git a/addons/web/static/src/js/views/graph/graph_renderer.js b/addons/web/static/src/js/views/graph/graph_renderer.js index 1fbd6572a9a..da5709a6261 100644 --- a/addons/web/static/src/js/views/graph/graph_renderer.js +++ b/addons/web/static/src/js/views/graph/graph_renderer.js @@ -56,7 +56,7 @@ return AbstractRenderer.extend({ on_attach_callback: function () { this._super.apply(this, arguments); this.isInDOM = true; - this._renderGraph(); + this._render(); }, /** * @override diff --git a/addons/web/static/src/js/views/list/list_controller.js b/addons/web/static/src/js/views/list/list_controller.js index ae1a8f7305b..af453fbba36 100644 --- a/addons/web/static/src/js/views/list/list_controller.js +++ b/addons/web/static/src/js/views/list/list_controller.js @@ -43,7 +43,7 @@ var ListController = BasicController.extend({ this.toolbarActions = params.toolbarActions || {}; this.editable = params.editable; this.noLeaf = params.noLeaf; - this.selectedRecords = []; // there is no selected record by default + this.selectedRecords = params.selectedRecords || []; }, //-------------------------------------------------------------------------- @@ -177,6 +177,25 @@ var ListController = BasicController.extend({ this._toggleSidebar(); } }, + /** + * Overrides to update the list of selected records + * + * @override + */ + update: function (params, options) { + var self = this; + if (options && options.keepSelection) { + // filter out removed records from selection + var res_ids = this.model.get(this.handle).res_ids; + this.selectedRecords = _.filter(this.selectedRecords, function (id) { + return _.contains(res_ids, self.model.get(id).res_id); + }); + } else { + this.selectedRecords = []; + } + params.selectedRecords = this.selectedRecords; + return this._super.apply(this, arguments); + }, //-------------------------------------------------------------------------- // Private @@ -339,7 +358,6 @@ var ListController = BasicController.extend({ * @returns {Deferred} */ _update: function () { - this.selectedRecords = []; this._toggleSidebar(); return this._super.apply(this, arguments); }, @@ -544,7 +562,7 @@ var ListController = BasicController.extend({ _onToggleGroup: function (event) { this.model .toggleGroup(event.data.group.id) - .then(this.update.bind(this, {}, {reload: false})); + .then(this.update.bind(this, {}, {keepSelection: true, reload: false})); }, }); diff --git a/addons/web/static/src/js/views/list/list_renderer.js b/addons/web/static/src/js/views/list/list_renderer.js index bf206eae32c..76ad3a82063 100644 --- a/addons/web/static/src/js/views/list/list_renderer.js +++ b/addons/web/static/src/js/views/list/list_renderer.js @@ -60,7 +60,7 @@ var ListRenderer = BasicRenderer.extend({ return py.parse(py.tokenize(value)); }).value(); this.hasSelectors = params.hasSelectors; - this.selection = []; + this.selection = params.selectedRecords || []; this.pagers = []; // instantiated pagers (only for grouped lists) this.editable = params.editable; }, @@ -81,7 +81,9 @@ var ListRenderer = BasicRenderer.extend({ */ updateState: function (state, params) { this._processColumns(params.columnInvisibleFields || {}); - this.selection = []; + if (params.selectedRecords) { + this.selection = params.selectedRecords; + } return this._super.apply(this, arguments); }, diff --git a/addons/web/static/src/js/views/list/list_view.js b/addons/web/static/src/js/views/list/list_view.js index 3082312e770..bc80017743b 100644 --- a/addons/web/static/src/js/views/list/list_view.js +++ b/addons/web/static/src/js/views/list/list_view.js @@ -35,6 +35,7 @@ var ListView = BasicView.extend({ */ init: function (viewInfo, params) { this._super.apply(this, arguments); + var selectedRecords = []; // there is no selected records by default var mode = this.arch.attrs.editable && !params.readonly ? "edit" : "readonly"; @@ -43,11 +44,13 @@ var ListView = BasicView.extend({ this.controllerParams.toolbarActions = viewInfo.toolbar; this.controllerParams.noLeaf = !!this.loadParams.context.group_by_no_leaf; this.controllerParams.mode = mode; + this.controllerParams.selectedRecords = selectedRecords; this.rendererParams.arch = this.arch; this.rendererParams.hasSelectors = 'hasSelectors' in params ? params.hasSelectors : true; this.rendererParams.editable = params.readonly ? false : this.arch.attrs.editable; + this.rendererParams.selectedRecords = selectedRecords; this.loadParams.limit = this.loadParams.limit || 80; this.loadParams.type = 'list'; diff --git a/addons/web/static/tests/views/graph_tests.js b/addons/web/static/tests/views/graph_tests.js index 5f7227815c1..4939a8c9b37 100644 --- a/addons/web/static/tests/views/graph_tests.js +++ b/addons/web/static/tests/views/graph_tests.js @@ -190,6 +190,25 @@ QUnit.module('Views', { }); QUnit.test('no content helper', function (assert) { + assert.expect(2); + this.data.foo.records = []; + + var graph = createView({ + View: GraphView, + model: "foo", + data: this.data, + arch: '<graph string="Gloups">' + + '<field name="product_id"/>' + + '</graph>', + }); + assert.strictEqual(graph.$('div.o_graph_svg_container svg.nvd3-svg').length, 0, + "should not contain a div with a svg element"); + assert.strictEqual(graph.$('div.o_view_nocontent').length, 1, + "should display the no content helper"); + graph.destroy(); + }); + + QUnit.test('no content helper after update', function (assert) { var done = assert.async(); assert.expect(4); diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js index 8aa70c1c099..95f2af74f09 100644 --- a/addons/web/static/tests/views/list_tests.js +++ b/addons/web/static/tests/views/list_tests.js @@ -663,6 +663,45 @@ QUnit.module('Views', { list.destroy(); }); + QUnit.test('selection is kept on render without reload', function (assert) { + assert.expect(5); + + var list = createView({ + View: ListView, + model: 'foo', + data: this.data, + groupBy: ['foo'], + viewOptions: {hasSidebar: true}, + arch: '<tree>' + + '<field name="foo"/>' + + '<field name="int_field" sum="Sum"/>' + + '</tree>', + }); + + // open blip grouping and check all lines + list.$('.o_group_header:contains("blip (2)")').click(); + list.$('.o_data_row input').click(); + assert.strictEqual(true, list.sidebar.$el.is(':visible'), + "element checked so sidebar") + + // open yop grouping and verify blip are still checked + list.$('.o_group_header:contains("yop (1)")').click() + assert.strictEqual(2, list.$('.o_data_row input:checked').length, + "opening a grouping does not uncheck others"); + assert.strictEqual(true, list.sidebar.$el.is(':visible'), + "element checked so sidebar") + + // close and open blip grouping and verify blip are unchecked + list.$('.o_group_header:contains("blip (2)")').click(); + list.$('.o_group_header:contains("blip (2)")').click(); + assert.strictEqual(0, list.$('.o_data_row input:checked').length, + "opening and closing a grouping uncheck its elements"); + assert.strictEqual(false, list.sidebar.$el.is(':visible'), + "no element checked so no sidebar") + + list.destroy(); + }); + QUnit.test('aggregates are computed correctly', function (assert) { assert.expect(4); |
