chart enhancements

This commit is contained in:
Jan Prochazka
2021-11-11 11:01:42 +01:00
parent e0aeae5220
commit fc984da9d3
4 changed files with 81 additions and 29 deletions

View File

@@ -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;

View File

@@ -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>

View File

@@ -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}

View File

@@ -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;
}