// User Management Functions
let currentPage = 1;
let currentSearch = '';
let currentRole = '';
const usersPerPage = 10;
// Load users
async function loadUsers(page = 1, search = '', role = '') {
try {
showLoading();
const response = await mockApi.getUsers(page, usersPerPage, search, role);
const usersTableBody = document.getElementById('usersTableBody');
if (!usersTableBody) return;
usersTableBody.innerHTML = response.users.map(user => `
|
${user.name}
${user.email}
|
${user.email} |
${user.role} |
${user.status} |
${formatDate(user.joinedDate)} |
|
`).join('');
renderPagination(response.page, response.totalPages);
currentPage = page;
currentSearch = search;
currentRole = role;
} catch (error) {
console.error('Error loading users:', error);
showToast('Failed to load users', 'error');
} finally {
hideLoading();
}
}
// Render pagination
function renderPagination(currentPage, totalPages) {
const pagination = document.getElementById('usersPagination');
if (!pagination) return;
let html = `
`;
for (let i = 1; i <= totalPages; i++) {
if (i === 1 || i === totalPages || (i >= currentPage - 1 && i <= currentPage + 1)) {
html += `
`;
} else if (i === currentPage - 2 || i === currentPage + 2) {
html += '';
}
}
html += `
`;
pagination.innerHTML = html;
}
// Add user
async function addUser(userData) {
try {
showLoading();
const response = await mockApi.createUser(userData);
if (response.success) {
showToast('User added successfully', 'success');
closeModal('userModal');
loadUsers(currentPage, currentSearch, currentRole);
}
} catch (error) {
console.error('Error adding user:', error);
showToast('Failed to add user', 'error');
} finally {
hideLoading();
}
}
// Update user
async function updateUser(userId, userData) {
try {
showLoading();
const response = await mockApi.updateUser(userId, userData);
if (response.success) {
showToast('User updated successfully', 'success');
closeModal('userModal');
loadUsers(currentPage, currentSearch, currentRole);
}
} catch (error) {
console.error('Error updating user:', error);
showToast('Failed to update user', 'error');
} finally {
hideLoading();
}
}
// Edit user
async function editUser(userId) {
try {
showLoading();
// Find user from current table
const userRow = document.querySelector(`input[data-user-id="${userId}"]`)?.closest('tr');
if (!userRow) {
showToast('User not found', 'error');
return;
}
// Extract user data from the row
const userNameCell = userRow.querySelector('.user-name-cell');
const userEmailCell = userRow.querySelector('.user-email-cell');
const roleCell = userRow.querySelectorAll('td')[3];
const statusCell = userRow.querySelectorAll('td')[4];
const userName = userNameCell?.textContent || '';
const userEmail = userEmailCell?.textContent || '';
const userRole = roleCell?.querySelector('.status-badge')?.textContent || 'user';
const userStatus = statusCell?.querySelector('.status-badge')?.textContent || 'active';
// Populate the form
const userForm = document.getElementById('userForm');
const modalTitle = document.getElementById('userModalTitle');
if (userForm && modalTitle) {
modalTitle.textContent = 'Edit User';
userForm.querySelector('input[name="name"]').value = userName;
userForm.querySelector('input[name="email"]').value = userEmail;
userForm.querySelector('select[name="role"]').value = userRole;
// Hide password field for editing
const passwordField = userForm.querySelector('input[name="password"]');
const passwordGroup = passwordField?.closest('.form-group');
if (passwordGroup) {
passwordGroup.style.display = 'none';
passwordField.removeAttribute('required');
}
// Store user ID in form for update
userForm.dataset.editUserId = userId;
userForm.dataset.editMode = 'true';
openModal('userModal');
}
} catch (error) {
console.error('Error editing user:', error);
showToast('Failed to load user data', 'error');
} finally {
hideLoading();
}
}
// Delete user
async function deleteUser(userId) {
if (!confirm('Are you sure you want to delete this user?')) return;
try {
showLoading();
const response = await mockApi.deleteUser(userId);
if (response.success) {
showToast('User deleted successfully', 'success');
loadUsers(currentPage, currentSearch, currentRole);
}
} catch (error) {
console.error('Error deleting user:', error);
showToast('Failed to delete user', 'error');
} finally {
hideLoading();
}
}
// Export users
function exportUsers() {
// In a real app, fetch all users and export
showToast('Exporting users...', 'info');
setTimeout(() => {
const mockUsers = mockData.generateUsers(20);
exportToCSV(mockUsers, 'users.csv');
showToast('Users exported successfully', 'success');
}, 1000);
}
// Initialize user management
function initUserManagement() {
// Load users
loadUsers();
// Search functionality
const userSearch = document.getElementById('userSearch');
if (userSearch) {
userSearch.addEventListener('input', debounce((e) => {
loadUsers(1, e.target.value, currentRole);
}, 500));
}
// Role filter
const roleFilter = document.getElementById('roleFilter');
if (roleFilter) {
roleFilter.addEventListener('change', (e) => {
loadUsers(1, currentSearch, e.target.value);
});
}
// Add user button
const addUserBtn = document.getElementById('addUserBtn');
if (addUserBtn) {
addUserBtn.addEventListener('click', () => {
// Reset form to add mode
const userForm = document.getElementById('userForm');
const modalTitle = document.getElementById('userModalTitle');
if (userForm) {
userForm.reset();
delete userForm.dataset.editUserId;
delete userForm.dataset.editMode;
// Show password field
const passwordField = userForm.querySelector('input[name="password"]');
const passwordGroup = passwordField?.closest('.form-group');
if (passwordGroup) {
passwordGroup.style.display = 'block';
passwordField.setAttribute('required', 'required');
}
}
if (modalTitle) {
modalTitle.textContent = 'Add User';
}
openModal('userModal');
});
}
// Export button
const exportBtn = document.getElementById('exportUsers');
if (exportBtn) {
exportBtn.addEventListener('click', exportUsers);
}
// User form submission
const userForm = document.getElementById('userForm');
if (userForm) {
userForm.addEventListener('submit', async (e) => {
e.preventDefault();
if (!validateForm(userForm)) {
showToast('Please fill in all required fields', 'error');
return;
}
const formData = new FormData(userForm);
const isEditMode = userForm.dataset.editMode === 'true';
const userId = userForm.dataset.editUserId;
const userData = {
name: formData.get('name'),
email: formData.get('email'),
role: formData.get('role'),
status: 'active'
};
// Only include password if not in edit mode or if password is provided
if (!isEditMode && formData.get('password')) {
userData.password = formData.get('password');
}
if (isEditMode && userId) {
await updateUser(userId, userData);
} else {
await addUser(userData);
}
// Reset form and edit mode
userForm.reset();
delete userForm.dataset.editUserId;
delete userForm.dataset.editMode;
// Reset modal title and show password field
const modalTitle = document.getElementById('userModalTitle');
if (modalTitle) {
modalTitle.textContent = 'Add User';
}
const passwordField = userForm.querySelector('input[name="password"]');
const passwordGroup = passwordField?.closest('.form-group');
if (passwordGroup) {
passwordGroup.style.display = 'block';
passwordField.setAttribute('required', 'required');
}
});
}
// Select all checkbox
const selectAll = document.getElementById('selectAll');
if (selectAll) {
selectAll.addEventListener('change', (e) => {
const checkboxes = document.querySelectorAll('input[data-user-id]');
checkboxes.forEach(cb => cb.checked = e.target.checked);
});
}
}