diff --git a/public/index.html b/public/index.html index 5fa68da..8205d8d 100644 --- a/public/index.html +++ b/public/index.html @@ -52,7 +52,10 @@ const mainViews = { auth: document.getElementById('auth-view'), employee: document.getElementById('employee-dashboard'), admin: document.getElementById('admin-dashboard'), archive: document.getElementById('admin-archive-view'), timeOffHistory: document.getElementById('admin-time-off-history-view') }; const navUserControls = document.getElementById('nav-user-controls'), welcomeMessage = document.getElementById('welcome-message'), signOutBtn = document.getElementById('sign-out-btn'); const messageBox = document.getElementById('message-box'), loadingSpinner = document.getElementById('loading-spinner'), modalContainer = document.getElementById('modal-container'); + + // **FIXED**: Declared variables safely without parsing immediately. let authToken, user, allTimeEntries = [], allUsers = [], employeeTimerInterval = null; + // --- Helper Functions --- const showLoading = (show) => loadingSpinner.innerHTML = show ? `
` : ''; const showMessage = (message, type = 'success') => { messageBox.innerHTML = ``; messageBox.classList.remove('hidden'); }; @@ -72,25 +75,33 @@ const response = await fetch(`${API_BASE_URL}${endpoint}`, { method, headers, body: body ? JSON.stringify(body) : null }); if (response.status === 401) { handleSignOut('Your session has expired. Please log in again.'); return { success: false }; } const text = await response.text(); - if (!response.ok) throw new Error(JSON.parse(text).message || `HTTP error ${response.status}`); + if (!response.ok) { + const errorData = text ? JSON.parse(text) : {}; + throw new Error(errorData.message || `HTTP error ${response.status}`); + } return { success: true, data: text ? JSON.parse(text) : null }; - } catch (error) { showMessage(error.message, 'error'); return { success: false }; - } finally { showLoading(false); } + } catch (error) { + showMessage(error.message, 'error'); + return { success: false }; + } finally { + showLoading(false); + } } // --- View Management --- const showView = (viewName) => { clearInterval(employeeTimerInterval); Object.keys(mainViews).forEach(v => mainViews[v].classList.toggle('hidden', v !== viewName)); } // --- UI Rendering --- + // **FIXED**: This function now safely handles loading from localStorage. function updateUI() { try { const storedUser = localStorage.getItem('user'); - user = storedUser ? JSON.parse(storedUser) : null; authToken = localStorage.getItem('authToken'); + user = storedUser ? JSON.parse(storedUser) : null; if (authToken && user) { navUserControls.classList.remove('hidden'); - welcomeMessage.textContent = `${user.username}`; + welcomeMessage.textContent = `Welcome, ${user.username}`; user.role === 'admin' ? (showView('admin'), renderAdminDashboard()) : (showView('employee'), renderEmployeeDashboard()); } else { navUserControls.classList.add('hidden'); @@ -98,7 +109,7 @@ renderAuthView(); } } catch (error) { - console.error("Error in updateUI:", error); + console.error("Error initializing UI:", error); handleSignOut("There was an error loading your session."); } } @@ -166,10 +177,7 @@ mainViews.admin.innerHTML = `

Admin Dashboard

- -
-

Currently Punched In

-

Pending Time Off Requests

${pendingRequests.map(r => ``).join('') || ''}
EmployeeDatesReasonActions
${r.username}${formatDate(r.start_date)} - ${formatDate(r.end_date)}${r.reason||''}
No pending requests.

Hours by Employee

${Object.keys(employeeTotals).map(u => ``).join('')}
EmployeeTotal Hours
${u}${formatDecimal(employeeTotals[u])}

Detailed Logs

${allTimeEntries.map(e => ``).join('')}
EmployeeInOutDurationActions
${e.username||'N/A'}${formatDateTime(e.punch_in_time)}${formatDateTime(e.punch_out_time)}${formatDecimal(new Date(e.punch_out_time) - new Date(e.punch_in_time))}
@@ -268,19 +274,19 @@ // --- Initializer --- signOutBtn.addEventListener('click', () => handleSignOut()); updateUI(); - console.log("Attempting to register service worker..."); - if ('serviceWorker' in navigator) { - window.addEventListener('load', () => { - navigator.serviceWorker.register('/sw.js') - .then(registration => { - console.log('✅ ServiceWorker registration successful with scope: ', registration.scope); - }) - .catch(err => { - console.log('❌ ServiceWorker registration failed: ', err); - }); - }); - } + // Service worker registration can be added back once the main app logic is stable. + // if ('serviceWorker' in navigator) { + // window.addEventListener('load', () => { + // navigator.serviceWorker.register('/sw.js') + // .then(registration => { + // console.log('✅ ServiceWorker registration successful with scope: ', registration.scope); + // }) + // .catch(err => { + // console.log('❌ ServiceWorker registration failed: ', err); + // }); + // }); + // }