summaryrefslogtreecommitdiff
path: root/addons/web/static/src/js
diff options
context:
space:
mode:
authorAaron Bohy <aab@odoo.com>2017-03-15 15:40:21 +0100
committerAaron Bohy <aab@odoo.com>2017-04-11 19:44:38 +0200
commit378d6813ff03a428537b98bb7232c09ef4d957d5 (patch)
tree10a0ce7aae19978b08d86efba8608b134f8499f8 /addons/web/static/src/js
parente21c73305f76b2abae7656d0660d5f55eba9373a (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.js11
-rw-r--r--addons/web/static/src/js/views/list/list_renderer.js33
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