document.addEventListener('DOMContentLoaded', function () { const addMemberModal = new bootstrap.Modal(document.getElementById('addMemberModal')); const editMemberModal = new bootstrap.Modal(document.getElementById('editMemberModal')); const addMemberForm = document.getElementById('addMemberForm'); const editMemberForm = document.getElementById('editMemberForm'); const memberTableBody = document.getElementById('memberTableBody'); // Function to show a toast notification function showToast(message, success = true) { const toastContainer = document.getElementById('toastContainer'); const toast = document.createElement('div'); toast.className = `toast align-items-center text-white ${success ? 'bg-success' : 'bg-danger'} border-0 show`; toast.role = 'alert'; toast.ariaLive = 'assertive'; toast.ariaAtomic = 'true'; toast.innerHTML = `
${message}
`; toastContainer.appendChild(toast); const bsToast = new bootstrap.Toast(toast); bsToast.show(); setTimeout(() => { bsToast.hide(); setTimeout(() => { toast.remove(); }, 500); }, 3000); } function loadMembers() { fetch('api_members.php?action=list') .then(response => response.json()) .then(data => { memberTableBody.innerHTML = ''; if (data.success) { if (data.members.length === 0) { memberTableBody.innerHTML = 'Belum ada anggota.'; } else { data.members.forEach(member => { const row = ` ${member.id} ${escapeHTML(member.name)} ${escapeHTML(member.nik)} ${escapeHTML(member.address)} ${escapeHTML(member.phone)} `; memberTableBody.innerHTML += row; }); } // Update total members card document.getElementById('totalMembers').innerText = data.members.length; } else { memberTableBody.innerHTML = `Gagal memuat data: ${data.error}`; } }) .catch(error => { memberTableBody.innerHTML = `Error: ${error}`; }); } // Helper to prevent XSS function escapeHTML(str) { return str.toString().replace(/[&<>"']/g, function (tag) { var chars = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }; return chars[tag] || tag; }); } // Handle Add Member form submission addMemberForm.addEventListener('submit', function (event) { event.preventDefault(); const formData = new FormData(addMemberForm); formData.append('action', 'add'); fetch('api_members.php', { method: 'POST', body: formData }) .then(response => response.json()) .then(data => { if (data.success) { showToast('Anggota berhasil ditambahkan!'); addMemberModal.hide(); addMemberForm.reset(); loadMembers(); } else { showToast('Gagal menambahkan anggota: ' + data.error, false); } }) .catch(error => { showToast('Terjadi kesalahan. Silakan coba lagi.', false); }); }); ''' // Delegated event listener for edit and delete buttons memberTableBody.addEventListener('click', function (event) { const editButton = event.target.closest('.btn-edit'); const deleteButton = event.target.closest('.btn-delete'); if (editButton) { const memberId = editButton.dataset.id; openEditModal(memberId); } else if (deleteButton) { const memberId = deleteButton.dataset.id; deleteMember(memberId); } }); // Function to open and populate the edit modal function openEditModal(memberId) { fetch(`api_members.php?action=get&id=${memberId}`) .then(response => response.json()) .then(data => { if (data.success) { const member = data.member; document.getElementById('editMemberId').value = member.id; document.getElementById('editName').value = member.name; document.getElementById('editNik').value = member.nik; document.getElementById('editAddress').value = member.address; document.getElementById('editPhone').value = member.phone; editMemberModal.show(); } else { showToast('Gagal mengambil data anggota: ' + data.error, false); } }) .catch(() => showToast('Terjadi kesalahan jaringan.', false)); } // Handle Edit Member form submission editMemberForm.addEventListener('submit', function (event) { event.preventDefault(); const formData = new FormData(editMemberForm); formData.append('action', 'update'); fetch('api_members.php', { method: 'POST', body: new URLSearchParams(formData) }) .then(response => response.json()) .then(data => { if (data.success) { showToast('Data anggota berhasil diperbarui!'); editMemberModal.hide(); loadMembers(); } else { showToast('Gagal memperbarui data: ' + data.error, false); } }) .catch(() => { showToast('Terjadi kesalahan. Silakan coba lagi.', false); }); }); // Function to delete a member function deleteMember(memberId) { if (confirm('Apakah Anda yakin ingin menghapus anggota ini?')) { const formData = new FormData(); formData.append('action', 'delete'); formData.append('id', memberId); fetch('api_members.php', { method: 'POST', body: new URLSearchParams(formData) }) .then(response => response.json()) .then(data => { if (data.success) { showToast('Anggota berhasil dihapus.'); loadMembers(); } else { showToast('Gagal menghapus anggota: ' + data.error, false); } }) .catch(() => showToast('Terjadi kesalahan jaringan.', false)); } } // Initial load loadMembers(); });''