// Shared JavaScript across all pages
let csvData = [];
let headers = [];
// DOM Elements
const dropZone = document.getElementById('dropZone');
const csvFileInput = document.getElementById('csvFile');
const previewSection = document.getElementById('previewSection');
const tableHeaders = document.getElementById('tableHeaders');
const tableBody = document.getElementById('tableBody');
const generateVizBtn = document.getElementById('generateViz');
const vizGallery = document.getElementById('vizGallery');
const chartContainer = document.getElementById('chartContainer');
// Initialize app
document.addEventListener('DOMContentLoaded', function() {
initializeEventListeners();
});
function initializeEventListeners() {
// File input change
csvFileInput.addEventListener('change', handleFileSelect);
// Drag and drop events
dropZone.addEventListener('dragover', handleDragOver);
dropZone.addEventListener('dragleave', handleDragLeave);
dropZone.addEventListener('drop', handleDrop);
// Generate visualizations
generateVizBtn.addEventListener('click', generateVisualizations);
}
function handleDragOver(e) {
e.preventDefault();
dropZone.classList.add('drop-zone-active');
}
function handleDragLeave(e) {
e.preventDefault();
dropZone.classList.remove('drop-zone-active');
}
function handleDrop(e) {
e.preventDefault();
dropZone.classList.remove('drop-zone-active');
const files = e.dataTransfer.files;
if (files.length > 0) {
processCSVFile(files[0]);
}
}
function handleFileSelect(e) {
const file = e.target.files[0];
if (file) {
processCSVFile(file);
}
}
function processCSVFile(file) {
if (file.type !== 'text/csv' && !file.name.endsWith('.csv')) {
alert('Please upload a valid CSV file.');
return;
}
const reader = new FileReader();
reader.onload = function(e) {
const csvText = e.target.result;
parseCSV(csvText);
};
reader.readAsText(file);
}
function parseCSV(csvText) {
const lines = csvText.split('\n').filter(line => line.trim() !== '');
if (lines.length === 0) return;
// Extract headers
headers = lines[0].split(',').map(header => header.trim());
// Extract data rows
csvData = lines.slice(1).map(line => {
const values = line.split(',').map(value => value.trim());
return values;
});
displayPreview();
}
function displayPreview() {
// Show preview section
previewSection.classList.remove('hidden');
// Populate headers
tableHeaders.innerHTML = headers.map(header =>
`
${header} | `
).join('');
// Populate data (show first 10 rows for preview)
const previewData = csvData.slice(0, 10);
tableBody.innerHTML = previewData.map(row =>
`${row.map(cell =>
`| ${cell} | `
).join('')}
`
).join('');
// Scroll to preview
previewSection.scrollIntoView({ behavior: 'smooth' });
}
function generateVisualizations() {
if (csvData.length === 0) return;
// Show visualization gallery
vizGallery.classList.remove('hidden');
chartContainer.innerHTML = '';
// Generate different chart types
generateBarChart();
generateLineChart();
generatePieChart();
generateScatterPlot();
// Scroll to gallery
vizGallery.scrollIntoView({ behavior: 'smooth' });
}
function generateBarChart() {
const canvas = document.createElement('canvas');
canvas.className = 'glass-card p-4';
chartContainer.appendChild(canvas);
// Sample data for demonstration
const ctx = canvas.getContext('2d');
new Chart(ctx, {
type: 'bar',
data: {
labels: headers.slice(0, 5),
datasets: [{
label: 'Sample Data',
data: [65, 59, 80, 81, 56],
backgroundColor: [
'rgba(0, 255, 255, 0.7)',
'rgba(168, 85, 247, 0.7)',
'rgba(34, 211, 238, 0.7)',
'rgba(139, 92, 246, 0.7)',
'rgba(45, 212, 191, 0.7)'
],
borderColor: [
'rgba(0, 255, 255, 1)',
'rgba(168, 85, 247, 1)',
'rgba(34, 211, 238, 1)',
'rgba(139, 92, 246, 1)',
'rgba(45, 212, 191, 1)'
],
borderWidth: 2
}]
},
options: {
responsive: true,
plugins: {
title: {
display: true,
text: 'Bar Chart Visualization',
color: 'white',
font: { size: 16 }
},
legend: {
labels: { color: 'white' }
}
},
scales: {
y: {
beginAtZero: true,
ticks: { color: 'white' }
},
x: {
ticks: { color: 'white' }
}
}
});
}
function generateLineChart() {
const canvas = document.createElement('canvas');
canvas.className = 'glass-card p-4';
chartContainer.appendChild(canvas);
const ctx = canvas.getContext('2d');
new Chart(ctx, {
type: 'line',
data: {
labels: ['Jan', 'Feb', 'Mar', 'Apr', 'May'],
datasets: [{
label: 'Trend Line',
data: [12, 19, 3, 5, 2],
borderColor: 'rgba(0, 255, 255, 1)',
backgroundColor: 'rgba(0, 255, 255, 0.1)',
borderWidth: 3,
tension: 0.4,
fill: true
}]
},
options: {
responsive: true,
plugins: {
title: {
display: true,
text: 'Line Chart Trend',
color: 'white',
font: { size: 16 }
},
legend: {
labels: { color: 'white' }
}
},
scales: {
y: {
beginAtZero: true,
ticks: { color: 'white' }
},
x: {
ticks: { color: 'white' }
}
}
});
}
function generatePieChart() {
const canvas = document.createElement('canvas');
canvas.className = 'glass-card p-4';
chartContainer.appendChild(canvas);
const ctx = canvas.getContext('2d');
new Chart(ctx, {
type: 'pie',
data: {
labels: ['Category A', 'Category B', 'Category C', 'Category D'],
datasets: [{
data: [30, 25, 20, 25],
backgroundColor: [
'rgba(0, 255, 255, 0.8)',
'rgba(168, 85, 247, 0.8)',
'rgba(34, 211, 238, 0.8)',
'rgba(139, 92, 246, 0.8)'
],
borderColor: 'rgba(255, 255, 255, 0.3)',
borderWidth: 2
}]
},
options: {
responsive: true,
plugins: {
title: {
display: true,
text: 'Pie Chart Distribution',
color: 'white',
font: { size: 16 }
},
legend: {
labels: { color: 'white' }
}
}
});
}
function generateScatterPlot() {
const canvas = document.createElement('canvas');
canvas.className = 'glass-card p-4';
chartContainer.appendChild(canvas);
const ctx = canvas.getContext('2d');
new Chart(ctx, {
type: 'scatter',
data: {
datasets: [{
label: 'Data Points',
data: [
{ x: 10, y: 20 }, { x: 15, y: 25 }, { x: 20, y: 30 },
{ x: 25, y: 35 }, { x: 30, y: 40 }, { x: 35, y: 45 }
],
backgroundColor: 'rgba(168, 85, 247, 0.7)',
borderColor: 'rgba(168, 85, 247, 1)',
borderWidth: 2,
pointRadius: 6
}]
},
options: {
responsive: true,
plugins: {
title: {
display: true,
text: 'Scatter Plot Correlation',
color: 'white',
font: { size: 16 }
},
legend: {
labels: { color: 'white' }
}
},
scales: {
y: {
beginAtZero: true,
ticks: { color: 'white' }
},
x: {
ticks: { color: 'white' }
}
}
});
}
// Utility function to download visualization
function downloadChart(chartId, filename) {
const canvas = document.getElementById(chartId);
const link = document.createElement('a');
link.download = filename;
link.href = canvas.toDataURL();
link.click();
}
console.log('DataViz Liquid Glass Studio loaded successfully!');