// ===== TOAST NOTIFICATIONS ===== function showToast(message, type = 'info') { document.querySelectorAll('.toast').forEach(t => t.remove()); const toast = document.createElement('div'); toast.className = `toast ${type}`; toast.textContent = message; document.body.appendChild(toast); toast.offsetHeight; toast.classList.add('show'); setTimeout(() => { toast.classList.remove('show'); setTimeout(() => toast.remove(), 400); }, 3000); } // ===== LOCAL STORAGE HELPERS ===== function getUsers() { try { return JSON.parse(localStorage.getItem('users')) || []; } catch { return []; } } function saveUsers(users) { localStorage.setItem('users', JSON.stringify(users)); } // ===== MONTH NAMES ===== const monthNames = [ '', 'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember' ]; function formatDate(day, month, year) { return `${day} ${monthNames[parseInt(month)]} ${year}`; } function formatGender(gender) { if (gender === 'laki-laki') return 'Laki-laki'; if (gender === 'perempuan') return 'Perempuan'; return gender; } // ===== POPULATE DATE DROPDOWNS ===== function populateDays(selectId) { const daySelect = document.getElementById(selectId || 'inputDay'); if (!daySelect) return; // Keep first option if it exists const firstOption = daySelect.querySelector('option[disabled]'); if (daySelect.options.length <= 1) { for (let i = 1; i <= 31; i++) { const option = document.createElement('option'); option.value = i; option.textContent = i; daySelect.appendChild(option); } } } function populateYears(selectId) { const yearSelect = document.getElementById(selectId || 'inputYear'); if (!yearSelect) return; if (yearSelect.options.length <= 1) { const currentYear = new Date().getFullYear(); for (let y = currentYear; y >= 1950; y--) { const option = document.createElement('option'); option.value = y; option.textContent = y; yearSelect.appendChild(option); } } } // ===== RENDER USER TABLE (Dashboard page) ===== function renderUserTable() { const tbody = document.getElementById('userTableBody'); const emptyState = document.getElementById('emptyState'); const table = document.getElementById('userTable'); if (!tbody) return; const users = getUsers(); tbody.innerHTML = ''; if (users.length === 0) { if (table) table.style.display = 'none'; if (emptyState) emptyState.style.display = 'flex'; return; } if (table) table.style.display = 'table'; if (emptyState) emptyState.style.display = 'none'; users.forEach((user, index) => { const tr = document.createElement('tr'); tr.innerHTML = ` ${index + 1} ${escapeHtml(user.nama)} ${escapeHtml(user.email)} ${formatGender(user.gender)} ${formatDate(user.day, user.month, user.year)}
`; tbody.appendChild(tr); }); } function escapeHtml(text) { const div = document.createElement('div'); div.textContent = text; return div.innerHTML; } // ===== EDIT MODAL ===== function openEditModal(index) { const users = getUsers(); const user = users[index]; if (!user) return; document.getElementById('editId').value = index; document.getElementById('editNama').value = user.nama; document.getElementById('editEmail').value = user.email; document.getElementById('editGender').value = user.gender; // Populate edit dropdowns populateDays('editDay'); populateYears('editYear'); // Set values after populating setTimeout(() => { document.getElementById('editDay').value = user.day; document.getElementById('editMonth').value = user.month; document.getElementById('editYear').value = user.year; }, 50); document.getElementById('editModal').style.display = 'flex'; } function closeEditModal() { document.getElementById('editModal').style.display = 'none'; } function handleEditSave(e) { e.preventDefault(); const index = parseInt(document.getElementById('editId').value); const users = getUsers(); users[index] = { nama: document.getElementById('editNama').value.trim(), email: document.getElementById('editEmail').value.trim(), gender: document.getElementById('editGender').value, day: document.getElementById('editDay').value, month: document.getElementById('editMonth').value, year: document.getElementById('editYear').value }; saveUsers(users); closeEditModal(); renderUserTable(); showToast('Data berhasil diperbarui!', 'success'); } // ===== DELETE MODAL ===== let deleteIndex = null; function openDeleteModal(index) { const users = getUsers(); const user = users[index]; if (!user) return; deleteIndex = index; document.getElementById('deleteUserName').textContent = user.nama; document.getElementById('deleteModal').style.display = 'flex'; } function closeDeleteModal() { document.getElementById('deleteModal').style.display = 'none'; deleteIndex = null; } function confirmDelete() { if (deleteIndex === null) return; const users = getUsers(); users.splice(deleteIndex, 1); saveUsers(users); closeDeleteModal(); renderUserTable(); showToast('Data berhasil dihapus!', 'success'); } // ===== HANDLE INPUT DATA FORM (input-data.html) ===== function handleInputData(e) { e.preventDefault(); const nama = document.getElementById('inputNama')?.value.trim(); const email = document.getElementById('inputEmail')?.value.trim(); const gender = document.getElementById('inputGender')?.value; const day = document.getElementById('inputDay')?.value; const month = document.getElementById('inputMonth')?.value; const year = document.getElementById('inputYear')?.value; if (!nama || !email || !gender || !day || !month || !year) { showToast('Silakan isi semua field', 'error'); return; } const btn = document.getElementById('submitBtn'); if (btn) { btn.disabled = true; btn.textContent = 'MENYIMPAN...'; btn.style.opacity = '0.6'; btn.style.pointerEvents = 'none'; } // Save to localStorage setTimeout(() => { const users = getUsers(); users.push({ nama, email, gender, day, month, year }); saveUsers(users); showToast('Data pengguna berhasil disimpan!', 'success'); if (btn) { btn.disabled = false; btn.textContent = 'SIMPAN DATA'; btn.style.opacity = '1'; btn.style.pointerEvents = 'auto'; } document.getElementById('inputDataForm')?.reset(); }, 1000); } // ===== LOGOUT ===== function handleLogout(e) { e.preventDefault(); showToast('Berhasil logout. Mengalihkan...', 'info'); setTimeout(() => { window.location.href = 'login.html'; }, 1200); } // ===== CLOSE MODAL ON OVERLAY CLICK ===== function setupModalClose() { document.querySelectorAll('.modal-overlay').forEach(overlay => { overlay.addEventListener('click', (e) => { if (e.target === overlay) { overlay.style.display = 'none'; } }); }); } // ===== INIT ===== document.addEventListener('DOMContentLoaded', () => { populateDays('inputDay'); populateYears('inputYear'); // Dashboard: render user table renderUserTable(); // Dashboard: delete confirm button const confirmDeleteBtn = document.getElementById('confirmDeleteBtn'); if (confirmDeleteBtn) { confirmDeleteBtn.addEventListener('click', confirmDelete); } // Histori: filter & search listeners const filterStatus = document.getElementById('filterStatus'); if (filterStatus) { filterStatus.addEventListener('change', () => { if (typeof loadLogs === 'function') loadLogs(); }); } const searchName = document.getElementById('searchName'); if (searchName) { searchName.addEventListener('input', () => { if (typeof loadLogs === 'function') loadLogs(); }); } // Logout handler const logoutBtn = document.getElementById('logoutBtn'); if (logoutBtn) { logoutBtn.addEventListener('click', handleLogout); } // Modal close on overlay click setupModalClose(); }); setTimeout(() => { const toast = document.querySelector('.toast'); if (toast) { toast.style.display = "none"; } }, 3000);