${item.date}
`).join('');
} else {
deadlinesList.innerHTML = 'No deadlines in the next 90 days.
'; } } // --- TAB NAVIGATION --- function updateTabDisplay(tabNum) { tabButtons.forEach(button => button.classList.toggle('active', parseInt(button.dataset.tab) === tabNum)); tabContents.forEach(content => content.style.display = 'none'); document.getElementById(`tab-content-${tabNum}`).style.display = 'block'; if (tabNum === 1) updateDashboard(); if (tabNum === 2) renderCasesTable(); } // --- MODAL LOGIC --- const modal = document.getElementById('edit-modal'); function openModal(caseId) { const caseItem = DB.find(c => c.id === caseId); if (!caseItem) return; document.getElementById('modal-title').textContent = `Case: ${caseItem.name}`; document.getElementById('edit-case-id').value = caseItem.id; document.getElementById('edit-case-name').value = caseItem.name; document.getElementById('edit-case-number').value = caseItem.number; Object.entries(caseItem.dates).forEach(([key, value]) => { const el = document.getElementById(`date-${key}`); if (el) el.value = value; }); const statusSelect = document.getElementById('edit-case-status'); statusSelect.innerHTML = ` `; renderDocumentList(caseId); modal.classList.remove('hidden'); } function renderDocumentList(caseId) { const caseItem = DB.find(c => c.id === caseId); const listEl = document.getElementById('document-list'); if (!caseItem || !listEl) return; if (caseItem.documents.length === 0) { listEl.innerHTML = 'No documents logged for this case.
'; return; } listEl.innerHTML = caseItem.documents.map((doc, index) => `
${doc.name}
${doc.type}
${doc.date}
`).join('');
}
function closeModal() {
modal.classList.add('hidden');
}
// --- DATA HANDLING ---
function handleSaveChanges() {
const caseId = parseInt(document.getElementById('edit-case-id').value);
const caseItem = DB.find(c => c.id === caseId);
if (caseItem) {
caseItem.name = document.getElementById('edit-case-name').value;
caseItem.number = document.getElementById('edit-case-number').value;
caseItem.status = document.getElementById('edit-case-status').value;
caseItem.dates.filing = document.getElementById('date-filing').value;
caseItem.dates.discovery = document.getElementById('date-discovery').value;
caseItem.dates.motions = document.getElementById('date-motions').value;
caseItem.dates.trial = document.getElementById('date-trial').value;
}
closeModal();
if (document.getElementById('tab-content-2').style.display === 'block') {
renderCasesTable();
}
}
function handleAddDocument() {
const caseId = parseInt(document.getElementById('edit-case-id').value);
const caseItem = DB.find(c => c.id === caseId);
const nameEl = document.getElementById('doc-name');
const typeEl = document.getElementById('doc-type');
const dateEl = document.getElementById('doc-date');
if (caseItem && nameEl.value && dateEl.value) {
caseItem.documents.push({
name: nameEl.value,
type: typeEl.value,
date: dateEl.value
});
nameEl.value = '';
dateEl.value = '';
renderDocumentList(caseId);
}
}
function handleRemoveDocument(e) {
if (!e.target.classList.contains('remove-doc-btn')) return;
const caseId = parseInt(document.getElementById('edit-case-id').value);
const caseItem = DB.find(c => c.id === caseId);
const index = parseInt(e.target.dataset.index);
if (caseItem) {
caseItem.documents.splice(index, 1);
renderDocumentList(caseId);
}
}
// --- PDF GENERATION ---
function generatePdfHtml(caseId) {
const c = DB.find(c => c.id === caseId);
if(!c) return '';
let docHtml = 'Litigation Case Summary
${c.name}
Case Number: ${c.number}
Court: ${c.court}
Presiding Judge: ${c.judge}
Opposing Counsel: ${c.opposingCounsel}
Status: ${c.status}
Date Filed: ${c.dates.filing}
Key Deadlines
Discovery Cut-off: ${c.dates.discovery}
Motions Deadline: ${c.dates.motions}
Trial Date: ${c.dates.trial}
Logged Documents
| Document Name | Type | Date Filed |
|---|
This summary is for informational purposes only. Generated on ${new Date().toLocaleDateString('en-US')}.
`; } async function handlePdfDownload() { const caseId = parseInt(document.getElementById('edit-case-id').value); document.getElementById('pdf-content').innerHTML = generatePdfHtml(caseId); const { jsPDF } = window.jspdf; const button = document.getElementById('downloadPdfBtn'); button.textContent = 'Generating...'; button.disabled = true; try { const canvas = await html2canvas(document.getElementById('pdf-container'), { scale: 2 }); const pdf = new jsPDF({ orientation: 'p', unit: 'mm', format: 'a4' }); pdf.addImage(canvas.toDataURL('image/png'), 'PNG', 10, 10, 190, 0); pdf.save(`Case_Summary_${caseId}.pdf`); } catch (error) { console.error("PDF generation failed:", error); } finally { button.textContent = 'Download Case Summary (PDF)'; button.disabled = false; } } // --- EVENT LISTENERS --- tabButtons.forEach(b => b.addEventListener('click', () => updateTabDisplay(parseInt(b.dataset.tab)))); document.getElementById('new-case-form').addEventListener('submit', function(e) { e.preventDefault(); const newCase = { id: DB.length > 0 ? Math.max(...DB.map(c => c.id)) + 1 : 1, name: this.querySelector('#case-name').value, number: this.querySelector('#case-number').value, court: this.querySelector('#case-court').value, judge: this.querySelector('#case-judge').value, opposingCounsel: this.querySelector('#opposing-counsel').value, status: 'discovery', dates: { filing: new Date().toISOString().split('T')[0], discovery: '', motions: '', trial: '' }, documents: [] }; DB.push(newCase); this.reset(); updateTabDisplay(2); }); document.getElementById('cases-table-body').addEventListener('click', e => { if (e.target.classList.contains('view-details-btn')) { openModal(parseInt(e.target.dataset.id)); } }); document.getElementById('close-modal-btn').addEventListener('click', closeModal); document.getElementById('save-changes-btn').addEventListener('click', handleSaveChanges); document.getElementById('add-doc-btn').addEventListener('click', handleAddDocument); document.getElementById('document-list').addEventListener('click', handleRemoveDocument); document.getElementById('downloadPdfBtn').addEventListener('click', handlePdfDownload); // --- INITIALIZATION --- updateDashboard(); });