Social Media Customer Support Integration Tool

Social Media Support Hub

Tickets (0)

Select filters to view tickets.

Select a ticket to view its details.

Analytics Overview

Ticket Status

Message Sentiment

${ticket.timestamp.toLocaleString()}

${ticket.message}

`; } function renderAnalytics() { const statusCounts = tickets.reduce((acc, t) => ({...acc, [t.status]: (acc[t.status] || 0) + 1 }), {}); const sentimentCounts = tickets.reduce((acc, t) => ({...acc, [t.sentiment]: (acc[t.sentiment] || 0) + 1 }), {}); const statusCtx = document.getElementById('statusChart').getContext('2d'); if (statusChart) statusChart.destroy(); statusChart = new Chart(statusCtx, { type: 'doughnut', data: { labels: ['New', 'In Progress', 'Resolved'], datasets: [{ data: [statusCounts['New'] || 0, statusCounts['In Progress'] || 0, statusCounts['Resolved'] || 0], backgroundColor: ['#f59e0b', '#3b82f6', '#10b981'] }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { position: 'bottom', labels: { boxWidth: 12 } } } } }); const sentimentCtx = document.getElementById('sentimentChart').getContext('2d'); if(sentimentChart) sentimentChart.destroy(); sentimentChart = new Chart(sentimentCtx, { type: 'bar', data: { labels: ['Positive', 'Neutral', 'Negative'], datasets: [{ label: 'Sentiment', data: [sentimentCounts['Positive'] || 0, sentimentCounts['Neutral'] || 0, sentimentCounts['Negative'] || 0], backgroundColor: ['#10b981', '#64748b', '#ef4444'] }] }, options: { responsive: true, maintainAspectRatio: false, plugins: { legend: { display: false } } } }); } function renderPlatformFilters() { const container = document.getElementById('inbox-filters'); container.innerHTML = 'All Platforms'; platforms.forEach(p => { container.innerHTML += `${p}`; }); } function openDataModal() { document.getElementById('dataModal').classList.remove('hidden'); document.getElementById('dataModal').classList.add('flex'); renderModalLists(); } function closeDataModal() { document.getElementById('dataModal').classList.add('hidden'); document.getElementById('dataModal').classList.remove('flex'); renderPlatformFilters(); generateInitialTickets(); updateDashboard(); } function renderModalLists() { const platformList = document.getElementById('platformList'); platformList.innerHTML = platforms.map(p => `
  • ${p}
  • `).join(''); const userList = document.getElementById('userList'); userList.innerHTML = mockUsers.map(u => `
  • ${u}
  • `).join(''); const messageList = document.getElementById('messageList'); messageList.innerHTML = mockMessages.map(m => `
  • ${m}
  • `).join(''); } function setupEventListeners() { document.getElementById('inbox-filters').addEventListener('click', e => { e.preventDefault(); if(e.target.dataset.platform) { filters.platform = e.target.dataset.platform; document.querySelectorAll('#inbox-filters a').forEach(el => el.classList.remove('active')); e.target.classList.add('active'); updateDashboard(); } }); document.getElementById('status-filters').addEventListener('click', e => { e.preventDefault(); if(e.target.dataset.status) { filters.status = e.target.dataset.status; document.querySelectorAll('#status-filters a').forEach(el => el.classList.remove('active')); e.target.classList.add('active'); updateDashboard(); } }); document.getElementById('ticket-list').addEventListener('click', e => { const ticketItem = e.target.closest('.ticket-item'); if (ticketItem) { filters.activeTicketId = parseInt(ticketItem.dataset.id); renderTicketList(); renderTicketDetail(filters.activeTicketId); } }); document.getElementById('ticket-detail').addEventListener('change', e => { if (e.target.id === 'status-updater') { const ticketId = parseInt(e.target.dataset.id); const newStatus = e.target.value; const ticket = tickets.find(t => t.id === ticketId); if (ticket) ticket.status = newStatus; updateDashboard(); } }); document.getElementById('manageDataBtn').addEventListener('click', openDataModal); document.getElementById('closeModalBtn').addEventListener('click', closeDataModal); document.getElementById('addPlatformBtn').addEventListener('click', () => { const val = document.getElementById('newPlatform').value; if(val) platforms.push(val); document.getElementById('newPlatform').value = ''; renderModalLists(); }); document.getElementById('addUserBtn').addEventListener('click', () => { const val = document.getElementById('newUser').value; if(val) mockUsers.push(val); document.getElementById('newUser').value = ''; renderModalLists(); }); document.getElementById('addMessageBtn').addEventListener('click', () => { const val = document.getElementById('newMessage').value; if(val) mockMessages.push(val); document.getElementById('newMessage').value = ''; renderModalLists(); }); document.getElementById('dataModal').addEventListener('click', e => { if(e.target.classList.contains('remove-item-btn')) { const value = e.target.dataset.value; const listId = e.target.closest('ul').id; if(listId === 'platformList') platforms = platforms.filter(i => i !== value); if(listId === 'userList') mockUsers = mockUsers.filter(i => i !== value); if(listId === 'messageList') mockMessages = mockMessages.filter(i => i !== value); renderModalLists(); } }); document.getElementById('downloadPdfBtn').addEventListener('click', generatePdf); } async function generatePdf() { document.getElementById('pdf-date').textContent = new Date().toLocaleString(); document.getElementById('pdf-status-chart').src = statusChart.toBase64Image(); document.getElementById('pdf-sentiment-chart').src = sentimentChart.toBase64Image(); const newTickets = tickets.filter(t => t.status === 'New').slice(0, 10); document.getElementById('pdf-table-container').innerHTML = `${newTickets.map(t => ``).join('')}
    UserPlatformMessage
    ${t.user}${t.platform}${t.message}
    `; const reportEl = document.getElementById('pdf-report'); reportEl.classList.remove('hidden'); const canvas = await html2canvas(reportEl, { scale: 2 }); reportEl.classList.add('hidden'); const imgData = canvas.toDataURL('image/png'); const { jsPDF } = window.jspdf; const pdf = new jsPDF({ orientation: 'p', unit: 'in', format: 'letter' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = (canvas.height * pdfWidth) / canvas.width; pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight); pdf.save('Support-Summary-Report.pdf'); } generateInitialTickets(); renderPlatformFilters(); updateDashboard(); setupEventListeners(); setInterval(() => { if(Math.random() > 0.7 && platforms.length > 0 && mockUsers.length > 0 && mockMessages.length > 0) { const platform = platforms[Math.floor(Math.random() * platforms.length)]; const sentiment = sentiments[Math.floor(Math.random() * sentiments.length)]; tickets.unshift({ id: Date.now(), platform, user: mockUsers[Math.floor(Math.random() * mockUsers.length)], message: mockMessages[Math.floor(Math.random() * mockMessages.length)], status: 'New', sentiment, timestamp: new Date() }); updateDashboard(); } }, 5000); });
    Scroll to Top