Public Policy Compliance Analyzer

Public Policy Compliance Analyzer

Overall Compliance Scores

Items Needing Attention

${item.text}

`; attentionItemsList.appendChild(li); } }); }); if (nonCompliantCount === 0) { attentionItemsList.innerHTML = `
  • No items currently require attention.
  • `; } } function renderChecklistSelector() { checklistSelector.innerHTML = ''; Object.keys(state.policies).forEach(key => { const policy = state.policies[key]; const option = document.createElement('option'); option.value = key; option.textContent = policy.title; if (key === state.selectedChecklist) { option.selected = true; } checklistSelector.appendChild(option); }); } function renderChecklist() { const policy = state.policies[state.selectedChecklist]; if (!policy) return; let tableHTML = ` `; policy.items.forEach(item => { tableHTML += ` `; }); tableHTML += `
    Requirement Status Notes
    ${item.text}
    `; checklistContainer.innerHTML = tableHTML; } // --- EVENT HANDLERS & LOGIC --- function switchTab(tabName) { state.currentTab = tabName; const tabOrder = ['dashboard', 'checklists', 'config']; const currentIndex = tabOrder.indexOf(tabName); Object.values(tabs).forEach(tab => tab.classList.remove('active')); Object.values(contents).forEach(content => content.classList.add('hidden')); tabs[tabName].classList.add('active'); contents[tabName].classList.remove('hidden'); navButtons.prev.disabled = currentIndex === 0; navButtons.next.disabled = currentIndex === tabOrder.length - 1; } checklistSelector.addEventListener('change', (e) => { state.selectedChecklist = e.target.value; renderChecklist(); }); checklistContainer.addEventListener('change', (e) => { const target = e.target; const row = target.closest('tr'); if (!row) return; const itemId = parseInt(row.dataset.itemId); const policy = Object.values(state.policies).find(p => p.items.some(i => i.id === itemId)); const item = policy.items.find(i => i.id === itemId); if (target.classList.contains('status-selector')) { item.status = target.value; } renderDashboard(); // Update scores and attention items immediately }); checklistContainer.addEventListener('input', (e) => { const target = e.target; const row = target.closest('tr'); if (!row || !target.classList.contains('notes-input')) return; const itemId = parseInt(row.dataset.itemId); const policy = Object.values(state.policies).find(p => p.items.some(i => i.id === itemId)); const item = policy.items.find(i => i.id === itemId); item.notes = target.value; }); companyNameInput.addEventListener('input', (e) => { state.companyName = e.target.value; }); downloadPdfBtn.addEventListener('click', () => { const { jsPDF } = window.jspdf; const doc = new jsPDF(); const companyName = state.companyName || 'Compliance Report'; doc.setFontSize(20); doc.text(`${companyName} - Public Policy Compliance Report`, 14, 22); doc.setFontSize(11); doc.setTextColor(100); doc.text(`Report Generated: ${new Date().toLocaleDateString()}`, 14, 30); let lastY = 35; Object.keys(state.policies).forEach(key => { const policy = state.policies[key]; const totalItems = policy.items.filter(item => item.status !== 'N/A').length; const compliantItems = policy.items.filter(item => item.status === 'Compliant').length; const score = totalItems > 0 ? Math.round((compliantItems / totalItems) * 100) : 100; doc.setFontSize(14); doc.setTextColor(40); doc.text(`${policy.title} (Compliance: ${score}%)`, 14, lastY + 10); const head = [['Requirement', 'Status', 'Notes']]; const body = policy.items.map(item => [item.text, item.status, item.notes]); doc.autoTable({ startY: lastY + 15, head: head, body: body, theme: 'striped', headStyles: { fillColor: [67, 56, 202] }, // indigo-700 didDrawPage: (data) => { lastY = data.cursor.y; } }); lastY = doc.lastAutoTable.finalY; }); doc.save(`${companyName.replace(/\s/g, '_')}_Compliance_Report.pdf`); }); // --- ATTACH EVENT LISTENERS --- tabs.dashboard.addEventListener('click', () => switchTab('dashboard')); tabs.checklists.addEventListener('click', () => switchTab('checklists')); tabs.config.addEventListener('click', () => switchTab('config')); navButtons.next.addEventListener('click', () => { const tabOrder = ['dashboard', 'checklists', 'config']; const currentIndex = tabOrder.indexOf(state.currentTab); if (currentIndex < tabOrder.length - 1) { switchTab(tabOrder[currentIndex + 1]); } }); navButtons.prev.addEventListener('click', () => { const tabOrder = ['dashboard', 'checklists', 'config']; const currentIndex = tabOrder.indexOf(state.currentTab); if (currentIndex > 0) { switchTab(tabOrder[currentIndex - 1]); } }); // --- INITIALIZATION --- function init() { renderAll(); switchTab('dashboard'); // Set initial tab state } init(); });
    Scroll to Top