document.addEventListener('DOMContentLoaded', () => { const chatForm = document.getElementById('chat-form'); const chatInput = document.getElementById('chat-input'); const chatBox = document.getElementById('chat-box'); const activityLogBody = document.getElementById('activity-log-body'); const logCount = document.getElementById('log-count'); const emptyLogRew = document.getElementById('empty-log-row'); const manualLogForm = document.getElementById('manual-log-form'); const clockElement = document.getElementById('clock'); const pastTimesheetsTab = document.getElementById('past-timesheets-tab'); const pastTimesheetsContainer = document.getElementById('past-timesheets'); function updateClock() { if (clockElement) { const now = new Date(); const time = now.toLocaleTimeString(); const month = String(now.getMonth() + 1).padStart(2, '0'); const day = String(now.getDate()).padStart(2, '0'); const year = now.getFullYear(); const date = `${month}-${day}-${year}`; clockElement.textContent = `${time} ${date}`; } } updateClock(); setInterval(updateClock, 1000); if (pastTimesheetsTab) { pastTimesheetsTab.addEventListener('shown.bs.tab', () => { loadPastTimesheets(); }); } async function loadPastTimesheets() { pastTimesheetsContainer.innerHTML = '
Failed to load past timesheets.
'; return; } const data = await response.json(); if (data.error) { pastTimesheetsContainer.innerHTML = `${data.error}
`; return; } if (!data.past_timesheets || data.past_timesheets.length === 0) { pastTimesheetsContainer.innerHTML = '| Timestamp | Task | Project | Output | Duration |
|---|---|---|---|---|
| ${activity.timestamp} | ${escapeHTML(activity.task)} | ${escapeHTML(activity.project)} | ${escapeHTML(activity.output_type)} | ${escapeHTML(activity.duration)} |
An error occurred while fetching data.
'; } } chatForm.addEventListener('submit', async (e) => { e.preventDefault(); const userMessage = chatInput.value.trim(); if (!userMessage) return; appendMessage(userMessage, 'user'); chatInput.value = ''; showTypingIndicator(); try { const response = await fetch('api/chat.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ message: userMessage }) }); removeTypingIndicator(); if (!response.ok) { const errorData = await response.json(); const errorMsg = errorData.error || 'An unknown error occurred.'; appendMessage(`Error: ${errorMsg}`, 'bot'); return; } const data = await response.json(); if (data.error) { appendMessage(`Error: ${data.error}`, 'bot'); return; } appendMessage(data.reply, 'bot'); if (data.new_log_entry) { updateActivityLog(data.new_log_entry); } } catch (error) { removeTypingIndicator(); appendMessage('Could not connect to the server. Please try again later.', 'bot'); console.error("Fetch Error:", error); } }); manualLogForm.addEventListener('submit', async (e) => { e.preventDefault(); const actionType = document.getElementById('action-type').value; const project = document.getElementById('manual-project').value.trim(); const task = document.getElementById('manual-task').value.trim(); if (!project || !task) { // You might want to show an error to the user return; } const payload = { action: 'manual_log', type: actionType, project: project, task: task }; try { const response = await fetch('api/chat.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); if (!response.ok) { console.error('Manual log submission failed'); return; } const data = await response.json(); if (data.new_log_entry) { updateActivityLog(data.new_log_entry); manualLogForm.reset(); } } catch (error) { console.error("Fetch Error:", error); } }); function appendMessage(message, sender) { const messageElement = document.createElement('div'); messageElement.classList.add('message', `${sender}-message`); messageElement.textContent = message; chatBox.appendChild(messageElement); chatBox.scrollTop = chatBox.scrollHeight; } function showTypingIndicator() { const typingIndicator = document.createElement('div'); typingIndicator.classList.add('message', 'bot-message', 'typing-indicator'); typingIndicator.innerHTML = ''; typingIndicator.id = 'typing-indicator'; chatBox.appendChild(typingIndicator); chatBox.scrollTop = chatBox.scrollHeight; } function removeTypingIndicator() { const typingIndicator = document.getElementById('typing-indicator'); if (typingIndicator) { typingIndicator.remove(); } } function updateActivityLog(logEntry) { if(emptyLogRew) { emptyLogRew.remove(); } const newRow = document.createElement('tr'); const badgeClass = logEntry.output_type === 'AI' ? 'badge-ai' : 'badge-human'; newRow.innerHTML = `