|
|
|
@ -1,7 +1,7 @@ |
|
|
|
<script> |
|
|
|
import { onMount } from "svelte" |
|
|
|
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" |
|
|
|
|
|
|
|
@ -26,23 +26,37 @@ |
|
|
|
export let stacked |
|
|
|
export let gradient |
|
|
|
|
|
|
|
let data = [] |
|
|
|
$: options = getChartOptions(data) |
|
|
|
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 || !valueColumns || !valueColumns.length) { |
|
|
|
return |
|
|
|
} |
|
|
|
|
|
|
|
const result = (await fetchData(datasource)).slice(0, 100) |
|
|
|
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 |
|
|
|
} |
|
|
|
for (let i = 0; i < valueColumns.length; i++) { |
|
|
|
if (schema[valueColumns[i]] == null) { |
|
|
|
return |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
}) |
|
|
|
|
|
|
|
function getChartOptions(rows = []) { |
|
|
|
// Initialise default chart |
|
|
|
let builder = new ApexOptionsBuilder() |
|
|
|
.title(title) |
|
|
|
.type(area ? "area" : "line") |
|
|
|
// .color(color) |
|
|
|
.width(width) |
|
|
|
.height(height) |
|
|
|
.xLabel(xAxisLabel) |
|
|
|
@ -55,23 +69,31 @@ |
|
|
|
.legend(legend) |
|
|
|
.yUnits(yAxisUnits) |
|
|
|
|
|
|
|
// Add data if valid datasource |
|
|
|
if (rows && rows.length) { |
|
|
|
if (valueColumns && valueColumns.length) { |
|
|
|
const series = valueColumns.map(column => ({ |
|
|
|
name: column, |
|
|
|
data: rows.map(row => parseFloat(row[column])), |
|
|
|
})) |
|
|
|
builder = builder.series(series) |
|
|
|
} |
|
|
|
if (!isEmpty(rows[0][labelColumn])) { |
|
|
|
builder = builder.categories(rows.map(row => row[labelColumn])) |
|
|
|
} |
|
|
|
// 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) |
|
|
|
if (!useDates && schema[labelColumn]) { |
|
|
|
builder = builder.categories(data.map(row => row[labelColumn])) |
|
|
|
} |
|
|
|
|
|
|
|
// Build chart options |
|
|
|
return builder.getOptions() |
|
|
|
} |
|
|
|
options = builder.getOptions() |
|
|
|
}) |
|
|
|
</script> |
|
|
|
|
|
|
|
<ApexChart {options} /> |
|
|
|
|