Reports
MR ยท Doctor ยท Date Filters
๐Ÿ  Back to Dashboard
Total Visits
โ€”
Unique Doctors
โ€”
Unique MRs
โ€”
Date Range
โ€”
Date Doctor MR Post-Call Next Plan
// update summary range text const sr = document.getElementById('summaryRange'); const fromText = document.getElementById('filterFrom').value || 'โ€”'; const toText = document.getElementById('filterTo').value || 'โ€”'; sr.textContent = `${fromText} โ†’ ${toText}`; } function resetFilters() { document.getElementById('filterMr').value = ''; document.getElementById('filterDoctor').value = ''; document.getElementById('filterFrom').value = ''; document.getElementById('filterTo').value = ''; applyFilters(); } function updateSummary(rows) { document.getElementById('summaryTotal').textContent = rows.length; document.getElementById('summaryDoctors').textContent = new Set(rows.map(r => r.doctorName)).size; document.getElementById('summaryMRs').textContent = new Set(rows.map(r => r.mrName)).size; } // Chart: visits over time (group by date) function updateChart(rows) { const counts = {}; rows.forEach(r => { const k = r.date || 'Unknown'; counts[k] = (counts[k] || 0) + 1; }); const labels = Object.keys(counts).sort((a,b) => new Date(a) - new Date(b)); const data = labels.map(l => counts[l]); if (!visitsChart) { const ctx = document.getElementById('visitsChart').getContext('2d'); visitsChart = new Chart(ctx, { type: 'line', data: { labels, datasets: [{ label: 'Visits', data, tension:0.3, fill:false }] }, options: { responsive:true, plugins:{legend:{display:false}} } }); } else { visitsChart.data.labels = labels; visitsChart.data.datasets[0].data = data; visitsChart.update(); } } // Initialize DataTable with Buttons and store references to the export buttons function initDataTable() { dt = $('#reportsTable').DataTable({ data: [], columns: [ { title: "Date" }, { title: "Doctor Name" }, { title: "MR Name" }, { title: "Post-Call Analysis" }, { title: "Next Call Plan" } ], dom: 'Bfrtip', buttons: [ { extend: 'excelHtml5', title: 'DoctorVisits_Report', className: 'd-none', exportOptions: { columns: ':visible' } }, { extend: 'pdfHtml5', title: 'DoctorVisits_Report', className: 'd-none', exportOptions: { columns: ':visible' } }, { extend: 'print', title: 'DoctorVisits_Report', className: 'd-none', exportOptions: { columns: ':visible' } } ], pageLength: 15, lengthMenu: [ 10, 15, 30, 50, 100 ], responsive: true, scrollX: true }); } // Hook quick action buttons to hidden DataTable buttons function wireQuickActions() { const excelBtnNode = dt.button(0).node(); // excelHtml5 const pdfBtnNode = dt.button(1).node(); // pdfHtml5 const printBtnNode = dt.button(2).node(); // print document.getElementById('btnExportExcel').addEventListener('click', () => excelBtnNode.click()); document.getElementById('btnExportPDF').addEventListener('click', () => pdfBtnNode.click()); document.getElementById('btnPrint').addEventListener('click', () => printBtnNode.click()); } // Entrypoint (async function init() { initDataTable(); allRows = await loadAndFlatten(); // Populate filter selects populateFilters(allRows); // Fill table with all rows initially allRows.forEach(r => dt.row.add([r.date, r.doctorName, r.mrName, r.postCall, r.nextPlan])); dt.draw(); // Set summary and chart for all updateSummary(allRows); updateChart(allRows); // Wire filters document.getElementById('btnApply').addEventListener('click', applyFilters); document.getElementById('btnReset').addEventListener('click', resetFilters); // Also apply filter when Mr dropdown changes immediately document.getElementById('filterMr').addEventListener('change', applyFilters); // Wire quick actions wireQuickActions(); // Make table rows selectable for copying if user wants to copy single row $('#reportsTable tbody').on('click', 'tr', function () { $(this).toggleClass('table-active'); }); // Accessibility: focus to doctor filter document.getElementById('filterDoctor').focus(); })();//