%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: form tambah / edit dokumen informasi publik.
*/
require_once dirname(__DIR__) . '/config/config.php';
require_once dirname(__DIR__) . '/includes/auth.php';
require_once dirname(__DIR__) . '/includes/queries.php';
require_once dirname(__DIR__) . '/includes/upload.php';
require_admin();
$id = (int) get_param('id', '0');
$isEdit = $id > 0;
$kategoriList = get_kategori();
$direktoriList = get_direktori_list();
$errors = [];
// Scope UPD: admin UPD terkunci pada unitnya; admin pusat bebas memilih.
$scopeUpd = is_upd_admin() ? current_upd_id() : null;
$updList = get_upd_list();
// Nilai awal.
$data = [
'kategori_id' => (int) get_param('kategori', '0'),
'upd_id' => $scopeUpd, // default: UPD admin → unitnya; pusat → null (PPID Utama)
'direktori_id' => 0,
'judul' => '',
'deskripsi' => '',
'tahun' => date('Y'),
'unit_kerja' => '',
'status' => 'publish',
];
if ($isEdit) {
$dok = get_dokumen($id);
if (!$dok) {
set_flash('error', 'Dokumen tidak ditemukan.');
redirect('admin/dokumen.php');
}
// Otorisasi: admin UPD hanya boleh mengelola dokumen unitnya sendiri.
if (is_upd_admin() && (int) ($dok['upd_id'] ?? 0) !== (int) current_upd_id()) {
set_flash('error', 'Anda tidak memiliki hak untuk mengelola dokumen unit lain.');
redirect('admin/dokumen.php');
}
$data = [
'kategori_id' => (int) $dok['kategori_id'],
'upd_id' => $dok['upd_id'] !== null ? (int) $dok['upd_id'] : null,
'direktori_id' => (int) ($dok['direktori_id'] ?? 0),
'judul' => $dok['judul'],
'deskripsi' => $dok['deskripsi'],
'tahun' => $dok['tahun'],
'unit_kerja' => $dok['unit_kerja'],
'status' => $dok['status'],
];
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
csrf_verify();
// Tentukan UPD: admin UPD dipaksa ke unitnya; pusat sesuai pilihan.
if ($scopeUpd !== null) {
$updId = $scopeUpd;
} else {
$rawUpd = post_param('upd_id');
$updId = (ctype_digit($rawUpd) && (int) $rawUpd > 0 && get_upd((int) $rawUpd)) ? (int) $rawUpd : null;
}
$data = [
'kategori_id' => (int) post_param('kategori_id'),
'upd_id' => $updId,
'direktori_id' => (int) post_param('direktori_id'),
'judul' => post_param('judul'),
'deskripsi' => post_param('deskripsi'),
'tahun' => post_param('tahun'),
'unit_kerja' => post_param('unit_kerja'),
'status' => post_param('status', 'publish'),
];
$dirRow = ($data['direktori_id'] > 0) ? get_direktori($data['direktori_id']) : null;
if ($dirRow && !empty($dirRow['kategori_id'])) {
$data['kategori_id'] = (int) $dirRow['kategori_id'];
}
if ($data['judul'] === '') {
$errors['judul'] = 'Judul dokumen wajib diisi.';
}
if (!get_kategori_by_id($data['kategori_id'])) {
$errors['kategori_id'] = 'Kategori wajib dipilih.';
}
if ($data['tahun'] !== '' && !preg_match('/^\d{4}$/', $data['tahun'])) {
$errors['tahun'] = 'Tahun harus 4 digit.';
}
if (!in_array($data['status'], ['publish', 'draft'], true)) {
$data['status'] = 'publish';
}
// Tangani upload berkas (opsional).
$fileInfo = null;
if (!empty($_FILES['file']['name'])) {
$up = handle_upload($_FILES['file'], 'dokumen');
if (!$up['ok']) {
$errors['file'] = $up['error'];
} else {
$fileInfo = $up;
}
}
if (empty($errors)) {
$tahun = $data['tahun'] !== '' ? (int) $data['tahun'] : null;
$dirId = $dirRow ? $data['direktori_id'] : null;
if ($isEdit) {
$sql = 'UPDATE dokumen_informasi SET kategori_id=?, upd_id=?, direktori_id=?, judul=?, deskripsi=?, tahun=?, unit_kerja=?, status=?';
$params = [$data['kategori_id'], $data['upd_id'], $dirId, $data['judul'], $data['deskripsi'], $tahun, $data['unit_kerja'], $data['status']];
if ($fileInfo) {
// Hapus berkas lama.
$old = get_dokumen($id);
delete_upload('dokumen', $old['file_name'] ?? null);
$sql .= ', file_name=?, file_original=?, file_size=?, file_mime=?';
array_push($params, $fileInfo['filename'], $fileInfo['original'], $fileInfo['size'], $fileInfo['mime']);
}
$sql .= ' WHERE id=?';
$params[] = $id;
db()->prepare($sql)->execute($params);
set_flash('success', 'Dokumen berhasil diperbarui.');
} else {
$stmt = db()->prepare(
'INSERT INTO dokumen_informasi
(kategori_id, upd_id, direktori_id, judul, deskripsi, tahun, unit_kerja, status, file_name, file_original, file_size, file_mime, created_by)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'
);
$stmt->execute([
$data['kategori_id'], $data['upd_id'], $dirId, $data['judul'], $data['deskripsi'], $tahun, $data['unit_kerja'], $data['status'],
$fileInfo['filename'] ?? null, $fileInfo['original'] ?? null, $fileInfo['size'] ?? 0, $fileInfo['mime'] ?? null,
current_admin()['id'],
]);
set_flash('success', 'Dokumen baru berhasil ditambahkan.');
}
redirect('admin/dokumen.php');
}
}
$pageTitle = ($isEdit ? 'Edit' : 'Tambah') . ' Dokumen — CMS PPID';
$activeMenu = 'dokumen';
require __DIR__ . '/partials/head.php';
$val = static fn (string $k) => e($data[$k] ?? '');
?>
<div class="mb-6">
<a href="<?= e(url('admin/dokumen.php')) ?>" class="text-sm text-slate-500 hover:text-mateng-green inline-flex items-center gap-2 mb-3"><i class="fas fa-arrow-left"></i> Kembali ke daftar</a>
<h2 class="text-2xl font-bold text-slate-900"><?= $isEdit ? 'Edit Dokumen' : 'Tambah Dokumen Baru' ?></h2>
</div>
<form method="post" enctype="multipart/form-data" class="max-w-3xl bg-white border border-slate-100 rounded-xl shadow-sm p-6 sm:p-8 space-y-5">
<?= csrf_field() ?>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1.5">Judul Dokumen <span class="text-red-500">*</span></label>
<input type="text" name="judul" value="<?= $val('judul') ?>" class="w-full rounded-lg border px-4 py-2.5 outline-none focus:ring-4 <?= isset($errors['judul']) ? 'border-red-300 focus:ring-red-100' : 'border-slate-300 focus:border-mateng-green focus:ring-green-100' ?>">
<?php if (isset($errors['judul'])): ?><p class="text-xs text-red-500 mt-1"><?= e($errors['judul']) ?></p><?php endif; ?>
</div>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1.5">Folder / Direktori</label>
<select name="direktori_id" id="dokDirektori" class="w-full rounded-lg border border-slate-300 px-4 py-2.5 outline-none focus:border-mateng-green focus:ring-4 focus:ring-green-100 bg-white">
<option value="0" data-kategori-id="0">— Tanpa folder (pilih kategori manual) —</option>
<?php foreach ($direktoriList as $dir): ?>
<option value="<?= (int) $dir['id'] ?>" data-kategori-id="<?= (int) ($dir['kategori_id'] ?? 0) ?>" <?= (int) $data['direktori_id'] === (int) $dir['id'] ? 'selected' : '' ?>>
<?= e($dir['nama']) ?><?= !empty($dir['kategori_nama']) ? ' — ' . e($dir['kategori_nama']) : ' (belum ada kategori)' ?>
</option>
<?php endforeach; ?>
</select>
<p class="text-xs text-slate-400 mt-1">Pilih folder — <strong>kategori otomatis mengikuti folder</strong>.<?php if (is_central()): ?> Atur folder & kategorinya di <a href="<?= e(url('admin/direktori.php')) ?>" class="text-mateng-blue hover:underline">Master Direktori</a>.<?php endif; ?></p>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-4">
<div>
<label class="block text-sm font-medium text-slate-700 mb-1.5">Kategori <span class="text-red-500">*</span></label>
<select name="kategori_id" id="dokKategori" class="w-full rounded-lg border px-4 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'] ?>" <?= $data['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 id="dokKatAuto" class="text-xs text-mateng-blue mt-1 hidden"><i class="fas fa-link mr-1"></i>Terisi otomatis dari folder yang dipilih.</p>
</div>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1.5">Tahun</label>
<input type="text" name="tahun" value="<?= $val('tahun') ?>" inputmode="numeric" maxlength="4" class="w-full rounded-lg border px-4 py-2.5 outline-none focus:ring-4 <?= isset($errors['tahun']) ? 'border-red-300 focus:ring-red-100' : 'border-slate-300 focus:border-mateng-green focus:ring-green-100' ?>">
<?php if (isset($errors['tahun'])): ?><p class="text-xs text-red-500 mt-1"><?= e($errors['tahun']) ?></p><?php endif; ?>
</div>
</div>
<?php if ($scopeUpd === null): ?>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1.5">Unit Perangkat Daerah (PPID Pembantu)</label>
<select name="upd_id" class="w-full rounded-lg border border-slate-300 px-4 py-2.5 outline-none focus:border-mateng-green focus:ring-4 focus:ring-green-100 bg-white">
<option value="">— PPID Utama (tingkat kabupaten) —</option>
<?php foreach ($updList as $u): ?>
<option value="<?= (int) $u['id'] ?>" <?= (int) ($data['upd_id'] ?? 0) === (int) $u['id'] ? 'selected' : '' ?>>
<?= e($u['nama']) ?><?= $u['singkatan'] ? ' (' . e($u['singkatan']) . ')' : '' ?>
</option>
<?php endforeach; ?>
</select>
<p class="text-xs text-slate-400 mt-1">Pilih UPD bila dokumen milik PPID Pembantu; biarkan "PPID Utama" untuk dokumen tingkat kabupaten.</p>
</div>
<?php else: ?>
<div class="bg-blue-50 border border-blue-100 rounded-lg px-4 py-3 text-sm text-mateng-blue flex items-center gap-2">
<i class="fas fa-sitemap"></i> Dokumen akan tercatat untuk unit Anda: <strong><?= e(current_upd_nama()) ?></strong>
</div>
<?php endif; ?>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1.5">Unit Kerja / Sumber</label>
<input type="text" name="unit_kerja" value="<?= $val('unit_kerja') ?>" placeholder="Contoh: Bidang, Seksi, atau sumber dokumen" class="w-full rounded-lg border border-slate-300 px-4 py-2.5 outline-none focus:border-mateng-green focus:ring-4 focus:ring-green-100">
</div>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1.5">Deskripsi</label>
<textarea name="deskripsi" rows="4" class="w-full rounded-lg border border-slate-300 px-4 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">Berkas Dokumen <?= $isEdit ? '<span class="text-xs text-slate-400">(kosongkan jika tidak diubah)</span>' : '' ?></label>
<?php if ($isEdit && !empty($dok['file_name'])): ?>
<p class="text-xs text-slate-500 mb-2"><i class="fas <?= e(file_icon($dok['file_original'] ?? '')) ?> mr-1"></i> Berkas saat ini: <?= e($dok['file_original'] ?: $dok['file_name']) ?> (<?= e(format_size((int) $dok['file_size'])) ?>)</p>
<?php endif; ?>
<input type="file" name="file" class="w-full text-sm text-slate-600 file:mr-3 file:py-2 file:px-4 file:rounded-lg file:border-0 file:bg-mateng-green/10 file:text-mateng-green file:font-semibold hover:file:bg-mateng-green/20 file:cursor-pointer">
<?php if (isset($errors['file'])): ?><p class="text-xs text-red-500 mt-1"><?= e($errors['file']) ?></p><?php endif; ?>
<p class="text-xs text-slate-400 mt-1">Format: PDF, DOC, XLS, PPT, JPG, PNG, ZIP. Maks <?= format_size(MAX_UPLOAD_SIZE) ?>.</p>
</div>
<div>
<label class="block text-sm font-medium text-slate-700 mb-1.5">Status Publikasi</label>
<div class="flex gap-3">
<label class="flex items-center gap-2 px-4 py-2.5 border rounded-lg cursor-pointer <?= $data['status'] === 'publish' ? 'border-mateng-green bg-green-50' : 'border-slate-300' ?>">
<input type="radio" name="status" value="publish" <?= $data['status'] === 'publish' ? 'checked' : '' ?> class="accent-mateng-green"> <span class="text-sm">Terbitkan</span>
</label>
<label class="flex items-center gap-2 px-4 py-2.5 border rounded-lg cursor-pointer <?= $data['status'] === 'draft' ? 'border-mateng-green bg-green-50' : 'border-slate-300' ?>">
<input type="radio" name="status" value="draft" <?= $data['status'] === 'draft' ? 'checked' : '' ?> class="accent-mateng-green"> <span class="text-sm">Simpan sebagai draf</span>
</label>
</div>
</div>
<div class="flex gap-3 pt-2">
<button type="submit" class="bg-mateng-green hover:bg-green-700 text-white font-bold px-6 py-3 rounded-lg transition-colors flex items-center gap-2"><i class="fas fa-save"></i> <?= $isEdit ? 'Perbarui' : 'Simpan' ?> Dokumen</button>
<a href="<?= e(url('admin/dokumen.php')) ?>" class="bg-slate-100 hover:bg-slate-200 text-slate-700 font-semibold px-6 py-3 rounded-lg transition-colors">Batal</a>
</div>
</form>
<script>
(function () {
var dir = document.getElementById('dokDirektori');
var kat = document.getElementById('dokKategori');
var note = document.getElementById('dokKatAuto');
if (!dir || !kat) return;
function sync() {
var opt = dir.options[dir.selectedIndex];
var kid = opt ? opt.getAttribute('data-kategori-id') : '0';
if (dir.value !== '0' && kid && kid !== '0') {
kat.value = kid;
kat.setAttribute('disabled', 'disabled');
kat.classList.add('bg-slate-100', 'text-slate-500', 'cursor-not-allowed');
if (note) note.classList.remove('hidden');
} else {
kat.removeAttribute('disabled');
kat.classList.remove('bg-slate-100', 'text-slate-500', 'cursor-not-allowed');
if (note) note.classList.add('hidden');
}
}
dir.addEventListener('change', sync);
sync();
})();
</script>
<?php require __DIR__ . '/partials/foot.php'; ?>