almost close to print
This commit is contained in:
@@ -164,17 +164,19 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Bind the export functionality to the CSV button
|
// Bind the export functionality to the CSV button
|
||||||
exportCsvButton.addEventListener('click', () => {
|
if (exportCsvButton) {
|
||||||
const rows = reportTable.querySelectorAll('tr');
|
exportCsvButton.addEventListener('click', () => {
|
||||||
if (rows.length === 0) {
|
const rows = reportTable.querySelectorAll('tr');
|
||||||
alert('No data available to export.');
|
if (rows.length === 0) {
|
||||||
return;
|
alert('No data available to export.');
|
||||||
}
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const reportTitleText = reportTitle.textContent.trim();
|
const reportTitleText = reportTitle.textContent.trim();
|
||||||
const filename = `${reportTitleText.replace(/\s+/g, '_')}.csv`; // Generate a filename based on the report title
|
const filename = `${reportTitleText.replace(/\s+/g, '_')}.csv`; // Generate a filename based on the report title
|
||||||
exportTableToCSV(filename);
|
exportTableToCSV(filename);
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Test Database Button
|
// Test Database Button
|
||||||
const testDatabaseBtn = document.getElementById('test-database');
|
const testDatabaseBtn = document.getElementById('test-database');
|
||||||
@@ -250,10 +252,12 @@ document.addEventListener('DOMContentLoaded', () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Placeholder for PDF export functionality
|
// Placeholder for PDF export functionality
|
||||||
exportPdfButton.addEventListener('click', () => {
|
if (exportPdfButton) {
|
||||||
alert('Exporting current report as PDF...');
|
exportPdfButton.addEventListener('click', () => {
|
||||||
// Add logic to export the current report as PDF
|
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');
|
const createTemplateBtn = document.getElementById('create-template-btn');
|
||||||
|
|
||||||
// Example: Handle the "Create New Template" button click
|
// Example: Handle the "Create New Template" button click
|
||||||
createTemplateBtn.addEventListener('click', () => {
|
if (createTemplateBtn) {
|
||||||
window.location.href = '/create_template';
|
createTemplateBtn.addEventListener('click', () => {
|
||||||
});
|
window.location.href = '/create_template';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Example: Handle the "Edit" and "Delete" buttons
|
// Example: Handle the "Edit" and "Delete" buttons
|
||||||
templateList.addEventListener('click', (event) => {
|
if (templateList) {
|
||||||
if (event.target.classList.contains('edit-btn')) {
|
templateList.addEventListener('click', (event) => {
|
||||||
const templateId = event.target.closest('li').dataset.id;
|
if (event.target.classList.contains('edit-btn')) {
|
||||||
window.location.href = `/edit_template/${templateId}`;
|
const templateId = event.target.closest('li').dataset.id;
|
||||||
} else if (event.target.classList.contains('delete-btn')) {
|
window.location.href = `/edit_template/${templateId}`;
|
||||||
const templateId = event.target.closest('li').dataset.id;
|
} else if (event.target.classList.contains('delete-btn')) {
|
||||||
if (confirm('Are you sure you want to delete this template?')) {
|
const templateId = event.target.closest('li').dataset.id;
|
||||||
fetch(`/delete_template/${templateId}`, { method: 'POST' })
|
if (confirm('Are you sure you want to delete this template?')) {
|
||||||
.then(response => response.text())
|
fetch(`/delete_template/${templateId}`, { method: 'POST' })
|
||||||
.then(data => {
|
.then(response => response.text())
|
||||||
alert(data);
|
.then(data => {
|
||||||
// Optionally, remove the template from the list
|
alert(data);
|
||||||
event.target.closest('li').remove();
|
// 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 setDimensionsBtn = document.getElementById('set-dimensions-btn');
|
||||||
const labelPreview = document.getElementById('label-preview');
|
const labelPreview = document.getElementById('label-preview');
|
||||||
|
|
||||||
// Handle setting label dimensions
|
if (setDimensionsBtn) {
|
||||||
setDimensionsBtn.addEventListener('click', () => {
|
setDimensionsBtn.addEventListener('click', () => {
|
||||||
const widthInput = document.getElementById('label-width').value;
|
const widthInput = document.getElementById('label-width').value;
|
||||||
const heightInput = document.getElementById('label-height').value;
|
const heightInput = document.getElementById('label-height').value;
|
||||||
|
|
||||||
if (!widthInput || !heightInput) {
|
if (!widthInput || !heightInput) {
|
||||||
alert('Please enter valid dimensions for width and height.');
|
alert('Please enter valid dimensions for width and height.');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Convert mm to pixels (1 mm = 3.779528 pixels)
|
// Convert mm to pixels (1 mm = 3.779528 pixels)
|
||||||
const widthPixels = parseFloat(widthInput) * 3.779528;
|
const widthPixels = parseFloat(widthInput) * 3.779528;
|
||||||
const heightPixels = parseFloat(heightInput) * 3.779528;
|
const heightPixels = parseFloat(heightInput) * 3.779528;
|
||||||
|
|
||||||
// Set the size of the label container
|
// Set the size of the label container
|
||||||
labelPreview.style.width = `${widthPixels}px`;
|
labelPreview.style.width = `${widthPixels}px`;
|
||||||
labelPreview.style.height = `${heightPixels}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', () => {
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
const labelPreview = document.getElementById('label-preview');
|
const labelPreview = document.getElementById('label-preview');
|
||||||
|
|||||||
@@ -860,11 +860,12 @@ async function updatePrintedStatus(orderId) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// PDF generation handler
|
// 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() {
|
function getInjectedExtensionId() {
|
||||||
const el = document.getElementById('chrome-extension-id');
|
const el = document.getElementById('chrome-extension-id');
|
||||||
if (el) return el.getAttribute('data-extension-id');
|
if (el) return el.getAttribute('data-extension-id');
|
||||||
return null;
|
// Fallback to hardcoded extension ID if not injected
|
||||||
|
return 'cifcoidplhgclhcnlcgdkjbaoempjmdl';
|
||||||
}
|
}
|
||||||
|
|
||||||
function addPDFGenerationHandler() {
|
function addPDFGenerationHandler() {
|
||||||
|
|||||||
@@ -25,216 +25,4 @@ injectExtensionId();
|
|||||||
|
|
||||||
console.log('Quality Label Printing Service: Content script loaded');
|
console.log('Quality Label Printing Service: Content script loaded');
|
||||||
|
|
||||||
// Inject print service API into the page
|
// Remove all script injection and messaging. Only inject the extension ID for CSP compatibility.
|
||||||
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');
|
|
||||||
Reference in New Issue
Block a user