%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
<?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'; ?>