updated
This commit is contained in:
@@ -10,7 +10,7 @@
|
||||
|
||||
/* Inserted custom CSS from user */
|
||||
.card.scan-table-card table.print-module-table.scan-table thead th {
|
||||
border-bottom: 2e6 !important;
|
||||
border-bottom: 2px solid #dee2e6 !important;
|
||||
background-color: #f8f9fa !important;
|
||||
padding: 0.25rem 0.4rem !important;
|
||||
text-align: left !important;
|
||||
@@ -602,211 +602,313 @@ function addFallbackPrintHandler() {
|
||||
}
|
||||
}
|
||||
|
||||
// Windows Print Service Integration
|
||||
const PRINT_SERVICE_URL = 'http://localhost:8765';
|
||||
let printServiceAvailable = false;
|
||||
let availablePrinters = [];
|
||||
// SIMPLIFIED CHROME EXTENSION PRINTING - NO WINDOWS SERVICE NEEDED
|
||||
// Extension detection and communication
|
||||
let extensionId = null;
|
||||
let extensionReady = false;
|
||||
|
||||
// Check print service availability on page load
|
||||
// Check extension availability on page load
|
||||
window.addEventListener('DOMContentLoaded', function() {
|
||||
checkPrintServiceAvailability();
|
||||
initializePrinterDropdown();
|
||||
detectExtension();
|
||||
initializePrintButton();
|
||||
});
|
||||
|
||||
function initializePrinterDropdown() {
|
||||
const select = document.getElementById('printer-select');
|
||||
if (!select) return;
|
||||
// Detect Chrome extension
|
||||
function detectExtension() {
|
||||
// Method 1: Try to get extension ID from injected DOM element
|
||||
const extensionElement = document.getElementById('chrome-extension-id');
|
||||
if (extensionElement) {
|
||||
extensionId = extensionElement.getAttribute('data-extension-id');
|
||||
console.log('✅ Extension ID detected from DOM:', extensionId);
|
||||
}
|
||||
|
||||
select.innerHTML = `
|
||||
<option value="default">Default Printer</option>
|
||||
<option value="detecting" disabled>Detecting printers...</option>
|
||||
`;
|
||||
// Method 2: Fallback to hardcoded extension ID
|
||||
if (!extensionId) {
|
||||
extensionId = 'cifcoidplhgclhcnlcgdkjbaoempjmdl'; // Hardcoded fallback
|
||||
console.log('ℹ️ Using fallback extension ID:', extensionId);
|
||||
}
|
||||
|
||||
// Test extension communication
|
||||
if (window.chrome && window.chrome.runtime) {
|
||||
try {
|
||||
chrome.runtime.sendMessage(extensionId, { action: 'ping' }, function(response) {
|
||||
if (chrome.runtime.lastError) {
|
||||
console.warn('❌ Extension not responding:', chrome.runtime.lastError.message);
|
||||
extensionReady = false;
|
||||
} else if (response && response.success) {
|
||||
console.log('✅ Extension ready:', response);
|
||||
extensionReady = true;
|
||||
|
||||
// Try to get available printers from extension
|
||||
loadPrintersFromExtension();
|
||||
} else {
|
||||
console.warn('❌ Extension ping failed:', response);
|
||||
extensionReady = false;
|
||||
}
|
||||
updatePrintButton(extensionReady);
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('❌ Extension communication error:', error);
|
||||
extensionReady = false;
|
||||
updatePrintButton(false);
|
||||
}
|
||||
} else {
|
||||
console.warn('❌ Chrome runtime not available');
|
||||
extensionReady = false;
|
||||
updatePrintButton(false);
|
||||
}
|
||||
}
|
||||
|
||||
async function checkPrintServiceAvailability() {
|
||||
const printerStatus = document.getElementById('printer-status');
|
||||
// Load available printers from extension
|
||||
function loadPrintersFromExtension() {
|
||||
if (!extensionReady) return;
|
||||
|
||||
try {
|
||||
printerStatus.textContent = 'Checking Windows Print Service...';
|
||||
console.log(`🔍 Checking Windows Print Service at: ${PRINT_SERVICE_URL}/health`);
|
||||
|
||||
const response = await fetch(`${PRINT_SERVICE_URL}/health`, {
|
||||
method: 'GET',
|
||||
signal: AbortSignal.timeout(5000)
|
||||
});
|
||||
|
||||
console.log(`📡 Service response status: ${response.status}`);
|
||||
|
||||
if (response.ok) {
|
||||
const data = await response.json();
|
||||
console.log('📋 Service response data:', data);
|
||||
chrome.runtime.sendMessage(extensionId, { action: 'get_printers' }, function(response) {
|
||||
if (chrome.runtime.lastError) {
|
||||
console.warn('Failed to get printers:', chrome.runtime.lastError.message);
|
||||
return;
|
||||
}
|
||||
|
||||
printServiceAvailable = true;
|
||||
console.log('✅ Windows Print Service is available and responding!');
|
||||
updatePrintButtonForService(true);
|
||||
updatePrinterStatus(`Windows Print Service detected (${data.platform || 'Unknown platform'})`);
|
||||
await loadAvailablePrinters();
|
||||
} else {
|
||||
throw new Error(`Service responded with status ${response.status}`);
|
||||
}
|
||||
if (response && response.success && response.printers) {
|
||||
updatePrinterDropdown(response.printers);
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
printServiceAvailable = false;
|
||||
console.error('❌ Windows Print Service check failed:', error);
|
||||
console.log(`🔧 Troubleshooting:
|
||||
1. Is the service running? Check: sc query QualityLabelPrinting
|
||||
2. Is port 8765 accessible? Try: http://localhost:8765/health in new tab
|
||||
3. Service logs: C:\\Program Files\\QualityLabelPrinting\\PrintService\\print_service.log`);
|
||||
|
||||
updatePrintButtonForService(false);
|
||||
updatePrinterStatus(`Windows Print Service not detected - ${error.message}`);
|
||||
console.warn('Error loading printers:', error);
|
||||
}
|
||||
}
|
||||
|
||||
async function loadAvailablePrinters() {
|
||||
try {
|
||||
const response = await fetch(`${PRINT_SERVICE_URL}/printers`);
|
||||
if (response.ok) {
|
||||
const data = await response.json();
|
||||
availablePrinters = data.printers || [];
|
||||
updatePrinterDropdown();
|
||||
updatePrinterStatus(`${availablePrinters.length} printer(s) detected via Windows service`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('Failed to load printers:', error);
|
||||
updatePrinterStatus('Failed to detect printers - using default');
|
||||
}
|
||||
}
|
||||
|
||||
function updatePrinterDropdown() {
|
||||
// Update printer dropdown with available printers
|
||||
function updatePrinterDropdown(printers) {
|
||||
const select = document.getElementById('printer-select');
|
||||
if (!select) return;
|
||||
|
||||
// Clear and rebuild options
|
||||
select.innerHTML = '<option value="default">Default Printer (Recommended)</option>';
|
||||
|
||||
availablePrinters.forEach((printer, index) => {
|
||||
// Add common printer names that users might have
|
||||
const commonPrinters = [
|
||||
'Microsoft Print to PDF',
|
||||
'Brother HL-L2340D',
|
||||
'HP LaserJet',
|
||||
'Canon PIXMA',
|
||||
'Epson WorkForce',
|
||||
'Samsung ML-1640',
|
||||
'Zebra ZP 450'
|
||||
];
|
||||
|
||||
commonPrinters.forEach((printer, index) => {
|
||||
const option = document.createElement('option');
|
||||
option.value = printer.name || printer;
|
||||
option.textContent = `${printer.name || printer}`;
|
||||
if (printer.is_default) {
|
||||
option.textContent += ' (Default)';
|
||||
option.selected = true;
|
||||
}
|
||||
option.value = printer;
|
||||
option.textContent = printer;
|
||||
select.appendChild(option);
|
||||
});
|
||||
|
||||
if (availablePrinters.length === 0) {
|
||||
const option = document.createElement('option');
|
||||
option.value = 'none';
|
||||
option.textContent = 'No printers detected';
|
||||
option.disabled = true;
|
||||
select.appendChild(option);
|
||||
// Add separator
|
||||
const separator = document.createElement('option');
|
||||
separator.disabled = true;
|
||||
separator.textContent = '── System Printers ──';
|
||||
select.appendChild(separator);
|
||||
|
||||
// Add printers from extension response
|
||||
if (printers && printers.length > 0) {
|
||||
printers.forEach((printer, index) => {
|
||||
const option = document.createElement('option');
|
||||
option.value = printer.name || printer;
|
||||
option.textContent = `${printer.display_name || printer.name || printer}`;
|
||||
if (printer.is_default) {
|
||||
option.textContent += ' (System Default)';
|
||||
}
|
||||
select.appendChild(option);
|
||||
});
|
||||
}
|
||||
|
||||
const printerStatus = document.getElementById('printer-status');
|
||||
if (printerStatus && extensionReady) {
|
||||
const totalPrinters = commonPrinters.length + (printers ? printers.length : 0);
|
||||
printerStatus.textContent = `${totalPrinters} printer options available - select one above`;
|
||||
printerStatus.style.color = '#28a745';
|
||||
}
|
||||
}
|
||||
|
||||
function updatePrinterStatus(message) {
|
||||
const status = document.getElementById('printer-status');
|
||||
if (status) {
|
||||
status.textContent = message;
|
||||
// Update print button based on extension availability
|
||||
function updatePrintButton(isExtensionReady) {
|
||||
const printButton = document.getElementById('print-label-btn');
|
||||
const printerStatus = document.getElementById('printer-status');
|
||||
|
||||
if (!printButton) return;
|
||||
|
||||
if (isExtensionReady) {
|
||||
printButton.innerHTML = '🖨️ Print Labels (Windows Service)';
|
||||
printButton.title = 'Send PDF directly to Windows Print Service for silent printing';
|
||||
printButton.style.background = '#28a745'; // Green
|
||||
if (printerStatus) {
|
||||
printerStatus.textContent = 'Chrome extension ready - Windows service mode enabled';
|
||||
printerStatus.style.color = '#28a745';
|
||||
}
|
||||
|
||||
// Update printer selection label for Windows service mode
|
||||
const printerLabel = document.querySelector('label[for="printer-select"]');
|
||||
if (printerLabel) {
|
||||
printerLabel.innerHTML = '🖨️ Select Printer (Windows Service will print directly)';
|
||||
}
|
||||
|
||||
} else {
|
||||
printButton.innerHTML = '📄 Generate PDF';
|
||||
printButton.title = 'Generate PDF for manual printing (Windows Service not available)';
|
||||
printButton.style.background = '#007bff'; // Blue
|
||||
if (printerStatus) {
|
||||
printerStatus.textContent = 'Extension/Service not detected - PDF download mode';
|
||||
printerStatus.style.color = '#6c757d';
|
||||
}
|
||||
|
||||
// Update printer selection label for manual mode
|
||||
const printerLabel = document.querySelector('label[for="printer-select"]');
|
||||
if (printerLabel) {
|
||||
printerLabel.innerHTML = '🖨️ Choose Printer (for reference only)';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Initialize print button functionality
|
||||
function initializePrintButton() {
|
||||
const printButton = document.getElementById('print-label-btn');
|
||||
if (!printButton) return;
|
||||
|
||||
// Remove any existing event listeners
|
||||
const newButton = printButton.cloneNode(true);
|
||||
printButton.parentNode.replaceChild(newButton, printButton);
|
||||
|
||||
newButton.addEventListener('click', async function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
// Get selected order
|
||||
const selectedRow = document.querySelector('.print-module-table tbody tr.selected');
|
||||
if (!selectedRow) {
|
||||
alert('Please select an order first from the table below.');
|
||||
return;
|
||||
}
|
||||
|
||||
const orderId = selectedRow.dataset.orderId;
|
||||
const prodOrder = selectedRow.querySelector('td:nth-child(2)').textContent.trim();
|
||||
const quantity = selectedRow.querySelector('td:nth-child(5)').textContent.trim();
|
||||
|
||||
if (!orderId) {
|
||||
alert('Error: Could not determine order ID.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Show loading state
|
||||
const originalText = newButton.innerHTML;
|
||||
newButton.innerHTML = '⏳ Processing...';
|
||||
newButton.disabled = true;
|
||||
|
||||
try {
|
||||
if (extensionReady) {
|
||||
await printViaExtension(orderId, prodOrder, quantity);
|
||||
} else {
|
||||
await downloadPDFLabels(orderId, prodOrder, quantity);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Print operation failed:', error);
|
||||
alert('❌ Print operation failed: ' + error.message);
|
||||
} finally {
|
||||
newButton.innerHTML = originalText;
|
||||
newButton.disabled = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Print via Chrome extension (communicates with Windows service)
|
||||
async function printViaExtension(orderId, prodOrder, quantity) {
|
||||
try {
|
||||
// Get selected printer from dropdown
|
||||
const selectedPrinter = getSelectedPrinter();
|
||||
console.log(`🖨️ Selected printer for Windows service: ${selectedPrinter}`);
|
||||
|
||||
// Generate PDF first
|
||||
const pdfResponse = await fetch(`/generate_labels_pdf/${orderId}`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' }
|
||||
});
|
||||
|
||||
if (!pdfResponse.ok) {
|
||||
throw new Error('Failed to generate PDF');
|
||||
}
|
||||
|
||||
// Get PDF URL (or construct it)
|
||||
let pdfUrl;
|
||||
try {
|
||||
const data = await pdfResponse.json();
|
||||
pdfUrl = data.pdf_url || `/static/generated_labels/labels_${prodOrder}_qty${quantity}.pdf`;
|
||||
} catch {
|
||||
// If response is not JSON, construct URL
|
||||
pdfUrl = `/static/generated_labels/labels_${prodOrder}_qty${quantity}.pdf`;
|
||||
}
|
||||
|
||||
// Make URL absolute
|
||||
const fullPdfUrl = window.location.origin + pdfUrl;
|
||||
|
||||
// Send to extension which will communicate with Windows service
|
||||
chrome.runtime.sendMessage(extensionId, {
|
||||
action: 'print_pdf',
|
||||
pdfUrl: fullPdfUrl,
|
||||
orderId: orderId,
|
||||
prodOrder: prodOrder,
|
||||
quantity: quantity,
|
||||
printerName: selectedPrinter // Pass selected printer to extension
|
||||
}, function(response) {
|
||||
if (chrome.runtime.lastError) {
|
||||
throw new Error('Extension communication failed: ' + chrome.runtime.lastError.message);
|
||||
}
|
||||
|
||||
if (response && response.success) {
|
||||
const printerInfo = selectedPrinter === 'default' ? 'default printer' : selectedPrinter;
|
||||
let message = `✅ Print job sent to Windows service!\n\n📊 Order: ${prodOrder}\n📦 Quantity: ${quantity} labels\n🖨️ Target Printer: ${printerInfo}\n🔧 Method: ${response.method || 'Windows Print Service'}`;
|
||||
|
||||
if (response.instruction) {
|
||||
message += `\n\n📋 Status: ${response.instruction}`;
|
||||
} else {
|
||||
message += `\n\n📋 The PDF has been sent directly to the printer queue`;
|
||||
}
|
||||
|
||||
alert(message);
|
||||
updatePrintedStatus(orderId);
|
||||
} else if (response && response.fallback) {
|
||||
// Service not available, handle fallback
|
||||
alert(`⚠️ Windows Print Service not available.\n\nError: ${response.error}\n\n📋 Fallback: ${response.instruction}\n\nPlease ensure the Windows Print Service is installed and running.`);
|
||||
// Still try to download PDF as fallback
|
||||
await downloadPDFLabels(orderId, prodOrder, quantity);
|
||||
} else {
|
||||
throw new Error(response?.error || 'Extension print failed');
|
||||
}
|
||||
});
|
||||
|
||||
} catch (error) {
|
||||
console.error('Extension print error:', error);
|
||||
// Fallback to PDF download
|
||||
alert(`❌ Print via Windows service failed.\n\nError: ${error.message}\n\n🔄 Falling back to PDF download for manual printing.`);
|
||||
await downloadPDFLabels(orderId, prodOrder, quantity);
|
||||
}
|
||||
}
|
||||
|
||||
// Helper function to get selected printer
|
||||
function getSelectedPrinter() {
|
||||
const select = document.getElementById('printer-select');
|
||||
return select ? select.value : 'default';
|
||||
}
|
||||
|
||||
function updatePrintButtonForService(serviceAvailable) {
|
||||
const printButton = document.getElementById('print-label-btn');
|
||||
if (!printButton) return;
|
||||
|
||||
if (serviceAvailable) {
|
||||
printButton.innerHTML = '🖨️ Print Labels (Silent)';
|
||||
printButton.title = 'Print labels directly to selected printer using Windows service';
|
||||
printButton.style.background = '#28a745'; // Green for direct print
|
||||
} else {
|
||||
printButton.innerHTML = '📄 Generate PDF';
|
||||
printButton.title = 'Generate PDF for manual printing (Windows service not available)';
|
||||
printButton.style.background = '#007bff'; // Blue for PDF download
|
||||
}
|
||||
}
|
||||
|
||||
// Enhanced print function with Windows service support - NEW SERVER-SIDE APPROACH
|
||||
async function printLabelsWithService(orderId, prodOrder, quantity) {
|
||||
console.log(`🖨️ printLabelsWithService called - Order: ${orderId}, Quantity: ${quantity}`);
|
||||
|
||||
try {
|
||||
// Get selected printer from dropdown
|
||||
const selectedPrinter = getSelectedPrinter();
|
||||
console.log(`🖨️ Selected printer: ${selectedPrinter}`);
|
||||
|
||||
// Use new server-side endpoint that bypasses CORS
|
||||
const printData = {
|
||||
printer_name: selectedPrinter
|
||||
};
|
||||
|
||||
console.log('📋 Print request data:', printData);
|
||||
console.log(`📡 Sending to server endpoint: /print_labels_silent/${orderId}`);
|
||||
|
||||
// Send to Flask server which handles Windows service communication
|
||||
const response = await fetch(`/print_labels_silent/${orderId}`, {
|
||||
method: 'POST',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify(printData)
|
||||
});
|
||||
|
||||
console.log(`📨 Server response status: ${response.status}`);
|
||||
|
||||
const result = await response.json();
|
||||
console.log('📋 Server response data:', result);
|
||||
|
||||
if (response.ok && result.success) {
|
||||
// Success - labels printed silently
|
||||
const printerName = selectedPrinter === 'default' ? 'default printer' : selectedPrinter;
|
||||
console.log(`✅ Print successful to printer: ${printerName}`);
|
||||
|
||||
alert(`✅ Labels printed successfully!\n\n📊 Order: ${prodOrder}\n📦 Quantity: ${quantity} labels\n🖨️ Printer: ${printerName}\n📋 Sequential: ${prodOrder}-001 to ${prodOrder}-${String(quantity).padStart(3, '0')}\n\n🎯 Printed silently via Windows service!`);
|
||||
|
||||
// Update order status in database
|
||||
await updatePrintedStatus(orderId);
|
||||
|
||||
return true;
|
||||
} else if (response.status === 503 && result.fallback === 'pdf_download') {
|
||||
// Windows service not available - inform user and suggest fallback
|
||||
console.warn('⚠️ Windows service not available, showing service setup info');
|
||||
|
||||
alert(`⚠️ Windows Print Service Not Available\n\n${result.error}\n\n📋 To enable silent printing:\n1. Install the Windows Print Service\n2. Start the service: sc start QualityLabelPrinting\n3. Restart your browser\n\n💡 For now, use the "Generate PDF" button for manual printing.`);
|
||||
|
||||
// Mark service as unavailable for this session
|
||||
printServiceAvailable = false;
|
||||
updatePrintButtonForService(false);
|
||||
|
||||
throw new Error('Windows Print Service not available');
|
||||
} else {
|
||||
console.error('❌ Server returned error:', result);
|
||||
throw new Error(result.error || `Print operation failed with status ${response.status}`);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ Server-side print error:', error);
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
// Fallback PDF download function
|
||||
// Fallback: Download PDF for manual printing
|
||||
async function downloadPDFLabels(orderId, prodOrder, quantity) {
|
||||
try {
|
||||
// Generate PDF
|
||||
const response = await fetch(`/generate_labels_pdf/${orderId}`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' }
|
||||
});
|
||||
|
||||
if (!response.ok) {
|
||||
const data = await response.json().catch(() => ({}));
|
||||
throw new Error(data.error || `HTTP ${response.status}`);
|
||||
throw new Error(`HTTP ${response.status}`);
|
||||
}
|
||||
|
||||
// Get filename from response headers
|
||||
@@ -829,10 +931,7 @@ async function downloadPDFLabels(orderId, prodOrder, quantity) {
|
||||
window.URL.revokeObjectURL(url);
|
||||
document.body.removeChild(a);
|
||||
|
||||
// Show success message
|
||||
alert(`📄 PDF downloaded successfully!\n\n📊 Order: ${prodOrder}\n📦 Quantity: ${quantity} labels\n📁 File: ${filename}\n📋 Sequential: ${prodOrder}-001 to ${prodOrder}-${String(quantity).padStart(3, '0')}\n\n➡️ Please print the PDF manually`);
|
||||
|
||||
return true;
|
||||
alert(`📄 PDF downloaded successfully!\n\n📊 Order: ${prodOrder}\n📦 Quantity: ${quantity} labels\n📁 File: ${filename}\n\n➡️ Please print the PDF manually from your Downloads folder.`);
|
||||
|
||||
} catch (error) {
|
||||
console.error('PDF download error:', error);
|
||||
@@ -851,111 +950,13 @@ async function updatePrintedStatus(orderId) {
|
||||
if (response.ok) {
|
||||
// Refresh the orders table
|
||||
setTimeout(() => {
|
||||
document.getElementById('check-db-btn').click();
|
||||
const checkButton = document.getElementById('check-db-btn');
|
||||
if (checkButton) checkButton.click();
|
||||
}, 1000);
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('Failed to update printed status:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// PDF generation handler
|
||||
// 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');
|
||||
// Fallback to hardcoded extension ID if not injected
|
||||
return 'cifcoidplhgclhcnlcgdkjbaoempjmdl';
|
||||
}
|
||||
|
||||
function addPDFGenerationHandler() {
|
||||
const printButton = document.getElementById('print-label-btn');
|
||||
if (!printButton) return;
|
||||
|
||||
printButton.addEventListener('click', async function(e) {
|
||||
e.preventDefault();
|
||||
|
||||
// Get selected order
|
||||
const selectedRow = document.querySelector('.print-module-table tbody tr.selected');
|
||||
if (!selectedRow) {
|
||||
alert('Please select an order first from the table below.');
|
||||
return;
|
||||
}
|
||||
|
||||
const orderId = selectedRow.dataset.orderId;
|
||||
const prodOrder = selectedRow.querySelector('td:nth-child(2)').textContent.trim();
|
||||
const quantity = selectedRow.querySelector('td:nth-child(5)').textContent.trim();
|
||||
if (!orderId) {
|
||||
alert('Error: Could not determine order ID.');
|
||||
return;
|
||||
}
|
||||
|
||||
// Show loading state
|
||||
const originalText = printButton.innerHTML;
|
||||
const originalColor = printButton.style.background;
|
||||
printButton.innerHTML = '⏳ Processing...';
|
||||
printButton.disabled = true;
|
||||
|
||||
try {
|
||||
// Step 1: Generate PDF and get its URL
|
||||
const pdfResponse = await fetch(`/generate_labels_pdf/${orderId}`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' }
|
||||
});
|
||||
if (!pdfResponse.ok) throw new Error('Failed to generate PDF');
|
||||
// Try to get the PDF URL from the response (assume server returns a URL or we can construct it)
|
||||
// If not, fallback to download
|
||||
let pdfUrl = '';
|
||||
try {
|
||||
const data = await pdfResponse.json();
|
||||
pdfUrl = data.pdf_url || '';
|
||||
} catch {
|
||||
// If not JSON, fallback to constructing the URL
|
||||
pdfUrl = `/static/generated_labels/labels_${prodOrder}_${quantity}pcs.pdf`;
|
||||
}
|
||||
|
||||
// Step 2: Prepare print job for Chrome extension
|
||||
const selectedPrinter = getSelectedPrinter();
|
||||
const printJob = {
|
||||
pdfUrl: window.location.origin + pdfUrl,
|
||||
printer: selectedPrinter,
|
||||
orderId: orderId,
|
||||
prodOrder: prodOrder,
|
||||
quantity: quantity
|
||||
};
|
||||
|
||||
// Step 3: Get extension ID from injected DOM
|
||||
const extensionId = getInjectedExtensionId();
|
||||
|
||||
// Step 4: Send message to Chrome extension
|
||||
if (window.chrome && window.chrome.runtime && window.chrome.runtime.sendMessage && extensionId) {
|
||||
window.chrome.runtime.sendMessage(
|
||||
extensionId,
|
||||
{ action: 'print_pdf', ...printJob },
|
||||
function(response) {
|
||||
if (response && response.success) {
|
||||
alert('✅ Labels sent to printer!\nOrder: ' + prodOrder + '\nQuantity: ' + quantity + '\nPrinter: ' + selectedPrinter);
|
||||
updatePrintedStatus(orderId);
|
||||
} else {
|
||||
alert('❌ Failed to print via extension. PDF will be downloaded.');
|
||||
downloadPDFLabels(orderId, prodOrder, quantity);
|
||||
}
|
||||
}
|
||||
);
|
||||
} else {
|
||||
// Fallback: Download PDF
|
||||
alert('ℹ️ Chrome extension not detected or extension ID not injected. PDF will be downloaded.');
|
||||
await downloadPDFLabels(orderId, prodOrder, quantity);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('Print operation failed:', error);
|
||||
alert('❌ Print operation failed: ' + error.message);
|
||||
} finally {
|
||||
printButton.innerHTML = originalText;
|
||||
printButton.style.background = originalColor;
|
||||
printButton.disabled = false;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user