@orbcharts/plugins-basic 3.0.0-alpha.45 → 3.0.0-alpha.47

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 (153) hide show
  1. package/LICENSE +200 -200
  2. package/dist/orbcharts-plugins-basic.es.js +826 -791
  3. package/dist/orbcharts-plugins-basic.umd.js +7 -7
  4. package/dist/src/index.d.ts +5 -1
  5. package/dist/{orbcharts-plugins-basic/src → src}/series/seriesObservables.d.ts +4 -4
  6. package/package.json +42 -42
  7. package/src/base/BaseBarStack.ts +778 -778
  8. package/src/base/BaseBars.ts +764 -764
  9. package/src/base/BaseBarsTriangle.ts +672 -672
  10. package/src/base/BaseDots.ts +502 -502
  11. package/src/base/BaseGroupAxis.ts +496 -496
  12. package/src/base/BaseLegend.ts +641 -641
  13. package/src/base/BaseLineAreas.ts +625 -625
  14. package/src/base/BaseLines.ts +699 -699
  15. package/src/base/BaseValueAxis.ts +478 -478
  16. package/src/base/types.ts +2 -2
  17. package/src/grid/defaults.ts +121 -121
  18. package/src/grid/gridObservables.ts +247 -247
  19. package/src/grid/index.ts +15 -15
  20. package/src/grid/plugins/BarStack.ts +50 -50
  21. package/src/grid/plugins/Bars.ts +51 -51
  22. package/src/grid/plugins/BarsDiverging.ts +41 -41
  23. package/src/grid/plugins/BarsTriangle.ts +50 -50
  24. package/src/grid/plugins/Dots.ts +37 -37
  25. package/src/grid/plugins/GridLegend.ts +59 -59
  26. package/src/grid/plugins/GroupAux.ts +645 -645
  27. package/src/grid/plugins/GroupAxis.ts +42 -42
  28. package/src/grid/plugins/LineAreas.ts +39 -39
  29. package/src/grid/plugins/Lines.ts +38 -38
  30. package/src/grid/plugins/ScalingArea.ts +173 -173
  31. package/src/grid/plugins/ValueAxis.ts +43 -43
  32. package/src/grid/plugins/ValueStackAxis.ts +79 -79
  33. package/src/grid/types.ts +120 -120
  34. package/src/index.ts +9 -9
  35. package/src/multiGrid/defaults.ts +147 -147
  36. package/src/multiGrid/index.ts +11 -11
  37. package/src/multiGrid/multiGridObservables.ts +42 -42
  38. package/src/multiGrid/plugins/MultiBarStack.ts +78 -74
  39. package/src/multiGrid/plugins/MultiBars.ts +77 -73
  40. package/src/multiGrid/plugins/MultiBarsTriangle.ts +77 -73
  41. package/src/multiGrid/plugins/MultiDots.ts +65 -60
  42. package/src/multiGrid/plugins/MultiGridLegend.ts +89 -89
  43. package/src/multiGrid/plugins/MultiGroupAxis.ts +69 -65
  44. package/src/multiGrid/plugins/MultiLineAreas.ts +67 -62
  45. package/src/multiGrid/plugins/MultiLines.ts +66 -61
  46. package/src/multiGrid/plugins/MultiValueAxis.ts +69 -65
  47. package/src/multiGrid/plugins/OverlappingValueAxes.ts +173 -169
  48. package/src/multiGrid/types.ts +67 -67
  49. package/src/noneData/defaults.ts +64 -64
  50. package/src/noneData/index.ts +3 -3
  51. package/src/noneData/plugins/Container.ts +10 -10
  52. package/src/noneData/plugins/Tooltip.ts +310 -310
  53. package/src/noneData/types.ts +26 -26
  54. package/src/series/defaults.ts +109 -109
  55. package/src/series/index.ts +6 -6
  56. package/src/series/plugins/Bubbles.ts +602 -571
  57. package/src/series/plugins/Pie.ts +563 -548
  58. package/src/series/plugins/PieEventTexts.ts +262 -258
  59. package/src/series/plugins/PieLabels.ts +339 -335
  60. package/src/series/plugins/SeriesLegend.ts +59 -59
  61. package/src/series/seriesObservables.ts +145 -145
  62. package/src/series/seriesUtils.ts +50 -50
  63. package/src/series/types.ts +67 -67
  64. package/src/tree/defaults.ts +22 -22
  65. package/src/tree/index.ts +3 -3
  66. package/src/tree/plugins/TreeLegend.ts +59 -59
  67. package/src/tree/plugins/TreeMap.ts +305 -305
  68. package/src/tree/types.ts +23 -23
  69. package/src/utils/commonUtils.ts +21 -21
  70. package/src/utils/d3Graphics.ts +124 -124
  71. package/src/utils/d3Utils.ts +73 -73
  72. package/src/utils/observables.ts +14 -14
  73. package/src/utils/orbchartsUtils.ts +100 -100
  74. package/tsconfig.dev.json +16 -16
  75. package/tsconfig.json +13 -16
  76. package/tsconfig.prod.json +13 -13
  77. package/vite.config.js +49 -49
  78. package/dist/orbcharts-plugins-basic/src/index.d.ts +0 -5
  79. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseBarStack.d.ts +0 -0
  80. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseBars.d.ts +0 -0
  81. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseBarsTriangle.d.ts +0 -0
  82. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseDots.d.ts +0 -0
  83. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseGroupArea.d.ts +0 -0
  84. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseGroupAxis.d.ts +0 -0
  85. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseLegend.d.ts +0 -0
  86. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseLineAreas.d.ts +0 -0
  87. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseLines.d.ts +0 -0
  88. /package/dist/{orbcharts-plugins-basic/src → src}/base/BaseValueAxis.d.ts +0 -0
  89. /package/dist/{orbcharts-plugins-basic/src → src}/base/types.d.ts +0 -0
  90. /package/dist/{orbcharts-plugins-basic/src → src}/grid/defaults.d.ts +0 -0
  91. /package/dist/{orbcharts-plugins-basic/src → src}/grid/gridObservables.d.ts +0 -0
  92. /package/dist/{orbcharts-plugins-basic/src → src}/grid/index.d.ts +0 -0
  93. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/BarStack.d.ts +0 -0
  94. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/Bars.d.ts +0 -0
  95. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/BarsDiverging.d.ts +0 -0
  96. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/BarsTriangle.d.ts +0 -0
  97. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/Dots.d.ts +0 -0
  98. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/GridLegend.d.ts +0 -0
  99. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/GroupAux.d.ts +0 -0
  100. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/GroupAxis.d.ts +0 -0
  101. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/LineAreas.d.ts +0 -0
  102. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/Lines.d.ts +0 -0
  103. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/Ranking.d.ts +0 -0
  104. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/RankingAxis.d.ts +0 -0
  105. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/ScalingArea.d.ts +0 -0
  106. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/ValueAxis.d.ts +0 -0
  107. /package/dist/{orbcharts-plugins-basic/src → src}/grid/plugins/ValueStackAxis.d.ts +0 -0
  108. /package/dist/{orbcharts-plugins-basic/src → src}/grid/types.d.ts +0 -0
  109. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/defaults.d.ts +0 -0
  110. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/index.d.ts +0 -0
  111. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/multiGridObservables.d.ts +0 -0
  112. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiBarStack.d.ts +0 -0
  113. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiBars.d.ts +0 -0
  114. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiBarsTriangle.d.ts +0 -0
  115. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiDots.d.ts +0 -0
  116. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiGridLegend.d.ts +0 -0
  117. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiGroupAxis.d.ts +0 -0
  118. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiLineAreas.d.ts +0 -0
  119. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiLines.d.ts +0 -0
  120. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/MultiValueAxis.d.ts +0 -0
  121. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/plugins/OverlappingValueAxes.d.ts +0 -0
  122. /package/dist/{orbcharts-plugins-basic/src → src}/multiGrid/types.d.ts +0 -0
  123. /package/dist/{orbcharts-plugins-basic/src → src}/multiValue/index.d.ts +0 -0
  124. /package/dist/{orbcharts-plugins-basic/src → src}/multiValue/plugins/Scatter.d.ts +0 -0
  125. /package/dist/{orbcharts-plugins-basic/src → src}/multiValue/plugins/ScatterAxes.d.ts +0 -0
  126. /package/dist/{orbcharts-plugins-basic/src → src}/noneData/defaults.d.ts +0 -0
  127. /package/dist/{orbcharts-plugins-basic/src → src}/noneData/index.d.ts +0 -0
  128. /package/dist/{orbcharts-plugins-basic/src → src}/noneData/plugins/Container.d.ts +0 -0
  129. /package/dist/{orbcharts-plugins-basic/src → src}/noneData/plugins/Tooltip.d.ts +0 -0
  130. /package/dist/{orbcharts-plugins-basic/src → src}/noneData/types.d.ts +0 -0
  131. /package/dist/{orbcharts-plugins-basic/src → src}/relationship/index.d.ts +0 -0
  132. /package/dist/{orbcharts-plugins-basic/src → src}/relationship/plugins/Relationship.d.ts +0 -0
  133. /package/dist/{orbcharts-plugins-basic/src → src}/series/defaults.d.ts +0 -0
  134. /package/dist/{orbcharts-plugins-basic/src → src}/series/index.d.ts +0 -0
  135. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/Bubbles.d.ts +0 -0
  136. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/Pie.d.ts +0 -0
  137. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/PieEventTexts.d.ts +0 -0
  138. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/PieLabels.d.ts +0 -0
  139. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/SeriesLegend.d.ts +0 -0
  140. /package/dist/{orbcharts-plugins-basic/src → src}/series/plugins/Waffle.d.ts +0 -0
  141. /package/dist/{orbcharts-plugins-basic/src → src}/series/seriesUtils.d.ts +0 -0
  142. /package/dist/{orbcharts-plugins-basic/src → src}/series/types.d.ts +0 -0
  143. /package/dist/{orbcharts-plugins-basic/src → src}/tree/defaults.d.ts +0 -0
  144. /package/dist/{orbcharts-plugins-basic/src → src}/tree/index.d.ts +0 -0
  145. /package/dist/{orbcharts-plugins-basic/src → src}/tree/plugins/TreeLegend.d.ts +0 -0
  146. /package/dist/{orbcharts-plugins-basic/src → src}/tree/plugins/TreeMap.d.ts +0 -0
  147. /package/dist/{orbcharts-plugins-basic/src → src}/tree/types.d.ts +0 -0
  148. /package/dist/{orbcharts-plugins-basic/src → src}/utils/commonUtils.d.ts +0 -0
  149. /package/dist/{orbcharts-plugins-basic/src → src}/utils/d3Graphics.d.ts +0 -0
  150. /package/dist/{orbcharts-plugins-basic/src → src}/utils/d3Utils.d.ts +0 -0
  151. /package/dist/{orbcharts-plugins-basic/src → src}/utils/observables.d.ts +0 -0
  152. /package/dist/{orbcharts-plugins-basic/src → src}/utils/orbchartsUtils.d.ts +0 -0
  153. /package/dist/{orbcharts-plugins-basic/vite.config.d.ts → vite.config.d.ts} +0 -0
