123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842 |
- window.pdfjsLib.GlobalWorkerOptions.workerSrc = '/printer_bridge/static/lib/js/pdf.worker.js';
- // Tools
- openerp.pdfJs = window.pdfjsLib || _.noop();
- openerp.printJs = window.printJS || _.noop();
- openerp.html2canvas = window.html2canvas || _.noop();
- /**
- *
- * @param {*} instance
- * @param {*} local
- */
- openerp.printer_bridge = function (instance, local) {
- // Clase que maneja el socket de conexión entre odoo y el programa de impresión cliente encargada de la impresión directa
- var SocketManager = instance.web.Class.extend({
- init: function () {
- this.socket = null;
- this.start();
- },
- start: function () {
- this.open_socket();
- },
- open_socket: function () {
- var self = this;
- var setup = self.setup_socket = function (config) {
- self.config = config;
- self.config.is_mobile = self.is_mobile_browser()
- if (!self.config.is_mobile) {
- self.socket = io(location.protocol + '//' + config.host + ':' + config.port, {
- path: config.path
- });
- self.socket.on('connect', self.handle_connect);
- self.socket.on('error', self.handle_error);
- self.socket.on('connect_error', self.handle_connect_error);
- self.socket.on('request_printer_name', self.handle_printer_selection);
- self.socket.on('show_print_status', self.handle_print_status);
- self.socket.on('download_data', self.handle_download_data);
- }
- }
- this.get_socket_config().then(setup);
- },
- update_config: function () {
- instance.web.blockUI();
- var self = this;
- this.get_socket_config().then(function (config) {
- instance.web.unblockUI();
- self.config = _.extend(self.config, config);
- self.socket.destroy();
- self.setup_socket(config);
- });
- },
- handle_connect: function () {
- $('#printer-status').removeClass();
- $('#printer-status').addClass('printer-status-online');
- },
- handle_error: function (e) {
- instance.webclient.crashmanager.show_message(e);
- },
- handle_connect_error: function (e) {
- $('#printer-status').removeClass();
- $('#printer-status').addClass('printer-status-offline');
- },
- handle_printer_selection: function (data) {
- instance.web.unblockUI();
- var self = this;
- if (data.printers && data.printers.length === 0) {
- instance.web.notification.do_notify('Impresión', 'No hay impresoras instaladas');
- return;
- }
- var widget = new PrinterSelectionDialog(data);
- widget.get_selection().then(function (request) {
- self.emit('request_print', request);
- });
- },
- handle_print_status: function (data) {
- instance.web.unblockUI();
- if (_.isEqual(data.status, 'failed')) {
- instance.web.notification.do_warn('Impresión', 'Ha fallado la cola de impresión');
- return;
- }
- if (_.isEqual(data.status, 'canceled')) {
- instance.web.notification.do_notify('Impresión', 'Se ha cancelado la impresión');
- return;
- }
- if (_.isEqual(data.status, 'unknown')) {
- instance.web.notification.do_warn('Impresión', 'Imposible imprimir un formato de datos desconocido');
- return;
- }
- if (_.isEqual(data.status, 'printing')) {
- instance.web.notification.do_notify('Impresión', 'La impresora ' + data.printer + ' está imprimiendo');
- return;
- }
- if (_.isEqual(data.status, 'printed')) {
- instance.web.notification.do_notify('Impresión', 'La impresora ' + data.printer + ' finalizó la impresión');
- return;
- }
- if (_.isEqual(data.status, 'error')) {
- var message = null;
- if (_.isEqual(data.cause.id, 'unsupported_format')) {
- message = 'Formato de documento no soportado por la impresora';
- }
- if (_.isEqual(data.cause.id, 'print_error')) {
- message = 'La impresora falló al imprimir este documento';
- }
-
- instance.web.notification.do_warn('Impresión', 'Ocurrió un error al imprimir: ' + data.printer, message);
- }
- },
- handle_download_data: function (data) {
- instance.web.blockUI();
- instance.pdfJs.getDocument({
- data: atob(data)
- }).then(function (pdf) {
- if (local.socket_manager.config.action_download_pdf) {
- pdf.getData().then(function (data) {
- instance.web.unblockUI();
-
- var url = instance.pdfJs.createObjectURL(data, 'application/pdf');
- var a = document.createElement('a');
-
- a.href = url;
- a.download = 'download.pdf';
- a.target = '_parent';
- a.click();
- });
- return;
- }
- preview_pdf(null, pdf);
- });
- },
- get_socket_config: function () {
- var url = '/printer_bridge/socket_config';
- return this.get_from_server(url);
- },
- get_from_server: function (url) {
- instance.web.blockUI();
- return $.Deferred(function (d) {
- instance.web.jsonRpc(url, 'call').done(function () {
- instance.web.unblockUI();
- d.resolve.apply(d, arguments);
- }).fail(function (e) {
- instance.web.unblockUI();
- d.reject.apply(d, arguments);
- });
- });
- },
- is_mobile_browser: function () {
- var userAgent = navigator.userAgent;
- return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(userAgent) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(userAgent.substr(0, 4));
- },
- request_print: function (data, print_directly) {
- if (!data) {
- instance.web.notification.do_warn('Impresión', 'No hay datos para imprimir');
- return;
- }
- if (!this.socket || !this.socket.connected) {
- instance.web.notification.do_warn('Impresión', 'La impresora no está preparada');
- return;
- }
- instance.web.blockUI();
- var mime_type = 'data:application/pdf;base64,';
-
- if (data instanceof Uint8Array) {
- var Uint8ArrayToStr = function (u8a) {
- var CHUNK_SZ = 0x8000;
- var c = [];
- for (var i = 0; i < u8a.length; i += CHUNK_SZ) {
- c.push(String.fromCharCode.apply(null, u8a.subarray(i, i + CHUNK_SZ)));
- }
- return c.join('');
- }
- try {
- data = Uint8ArrayToStr(data);
- data = btoa(data);
- data = mime_type + data;
- } catch (error) {
- instance.web.unblockUI();
- instance.webclient.crashmanager.show_message(error);
- return;
- }
- }
- if (!data.startsWith(mime_type)) {
- data = mime_type + data;
- }
- try {
- atob(data.replace(mime_type, ''));
- this.socket.emit('request_print', {
- print_directly: print_directly || this.config.print_directly,
- data: data
- });
- } catch (error) {
- instance.web.unblockUI();
- instance.webclient.crashmanager.show_message(error);
- }
- }
- });
- // Diálogo que sirve para descargar del repositorio el programa cliente
- var DownloadPrinterTools = instance.web.Widget.extend({
- template: 'DownloadPrinterTools',
- events: {
- 'click .download_button': 'handle_download'
- },
- init: function (parent) {
- this._super(parent);
- },
- start: function () {
- this.renderElement();
- this.$el.appendTo($('body'));
- this.$el.on('hidden.bs.modal', this, this.on_hide);
- if (this.is_linux_platform()) {
- this.$('.download_logo_windows').css('display', 'none');
- this.$('.windows_download_button').css('display', 'none');
- }
-
- if (this.is_win_platform()) {
- this.$('.download_logo_linux').css('display', 'none');
- this.$('.linux_download_button').css('display', 'none');
- }
- this.$el.modal('show');
- },
- on_hide: function (e) {
- var self = e.data;
- self.$el.remove();
- self.destroy();
- },
- is_win_platform: function () {
- return /^Win(?:32|64)$/.test(navigator.platform);
- },
- is_linux_platform: function () {
- return /^Linux\sx86(?:|_64)$/.test(navigator.platform);
- },
- handle_download: function (e) {
- var download_url = 'https://repo.eiru.com.py/attachments/';
- if (this.is_linux_platform()) {
- download_url += 'eb019da8-8afa-4624-b45a-9476a5f72a45';
- }
- if (this.is_win_platform()) {
- download_url += 'fb18962d-c732-44ad-b30f-dd2db25d406c';
- }
- var a = document.createElement('a');
-
- a.href = download_url;
- a.target = '_parent';
- a.click();
- this.$el.modal('hide');
- }
- });
- // Icono de notificación en la barra superior del sistema
- var PrinterTopNotificator = instance.web.Widget.extend({
- template: 'PrinterTopNotificator',
- events: {
- 'click .printer_status_notificator': 'handle_click'
- },
- init: function (parent) {
- this._super(parent);
- },
- handle_click: function (e) {
- e.preventDefault();
- if (local.socket_manager.socket.disconnected) {
- var widget = new DownloadPrinterTools(this);
- widget.start();
- }
- }
- });
- // Diálogo de impresión cuando la impresión directa no está disponible
- var PrinterUnavailableDialog = instance.web.Widget.extend({
- template: 'PrinterUnavailableDialog',
- events: {
- 'click li': 'on_download'
- },
- init: function (parent) {
- this._super(parent);
- this.start();
- var config = local.socket_manager.config;
- this.preview_pdf = config.action_preview_pdf || false;
- },
- start: function () {
- this.defer = $.Deferred();
- this.render_widget();
- },
- render_widget: function () {
- this.renderElement();
- $('body').append(this.$el);
-
- this.$el.on('hidden.bs.modal', this, this.on_hide);
- this.$el.modal('show');
- },
- on_download: function () {
- this.download_pdf = true;
- this.$el.modal('hide');
- },
- on_hide: function (e) {
- var self = e.data;
-
- self.defer.resolve(!!self.download_pdf);
- self.destroy();
- self.$el.remove();
- },
- can_download: function () {
- return this.defer;
- }
- });
- // Diálogo de selección de la impresora que se encargará de la impresión
- var PrinterSelectionDialog = instance.web.Widget.extend({
- template: 'PrinterSelectionDialog',
- events: {
- 'click li': 'on_select'
- },
- init: function (data) {
- var config = local.socket_manager.config;
- this.download_pdf = config.action_download_pdf || false;
- this.preview_pdf = config.action_preview_pdf || false;
- this.printers = data.printers || [];
- this.id = data.id;
- this.start();
- },
- start: function () {
- this.defer = $.Deferred();
- this.render_widget();
- },
- render_widget: function () {
- this.renderElement();
- $('body').append(this.$el);
-
- this.$el.on('hidden.bs.modal', this, this.on_hide);
- this.$el.modal('show');
- },
- get_selection: function () {
- return this.defer;
- },
- on_select: function (e) {
- var $el = $(e.target).closest('li');
- var name = $el.data('name');
- this.selected_printer = name;
- this.$el.modal('hide');
- },
- on_hide: function (e) {
- var self = e.data;
- self.defer.resolve({
- id: self.id,
- printer: self.selected_printer,
- print_directly: true
- });
- self.$el.remove();
- }
- });
- // Pequeño visor pdf
- var PdfViewerDialog = instance.web.Widget.extend({
- template: 'PdfViewerDialog',
- events: {
- 'click a.btn': 'on_action'
- },
- init: function (parent, source, name) {
- this._super(parent);
- this.source = source;
- this.name = name;
- this.set('current_page', -1);
- this.on('change:current_page', this, this.render_page);
- if (_.isObject(this.source)) {
- this.pdf = source;
- this.render_widget();
- return;
- }
- var matchReportUrl = this.source.match(/(?:\/(?:web\/)?report(?:\/pdf)?)/);
- if (matchReportUrl) {
- var self = this;
- instance.web.blockUI();
- instance.pdfJs.getDocument(self.source).then(function (pdf) {
- self.pdf = pdf;
- self.render_widget();
- });
- return;
- }
- var matchMimeType = this.source.match(/data:[a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+.*,/);
- if (matchMimeType && this.source.startsWith('data:application/pdf;base64,')) {
- this.source = this.source.replace(matchMimeType[0], '');
- }
- try {
- this.source = {
- data: atob(this.source)
- }
- } catch (e) {
- instance.webclient.crashmanager.show_message('Unknown data format');
- return;
- }
- instance.web.blockUI();
- var self = this;
- instance.pdfJs.getDocument(this.source).then(function (pdf) {
- self.pdf = pdf;
- self.render_widget();
- }).catch(function (error) {
- instance.web.unblockUI();
- instance.webclient.crashmanager.show_message(error);
- });
- },
- render_widget: function () {
- this.renderElement();
- $('body').append(this.$el);
- this.$el.on('shown.bs.modal', this, this.render_pdf);
- this.$el.on('hidden.bs.modal', this, this.on_hide);
- this.$el.modal('show');
- },
- render_pdf: function (e) {
- var self = e.data;
-
- if (!self.pdf) {
- instance.web.unblockUI();
- instance.web.notification.do_warn('No hay archivo PDF');
- return;
- }
- self.set('current_page', 1);
- },
- render_page: function () {
- var self = this;
- var current_page = self.get('current_page');
- self.pdf.getPage(current_page).then(function (page) {
- var scale = 1;
- var viewport = page.getViewport(scale);
- var $canvas = self.$el.find('canvas');
- var context = $canvas.get(0).getContext('2d');
-
- $canvas.attr('height', viewport.height);
- $canvas.attr('width', viewport.width);
- page.render({
- canvasContext: context,
- viewport: viewport
- }).then(function () {
- self.$('.page_counter').text('Página ' + current_page + ' de ' + self.pdf.numPages);
- instance.web.unblockUI();
- });
-
- }, function (error) {
- instance.web.unblockUI();
- instance.webclient.crashmanager.show_message(error);
- });
- },
- on_hide: function (e) {
- var self = e.data;
- if (self.pdf) {
- self.pdf.destroy();
- }
- self.destroy();
- self.$el.remove();
- },
- on_action: function (e) {
- e.preventDefault();
- var action = $(e.target).closest('a').data('action');
- this['on_' + action]();
- },
- on_next: function () {
- var current_page = this.get('current_page');
-
- if (current_page >= this.pdf.numPages) {
- return;
- }
- this.set('current_page', current_page + 1);
- },
- on_previous: function () {
- var current_page = this.get('current_page');
- if (current_page <= 1) {
- return;
- }
- this.set('current_page', current_page - 1);
- },
- on_print: function () {
- var self = this;
- if (!self.pdf) {
- return;
- }
- instance.web.blockUI();
- self.pdf.getData().then(function (data) {
- instance.web.unblockUI();
- if (local.socket_manager.socket.connected) {
- local.socket_manager.request_print(data, true);
- return;
- }
- instance.printJs({
- printable: instance.pdfJs.createObjectURL(data, 'application/pdf')
- });
- });
- },
- on_download: function () {
- var self = this;
- if (!self.pdf) {
- return;
- }
- self.pdf.getMetadata().then(function (metadata) {
- self.pdf.getData().then(function (data) {
- var url = instance.pdfJs.createObjectURL(data, 'application/pdf');
- var a = document.createElement('a');
- a.href = url;
- a.download = (self.name || metadata.contentDispositionFilename || 'document') + '.pdf';
- a.target = '_parent';
- a.click();
- });
- });
- }
- });
- // Dispara el visor pdf
- var preview_pdf = function (owner, data, name) {
- new PdfViewerDialog(owner, data, name);
- };
- // Dispara la descarga del pdf
- var download_pdf = function (source) {
- var matchMimeType = source.match(/data:[a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+.*,/);
- if (!matchMimeType) {
- instance.webclient.crashmanager.show_message('Formato no válido para la impresión');
- return;
- }
-
- if (!source.startsWith(matchMimeType[0])) {
- instance.webclient.crashmanager.show_message('Formato no válido para la impresión');
- return;
- }
- var a = document.createElement('a');
- a.href = source;
- a.download = 'documento.pdf';
- a.target = '_parent';
- a.click();
- };
- // Dispara la impresión directa o descarga pdf
- local.print = function (data) {
- var config = this.socket_manager.config;
- if (config.is_mobile) {
- download_pdf(data);
- return;
- }
- if (config.action_download_pdf) {
- download_pdf(data);
- return;
- }
- if (this.socket_manager.socket.disconnected) {
- var widget = new PrinterUnavailableDialog();
- widget.can_download().then(function (can_download) {
- if (!can_download) {
- return;
- }
- if (config.action_preview_pdf) {
- preview_pdf(null, data, null);
- return;
- }
- download_pdf(data);
- });
- return;
- }
- this.socket_manager.request_print(data);
- };
- // Test
- local.TicketTestPage = instance.web.Widget.extend({
- template: 'TicketTestPage',
- events: {
- 'click .ticket-test-btn': 'print_test'
- },
- print_test: function (e) {
- e.preventDefault();
- var wrapper = document.createElement('div');
- wrapper.innerHTML = openerp.web.qweb.render('EiruPosTicket');
- wrapper.setAttribute('id', 'ticket_wrapper')
- $('body').append(wrapper);
- var ticket_el = document.querySelector('.eiru_pos_ticket');
-
- var ticket_width = 70;
- var measure_factor = 3.7793;
- var dpi_factor = 3.125;
- instance.html2canvas(ticket_el, {
- logging: false,
- width: ticket_width * measure_factor,
- scale: dpi_factor
- }).then(function (canvas) {
- $(wrapper).remove();
- var dataURL = canvas.toDataURL('image/png');
- var width = (canvas.width / measure_factor) / dpi_factor;
- var height = (canvas.height / measure_factor) / dpi_factor;
- var doc = new jsPDF({
- unit: 'mm',
- format: [height, ticket_width]
- });
- doc.addImage(dataURL, 'PNG', 0, 0, width, height);
- var data = doc.output('datauristring');
- local.print(data);
- });
- }
- });
- instance.web.client_actions.add('printer_bridge.test_ticket', 'instance.printer_bridge.TicketTestPage');
- if (instance.web) {
- if (instance.web.UserMenu) {
- instance.web.UserMenu.include({
- do_update: function () {
- var printer = new PrinterTopNotificator(this);
- printer.appendTo($('.oe_systray'));
-
- local.socket_manager = new SocketManager();
- local.print_directly = local.socket_manager.request_print;
- return this._super.apply(this, arguments);
- }
- });
- }
- if (instance.web.FormView) {
- instance.web.FormView.include({
- record_saved: function (r) {
- if (this.model === 'res.users') {
- local.socket_manager.update_config();
- }
- return this._super.apply(this, arguments);
- }
- });
- }
- if (instance.web.ActionManager) {
- instance.web.ActionManager.include({
- trigger_preview_pdf: function (action) {
- var self = this;
- var regex = /^(?:qweb-(pdf|html)|controller)$/;
- if (_.has(action, 'report_type') && regex.test(action.report_type)) {
- var format = action.report_type.match(regex)[1];
- var url = (format || action.report_file) && ('/report/' + format + '/' + action.report_name);
- if (_.isEmpty(action.data) && _.has(action.context, 'active_ids')) {
- url += '/' + action.context.active_ids.join(',');
- } else {
- url += '?options=' + encodeURIComponent(JSON.stringify(action.data)) + '&context=' + encodeURIComponent(JSON.stringify(action.context));
- }
-
- preview_pdf(self, url, action.name);
- return;
- }
-
- var params = {
- action: JSON.stringify(action),
- token: (new Date()).getTime()
- };
-
- preview_pdf(self, this.session.url('/web/report', params), action.name);
- },
- trigger_download_pdf: function (action) {
- var regex = /^(?:qweb-(pdf|html)|controller)$/;
- var url = null;
- instance.web.blockUI();
- if (_.has(action, 'report_type') && regex.test(action.report_type)) {
- var format = action.report_type.match(regex)[1];
- url = (format || action.report_file) && ('/report/' + format + '/' + action.report_name);
- if (_.isEmpty(action.data) && _.has(action.context, 'active_ids')) {
- url += '/' + action.context.active_ids.join(',');
- } else {
- url += '?options=' + encodeURIComponent(JSON.stringify(action.data)) + '&context=' + encodeURIComponent(JSON.stringify(action.context));
- }
- }
-
- if (!url) {
- var params = {
- action: JSON.stringify(action),
- token: (new Date()).getTime()
- };
- url = this.session.url('/web/report', params);
- }
- instance.pdfJs.getDocument(url).then(function (pdf) {
- pdf.getData().then(function (data) {
- instance.web.unblockUI();
- var url = instance.pdfJs.createObjectURL(data, 'application/pdf');
- var a = document.createElement('a');
-
- a.href = url;
- a.download = (action.name || action.report_name) + '.pdf';
- a.target = '_parent';
- a.click();
- pdf.destroy();
- });
- });
- },
- trigger_print_pdf: function (action) {
- var url = '/printer_bridge/get_pdf';
- var ctx = _.clone(action.context);
- ctx.report_name = action.report_name;
- instance.web.jsonRpc(url, 'call', {
- context: ctx
- }).done(function (result) {
- local.socket_manager.request_print(result.data);
- }).fail(function (e) {
- instance.webclient.crashmanager.show_message(e);
- });
- },
- ir_actions_report_xml: function (action, options) {
- var self = this;
- var config = local.socket_manager.config;
- var eval_contexts = ([instance.session.user_context] || []).concat([action.context]);
- action.context = instance.web.pyeval.eval('contexts', eval_contexts);
- if (config.is_mobile) {
- this.trigger_preview_pdf(action);
- return;
- }
-
- if (config.action_download_pdf) {
- self.trigger_download_pdf(action);
- return;
- }
- if (local.socket_manager.socket.disconnected) {
- var widget = new PrinterUnavailableDialog(this);
- widget.can_download().then(function (can_download) {
- if (!can_download) {
- return;
- }
- if (config.action_preview_pdf) {
- self.trigger_preview_pdf(action);
- return;
- }
- self.trigger_download_pdf(action);
- });
- return;
- }
- self.trigger_print_pdf(action);
- }
- });
- }
- }
- }
|