mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-21 04:46:02 +00:00
chart enhancements
This commit is contained in:
@@ -16,10 +16,13 @@
|
|||||||
chart = new Chart(domChart, {
|
chart = new Chart(domChart, {
|
||||||
type,
|
type,
|
||||||
data,
|
data,
|
||||||
options,
|
options: {
|
||||||
|
...options,
|
||||||
plugins,
|
plugins,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
afterUpdate(() => {
|
afterUpdate(() => {
|
||||||
if (!chart) return;
|
if (!chart) return;
|
||||||
chart.data = data;
|
chart.data = data;
|
||||||
|
|||||||
@@ -101,7 +101,7 @@
|
|||||||
{ value: 'polarArea', label: 'Polar area' },
|
{ value: 'polarArea', label: 'Polar area' },
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
<FormTextField label="Color set" name="colorSeed" />
|
<FormTextField label="Chart title" name="chartTitle" />
|
||||||
<FormSelectField
|
<FormSelectField
|
||||||
label="Truncate from"
|
label="Truncate from"
|
||||||
name="truncateFrom"
|
name="truncateFrom"
|
||||||
@@ -113,6 +113,10 @@
|
|||||||
/>
|
/>
|
||||||
<FormTextField label="Truncate limit" name="truncateLimit" />
|
<FormTextField label="Truncate limit" name="truncateLimit" />
|
||||||
<FormCheckboxField label="Show relative values" name="showRelativeValues" />
|
<FormCheckboxField label="Show relative values" name="showRelativeValues" />
|
||||||
|
{#if $configStore.chartType == 'line'}
|
||||||
|
<FormCheckboxField label="Fill" name="fillLineChart" defaultValue={true} />
|
||||||
|
{/if}
|
||||||
|
<FormTextField label="Color set" name="colorSeed" />
|
||||||
</ManagerInnerContainer>
|
</ManagerInnerContainer>
|
||||||
</WidgetColumnBarItem>
|
</WidgetColumnBarItem>
|
||||||
<WidgetColumnBarItem title="Data" name="data">
|
<WidgetColumnBarItem title="Data" name="data">
|
||||||
@@ -138,6 +142,7 @@
|
|||||||
..._.keys(presetPrimaryColors).map(color => ({ value: color, label: _.startCase(color) })),
|
..._.keys(presetPrimaryColors).map(color => ({ value: color, label: _.startCase(color) })),
|
||||||
]}
|
]}
|
||||||
/>
|
/>
|
||||||
|
<FormTextField label="Label" name={`dataColumnLabel_${col}`} />
|
||||||
{/if}
|
{/if}
|
||||||
{/each}
|
{/each}
|
||||||
</ManagerInnerContainer>
|
</ManagerInnerContainer>
|
||||||
|
|||||||
@@ -18,9 +18,11 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getOptions(timeAxis, chartType) {
|
function getOptions(timeAxis, chartType) {
|
||||||
|
const res = {
|
||||||
|
scales: {},
|
||||||
|
};
|
||||||
if (timeAxis && chartType === 'line') {
|
if (timeAxis && chartType === 'line') {
|
||||||
return {
|
res.scales = {
|
||||||
scales: {
|
|
||||||
xAxes: [
|
xAxes: [
|
||||||
{
|
{
|
||||||
type: 'time',
|
type: 'time',
|
||||||
@@ -42,13 +44,34 @@
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
return {};
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createChartData(freeData, labelColumn, dataColumns, colorSeed, chartType, dataColumnColors, themeDef) {
|
function getPlugins(chartTitle) {
|
||||||
|
const res = {};
|
||||||
|
if (chartTitle) {
|
||||||
|
res['title'] = {
|
||||||
|
display: true,
|
||||||
|
text: chartTitle,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createChartData(
|
||||||
|
freeData,
|
||||||
|
labelColumn,
|
||||||
|
dataColumns,
|
||||||
|
colorSeed,
|
||||||
|
chartType,
|
||||||
|
chartTitle,
|
||||||
|
fillLineChart,
|
||||||
|
dataColumnColors,
|
||||||
|
dataColumnLabels,
|
||||||
|
themeDef
|
||||||
|
) {
|
||||||
if (!freeData || !labelColumn || !dataColumns || !freeData.rows || dataColumns.length == 0) return null;
|
if (!freeData || !labelColumn || !dataColumns || !freeData.rows || dataColumns.length == 0) return null;
|
||||||
const palettes = themeDef?.themeType == 'dark' ? presetDarkPalettes : presetPalettes;
|
const palettes = themeDef?.themeType == 'dark' ? presetDarkPalettes : presetPalettes;
|
||||||
const colors = randomcolor({
|
const colors = randomcolor({
|
||||||
@@ -63,6 +86,7 @@
|
|||||||
const res = {
|
const res = {
|
||||||
labels,
|
labels,
|
||||||
datasets: dataColumns.map((dataColumn, columnIndex) => {
|
datasets: dataColumns.map((dataColumn, columnIndex) => {
|
||||||
|
const label = dataColumnLabels[dataColumn];
|
||||||
if (chartType == 'line' || chartType == 'bar') {
|
if (chartType == 'line' || chartType == 'bar') {
|
||||||
const color = dataColumnColors[dataColumn];
|
const color = dataColumnColors[dataColumn];
|
||||||
if (color) {
|
if (color) {
|
||||||
@@ -77,17 +101,23 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
label: dataColumn,
|
label: label || dataColumn,
|
||||||
data: freeData.rows.map(row => row[dataColumn]),
|
data: freeData.rows.map(row => row[dataColumn]),
|
||||||
backgroundColor,
|
backgroundColor,
|
||||||
borderColor,
|
borderColor,
|
||||||
borderWidth: 1,
|
borderWidth: 1,
|
||||||
|
fill: fillLineChart == false ? false : true,
|
||||||
};
|
};
|
||||||
}),
|
}),
|
||||||
};
|
};
|
||||||
|
|
||||||
const options = getOptions(timeAxis, chartType);
|
const options = getOptions(timeAxis, chartType);
|
||||||
return [res, options];
|
const plugins = getPlugins(chartTitle);
|
||||||
|
|
||||||
|
// console.log('RES', res);
|
||||||
|
// console.log('OPTIONS', options);
|
||||||
|
|
||||||
|
return [res, options, plugins];
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -98,7 +128,7 @@
|
|||||||
import ChartCore from './ChartCore.svelte';
|
import ChartCore from './ChartCore.svelte';
|
||||||
import { getFormContext } from '../forms/FormProviderCore.svelte';
|
import { getFormContext } from '../forms/FormProviderCore.svelte';
|
||||||
import { generate, presetPalettes, presetDarkPalettes, presetPrimaryColors } from '@ant-design/colors';
|
import { generate, presetPalettes, presetDarkPalettes, presetPrimaryColors } from '@ant-design/colors';
|
||||||
import { extractDataColumnColors, extractDataColumns } from './chartDataLoader';
|
import { extractDataColumnColors, extractDataColumnLabels, extractDataColumns } from './chartDataLoader';
|
||||||
import { currentThemeDefinition } from '../stores';
|
import { currentThemeDefinition } from '../stores';
|
||||||
|
|
||||||
export let data;
|
export let data;
|
||||||
@@ -111,6 +141,7 @@
|
|||||||
|
|
||||||
$: dataColumns = extractDataColumns($values);
|
$: dataColumns = extractDataColumns($values);
|
||||||
$: dataColumnColors = extractDataColumnColors($values, dataColumns);
|
$: dataColumnColors = extractDataColumnColors($values, dataColumns);
|
||||||
|
$: dataColumnLabels = extractDataColumnLabels($values, dataColumns);
|
||||||
|
|
||||||
$: chartData = createChartData(
|
$: chartData = createChartData(
|
||||||
data,
|
data,
|
||||||
@@ -118,7 +149,10 @@
|
|||||||
dataColumns,
|
dataColumns,
|
||||||
$values.colorSeed || '5',
|
$values.colorSeed || '5',
|
||||||
$values.chartType,
|
$values.chartType,
|
||||||
|
$values.chartTitle,
|
||||||
|
$values.fillLineChart,
|
||||||
dataColumnColors,
|
dataColumnColors,
|
||||||
|
dataColumnLabels,
|
||||||
$currentThemeDefinition
|
$currentThemeDefinition
|
||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
@@ -132,6 +166,7 @@
|
|||||||
data={chartData[0]}
|
data={chartData[0]}
|
||||||
type={$values.chartType}
|
type={$values.chartType}
|
||||||
options={chartData[1]}
|
options={chartData[1]}
|
||||||
|
plugins={chartData[2]}
|
||||||
{menu}
|
{menu}
|
||||||
/>
|
/>
|
||||||
{/key}
|
{/key}
|
||||||
|
|||||||
@@ -120,3 +120,12 @@ export function extractDataColumnColors(values, dataColumns) {
|
|||||||
}
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function extractDataColumnLabels(values, dataColumns) {
|
||||||
|
const res = {};
|
||||||
|
for (const column of dataColumns) {
|
||||||
|
const label = values[`dataColumnLabel_${column}`];
|
||||||
|
if (label) res[column] = label;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user