|
|
|
@ -1,11 +1,11 @@ |
|
|
|
<script> |
|
|
|
import { onMount } from "svelte" |
|
|
|
import { chart } from "svelte-apexcharts" |
|
|
|
import fetchData from "../fetchData" |
|
|
|
import { isEmpty, sortBy } from "lodash/fp" |
|
|
|
import fetchData, { fetchSchema } from "../fetchData" |
|
|
|
import { sortBy } from "lodash/fp" |
|
|
|
import { ApexOptionsBuilder } from "./ApexOptionsBuilder" |
|
|
|
import ApexChart from "./ApexChart.svelte" |
|
|
|
|
|
|
|
export let _bb |
|
|
|
export let title |
|
|
|
export let datasource |
|
|
|
export let labelColumn |
|
|
|
@ -18,18 +18,32 @@ |
|
|
|
export let legend |
|
|
|
export let donut |
|
|
|
|
|
|
|
let data |
|
|
|
$: options = getChartOptions(data) |
|
|
|
const store = _bb.store |
|
|
|
let options |
|
|
|
|
|
|
|
// Fetch data on mount |
|
|
|
onMount(async () => { |
|
|
|
if (!isEmpty(datasource)) { |
|
|
|
const result = (await fetchData(datasource)).slice(0, 20) |
|
|
|
data = sortBy(row => row[labelColumn])(result) |
|
|
|
if (!datasource || !labelColumn || !valueColumn) { |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
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 |
|
|
|
let builder = new ApexOptionsBuilder() |
|
|
|
.title(title) |
|
|
|
@ -42,19 +56,15 @@ |
|
|
|
.legendPosition("right") |
|
|
|
|
|
|
|
// Add data if valid datasource |
|
|
|
if (rows && rows.length) { |
|
|
|
if (!isEmpty(valueColumn) && rows[0][valueColumn] != null) { |
|
|
|
const series = rows.map(row => parseFloat(row[valueColumn])) |
|
|
|
builder = builder.series(series) |
|
|
|
} |
|
|
|
if (!isEmpty(rows[0][labelColumn])) { |
|
|
|
builder = builder.labels(rows.map(row => row[labelColumn])) |
|
|
|
} |
|
|
|
const series = data.map(row => parseFloat(row[valueColumn])) |
|
|
|
builder = builder.series(series) |
|
|
|
if (data[0][labelColumn] != null) { |
|
|
|
builder = builder.labels(data.map(row => row[labelColumn])) |
|
|
|
} |
|
|
|
|
|
|
|
// Build chart options |
|
|
|
return builder.getOptions() |
|
|
|
} |
|
|
|
options = builder.getOptions() |
|
|
|
}) |
|
|
|
</script> |
|
|
|
|
|
|
|
<ApexChart {options} /> |
|
|
|
|