Document Collaboration Dashboard

Document Collaboration Dashboard

Activity Overview

Total Documents

0

Pending Review

0

Team Members

0

Recent Activity

Documents Awaiting Your Action

${mem.role}

${mem.access}
`).join(''); } // --- MODAL HANDLING --- function openModal(modal) { modal.classList.add('visible'); } function closeModal(modal) { modal.classList.remove('visible'); } document.getElementById('add-doc-btn').addEventListener('click', () => { document.getElementById('doc-form').reset(); document.getElementById('edit-doc-id').value = ''; document.getElementById('doc-modal-title').textContent = 'Add Document'; openModal(docModal); }); document.getElementById('doc-modal-cancel').addEventListener('click', () => closeModal(docModal)); document.getElementById('doc-form').addEventListener('submit', (e) => { e.preventDefault(); const id = parseInt(document.getElementById('edit-doc-id').value); const docData = { name: document.getElementById('doc-name').value, status: document.getElementById('doc-status').value, lastUpdated: new Date().toISOString() }; if (id) { const index = documents.findIndex(d => d.id === id); documents[index] = { ...documents[index], ...docData, version: documents[index].version + 1 }; } else { docData.id = Date.now(); docData.version = 1; documents.push(docData); } updateAll(); closeModal(docModal); }); document.getElementById('add-member-btn').addEventListener('click', () => { document.getElementById('member-form').reset(); document.getElementById('edit-member-id').value = ''; document.getElementById('member-modal-title').textContent = 'Add Team Member'; openModal(memberModal); }); document.getElementById('member-modal-cancel').addEventListener('click', () => closeModal(memberModal)); document.getElementById('member-form').addEventListener('submit', (e) => { e.preventDefault(); const id = parseInt(document.getElementById('edit-member-id').value); const memberData = { name: document.getElementById('member-name').value, role: document.getElementById('member-role').value, access: document.getElementById('member-access').value, }; if (id) { const index = teamMembers.findIndex(m => m.id === id); teamMembers[index] = { ...teamMembers[index], ...memberData }; } else { memberData.id = Date.now(); teamMembers.push(memberData); } updateAll(); closeModal(memberModal); }); // --- PDF GENERATION --- document.getElementById('download-pdf-btn').addEventListener('click', () => { const { jsPDF } = window.jspdf; const doc = new jsPDF(); doc.setFontSize(18); doc.text('Collaboration Summary Report', 14, 22); doc.setFontSize(11); doc.text(`Generated on: ${new Date().toLocaleDateString()}`, 14, 30); doc.autoTable({ startY: 40, head: [['Document Name', 'Status', 'Version', 'Last Updated']], body: documents.map(d => [d.name, d.status, d.version, new Date(d.lastUpdated).toLocaleDateString()]), }); doc.autoTable({ startY: doc.lastAutoTable.finalY + 10, head: [['Team Member', 'Role', 'Access Level']], body: teamMembers.map(m => [m.name, m.role, m.access]), }); doc.save('collaboration_summary.pdf'); }); // --- GLOBAL API --- window.app = { editDoc: (id) => { const doc = documents.find(d => d.id === id); if (doc) { document.getElementById('edit-doc-id').value = doc.id; document.getElementById('doc-name').value = doc.name; document.getElementById('doc-status').value = doc.status; document.getElementById('doc-modal-title').textContent = 'Edit Document'; openModal(docModal); } }, deleteDoc: (id) => { documents = documents.filter(d => d.id !== id); updateAll(); }, editMember: (id) => { const member = teamMembers.find(m => m.id === id); if (member) { document.getElementById('edit-member-id').value = member.id; document.getElementById('member-name').value = member.name; document.getElementById('member-role').value = member.role; document.getElementById('member-access').value = member.access; document.getElementById('member-modal-title').textContent = 'Edit Team Member'; openModal(memberModal); } }, deleteMember: (id) => { teamMembers = teamMembers.filter(m => m.id !== id); updateAll(); } }; // --- HELPERS --- function timeAgo(dateString) { const date = new Date(dateString); const seconds = Math.floor((new Date() - date) / 1000); let interval = seconds / 31536000; if (interval > 1) return Math.floor(interval) + " years ago"; interval = seconds / 2592000; if (interval > 1) return Math.floor(interval) + " months ago"; interval = seconds / 86400; if (interval > 1) return Math.floor(interval) + " days ago"; interval = seconds / 3600; if (interval > 1) return Math.floor(interval) + " hours ago"; interval = seconds / 60; if (interval > 1) return Math.floor(interval) + " minutes ago"; return Math.floor(seconds) + " seconds ago"; } // --- TAB NAVIGATION --- function setActiveTab(tabId) { currentTab = tabId; tabButtons.forEach(btn => btn.classList.toggle('active', btn.dataset.tab === tabId)); tabPanes.forEach(pane => pane.style.display = pane.id === tabId ? 'block' : 'none'); const currentIndex = tabs.indexOf(currentTab); prevTabBtn.disabled = currentIndex === 0; nextTabBtn.disabled = currentIndex === tabs.length - 1; } tabButtons.forEach(button => button.addEventListener('click', () => setActiveTab(button.dataset.tab))); prevTabBtn.addEventListener('click', () => { const newIndex = tabs.indexOf(currentTab) - 1; if (newIndex >= 0) setActiveTab(tabs[newIndex]); }); nextTabBtn.addEventListener('click', () => { const newIndex = tabs.indexOf(currentTab) + 1; if (newIndex < tabs.length) setActiveTab(tabs[newIndex]); }); // --- START --- initialize(); });
Scroll to Top