|
|
<!DOCTYPE html> |
|
|
<html lang="en"> |
|
|
<head> |
|
|
<meta charset="UTF-8"> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> |
|
|
<title>Classification Report</title> |
|
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/min/dropzone.min.js"></script> |
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.9.3/dropzone.min.css"> |
|
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> |
|
|
<style> |
|
|
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap'); |
|
|
|
|
|
:root { |
|
|
--primary-color: #4f46e5; |
|
|
--primary-dark: #4338ca; |
|
|
--success-color: #22c55e; |
|
|
--error-color: #ef4444; |
|
|
--background-color: #1a1a2e; |
|
|
--card-background: rgba(255, 255, 255, 0.1); |
|
|
--text-primary: #ffffff; |
|
|
--text-secondary: #a5b4fc; |
|
|
--border-color: rgba(255, 255, 255, 0.18); |
|
|
} |
|
|
|
|
|
body { |
|
|
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; |
|
|
min-height: 100vh; |
|
|
background: linear-gradient(135deg, #1a1a2e 0%, #16213e 100%); |
|
|
margin: 0; |
|
|
padding: 2rem; |
|
|
color: var(--text-primary); |
|
|
} |
|
|
|
|
|
.container { |
|
|
max-width: 1200px; |
|
|
margin: 0 auto; |
|
|
} |
|
|
|
|
|
.glass-card { |
|
|
background: var(--card-background); |
|
|
backdrop-filter: blur(10px); |
|
|
border-radius: 20px; |
|
|
padding: 2rem; |
|
|
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37); |
|
|
border: 1px solid var(--border-color); |
|
|
} |
|
|
|
|
|
.header { |
|
|
text-align: center; |
|
|
margin-bottom: 2rem; |
|
|
} |
|
|
|
|
|
.header h1 { |
|
|
font-size: 2rem; |
|
|
margin-bottom: 0.5rem; |
|
|
} |
|
|
|
|
|
#summary { |
|
|
background: var(--card-background); |
|
|
padding: 1rem; |
|
|
border-radius: 0.5rem; |
|
|
text-align: center; |
|
|
margin-bottom: 1.5rem; |
|
|
backdrop-filter: blur(5px); |
|
|
} |
|
|
|
|
|
.results-table { |
|
|
width: 100%; |
|
|
border-collapse: collapse; |
|
|
background: var(--card-background); |
|
|
border-radius: 0.5rem; |
|
|
overflow: hidden; |
|
|
} |
|
|
|
|
|
.results-table th, |
|
|
.results-table td { |
|
|
padding: 1rem; |
|
|
text-align: center; |
|
|
border: 1px solid var(--border-color); |
|
|
} |
|
|
|
|
|
.serial { |
|
|
width: 80px; |
|
|
} |
|
|
|
|
|
.image-col { |
|
|
width: 200px; |
|
|
} |
|
|
|
|
|
.result-col { |
|
|
width: 180px; |
|
|
} |
|
|
|
|
|
.labels-col { |
|
|
width: auto; |
|
|
min-width: 150px; |
|
|
} |
|
|
|
|
|
.thumbnail { |
|
|
width: 100px; |
|
|
height: 100px; |
|
|
object-fit: cover; |
|
|
border-radius: 0.5rem; |
|
|
cursor: pointer; |
|
|
} |
|
|
|
|
|
.result-pass, |
|
|
.result-fail { |
|
|
display: inline-block; |
|
|
padding: 0.5rem 1rem; |
|
|
border-radius: 9999px; |
|
|
text-align: center; |
|
|
} |
|
|
|
|
|
.result-pass { |
|
|
background: rgba(34, 197, 94, 0.1); |
|
|
color: var(--success-color); |
|
|
} |
|
|
|
|
|
.result-fail { |
|
|
background: rgba(239, 68, 68, 0.1); |
|
|
color: var(--error-color); |
|
|
} |
|
|
|
|
|
.labels { |
|
|
display: flex; |
|
|
flex-wrap: wrap; |
|
|
gap: 0.5rem; |
|
|
justify-content: center; |
|
|
} |
|
|
|
|
|
.label { |
|
|
display: inline-block; |
|
|
background: rgba(255, 255, 255, 0.1); |
|
|
padding: 0.5rem 1rem; |
|
|
border-radius: 9999px; |
|
|
margin: 0.25rem; |
|
|
color: var(--text-secondary); |
|
|
} |
|
|
|
|
|
.image-modal { |
|
|
display: none; |
|
|
position: fixed; |
|
|
top: 0; |
|
|
left: 0; |
|
|
width: 100%; |
|
|
height: 100%; |
|
|
background: rgba(0, 0, 0, 0.9); |
|
|
z-index: 1000; |
|
|
justify-content: center; |
|
|
align-items: center; |
|
|
} |
|
|
|
|
|
.modal-content { |
|
|
position: relative; |
|
|
max-width: 90%; |
|
|
max-height: 90vh; |
|
|
} |
|
|
|
|
|
.modal-image { |
|
|
max-width: 100%; |
|
|
max-height: 90vh; |
|
|
object-fit: contain; |
|
|
border-radius: 0.5rem; |
|
|
} |
|
|
|
|
|
.modal-close { |
|
|
position: absolute; |
|
|
top: -2rem; |
|
|
right: 0; |
|
|
color: white; |
|
|
font-size: 2rem; |
|
|
cursor: pointer; |
|
|
background: none; |
|
|
border: none; |
|
|
padding: 0.5rem; |
|
|
} |
|
|
|
|
|
#thumbnail-preview-box { |
|
|
display: none; |
|
|
position: absolute; |
|
|
z-index: 9999; |
|
|
background: var(--card-background); |
|
|
border: 1px solid var(--border-color); |
|
|
border-radius: 0.75rem; |
|
|
padding: 1rem; |
|
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.5); |
|
|
max-width: 300px; |
|
|
} |
|
|
|
|
|
#thumbnail-preview-box img { |
|
|
max-width: 100%; |
|
|
border-radius: 0.5rem; |
|
|
display: block; |
|
|
} |
|
|
|
|
|
.filename { |
|
|
margin-top: 0.5rem; |
|
|
font-size: 0.9rem; |
|
|
word-break: break-word; |
|
|
} |
|
|
</style> |
|
|
</head> |
|
|
<body> |
|
|
<div class="container"> |
|
|
<div class="glass-card"> |
|
|
<div class="header"> |
|
|
<h1>Failed Images Report</h1> |
|
|
<p>Date: {date} | Time: {time}</p> |
|
|
</div> |
|
|
|
|
|
<div id="summary"> |
|
|
{summary_content} |
|
|
</div> |
|
|
|
|
|
<div class="results-section"> |
|
|
<table class="results-table" id="results-table"> |
|
|
<thead> |
|
|
<tr> |
|
|
<th class="serial">S.No</th> |
|
|
<th class="image-col">Image</th> |
|
|
<th class="result-col">Result</th> |
|
|
<th class="labels-col">Labels</th> |
|
|
</tr> |
|
|
</thead> |
|
|
<tbody> |
|
|
{table_rows} |
|
|
</tbody> |
|
|
</table> |
|
|
</div> |
|
|
|
|
|
|
|
|
<div class="image-modal" id="image-modal"> |
|
|
<div class="modal-content"> |
|
|
<button class="modal-close"> |
|
|
<i class="fas fa-times"></i> |
|
|
</button> |
|
|
<img class="modal-image" id="modal-image" src="" alt=""> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
</div> |
|
|
|
|
|
<div id="thumbnail-preview-box"> |
|
|
<img id="thumbnail-preview-img" src="" alt=""> |
|
|
</div> |
|
|
|
|
|
<script> |
|
|
document.addEventListener('DOMContentLoaded', function() { |
|
|
|
|
|
const modal = document.getElementById('image-modal'); |
|
|
const modalImg = modal.querySelector('.modal-image'); |
|
|
const closeBtn = modal.querySelector('.modal-close'); |
|
|
|
|
|
|
|
|
closeBtn.onclick = () => modal.style.display = 'none'; |
|
|
modal.onclick = e => { |
|
|
if (e.target === modal) modal.style.display = 'none'; |
|
|
}; |
|
|
|
|
|
|
|
|
document.addEventListener('keydown', e => { |
|
|
if (e.key === 'Escape') modal.style.display = 'none'; |
|
|
}); |
|
|
|
|
|
|
|
|
document.addEventListener('click', function(e) { |
|
|
if (e.target.classList.contains('thumbnail')) { |
|
|
e.preventDefault(); |
|
|
const box = document.getElementById('thumbnail-preview-box'); |
|
|
const img = document.getElementById('thumbnail-preview-img'); |
|
|
img.src = e.target.src; |
|
|
box.style.display = 'block'; |
|
|
box.style.left = (e.pageX + 10) + 'px'; |
|
|
box.style.top = (e.pageY + 10) + 'px'; |
|
|
} else if (!e.target.closest('#thumbnail-preview-box')) { |
|
|
document.getElementById('thumbnail-preview-box').style.display = 'none'; |
|
|
} |
|
|
}); |
|
|
}); |
|
|
</script> |
|
|
</body> |
|
|
</html> |
|
|
|