1 openerp.web.data_export = function(instance) {
2 var QWeb = instance.web.qweb,
4 instance.web.DataExport = instance.web.Dialog.extend({
5 template: 'ExportTreeView',
6 dialog_title: {toString: function () { return _t("Export Data"); }},
7 init: function(parent, dataset) {
10 this.dataset = dataset;
11 this.exports = new instance.web.DataSetSearch(
12 this, 'ir.exports', this.dataset.get_context());
16 this._super.apply(this, arguments);
19 {text: _t("Close"), click: function() { self.close(); }},
20 {text: _t("Export To File"), click: function() { self.on_click_export_data(); }}
22 close: function(event, ui){ self.close();}
24 self.$element.removeClass('ui-dialog-content ui-widget-content');
25 self.$element.find('#add_field').click(function() {
26 if ($('#field-tree-structure tr.ui-selected')) {
27 var fld = self.$element.find('#field-tree-structure tr.ui-selected').find('a');
28 for (var i = 0; i < fld.length; i++) {
29 var id = $(fld[i]).attr('id').split('-')[1];
30 var string = $(fld[i]).attr('string');
31 self.add_field(id, string);
33 self.$element.find('#field-tree-structure tr').removeClass('ui-selected');
36 self.$element.find('#remove_field').click(function() {
37 self.$element.find('#fields_list option:selected').remove();
39 self.$element.find('#remove_all_field').click(function() {
40 self.$element.find('#fields_list').empty();
42 this.$element.find('#export_new_list').click(this.on_show_save_list);
44 var got_fields = new $.Deferred();
45 this.$element.find('#import_compat').change(function() {
46 self.$element.find('#fields_list').empty();
47 self.$element.find('#field-tree-structure').remove();
48 var import_comp = self.$element.find("#import_compat").val();
49 self.rpc("/web/export/get_fields", {
50 model: self.dataset.model,
51 import_compat: Boolean(import_comp)
52 }, function (records) {
54 self.on_show_data(records);
60 this.rpc('/web/export/formats', {}, this.do_setup_export_formats),
61 this.show_exports_list());
63 do_setup_export_formats: function (formats) {
64 var $fmts = this.$element.find('#export_format');
65 _(formats).each(function (format) {
66 var opt = new Option(format.label, format.tag);
70 document.createTextNode(
71 _.str.sprintf("%s — %s", format.label, format.error)),
77 show_exports_list: function() {
79 if (self.$element.find('#saved_export_list').is(':hidden')) {
80 self.$element.find('#ExistsExportList').show();
83 return this.exports.read_slice(['name'], {
84 domain: [['resource', '=', this.dataset.model]]
85 }).then(function (export_list) {
86 if (!export_list.length) {
89 self.$element.find('#ExistsExportList').append(QWeb.render('Exists.ExportList', {'existing_exports': export_list}));
90 self.$element.find('#saved_export_list').change(function() {
91 self.$element.find('#fields_list option').remove();
92 var export_id = self.$element.find('#saved_export_list option:selected').val();
94 self.rpc('/web/export/namelist', {'model': self.dataset.model, export_id: parseInt(export_id)}, self.do_load_export_field);
97 self.$element.find('#delete_export_list').click(function() {
98 var select_exp = self.$element.find('#saved_export_list option:selected');
99 if (select_exp.val()) {
100 self.exports.unlink([parseInt(select_exp.val(), 10)]);
102 if (self.$element.find('#saved_export_list option').length <= 1) {
103 self.$element.find('#ExistsExportList').hide();
109 do_load_export_field: function(field_list) {
110 var export_node = this.$element.find("#fields_list");
111 _(field_list).each(function (field) {
112 export_node.append(new Option(field.label, field.name));
115 on_show_save_list: function() {
117 var current_node = self.$element.find("#savenewlist");
118 if (!(current_node.find("label")).length) {
119 current_node.append(QWeb.render('ExportNewList'));
120 current_node.find("#add_export_list").click(function() {
121 var value = current_node.find("#savelist_name").val();
123 self.do_save_export_list(value);
125 alert(_t("Please enter save field list name"));
129 if (current_node.is(':hidden')) {
131 current_node.find("#savelist_name").val("");
137 do_save_export_list: function(value) {
139 var fields = self.get_fields();
140 if (!fields.length) {
143 this.exports.create({
145 resource: this.dataset.model,
146 export_fields: _(fields).map(function (field) {
147 return [0, 0, {name: field}];
149 }, function (export_list_id) {
150 if (!export_list_id.result) {
153 self.$element.find("#saved_export_list").append(
154 new Option(value, export_list_id.result));
155 if (self.$element.find("#saved_export_list").is(":hidden")) {
156 self.show_exports_list();
159 this.on_show_save_list();
160 this.$element.find("#fields_list option").remove();
162 on_click: function(id, record) {
164 if (!record['children']) {
167 var model = record['params']['model'],
168 prefix = record['params']['prefix'],
169 name = record['params']['name'],
171 if (record['relation_field']) {
172 exclude_fields.push(record['relation_field']);
175 if (!record.loaded) {
176 var import_comp = self.$element.find("#import_compat").val();
177 self.rpc("/web/export/get_fields", {
181 import_compat: Boolean(import_comp),
182 parent_field_type : record['field_type'],
183 exclude: exclude_fields
184 }, function(results) {
185 record.loaded = true;
186 self.on_show_data(results, record.id);
189 self.showcontent(record.id);
192 on_show_data: function(result, after) {
194 var imp_cmpt = Boolean(self.$element.find("#import_compat").val());
197 var current_tr = self.$element.find("tr[id='treerow-" + after + "']");
198 current_tr.addClass('open');
199 current_tr.find('img').attr('src','/web/static/src/img/collapse.gif');
200 current_tr.after(QWeb.render('ExportTreeView-Secondary.children', {'fields': result}));
202 self.$element.find('#left_field_panel').append(QWeb.render('ExportTreeView-Secondary', {'fields': result}));
204 _.each(result, function(record) {
205 self.records[record.id] = record.value;
206 if (record.required) {
207 var required_fld = self.$element.find("tr[id='treerow-" + record.id + "']").find('#tree-column');
208 required_fld.addClass("oe_export_requiredfield");
210 self.$element.find("img[id='parentimg-" + record.id +"']").click(function() {
211 self.on_click(this.id, record);
214 self.$element.find("tr[id='treerow-" + record.id + "']").click(function(e) {
216 var frst_click, scnd_click = '';
217 if (self.row_index == 0) {
218 self.row_index = this.rowIndex;
219 frst_click = self.$element.find("tr[id^='treerow-']")[self.row_index-1];
220 $(frst_click).addClass("ui-selected");
222 if (this.rowIndex >=self.row_index) {
223 for (var i = (self.row_index-1); i < this.rowIndex; i++) {
224 scnd_click = self.$element.find("tr[id^='treerow-']")[i];
225 if (!$(scnd_click).find('#tree-column').hasClass("oe_export_readonlyfield")) {
226 $(scnd_click).addClass("ui-selected");
230 for (var i = (self.row_index-1); i >= (this.rowIndex-1); i--) {
231 scnd_click = self.$element.find("tr[id^='treerow-']")[i];
232 if (!$(scnd_click).find('#tree-column').hasClass("oe_export_readonlyfield")) {
233 $(scnd_click).addClass("ui-selected");
239 self.row_index = this.rowIndex;
241 self.$element.find("tr[id='treerow-" + record.id + "']").keyup(function() {
244 var o2m_selection = self.$element.find("tr[id='treerow-" + record.id + "']").find('#tree-column');
245 if ($(o2m_selection).hasClass("oe_export_readonlyfield")) {
249 if ($(this).hasClass('ui-selected')) {
250 $(this).removeClass('ui-selected').find('a').blur();
252 $(this).addClass('ui-selected').find('a').focus();
254 } else if (!e.shiftKey) {
255 self.$element.find("tr.ui-selected")
256 .removeClass("ui-selected").find('a').blur();
257 $(this).addClass("ui-selected").find('a').focus();
262 self.$element.find("tr[id='treerow-" + record.id + "']").keydown(function(e) {
263 var keyCode = e.keyCode || e.which;
264 var arrow = {left: 37, up: 38, right: 39, down: 40 };
267 if ($(this).hasClass('open')) {
268 self.on_click(this.id, record);
272 if (!$(this).hasClass('open')) {
273 self.on_click(this.id, record);
278 $(elem).removeClass("ui-selected");
279 while (!$(elem).prev().is(":visible")) {
280 elem = $(elem).prev();
282 if (!$(elem).prev().find('#tree-column').hasClass("oe_export_readonlyfield")) {
283 $(elem).prev().addClass("ui-selected");
285 $(elem).prev().find('a').focus();
289 $(elem).removeClass("ui-selected");
290 while(!$(elem).next().is(":visible")) {
291 elem = $(elem).next();
293 if (!$(elem).next().find('#tree-column').hasClass("oe_export_readonlyfield")) {
294 $(elem).next().addClass("ui-selected");
296 $(elem).next().find('a').focus();
300 self.$element.find("tr[id='treerow-" + record.id + "']").dblclick(function() {
301 var $o2m_selection = self.$element.find("tr[id^='treerow-" + record.id + "']").find('#tree-column');
302 if (!$o2m_selection.hasClass("oe_export_readonlyfield")) {
303 self.add_field(record.id, $(this).find("a").attr("string"));
307 self.$element.find('#fields_list').mouseover(function(event) {
308 if (event.relatedTarget) {
309 if (event.relatedTarget.attributes['id'] && event.relatedTarget.attributes['string']) {
310 var field_id = event.relatedTarget.attributes["id"]["value"];
311 if (field_id && field_id.split("-")[0] === 'export') {
312 if (!self.$element.find("tr[id='treerow-" + field_id.split("-")[1] + "']").find('#tree-column').hasClass("oe_export_readonlyfield")) {
313 self.add_field(field_id.split("-")[1], event.relatedTarget.attributes["string"]["value"]);
320 showcontent: function(id) {
321 // show & hide the contents
322 var $this = this.$element.find("tr[id='treerow-" + id + "']");
323 var is_open = $this.hasClass('open');
324 $this.toggleClass('open');
326 var first_child = $this.find('img');
328 first_child.attr('src', '/web/static/src/img/expand.gif');
330 first_child.attr('src', '/web/static/src/img/collapse.gif');
332 var child_field = this.$element.find("tr[id^='treerow-" + id +"/']");
333 var child_len = (id.split("/")).length + 1;
334 for (var i = 0; i < child_field.length; i++) {
335 var $child = $(child_field[i]);
338 } else if (child_len == (child_field[i].id.split("/")).length) {
339 if ($child.hasClass('open')) {
340 $child.removeClass('open');
341 $child.find('img').attr('src', '/web/static/src/img/expand.gif');
347 add_field: function(field_id, string) {
348 var field_list = this.$element.find('#fields_list');
349 if (this.$element.find("#fields_list option[value='" + field_id + "']")
350 && !this.$element.find("#fields_list option[value='" + field_id + "']").length) {
351 field_list.append(new Option(string, field_id));
354 get_fields: function() {
355 var export_field = [];
356 this.$element.find("#fields_list option").each(function() {
357 export_field.push($(this).val());
359 if (!export_field.length) {
360 alert(_t("Please select fields to save export list..."));
364 on_click_export_data: function() {
366 var exported_fields = this.$element.find('#fields_list option').map(function () {
367 // DOM property is textContent, but IE8 only knows innerText
368 return {name: self.records[this.value] || this.value,
369 label: this.textContent || this.innerText};
372 if (_.isEmpty(exported_fields)) {
373 alert(_t("Please select fields to export..."));
377 exported_fields.unshift({name: 'id', label: 'External ID'});
378 var export_format = this.$element.find("#export_format").val();
380 this.session.get_file({
381 url: '/web/export/' + export_format,
382 data: {data: JSON.stringify({
383 model: this.dataset.model,
384 fields: exported_fields,
385 ids: this.dataset.ids,
386 domain: this.dataset.domain,
387 import_compat: Boolean(
388 this.$element.find("#import_compat").val())
390 complete: $.unblockUI
394 this.$element.remove();