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 = '
Loading...
'; try { const response = await fetch('api/chat.php', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ action: 'get_past_timesheets' }) }); if (!response.ok) { 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 = '
No past timesheets found.
'; return; } const accordion = document.createElement('div'); accordion.className = 'accordion'; accordion.id = 'past-timesheets-accordion'; data.past_timesheets.forEach((sheet, index) => { const activities = JSON.parse(sheet.activities); const item = document.createElement('div'); item.className = 'accordion-item'; const header = document.createElement('h2'); header.className = 'accordion-header'; header.innerHTML = ` `; const collapse = document.createElement('div'); collapse.id = `collapse-${index}`; collapse.className = `accordion-collapse collapse ${index === 0 ? 'show' : ''}`; collapse.setAttribute('data-bs-parent', '#past-timesheets-accordion'); const body = document.createElement('div'); body.className = 'accordion-body'; let tableHtml = `
`; activities.forEach(activity => { const badgeClass = activity.output_type === 'AI' ? 'badge-ai' : 'badge-human'; tableHtml += ` `; }); tableHtml += '
Timestamp Task Project Output Duration
${activity.timestamp} ${escapeHTML(activity.task)} ${escapeHTML(activity.project)} ${escapeHTML(activity.output_type)} ${escapeHTML(activity.duration)}
'; body.innerHTML = tableHtml; collapse.appendChild(body); item.appendChild(header); item.appendChild(collapse); accordion.appendChild(item); }); pastTimesheetsContainer.innerHTML = ''; pastTimesheetsContainer.appendChild(accordion); } catch (error) { console.error('Error loading past timesheets:', error); pastTimesheetsContainer.innerHTML = '

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 = ` ${logEntry.timestamp} ${escapeHTML(logEntry.task)} ${escapeHTML(logEntry.project)} ${escapeHTML(logEntry.output_type)} ${escapeHTML(logEntry.duration)} `; activityLogBody.prepend(newRow); logCount.textContent = parseInt(logCount.textContent) + 1; } function escapeHTML(str) { if (typeof str !== 'string') return ''; const p = document.createElement('p'); p.appendChild(document.createTextNode(str)); return p.innerHTML; } });