123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439 |
- window.pdfjsLib.GlobalWorkerOptions.workerSrc = '/print_engine/static/lib/js/pdf.worker.js';
- openerp.pdfJs = window.pdfjsLib || {};
- openerp.print_engine = function (instance, local) {
- local.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_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);
- }
- }
- this.get_socket_config().then(setup_socket);
- },
- handle_connect: function () {
- $('#printer-status').removeClass();
- $('#printer-status').addClass('printer-status-online');
- },
- handle_error: function (e) {
- console.log(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.printer.length === 0) {
- instance.web.notification.do_notify('Impresión', 'No hay impresoras instaladas');
- return;
- }
- var widget = new local.PrinterSelectionWidget(data);
- widget.get_selection().then(function (new_request) {
- self.emit('request_print', new_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')) {
- instance.web.notification.do_warn('Impresión', 'Ocurrió un error al imprimir: ' + data.printer);
- }
- },
- get_socket_config: function () {
- var url = '/print_engine/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) {
- if (!this.socket || !this.socket.connected) {
- instance.web.notification.do_warn('Impresión', 'La impresora no está preparada');
- return;
- }
-
- instance.web.blockUI();
- try {
- this.socket.emit('request_print', {
- print_directly: this.config.print_directly,
- data: data
- });
- } catch (e) {
- instance.web.unblockUI();
- instance.webclient.crashmanager.show_message(e);
- }
- }
- });
- local.PrinterTopWidget = instance.web.Widget.extend({
- template: 'PrinterTopWidget',
- init: function (parent) {
- this._super(parent);
- }
- });
- local.PrinterUnavailableWidget = instance.web.Widget.extend({
- template: 'PrinterUnavailableWidget',
- events: {
- 'click li': 'on_download'
- },
- init: function (parent) {
- this._super(parent);
- 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');
- },
- 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;
- }
- });
- local.PrinterSelectionWidget = instance.web.Widget.extend({
- template: 'PrinterSelectionWidget',
- events: {
- 'click li': 'on_select'
- },
- printers: [],
- init: function (data) {
- this.id = data.id;
- this.printers = data.printers;
- 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.destroy();
- self.$el.remove();
- }
- });
- local.PdfViewerDialog = instance.web.Widget.extend({
- template: 'PdfViewerDialog',
- events: {
- 'click a.btn': 'on_action'
- },
- init: function (parent, url) {
- this._super(parent);
- var self = this;
- instance.web.blockUI();
- instance.pdfJs.getDocument(url).then(function (pdf) {
- self.pdf = pdf;
- self.set('current_page', -1);
- self.on('change:current_page', self, self.render_page);
- self.render_widget();
- });
- },
- 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.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 () {
- console.log(this);
- console.log('print');
- },
- on_download: function () {
- var self = this;
- if (!self.pdf) {
- return;
- }
- this.pdf.getData().then(function (data) {
- console.log(data);
- var newBlob = new Blob(data, {
- type: 'application/pdf'
- });
- var objUrl = URL.createObjectURL(newBlob);
- var $a = $('a');
- $a.attr('href', objUrl);
- $a.attr('target', '_parent');
- console.log($a);
-
- $a.appendTo(self.$el);
- $a.click();
- $a.remove();
- });
- }
- });
- if (instance.web) {
- if (instance.web.UserMenu) {
- instance.web.UserMenu.include({
- do_update: function () {
- var printer = new local.PrinterTopWidget(this);
- printer.appendTo($('.oe_systray'));
- local.socket_manager = new local.SocketManager();
- 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));
- }
- new local.PdfViewerDialog(self, url);
- return;
- }
- var params = {
- action: JSON.stringify(action),
- token: (new Date()).getTime()
- };
- new local.PdfViewerDialog(self, this.session.url('/web/report', params));
- },
- trigger_download_pdf: function (action) {
- console.log(action);
- },
- ir_actions_report_xml: function (action, options) {
- var self = this;
- var config = instance.print_engine.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 (instance.print_engine.socket_manager.socket.disconnected) {
- var widget = new local.PrinterUnavailableWidget(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;
- }
- var url = '/print_engine/get_pdf';
- var ctx = _.clone(action.context);
- ctx.report_name = action.report_name;
- instance.web.jsonRpc(url, 'call', {
- context: ctx
- }).done(function (result) {
- instance.print_engine.socket_manager.request_print(result.data);
- }).fail(function (e) {
- instance.webclient.crashmanager.show_message(e);
- });
- }
- });
- }
- }
- }
|