Spaces:
Running
Running
export class ChartManager { | |
constructor() { | |
this.charts = {}; | |
} | |
formatDate(dateStr) { | |
return new Date(dateStr).toLocaleDateString('en-US', { | |
year: 'numeric', month: 'short', day: 'numeric' | |
}); | |
} | |
createProgressChart(repoData) { | |
const maxCount = Math.max(...repoData.map(row => row.xet_repos)); | |
const dataPoints = repoData.map(row => ({ | |
date: row.date, | |
value: row.xet_repos | |
})); | |
const lineChartCtx = document.getElementById('progressChart').getContext('2d'); | |
this.charts.lineChart = new Chart(lineChartCtx, { | |
type: 'line', | |
data: { | |
labels: dataPoints.map(point => this.formatDate(point.date)), | |
datasets: [{ | |
label: 'Repos Migrated', | |
data: dataPoints.map(point => point.value), | |
borderColor: '#7875FF', | |
backgroundColor: 'rgba(255, 127, 65, 1)', | |
tension: 0.4 | |
}] | |
}, | |
options: { | |
responsive: true, | |
maintainAspectRatio: false, | |
animation: { duration: 2000 }, | |
scales: { | |
y: { | |
min: 0, | |
ticks: { stepSize: 100000 } | |
}, | |
x: { | |
ticks: { | |
maxTicksLimit: 20 | |
} | |
}, | |
}, | |
plugins: { | |
tooltip: { | |
callbacks: { | |
label: function(context) { | |
return `Repos Migrated: ${context.parsed.y.toLocaleString()}`; | |
} | |
} | |
} | |
} | |
} | |
}); | |
} | |
createDonutChart(fileData) { | |
const lfs_file_count = fileData[fileData.length - 1].lfs_files; | |
const xet_file_count = fileData[fileData.length - 1].xet_files; | |
const donutChartCtx = document.getElementById('largeFilesChart').getContext('2d'); | |
this.charts.donutChart = new Chart(donutChartCtx, { | |
type: 'doughnut', | |
data: { | |
labels: [ | |
'LFS Files', | |
'Xet Files', | |
], | |
datasets: [{ | |
label: 'My First Dataset', | |
data: [lfs_file_count, xet_file_count], | |
backgroundColor: [ | |
'oklch(0.577 0.245 27.325 / 75.56%)', | |
'oklch(0.6361 0.1994 280.07 / 71.37%)', | |
], | |
hoverOffset: 4 | |
}] | |
}, | |
options: { | |
responsive: true, | |
maintainAspectRatio: false, | |
animation: { duration: 2000 }, | |
plugins: { | |
legend: { | |
position: 'top', | |
}, | |
} | |
} | |
}); | |
} | |
init(repoData, fileData) { | |
this.createProgressChart(repoData); | |
this.createDonutChart(fileData); | |
} | |
} | |