Add download and upload to the sidebar, along with mocks

This commit is contained in:
Eli Ribble 2026-02-17 17:29:15 +00:00
parent 61737d0288
commit e5b6135e44
No known key found for this signature in database
6 changed files with 398 additions and 0 deletions

View file

@ -32,6 +32,17 @@
<span class="menu-text ms-2">Admin</span>
</a>
</li>
<li>
<a
href="/download"
data-bs-toggle="tooltip"
data-bs-placement="right"
title="Upload"
>
<div class="menu-icon"><i class="bi bi-download"></i></div>
<span class="menu-text ms-2">Download</span>
</a>
</li>
<li>
<a
href="/notification"
@ -110,6 +121,17 @@
<span class="menu-text ms-2">Settings</span>
</a>
</li>
<li>
<a
href="/upload"
data-bs-toggle="tooltip"
data-bs-placement="right"
title="Upload"
>
<div class="menu-icon"><i class="bi bi-upload"></i></div>
<span class="menu-text ms-2">Upload</span>
</a>
</li>
<li>
<a
href="#"

View file

@ -0,0 +1,174 @@
{{ template "sync/layout/authenticated.html" . }}
{{ define "title" }}Downloads{{ end }}
{{ define "extraheader" }}
<style>
.report-card {
transition: all 0.3s;
border-radius: 10px;
}
.report-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
}
.card-header {
border-radius: 10px 10px 0 0 !important;
}
.report-item {
padding: 12px;
border-left: 4px solid transparent;
transition: all 0.2s;
}
.report-item:hover {
background-color: rgba(0, 0, 0, 0.05);
border-left: 4px solid #0d6efd;
}
body {
background-color: #f8f9fa;
}
</style>
{{ end }}
{{ define "content" }}
<div class="container py-5">
<div class="row g-4">
<!-- Technician Supervision -->
<div class="col-lg-4">
<div class="card h-100 border-0 shadow-sm report-card">
<div class="card-header bg-primary text-white py-3">
<h3 class="mb-0">
<i class="bi bi-person-workspace me-2"></i>Technician Supervision
</h3>
</div>
<div class="card-body">
<div class="report-item d-flex align-items-center">
<i class="bi bi-activity fs-4 me-3 text-primary"></i>
<div>
<h5 class="mb-0">Recent Activity</h5>
<p class="text-muted small mb-0">Activity logs by technician</p>
</div>
<a href="#" class="btn btn-sm btn-outline-primary ms-auto"
><i class="bi bi-download"></i
></a>
</div>
<div class="report-item d-flex align-items-center">
<i class="bi bi-map fs-4 me-3 text-primary"></i>
<div>
<h5 class="mb-0">Coverage Maps</h5>
<p class="text-muted small mb-0">Area coverage by region</p>
</div>
<a href="#" class="btn btn-sm btn-outline-primary ms-auto"
><i class="bi bi-download"></i
></a>
</div>
<div class="report-item d-flex align-items-center">
<i class="bi bi-graph-up fs-4 me-3 text-primary"></i>
<div>
<h5 class="mb-0">Performance</h5>
<p class="text-muted small mb-0">
Staff evaluations and metrics
</p>
</div>
<a href="#" class="btn btn-sm btn-outline-primary ms-auto"
><i class="bi bi-download"></i
></a>
</div>
</div>
</div>
</div>
<!-- Inventory Management -->
<div class="col-lg-4">
<div class="card h-100 border-0 shadow-sm report-card">
<div class="card-header bg-success text-white py-3">
<h3 class="mb-0">
<i class="bi bi-boxes me-2"></i>Inventory Management
</h3>
</div>
<div class="card-body">
<div class="report-item d-flex align-items-center">
<i class="bi bi-cart-check fs-4 me-3 text-success"></i>
<div>
<h5 class="mb-0">Recent Orders</h5>
<p class="text-muted small mb-0">
Purchase orders and deliveries
</p>
</div>
<a href="#" class="btn btn-sm btn-outline-success ms-auto"
><i class="bi bi-download"></i
></a>
</div>
<div class="report-item d-flex align-items-center">
<i class="bi bi-box-seam fs-4 me-3 text-success"></i>
<div>
<h5 class="mb-0">Current Stock</h5>
<p class="text-muted small mb-0">Inventory levels and status</p>
</div>
<a href="#" class="btn btn-sm btn-outline-success ms-auto"
><i class="bi bi-download"></i
></a>
</div>
<div class="report-item d-flex align-items-center">
<i class="bi bi-bar-chart-line fs-4 me-3 text-success"></i>
<div>
<h5 class="mb-0">Usage Rates</h5>
<p class="text-muted small mb-0">Consumption analytics</p>
</div>
<a href="#" class="btn btn-sm btn-outline-success ms-auto"
><i class="bi bi-download"></i
></a>
</div>
</div>
</div>
</div>
<!-- Lab Reports -->
<div class="col-lg-4">
<div class="card h-100 border-0 shadow-sm report-card">
<div class="card-header bg-info text-white py-3">
<h3 class="mb-0">
<i class="bi bi-clipboard-data me-2"></i>Lab Reports
</h3>
</div>
<div class="card-body">
<div class="report-item d-flex align-items-center">
<i class="bi bi-bug fs-4 me-3 text-info"></i>
<div>
<h5 class="mb-0">Trap Counts</h5>
<p class="text-muted small mb-0">Regional trap data analysis</p>
</div>
<a href="#" class="btn btn-sm btn-outline-info ms-auto"
><i class="bi bi-download"></i
></a>
</div>
<div class="report-item d-flex align-items-center">
<i class="bi bi-arrow-up-right fs-4 me-3 text-info"></i>
<div>
<h5 class="mb-0">Rate Changes</h5>
<p class="text-muted small mb-0">Population fluctuation data</p>
</div>
<a href="#" class="btn btn-sm btn-outline-info ms-auto"
><i class="bi bi-download"></i
></a>
</div>
<div class="report-item d-flex align-items-center">
<i class="bi bi-virus fs-4 me-3 text-info"></i>
<div>
<h5 class="mb-0">Disease Propagation</h5>
<p class="text-muted small mb-0">Health risk assessment data</p>
</div>
<a href="#" class="btn btn-sm btn-outline-info ms-auto"
><i class="bi bi-download"></i
></a>
</div>
</div>
</div>
</div>
</div>
</div>
{{ end }}

