// users.js import * as userManager from './managers/userManager.js'; import * as departmentManager from './managers/departmentManager.js'; // Use * as import { showMessage, showModal, hideModal, showConfirm } from './modal.js'; import { handleError } from './utils/errorHandler.js'; import { toggleButtonLoading, generateAvatarUrl } from './utils/utils.js'; import { populateUserDropdown, populateDepartmentDropdown } from './utils/dropdownHelpers.js'; // Ensure this is imported import eventBus from './utils/eventBus.js'; // Helper function to display users (triggered by usersDataReady event) async function displayUsers(users) { // Accepts users data as argument console.trace('displayUsers called'); if (!usersList) { console.error('displayUsers: usersList element not found'); return; } try { // departmentsMap is now passed as an argument if (users.length === 0 || !departmentManager.getDepartmentsData()) { console.log('displayUsers: No users found'); usersList.innerHTML = '
  • Chưa có người dùng nào.
  • '; const totalUsersEl = document.getElementById('totalUsers'); if (totalUsersEl) totalUsersEl.textContent = 0; return; } // Clear the existing list before appending usersList.innerHTML = ''; // Clear after check users.forEach(user => { const li = document.createElement('li'); li.className = 'py-4 flex items-center justify-between user-item'; // Added user-item class for potential future use const department = departmentManager.getDepartmentsData().find(d => d.id === user.department); li.innerHTML = `

    ${user.name}

    ${user.email}

    ${department ? department.name : ''}
    ${user.role || ''}
    `; usersList.appendChild(li); }); console.log('displayUsers: Cleared usersList'); // Add log here console.log('displayUsers: Rendered', users.length, 'users'); // Add log here } catch (error) { console.error('displayUsers error:', error); // Error message for display logic itself is shown here } } // The loadUsers function is now primarily triggered by EventBus events // It should load data via manager and then call displayUsers async function loadUsers() { console.trace('loadUsers called'); console.log('users.js: loadUsers called. Getting data from cache.'); // It should fetch the latest data (already cached in manager) and display it. const users = userManager.getAllUsersFromCache(); // Call the getter via the userManager object console.log('users.js: loadUsers got data from cache. Calling displayUsers with', users.length, 'users.'); displayUsers(users); // Call displayUsers with the fetched users data } /** * Setup event listeners for user-related events from Event Bus */ function setupUserEventListeners() { console.log('Setting up user event listeners via EventBus'); // --- Listeners for User Data Loading/Updates --- eventBus.subscribe('usersCacheLoaded', async () => { // This listener should trigger loadUsers which calls displayUsers console.log('users.js: Received usersCacheLoaded event.') console.log('EventBus: usersCacheLoaded event received in users.js. Loading users.'); await loadUsers(); // Call loadUsers to fetch cached data and display }); // --- Listeners for User Create/Update/Delete Actions --- eventBus.subscribe('userAdded', (newUser) => { console.log('EventBus: userAdded event received in users.js', newUser); showMessage('Thành công', `Đã thêm người dùng "${newUser.name}".`); hideModal('addUserModal'); // Hide the add modal on success // The 'usersDataReady' event (triggered by manager after add) will cause the list to reload }); const addUserForm = document.getElementById('addUserForm'); const saveUserBtn = document.querySelector('#addUserForm button[type="submit"]'); // Assuming the save button is a submit button within the form if (saveUserBtn) toggleButtonLoading(saveUserBtn, false); if (addUserForm) addUserForm.reset(); eventBus.subscribe('userAddFailed', (error) => { console.error('EventBus: userAddFailed event received in users.js', error); handleError(error, error.message || 'Đã xảy ra lỗi khi thêm người dùng.'); }); eventBus.subscribe('userUpdated', (updatedUser) => { console.log('EventBus: userUpdated event received in users.js', updatedUser); showMessage('Thành công', `Đã cập nhật người dùng "${updatedUser.name}".`); hideModal('editUserModal'); // Hide the edit modal on success // The 'usersDataReady' event (triggered by manager after update) will cause the list to reload }); eventBus.subscribe('userUpdateFailed', (error) => { console.error('EventBus: userUpdateFailed event received in users.js', error); handleError(error, error.message || 'Đã xảy ra lỗi khi cập nhật người dùng.'); }); eventBus.subscribe('userDeleted', (deletedUserId) => { console.log('EventBus: userDeleted event received in users.js', deletedUserId); showMessage('Thành công', 'Đã xoá người dùng.'); // showMessage is handled by the confirm dialog's callback in the click listener below // The 'usersDataReady' event (triggered by manager after delete) will cause the list to reload }); eventBus.subscribe('userDeleteFailed', (error) => { console.error('EventBus: userDeleteFailed event received in users.js', error); handleError(error, error.message || 'Đã xảy ra lỗi khi xóa người dùng.'); }); // Remove userSaveCompleted listener as it's redundant with userAdded/userUpdated } export function editUser(id, name, email, role, department) { console.log('editUser function called with ID:', id, 'Name:', name, 'Email:', email, 'Role:', role, 'Department:', department); // Log all received parameters const editUserIdEl = document.getElementById('editUserId'); if (editUserIdEl) editUserIdEl.value = id; const editUserNameEl = document.getElementById('editUserName'); if (editUserNameEl) editUserNameEl.value = name; const editUserEmailEl = document.getElementById('editUserEmail'); if (editUserEmailEl) { editUserEmailEl.value = email; editUserEmailEl.disabled = true; // Keep email disabled } const editUserRoleEl = document.getElementById('editUserRole'); if (editUserRoleEl) editUserRoleEl.value = role; // populateDepartmentDropdown vẫn giữ nguyên // Populate the user dropdown for the assignedTo field in edit task modal populateDepartmentDropdown('editUserDepartment', department); // Set the modal to 'edit' mode document.getElementById('saveUserBtn').style.display = 'none'; document.getElementById('updateUserBtn').style.display = 'block'; document.getElementById('editUserModalLabel').textContent = 'Cập Nhật Người Dùng'; document.getElementById('editUserEmail').disabled = true; // Ensure email is disabled for edit showModal('editUserModal'); } /** * Mở modal thêm người dùng (Simplified UI function) */ export function addUser() { const form = document.getElementById('addUserForm'); if (form) form.reset(); // populateDepartmentDropdown vẫn giữ nguyên vì thuộc về departments.js populateDepartmentDropdown('addUserDepartment'); // Set the modal to 'add' mode document.getElementById('saveUserBtn').style.display = 'block'; document.getElementById('updateUserBtn').style.display = 'none'; document.getElementById('addUserEmail').disabled = false; // Enable email for add } /** * Handles the submission of the Add New User form. */ async function handleAddNewUser(event) { console.log('Handling new user form submission'); event.preventDefault(); console.log('addUserForm submitted'); const form = event.target; const saveButton = event.submitter; toggleButtonLoading(saveButton, true); const name = form.userName.value.trim(); // Đảm bảo tên trường là userName const email = form.addUserEmail.value.trim(); // Đảm bảo tên trường là addUserEmail const password = form.addUserPassword.value; // Đảm bảo tên trường là addUserPassword const department = form.addUserDepartment.value; // Đảm bảo tên trường là addUserDepartment // Kiểm tra sự tồn tại của trường role trước khi truy cập value const role = form.addUserRole ? form.addUserRole.value : ''; const userData = { email, password, name, role, department }; console.log('Form data:', userData); await userManager.handleAddUserSubmit(userData); // Call manager function } // Call setupUserEventListeners to start listening for events when users.js is imported setupUserEventListeners(); // Add event listener for the "Thêm người dùng mới" button document.addEventListener('DOMContentLoaded', () => { const openAddUserModalBtn = document.getElementById('openAddUserModal'); if (openAddUserModalBtn) { openAddUserModalBtn.addEventListener('click', (e) => { e.preventDefault(); addUser(); // Call the addUser function to open the modal showModal('addUserModal'); // Show the modal }); } }); // Add event listener for the Add User form submission document.addEventListener('DOMContentLoaded', () => { const addUserForm = document.getElementById('addUserForm'); if (addUserForm) { addUserForm.addEventListener('submit', handleAddNewUser); } }); // Add event listener for the Edit User form submission - Reconstructed to fix syntax document.addEventListener('DOMContentLoaded', () => { const editUserForm = document.getElementById('editUserForm'); if (editUserForm) { editUserForm.addEventListener('submit', async (event) => { event.preventDefault(); console.log('editUserForm submitted'); const form = event.target; const userId = form.editUserId.value; const name = form.editUserName.value; const email = form.editUserEmail.value; const role = form.editUserRole.value; const department = form.editUserDepartment.value; const updatedUserData = { name, email, role, department }; console.log(`Attempting to update user ${userId} with data:`, updatedUserData); try { await userManager.handleEditUserSubmit(userId, updatedUserData); // Optional: show success message or hide modal here if needed // Example: showMessage('Thành công', 'Đã cập nhật người dùng.'); // Example: hideModal('editUserModal'); } catch (error) { console.error('Error submitting edit user form:', error); handleError(error, 'Đã xảy ra lỗi khi cập nhật người dùng.'); } }); } // Add event listener for the delete buttons using event delegation const usersListEl = document.getElementById('usersList'); if (usersListEl) { usersListEl.addEventListener('click', async (event) => { const deleteButton = event.target.closest('.delete-user-btn'); const editButton = event.target.closest('.edit-user-btn'); if (editButton) { event.preventDefault(); const userId = editButton.dataset.id; const name = editButton.dataset.name; const email = editButton.dataset.email; const role = editButton.dataset.role; const department = editButton.dataset.department; console.log(`Edit button clicked for user ID: ${userId}`); editUser(userId, name, email, role, department); // Call the editUser function } if (deleteButton) { const userId = deleteButton.dataset.id; const userName = deleteButton.dataset.name; console.log(`Delete button clicked for user ID: ${userId}, Name: ${userName}`); // Show confirmation modal (this is UI logic) showConfirm('Xác nhận xoá', `Bạn có chắc chắn muốn xoá người dùng "${userName}" này không?`) .then(async (confirmed) => { // Use .then() to handle the promise console.log('users.js: showConfirm resolved with:', confirmed); // Added log here if (confirmed) { console.log('users.js: Inside confirmed block.'); // Added log here console.log(`User confirmed deletion for ID: ${userId}`); console.log('users.js: Calling userManager.handleDeleteUserClick for ID:', userId); // Added log await userManager.handleDeleteUserClick(userId); // Call the manager function after confirmation // Success message is now handled by the userDeleted event listener } else { console.log(`User cancelled deletion for ID: ${userId}`); } }).catch(error => { // Add .catch() to log errors console.error('Error during confirmation:', error); }); } }); } });