Improve robustness of pie and donut charts
This commit is contained in:
parent
e7eab46435
commit
b47589cdad
|
@ -5,6 +5,7 @@
|
||||||
import { ApexOptionsBuilder } from "./ApexOptionsBuilder"
|
import { ApexOptionsBuilder } from "./ApexOptionsBuilder"
|
||||||
import ApexChart from "./ApexChart.svelte"
|
import ApexChart from "./ApexChart.svelte"
|
||||||
|
|
||||||
|
export let _bb
|
||||||
export let title
|
export let title
|
||||||
export let datasource
|
export let datasource
|
||||||
export let labelColumn
|
export let labelColumn
|
||||||
|
@ -20,6 +21,7 @@
|
||||||
export let stacked
|
export let stacked
|
||||||
export let yAxisUnits
|
export let yAxisUnits
|
||||||
|
|
||||||
|
const store = _bb.store
|
||||||
let options
|
let options
|
||||||
|
|
||||||
// Fetch data on mount
|
// Fetch data on mount
|
||||||
|
@ -28,7 +30,7 @@
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = (await fetchData(datasource)).slice(0, 20)
|
const result = (await fetchData(datasource, $store)).slice(0, 20)
|
||||||
const data = sortBy(row => row[labelColumn])(result)
|
const data = sortBy(row => row[labelColumn])(result)
|
||||||
const schema = await fetchSchema(datasource.tableId)
|
const schema = await fetchSchema(datasource.tableId)
|
||||||
if (!schema || !data || !data.length) {
|
if (!schema || !data || !data.length) {
|
||||||
|
@ -86,8 +88,6 @@
|
||||||
// Build chart options
|
// Build chart options
|
||||||
options = builder.getOptions()
|
options = builder.getOptions()
|
||||||
})
|
})
|
||||||
|
|
||||||
$: console.log(options)
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<ApexChart {options} />
|
<ApexChart {options} />
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
import ApexChart from "./ApexChart.svelte"
|
import ApexChart from "./ApexChart.svelte"
|
||||||
|
|
||||||
// Common props
|
// Common props
|
||||||
|
export let _bb
|
||||||
export let title
|
export let title
|
||||||
export let datasource
|
export let datasource
|
||||||
export let labelColumn
|
export let labelColumn
|
||||||
|
@ -26,6 +27,7 @@
|
||||||
export let stacked
|
export let stacked
|
||||||
export let gradient
|
export let gradient
|
||||||
|
|
||||||
|
const store = _bb.store
|
||||||
let options
|
let options
|
||||||
|
|
||||||
// Fetch data on mount
|
// Fetch data on mount
|
||||||
|
@ -34,7 +36,7 @@
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const result = (await fetchData(datasource)).slice(0, 100)
|
const result = (await fetchData(datasource, $store)).slice(0, 100)
|
||||||
const data = sortBy(row => row[labelColumn])(result)
|
const data = sortBy(row => row[labelColumn])(result)
|
||||||
const schema = await fetchSchema(datasource.tableId)
|
const schema = await fetchSchema(datasource.tableId)
|
||||||
if (!schema || !data || !data.length) {
|
if (!schema || !data || !data.length) {
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
<script>
|
<script>
|
||||||
import { onMount } from "svelte"
|
import { onMount } from "svelte"
|
||||||
import { chart } from "svelte-apexcharts"
|
import fetchData, { fetchSchema } from "../fetchData"
|
||||||
import fetchData from "../fetchData"
|
import { sortBy } from "lodash/fp"
|
||||||
import { isEmpty, sortBy } from "lodash/fp"
|
|
||||||
import { ApexOptionsBuilder } from "./ApexOptionsBuilder"
|
import { ApexOptionsBuilder } from "./ApexOptionsBuilder"
|
||||||
import ApexChart from "./ApexChart.svelte"
|
import ApexChart from "./ApexChart.svelte"
|
||||||
|
|
||||||
|
export let _bb
|
||||||
export let title
|
export let title
|
||||||
export let datasource
|
export let datasource
|
||||||
export let labelColumn
|
export let labelColumn
|
||||||
|
@ -18,18 +18,32 @@
|
||||||
export let legend
|
export let legend
|
||||||
export let donut
|
export let donut
|
||||||
|
|
||||||
let data
|
const store = _bb.store
|
||||||
$: options = getChartOptions(data)
|
let options
|
||||||
|
|
||||||
// Fetch data on mount
|
// Fetch data on mount
|
||||||
onMount(async () => {
|
onMount(async () => {
|
||||||
if (!isEmpty(datasource)) {
|
if (!datasource || !labelColumn || !valueColumn) {
|
||||||
const result = (await fetchData(datasource)).slice(0, 20)
|
return
|
||||||
data = sortBy(row => row[labelColumn])(result)
|
}
|
||||||
|
|
||||||
|
const result = (await fetchData(datasource, $store)).slice(0, 20)
|
||||||
|
const data = sortBy(row => row[labelColumn])(result)
|
||||||
|
const schema = await fetchSchema(datasource.tableId)
|
||||||
|
if (!schema || !data || !data.length) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check columns are valid
|
||||||
|
if (datasource.type !== "view") {
|
||||||
|
if (schema[labelColumn] == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if (schema[valueColumn] == null) {
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
|
||||||
|
|
||||||
function getChartOptions(rows = []) {
|
|
||||||
// Initialise default chart
|
// Initialise default chart
|
||||||
let builder = new ApexOptionsBuilder()
|
let builder = new ApexOptionsBuilder()
|
||||||
.title(title)
|
.title(title)
|
||||||
|
@ -42,19 +56,15 @@
|
||||||
.legendPosition("right")
|
.legendPosition("right")
|
||||||
|
|
||||||
// Add data if valid datasource
|
// Add data if valid datasource
|
||||||
if (rows && rows.length) {
|
const series = data.map(row => parseFloat(row[valueColumn]))
|
||||||
if (!isEmpty(valueColumn) && rows[0][valueColumn] != null) {
|
builder = builder.series(series)
|
||||||
const series = rows.map(row => parseFloat(row[valueColumn]))
|
if (data[0][labelColumn] != null) {
|
||||||
builder = builder.series(series)
|
builder = builder.labels(data.map(row => row[labelColumn]))
|
||||||
}
|
|
||||||
if (!isEmpty(rows[0][labelColumn])) {
|
|
||||||
builder = builder.labels(rows.map(row => row[labelColumn]))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build chart options
|
// Build chart options
|
||||||
return builder.getOptions()
|
options = builder.getOptions()
|
||||||
}
|
})
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<ApexChart {options} />
|
<ApexChart {options} />
|
||||||
|
|
Loading…
Reference in New Issue