odoo.define("web.web_group_expand", function (require) { "use strict"; var qweb = require("web.core").qweb; require("web.ListController").include({ start: function () { this.$expandGroupButtons = $(qweb.render("web_group_expand.Buttons")); this.$expandGroupButtons .find("#oe_group_by_expand") .on("click", this.expandAllGroups.bind(this)); this.$expandGroupButtons .find("#oe_group_by_collapse") .on("click", this.collapseAllGroups.bind(this)); return this._super.apply(this, arguments); }, renderButtons: function () { this._super.apply(this, arguments); this.$expandGroupButtons.toggleClass("o_hidden", !this.renderer.isGrouped); this.$buttons.append(this.$expandGroupButtons); }, expandAllGroups: function () { // We expand layer by layer. So first we need to find the highest // layer that's not already fully expanded. var layer = this.renderer.state.data; while (layer.length) { var closed = layer.filter(function (group) { return !group.isOpen; }); if (closed.length) { // This layer is not completely expanded, expand it this._toggleGroups(closed); break; } // This layer is completely expanded, move to the next layer = _.flatten( layer.map(function (group) { return group.data; }), true ); } }, collapseAllGroups: function () { // We collapse layer by layer. So first we need to find the deepest // layer that's not already fully collapsed. var layer = this.renderer.state.data.filter(function (group) { return group.isOpen; }); while (layer.length) { var next = _.flatten( layer.map(function (group) { return group.data; }), true ).filter(function (group) { return group.isOpen; }); if (!next.length) { // Next layer is fully collapsed, so collapse this one this._toggleGroups(layer); break; } layer = next; } }, _toggleGroups: function (groups) { var self = this; var defs = groups.map(function (group) { return self.model.toggleGroup(group.id); }); $.when(...defs).then( this.update.bind(this, {}, {keepSelection: true, reload: false}) ); }, }); require("web.ListRenderer").include({ updateState: function () { var res = this._super.apply(this, arguments); $("nav.oe_group_by_expand_buttons").toggleClass( "o_hidden", !this.isGrouped ); return res; }, }); });