|
|
|
@ -1,14 +1,10 @@ |
|
|
|
<script> |
|
|
|
import { getContext, onMount } from "svelte" |
|
|
|
import { ApexOptionsBuilder } from "./ApexOptionsBuilder" |
|
|
|
import ApexChart from "./ApexChart.svelte" |
|
|
|
import { isEmpty } from "lodash/fp" |
|
|
|
|
|
|
|
const { API } = getContext("sdk") |
|
|
|
|
|
|
|
// Common props |
|
|
|
export let title |
|
|
|
export let datasource |
|
|
|
export let dataProvider |
|
|
|
export let labelColumn |
|
|
|
export let valueColumns |
|
|
|
export let xAxisLabel |
|
|
|
@ -28,28 +24,22 @@ |
|
|
|
export let stacked |
|
|
|
export let gradient |
|
|
|
|
|
|
|
let options |
|
|
|
$: options = setUpChart(dataProvider) |
|
|
|
|
|
|
|
// Fetch data on mount |
|
|
|
onMount(async () => { |
|
|
|
const setUpChart = provider => { |
|
|
|
const allCols = [labelColumn, ...(valueColumns || [null])] |
|
|
|
if (isEmpty(datasource) || allCols.find(x => x == null)) { |
|
|
|
options = false |
|
|
|
return |
|
|
|
if (!provider || allCols.find(x => x == null)) { |
|
|
|
return null |
|
|
|
} |
|
|
|
|
|
|
|
// Fetch, filter and sort data |
|
|
|
const schema = (await API.fetchTableDefinition(datasource.tableId)).schema |
|
|
|
const result = await API.fetchDatasource(datasource) |
|
|
|
const { schema, rows } = provider |
|
|
|
const reducer = row => (valid, column) => valid && row[column] != null |
|
|
|
const hasAllColumns = row => allCols.reduce(reducer(row), true) |
|
|
|
const data = result |
|
|
|
.filter(row => hasAllColumns(row)) |
|
|
|
.slice(0, 100) |
|
|
|
.sort((a, b) => (a[labelColumn] > b[labelColumn] ? 1 : -1)) |
|
|
|
const data = rows.filter(row => hasAllColumns(row)) |
|
|
|
if (!schema || !data.length) { |
|
|
|
options = false |
|
|
|
return |
|
|
|
return null |
|
|
|
} |
|
|
|
|
|
|
|
// Initialise default chart |
|
|
|
@ -71,7 +61,7 @@ |
|
|
|
|
|
|
|
// Add data |
|
|
|
let useDates = false |
|
|
|
if (datasource.type !== "view" && schema[labelColumn]) { |
|
|
|
if (schema[labelColumn]) { |
|
|
|
const labelFieldType = schema[labelColumn].type |
|
|
|
builder = builder.xType(labelFieldType) |
|
|
|
useDates = labelFieldType === "datetime" |
|
|
|
@ -92,8 +82,8 @@ |
|
|
|
} |
|
|
|
|
|
|
|
// Build chart options |
|
|
|
options = builder.getOptions() |
|
|
|
}) |
|
|
|
return builder.getOptions() |
|
|
|
} |
|
|
|
</script> |
|
|
|
|
|
|
|
<ApexChart {options} /> |
|
|
|
|