flectra.define('web.DataExport', function (require) { "use strict"; var core = require('web.core'); var crash_manager = require('web.crash_manager'); var data = require('web.data'); var Dialog = require('web.Dialog'); var framework = require('web.framework'); var pyeval = require('web.pyeval'); var QWeb = core.qweb; var _t = core._t; var DataExport = Dialog.extend({ template: 'ExportDialog', events: { 'click .o_expand_parent': function(e) { this.on_expand_action(this.records[$(e.target).closest('.o_export_tree_item').data('id')]); }, 'click .o_export_tree_item': function(e) { e.stopPropagation(); var $elem = $(e.currentTarget); var row_index = $elem.prevAll('.o_export_tree_item').length; var row_index_level = $elem.parents('.o_export_tree_item').length; if(e.shiftKey && row_index_level === this.row_index_level) { var minIndex = Math.min(row_index, this.row_index); var maxIndex = Math.max(row_index, this.row_index); this.$records.filter(function() { return ($elem.parent()[0] === $(this).parent()[0]); }) .slice(minIndex, maxIndex+1) .addClass('o_selected') .filter(':not(:last)') .each(process_children); } this.row_index = row_index; this.row_index_level = row_index_level; if(e.ctrlKey) { $elem.toggleClass('o_selected').focus(); } else if(e.shiftKey) { $elem.addClass('o_selected').focus(); } else { this.$(".o_selected").removeClass("o_selected") $elem.addClass("o_selected").focus(); } function process_children() { var $this = $(this); if($this.hasClass('open')) { $this.children('.o_export_tree_item') .addClass('o_selected') .each(process_children); } } }, 'dblclick .o_export_tree_item': function(e) { var $elem = $(e.currentTarget); $elem.removeClass('o_selected'); this.add_field($elem.data('id'), $elem.find('.o_tree_column').first().text()); }, 'keydown .o_export_tree_item': function(e) { e.stopPropagation(); var $elem = $(e.currentTarget); var record = this.records[$elem.data('id')]; switch(e.keyCode || e.which) { case $.ui.keyCode.LEFT: if ($elem.hasClass('open')) { this.on_expand_action(record); } break; case $.ui.keyCode.RIGHT: if (!$elem.hasClass('open')) { this.on_expand_action(record); } break; case $.ui.keyCode.UP: var $prev = $elem.prev('.o_export_tree_item'); if($prev.length === 1) { while($prev.hasClass('open')) { $prev = $prev.children('.o_export_tree_item').last(); } } else { $prev = $elem.parent('.o_export_tree_item'); if($prev.length === 0) { break; } } $elem.removeClass("o_selected").blur(); $prev.addClass("o_selected").focus(); break; case $.ui.keyCode.DOWN: var $next; if($elem.hasClass('open')) { $next = $elem.children('.o_export_tree_item').first(); } else { $next = $elem.next('.o_export_tree_item'); if($next.length === 0) { $next = $elem.parent('.o_export_tree_item').next('.o_export_tree_item'); if($next.length === 0) { break; } } } $elem.removeClass("o_selected").blur(); $next.addClass("o_selected").focus(); break; } }, 'click .o_add_field': function() { var self = this; this.$('.o_field_tree_structure .o_selected') .removeClass('o_selected') .each(function() { var $this = $(this); self.add_field($this.data('id'), $this.children('.o_tree_column').text()); }); }, 'click .o_remove_field': function() { this.$fields_list.find('option:selected').remove(); }, 'click .o_remove_all_field': function() { this.$fields_list.empty(); }, 'click .o_move_up': function() { var $selected_rows = this.$fields_list.find('option:selected'); var $prev_row = $selected_rows.first().prev(); if($prev_row.length){ $prev_row.before($selected_rows.detach()); } }, 'click .o_move_down': function () { var $selected_rows = this.$fields_list.find('option:selected'); var $next_row = $selected_rows.last().next(); if($next_row.length){ $next_row.after($selected_rows.detach()); } }, 'click .o_toggle_save_list': function(e) { e.preventDefault(); var $saveList = this.$(".o_save_list"); if($saveList.is(':empty')) { $saveList.append(QWeb.render('Export.SaveList')); } else { if($saveList.is(':hidden')) { $saveList.show(); $saveList.find(".o_export_list_input").val(""); } else { $saveList.hide(); } } }, 'click .o_save_list > button': function(e) { var $saveList = this.$(".o_save_list"); var value = $saveList.find("input").val(); if(!value) { Dialog.alert(this, _t("Please enter save field list name")); return; } var fields = this.get_fields(); if (fields.length === 0) { return; } $saveList.hide(); var self = this; this.exports.create({ name: value, resource: this.record.model, export_fields: _.map(fields, function (field) { return [0, 0, {name: field}]; }), }).then(function(export_list_id) { if(!export_list_id) { return; } var $select = self.$(".o_exported_lists_select"); if($select.length === 0 || $select.is(":hidden")) { self.show_exports_list(); } $select.append(new Option(value, export_list_id)); }); }, }, init: function(parent, record) { var options = { title: _t("Export Data"), buttons: [ {text: _t("Export To File"), click: this.export_data, classes: "btn-primary"}, {text: _t("Close"), close: true}, ], }; this._super(parent, options); this.records = {}; this.record = record; this.exports = new data.DataSetSearch(this, 'ir.exports', this.record.getContext()); this.row_index = 0; this.row_index_level = 0; }, start: function() { var self = this; var waitFor = [this._super.apply(this, arguments)]; // The default for the ".modal_content" element is "max-height: 100%;" // but we want it to always expand to "height: 100%;" for this modal. // This can be achieved thanks to LESS modification without touching // the ".modal-content" rules... but not with Internet explorer (11). this.$modal.find(".modal-content").css("height", "100%"); this.$fields_list = this.$('.o_fields_list'); this.$import_compat_radios = this.$('.o_import_compat input'); waitFor.push(this._rpc({route: '/web/export/formats'}).then(do_setup_export_formats)); var got_fields = new $.Deferred(); this.$import_compat_radios.change(function(e) { self.$('.o_field_tree_structure').remove(); self._rpc({ route: '/web/export/get_fields', params: { model: self.record.model, import_compat: !!$(e.target).val(), }, }) .done(function (records) { var compatible_fields = _.map(records, function (record) {return record.id; }); self.$fields_list .find('option') .filter(function () { var option_field = $(this).attr('value'); if (compatible_fields.indexOf(option_field) === -1) { return true; } }) .remove(); got_fields.resolve(); self.on_show_data(records); }); }).eq(0).change(); waitFor.push(got_fields); waitFor.push(this.getParent().getActiveDomain().then(function (domain) { if (domain === undefined) { self.ids_to_export = self.getParent().getSelectedIds(); self.domain = self.record.domain; } else { self.ids_to_export = false; self.domain = domain; } self.on_show_domain(); })); waitFor.push(this.show_exports_list()); return $.when.apply($, waitFor); function do_setup_export_formats(formats) { var $fmts = self.$('.o_export_format'); _.each(formats, function(format, i) { var $radio = $('', {type: 'radio', value: format.tag, name: 'o_export_format_name'}); var $label = $('