93 lines
2.9 KiB
Python
93 lines
2.9 KiB
Python
"""
|
|
UI Layer Routes - HTML page routes only (no business logic)
|
|
"""
|
|
from fastapi import APIRouter, Request
|
|
from fastapi.responses import HTMLResponse, FileResponse
|
|
from fastapi.templating import Jinja2Templates
|
|
import os
|
|
|
|
router = APIRouter()
|
|
|
|
# Setup Jinja2 templates
|
|
templates = Jinja2Templates(directory="app/ui/templates")
|
|
|
|
# Read environment (development or production)
|
|
ENVIRONMENT = os.getenv("ENVIRONMENT", "production")
|
|
VERSION = "1.0.0" # Terra-View version
|
|
|
|
# Override TemplateResponse to include environment and version in context
|
|
original_template_response = templates.TemplateResponse
|
|
def custom_template_response(name, context=None, *args, **kwargs):
|
|
if context is None:
|
|
context = {}
|
|
context["environment"] = ENVIRONMENT
|
|
context["version"] = VERSION
|
|
return original_template_response(name, context, *args, **kwargs)
|
|
templates.TemplateResponse = custom_template_response
|
|
|
|
|
|
# ===== HTML PAGE ROUTES =====
|
|
|
|
@router.get("/", response_class=HTMLResponse)
|
|
async def dashboard(request: Request):
|
|
"""Dashboard home page"""
|
|
return templates.TemplateResponse("dashboard.html", {"request": request})
|
|
|
|
|
|
@router.get("/roster", response_class=HTMLResponse)
|
|
async def roster_page(request: Request):
|
|
"""Fleet roster page"""
|
|
return templates.TemplateResponse("roster.html", {"request": request})
|
|
|
|
|
|
@router.get("/unit/{unit_id}", response_class=HTMLResponse)
|
|
async def unit_detail_page(request: Request, unit_id: str):
|
|
"""Unit detail page"""
|
|
return templates.TemplateResponse("unit_detail.html", {
|
|
"request": request,
|
|
"unit_id": unit_id
|
|
})
|
|
|
|
|
|
@router.get("/settings", response_class=HTMLResponse)
|
|
async def settings_page(request: Request):
|
|
"""Settings page for roster management"""
|
|
return templates.TemplateResponse("settings.html", {"request": request})
|
|
|
|
|
|
@router.get("/sound-level-meters", response_class=HTMLResponse)
|
|
async def sound_level_meters_page(request: Request):
|
|
"""Sound Level Meters management dashboard"""
|
|
return templates.TemplateResponse("sound_level_meters.html", {"request": request})
|
|
|
|
|
|
@router.get("/seismographs", response_class=HTMLResponse)
|
|
async def seismographs_page(request: Request):
|
|
"""Seismographs management dashboard"""
|
|
return templates.TemplateResponse("seismographs.html", {"request": request})
|
|
|
|
|
|
# ===== PWA ROUTES =====
|
|
|
|
@router.get("/sw.js")
|
|
async def service_worker():
|
|
"""Serve service worker with proper headers for PWA"""
|
|
return FileResponse(
|
|
"app/ui/static/sw.js",
|
|
media_type="application/javascript",
|
|
headers={
|
|
"Service-Worker-Allowed": "/",
|
|
"Cache-Control": "no-cache"
|
|
}
|
|
)
|
|
|
|
|
|
@router.get("/offline-db.js")
|
|
async def offline_db_script():
|
|
"""Serve offline database script"""
|
|
return FileResponse(
|
|
"app/ui/static/offline-db.js",
|
|
media_type="application/javascript",
|
|
headers={"Cache-Control": "no-cache"}
|
|
)
|