@orbcharts/core 3.0.7 → 4.0.0-pre-alpha.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 (196) hide show
  1. package/dist/orbcharts-core.es.js +2795 -6591
  2. package/dist/orbcharts-core.umd.js +6 -6
  3. package/dist/src/OrbCharts.d.ts +18 -0
  4. package/dist/src/chart/createChart.d.ts +3 -0
  5. package/dist/src/chart/createGraphData.d.ts +3 -0
  6. package/dist/src/chart/createGridData.d.ts +3 -0
  7. package/dist/src/chart/createMultivariateData.d.ts +3 -0
  8. package/dist/src/chart/createSeriesData.d.ts +3 -0
  9. package/dist/src/chart/createTreeData.d.ts +3 -0
  10. package/dist/src/chart/defaults.d.ts +5 -0
  11. package/dist/src/defineCanvasLayer.d.ts +16 -0
  12. package/dist/src/defineCanvasPlugin.d.ts +22 -0
  13. package/dist/src/defineSVGLayer.d.ts +16 -0
  14. package/dist/src/defineSVGPlugin.d.ts +22 -0
  15. package/dist/src/index.d.ts +6 -14
  16. package/dist/src/layer/createLayer.d.ts +3 -0
  17. package/dist/src/plugin/createPlugin.d.ts +3 -0
  18. package/dist/src/test/createGraphData.test.d.ts +1 -0
  19. package/dist/src/test/createTreeData.test.d.ts +1 -0
  20. package/dist/src/test/simple-graph-test.d.ts +74 -0
  21. package/dist/src/test/simple-tree-test.d.ts +13 -0
  22. package/dist/src/types/Chart.d.ts +39 -0
  23. package/dist/src/types/ChartContext.d.ts +27 -0
  24. package/dist/src/types/Common.d.ts +3 -0
  25. package/dist/src/types/Encoding.d.ts +33 -0
  26. package/dist/src/types/Event.d.ts +12 -0
  27. package/dist/src/types/Layers.d.ts +55 -0
  28. package/dist/src/types/ModelData.d.ts +70 -0
  29. package/dist/src/types/Plugin.d.ts +39 -0
  30. package/dist/src/types/RawData.d.ts +18 -0
  31. package/dist/src/types/RenderData.d.ts +4 -0
  32. package/dist/src/types/Theme.d.ts +17 -0
  33. package/dist/src/types/Validator.d.ts +20 -0
  34. package/dist/src/types/index.d.ts +12 -0
  35. package/dist/src/utils/aggregateUtils.d.ts +37 -0
  36. package/dist/src/utils/colorUtils.d.ts +22 -0
  37. package/dist/src/utils/commonUtils.d.ts +3 -5
  38. package/dist/src/utils/dom-lifecycle.d.ts +37 -0
  39. package/dist/src/utils/dom.d.ts +6 -0
  40. package/dist/src/utils/index.d.ts +5 -1
  41. package/dist/src/utils/observables.d.ts +1 -25
  42. package/dist/src/utils/orbchartsUtils.d.ts +2 -53
  43. package/dist/src/utils/validator.d.ts +2 -2
  44. package/dist/test/aggregateTest.d.ts +1 -0
  45. package/package.json +26 -13
  46. package/src/OrbCharts.ts +35 -0
  47. package/src/chart/createChart.ts +997 -0
  48. package/src/chart/createGraphData.ts +391 -0
  49. package/src/chart/createGridData.ts +247 -0
  50. package/src/chart/createMultivariateData.ts +181 -0
  51. package/src/chart/createSeriesData.ts +297 -0
  52. package/src/chart/createTreeData.ts +344 -0
  53. package/src/chart/defaults.ts +100 -0
  54. package/src/defineCanvasLayer.ts +24 -0
  55. package/src/defineCanvasPlugin.ts +39 -0
  56. package/src/defineSVGLayer.ts +24 -0
  57. package/src/defineSVGPlugin.ts +39 -0
  58. package/src/index.ts +6 -18
  59. package/src/layer/createLayer.ts +138 -0
  60. package/src/plugin/createPlugin.ts +470 -0
  61. package/src/test/createGraphData.test.ts +103 -0
  62. package/src/test/createTreeData.test.ts +97 -0
  63. package/src/test/simple-graph-test.js +51 -0
  64. package/src/test/simple-tree-test.js +58 -0
  65. package/src/types/Chart.ts +62 -0
  66. package/src/types/ChartContext.ts +42 -0
  67. package/src/types/Common.ts +5 -0
  68. package/src/types/Encoding.ts +43 -0
  69. package/src/types/Event.ts +26 -0
  70. package/src/types/Layers.ts +93 -0
  71. package/src/types/ModelData.ts +95 -0
  72. package/src/types/Plugin.ts +98 -0
  73. package/src/types/RawData.ts +67 -0
  74. package/src/types/RenderData.ts +16 -0
  75. package/src/types/Theme.ts +21 -0
  76. package/src/types/Validator.ts +36 -0
  77. package/src/types/index.ts +12 -0
  78. package/src/utils/aggregateUtils.ts +99 -0
  79. package/src/utils/colorUtils.ts +63 -0
  80. package/src/utils/commonUtils.ts +12 -11
  81. package/src/utils/dom-lifecycle.ts +164 -0
  82. package/src/utils/dom.ts +55 -0
  83. package/src/utils/index.ts +6 -2
  84. package/src/utils/observables.ts +1 -292
  85. package/src/utils/orbchartsUtils.ts +6 -393
  86. package/src/utils/validator.ts +15 -14
  87. package/dist/lib/core-types.d.ts +0 -1
  88. package/dist/src/AbstractChart.d.ts +0 -19
  89. package/dist/src/GridChart.d.ts +0 -6
  90. package/dist/src/MultiGridChart.d.ts +0 -6
  91. package/dist/src/MultiValueChart.d.ts +0 -6
  92. package/dist/src/RelationshipChart.d.ts +0 -6
  93. package/dist/src/SeriesChart.d.ts +0 -6
  94. package/dist/src/TreeChart.d.ts +0 -6
  95. package/dist/src/base/createBaseChart.d.ts +0 -3
  96. package/dist/src/base/createBasePlugin.d.ts +0 -3
  97. package/dist/src/base/validators/chartOptionsValidator.d.ts +0 -3
  98. package/dist/src/base/validators/chartParamsValidator.d.ts +0 -3
  99. package/dist/src/base/validators/elementValidator.d.ts +0 -3
  100. package/dist/src/base/validators/pluginsValidator.d.ts +0 -3
  101. package/dist/src/defaults.d.ts +0 -25
  102. package/dist/src/defineGridPlugin.d.ts +0 -1
  103. package/dist/src/defineMultiGridPlugin.d.ts +0 -1
  104. package/dist/src/defineMultiValuePlugin.d.ts +0 -1
  105. package/dist/src/defineNoneDataPlugin.d.ts +0 -1
  106. package/dist/src/defineRelationshipPlugin.d.ts +0 -1
  107. package/dist/src/defineSeriesPlugin.d.ts +0 -1
  108. package/dist/src/defineTreePlugin.d.ts +0 -1
  109. package/dist/src/grid/computedDataFn.d.ts +0 -4
  110. package/dist/src/grid/contextObserverCallback.d.ts +0 -3
  111. package/dist/src/grid/dataFormatterValidator.d.ts +0 -3
  112. package/dist/src/grid/dataValidator.d.ts +0 -3
  113. package/dist/src/grid/gridObservables.d.ts +0 -64
  114. package/dist/src/multiGrid/computedDataFn.d.ts +0 -3
  115. package/dist/src/multiGrid/contextObserverCallback.d.ts +0 -3
  116. package/dist/src/multiGrid/dataFormatterValidator.d.ts +0 -3
  117. package/dist/src/multiGrid/dataValidator.d.ts +0 -3
  118. package/dist/src/multiGrid/multiGridObservables.d.ts +0 -16
  119. package/dist/src/multiValue/computedDataFn.d.ts +0 -3
  120. package/dist/src/multiValue/contextObserverCallback.d.ts +0 -3
  121. package/dist/src/multiValue/dataFormatterValidator.d.ts +0 -3
  122. package/dist/src/multiValue/dataValidator.d.ts +0 -3
  123. package/dist/src/multiValue/multiValueObservables.d.ts +0 -130
  124. package/dist/src/relationship/computedDataFn.d.ts +0 -3
  125. package/dist/src/relationship/contextObserverCallback.d.ts +0 -3
  126. package/dist/src/relationship/dataFormatterValidator.d.ts +0 -3
  127. package/dist/src/relationship/dataValidator.d.ts +0 -3
  128. package/dist/src/relationship/relationshipObservables.d.ts +0 -13
  129. package/dist/src/series/computedDataFn.d.ts +0 -3
  130. package/dist/src/series/contextObserverCallback.d.ts +0 -3
  131. package/dist/src/series/dataFormatterValidator.d.ts +0 -3
  132. package/dist/src/series/dataValidator.d.ts +0 -3
  133. package/dist/src/series/seriesObservables.d.ts +0 -37
  134. package/dist/src/tree/computedDataFn.d.ts +0 -3
  135. package/dist/src/tree/contextObserverCallback.d.ts +0 -3
  136. package/dist/src/tree/dataFormatterValidator.d.ts +0 -3
  137. package/dist/src/tree/dataValidator.d.ts +0 -3
  138. package/dist/src/tree/treeObservables.d.ts +0 -10
  139. package/dist/src/utils/d3Scale.d.ts +0 -28
  140. package/lib/core-types.ts +0 -7
  141. package/src/AbstractChart.ts +0 -57
  142. package/src/GridChart.ts +0 -25
  143. package/src/MultiGridChart.ts +0 -25
  144. package/src/MultiValueChart.ts +0 -25
  145. package/src/RelationshipChart.ts +0 -25
  146. package/src/SeriesChart.ts +0 -25
  147. package/src/TreeChart.ts +0 -25
  148. package/src/base/createBaseChart.ts +0 -524
  149. package/src/base/createBasePlugin.ts +0 -154
  150. package/src/base/validators/chartOptionsValidator.ts +0 -24
  151. package/src/base/validators/chartParamsValidator.ts +0 -134
  152. package/src/base/validators/elementValidator.ts +0 -14
  153. package/src/base/validators/pluginsValidator.ts +0 -15
  154. package/src/defaults.ts +0 -284
  155. package/src/defineGridPlugin.ts +0 -3
  156. package/src/defineMultiGridPlugin.ts +0 -3
  157. package/src/defineMultiValuePlugin.ts +0 -3
  158. package/src/defineNoneDataPlugin.ts +0 -4
  159. package/src/defineRelationshipPlugin.ts +0 -3
  160. package/src/defineSeriesPlugin.ts +0 -3
  161. package/src/defineTreePlugin.ts +0 -3
  162. package/src/grid/computedDataFn.ts +0 -129
  163. package/src/grid/contextObserverCallback.ts +0 -209
  164. package/src/grid/dataFormatterValidator.ts +0 -126
  165. package/src/grid/dataValidator.ts +0 -13
  166. package/src/grid/gridObservables.ts +0 -699
  167. package/src/multiGrid/computedDataFn.ts +0 -123
  168. package/src/multiGrid/contextObserverCallback.ts +0 -109
  169. package/src/multiGrid/dataFormatterValidator.ts +0 -121
  170. package/src/multiGrid/dataValidator.ts +0 -13
  171. package/src/multiGrid/multiGridObservables.ts +0 -367
  172. package/src/multiValue/computedDataFn.ts +0 -113
  173. package/src/multiValue/contextObserverCallback.ts +0 -328
  174. package/src/multiValue/dataFormatterValidator.ts +0 -95
  175. package/src/multiValue/dataValidator.ts +0 -13
  176. package/src/multiValue/multiValueObservables.ts +0 -865
  177. package/src/relationship/computedDataFn.ts +0 -159
  178. package/src/relationship/contextObserverCallback.ts +0 -80
  179. package/src/relationship/dataFormatterValidator.ts +0 -14
  180. package/src/relationship/dataValidator.ts +0 -14
  181. package/src/relationship/relationshipObservables.ts +0 -85
  182. package/src/series/computedDataFn.ts +0 -88
  183. package/src/series/contextObserverCallback.ts +0 -132
  184. package/src/series/dataFormatterValidator.ts +0 -47
  185. package/src/series/dataValidator.ts +0 -13
  186. package/src/series/seriesObservables.ts +0 -210
  187. package/src/tree/computedDataFn.ts +0 -129
  188. package/src/tree/contextObserverCallback.ts +0 -58
  189. package/src/tree/dataFormatterValidator.ts +0 -14
  190. package/src/tree/dataValidator.ts +0 -14
  191. package/src/tree/treeObservables.ts +0 -106
  192. package/src/utils/d3Scale.ts +0 -198
  193. package/tsconfig.base.json +0 -14
  194. package/tsconfig.json +0 -3
  195. package/vite-env.d.ts +0 -7
  196. package/vite.config.js +0 -23
