diff --git a/package-lock.json b/package-lock.json index ded096d..b5a9b73 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@types/chart.js": "^2.9.37", "chart.js": "^4.1.0", + "chroma-js": "^2.4.2", "html-webpack-plugin": "^5.5.0", "react-dev-utils": "^12.0.1", "webpack-manifest-plugin": "^5.0.0", @@ -3328,6 +3329,11 @@ "node": ">= 6" } }, + "node_modules/chroma-js": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", + "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==" + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", @@ -13442,6 +13448,11 @@ } } }, + "chroma-js": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chroma-js/-/chroma-js-2.4.2.tgz", + "integrity": "sha512-U9eDw6+wt7V8z5NncY2jJfZa+hUH8XEj8FQHgFJTrUFnJfXYf4Ml4adI2vXZOjqRDpFWtYVWypDfZwnJ+HIR4A==" + }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", diff --git a/package.json b/package.json index faf309a..c5e1106 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "dependencies": { "@types/chart.js": "^2.9.37", "chart.js": "^4.1.0", + "chroma-js": "^2.4.2", "html-webpack-plugin": "^5.5.0", "react-dev-utils": "^12.0.1", "webpack-manifest-plugin": "^5.0.0", diff --git a/src/generateCharts.ts b/src/generateCharts.ts index 85587df..d5397bc 100644 --- a/src/generateCharts.ts +++ b/src/generateCharts.ts @@ -1,5 +1,6 @@ import { transactions } from "./bankData"; import Chart from 'chart.js/auto'; +import * as chroma from 'chroma-js'; export default function generateCharts(): void { // const filter: Filter = { year: 2022, category: 'Eating out', excludeIncome: true}; @@ -40,6 +41,13 @@ function getChartData(transactions: BankTransaction[], filters: { year?: number, datasets: [] }; } + + // Generate a color scale using the chroma-js library, with the number of colors equal to the number of categories + const categories = new Set(); + for (const transaction of transactions) { + categories.add(transaction.category); + } + const colorScale = chroma.scale('Spectral').mode('hsl').colors(categories.size); // Filter the transactions based on the specified filters const filteredTransactions = transactions.filter(transaction => { @@ -90,40 +98,32 @@ function getChartData(transactions: BankTransaction[], filters: { year?: number, }; // Add a dataset for each category - const categories: { [key: string]: string } = {}; - for (const year in groupedTransactions) { - for (let index = 0; index < groupedTransactions[year].length; index++) { - const transaction = groupedTransactions[year][index]; - if (!categories[transaction.category]) { - categories[transaction.category] = getRandomColor(); - chartData.datasets.push({ - label: transaction.category, - data: [], - backgroundColor: categories[transaction.category] - }); - } - } - console.log('here'); - - // Populate the chart data with the transaction amounts - for (const year in groupedTransactions) { - chartData.labels.push(year); - for (let i = 0; i < chartData.datasets.length; i++) { - chartData.datasets[i].data.push(0); - } - for (const transaction of groupedTransactions[year]) { - for (let i = 0; i < chartData.datasets.length; i++) { - if (chartData.datasets[i].label === transaction.category) { - chartData.datasets[i].data[chartData.labels.length - 1] += transaction.amount; - break; - } + let i = 0; + categories.forEach((category: string) => { + chartData.datasets.push({ + label: category, + data: [], + backgroundColor: colorScale[i % colorScale.length], // Use a color from the color scale, + borderColor: 'black', + borderWidth: 2 + }); + i++; + }); + + // Populate the chart data with the transaction amounts + for (const key of Object.keys(groupedTransactions)) { + chartData.labels.push(key); + const transactions = groupedTransactions[key]; + for (let i = 0; i < chartData.datasets.length; i++) { + chartData.datasets[i].data.push(0); + for (const transaction of transactions) { + if (transaction.category === chartData.datasets[i].label) { + chartData.datasets[i].data[chartData.labels.length - 1] += transaction.amount; } } } - - - - return chartData; } + + return chartData; } diff --git a/src/types/chartData.ts b/src/types/chartData.ts index 493aa2e..49f581b 100644 --- a/src/types/chartData.ts +++ b/src/types/chartData.ts @@ -3,6 +3,8 @@ type ChartData = { datasets: { label: string; backgroundColor: string; + borderColor: string; + borderWidth: number; data: number[]; }[]; }; \ No newline at end of file