Jelajahi Sumber

[FIX] some issues for direct printing

Gogs 6 tahun lalu
induk
melakukan
d52ea4c307

+ 1 - 1
__openerp__.py

@@ -12,4 +12,4 @@
     'qweb': [
         'static/src/xml/*.xml'
     ]
-}
+}

+ 1 - 1
controllers/main.py

@@ -16,7 +16,7 @@ class PrintEngineController(http.Controller):
             'host': res_user.tray_host or None,
             'port': res_user.tray_port or None,
             'path': res_user.tray_path or None,
-            'print_directly': res_user.tray_print_direcly or False,
+            'print_directly': res_user.tray_print_directly or False,
             'action_download_pdf': res_user.action_download_pdf or False,
             'action_preview_pdf': res_user.action_preview_pdf or False
         }

+ 17 - 1
models/res_users.py

@@ -7,6 +7,22 @@ class ResUsers(models.Model):
     tray_host = fields.Char(string='Dirección', default='localhost', required=True)
     tray_port = fields.Integer(string='Puerto', default=8070, required=True)
     tray_path = fields.Char(string='Recurso', default='/printers-tray', required=True)
-    tray_print_direcly = fields.Boolean(string='Imprimir directamente', default=True)
+    tray_print_directly = fields.Boolean(string='Imprimir directamente', default=True)
     action_download_pdf = fields.Boolean(string='Permitir descargar PDF', default=False)
     action_preview_pdf = fields.Boolean(string='Previsualizar PDF', default=False)
+
+    @api.one
+    def write(self, values):
+        if values.get('tray_print_directly', False):
+            values['action_download_pdf'] = False
+            values['action_preview_pdf'] = False
+
+        if values.get('action_download_pdf', False):
+            values['tray_print_directly'] = False
+            values['action_preview_pdf'] = False
+
+        if values.get('action_preview_pdf', False):
+            values['tray_print_directly'] = False
+            values['action_download_pdf'] = False
+
+        return super(ResUsers, self).write(values)

File diff ditekan karena terlalu besar
+ 5205 - 0
static/lib/js/html2canvas.js


+ 6 - 2
static/src/css/main.css

@@ -1,6 +1,10 @@
+.printer_status_notificator i {
+    font-size: 1.15em;
+}
+
 #printer-status {
-    width: 5px;
-    height: 5px;
+    width: 6px;
+    height: 6px;
     border-radius: 50%;
     position: absolute;
     top: 25px;

+ 115 - 14
static/src/js/main.js

@@ -1,9 +1,18 @@
 window.pdfjsLib.GlobalWorkerOptions.workerSrc = '/print_engine/static/lib/js/pdf.worker.js';
+
+// Tools
 openerp.pdfJs = window.pdfjsLib || {};
 openerp.printJs = window.printJS || {};
+openerp.html2canvas = window.html2canvas || {};
 
