| Server IP : 193.86.120.172 / Your IP : 216.73.216.67 Web Server : Apache/2.4.63 (Unix) System : Linux JServices 3.10.108 #86003 SMP Wed Oct 22 13:20:46 CST 2025 x86_64 User : kubec ( 1026) PHP Version : 8.2.28 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : OFF Directory : /volume1/web/hotellesnizatisi_cz/new/includes/ |
Upload File : |
<?php
// ============================================================
// Sdílený layout administrace — sidebar + topbar.
// Volá se admin_layout_start(...) na začátku stránky a
// admin_layout_end() na konci. Mezi tím přijde obsah stránky.
// ============================================================
function admin_layout_start(string $activePanel, string $title, string $sub, array $user): void
{
$roleLabel = [
'admin' => 'Admin',
'manazer' => 'Manažer',
'zamestnanec' => 'Zaměstnanec',
][$user['role']] ?? $user['role'];
$initials = mb_strtoupper(mb_substr($user['jmeno'], 0, 1) . mb_substr($user['prijmeni'], 0, 1));
?>
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><?= htmlspecialchars($title) ?> — Administrace Lesní zátiší</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link href="https://fonts.googleapis.com/css2?family=Work+Sans:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<link rel="stylesheet" href="assets/admin.css">
</head>
<body>
<div class="shell">
<div class="sidebar-backdrop" id="sidebarBackdrop"></div>
<aside class="sidebar" id="sidebar">
<div class="sidebar__logo">
<strong>Lesní zátiší</strong>
<span>Administrace</span>
</div>
<nav class="nav">
<?php
$maObsah = user_can($user, 'obsah') || user_can($user, 'doplnky') || user_can($user, 'okoli') || user_can($user, 'cenik') || user_can($user, 'fotky');
?>
<?php if ($maObsah): ?>
<div class="nav__group-label">Obsah webu</div>
<?php if (user_can($user, 'obsah')): ?>
<a class="nav__item <?= $activePanel === 'obsah' ? 'active' : '' ?>" href="obsah.php">Texty sekcí</a>
<?php endif; ?>
<?php if (user_can($user, 'doplnky')): ?>
<a class="nav__item <?= $activePanel === 'doplnky' ? 'active' : '' ?>" href="doplnky.php">Doplňky</a>
<?php endif; ?>
<?php if (user_can($user, 'okoli')): ?>
<a class="nav__item <?= $activePanel === 'okoli' ? 'active' : '' ?>" href="okoli.php">V okolí</a>
<?php endif; ?>
<?php if (user_can($user, 'cenik')): ?>
<a class="nav__item <?= $activePanel === 'cenik' ? 'active' : '' ?>" href="cenik.php">Ceník a storno</a>
<?php endif; ?>
<?php if (user_can($user, 'fotky')): ?>
<a class="nav__item <?= $activePanel === 'fotky' ? 'active' : '' ?>" href="fotky.php">Fotky</a>
<?php endif; ?>
<?php endif; ?>
<!-- Pokoje záměrně bez vlastní sekce — hotel nemá rozlišené typy pokojů,
popisný text se edituje přes Texty sekcí (klíč "pokoje_info") -->
<?php if (in_array($user['role'], ['admin', 'manazer'], true)): ?>
<div class="nav__group-label">Správa</div>
<a class="nav__item <?= $activePanel === 'nastaveni' ? 'active' : '' ?>" href="nastaveni.php">Nastavení</a>
<a class="nav__item <?= $activePanel === 'uzivatele' ? 'active' : '' ?>" href="uzivatele.php">Uživatelé</a>
<?php endif; ?>
<div class="nav__group-label">Rozšíření</div>
<button type="button" class="nav__item" onclick="openDemoModal()">Rezervační systém <span class="badge-demo">DEMO</span></button>
</nav>
<div class="sidebar__footer">
<div class="user-chip">
<div class="user-chip__avatar"><?= htmlspecialchars($initials) ?></div>
<div>
<div class="user-chip__name"><?= htmlspecialchars($user['jmeno'] . ' ' . $user['prijmeni']) ?></div>
<div class="user-chip__role"><?= htmlspecialchars($roleLabel) ?></div>
</div>
</div>
</div>
</aside>
<div class="main">
<header class="topbar">
<div style="display:flex;align-items:center;gap:14px;">
<button type="button" class="topbar__burger" id="sidebarToggle" aria-label="Otevřít menu">
<span></span><span></span><span></span>
</button>
<div>
<h1><?= htmlspecialchars($title) ?></h1>
<?php if ($sub): ?><div class="topbar__sub"><?= htmlspecialchars($sub) ?></div><?php endif; ?>
</div>
</div>
<a class="btn-logout" href="zmenit-heslo.php" style="margin-right:8px;">Změnit heslo</a>
<a class="btn-logout" href="logout.php">Odhlásit se</a>
</header>
<div class="content">
<?php
}
function admin_layout_end(): void
{
?>
</div>
</div>
</div>
<div class="modal-overlay" id="demoModalOverlay">
<div class="modal-box">
<h3>Rezervační systém — demo verze</h3>
<p>Ukázková verze rezervačního systému. Přihlašovací údaje pro administraci (manažer/zaměstnanec):</p>
<div class="demo-creds">
<div class="demo-cred">
<div class="demo-cred__role">Manažer</div>
<div class="demo-cred__line"><b>Jméno</b><span>demo</span></div>
<div class="demo-cred__line"><b>Heslo</b><span>JServices</span></div>
</div>
<div class="demo-cred">
<div class="demo-cred__role">Zaměstnanec</div>
<div class="demo-cred__line"><b>Jméno</b><span>demo.demo</span></div>
<div class="demo-cred__line"><b>Heslo</b><span>JServices</span></div>
</div>
</div>
<div class="modal-actions">
<button type="button" class="btn btn-secondary" onclick="closeDemoModal()">Zavřít</button>
<a href="https://hotel.jservices.cz" target="_blank" rel="noopener" class="btn btn-secondary" onclick="closeDemoModal()">Rezervační stránka ↗</a>
<a href="https://hotel.jservices.cz/admin.html" target="_blank" rel="noopener" class="btn btn-primary" onclick="closeDemoModal()">Administrace ↗</a>
</div>
</div>
</div>
<script>
function openDemoModal(){ document.getElementById('demoModalOverlay').classList.add('open'); }
function closeDemoModal(){ document.getElementById('demoModalOverlay').classList.remove('open'); }
document.getElementById('demoModalOverlay').addEventListener('click', function(e){
if (e.target === this) closeDemoModal();
});
// Mobilní postranní menu — otevření/zavření
var sidebarEl = document.getElementById('sidebar');
var backdropEl = document.getElementById('sidebarBackdrop');
function openSidebar(){ sidebarEl.classList.add('is-open'); backdropEl.classList.add('is-open'); }
function closeSidebar(){ sidebarEl.classList.remove('is-open'); backdropEl.classList.remove('is-open'); }
document.getElementById('sidebarToggle').addEventListener('click', openSidebar);
backdropEl.addEventListener('click', closeSidebar);
</script>
</body>
</html>
<?php
}
/**
* Uloží zprávu, která se zobrazí po přesměrování (typicky po uložení formuláře).
*/
function set_flash(string $type, string $text): void
{
$_SESSION['flash'] = ['type' => $type, 'text' => $text];
}
/**
* Vyzvedne a smaže uloženou flash zprávu (zobrazí se jen jednou).
*/
function get_flash(): ?array
{
if (!empty($_SESSION['flash'])) {
$f = $_SESSION['flash'];
unset($_SESSION['flash']);
return $f;
}
return null;
}
/**
* Vypíše flash zprávu, pokud nějaká čeká.
*/
function render_flash(): void
{
$flash = get_flash();
if ($flash) {
echo '<div class="flash flash-' . htmlspecialchars($flash['type']) . '">' . htmlspecialchars($flash['text']) . '</div>';
}
}