Automated Influencer Outreach & Management System

Automated Influencer Outreach & Management System

Streamline your influencer marketing campaigns from start to finish.

Influencer Campaign Overview

Influencer Followers Campaign Status

Influencer Management

Campaign Management

${total}

Contacted

${contacted}

Responded

${responded}

Active Campaigns

${active}

`; // Render Table dashboardTableBody.innerHTML = ''; state.influencers.forEach(i => { const campaign = state.campaigns.find(c => c.id === i.campaignId); const tr = document.createElement('tr'); tr.className = 'bg-white border-b hover:bg-gray-50'; tr.innerHTML = `
${i.name}
${i.handle}
${(i.followers / 1000).toFixed(1)}k `; dashboardTableBody.appendChild(tr); }); document.getElementById('dashboard-date').textContent = `Report as of: ${new Date().toLocaleDateString()}`; }; const renderAll = () => { renderConfig(); renderDashboard(); updateNavButtons(); }; // --- Row Creation for Config --- const createInfluencerRow = (influencer = {}) => { const id = influencer.id || nextId++; const div = document.createElement('div'); div.className = 'influencer-row grid grid-cols-1 sm:grid-cols-8 gap-2 items-center'; div.dataset.id = id; div.innerHTML = ` `; div.querySelector('.remove-btn').addEventListener('click', () => { div.remove(); saveConfig(); renderDashboard(); }); influencersList.appendChild(div); }; const createCampaignRow = (campaign = {}) => { const id = campaign.id || nextId++; const div = document.createElement('div'); div.className = 'campaign-row grid grid-cols-1 sm:grid-cols-8 gap-2 items-center'; div.dataset.id = id; div.innerHTML = ` `; div.querySelector('.remove-btn').addEventListener('click', () => { div.remove(); saveConfig(); renderDashboard(); }); campaignsList.appendChild(div); }; // --- Event Handlers --- addInfluencerBtn.addEventListener('click', () => createInfluencerRow()); addCampaignBtn.addEventListener('click', () => createCampaignRow()); dashboardTableBody.addEventListener('change', (e) => { const influencerId = parseInt(e.target.dataset.influencerId); const influencer = state.influencers.find(i => i.id === influencerId); if (influencer) { if (e.target.classList.contains('status-select')) { influencer.status = e.target.value; } if (e.target.classList.contains('campaign-select')) { influencer.campaignId = e.target.value ? parseInt(e.target.value) : null; } renderDashboard(); // Re-render to update summary cards } }); // --- Tab & Navigation Logic --- function switchTab(targetTabId) { if (currentTab === 'config') { saveConfig(); } currentTab = targetTabId; tabs.forEach(tab => tab.classList.toggle('active', tab.dataset.tab === currentTab)); tabContents.forEach(content => content.classList.toggle('active', content.id === currentTab)); renderAll(); } tabs.forEach(tab => tab.addEventListener('click', () => switchTab(tab.dataset.tab))); nextBtn.addEventListener('click', () => currentTab === 'dashboard' ? switchTab('config') : switchTab('dashboard')); prevBtn.addEventListener('click', () => currentTab === 'config' ? switchTab('dashboard') : switchTab('config')); function updateNavButtons() { if (currentTab === 'dashboard') { nextBtn.textContent = 'Configure Data'; prevBtn.style.display = 'none'; pdfButtonContainer.style.display = 'block'; } else { nextBtn.textContent = 'Update Dashboard'; prevBtn.style.display = 'inline-flex'; pdfButtonContainer.style.display = 'none'; } } // --- PDF Download --- downloadPdfBtn.addEventListener('click', async () => { const { jsPDF } = window.jspdf; const doc = new jsPDF({ orientation: 'l', unit: 'mm', format: 'a4' }); const content = document.getElementById('pdf-content'); // Temporarily replace selects with static text for PDF content.querySelectorAll('select').forEach(sel => { const text = document.createElement('span'); text.textContent = sel.options[sel.selectedIndex].text; if(sel.classList.contains('status-select')) { const statusClass = 'status-' + sel.value.toLowerCase().replace(' ', '-'); text.className = `status-badge ${statusClass}`; } sel.style.display = 'none'; sel.parentNode.insertBefore(text, sel); }); await new Promise(r => setTimeout(r, 100)); const canvas = await html2canvas(content, { scale: 2 }); const imgData = canvas.toDataURL('image/jpeg', 1.0); doc.setFont('helvetica', 'bold'); doc.setFontSize(18); doc.text('Influencer Campaign Report', 14, 22); const imgProps = doc.getImageProperties(imgData); const pdfWidth = doc.internal.pageSize.getWidth() - 28; const pdfHeight = (imgProps.height * pdfWidth) / imgProps.width; doc.addImage(imgData, 'JPEG', 14, 30, pdfWidth, pdfHeight); // Restore selects after PDF generation content.querySelectorAll('select').forEach(sel => sel.style.display = 'block'); content.querySelectorAll('span.status-badge').forEach(span => span.remove()); doc.save(`Influencer-Report-${new Date().toISOString().slice(0,10)}.pdf`); }); // --- Initial Load --- renderAll(); });
Scroll to Top