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