136 lines
6.0 KiB
PHP
136 lines
6.0 KiB
PHP
<?php
|
||
$assets = app()->assets();
|
||
$assets->addStyle('/module/pihole/asset?file=pihole.css');
|
||
$assets->addScript('/module/pihole/asset?file=pihole.js', 'footer', true);
|
||
|
||
$instances = module_fn('pihole', 'instances');
|
||
$hasConfig = !empty($instances);
|
||
?>
|
||
<div class="card pihole-page" data-pihole-page="dashboard">
|
||
<div class="pill">Pi-hole</div>
|
||
<h1 style="margin-top:.75rem;">Pi-hole Dashboard</h1>
|
||
<p class="muted">Status, Blockings, Usage und Steuerung fuer beide Instanzen.</p>
|
||
|
||
<div class="card" style="margin-top:1rem;">
|
||
<div class="pihole-section-header">
|
||
<strong>Hosts</strong>
|
||
<a class="nav-link" href="/module/pihole/instances">Instanzen verwalten</a>
|
||
</div>
|
||
<?php if (!$instances): ?>
|
||
<div class="muted" style="margin-top:.75rem;">Keine Pi-hole Instanzen vorhanden. Bitte zuerst hinzufuegen.</div>
|
||
<div style="margin-top:.75rem;"><a class="cta-button" href="/module/pihole/instances">+ Neue Instanz</a></div>
|
||
<?php else: ?>
|
||
<div class="pihole-list" style="margin-top:1rem;">
|
||
<?php foreach ($instances as $instance): ?>
|
||
<div class="pihole-list-row">
|
||
<div>
|
||
<strong><?= e((string)($instance['name'] ?? $instance['id'] ?? '')) ?></strong>
|
||
<div class="muted"><?= e((string)($instance['url'] ?? '')) ?></div>
|
||
</div>
|
||
<?php if (!empty($instance['is_primary'])): ?>
|
||
<span class="pihole-status">Primaer</span>
|
||
<?php endif; ?>
|
||
</div>
|
||
<?php endforeach; ?>
|
||
</div>
|
||
<?php endif; ?>
|
||
</div>
|
||
|
||
<?php if (!$hasConfig): ?>
|
||
<?php return; ?>
|
||
<?php else: ?>
|
||
<div class="pihole-grid" style="margin-top:1rem;">
|
||
<div class="card pihole-stat">
|
||
<div class="muted">DNS Queries (heute)</div>
|
||
<div class="pihole-stat-value" data-summary-dns>–</div>
|
||
</div>
|
||
<div class="card pihole-stat">
|
||
<div class="muted">Ads geblockt</div>
|
||
<div class="pihole-stat-value" data-summary-blocked>–</div>
|
||
<div class="pihole-stat-sub" data-summary-percent>–</div>
|
||
</div>
|
||
<div class="card pihole-stat">
|
||
<div class="muted">Unique Clients</div>
|
||
<div class="pihole-stat-value" data-summary-clients>–</div>
|
||
</div>
|
||
<div class="card pihole-stat">
|
||
<div class="muted">Status</div>
|
||
<div class="pihole-stat-value" data-summary-status>–</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="card" style="margin-top:1.25rem;">
|
||
<div class="pihole-section-header">
|
||
<strong>Blocker steuern (alle Instanzen)</strong>
|
||
<span class="muted" data-summary-last-refresh>Letztes Update: –</span>
|
||
</div>
|
||
<div class="pihole-actions" data-global-actions>
|
||
<button class="cta-button" data-action="enable" data-instance="all">Aktivieren</button>
|
||
<button class="nav-link" data-action="disable" data-minutes="5" data-instance="all">5 Min</button>
|
||
<button class="nav-link" data-action="disable" data-minutes="10" data-instance="all">10 Min</button>
|
||
<button class="nav-link" data-action="disable" data-minutes="20" data-instance="all">20 Min</button>
|
||
<button class="nav-link" data-action="disable" data-minutes="30" data-instance="all">30 Min</button>
|
||
<button class="nav-link" data-action="disable" data-minutes="60" data-instance="all">60 Min</button>
|
||
<div class="pihole-inline">
|
||
<input type="number" min="1" max="1440" placeholder="Minuten" data-custom-minutes="all">
|
||
<button class="nav-link" data-action="disable-custom" data-instance="all">Custom</button>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="card" style="margin-top:1.25rem;">
|
||
<div class="pihole-section-header">
|
||
<strong>Instanzen</strong>
|
||
<span class="muted">Einzeln steuerbar & getrennte Updates</span>
|
||
</div>
|
||
<div class="pihole-instance-grid" data-instance-cards></div>
|
||
</div>
|
||
|
||
<div class="card" style="margin-top:1.25rem;">
|
||
<div class="pihole-section-header">
|
||
<strong>Usage (Aggregiert)</strong>
|
||
<span class="muted">Query-Typen und Weiterleitungen</span>
|
||
</div>
|
||
<div class="pihole-split" style="margin-top:1rem;">
|
||
<div>
|
||
<div class="muted">Query-Typen</div>
|
||
<div class="pihole-list" data-query-types></div>
|
||
</div>
|
||
<div>
|
||
<div class="muted">Forward Destinations</div>
|
||
<div class="pihole-list" data-forward-destinations></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<?php endif; ?>
|
||
</div>
|
||
|
||
<template id="pihole-instance-template">
|
||
<div class="card pihole-instance" data-instance="">
|
||
<div class="pihole-instance-header">
|
||
<div>
|
||
<strong data-instance-name></strong>
|
||
<div class="muted" data-instance-url></div>
|
||
</div>
|
||
<div class="pihole-status" data-instance-status>–</div>
|
||
</div>
|
||
<div class="pihole-instance-stats">
|
||
<div><span class="muted">DNS heute</span><div class="pihole-instance-value" data-instance-dns>–</div></div>
|
||
<div><span class="muted">Ads geblockt</span><div class="pihole-instance-value" data-instance-ads>–</div></div>
|
||
<div><span class="muted">% Blocked</span><div class="pihole-instance-value" data-instance-percent>–</div></div>
|
||
</div>
|
||
<div class="pihole-actions" data-instance-actions>
|
||
<button class="cta-button" data-action="enable" data-instance="">Aktivieren</button>
|
||
<button class="nav-link" data-action="disable" data-minutes="5" data-instance="">5 Min</button>
|
||
<button class="nav-link" data-action="disable" data-minutes="10" data-instance="">10 Min</button>
|
||
<button class="nav-link" data-action="disable" data-minutes="30" data-instance="">30 Min</button>
|
||
<div class="pihole-inline">
|
||
<input type="number" min="1" max="1440" placeholder="Minuten" data-custom-minutes="">
|
||
<button class="nav-link" data-action="disable-custom" data-instance="">Custom</button>
|
||
</div>
|
||
<button class="nav-link" data-action="update" data-instance="">Pi-hole Update</button>
|
||
</div>
|
||
<div class="pihole-update" data-instance-update></div>
|
||
</div>
|
||
</template>
|