/** * userActivity.js - User activity modal functionality * * This module handles all functionality related to the user activity modal. */ import { loadUserActivityData } from './api.js'; import { formatTimeToGMT4, formatDurationHours } from './formatters.js'; import { formatDateForDisplay } from './dateUtils.js'; import { showModalError } from './uiHelpers.js'; // User activity modal elements references let userActivityModal = null; let modalUsername = null; let startDateInput = null; let endDateInput = null; let applyDateRangeBtn = null; let userActivityBody = null; let modalLoadingSpinner = null; let modalErrorMessage = null; let userActivityModalInstance = null; /** * Initialize user activity modal component */ export function initializeUserActivityModal() { // Get references to all modal elements userActivityModal = document.getElementById('userActivityModal'); modalUsername = document.getElementById('modalUsername'); startDateInput = document.getElementById('startDate'); endDateInput = document.getElementById('endDate'); applyDateRangeBtn = document.getElementById('applyDateRange'); userActivityBody = document.getElementById('userActivityBody'); modalLoadingSpinner = document.getElementById('modalLoadingSpinner'); modalErrorMessage = document.getElementById('modalErrorMessage'); // Check if essential modal elements are found if (!userActivityModal || !modalUsername || !startDateInput || !endDateInput || !applyDateRangeBtn || !userActivityBody || !modalLoadingSpinner || !modalErrorMessage) { console.error("One or more essential user activity modal UI elements are missing from the DOM."); // Optionally, disable functionality that relies on these elements or return early return; } // Initialize date inputs with current date const today = new Date().toISOString().split('T')[0]; startDateInput.value = today; endDateInput.value = today; // Add event listener for Apply Date Range button applyDateRangeBtn.addEventListener('click', function() { const username = modalUsername.textContent; loadActivityData(username); }); // Listen for custom event from table manager document.addEventListener('user-activity-requested', function(event) { const username = event.detail.username; showUserActivityModal(username); }); } /** * Show user activity modal for a specific user * @param {string} username - Username to show activity for */ export function showUserActivityModal(username) { // if (!userActivityModal) { // This check is likely redundant if initializeUserActivityModal is always called first from dashboard.js // initializeUserActivityModal(); // } // Ensure critical elements were initialized if the above check is removed or failed previously. if (!userActivityModal || !modalUsername || !userActivityBody || !modalErrorMessage) { console.error("User activity modal called before essential UI elements were ready or found."); // Attempt to show a general error or prevent modal from showing an error state. // This might involve a global error display if modal itself can't function. alert("Error: Activity modal components not loaded. Please refresh."); // Basic fallback return; } modalUsername.textContent = username; userActivityBody.innerHTML = ''; modalErrorMessage.classList.add('d-none'); // Initialize and show modal with Bootstrap 5 if (!userActivityModalInstance) { userActivityModalInstance = new bootstrap.Modal(userActivityModal); } userActivityModalInstance.show(); // Load user activity data loadActivityData(username); } /** * Load activity data for a specific user * @param {string} username - Username to load data for */ export async function loadActivityData(username) { modalLoadingSpinner.classList.remove('d-none'); userActivityBody.innerHTML = ''; modalErrorMessage.classList.add('d-none'); const startDate = startDateInput.value; const endDate = endDateInput.value; try { const activities = await loadUserActivityData(username, startDate, endDate); populateUserActivityTable(activities); } catch (error) { console.error('Error in loadActivityData for user:', username, error); showModalError(error.message || 'Failed to retrieve activity details.'); // Simplified message } finally { modalLoadingSpinner.classList.add('d-none'); } } /** * Populate user activity table with data * @param {Array} activities - Activity data to display */ export function populateUserActivityTable(activities) { if (activities.length === 0) { userActivityBody.innerHTML = 'No activity found for the selected date range.'; return; } activities.forEach(activity => { const row = document.createElement('tr'); // Format date and times for display const date = activity.date ? formatDateForDisplay(activity.date) : 'N/A'; const startTime = formatTimeToGMT4(activity.start_time); const endTime = formatTimeToGMT4(activity.end_time); row.innerHTML = ` ${date} ${startTime} ${endTime} ${formatDurationHours(activity.duration_hours)} `; userActivityBody.appendChild(row); }); }