View file

@ -0,0 +1,172 @@
{{ template "sync/layout/authenticated.html" . }}
{{ define "title" }}Downloads{{ end }}
{{ define "extraheader" }}
<style>
.upload-card {
transition: transform 0.2s;
margin-bottom: 30px;
}
.upload-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);
}
.card-icon {
font-size: 2.5rem;
margin-bottom: 15px;
color: #198754;
}
.header-banner {
background-color: #198754;
color: white;
}
</style>
{{ end }}
{{ define "content" }}
<div class="container mb-5">
<div class="row mb-4">
<div class="col-md-12">
<div class="alert alert-info">
<i class="bi bi-info-circle-fill me-2"></i>
Select a data type below to import information into the system.
Supported file formats include CSV, Excel, and PDF documents.
</div>
</div>
</div>
<div class="row">
<!-- Green Pool Management -->
<div class="col-md-4">
<div class="card h-100 upload-card border-success">
<div class="card-body text-center">
<i class="bi bi-water card-icon"></i>
<h5 class="card-title">Green Pool Management</h5>
<p class="card-text">
Upload spreadsheets with addresses and contact information of
unmaintained pools that may breed mosquitoes.
</p>
<p class="text-muted small">Supported formats: .xlsx, .csv, .xls</p>
<div class="mb-3">
<label for="greenPoolFile" class="form-label"
>Select file to import</label
>
<input class="form-control" type="file" id="greenPoolFile" />
</div>
<button type="button" class="btn btn-success">
<i class="bi bi-upload me-2"></i>Upload Green Pool Data
</button>
</div>
<div class="card-footer bg-white text-muted">
<small><i class="bi bi-clock"></i> Last import: 02/15/2023</small>
</div>
</div>
</div>
<!-- Employee Information -->
<div class="col-md-4">
<div class="card h-100 upload-card border-primary">
<div class="card-body text-center">
<i class="bi bi-people-fill card-icon" style="color: #0d6efd"></i>
<h5 class="card-title">Employee Information</h5>
<p class="card-text">
Import employee data including names, contact information, and
responsibilities for system user creation.
</p>
<p class="text-muted small">Supported formats: .xlsx, .csv</p>
<div class="mb-3">
<label for="employeeFile" class="form-label"
>Select file to import</label
>
<input class="form-control" type="file" id="employeeFile" />
</div>
<button type="button" class="btn btn-primary">
<i class="bi bi-upload me-2"></i>Upload Employee Data
</button>
</div>
<div class="card-footer bg-white text-muted">
<small><i class="bi bi-clock"></i> Last import: 03/01/2023</small>
</div>
</div>
</div>
<!-- Field Notebooks -->
<div class="col-md-4">
<div class="card h-100 upload-card border-warning">
<div class="card-body text-center">
<i class="bi bi-journal-text card-icon" style="color: #fd7e14"></i>
<h5 class="card-title">Field Notebooks</h5>
<p class="card-text">
Upload scanned technician field notebooks to digitize information
about breeding sources they've identified.
</p>
<p class="text-muted small">Supported formats: .pdf, .jpg, .png</p>
<div class="mb-3">
<label for="notebookFile" class="form-label"
>Select file to import</label
>
<input class="form-control" type="file" id="notebookFile" />
</div>
<button type="button" class="btn btn-warning text-white">
<i class="bi bi-upload me-2"></i>Upload Notebook Data
</button>
</div>
<div class="card-footer bg-white text-muted">
<small><i class="bi bi-clock"></i> Last import: 03/15/2023</small>
</div>
</div>
</div>
</div>
<!-- Import History Section -->
<div class="row mt-5">
<div class="col-12">
<h3><i class="bi bi-clock-history"></i> Recent Import History</h3>
<table class="table table-striped table-hover">
<thead class="table-dark">
<tr>
<th scope="col">Date/Time</th>
<th scope="col">Import Type</th>
<th scope="col">Filename</th>
<th scope="col">Status</th>
<th scope="col">Records</th>
<th scope="col">Actions</th>
</tr>
</thead>
<tbody>
<tr>
<td>03/15/2023 09:32 AM</td>
<td>Field Notebooks</td>
<td>march-field-notes.pdf</td>
<td><span class="badge bg-success">Complete</span></td>
<td>42 entries</td>
<td>
<button class="btn btn-sm btn-outline-primary">View</button>
</td>
</tr>
<tr>
<td>03/01/2023 02:15 PM</td>
<td>Employee Information</td>
<td>staff-2023-update.xlsx</td>
<td><span class="badge bg-success">Complete</span></td>
<td>18 employees</td>
<td>
<button class="btn btn-sm btn-outline-primary">View</button>
</td>
</tr>
<tr>
<td>02/15/2023 10:45 AM</td>
<td>Green Pool Management</td>
<td>feb-pools.csv</td>
<td><span class="badge bg-success">Complete</span></td>
<td>157 properties</td>
<td>
<button class="btn btn-sm btn-outline-primary">View</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
{{ end }}

