query( "SELECT id, username, email, role, is_active, wilayah_tugas, nama_lengkap, last_login, created_at FROM users ORDER BY id ASC" )->fetchAll(); $wilayahList = $pdo->query("SELECT nama FROM wilayah ORDER BY nama")->fetchAll(); $pageTitle = 'Kelola Users'; $activeNav = 'users'; require_once __DIR__ . '/partials/header.php'; // Helper badge per role function roleBadge(string $role): string { return match ($role) { 'operator' => '🛠️ Operator', 'pimpinan' => '📊 Pimpinan', 'enumerator' => '📋 Enumerator', 'publik' => '🌐 Publik', default => htmlspecialchars($role), }; } ?>
$r): ?>
#UsernameNama LengkapEmailRole WilayahStatusLogin TerakhirAksi
Aktif Nonaktif
const API = APP_BASE + '/api/users.php'; // Wilayah tugas hanya relevan untuk enumerator function toggleWilayah(prefix) { const role = document.getElementById(prefix + 'Role').value; const group = document.getElementById(prefix + 'WilayahGroup'); group.style.display = (role === 'enumerator') ? 'block' : 'none'; } function editRow(r) { document.getElementById('editId').value = r.id; document.getElementById('editUsername').value = r.username; document.getElementById('editNama').value = r.nama_lengkap || ''; document.getElementById('editEmail').value = r.email || ''; document.getElementById('editRole').value = r.role; document.getElementById('editWilayah').value = r.wilayah_tugas || ''; document.getElementById('editActive').value = String(r.is_active); document.getElementById('editPassword').value = ''; toggleWilayah('edit'); openModal('modalEdit'); } async function simpan() { const u = document.getElementById('tUsername').value.trim(); const p = document.getElementById('tPassword').value; if (!u) return showToast('Username wajib!', 'error'); if (p.length < 6) return showToast('Password minimal 6 karakter!', 'error'); const res = await fetch(API, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ username: u, nama_lengkap: document.getElementById('tNama').value, email: document.getElementById('tEmail').value, role: document.getElementById('tRole').value, wilayah_tugas: document.getElementById('tWilayah').value, password: p }) }); const d = await res.json(); if (d.status === 'success') { showToast('User berhasil ditambahkan!'); setTimeout(() => location.reload(), 900); } else showToast(d.message || 'Gagal', 'error'); } async function update() { const id = document.getElementById('editId').value; const u = document.getElementById('editUsername').value.trim(); const p = document.getElementById('editPassword').value; if (!u) return showToast('Username wajib!', 'error'); if (p && p.length < 6) return showToast('Password minimal 6 karakter!', 'error'); const body = { username: u, nama_lengkap: document.getElementById('editNama').value, email: document.getElementById('editEmail').value, role: document.getElementById('editRole').value, wilayah_tugas: document.getElementById('editWilayah').value, is_active: document.getElementById('editActive').value }; if (p) body.password = p; const res = await fetch(API + '?id=' + id, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) }); const d = await res.json(); if (d.status === 'success') { showToast('User diperbarui!'); setTimeout(() => location.reload(), 900); } else showToast(d.message || 'Gagal', 'error'); } async function hapus(id, username) { if (id == 1) return showToast('Akun utama (ID=1) tidak dapat dihapus!', 'error'); if (!confirm(`Hapus user "${username}"?`)) return; const res = await fetch(API + '?id=' + id, { method: 'DELETE' }); const d = await res.json(); if (d.status === 'success') { showToast('User dihapus!'); setTimeout(() => location.reload(), 900); } else showToast(d.message || 'Gagal', 'error'); } toggleWilayah('t'); JS; ?>