sfsdf
All checks were successful
Deploy / deploy-staging (push) Successful in 6s
Deploy / deploy-production (push) Has been skipped

This commit is contained in:
2026-04-23 00:21:47 +02:00
parent ac3ac0803b
commit 39bddf39e2
11 changed files with 375 additions and 71 deletions

View File

@@ -0,0 +1,14 @@
{
"eyebrow": "Modul",
"title": "Boersenchecker",
"description": "Depotverwaltung fuer Aktien, Kaufdaten, Kursverlauf und Waehrungsumrechnung.",
"actions": [
{ "label": "Zur Startseite", "href": "/", "variant": "ghost" },
{ "label": "Setup", "href": "/modules/setup/boersenchecker", "variant": "secondary" }
],
"tabs": [
{ "label": "Ueberblick", "href": "/module/boersenchecker" },
{ "label": "Depotverwaltung", "href": "/module/boersenchecker/depotverwaltung" },
{ "label": "Aktienverwaltung", "href": "/module/boersenchecker/aktienverwaltung" }
]
}

View File

@@ -1,26 +1,16 @@
<?php $ownerQuery = $isAdmin ? '?owner_sub=' . urlencode((string) $ownerSub) : ''; ?>
<?= module_shell_header('boersenchecker', [
'title' => 'Depotverwaltung',
'description' => 'Depots, Positionen und Kurs-Historien verwalten.',
'tabs' => [
['label' => 'Ueberblick', 'href' => '/module/boersenchecker'],
['label' => 'Depotverwaltung', 'href' => '/module/boersenchecker/depotverwaltung', 'active' => true],
['label' => 'Aktienverwaltung', 'href' => '/module/boersenchecker/aktienverwaltung'],
],
]) ?>
<div class="bc-app">
<div class="bc-grid-bg">
<div class="bc-shell bc-stack">
<header class="bc-hero">
<div class="bc-hero-top">
<div class="bc-hero-copy">
<div class="bc-eyebrow">Boersenchecker Modul</div>
<h1 class="bc-title">Depotverwaltung</h1>
<p class="bc-text">Depots, Positionen und Kurs-Historien verwalten. Die Waehrungsumrechnung nutzt weiterhin die bestehende FX-Logik des Mining-Checkers.</p>
</div>
<div class="bc-hero-controls">
<a class="bc-button bc-button--ghost" href="/">Zur Startseite</a>
<a class="bc-button bc-button--secondary" href="/modules/setup/boersenchecker">Setup</a>
</div>
</div>
<div class="bc-tabs">
<a class="bc-button bc-button--tab" href="/module/boersenchecker">Ueberblick</a>
<a class="bc-button bc-button--tab-active" href="/module/boersenchecker/depotverwaltung">Depotverwaltung</a>
<a class="bc-button bc-button--tab" href="/module/boersenchecker/aktienverwaltung">Aktienverwaltung</a>
</div>
</header>
<?php if ($error): ?>
<div class="bc-alert bc-alert--error"><?= e($error) ?></div>
@@ -479,3 +469,4 @@
</div>
</div>
</div>
<?= module_shell_footer() ?>

View File

@@ -1,3 +1,12 @@
<?= module_shell_header('boersenchecker', [
'title' => 'Depot-Ueberblick',
'description' => 'Depots, Aktien und Kursverlaeufe in einer Oberflaeche.',
'tabs' => [
['label' => 'Ueberblick', 'href' => '/module/boersenchecker', 'active' => true],
['label' => 'Depotverwaltung', 'href' => '/module/boersenchecker/depotverwaltung'],
['label' => 'Aktienverwaltung', 'href' => '/module/boersenchecker/aktienverwaltung'],
],
]) ?>
<div class="bc-app">
<div class="bc-grid-bg">
<div class="bc-shell bc-stack" data-bc-home data-chart-endpoint="<?= e($chartEndpoint) ?>">
@@ -10,29 +19,6 @@
];
}, $positions), JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES) ?></script>
<header class="bc-hero">
<div class="bc-hero-top">
<div class="bc-hero-copy">
<div class="bc-eyebrow">Boersenchecker Modul</div>
<h1 class="bc-title">Depot-Ueberblick</h1>
<p class="bc-text">Depots, Aktien und Kursverlaeufe in einer Oberflaeche. Die Navigation folgt jetzt dem gleichen sichtbaren Prinzip wie beim Mining-Checker.</p>
</div>
<div class="bc-hero-controls">
<a class="bc-button bc-button--ghost" href="/">Zur Startseite</a>
<div class="bc-form-card">
<div class="bc-field-label">Aktives Depot</div>
<div class="bc-text" style="margin-top:8px;"><?= $selectedPortfolioId > 0 && $portfolios !== [] ? e((string) (($portfolios[array_search($selectedPortfolioId, array_column($portfolios, 'id'), true)]['name'] ?? 'Auswahl aktiv'))) : 'Kein Depot ausgewaehlt' ?></div>
</div>
</div>
</div>
<div class="bc-tabs">
<a class="bc-button bc-button--tab-active" href="/module/boersenchecker">Ueberblick</a>
<a class="bc-button bc-button--tab" href="/module/boersenchecker/depotverwaltung">Depotverwaltung</a>
<a class="bc-button bc-button--tab" href="/module/boersenchecker/aktienverwaltung">Aktienverwaltung</a>
</div>
</header>
<?php if ($error): ?>
<div class="bc-alert bc-alert--error"><?= e($error) ?></div>
<?php elseif ($notice): ?>
@@ -207,3 +193,4 @@
</div>
</div>
</div>
<?= module_shell_footer() ?>

View File

@@ -1,25 +1,15 @@
<?= module_shell_header('boersenchecker', [
'title' => 'Aktienverwaltung',
'description' => 'Stammdaten der Aktien pflegen, Symbole suchen und manuelle Kurse verwalten.',
'tabs' => [
['label' => 'Ueberblick', 'href' => '/module/boersenchecker'],
['label' => 'Depotverwaltung', 'href' => '/module/boersenchecker/depotverwaltung'],
['label' => 'Aktienverwaltung', 'href' => '/module/boersenchecker/aktienverwaltung', 'active' => true],
],
]) ?>
<div class="bc-app">
<div class="bc-grid-bg">
<div class="bc-shell bc-stack">
<header class="bc-hero">
<div class="bc-hero-top">
<div class="bc-hero-copy">
<div class="bc-eyebrow">Boersenchecker Modul</div>
<h1 class="bc-title">Aktienverwaltung</h1>
<p class="bc-text">Stammdaten der Aktien pflegen, Symbole suchen und manuelle Kurse verwalten.</p>
</div>
<div class="bc-hero-controls">
<a class="bc-button bc-button--ghost" href="/">Zur Startseite</a>
<a class="bc-button bc-button--secondary" href="/modules/setup/boersenchecker">Setup</a>
</div>
</div>
<div class="bc-tabs">
<a class="bc-button bc-button--tab" href="/module/boersenchecker">Ueberblick</a>
<a class="bc-button bc-button--tab" href="/module/boersenchecker/depotverwaltung">Depotverwaltung</a>
<a class="bc-button bc-button--tab-active" href="/module/boersenchecker/aktienverwaltung">Aktienverwaltung</a>
</div>
</header>
<?php if ($error): ?>
<div class="bc-alert bc-alert--error"><?= e($error) ?></div>
@@ -155,3 +145,4 @@
</div>
</div>
</div>
<?= module_shell_footer() ?>

9
modules/kea/design.json Normal file
View File

@@ -0,0 +1,9 @@
{
"eyebrow": "Modul",
"title": "KEA DHCP",
"description": "Verwaltung von KEA DHCP Hosts und Reservierungen.",
"actions": [
{ "label": "Gruppen verwalten", "href": "/module/kea/groups", "variant": "secondary" },
{ "label": "Setup", "href": "/modules/setup/kea", "variant": "secondary" }
]
}

View File

@@ -6,6 +6,10 @@
* @var array $stats Kennzahlen fuer die Uebersicht.
*/
?>
<?= module_shell_header('kea', [
'title' => 'KEA DHCP Hosts',
'description' => 'Reservierungen und aktuelle Leases aus der KEA-Datenbank.',
]) ?>
<section class="kea-page">
<div class="section-head">
<div>
@@ -15,10 +19,6 @@
Automatische Aktualisierung alle 5 Sekunden.
</p>
</div>
<div class="setup-actions">
<a class="cta-button" href="/module/kea/groups">Gruppen verwalten</a>
<a class="nav-link" href="/modules/setup/kea">Setup</a>
</div>
</div>
<?php if ($error): ?>
@@ -226,3 +226,4 @@
window.setInterval(refresh, 5000);
})();
</script>
<?= module_shell_footer() ?>

View File

@@ -0,0 +1,15 @@
{
"eyebrow": "Modul",
"title": "Pi-hole",
"description": "Pi-hole Monitoring, Listen und Steuerung fuer zwei Instanzen.",
"actions": [
{ "label": "Zur Startseite", "href": "/", "variant": "ghost" },
{ "label": "Instanzen", "href": "/module/pihole/instances", "variant": "secondary" }
],
"tabs": [
{ "label": "Dashboard", "href": "/module/pihole" },
{ "label": "Instanzen", "href": "/module/pihole/instances" },
{ "label": "Listen", "href": "/module/pihole/lists" },
{ "label": "Queries", "href": "/module/pihole/queries" }
]
}

View File

@@ -6,10 +6,17 @@ $assets->addScript('/module/pihole/asset?file=pihole.js', 'footer', true);
$instances = module_fn('pihole', 'instances');
$hasConfig = !empty($instances);
?>
<?= module_shell_header('pihole', [
'title' => 'Pi-hole Dashboard',
'description' => 'Status, Blockings, Usage und Steuerung fuer beide Instanzen.',
'tabs' => [
['label' => 'Dashboard', 'href' => '/module/pihole', 'active' => true],
['label' => 'Instanzen', 'href' => '/module/pihole/instances'],
['label' => 'Listen', 'href' => '/module/pihole/lists'],
['label' => 'Queries', 'href' => '/module/pihole/queries'],
],
]) ?>
<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">
@@ -134,3 +141,4 @@ $hasConfig = !empty($instances);
<div class="pihole-error" data-instance-errors></div>
</div>
</template>
<?= module_shell_footer() ?>

View File

@@ -132,15 +132,23 @@ if ($primaryId === '') {
}
}
?>
<?= module_shell_header('pihole', [
'title' => 'Pi-hole Instanzen',
'description' => 'Pi-hole Instanzen hinzufuegen, bearbeiten und loeschen.',
'tabs' => [
['label' => 'Dashboard', 'href' => '/module/pihole'],
['label' => 'Instanzen', 'href' => '/module/pihole/instances', 'active' => true],
['label' => 'Listen', 'href' => '/module/pihole/lists'],
['label' => 'Queries', 'href' => '/module/pihole/queries'],
],
]) ?>
<div class="card">
<div class="pill">Pi-hole</div>
<div style="display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap; margin-top:.75rem;">
<div style="display:flex; align-items:center; justify-content:space-between; gap:12px; flex-wrap:wrap;">
<h1 style="margin:0;">Instanzen</h1>
<div style="display:flex; gap:10px; flex-wrap:wrap;">
<button class="cta-button" type="button" data-instance-new>+ Neue Instanz</button>
</div>
</div>
<p class="muted">Pi-hole Instanzen hinzufuegen, bearbeiten und loeschen.</p>
<?php if ($error): ?>
<div class="card notice-card" style="margin-top:1rem; border-color:#ffb4a8; background:#fff5f3; color:#7a2114;">
@@ -222,3 +230,4 @@ if ($primaryId === '') {
</form>
</div>
</div>
<?= module_shell_footer() ?>