| Server IP : 193.86.120.172 / Your IP : 216.73.216.215 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/jservices_cz/ |
Upload File : |
<?php
declare(strict_types=1);
// Session název musí být nastaven PŘED načtením config.php (který spouští session_start)
session_name('jservices_moje');
require_once __DIR__ . '/config.php';
$chyba = '';
// Přihlášení
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['moje_login'])) {
$username = trim((string) ($_POST['username'] ?? ''));
$password = (string) ($_POST['password'] ?? '');
$stmt = $pdo->prepare('SELECT id, password_hash FROM admin_users WHERE username = :u');
$stmt->execute(['u' => $username]);
$admin = $stmt->fetch();
if ($admin && password_verify($password, $admin['password_hash'])) {
session_regenerate_id(true);
$_SESSION['moje_id'] = $admin['id'];
header('Location: moje.php');
exit;
}
$chyba = 'Nesprávné jméno nebo heslo.';
}
// Odhlášení
if (isset($_GET['odhlasit'])) {
$_SESSION = [];
session_destroy();
header('Location: moje.php');
exit;
}
$prihlaseni = !empty($_SESSION['moje_id']);
// ---- Zpracování akcí (pouze přihlášený) ----
if ($prihlaseni && $_SERVER['REQUEST_METHOD'] === 'POST') {
$akce = (string) ($_POST['akce'] ?? '');
// Šanony
if ($akce === 'pridat_sanon') {
$stmt = $pdo->prepare('INSERT INTO moje_sanony (nazev, barva, ikona, razeni, poradi) VALUES (:n, :b, :i, :r, :p)');
$stmt->execute([
'n' => trim((string) ($_POST['nazev'] ?? '')),
'b' => preg_match('/^#[0-9A-Fa-f]{6}$/', $_POST['barva'] ?? '') ? $_POST['barva'] : '#F5F4EF',
'i' => trim((string) ($_POST['ikona'] ?? 'folder')),
'r' => in_array($_POST['razeni'] ?? '', ['poradi','abc','datum'], true) ? $_POST['razeni'] : 'poradi',
'p' => (int) ($_POST['poradi'] ?? 0),
]);
header('Location: moje.php');
exit;
}
if ($akce === 'upravit_sanon') {
$stmt = $pdo->prepare('UPDATE moje_sanony SET nazev = :n, barva = :b, ikona = :i, razeni = :r, poradi = :p WHERE id = :id');
$stmt->execute([
'n' => trim((string) ($_POST['nazev'] ?? '')),
'b' => preg_match('/^#[0-9A-Fa-f]{6}$/', $_POST['barva'] ?? '') ? $_POST['barva'] : '#F5F4EF',
'i' => trim((string) ($_POST['ikona'] ?? 'folder')),
'r' => in_array($_POST['razeni'] ?? '', ['poradi','abc','datum'], true) ? $_POST['razeni'] : 'poradi',
'p' => (int) ($_POST['poradi'] ?? 0),
'id' => (int) ($_POST['id'] ?? 0),
]);
header('Location: moje.php?sanon=' . ($_POST['id'] ?? ''));
exit;
}
if ($akce === 'smazat_sanon') {
$id = (int) ($_POST['id'] ?? 0);
$pdo->prepare('DELETE FROM moje_polozky WHERE sanon_id = :id')->execute(['id' => $id]);
$pdo->prepare('DELETE FROM moje_sanony WHERE id = :id')->execute(['id' => $id]);
header('Location: moje.php');
exit;
}
// Položky
if ($akce === 'pridat_polozku') {
$typ = in_array($_POST['typ'] ?? '', ['poznamka', 'odkaz', 'soubor'], true) ? $_POST['typ'] : 'poznamka';
$soubor = '';
$velikost = 0;
if ($typ === 'soubor' && !empty($_FILES['soubor']['name'])) {
$slozka = __DIR__ . '/assets/moje/';
if (!is_dir($slozka)) mkdir($slozka, 0750, true);
$ext = strtolower(pathinfo($_FILES['soubor']['name'], PATHINFO_EXTENSION));
$nazevS = uniqid('s_') . '.' . $ext;
if (move_uploaded_file($_FILES['soubor']['tmp_name'], $slozka . $nazevS)) {
$soubor = 'assets/moje/' . $nazevS;
$velikost = (int) $_FILES['soubor']['size'];
}
}
$stmt = $pdo->prepare(
'INSERT INTO moje_polozky (sanon_id, typ, nadpis, obsah, url, soubor, velikost, poradi)
VALUES (:si, :ty, :na, :ob, :ur, :so, :ve, :po)'
);
$stmt->execute([
'si' => (int) ($_POST['sanon_id'] ?? 0),
'ty' => $typ,
'na' => trim((string) ($_POST['nadpis'] ?? '')),
'ob' => trim((string) ($_POST['obsah'] ?? '')),
'ur' => trim((string) ($_POST['url'] ?? '')),
'so' => $soubor,
've' => $velikost,
'po' => (int) ($_POST['poradi'] ?? 0),
]);
header('Location: moje.php?sanon=' . ($_POST['sanon_id'] ?? ''));
exit;
}
if ($akce === 'upravit_polozku') {
$stmt = $pdo->prepare(
'UPDATE moje_polozky SET nadpis = :na, obsah = :ob, url = :ur, poradi = :po WHERE id = :id'
);
$stmt->execute([
'na' => trim((string) ($_POST['nadpis'] ?? '')),
'ob' => trim((string) ($_POST['obsah'] ?? '')),
'ur' => trim((string) ($_POST['url'] ?? '')),
'po' => (int) ($_POST['poradi'] ?? 0),
'id' => (int) ($_POST['id'] ?? 0),
]);
header('Location: moje.php?sanon=' . ($_POST['sanon_id'] ?? ''));
exit;
}
if ($akce === 'smazat_polozku') {
$stmt = $pdo->prepare('SELECT soubor, sanon_id FROM moje_polozky WHERE id = :id');
$stmt->execute(['id' => (int) ($_POST['id'] ?? 0)]);
$pol = $stmt->fetch();
if ($pol && $pol['soubor'] !== '') {
$cesta = __DIR__ . '/' . $pol['soubor'];
if (file_exists($cesta)) unlink($cesta);
}
$pdo->prepare('DELETE FROM moje_polozky WHERE id = :id')->execute(['id' => (int) ($_POST['id'] ?? 0)]);
header('Location: moje.php?sanon=' . ($pol['sanon_id'] ?? ''));
exit;
}
}
// ---- Data ----
$sanony = $prihlaseni ? $pdo->query('SELECT * FROM moje_sanony ORDER BY poradi ASC, id ASC')->fetchAll() : [];
$aktivniSanon = null;
$polozky = [];
$upravPolozku = null;
$upravSanon = null;
if ($prihlaseni && isset($_GET['sanon'])) {
$sidGet = (int) $_GET['sanon'];
foreach ($sanony as $s) {
if ((int) $s['id'] === $sidGet) { $aktivniSanon = $s; break; }
}
if ($aktivniSanon) {
$razeni = $aktivniSanon['razeni'] ?? 'poradi';
$orderBy = match($razeni) {
'abc' => 'nadpis ASC',
'datum' => 'vytvoreno DESC',
default => 'poradi ASC, vytvoreno DESC',
};
$stmt = $pdo->prepare("SELECT * FROM moje_polozky WHERE sanon_id = :id ORDER BY {$orderBy}");
$stmt->execute(['id' => $aktivniSanon['id']]);
$polozky = $stmt->fetchAll();
}
}
if ($prihlaseni && isset($_GET['upravit_polozku'])) {
$stmt = $pdo->prepare('SELECT * FROM moje_polozky WHERE id = :id');
$stmt->execute(['id' => (int) $_GET['upravit_polozku']]);
$upravPolozku = $stmt->fetch() ?: null;
if ($upravPolozku && !$aktivniSanon) {
foreach ($sanony as $s) {
if ((int) $s['id'] === (int) $upravPolozku['sanon_id']) { $aktivniSanon = $s; break; }
}
}
}
if ($prihlaseni && isset($_GET['upravit_sanon'])) {
foreach ($sanony as $s) {
if ((int) $s['id'] === (int) $_GET['upravit_sanon']) { $upravSanon = $s; break; }
}
}
function formatVelikost(int $b): string {
if ($b < 1024) return $b . ' B';
if ($b < 1048576) return round($b / 1024, 1) . ' KB';
return round($b / 1048576, 1) . ' MB';
}
$barvy = ['#F5F4EF', '#EAF2FA', '#EAF3DE', '#FDF3E3', '#FCEBEB', '#F0E8FA', '#E8F4F8', '#FFF8E1'];
?>
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="robots" content="noindex, nofollow">
<title>Můj portál | J Services</title>
<link rel="stylesheet" href="assets/css/admin.css">
<style>
.moje-layout { display: flex; min-height: calc(100vh - 57px); }
.moje-sidebar {
width: 240px;
flex-shrink: 0;
background: var(--bg-primary);
border-right: 0.5px solid var(--border-tertiary);
padding: 16px 0;
}
.moje-sidebar-nadpis {
font-size: 11px;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
color: var(--text-tertiary);
padding: 0 16px 8px;
}
.sanon-link {
display: flex;
align-items: center;
gap: 8px;
padding: 9px 16px;
font-size: 13.5px;
color: var(--text-primary);
text-decoration: none !important;
border-left: 3px solid transparent;
}
.sanon-link:hover { background: var(--bg-tertiary); }
.sanon-link.aktivni { border-left-color: var(--text-info); background: var(--bg-info); color: var(--text-info); font-weight: 500; }
.sanon-tecka {
width: 10px; height: 10px;
border-radius: 50%;
flex-shrink: 0;
}
.sanon-pridat {
display: flex;
align-items: center;
gap: 8px;
padding: 9px 16px;
font-size: 13px;
color: var(--text-tertiary);
cursor: pointer;
background: none;
border: none;
width: 100%;
text-align: left;
font-family: inherit;
}
.sanon-pridat:hover { color: var(--text-info); }
.moje-obsah { flex: 1; padding: 28px; overflow-y: auto; }
.polozka-karta {
background: var(--bg-primary);
border: 0.5px solid var(--border-tertiary);
border-radius: var(--radius-lg);
padding: 18px 20px;
margin-bottom: 14px;
}
.polozka-karta .typ-badge {
font-size: 11px;
font-weight: 500;
padding: 2px 8px;
border-radius: var(--radius-md);
margin-left: 8px;
}
.badge-poznamka { background: #F0E8FA; color: #6B3FA0; }
.badge-odkaz { background: var(--bg-info); color: var(--text-info); }
.badge-soubor { background: #EAF3DE; color: var(--text-success); }
.polozka-obsah {
font-size: 14px;
color: var(--text-secondary);
line-height: 1.7;
margin-top: 10px;
}
.polozka-obsah h1, .polozka-obsah h2, .polozka-obsah h3 { color: var(--text-primary); margin: 12px 0 6px; }
.polozka-obsah ul, .polozka-obsah ol { padding-left: 20px; }
.polozka-meta { font-size: 12px; color: var(--text-tertiary); margin-top: 10px; }
.polozka-toggle:hover { color: var(--text-info); }
.polozka-toggle:hover .toggle-sipka { stroke: var(--text-info); }
/* Typ přepínač */
.typ-prepinac { display: flex; gap: 8px; margin-bottom: 14px; }
.typ-prepinac label {
flex: 1;
text-align: center;
padding: 8px;
border: 0.5px solid var(--border-secondary);
border-radius: var(--radius-md);
cursor: pointer;
font-size: 13px;
font-weight: 400;
}
.typ-prepinac input { display: none; }
.typ-prepinac input:checked + span {
font-weight: 500;
}
.typ-prepinac label:has(input:checked) {
border-color: var(--text-info);
background: var(--bg-info);
color: var(--text-info);
}
.barva-vyber { display: flex; gap: 8px; margin-bottom: 14px; flex-wrap: wrap; }
.barva-volba { width: 28px; height: 28px; border-radius: 50%; border: 2px solid transparent; cursor: pointer; }
.barva-volba.aktivni { border-color: var(--text-primary); }
@media (max-width: 720px) {
.moje-layout { flex-direction: column; }
.moje-sidebar { width: 100%; border-right: none; border-bottom: 0.5px solid var(--border-tertiary); }
}
</style>
<!-- Quill WYSIWYG editor -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.7/quill.snow.min.css">
<style>
.ql-container { font-family: var(--font-sans); font-size: 14px; min-height: 300px; border-radius: 0 0 var(--radius-md) var(--radius-md); }
.ql-toolbar { border-radius: var(--radius-md) var(--radius-md) 0 0; background: var(--bg-tertiary); }
.ql-toolbar, .ql-container { border-color: var(--border-secondary) !important; }
.ql-editor { min-height: 300px; line-height: 1.8; }
.ql-editor p { margin-bottom: 8px; }
.ql-editor h1, .ql-editor h2, .ql-editor h3 { margin: 16px 0 8px; color: var(--text-primary); }
</style>
</head>
<body>
<header class="admin-hlavicka">
<div class="logo">J Services – můj portál</div>
<?php if ($prihlaseni): ?>
<div>
<a href="admin.php" class="btn btn-sm">Administrace</a>
<a href="moje.php?odhlasit=1" class="btn btn-sm">Odhlásit se</a>
</div>
<?php endif; ?>
</header>
<?php if (!$prihlaseni): ?>
<div class="prihlaseni-stranka">
<div class="prihlaseni-karta">
<div class="logo" style="text-align:center;margin-bottom:1.5rem;font-size:16px;font-weight:600;">Můj portál</div>
<?php if ($chyba !== ''): ?>
<div class="zprava-chyba"><?= e($chyba) ?></div>
<?php endif; ?>
<form method="post">
<input type="hidden" name="moje_login" value="1">
<label for="username">Uživatelské jméno</label>
<input type="text" id="username" name="username" required autofocus>
<label for="password">Heslo</label>
<input type="password" id="password" name="password" required>
<button type="submit" class="btn btn-primary" style="width:100%;">Přihlásit se</button>
</form>
</div>
</div>
<?php else: ?>
<div class="moje-layout">
<aside class="moje-sidebar">
<p class="moje-sidebar-nadpis">Šanony</p>
<?php foreach ($sanony as $s): ?>
<a href="moje.php?sanon=<?= (int) $s['id'] ?>" class="sanon-link <?= $aktivniSanon && (int) $aktivniSanon['id'] === (int) $s['id'] ? 'aktivni' : '' ?>">
<span class="sanon-tecka" style="background:<?= e($s['barva']) ?>;border:1px solid rgba(0,0,0,0.1);"></span>
<?= e($s['nazev']) ?>
</a>
<?php endforeach; ?>
<a href="moje.php?novy_sanon=1" class="sanon-pridat">+ Nový šanon</a>
</aside>
<main class="moje-obsah">
<?php if (isset($_GET['novy_sanon']) || $upravSanon): ?>
<div class="karta" style="max-width:480px;">
<h2 style="margin-bottom:16px;"><?= $upravSanon ? 'Upravit šanon' : 'Nový šanon' ?></h2>
<form method="post">
<input type="hidden" name="akce" value="<?= $upravSanon ? 'upravit_sanon' : 'pridat_sanon' ?>">
<?php if ($upravSanon): ?>
<input type="hidden" name="id" value="<?= (int) $upravSanon['id'] ?>">
<?php endif; ?>
<label for="sanon_nazev">Název</label>
<input type="text" id="sanon_nazev" name="nazev" required value="<?= e($upravSanon['nazev'] ?? '') ?>">
<label>Barva</label>
<div class="barva-vyber">
<?php foreach ($barvy as $b): ?>
<div class="barva-volba <?= ($upravSanon['barva'] ?? '#F5F4EF') === $b ? 'aktivni' : '' ?>"
style="background:<?= e($b) ?>;border:1px solid rgba(0,0,0,0.1);"
onclick="document.getElementById('barva_input').value='<?= e($b) ?>';document.querySelectorAll('.barva-volba').forEach(v=>v.classList.remove('aktivni'));this.classList.add('aktivni');">
</div>
<?php endforeach; ?>
</div>
<input type="hidden" name="barva" id="barva_input" value="<?= e($upravSanon['barva'] ?? '#F5F4EF') ?>">
<label for="sanon_poradi">Pořadí</label>
<input type="number" id="sanon_poradi" name="poradi" min="0" value="<?= (int) ($upravSanon['poradi'] ?? count($sanony) + 1) ?>">
<label>Řazení položek</label>
<div style="display:flex;gap:12px;margin-bottom:14px;">
<label style="display:flex;align-items:center;gap:6px;font-weight:400;cursor:pointer;">
<input type="radio" name="razeni" value="poradi" <?= ($upravSanon['razeni'] ?? 'poradi') === 'poradi' ? 'checked' : '' ?>>
Vlastní pořadí
</label>
<label style="display:flex;align-items:center;gap:6px;font-weight:400;cursor:pointer;">
<input type="radio" name="razeni" value="abc" <?= ($upravSanon['razeni'] ?? '') === 'abc' ? 'checked' : '' ?>>
Abecedně (A–Z)
</label>
<label style="display:flex;align-items:center;gap:6px;font-weight:400;cursor:pointer;">
<input type="radio" name="razeni" value="datum" <?= ($upravSanon['razeni'] ?? '') === 'datum' ? 'checked' : '' ?>>
Datum (nejnovější)
</label>
</div>
<div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;">
<button type="submit" class="btn btn-primary"><?= $upravSanon ? 'Uložit' : 'Vytvořit šanon' ?></button>
<a href="moje.php<?= $upravSanon ? '?sanon=' . (int) $upravSanon['id'] : '' ?>" class="btn">Zrušit</a>
</div>
</form>
<?php if ($upravSanon): ?>
<form method="post" style="margin-top:12px;" onsubmit="return confirm('Smazat šanon a vše v něm?');">
<input type="hidden" name="akce" value="smazat_sanon">
<input type="hidden" name="id" value="<?= (int) $upravSanon['id'] ?>">
<button type="submit" class="btn btn-sm btn-danger">Smazat šanon</button>
</form>
<?php endif; ?>
</div>
<?php elseif ($aktivniSanon): ?>
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:20px;flex-wrap:wrap;gap:10px;">
<div style="display:flex;align-items:center;gap:10px;">
<div style="width:14px;height:14px;border-radius:50%;background:<?= e($aktivniSanon['barva']) ?>;border:1px solid rgba(0,0,0,0.1);"></div>
<h1><?= e($aktivniSanon['nazev']) ?></h1>
</div>
<div style="display:flex;gap:8px;">
<a href="moje.php?sanon=<?= (int) $aktivniSanon['id'] ?>&nova_polozka=1" class="btn btn-primary">+ Přidat položku</a>
<a href="moje.php?upravit_sanon=<?= (int) $aktivniSanon['id'] ?>" class="btn btn-sm">Upravit šanon</a>
</div>
</div>
<?php if (isset($_GET['nova_polozka']) || $upravPolozku): ?>
<div class="karta" style="margin-bottom:24px;">
<h2 style="margin-bottom:16px;"><?= $upravPolozku ? 'Upravit položku' : 'Nová položka' ?></h2>
<form method="post" enctype="multipart/form-data">
<input type="hidden" name="akce" value="<?= $upravPolozku ? 'upravit_polozku' : 'pridat_polozku' ?>">
<input type="hidden" name="sanon_id" value="<?= (int) $aktivniSanon['id'] ?>">
<?php if ($upravPolozku): ?>
<input type="hidden" name="id" value="<?= (int) $upravPolozku['id'] ?>">
<?php endif; ?>
<?php if (!$upravPolozku): ?>
<label>Typ položky</label>
<div class="typ-prepinac">
<label><input type="radio" name="typ" value="poznamka" checked onchange="prepniTyp(this.value)"><span>📝 Poznámka</span></label>
<label><input type="radio" name="typ" value="odkaz" onchange="prepniTyp(this.value)"><span>🔗 Odkaz</span></label>
<label><input type="radio" name="typ" value="soubor" onchange="prepniTyp(this.value)"><span>📎 Soubor</span></label>
</div>
<?php else: ?>
<input type="hidden" name="typ" value="<?= e($upravPolozku['typ']) ?>">
<?php endif; ?>
<label for="polozka_nadpis">Nadpis</label>
<input type="text" id="polozka_nadpis" name="nadpis" required value="<?= e($upravPolozku['nadpis'] ?? '') ?>">
<div id="pole-obsah">
<label>Text</label>
<div id="quill-editor" style="background:#fff;"></div>
<input type="hidden" name="obsah" id="obsah-hidden">
</div>
<div id="pole-url" style="display:none;">
<label for="polozka_url">URL odkazu</label>
<input type="url" id="polozka_url" name="url" value="<?= e($upravPolozku['url'] ?? '') ?>" placeholder="https://...">
</div>
<div id="pole-soubor" style="display:none;">
<label for="polozka_soubor">Soubor</label>
<input type="file" id="polozka_soubor" name="soubor" style="margin-bottom:14px;">
</div>
<label for="polozka_poradi">Pořadí</label>
<input type="number" id="polozka_poradi" name="poradi" min="0" value="<?= (int) ($upravPolozku['poradi'] ?? count($polozky) + 1) ?>">
<div style="display:flex;gap:8px;flex-wrap:wrap;">
<button type="submit" class="btn btn-primary"><?= $upravPolozku ? 'Uložit změny' : 'Přidat' ?></button>
<a href="moje.php?sanon=<?= (int) $aktivniSanon['id'] ?>" class="btn">Zrušit</a>
</div>
</form>
</div>
<?php endif; ?>
<?php if (count($polozky) === 0 && !isset($_GET['nova_polozka'])): ?>
<p style="color:var(--text-secondary);">Šanon je prázdný. <a href="moje.php?sanon=<?= (int) $aktivniSanon['id'] ?>&nova_polozka=1">Přidejte první položku</a>.</p>
<?php endif; ?>
<?php foreach ($polozky as $pol): ?>
<div class="polozka-karta">
<div style="display:flex;align-items:flex-start;justify-content:space-between;gap:10px;flex-wrap:wrap;">
<div class="polozka-toggle" onclick="prepniPolozku(this)" style="display:flex;align-items:center;gap:8px;cursor:pointer;flex:1;min-width:0;">
<svg class="toggle-sipka" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" style="flex-shrink:0;transition:transform 0.2s;transform:rotate(-90deg);" aria-hidden="true"><polyline points="6 9 12 15 18 9"/></svg>
<span style="font-size:15px;font-weight:500;"><?= e($pol['nadpis']) ?></span>
<span class="typ-badge badge-<?= e($pol['typ']) ?>"><?= ['poznamka'=>'Poznámka','odkaz'=>'Odkaz','soubor'=>'Soubor'][$pol['typ']] ?></span>
</div>
<div style="display:flex;gap:6px;flex-shrink:0;">
<a href="moje.php?sanon=<?= (int) $aktivniSanon['id'] ?>&upravit_polozku=<?= (int) $pol['id'] ?>" class="btn btn-sm">Upravit</a>
<form method="post" style="display:inline;" onsubmit="return confirm('Smazat položku?');">
<input type="hidden" name="akce" value="smazat_polozku">
<input type="hidden" name="id" value="<?= (int) $pol['id'] ?>">
<button type="submit" class="btn btn-sm btn-danger">Smazat</button>
</form>
</div>
</div>
<div class="polozka-obsah-obal" style="display:none;margin-top:12px;">
<?php if ($pol['typ'] === 'poznamka' && $pol['obsah'] !== ''): ?>
<div class="polozka-obsah ql-editor" style="padding:0;"><?= $pol['obsah'] ?></div>
<?php elseif ($pol['typ'] === 'odkaz' && $pol['url'] !== ''): ?>
<div class="polozka-obsah">
<a href="<?= e($pol['url']) ?>" target="_blank" rel="noopener"><?= e($pol['url']) ?></a>
<?php if ($pol['obsah'] !== ''): ?><p style="margin-top:6px;"><?= e($pol['obsah']) ?></p><?php endif; ?>
</div>
<?php elseif ($pol['typ'] === 'soubor' && $pol['soubor'] !== ''): ?>
<div class="polozka-obsah">
<a href="<?= e($pol['soubor']) ?>" target="_blank" rel="noopener">⬇ Stáhnout soubor</a>
<span style="color:var(--text-tertiary);font-size:12px;margin-left:8px;"><?= formatVelikost((int) $pol['velikost']) ?></span>
<?php if ($pol['obsah'] !== ''): ?><p style="margin-top:6px;"><?= e($pol['obsah']) ?></p><?php endif; ?>
</div>
<?php endif; ?>
<p class="polozka-meta"><?= e(date('j. n. Y H:i', strtotime((string) $pol['vytvoreno']))) ?></p>
</div>
</div>
<?php endforeach; ?>
<?php else: ?>
<div style="text-align:center;padding:60px 20px;color:var(--text-tertiary);">
<p style="font-size:18px;margin-bottom:8px;">Vyberte šanon vlevo</p>
<p style="font-size:14px;">nebo <a href="moje.php?novy_sanon=1">vytvořte nový</a></p>
</div>
<?php endif; ?>
</main>
</div>
<script>
function prepniPolozku(el) {
var karta = el.closest('.polozka-karta');
var obsah = karta.querySelector('.polozka-obsah-obal');
var sipka = el.querySelector('.toggle-sipka');
var otevreno = obsah.style.display !== 'none';
obsah.style.display = otevreno ? 'none' : 'block';
sipka.style.transform = otevreno ? 'rotate(-90deg)' : 'rotate(0deg)';
}
function prepniTyp(typ) {
document.getElementById('pole-obsah').style.display = typ === 'poznamka' ? '' : 'none';
document.getElementById('pole-url').style.display = typ === 'odkaz' ? '' : 'none';
document.getElementById('pole-soubor').style.display = typ === 'soubor' ? '' : 'none';
}
</script>
<?php if ($aktivniSanon && (isset($_GET['nova_polozka']) || $upravPolozku)): ?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/quill/1.3.7/quill.min.js"></script>
<script>
var quill = new Quill('#quill-editor', {
theme: 'snow',
modules: {
toolbar: [
[{ 'header': [1, 2, 3, false] }],
['bold', 'italic', 'underline', 'strike'],
[{ 'color': [] }, { 'background': [] }],
[{ 'list': 'ordered'}, { 'list': 'bullet' }],
[{ 'indent': '-1'}, { 'indent': '+1' }],
[{ 'align': [] }],
['link', 'blockquote', 'code-block'],
['clean']
]
}
});
var quillObsah = <?= json_encode(($upravPolozku['obsah'] ?? '')) ?>;
if (quillObsah) {
quill.clipboard.dangerouslyPasteHTML(quillObsah);
}
document.getElementById('quill-editor').closest('form').addEventListener('submit', function () {
document.getElementById('obsah-hidden').value = quill.root.innerHTML;
});
</script>
<?php endif; ?>
<?php endif; ?>
</body>
</html>