diff --git a/packages/web/package.json b/packages/web/package.json index c94e1a27c..fe46dc823 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -19,6 +19,7 @@ "eslint-plugin-react": "^7.17.0", "json-stable-stringify": "^1.0.1", "localforage": "^1.9.0", + "randomcolor": "^0.6.2", "react": "^16.12.0", "react-ace": "^8.0.0", "react-chartjs-2": "^2.11.1", diff --git a/packages/web/src/charts/ChartEditor.js b/packages/web/src/charts/ChartEditor.js index 38b288203..d84459b06 100644 --- a/packages/web/src/charts/ChartEditor.js +++ b/packages/web/src/charts/ChartEditor.js @@ -5,7 +5,7 @@ import useTheme from '../theme/useTheme'; import useDimensions from '../utility/useDimensions'; import { HorizontalSplitter } from '../widgets/Splitter'; import WidgetColumnBar, { WidgetColumnBarItem } from '../widgets/WidgetColumnBar'; -import { FormCheckboxField, FormSelectField } from '../utility/forms'; +import { FormCheckboxField, FormSelectField, FormTextField } from '../utility/forms'; import DataChart from './DataChart'; import { FormProviderCore } from '../utility/FormProvider'; @@ -29,7 +29,13 @@ export default function ChartEditor({ data, config, setConfig }) { + {/* */} + + + {/* + */} + diff --git a/packages/web/src/charts/DataChart.js b/packages/web/src/charts/DataChart.js index d4f633363..8a1cad05c 100644 --- a/packages/web/src/charts/DataChart.js +++ b/packages/web/src/charts/DataChart.js @@ -1,6 +1,7 @@ import React from 'react'; -import _ from 'lodash' +import _ from 'lodash'; import Chart from 'react-chartjs-2'; +import randomcolor from 'randomcolor'; import styled from 'styled-components'; import useTheme from '../theme/useTheme'; import useDimensions from '../utility/useDimensions'; @@ -8,64 +9,74 @@ import { HorizontalSplitter } from '../widgets/Splitter'; import WidgetColumnBar, { WidgetColumnBarItem } from '../widgets/WidgetColumnBar'; import { FormSelectField } from '../utility/forms'; import { useForm } from '../utility/FormProvider'; +import { saturateByTenth } from '../theme/colorUtil'; const ChartWrapper = styled.div` flex: 1; overflow: hidden; `; -const chartData = { - labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'], - datasets: [ - { - label: '# of Votes', - data: [12, 19, 3, 5, 2, 3], - backgroundColor: [ - 'rgba(255, 99, 132, 0.2)', - 'rgba(54, 162, 235, 0.2)', - 'rgba(255, 206, 86, 0.2)', - 'rgba(75, 192, 192, 0.2)', - 'rgba(153, 102, 255, 0.2)', - 'rgba(255, 159, 64, 0.2)', - ], - borderColor: [ - 'rgba(255, 99, 132, 1)', - 'rgba(54, 162, 235, 1)', - 'rgba(255, 206, 86, 1)', - 'rgba(75, 192, 192, 1)', - 'rgba(153, 102, 255, 1)', - 'rgba(255, 159, 64, 1)', - ], - borderWidth: 1, - }, - ], -}; +// const chartData = { +// labels: ['Red', 'Blue', 'Yellow', 'Green', 'Purple', 'Orange'], +// datasets: [ +// { +// label: '# of Votes', +// data: [12, 19, 3, 5, 2, 3], +// backgroundColor: [ +// 'rgba(255, 99, 132, 0.2)', +// 'rgba(54, 162, 235, 0.2)', +// 'rgba(255, 206, 86, 0.2)', +// 'rgba(75, 192, 192, 0.2)', +// 'rgba(153, 102, 255, 0.2)', +// 'rgba(255, 159, 64, 0.2)', +// ], +// borderColor: [ +// 'rgba(255, 99, 132, 1)', +// 'rgba(54, 162, 235, 1)', +// 'rgba(255, 206, 86, 1)', +// 'rgba(75, 192, 192, 1)', +// 'rgba(153, 102, 255, 1)', +// 'rgba(255, 159, 64, 1)', +// ], +// borderWidth: 1, +// }, +// ], +// }; -function createChartData(freeData, labelColumn, dataColumns) { +function createChartData(freeData, labelColumn, dataColumns, colorSeed, chartType) { if (!freeData || !labelColumn || !dataColumns || dataColumns.length == 0) return {}; const labels = _.uniq(freeData.rows.map((x) => x[labelColumn])); + const colors = randomcolor({ + count: labels.length, + seed: colorSeed, + }); const res = { labels: freeData.rows.map((x) => x[labelColumn]), datasets: dataColumns.map((dataColumn) => ({ label: dataColumn, // data: [12, 19, 3, 5, 2, 3], - data: freeData.rows.map((x) => x[dataColumn]), - backgroundColor: [ - 'rgba(255, 99, 132, 0.2)', - 'rgba(54, 162, 235, 0.2)', - 'rgba(255, 206, 86, 0.2)', - 'rgba(75, 192, 192, 0.2)', - 'rgba(153, 102, 255, 0.2)', - 'rgba(255, 159, 64, 0.2)', - ], - borderColor: [ - 'rgba(255, 99, 132, 1)', - 'rgba(54, 162, 235, 1)', - 'rgba(255, 206, 86, 1)', - 'rgba(75, 192, 192, 1)', - 'rgba(153, 102, 255, 1)', - 'rgba(255, 159, 64, 1)', - ], + data: labels.map((label) => + _.sum(freeData.rows.filter((row) => row[labelColumn] == label).map((row) => row[dataColumn])) + ), + backgroundColor: chartType != 'line' ? colors : null, + borderColor: chartType == 'line' ? colors : null, + // borderColor: colors, // .map(saturateByTenth), + // backgroundColor: [ + // 'rgba(255, 99, 132, 0.2)', + // 'rgba(54, 162, 235, 0.2)', + // 'rgba(255, 206, 86, 0.2)', + // 'rgba(75, 192, 192, 0.2)', + // 'rgba(153, 102, 255, 0.2)', + // 'rgba(255, 159, 64, 0.2)', + // ], + // borderColor: [ + // 'rgba(255, 99, 132, 1)', + // 'rgba(54, 162, 235, 1)', + // 'rgba(255, 206, 86, 1)', + // 'rgba(75, 192, 192, 1)', + // 'rgba(153, 102, 255, 1)', + // 'rgba(255, 159, 64, 1)', + // ], borderWidth: 1, })), }; @@ -91,7 +102,7 @@ export default function DataChart({ data }) { key={`${values.chartType}|${containerWidth}|${containerHeight}`} width={containerWidth} height={containerHeight} - data={createChartData(data, labelColumn, dataColumns)} + data={createChartData(data, labelColumn, dataColumns, values.colorSeed || 1, values.chartType)} type={values.chartType} /> diff --git a/yarn.lock b/yarn.lock index abc0be5a0..f92ebee14 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9618,6 +9618,11 @@ randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: dependencies: safe-buffer "^5.1.0" +randomcolor@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/randomcolor/-/randomcolor-0.6.2.tgz#7a57362ae1a1278439aeed2c15e5deb8ea33f56d" + integrity sha512-Mn6TbyYpFgwFuQ8KJKqf3bqqY9O1y37/0jgSK/61PUxV4QfIMv0+K2ioq8DfOjkBslcjwSzRfIDEXfzA9aCx7A== + randomfill@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz#c92196fc86ab42be983f1bf31778224931d61458"