feat(frontend,backend): simple navigation bar added
This commit is contained in:
+32
-5
@@ -3,20 +3,47 @@
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Disk Checker</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css"
|
||||
rel="stylesheet">
|
||||
<title>Disk Checker - {% block title %}Home{% endblock %}</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.10.0/font/bootstrap-icons.css">
|
||||
<script src="https://unpkg.com/htmx.org@1.9.10"></script>
|
||||
<link rel="stylesheet" href="/static/css/style.css">
|
||||
{% block extra_css %}{% endblock %}
|
||||
</head>
|
||||
<body>
|
||||
<!-- Navigation Bar -->
|
||||
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
|
||||
<div class="container">
|
||||
<a class="navbar-brand" href="/">Disk Checker</a>
|
||||
<!-- Logo / Brand -->
|
||||
<a class="navbar-brand" href="/">
|
||||
<i class="bi bi-hdd-stack"></i>
|
||||
Disk Checker
|
||||
</a>
|
||||
|
||||
<!-- Mobile toggle -->
|
||||
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarNav">
|
||||
<span class="navbar-toggler-icon"></span>
|
||||
</button>
|
||||
|
||||
<!-- Navigation Tabs -->
|
||||
<div class="collapse navbar-collapse" id="navbarNav">
|
||||
<ul class="navbar-nav">
|
||||
{% for nav_item in navigation %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link {% if active_tab == nav_item.name %}active{% endif %}"
|
||||
href="{{ nav_item.url }}">
|
||||
<i class="bi {{ nav_item.icon }}"></i>
|
||||
{{ nav_item.label }}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<div class="container">
|
||||
<!-- Page Content -->
|
||||
<div class="container mt-4">
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Benchmark{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<h2>Benchmark</h2>
|
||||
<p class="text-muted">Configure and run disk benchmarks.</p>
|
||||
|
||||
<!-- Placeholder content - will be implemented later -->
|
||||
<div class="card">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">Select Drive</h5>
|
||||
<p class="card-text">Choose a drive to benchmark from the list below.</p>
|
||||
|
||||
<!-- Drive selection will go here -->
|
||||
<div id="drive-selector"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
+39
-33
@@ -1,44 +1,50 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Home{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container mt-4">
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<!--Available tools section-->
|
||||
<h2>Available Benchmarking Tools</h2>
|
||||
|
||||
<!--Available tools section-->
|
||||
<h2>Available Benchmarking Tools</h2>
|
||||
|
||||
<!-- Server-side rendered tools -->
|
||||
{% if tools %}
|
||||
<div class="row">
|
||||
{% for tool_name, tool in tools.items() %}
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="card {% if tool.available %}border-success{% else %}border-secondary{% endif %}">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{ tool.name }}</h5>
|
||||
<p class="card-text">
|
||||
{% if tool.available %}
|
||||
<span class="badge bg-success">Available</span>
|
||||
{% if tool.version %}
|
||||
<small class="text-muted">{{ tool.version }}</small>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<span class="badge bg-secondary">Not Installed</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
<!-- Server-side rendered tools -->
|
||||
{% if tools %}
|
||||
<div class="row">
|
||||
{% for tool_name, tool in tools.items() %}
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="card {% if tool.available %}border-success{% else %}border-secondary{% endif %}">
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">{{ tool.name }}</h5>
|
||||
<p class="card-text">
|
||||
{% if tool.available %}
|
||||
<span class="badge bg-success">Available</span>
|
||||
{% if tool.version %}
|
||||
<small class="text-muted">{{ tool.version }}</small>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<span class="badge bg-secondary">Not Installed</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<!--Available drives section-->
|
||||
<h2 class="mt-5">Available Drives</h2>
|
||||
<p class="text-muted">
|
||||
<i class="bi bi-info-circle"></i>
|
||||
Mounted drives are grayed out and cannot be benchmarked.
|
||||
</p>
|
||||
<div id="drives-list" hx-get="/api/v1/drives" hx-trigger="load" hx-target="#drives-content"></div>
|
||||
<div id="drives-content" class="row"></div>
|
||||
<!--Available drives section-->
|
||||
<h2 class="mt-5">Available Drives</h2>
|
||||
<p class="text-muted">
|
||||
<i class="bi bi-info-circle"></i>
|
||||
Mounted drives are grayed out and cannot be benchmarked.
|
||||
</p>
|
||||
<div id="drives-list"
|
||||
hx-get="/api/v1/drives"
|
||||
hx-trigger="load"
|
||||
hx-target="#drives-content"></div>
|
||||
<div id="drives-content" class="row"></div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Job Queue{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
<h2>Job Queue</h2>
|
||||
<p class="text-muted">Monitor and manage benchmark jobs.</p>
|
||||
|
||||
<!-- Jobs list -->
|
||||
<div id="jobs-list"
|
||||
hx-get="/api/v1/jobs"
|
||||
hx-trigger="load"
|
||||
hx-target="#jobs-content">
|
||||
<p>Loading jobs...</p>
|
||||
</div>
|
||||
<div id="jobs-content"></div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block extra_js %}
|
||||
<script>
|
||||
// Load jobs when page loads
|
||||
document.addEventListener('htmx:afterRequest', function(evt) {
|
||||
if (evt.detail.target.id === 'jobs-content') {
|
||||
renderJobs(JSON.parse(evt.detail.xhr.response));
|
||||
}
|
||||
});
|
||||
|
||||
function renderJobs(jobIds) {
|
||||
const container = document.getElementById('jobs-content');
|
||||
container.innerHTML = '';
|
||||
|
||||
if (!jobIds || jobIds.length === 0) {
|
||||
container.innerHTML = '<div class="alert alert-info">No jobs in queue.</div>';
|
||||
return;
|
||||
}
|
||||
|
||||
jobIds.forEach(jobId => {
|
||||
const div = document.createElement('div');
|
||||
div.className = 'card mb-2';
|
||||
div.innerHTML = `
|
||||
<div class="card-body">
|
||||
<h5 class="card-title">${jobId}</h5>
|
||||
<p class="card-text text-muted">Job details will appear here...</p>
|
||||
</div>
|
||||
`;
|
||||
container.appendChild(div);
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user