Automated Order Status Notification System

Automated Order Status Notification System

Manage order statuses and simulate automated notifications.

Live Order Status

Order Status Report

Order ID Customer Status Last Notification

Order Management

Notification Templates

Use placeholders: [OrderID], [CustomerName], [Status]

Notification Sent!

${summary[status]}

`).join(''); // Render Table dashboardTableBody.innerHTML = ''; state.orders.forEach(o => { const tr = document.createElement('tr'); tr.className = 'bg-white border-b hover:bg-gray-50'; const selectOptions = STATUS_OPTIONS.map(opt => ``).join(''); const statusClass = o.status ? o.status.toLowerCase() : 'placed'; tr.innerHTML = ` ${o.id} ${o.customerName} ${o.status} ${o.lastNotification} `; dashboardTableBody.appendChild(tr); }); }; const calculateAndRenderAll = () => { renderConfig(); renderDashboard(); updateNavButtons(); }; // --- Event Handlers --- addOrderBtn.addEventListener('click', () => createOrderRow()); dashboardTableBody.addEventListener('change', e => { if (e.target.classList.contains('status-select')) { const orderId = e.target.dataset.orderId; const newStatus = e.target.value; handleStatusChange(orderId, newStatus); } }); // --- Tab & Navigation Logic --- function switchTab(targetTabId) { if (currentTab === 'config') { saveConfig(); } currentTab = targetTabId; tabs.forEach(tab => tab.classList.toggle('active', tab.dataset.tab === currentTab)); tabContents.forEach(content => content.classList.toggle('active', content.id === currentTab)); if (currentTab === 'dashboard') { renderDashboard(); } else { renderConfig(); } updateNavButtons(); } tabs.forEach(tab => tab.addEventListener('click', () => switchTab(tab.dataset.tab))); nextBtn.addEventListener('click', () => currentTab === 'dashboard' ? switchTab('config') : switchTab('dashboard')); prevBtn.addEventListener('click', () => currentTab === 'config' ? switchTab('dashboard') : switchTab('config')); function updateNavButtons() { if (currentTab === 'dashboard') { nextBtn.textContent = 'Configure Data'; prevBtn.style.display = 'none'; pdfButtonContainer.style.display = 'block'; } else { nextBtn.textContent = 'Update Dashboard'; prevBtn.style.display = 'inline-flex'; pdfButtonContainer.style.display = 'none'; } } // --- PDF Download --- downloadPdfBtn.addEventListener('click', async () => { const { jsPDF } = window.jspdf; const doc = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' }); const content = document.getElementById('pdf-content'); document.querySelectorAll('.no-pdf').forEach(el => el.classList.add('pdf-hide')); document.querySelectorAll('.pdf-only').forEach(el => el.classList.remove('pdf-hide')); document.getElementById('pdf-date').textContent = `Report Generated: ${new Date().toLocaleString()}`; await new Promise(r => setTimeout(r, 100)); const canvas = await html2canvas(content, { scale: 2 }); const imgData = canvas.toDataURL('image/jpeg', 1.0); const imgProps = doc.getImageProperties(imgData); const pdfWidth = doc.internal.pageSize.getWidth() - 28; const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width; doc.addImage(imgData, 'JPEG', 14, 15, pdfWidth, pdfHeight); document.querySelectorAll('.no-pdf').forEach(el => el.classList.remove('pdf-hide')); document.querySelectorAll('.pdf-only').forEach(el => el.classList.add('pdf-hide')); doc.save(`Order-Status-Report-${new Date().toISOString().slice(0,10)}.pdf`); }); // --- Initial Load --- calculateAndRenderAll(); });
Scroll to Top