| <!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> |
|
|