Project Automation Dashboard

Overall Success Rate

100%

Total Executions

0

Avg. Run Time

0s

Total Cost Saved

$0

Task Status Overview

Success vs. Failure by Task

Add New Automated Task

Log Task Execution

Last run: ${lastLog ? new Date(lastLog.timestamp).toLocaleString() : 'Never'}

Status: ${lastLog ? lastLog.status : 'Unknown'}

`; taskStatusGrid.appendChild(item); }); // Charts updateSuccessFailChart(); }; const updateSuccessFailChart = () => { const data = { labels: tasks.map(t => t.name), datasets: [ { label: 'Success', data: tasks.map(t => logs.filter(l => l.taskId === t.id && l.status === 'Success').length), backgroundColor: 'var(--success-color)' }, { label: 'Failure', data: tasks.map(t => logs.filter(l => l.taskId === t.id && l.status === 'Failure').length), backgroundColor: 'var(--danger-color)' } ] }; renderChart('pa-successFailChart', 'bar', data, { scales: { x: { stacked: true }, y: { stacked: true } } }); }; const renderChart = (canvasId, type, data, options) => { const ctx = document.getElementById(canvasId); if (!ctx) return; if (charts[canvasId]) charts[canvasId].destroy(); charts[canvasId] = new Chart(ctx, { type, data, options: { responsive: true, maintainAspectRatio: false, ...options } }); }; const downloadPDF = () => { const { jsPDF } = window.jspdf; const doc = new jsPDF(); doc.setFontSize(18); doc.text("Project Automation Report", 14, 22); const kpiData = [ ['Overall Success Rate', kpiElements.successRate.textContent], ['Total Executions', kpiElements.totalRuns.textContent], ['Average Run Time', kpiElements.avgTime.textContent], ['Total Cost Saved', kpiElements.costSaved.textContent], ]; doc.autoTable({ startY: 30, head: [['Metric', 'Value']], body: kpiData, headStyles: { fillColor: [3, 169, 244] } }); const taskData = tasks.map(t => { const taskLogs = logs.filter(l => l.taskId === t.id); const successes = taskLogs.filter(l => l.status === 'Success').length; const failures = taskLogs.length - successes; return [t.name, taskLogs.length, successes, failures]; }); doc.autoTable({ startY: doc.lastAutoTable.finalY + 10, head: [['Task Name', 'Total Runs', 'Successes', 'Failures']], body: taskData }); doc.save('Project-Automation-Report.pdf'); }; const saveData = () => { localStorage.setItem('pa_tasks', JSON.stringify(tasks)); localStorage.setItem('pa_logs', JSON.stringify(logs)); }; const loadData = () => { tasks = JSON.parse(localStorage.getItem('pa_tasks')) || []; logs = JSON.parse(localStorage.getItem('pa_logs')) || []; }; let currentTabIndex = 0; window.pa_changeTab = (event, tabName) => { currentTabIndex = Array.from(tabs).findIndex(t => t === event.currentTarget); tabContents.forEach(c => c.classList.remove('active')); tabs.forEach(t => t.classList.remove('active')); document.getElementById(tabName).classList.add('active'); event.currentTarget.classList.add('active'); updateNavButtons(); }; const updateNavButtons = () => { prevBtn.style.display = currentTabIndex === 0 ? 'none' : 'inline-block'; nextBtn.style.display = currentTabIndex === tabs.length - 1 ? 'none' : 'inline-block'; }; const navigateTabs = (direction) => { const newIndex = currentTabIndex + direction; if (newIndex >= 0 && newIndex < tabs.length) tabs[newIndex].click(); }; const showConfirmation = (message) => { confirmationMessage.textContent = message; confirmationMessage.classList.add('visible'); setTimeout(() => confirmationMessage.classList.remove('visible'), 2500); }; addTaskBtn.addEventListener('click', addTask); logExecutionBtn.addEventListener('click', logExecution); downloadPdfBtn.addEventListener('click', downloadPDF); prevBtn.addEventListener('click', () => navigateTabs(-1)); nextBtn.addEventListener('click', () => navigateTabs(1)); logDateTimeInput.value = getCurrentDateTimeLocal(); loadData(); updateTaskSelect(); updateAllDashboards(); updateNavButtons(); });
Scroll to Top