File manager - Edit - /home/webapp69.cm.in.th/u69319090028/Shop/views/admin/users/deletion_requests.php
Back
<?php $statusMap = [ 'pending' => ['status-pending', 'รอดำเนินการ (Pending)'], 'approved' => ['status-active', 'อนุมัติแล้ว (Approved)'], 'rejected' => ['status-danger', 'ปฏิเสธ (Rejected)'], 'cancelled' => ['status-secondary', 'ยกเลิกโดยผู้ใช้ (Cancelled)'], ]; $userStatusMap = [ 'active' => ['status-active', 'ปกติ'], 'suspended' => ['status-suspended', 'ระงับ'], 'deleted' => ['status-danger', 'ลบบัญชีแล้ว'], ]; ?> <div class="d-flex flex-column flex-md-row justify-content-between align-items-md-center gap-2 mb-3"> <div> <h4 class="fw-bold mb-1 text-dark">คำขอลบบัญชีผู้ใช้งาน (Account Deletion Requests)</h4> <p class="text-muted small mb-0">ตรวจสอบและพิจารณาอนุมัติคำขอยกเลิก/ลบบัญชีตามสิทธิ์คุ้มครองข้อมูลส่วนบุคคล (PDPA/GDPR)</p> </div> <div> <a href="<?= url('/admin/users') ?>" class="btn btn-outline-secondary btn-sm py-1 px-3"> <i class="bi bi-people me-1"></i>ดูรายชื่อผู้ใช้งานทั้งหมด </a> </div> </div> <!-- ── Status Counter Badges ───────────────────────────── --> <div class="d-flex flex-wrap gap-2 mb-3"> <?php $statusTabs = ['all' => 'ทั้งหมด', 'pending' => 'รอดำเนินการ', 'approved' => 'อนุมัติแล้ว', 'rejected' => 'ปฏิเสธแล้ว', 'cancelled' => 'ยกเลิกแล้ว']; foreach ($statusTabs as $k => $l): $cnt = $k === 'all' ? array_sum($counts ?? []) : ($counts[$k] ?? 0); ?> <a href="?status=<?= $k ?><?= !empty($filters['q']) ? '&q=' . urlencode($filters['q']) : '' ?>" class="btn btn-sm <?= ($filters['status'] ?? 'pending') === $k ? 'btn-primary' : 'btn-white border text-muted' ?>" style="font-size: 0.8rem;"> <?= $l ?> <span class="badge bg-light text-dark border ms-1"><?= $cnt ?></span> </a> <?php endforeach; ?> </div> <!-- ── Filter Bar ──────────────────────────────────────── --> <div class="admin-filter-bar mb-3"> <form method="GET" class="row g-2 align-items-end"> <input type="hidden" name="status" value="<?= e($filters['status'] ?? 'pending') ?>"> <div class="col-md-8"> <label class="form-label small fw-semibold text-muted mb-1">ค้นหาคำขอลบบัญชี</label> <div class="input-group input-group-sm"> <span class="input-group-text bg-light"><i class="bi bi-search text-muted"></i></span> <input type="text" name="q" value="<?= e($filters['q'] ?? '') ?>" class="form-control" placeholder="ค้นหาชื่อ, @username, email, หรือเหตุผลขอลบ..."> </div> </div> <div class="col-md-4 d-flex gap-2"> <button type="submit" class="btn btn-primary btn-sm w-100"><i class="bi bi-funnel me-1"></i>ค้นหา</button> <?php if (!empty($filters['q']) || ($filters['status'] ?? 'pending') !== 'pending'): ?> <a href="<?= url('/admin/users/deletion-requests') ?>" class="btn btn-outline-secondary btn-sm" title="ล้างการกรอง"><i class="bi bi-x-lg"></i></a> <?php endif; ?> </div> </form> </div> <!-- ── Data Table Container ────────────────────────────── --> <div class="admin-table-container"> <div class="admin-table-header"> <div class="d-flex align-items-center gap-2"> <i class="bi bi-person-x text-danger"></i> <span class="fw-bold text-dark" style="font-size: 0.9rem;">รายการคำขอลบบัญชี</span> <span class="badge bg-light text-muted border ms-1"><?= number_format($total ?? 0) ?> รายการ</span> </div> </div> <div class="table-responsive d-none d-md-block"> <table class="admin-table"> <thead> <tr> <th width="70">ID</th> <th>ผู้ใช้งาน</th> <th>สถานะบัญชี</th> <th>เหตุผลในการขอลบ</th> <th>วันที่ส่งคำขอ</th> <th>สถานะคำขอ</th> <th>ผู้ดำเนินการ</th> <th class="text-end">การจัดการ</th> </tr> </thead> <tbody> <?php if (empty($requests)): ?> <tr> <td colspan="8" class="text-center text-muted py-4">ไม่พบคำขอลบบัญชีตามเงื่อนไขที่เลือก</td> </tr> <?php else: foreach ($requests as $r): ?> <tr> <td class="font-monospace small text-muted">#<?= (int)$r['id'] ?></td> <td> <div class="fw-semibold text-dark small"><?= e(trim($r['first_name'] . ' ' . ($r['last_name'] ?? ''))) ?></div> <div class="text-muted small"> <a href="<?= url('/admin/users/' . (int)$r['user_id']) ?>" class="text-decoration-none text-muted"> @<?= e($r['username']) ?> • <?= e($r['email']) ?> </a> </div> </td> <td> <?php [$ustClass, $ustLabel] = $userStatusMap[$r['user_status']] ?? ['status-secondary', $r['user_status']]; ?> <span class="status-pill <?= $ustClass ?>"><?= $ustLabel ?></span> </td> <td> <div class="text-dark small" style="max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;" title="<?= e($r['reason'] ?? 'ไม่ได้ระบุ') ?>"> <?= !empty($r['reason']) ? e($r['reason']) : '<span class="text-muted">— ไม่ได้ระบุเหตุผล —</span>' ?> </div> <?php if (!empty($r['admin_note'])): ?> <div class="text-muted small mt-1" style="font-size: 0.72rem;"> <i class="bi bi-chat-left-dots text-primary me-1"></i>บันทึก: <?= e($r['admin_note']) ?> </div> <?php endif; ?> </td> <td class="text-muted small"><?= date('d/m/Y H:i', strtotime($r['created_at'])) ?></td> <td> <?php [$stClass, $stLabel] = $statusMap[$r['status']] ?? ['status-secondary', $r['status']]; ?> <span class="status-pill <?= $stClass ?>"><?= $stLabel ?></span> </td> <td class="small text-muted"> <?php if (!empty($r['processed_by_username'])): ?> <div>@<?= e($r['processed_by_username']) ?></div> <div class="text-muted" style="font-size: 0.7rem;"><?= !empty($r['processed_at']) ? date('d/m/Y H:i', strtotime($r['processed_at'])) : '' ?></div> <?php else: ?> <span class="text-muted">—</span> <?php endif; ?> </td> <td class="text-end"> <div class="d-flex justify-content-end align-items-center gap-1"> <?php if ($r['status'] === 'pending' && AdminMiddleware::can('user.suspend')): ?> <button type="button" class="btn btn-danger btn-sm py-1 px-2 btn-approve-del" data-id="<?= (int)$r['id'] ?>" data-username="<?= e($r['username']) ?>" data-fullname="<?= e(trim($r['first_name'] . ' ' . ($r['last_name'] ?? ''))) ?>" data-reason="<?= e($r['reason'] ?? 'ไม่ได้ระบุเหตุผล') ?>" data-bs-toggle="modal" data-bs-target="#approveDeleteModal" style="font-size: 0.75rem;"> <i class="bi bi-check-circle me-1"></i>อนุมัติลบ </button> <button type="button" class="btn btn-outline-secondary btn-sm py-1 px-2 btn-reject-del" data-id="<?= (int)$r['id'] ?>" data-username="<?= e($r['username']) ?>" data-bs-toggle="modal" data-bs-target="#rejectDeleteModal" style="font-size: 0.75rem;"> <i class="bi bi-x-circle me-1"></i>ปฏิเสธ </button> <?php endif; ?> <a href="<?= url('/admin/users/' . (int)$r['user_id']) ?>" class="btn btn-outline-primary btn-sm py-1 px-2" style="font-size: 0.75rem;" title="ดูข้อมูลผู้ใช้"> <i class="bi bi-person"></i> </a> </div> </td> </tr> <?php endforeach; endif; ?> </tbody> </table> </div> <!-- Mobile Card List View --> <div class="d-md-none p-3"> <?php if (empty($requests)): ?> <div class="text-center text-muted py-3 small">ไม่พบคำขอลบบัญชี</div> <?php else: foreach ($requests as $r): ?> <div class="admin-mobile-card"> <div class="d-flex justify-content-between align-items-start mb-2"> <div> <div class="fw-bold text-dark"><?= e(trim($r['first_name'] . ' ' . ($r['last_name'] ?? ''))) ?> (@<?= e($r['username']) ?>)</div> <div class="text-muted small"><?= e($r['email']) ?></div> </div> <?php [$stClass, $stLabel] = $statusMap[$r['status']] ?? ['status-secondary', $r['status']]; ?> <span class="status-pill <?= $stClass ?>"><?= $stLabel ?></span> </div> <div class="p-2 bg-light rounded-2 text-dark small mb-2"> <strong>เหตุผล:</strong> <?= !empty($r['reason']) ? e($r['reason']) : 'ไม่ได้ระบุเหตุผล' ?> </div> <div class="d-flex justify-content-between align-items-center pt-2 border-top"> <span class="text-muted small"><?= date('d/m/Y H:i', strtotime($r['created_at'])) ?></span> <div class="d-flex gap-1"> <?php if ($r['status'] === 'pending' && AdminMiddleware::can('user.suspend')): ?> <button type="button" class="btn btn-danger btn-sm py-1 px-2 btn-approve-del" data-id="<?= (int)$r['id'] ?>" data-username="<?= e($r['username']) ?>" data-fullname="<?= e(trim($r['first_name'] . ' ' . ($r['last_name'] ?? ''))) ?>" data-reason="<?= e($r['reason'] ?? 'ไม่ได้ระบุเหตุผล') ?>" data-bs-toggle="modal" data-bs-target="#approveDeleteModal" style="font-size: 0.75rem;"> อนุมัติ </button> <?php endif; ?> <a href="<?= url('/admin/users/' . (int)$r['user_id']) ?>" class="btn btn-outline-primary btn-sm py-1 px-2" style="font-size: 0.75rem;"> โปรไฟล์ → </a> </div> </div> </div> <?php endforeach; endif; ?> </div> <!-- Pagination --> <?php if (($total_pages ?? 1) > 1): ?> <div class="p-3 border-top d-flex justify-content-center"> <nav> <ul class="pagination pagination-sm mb-0"> <?php for ($i = 1; $i <= $total_pages; $i++): ?> <li class="page-item <?= $i === $page ? 'active' : '' ?>"> <a class="page-link" href="?<?= http_build_query(array_merge($filters, ['page' => $i])) ?>"><?= $i ?></a> </li> <?php endfor; ?> </ul> </nav> </div> <?php endif; ?> </div> <!-- ── Approve Deletion Modal ──────────────────────────── --> <div class="modal fade" id="approveDeleteModal" tabindex="-1" aria-labelledby="approveDeleteModalLabel" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content rounded-4 border-0 shadow"> <form id="approveDeleteForm" action="" method="POST"> <?= Security::csrfField() ?> <div class="modal-header bg-danger text-white py-3"> <h6 class="modal-title fw-bold" id="approveDeleteModalLabel"> <i class="bi bi-exclamation-triangle me-2"></i>ยืนยันการอนุมัติลบบัญชีผู้ใช้งาน </h6> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body p-4 small"> <div class="alert alert-warning border-warning small mb-3"> <strong>คำเตือน:</strong> การอนุมัติลบบัญชีจะเปลี่ยนสถานะบัญชีของผู้ใช้เป็น <code>deleted</code> และลบ Session การเข้าสู่ระบบทั้งหมดทันที </div> <div class="mb-3"> <label class="form-label fw-bold text-dark mb-1">ผู้ใช้งานที่ขอลบ:</label> <div id="approveTargetUser" class="fw-semibold text-primary"></div> </div> <div class="mb-3"> <label class="form-label fw-bold text-dark mb-1">เหตุผลที่ผู้ใช้ระบุ:</label> <div id="approveTargetReason" class="p-2 bg-light rounded text-muted"></div> </div> <div class="mb-3"> <label class="form-label fw-semibold text-dark mb-1">บันทึกของแอดมิน (Admin Note)</label> <textarea name="admin_note" class="form-control form-control-sm" rows="3" placeholder="ระบุหมายเหตุ เช่น ตรวจสอบไม่มียอดค้างชำระ อนุมัติตามคำขอ PDPA..."></textarea> </div> </div> <div class="modal-footer py-2 bg-light"> <button type="button" class="btn btn-sm btn-secondary" data-bs-dismiss="modal">ยกเลิก</button> <button type="submit" class="btn btn-sm btn-danger px-3"> <i class="bi bi-trash me-1"></i>ยืนยันอนุมัติและลบบัญชี </button> </div> </form> </div> </div> </div> <!-- ── Reject Deletion Modal ───────────────────────────── --> <div class="modal fade" id="rejectDeleteModal" tabindex="-1" aria-labelledby="rejectDeleteModalLabel" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered"> <div class="modal-content rounded-4 border-0 shadow"> <form id="rejectDeleteForm" action="" method="POST"> <?= Security::csrfField() ?> <div class="modal-header bg-secondary text-white py-3"> <h6 class="modal-title fw-bold" id="rejectDeleteModalLabel"> <i class="bi bi-x-circle me-2"></i>ปฏิเสธคำขอลบบัญชี </h6> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body p-4 small"> <div class="mb-3"> <label class="form-label fw-bold text-dark mb-1">ผู้ใช้งาน:</label> <div id="rejectTargetUser" class="fw-semibold text-primary"></div> </div> <div class="mb-3"> <label class="form-label fw-semibold text-dark mb-1">เหตุผลในการปฏิเสธคำขอ <span class="text-danger">*</span></label> <textarea name="admin_note" class="form-control form-control-sm" rows="3" placeholder="ระบุเหตุผล เช่น มีคำสั่งซื้อที่อยู่ระหว่างการจัดส่ง หรือมียอดเงินคงค้างในระบบ..." required></textarea> </div> </div> <div class="modal-footer py-2 bg-light"> <button type="button" class="btn btn-sm btn-secondary" data-bs-dismiss="modal">ยกเลิก</button> <button type="submit" class="btn btn-sm btn-outline-danger px-3"> <i class="bi bi-x-circle me-1"></i>ยืนยันปฏิเสธคำขอ </button> </div> </form> </div> </div> </div> <script> document.addEventListener('DOMContentLoaded', function () { document.querySelectorAll('.btn-approve-del').forEach(function (btn) { btn.addEventListener('click', function () { const id = this.getAttribute('data-id'); const username = this.getAttribute('data-username'); const fullname = this.getAttribute('data-fullname'); const reason = this.getAttribute('data-reason'); const form = document.getElementById('approveDeleteForm'); if (form) { form.action = '/CARGOO/admin/users/deletion-requests/' + id + '/approve'; document.getElementById('approveTargetUser').textContent = fullname + ' (@' + username + ')'; document.getElementById('approveTargetReason').textContent = reason; } }); }); document.querySelectorAll('.btn-reject-del').forEach(function (btn) { btn.addEventListener('click', function () { const id = this.getAttribute('data-id'); const username = this.getAttribute('data-username'); const form = document.getElementById('rejectDeleteForm'); if (form) { form.action = '/CARGOO/admin/users/deletion-requests/' + id + '/reject'; document.getElementById('rejectTargetUser').textContent = '@' + username; } }); }); }); </script>
| ver. 1.4 |
Github
|
.
| PHP 7.4.33 | Generation time: 0.24 |
proxy
|
phpinfo
|
Settings