${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();
});