Files
2026-10-20 13:16:38 +09:00

102 lines
6.7 KiB
PHP

<?php
defined('SERUBI_ADMIN') || exit;
$users = db()->query('SELECT id, username, full_name, role, is_active, otp_enabled, must_change_password, last_login_at, created_at FROM admins ORDER BY is_active DESC, username')->fetchAll();
$openId = (int)($errors['user_id'] ?? 0);
$super = is_super_admin($me);
// Every action on another account asks for the acting admin's own password.
$confirmField = function (string $id): string {
return '<div class="form-field"><label for="' . e($id) . '">Password Anda (konfirmasi)</label>'
. '<input id="' . e($id) . '" type="password" name="confirm_password" autocomplete="current-password" required></div>';
};
?>
<section class="panel">
<header class="panel-head">
<h2>Daftar admin</h2>
<p><?= $super
? 'Sebagai super admin, Anda dapat menambah, menonaktifkan, me-reset password atau OTP, dan mengubah peran admin lain.'
: 'Hanya super admin yang dapat mengelola akun admin lain.' ?></p>
</header>
<?= isset($errors['user']) && !$openId ? field_error($errors, 'user') : '' ?>
<ul class="user-list">
<?php foreach ($users as $u): $self = (int)$u['id'] === $me['id']; $uid = (int)$u['id']; ?>
<li class="user<?= (int)$u['is_active'] ? '' : ' is-off' ?>">
<div class="user-main">
<span class="user-name"><?= e($u['full_name']) ?><?= $self ? ' <span class="badge">Anda</span>' : '' ?>
<span class="badge"><?= $u['role'] === 'super_admin' ? 'Super admin' : 'Admin' ?></span>
<?= (int)$u['otp_enabled'] ? '' : ' <span class="badge badge-off">OTP belum aktif</span>' ?>
<?= (int)$u['must_change_password'] ? ' <span class="badge badge-off">Wajib ganti password</span>' : '' ?>
<?= (int)$u['is_active'] ? '' : ' <span class="badge badge-off">Nonaktif</span>' ?></span>
<span class="user-meta">@<?= e($u['username']) ?> · login terakhir <?= e(fmt_datetime($u['last_login_at'])) ?></span>
<?= $openId === $uid ? field_error($errors, 'user') : '' ?>
</div>
<?php if ($super && !$self): ?>
<div class="user-actions">
<details class="inline-details"<?= $openId === $uid ? ' open' : '' ?>>
<summary class="btn btn-ghost btn-sm"><?= icon('key') ?><span>Kelola</span></summary>
<form method="post" class="inline-form">
<?= csrf_field() ?>
<input type="hidden" name="action" value="user_password">
<input type="hidden" name="id" value="<?= $uid ?>">
<strong>Reset password</strong>
<div class="form-field"><label for="pw<?= $uid ?>">Password sementara</label><input id="pw<?= $uid ?>" type="password" name="password" autocomplete="new-password" required></div>
<div class="form-field"><label for="pc<?= $uid ?>">Ulangi password</label><input id="pc<?= $uid ?>" type="password" name="password_confirm" autocomplete="new-password" required></div>
<?= $confirmField('pa' . $uid) ?>
<p class="hint">Pemilik akun wajib mengganti password ini saat login berikutnya.</p>
<button class="btn btn-primary btn-sm" type="submit">Reset password</button>
</form>
<form method="post" class="inline-form">
<?= csrf_field() ?>
<input type="hidden" name="id" value="<?= $uid ?>">
<strong>Akun</strong>
<?= $confirmField('pb' . $uid) ?>
<div class="inline-buttons">
<button class="btn btn-sm <?= (int)$u['is_active'] ? 'btn-ghost' : 'btn-primary' ?>" type="submit" name="action" value="user_toggle"><?= (int)$u['is_active'] ? 'Nonaktifkan' : 'Aktifkan' ?></button>
<button class="btn btn-ghost btn-sm" type="submit" name="action" value="user_role"><?= $u['role'] === 'super_admin' ? 'Jadikan admin' : 'Jadikan super admin' ?></button>
<?php if ((int)$u['otp_enabled']): ?>
<button class="btn btn-ghost btn-sm" type="submit" name="action" value="user_reset_otp">Reset OTP</button>
<?php endif; ?>
</div>
<p class="hint">Reset OTP bila ponsel hilang: authenticator baru dipasang saat login berikutnya.</p>
</form>
</details>
</div>
<?php endif; ?>
</li>
<?php endforeach; ?>
</ul>
</section>
<div class="two-col">
<?php if ($super): ?>
<section class="panel">
<header class="panel-head"><h2>Tambah admin</h2></header>
<form method="post" class="stack-form" novalidate>
<?= csrf_field() ?>
<input type="hidden" name="action" value="user_create">
<?= field_error($errors, 'user_new') ?>
<div class="form-field"><label for="nu">Username</label><input id="nu" name="username" autocapitalize="none" spellcheck="false" autocomplete="off" value="<?= e($draft['username'] ?? '') ?>" required><p class="hint">Huruf kecil, angka, titik, minus, garis bawah.</p></div>
<div class="form-field"><label for="nn">Nama lengkap</label><input id="nn" name="full_name" autocomplete="off" value="<?= e($draft['full_name'] ?? '') ?>" required></div>
<div class="form-field"><label for="nr">Peran</label>
<select id="nr" name="role"><option value="admin">Admin (ubah parameter)</option><option value="super_admin">Super admin (juga kelola akun)</option></select></div>
<div class="form-field"><label for="np">Password awal</label><input id="np" type="password" name="password" autocomplete="new-password" required><p class="hint">Minimal 10 karakter, berisi huruf, angka, dan simbol. Wajib diganti saat login pertama.</p></div>
<div class="form-field"><label for="nc">Ulangi password</label><input id="nc" type="password" name="password_confirm" autocomplete="new-password" required></div>
<?= $confirmField('nx') ?>
<button class="btn btn-primary" type="submit"><?= icon('plus') ?><span>Tambah admin</span></button>
</form>
</section>
<?php endif; ?>
<section class="panel">
<header class="panel-head"><h2>Password Anda</h2></header>
<form method="post" class="stack-form" novalidate>
<?= csrf_field() ?>
<input type="hidden" name="action" value="own_password">
<?= field_error($errors, 'own') ?>
<div class="form-field"><label for="oc">Password saat ini</label><input id="oc" type="password" name="current" autocomplete="current-password" required></div>
<div class="form-field"><label for="op">Password baru</label><input id="op" type="password" name="password" autocomplete="new-password" required></div>
<div class="form-field"><label for="oq">Ulangi password baru</label><input id="oq" type="password" name="password_confirm" autocomplete="new-password" required></div>
<button class="btn btn-primary" type="submit"><?= icon('key') ?><span>Ganti password</span></button>
</form>
</section>
</div>