From bff852291e3a0d7226bda95264d5b137d177a298 Mon Sep 17 00:00:00 2001 From: Lars Gebhardt-Kusche Date: Mon, 27 Apr 2026 01:30:00 +0200 Subject: [PATCH] sdasd --- modules/pihole/assets/pihole.js | 30 +++++++++++++++++++++---- partials/landingpages/modules/setup.php | 18 +++++++++++++++ src/App/functions.php | 24 +++++++++++++++++++- 3 files changed, 67 insertions(+), 5 deletions(-) diff --git a/modules/pihole/assets/pihole.js b/modules/pihole/assets/pihole.js index 833d8c5..81e863f 100644 --- a/modules/pihole/assets/pihole.js +++ b/modules/pihole/assets/pihole.js @@ -9,6 +9,10 @@ return d.toLocaleString('de-DE'); }; + let refreshTimer = null; + let loadInFlight = false; + let loadErrorShown = false; + const apiCall = async (action, payload = {}) => { const res = await fetch(`/module/pihole/api?action=${encodeURIComponent(action)}`, { @@ -240,6 +244,8 @@ }; const loadDashboard = async () => { + if (loadInFlight) return; + loadInFlight = true; try { const data = await apiCall('dashboard'); if (!data.ok) throw new Error(data.error || 'API error'); @@ -259,16 +265,32 @@ renderList(document.querySelector('[data-top-queries]'), data.aggregate?.top_queries, 'Keine Daten'); renderList(document.querySelector('[data-top-clients]'), data.aggregate?.query_sources, 'Keine Daten'); renderBlocked(document.querySelector('[data-recent-blocked]'), data.aggregate?.recent_blocked); + loadErrorShown = false; + const existing = page.querySelector('[data-pihole-load-error]'); + if (existing) existing.remove(); } catch (err) { - const message = document.createElement('div'); - message.className = 'card'; - message.style.marginTop = '1rem'; + let message = page.querySelector('[data-pihole-load-error]'); + if (!message) { + message = document.createElement('div'); + message.className = 'card'; + message.style.marginTop = '1rem'; + message.dataset.piholeLoadError = '1'; + page.appendChild(message); + } message.textContent = `Fehler beim Laden der Pi-hole Daten: ${err.message}`; - page.appendChild(message); + loadErrorShown = true; + } finally { + loadInFlight = false; } }; bindActionButtons(); bindForms(); loadDashboard(); + refreshTimer = window.setInterval(loadDashboard, 1000); + window.addEventListener('beforeunload', () => { + if (refreshTimer !== null) { + window.clearInterval(refreshTimer); + } + }); })(); diff --git a/partials/landingpages/modules/setup.php b/partials/landingpages/modules/setup.php index c2a313e..1f81f06 100644 --- a/partials/landingpages/modules/setup.php +++ b/partials/landingpages/modules/setup.php @@ -15,6 +15,21 @@ if (!$module) { } $fields = (array)($module['setup']['fields'] ?? []); +$hasGlobalDebugField = false; +foreach ($fields as $field) { + if ((string)($field['name'] ?? '') === 'debug_enabled') { + $hasGlobalDebugField = true; + break; + } +} +if (!$hasGlobalDebugField) { + $fields[] = [ + 'name' => 'debug_enabled', + 'label' => 'Modul-Debug aktivieren', + 'type' => 'checkbox', + 'help' => 'Wenn aktiv, darf das Modul Debug-Daten sammeln und den Debug-Bereich anzeigen.', + ]; +} $fieldTypes = []; $fieldMeta = []; foreach ($fields as $field) { @@ -407,6 +422,9 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } } else { modules()->saveSettings($moduleName, $payload); + if (empty($payload['debug_enabled'])) { + module_debug_clear($moduleName); + } $notice = 'Setup gespeichert.'; $module = modules()->get($moduleName) ?: $module; } diff --git a/src/App/functions.php b/src/App/functions.php index e667608..e1f4850 100644 --- a/src/App/functions.php +++ b/src/App/functions.php @@ -276,11 +276,30 @@ function module_design(string $module): array return $cache[$module]; } +function module_debug_enabled(string $module): bool +{ + if (preg_match('/[^a-zA-Z0-9_\-]/', $module)) { + return false; + } + + try { + $settings = modules()->settings($module); + } catch (\Throwable $e) { + return false; + } + + $value = $settings['debug_enabled'] ?? '0'; + return $value === true || $value === 1 || $value === '1' || $value === 'true'; +} + function module_debug_entries(string $module): array { if (preg_match('/[^a-zA-Z0-9_\-]/', $module)) { return []; } + if (!module_debug_enabled($module)) { + return []; + } app()->session()->start(); $entries = $_SESSION['module_debug'][$module] ?? []; @@ -292,6 +311,9 @@ function module_debug_push(string $module, array $entry): void if (preg_match('/[^a-zA-Z0-9_\-]/', $module)) { return; } + if (!module_debug_enabled($module)) { + return; + } app()->session()->start(); if (!isset($_SESSION['module_debug']) || !is_array($_SESSION['module_debug'])) { @@ -427,7 +449,7 @@ function module_shell_footer(): string { $html = ''; $module = current_module_name(); - if (is_string($module) && $module !== '') { + if (is_string($module) && $module !== '' && module_debug_enabled($module)) { if ((string) ($_GET['module_debug_clear'] ?? '') === '1') { module_debug_clear($module); }