diff options
| author | Aaron Bohy <aab@odoo.com> | 2017-03-15 15:40:21 +0100 |
|---|---|---|
| committer | Aaron Bohy <aab@odoo.com> | 2017-04-11 19:44:38 +0200 |
| commit | 378d6813ff03a428537b98bb7232c09ef4d957d5 (patch) | |
| tree | 10a0ce7aae19978b08d86efba8608b134f8499f8 /addons/web/static/src/js | |
| parent | e21c73305f76b2abae7656d0660d5f55eba9373a (diff) | |
[IMP] web: list view: nested groups
Before this commit, only one level of groups was supported in list
views. This commit enables the nested groups support.
Diffstat (limited to 'addons/web/static/src/js')
| -rw-r--r-- | addons/web/static/src/js/views/basic/basic_model.js | 11 | ||||
| -rw-r--r-- | addons/web/static/src/js/views/list/list_renderer.js | 33 |
2 files changed, 30 insertions, 14 deletions
diff --git a/addons/web/static/src/js/views/basic/basic_model.js b/addons/web/static/src/js/views/basic/basic_model.js index 6c59d242cb0..5180cc41656 100644 --- a/addons/web/static/src/js/views/basic/basic_model.js +++ b/addons/web/static/src/js/views/basic/basic_model.js @@ -933,7 +933,7 @@ var BasicModel = AbstractModel.extend({ group.isOpen = true; var def; if (group.count > 0) { - def = this._fetchUngroupedList(group); + def = this._load(group); } return $.when(def).then(function () { return groupId; @@ -2048,6 +2048,7 @@ var BasicModel = AbstractModel.extend({ var fields = _.uniq(list.fieldNames.concat(list.groupedBy)); return this._rpc(list.model, 'read_group') .withFields(fields) + .withDomain(list.domain) .withContext(list.context) .groupBy(list.groupedBy) .lazy(true) @@ -2071,7 +2072,7 @@ var BasicModel = AbstractModel.extend({ var newGroup = self._makeDataPoint({ modelName: list.model, count: group[rawGroupBy + '_count'], - domain: group.__domain, + domain: list.domain.concat(group.__domain), context: list.context, fields: list.fields, fieldNames: list.fieldNames, @@ -2082,7 +2083,7 @@ var BasicModel = AbstractModel.extend({ orderedBy: list.orderedBy, limit: list.limit, openGroupByDefault: list.openGroupByDefault, - type: 'list', // nested groupedBys not handled yet + type: 'list', }); list.data.push(newGroup.id); var old_group = _.find(previousGroups, function (g) { @@ -2090,13 +2091,15 @@ var BasicModel = AbstractModel.extend({ }); if (old_group) { newGroup.isOpen = old_group.isOpen; + // copy the oldGroup data to keep 'isOpen' state of sub-groups + newGroup.data = newGroup.isOpen ? old_group.data : []; } else if (!newGroup.openGroupByDefault) { newGroup.isOpen = false; } else { newGroup.isOpen = '__fold' in group ? !group.__fold : true; } if (newGroup.isOpen && newGroup.count > 0) { - defs.push(self._fetchUngroupedList(newGroup)); + defs.push(self._load(newGroup)); } }); return $.when.apply($, defs).then(function () { 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 d82e31fc781..5618a0e36e2 100644 --- a/addons/web/static/src/js/views/list/list_renderer.js +++ b/addons/web/static/src/js/views/list/list_renderer.js @@ -354,9 +354,10 @@ var ListRenderer = BasicRenderer.extend({ * * @private * @param {Object} group + * @param {integer} groupLevel the nesting level (0 for root groups) * @returns {jQueryElement} a <tr> element */ - _renderGroupRow: function (group) { + _renderGroupRow: function (group, groupLevel) { var aggregateValues = _.mapObject(group.aggregateValues, function (value) { return { value: value }; }); @@ -370,7 +371,9 @@ var ListRenderer = BasicRenderer.extend({ .addClass('o_group_name') .text(name + ' (' + group.count + ')'); if (group.count > 0) { - var $arrow = $('<span style="padding-right: 5px;">') + var $arrow = $('<span>') + .css('padding-left', (groupLevel * 20) + 'px') + .css('padding-right', '5px') .addClass('fa') .toggleClass('fa-caret-right', !group.isOpen) .toggleClass('fa-caret-down', group.isOpen); @@ -390,23 +393,33 @@ var ListRenderer = BasicRenderer.extend({ * row, then possibly a bunch of rows for each record. * * @private + * @param {Object} data the dataPoint containing the groups + * @param {integer} [groupLevel=0] the nesting level. 0 is for the root group * @returns {jQueryElement[]} a list of <tbody> */ - _renderGroups: function () { + _renderGroups: function (data, groupLevel) { var self = this; + groupLevel = groupLevel || 0; var result = []; var $tbody = $('<tbody>'); - _.each(this.state.data, function (group) { + _.each(data, function (group) { if (!$tbody) { $tbody = $('<tbody>'); } - $tbody.append(self._renderGroupRow(group)); + $tbody.append(self._renderGroupRow(group, groupLevel)); if (group.data.length) { result.push($tbody); - var $records = _.map(group.data, function (record) { - return self._renderRow(record).prepend($('<td>')); - }); - result.push($('<tbody>').append($records)); + // render an opened group + if (group.groupedBy.length) { + // the opened group contains subgroups + result = result.concat(self._renderGroups(group.data, groupLevel + 1)); + } else { + // the opened group contains records + var $records = _.map(group.data, function (record) { + return self._renderRow(record).prepend($('<td>')); + }); + result.push($('<tbody>').append($records)); + } $tbody = null; } }); @@ -548,7 +561,7 @@ var ListRenderer = BasicRenderer.extend({ if (is_grouped) { $table .append(this._renderHeader(true)) - .append(this._renderGroups()) + .append(this._renderGroups(this.state.data)) .append(this._renderFooter(true)); } else { $table |
