diff --git a/assets/js/chart.js b/assets/js/chart.js index 85a850f983f..2c592db5c06 100644 --- a/assets/js/chart.js +++ b/assets/js/chart.js @@ -4,6 +4,20 @@ import * as echarts from 'echarts'; const defaultHeightVH = 50; +const colors = [ + '#c23531', + '#2f4554', + '#61a0a8', + '#d48265', + '#91c7ae', + '#749f83', + '#ca8622', + '#bda29a', + '#6e7074', + '#546570', + '#c4ccd3' + ]; + async function loadCSVFromURL(url) { try { const response = await fetch(url); @@ -14,14 +28,33 @@ async function loadCSVFromURL(url) { for (let i = 1; i < lines.length; i++) { const row = lines[i].split(','); - data.push(row); + const obj = {}; + headers.forEach((header, j) => { + obj[header] = row[j]; + }); + if (row[1] !== undefined) { + data.push(obj); + } else { + //console.warn('Blog is empty: ', row); + } } + const groupedData = {}; + data.forEach(row => { + const date = new Date(row['Date']); + const month = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}`; + if (!groupedData[month]) { + groupedData[month] = {}; + } + const category = row['Blog']; + groupedData[month][category] = (groupedData[month][category] || 0) + 1; + }); + //return data[0].map((_, i) => data.map(row => row[i])); - return data; + return groupedData; } catch (error) { console.error('Error loading CSV from URL:', error); - return []; // Return an empty array on error + return []; } } @@ -39,38 +72,63 @@ function chart(csvFile, element) { if (height === 0) { height = Math.round(window.innerHeight / 100) * defaultHeightVH; } - var myChart = echarts.init(container, null, { renderer: "svg", width: width, height: height}); + + const xAxisData = Object.keys(data); + const seriesData = []; + let colorIndex = 0; + const blogs = new Set(Object.keys(data).map((key) => { return Object.keys(data[key])[0] })); + //WTF for in won't work with Sets and only itereates over array index, JS is stupid as shit + for (const blog of [...blogs]) { + seriesData.push({ + name: blog, + type: 'bar', + stack: 'total', + data: xAxisData.map(month => data[month][blog] || 0), + itemStyle: { + color: colors[colorIndex % colors.length] + }, + emphasis: { + focus: 'series' + } + }); + colorIndex++; + } var option = { - dataset:{ - source:data, - dimensions: ['date', 'blog', 'title'], + color: colors, + legend: { + type: 'scroll', + orient: 'horizontal', + right: 10, + left: 10, + top: 10, + data: seriesData.map(series => series.name) }, - series: [ - { - name: 'blog', - type: 'line', - encode: { - x: 'timestamp', - y: 'blog' - } - } - ], - title: { + tooltip: { + trigger: 'item', + formatter: '{a}
{b}: {c}' }, - tooltip: {}, - /* - legend: { - data: ['sales'] + grid: { + left: 0, + right: 0, + top: 0 }, - */ xAxis: { + type: 'category', + data: xAxisData, + label: "Date" }, - yAxis: {}, - + yAxis: { + type: 'value', + label: "Posts", + scale: true + }, + series: seriesData, + dataZoom: [] }; - myChart.setOption(option); + var chart = echarts.init(container, null, { renderer: "svg", width: width, height: height}); + chart.setOption(option); }); } diff --git a/assets/scss/chart.scss b/assets/scss/chart.scss index 7734d98b525..7016890d0e9 100644 --- a/assets/scss/chart.scss +++ b/assets/scss/chart.scss @@ -1,4 +1,5 @@ .chart { width: 100%; min-height: 50vh; + margin: 1rem 0; } diff --git a/package.json b/package.json index a8883693661..e7004900cec 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,9 @@ }, "dependencies": { "@popperjs/core": "^2.11.8", - "billboard.js": "^3.14.2", "bootstrap": "^5.3.2", "echarts": "^5.6.0", + "echarts-stat": "^1.2.0", "fuse.js": "^7.0.0", "jquery": "^3.7.1", "normalize.css": "^8.0.1",