Online Secure Meeting Data Storage & Sharing Tool

Secure Meeting Data Storage & Sharing Tool

A centralized and secure hub for all your meeting files and assets.

Meetings

Select a meeting to view details

${meeting.date}

`).join(''); }; const renderMeetingDetails = () => { const headerEl = document.getElementById('meeting-details-header').querySelector('h2'); const dateEl = document.getElementById('meeting-details-date'); const contentArea = document.getElementById('meeting-content-area'); const downloadBtn = document.getElementById('download-pdf-btn'); if (!data.activeMeetingId) { headerEl.textContent = 'Select a meeting to view details'; dateEl.textContent = ''; contentArea.classList.add('hidden'); downloadBtn.classList.add('hidden'); return; } const meeting = data.meetings.find(m => m.id === data.activeMeetingId); headerEl.textContent = meeting.title; dateEl.textContent = `Date: ${meeting.date}`; contentArea.classList.remove('hidden'); downloadBtn.classList.remove('hidden'); renderFileList(meeting.id); renderSharingList(meeting.id); }; const renderFileList = (meetingId) => { const fileContainer = document.getElementById('file-list'); const files = data.files[meetingId] || []; if (files.length === 0) { fileContainer.innerHTML = '

No files uploaded for this meeting.

'; return; } fileContainer.innerHTML = files.map(file => `
${file.name}
`).join(''); }; const renderSharingList = (meetingId) => { const sharingContainer = document.getElementById('sharing-list'); const permittedUserIds = data.permissions[meetingId] || []; sharingContainer.innerHTML = data.users.map(user => { const hasAccess = permittedUserIds.includes(user.id); return `
${user.name}
`; }).join(''); }; const renderConfig = () => { const usersTable = document.getElementById('config-users-table'); usersTable.innerHTML = data.users.map(u => ` ${u.id}${u.name}N/A `).join(''); const meetingsTable = document.getElementById('config-meetings-table'); meetingsTable.innerHTML = data.meetings.map(m => ` ${m.id}${m.title}${m.date}N/A `).join(''); }; // --- CORE LOGIC (global for inline onclick) --- window.selectMeeting = (meetingId) => { data.activeMeetingId = meetingId; fullRender(); }; window.togglePermission = (meetingId, userId) => { const permissions = data.permissions[meetingId]; if (!permissions) return; const userIndex = permissions.indexOf(userId); if (userIndex > -1) { permissions.splice(userIndex, 1); } else { permissions.push(userId); } // No need to call fullRender, just re-render the sharing list for performance renderSharingList(meetingId); }; // --- PDF DOWNLOAD --- const downloadPDF = () => { if (!data.activeMeetingId) return; const { jsPDF } = window.jspdf; const doc = new jsPDF(); const meeting = data.meetings.find(m => m.id === data.activeMeetingId); const files = data.files[data.activeMeetingId] || []; const permittedUserIds = data.permissions[data.activeMeetingId] || []; const usersWithAccess = data.users.filter(u => permittedUserIds.includes(u.id)); doc.setFontSize(20); doc.text(`Meeting Report: ${meeting.title}`, 14, 22); doc.setFontSize(12); doc.setTextColor(100); doc.text(`Date: ${meeting.date}`, 14, 30); doc.autoTable({ startY: 40, head: [['Files & Documents']], body: files.map(f => [f.name]), theme: 'striped', headStyles: { fillColor: [8, 145, 178] } }); doc.autoTable({ startY: doc.autoTable.previous.finalY + 10, head: [['Users with Access']], body: usersWithAccess.map(u => [u.name]), theme: 'striped', headStyles: { fillColor: [8, 145, 178] } }); doc.save(`Meeting_Report_${meeting.title}.pdf`); }; document.getElementById('download-pdf-btn').addEventListener('click', downloadPDF); // --- TAB NAVIGATION --- const tabs = document.querySelectorAll('[role="tab"]'); const prevBtn = document.getElementById('prev-tab-btn'); const nextBtn = document.getElementById('next-tab-btn'); let currentTabIndex = 0; const switchTab = (newIndex) => { tabs.forEach((tab, index) => { const panel = document.getElementById(tab.getAttribute('aria-controls')); if (index === newIndex) { tab.classList.remove('tab-inactive'); tab.classList.add('tab-active'); if (panel) panel.classList.remove('hidden'); } else { tab.classList.remove('tab-active'); tab.classList.add('tab-inactive'); if (panel) panel.classList.add('hidden'); } }); currentTabIndex = newIndex; updateNavButtons(); }; const updateNavButtons = () => { prevBtn.disabled = currentTabIndex === 0; nextBtn.disabled = currentTabIndex === tabs.length - 1; prevBtn.classList.toggle('opacity-50', prevBtn.disabled); nextBtn.classList.toggle('opacity-50', nextBtn.disabled); }; tabs.forEach((tab, index) => tab.addEventListener('click', () => switchTab(index))); prevBtn.addEventListener('click', () => { if (currentTabIndex > 0) switchTab(currentTabIndex - 1); }); nextBtn.addEventListener('click', () => { if (currentTabIndex < tabs.length - 1) switchTab(currentTabIndex + 1); }); // --- INITIALIZATION --- const fullRender = () => { renderMeetingList(); renderMeetingDetails(); renderConfig(); }; fullRender(); updateNavButtons(); });
Scroll to Top