Spaces:
Sleeping
Sleeping
| {% extends "base_layout.html" %} | |
| {% block title %}Dashboard - InterroGen{% endblock %} | |
| {% block head_extra %} | |
| <style> | |
| .stats-card { | |
| text-align: center; | |
| padding: 1.5rem; | |
| } | |
| .stats-card i { | |
| font-size: 2rem; | |
| margin-bottom: 1rem; | |
| } | |
| .stats-number { | |
| font-size: 2rem; | |
| font-weight: 700; | |
| margin-bottom: 0.5rem; | |
| } | |
| .stats-label { | |
| color: var(--text-muted); | |
| font-size: 0.875rem; | |
| } | |
| .region-badge { | |
| display: inline-block; | |
| font-size: 0.75rem; | |
| padding: 0.25rem 0.5rem; | |
| border-radius: 0.25rem; | |
| margin-right: 0.5rem; | |
| margin-bottom: 0.5rem; | |
| background-color: rgba(63, 106, 216, 0.1); | |
| color: var(--primary); | |
| } | |
| .region-card { | |
| cursor: pointer; | |
| transition: all 0.2s; | |
| } | |
| .region-card:hover { | |
| transform: translateY(-3px); | |
| box-shadow: 0 0.5rem 1rem rgba(0,0,0,0.08); | |
| } | |
| .table-card { | |
| overflow: hidden; | |
| } | |
| .case-status { | |
| display: inline-block; | |
| padding: 0.25rem 0.5rem; | |
| border-radius: 0.25rem; | |
| font-size: 0.75rem; | |
| font-weight: 600; | |
| } | |
| .status-active { | |
| background-color: rgba(22, 170, 255, 0.1); | |
| color: var(--info); | |
| } | |
| .status-completed { | |
| background-color: rgba(58, 196, 125, 0.1); | |
| color: var(--success); | |
| } | |
| .status-pending { | |
| background-color: rgba(247, 185, 36, 0.1); | |
| color: var(--warning); | |
| } | |
| .case-row { | |
| cursor: pointer; | |
| transition: background-color 0.15s; | |
| } | |
| .case-row:hover { | |
| background-color: rgba(63, 106, 216, 0.05); | |
| } | |
| .progress { | |
| height: 0.5rem; | |
| border-radius: 0.25rem; | |
| } | |
| .chart-bar { | |
| height: 0.5rem; | |
| background-color: var(--primary); | |
| border-radius: 0.25rem; | |
| /* animation: fillUp 1s ease-out forwards; */ /* Animation can be added if desired */ | |
| } | |
| .chart-container { | |
| margin-top: 1rem; | |
| width: 100%; | |
| } | |
| .chart-label { | |
| display: flex; | |
| justify-content: space-between; | |
| margin-bottom: 0.25rem; | |
| font-size: 0.75rem; | |
| } | |
| .region-icon { | |
| width: 2.5rem; | |
| height: 2.5rem; | |
| border-radius: 50%; | |
| background-color: rgba(63, 106, 216, 0.1); | |
| color: var(--primary); | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| font-size: 1.25rem; | |
| margin-bottom: 0.75rem; | |
| } | |
| </style> | |
| {% endblock %} | |
| {% block page_content %} | |
| <div class="heading-container"> | |
| <h1 class="h3">Dashboard</h1> | |
| <div class="btn-group" role="group" aria-label="Time period"> | |
| <button type="button" class="btn btn-outline-secondary">Day</button> | |
| <button type="button" class="btn btn-outline-secondary active">Week</button> | |
| <button type="button" class="btn btn-outline-secondary">Month</button> | |
| <button type="button" class="btn btn-outline-secondary">Year</button> | |
| </div> | |
| </div> | |
| <!-- Stats row --> | |
| <div class="row"> | |
| <div class="col-md-3"> | |
| <div class="card stats-card"> | |
| <div class="text-primary"> | |
| <i class="bi bi-folder2-open"></i> | |
| </div> | |
| <div class="stats-number">{{ active_cases_count | default("0") }}</div> | |
| <div class="stats-label">Active Cases</div> | |
| </div> | |
| </div> | |
| <div class="col-md-3"> | |
| <div class="card stats-card"> | |
| <div class="text-info"> | |
| <i class="bi bi-chat-square-text"></i> | |
| </div> | |
| <div class="stats-number">{{ total_interrogations | default("0") }}</div> | |
| <div class="stats-label">Interrogations</div> | |
| </div> | |
| </div> | |
| <div class="col-md-3"> | |
| <div class="card stats-card"> | |
| <div class="text-success"> | |
| <i class="bi bi-file-earmark-check"></i> | |
| </div> | |
| <div class="stats-number">{{ completed_reports_count | default("0") }}</div> | |
| <div class="stats-label">Completed Reports</div> | |
| </div> | |
| </div> | |
| <div class="col-md-3"> | |
| <div class="card stats-card"> | |
| <div class="text-warning"> | |
| <i class="bi bi-clock-history"></i> | |
| </div> | |
| <div class="stats-number">{{ resolution_rate | default("N/A") }}</div> | |
| <div class="stats-label">Case Resolution Rate</div> | |
| </div> | |
| </div> | |
| </div> | |
| <!-- Recent cases and regional guidelines --> | |
| <div class="row"> | |
| <div class="col-lg-8"> | |
| <div class="card table-card"> | |
| <div class="card-header"> | |
| Recent Cases | |
| </div> | |
| <div class="card-body p-0"> | |
| <div class="table-responsive"> | |
| <table class="table table-hover mb-0"> | |
| <thead> | |
| <tr> | |
| <th>Case ID</th> | |
| <th>Suspect</th> | |
| <th>Type</th> | |
| <th>Status</th> | |
| <th>Last Update</th> | |
| <th>Action</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| {% if recent_cases %} | |
| {% for case in recent_cases %} | |
| <tr class="case-row" onclick="window.location=\'{{ url_for('view_case', case_id=case.id) }}\';"> | |
| <td>{{ case.case_id_display }}</td> | |
| <td>{{ case.suspect_name }}</td> | |
| <td>{{ case.case_type }}</td> | |
| <td><span class="case-status status-{{ case.status.value.lower() }}">{{ case.status.value }}</span></td> | |
| <td>{{ case.updated_at.strftime("%Y-%m-%d %H:%M") }}</td> | |
| <td><a href="{{ url_for("view_case", case_id=case.id) }}" class="btn btn-sm btn-outline-primary">View</a></td> | |
| </tr> | |
| {% endfor %} | |
| {% else %} | |
| <tr> | |
| <td colspan="6" class="text-center text-muted py-4">No recent cases found.</td> | |
| </tr> | |
| {% endif %} | |
| </tbody> | |
| </table> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| <div class="col-lg-4"> | |
| <div class="card"> | |
| <div class="card-header"> | |
| Regional Guidelines Overview | |
| </div> | |
| <div class="card-body"> | |
| {% if countries %} | |
| {% for country in countries | sort(attribute='name') | list | batch(3) %} | |
| <div class="row mb-2"> | |
| {% for c_item in country %} | |
| <div class="col-4"> | |
| <a href="{{ url_for('regional_guidelines_page', country_id=c_item.id) }}" class="text-decoration-none"> | |
| <div class="region-card p-2 text-center border rounded"> | |
| <div class="region-icon"><i class="bi bi-geo-alt-fill"></i></div> | |
| <small>{{ c_item.name }}</small> | |
| </div> | |
| </a> | |
| </div> | |
| {% endfor %} | |
| </div> | |
| {% endfor %} | |
| <a href="{{ url_for('regional_guidelines_page') }}" class="btn btn-sm btn-outline-primary mt-2">View All Guidelines</a> | |
| {% else %} | |
| <p class="text-muted">No countries configured for regional guidelines.</p> | |
| {% endif %} | |
| </div> | |
| </div> | |
| <div class="card"> | |
| <div class="card-header"> | |
| Quick Actions | |
| </div> | |
| <div class="card-body"> | |
| <a href="{{ url_for('manage_cases', action='new') }}" class="btn btn-primary w-100 mb-2"> <i class="bi bi-plus-circle-fill me-2"></i>New Case</a> | |
| <a href="{{ url_for('reports_list_page') }}" class="btn btn-outline-secondary w-100 mb-2"><i class="bi bi-search me-2"></i>Find Report</a> | |
| <a href="{{ url_for('interrogations_page') }}" class="btn btn-outline-secondary w-100"><i class="bi bi-mic-fill me-2"></i>Start Interrogation</a> | |
| </div> | |
| </div> | |
| </div> | |
| </div> | |
| {% endblock %} | |
| {% block scripts %} | |
| <script> | |
| // Add any dashboard specific JS here if needed | |
| console.log("Dashboard loaded"); | |
| </script> | |
| {% endblock %} | |