Marketing Collateral Dashboard

Marketing Collateral Dashboard

Tracking the inventory and performance of marketing assets.

Collateral Inventory

Asset Name Type Status Date Created Downloads

Downloads by Collateral Type

Asset Status Distribution

Total Downloads

${kpis.totalDownloads.toLocaleString()}

Top Performing Asset

${kpis.topAssetName}

Top Asset Downloads

${kpis.topAssetDownloads.toLocaleString()}

`; // Render Table const tableBody = dashboardPane.querySelector('#collateral-table-body'); tableBody.innerHTML = collateralData.collateral.map(asset => { let statusColor = 'bg-slate-100 text-slate-800'; if (asset.status === 'In Use') statusColor = 'bg-emerald-100 text-emerald-800'; if (asset.status === 'In Review') statusColor = 'bg-amber-100 text-amber-800'; if (asset.status === 'Archived') statusColor = 'bg-gray-100 text-gray-800'; return ` ${asset.name} ${asset.type} ${asset.status} ${new Date(asset.dateCreated + 'T00:00:00').toLocaleDateString()} ${asset.downloads.toLocaleString()} `; }).join(''); renderChartsForTab('dashboard'); }; const renderConfigTab = () => { const configPane = document.getElementById('config-tab'); if(!configPane) return; configPane.innerHTML = `

Configure Collateral Data

Edit the JSON data for marketing assets below.

`; document.getElementById('data-config-input').value = JSON.stringify(collateralData, null, 2); document.getElementById('update-dashboard-btn').addEventListener('click', handleUpdateDashboard); }; // --- CHART RENDERING --- const renderChartsForTab = (tabId) => { if (tabId !== 'dashboard') return; destroyCharts(); const processed = processData(); chartInstances.bar = new Chart(document.getElementById('bar-chart').getContext('2d'), { type: 'bar', data: { labels: processed.charts.downloadsByType.labels, datasets: [{ label: 'Total Downloads', data: processed.charts.downloadsByType.data, backgroundColor: 'rgba(14, 165, 233, 0.6)' }] }, options: { responsive: true, maintainAspectRatio: true } }); chartInstances.pie = new Chart(document.getElementById('pie-chart').getContext('2d'), { type: 'pie', data: { labels: processed.charts.statusDistribution.labels, datasets: [{ label: 'Asset Count', data: processed.charts.statusDistribution.data, backgroundColor: ['#10b981', '#f59e0b', '#64748b'] }] }, options: { responsive: true, maintainAspectRatio: true } }); }; // --- NAVIGATION & EVENT HANDLING --- const showTab = (tabIndex) => { currentTab = tabIndex; const tabId = tabs[tabIndex]; document.querySelectorAll('.tab-pane').forEach(pane => pane.classList.add('hidden')); document.getElementById(`${tabId}-tab`).classList.remove('hidden'); document.querySelectorAll('.tab-btn').forEach(btn => btn.classList.remove('active')); document.querySelector(`.tab-btn[data-tab='${tabId}']`).classList.add('active'); prevBtn.style.visibility = (currentTab === 0) ? 'hidden' : 'visible'; nextBtn.style.visibility = (currentTab >= tabs.length - 2) ? 'hidden' : 'visible'; downloadPdfBtn.style.visibility = (tabId === 'config') ? 'hidden' : 'visible'; if (tabId === 'dashboard') { renderDashboardTab(); } }; tabNavigation.addEventListener('click', (e) => { if (e.target.matches('.tab-btn')) { const tabId = e.target.dataset.tab; const tabIndex = tabs.indexOf(tabId); showTab(tabIndex); } }); nextBtn.addEventListener('click', () => { if (currentTab < tabs.length - 1) showTab(currentTab + 1); }); prevBtn.addEventListener('click', () => { if (currentTab > 0) showTab(currentTab - 1); }); const handleUpdateDashboard = () => { const configInput = document.getElementById('data-config-input'); const errorDiv = document.getElementById('json-error'); const errorMessage = document.getElementById('json-error-message'); try { const newData = JSON.parse(configInput.value); collateralData = newData; errorDiv.classList.add('hidden'); renderDashboardTab(); alert('Dashboard updated successfully!'); showTab(0); } catch (error) { errorMessage.textContent = 'Invalid JSON format. ' + error.message; errorDiv.classList.remove('hidden'); } }; // --- PDF GENERATION --- downloadPdfBtn.addEventListener('click', () => { const { jsPDF } = window.jspdf; const pdfContainer = document.getElementById('pdf-content-container'); const activeTabElement = document.getElementById('dashboard-tab'); if (!pdfContainer || !activeTabElement) return; const clone = activeTabElement.cloneNode(true); pdfContainer.innerHTML = ''; pdfContainer.appendChild(clone); html2canvas(pdfContainer, { scale: 2, useCORS: true, logging: false, width: pdfContainer.scrollWidth, height: pdfContainer.scrollHeight }) .then(canvas => { const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF({ orientation: 'portrait', unit: 'pt', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = pdf.internal.pageSize.getHeight(); const imgWidth = canvas.width; const imgHeight = canvas.height; const ratio = imgWidth / imgHeight; let finalImgHeight = pdfWidth / ratio; let heightLeft = finalImgHeight; let position = 0; pdf.text(`Marketing Collateral Report`, 40, 40); pdf.addImage(imgData, 'PNG', 0, 60, pdfWidth, finalImgHeight); heightLeft -= (pdfHeight - 60); while (heightLeft > 0) { position = heightLeft - finalImgHeight; pdf.addPage(); pdf.addImage(imgData, 'PNG', 0, position, pdfWidth, finalImgHeight); heightLeft -= pdfHeight; } pdf.save(`Marketing_Collateral_Report.pdf`); pdfContainer.innerHTML = ''; }).catch(err => { console.error("PDF generation failed:", err); alert("Sorry, there was an error creating the PDF."); }); }); // --- INITIALIZATION --- createTabs(); renderAllTabs(); showTab(0); });
Scroll to Top