Spaces:
Running
Running
| <html lang="fa" dir="rtl"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>نرمافزار مدیریت آزمایشگاه آب و خاک - آزمایشگاه اهواز</title> | |
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css"> | |
| <style> | |
| :root { | |
| --primary-color: #2c3e50; | |
| --secondary-color: #3498db; | |
| --accent-color: #e74c3c; | |
| --success-color: #27ae60; | |
| --warning-color: #f39c12; | |
| --light-color: #ecf0f1; | |
| --dark-color: #2c3e50; | |
| --text-color: #333; | |
| --text-light: #7f8c8d; | |
| --shadow: 0 4px 6px rgba(0, 0, 0, 0.1); | |
| --border-radius: 8px; | |
| --transition: all 0.3s ease; | |
| } | |
| * { | |
| margin: 0; | |
| padding: 0; | |
| box-sizing: border-box; | |
| font-family: 'Vazirmatn', 'IranYekan', 'Tahoma', sans-serif; | |
| } | |
| @font-face { | |
| font-family: 'Vazirmatn'; | |
| src: url('https://cdn.jsdelivr.net/gh/rastikerdar/vazirmatn@v33.003/Vazirmatn-font-face.css'); | |
| } | |
| body { | |
| background-color: #f5f7fa; | |
| color: var(--text-color); | |
| line-height: 1.6; | |
| } | |
| .container { | |
| display: grid; | |
| grid-template-columns: 250px 1fr; | |
| min-height: 100vh; | |
| } | |
| /* Sidebar */ | |
| .sidebar { | |
| background-color: var(--primary-color); | |
| color: white; | |
| padding: 1.5rem; | |
| position: sticky; | |
| top: 0; | |
| height: 100vh; | |
| overflow-y: auto; | |
| } | |
| .sidebar-header { | |
| display: flex; | |
| flex-direction: column; | |
| align-items: center; | |
| margin-bottom: 2rem; | |
| padding-bottom: 1rem; | |
| border-bottom: 1px solid rgba(255, 255, 255, 0.1); | |
| } | |
| .sidebar-header h2 { | |
| font-size: 1.2rem; | |
| margin-top: 0.5rem; | |
| text-align: center; | |
| } | |
| .sidebar-header p { | |
| font-size: 0.8rem; | |
| opacity: 0.8; | |
| text-align: center; | |
| } | |
| .sidebar-menu { | |
| list-style: none; | |
| } | |
| .sidebar-menu li { | |
| margin-bottom: 0.5rem; | |
| } | |
| .sidebar-menu a { | |
| display: flex; | |
| align-items: center; | |
| padding: 0.8rem 1rem; | |
| color: white; | |
| text-decoration: none; | |
| border-radius: var(--border-radius); | |
| transition: var(--transition); | |
| } | |
| .sidebar-menu a:hover, .sidebar-menu a.active { | |
| background-color: rgba(255, 255, 255, 0.1); | |
| } | |
| .sidebar-menu i { | |
| margin-left: 0.8rem; | |
| font-size: 1.1rem; | |
| } | |
| /* Main Content */ | |
| .main-content { | |
| padding: 1.5rem; | |
| background-color: #f5f7fa; | |
| } | |
| .header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: 1.5rem; | |
| padding-bottom: 1rem; | |
| border-bottom: 1px solid #ddd; | |
| } | |
| .header h1 { | |
| font-size: 1.5rem; | |
| color: var(--primary-color); | |
| } | |
| .header-actions { | |
| display: flex; | |
| gap: 1rem; | |
| } | |
| .btn { | |
| padding: 0.5rem 1rem; | |
| border: none; | |
| border-radius: var(--border-radius); | |
| cursor: pointer; | |
| transition: var(--transition); | |
| display: flex; | |
| align-items: center; | |
| gap: 0.5rem; | |
| } | |
| .btn-primary { | |
| background-color: var(--secondary-color); | |
| color: white; | |
| } | |
| .btn-primary:hover { | |
| background-color: #2980b9; | |
| } | |
| .btn-success { | |
| background-color: var(--success-color); | |
| color: white; | |
| } | |
| .btn-success:hover { | |
| background-color: #219653; | |
| } | |
| .btn-warning { | |
| background-color: var(--warning-color); | |
| color: white; | |
| } | |
| .btn-warning:hover { | |
| background-color: #d35400; | |
| } | |
| .btn-danger { | |
| background-color: var(--accent-color); | |
| color: white; | |
| } | |
| .btn-danger:hover { | |
| background-color: #c0392b; | |
| } | |
| .btn-outline { | |
| background-color: transparent; | |
| border: 1px solid var(--secondary-color); | |
| color: var(--secondary-color); | |
| } | |
| .btn-outline:hover { | |
| background-color: rgba(52, 152, 219, 0.1); | |
| } | |
| /* Cards */ | |
| .card { | |
| background-color: white; | |
| border-radius: var(--border-radius); | |
| box-shadow: var(--shadow); | |
| padding: 1.5rem; | |
| margin-bottom: 1.5rem; | |
| } | |
| .card-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: 1rem; | |
| padding-bottom: 1rem; | |
| border-bottom: 1px solid #eee; | |
| } | |
| .card-title { | |
| font-size: 1.2rem; | |
| color: var(--primary-color); | |
| } | |
| /* Dashboard Stats */ | |
| .stats-grid { | |
| display: grid; | |
| grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); | |
| gap: 1.5rem; | |
| margin-bottom: 1.5rem; | |
| } | |
| .stat-card { | |
| background-color: white; | |
| border-radius: var(--border-radius); | |
| box-shadow: var(--shadow); | |
| padding: 1.5rem; | |
| text-align: center; | |
| transition: var(--transition); | |
| } | |
| .stat-card:hover { | |
| transform: translateY(-5px); | |
| box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15); | |
| } | |
| .stat-card i { | |
| font-size: 2rem; | |
| margin-bottom: 0.5rem; | |
| color: var(--secondary-color); | |
| } | |
| .stat-card h3 { | |
| font-size: 2rem; | |
| margin-bottom: 0.5rem; | |
| } | |
| .stat-card p { | |
| color: var(--text-light); | |
| font-size: 0.9rem; | |
| } | |
| /* Sample Table */ | |
| .table-responsive { | |
| overflow-x: auto; | |
| } | |
| table { | |
| width: 100%; | |
| border-collapse: collapse; | |
| } | |
| th, td { | |
| padding: 1rem; | |
| text-align: center; | |
| border-bottom: 1px solid #eee; | |
| } | |
| th { | |
| background-color: var(--light-color); | |
| color: var(--primary-color); | |
| font-weight: 600; | |
| } | |
| tr:hover { | |
| background-color: rgba(52, 152, 219, 0.05); | |
| } | |
| .status-badge { | |
| padding: 0.3rem 0.8rem; | |
| border-radius: 20px; | |
| font-size: 0.8rem; | |
| font-weight: 600; | |
| } | |
| .status-received { | |
| background-color: #fff3cd; | |
| color: #856404; | |
| } | |
| .status-processing { | |
| background-color: #d1ecf1; | |
| color: #0c5460; | |
| } | |
| .status-completed { | |
| background-color: #d4edda; | |
| color: #155724; | |
| } | |
| .status-rejected { | |
| background-color: #f8d7da; | |
| color: #721c24; | |
| } | |
| /* Modal */ | |
| .modal { | |
| display: none; | |
| position: fixed; | |
| z-index: 1000; | |
| left: 0; | |
| top: 0; | |
| width: 100%; | |
| height: 100%; | |
| background-color: rgba(0, 0, 0, 0.5); | |
| } | |
| .modal-content { | |
| background-color: white; | |
| margin: 5% auto; | |
| padding: 2rem; | |
| border-radius: var(--border-radius); | |
| width: 90%; | |
| max-width: 600px; | |
| box-shadow: 0 5px 15px rgba(0, 0, 0, 0.3); | |
| animation: modalopen 0.3s; | |
| } | |
| @keyframes modalopen { | |
| from {opacity: 0; transform: translateY(-50px);} | |
| to {opacity: 1; transform: translateY(0);} | |
| } | |
| .modal-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: 1.5rem; | |
| padding-bottom: 1rem; | |
| border-bottom: 1px solid #eee; | |
| } | |
| .modal-header h2 { | |
| font-size: 1.3rem; | |
| } | |
| .close-btn { | |
| background: none; | |
| border: none; | |
| font-size: 1.5rem; | |
| cursor: pointer; | |
| color: var(--text-light); | |
| } | |
| .modal-body { | |
| margin-bottom: 1.5rem; | |
| } | |
| .form-group { | |
| margin-bottom: 1rem; | |
| } | |
| .form-group label { | |
| display: block; | |
| margin-bottom: 0.5rem; | |
| font-weight: 600; | |
| } | |
| .form-control { | |
| width: 100%; | |
| padding: 0.7rem; | |
| border: 1px solid #ddd; | |
| border-radius: var(--border-radius); | |
| font-size: 1rem; | |
| } | |
| .modal-footer { | |
| display: flex; | |
| justify-content: flex-end; | |
| gap: 1rem; | |
| } | |
| /* Charts */ | |
| .chart-container { | |
| background-color: white; | |
| border-radius: var(--border-radius); | |
| box-shadow: var(--shadow); | |
| padding: 1.5rem; | |
| margin-bottom: 1.5rem; | |
| } | |
| .chart-header { | |
| display: flex; | |
| justify-content: space-between; | |
| align-items: center; | |
| margin-bottom: 1.5rem; | |
| } | |
| .chart-title { | |
| font-size: 1.2rem; | |
| color: var(--primary-color); | |
| } | |
| /* Responsive */ | |
| @media (max-width: 768px) { | |
| .container { | |
| grid-template-columns: 1fr; | |
| } | |
| .sidebar { | |
| position: fixed; | |
| top: 0; | |
| left: -100%; | |
| width: 200px; | |
| height: 100vh; | |
| z-index: 1000; | |
| transition: var(--transition); | |
| } | |
| .sidebar.active { | |
| left: 0; | |
| } | |
| .main-content { | |
| padding: 1rem; | |
| } | |
| .header { | |
| flex-direction: column; | |
| align-items: flex-start; | |
| gap: 1rem; | |
| } | |
| .stats-grid { | |
| grid-template-columns: 1fr; | |
| } | |
| } | |
| /* AnyCoder Link */ | |
| .anycoder-link { | |
| position: fixed; | |
| bottom: 1rem; | |
| left: 1rem; | |
| background-color: var(--primary-color); | |
| color: white; | |
| padding: 0.5rem 1rem; | |
| border-radius: var(--border-radius); | |
| text-decoration: none; | |
| font-size: 0.8rem; | |
| z-index: 1000; | |
| box-shadow: var(--shadow); | |
| } | |
| .anycoder-link:hover { | |
| background-color: #1a252f; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="container"> | |
| <!-- Sidebar --> | |
| <aside class="sidebar"> | |
| <div class="sidebar-header"> | |
| <i class="fas fa-flask fa-2x"></i> | |
| <h2>آزمایشگاه آب و خاک اهواز</h2> | |
| <p>سیستم مدیریت اطلاعات آزمایشگاهی</p> | |
| </div> | |
| <ul class="sidebar-menu"> | |
| <li><a href="#" class="active"><i class="fas fa-home"></i>داشبورد</a></li> | |
| <li><a href="#"><i class="fas fa-vial"></i>نمونهها</a></li> | |
| <li><a href="#"><i class="fas fa-microscope"></i>آزمایشها</a></li> | |
| <li><a href="#"><i class="fas fa-file-alt"></i>گزارشها</a></li> | |
| <li><a href="#"><i class="fas fa-users"></i>کاربران</a></li> | |
| <li><a href="#"><i class="fas fa-cogs"></i>تنظیمات</a></li> | |
| <li><a href="#"><i class="fas fa-chart-line"></i>آمار و نمودار</a></li> | |
| <li><a href="#"><i class="fas fa-calendar-alt"></i>تقویم</a></li> | |
| </ul> | |
| </aside> | |
| <!-- Main Content --> | |
| <main class="main-content"> | |
| <!-- Header --> | |
| <header class="header"> | |
| <h1>داشبورد مدیریت آزمایشگاه</h1> | |
| <div class="header-actions"> | |
| <button class="btn btn-primary"><i class="fas fa-plus"></i>نمونه جدید</button> | |
| <button class="btn btn-outline"><i class="fas fa-sync-alt"></i>بروزرسانی</button> | |
| </div> | |
| </header> | |
| <!-- Stats Cards --> | |
| <div class="stats-grid"> | |
| <div class="stat-card"> | |
| <i class="fas fa-vial"></i> | |
| <h3>1</h3> | |
| <p>کل نمونهها</p> | |
| </div> | |
| <div class="stat-card"> | |
| <i class="fas fa-check-circle"></i> | |
| <h3>2</h3> | |
| <p>آزمایشهای تکمیل شده</p> | |
| </div> | |
| <div class="stat-card"> | |
| <i class="fas fa-file-pdf"></i> | |
| <h3>1</h3> | |
| <p>گزارشهای صادر شده</p> | |
| </div> | |
| <div class="stat-card"> | |
| <i class="fas fa-clock"></i> | |
| <h3>0</h3> | |
| <p>نمونههای در انتظار</p> | |
| </div> | |
| </div> | |
| <!-- Recent Samples --> | |
| <div class="card"> | |
| <div class="card-header"> | |
| <h3 class="card-title">آخرین نمونهها</h3> | |
| <a href="#" class="btn btn-outline">مشاهده همه</a> | |
| </div> | |
| <div class="table-responsive"> | |
| <table> | |
| <thead> | |
| <tr> | |
| <th>شناسه نمونه</th> | |
| <th>نوع</th> | |
| <th>موقعیت</th> | |
| <th>تاریخ جمعآوری</th> | |
| <th>وضعیت</th> | |
| <th>عملیات</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td>SAMPLE_DKH_2025_001</td> | |
| <td>خاک</td> | |
| <td>مزرعه شماره 12 - دهخدا</td> | |
| <td>2025-09-28</td> | |
| <td><span class="status-badge status-received">دریافت شده</span></td> | |
| <td> | |
| <button class="btn btn-success btn-sm"><i class="fas fa-eye"></i></button> | |
| <button class="btn btn-primary btn-sm"><i class="fas fa-edit"></i></button> | |
| <button class="btn btn-danger btn-sm"><i class="fas fa-trash"></i></button> | |
| </td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| <!-- Charts --> | |
| <div class="chart-container"> | |
| <div class="chart-header"> | |
| <h3 class="chart-title">روند پارامترهای خاک</h3> | |
| <div> | |
| <button class="btn btn-outline btn-sm">هفته</button> | |
| <button class="btn btn-outline btn-sm">ماه</button> | |
| <button class="btn btn-outline btn-sm">سال</button> | |
| </div> | |
| </div> | |
| <div style="height: 300px; background-color: #f8f9fa; border-radius: var(--border-radius); display: flex; align-items: center; justify-content: center;"> | |
| <p>نمودار روند پارامترها (pH, EC, N, P, K) در اینجا نمایش داده میشود</p> | |
| </div> | |
| </div> | |
| <!-- Instruments Status --> | |
| <div class="card"> | |
| <div class="card-header"> | |
| <h3 class="card-title">وضعیت دستگاهها</h3> | |
| </div> | |
| <div class="table-responsive"> | |
| <table> | |
| <thead> | |
| <tr> | |
| <th>شناسه</th> | |
| <th>نام دستگاه</th> | |
| <th>نوع</th> | |
| <th>وضعیت</th> | |
| <th>آخرین کالیبراسیون</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| <tr> | |
| <td>I001</td> | |
| <td>EC/pH Meter</td> | |
| <td>رسانایی و pH</td> | |
| <td><span class="status-badge status-completed">فعال</span></td> | |
| <td>2025-08-01</td> | |
| </tr> | |
| <tr> | |
| <td>I002</td> | |
| <td>Spectrophotometer</td> | |
| <td>اسپکتروفتومتر</td> | |
| <td><span class="status-badge status-completed">فعال</span></td> | |
| <td>2025-07-15</td> | |
| </tr> | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| </main> | |
| </div> | |
| <!-- Sample Details Modal --> | |
| <div id="sampleModal" class="modal"> | |
| <div class="modal-content"> | |
| <div class="modal-header"> | |
| <h2>جزئیات نمونه</h2> | |
| <button class="close-btn" onclick="closeModal('sampleModal')">×</button> | |
| </div> | |
| <div class="modal-body"> | |
| <div class="form-group"> | |
| <label>شناسه نمونه</label> | |
| <input type="text" class="form-control" value="SAMPLE_DKH_2025_001" readonly> | |
| </div> | |
| <div class="form-group"> | |
| <label>نوع نمونه</label> | |
| <input type="text" class="form-control" value="خاک" readonly> | |
| </div> | |
| <div class="form-group"> | |
| <label>نام مشتری</label> | |
| <input type="text" class="form-control" value="کشت و صنعت دهخدا" readonly> | |
| </div> | |
| <div class="form-group"> | |
| <label>موقعیت</label> | |
| <input type="text" class="form-control" value="مزرعه شماره 12 - دهخدا" readonly> | |
| </div> | |
| <div class="form-group"> | |
| <label>تاریخ جمعآوری</label> | |
| <input type="text" class="form-control" value="2025-09-28" readonly> | |
| </div> | |
| <div class="form-group"> | |
| <label>وضعیت</label> | |
| <input type="text" class="form-control" value="دریافت شده" readonly> | |
| </div> | |
| </div> | |
| <div class="modal-footer"> | |
| <button class="btn btn-outline" onclick="closeModal('sampleModal')">بستن</button> | |
| <button class="btn btn-primary">ویرایش</button> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- AnyCoder Link --> | |
| <a href="https://huggingface.co/spaces/akhaliq/anycoder" class="anycoder-link" target="_blank"> | |
| <i class="fas fa-code"></i> Built with anycoder | |
| </a> | |
| <script> | |
| // Mobile sidebar toggle | |
| const sidebar = document.querySelector('.sidebar'); | |
| const toggleBtn = document.createElement('button'); | |
| toggleBtn.innerHTML = '<i class="fas fa-bars"></i>'; | |
| toggleBtn.className = 'btn btn-primary'; | |
| toggleBtn.style.position = 'fixed'; | |
| toggleBtn.style.top = '1rem'; | |
| toggleBtn.style.left = '1rem'; | |
| toggleBtn.style.zIndex = '1001'; | |
| toggleBtn.style.display = 'none'; | |
| toggleBtn.onclick = () => sidebar.classList.toggle('active'); | |
| document.body.appendChild(toggleBtn); | |
| // Check screen size and show/hide toggle button | |
| function checkScreenSize() { | |
| if (window.innerWidth <= 768) { | |
| toggleBtn.style.display = 'block'; | |
| sidebar.classList.remove('active'); | |
| } else { | |
| toggleBtn.style.display = 'none'; | |
| sidebar.classList.add('active'); | |
| } | |
| } | |
| window.addEventListener('resize', checkScreenSize); | |
| checkScreenSize(); | |
| // Modal functions | |
| function openModal(modalId) { | |
| document.getElementById(modalId).style.display = 'block'; | |
| } | |
| function closeModal(modalId) { | |
| document.getElementById(modalId).style.display = 'none'; | |
| } | |
| // Close modal when clicking outside | |
| window.onclick = function(event) { | |
| if (event.target.className === 'modal') { | |
| event.target.style.display = 'none'; | |
| } | |
| } | |
| // Sample data for charts (would be implemented with Chart.js in a real app) | |
| const chartData = { | |
| labels: ['فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور'], | |
| datasets: [ | |
| { | |
| label: 'pH', | |
| data: [7.2, 7.3, 7.5, 7.4, 7.6, 7.5], | |
| borderColor: '#3498db', | |
| backgroundColor: 'rgba(52, 152, 219, 0.1)' | |
| }, | |
| { | |
| label: 'EC (µS/cm)', | |
| data: [1100, 1150, 1200, 1180, 1220, 1200], | |
| borderColor: '#e74c3c', | |
| backgroundColor: 'rgba(231, 76, 60, 0.1)' | |
| } | |
| ] | |
| }; | |
| // Initialize dashboard | |
| document.addEventListener('DOMContentLoaded', function() { | |
| // Add event listeners to view buttons | |
| document.querySelectorAll('.btn-success').forEach(btn => { | |
| btn.addEventListener('click', function() { | |
| openModal('sampleModal'); | |
| }); | |
| }); | |
| // Add active class to current page in sidebar | |
| const currentPage = window.location.pathname.split('/').pop(); | |
| document.querySelectorAll('.sidebar-menu a').forEach(link => { | |
| if (link.getAttribute('href') === currentPage) { | |
| link.classList.add('active'); | |
| } | |
| }); | |
| }); | |
| </script> | |
| </body> | |
| </html> |