Add root index generation
This commit is contained in:
parent
02f6b400ac
commit
21762bf1bd
3 changed files with 94 additions and 0 deletions
|
@ -32,6 +32,9 @@ python scripts/generate_reports.py daily --all-domains
|
|||
python scripts/generate_reports.py weekly --all-domains
|
||||
python scripts/generate_reports.py monthly --all-domains
|
||||
|
||||
# Generate root index
|
||||
python scripts/generate_reports.py index
|
||||
|
||||
# Deactivate to keep cron environment clean
|
||||
if type deactivate >/dev/null 2>&1; then
|
||||
deactivate
|
||||
|
|
|
@ -128,6 +128,26 @@ def _generate_all_domains(interval: str) -> None:
|
|||
_generate_interval(interval, domain)
|
||||
|
||||
|
||||
def _generate_root_index() -> None:
|
||||
"""Render the top-level index listing all intervals and domains."""
|
||||
intervals = [p.name for p in OUTPUT_DIR.iterdir() if p.is_dir() and p.name != "domains"]
|
||||
intervals.sort()
|
||||
|
||||
domains_dir = OUTPUT_DIR / "domains"
|
||||
domains: List[str] = []
|
||||
if domains_dir.is_dir():
|
||||
domains = [p.name for p in domains_dir.iterdir() if p.is_dir()]
|
||||
domains.sort()
|
||||
|
||||
env = Environment(loader=FileSystemLoader(TEMPLATE_DIR))
|
||||
template = env.get_template("index.html")
|
||||
|
||||
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
|
||||
out_path = OUTPUT_DIR / "index.html"
|
||||
out_path.write_text(template.render(intervals=intervals, domains=domains))
|
||||
typer.echo(f"Generated root index at {out_path}")
|
||||
|
||||
|
||||
@app.command()
|
||||
def hourly(
|
||||
domain: Optional[str] = typer.Option(
|
||||
|
@ -192,5 +212,11 @@ def monthly(
|
|||
_generate_interval("monthly", domain)
|
||||
|
||||
|
||||
@app.command()
|
||||
def index() -> None:
|
||||
"""Generate the root index page linking all reports."""
|
||||
_generate_root_index()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app()
|
||||
|
|
65
templates/index.html
Normal file
65
templates/index.html
Normal file
|
@ -0,0 +1,65 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>ngxstat Reports</title>
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css">
|
||||
</head>
|
||||
<body class="section">
|
||||
<div class="container">
|
||||
<h1 class="title">ngxstat Reports</h1>
|
||||
<div class="columns">
|
||||
<div class="column is-one-quarter">
|
||||
<aside class="menu">
|
||||
<p class="menu-label">Intervals</p>
|
||||
<ul class="menu-list" id="interval-list">
|
||||
{% for interval in intervals %}
|
||||
<li><a href="#" data-interval="{{ interval }}"><span class="icon"><i data-feather="clock"></i></span>{{ interval.title() }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<p class="menu-label">Domains</p>
|
||||
<ul class="menu-list" id="domain-list">
|
||||
<li><a href="#" data-domain=""><span class="icon"><i data-feather="globe"></i></span>All Domains</a></li>
|
||||
{% for domain in domains %}
|
||||
<li><a href="#" data-domain="{{ domain }}"><span class="icon"><i data-feather="server"></i></span>{{ domain }}</a></li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</aside>
|
||||
</div>
|
||||
<div class="column">
|
||||
<iframe id="report-frame" src="" style="width:100%;height:80vh;border:none;"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
||||
<script>
|
||||
const intervalLinks = document.querySelectorAll('#interval-list a');
|
||||
const domainLinks = document.querySelectorAll('#domain-list a');
|
||||
let currentInterval = intervalLinks.length ? intervalLinks[0].dataset.interval : '';
|
||||
let currentDomain = '';
|
||||
function updateFrame() {
|
||||
let path = currentInterval;
|
||||
if (currentDomain) {
|
||||
path = 'domains/' + currentDomain + '/' + currentInterval;
|
||||
}
|
||||
document.getElementById('report-frame').src = path + '/index.html';
|
||||
}
|
||||
intervalLinks.forEach(a => {
|
||||
a.addEventListener('click', e => {
|
||||
e.preventDefault();
|
||||
currentInterval = a.dataset.interval;
|
||||
updateFrame();
|
||||
});
|
||||
});
|
||||
domainLinks.forEach(a => {
|
||||
a.addEventListener('click', e => {
|
||||
e.preventDefault();
|
||||
currentDomain = a.dataset.domain;
|
||||
updateFrame();
|
||||
});
|
||||
});
|
||||
updateFrame();
|
||||
feather.replace();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Loading…
Add table
Add a link
Reference in a new issue