summaryrefslogtreecommitdiff
path: root/addons/web/static
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static')
-rw-r--r--addons/web/static/src/js/views/graph/graph_renderer.js2
-rw-r--r--addons/web/static/src/js/views/list/list_controller.js24
-rw-r--r--addons/web/static/src/js/views/list/list_renderer.js6
-rw-r--r--addons/web/static/src/js/views/list/list_view.js3
-rw-r--r--addons/web/static/tests/views/graph_tests.js19
-rw-r--r--addons/web/static/tests/views/list_tests.js39
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);