@graphenedata/cli 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +100 -0
- package/THIRD_PARTY_NOTICES.md +12 -0
- package/cli.ts +157 -0
- package/dist/cli/cli.js +43 -0
- package/dist/docs/data_apps/components/charts/annotations.md +673 -0
- package/dist/docs/data_apps/components/charts/area-chart.md +202 -0
- package/dist/docs/data_apps/components/charts/bar-chart.md +317 -0
- package/dist/docs/data_apps/components/charts/box-plot.md +190 -0
- package/dist/docs/data_apps/components/charts/bubble-chart.md +151 -0
- package/dist/docs/data_apps/components/charts/calendar-heatmap.md +112 -0
- package/dist/docs/data_apps/components/charts/custom-echarts.md +308 -0
- package/dist/docs/data_apps/components/charts/echarts-options.md +217 -0
- package/dist/docs/data_apps/components/charts/funnel-chart.md +106 -0
- package/dist/docs/data_apps/components/charts/heatmap.md +180 -0
- package/dist/docs/data_apps/components/charts/histogram.md +107 -0
- package/dist/docs/data_apps/components/charts/line-chart.md +265 -0
- package/dist/docs/data_apps/components/charts/mixed-type-charts.md +240 -0
- package/dist/docs/data_apps/components/charts/sankey-diagram.md +301 -0
- package/dist/docs/data_apps/components/charts/scatter-plot.md +134 -0
- package/dist/docs/data_apps/components/charts/sparkline.md +68 -0
- package/dist/docs/data_apps/components/data/big-value.md +153 -0
- package/dist/docs/data_apps/components/data/delta.md +89 -0
- package/dist/docs/data_apps/components/data/table.md +470 -0
- package/dist/docs/data_apps/components/data/value.md +97 -0
- package/dist/docs/data_apps/components/inputs/button-group.md +154 -0
- package/dist/docs/data_apps/components/inputs/checkbox.md +52 -0
- package/dist/docs/data_apps/components/inputs/date-input.md +131 -0
- package/dist/docs/data_apps/components/inputs/date-range.md +124 -0
- package/dist/docs/data_apps/components/inputs/dimension-grid.md +67 -0
- package/dist/docs/data_apps/components/inputs/dropdown.md +199 -0
- package/dist/docs/data_apps/components/inputs/index.md +3 -0
- package/dist/docs/data_apps/components/inputs/slider.md +126 -0
- package/dist/docs/data_apps/components/inputs/text-input.md +86 -0
- package/dist/docs/data_apps/components/maps/area-map.md +397 -0
- package/dist/docs/data_apps/components/maps/base-map.md +269 -0
- package/dist/docs/data_apps/components/maps/bubble-map.md +361 -0
- package/dist/docs/data_apps/components/maps/point-map.md +326 -0
- package/dist/docs/data_apps/components/maps/us-map.md +167 -0
- package/dist/docs/data_apps/components/ui/accordion.md +116 -0
- package/dist/docs/data_apps/components/ui/alert.md +37 -0
- package/dist/docs/data_apps/components/ui/big-link.md +19 -0
- package/dist/docs/data_apps/components/ui/details.md +58 -0
- package/dist/docs/data_apps/components/ui/download-data.md +41 -0
- package/dist/docs/data_apps/components/ui/embed.md +47 -0
- package/dist/docs/data_apps/components/ui/grid.md +45 -0
- package/dist/docs/data_apps/components/ui/image.md +61 -0
- package/dist/docs/data_apps/components/ui/info.md +47 -0
- package/dist/docs/data_apps/components/ui/last-refreshed.md +28 -0
- package/dist/docs/data_apps/components/ui/link-button.md +20 -0
- package/dist/docs/data_apps/components/ui/link.md +40 -0
- package/dist/docs/data_apps/components/ui/modal.md +57 -0
- package/dist/docs/data_apps/components/ui/note.md +32 -0
- package/dist/docs/data_apps/components/ui/print-format-components.md +85 -0
- package/dist/docs/data_apps/components/ui/tabs.md +122 -0
- package/dist/docs/graphene.md +129 -0
- package/dist/ui/app.css +332 -0
- package/dist/ui/assets/favicon.ico +0 -0
- package/dist/ui/component-utilities/autoFormatting.js +301 -0
- package/dist/ui/component-utilities/builtInFormats.js +482 -0
- package/dist/ui/component-utilities/chartContext.js +12 -0
- package/dist/ui/component-utilities/chartWindowDebug.js +21 -0
- package/dist/ui/component-utilities/checkInputs.js +95 -0
- package/dist/ui/component-utilities/convert.js +15 -0
- package/dist/ui/component-utilities/dateParsing.js +57 -0
- package/dist/ui/component-utilities/dropdownContext.ts +1 -0
- package/dist/ui/component-utilities/echarts.js +262 -0
- package/dist/ui/component-utilities/echartsThemes.js +453 -0
- package/dist/ui/component-utilities/formatTitle.js +24 -0
- package/dist/ui/component-utilities/formatting.js +258 -0
- package/dist/ui/component-utilities/getColumnExtents.js +79 -0
- package/dist/ui/component-utilities/getColumnSummary.js +67 -0
- package/dist/ui/component-utilities/getCompletedData.js +114 -0
- package/dist/ui/component-utilities/getDistinctCount.js +7 -0
- package/dist/ui/component-utilities/getDistinctValues.js +15 -0
- package/dist/ui/component-utilities/getSeriesConfig.js +236 -0
- package/dist/ui/component-utilities/getSortedData.js +7 -0
- package/dist/ui/component-utilities/getStackPercentages.js +43 -0
- package/dist/ui/component-utilities/getStackedData.js +17 -0
- package/dist/ui/component-utilities/getYAxisIndex.js +15 -0
- package/dist/ui/component-utilities/globalContexts.js +1 -0
- package/dist/ui/component-utilities/helpers/getCompletedData.helpers.js +119 -0
- package/dist/ui/component-utilities/inputUtils.ts +25 -0
- package/dist/ui/component-utilities/replaceNulls.js +14 -0
- package/dist/ui/component-utilities/tableUtils.ts +120 -0
- package/dist/ui/component-utilities/themeStores.ts +116 -0
- package/dist/ui/components/Area.svelte +174 -0
- package/dist/ui/components/AreaChart.svelte +150 -0
- package/dist/ui/components/Bar.svelte +326 -0
- package/dist/ui/components/BarChart.svelte +194 -0
- package/dist/ui/components/BigValue.svelte +69 -0
- package/dist/ui/components/Chart.svelte +1070 -0
- package/dist/ui/components/Column.svelte +172 -0
- package/dist/ui/components/DateRange.svelte +324 -0
- package/dist/ui/components/Dropdown.svelte +738 -0
- package/dist/ui/components/DropdownOption.svelte +21 -0
- package/dist/ui/components/ECharts.svelte +77 -0
- package/dist/ui/components/ErrorChart.svelte +54 -0
- package/dist/ui/components/GrapheneQuery.svelte +12 -0
- package/dist/ui/components/InlineDelta.svelte +150 -0
- package/dist/ui/components/Line.svelte +210 -0
- package/dist/ui/components/LineChart.svelte +178 -0
- package/dist/ui/components/PieChart.svelte +36 -0
- package/dist/ui/components/QueryLoad.svelte +82 -0
- package/dist/ui/components/Row.svelte +14 -0
- package/dist/ui/components/SortIcon.svelte +32 -0
- package/dist/ui/components/Table.svelte +19 -0
- package/dist/ui/components/TableCell.svelte +75 -0
- package/dist/ui/components/TableGroupRow.svelte +136 -0
- package/dist/ui/components/TableGroupToggle.svelte +42 -0
- package/dist/ui/components/TableHeader.svelte +242 -0
- package/dist/ui/components/TableRow.svelte +283 -0
- package/dist/ui/components/TableSubtotalRow.svelte +62 -0
- package/dist/ui/components/TableTotalRow.svelte +88 -0
- package/dist/ui/components/TextInput.svelte +92 -0
- package/dist/ui/components/_Table.svelte +516 -0
- package/dist/ui/internal/clientCache.ts +43 -0
- package/dist/ui/internal/queryEngine.ts +169 -0
- package/dist/ui/internal/telemetry.ts +28 -0
- package/dist/ui/internal/theme.ts +88 -0
- package/dist/ui/layout.svelte +3 -0
- package/dist/ui/playwright.config.ts +30 -0
- package/dist/ui/web.js +106 -0
- package/package.json +71 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import {getContext, onDestroy, onMount} from 'svelte'
|
|
3
|
+
import {DROPDOWN_CONTEXT} from '../component-utilities/dropdownContext'
|
|
4
|
+
|
|
5
|
+
export let value: any
|
|
6
|
+
export let valueLabel: string | undefined = undefined
|
|
7
|
+
|
|
8
|
+
type RegisterFn = ((option: {value: any; label: string}) => (() => void) | void) | undefined
|
|
9
|
+
const register = getContext<RegisterFn>(DROPDOWN_CONTEXT)
|
|
10
|
+
|
|
11
|
+
let unregister: (() => void) | void
|
|
12
|
+
|
|
13
|
+
onMount(() => {
|
|
14
|
+
if (!register) return
|
|
15
|
+
unregister = register({value, label: valueLabel ?? String(value)})
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
onDestroy(() => {
|
|
19
|
+
if (typeof unregister === 'function') unregister()
|
|
20
|
+
})
|
|
21
|
+
</script>
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import echarts from '../component-utilities/echarts.js'
|
|
3
|
+
import {createEventDispatcher} from 'svelte'
|
|
4
|
+
import {getThemeStores} from '../component-utilities/themeStores'
|
|
5
|
+
|
|
6
|
+
const {activeAppearance} = getThemeStores()
|
|
7
|
+
|
|
8
|
+
export let config: any
|
|
9
|
+
export let height: string | number = '291px'
|
|
10
|
+
export let width: string | number = '100%'
|
|
11
|
+
export let data: any
|
|
12
|
+
export let queryID: any = undefined
|
|
13
|
+
export let renderer: 'canvas' | 'svg' | undefined = undefined
|
|
14
|
+
export let echartsOptions: any = undefined
|
|
15
|
+
export let seriesOptions: any = undefined
|
|
16
|
+
export let seriesColors: any = undefined
|
|
17
|
+
export let connectGroup: string | undefined = undefined
|
|
18
|
+
export let xAxisLabelOverflow: 'truncate' | 'break' | undefined = undefined
|
|
19
|
+
|
|
20
|
+
const dispatch = createEventDispatcher()
|
|
21
|
+
const isBrowser = typeof window !== 'undefined'
|
|
22
|
+
|
|
23
|
+
const toDimension = (dimension: string | number | undefined, fallback: string) => {
|
|
24
|
+
if (typeof dimension === 'number') return `${dimension}px`
|
|
25
|
+
if (!dimension) return fallback
|
|
26
|
+
return dimension
|
|
27
|
+
}
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<div class="echarts-container">
|
|
31
|
+
{#if !isBrowser}
|
|
32
|
+
<div class="echarts-loading" style={`height:${toDimension(height, '240px')}`}>Loading…</div>
|
|
33
|
+
{:else}
|
|
34
|
+
<div
|
|
35
|
+
class="echarts-chart"
|
|
36
|
+
data-query-id={queryID}
|
|
37
|
+
style={`height:${toDimension(height, '240px')};width:${toDimension(width, '100%')}`}
|
|
38
|
+
use:echarts={{
|
|
39
|
+
config,
|
|
40
|
+
data,
|
|
41
|
+
echartsOptions,
|
|
42
|
+
seriesOptions,
|
|
43
|
+
dispatch,
|
|
44
|
+
renderer,
|
|
45
|
+
connectGroup,
|
|
46
|
+
xAxisLabelOverflow,
|
|
47
|
+
seriesColors,
|
|
48
|
+
theme: $activeAppearance,
|
|
49
|
+
}}
|
|
50
|
+
/>
|
|
51
|
+
{/if}
|
|
52
|
+
</div>
|
|
53
|
+
|
|
54
|
+
<style>
|
|
55
|
+
.echarts-container {
|
|
56
|
+
position: relative;
|
|
57
|
+
margin: 8px 0;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.echarts-chart {
|
|
61
|
+
width: 100%;
|
|
62
|
+
overflow: visible;
|
|
63
|
+
user-select: none;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
.echarts-loading {
|
|
67
|
+
width: 100%;
|
|
68
|
+
display: flex;
|
|
69
|
+
align-items: center;
|
|
70
|
+
justify-content: center;
|
|
71
|
+
border: 1px solid rgba(209, 213, 219, 0.8);
|
|
72
|
+
border-radius: 4px;
|
|
73
|
+
background: rgba(249, 250, 251, 0.6);
|
|
74
|
+
color: rgba(107, 114, 128, 0.95);
|
|
75
|
+
font-size: 12px;
|
|
76
|
+
}
|
|
77
|
+
</style>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
export let error: unknown
|
|
3
|
+
export let title: string
|
|
4
|
+
export let height = 200
|
|
5
|
+
|
|
6
|
+
let message: string
|
|
7
|
+
|
|
8
|
+
$: message = (() => {
|
|
9
|
+
if (error instanceof Error) return error.message
|
|
10
|
+
if (typeof error === 'string') return error
|
|
11
|
+
try {
|
|
12
|
+
return JSON.stringify(error, null, 2)
|
|
13
|
+
} catch {
|
|
14
|
+
return String(error)
|
|
15
|
+
}
|
|
16
|
+
})()
|
|
17
|
+
</script>
|
|
18
|
+
|
|
19
|
+
<div class="error-chart" style={`min-height:${height}px`} role="alert">
|
|
20
|
+
<div class="error-chart__title">{title}</div>
|
|
21
|
+
<pre class="error-chart__message">{message}</pre>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
<style>
|
|
25
|
+
.error-chart {
|
|
26
|
+
width: 100%;
|
|
27
|
+
display: grid;
|
|
28
|
+
place-items: center;
|
|
29
|
+
padding: 16px;
|
|
30
|
+
margin: 12px 0;
|
|
31
|
+
border-radius: 6px;
|
|
32
|
+
border: 1px solid rgba(220, 38, 38, 0.4);
|
|
33
|
+
background: rgba(254, 226, 226, 0.7);
|
|
34
|
+
color: #991b1b;
|
|
35
|
+
box-sizing: border-box;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.error-chart__title {
|
|
39
|
+
font-weight: 600;
|
|
40
|
+
font-size: 16px;
|
|
41
|
+
margin-bottom: 8px;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.error-chart__message {
|
|
45
|
+
margin: 0;
|
|
46
|
+
font-family: 'SFMono-Regular', Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace;
|
|
47
|
+
font-size: 12px;
|
|
48
|
+
white-space: pre-wrap;
|
|
49
|
+
word-break: break-word;
|
|
50
|
+
max-width: 100%;
|
|
51
|
+
color: inherit;
|
|
52
|
+
background: transparent;
|
|
53
|
+
}
|
|
54
|
+
</style>
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import {formatValue, getFormatObjectFromString} from '../component-utilities/formatting.js'
|
|
3
|
+
import {getThemeStores} from '../component-utilities/themeStores'
|
|
4
|
+
import {toBoolean} from '../component-utilities/convert'
|
|
5
|
+
|
|
6
|
+
export let value: number | string | null | undefined = undefined
|
|
7
|
+
export let fmt: string | undefined = undefined
|
|
8
|
+
export let formatObject: any = undefined
|
|
9
|
+
export let columnUnitSummary: any = undefined
|
|
10
|
+
export let downIsGood = false
|
|
11
|
+
export let showValue = true
|
|
12
|
+
export let showSymbol = true
|
|
13
|
+
export let symbolPosition: 'left' | 'right' = 'right'
|
|
14
|
+
export let neutralMin = 0
|
|
15
|
+
export let neutralMax = 0
|
|
16
|
+
export let chip = false
|
|
17
|
+
export let align: 'left' | 'right' | 'center' | string = 'right'
|
|
18
|
+
export let text: string | undefined = undefined
|
|
19
|
+
export let className: string | undefined = undefined
|
|
20
|
+
|
|
21
|
+
downIsGood = toBoolean(downIsGood) ?? false
|
|
22
|
+
showValue = toBoolean(showValue) ?? true
|
|
23
|
+
showSymbol = toBoolean(showSymbol) ?? true
|
|
24
|
+
chip = toBoolean(chip) ?? false
|
|
25
|
+
|
|
26
|
+
const {theme} = getThemeStores()
|
|
27
|
+
|
|
28
|
+
$: numericValue = value === null || value === undefined ? null : Number(value)
|
|
29
|
+
$: status = (() => {
|
|
30
|
+
if (numericValue === null) return 'neutral'
|
|
31
|
+
if (numericValue > neutralMax) return 'positive'
|
|
32
|
+
if (numericValue < neutralMin) return 'negative'
|
|
33
|
+
return 'neutral'
|
|
34
|
+
})()
|
|
35
|
+
|
|
36
|
+
const pickColor = (positive: string, negative: string, neutral: string) => {
|
|
37
|
+
if (status === 'positive') return positive
|
|
38
|
+
if (status === 'negative') return negative
|
|
39
|
+
return neutral
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
$: symbol = (() => {
|
|
43
|
+
if (status === 'positive') return '▲'
|
|
44
|
+
if (status === 'negative') return '▼'
|
|
45
|
+
return '–'
|
|
46
|
+
})()
|
|
47
|
+
$: symbolColor = pickColor(
|
|
48
|
+
downIsGood ? $theme.colors.negative : $theme.colors.positive,
|
|
49
|
+
downIsGood ? $theme.colors.positive : $theme.colors.negative,
|
|
50
|
+
$theme.colors['base-content-muted'],
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
$: textColor = pickColor(
|
|
54
|
+
downIsGood ? $theme.colors.negative : $theme.colors.positive,
|
|
55
|
+
downIsGood ? $theme.colors.positive : $theme.colors.negative,
|
|
56
|
+
$theme.colors['base-content-muted'],
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
$: chipClass = pickColor('delta-chip--positive', 'delta-chip--negative', 'delta-chip--neutral')
|
|
60
|
+
|
|
61
|
+
$: resolvedFormat = (() => {
|
|
62
|
+
if (formatObject) return formatObject
|
|
63
|
+
if (fmt) return getFormatObjectFromString(fmt, 'number')
|
|
64
|
+
return undefined
|
|
65
|
+
})()
|
|
66
|
+
|
|
67
|
+
$: deltaClass = (() => {
|
|
68
|
+
let classes = ['delta']
|
|
69
|
+
if (chip) classes = [...classes, 'delta-chip', chipClass]
|
|
70
|
+
if (className) classes.push(className)
|
|
71
|
+
return classes.join(' ')
|
|
72
|
+
})()
|
|
73
|
+
|
|
74
|
+
$: resolvedAlign = align ?? 'right'
|
|
75
|
+
|
|
76
|
+
const renderValue = () => {
|
|
77
|
+
if (numericValue === null) return '–'
|
|
78
|
+
try {
|
|
79
|
+
return formatValue(numericValue, resolvedFormat, columnUnitSummary)
|
|
80
|
+
} catch (error) {
|
|
81
|
+
console.error('Failed to format delta value', error)
|
|
82
|
+
return String(numericValue)
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
</script>
|
|
86
|
+
|
|
87
|
+
<span class={deltaClass} style={`text-align:${resolvedAlign}`}>
|
|
88
|
+
{#if symbolPosition === 'left'}
|
|
89
|
+
{#if showSymbol}
|
|
90
|
+
<span class="delta-symbol" style={`color:${symbolColor}`}>{symbol}</span>
|
|
91
|
+
{/if}
|
|
92
|
+
{/if}
|
|
93
|
+
{#if showValue}
|
|
94
|
+
<span class="delta-value" style={`color:${textColor}`}>{renderValue()}</span>
|
|
95
|
+
{/if}
|
|
96
|
+
{#if symbolPosition === 'right'}
|
|
97
|
+
{#if showSymbol}
|
|
98
|
+
<span class="delta-symbol" style={`color:${symbolColor}`}>{symbol}</span>
|
|
99
|
+
{/if}
|
|
100
|
+
{/if}
|
|
101
|
+
{#if text}
|
|
102
|
+
<span class="delta-text">{text}</span>
|
|
103
|
+
{/if}
|
|
104
|
+
</span>
|
|
105
|
+
|
|
106
|
+
<style>
|
|
107
|
+
.delta {
|
|
108
|
+
display: inline-flex;
|
|
109
|
+
align-items: center;
|
|
110
|
+
gap: 4px;
|
|
111
|
+
font-variant-numeric: tabular-nums;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
.delta-value {
|
|
115
|
+
font-family: inherit;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.delta-symbol {
|
|
119
|
+
font-size: 0.75em;
|
|
120
|
+
line-height: 1;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.delta-text {
|
|
124
|
+
margin-left: 2px;
|
|
125
|
+
color: var(--color-base-content-muted, #6b7280);
|
|
126
|
+
font-size: 0.85em;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
.delta-chip {
|
|
130
|
+
border: 1px solid transparent;
|
|
131
|
+
border-radius: 4px;
|
|
132
|
+
padding: 1px 4px;
|
|
133
|
+
font-size: 0.9em;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.delta-chip--positive {
|
|
137
|
+
background: rgba(22, 163, 74, 0.1);
|
|
138
|
+
border-color: rgba(22, 163, 74, 0.2);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
.delta-chip--negative {
|
|
142
|
+
background: rgba(220, 38, 38, 0.1);
|
|
143
|
+
border-color: rgba(220, 38, 38, 0.2);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.delta-chip--neutral {
|
|
147
|
+
background: rgba(107, 114, 128, 0.1);
|
|
148
|
+
border-color: rgba(107, 114, 128, 0.2);
|
|
149
|
+
}
|
|
150
|
+
</style>
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import {beforeUpdate, getContext} from 'svelte'
|
|
3
|
+
import {propKey, configKey} from '../component-utilities/chartContext.js'
|
|
4
|
+
import getSeriesConfig from '../component-utilities/getSeriesConfig.js'
|
|
5
|
+
import formatTitle from '../component-utilities/formatTitle.js'
|
|
6
|
+
import getCompletedData from '../component-utilities/getCompletedData.js'
|
|
7
|
+
import getYAxisIndex from '../component-utilities/getYAxisIndex.js'
|
|
8
|
+
import {formatValue, getFormatObjectFromString} from '../component-utilities/formatting.js'
|
|
9
|
+
import {getThemeStores} from '../component-utilities/themeStores'
|
|
10
|
+
import {toBoolean} from '../component-utilities/convert'
|
|
11
|
+
|
|
12
|
+
const {resolveColor} = getThemeStores()
|
|
13
|
+
const props = getContext(propKey)
|
|
14
|
+
const config = getContext(configKey)
|
|
15
|
+
|
|
16
|
+
export let y = undefined
|
|
17
|
+
const ySet = !!y
|
|
18
|
+
export let y2 = undefined
|
|
19
|
+
const y2Set = !!y2
|
|
20
|
+
export let series = undefined
|
|
21
|
+
const seriesSet = !!series
|
|
22
|
+
export let options = undefined
|
|
23
|
+
export let name = undefined
|
|
24
|
+
|
|
25
|
+
export let lineColor = undefined
|
|
26
|
+
$: lineColorStore = resolveColor(lineColor)
|
|
27
|
+
|
|
28
|
+
export let lineWidth = 2
|
|
29
|
+
export let lineType = 'solid'
|
|
30
|
+
export let lineOpacity = undefined
|
|
31
|
+
|
|
32
|
+
export let markers = false
|
|
33
|
+
$: markers = toBoolean(markers)
|
|
34
|
+
export let markerShape = 'circle'
|
|
35
|
+
export let markerSize = 8
|
|
36
|
+
|
|
37
|
+
export let labels = false
|
|
38
|
+
$: labels = toBoolean(labels)
|
|
39
|
+
export let labelSize = 11
|
|
40
|
+
export let labelPosition = 'top'
|
|
41
|
+
|
|
42
|
+
export let labelColor = undefined
|
|
43
|
+
$: labelColorStore = resolveColor(labelColor)
|
|
44
|
+
|
|
45
|
+
export let labelFmt = undefined
|
|
46
|
+
export let yLabelFmt = undefined
|
|
47
|
+
export let y2LabelFmt = undefined
|
|
48
|
+
export let showAllLabels = false
|
|
49
|
+
$: showAllLabels = toBoolean(showAllLabels)
|
|
50
|
+
|
|
51
|
+
export let y2SeriesType = undefined
|
|
52
|
+
export let handleMissing = 'gap'
|
|
53
|
+
export let step = false
|
|
54
|
+
$: step = toBoolean(step)
|
|
55
|
+
export let stepPosition = 'end'
|
|
56
|
+
export let seriesOrder = undefined
|
|
57
|
+
export let seriesLabelFmt = undefined
|
|
58
|
+
|
|
59
|
+
let data
|
|
60
|
+
let x
|
|
61
|
+
let swapXY
|
|
62
|
+
let yFormat
|
|
63
|
+
let y2Format
|
|
64
|
+
let yCount
|
|
65
|
+
let y2Count
|
|
66
|
+
let xType
|
|
67
|
+
let xMismatch
|
|
68
|
+
let columnSummary
|
|
69
|
+
let resolvedY
|
|
70
|
+
let resolvedY2
|
|
71
|
+
let labelFormat
|
|
72
|
+
let yLabelFormat
|
|
73
|
+
let y2LabelFormat
|
|
74
|
+
let defaultLabelPosition
|
|
75
|
+
let chartOverrides
|
|
76
|
+
let seriesConfig
|
|
77
|
+
|
|
78
|
+
if (labelFmt) labelFormat = getFormatObjectFromString(labelFmt)
|
|
79
|
+
if (yLabelFmt) yLabelFormat = getFormatObjectFromString(yLabelFmt)
|
|
80
|
+
if (y2LabelFmt) y2LabelFormat = getFormatObjectFromString(y2LabelFmt)
|
|
81
|
+
|
|
82
|
+
$: data = $props.data
|
|
83
|
+
$: x = $props.x
|
|
84
|
+
$: swapXY = $props.swapXY
|
|
85
|
+
$: yFormat = $props.yFormat
|
|
86
|
+
$: y2Format = $props.y2Format
|
|
87
|
+
$: yCount = $props.yCount
|
|
88
|
+
$: y2Count = $props.y2Count
|
|
89
|
+
$: xType = $props.xType
|
|
90
|
+
$: xMismatch = $props.xMismatch
|
|
91
|
+
$: columnSummary = $props.columnSummary
|
|
92
|
+
$: series = seriesSet ? series : $props.series
|
|
93
|
+
$: resolvedY = ySet ? y : $props.y
|
|
94
|
+
$: resolvedY2 = y2Set ? y2 : $props.y2
|
|
95
|
+
|
|
96
|
+
$: {
|
|
97
|
+
if (!series && typeof resolvedY !== 'object') {
|
|
98
|
+
if (columnSummary?.[resolvedY]) name = name ?? formatTitle(resolvedY, columnSummary[resolvedY].title)
|
|
99
|
+
} else {
|
|
100
|
+
try {
|
|
101
|
+
data = getCompletedData(data, x, resolvedY, series)
|
|
102
|
+
} catch (error) {
|
|
103
|
+
globalThis.console?.warn('Failed to complete data', {error})
|
|
104
|
+
data = []
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
$: if (handleMissing === 'zero') {
|
|
110
|
+
try {
|
|
111
|
+
data = getCompletedData(data, x, resolvedY, series, true)
|
|
112
|
+
} catch (error) {
|
|
113
|
+
globalThis.console?.warn('Failed to complete data', {error})
|
|
114
|
+
data = []
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
const labelPositions = {above: 'top', below: 'bottom', middle: 'inside'}
|
|
119
|
+
const swapXYLabelPositions = {above: 'right', below: 'left', middle: 'inside'}
|
|
120
|
+
|
|
121
|
+
$: {
|
|
122
|
+
defaultLabelPosition = swapXY ? 'right' : 'top'
|
|
123
|
+
labelPosition = (swapXY ? swapXYLabelPositions[labelPosition] : labelPositions[labelPosition]) ?? defaultLabelPosition
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
$: baseConfig = {
|
|
127
|
+
type: 'line',
|
|
128
|
+
label: {
|
|
129
|
+
show: labels,
|
|
130
|
+
formatter: (params) =>
|
|
131
|
+
params.value[swapXY ? 0 : 1] === 0
|
|
132
|
+
? ''
|
|
133
|
+
: formatValue(
|
|
134
|
+
params.value[swapXY ? 0 : 1],
|
|
135
|
+
[yLabelFormat ?? labelFormat ?? yFormat, y2LabelFormat ?? labelFormat ?? y2Format][
|
|
136
|
+
getYAxisIndex(params.componentIndex, yCount, y2Count)
|
|
137
|
+
],
|
|
138
|
+
),
|
|
139
|
+
fontSize: labelSize,
|
|
140
|
+
color: $labelColorStore,
|
|
141
|
+
position: labelPosition,
|
|
142
|
+
padding: 3,
|
|
143
|
+
},
|
|
144
|
+
labelLayout: {hideOverlap: showAllLabels ? false : true},
|
|
145
|
+
connectNulls: handleMissing === 'connect',
|
|
146
|
+
emphasis: {
|
|
147
|
+
focus: 'series',
|
|
148
|
+
endLabel: {show: false},
|
|
149
|
+
lineStyle: {opacity: 1, width: 3},
|
|
150
|
+
},
|
|
151
|
+
lineStyle: {width: parseInt(lineWidth), type: lineType, opacity: lineOpacity},
|
|
152
|
+
itemStyle: {color: $lineColorStore, opacity: lineOpacity},
|
|
153
|
+
showSymbol: labels || markers,
|
|
154
|
+
symbol: markerShape,
|
|
155
|
+
symbolSize: labels && !markers ? 0 : markerSize,
|
|
156
|
+
step: step ? stepPosition : false,
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
$: seriesConfig = getSeriesConfig(
|
|
160
|
+
data,
|
|
161
|
+
x,
|
|
162
|
+
resolvedY,
|
|
163
|
+
series,
|
|
164
|
+
swapXY,
|
|
165
|
+
baseConfig,
|
|
166
|
+
name,
|
|
167
|
+
xMismatch,
|
|
168
|
+
columnSummary,
|
|
169
|
+
seriesOrder,
|
|
170
|
+
undefined,
|
|
171
|
+
undefined,
|
|
172
|
+
resolvedY2,
|
|
173
|
+
seriesLabelFmt,
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
$: config.update((value) => {
|
|
177
|
+
value.series.push(...seriesConfig)
|
|
178
|
+
value.legend.data.push(...seriesConfig.map((entry) => entry.name.toString()))
|
|
179
|
+
return value
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
$: if (options) config.update((value) => ({...value, ...options}))
|
|
183
|
+
|
|
184
|
+
$: chartOverrides = {
|
|
185
|
+
yAxis: {boundaryGap: ['0%', '1%']},
|
|
186
|
+
xAxis: {boundaryGap: [xType === 'time' ? '2%' : '0%', '2%']},
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
beforeUpdate(() => {
|
|
190
|
+
config.update((value) => {
|
|
191
|
+
if (swapXY) {
|
|
192
|
+
value.yAxis = {...value.yAxis, ...chartOverrides.xAxis}
|
|
193
|
+
value.xAxis = {...value.xAxis, ...chartOverrides.yAxis}
|
|
194
|
+
} else {
|
|
195
|
+
value.yAxis[0] = {...value.yAxis[0], ...chartOverrides.yAxis}
|
|
196
|
+
value.xAxis = {...value.xAxis, ...chartOverrides.xAxis}
|
|
197
|
+
if (resolvedY2) {
|
|
198
|
+
value.yAxis[1] = {...value.yAxis[1], show: true}
|
|
199
|
+
if (['line', 'bar', 'scatter'].includes(y2SeriesType)) {
|
|
200
|
+
for (let index = 0; index < y2Count; index++) {
|
|
201
|
+
value.series[yCount + index].type = y2SeriesType
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
if (labels) value.axisPointer = {triggerEmphasis: false}
|
|
207
|
+
return value
|
|
208
|
+
})
|
|
209
|
+
})
|
|
210
|
+
</script>
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
<script>
|
|
2
|
+
import Chart from './Chart.svelte'
|
|
3
|
+
import Line from './Line.svelte'
|
|
4
|
+
import QueryLoad from './QueryLoad.svelte'
|
|
5
|
+
import {getThemeStores} from '../component-utilities/themeStores'
|
|
6
|
+
|
|
7
|
+
const {resolveColor, resolveColorsObject, resolveColorPalette} = getThemeStores()
|
|
8
|
+
|
|
9
|
+
export let data = undefined
|
|
10
|
+
export let x = undefined
|
|
11
|
+
export let y = undefined
|
|
12
|
+
export let y2 = undefined
|
|
13
|
+
export let series = undefined
|
|
14
|
+
export let xType = undefined
|
|
15
|
+
export let yLog = undefined
|
|
16
|
+
export let yLogBase = undefined
|
|
17
|
+
|
|
18
|
+
export let y2SeriesType = undefined
|
|
19
|
+
|
|
20
|
+
export let yFmt = undefined
|
|
21
|
+
export let xFmt = undefined
|
|
22
|
+
export let y2Fmt = undefined
|
|
23
|
+
|
|
24
|
+
export let title = undefined
|
|
25
|
+
export let subtitle = undefined
|
|
26
|
+
export let legend = undefined
|
|
27
|
+
export let xAxisTitle = undefined
|
|
28
|
+
export let yAxisTitle = y2 ? 'true' : undefined
|
|
29
|
+
export let y2AxisTitle = y2 ? 'true' : undefined
|
|
30
|
+
export let xGridlines = undefined
|
|
31
|
+
export let yGridlines = undefined
|
|
32
|
+
export let y2Gridlines = undefined
|
|
33
|
+
export let xAxisLabels = undefined
|
|
34
|
+
export let yAxisLabels = undefined
|
|
35
|
+
export let y2AxisLabels = undefined
|
|
36
|
+
export let xBaseline = undefined
|
|
37
|
+
export let yBaseline = undefined
|
|
38
|
+
export let y2Baseline = undefined
|
|
39
|
+
export let xTickMarks = undefined
|
|
40
|
+
export let yTickMarks = undefined
|
|
41
|
+
export let y2TickMarks = undefined
|
|
42
|
+
export let yMin = undefined
|
|
43
|
+
export let yMax = undefined
|
|
44
|
+
export let yScale = undefined
|
|
45
|
+
export let y2Min = undefined
|
|
46
|
+
export let y2Max = undefined
|
|
47
|
+
export let y2Scale = undefined
|
|
48
|
+
export let sort = undefined
|
|
49
|
+
|
|
50
|
+
export let lineColor = undefined
|
|
51
|
+
$: lineColorStore = resolveColor(lineColor)
|
|
52
|
+
|
|
53
|
+
export let lineType = undefined
|
|
54
|
+
export let lineWidth = undefined
|
|
55
|
+
export let lineOpacity = undefined
|
|
56
|
+
export let chartAreaHeight = undefined
|
|
57
|
+
|
|
58
|
+
export let markers = undefined
|
|
59
|
+
export let markerShape = undefined
|
|
60
|
+
export let markerSize = undefined
|
|
61
|
+
export let handleMissing = undefined
|
|
62
|
+
export let step = undefined
|
|
63
|
+
export let stepPosition = undefined
|
|
64
|
+
|
|
65
|
+
export let colorPalette = 'default'
|
|
66
|
+
$: colorPaletteStore = resolveColorPalette(colorPalette)
|
|
67
|
+
|
|
68
|
+
export let labels = undefined
|
|
69
|
+
export let labelSize = undefined
|
|
70
|
+
export let labelPosition = undefined
|
|
71
|
+
|
|
72
|
+
export let labelColor = undefined
|
|
73
|
+
$: labelColorStore = resolveColor(labelColor)
|
|
74
|
+
|
|
75
|
+
export let labelFmt = undefined
|
|
76
|
+
export let yLabelFmt = undefined
|
|
77
|
+
export let y2LabelFmt = undefined
|
|
78
|
+
export let showAllLabels = undefined
|
|
79
|
+
|
|
80
|
+
export let yAxisColor = undefined
|
|
81
|
+
$: yAxisColorStore = resolveColor(yAxisColor)
|
|
82
|
+
|
|
83
|
+
export let y2AxisColor = undefined
|
|
84
|
+
$: y2AxisColorStore = resolveColor(y2AxisColor)
|
|
85
|
+
|
|
86
|
+
export let echartsOptions = undefined
|
|
87
|
+
export let seriesOptions = undefined
|
|
88
|
+
|
|
89
|
+
export let seriesColors = undefined
|
|
90
|
+
$: seriesColorsStore = resolveColorsObject(seriesColors)
|
|
91
|
+
|
|
92
|
+
export let seriesOrder = undefined
|
|
93
|
+
export let connectGroup = undefined
|
|
94
|
+
export let seriesLabelFmt = undefined
|
|
95
|
+
|
|
96
|
+
export let leftPadding = undefined
|
|
97
|
+
export let rightPadding = undefined
|
|
98
|
+
export let xLabelWrap = undefined
|
|
99
|
+
</script>
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
<QueryLoad data={data} fields={[x, y, y2, series]} let:loaded>
|
|
103
|
+
<Chart
|
|
104
|
+
data={loaded}
|
|
105
|
+
{x}
|
|
106
|
+
{y}
|
|
107
|
+
{y2}
|
|
108
|
+
{xFmt}
|
|
109
|
+
{yFmt}
|
|
110
|
+
{y2Fmt}
|
|
111
|
+
{series}
|
|
112
|
+
{xType}
|
|
113
|
+
{yLog}
|
|
114
|
+
{yLogBase}
|
|
115
|
+
{legend}
|
|
116
|
+
{xAxisTitle}
|
|
117
|
+
{yAxisTitle}
|
|
118
|
+
{y2AxisTitle}
|
|
119
|
+
{xGridlines}
|
|
120
|
+
{yGridlines}
|
|
121
|
+
{y2Gridlines}
|
|
122
|
+
{xAxisLabels}
|
|
123
|
+
{yAxisLabels}
|
|
124
|
+
{y2AxisLabels}
|
|
125
|
+
{xBaseline}
|
|
126
|
+
{yBaseline}
|
|
127
|
+
{y2Baseline}
|
|
128
|
+
{xTickMarks}
|
|
129
|
+
{yTickMarks}
|
|
130
|
+
{y2TickMarks}
|
|
131
|
+
yAxisColor={yAxisColorStore}
|
|
132
|
+
y2AxisColor={y2AxisColorStore}
|
|
133
|
+
{yMin}
|
|
134
|
+
{yMax}
|
|
135
|
+
{yScale}
|
|
136
|
+
{y2Min}
|
|
137
|
+
{y2Max}
|
|
138
|
+
{y2Scale}
|
|
139
|
+
{title}
|
|
140
|
+
{subtitle}
|
|
141
|
+
chartType="Line Chart"
|
|
142
|
+
{sort}
|
|
143
|
+
{chartAreaHeight}
|
|
144
|
+
colorPalette={colorPaletteStore}
|
|
145
|
+
{echartsOptions}
|
|
146
|
+
{seriesOptions}
|
|
147
|
+
{connectGroup}
|
|
148
|
+
seriesColors={seriesColorsStore}
|
|
149
|
+
{leftPadding}
|
|
150
|
+
{rightPadding}
|
|
151
|
+
{xLabelWrap}
|
|
152
|
+
>
|
|
153
|
+
<Line
|
|
154
|
+
lineColor={lineColorStore}
|
|
155
|
+
{lineWidth}
|
|
156
|
+
{lineOpacity}
|
|
157
|
+
{lineType}
|
|
158
|
+
{markers}
|
|
159
|
+
{markerShape}
|
|
160
|
+
{markerSize}
|
|
161
|
+
{handleMissing}
|
|
162
|
+
{step}
|
|
163
|
+
{stepPosition}
|
|
164
|
+
{labels}
|
|
165
|
+
{labelSize}
|
|
166
|
+
{labelPosition}
|
|
167
|
+
labelColor={labelColorStore}
|
|
168
|
+
{labelFmt}
|
|
169
|
+
{yLabelFmt}
|
|
170
|
+
{y2LabelFmt}
|
|
171
|
+
{showAllLabels}
|
|
172
|
+
{y2SeriesType}
|
|
173
|
+
{seriesOrder}
|
|
174
|
+
{seriesLabelFmt}
|
|
175
|
+
/>
|
|
176
|
+
<slot />
|
|
177
|
+
</Chart>
|
|
178
|
+
</QueryLoad>
|