Files
quality_recticel/py_app/app/templates/download_extension.html
2025-09-25 22:26:32 +03:00

418 lines
20 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{% extends "base.html" %}
{% block title %}Quality Recticel Print Service Downloads{% endblock %}
{% block content %}
<div class="container-fluid">
<!-- Header Section -->
<div class="row justify-content-center mb-4">
<div class="col-md-12">
<div class="text-center">
<h1 class="display-4">🖨️ Quality Recticel Print Extension</h1>
<p class="lead">Simple & Robust Chrome Extension for PDF Printing</p>
<div class="alert alert-success mx-auto" style="max-width: 600px;">
<strong>✨ NEW SIMPLIFIED APPROACH:</strong> No Windows service needed! Just install the Chrome extension and print directly from your browser.
</div>
</div>
</div>
</div>
<!-- Overview Card -->
<div class="row justify-content-center mb-4">
<div class="col-md-10">
<div class="card border-primary">
<div class="card-header bg-primary text-white">
<h3 class="mb-0">🚀 Simple Chrome Extension Solution</h3>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h5>🏆 What You Get:</h5>
<ul>
<li><strong>Direct PDF Printing</strong> - Uses browser's print dialog</li>
<li><strong>Zero Configuration</strong> - Works immediately after install</li>
<li><strong>Cross-Platform</strong> - Works on Windows, Mac, Linux</li>
<li><strong>No External Services</strong> - No Windows service needed</li>
<li><strong>Robust Fallback</strong> - Downloads PDF if extension unavailable</li>
</ul>
</div>
<div class="col-md-6">
<h5>🔧 How It Works:</h5>
<ul>
<li>🌐 <strong>Chrome Extension</strong> - Simple browser integration</li>
<li>📄 <strong>Hidden Tab Method</strong> - Opens PDF in background tab</li>
<li><EFBFBD> <strong>Native Print Dialog</strong> - User controls printer selection</li>
<li>🔄 <strong>Auto Cleanup</strong> - Closes tab after printing</li>
<li>🛡️ <strong>Secure</strong> - No external connections required</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Download Cards Row -->
<div class="row justify-content-center">
<!-- Chrome Extension Card - NOW THE ONLY COMPONENT NEEDED -->
<div class="col-md-8 mb-4">
<div class="card h-100 border-success">
<div class="card-header bg-success text-white text-center">
<h4 class="mb-0">🌐 Chrome Extension - All You Need!</h4>
<small>Simple browser-based printing solution</small>
</div>
<div class="card-body d-flex flex-column">
<div class="alert alert-success">
<strong>🎉 SIMPLIFIED:</strong> Just install this Chrome extension - no Windows service needed!
</div>
<h5>🎯 Key Features:</h5>
<ul>
<li><EFBFBD> Opens PDF in hidden browser tab and triggers print dialog</li>
<li>🔍 Automatic extension detection on web page</li>
<li>📊 Print status feedback and error handling</li>
<li>🔄 Graceful fallback to PDF download</li>
<li>⚙️ Works with any printer Chrome can access</li>
<li>🌍 Cross-platform (Windows, Mac, Linux)</li>
</ul>
<h5>🚀 Quick Install (3 steps):</h5>
<ol>
<li>Download and extract the extension files</li>
<li>Open Chrome → <code>chrome://extensions/</code></li>
<li>Enable <strong>"Developer mode"</strong> → Click <strong>"Load unpacked"</strong> → Select folder</li>
</ol>
<div class="text-center mt-auto">
<button class="btn btn-success btn-lg mb-3" id="download-extension-btn">
📥 Download Chrome Extension
</button>
<br>
<small class="text-muted">Extension package (~10KB)</small>
<hr>
<div class="text-center">
<small class="text-muted">Individual files for inspection:</small><br>
<a href="{{ url_for('main.extension_files', filename='manifest.json') }}" target="_blank" class="btn btn-sm btn-outline-secondary">manifest.json</a>
<a href="{{ url_for('main.extension_files', filename='background.js') }}" target="_blank" class="btn btn-sm btn-outline-secondary">background.js</a>
<a href="{{ url_for('main.extension_files', filename='content.js') }}" target="_blank" class="btn btn-sm btn-outline-secondary">content.js</a>
<a href="{{ url_for('main.extension_files', filename='popup.html') }}" target="_blank" class="btn btn-sm btn-outline-secondary">popup.html</a>
<a href="{{ url_for('main.extension_files', filename='popup.js') }}" target="_blank" class="btn btn-sm btn-outline-secondary">popup.js</a>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Documentation Section -->
<div class="row justify-content-center mb-4">
<div class="col-md-10">
<div class="card border-warning">
<div class="card-header bg-warning text-dark">
<h4 class="mb-0">📚 Documentation & Support</h4>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-4">
<div class="card h-100">
<div class="card-header bg-success text-white text-center">
<h6 class="mb-0">⚡ Quick Setup Guide</h6>
</div>
<div class="card-body text-center">
<p class="card-text">2-minute installation guide with visual steps and troubleshooting tips.</p>
<a href="/static/documentation/QUICK_SETUP.md" target="_blank" class="btn btn-success">
📖 Quick Setup
</a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card h-100">
<div class="card-header bg-primary text-white text-center">
<h6 class="mb-0">📋 Complete Guide</h6>
</div>
<div class="card-body text-center">
<p class="card-text">Comprehensive installation documentation with troubleshooting and API reference.</p>
<a href="/static/documentation/INSTALLATION_GUIDE.md" target="_blank" class="btn btn-primary">
📚 Full Documentation
</a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="card h-100">
<div class="card-header bg-info text-white text-center">
<h6 class="mb-0">🛠️ Technical Reference</h6>
</div>
<div class="card-body text-center">
<p class="card-text">Developer documentation with API specs and customization examples.</p>
<a href="/static/documentation/README.md" target="_blank" class="btn btn-info">
🔧 Developer Docs
</a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- System Requirements -->
<div class="row justify-content-center mb-4">
<div class="col-md-10">
<div class="card border-secondary">
<div class="card-header bg-secondary text-white">
<h4 class="mb-0">⚙️ System Requirements & Information</h4>
</div>
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h5>💻 Requirements:</h5>
<ul>
<li><strong>Browser:</strong> Google Chrome (any recent version)</li>
<li><strong>OS:</strong> Windows, Mac, or Linux</li>
<li><strong>Privileges:</strong> None required (standard user)</li>
<li><strong>Internet:</strong> Not required (works offline)</li>
<li><strong>Installation:</strong> Just load extension in Chrome</li>
</ul>
</div>
<div class="col-md-6">
<h5>🔍 How It Works:</h5>
<div class="alert alert-light">
<ol class="mb-0">
<li>🌐 Web page detects Chrome extension</li>
<li>🖨️ <strong>Extension Available</strong> → Green "Print Labels (Extension)" button</li>
<li>📄 <strong>Extension Unavailable</strong> → Blue "Generate PDF" button</li>
<li>🔄 Extension opens PDF in hidden tab → triggers print dialog</li>
<li>✅ User selects printer and confirms → automatic cleanup</li>
</ol>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Action Buttons -->
<div class="row justify-content-center mb-5">
<div class="col-md-10 text-center">
<div class="card border-dark">
<div class="card-body">
<h5>🚀 Ready to Test?</h5>
<p class="text-muted">Installation takes ~2 minutes • Zero maintenance required</p>
<!-- Test Extension Button -->
<div class="alert alert-info">
<h6>🧪 Test the Extension</h6>
<p class="mb-2">After installing the extension, click below to test if the print module detects it correctly:</p>
<button class="btn btn-info mb-2" id="test-extension-btn">
🔍 Test Extension Detection
</button>
<div id="test-results" class="mt-2" style="display: none;"></div>
</div>
<div class="btn-group-vertical btn-group-lg" role="group">
<a href="{{ url_for('main.print_module') }}" class="btn btn-success btn-lg">
🖨️ Go to Print Module
</a>
<button class="btn btn-secondary" onclick="window.close()">
↩️ Close Window
</button>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
// Chrome Extension Download Handler
document.getElementById('download-extension-btn').addEventListener('click', function(e) {
e.preventDefault();
// Show loading state
const originalText = this.innerHTML;
this.innerHTML = '⏳ Preparing Chrome Extension Package...';
this.disabled = true;
// Create the extension package
fetch('/create_extension_package', {method: 'POST'})
.then(response => response.json())
.then(data => {
if (data.success) {
// Start download
window.location.href = data.download_url;
// Show success message
setTimeout(() => {
this.innerHTML = '✅ Download Started!';
}, 500);
// Reset button
setTimeout(() => {
this.innerHTML = originalText;
this.disabled = false;
}, 3000);
} else {
alert('Error creating extension package: ' + data.error);
this.innerHTML = originalText;
this.disabled = false;
}
})
.catch(error => {
alert('Error: ' + error.message);
this.innerHTML = originalText;
this.disabled = false;
});
});
// Extension Test Functionality
document.getElementById('test-extension-btn').addEventListener('click', function(e) {
e.preventDefault();
const testResults = document.getElementById('test-results');
const originalText = this.innerHTML;
this.innerHTML = '🔍 Testing...';
this.disabled = true;
testResults.style.display = 'block';
testResults.innerHTML = '<div class="spinner-border spinner-border-sm" role="status"></div> Checking Chrome extension...';
// Test extension detection (same logic as print module)
testExtensionConnection()
.then(result => {
if (result.success) {
testResults.innerHTML = `
<div class="alert alert-success">
<strong>✅ Extension Test Successful!</strong><br>
Extension ID: ${result.extensionId || 'Detected'}<br>
Version: ${result.version || 'Unknown'}<br>
Status: Ready for printing<br>
<small class="text-muted">The print module will show the green "Print Labels (Extension)" button</small>
</div>
`;
} else {
testResults.innerHTML = `
<div class="alert alert-warning">
<strong>❌ Extension Not Detected</strong><br>
Reason: ${result.error}<br>
<small class="text-muted">
Make sure you've:<br>
1. Downloaded and extracted the extension<br>
2. Loaded it in Chrome at chrome://extensions/<br>
3. Enabled "Developer mode" first<br>
4. Refreshed this page after installation
</small>
</div>
`;
}
})
.catch(error => {
testResults.innerHTML = `
<div class="alert alert-danger">
<strong>❌ Test Failed</strong><br>
Error: ${error.message}<br>
<small class="text-muted">Chrome extension communication failed</small>
</div>
`;
})
.finally(() => {
this.innerHTML = originalText;
this.disabled = false;
});
});
// Test extension connection function
async function testExtensionConnection() {
return new Promise((resolve) => {
// Try to get extension ID from injected DOM element or use fallback
const extensionElement = document.getElementById('chrome-extension-id');
const extensionId = extensionElement ?
extensionElement.getAttribute('data-extension-id') :
'cifcoidplhgclhcnlcgdkjbaoempjmdl'; // Fallback
if (!window.chrome || !window.chrome.runtime) {
resolve({ success: false, error: 'Chrome runtime not available' });
return;
}
try {
chrome.runtime.sendMessage(extensionId, { action: 'ping' }, function(response) {
if (chrome.runtime.lastError) {
resolve({
success: false,
error: chrome.runtime.lastError.message,
extensionId: extensionId
});
} else if (response && response.success) {
resolve({
success: true,
extensionId: extensionId,
version: response.extension_version,
message: response.message
});
} else {
resolve({
success: false,
error: 'Extension ping failed - no response',
extensionId: extensionId
});
}
});
} catch (error) {
resolve({
success: false,
error: 'Exception: ' + error.message,
extensionId: extensionId
});
}
});
}
// Show installation tips
function showInstallationTips() {
const tips = [
'💡 Tip: This new approach is much simpler - no Windows service needed!',
'💡 Tip: The extension works on Windows, Mac, and Linux',
'💡 Tip: Users will see Chrome\'s print dialog for printer selection',
'💡 Tip: The system gracefully falls back to PDF downloads if needed'
];
let tipIndex = 0;
const tipContainer = document.createElement('div');
tipContainer.className = 'alert alert-info position-fixed';
tipContainer.style.cssText = 'bottom: 20px; right: 20px; max-width: 300px; z-index: 1000;';
function showNextTip() {
if (tipIndex < tips.length) {
tipContainer.innerHTML = `
<button type="button" class="btn-close float-end" onclick="this.parentElement.remove()"></button>
${tips[tipIndex]}
`;
if (!document.body.contains(tipContainer)) {
document.body.appendChild(tipContainer);
}
tipIndex++;
setTimeout(showNextTip, 8000); // Show next tip after 8 seconds
} else {
setTimeout(() => {
if (document.body.contains(tipContainer)) {
tipContainer.remove();
}
}, 5000);
}
}
// Start showing tips after 3 seconds
setTimeout(showNextTip, 3000);
}
// Initialize tips when page loads
document.addEventListener('DOMContentLoaded', showInstallationTips);
</script>
{% endblock %}