@@ -1,210 +0,0 @@
1
- import {
2
- combineLatest,
3
- distinctUntilChanged,
4
- filter,
5
- map,
6
- merge,
7
- takeUntil,
8
- shareReplay,
9
- switchMap,
10
- Subject,
11
- Observable } from 'rxjs'
12
- import type {
13
- ChartParams,
14
- ComputedDatumSeries,
15
- ComputedDataTypeMap,
16
- DataFormatterTypeMap,
17
- ContainerPosition,
18
- Layout } from '../../lib/core-types'
19
- import { calcContainerPosition } from '../utils/orbchartsUtils'
20
-
21
- export const datumLabelsObservable = ({ computedData$ }: { computedData$: Observable<ComputedDataTypeMap<'series'>> }) => {
22
- const DatumLabels = new Set<string>()
23
- return computedData$.pipe(
24
- map(data => {
25
- data.forEach(series => {
26
- series.forEach(datum => {
27
- DatumLabels.add(datum.label)
28
- })
29
- })
30
- return Array.from(DatumLabels)
31
- }),
32
- )
33
- }
34
-
35
- export const separateSeriesObservable = ({ fullDataFormatter$ }: { fullDataFormatter$: Observable<DataFormatterTypeMap<'series'>> }) => {
36
- return fullDataFormatter$.pipe(
37
- map(data => data.separateSeries),
38
- distinctUntilChanged(),
39
- )
40
- }
41
-
42
- export const separateLabelObservable = ({ fullDataFormatter$ }: { fullDataFormatter$: Observable<DataFormatterTypeMap<'series'>> }) => {
43
- return fullDataFormatter$.pipe(
44
- map(data => data.separateLabel),
45
- distinctUntilChanged(),
46
- )
47
- }
48
-
49
- export const sumSeriesObservable = ({ fullDataFormatter$ }: { fullDataFormatter$: Observable<DataFormatterTypeMap<'series'>> }) => {
50
- return fullDataFormatter$.pipe(
51
- map(data => data.sumSeries),
52
- distinctUntilChanged(),
53
- )
54
- }
55
-
56
- export const seriesLabelsObservable = ({ computedData$ }: { computedData$: Observable<ComputedDataTypeMap<'series'>> }) => {
57
- return computedData$.pipe(
58
- map(data => {
59
- return data
60
- .filter(series => series.length)
61
- .map(series => {
62
- return series[0].seriesLabel
63
- })
64
- }),
65
- distinctUntilChanged((a, b) => {
66
- return JSON.stringify(a) === JSON.stringify(b)
67
- }),
68
- )
69
- }
70
-
71
- export const seriesVisibleComputedDataObservable = ({ computedData$ }: { computedData$: Observable<ComputedDataTypeMap<'series'>> }) => {
72
- return computedData$.pipe(
73
- map(data => {
74
- return data.map(series => {
75
- return series.filter(datum => datum.visible != false)
76
- })
77
- })
78
- )
79
- }
80
-
81
- export const seriesComputedSortedDataObservable = ({ computedData$, separateSeries$, separateLabel$, sumSeries$, datumLabels$ }: {
82
- computedData$: Observable<ComputedDataTypeMap<'series'>>,
83
- separateSeries$: Observable<boolean>,
84
- separateLabel$: Observable<boolean>,
85
- sumSeries$: Observable<boolean>,
86
- datumLabels$: Observable<string[]>
87
- }) => {
88
- return combineLatest({
89
- computedData: computedData$,
90
- separateSeries: separateSeries$,
91
- separateLabel: separateLabel$,
92
- sumSeries: sumSeries$,
93
- datumLabels: datumLabels$,
94
- }).pipe(
95
- switchMap(async (d) => d),
96
- map(data => {
97
-
98
- // sum series
99
- const sumData: ComputedDatumSeries[][] = data.sumSeries == true
100
- ? data.computedData.map(d => {
101
- return [
102
- // 加總為一筆資料
103
- d.reduce((acc, current) => {
104
- if (acc == null) {
105
- // * 取得第一筆資料
106
- return current
107
- }
108
- // 加總 value
109
- acc.value = acc.value + current.value
110
- return acc
111
- }, null)
112
- ]
113
- })
114
- : data.computedData
115
-
116
- // separate series
117
- const separateSeriesData: ComputedDatumSeries[][] = data.separateSeries == true
118
- // 有拆分的話每個series為一組
119
- ? sumData
120
- // 無拆分的話所有資料為一組
121
- : [sumData.flat()]
122
-
123
- // separate label
124
- const separateLabelData: ComputedDatumSeries[][] = data.separateLabel == true
125
- // 有拆分的話每個label為一組
126
- ? (() => {
127
- // datumLabel 的 index 對應
128
- const datumLabelIndexMap = data.datumLabels.reduce((acc, datumLabel, index) => {
129
- acc[datumLabel] = index
130
- return acc
131
- }, {} as { [key: string]: number })
132
-
133
- return separateSeriesData
134
- .map(series => {
135
- return series.reduce((acc, current) => {
136
- const index = datumLabelIndexMap[current.label]
137
- if (acc[index] == null) {
138
- acc[index] = []
139
- }
140
- acc[index].push(current)
141
- return acc
142
- }, [] as ComputedDatumSeries[][])
143
- })
144
- .flat()
145
- })()
146
- // 無拆分
147
- : separateSeriesData
148
-
149
- return data.separateSeries == true && data.separateLabel == true
150
- // 全部拆分時全部一起排序
151
- ? separateLabelData
152
- .sort((a, b) => a[0].seq - b[0].seq)
153
- // 依各個 container 排序
154
- : separateLabelData
155
- .map(series => {
156
- return series.sort((a, b) => a.seq - b.seq)
157
- })
158
- })
159
- )
160
- }
161
-
162
-
163
- // 所有container位置(對應series)
164
- export const seriesContainerPositionObservable = ({ computedSortedData$, fullDataFormatter$, layout$ }: {
165
- computedSortedData$: Observable<ComputedDatumSeries[][]>
166
- fullDataFormatter$: Observable<DataFormatterTypeMap<'series'>>
167
- layout$: Observable<Layout>
168
- }): Observable<ContainerPosition[]> => {
169
-
170
- const gridContainerPosition$ = combineLatest({
171
- computedSortedData: computedSortedData$,
172
- fullDataFormatter: fullDataFormatter$,
173
- layout: layout$,
174
- }).pipe(
175
- switchMap(async (d) => d),
176
- map(data => {
177
-
178
- // 已分類資料的分類數量
179
- const amount = data.computedSortedData.length
180
-
181
- return calcContainerPosition(data.layout, data.fullDataFormatter.container, amount)
182
- })
183
- )
184
-
185
- return gridContainerPosition$
186
- }
187
-
188
- export const datumContainerPositionMapObservable = ({ seriesContainerPosition$, computedSortedData$ }: {
189
- seriesContainerPosition$: Observable<ContainerPosition[]>
190
- computedSortedData$: Observable<ComputedDatumSeries[][]>
191
- }) => {
192
- return combineLatest({
193
- seriesContainerPosition: seriesContainerPosition$,
194
- computedSortedData: computedSortedData$,
195
- }).pipe(
196
- switchMap(async (d) => d),
197
- map(data => {
198
- return new Map<string, ContainerPosition>(
199
- data.computedSortedData
200
- .map((series, seriesIndex) => {
201
- return series.map(datum => {
202
- const m: [string, ContainerPosition] = [datum.id, data.seriesContainerPosition[seriesIndex]]
203
- return m
204
- })
205
- })
206
- .flat()
207
- )
208
- })
209
- )
210
- }
@@ -1,129 +0,0 @@
1
- import type { DataTree, DataTreeObj, DataTreeDatum, ComputedDataFn, ComputedDataTree } from '../../lib/core-types'
2
- import { isPlainObject } from '../utils/commonUtils'
3
- import { seriesColorPredicate, createDefaultCategoryLabel } from '../utils/orbchartsUtils'
4
-
5
- export const computedDataFn: ComputedDataFn<'tree'> = (context) => {
6
- const { data = [], dataFormatter, chartParams } = context
7
-
8
- const defaultCategoryLabel = createDefaultCategoryLabel()
9
-
10
- // <categoryLabel, categoryIndex>
11
- const CategoryIndexMap = new Map<string, number>(
12
- dataFormatter.categoryLabels.map((label, index) => [label, index])
13
- )
14
-
15
- let computedBranchData: ComputedDataTree = {
16
- id: '',
17
- index: 0,
18
- label: '',
19
- description: '',
20
- categoryIndex: -1,
21
- categoryLabel: '',
22
- color: '',
23
- visible: true,
24
- // tooltipContent: '',
25
- data: {},
26
- value: 0,
27
- level: 0,
28
- seq: 0,
29
- children: []
30
- }
31
-
32
- try {
33
- // 建立樹狀結構資料
34
- const dataTreeObj: DataTreeObj = (function () {
35
- if (isPlainObject(data) === true) {
36
- // 原本就是樹狀結構則直接複製
37
- // return structuredClone(data) as DataTreeObj
38
- return JSON.parse(JSON.stringify(data)) as DataTreeObj
39
- } else if (Array.isArray(data) === false) {
40
- return {
41
- id: ''
42
- }
43
- }
44
- // -- 陣列格式轉物件 --
45
- // let rootId = ''
46
- let root: DataTreeDatum | undefined = undefined
47
- // const DataMap: Map<string, DataTreeDatum> = new Map()
48
- const ChildrenMap: Map<string, DataTreeDatum[]> = new Map()
49
- ;(data as DataTreeDatum[]).forEach(d => {
50
- // DataMap.set(d.id, d)
51
-
52
- if (!d.parent) {
53
- // rootId = d.id
54
- root = d
55
- } else {
56
- const children: DataTreeDatum[] = ChildrenMap.get(d.parent) ?? []
57
- children.push(d)
58
- ChildrenMap.set(d.parent!, children)
59
- }
60
- })
61
-
62
- const createBranchData = (root: DataTreeDatum): DataTreeObj => {
63
- return {
64
- id: root.id,
65
- label: root.label,
66
- data: root.data,
67
- // tooltipContent: root.tooltipContent,
68
- value: root.value,
69
- categoryLabel: root.categoryLabel ?? defaultCategoryLabel,
70
- children: (ChildrenMap.get(root.id) ?? []).map(d => {
71
- // 遞迴
72
- return createBranchData(d)
73
- })
74
- }
75
- }
76
- if (root) {
77
- return createBranchData(root)
78
- } else {
79
- return {
80
- id: ''
81
- }
82
- }
83
- })()
84
-
85
- let index = 0
86
-
87
- const formatBranchData = (branch: DataTreeObj, level: number, seq: number): ComputedDataTree => {
88
- const childLayer = level + 1
89
- const categoryLabel: string = branch.categoryLabel ?? defaultCategoryLabel
90
- if (!CategoryIndexMap.has(categoryLabel)) {
91
- CategoryIndexMap.set(categoryLabel, CategoryIndexMap.size)
92
- }
93
- const categoryIndex = CategoryIndexMap.get(categoryLabel) ?? 0
94
-
95
- const currentIndex = index
96
- index++
97
- const formattedBranchData: ComputedDataTree = {
98
- id: branch.id,
99
- index: currentIndex,
100
- level,
101
- seq,
102
- label: branch.label ?? '',
103
- description: branch.description ?? '',
104
- categoryIndex,
105
- categoryLabel,
106
- color: seriesColorPredicate(categoryIndex, chartParams),
107
- data: branch.data ?? {},
108
- // tooltipContent: branch.tooltipContent ? branch.tooltipContent : dataFormatter.tooltipContentFormat(branch, level, seq, context),
109
- value: branch.value,
110
- visible: true, // 先給預設值
111
- children: (branch.children ?? []).map((d, i) => {
112
- // 遞迴
113
- return formatBranchData(d, childLayer, i)
114
- })
115
- }
116
-
117
- formattedBranchData.visible = dataFormatter.visibleFilter(formattedBranchData, context)
118
-
119
- return formattedBranchData
120
- }
121
- computedBranchData = formatBranchData(dataTreeObj, 0, 0)
122
- } catch (e) {
123
- // console.error(e)
124
- throw Error(e)
125
- }
126
-
127
- return computedBranchData
128
-
129
- }
@@ -1,58 +0,0 @@
1
- import { map, shareReplay } from 'rxjs'
2
- import type { ContextObserverCallback } from '../../lib/core-types'
3
- import { highlightObservable, categoryDataMapObservable, textSizePxObservable } from '../utils/observables'
4
- import {
5
- nodeListObservable,
6
- categoryLabelsObservable,
7
- treeVisibleComputedDataObservable
8
- } from './treeObservables'
9
-
10
- export const contextObserverCallback: ContextObserverCallback<'tree'> = ({ subject, observer }) => {
11
-
12
- const textSizePx$ = textSizePxObservable(observer.fullChartParams$).pipe(
13
- shareReplay(1)
14
- )
15
-
16
- const nodeList$ = nodeListObservable({
17
- computedData$: observer.computedData$
18
- }).pipe(
19
- shareReplay(1)
20
- )
21
-
22
- const treeHighlight$ = highlightObservable({
23
- datumList$: nodeList$,
24
- fullChartParams$: observer.fullChartParams$,
25
- event$: subject.event$
26
- }).pipe(
27
- shareReplay(1)
28
- )
29
-
30
- const CategoryDataMap$ = categoryDataMapObservable({
31
- datumList$: nodeList$
32
- }).pipe(
33
- shareReplay(1)
34
- )
35
-
36
- const categoryLabels$ = categoryLabelsObservable(CategoryDataMap$).pipe(
37
- shareReplay(1)
38
- )
39
-
40
- const visibleComputedData$ = treeVisibleComputedDataObservable({
41
- computedData$: observer.computedData$
42
- }).pipe(
43
- shareReplay(1)
44
- )
45
-
46
- return {
47
- fullParams$: observer.fullParams$,
48
- fullChartParams$: observer.fullChartParams$,
49
- fullDataFormatter$: observer.fullDataFormatter$,
50
- computedData$: observer.computedData$,
51
- layout$: observer.layout$,
52
- textSizePx$,
53
- treeHighlight$,
54
- categoryLabels$,
55
- CategoryDataMap$,
56
- visibleComputedData$
57
- }
58
- }
@@ -1,14 +0,0 @@
1
- import type { DataFormatterValidator, DataFormatterTypeMap } from '../../lib/core-types'
2
- import { validateColumns } from '../utils/validator'
3
-
4
- export const dataFormatterValidator: DataFormatterValidator<'tree'> = (dataFormatter: DataFormatterTypeMap<'tree'>) => {
5
- const result = validateColumns(dataFormatter, {
6
- visibleFilter: {
7
- toBeTypes: ['Function']
8
- },
9
- categoryLabels: {
10
- toBeTypes: ['string[]']
11
- }
12
- })
13
- return result
14
- }
@@ -1,14 +0,0 @@
1
- import type { DataValidator, DataTypeMap } from '../../lib/core-types'
2
- import { validateColumns } from '../utils/validator'
3
- import { isPlainObject } from '../utils'
4
-
5
- export const dataValidator: DataValidator<'tree'> = (data: DataTypeMap<'tree'>) => {
6
- const result = validateColumns({ data }, {
7
- data: {
8
- toBe: 'DataTreeObj | DataTreeDatum[]',
9
- // 畢免資料量過大檢查不完,不深度檢查
10
- test: (value) => (isPlainObject(value) && value.id !== undefined) || Array.isArray(value)
11
- }
12
- })
13
- return result
14
- }
@@ -1,106 +0,0 @@
1
- import {
2
- combineLatest,
3
- distinctUntilChanged,
4
- filter,
5
- map,
6
- merge,
7
- takeUntil,
8
- shareReplay,
9
- switchMap,
10
- Subject,
11
- Observable } from 'rxjs'
12
- import type {
13
- ChartParams,
14
- ComputedDataTree,
15
- ComputedDataTypeMap,
16
- DataFormatterTree } from '../../lib/core-types'
17
-
18
-
19
- // 所有節點list結構
20
- export const nodeListObservable = ({ computedData$ }: { computedData$: Observable<ComputedDataTree> }) => {
21
- return computedData$.pipe(
22
- map(data => {
23
- function setNodeList (accNodeList: ComputedDataTree[], branch: ComputedDataTree) {
24
- accNodeList.push(branch)
25
- if (branch.children) {
26
- branch.children.forEach(childBranch => {
27
- accNodeList = setNodeList(accNodeList, childBranch) // 遞迴子節點
28
- })
29
- }
30
- return accNodeList
31
- }
32
- return setNodeList([], data)
33
- })
34
- )
35
- }
36
-
37
- // export const categoryLabelsObservable = ({ nodeList$, fullDataFormatter$ }: {
38
- // nodeList$: Observable<ComputedDataTree[]>
39
- // fullDataFormatter$: Observable<DataFormatterTree>
40
- // }) => {
41
-
42
- // const categoryLabels$ = fullDataFormatter$.pipe(
43
- // map(d => d.categoryLabels),
44
- // distinctUntilChanged((a, b) => {
45
- // return JSON.stringify(a) === JSON.stringify(b)
46
- // }),
47
- // )
48
-
49
- // return combineLatest({
50
- // nodeList: nodeList$,
51
- // categoryLabels: categoryLabels$
52
- // }).pipe(
53
- // switchMap(async d => d),
54
- // map(data => {
55
- // const CurrentLabelSet = new Set(data.categoryLabels)
56
- // const ExistLabelSet = new Set(
57
- // data.nodeList.filter(node => node.visible).map(node => node.categoryLabel)
58
- // )
59
- // // 加入已存在的label(data.nodeList有,但是dataFormatter.categoryLabels沒有)
60
- // Array.from(ExistLabelSet).forEach(label => {
61
- // if (!CurrentLabelSet.has(label)) {
62
- // CurrentLabelSet.add(label)
63
- // }
64
- // })
65
- // // 移除不存在的label(dataFormatter.categoryLabels有,但是data.nodeList沒有)
66
- // Array.from(CurrentLabelSet).forEach(label => {
67
- // if (!ExistLabelSet.has(label)) {
68
- // ExistLabelSet.delete(label)
69
- // }
70
- // })
71
-
72
- // return Array.from(CurrentLabelSet)
73
- // }),
74
- // distinctUntilChanged((a, b) => {
75
- // return JSON.stringify(a) === JSON.stringify(b)
76
- // }),
77
- // )
78
- // }
79
-
80
- export const categoryLabelsObservable = (CategoryDataMap$: Observable<Map<string, ComputedDataTree[]>>) => {
81
- return CategoryDataMap$.pipe(
82
- map(data => {
83
- return Array.from(data.keys())
84
- }),
85
- distinctUntilChanged((a, b) => {
86
- return JSON.stringify(a) === JSON.stringify(b)
87
- }),
88
- )
89
- }
90
-
91
- // 所有可見的節點
92
- export const treeVisibleComputedDataObservable = ({ computedData$ }: { computedData$: Observable<ComputedDataTree> }) => {
93
- return computedData$.pipe(
94
- map(data => {
95
- function filterChildren (accTree: ComputedDataTree) {
96
- if (accTree.children) {
97
- accTree.children = accTree.children
98
- .filter(child => child.visible) // 篩選visible
99
- .map(child => filterChildren(child)) // 遞迴子節點
100
- }
101
- return accTree
102
- }
103
- return filterChildren(data)
104
- })
105
- )
106
- }