scanner/frontend/public/index.html
2025-03-23 17:33:43 +01:00

188 lines
5.7 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document Scanner</title>
<style>
body {
font-family: Arial, sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 20px;
}
.container {
display: flex;
flex-direction: column;
gap: 20px;
}
.controls {
display: flex;
gap: 10px;
}
button {
padding: 10px 20px;
border: none;
border-radius: 4px;
background-color: #4285f4;
color: white;
cursor: pointer;
transition: background-color 0.3s;
}
button:hover {
background-color: #3367d6;
}
button:disabled {
background-color: #cccccc;
cursor: not-allowed;
}
.document-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: 20px;
}
.document-card {
border: 1px solid #ddd;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
.document-card img {
width: 100%;
height: 150px;
object-fit: cover;
}
.document-card .info {
padding: 10px;
}
.status {
margin-bottom: 10px;
padding: 10px;
border-radius: 4px;
}
.status.scanning {
background-color: #e6f7ff;
border: 1px solid #91d5ff;
}
.status.idle {
background-color: #f6ffed;
border: 1px solid #b7eb8f;
}
</style>
</head>
<body>
<div class="container">
<h1>Document Scanner</h1>
<div id="status" class="status idle">Scanner is idle</div>
<div class="controls">
<button id="startBtn">Start Scanning</button>
<button id="abortBtn" disabled>Abort Scanning</button>
</div>
<h2>Documents</h2>
<div id="documents" class="document-grid">
<p>No documents scanned yet.</p>
</div>
</div>
<script>
const API_URL = `/api`;
const startBtn = document.getElementById('startBtn');
const abortBtn = document.getElementById('abortBtn');
const statusEl = document.getElementById('status');
const documentsEl = document.getElementById('documents');
function setScannerState(scanning) {
startBtn.disabled = scanning;
abortBtn.disabled = !scanning;
if (scanning) {
statusEl.textContent = 'Scanner is running...';
statusEl.className = 'status scanning';
} else {
statusEl.textContent = 'Scanner is idle';
statusEl.className = 'status idle';
}
}
async function startScanning() {
startBtn.disabled = true;
try {
const response = await fetch(`${API_URL}/scan/start`, {
method: 'POST'
});
} catch (error) {
console.error('Error starting scan:', error);
alert('Failed to connect to scanner service.');
startBtn.disabled = false;
}
}
async function abortScanning() {
abortBtn.disabled = true;
try {
const response = await fetch(`${API_URL}/scan/abort`, {
method: 'POST'
});
} catch (error) {
console.error('Error aborting scan:', error);
alert('Failed to connect to scanner service.');
abortBtn.disabled = false;
}
}
function pollDocuments() {
fetch(`${API_URL}/documents`)
.then(response => response.json())
.then(documents => {
if (documents.length === 0) {
documentsEl.innerHTML = '<p>No documents scanned yet.</p>';
setTimeout(() => {
pollDocuments();
}, 2000);
return;
}
documentsEl.innerHTML = documents.map(doc => `
<div class="document-card">
<img src="${doc.url}" alt="${doc.filename}">
<div class="info">
<h3>${doc.filename}</h3>
</div>
</div>
`).join('');
setTimeout(() => {
pollDocuments();
}, 2000);
})
.catch(error => {
console.error('Error fetching documents:', error);
documentsEl.innerHTML = '<p>Error loading documents.</p>';
});
}
function pollStatus() {
fetch(`${API_URL}/scan/status`)
.then(response => response.json())
.then(data => {
setScannerState(data.isScanning);
setTimeout(() => {
pollStatus();
}, 1000);
});
}
startBtn.addEventListener('click', startScanning);
abortBtn.addEventListener('click', abortScanning);
pollStatus();
pollDocuments();
</script>
</body>
</html>