@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.
Files changed (123) hide show
  1. package/LICENSE.md +100 -0
  2. package/THIRD_PARTY_NOTICES.md +12 -0
  3. package/cli.ts +157 -0
  4. package/dist/cli/cli.js +43 -0
  5. package/dist/docs/data_apps/components/charts/annotations.md +673 -0
  6. package/dist/docs/data_apps/components/charts/area-chart.md +202 -0
  7. package/dist/docs/data_apps/components/charts/bar-chart.md +317 -0
  8. package/dist/docs/data_apps/components/charts/box-plot.md +190 -0
  9. package/dist/docs/data_apps/components/charts/bubble-chart.md +151 -0
  10. package/dist/docs/data_apps/components/charts/calendar-heatmap.md +112 -0
  11. package/dist/docs/data_apps/components/charts/custom-echarts.md +308 -0
  12. package/dist/docs/data_apps/components/charts/echarts-options.md +217 -0
  13. package/dist/docs/data_apps/components/charts/funnel-chart.md +106 -0
  14. package/dist/docs/data_apps/components/charts/heatmap.md +180 -0
  15. package/dist/docs/data_apps/components/charts/histogram.md +107 -0
  16. package/dist/docs/data_apps/components/charts/line-chart.md +265 -0
  17. package/dist/docs/data_apps/components/charts/mixed-type-charts.md +240 -0
  18. package/dist/docs/data_apps/components/charts/sankey-diagram.md +301 -0
  19. package/dist/docs/data_apps/components/charts/scatter-plot.md +134 -0
  20. package/dist/docs/data_apps/components/charts/sparkline.md +68 -0
  21. package/dist/docs/data_apps/components/data/big-value.md +153 -0
  22. package/dist/docs/data_apps/components/data/delta.md +89 -0
  23. package/dist/docs/data_apps/components/data/table.md +470 -0
  24. package/dist/docs/data_apps/components/data/value.md +97 -0
  25. package/dist/docs/data_apps/components/inputs/button-group.md +154 -0
  26. package/dist/docs/data_apps/components/inputs/checkbox.md +52 -0
  27. package/dist/docs/data_apps/components/inputs/date-input.md +131 -0
  28. package/dist/docs/data_apps/components/inputs/date-range.md +124 -0
  29. package/dist/docs/data_apps/components/inputs/dimension-grid.md +67 -0
  30. package/dist/docs/data_apps/components/inputs/dropdown.md +199 -0
  31. package/dist/docs/data_apps/components/inputs/index.md +3 -0
  32. package/dist/docs/data_apps/components/inputs/slider.md +126 -0
  33. package/dist/docs/data_apps/components/inputs/text-input.md +86 -0
  34. package/dist/docs/data_apps/components/maps/area-map.md +397 -0
  35. package/dist/docs/data_apps/components/maps/base-map.md +269 -0
  36. package/dist/docs/data_apps/components/maps/bubble-map.md +361 -0
  37. package/dist/docs/data_apps/components/maps/point-map.md +326 -0
  38. package/dist/docs/data_apps/components/maps/us-map.md +167 -0
  39. package/dist/docs/data_apps/components/ui/accordion.md +116 -0
  40. package/dist/docs/data_apps/components/ui/alert.md +37 -0
  41. package/dist/docs/data_apps/components/ui/big-link.md +19 -0
  42. package/dist/docs/data_apps/components/ui/details.md +58 -0
  43. package/dist/docs/data_apps/components/ui/download-data.md +41 -0
  44. package/dist/docs/data_apps/components/ui/embed.md +47 -0
  45. package/dist/docs/data_apps/components/ui/grid.md +45 -0
  46. package/dist/docs/data_apps/components/ui/image.md +61 -0
  47. package/dist/docs/data_apps/components/ui/info.md +47 -0
  48. package/dist/docs/data_apps/components/ui/last-refreshed.md +28 -0
  49. package/dist/docs/data_apps/components/ui/link-button.md +20 -0
  50. package/dist/docs/data_apps/components/ui/link.md +40 -0
  51. package/dist/docs/data_apps/components/ui/modal.md +57 -0
  52. package/dist/docs/data_apps/components/ui/note.md +32 -0
  53. package/dist/docs/data_apps/components/ui/print-format-components.md +85 -0
  54. package/dist/docs/data_apps/components/ui/tabs.md +122 -0
  55. package/dist/docs/graphene.md +129 -0
  56. package/dist/ui/app.css +332 -0
  57. package/dist/ui/assets/favicon.ico +0 -0
  58. package/dist/ui/component-utilities/autoFormatting.js +301 -0
  59. package/dist/ui/component-utilities/builtInFormats.js +482 -0
  60. package/dist/ui/component-utilities/chartContext.js +12 -0
  61. package/dist/ui/component-utilities/chartWindowDebug.js +21 -0
  62. package/dist/ui/component-utilities/checkInputs.js +95 -0
  63. package/dist/ui/component-utilities/convert.js +15 -0
  64. package/dist/ui/component-utilities/dateParsing.js +57 -0
  65. package/dist/ui/component-utilities/dropdownContext.ts +1 -0
  66. package/dist/ui/component-utilities/echarts.js +262 -0
  67. package/dist/ui/component-utilities/echartsThemes.js +453 -0
  68. package/dist/ui/component-utilities/formatTitle.js +24 -0
  69. package/dist/ui/component-utilities/formatting.js +258 -0
  70. package/dist/ui/component-utilities/getColumnExtents.js +79 -0
  71. package/dist/ui/component-utilities/getColumnSummary.js +67 -0
  72. package/dist/ui/component-utilities/getCompletedData.js +114 -0
  73. package/dist/ui/component-utilities/getDistinctCount.js +7 -0
  74. package/dist/ui/component-utilities/getDistinctValues.js +15 -0
  75. package/dist/ui/component-utilities/getSeriesConfig.js +236 -0
  76. package/dist/ui/component-utilities/getSortedData.js +7 -0
  77. package/dist/ui/component-utilities/getStackPercentages.js +43 -0
  78. package/dist/ui/component-utilities/getStackedData.js +17 -0
  79. package/dist/ui/component-utilities/getYAxisIndex.js +15 -0
  80. package/dist/ui/component-utilities/globalContexts.js +1 -0
  81. package/dist/ui/component-utilities/helpers/getCompletedData.helpers.js +119 -0
  82. package/dist/ui/component-utilities/inputUtils.ts +25 -0
  83. package/dist/ui/component-utilities/replaceNulls.js +14 -0
  84. package/dist/ui/component-utilities/tableUtils.ts +120 -0
  85. package/dist/ui/component-utilities/themeStores.ts +116 -0
  86. package/dist/ui/components/Area.svelte +174 -0
  87. package/dist/ui/components/AreaChart.svelte +150 -0
  88. package/dist/ui/components/Bar.svelte +326 -0
  89. package/dist/ui/components/BarChart.svelte +194 -0
  90. package/dist/ui/components/BigValue.svelte +69 -0
  91. package/dist/ui/components/Chart.svelte +1070 -0
  92. package/dist/ui/components/Column.svelte +172 -0
  93. package/dist/ui/components/DateRange.svelte +324 -0
  94. package/dist/ui/components/Dropdown.svelte +738 -0
  95. package/dist/ui/components/DropdownOption.svelte +21 -0
  96. package/dist/ui/components/ECharts.svelte +77 -0
  97. package/dist/ui/components/ErrorChart.svelte +54 -0
  98. package/dist/ui/components/GrapheneQuery.svelte +12 -0
  99. package/dist/ui/components/InlineDelta.svelte +150 -0
  100. package/dist/ui/components/Line.svelte +210 -0
  101. package/dist/ui/components/LineChart.svelte +178 -0
  102. package/dist/ui/components/PieChart.svelte +36 -0
  103. package/dist/ui/components/QueryLoad.svelte +82 -0
  104. package/dist/ui/components/Row.svelte +14 -0
  105. package/dist/ui/components/SortIcon.svelte +32 -0
  106. package/dist/ui/components/Table.svelte +19 -0
  107. package/dist/ui/components/TableCell.svelte +75 -0
  108. package/dist/ui/components/TableGroupRow.svelte +136 -0
  109. package/dist/ui/components/TableGroupToggle.svelte +42 -0
  110. package/dist/ui/components/TableHeader.svelte +242 -0
  111. package/dist/ui/components/TableRow.svelte +283 -0
  112. package/dist/ui/components/TableSubtotalRow.svelte +62 -0
  113. package/dist/ui/components/TableTotalRow.svelte +88 -0
  114. package/dist/ui/components/TextInput.svelte +92 -0
  115. package/dist/ui/components/_Table.svelte +516 -0
  116. package/dist/ui/internal/clientCache.ts +43 -0
  117. package/dist/ui/internal/queryEngine.ts +169 -0
  118. package/dist/ui/internal/telemetry.ts +28 -0
  119. package/dist/ui/internal/theme.ts +88 -0
  120. package/dist/ui/layout.svelte +3 -0
  121. package/dist/ui/playwright.config.ts +30 -0
  122. package/dist/ui/web.js +106 -0
  123. 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,12 @@
1
+ <script>
2
+ import {onMount} from 'svelte'
3
+
4
+ export let name
5
+ export let code
6
+
7
+ onMount(() => {
8
+ if (typeof window !== 'undefined' && window.$GRAPHENE) {
9
+ window.$GRAPHENE.registerQuery(name, code)
10
+ }
11
+ })
12
+ </script>
@@ -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>