@orbcharts/plugin-basic 4.0.0-pre-alpha.0

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 (208) hide show
  1. package/LICENSE +201 -0
  2. package/dist/orbcharts-plugin-basic.es.js +25335 -0
  3. package/dist/orbcharts-plugin-basic.umd.js +341 -0
  4. package/dist/plugin-basic/src/baseLayers/BaseBars.d.ts +38 -0
  5. package/dist/plugin-basic/src/baseLayers/BaseBarsTriangle.d.ts +37 -0
  6. package/dist/plugin-basic/src/baseLayers/BaseCategoryAxis.d.ts +42 -0
  7. package/dist/plugin-basic/src/baseLayers/BaseDots.d.ts +38 -0
  8. package/dist/plugin-basic/src/baseLayers/BaseLegend.d.ts +31 -0
  9. package/dist/plugin-basic/src/baseLayers/BaseLineAreas.d.ts +36 -0
  10. package/dist/plugin-basic/src/baseLayers/BaseLines.d.ts +36 -0
  11. package/dist/plugin-basic/src/baseLayers/BaseStackedBars.d.ts +41 -0
  12. package/dist/plugin-basic/src/baseLayers/BaseTooltip.d.ts +47 -0
  13. package/dist/plugin-basic/src/baseLayers/BaseValueAxis.d.ts +38 -0
  14. package/dist/plugin-basic/src/baseLayers/BaseXAxis.d.ts +25 -0
  15. package/dist/plugin-basic/src/baseLayers/BaseXZoom.d.ts +22 -0
  16. package/dist/plugin-basic/src/baseLayers/BaseYAxis.d.ts +23 -0
  17. package/dist/plugin-basic/src/baseLayers/types.d.ts +171 -0
  18. package/dist/plugin-basic/src/const/layerIndex.d.ts +10 -0
  19. package/dist/plugin-basic/src/const/sharedPluginParams.d.ts +6 -0
  20. package/dist/plugin-basic/src/index.d.ts +2 -0
  21. package/dist/plugin-basic/src/plugins/CompositionPlot/CompositionPlot.d.ts +22 -0
  22. package/dist/plugin-basic/src/plugins/CompositionPlot/contextObservables.d.ts +40 -0
  23. package/dist/plugin-basic/src/plugins/CompositionPlot/defaults.d.ts +10 -0
  24. package/dist/plugin-basic/src/plugins/CompositionPlot/index.d.ts +3 -0
  25. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Bubbles.d.ts +16 -0
  26. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Indicator.d.ts +0 -0
  27. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Pie.d.ts +16 -0
  28. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/PieEventTexts.d.ts +16 -0
  29. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/PieLabels.d.ts +16 -0
  30. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Rose.d.ts +16 -0
  31. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/RoseLabels.d.ts +16 -0
  32. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Waffle.d.ts +0 -0
  33. package/dist/plugin-basic/src/plugins/CompositionPlot/types.d.ts +110 -0
  34. package/dist/plugin-basic/src/plugins/CompositionPlot/utils.d.ts +19 -0
  35. package/dist/plugin-basic/src/plugins/HierarchyPlot/HierarchyPlot.d.ts +22 -0
  36. package/dist/plugin-basic/src/plugins/HierarchyPlot/contextObservables.d.ts +16 -0
  37. package/dist/plugin-basic/src/plugins/HierarchyPlot/defaults.d.ts +4 -0
  38. package/dist/plugin-basic/src/plugins/HierarchyPlot/index.d.ts +3 -0
  39. package/dist/plugin-basic/src/plugins/HierarchyPlot/layers/TreeMap.d.ts +16 -0
  40. package/dist/plugin-basic/src/plugins/HierarchyPlot/types.d.ts +29 -0
  41. package/dist/plugin-basic/src/plugins/Legend/Legend.d.ts +22 -0
  42. package/dist/plugin-basic/src/plugins/Legend/contextObservables.d.ts +9 -0
  43. package/dist/plugin-basic/src/plugins/Legend/defaults.d.ts +4 -0
  44. package/dist/plugin-basic/src/plugins/Legend/index.d.ts +3 -0
  45. package/dist/plugin-basic/src/plugins/Legend/layers/Legend.d.ts +16 -0
  46. package/dist/plugin-basic/src/plugins/Legend/types.d.ts +31 -0
  47. package/dist/plugin-basic/src/plugins/Legend/utils.d.ts +19 -0
  48. package/dist/plugin-basic/src/plugins/NetworkPlot/NetworkPlot.d.ts +22 -0
  49. package/dist/plugin-basic/src/plugins/NetworkPlot/contextObservables.d.ts +19 -0
  50. package/dist/plugin-basic/src/plugins/NetworkPlot/defaults.d.ts +5 -0
  51. package/dist/plugin-basic/src/plugins/NetworkPlot/index.d.ts +3 -0
  52. package/dist/plugin-basic/src/plugins/NetworkPlot/layers/ForceDirected.d.ts +16 -0
  53. package/dist/plugin-basic/src/plugins/NetworkPlot/layers/ForceDirectedBubbles.d.ts +16 -0
  54. package/dist/plugin-basic/src/plugins/NetworkPlot/types.d.ts +117 -0
  55. package/dist/plugin-basic/src/plugins/ScatterPlot/ScatterPlot.d.ts +22 -0
  56. package/dist/plugin-basic/src/plugins/ScatterPlot/contextObservables.d.ts +140 -0
  57. package/dist/plugin-basic/src/plugins/ScatterPlot/defaults.d.ts +8 -0
  58. package/dist/plugin-basic/src/plugins/ScatterPlot/index.d.ts +3 -0
  59. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/Scatter.d.ts +16 -0
  60. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/ScatterBubbles.d.ts +16 -0
  61. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/XYAux.d.ts +16 -0
  62. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/XYAxes.d.ts +16 -0
  63. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/XZoom.d.ts +16 -0
  64. package/dist/plugin-basic/src/plugins/ScatterPlot/types.d.ts +146 -0
  65. package/dist/plugin-basic/src/plugins/SeriesPlot/SeriesPlot.d.ts +22 -0
  66. package/dist/plugin-basic/src/plugins/SeriesPlot/contextObservables.d.ts +77 -0
  67. package/dist/plugin-basic/src/plugins/SeriesPlot/defaults.d.ts +15 -0
  68. package/dist/plugin-basic/src/plugins/SeriesPlot/index.d.ts +3 -0
  69. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/Bars.d.ts +16 -0
  70. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/BarsPN.d.ts +16 -0
  71. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/BarsTriangle.d.ts +16 -0
  72. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/CategoryAux.d.ts +16 -0
  73. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/CategoryAxis.d.ts +16 -0
  74. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/CategoryZoom.d.ts +16 -0
  75. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/Dots.d.ts +16 -0
  76. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/LineAreas.d.ts +16 -0
  77. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/Lines.d.ts +16 -0
  78. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/StackedBars.d.ts +16 -0
  79. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/StackedValueAxis.d.ts +16 -0
  80. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/ValueAxis.d.ts +16 -0
  81. package/dist/plugin-basic/src/plugins/SeriesPlot/types.d.ts +140 -0
  82. package/dist/plugin-basic/src/plugins/Tooltip/Tooltip.d.ts +22 -0
  83. package/dist/plugin-basic/src/plugins/Tooltip/contextObservables.d.ts +9 -0
  84. package/dist/plugin-basic/src/plugins/Tooltip/defaults.d.ts +4 -0
  85. package/dist/plugin-basic/src/plugins/Tooltip/index.d.ts +3 -0
  86. package/dist/plugin-basic/src/plugins/Tooltip/layers/Tooltip.d.ts +16 -0
  87. package/dist/plugin-basic/src/plugins/Tooltip/types.d.ts +35 -0
  88. package/dist/plugin-basic/src/plugins/Tooltip/utils.d.ts +19 -0
  89. package/dist/plugin-basic/src/plugins/index.d.ts +7 -0
  90. package/dist/plugin-basic/src/types/BaseLayer.d.ts +3 -0
  91. package/dist/plugin-basic/src/types/Common.d.ts +14 -0
  92. package/dist/plugin-basic/src/types/ComputedData.d.ts +27 -0
  93. package/dist/plugin-basic/src/types/PluginParams.d.ts +66 -0
  94. package/dist/plugin-basic/src/types/index.d.ts +3 -0
  95. package/dist/plugin-basic/src/utils/commonUtils.d.ts +3 -0
  96. package/dist/plugin-basic/src/utils/d3Graphics.d.ts +24 -0
  97. package/dist/plugin-basic/src/utils/d3Scale.d.ts +28 -0
  98. package/dist/plugin-basic/src/utils/d3Utils.d.ts +14 -0
  99. package/dist/plugin-basic/src/utils/graphObservables.d.ts +0 -0
  100. package/dist/plugin-basic/src/utils/gridObservables.d.ts +51 -0
  101. package/dist/plugin-basic/src/utils/multivariateObservables.d.ts +74 -0
  102. package/dist/plugin-basic/src/utils/observables.d.ts +34 -0
  103. package/dist/plugin-basic/src/utils/orbchartsUtils.d.ts +26 -0
  104. package/dist/plugin-basic/src/utils/seriesObservables.d.ts +22 -0
  105. package/dist/plugin-basic/vite.config.d.ts +2 -0
  106. package/dist/src/index.d.ts +1 -0
  107. package/package.json +62 -0
  108. package/src/baseLayers/BaseBars.ts +783 -0
  109. package/src/baseLayers/BaseBarsTriangle.ts +692 -0
  110. package/src/baseLayers/BaseCategoryAxis.ts +708 -0
  111. package/src/baseLayers/BaseDots.ts +495 -0
  112. package/src/baseLayers/BaseLegend.ts +684 -0
  113. package/src/baseLayers/BaseLineAreas.ts +644 -0
  114. package/src/baseLayers/BaseLines.ts +721 -0
  115. package/src/baseLayers/BaseStackedBars.ts +818 -0
  116. package/src/baseLayers/BaseTooltip.ts +435 -0
  117. package/src/baseLayers/BaseValueAxis.ts +612 -0
  118. package/src/baseLayers/BaseXAxis.ts +412 -0
  119. package/src/baseLayers/BaseXZoom.ts +250 -0
  120. package/src/baseLayers/BaseYAxis.ts +371 -0
  121. package/src/baseLayers/types.ts +174 -0
  122. package/src/const/layerIndex.ts +36 -0
  123. package/src/const/sharedPluginParams.ts +29 -0
  124. package/src/index.ts +3 -0
  125. package/src/plugins/CompositionPlot/CompositionPlot.ts +308 -0
  126. package/src/plugins/CompositionPlot/contextObservables.ts +251 -0
  127. package/src/plugins/CompositionPlot/defaults.ts +162 -0
  128. package/src/plugins/CompositionPlot/index.ts +3 -0
  129. package/src/plugins/CompositionPlot/layers/Bubbles.ts +808 -0
  130. package/src/plugins/CompositionPlot/layers/Indicator.ts +0 -0
  131. package/src/plugins/CompositionPlot/layers/Pie.ts +776 -0
  132. package/src/plugins/CompositionPlot/layers/PieEventTexts.ts +326 -0
  133. package/src/plugins/CompositionPlot/layers/PieLabels.ts +651 -0
  134. package/src/plugins/CompositionPlot/layers/Rose.ts +546 -0
  135. package/src/plugins/CompositionPlot/layers/RoseLabels.ts +616 -0
  136. package/src/plugins/CompositionPlot/layers/Waffle.ts +0 -0
  137. package/src/plugins/CompositionPlot/types.ts +129 -0
  138. package/src/plugins/CompositionPlot/utils.ts +53 -0
  139. package/src/plugins/HierarchyPlot/HierarchyPlot.ts +190 -0
  140. package/src/plugins/HierarchyPlot/contextObservables.ts +136 -0
  141. package/src/plugins/HierarchyPlot/defaults.ts +31 -0
  142. package/src/plugins/HierarchyPlot/index.ts +3 -0
  143. package/src/plugins/HierarchyPlot/layers/TreeMap.ts +371 -0
  144. package/src/plugins/HierarchyPlot/types.ts +36 -0
  145. package/src/plugins/Legend/Legend.ts +151 -0
  146. package/src/plugins/Legend/contextObservables.ts +55 -0
  147. package/src/plugins/Legend/defaults.ts +37 -0
  148. package/src/plugins/Legend/index.ts +3 -0
  149. package/src/plugins/Legend/layers/Legend.ts +114 -0
  150. package/src/plugins/Legend/types.ts +45 -0
  151. package/src/plugins/Legend/utils.ts +53 -0
  152. package/src/plugins/NetworkPlot/NetworkPlot.ts +228 -0
  153. package/src/plugins/NetworkPlot/contextObservables.ts +123 -0
  154. package/src/plugins/NetworkPlot/defaults.ts +147 -0
  155. package/src/plugins/NetworkPlot/index.ts +3 -0
  156. package/src/plugins/NetworkPlot/layers/ForceDirected.ts +1048 -0
  157. package/src/plugins/NetworkPlot/layers/ForceDirectedBubbles.ts +1318 -0
  158. package/src/plugins/NetworkPlot/types.ts +146 -0
  159. package/src/plugins/ScatterPlot/ScatterPlot.ts +569 -0
  160. package/src/plugins/ScatterPlot/contextObservables.ts +901 -0
  161. package/src/plugins/ScatterPlot/defaults.ts +212 -0
  162. package/src/plugins/ScatterPlot/index.ts +3 -0
  163. package/src/plugins/ScatterPlot/layers/Scatter.ts +518 -0
  164. package/src/plugins/ScatterPlot/layers/ScatterBubbles.ts +670 -0
  165. package/src/plugins/ScatterPlot/layers/XYAux.ts +686 -0
  166. package/src/plugins/ScatterPlot/layers/XYAxes.ts +205 -0
  167. package/src/plugins/ScatterPlot/layers/XZoom.ts +48 -0
  168. package/src/plugins/ScatterPlot/types.ts +179 -0
  169. package/src/plugins/SeriesPlot/SeriesPlot.ts +494 -0
  170. package/src/plugins/SeriesPlot/contextObservables.ts +726 -0
  171. package/src/plugins/SeriesPlot/defaults.ts +142 -0
  172. package/src/plugins/SeriesPlot/index.ts +3 -0
  173. package/src/plugins/SeriesPlot/layers/Bars.ts +84 -0
  174. package/src/plugins/SeriesPlot/layers/BarsPN.ts +85 -0
  175. package/src/plugins/SeriesPlot/layers/BarsTriangle.ts +89 -0
  176. package/src/plugins/SeriesPlot/layers/CategoryAux.ts +1131 -0
  177. package/src/plugins/SeriesPlot/layers/CategoryAxis.ts +92 -0
  178. package/src/plugins/SeriesPlot/layers/CategoryZoom.ts +233 -0
  179. package/src/plugins/SeriesPlot/layers/Dots.ts +91 -0
  180. package/src/plugins/SeriesPlot/layers/LineAreas.ts +82 -0
  181. package/src/plugins/SeriesPlot/layers/Lines.ts +75 -0
  182. package/src/plugins/SeriesPlot/layers/StackedBars.ts +85 -0
  183. package/src/plugins/SeriesPlot/layers/StackedValueAxis.ts +111 -0
  184. package/src/plugins/SeriesPlot/layers/ValueAxis.ts +111 -0
  185. package/src/plugins/SeriesPlot/types.ts +201 -0
  186. package/src/plugins/Tooltip/Tooltip.ts +159 -0
  187. package/src/plugins/Tooltip/contextObservables.ts +55 -0
  188. package/src/plugins/Tooltip/defaults.ts +458 -0
  189. package/src/plugins/Tooltip/index.ts +3 -0
  190. package/src/plugins/Tooltip/layers/Tooltip.ts +90 -0
  191. package/src/plugins/Tooltip/types.ts +55 -0
  192. package/src/plugins/Tooltip/utils.ts +53 -0
  193. package/src/plugins/index.ts +8 -0
  194. package/src/types/BaseLayer.ts +3 -0
  195. package/src/types/Common.ts +20 -0
  196. package/src/types/ComputedData.ts +55 -0
  197. package/src/types/PluginParams.ts +81 -0
  198. package/src/types/index.ts +3 -0
  199. package/src/utils/commonUtils.ts +31 -0
  200. package/src/utils/d3Graphics.ts +177 -0
  201. package/src/utils/d3Scale.ts +198 -0
  202. package/src/utils/d3Utils.ts +92 -0
  203. package/src/utils/graphObservables.ts +0 -0
  204. package/src/utils/gridObservables.ts +637 -0
  205. package/src/utils/multivariateObservables.ts +790 -0
  206. package/src/utils/observables.ts +357 -0
  207. package/src/utils/orbchartsUtils.ts +335 -0
  208. package/src/utils/seriesObservables.ts +172 -0