+/**
+ * 
+ * @param {*} instance 
+ * @param {*} local 
+ */
 openerp.print_engine = function (instance, local) {
-    local.SocketManager = instance.web.Class.extend({
+
+    var SocketManager = instance.web.Class.extend({
         init: function () {
             this.socket = null;
             this.start();
@@ -64,7 +73,7 @@ openerp.print_engine = function (instance, local) {
                 return;
             }
 
-            var widget = new local.PrinterSelectionDialog(data);
+            var widget = new PrinterSelectionDialog(data);
             widget.get_selection().then(function (request) {
                 self.emit('request_print', request);
             });
@@ -122,7 +131,7 @@ openerp.print_engine = function (instance, local) {
                     return;
                 }
 
-                new local.PdfViewerDialog(null, pdf);
+                preview_pdf(null, pdf);
             });
         },
         get_socket_config: function () {
@@ -182,7 +191,7 @@ openerp.print_engine = function (instance, local) {
         }
     });
 
-    local.DownloadPrinterTools = instance.web.Widget.extend({
+    var DownloadPrinterTools = instance.web.Widget.extend({
         template: 'DownloadPrinterTools',
         events: {
             'click .download_button': 'handle_download'
@@ -239,7 +248,7 @@ openerp.print_engine = function (instance, local) {
         }
     });
 
-    local.PrinterTopNotificator = instance.web.Widget.extend({
+    var PrinterTopNotificator = instance.web.Widget.extend({
         template: 'PrinterTopNotificator',
         events: {
             'click .printer_status_notificator': 'handle_click'
@@ -251,13 +260,13 @@ openerp.print_engine = function (instance, local) {
             e.preventDefault();
 
             if (local.socket_manager.socket.disconnected) {
-                var widget = new local.DownloadPrinterTools(this);
+                var widget = new DownloadPrinterTools(this);
                 widget.start();
             }
         }
     });
 
-    local.PrinterUnavailableDialog = instance.web.Widget.extend({
+    var PrinterUnavailableDialog = instance.web.Widget.extend({
         template: 'PrinterUnavailableDialog',
         events: {
             'click li': 'on_download'
@@ -295,7 +304,7 @@ openerp.print_engine = function (instance, local) {
         }
     });
 
-    local.PrinterSelectionDialog = instance.web.Widget.extend({
+    var PrinterSelectionDialog = instance.web.Widget.extend({
         template: 'PrinterSelectionDialog',
         events: {
             'click li': 'on_select'
@@ -343,7 +352,7 @@ openerp.print_engine = function (instance, local) {
         }
     });
 
-    local.PdfViewerDialog = instance.web.Widget.extend({
+    var PdfViewerDialog = instance.web.Widget.extend({
         template: 'PdfViewerDialog',
         events: {
             'click a.btn': 'on_action'
@@ -490,7 +499,16 @@ openerp.print_engine = function (instance, local) {
                 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')
                 });
@@ -517,14 +535,97 @@ openerp.print_engine = function (instance, local) {
         }
     });
 
+    var preview_pdf = function (owner, data, name) {
+        new PdfViewerDialog(owner, data, name);
+    };
+
+    var download_pdf = function (source) {
+        var matchMimeType = source.match(/data:[a-zA-Z0-9]+\/[a-zA-Z0-9-.+]+.*,/);
+
+        if (!matchMimeType) {
+            return;
+        }
+
+        if (!source.startsWith(matchMimeType[0])) {
+            return;
+        }
+
+        var a = document.createElement('a');
+
+        a.href = source;
+        a.download = 'documento.pdf';
+        a.target = '_parent';
+        a.click();
+    };
+
+    local.print = function (data) {
+        var config = this.socket_manager.config;
+
+        if (config.is_mobile) {
+            download_pdf(data);
+            return;
+        }
+
+        if (this.socket_manager.socket.disconnected) {
+            if (config.action_download_pdf) {
+                download_pdf(data);
+                return;
+            }
+
+            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);
+    };
+
+    local.TicketTestPage = instance.web.Widget.extend({
+        template: 'TicketTestPage',
+        events: {
+            'click .ticket-test-btn': 'print_test' 
+        },
+        start: function () {
+
+        },
+        print_test: function (e) {
+            e.preventDefault();
+
+            var html = openerp.web.qweb.render('EiruPosTicket');
+            var pdf = new jsPDF({
+                unit: 'mm',
+                format: [290, 70]
+            });
+
+            pdf.fromHTML(html, 0, 0);
+
+            var data = pdf.output('datauristring');
+            local.print(data);
+        }
+    });
+
+    instance.web.client_actions.add('printer.test_ticket', 'instance.print_engine.TicketTestPage');
+
     if (instance.web) {
         if (instance.web.UserMenu) {
             instance.web.UserMenu.include({
                 do_update: function () {
-                    var printer = new local.PrinterTopNotificator(this);
+                    var printer = new PrinterTopNotificator(this);
                     printer.appendTo($('.oe_systray'));
                     
-                    local.socket_manager = new local.SocketManager();
+                    local.socket_manager = new SocketManager();
 
                     return this._super.apply(this, arguments);
                 }
@@ -559,7 +660,7 @@ openerp.print_engine = function (instance, local) {
                             url += '?options=' + encodeURIComponent(JSON.stringify(action.data)) + '&context=' + encodeURIComponent(JSON.stringify(action.context));
                         }
                         
-                        new local.PdfViewerDialog(self, url, action.name);
+                        preview_pdf(self, url, action.name);
                         return;
                     }
                     
@@ -568,7 +669,7 @@ openerp.print_engine = function (instance, local) {
                         token: (new Date()).getTime()
                     };
                     
-                    new local.PdfViewerDialog(self, this.session.url('/web/report', params), action.name);
+                    preview_pdf(self, this.session.url('/web/report', params), action.name);
                 },
                 trigger_download_pdf: function (action) {
                     var regex = /^(?:qweb-(pdf|html)|controller)$/;
@@ -644,7 +745,7 @@ openerp.print_engine = function (instance, local) {
                             return;
                         }
 
-                        var widget = new local.PrinterUnavailableDialog(this);
+                        var widget = new PrinterUnavailableDialog(this);
                         widget.can_download().then(function (can_download) {
                             if (!can_download) {
                                 return;

+ 6 - 1
static/src/xml/main.xml

@@ -8,7 +8,7 @@
             </a>
         </li>
     </t>
-     <t t-name="DownloadPrinterTools">
+    <t t-name="DownloadPrinterTools">
         <div aria-hidden="false" class="modal fade" role="dialog" tabindex="-1">
             <div class="modal-dialog modal-lg">
                 <div class="modal-content openerp">
@@ -148,4 +148,9 @@
             </div>
         </div>
     </t>
+    <t t-name="TicketTestPage">
+        <div class="ticket-test">
+            <button class="ticket-test-btn">Imprimir ticket</button>
+        </div>
+    </t>
 </templates>

+ 8 - 0
templates.xml

@@ -8,9 +8,17 @@
                 <script type="text/javascript" src="/print_engine/static/lib/js/pdf.js" />
                 <script type="text/javascript" src="/print_engine/static/lib/js/pdf.worker.js" />
                 <script type="text/javascript" src="/print_engine/static/lib/js/print.js" />
+                <script type="text/javascript" src="/print_engine/static/lib/js/html2canvas.js" />
                 <script type="text/javascript" src="/print_engine/static/src/js/main.js" />
                 <link rel="stylesheet" href="/print_engine/static/src/css/main.css" />
             </xpath>
         </template>
+
+        <record id="printers_manager_test_ticket" model="ir.actions.client">
+            <field name="name">Pos Ticket Test</field>
+            <field name="tag">printer.test_ticket</field>
+        </record>
+
+        <menuitem id="test_ticket_menu" name="Test Ticket" parent="report.reporting_menuitem" action="printers_manager_test_ticket" />
     </data>
 </openerp>

+ 1 - 1
views/res_user_form.xml

@@ -13,7 +13,7 @@
                                 <field name="tray_host" />
                                 <field name="tray_port" />
                                 <field name="tray_path" />
-                                <field name="tray_print_direcly" />
+                                <field name="tray_print_directly" />
                             </group>
                             <group string="PDF">
                                 <field name="action_download_pdf" />

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini