update
This commit is contained in:
@@ -24,36 +24,6 @@ if ($currentModule) {
|
|||||||
<body data-theme="<?= e($theme) ?>">
|
<body data-theme="<?= e($theme) ?>">
|
||||||
<div class="bg-orb orb-a"></div>
|
<div class="bg-orb orb-a"></div>
|
||||||
<div class="bg-orb orb-b"></div>
|
<div class="bg-orb orb-b"></div>
|
||||||
<div class="app-shell">
|
|
||||||
<aside class="app-sidebar">
|
|
||||||
<div class="brand">
|
|
||||||
<img src="/assets/images/logo.png" alt="Nexus Logo">
|
|
||||||
<div class="brand-text">
|
|
||||||
<div class="brand-title"><?= htmlspecialchars(t('common.title'), ENT_QUOTES) ?></div>
|
|
||||||
<div class="brand-sub">Nexus Control Panel</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<button class="sidebar-toggle" data-sidebar-toggle>
|
|
||||||
☰
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<nav class="sidebar-nav">
|
|
||||||
<a href="/" class="nav-link <?= $path === '/' ? 'is-active' : '' ?>">Dashboard</a>
|
|
||||||
<div class="nav-section">Aktive Module</div>
|
|
||||||
<?php foreach (modules()->all() as $m): ?>
|
|
||||||
<?php if (!empty($m['enabled'])): ?>
|
|
||||||
<?php $active = $currentModule === $m['name']; ?>
|
|
||||||
<a href="/module/<?= e($m['name']) ?>" class="nav-link <?= $active ? 'is-active' : '' ?>"><?= e($m['title']) ?></a>
|
|
||||||
<?php endif; ?>
|
|
||||||
<?php endforeach; ?>
|
|
||||||
<a href="/modules" class="nav-link <?= str_starts_with($path, '/modules') ? 'is-active' : '' ?>">Module</a>
|
|
||||||
<a href="/users" class="nav-link <?= $path === '/users' ? 'is-active' : '' ?>">User</a>
|
|
||||||
<a href="/settings" class="nav-link <?= $path === '/settings' ? 'is-active' : '' ?>">Einstellungen</a>
|
|
||||||
</nav>
|
|
||||||
</aside>
|
|
||||||
|
|
||||||
<div class="app-content">
|
|
||||||
<header class="topbar">
|
<header class="topbar">
|
||||||
<div class="topbar-left">
|
<div class="topbar-left">
|
||||||
<?php if ($currentModule && !empty($module['title'])): ?>
|
<?php if ($currentModule && !empty($module['title'])): ?>
|
||||||
@@ -77,6 +47,38 @@ if ($currentModule) {
|
|||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
|
<div class="app-shell">
|
||||||
|
<aside class="app-sidebar">
|
||||||
|
<div class="brand">
|
||||||
|
<img src="/assets/images/logo.png" alt="Nexus Logo">
|
||||||
|
<div class="brand-text">
|
||||||
|
<div class="brand-title"><?= htmlspecialchars(t('common.title'), ENT_QUOTES) ?></div>
|
||||||
|
<div class="brand-sub">Nexus Control Panel</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button class="sidebar-toggle" data-sidebar-toggle aria-label="Menü ein-/ausklappen">
|
||||||
|
<span class="sidebar-icon">☰</span>
|
||||||
|
<span class="sidebar-collapse">»»</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<nav class="sidebar-nav">
|
||||||
|
<a href="/" class="nav-link <?= $path === '/' ? 'is-active' : '' ?>">Dashboard</a>
|
||||||
|
<div class="nav-section">Aktive Module</div>
|
||||||
|
<?php foreach (modules()->all() as $m): ?>
|
||||||
|
<?php if (!empty($m['enabled'])): ?>
|
||||||
|
<?php $active = $currentModule === $m['name']; ?>
|
||||||
|
<a href="/module/<?= e($m['name']) ?>" class="nav-link <?= $active ? 'is-active' : '' ?>"><?= e($m['title']) ?></a>
|
||||||
|
<?php endif; ?>
|
||||||
|
<?php endforeach; ?>
|
||||||
|
<a href="/modules" class="nav-link <?= str_starts_with($path, '/modules') ? 'is-active' : '' ?>">Module</a>
|
||||||
|
<a href="/users" class="nav-link <?= $path === '/users' ? 'is-active' : '' ?>">User</a>
|
||||||
|
<a href="/settings" class="nav-link <?= $path === '/settings' ? 'is-active' : '' ?>">Einstellungen</a>
|
||||||
|
</nav>
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
<div class="app-content">
|
||||||
|
|
||||||
<?php if ($moduleMenu): ?>
|
<?php if ($moduleMenu): ?>
|
||||||
<div class="module-subnav">
|
<div class="module-subnav">
|
||||||
<?php foreach ($moduleMenu as $entry): ?>
|
<?php foreach ($moduleMenu as $entry): ?>
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ body {
|
|||||||
display: grid;
|
display: grid;
|
||||||
grid-template-columns: 260px 1fr;
|
grid-template-columns: 260px 1fr;
|
||||||
gap: 24px;
|
gap: 24px;
|
||||||
padding: 24px;
|
padding: 0 24px 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-sidebar {
|
.app-sidebar {
|
||||||
@@ -105,10 +105,17 @@ body {
|
|||||||
color: var(--text);
|
color: var(--text);
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
}
|
}
|
||||||
|
.sidebar-collapse { display: none; }
|
||||||
|
|
||||||
.sidebar-collapsed .app-shell {
|
.sidebar-collapsed .app-shell {
|
||||||
grid-template-columns: 72px 1fr;
|
grid-template-columns: 72px 1fr;
|
||||||
}
|
}
|
||||||
|
.sidebar-collapsed .sidebar-toggle {
|
||||||
|
padding: 6px 8px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.sidebar-collapsed .sidebar-icon { display: none; }
|
||||||
|
.sidebar-collapsed .sidebar-collapse { display: inline; }
|
||||||
.sidebar-collapsed .app-sidebar .brand-text,
|
.sidebar-collapsed .app-sidebar .brand-text,
|
||||||
.sidebar-collapsed .app-sidebar .nav-section,
|
.sidebar-collapsed .app-sidebar .nav-section,
|
||||||
.sidebar-collapsed .app-sidebar .nav-link {
|
.sidebar-collapsed .app-sidebar .nav-link {
|
||||||
@@ -187,10 +194,15 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.topbar {
|
.topbar {
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
z-index: 20;
|
||||||
|
margin: 0;
|
||||||
|
width: 100%;
|
||||||
background: var(--panel);
|
background: var(--panel);
|
||||||
border: 1px solid var(--line);
|
border: 1px solid var(--line);
|
||||||
border-radius: 16px;
|
border-radius: 0;
|
||||||
padding: 16px 20px;
|
padding: 16px 24px;
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
@@ -299,12 +311,12 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 1100px) {
|
@media (max-width: 1100px) {
|
||||||
.app-shell { grid-template-columns: 1fr; }
|
.app-shell { grid-template-columns: 1fr; padding: 0 18px 18px; }
|
||||||
.app-sidebar { position: relative; top: 0; }
|
.app-sidebar { position: relative; top: 0; }
|
||||||
}
|
}
|
||||||
@media (max-width: 720px) {
|
@media (max-width: 720px) {
|
||||||
.grid { grid-template-columns: 1fr; }
|
.grid { grid-template-columns: 1fr; }
|
||||||
.app-shell { padding: 18px; }
|
.topbar { flex-direction: column; align-items: flex-start; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Minimal Tailwind-like utility support for existing templates */
|
/* Minimal Tailwind-like utility support for existing templates */
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ $client = new OidcClient($config);
|
|||||||
$token = $client->exchangeCode($code);
|
$token = $client->exchangeCode($code);
|
||||||
|
|
||||||
$idToken = (string)($token['id_token'] ?? '');
|
$idToken = (string)($token['id_token'] ?? '');
|
||||||
|
$accessToken = (string)($token['access_token'] ?? '');
|
||||||
if ($idToken === '') {
|
if ($idToken === '') {
|
||||||
echo '<div class="card">Kein ID Token erhalten.</div>';
|
echo '<div class="card">Kein ID Token erhalten.</div>';
|
||||||
return;
|
return;
|
||||||
@@ -36,6 +37,14 @@ $client->validateIdToken($claims, $nonce);
|
|||||||
unset($_SESSION['oidc_nonce']);
|
unset($_SESSION['oidc_nonce']);
|
||||||
|
|
||||||
$groups = $client->groupsFromClaims($claims);
|
$groups = $client->groupsFromClaims($claims);
|
||||||
|
if (!$groups && $accessToken !== '') {
|
||||||
|
try {
|
||||||
|
$accessClaims = $client->decodeJwt($accessToken);
|
||||||
|
$groups = $client->groupsFromClaims($accessClaims);
|
||||||
|
} catch (\Throwable $e) {
|
||||||
|
// ignore access token decoding errors
|
||||||
|
}
|
||||||
|
}
|
||||||
$user = [
|
$user = [
|
||||||
'sub' => (string)($claims['sub'] ?? ''),
|
'sub' => (string)($claims['sub'] ?? ''),
|
||||||
'email' => (string)($claims['email'] ?? ''),
|
'email' => (string)($claims['email'] ?? ''),
|
||||||
|
|||||||
Reference in New Issue
Block a user