diff --git a/packages/web/src/charts/ChartEditor.js b/packages/web/src/charts/ChartEditor.js index 06ff8f878..2378adece 100644 --- a/packages/web/src/charts/ChartEditor.js +++ b/packages/web/src/charts/ChartEditor.js @@ -1,5 +1,6 @@ import React from 'react'; import Chart from 'react-chartjs-2'; +import _ from 'lodash'; import styled from 'styled-components'; import useTheme from '../theme/useTheme'; import useDimensions from '../utility/useDimensions'; @@ -14,6 +15,7 @@ import { getConnectionInfo } from '../utility/metadataLoaders'; import { findEngineDriver } from 'dbgate-tools'; import { FormFieldTemplateTiny } from '../utility/formStyle'; import { ManagerInnerContainer } from '../datagrid/ManagerStyles'; +import { presetPrimaryColors } from '@ant-design/colors'; const LeftContainer = styled.div` background-color: ${(props) => props.theme.manager_background}; @@ -110,7 +112,20 @@ export default function ChartEditor({ data, config, setConfig, sql, conid, datab )} {availableColumnNames.map((col) => ( - + + + {config[`dataColumn_${col}`] && ( + + + + {_.keys(presetPrimaryColors).map((color) => ( + + ))} + + )} + ))} diff --git a/packages/web/src/charts/DataChart.js b/packages/web/src/charts/DataChart.js index 6a8e65e48..a02ad0686 100644 --- a/packages/web/src/charts/DataChart.js +++ b/packages/web/src/charts/DataChart.js @@ -6,13 +6,14 @@ import styled from 'styled-components'; import useDimensions from '../utility/useDimensions'; import { useForm } from '../utility/FormProvider'; import { saturateByTenth } from '../theme/colorUtil'; +import useTheme from '../theme/useTheme'; const ChartWrapper = styled.div` flex: 1; overflow: hidden; `; -function createChartData(freeData, labelColumn, dataColumns, colorSeed, chartType) { +function createChartData(freeData, labelColumn, dataColumns, colorSeed, chartType, dataColumnColors, theme) { if (!freeData || !labelColumn || !dataColumns || dataColumns.length == 0) return {}; const colors = randomcolor({ count: _.max([freeData.rows.length, dataColumns.length, 1]), @@ -24,8 +25,14 @@ function createChartData(freeData, labelColumn, dataColumns, colorSeed, chartTyp labels: freeData.rows.map((x) => x[labelColumn]), datasets: dataColumns.map((dataColumn, columnIndex) => { if (chartType == 'line' || chartType == 'bar') { - backgroundColor = colors[columnIndex]; - borderColor = saturateByTenth(backgroundColor); + const color = dataColumnColors[dataColumn]; + if (color) { + backgroundColor = theme.main_palettes[color][4]; + borderColor = theme.main_palettes[color][7]; + } else { + backgroundColor = colors[columnIndex]; + borderColor = saturateByTenth(backgroundColor); + } } else { backgroundColor = colors; } @@ -52,13 +59,23 @@ export function extractDataColumns(values) { } return dataColumns; } +export function extractDataColumnColors(values, dataColumns) { + const res = {}; + for (const column of dataColumns) { + const color = values[`dataColumnColor_${column}`]; + if (color) res[column] = color; + } + return res; +} export default function DataChart({ data }) { const [containerRef, { height: containerHeight, width: containerWidth }] = useDimensions(); const { values } = useForm(); + const theme = useTheme(); const { labelColumn } = values; const dataColumns = extractDataColumns(values); + const dataColumnColors = extractDataColumnColors(values, dataColumns); return ( @@ -66,7 +83,15 @@ export default function DataChart({ data }) { key={`${values.chartType}|${containerWidth}|${containerHeight}`} width={containerWidth} height={containerHeight} - data={createChartData(data, labelColumn, dataColumns, values.colorSeed || '5', values.chartType)} + data={createChartData( + data, + labelColumn, + dataColumns, + values.colorSeed || '5', + values.chartType, + dataColumnColors, + theme + )} type={values.chartType} />