@@ -1,247 +1,247 @@
1
- import * as d3 from 'd3'
2
- import {
3
- Observable,
4
- Subject,
5
- of,
6
- takeUntil,
7
- filter,
8
- map,
9
- switchMap,
10
- combineLatest,
11
- merge,
12
- shareReplay,
13
- distinctUntilChanged
14
- } from 'rxjs'
15
- import type {
16
- ChartParams,
17
- HighlightTarget,
18
- DataFormatterGrid,
19
- ComputedDataGrid,
20
- ComputedDatumGrid,
21
- TransformData,
22
- GridContainerPosition,
23
- Layout } from '@orbcharts/core'
24
- import { createAxisQuantizeScale } from '@orbcharts/core'
25
- import { getClassName, getUniID } from '../utils/orbchartsUtils'
26
-
27
- // grid選取器
28
- export const gridSelectionsObservable = ({ selection, pluginName, clipPathID, seriesLabels$, gridContainerPosition$, gridAxesTransform$, gridGraphicTransform$ }: {
29
- selection: d3.Selection<any, unknown, any, unknown>
30
- pluginName: string
31
- clipPathID: string
32
- // computedData$: Observable<ComputedDataGrid>
33
- seriesLabels$: Observable<string[]>
34
- gridContainerPosition$: Observable<GridContainerPosition[]>
35
- gridAxesTransform$: Observable<TransformData>
36
- gridGraphicTransform$: Observable<TransformData>
37
- }) => {
38
- const seriesClassName = getClassName(pluginName, 'series')
39
- const axesClassName = getClassName(pluginName, 'axes')
40
- const graphicClassName = getClassName(pluginName, 'graphic')
41
-
42
- const seriesSelection$ = seriesLabels$.pipe(
43
- map((existSeriesLabels, i) => {
44
- return selection
45
- .selectAll<SVGGElement, string>(`g.${seriesClassName}`)
46
- .data(existSeriesLabels, d => d)
47
- .join(
48
- enter => {
49
- return enter
50
- .append('g')
51
- .classed(seriesClassName, true)
52
- .each((d, i, g) => {
53
- const axesSelection = d3.select(g[i])
54
- .selectAll<SVGGElement, ComputedDatumGrid[]>(`g.${axesClassName}`)
55
- .data([i])
56
- .join(
57
- enter => {
58
- return enter
59
- .append('g')
60
- .classed(axesClassName, true)
61
- .attr('clip-path', `url(#${clipPathID})`)
62
- .each((d, i, g) => {
63
- const defsSelection = d3.select(g[i])
64
- .selectAll<SVGDefsElement, any>('defs')
65
- .data([i])
66
- .join('defs')
67
-
68
- const graphicGSelection = d3.select(g[i])
69
- .selectAll<SVGGElement, any>('g')
70
- .data([i])
71
- .join('g')
72
- .classed(graphicClassName, true)
73
- })
74
- },
75
- update => update,
76
- exit => exit.remove()
77
- )
78
- })
79
- },
80
- update => update,
81
- exit => exit.remove()
82
- )
83
- }),
84
- shareReplay(1)
85
- )
86
-
87
- combineLatest({
88
- seriesSelection: seriesSelection$,
89
- gridContainerPosition: gridContainerPosition$
90
- }).pipe(
91
- switchMap(async d => d)
92
- ).subscribe(data => {
93
- data.seriesSelection
94
- .transition()
95
- .attr('transform', (d, i) => {
96
- const gridContainerPosition = data.gridContainerPosition[i] ?? data.gridContainerPosition[0]
97
- const translate = gridContainerPosition.translate
98
- const scale = gridContainerPosition.scale
99
- return `translate(${translate[0]}, ${translate[1]}) scale(${scale[0]}, ${scale[1]})`
100
- })
101
- })
102
-
103
- const axesSelection$ = combineLatest({
104
- seriesSelection: seriesSelection$,
105
- gridAxesTransform: gridAxesTransform$
106
- }).pipe(
107
- switchMap(async d => d),
108
- map(data => {
109
- return data.seriesSelection
110
- .select<SVGGElement>(`g.${axesClassName}`)
111
- .style('transform', data.gridAxesTransform.value)
112
- }),
113
- shareReplay(1)
114
- )
115
- const defsSelection$ = axesSelection$.pipe(
116
- map(axesSelection => {
117
- return axesSelection.select<SVGDefsElement>('defs')
118
- }),
119
- shareReplay(1)
120
- )
121
- const graphicGSelection$ = combineLatest({
122
- axesSelection: axesSelection$,
123
- gridGraphicTransform: gridGraphicTransform$
124
- }).pipe(
125
- switchMap(async d => d),
126
- map(data => {
127
- const graphicGSelection = data.axesSelection
128
- .select<SVGGElement>(`g.${graphicClassName}`)
129
- graphicGSelection
130
- .transition()
131
- .duration(50)
132
- .style('transform', data.gridGraphicTransform.value)
133
- return graphicGSelection
134
- }),
135
- shareReplay(1)
136
- )
137
-
138
- return {
139
- seriesSelection$,
140
- axesSelection$,
141
- defsSelection$,
142
- graphicGSelection$
143
- }
144
- }
145
-
146
- // 由事件取得group data的function
147
- export const gridGroupPositionFnObservable = ({ fullDataFormatter$, gridAxesSize$, computedData$, fullChartParams$ }: {
148
- fullDataFormatter$: Observable<DataFormatterGrid>
149
- gridAxesSize$: Observable<{
150
- width: number;
151
- height: number;
152
- }>
153
- computedData$: Observable<ComputedDataGrid>
154
- // GroupDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
155
- fullChartParams$: Observable<ChartParams>
156
- }): Observable<(event: any) => { groupIndex: number; groupLabel: string }> => {
157
- const destroy$ = new Subject()
158
-
159
- // 顯示範圍內的group labels
160
- const scaleRangeGroupLabels$: Observable<string[]> = new Observable(subscriber => {
161
- combineLatest({
162
- dataFormatter: fullDataFormatter$,
163
- computedData: computedData$
164
- }).pipe(
165
- takeUntil(destroy$),
166
- switchMap(async (d) => d),
167
- ).subscribe(data => {
168
- const groupMin = 0
169
- const groupMax = data.computedData[0] ? data.computedData[0].length - 1 : 0
170
- const groupScaleDomainMin = data.dataFormatter.grid.groupAxis.scaleDomain[0] === 'auto'
171
- ? groupMin - data.dataFormatter.grid.groupAxis.scalePadding
172
- : data.dataFormatter.grid.groupAxis.scaleDomain[0] as number - data.dataFormatter.grid.groupAxis.scalePadding
173
- const groupScaleDomainMax = data.dataFormatter.grid.groupAxis.scaleDomain[1] === 'auto'
174
- ? groupMax + data.dataFormatter.grid.groupAxis.scalePadding
175
- : data.dataFormatter.grid.groupAxis.scaleDomain[1] as number + data.dataFormatter.grid.groupAxis.scalePadding
176
-
177
- // const groupingAmount = data.computedData[0]
178
- // ? data.computedData[0].length
179
- // : 0
180
-
181
- let _labels = data.dataFormatter.grid.seriesDirection === 'row'
182
- ? (data.computedData[0] ?? []).map(d => d.groupLabel)
183
- : data.computedData.map(d => d[0].groupLabel)
184
-
185
- const _axisLabels =
186
- // new Array(groupingAmount).fill(0)
187
- // .map((d, i) => {
188
- // return _labels[i] != null
189
- // ? _labels[i]
190
- // : String(i) // 沒有label則用序列號填充
191
- // })
192
- _labels
193
- .filter((d, i) => {
194
- return i >= groupScaleDomainMin && i <= groupScaleDomainMax
195
- })
196
- subscriber.next(_axisLabels)
197
- })
198
- })
199
-
200
- return new Observable<(event: any) => { groupIndex: number; groupLabel: string }>(subscriber => {
201
- combineLatest({
202
- dataFormatter: fullDataFormatter$,
203
- axisSize: gridAxesSize$,
204
- fullChartParams: fullChartParams$,
205
- scaleRangeGroupLabels: scaleRangeGroupLabels$
206
- }).pipe(
207
- takeUntil(destroy$),
208
- switchMap(async (d) => d),
209
- ).subscribe(data => {
210
-
211
- const reverse = data.dataFormatter.grid.valueAxis.position === 'right'
212
- || data.dataFormatter.grid.valueAxis.position === 'bottom'
213
- ? true : false
214
-
215
- // 比例尺座標對應非連續資料索引
216
- const groupIndexScale = createAxisQuantizeScale({
217
- axisLabels: data.scaleRangeGroupLabels,
218
- axisWidth: data.axisSize.width,
219
- reverse
220
- })
221
-
222
- // 依比例尺位置計算座標
223
- const axisValuePredicate = (event: any) => {
224
- return data.dataFormatter.grid.groupAxis.position === 'bottom'
225
- || data.dataFormatter.grid.groupAxis.position === 'top'
226
- ? event.offsetX - data.fullChartParams.padding.left
227
- : event.offsetY - data.fullChartParams.padding.top
228
- }
229
-
230
- // 比例尺座標取得groupData的function
231
- const createEventGroupData: (event: any) => { groupIndex: number; groupLabel: string } = (event: any) => {
232
- const axisValue = axisValuePredicate(event)
233
- const groupIndex = groupIndexScale(axisValue)
234
- return {
235
- groupIndex,
236
- groupLabel: data.scaleRangeGroupLabels[groupIndex] ?? ''
237
- }
238
- }
239
-
240
- subscriber.next(createEventGroupData)
241
-
242
- return function unsubscribe () {
243
- destroy$.next(undefined)
244
- }
245
- })
246
- })
247
- }
1
+ import * as d3 from 'd3'
2
+ import {
3
+ Observable,
4
+ Subject,
5
+ of,
6
+ takeUntil,
7
+ filter,
8
+ map,
9
+ switchMap,
10
+ combineLatest,
11
+ merge,
12
+ shareReplay,
13
+ distinctUntilChanged
14
+ } from 'rxjs'
15
+ import type {
16
+ ChartParams,
17
+ HighlightTarget,
18
+ DataFormatterGrid,
19
+ ComputedDataGrid,
20
+ ComputedDatumGrid,
21
+ TransformData,
22
+ GridContainerPosition,
23
+ Layout } from '@orbcharts/core'
24
+ import { createAxisQuantizeScale } from '@orbcharts/core'
25
+ import { getClassName, getUniID } from '../utils/orbchartsUtils'
26
+
27
+ // grid選取器
28
+ export const gridSelectionsObservable = ({ selection, pluginName, clipPathID, seriesLabels$, gridContainerPosition$, gridAxesTransform$, gridGraphicTransform$ }: {
29
+ selection: d3.Selection<any, unknown, any, unknown>
30
+ pluginName: string
31
+ clipPathID: string
32
+ // computedData$: Observable<ComputedDataGrid>
33
+ seriesLabels$: Observable<string[]>
34
+ gridContainerPosition$: Observable<GridContainerPosition[]>
35
+ gridAxesTransform$: Observable<TransformData>
36
+ gridGraphicTransform$: Observable<TransformData>
37
+ }) => {
38
+ const seriesClassName = getClassName(pluginName, 'series')
39
+ const axesClassName = getClassName(pluginName, 'axes')
40
+ const graphicClassName = getClassName(pluginName, 'graphic')
41
+
42
+ const seriesSelection$ = seriesLabels$.pipe(
43
+ map((existSeriesLabels, i) => {
44
+ return selection
45
+ .selectAll<SVGGElement, string>(`g.${seriesClassName}`)
46
+ .data(existSeriesLabels, d => d)
47
+ .join(
48
+ enter => {
49
+ return enter
50
+ .append('g')
51
+ .classed(seriesClassName, true)
52
+ .each((d, i, g) => {
53
+ const axesSelection = d3.select(g[i])
54
+ .selectAll<SVGGElement, ComputedDatumGrid[]>(`g.${axesClassName}`)
55
+ .data([i])
56
+ .join(
57
+ enter => {
58
+ return enter
59
+ .append('g')
60
+ .classed(axesClassName, true)
61
+ .attr('clip-path', `url(#${clipPathID})`)
62
+ .each((d, i, g) => {
63
+ const defsSelection = d3.select(g[i])
64
+ .selectAll<SVGDefsElement, any>('defs')
65
+ .data([i])
66
+ .join('defs')
67
+
68
+ const graphicGSelection = d3.select(g[i])
69
+ .selectAll<SVGGElement, any>('g')
70
+ .data([i])
71
+ .join('g')
72
+ .classed(graphicClassName, true)
73
+ })
74
+ },
75
+ update => update,
76
+ exit => exit.remove()
77
+ )
78
+ })
79
+ },
80
+ update => update,
81
+ exit => exit.remove()
82
+ )
83
+ }),
84
+ shareReplay(1)
85
+ )
86
+
87
+ combineLatest({
88
+ seriesSelection: seriesSelection$,
89
+ gridContainerPosition: gridContainerPosition$
90
+ }).pipe(
91
+ switchMap(async d => d)
92
+ ).subscribe(data => {
93
+ data.seriesSelection
94
+ .transition()
95
+ .attr('transform', (d, i) => {
96
+ const gridContainerPosition = data.gridContainerPosition[i] ?? data.gridContainerPosition[0]
97
+ const translate = gridContainerPosition.translate
98
+ const scale = gridContainerPosition.scale
99
+ return `translate(${translate[0]}, ${translate[1]}) scale(${scale[0]}, ${scale[1]})`
100
+ })
101
+ })
102
+
103
+ const axesSelection$ = combineLatest({
104
+ seriesSelection: seriesSelection$,
105
+ gridAxesTransform: gridAxesTransform$
106
+ }).pipe(
107
+ switchMap(async d => d),
108
+ map(data => {
109
+ return data.seriesSelection
110
+ .select<SVGGElement>(`g.${axesClassName}`)
111
+ .style('transform', data.gridAxesTransform.value)
112
+ }),
113
+ shareReplay(1)
114
+ )
115
+ const defsSelection$ = axesSelection$.pipe(
116
+ map(axesSelection => {
117
+ return axesSelection.select<SVGDefsElement>('defs')
118
+ }),
119
+ shareReplay(1)
120
+ )
121
+ const graphicGSelection$ = combineLatest({
122
+ axesSelection: axesSelection$,
123
+ gridGraphicTransform: gridGraphicTransform$
124
+ }).pipe(
125
+ switchMap(async d => d),
126
+ map(data => {
127
+ const graphicGSelection = data.axesSelection
128
+ .select<SVGGElement>(`g.${graphicClassName}`)
129
+ graphicGSelection
130
+ .transition()
131
+ .duration(50)
132
+ .style('transform', data.gridGraphicTransform.value)
133
+ return graphicGSelection
134
+ }),
135
+ shareReplay(1)
136
+ )
137
+
138
+ return {
139
+ seriesSelection$,
140
+ axesSelection$,
141
+ defsSelection$,
142
+ graphicGSelection$
143
+ }
144
+ }
145
+
146
+ // 由事件取得group data的function
147
+ export const gridGroupPositionFnObservable = ({ fullDataFormatter$, gridAxesSize$, computedData$, fullChartParams$ }: {
148
+ fullDataFormatter$: Observable<DataFormatterGrid>
149
+ gridAxesSize$: Observable<{
150
+ width: number;
151
+ height: number;
152
+ }>
153
+ computedData$: Observable<ComputedDataGrid>
154
+ // GroupDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
155
+ fullChartParams$: Observable<ChartParams>
156
+ }): Observable<(event: any) => { groupIndex: number; groupLabel: string }> => {
157
+ const destroy$ = new Subject()
158
+
159
+ // 顯示範圍內的group labels
160
+ const scaleRangeGroupLabels$: Observable<string[]> = new Observable(subscriber => {
161
+ combineLatest({
162
+ dataFormatter: fullDataFormatter$,
163
+ computedData: computedData$
164
+ }).pipe(
165
+ takeUntil(destroy$),
166
+ switchMap(async (d) => d),
167
+ ).subscribe(data => {
168
+ const groupMin = 0
169
+ const groupMax = data.computedData[0] ? data.computedData[0].length - 1 : 0
170
+ const groupScaleDomainMin = data.dataFormatter.grid.groupAxis.scaleDomain[0] === 'auto'
171
+ ? groupMin - data.dataFormatter.grid.groupAxis.scalePadding
172
+ : data.dataFormatter.grid.groupAxis.scaleDomain[0] as number - data.dataFormatter.grid.groupAxis.scalePadding
173
+ const groupScaleDomainMax = data.dataFormatter.grid.groupAxis.scaleDomain[1] === 'auto'
174
+ ? groupMax + data.dataFormatter.grid.groupAxis.scalePadding
175
+ : data.dataFormatter.grid.groupAxis.scaleDomain[1] as number + data.dataFormatter.grid.groupAxis.scalePadding
176
+
177
+ // const groupingAmount = data.computedData[0]
178
+ // ? data.computedData[0].length
179
+ // : 0
180
+
181
+ let _labels = data.dataFormatter.grid.seriesDirection === 'row'
182
+ ? (data.computedData[0] ?? []).map(d => d.groupLabel)
183
+ : data.computedData.map(d => d[0].groupLabel)
184
+
185
+ const _axisLabels =
186
+ // new Array(groupingAmount).fill(0)
187
+ // .map((d, i) => {
188
+ // return _labels[i] != null
189
+ // ? _labels[i]
190
+ // : String(i) // 沒有label則用序列號填充
191
+ // })
192
+ _labels
193
+ .filter((d, i) => {
194
+ return i >= groupScaleDomainMin && i <= groupScaleDomainMax
195
+ })
196
+ subscriber.next(_axisLabels)
197
+ })
198
+ })
199
+
200
+ return new Observable<(event: any) => { groupIndex: number; groupLabel: string }>(subscriber => {
201
+ combineLatest({
202
+ dataFormatter: fullDataFormatter$,
203
+ axisSize: gridAxesSize$,
204
+ fullChartParams: fullChartParams$,
205
+ scaleRangeGroupLabels: scaleRangeGroupLabels$
206
+ }).pipe(
207
+ takeUntil(destroy$),
208
+ switchMap(async (d) => d),
209
+ ).subscribe(data => {
210
+
211
+ const reverse = data.dataFormatter.grid.valueAxis.position === 'right'
212
+ || data.dataFormatter.grid.valueAxis.position === 'bottom'
213
+ ? true : false
214
+
215
+ // 比例尺座標對應非連續資料索引
216
+ const groupIndexScale = createAxisQuantizeScale({
217
+ axisLabels: data.scaleRangeGroupLabels,
218
+ axisWidth: data.axisSize.width,
219
+ reverse
220
+ })
221
+
222
+ // 依比例尺位置計算座標
223
+ const axisValuePredicate = (event: any) => {
224
+ return data.dataFormatter.grid.groupAxis.position === 'bottom'
225
+ || data.dataFormatter.grid.groupAxis.position === 'top'
226
+ ? event.offsetX - data.fullChartParams.padding.left
227
+ : event.offsetY - data.fullChartParams.padding.top
228
+ }
229
+
230
+ // 比例尺座標取得groupData的function
231
+ const createEventGroupData: (event: any) => { groupIndex: number; groupLabel: string } = (event: any) => {
232
+ const axisValue = axisValuePredicate(event)
233
+ const groupIndex = groupIndexScale(axisValue)
234
+ return {
235
+ groupIndex,
236
+ groupLabel: data.scaleRangeGroupLabels[groupIndex] ?? ''
237
+ }
238
+ }
239
+
240
+ subscriber.next(createEventGroupData)
241
+
242
+ return function unsubscribe () {
243
+ destroy$.next(undefined)
244
+ }
245
+ })
246
+ })
247
+ }
package/src/grid/index.ts CHANGED
@@ -1,15 +1,15 @@
1
- export * from './defaults'
2
- export * from './types'
3
- export { Lines } from './plugins/Lines'
4
- export { LineAreas } from './plugins/LineAreas'
5
- export { Bars } from './plugins/Bars'
6
- export { BarsDiverging } from './plugins/BarsDiverging'
7
- export { BarStack } from './plugins/BarStack'
8
- export { BarsTriangle } from './plugins/BarsTriangle'
9
- export { Dots } from './plugins/Dots'
10
- export { GridLegend } from './plugins/GridLegend'
11
- export { GroupAxis } from './plugins/GroupAxis'
12
- export { ValueAxis } from './plugins/ValueAxis'
13
- export { ValueStackAxis } from './plugins/ValueStackAxis'
14
- export { ScalingArea } from './plugins/ScalingArea'
15
- export { GroupAux } from './plugins/GroupAux'
1
+ export * from './defaults'
2
+ export * from './types'
3
+ export { Lines } from './plugins/Lines'
4
+ export { LineAreas } from './plugins/LineAreas'
5
+ export { Bars } from './plugins/Bars'
6
+ export { BarsDiverging } from './plugins/BarsDiverging'
7
+ export { BarStack } from './plugins/BarStack'
8
+ export { BarsTriangle } from './plugins/BarsTriangle'
9
+ export { Dots } from './plugins/Dots'
10
+ export { GridLegend } from './plugins/GridLegend'
11
+ export { GroupAxis } from './plugins/GroupAxis'
12
+ export { ValueAxis } from './plugins/ValueAxis'
13
+ export { ValueStackAxis } from './plugins/ValueStackAxis'
14
+ export { ScalingArea } from './plugins/ScalingArea'
15
+ export { GroupAux } from './plugins/GroupAux'
@@ -1,51 +1,51 @@
1
- import {
2
- map,
3
- distinctUntilChanged,
4
- shareReplay,
5
- takeUntil,
6
- Subject,
7
- Observable } from 'rxjs'
8
- import { defineGridPlugin } from '@orbcharts/core'
9
- import { DEFAULT_BAR_STACK_PARAMS } from '../defaults'
10
- import { createBaseBarStack } from '../../base/BaseBarStack'
11
-
12
- const pluginName = 'BarStack'
13
-
14
-
15
- export const BarStack = defineGridPlugin(pluginName, DEFAULT_BAR_STACK_PARAMS)(({ selection, name, subject, observer }) => {
16
- const destroy$ = new Subject()
17
-
18
- const isSeriesSeprate$ = observer.fullDataFormatter$.pipe(
19
- takeUntil(destroy$),
20
- map(d => d.grid.separateSeries),
21
- distinctUntilChanged(),
22
- shareReplay(1)
23
- )
24
-
25
- const unsubscribeBaseBars = createBaseBarStack(pluginName, {
26
- selection,
27
- computedData$: observer.computedData$,
28
- computedLayoutData$: observer.computedLayoutData$,
29
- visibleComputedData$: observer.visibleComputedData$,
30
- visibleComputedLayoutData$: observer.visibleComputedLayoutData$,
31
- seriesLabels$: observer.seriesLabels$,
32
- SeriesDataMap$: observer.SeriesDataMap$,
33
- GroupDataMap$: observer.GroupDataMap$,
34
- fullParams$: observer.fullParams$,
35
- fullDataFormatter$: observer.fullDataFormatter$,
36
- fullChartParams$: observer.fullChartParams$,
37
- gridAxesTransform$: observer.gridAxesTransform$,
38
- gridGraphicTransform$: observer.gridGraphicTransform$,
39
- gridGraphicReverseScale$: observer.gridGraphicReverseScale$,
40
- gridAxesSize$: observer.gridAxesSize$,
41
- gridHighlight$: observer.gridHighlight$,
42
- gridContainerPosition$: observer.gridContainerPosition$,
43
- isSeriesSeprate$,
44
- event$: subject.event$,
45
- })
46
-
47
- return () => {
48
- destroy$.next(undefined)
49
- unsubscribeBaseBars()
50
- }
1
+ import {
2
+ map,
3
+ distinctUntilChanged,
4
+ shareReplay,
5
+ takeUntil,
6
+ Subject,
7
+ Observable } from 'rxjs'
8
+ import { defineGridPlugin } from '@orbcharts/core'
9
+ import { DEFAULT_BAR_STACK_PARAMS } from '../defaults'
10
+ import { createBaseBarStack } from '../../base/BaseBarStack'
11
+
12
+ const pluginName = 'BarStack'
13
+
14
+
15
+ export const BarStack = defineGridPlugin(pluginName, DEFAULT_BAR_STACK_PARAMS)(({ selection, name, subject, observer }) => {
16
+ const destroy$ = new Subject()
17
+
18
+ const isSeriesSeprate$ = observer.fullDataFormatter$.pipe(
19
+ takeUntil(destroy$),
20
+ map(d => d.grid.separateSeries),
21
+ distinctUntilChanged(),
22
+ shareReplay(1)
23
+ )
24
+
25
+ const unsubscribeBaseBars = createBaseBarStack(pluginName, {
26
+ selection,
27
+ computedData$: observer.computedData$,
28
+ computedLayoutData$: observer.computedLayoutData$,
29
+ visibleComputedData$: observer.visibleComputedData$,
30
+ visibleComputedLayoutData$: observer.visibleComputedLayoutData$,
31
+ seriesLabels$: observer.seriesLabels$,
32
+ SeriesDataMap$: observer.SeriesDataMap$,
33
+ GroupDataMap$: observer.GroupDataMap$,
34
+ fullParams$: observer.fullParams$,
35
+ fullDataFormatter$: observer.fullDataFormatter$,
36
+ fullChartParams$: observer.fullChartParams$,
37
+ gridAxesTransform$: observer.gridAxesTransform$,
38
+ gridGraphicTransform$: observer.gridGraphicTransform$,
39
+ gridGraphicReverseScale$: observer.gridGraphicReverseScale$,
40
+ gridAxesSize$: observer.gridAxesSize$,
41
+ gridHighlight$: observer.gridHighlight$,
42
+ gridContainerPosition$: observer.gridContainerPosition$,
43
+ isSeriesSeprate$,
44
+ event$: subject.event$,
45
+ })
46
+
47
+ return () => {
48
+ destroy$.next(undefined)
49
+ unsubscribeBaseBars()
50
+ }
51
51
  })