@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,495 @@
1
+ import * as d3 from 'd3'
2
+ import {
3
+ combineLatest,
4
+ map,
5
+ debounceTime,
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
+ ColorType,
15
+ Theme
16
+ } from '@orbcharts/core'
17
+ import type {
18
+ ComputedData,
19
+ ComputedDatumGrid,
20
+ ContainerPositionScaled,
21
+ TransformData,
22
+ Layout,
23
+ GraphicStyles
24
+ } from '../types'
25
+ import type { ComputedAxesDataGrid } from '../plugins/SeriesPlot/types'
26
+ import { getDatumColor, createClassName, createUniID } from '../utils/orbchartsUtils'
27
+ import { gridSelectionsObservable } from '../utils/gridObservables'
28
+
29
+ export interface BaseDotsParams {
30
+ radius: number;
31
+ fillColorType: ColorType;
32
+ strokeColorType: ColorType;
33
+ strokeWidth: number;
34
+ onlyShowHighlighted: boolean;
35
+ }
36
+
37
+ interface BaseDotsContext {
38
+ selection: d3.Selection<any, unknown, any, unknown>
39
+ pluginName: string
40
+ layerName: string
41
+ computedData$: Observable<ComputedData<'grid'>>
42
+ // computedAxesData$: Observable<ComputedAxesDataGrid>
43
+ // visibleComputedData$: Observable<ComputedDatumGrid[][]>
44
+ visibleComputedAxesData$: Observable<ComputedAxesDataGrid>
45
+ seriesLabels$: Observable<string[]>
46
+ SeriesDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
47
+ CategoryDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
48
+ baseDotsParams$: Observable<BaseDotsParams>
49
+ styles$: Observable<GraphicStyles>
50
+ theme$: Observable<Theme>
51
+ gridAxesTransform$: Observable<TransformData>
52
+ gridGraphicTransform$: Observable<TransformData>
53
+ gridGraphicReverseScale$: Observable<[number, number][]>
54
+ gridAxesSize$: Observable<{
55
+ width: number;
56
+ height: number;
57
+ }>
58
+ gridHighlight$: Observable<ComputedDatumGrid[]>
59
+ gridContainerPosition$: Observable<ContainerPositionScaled[]>
60
+ eventTrigger$: Subject<EventData<'grid'>>
61
+ }
62
+
63
+
64
+ type ClipPathDatum = {
65
+ id: string;
66
+ // x: number;
67
+ // y: number;
68
+ width: number;
69
+ height: number;
70
+ }
71
+
72
+ // const pluginName = 'Dots'
73
+ // const circleGClassName = createClassName(pluginName, 'circleG')
74
+ // const circleClassName = createClassName(pluginName, 'circle')
75
+
76
+ function renderDots ({ graphicGSelection, circleGClassName, circleClassName, visibleComputedAxesData, baseDotsParams, styles, theme, graphicReverseScale }: {
77
+ graphicGSelection: d3.Selection<SVGGElement, any, any, any>
78
+ circleGClassName: string
79
+ circleClassName: string
80
+ visibleComputedAxesData: ComputedAxesDataGrid
81
+ baseDotsParams: BaseDotsParams
82
+ styles: GraphicStyles
83
+ theme: Theme
84
+ graphicReverseScale: [number, number][]
85
+ }) {
86
+ const createEnterDuration = (enter: d3.Selection<d3.EnterElement, ComputedDatumGrid, SVGGElement, any>) => {
87
+ const enterSize = enter.size()
88
+ const eachDuration = styles.transitionDuration / enterSize
89
+ return eachDuration
90
+ }
91
+ // enterDuration
92
+ let enterDuration = 0
93
+
94
+ graphicGSelection
95
+ .each((seriesData, seriesIndex, g) => {
96
+ d3.select(g[seriesIndex])
97
+ .selectAll<SVGGElement, ComputedDatumGrid>('g')
98
+ .data(visibleComputedAxesData[seriesIndex], d => d.id)
99
+ .join(
100
+ enter => {
101
+ // enterDuration
102
+ enterDuration = createEnterDuration(enter)
103
+
104
+ return enter
105
+ .append('g')
106
+ .classed(circleGClassName, true)
107
+ },
108
+ update => update,
109
+ exit => exit.remove()
110
+ )
111
+ .attr('transform', d => `translate(${d.axisX}, ${d.axisY})`)
112
+ .each((d, i, g) => {
113
+ const circle = d3.select(g[i])
114
+ .selectAll('circle')
115
+ .data([d])
116
+ .join(
117
+ enter => {
118
+ return enter
119
+ .append('circle')
120
+ .style('cursor', 'pointer')
121
+ .style('vector-effect', 'non-scaling-stroke')
122
+ .classed(circleClassName, true)
123
+ .attr('opacity', 0)
124
+ .transition()
125
+ .delay((_d, _i) => {
126
+ return i * enterDuration
127
+ })
128
+ .attr('opacity', 1)
129
+ },
130
+ update => {
131
+ return update
132
+ .transition()
133
+ .duration(50)
134
+ // .attr('cx', d => d.axisX)
135
+ // .attr('cy', d => d.axisY)
136
+ .attr('opacity', 1)
137
+ },
138
+ exit => exit.remove()
139
+ )
140
+ .attr('r', baseDotsParams.radius)
141
+ .attr('fill', (d, i) => getDatumColor({ datum: d, colorType: baseDotsParams.fillColorType, theme }))
142
+ .attr('stroke', (d, i) => getDatumColor({ datum: d, colorType: baseDotsParams.strokeColorType, theme }))
143
+ .attr('stroke-width', baseDotsParams.strokeWidth)
144
+ .attr('transform', `scale(${graphicReverseScale[seriesIndex][0] ?? 1}, ${graphicReverseScale[seriesIndex][1] ?? 1})`)
145
+ })
146
+ })
147
+
148
+ const graphicCircleSelection: d3.Selection<SVGRectElement, ComputedDatumGrid, SVGGElement, unknown> = graphicGSelection.selectAll(`circle.${circleClassName}`)
149
+
150
+ return graphicCircleSelection
151
+ }
152
+
153
+
154
+ function highlightDots ({ selection, ids, onlyShowHighlighted, styles }: {
155
+ selection: d3.Selection<SVGGElement, ComputedDatumGrid, any, any>
156
+ ids: string[]
157
+ onlyShowHighlighted: boolean
158
+ // baseDotsParams: BaseDotsParams
159
+ styles: GraphicStyles
160
+ }) {
161
+ selection.interrupt('highlight')
162
+ if (!ids.length) {
163
+ // remove highlight
164
+ selection
165
+ .transition('highlight')
166
+ .duration(200)
167
+ .style('opacity', onlyShowHighlighted === true ? 0 : 1)
168
+ // selection
169
+ // .attr('stroke-width', baseDotsParams.strokeWidth)
170
+
171
+ return
172
+ }
173
+
174
+ selection
175
+ .each((d, i, n) => {
176
+ if (ids.includes(d.id)) {
177
+ const dot = d3.select(n[i])
178
+ dot
179
+ .style('opacity', 1)
180
+ .transition('highlight')
181
+ .duration(200)
182
+ // dot
183
+ // .attr('stroke-width', baseDotsParams.strokeWidthWhileHighlight)
184
+ } else {
185
+ const dot = d3.select(n[i])
186
+ dot
187
+ .style('opacity', onlyShowHighlighted === true ? 0 : styles.unhighlightedOpacity)
188
+ .transition('highlight')
189
+ .duration(200)
190
+ // dot
191
+ // .attr('stroke-width', baseDotsParams.strokeWidth)
192
+
193
+ }
194
+ })
195
+ }
196
+
197
+ function renderClipPath ({ defsSelection, clipPathData }: {
198
+ defsSelection: d3.Selection<SVGDefsElement, any, any, any>
199
+ clipPathData: ClipPathDatum[]
200
+ }) {
201
+ const clipPath = defsSelection
202
+ .selectAll<SVGClipPathElement, Layout>('clipPath')
203
+ .data(clipPathData)
204
+ .join(
205
+ enter => {
206
+ return enter
207
+ .append('clipPath')
208
+ },
209
+ update => update,
210
+ exit => exit.remove()
211
+ )
212
+ .attr('id', d => d.id)
213
+ .each((d, i, g) => {
214
+ const rect = d3.select(g[i])
215
+ .selectAll<SVGRectElement, typeof d>('rect')
216
+ .data([d])
217
+ .join('rect')
218
+ .attr('x', 0)
219
+ .attr('y', 0)
220
+ .attr('width', _d => _d.width)
221
+ .attr('height', _d => _d.height)
222
+ })
223
+
224
+ }
225
+
226
+
227
+
228
+ export const createBaseDots: BaseLayerFn<BaseDotsContext> = ({
229
+ selection,
230
+ pluginName,
231
+ layerName,
232
+ computedData$,
233
+ visibleComputedAxesData$,
234
+ seriesLabels$,
235
+ SeriesDataMap$,
236
+ CategoryDataMap$,
237
+ baseDotsParams$,
238
+ styles$,
239
+ theme$,
240
+ gridAxesTransform$,
241
+ gridGraphicTransform$,
242
+ gridGraphicReverseScale$,
243
+ gridAxesSize$,
244
+ gridHighlight$,
245
+ gridContainerPosition$,
246
+ eventTrigger$
247
+ }) => {
248
+
249
+ const destroy$ = new Subject()
250
+
251
+ const clipPathID = createUniID(pluginName, layerName, 'clipPath-box')
252
+ const circleGClassName = createClassName(pluginName, layerName, 'circleG')
253
+ const circleClassName = createClassName(pluginName, layerName, 'circle')
254
+
255
+ // const axisSelection: d3.Selection<SVGGElement, any, any, any> = selection
256
+ // .append('g')
257
+ // .attr('clip-path', `url(#${clipPathID})`)
258
+ // const defsSelection: d3.Selection<SVGDefsElement, any, any, any> = axisSelection.append('defs')
259
+ // const dataAreaSelection: d3.Selection<SVGGElement, any, any, any> = axisSelection.append('g')
260
+ // const graphicSelection$: Subject<d3.Selection<SVGGElement, ComputedDatumGrid, any, any>> = new Subject()
261
+
262
+ const {
263
+ seriesSelection$,
264
+ axesSelection$,
265
+ defsSelection$,
266
+ graphicGSelection$
267
+ } = gridSelectionsObservable({
268
+ selection,
269
+ pluginName,
270
+ layerName,
271
+ clipPathID,
272
+ seriesLabels$,
273
+ gridContainerPosition$,
274
+ gridAxesTransform$,
275
+ gridGraphicTransform$
276
+ })
277
+
278
+ const graphicReverseScale$: Observable<[number, number][]> = combineLatest({
279
+ // gridGraphicTransform: gridGraphicTransform$,
280
+ // gridContainerPosition: gridContainerPosition$,
281
+ // gridAxesTransform: gridAxesTransform$
282
+ computedData: computedData$,
283
+ gridGraphicReverseScale: gridGraphicReverseScale$
284
+ }).pipe(
285
+ takeUntil(destroy$),
286
+ switchMap(async data => data),
287
+ map(data => {
288
+ return data.computedData.map((series, seriesIndex) => {
289
+ return data.gridGraphicReverseScale[seriesIndex]
290
+ })
291
+ })
292
+ )
293
+
294
+ const clipPathSubscription = combineLatest({
295
+ defsSelection: defsSelection$,
296
+ gridAxesSize: gridAxesSize$,
297
+ }).pipe(
298
+ takeUntil(destroy$),
299
+ switchMap(async (d) => d),
300
+ ).subscribe(data => {
301
+ // 外層的遮罩
302
+ const clipPathData = [{
303
+ id: clipPathID,
304
+ width: data.gridAxesSize.width,
305
+ height: data.gridAxesSize.height
306
+ }]
307
+ renderClipPath({
308
+ defsSelection: data.defsSelection,
309
+ clipPathData,
310
+ })
311
+ })
312
+
313
+ const highlightTarget$ = styles$.pipe(
314
+ takeUntil(destroy$),
315
+ map(d => d.highlightTarget),
316
+ distinctUntilChanged()
317
+ )
318
+
319
+ const graphicSelection$ = combineLatest({
320
+ graphicGSelection: graphicGSelection$,
321
+ visibleComputedAxesData: visibleComputedAxesData$,
322
+ graphicReverseScale: graphicReverseScale$,
323
+ styles: styles$,
324
+ theme: theme$,
325
+ baseDotsParams: baseDotsParams$,
326
+ }).pipe(
327
+ takeUntil(destroy$),
328
+ switchMap(async (d) => d),
329
+ map(data => {
330
+ return renderDots({
331
+ graphicGSelection: data.graphicGSelection,
332
+ circleGClassName,
333
+ circleClassName,
334
+ visibleComputedAxesData: data.visibleComputedAxesData,
335
+ baseDotsParams: data.baseDotsParams,
336
+ styles: data.styles,
337
+ theme: data.theme,
338
+ graphicReverseScale: data.graphicReverseScale
339
+ })
340
+ })
341
+ )
342
+
343
+ combineLatest({
344
+ graphicSelection: graphicSelection$,
345
+ computedData: computedData$,
346
+ SeriesDataMap: SeriesDataMap$,
347
+ CategoryDataMap: CategoryDataMap$,
348
+ highlightTarget: highlightTarget$
349
+ }).pipe(
350
+ takeUntil(destroy$),
351
+ switchMap(async (d) => d),
352
+ ).subscribe(data => {
353
+
354
+ data.graphicSelection
355
+ .on('mouseover', (event, datum) => {
356
+ // event.stopPropagation()
357
+
358
+ eventTrigger$.next({
359
+ // type: 'grid',
360
+ // eventName: 'mouseover',
361
+ // pluginName,
362
+ // highlightTarget: data.highlightTarget,
363
+ // datum,
364
+ // gridIndex: datum.gridIndex,
365
+ // series: data.SeriesDataMap.get(datum.seriesLabel)!,
366
+ // seriesIndex: datum.seriesIndex,
367
+ // seriesLabel: datum.seriesLabel,
368
+ // group: data.CategoryDataMap.get(datum.groupLabel)!,
369
+ // groupIndex: datum.groupIndex,
370
+ // groupLabel: datum.groupLabel,
371
+ // event,
372
+ // data: data.computedData
373
+ eventName: 'mouseover',
374
+ pluginName,
375
+ layerName,
376
+ target: datum,
377
+ event
378
+ })
379
+ })
380
+ .on('mousemove', (event, datum) => {
381
+ // event.stopPropagation()
382
+
383
+ eventTrigger$.next({
384
+ // type: 'grid',
385
+ // eventName: 'mousemove',
386
+ // pluginName,
387
+ // highlightTarget: data.highlightTarget,
388
+ // data: data.computedData,
389
+ // datum,
390
+ // gridIndex: datum.gridIndex,
391
+ // series: data.SeriesDataMap.get(datum.seriesLabel)!,
392
+ // seriesIndex: datum.seriesIndex,
393
+ // seriesLabel: datum.seriesLabel,
394
+ // group: data.CategoryDataMap.get(datum.groupLabel)!,
395
+ // groupIndex: datum.groupIndex,
396
+ // groupLabel: datum.groupLabel,
397
+ // event
398
+ eventName: 'mousemove',
399
+ pluginName,
400
+ layerName,
401
+ target: datum,
402
+ event
403
+ })
404
+ })
405
+ .on('mouseout', (event, datum) => {
406
+ // event.stopPropagation()
407
+
408
+ eventTrigger$.next({
409
+ // type: 'grid',
410
+ // eventName: 'mouseout',
411
+ // pluginName,
412
+ // highlightTarget: data.highlightTarget,
413
+ // datum,
414
+ // gridIndex: datum.gridIndex,
415
+ // series: data.SeriesDataMap.get(datum.seriesLabel)!,
416
+ // seriesIndex: datum.seriesIndex,
417
+ // seriesLabel: datum.seriesLabel,
418
+ // group: data.CategoryDataMap.get(datum.groupLabel)!,
419
+ // groupIndex: datum.groupIndex,
420
+ // groupLabel: datum.groupLabel,
421
+ // event,
422
+ // data: data.computedData
423
+ eventName: 'mouseout',
424
+ pluginName,
425
+ layerName,
426
+ target: datum,
427
+ event
428
+ })
429
+ })
430
+ .on('click', (event, datum) => {
431
+ // event.stopPropagation()
432
+
433
+ eventTrigger$.next({
434
+ // type: 'grid',
435
+ // eventName: 'click',
436
+ // pluginName,
437
+ // highlightTarget: data.highlightTarget,
438
+ // datum,
439
+ // gridIndex: datum.gridIndex,
440
+ // series: data.SeriesDataMap.get(datum.seriesLabel)!,
441
+ // seriesIndex: datum.seriesIndex,
442
+ // seriesLabel: datum.seriesLabel,
443
+ // group: data.CategoryDataMap.get(datum.groupLabel)!,
444
+ // groupIndex: datum.groupIndex,
445
+ // groupLabel: datum.groupLabel,
446
+ // event,
447
+ // data: data.computedData
448
+ eventName: 'click',
449
+ pluginName,
450
+ layerName,
451
+ target: datum,
452
+ event
453
+ })
454
+ })
455
+
456
+ })
457
+
458
+ // const datumList$ = computedData$.pipe(
459
+ // takeUntil(destroy$),
460
+ // map(d => d.flat())
461
+ // )
462
+ // const highlight$ = highlightObservable({ datumList$, fullChartParams$, eventTrigger$: store.eventTrigger$ })
463
+ // const highlightSubscription = gridHighlight$.subscribe()
464
+ const onlyShowHighlighted$ = baseDotsParams$.pipe(
465
+ takeUntil(destroy$),
466
+ map(d => d.onlyShowHighlighted),
467
+ distinctUntilChanged()
468
+ )
469
+
470
+ combineLatest({
471
+ graphicSelection: graphicSelection$,
472
+ highlight: gridHighlight$.pipe(
473
+ map(data => data.map(d => d.id))
474
+ ),
475
+ onlyShowHighlighted: onlyShowHighlighted$,
476
+ // baseDotsParams: baseDotsParams$,
477
+ styles: styles$
478
+ }).pipe(
479
+ takeUntil(destroy$),
480
+ debounceTime(0)
481
+ ).subscribe(data => {
482
+ highlightDots({
483
+ selection: data.graphicSelection,
484
+ ids: data.highlight,
485
+ onlyShowHighlighted: data.onlyShowHighlighted,
486
+ // baseDotsParams: data.baseDotsParams,
487
+ styles: data.styles
488
+ })
489
+ })
490
+
491
+ return () => {
492
+ destroy$.next(undefined)
493
+ // highlightSubscription.unsubscribe()
494
+ }
495
+ }