budibase/packages/standard-components/src/charts/LineChart.svelte

89 lines
2.2 KiB
Svelte
Raw Normal View History

<script>
import { ApexOptionsBuilder } from "./ApexOptionsBuilder"
import ApexChart from "./ApexChart.svelte"
2020-11-03 15:32:21 +01:00
// Common props
export let title
export let dataProvider
export let labelColumn
export let valueColumns
export let xAxisLabel
export let yAxisLabel
export let height
export let width
export let animate
export let dataLabels
export let curve
export let legend
2020-11-03 15:32:21 +01:00
export let yAxisUnits
2020-11-05 14:37:28 +01:00
export let palette
2020-11-03 15:32:21 +01:00
// Area specific props
export let area
export let stacked
export let gradient
$: options = setUpChart(dataProvider)
// Fetch data on mount
const setUpChart = provider => {
const allCols = [labelColumn, ...(valueColumns || [null])]
if (!provider || !provider.rows?.length || allCols.find(x => x == null)) {
return null
}
2020-11-04 15:21:48 +01:00
// Fetch, filter and sort data
const { schema, rows } = provider
2020-11-04 15:21:48 +01:00
const reducer = row => (valid, column) => valid && row[column] != null
const hasAllColumns = row => allCols.reduce(reducer(row), true)
const data = rows.filter(row => hasAllColumns(row))
2020-11-04 15:21:48 +01:00
if (!schema || !data.length) {
return null
}
// Initialise default chart
let builder = new ApexOptionsBuilder()
.title(title)
2020-11-03 15:32:21 +01:00
.type(area ? "area" : "line")
.width(width)
.height(height)
.xLabel(xAxisLabel)
.yLabel(yAxisLabel)
.dataLabels(dataLabels)
.animate(animate)
.curve(curve.toLowerCase())
2020-11-03 15:32:21 +01:00
.gradient(gradient)
.stacked(stacked)
.legend(legend)
2020-11-03 15:32:21 +01:00
.yUnits(yAxisUnits)
2020-11-05 14:37:28 +01:00
.palette(palette)
// Add data
let useDates = false
if (schema[labelColumn]) {
const labelFieldType = schema[labelColumn].type
builder = builder.xType(labelFieldType)
useDates = labelFieldType === "datetime"
}
const series = valueColumns.map(column => ({
name: column,
data: data.map(row => {
if (!useDates) {
return row[column]
} else {
return [row[labelColumn], row[column]]
}
}),
}))
builder = builder.series(series)
2020-11-04 15:21:48 +01:00
if (!useDates) {
builder = builder.categories(data.map(row => row[labelColumn]))
}
// Build chart options
return builder.getOptions()
}
</script>
2020-11-23 12:29:24 +01:00
<ApexChart {options} />