Updated to print service power shell
This commit is contained in:
261
windows_print_service/chrome_extension/popup.js
Normal file
261
windows_print_service/chrome_extension/popup.js
Normal file
@@ -0,0 +1,261 @@
|
||||
/**
|
||||
* Quality Recticel Print Service - Popup Script
|
||||
* Manages the extension popup interface
|
||||
*/
|
||||
|
||||
document.addEventListener('DOMContentLoaded', async () => {
|
||||
console.log('Popup loaded');
|
||||
|
||||
// Get elements
|
||||
const elements = {
|
||||
loading: document.getElementById('loading'),
|
||||
content: document.getElementById('content'),
|
||||
serviceStatus: document.getElementById('service-status'),
|
||||
statusMessage: document.getElementById('status-message'),
|
||||
statusDetail: document.getElementById('status-detail'),
|
||||
refreshBtn: document.getElementById('refresh-btn'),
|
||||
testPrintBtn: document.getElementById('test-print-btn'),
|
||||
getPrintersBtn: document.getElementById('get-printers-btn'),
|
||||
printersContainer: document.getElementById('printers-container'),
|
||||
printersList: document.getElementById('printers-list'),
|
||||
helpLink: document.getElementById('help-link')
|
||||
};
|
||||
|
||||
// Initialize popup
|
||||
await initializePopup();
|
||||
|
||||
// Event listeners
|
||||
elements.refreshBtn.addEventListener('click', checkServiceStatus);
|
||||
elements.testPrintBtn.addEventListener('click', testPrint);
|
||||
elements.getPrintersBtn.addEventListener('click', getPrinters);
|
||||
elements.helpLink.addEventListener('click', showHelp);
|
||||
|
||||
/**
|
||||
* Initialize popup
|
||||
*/
|
||||
async function initializePopup() {
|
||||
try {
|
||||
await checkServiceStatus();
|
||||
|
||||
// Show content, hide loading
|
||||
elements.loading.classList.add('hidden');
|
||||
elements.content.classList.remove('hidden');
|
||||
|
||||
} catch (error) {
|
||||
console.error('Initialization error:', error);
|
||||
showError('Failed to initialize popup');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check service status
|
||||
*/
|
||||
async function checkServiceStatus() {
|
||||
try {
|
||||
elements.refreshBtn.disabled = true;
|
||||
elements.refreshBtn.textContent = 'Checking...';
|
||||
|
||||
// Send message to background script
|
||||
const result = await new Promise((resolve) => {
|
||||
chrome.runtime.sendMessage({ action: 'check_service' }, resolve);
|
||||
});
|
||||
|
||||
updateServiceStatus(result);
|
||||
|
||||
} catch (error) {
|
||||
console.error('Service check error:', error);
|
||||
showError('Failed to check service status');
|
||||
} finally {
|
||||
elements.refreshBtn.disabled = false;
|
||||
elements.refreshBtn.textContent = 'Refresh Status';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update service status display
|
||||
*/
|
||||
function updateServiceStatus(result) {
|
||||
const statusCard = elements.serviceStatus;
|
||||
const message = elements.statusMessage;
|
||||
const detail = elements.statusDetail;
|
||||
|
||||
if (result && result.success) {
|
||||
// Service is available
|
||||
statusCard.className = 'status-card';
|
||||
message.textContent = 'Service is running normally';
|
||||
detail.textContent = `Last checked: ${new Date().toLocaleTimeString()}`;
|
||||
|
||||
// Enable buttons
|
||||
elements.testPrintBtn.disabled = false;
|
||||
elements.getPrintersBtn.disabled = false;
|
||||
|
||||
} else {
|
||||
// Service is not available
|
||||
statusCard.className = 'status-card error';
|
||||
message.textContent = 'Service is not available';
|
||||
detail.textContent = result ? result.error : 'Unknown error';
|
||||
|
||||
// Disable buttons
|
||||
elements.testPrintBtn.disabled = true;
|
||||
elements.getPrintersBtn.disabled = false; // Keep enabled for diagnostics
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test print functionality
|
||||
*/
|
||||
async function testPrint() {
|
||||
try {
|
||||
elements.testPrintBtn.disabled = true;
|
||||
elements.testPrintBtn.textContent = 'Testing...';
|
||||
|
||||
// Create test PDF data
|
||||
const testPrintData = {
|
||||
pdf_url: 'data:application/pdf;base64,JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKFRlc3QgUGFnZSkKL0NyZWF0b3IgKFF1YWxpdHkgUmVjdGljZWwgUHJpbnQgU2VydmljZSkKL1Byb2R1Y2VyIChRdWFsaXR5IFJlY3RpY2VsKQovQ3JlYXRpb25EYXRlIChEOjIwMjMwMTAxMTIwMDAwKQo+PgplbmRvYmoKMiAwIG9iago8PAovVHlwZSAvQ2F0YWxvZwovUGFnZXMgMyAwIFIKPj4KZW5kb2JqCjMgMCBvYmoKPDwKL1R5cGUgL1BhZ2VzCi9LaWRzIFs0IDAgUl0KL0NvdW50IDEKPJ4KZW5kb2JqCjQgMCBvYmoKPDwKL1R5cGUgL1BhZ2UKL1BhcmVudCAzIDAgUgovTWVkaWFCb3ggWzAgMCA2MTIgNzkyXQovQ29udGVudHMgNSAwIFIKL1Jlc291cmNlcyA8PAovRm9udCA8PAovRjEgNiAwIFIKPj4KPj4KPj4KZW5kb2JqCjUgMCBvYmoKPDwKL0xlbmd0aCA0NAo+PgpzdHJlYW0KQlQKL0YxIDEyIFRmCjEwMCA3MDAgVGQKKFRlc3QgUHJpbnQgUGFnZSkgVGoKRVQKZW5kc3RyZWFtCmVuZG9iago2IDAgb2JqCjw8Ci9UeXBlIC9Gb250Ci9TdWJ0eXBlIC9UeXBlMQovQmFzZUZvbnQgL0hlbHZldGljYQo+PgplbmRvYmoKeHJlZgowIDcKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDA5IDAwMDAwIG4gCjAwMDAwMDAxNDggMDAwMDAgbiAKMDAwMDAwMDE5NSAwMDAwMCBuIAowMDAwMDAwMjUyIDAwMDAwIG4gCjAwMDAwMDA0MTQgMDAwMDAgbiAKMDAwMDAwMDUwOCAwMDAwMCBuIAp0cmFpbGVyCjw8Ci9TaXplIDcKL1Jvb3QgMiAwIFIKL0luZm8gMSAwIFIKPj4Kc3RhcnR4cmVmCjU2NQolJUVPRgo=',
|
||||
printer_name: 'default',
|
||||
copies: 1
|
||||
};
|
||||
|
||||
// Send test print request
|
||||
const result = await new Promise((resolve) => {
|
||||
chrome.runtime.sendMessage({
|
||||
action: 'print_pdf',
|
||||
data: testPrintData
|
||||
}, resolve);
|
||||
});
|
||||
|
||||
if (result && result.success) {
|
||||
showSuccess('Test print sent successfully');
|
||||
} else {
|
||||
showError(result ? result.error : 'Test print failed');
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('Test print error:', error);
|
||||
showError('Test print failed: ' + error.message);
|
||||
} finally {
|
||||
elements.testPrintBtn.disabled = false;
|
||||
elements.testPrintBtn.textContent = 'Test Print';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get available printers
|
||||
*/
|
||||
async function getPrinters() {
|
||||
try {
|
||||
elements.getPrintersBtn.disabled = true;
|
||||
elements.getPrintersBtn.textContent = 'Loading...';
|
||||
|
||||
// Get printers from background script
|
||||
const result = await new Promise((resolve) => {
|
||||
chrome.runtime.sendMessage({ action: 'get_printers' }, resolve);
|
||||
});
|
||||
|
||||
if (result && result.success && result.printers) {
|
||||
displayPrinters(result.printers);
|
||||
} else {
|
||||
showError(result ? result.error : 'Failed to get printers');
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('Get printers error:', error);
|
||||
showError('Failed to get printers: ' + error.message);
|
||||
} finally {
|
||||
elements.getPrintersBtn.disabled = false;
|
||||
elements.getPrintersBtn.textContent = 'Get Printers';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Display printers list
|
||||
*/
|
||||
function displayPrinters(printers) {
|
||||
if (!printers || printers.length === 0) {
|
||||
elements.printersList.innerHTML = '<div style="color: #666; font-style: italic;">No printers found</div>';
|
||||
} else {
|
||||
elements.printersList.innerHTML = printers.map(printer => `
|
||||
<div class="printer-item">
|
||||
<div class="printer-name">${escapeHtml(printer.name)}</div>
|
||||
<div class="printer-details">
|
||||
Driver: ${escapeHtml(printer.driver || 'Unknown')}<br>
|
||||
Port: ${escapeHtml(printer.port || 'Unknown')}
|
||||
</div>
|
||||
</div>
|
||||
`).join('');
|
||||
}
|
||||
|
||||
elements.printersContainer.classList.remove('hidden');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show success message
|
||||
*/
|
||||
function showSuccess(message) {
|
||||
const statusCard = elements.serviceStatus;
|
||||
const statusMessage = elements.statusMessage;
|
||||
const statusDetail = elements.statusDetail;
|
||||
|
||||
statusCard.className = 'status-card';
|
||||
statusMessage.textContent = message;
|
||||
statusDetail.textContent = new Date().toLocaleTimeString();
|
||||
|
||||
// Reset after 3 seconds
|
||||
setTimeout(() => {
|
||||
checkServiceStatus();
|
||||
}, 3000);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show error message
|
||||
*/
|
||||
function showError(message) {
|
||||
const statusCard = elements.serviceStatus;
|
||||
const statusMessage = elements.statusMessage;
|
||||
const statusDetail = elements.statusDetail;
|
||||
|
||||
statusCard.className = 'status-card error';
|
||||
statusMessage.textContent = 'Error: ' + message;
|
||||
statusDetail.textContent = new Date().toLocaleTimeString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Show help information
|
||||
*/
|
||||
function showHelp() {
|
||||
const helpText = `
|
||||
Quality Recticel Print Service Help
|
||||
==================================
|
||||
|
||||
Installation:
|
||||
1. Install the Windows Print Service using install_service.bat
|
||||
2. Install this Chrome extension
|
||||
3. Configure your application to use localhost:8765
|
||||
|
||||
API Endpoints:
|
||||
• http://localhost:8765/health - Service health check
|
||||
• http://localhost:8765/print/pdf - Print PDF files
|
||||
• http://localhost:8765/print/silent - Silent printing
|
||||
• http://localhost:8765/printers - Get available printers
|
||||
|
||||
Troubleshooting:
|
||||
• Ensure Windows service is running
|
||||
• Check firewall settings (port 8765)
|
||||
• Verify Chrome extension permissions
|
||||
• Check service logs: print_service.log
|
||||
|
||||
For support, contact the Quality Recticel development team.
|
||||
`;
|
||||
|
||||
alert(helpText.trim());
|
||||
}
|
||||
|
||||
/**
|
||||
* Escape HTML to prevent XSS
|
||||
*/
|
||||
function escapeHtml(text) {
|
||||
const div = document.createElement('div');
|
||||
div.textContent = text;
|
||||
return div.innerHTML;
|
||||
}
|
||||
});
|
||||
Reference in New Issue
Block a user