mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-05-02 05:33:59 +00:00
chart colors
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
import Chart from 'react-chartjs-2';
|
import Chart from 'react-chartjs-2';
|
||||||
|
import _ from 'lodash';
|
||||||
import styled from 'styled-components';
|
import styled from 'styled-components';
|
||||||
import useTheme from '../theme/useTheme';
|
import useTheme from '../theme/useTheme';
|
||||||
import useDimensions from '../utility/useDimensions';
|
import useDimensions from '../utility/useDimensions';
|
||||||
@@ -14,6 +15,7 @@ import { getConnectionInfo } from '../utility/metadataLoaders';
|
|||||||
import { findEngineDriver } from 'dbgate-tools';
|
import { findEngineDriver } from 'dbgate-tools';
|
||||||
import { FormFieldTemplateTiny } from '../utility/formStyle';
|
import { FormFieldTemplateTiny } from '../utility/formStyle';
|
||||||
import { ManagerInnerContainer } from '../datagrid/ManagerStyles';
|
import { ManagerInnerContainer } from '../datagrid/ManagerStyles';
|
||||||
|
import { presetPrimaryColors } from '@ant-design/colors';
|
||||||
|
|
||||||
const LeftContainer = styled.div`
|
const LeftContainer = styled.div`
|
||||||
background-color: ${(props) => props.theme.manager_background};
|
background-color: ${(props) => props.theme.manager_background};
|
||||||
@@ -110,7 +112,20 @@ export default function ChartEditor({ data, config, setConfig, sql, conid, datab
|
|||||||
</FormSelectField>
|
</FormSelectField>
|
||||||
)}
|
)}
|
||||||
{availableColumnNames.map((col) => (
|
{availableColumnNames.map((col) => (
|
||||||
<FormCheckboxField label={col} name={`dataColumn_${col}`} key={col} />
|
<React.Fragment key={col}>
|
||||||
|
<FormCheckboxField label={col} name={`dataColumn_${col}`} />
|
||||||
|
{config[`dataColumn_${col}`] && (
|
||||||
|
<FormSelectField label="Color" name={`dataColumnColor_${col}`}>
|
||||||
|
<option value="">Random</option>
|
||||||
|
|
||||||
|
{_.keys(presetPrimaryColors).map((color) => (
|
||||||
|
<option value={color} key={color}>
|
||||||
|
{_.startCase(color)}
|
||||||
|
</option>
|
||||||
|
))}
|
||||||
|
</FormSelectField>
|
||||||
|
)}
|
||||||
|
</React.Fragment>
|
||||||
))}
|
))}
|
||||||
</ManagerInnerContainer>
|
</ManagerInnerContainer>
|
||||||
</WidgetColumnBarItem>
|
</WidgetColumnBarItem>
|
||||||
|
|||||||
@@ -6,13 +6,14 @@ import styled from 'styled-components';
|
|||||||
import useDimensions from '../utility/useDimensions';
|
import useDimensions from '../utility/useDimensions';
|
||||||
import { useForm } from '../utility/FormProvider';
|
import { useForm } from '../utility/FormProvider';
|
||||||
import { saturateByTenth } from '../theme/colorUtil';
|
import { saturateByTenth } from '../theme/colorUtil';
|
||||||
|
import useTheme from '../theme/useTheme';
|
||||||
|
|
||||||
const ChartWrapper = styled.div`
|
const ChartWrapper = styled.div`
|
||||||
flex: 1;
|
flex: 1;
|
||||||
overflow: hidden;
|
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 {};
|
if (!freeData || !labelColumn || !dataColumns || dataColumns.length == 0) return {};
|
||||||
const colors = randomcolor({
|
const colors = randomcolor({
|
||||||
count: _.max([freeData.rows.length, dataColumns.length, 1]),
|
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]),
|
labels: freeData.rows.map((x) => x[labelColumn]),
|
||||||
datasets: dataColumns.map((dataColumn, columnIndex) => {
|
datasets: dataColumns.map((dataColumn, columnIndex) => {
|
||||||
if (chartType == 'line' || chartType == 'bar') {
|
if (chartType == 'line' || chartType == 'bar') {
|
||||||
backgroundColor = colors[columnIndex];
|
const color = dataColumnColors[dataColumn];
|
||||||
borderColor = saturateByTenth(backgroundColor);
|
if (color) {
|
||||||
|
backgroundColor = theme.main_palettes[color][4];
|
||||||
|
borderColor = theme.main_palettes[color][7];
|
||||||
|
} else {
|
||||||
|
backgroundColor = colors[columnIndex];
|
||||||
|
borderColor = saturateByTenth(backgroundColor);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
backgroundColor = colors;
|
backgroundColor = colors;
|
||||||
}
|
}
|
||||||
@@ -52,13 +59,23 @@ export function extractDataColumns(values) {
|
|||||||
}
|
}
|
||||||
return dataColumns;
|
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 }) {
|
export default function DataChart({ data }) {
|
||||||
const [containerRef, { height: containerHeight, width: containerWidth }] = useDimensions();
|
const [containerRef, { height: containerHeight, width: containerWidth }] = useDimensions();
|
||||||
const { values } = useForm();
|
const { values } = useForm();
|
||||||
|
const theme = useTheme();
|
||||||
|
|
||||||
const { labelColumn } = values;
|
const { labelColumn } = values;
|
||||||
const dataColumns = extractDataColumns(values);
|
const dataColumns = extractDataColumns(values);
|
||||||
|
const dataColumnColors = extractDataColumnColors(values, dataColumns);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ChartWrapper ref={containerRef}>
|
<ChartWrapper ref={containerRef}>
|
||||||
@@ -66,7 +83,15 @@ export default function DataChart({ data }) {
|
|||||||
key={`${values.chartType}|${containerWidth}|${containerHeight}`}
|
key={`${values.chartType}|${containerWidth}|${containerHeight}`}
|
||||||
width={containerWidth}
|
width={containerWidth}
|
||||||
height={containerHeight}
|
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}
|
type={values.chartType}
|
||||||
/>
|
/>
|
||||||
</ChartWrapper>
|
</ChartWrapper>
|
||||||
|
|||||||
Reference in New Issue
Block a user