@@ -0,0 +1,818 @@
1
+ import * as d3 from 'd3'
2
+ import {
3
+ iif,
4
+ combineLatest,
5
+ map,
6
+ switchMap,
7
+ takeUntil,
8
+ distinctUntilChanged,
9
+ Observable,
10
+ Subject } from 'rxjs'
11
+ import type { BaseLayerFn } from '../types/BaseLayer'
12
+ import type {
13
+ EventData,
14
+ } from '@orbcharts/core'
15
+ import type {
16
+ ComputedDatumGrid,
17
+ ComputedData,
18
+ ContainerPositionScaled,
19
+ Layout,
20
+ TransformData,
21
+ GraphicStyles} from '../types'
22
+ import type { ComputedLayoutDatumGrid, ComputedAxesDataGrid, SeriesPlotPluginParams } from '../plugins/SeriesPlot/types'
23
+ import { getD3TransitionEase } from '../utils/d3Utils'
24
+ import { createClassName, createUniID } from '../utils/orbchartsUtils'
25
+ import { gridSelectionsObservable } from '../utils/gridObservables'
26
+ import { shareReplay } from 'rxjs/operators'
27
+
28
+ export interface BaseStackedBarsParams {
29
+ barWidth: number;
30
+ barGroupPadding: number;
31
+ barRadius: number | boolean;
32
+ }
33
+
34
+ interface BaseStackedBarsContext {
35
+ selection: d3.Selection<any, unknown, any, unknown>
36
+ pluginName: string
37
+ layerName: string
38
+ computedData$: Observable<ComputedData<'grid'>>
39
+ computedAxesData$: Observable<ComputedAxesDataGrid>
40
+ visibleComputedData$: Observable<ComputedDatumGrid[][]>
41
+ visibleComputedAxesData$: Observable<ComputedAxesDataGrid>
42
+ filteredMinMaxValue$: Observable<[number, number]>
43
+ filteredStackedMinMaxValue$: Observable<[number, number]>
44
+ seriesLabels$: Observable<string[]>
45
+ SeriesDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
46
+ CategoryDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
47
+ baseStackedBarParams$: Observable<BaseStackedBarsParams>
48
+ pluginParams$: Observable<SeriesPlotPluginParams>
49
+ styles$: Observable<GraphicStyles>
50
+ gridAxesTransform$: Observable<TransformData>
51
+ gridGraphicTransform$: Observable<TransformData>
52
+ gridGraphicReverseScale$: Observable<[number, number][]>
53
+ gridAxesSize$: Observable<{
54
+ width: number;
55
+ height: number;
56
+ }>
57
+ gridHighlight$: Observable<ComputedDatumGrid[]>
58
+ gridContainerPosition$: Observable<ContainerPositionScaled[]>
59
+ isSeriesSeprate$: Observable<boolean>
60
+ eventTrigger$: Subject<EventData<'grid'>>
61
+ }
62
+
63
+
64
+ interface GraphicDatum extends ComputedLayoutDatumGrid {
65
+ _barStartY: number // bar的起點y座標
66
+ _barHeight: number // bar的高度
67
+ }
68
+
69
+ interface RenderBarParams {
70
+ graphicGSelection: d3.Selection<SVGGElement, unknown, any, any>
71
+ rectClassName: string
72
+ barData: GraphicDatum[][]
73
+ zeroY: number
74
+ // groupLabels: string[]
75
+ // barScale: d3.ScalePoint<string>
76
+ // params: BaseStackedBarsParams
77
+ styles: GraphicStyles
78
+ barWidth: number
79
+ transformedBarRadius: [number, number][]
80
+ delayGroup: number
81
+ transitionItem: number
82
+ // isSeriesSeprate: boolean
83
+ }
84
+
85
+ type ClipPathDatum = {
86
+ id: string;
87
+ // x: number;
88
+ // y: number;
89
+ width: number;
90
+ height: number;
91
+ }
92
+
93
+ // const pluginName = 'StackedBars'
94
+ // const rectClassName = createClassName(pluginName, 'rect')
95
+ // group的delay在動畫中的佔比(剩餘部份的時間為圖形本身的動畫時間,因為delay時間和最後一個group的動畫時間加總為1)
96
+ const groupDelayProportionOfDuration = 0.3
97
+
98
+ function calcBarWidth ({ axisWidth, groupAmount, barGroupPadding = 0 }: {
99
+ axisWidth: number
100
+ groupAmount: number
101
+ barGroupPadding: number
102
+ }) {
103
+ const eachGroupWidth = groupAmount > 1 // 等於 1 時會算出 Infinity
104
+ ? axisWidth / (groupAmount - 1) // -1是因為要扣掉兩側的padding
105
+ : axisWidth
106
+ const width = eachGroupWidth - barGroupPadding
107
+ return width > 1 ? width : 1
108
+
109
+ }
110
+
111
+ // function makeBarScale (barWidth: number, seriesLabels: string[], params: StackedBarsParams) {
112
+ // const barHalfWidth = barWidth! / 2
113
+ // const barGroupWidth = barWidth * seriesLabels.length + params.barPadding! * seriesLabels.length
114
+ // return d3.scalePoint()
115
+ // .domain(seriesLabels)
116
+ // .range([-barGroupWidth / 2 + barHalfWidth, barGroupWidth / 2 - barHalfWidth])
117
+ // }
118
+
119
+ function calcDelayGroup (barGroupAmount: number, totalDuration: number) {
120
+ if (barGroupAmount <= 1) {
121
+ // 一筆內計算會出錯所以不算
122
+ return 0
123
+ }
124
+ return totalDuration / (barGroupAmount - 1) * groupDelayProportionOfDuration // 依group數量計算
125
+ }
126
+
127
+ function calctransitionItem (barGroupAmount: number, totalDuration: number) {
128
+ if (barGroupAmount <= 1) {
129
+ // 一筆內不會有delay
130
+ return totalDuration
131
+ }
132
+ return totalDuration * (1 - groupDelayProportionOfDuration) // delay後剩餘的時間
133
+ }
134
+
135
+ function renderRectBars ({ graphicGSelection, rectClassName, barData, zeroY, styles, barWidth, transformedBarRadius, delayGroup, transitionItem }: RenderBarParams) {
136
+
137
+ const barHalfWidth = barWidth! / 2
138
+
139
+ graphicGSelection
140
+ .each((seriesData, seriesIndex, g) => {
141
+ d3.select(g[seriesIndex])
142
+ .selectAll<SVGGElement, ComputedDatumGrid>(`rect.${rectClassName}`)
143
+ .data(barData[seriesIndex] ?? [], d => d.id)
144
+ .join(
145
+ enter => {
146
+ // console.log('enter')
147
+ return enter
148
+ .append('rect')
149
+ .classed(rectClassName, true)
150
+ .attr('cursor', 'pointer')
151
+ .attr('height', d => 1)
152
+ },
153
+ update => update,
154
+ exit => exit.remove()
155
+ )
156
+ .attr('transform', (d, i) => `translate(${(d ? d.axisX : 0) - barHalfWidth}, ${0})`)
157
+ .attr('fill', d => d.color)
158
+ .attr('y', d => zeroY)
159
+ .attr('x', d =>0)
160
+ .attr('width', barWidth!)
161
+ .attr('rx', transformedBarRadius[seriesIndex][0] ?? 1)
162
+ .attr('ry', transformedBarRadius[seriesIndex][1] ?? 1)
163
+ .transition()
164
+ .duration(transitionItem)
165
+ .ease(getD3TransitionEase(styles.transitionEase))
166
+ .delay((d, i) => d.categoryIndex * delayGroup)
167
+ .attr('y', d => d._barStartY)
168
+ .attr('height', d => d._barHeight > 0 ? Math.abs(d._barHeight) : 1) // 無值還是給一個 1 的高度
169
+ })
170
+
171
+
172
+ // const barGroup = graphicGSelection
173
+ // .selectAll<SVGGElement, ComputedDatumGrid[]>(`g.${gClassName}`)
174
+ // .data(data, (d, i) => groupLabels[i])
175
+ // .join(
176
+ // enter => {
177
+ // return enter
178
+ // .append('g')
179
+ // .classed(gClassName, true)
180
+ // .attr('cursor', 'pointer')
181
+ // },
182
+ // update => update,
183
+ // exit => exit.remove()
184
+ // )
185
+ // .attr('transform', (d, i) => `translate(${d[0] ? d[0].axisX : 0}, ${0})`)
186
+ // .each((d, i, g) => {
187
+ // const bars = d3.select(g[i])
188
+ // .selectAll<SVGGElement, ComputedDatumGrid>('g')
189
+ // .data(d, _d => _d.id)
190
+ // .join(
191
+ // enter => {
192
+ // return enter
193
+ // .append('g')
194
+ // .classed(gContentClassName, true)
195
+ // },
196
+ // update => update,
197
+ // exit => exit.remove()
198
+ // )
199
+ // .each((_d, _i, _g) => {
200
+ // const rect = d3.select(_g[_i])
201
+ // .selectAll<SVGRectElement, ComputedDatumGrid>('rect')
202
+ // .data([_d], _d => _d.id)
203
+ // .join(
204
+ // enter => {
205
+ // return enter
206
+ // .append('rect')
207
+ // .attr('y', d => zeroY)
208
+ // .attr('height', d => 0)
209
+ // },
210
+ // update => update,
211
+ // exit => exit.remove()
212
+ // )
213
+ // .attr('rx', transformedBarRadius[0])
214
+ // .attr('ry', transformedBarRadius[1])
215
+ // .attr('fill', d => d.color)
216
+ // .attr('transform', `translate(${-barHalfWidth}, 0)`)
217
+ // .attr('x', d => 0)
218
+ // .attr('width', barWidth!)
219
+ // .transition()
220
+ // .duration(transitionItem)
221
+ // .ease(getD3TransitionEase(chartParams.transitionEase))
222
+ // .delay((d, i) => d.groupIndex * delayGroup)
223
+ // .attr('y', d => d._barStartY)
224
+ // .attr('height', d => Math.abs(d._barHeight))
225
+ // })
226
+
227
+ // })
228
+
229
+ const graphicBarSelection: d3.Selection<SVGRectElement, ComputedDatumGrid, SVGGElement, unknown> = graphicGSelection.selectAll(`rect.${rectClassName}`)
230
+
231
+
232
+ return graphicBarSelection
233
+ }
234
+
235
+ function renderClipPath ({ defsSelection, clipPathData }: {
236
+ defsSelection: d3.Selection<SVGDefsElement, any, any, any>
237
+ clipPathData: ClipPathDatum[]
238
+ }) {
239
+ const clipPath = defsSelection
240
+ .selectAll<SVGClipPathElement, Layout>('clipPath')
241
+ .data(clipPathData)
242
+ .join(
243
+ enter => {
244
+ return enter
245
+ .append('clipPath')
246
+ },
247
+ update => update,
248
+ exit => exit.remove()
249
+ )
250
+ .attr('id', d => d.id)
251
+ .each((d, i, g) => {
252
+ const rect = d3.select(g[i])
253
+ .selectAll<SVGRectElement, typeof d>('rect')
254
+ .data([d])
255
+ .join(
256
+ enter => {
257
+ return enter
258
+ .append('rect')
259
+ },
260
+ update => update,
261
+ exit => exit.remove()
262
+ )
263
+ .attr('x', 0)
264
+ .attr('y', 0)
265
+ .attr('width', _d => _d.width)
266
+ .attr('height', _d => _d.height)
267
+ })
268
+ }
269
+
270
+ function highlight ({ selection, ids, styles }: {
271
+ selection: d3.Selection<any, ComputedDatumGrid, any, any>
272
+ ids: string[]
273
+ styles: GraphicStyles
274
+ }) {
275
+ selection.interrupt('highlight')
276
+
277
+ if (!ids.length) {
278
+ // remove highlight
279
+ selection
280
+ .transition('highlight')
281
+ .duration(200)
282
+ .style('opacity', 1)
283
+ return
284
+ }
285
+
286
+ selection
287
+ .each((d, i, n) => {
288
+ if (ids.includes(d.id)) {
289
+ d3.select(n[i])
290
+ .style('opacity', 1)
291
+ } else {
292
+ d3.select(n[i])
293
+ .style('opacity', styles.unhighlightedOpacity)
294
+ }
295
+ })
296
+ }
297
+
298
+
299
+ export const createBaseStackedBars: BaseLayerFn<BaseStackedBarsContext> = ({
300
+ selection,
301
+ pluginName,
302
+ layerName,
303
+ computedData$,
304
+ computedAxesData$,
305
+ visibleComputedData$,
306
+ visibleComputedAxesData$,
307
+ filteredMinMaxValue$,
308
+ filteredStackedMinMaxValue$,
309
+ seriesLabels$,
310
+ SeriesDataMap$,
311
+ CategoryDataMap$,
312
+ baseStackedBarParams$,
313
+ pluginParams$,
314
+ styles$,
315
+ gridAxesTransform$,
316
+ gridGraphicTransform$,
317
+ gridGraphicReverseScale$,
318
+ gridAxesSize$,
319
+ gridHighlight$,
320
+ gridContainerPosition$,
321
+ isSeriesSeprate$,
322
+ eventTrigger$
323
+ }) => {
324
+
325
+ const destroy$ = new Subject()
326
+
327
+ const clipPathID = createUniID(pluginName, layerName, 'clipPath-box')
328
+ const rectClassName = createClassName(pluginName, layerName, 'rect')
329
+
330
+ const {
331
+ seriesSelection$,
332
+ axesSelection$,
333
+ defsSelection$,
334
+ graphicGSelection$
335
+ } = gridSelectionsObservable({
336
+ selection,
337
+ pluginName,
338
+ layerName,
339
+ clipPathID,
340
+ seriesLabels$,
341
+ gridContainerPosition$,
342
+ gridAxesTransform$,
343
+ gridGraphicTransform$
344
+ })
345
+
346
+
347
+ const zeroY$ = visibleComputedAxesData$.pipe(
348
+ takeUntil(destroy$),
349
+ map(d => d[0] && d[0][0]
350
+ ? d[0][0].axisY - d[0][0].axisYFromZero
351
+ : 0),
352
+ distinctUntilChanged()
353
+ )
354
+
355
+ const barWidth$ = combineLatest({
356
+ computedData: computedData$,
357
+ // visibleComputedData: visibleComputedData$,
358
+ params: baseStackedBarParams$,
359
+ axisSize: gridAxesSize$,
360
+ isSeriesSeprate: isSeriesSeprate$
361
+ }).pipe(
362
+ takeUntil(destroy$),
363
+ switchMap(async d => d),
364
+ map(data => {
365
+ const barWidth = data.params.barWidth
366
+ ? data.params.barWidth
367
+ : calcBarWidth({
368
+ axisWidth: data.axisSize.width,
369
+ groupAmount: data.computedData[0] ? data.computedData[0].length : 0,
370
+ barGroupPadding: data.params.barGroupPadding
371
+ })
372
+ return barWidth
373
+ }),
374
+ distinctUntilChanged()
375
+ )
376
+
377
+ // 圓角的值 [rx, ry]
378
+ const transformedBarRadius$: Observable<[number, number][]> = combineLatest({
379
+ computedData: computedData$,
380
+ // gridGraphicTransform: gridGraphicTransform$,
381
+ barWidth: barWidth$,
382
+ params: baseStackedBarParams$,
383
+ gridGraphicReverseScale: gridGraphicReverseScale$
384
+ }).pipe(
385
+ takeUntil(destroy$),
386
+ switchMap(async data => data),
387
+ map(data => {
388
+ const barHalfWidth = data.barWidth! / 2
389
+ const radius = data.params.barRadius === true ? barHalfWidth
390
+ : data.params.barRadius === false ? 0
391
+ : typeof data.params.barRadius == 'number' ? data.params.barRadius
392
+ : 0
393
+
394
+ return data.computedData.map((series, seriesIndex) => {
395
+ const gridGraphicReverseScale = data.gridGraphicReverseScale[seriesIndex] ?? data.gridGraphicReverseScale[0]
396
+
397
+ const transformedRx = radius * gridGraphicReverseScale[0]
398
+ const transformedRy = radius * gridGraphicReverseScale[1]
399
+
400
+ return [transformedRx, transformedRy]
401
+ })
402
+ })
403
+ )
404
+
405
+ // const seriesLabels$ = visibleComputedData$.pipe(
406
+ // takeUntil(destroy$),
407
+ // map(data => {
408
+ // const SeriesLabelSet: Set<string> = new Set()
409
+ // data.forEach(d => {
410
+ // d.forEach(_d => {
411
+ // SeriesLabelSet.add(_d.seriesLabel)
412
+ // })
413
+ // })
414
+ // return Array.from(SeriesLabelSet)
415
+ // })
416
+ // )
417
+
418
+ const groupLabels$ = visibleComputedData$.pipe(
419
+ takeUntil(destroy$),
420
+ map(data => {
421
+ const GroupLabelSet: Set<string> = new Set()
422
+ data.forEach(d => {
423
+ d.forEach(_d => {
424
+ GroupLabelSet.add(_d.category)
425
+ })
426
+ })
427
+ return Array.from(GroupLabelSet)
428
+ }),
429
+ shareReplay(1)
430
+ )
431
+
432
+ const transitionDuration$ = styles$.pipe(
433
+ takeUntil(destroy$),
434
+ map(d => d.transitionDuration),
435
+ distinctUntilChanged()
436
+ )
437
+
438
+ const delayGroup$ = new Observable<number>(subscriber => {
439
+ combineLatest({
440
+ groupLabels: groupLabels$,
441
+ transitionDuration: transitionDuration$,
442
+ }).pipe(
443
+ switchMap(async d => d)
444
+ ).subscribe(data => {
445
+ const delay = calcDelayGroup(data.groupLabels.length, data.transitionDuration)
446
+ subscriber.next(delay)
447
+ })
448
+ }).pipe(
449
+ takeUntil(destroy$),
450
+ distinctUntilChanged()
451
+ )
452
+
453
+ const transitionItem$ = new Observable<number>(subscriber => {
454
+ combineLatest({
455
+ groupLabels: groupLabels$,
456
+ transitionDuration: transitionDuration$
457
+ }).pipe(
458
+ switchMap(async d => d)
459
+ ).subscribe(data => {
460
+ const transition = calctransitionItem(data.groupLabels.length, data.transitionDuration)
461
+ subscriber.next(transition)
462
+ })
463
+ }).pipe(
464
+ takeUntil(destroy$),
465
+ distinctUntilChanged()
466
+ )
467
+
468
+ // const transposedVisibleData$: Observable<ComputedDataGrid> = visibleComputedData$.pipe(
469
+ // takeUntil(destroy$),
470
+ // map(data => {
471
+ // console.log('visibleComputedData', data)
472
+ // // 取得原始陣列的維度
473
+ // const rows = data.length;
474
+ // const cols = data.reduce((prev, current) => {
475
+ // return Math.max(prev, current.length)
476
+ // }, 0)
477
+
478
+ // // 初始化轉換後的陣列
479
+ // const transposedArray = new Array(cols).fill(null).map(() => new Array(rows).fill(null))
480
+
481
+ // // 遍歷原始陣列,進行轉換
482
+ // for (let i = 0; i < rows; i++) {
483
+ // for (let j = 0; j < cols; j++) {
484
+ // transposedArray[j][i] = data[i][j]
485
+ // }
486
+ // }
487
+ // return transposedArray
488
+ // })
489
+ // )
490
+
491
+ const groupScaleDomain$ = combineLatest({
492
+ computedData: computedData$,
493
+ pluginParams: pluginParams$,
494
+ }).pipe(
495
+ takeUntil(destroy$),
496
+ switchMap(async d => d),
497
+ map(data => {
498
+ const groupMin = 0
499
+ const groupMax = data.computedData[0] ? data.computedData[0].length - 1 : 0
500
+ // const groupScaleDomainMin = data.dataFormatter.categoryAxis.scaleDomain[0] === 'auto'
501
+ // ? groupMin // - data.dataFormatter.categoryAxis.scalePadding
502
+ // : data.dataFormatter.categoryAxis.scaleDomain[0] as number // - data.dataFormatter.categoryAxis.scalePadding
503
+ const groupScaleDomainMin = data.pluginParams.categoryAxis.scaleDomain[0]
504
+ const groupScaleDomainMax = data.pluginParams.categoryAxis.scaleDomain[1] === 'max'
505
+ ? groupMax // + data.pluginParams.categoryAxis.scalePadding
506
+ : data.pluginParams.categoryAxis.scaleDomain[1] as number // + data.pluginParams.categoryAxis.scalePadding
507
+
508
+ return [groupScaleDomainMin, groupScaleDomainMax]
509
+ })
510
+ )
511
+
512
+ // 堆疊後的高度對應圖軸的比例(最大值/最大值所在group的總和)
513
+ const yRatio$ = combineLatest({
514
+ // visibleComputedAxesData: visibleComputedAxesData$,
515
+ // groupScaleDomain: groupScaleDomain$
516
+ filteredMinMaxValue: filteredMinMaxValue$,
517
+ filteredStackedMinMaxValue: filteredStackedMinMaxValue$
518
+ }).pipe(
519
+ takeUntil(destroy$),
520
+ switchMap(async d => d),
521
+ map(data => {
522
+ // const groupScaleDomainMin = data.groupScaleDomain[0]
523
+ // const groupScaleDomainMax = data.groupScaleDomain[1]
524
+ // // 只選取group篩選範圍內的資料
525
+ // const filteredData = data.visibleComputedAxesData
526
+ // .map(d => {
527
+ // return d.filter((_d, i) => {
528
+ // return _d.groupIndex >= groupScaleDomainMin && _d.groupIndex <= groupScaleDomainMax
529
+ // })
530
+ // })
531
+
532
+ // const filteredDataList = filteredData.flat()
533
+ // if (filteredDataList.length <= 1) {
534
+ // return 1
535
+ // }
536
+
537
+ // const maxValueDatum = filteredDataList.reduce((max, current) => {
538
+ // return current.value > max.value ? current : max;
539
+ // }, filteredDataList[0])
540
+ // const maxValueGroupIndex = maxValueDatum.groupIndex
541
+ // const maxValueGroupSum = filteredDataList
542
+ // .filter(d => d.groupIndex === maxValueGroupIndex)
543
+ // .reduce((sum, current) => {
544
+ // return sum + current.value
545
+ // }, 0)
546
+ // return maxValueDatum.value / maxValueGroupSum
547
+ return data.filteredMinMaxValue[1] / data.filteredStackedMinMaxValue[1]
548
+ })
549
+ )
550
+
551
+ const stackedData$ = combineLatest({
552
+ computedAxesData: computedAxesData$,
553
+ yRatio: yRatio$,
554
+ zeroY: zeroY$
555
+ }).pipe(
556
+ takeUntil(destroy$),
557
+ map(data => {
558
+ let accYArr: number[] = data.computedAxesData[0]
559
+ ? data.computedAxesData[0].map(() => data.zeroY)
560
+ : []
561
+ return data.computedAxesData.map((series, seriesIndex) => {
562
+ return series.map((datum, groupIndex) => {
563
+ if (!accYArr[groupIndex]) {
564
+ accYArr[groupIndex] = 0
565
+ }
566
+ const _barStartY = accYArr[groupIndex] // 前一次的累加高度
567
+ let _barHeight = 0
568
+ if (datum.visible) {
569
+ _barHeight = datum.axisYFromZero * data.yRatio
570
+ accYArr[groupIndex] = accYArr[groupIndex] + _barHeight // 累加高度
571
+ }
572
+ return <GraphicDatum>{
573
+ ...datum,
574
+ _barStartY,
575
+ _barHeight
576
+ }
577
+ })
578
+ })
579
+ // return data.computedData.map(d => {
580
+ // let accY = data.zeroY
581
+ // return d.map(_d => {
582
+ // const _barStartY = accY
583
+ // const _barHeight = _d.axisYFromZero * data.yRatio
584
+ // accY = accY + _barHeight
585
+ // return <GraphicDatum>{
586
+ // ..._d,
587
+ // _barStartY,
588
+ // _barHeight
589
+ // }
590
+ // })
591
+ // })
592
+ })
593
+ )
594
+
595
+ const noneStackedData$ = combineLatest({
596
+ computedAxesData: computedAxesData$,
597
+ // yRatio: yRatio$,
598
+ zeroY: zeroY$
599
+ }).pipe(
600
+ takeUntil(destroy$),
601
+ map(data => {
602
+ return data.computedAxesData.map((series, seriesIndex) => {
603
+ return series.map((datum, groupIndex) => {
604
+ return <GraphicDatum>{
605
+ ...datum,
606
+ _barStartY: data.zeroY,
607
+ _barHeight: datum.axisYFromZero
608
+ }
609
+ })
610
+ })
611
+ })
612
+ )
613
+
614
+ const graphicData$ = isSeriesSeprate$.pipe(
615
+ switchMap(isSeriesSeprate => {
616
+ return iif(() => isSeriesSeprate, noneStackedData$, stackedData$)
617
+ })
618
+ )
619
+
620
+ combineLatest({
621
+ defsSelection: defsSelection$,
622
+ gridAxesSize: gridAxesSize$,
623
+ }).pipe(
624
+ takeUntil(destroy$),
625
+ switchMap(async d => d)
626
+ ).subscribe(data => {
627
+ const clipPathData = [{
628
+ id: clipPathID,
629
+ width: data.gridAxesSize.width,
630
+ height: data.gridAxesSize.height
631
+ }]
632
+ renderClipPath({
633
+ defsSelection: data.defsSelection,
634
+ clipPathData
635
+ })
636
+ })
637
+
638
+ const highlightTarget$ = styles$.pipe(
639
+ takeUntil(destroy$),
640
+ map(d => d.highlightTarget),
641
+ distinctUntilChanged()
642
+ )
643
+
644
+ const barSelection$ = combineLatest({
645
+ graphicGSelection: graphicGSelection$,
646
+ graphicData: graphicData$,
647
+ zeroY: zeroY$,
648
+ groupLabels: groupLabels$,
649
+ // barScale: barScale$,
650
+ params: baseStackedBarParams$,
651
+ styles: styles$,
652
+ highlightTarget: highlightTarget$,
653
+ barWidth: barWidth$,
654
+ transformedBarRadius: transformedBarRadius$,
655
+ delayGroup: delayGroup$,
656
+ transitionItem: transitionItem$,
657
+ isSeriesSeprate: isSeriesSeprate$
658
+ }).pipe(
659
+ takeUntil(destroy$),
660
+ switchMap(async (d) => d),
661
+ map(data => {
662
+ return renderRectBars({
663
+ graphicGSelection: data.graphicGSelection,
664
+ rectClassName,
665
+ barData: data.graphicData,
666
+ zeroY: data.zeroY,
667
+ // groupLabels: data.groupLabels,
668
+ // barScale: data.barScale,
669
+ // params: data.params,
670
+ styles: data.styles,
671
+ barWidth: data.barWidth,
672
+ transformedBarRadius: data.transformedBarRadius,
673
+ delayGroup: data.delayGroup,
674
+ transitionItem: data.transitionItem,
675
+ // isSeriesSeprate: data.isSeriesSeprate
676
+ })
677
+ })
678
+ )
679
+
680
+ combineLatest({
681
+ barSelection: barSelection$,
682
+ computedData: computedData$,
683
+ highlightTarget: highlightTarget$,
684
+ SeriesDataMap: SeriesDataMap$,
685
+ CategoryDataMap: CategoryDataMap$,
686
+ }).subscribe(data => {
687
+
688
+ data.barSelection!
689
+ .on('mouseover', (event, datum) => {
690
+ event.stopPropagation()
691
+
692
+ eventTrigger$.next({
693
+ // type: 'grid',
694
+ // eventName: 'mouseover',
695
+ // pluginName,
696
+ // highlightTarget: data.highlightTarget,
697
+ // datum,
698
+ // gridIndex: datum.gridIndex,
699
+ // series: data.SeriesDataMap.get(datum.seriesLabel)!,
700
+ // seriesIndex: datum.seriesIndex,
701
+ // seriesLabel: datum.seriesLabel,
702
+ // group: data.CategoryDataMap.get(datum.groupLabel)!,
703
+ // groupIndex: datum.groupIndex,
704
+ // groupLabel: datum.groupLabel,
705
+ // event,
706
+ // data: data.computedData
707
+ eventName: 'mouseover',
708
+ pluginName,
709
+ layerName,
710
+ target: datum,
711
+ event
712
+ })
713
+ })
714
+ .on('mousemove', (event, datum) => {
715
+ event.stopPropagation()
716
+
717
+ eventTrigger$.next({
718
+ // type: 'grid',
719
+ // eventName: 'mousemove',
720
+ // pluginName,
721
+ // highlightTarget: data.highlightTarget,
722
+ // datum,
723
+ // gridIndex: datum.gridIndex,
724
+ // series: data.SeriesDataMap.get(datum.seriesLabel)!,
725
+ // seriesIndex: datum.seriesIndex,
726
+ // seriesLabel: datum.seriesLabel,
727
+ // group: data.CategoryDataMap.get(datum.groupLabel)!,
728
+ // groupIndex: datum.groupIndex,
729
+ // groupLabel: datum.groupLabel,
730
+ // event,
731
+ // data: data.computedData
732
+ eventName: 'mousemove',
733
+ pluginName,
734
+ layerName,
735
+ target: datum,
736
+ event
737
+ })
738
+ })
739
+ .on('mouseout', (event, datum) => {
740
+ event.stopPropagation()
741
+
742
+ eventTrigger$.next({
743
+ // type: 'grid',
744
+ // eventName: 'mouseout',
745
+ // pluginName,
746
+ // highlightTarget: data.highlightTarget,
747
+ // datum,
748
+ // gridIndex: datum.gridIndex,
749
+ // series: data.SeriesDataMap.get(datum.seriesLabel)!,
750
+ // seriesIndex: datum.seriesIndex,
751
+ // seriesLabel: datum.seriesLabel,
752
+ // group: data.CategoryDataMap.get(datum.groupLabel)!,
753
+ // groupIndex: datum.groupIndex,
754
+ // groupLabel: datum.groupLabel,
755
+ // event,
756
+ // data: data.computedData
757
+ eventName: 'mouseout',
758
+ pluginName,
759
+ layerName,
760
+ target: datum,
761
+ event
762
+ })
763
+ })
764
+ .on('click', (event, datum) => {
765
+ event.stopPropagation()
766
+
767
+ eventTrigger$.next({
768
+ // type: 'grid',
769
+ // eventName: 'click',
770
+ // pluginName,
771
+ // highlightTarget: data.highlightTarget,
772
+ // datum,
773
+ // gridIndex: datum.gridIndex,
774
+ // series: data.SeriesDataMap.get(datum.seriesLabel)!,
775
+ // seriesIndex: datum.seriesIndex,
776
+ // seriesLabel: datum.seriesLabel,
777
+ // group: data.CategoryDataMap.get(datum.groupLabel)!,
778
+ // groupIndex: datum.groupIndex,
779
+ // groupLabel: datum.groupLabel,
780
+ // event,
781
+ // data: data.computedData
782
+ eventName: 'click',
783
+ pluginName,
784
+ layerName,
785
+ target: datum,
786
+ event
787
+ })
788
+ })
789
+
790
+ })
791
+
792
+ // const datumList$ = computedData$.pipe(
793
+ // takeUntil(destroy$),
794
+ // map(d => d.flat())
795
+ // )
796
+ // const highlight$ = highlightObservable({ datumList$, chartParams$, eventTrigger$: store.eventTrigger$ })
797
+
798
+ combineLatest({
799
+ barSelection: barSelection$,
800
+ highlight: gridHighlight$.pipe(
801
+ map(data => data.map(d => d.id))
802
+ ),
803
+ styles: styles$
804
+ }).pipe(
805
+ takeUntil(destroy$),
806
+ switchMap(async d => d)
807
+ ).subscribe(data => {
808
+ highlight({
809
+ selection: data.barSelection,
810
+ ids: data.highlight,
811
+ styles: data.styles
812
+ })
813
+ })
814
+
815
+ return () => {
816
+ destroy$.next(undefined)
817
+ }
818
+ }