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 = `
`;
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);
fetch('api_members.php', {
method: 'POST',
body: new URLSearchParams(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();
});''