budibase/packages/standard-components/src/Chart/BarChart.svelte

98 lines
2.6 KiB
Svelte
Raw Normal View History

2020-07-26 12:54:55 +02:00
<script>
2020-07-28 15:19:46 +02:00
import { onMount } from "svelte"
import fetchData, { fetchSchema } from "../fetchData"
import { ApexOptionsBuilder } from "./ApexOptionsBuilder"
import ApexChart from "./ApexChart.svelte"
import { isEmpty } from "lodash/fp"
import {
closeColumn,
dateColumn,
highColumn,
lowColumn,
openColumn,
} from "./CandleStickChart.svelte"
2020-07-26 12:54:55 +02:00
export let _bb
export let title
export let datasource
export let labelColumn
export let valueColumns
export let xAxisLabel
export let yAxisLabel
export let height
export let width
export let color
export let dataLabels
export let animate
export let legend
2020-11-03 10:48:35 +01:00
export let stacked
export let yAxisUnits
2020-07-26 12:54:55 +02:00
const store = _bb.store
let options
2020-07-26 12:54:55 +02:00
// Fetch data on mount
2020-08-04 14:55:26 +02:00
onMount(async () => {
const allCols = [labelColumn, ...(valueColumns || [])]
if (isEmpty(datasource) || allCols.find(x => x == null)) {
options = false
return
}
2020-11-04 15:21:48 +01:00
// Fetch, filter and sort data
const schema = await fetchSchema(datasource.tableId)
2020-11-04 15:21:48 +01:00
const result = await fetchData(datasource, $store)
const reducer = row => (valid, column) => valid && row[column] != null
const hasAllColumns = row => allCols.reduce(reducer(row), true)
2020-11-04 15:21:48 +01:00
const data = result
.filter(row => hasAllColumns(row))
2020-11-04 15:21:48 +01:00
.slice(0, 20)
.sort((a, b) => (a[labelColumn] > b[labelColumn] ? 1 : -1))
if (!schema || !data.length) {
options = false
return
}
// Initialise default chart
let builder = new ApexOptionsBuilder()
.type("bar")
.title(title)
.width(width)
.height(height)
.xLabel(xAxisLabel)
.yLabel(yAxisLabel)
.dataLabels(dataLabels)
.animate(animate)
.legend(legend)
2020-11-03 10:48:35 +01:00
.stacked(stacked)
.yUnits(yAxisUnits)
2020-07-28 15:19:46 +02:00
// Add data
let useDates = false
if (datasource.type !== "view" && 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]))
2020-07-28 15:19:46 +02:00
}
// Build chart options
options = builder.getOptions()
})
2020-07-26 12:54:55 +02:00
</script>
<ApexChart {options} />