hunk.code_window:     _onClickPrint: function (ev) {
           var childBomIDs = _.map(this.$el.find('.o_mrp_bom_foldable').closest('tr'), function (el) {
               return $(el).data('id');
           });
           framework.blockUI();
           var reportname = 'mrp.report_bom_structure?docids=' + this.given_context.active_id + '&report_type=' + this.given_context.report_type;
           if (! $(ev.currentTarget).hasClass('o_mrp_bom_print_unfolded')) {
  
hunk.labels: keep keep keep keep keep replace keep
hunk.after_edit:         var reportname = 'mrp.report_bom_structure?docids=' + this.given_context.active_id +
                            '&report_type=' + this.given_context.report_type +
                            '&quantity=' + (this.given_context.searchQty || 1);
  
hunk.file_path: addons/mrp/static/src/js/mrp_bom_report.js
hunk.type: replace
file: odoo.define('mrp.mrp_bom_report', function (require) {
  'use strict';
  
  var core = require('web.core');
  var framework = require('web.framework');
  var stock_report_generic = require('stock.stock_report_generic');
  
  var QWeb = core.qweb;
  var _t = core._t;
  
  var MrpBomReport = stock_report_generic.extend({
      events: {
          'click .o_mrp_bom_unfoldable': '_onClickUnfold',
          'click .o_mrp_bom_foldable': '_onClickFold',
          'click .o_mrp_bom_action': '_onClickAction',
          'click .o_mrp_show_attachment_action': '_onClickShowAttachment',
      },
      get_html: function() {
          var self = this;
          var args = [
              this.given_context.active_id,
              this.given_context.searchQty || 1,
              this.given_context.searchVariant,
          ];
          return this._rpc({
                  model: 'report.mrp.report_bom_structure',
                  method: 'get_html',
                  args: args,
                  context: this.given_context,
              })
              .then(function (result) {
                  self.data = result;
              });
      },
      set_html: function() {
          var self = this;
          return this._super().then(function () {
              self.$('.o_content').html(self.data.lines);
              self.renderSearch();
              self.update_cp();
          });
      },
      render_html: function(event, $el, result){
          if (result.indexOf('mrp.document') > 0) {
              if (this.$('.o_mrp_has_attachments').length === 0) {
                  var column = $('<th/>', {
                      class: 'o_mrp_has_attachments',
                      title: 'Files attached to the product Attachments',
                      text: 'Attachments',
                  });
                  this.$('table thead th:last-child').after(column);
              }
          }
          $el.after(result);
          $(event.currentTarget).toggleClass('o_mrp_bom_foldable o_mrp_bom_unfoldable fa-caret-right fa-caret-down');
          this._reload_report_type();
      },
      get_bom: function(event) {
        var self = this;
        var $parent = $(event.currentTarget).closest('tr');
        var activeID = $parent.data('id');
        var productID = $parent.data('product_id');
        var lineID = $parent.data('line');
        var qty = $parent.data('qty');
        var level = $parent.data('level') || 0;
        return this._rpc({
                model: 'report.mrp.report_bom_structure',
                method: 'get_bom',
                args: [
                    activeID,
                    productID,
                    parseFloat(qty),
                    lineID,
                    level + 1,
                ]
            })
            .then(function (result) {
                self.render_html(event, $parent, result);
            });
      },
      get_operations: function(event) {
        var self = this;
        var $parent = $(event.currentTarget).closest('tr');
        var activeID = $parent.data('bom-id');
        var qty = $parent.data('qty');
        var level = $parent.data('level') || 0;
        return this._rpc({
                model: 'report.mrp.report_bom_structure',
                method: 'get_operations',
                args: [
                    activeID,
                    parseFloat(qty),
                    level + 1
                ]
            })
            .then(function (result) {
                self.render_html(event, $parent, result);
            });
      },
      update_cp: function () {
          var status = {
              cp_content: {
                  $buttons: this.$buttonPrint,
                  $searchview_buttons: this.$searchView
              },
          };
          return this.updateControlPanel(status);
      },
      renderSearch: function () {
          this.$buttonPrint = $(QWeb.render('mrp.button'));
          this.$buttonPrint.filter('.o_mrp_bom_print').on('click', this._onClickPrint.bind(this));
          this.$buttonPrint.filter('.o_mrp_bom_print_unfolded').on('click', this._onClickPrint.bind(this));
          this.$searchView = $(QWeb.render('mrp.report_bom_search', _.omit(this.data, 'lines')));
          this.$searchView.find('.o_mrp_bom_report_qty').on('change', this._onChangeQty.bind(this));
          this.$searchView.find('.o_mrp_bom_report_variants').on('change', this._onChangeVariants.bind(this));
          this.$searchView.find('.o_mrp_bom_report_type').on('change', this._onChangeType.bind(this));
      },
      _onClickPrint: function (ev) {
          var childBomIDs = _.map(this.$el.find('.o_mrp_bom_foldable').closest('tr'), function (el) {
              return $(el).data('id');
          });
          framework.blockUI();
          var reportname = 'mrp.report_bom_structure?docids=' + this.given_context.active_id + '&report_type=' + this.given_context.report_type;
          if (! $(ev.currentTarget).hasClass('o_mrp_bom_print_unfolded')) {
              reportname += '&quantity=' + (this.given_context.searchQty || 1) +
                            '&childs=' + JSON.stringify(childBomIDs);
          }
          if (this.given_context.searchVariant) {
              reportname += '&variant=' + this.given_context.searchVariant;
          }
          var action = {
              'type': 'ir.actions.report',
              'report_type': 'qweb-pdf',
              'report_name': reportname,                                
              'report_file': 'mrp.report_bom_structure',
          };
          return this.do_action(action).then(function (){
              framework.unblockUI();
          });
      },
      _onChangeQty: function (ev) {
          var qty = $(ev.currentTarget).val().trim();
          if (qty) {
              this.given_context.searchQty = parseFloat(qty);
              this._reload();
          }
      },
      _onChangeType: function (ev) {
          var report_type = $("option:selected", $(ev.currentTarget)).data('type');
          this.given_context.report_type = report_type;
          this._reload_report_type();
      },
      _onChangeVariants: function (ev) {
          this.given_context.searchVariant = $(ev.currentTarget).val();
          this._reload();
      },
      _onClickUnfold: function (ev) {
          var redirect_function = $(ev.currentTarget).data('function');
          this[redirect_function](ev);
      },
      _onClickFold: function (ev) {
          this._removeLines($(ev.currentTarget).closest('tr'));
          $(ev.currentTarget).toggleClass('o_mrp_bom_foldable o_mrp_bom_unfoldable fa-caret-right fa-caret-down');
      },
      _onClickAction: function (ev) {
          ev.preventDefault();
          return this.do_action({
              type: 'ir.actions.act_window',
              res_model: $(ev.currentTarget).data('model'),
              res_id: $(ev.currentTarget).data('res-id'),
              views: [[false, 'form']],
              target: 'current'
          });
      },
      _onClickShowAttachment: function (ev) {
          ev.preventDefault();
          var ids = $(ev.currentTarget).data('res-id');
          return this.do_action({
              name: _t('Attachments'),
              type: 'ir.actions.act_window',
              res_model: $(ev.currentTarget).data('model'),
              domain: [['id', 'in', ids]],
              views: [[false, 'kanban'], [false, 'list'], [false, 'form']],
              view_mode: 'kanban,list,form',
              target: 'current',
          });
      },
      _reload: function () {
          var self = this;
          return this.get_html().then(function () {
              self.$('.o_content').html(self.data.lines);
              self._reload_report_type();
          });
      },
      _reload_report_type: function () {
          this.$('.o_mrp_bom_cost.o_hidden, .o_mrp_prod_cost.o_hidden').toggleClass('o_hidden');
          if (this.given_context.report_type === 'bom_structure') {
             this.$('.o_mrp_bom_cost, .o_mrp_prod_cost').toggleClass('o_hidden');
          }
      },
      _removeLines: function ($el) {
          var self = this;
          var activeID = $el.data('id');
          _.each(this.$('tr[parent_id='+ activeID +']'), function (parent) {
              var $parent = self.$(parent);
              var $el = self.$('tr[parent_id='+ $parent.data('id') +']');
              if ($el.length) {
                  self._removeLines($parent);
              }
              $parent.remove();
          });
      },
  });
  
  core.action_registry.add('mrp_bom_report', MrpBomReport);
  return MrpBomReport;
  
  });
  