This commit is contained in:
Jan Prochazka
2020-12-06 11:01:58 +01:00
parent 3bb22ddc36
commit fd2747d166
3 changed files with 45 additions and 25 deletions

View File

@@ -71,7 +71,7 @@ export default function ChartEditor({ data, config, setConfig, sql, conid, datab
if (config.labelColumn && sql && conid && database) { if (config.labelColumn && sql && conid && database) {
handleLoadData(); handleLoadData();
} }
}, [config, sql, conid, database]); }, [config, sql, conid, database, availableColumnNames]);
return ( return (
<FormProviderCore values={config} setValues={setConfig} template={FormFieldTemplateTiny}> <FormProviderCore values={config} setValues={setConfig} template={FormFieldTemplateTiny}>
@@ -90,12 +90,17 @@ export default function ChartEditor({ data, config, setConfig, sql, conid, datab
<option value="scatter">Scatter</option> */} <option value="scatter">Scatter</option> */}
</FormSelectField> </FormSelectField>
<FormSelectField label="Color set" name="colorSeed"> <FormSelectField label="Color set" name="colorSeed">
<option value="1">1</option> <option value="a">1</option>
<option value="2">2</option> <option value="2">2</option>
<option value="3">3</option> <option value="3">3</option>
<option value="4">4</option> <option value="4">4</option>
<option value="5">5</option> <option value="5">5</option>
</FormSelectField> </FormSelectField>
<FormSelectField label="Truncate from" name="truncateFrom">
<option value="begin">Begin</option>
<option value="end">End (most recent data for datetime)</option>
</FormSelectField>
<FormTextField label="Truncate limit" name="truncateLimit" />
</ManagerInnerContainer> </ManagerInnerContainer>
</WidgetColumnBarItem> </WidgetColumnBarItem>
<WidgetColumnBarItem title="Data" name="data"> <WidgetColumnBarItem title="Data" name="data">

View File

@@ -1,9 +1,11 @@
import React from 'react'; import React from 'react';
import _ from 'lodash';
import Chart from 'react-chartjs-2'; import Chart from 'react-chartjs-2';
import randomcolor from 'randomcolor'; import randomcolor from 'randomcolor';
import styled from 'styled-components'; 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';
const ChartWrapper = styled.div` const ChartWrapper = styled.div`
flex: 1; flex: 1;
@@ -13,18 +15,29 @@ const ChartWrapper = styled.div`
function createChartData(freeData, labelColumn, dataColumns, colorSeed, chartType) { function createChartData(freeData, labelColumn, dataColumns, colorSeed, chartType) {
if (!freeData || !labelColumn || !dataColumns || dataColumns.length == 0) return {}; if (!freeData || !labelColumn || !dataColumns || dataColumns.length == 0) return {};
const colors = randomcolor({ const colors = randomcolor({
count: freeData.rows.length, count: _.max([freeData.rows.length, dataColumns.length, 1]),
seed: colorSeed, seed: colorSeed,
}); });
let backgroundColor = null;
let borderColor = null;
const res = { const res = {
labels: freeData.rows.map((x) => x[labelColumn]), labels: freeData.rows.map((x) => x[labelColumn]),
datasets: dataColumns.map((dataColumn) => ({ datasets: dataColumns.map((dataColumn, columnIndex) => {
label: dataColumn, if (chartType == 'line' || chartType == 'bar') {
data: freeData.rows.map((row) => row[dataColumn]), backgroundColor = colors[columnIndex];
backgroundColor: chartType != 'line' ? colors : null, borderColor = saturateByTenth(backgroundColor);
borderColor: chartType == 'line' ? colors : null, } else {
borderWidth: 1, backgroundColor = colors;
})), }
return {
label: dataColumn,
data: freeData.rows.map((row) => row[dataColumn]),
backgroundColor,
borderColor,
borderWidth: 1,
};
}),
}; };
return res; return res;

View File

@@ -1,6 +1,7 @@
import { dumpSqlSelect, Select } from 'dbgate-sqltree'; import { dumpSqlSelect, Select } from 'dbgate-sqltree';
import { EngineDriver } from 'dbgate-types'; import { EngineDriver } from 'dbgate-types';
import axios from '../utility/axios'; import axios from '../utility/axios';
import _ from 'lodash';
import { extractDataColumns } from './DataChart'; import { extractDataColumns } from './DataChart';
export async function loadChartStructure(driver: EngineDriver, conid, database, sql) { export async function loadChartStructure(driver: EngineDriver, conid, database, sql) {
@@ -22,24 +23,11 @@ export async function loadChartStructure(driver: EngineDriver, conid, database,
export async function loadChartData(driver: EngineDriver, conid, database, sql, config) { export async function loadChartData(driver: EngineDriver, conid, database, sql, config) {
const dataColumns = extractDataColumns(config); const dataColumns = extractDataColumns(config);
const { labelColumn } = config; const { labelColumn, truncateFrom, truncateLimit } = config;
if (!labelColumn || !dataColumns || dataColumns.length == 0) return null; if (!labelColumn || !dataColumns || dataColumns.length == 0) return null;
const select: Select = { const select: Select = {
commandType: 'select', commandType: 'select',
// columns:[
// {
// exprType:'call',
// func:'SUM',
// args: [
// {
// exprType: 'column',
// columnName,
// source: { alias: 'subq' },
// }
// ]
// }
// ],
columns: [ columns: [
{ {
@@ -62,7 +50,7 @@ export async function loadChartData(driver: EngineDriver, conid, database, sql,
alias: columnName, alias: columnName,
})), })),
], ],
topRecords: 500, topRecords: truncateLimit || 100,
from: { from: {
subQueryString: sql, subQueryString: sql,
alias: 'subq', alias: 'subq',
@@ -74,10 +62,24 @@ export async function loadChartData(driver: EngineDriver, conid, database, sql,
columnName: labelColumn, columnName: labelColumn,
}, },
], ],
orderBy: [
{
exprType: 'column',
source: { alias: 'subq' },
columnName: labelColumn,
direction: truncateFrom == 'end' ? 'DESC' : 'ASC',
},
],
}; };
const dmp = driver.createDumper(); const dmp = driver.createDumper();
dumpSqlSelect(dmp, select); dumpSqlSelect(dmp, select);
const resp = await axios.post('database-connections/query-data', { conid, database, sql: dmp.s }); const resp = await axios.post('database-connections/query-data', { conid, database, sql: dmp.s });
if (truncateFrom == 'end' && resp.data.rows) {
return {
...resp.data,
rows: _.reverse([...resp.data.rows]),
};
}
return resp.data; return resp.data;
} }