241 lines
9.1 KiB
HTML
241 lines
9.1 KiB
HTML
{% extends "base.html" %}
|
|
|
|
{% block title %}{{ config.APP_NAME }} - Dashboard{% endblock %}
|
|
|
|
{% block content %}
|
|
<!-- Header -->
|
|
<div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom">
|
|
<h1 class="h2" id="mainTitle">
|
|
<i class="fas fa-shield-alt text-primary me-2"></i>
|
|
CVE Dashboard
|
|
</h1>
|
|
|
|
<div class="btn-toolbar mb-2 mb-md-0">
|
|
<div class="btn-group me-2">
|
|
<button type="button" class="btn btn-sm btn-outline-secondary" id="refreshBtn">
|
|
<i class="fas fa-sync-alt"></i> Refresh
|
|
</button>
|
|
{% if config.ENABLE_EXPORT %}
|
|
<button type="button" class="btn btn-sm btn-outline-secondary dropdown-toggle" data-bs-toggle="dropdown">
|
|
<i class="fas fa-download"></i> Export
|
|
</button>
|
|
<ul class="dropdown-menu">
|
|
<li><a class="dropdown-item" href="#" id="exportJSON">Export JSON</a></li>
|
|
<li><a class="dropdown-item" href="#" id="exportCSV">Export CSV</a></li>
|
|
</ul>
|
|
{% endif %}
|
|
</div>
|
|
|
|
{% if config.ENABLE_SEARCH %}
|
|
<button type="button" class="btn btn-sm btn-outline-primary" data-bs-toggle="modal" data-bs-target="#searchModal">
|
|
<i class="fas fa-search"></i> Search
|
|
</button>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Stats Cards -->
|
|
<div class="row mb-4" id="statsCards">
|
|
<div class="col-md-3 col-sm-6 mb-3">
|
|
<div class="card border-primary">
|
|
<div class="card-body">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<div>
|
|
<h6 class="card-subtitle mb-2 text-muted">Total CVEs</h6>
|
|
<h3 class="card-title mb-0" id="statTotal">-</h3>
|
|
</div>
|
|
<div class="fs-1 text-primary"><i class="fas fa-bug"></i></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-3 col-sm-6 mb-3">
|
|
<div class="card border-danger">
|
|
<div class="card-body">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<div>
|
|
<h6 class="card-subtitle mb-2 text-muted">Critical</h6>
|
|
<h3 class="card-title mb-0 text-danger" id="statCritical">-</h3>
|
|
</div>
|
|
<div class="fs-1 text-danger"><i class="fas fa-skull-crossbones"></i></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-3 col-sm-6 mb-3">
|
|
<div class="card border-warning">
|
|
<div class="card-body">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<div>
|
|
<h6 class="card-subtitle mb-2 text-muted">High Risk</h6>
|
|
<h3 class="card-title mb-0 text-warning" id="statHigh">-</h3>
|
|
</div>
|
|
<div class="fs-1 text-warning"><i class="fas fa-exclamation-triangle"></i></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="col-md-3 col-sm-6 mb-3">
|
|
<div class="card border-info">
|
|
<div class="card-body">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<div>
|
|
<h6 class="card-subtitle mb-2 text-muted">This Month</h6>
|
|
<h3 class="card-title mb-0 text-info" id="statMonth">-</h3>
|
|
</div>
|
|
<div class="fs-1 text-info"><i class="fas fa-calendar-alt"></i></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Filters -->
|
|
<div class="card mb-3">
|
|
<div class="card-body">
|
|
<form class="row g-3" id="filterForm">
|
|
<div class="col-md-4">
|
|
<label class="form-label">Severity</label>
|
|
<select class="form-select" id="filterSeverity">
|
|
<option value="">All Severities</option>
|
|
<option value="CRITICAL">Critical</option>
|
|
<option value="HIGH">High</option>
|
|
<option value="MEDIUM">Medium</option>
|
|
<option value="LOW">Low</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-4">
|
|
<label class="form-label">Year</label>
|
|
<select class="form-select" id="filterYear">
|
|
<option value="">All Years</option>
|
|
<option value="2026">2026</option>
|
|
<option value="2025">2025</option>
|
|
<option value="2024">2024</option>
|
|
</select>
|
|
</div>
|
|
<div class="col-md-4 d-flex align-items-end">
|
|
<button type="submit" class="btn btn-primary me-2">
|
|
<i class="fas fa-filter"></i> Apply
|
|
</button>
|
|
<button type="button" class="btn btn-secondary" id="clearFilters">
|
|
<i class="fas fa-times"></i> Clear
|
|
</button>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- CVE Table -->
|
|
<div class="card mb-4">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-list me-2"></i>Vulnerabilities</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<div class="table-responsive">
|
|
<table class="table table-hover" id="cveTable">
|
|
<thead>
|
|
<tr>
|
|
<th>CVE ID</th>
|
|
<th>Severity</th>
|
|
<th>CVSS</th>
|
|
<th>Description</th>
|
|
<th>Published</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody id="cveTableBody">
|
|
<tr>
|
|
<td colspan="5" class="text-center py-4">
|
|
<div class="spinner-border text-primary" role="status"></div>
|
|
<p class="mt-2 text-muted">Loading CVE data...</p>
|
|
</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
<nav id="paginationNav" class="d-none">
|
|
<ul class="pagination justify-content-center mb-0">
|
|
<li class="page-item disabled" id="prevPage">
|
|
<a class="page-link" href="#"><i class="fas fa-chevron-left"></i></a>
|
|
</li>
|
|
<li class="page-item active">
|
|
<span class="page-link" id="currentPage">1</span>
|
|
</li>
|
|
<li class="page-item" id="nextPage">
|
|
<a class="page-link" href="#"><i class="fas fa-chevron-right"></i></a>
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
|
|
{% if config.ENABLE_CHARTS %}
|
|
<!-- Charts -->
|
|
<div class="row mb-4">
|
|
<div class="col-lg-8 mb-3">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-chart-bar me-2"></i>CVE Trend (Last 12 Months)</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<canvas id="trendChart" height="80"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-4 mb-3">
|
|
<div class="card">
|
|
<div class="card-header">
|
|
<h5 class="mb-0"><i class="fas fa-chart-pie me-2"></i>Severity Distribution</h5>
|
|
</div>
|
|
<div class="card-body">
|
|
<canvas id="severityChart"></canvas>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
{% endblock %}
|
|
|
|
{% block modals %}
|
|
<!-- CVE Detail Modal -->
|
|
<div class="modal fade" id="cveModal" tabindex="-1">
|
|
<div class="modal-dialog modal-lg">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title" id="cveModalTitle">CVE Details</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
</div>
|
|
<div class="modal-body" id="cveModalBody"></div>
|
|
<div class="modal-footer">
|
|
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if config.ENABLE_SEARCH %}
|
|
<!-- Search Modal -->
|
|
<div class="modal fade" id="searchModal" tabindex="-1">
|
|
<div class="modal-dialog modal-lg">
|
|
<div class="modal-content">
|
|
<div class="modal-header">
|
|
<h5 class="modal-title">Search CVEs</h5>
|
|
<button type="button" class="btn-close" data-bs-dismiss="modal"></button>
|
|
</div>
|
|
<div class="modal-body">
|
|
<div class="input-group mb-3">
|
|
<input type="text" class="form-control" id="searchInput" placeholder="Search by CVE ID or keyword...">
|
|
<button class="btn btn-primary" id="searchBtn">
|
|
<i class="fas fa-search"></i> Search
|
|
</button>
|
|
</div>
|
|
<div id="searchResults"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
{% endblock %}
|