From 977db823c7c84e9edc7c8cf8384eb9cf47275b3a Mon Sep 17 00:00:00 2001 From: Aaron Bohy Date: Fri, 8 Apr 2016 14:53:34 +0200 Subject: [REF] web: stop duplicating web Avoid duplicating web addon in enterprise by extracting a common basis. Enterprise features stay in enterprise, but use that common basis. Mainly: - JS refactoring and linting - Conversion of .sass into .less split into multiple files - Templates cleaning and DOM simplification - Re-generation of web.pot, and update of .po files --- addons/web/static/src/js/widgets/data_export.js | 608 ++++++++++++------------ 1 file changed, 305 insertions(+), 303 deletions(-) (limited to 'addons/web/static/src/js/widgets/data_export.js') diff --git a/addons/web/static/src/js/widgets/data_export.js b/addons/web/static/src/js/widgets/data_export.js index a73020ce9b2..4b87d45ff4a 100644 --- a/addons/web/static/src/js/widgets/data_export.js +++ b/addons/web/static/src/js/widgets/data_export.js @@ -11,212 +11,326 @@ var QWeb = core.qweb; var _t = core._t; var DataExport = Dialog.extend({ - template: 'ExportTreeView', + template: 'ExportDialog', events: { - 'click #add_field': function () { + '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.$('#field-tree-structure tr.ui-selected') - .removeClass('ui-selected') - .find('a').each(function () { - var id = $(this).attr('id').split('-')[1]; - var string = $(this).attr('string'); - self.add_field(id, string); + 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 #remove_field': function () { - this.$('#fields_list option:selected').remove(); + '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 #remove_all_field': function () { - this.$('#fields_list').empty(); + + '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.dataset.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)); + }); }, - 'click #export_new_list': 'on_show_save_list', - 'click #move_up':'on_click_move_up', - 'click #move_down':'on_click_move_down', }, init: function(parent, dataset) { - var self = this; var options = { + title: _t("Export Data"), buttons: [ - {text: _t("Close"), click: function () { self.$el.parents('.modal').modal('hide'); }}, - {text: _t("Export To File"), click: function () { self.on_click_export_data(); }} + {text: _t("Export To File"), click: this.export_data, classes: "btn-primary"}, + {text: _t("Close"), close: true}, ], - close: function () { self.close();} }; this._super(parent, options); this.records = {}; this.dataset = dataset; - this.exports = new data.DataSetSearch( - this, 'ir.exports', this.dataset.get_context()); - this.set_title(_t("Export Data")); + this.exports = new data.DataSetSearch(this, 'ir.exports', this.dataset.get_context()); + + this.row_index = 0; + this.row_index_level = 0; }, start: function() { var self = this; - this._super.apply(this, arguments); + var waitFor = [this._super.apply(this, arguments)]; + + this.$fields_list = this.$('.o_fields_list'); + this.$import_compat_radios = this.$('.o_import_compat input'); + + waitFor.push(this.rpc('/web/export/formats', {}).then(do_setup_export_formats)); var got_fields = new $.Deferred(); - this.$el.find('#import_compat').change(function() { - self.$el.find('#fields_list').empty(); - self.$el.find('#field-tree-structure').remove(); - var import_comp = self.$el.find("#import_compat").val(); + this.$import_compat_radios.change(function(e) { + self.$fields_list.empty(); + self.$('.o_field_tree_structure').remove(); + self.rpc("/web/export/get_fields", { model: self.dataset.model, - import_compat: !!import_comp, + import_compat: !!$(e.target).val(), }).done(function (records) { got_fields.resolve(); self.on_show_data(records); }); - }).change(); + }).eq(0).change(); + waitFor.push(got_fields); - var got_domain = this.getParent().get_active_domain().then(function (domain) { + waitFor.push(this.getParent().get_active_domain().then(function (domain) { if (domain === undefined) { self.ids_to_export = self.getParent().get_selected_ids(); self.domain = self.dataset.domain; - } - else { + } else { self.ids_to_export = false; self.domain = domain; } self.on_show_domain(); - }); + })); - return $.when( - got_fields, - got_domain, - this.rpc('/web/export/formats', {}).done(this.do_setup_export_formats), - this.show_exports_list()); - }, - on_click_move_up: function () { - var prev_row = this.$('#fields_list option:selected').first().prev(); - if(prev_row.length){ - var selected_rows = this.$('#fields_list option:selected').detach(); - prev_row.before(selected_rows); - } - }, - on_click_move_down: function () { - var next_row = this.$('#fields_list option:selected').last().next(); - if(next_row.length){ - var selected_rows = this.$('#fields_list option:selected').detach(); - next_row.after(selected_rows); + 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 = $('