From 098a6a5ca62821db5fac254522131f0b6840c6c3 Mon Sep 17 00:00:00 2001 From: Scheianu Ionut Date: Wed, 24 Sep 2025 22:04:34 +0300 Subject: [PATCH] almost close to print --- .../static/quality_label_printing_service.zip | Bin 36275 -> 24702 bytes py_app/app/static/script.js | 107 +++++---- py_app/app/templates/print_module.html | 5 +- .../chrome_extension/content.js | 214 +----------------- 4 files changed, 62 insertions(+), 264 deletions(-) diff --git a/py_app/app/static/quality_label_printing_service.zip b/py_app/app/static/quality_label_printing_service.zip index 94425a20c990653c87f0336034f74db48bb97b58..41825fe41c4def6cc80496b6e7b4eb78d8c949d9 100644 GIT binary patch delta 895 zcmdlyo9W*H#?86>&$&0J>eZ`mPLFWo;4@!m5xqM5LeMKl1_l9^$-5I2>uZBg=iN3C z*z;QZTiQ*JC)GVNLB}0=O$w#HUx;?-%&z2~C30eF?7|cK%U8B1sybFoWH@(@=j69C`1>E@nkiP06SEc({GmDjOw5IrbR^<>>P z*2$Y?=f1J9NaUNUWq9I>jpwAFd*-v&|Iwb~cwxi7_Z#*c7vt7yXtK@h6?AzNAQW_A2kD%ykYkAE>D4tdEkKuFdTJ)blCZd13WUx8`no z`hEJ@$FEAi{=WVybN4-)y+3z>O1QOF0?+$x}q!)5z#&>FvC8soc3Y4_GYS=o|m$9Jkz^ zK(3@S8}4hmnV-tCNZ?o{vX95?8joYnY|~fKIhTrl>$uy7bZIWn(EQE6`9pe}B$M~L z%@vK`StghBi|{Z&!IDM>hRK)O>_x8w1qzBX^Gf22Q;W(nlT-ByiVY`kY}aDC%RTvS zyCV|||73*@JEk7d$q5~9ESIE#`X08+Pd?cp$D*zP|o6edptiY)g4ibzhr z-KEEr?>o7#L2~khT9(Ng-3ClGesJ!CDz?eB-C9gy{&1mV-G)q)1K?b-9z!OBKq!}M za!!vH(-|0-ee#YTT_)vVknE&h6DIc%AWLa-L@$qmH!#;^*4>vs#KORk&&j|b4tF*K aLj$8@=;W4OMLsbGF$M!R1_p~LkSqXgz;dnt delta 12516 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 diff --git a/py_app/app/static/script.js b/py_app/app/static/script.js index 11800c8..9bf669e 100644 --- a/py_app/app/static/script.js +++ b/py_app/app/static/script.js @@ -164,17 +164,19 @@ document.addEventListener('DOMContentLoaded', () => { }); // Bind the export functionality to the CSV button - exportCsvButton.addEventListener('click', () => { - const rows = reportTable.querySelectorAll('tr'); - if (rows.length === 0) { - alert('No data available to export.'); - return; - } + if (exportCsvButton) { + exportCsvButton.addEventListener('click', () => { + const rows = reportTable.querySelectorAll('tr'); + if (rows.length === 0) { + alert('No data available to export.'); + return; + } - const reportTitleText = reportTitle.textContent.trim(); - const filename = `${reportTitleText.replace(/\s+/g, '_')}.csv`; // Generate a filename based on the report title - exportTableToCSV(filename); - }); + const reportTitleText = reportTitle.textContent.trim(); + const filename = `${reportTitleText.replace(/\s+/g, '_')}.csv`; // Generate a filename based on the report title + exportTableToCSV(filename); + }); + } // Test Database Button const testDatabaseBtn = document.getElementById('test-database'); @@ -250,10 +252,12 @@ document.addEventListener('DOMContentLoaded', () => { } // Placeholder for PDF export functionality - exportPdfButton.addEventListener('click', () => { - alert('Exporting current report as PDF...'); - // Add logic to export the current report as PDF - }); + if (exportPdfButton) { + exportPdfButton.addEventListener('click', () => { + alert('Exporting current report as PDF...'); + // Add logic to export the current report as PDF + }); + } }); @@ -262,28 +266,32 @@ document.addEventListener('DOMContentLoaded', () => { const createTemplateBtn = document.getElementById('create-template-btn'); // Example: Handle the "Create New Template" button click - createTemplateBtn.addEventListener('click', () => { - window.location.href = '/create_template'; - }); + if (createTemplateBtn) { + createTemplateBtn.addEventListener('click', () => { + window.location.href = '/create_template'; + }); + } // Example: Handle the "Edit" and "Delete" buttons - templateList.addEventListener('click', (event) => { - if (event.target.classList.contains('edit-btn')) { - const templateId = event.target.closest('li').dataset.id; - window.location.href = `/edit_template/${templateId}`; - } else if (event.target.classList.contains('delete-btn')) { - const templateId = event.target.closest('li').dataset.id; - if (confirm('Are you sure you want to delete this template?')) { - fetch(`/delete_template/${templateId}`, { method: 'POST' }) - .then(response => response.text()) - .then(data => { - alert(data); - // Optionally, remove the template from the list - event.target.closest('li').remove(); - }); + if (templateList) { + templateList.addEventListener('click', (event) => { + if (event.target.classList.contains('edit-btn')) { + const templateId = event.target.closest('li').dataset.id; + window.location.href = `/edit_template/${templateId}`; + } else if (event.target.classList.contains('delete-btn')) { + const templateId = event.target.closest('li').dataset.id; + if (confirm('Are you sure you want to delete this template?')) { + fetch(`/delete_template/${templateId}`, { method: 'POST' }) + .then(response => response.text()) + .then(data => { + alert(data); + // Optionally, remove the template from the list + event.target.closest('li').remove(); + }); + } } - } - }); + }); + } }); @@ -291,26 +299,27 @@ document.addEventListener('DOMContentLoaded', () => { const setDimensionsBtn = document.getElementById('set-dimensions-btn'); const labelPreview = document.getElementById('label-preview'); - // Handle setting label dimensions - setDimensionsBtn.addEventListener('click', () => { - const widthInput = document.getElementById('label-width').value; - const heightInput = document.getElementById('label-height').value; + if (setDimensionsBtn) { + setDimensionsBtn.addEventListener('click', () => { + const widthInput = document.getElementById('label-width').value; + const heightInput = document.getElementById('label-height').value; - if (!widthInput || !heightInput) { - alert('Please enter valid dimensions for width and height.'); - return; - } + if (!widthInput || !heightInput) { + alert('Please enter valid dimensions for width and height.'); + return; + } - // Convert mm to pixels (1 mm = 3.779528 pixels) - const widthPixels = parseFloat(widthInput) * 3.779528; - const heightPixels = parseFloat(heightInput) * 3.779528; + // Convert mm to pixels (1 mm = 3.779528 pixels) + const widthPixels = parseFloat(widthInput) * 3.779528; + const heightPixels = parseFloat(heightInput) * 3.779528; - // Set the size of the label container - labelPreview.style.width = `${widthPixels}px`; - labelPreview.style.height = `${heightPixels}px`; + // Set the size of the label container + labelPreview.style.width = `${widthPixels}px`; + labelPreview.style.height = `${heightPixels}px`; - alert(`Label dimensions set to ${widthPixels.toFixed(2)}px x ${heightPixels.toFixed(2)}px.`); - }); + alert(`Label dimensions set to ${widthPixels.toFixed(2)}px x ${heightPixels.toFixed(2)}px.`); + }); + } }); document.addEventListener('DOMContentLoaded', () => { const labelPreview = document.getElementById('label-preview'); diff --git a/py_app/app/templates/print_module.html b/py_app/app/templates/print_module.html index 8b21e4f..8e4bab6 100644 --- a/py_app/app/templates/print_module.html +++ b/py_app/app/templates/print_module.html @@ -860,11 +860,12 @@ async function updatePrintedStatus(orderId) { } // PDF generation handler -// Helper to get extension ID injected by content script +// Helper to get extension ID injected by content script, or fallback to hardcoded value function getInjectedExtensionId() { const el = document.getElementById('chrome-extension-id'); if (el) return el.getAttribute('data-extension-id'); - return null; + // Fallback to hardcoded extension ID if not injected + return 'cifcoidplhgclhcnlcgdkjbaoempjmdl'; } function addPDFGenerationHandler() { diff --git a/windows_print_service/chrome_extension/content.js b/windows_print_service/chrome_extension/content.js index 103d580..772da81 100644 --- a/windows_print_service/chrome_extension/content.js +++ b/windows_print_service/chrome_extension/content.js @@ -25,216 +25,4 @@ injectExtensionId(); console.log('Quality Label Printing Service: Content script loaded'); -// Inject print service API into the page -const printServiceAPI = { - - /** - * Print PDF via the service - */ - async printPDF(printData) { - try { - return new Promise((resolve) => { - chrome.runtime.sendMessage({ - action: 'print_pdf', - data: printData - }, resolve); - }); - } catch (error) { - console.error('Print PDF error:', error); - return { success: false, error: error.message }; - } - }, - - /** - * Silent print PDF - */ - async silentPrint(printData) { - try { - return new Promise((resolve) => { - chrome.runtime.sendMessage({ - action: 'silent_print', - data: printData - }, resolve); - }); - } catch (error) { - console.error('Silent print error:', error); - return { success: false, error: error.message }; - } - }, - - /** - * Get available printers - */ - async getPrinters() { - try { - return new Promise((resolve) => { - chrome.runtime.sendMessage({ - action: 'get_printers' - }, resolve); - }); - } catch (error) { - console.error('Get printers error:', error); - return { success: false, error: error.message, printers: [] }; - } - }, - - /** - * Check service status - */ - async checkService() { - try { - return new Promise((resolve) => { - chrome.runtime.sendMessage({ - action: 'check_service' - }, resolve); - }); - } catch (error) { - console.error('Check service error:', error); - return { success: false, error: error.message }; - } - }, - - /** - * Print labels with Quality Label Printing specific formatting - */ - async printLabels(orderData, quantity = 1) { - try { - // Generate PDF URL for the labels - const pdfUrl = `/generate_labels_pdf/${orderData.order_id}`; - - const printData = { - pdf_url: window.location.origin + pdfUrl, - printer_name: 'default', - copies: 1, - order_id: orderData.order_id, - quantity: quantity, - silent: true - }; - - return await this.silentPrint(printData); - - } catch (error) { - console.error('Print labels error:', error); - return { success: false, error: error.message }; - } - } -}; - -// Make API available globally -window.QualityRecticelPrintService = printServiceAPI; - -// Inject into page context for better compatibility -const script = document.createElement('script'); -script.textContent = ` - // Quality Label Printing Service API - window.QualityRecticelPrintService = ${JSON.stringify(printServiceAPI)}; - - // Enhanced print function for Quality Label Printing - window.printQualityRecticelLabels = async function(orderData, quantity) { - try { - // Get the PDF blob from the server - const response = await fetch('/generate_labels_pdf/' + orderData.order_id, { - method: 'POST', - headers: { 'Content-Type': 'application/json' } - }); - - if (!response.ok) { - throw new Error('Failed to generate PDF'); - } - - const blob = await response.blob(); - - // Convert to base64 - return new Promise((resolve) => { - const reader = new FileReader(); - reader.onloadend = async () => { - const base64Data = reader.result.split(',')[1]; - - const printData = { - pdf_data: base64Data, - printer_name: 'default', - copies: 1, - silent: true - }; - - // Send message to content script - const result = await new Promise((msgResolve) => { - window.postMessage({ - type: 'QUALITY_RECTICEL_PRINT', - action: 'silent_print', - data: printData - }, '*'); - - // Listen for response - const listener = (event) => { - if (event.data.type === 'QUALITY_RECTICEL_PRINT_RESPONSE') { - window.removeEventListener('message', listener); - msgResolve(event.data.result); - } - }; - window.addEventListener('message', listener); - }); - - resolve(result); - }; - reader.readAsDataURL(blob); - }); - - } catch (error) { - console.error('Print Quality Label Printing labels error:', error); - return { success: false, error: error.message }; - } - }; - - console.log('Quality Label Printing Service API injected'); -`; -document.documentElement.appendChild(script); - -// Listen for messages from injected script -window.addEventListener('message', async (event) => { - if (event.source !== window) return; - - if (event.data.type === 'QUALITY_RECTICEL_PRINT') { - try { - let result; - - switch (event.data.action) { - case 'silent_print': - result = await printServiceAPI.silentPrint(event.data.data); - break; - case 'print_pdf': - result = await printServiceAPI.printPDF(event.data.data); - break; - case 'get_printers': - result = await printServiceAPI.getPrinters(); - break; - default: - result = { success: false, error: 'Unknown action' }; - } - - // Send response back - window.postMessage({ - type: 'QUALITY_RECTICEL_PRINT_RESPONSE', - result: result - }, '*'); - - } catch (error) { - window.postMessage({ - type: 'QUALITY_RECTICEL_PRINT_RESPONSE', - result: { success: false, error: error.message } - }, '*'); - } - } -}); - -// Notify page that extension is ready -document.addEventListener('DOMContentLoaded', () => { - window.dispatchEvent(new CustomEvent('QualityRecticelPrintServiceReady', { - detail: { - version: chrome.runtime.getManifest().version, - api: printServiceAPI - } - })); -}); - -console.log('Quality Label Printing Service: Content script initialized'); \ No newline at end of file +// Remove all script injection and messaging. Only inject the extension ID for CSP compatibility. \ No newline at end of file