%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: monitoring & moderasi testimoni masyarakat.
* Admin dapat mempublikasikan / menarik publikasi serta menghapus testimoni.
*/
require_once dirname(__DIR__) . '/config/config.php';
require_once dirname(__DIR__) . '/includes/auth.php';
require_once dirname(__DIR__) . '/includes/queries.php';
require_central();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
csrf_verify();
$id = (int) post_param('id');
$action = post_param('action');
if ($id > 0) {
if ($action === 'publish') {
db()->prepare('UPDATE testimoni SET is_published = 1 WHERE id = ?')->execute([$id]);
set_flash('success', 'Testimoni dipublikasikan ke halaman publik.');
} elseif ($action === 'unpublish') {
db()->prepare('UPDATE testimoni SET is_published = 0 WHERE id = ?')->execute([$id]);
set_flash('success', 'Publikasi testimoni ditarik.');
} elseif ($action === 'hapus') {
db()->prepare('DELETE FROM testimoni WHERE id = ?')->execute([$id]);
set_flash('success', 'Testimoni berhasil dihapus.');
}
}
redirect('admin/testimoni.php' . (get_param('f') ? '?f=' . get_param('f') : ''));
}
// Filter: all | pending (belum publish) | published
$f = get_param('f');
$where = '';
if ($f === 'published') {
$where = 'WHERE t.is_published = 1';
} elseif ($f === 'pending') {
$where = 'WHERE t.is_published = 0';
}
$rows = db()->query(
"SELECT t.*, p.rincian_informasi
FROM testimoni t
LEFT JOIN permohonan p ON p.id = t.permohonan_id
$where
ORDER BY t.is_published ASC, t.created_at DESC"
)->fetchAll();
$stats = testimoni_stats();
$pending = (int) db()->query('SELECT COUNT(*) FROM testimoni WHERE is_published = 0')->fetchColumn();
$totalAll = (int) db()->query('SELECT COUNT(*) FROM testimoni')->fetchColumn();
$pageTitle = 'Testimoni & Rating — CMS PPID';
$activeMenu = 'testimoni';
require __DIR__ . '/partials/head.php';
?>
<div class="flex flex-col md:flex-row md:items-center justify-between mb-6 gap-4">
<div>
<h2 class="text-2xl font-bold text-slate-900">Testimoni & Rating</h2>
<p class="text-sm text-slate-500 mt-1">Pantau penilaian masyarakat & atur testimoni yang tampil di publik.</p>
</div>
</div>
<!-- Ringkasan -->
<div class="grid grid-cols-1 sm:grid-cols-3 gap-6 mb-6">
<div class="bg-white rounded-xl p-5 border border-slate-100 shadow-sm flex items-center gap-4">
<div class="w-12 h-12 rounded-lg bg-amber-50 text-mateng-gold flex items-center justify-center text-xl"><i class="fas fa-star"></i></div>
<div>
<p class="text-sm text-slate-500 font-medium">Rata-rata Rating (publik)</p>
<p class="text-2xl font-bold text-slate-900"><?= number_format($stats['avg'], 1) ?> <span class="text-sm font-normal text-slate-400">/ 5</span></p>
</div>
</div>
<div class="bg-white rounded-xl p-5 border border-slate-100 shadow-sm flex items-center gap-4">
<div class="w-12 h-12 rounded-lg bg-green-50 text-mateng-green flex items-center justify-center text-xl"><i class="fas fa-eye"></i></div>
<div><p class="text-sm text-slate-500 font-medium">Dipublikasikan</p><p class="text-2xl font-bold text-slate-900"><?= $stats['count'] ?></p></div>
</div>
<div class="bg-white rounded-xl p-5 border border-slate-100 shadow-sm flex items-center gap-4">
<div class="w-12 h-12 rounded-lg bg-blue-50 text-mateng-blue flex items-center justify-center text-xl"><i class="fas fa-clock"></i></div>
<div><p class="text-sm text-slate-500 font-medium">Menunggu Moderasi</p><p class="text-2xl font-bold text-slate-900"><?= $pending ?></p></div>
</div>
</div>
<!-- Filter -->
<div class="flex flex-wrap gap-2 mb-6">
<?php foreach (['' => 'Semua (' . $totalAll . ')', 'pending' => 'Menunggu (' . $pending . ')', 'published' => 'Tampil (' . $stats['count'] . ')'] as $key => $label): ?>
<a href="<?= e(url('admin/testimoni.php' . ($key ? '?f=' . $key : ''))) ?>" class="px-4 py-2 rounded-lg text-sm font-medium border transition-colors <?= $f === $key ? 'bg-mateng-green text-white border-mateng-green' : 'bg-white text-slate-600 border-slate-200 hover:border-mateng-green' ?>"><?= e($label) ?></a>
<?php endforeach; ?>
</div>
<?php if (empty($rows)): ?>
<div class="text-center py-16 bg-white rounded-xl border border-slate-100">
<i class="fas fa-star-half-stroke text-4xl text-slate-300 mb-3"></i>
<p class="text-slate-500 font-medium">Belum ada testimoni pada filter ini.</p>
</div>
<?php else: ?>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-5">
<?php foreach ($rows as $t): ?>
<div class="bg-white border <?= $t['is_published'] ? 'border-slate-100' : 'border-mateng-blue/40' ?> rounded-xl shadow-sm p-5 flex flex-col">
<div class="flex items-center justify-between gap-2 mb-3">
<?= render_stars((int) $t['rating'], 'text-base') ?>
<?php if ($t['is_published']): ?>
<span class="inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs font-semibold bg-green-50 text-mateng-green border border-green-200"><i class="fas fa-circle-check"></i> Tampil di Publik</span>
<?php else: ?>
<span class="inline-flex items-center gap-1 px-2.5 py-1 rounded-full text-xs font-semibold bg-blue-50 text-mateng-blue border border-blue-200"><i class="fas fa-clock"></i> Menunggu</span>
<?php endif; ?>
</div>
<p class="text-slate-700 text-sm leading-relaxed mb-3 flex-grow whitespace-pre-line"><?= $t['isi'] ? e($t['isi']) : '<span class="italic text-slate-400">(Rating tanpa komentar)</span>' ?></p>
<?php if ($t['no_resi']): ?>
<p class="text-xs text-slate-400 mb-3"><i class="fas fa-receipt mr-1"></i> Permohonan: <?= e($t['no_resi']) ?></p>
<?php endif; ?>
<div class="flex items-center justify-between border-t border-slate-100 pt-3 text-xs text-slate-500">
<div>
<span class="font-semibold text-slate-700"><?= e($t['nama']) ?></span>
<div class="text-slate-400 mt-0.5"><i class="far fa-clock mr-1"></i><?= e(tanggal_id($t['created_at'], true)) ?></div>
</div>
<div class="flex items-center gap-1">
<?php if ($t['is_published']): ?>
<form method="post" class="inline">
<?= csrf_field() ?>
<input type="hidden" name="id" value="<?= (int) $t['id'] ?>">
<input type="hidden" name="action" value="unpublish">
<button type="submit" class="inline-flex items-center gap-1.5 px-3 py-1.5 text-slate-600 hover:bg-slate-100 rounded-lg transition-colors font-medium" title="Tarik dari publik"><i class="fas fa-eye-slash"></i> Tarik</button>
</form>
<?php else: ?>
<form method="post" class="inline">
<?= csrf_field() ?>
<input type="hidden" name="id" value="<?= (int) $t['id'] ?>">
<input type="hidden" name="action" value="publish">
<button type="submit" class="inline-flex items-center gap-1.5 px-3 py-1.5 text-white bg-mateng-green hover:bg-green-700 rounded-lg transition-colors font-medium" title="Publikasikan"><i class="fas fa-check"></i> Publikasikan</button>
</form>
<?php endif; ?>
<form method="post" class="inline" onsubmit="return confirm('Hapus testimoni ini?');">
<?= csrf_field() ?>
<input type="hidden" name="id" value="<?= (int) $t['id'] ?>">
<input type="hidden" name="action" value="hapus">
<button type="submit" class="p-2 text-red-500 hover:bg-red-50 rounded-lg transition-colors" title="Hapus"><i class="fas fa-trash"></i></button>
</form>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php endif; ?>
<?php require __DIR__ . '/partials/foot.php'; ?>