From fc984da9d31e404adcbfca134bb9d08b6dc39dc2 Mon Sep 17 00:00:00 2001 From: Jan Prochazka Date: Thu, 11 Nov 2021 11:01:42 +0100 Subject: [PATCH] chart enhancements --- packages/web/src/charts/ChartCore.svelte | 7 +- packages/web/src/charts/ChartEditor.svelte | 7 +- packages/web/src/charts/DataChart.svelte | 87 +++++++++++++++------- packages/web/src/charts/chartDataLoader.ts | 9 +++ 4 files changed, 81 insertions(+), 29 deletions(-) diff --git a/packages/web/src/charts/ChartCore.svelte b/packages/web/src/charts/ChartCore.svelte index 2f904625a..9e2f289bc 100644 --- a/packages/web/src/charts/ChartCore.svelte +++ b/packages/web/src/charts/ChartCore.svelte @@ -16,10 +16,13 @@ chart = new Chart(domChart, { type, data, - options, - plugins, + options: { + ...options, + plugins, + }, }); }); + afterUpdate(() => { if (!chart) return; chart.data = data; diff --git a/packages/web/src/charts/ChartEditor.svelte b/packages/web/src/charts/ChartEditor.svelte index 5a04c3851..da0814336 100644 --- a/packages/web/src/charts/ChartEditor.svelte +++ b/packages/web/src/charts/ChartEditor.svelte @@ -101,7 +101,7 @@ { value: 'polarArea', label: 'Polar area' }, ]} /> - + + {#if $configStore.chartType == 'line'} + + {/if} + @@ -138,6 +142,7 @@ ..._.keys(presetPrimaryColors).map(color => ({ value: color, label: _.startCase(color) })), ]} /> + {/if} {/each} diff --git a/packages/web/src/charts/DataChart.svelte b/packages/web/src/charts/DataChart.svelte index b503d6fa6..fa2578352 100644 --- a/packages/web/src/charts/DataChart.svelte +++ b/packages/web/src/charts/DataChart.svelte @@ -18,37 +18,60 @@ } function getOptions(timeAxis, chartType) { + const res = { + scales: {}, + }; if (timeAxis && chartType === 'line') { - return { - scales: { - xAxes: [ - { - type: 'time', - distribution: 'linear', + res.scales = { + xAxes: [ + { + type: 'time', + distribution: 'linear', - time: { - tooltipFormat: 'D. M. YYYY HH:mm', - displayFormats: { - millisecond: 'HH:mm:ss.SSS', - second: 'HH:mm:ss', - minute: 'HH:mm', - hour: 'D.M hA', - day: 'D. M.', - week: 'D. M. YYYY', - month: 'MM-YYYY', - quarter: '[Q]Q - YYYY', - year: 'YYYY', - }, + time: { + tooltipFormat: 'D. M. YYYY HH:mm', + displayFormats: { + millisecond: 'HH:mm:ss.SSS', + second: 'HH:mm:ss', + minute: 'HH:mm', + hour: 'D.M hA', + day: 'D. M.', + week: 'D. M. YYYY', + month: 'MM-YYYY', + quarter: '[Q]Q - YYYY', + year: 'YYYY', }, }, - ], - }, + }, + ], }; } - 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; const palettes = themeDef?.themeType == 'dark' ? presetDarkPalettes : presetPalettes; const colors = randomcolor({ @@ -63,6 +86,7 @@ const res = { labels, datasets: dataColumns.map((dataColumn, columnIndex) => { + const label = dataColumnLabels[dataColumn]; if (chartType == 'line' || chartType == 'bar') { const color = dataColumnColors[dataColumn]; if (color) { @@ -77,17 +101,23 @@ } return { - label: dataColumn, + label: label || dataColumn, data: freeData.rows.map(row => row[dataColumn]), backgroundColor, borderColor, borderWidth: 1, + fill: fillLineChart == false ? false : true, }; }), }; const options = getOptions(timeAxis, chartType); - return [res, options]; + const plugins = getPlugins(chartTitle); + + // console.log('RES', res); + // console.log('OPTIONS', options); + + return [res, options, plugins]; } @@ -98,7 +128,7 @@ import ChartCore from './ChartCore.svelte'; import { getFormContext } from '../forms/FormProviderCore.svelte'; import { generate, presetPalettes, presetDarkPalettes, presetPrimaryColors } from '@ant-design/colors'; - import { extractDataColumnColors, extractDataColumns } from './chartDataLoader'; + import { extractDataColumnColors, extractDataColumnLabels, extractDataColumns } from './chartDataLoader'; import { currentThemeDefinition } from '../stores'; export let data; @@ -111,6 +141,7 @@ $: dataColumns = extractDataColumns($values); $: dataColumnColors = extractDataColumnColors($values, dataColumns); + $: dataColumnLabels = extractDataColumnLabels($values, dataColumns); $: chartData = createChartData( data, @@ -118,7 +149,10 @@ dataColumns, $values.colorSeed || '5', $values.chartType, + $values.chartTitle, + $values.fillLineChart, dataColumnColors, + dataColumnLabels, $currentThemeDefinition ); @@ -132,6 +166,7 @@ data={chartData[0]} type={$values.chartType} options={chartData[1]} + plugins={chartData[2]} {menu} /> {/key} diff --git a/packages/web/src/charts/chartDataLoader.ts b/packages/web/src/charts/chartDataLoader.ts index 7f7bcbc54..b9cf8128a 100644 --- a/packages/web/src/charts/chartDataLoader.ts +++ b/packages/web/src/charts/chartDataLoader.ts @@ -120,3 +120,12 @@ export function extractDataColumnColors(values, dataColumns) { } 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; +}