14
sync/download.go Normal file
View file

@ -0,0 +1,14 @@
package sync
import (
"context"
"github.com/Gleipnir-Technology/nidus-sync/db/models"
)
type contentDownloadPlaceholder struct{}
func getDownloadList(ctx context.Context, user *models.User) (string, interface{}, *errorWithStatus) {
content := contentSettingPlaceholder{}
return "sync/download-list.html", content, nil
}

View file

@ -47,6 +47,7 @@ func Router() chi.Router {
r.Route("/api", api.AddRoutes)
r.Method("GET", "/admin", authenticatedHandler(getAdminDash))
r.Method("GET", "/cell/{cell}", auth.NewEnsureAuth(getCellDetails))
r.Method("GET", "/download", authenticatedHandler(getDownloadList))
r.Method("GET", "/layout-test", auth.NewEnsureAuth(getLayoutTest))
r.Method("GET", "/message", authenticatedHandler(getMessageList))
r.Method("GET", "/notification", auth.NewEnsureAuth(getNotificationList))
@ -67,6 +68,7 @@ func Router() chi.Router {
r.Method("GET", "/stadia", auth.NewEnsureAuth(getStadia))
r.Method("GET", "/trap/{globalid}", auth.NewEnsureAuth(getTrap))
r.Method("GET", "/text/{destination}", auth.NewEnsureAuth(getTextMessages))
r.Method("GET", "/upload", authenticatedHandler(getUploadList))
html.AddStaticRoute(r, "/static")
return r

14
sync/upload.go Normal file
View file

@ -0,0 +1,14 @@
package sync
import (
"context"
"github.com/Gleipnir-Technology/nidus-sync/db/models"
)
type contentUploadPlaceholder struct{}
func getUploadList(ctx context.Context, user *models.User) (string, interface{}, *errorWithStatus) {
content := contentUploadPlaceholder{}
return "sync/upload-list.html", content, nil
}