@orbcharts/plugins-basic 3.0.0-alpha.75 → 3.0.0-alpha.77

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 (143) hide show
  1. package/LICENSE +200 -200
  2. package/dist/lib/plugins-basic-types.d.ts +1 -0
  3. package/dist/orbcharts-plugins-basic.es.js +3461 -3468
  4. package/dist/orbcharts-plugins-basic.umd.js +17 -17
  5. package/dist/src/base/BaseBarStack.d.ts +1 -5
  6. package/dist/src/base/BaseBars.d.ts +1 -6
  7. package/dist/src/base/BaseBarsTriangle.d.ts +1 -6
  8. package/dist/src/base/BaseDots.d.ts +2 -8
  9. package/dist/src/base/BaseGroupAxis.d.ts +2 -16
  10. package/dist/src/base/BaseLegend.d.ts +2 -15
  11. package/dist/src/base/BaseLineAreas.d.ts +1 -4
  12. package/dist/src/base/BaseLines.d.ts +1 -4
  13. package/dist/src/base/BaseValueAxis.d.ts +2 -16
  14. package/dist/src/grid/defaults.d.ts +1 -1
  15. package/dist/src/grid/index.d.ts +0 -1
  16. package/dist/src/grid/plugins/BarStack.d.ts +1 -1
  17. package/dist/src/grid/plugins/Bars.d.ts +1 -1
  18. package/dist/src/grid/plugins/BarsPN.d.ts +1 -1
  19. package/dist/src/grid/plugins/BarsTriangle.d.ts +1 -1
  20. package/dist/src/grid/plugins/Dots.d.ts +1 -1
  21. package/dist/src/grid/plugins/GridLegend.d.ts +1 -1
  22. package/dist/src/grid/plugins/GroupAux.d.ts +1 -1
  23. package/dist/src/grid/plugins/GroupAxis.d.ts +1 -1
  24. package/dist/src/grid/plugins/LineAreas.d.ts +1 -1
  25. package/dist/src/grid/plugins/Lines.d.ts +1 -1
  26. package/dist/src/grid/plugins/ScalingArea.d.ts +1 -1
  27. package/dist/src/grid/plugins/ValueAxis.d.ts +1 -1
  28. package/dist/src/grid/plugins/ValueStackAxis.d.ts +1 -1
  29. package/dist/src/multiGrid/defaults.d.ts +1 -1
  30. package/dist/src/multiGrid/index.d.ts +0 -1
  31. package/dist/src/multiGrid/plugins/MultiBarStack.d.ts +1 -1
  32. package/dist/src/multiGrid/plugins/MultiBars.d.ts +1 -1
  33. package/dist/src/multiGrid/plugins/MultiBarsTriangle.d.ts +1 -1
  34. package/dist/src/multiGrid/plugins/MultiDots.d.ts +1 -1
  35. package/dist/src/multiGrid/plugins/MultiGridLegend.d.ts +1 -1
  36. package/dist/src/multiGrid/plugins/MultiGroupAxis.d.ts +1 -1
  37. package/dist/src/multiGrid/plugins/MultiLineAreas.d.ts +1 -1
  38. package/dist/src/multiGrid/plugins/MultiLines.d.ts +1 -1
  39. package/dist/src/multiGrid/plugins/MultiValueAxis.d.ts +1 -1
  40. package/dist/src/multiGrid/plugins/MultiValueStackAxis.d.ts +1 -1
  41. package/dist/src/multiGrid/plugins/OverlappingValueAxes.d.ts +1 -1
  42. package/dist/src/multiGrid/plugins/OverlappingValueStackAxes.d.ts +1 -1
  43. package/dist/src/noneData/defaults.d.ts +1 -1
  44. package/dist/src/noneData/index.d.ts +0 -1
  45. package/dist/src/noneData/plugins/Container.d.ts +1 -1
  46. package/dist/src/noneData/plugins/Tooltip.d.ts +1 -1
  47. package/dist/src/series/defaults.d.ts +1 -1
  48. package/dist/src/series/index.d.ts +0 -1
  49. package/dist/src/series/plugins/Bubbles.d.ts +1 -1
  50. package/dist/src/series/plugins/Pie.d.ts +1 -1
  51. package/dist/src/series/plugins/PieEventTexts.d.ts +1 -1
  52. package/dist/src/series/plugins/PieLabels.d.ts +1 -1
  53. package/dist/src/series/plugins/Rose.d.ts +1 -1
  54. package/dist/src/series/plugins/RoseLabels.d.ts +1 -1
  55. package/dist/src/series/plugins/SeriesLegend.d.ts +1 -1
  56. package/dist/src/tree/defaults.d.ts +1 -1
  57. package/dist/src/tree/index.d.ts +0 -1
  58. package/dist/src/tree/plugins/TreeLegend.d.ts +1 -1
  59. package/dist/src/tree/plugins/TreeMap.d.ts +1 -1
  60. package/lib/core-types.ts +7 -7
  61. package/lib/core.ts +6 -6
  62. package/lib/plugins-basic-types.ts +6 -0
  63. package/package.json +44 -43
  64. package/src/base/BaseBarStack.ts +780 -779
  65. package/src/base/BaseBars.ts +765 -764
  66. package/src/base/BaseBarsTriangle.ts +674 -672
  67. package/src/base/BaseDots.ts +515 -513
  68. package/src/base/BaseGroupAxis.ts +679 -678
  69. package/src/base/BaseLegend.ts +644 -642
  70. package/src/base/BaseLineAreas.ts +629 -627
  71. package/src/base/BaseLines.ts +706 -704
  72. package/src/base/BaseValueAxis.ts +580 -578
  73. package/src/base/types.ts +2 -2
  74. package/src/const.ts +30 -30
  75. package/src/grid/defaults.ts +128 -128
  76. package/src/grid/gridObservables.ts +545 -545
  77. package/src/grid/index.ts +15 -15
  78. package/src/grid/plugins/BarStack.ts +64 -64
  79. package/src/grid/plugins/Bars.ts +69 -69
  80. package/src/grid/plugins/BarsPN.ts +66 -66
  81. package/src/grid/plugins/BarsTriangle.ts +73 -73
  82. package/src/grid/plugins/Dots.ts +68 -68
  83. package/src/grid/plugins/GridLegend.ts +96 -96
  84. package/src/grid/plugins/GroupAux.ts +1098 -1098
  85. package/src/grid/plugins/GroupAxis.ts +97 -97
  86. package/src/grid/plugins/LineAreas.ts +65 -65
  87. package/src/grid/plugins/Lines.ts +59 -59
  88. package/src/grid/plugins/ScalingArea.ts +218 -218
  89. package/src/grid/plugins/ValueAxis.ts +93 -93
  90. package/src/grid/plugins/ValueStackAxis.ts +95 -95
  91. package/src/index.ts +9 -9
  92. package/src/multiGrid/defaults.ts +158 -158
  93. package/src/multiGrid/index.ts +13 -13
  94. package/src/multiGrid/multiGridObservables.ts +49 -49
  95. package/src/multiGrid/plugins/MultiBarStack.ts +106 -106
  96. package/src/multiGrid/plugins/MultiBars.ts +108 -108
  97. package/src/multiGrid/plugins/MultiBarsTriangle.ts +114 -114
  98. package/src/multiGrid/plugins/MultiDots.ts +102 -102
  99. package/src/multiGrid/plugins/MultiGridLegend.ts +148 -148
  100. package/src/multiGrid/plugins/MultiGroupAxis.ts +137 -137
  101. package/src/multiGrid/plugins/MultiLineAreas.ts +107 -107
  102. package/src/multiGrid/plugins/MultiLines.ts +101 -101
  103. package/src/multiGrid/plugins/MultiValueAxis.ts +133 -133
  104. package/src/multiGrid/plugins/MultiValueStackAxis.ts +133 -133
  105. package/src/multiGrid/plugins/OverlappingValueAxes.ts +299 -299
  106. package/src/multiGrid/plugins/OverlappingValueStackAxes.ts +298 -298
  107. package/src/noneData/defaults.ts +102 -102
  108. package/src/noneData/index.ts +3 -3
  109. package/src/noneData/plugins/Container.ts +27 -27
  110. package/src/noneData/plugins/Tooltip.ts +373 -373
  111. package/src/series/defaults.ts +149 -149
  112. package/src/series/index.ts +9 -9
  113. package/src/series/plugins/Bubbles.ts +603 -603
  114. package/src/series/plugins/Pie.ts +623 -623
  115. package/src/series/plugins/PieEventTexts.ts +283 -283
  116. package/src/series/plugins/PieLabels.ts +640 -640
  117. package/src/series/plugins/Rose.ts +516 -516
  118. package/src/series/plugins/RoseLabels.ts +600 -600
  119. package/src/series/plugins/SeriesLegend.ts +96 -96
  120. package/src/series/seriesObservables.ts +145 -145
  121. package/src/series/seriesUtils.ts +51 -51
  122. package/src/tree/defaults.ts +23 -23
  123. package/src/tree/index.ts +3 -3
  124. package/src/tree/plugins/TreeLegend.ts +96 -96
  125. package/src/tree/plugins/TreeMap.ts +333 -333
  126. package/src/utils/commonUtils.ts +21 -21
  127. package/src/utils/d3Graphics.ts +174 -174
  128. package/src/utils/d3Utils.ts +73 -73
  129. package/src/utils/observables.ts +14 -14
  130. package/src/utils/orbchartsUtils.ts +100 -100
  131. package/tsconfig.base.json +13 -13
  132. package/tsconfig.json +2 -2
  133. package/vite.config.js +22 -22
  134. package/dist/src/grid/types.d.ts +0 -93
  135. package/dist/src/multiGrid/types.d.ts +0 -61
  136. package/dist/src/noneData/types.d.ts +0 -24
  137. package/dist/src/series/types.d.ts +0 -73
  138. package/dist/src/tree/types.d.ts +0 -21
  139. package/src/grid/types.ts +0 -124
  140. package/src/multiGrid/types.ts +0 -73
  141. package/src/noneData/types.ts +0 -26
  142. package/src/series/types.ts +0 -87
  143. package/src/tree/types.ts +0 -23
@@ -1,298 +1,298 @@
1
- import * as d3 from 'd3'
2
- import {
3
- of,
4
- map,
5
- switchMap,
6
- combineLatest,
7
- takeUntil,
8
- distinctUntilChanged,
9
- shareReplay,
10
- iif,
11
- Observable,
12
- Subject } from 'rxjs'
13
- import type { DefinePluginConfig } from '../../../lib/core-types'
14
- import type { ContextObserverMultiGrid, DataFormatterGrid, DataFormatterTypeMap, Layout } from '../../../lib/core-types'
15
- import {
16
- defineMultiGridPlugin } from '../../../lib/core'
17
- import { DEFAULT_OVERLAPPING_VALUE_STACK_AXES_PARAMS } from '../defaults'
18
- import { createBaseValueAxis } from '../../base/BaseValueAxis'
19
- import { multiGridPluginDetailObservables } from '../multiGridObservables'
20
- import { getClassName, getUniID } from '../../utils/orbchartsUtils'
21
- import { gridAxesTransformObservable, gridAxesReverseTransformObservable, gridContainerPositionObservable } from '../../../lib/core'
22
- import { LAYER_INDEX_OF_AXIS } from '../../const'
23
-
24
- const pluginName = 'OverlappingValueStackAxes'
25
-
26
- const gridClassName = getClassName(pluginName, 'grid')
27
-
28
- const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_OVERLAPPING_VALUE_STACK_AXES_PARAMS> = {
29
- name: pluginName,
30
- defaultParams: DEFAULT_OVERLAPPING_VALUE_STACK_AXES_PARAMS,
31
- layerIndex: LAYER_INDEX_OF_AXIS,
32
- validator: (params, { validateColumns }) => {
33
- const result = validateColumns(params, {
34
- firstAxis: {
35
- toBeTypes: ['object']
36
- },
37
- secondAxis: {
38
- toBeTypes: ['object']
39
- },
40
- gridIndexes: {
41
- toBe: '[number, number]',
42
- test: (value: any) => {
43
- return Array.isArray(value) && value.length === 2
44
- }
45
- }
46
- })
47
- if (params.firstAxis) {
48
- const firstAxisResult = validateColumns(params.firstAxis, {
49
- labelOffset: {
50
- toBe: '[number, number]',
51
- test: (value: any) => {
52
- return Array.isArray(value)
53
- && value.length === 2
54
- && typeof value[0] === 'number'
55
- && typeof value[1] === 'number'
56
- }
57
- },
58
- labelColorType: {
59
- toBeOption: 'ColorType',
60
- },
61
- axisLineVisible: {
62
- toBeTypes: ['boolean']
63
- },
64
- axisLineColorType: {
65
- toBeOption: 'ColorType',
66
- },
67
- ticks: {
68
- toBeTypes: ['number']
69
- },
70
- tickFormat: {
71
- toBeTypes: ['string', 'Function']
72
- },
73
- tickLineVisible: {
74
- toBeTypes: ['boolean']
75
- },
76
- tickPadding: {
77
- toBeTypes: ['number']
78
- },
79
- tickFullLine: {
80
- toBeTypes: ['boolean']
81
- },
82
- tickFullLineDasharray: {
83
- toBeTypes: ['string']
84
- },
85
- tickColorType: {
86
- toBeOption: 'ColorType',
87
- },
88
- tickTextRotate: {
89
- toBeTypes: ['number']
90
- },
91
- tickTextColorType: {
92
- toBeOption: 'ColorType',
93
- }
94
- })
95
- if (firstAxisResult.status === 'error') {
96
- return firstAxisResult
97
- }
98
- }
99
- if (params.secondAxis) {
100
- const secondAxisResult = validateColumns(params.secondAxis, {
101
- labelOffset: {
102
- toBe: '[number, number]',
103
- test: (value: any) => {
104
- return Array.isArray(value)
105
- && value.length === 2
106
- && typeof value[0] === 'number'
107
- && typeof value[1] === 'number'
108
- }
109
- },
110
- labelColorType: {
111
- toBeOption: 'ColorType',
112
- },
113
- axisLineVisible: {
114
- toBeTypes: ['boolean']
115
- },
116
- axisLineColorType: {
117
- toBeOption: 'ColorType',
118
- },
119
- ticks: {
120
- toBeTypes: ['number']
121
- },
122
- tickFormat: {
123
- toBeTypes: ['string', 'Function']
124
- },
125
- tickLineVisible: {
126
- toBeTypes: ['boolean']
127
- },
128
- tickPadding: {
129
- toBeTypes: ['number']
130
- },
131
- tickFullLine: {
132
- toBeTypes: ['boolean']
133
- },
134
- tickFullLineDasharray: {
135
- toBeTypes: ['string']
136
- },
137
- tickColorType: {
138
- toBeOption: 'ColorType',
139
- },
140
- tickTextRotate: {
141
- toBeTypes: ['number']
142
- },
143
- tickTextColorType: {
144
- toBeOption: 'ColorType',
145
- }
146
- })
147
- if (secondAxisResult.status === 'error') {
148
- return secondAxisResult
149
- }
150
- }
151
- return result
152
- }
153
- }
154
-
155
- // 第一個圖軸使用堆疊的資料,第二個圖軸使用原始資料
156
- export const OverlappingValueStackAxes = defineMultiGridPlugin(pluginConfig)(({ selection, name, subject, observer }) => {
157
- const destroy$ = new Subject()
158
-
159
- const unsubscribeFnArr: (() => void)[] = []
160
-
161
- const firstGridIndex$ = observer.fullParams$.pipe(
162
- takeUntil(destroy$),
163
- map(fullParams => fullParams.gridIndexes[0])
164
- )
165
-
166
- const secondGridIndex$ = observer.fullParams$.pipe(
167
- takeUntil(destroy$),
168
- map(fullParams => fullParams.gridIndexes[1])
169
- )
170
-
171
- // 為了要反轉第二個valueAxis的位置所以要重新計算
172
- const secondGridDataFormatter$: Observable<DataFormatterGrid> = combineLatest({
173
- firstGridIndex: firstGridIndex$,
174
- secondGridIndex: secondGridIndex$,
175
- fullDataFormatter: observer.fullDataFormatter$,
176
- }).pipe(
177
- takeUntil(destroy$),
178
- switchMap(async (d) => d),
179
- map(data => {
180
- if (!data.fullDataFormatter.gridList[data.secondGridIndex]) {
181
- data.fullDataFormatter.gridList[data.secondGridIndex] = Object.assign({}, data.fullDataFormatter.gridList[data.firstGridIndex])
182
- }
183
- const position = data.fullDataFormatter.gridList[data.firstGridIndex].valueAxis.position
184
- // 反轉第二個valueAxis的位置
185
- let reversePosition = position
186
- if (position === 'left') {
187
- reversePosition = 'right'
188
- } else if (position === 'bottom') {
189
- reversePosition = 'top'
190
- } else if (position === 'top') {
191
- reversePosition = 'bottom'
192
- } else if (position === 'right') {
193
- reversePosition = 'left'
194
- }
195
- return <DataFormatterGrid>{
196
- type: 'grid',
197
- visibleFilter: data.fullDataFormatter.visibleFilter as any,
198
- grid: {
199
- ...data.fullDataFormatter.gridList[data.secondGridIndex],
200
- valueAxis: {
201
- ...data.fullDataFormatter.gridList[data.secondGridIndex].valueAxis,
202
- position: reversePosition
203
- }
204
- },
205
- container: {
206
- ...data.fullDataFormatter.container
207
- }
208
- }
209
- })
210
- )
211
-
212
- const multiGridPluginDetail$ = of(observer).pipe(
213
- takeUntil(destroy$),
214
- map(observer => {
215
- // 將observer的gridIndexes限制在2個
216
- return {
217
- ...observer,
218
- fullParams$: observer.fullParams$.pipe(
219
- map(fullParams => {
220
- if (fullParams.gridIndexes.length > 2) {
221
- fullParams.gridIndexes.length = 2
222
- }
223
- return fullParams
224
- })
225
- )
226
- }
227
- }),
228
- switchMap(observer => multiGridPluginDetailObservables(observer)),
229
- map(data => {
230
- return data.map((observables, index) => {
231
- if (index === 0) {
232
- return observables
233
- }
234
- // index === 1,將跟第二個valueAxis有關的observables全部重新計算
235
- const gridAxesTransform$ = gridAxesTransformObservable({
236
- fullDataFormatter$: secondGridDataFormatter$,
237
- layout$: observer.layout$
238
- })
239
- const gridAxesReverseTransform$ = gridAxesReverseTransformObservable({
240
- gridAxesTransform$
241
- })
242
- const gridContainerPosition$ = gridContainerPositionObservable({
243
- computedData$: observables.computedData$,
244
- fullDataFormatter$: secondGridDataFormatter$,
245
- layout$: observer.layout$
246
- })
247
- return {
248
- ...observables,
249
- dataFormatter$: secondGridDataFormatter$,
250
- gridAxesTransform$,
251
- gridAxesReverseTransform$,
252
- gridContainerPosition$,
253
- }
254
- })
255
- })
256
- )
257
-
258
- multiGridPluginDetail$
259
- .pipe(
260
- takeUntil(destroy$)
261
- )
262
- .subscribe(data => {
263
- // 每次重新計算時,清除之前的訂閱
264
- unsubscribeFnArr.forEach(fn => fn())
265
-
266
- selection.selectAll(`g.${gridClassName}`)
267
- .data(data)
268
- .join('g')
269
- .attr('class', gridClassName)
270
- .each((d, i, g) => {
271
- if (i > 1) {
272
- return
273
- }
274
-
275
- const gridSelection = d3.select(g[i])
276
-
277
- unsubscribeFnArr[i] = createBaseValueAxis(pluginName, {
278
- selection: gridSelection,
279
- computedData$: i === 0 ? d.computedStackedData$ : d.computedData$, // 第一個圖軸計算疊加value的資料
280
- fullParams$: observer.fullParams$.pipe(
281
- map(fullParams => i === 0 ? fullParams.firstAxis : fullParams.secondAxis)
282
- ),
283
- fullDataFormatter$: d.dataFormatter$,
284
- fullChartParams$: observer.fullChartParams$,
285
- gridAxesTransform$: d.gridAxesTransform$,
286
- gridAxesReverseTransform$: d.gridAxesReverseTransform$,
287
- gridAxesSize$: d.gridAxesSize$,
288
- gridContainerPosition$: d.gridContainerPosition$,
289
- isSeriesSeprate$: d.isSeriesSeprate$,
290
- })
291
- })
292
- })
293
-
294
- return () => {
295
- destroy$.next(undefined)
296
- unsubscribeFnArr.forEach(fn => fn())
297
- }
298
- })
1
+ import * as d3 from 'd3'
2
+ import {
3
+ of,
4
+ map,
5
+ switchMap,
6
+ combineLatest,
7
+ takeUntil,
8
+ distinctUntilChanged,
9
+ shareReplay,
10
+ iif,
11
+ Observable,
12
+ Subject } from 'rxjs'
13
+ import type { DefinePluginConfig } from '../../../lib/core-types'
14
+ import type { ContextObserverMultiGrid, DataFormatterGrid, DataFormatterTypeMap, Layout } from '../../../lib/core-types'
15
+ import {
16
+ defineMultiGridPlugin } from '../../../lib/core'
17
+ import { DEFAULT_OVERLAPPING_VALUE_STACK_AXES_PARAMS } from '../defaults'
18
+ import { createBaseValueAxis } from '../../base/BaseValueAxis'
19
+ import { multiGridPluginDetailObservables } from '../multiGridObservables'
20
+ import { getClassName, getUniID } from '../../utils/orbchartsUtils'
21
+ import { gridAxesTransformObservable, gridAxesReverseTransformObservable, gridContainerPositionObservable } from '../../../lib/core'
22
+ import { LAYER_INDEX_OF_AXIS } from '../../const'
23
+
24
+ const pluginName = 'OverlappingValueStackAxes'
25
+
26
+ const gridClassName = getClassName(pluginName, 'grid')
27
+
28
+ const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_OVERLAPPING_VALUE_STACK_AXES_PARAMS> = {
29
+ name: pluginName,
30
+ defaultParams: DEFAULT_OVERLAPPING_VALUE_STACK_AXES_PARAMS,
31
+ layerIndex: LAYER_INDEX_OF_AXIS,
32
+ validator: (params, { validateColumns }) => {
33
+ const result = validateColumns(params, {
34
+ firstAxis: {
35
+ toBeTypes: ['object']
36
+ },
37
+ secondAxis: {
38
+ toBeTypes: ['object']
39
+ },
40
+ gridIndexes: {
41
+ toBe: '[number, number]',
42
+ test: (value: any) => {
43
+ return Array.isArray(value) && value.length === 2
44
+ }
45
+ }
46
+ })
47
+ if (params.firstAxis) {
48
+ const firstAxisResult = validateColumns(params.firstAxis, {
49
+ labelOffset: {
50
+ toBe: '[number, number]',
51
+ test: (value: any) => {
52
+ return Array.isArray(value)
53
+ && value.length === 2
54
+ && typeof value[0] === 'number'
55
+ && typeof value[1] === 'number'
56
+ }
57
+ },
58
+ labelColorType: {
59
+ toBeOption: 'ColorType',
60
+ },
61
+ axisLineVisible: {
62
+ toBeTypes: ['boolean']
63
+ },
64
+ axisLineColorType: {
65
+ toBeOption: 'ColorType',
66
+ },
67
+ ticks: {
68
+ toBeTypes: ['number']
69
+ },
70
+ tickFormat: {
71
+ toBeTypes: ['string', 'Function']
72
+ },
73
+ tickLineVisible: {
74
+ toBeTypes: ['boolean']
75
+ },
76
+ tickPadding: {
77
+ toBeTypes: ['number']
78
+ },
79
+ tickFullLine: {
80
+ toBeTypes: ['boolean']
81
+ },
82
+ tickFullLineDasharray: {
83
+ toBeTypes: ['string']
84
+ },
85
+ tickColorType: {
86
+ toBeOption: 'ColorType',
87
+ },
88
+ tickTextRotate: {
89
+ toBeTypes: ['number']
90
+ },
91
+ tickTextColorType: {
92
+ toBeOption: 'ColorType',
93
+ }
94
+ })
95
+ if (firstAxisResult.status === 'error') {
96
+ return firstAxisResult
97
+ }
98
+ }
99
+ if (params.secondAxis) {
100
+ const secondAxisResult = validateColumns(params.secondAxis, {
101
+ labelOffset: {
102
+ toBe: '[number, number]',
103
+ test: (value: any) => {
104
+ return Array.isArray(value)
105
+ && value.length === 2
106
+ && typeof value[0] === 'number'
107
+ && typeof value[1] === 'number'
108
+ }
109
+ },
110
+ labelColorType: {
111
+ toBeOption: 'ColorType',
112
+ },
113
+ axisLineVisible: {
114
+ toBeTypes: ['boolean']
115
+ },
116
+ axisLineColorType: {
117
+ toBeOption: 'ColorType',
118
+ },
119
+ ticks: {
120
+ toBeTypes: ['number']
121
+ },
122
+ tickFormat: {
123
+ toBeTypes: ['string', 'Function']
124
+ },
125
+ tickLineVisible: {
126
+ toBeTypes: ['boolean']
127
+ },
128
+ tickPadding: {
129
+ toBeTypes: ['number']
130
+ },
131
+ tickFullLine: {
132
+ toBeTypes: ['boolean']
133
+ },
134
+ tickFullLineDasharray: {
135
+ toBeTypes: ['string']
136
+ },
137
+ tickColorType: {
138
+ toBeOption: 'ColorType',
139
+ },
140
+ tickTextRotate: {
141
+ toBeTypes: ['number']
142
+ },
143
+ tickTextColorType: {
144
+ toBeOption: 'ColorType',
145
+ }
146
+ })
147
+ if (secondAxisResult.status === 'error') {
148
+ return secondAxisResult
149
+ }
150
+ }
151
+ return result
152
+ }
153
+ }
154
+
155
+ // 第一個圖軸使用堆疊的資料,第二個圖軸使用原始資料
156
+ export const OverlappingValueStackAxes = defineMultiGridPlugin(pluginConfig)(({ selection, name, subject, observer }) => {
157
+ const destroy$ = new Subject()
158
+
159
+ const unsubscribeFnArr: (() => void)[] = []
160
+
161
+ const firstGridIndex$ = observer.fullParams$.pipe(
162
+ takeUntil(destroy$),
163
+ map(fullParams => fullParams.gridIndexes[0])
164
+ )
165
+
166
+ const secondGridIndex$ = observer.fullParams$.pipe(
167
+ takeUntil(destroy$),
168
+ map(fullParams => fullParams.gridIndexes[1])
169
+ )
170
+
171
+ // 為了要反轉第二個valueAxis的位置所以要重新計算
172
+ const secondGridDataFormatter$: Observable<DataFormatterGrid> = combineLatest({
173
+ firstGridIndex: firstGridIndex$,
174
+ secondGridIndex: secondGridIndex$,
175
+ fullDataFormatter: observer.fullDataFormatter$,
176
+ }).pipe(
177
+ takeUntil(destroy$),
178
+ switchMap(async (d) => d),
179
+ map(data => {
180
+ if (!data.fullDataFormatter.gridList[data.secondGridIndex]) {
181
+ data.fullDataFormatter.gridList[data.secondGridIndex] = Object.assign({}, data.fullDataFormatter.gridList[data.firstGridIndex])
182
+ }
183
+ const position = data.fullDataFormatter.gridList[data.firstGridIndex].valueAxis.position
184
+ // 反轉第二個valueAxis的位置
185
+ let reversePosition = position
186
+ if (position === 'left') {
187
+ reversePosition = 'right'
188
+ } else if (position === 'bottom') {
189
+ reversePosition = 'top'
190
+ } else if (position === 'top') {
191
+ reversePosition = 'bottom'
192
+ } else if (position === 'right') {
193
+ reversePosition = 'left'
194
+ }
195
+ return <DataFormatterGrid>{
196
+ type: 'grid',
197
+ visibleFilter: data.fullDataFormatter.visibleFilter as any,
198
+ grid: {
199
+ ...data.fullDataFormatter.gridList[data.secondGridIndex],
200
+ valueAxis: {
201
+ ...data.fullDataFormatter.gridList[data.secondGridIndex].valueAxis,
202
+ position: reversePosition
203
+ }
204
+ },
205
+ container: {
206
+ ...data.fullDataFormatter.container
207
+ }
208
+ }
209
+ })
210
+ )
211
+
212
+ const multiGridPluginDetail$ = of(observer).pipe(
213
+ takeUntil(destroy$),
214
+ map(observer => {
215
+ // 將observer的gridIndexes限制在2個
216
+ return {
217
+ ...observer,
218
+ fullParams$: observer.fullParams$.pipe(
219
+ map(fullParams => {
220
+ if (fullParams.gridIndexes.length > 2) {
221
+ fullParams.gridIndexes.length = 2
222
+ }
223
+ return fullParams
224
+ })
225
+ )
226
+ }
227
+ }),
228
+ switchMap(observer => multiGridPluginDetailObservables(observer)),
229
+ map(data => {
230
+ return data.map((observables, index) => {
231
+ if (index === 0) {
232
+ return observables
233
+ }
234
+ // index === 1,將跟第二個valueAxis有關的observables全部重新計算
235
+ const gridAxesTransform$ = gridAxesTransformObservable({
236
+ fullDataFormatter$: secondGridDataFormatter$,
237
+ layout$: observer.layout$
238
+ })
239
+ const gridAxesReverseTransform$ = gridAxesReverseTransformObservable({
240
+ gridAxesTransform$
241
+ })
242
+ const gridContainerPosition$ = gridContainerPositionObservable({
243
+ computedData$: observables.computedData$,
244
+ fullDataFormatter$: secondGridDataFormatter$,
245
+ layout$: observer.layout$
246
+ })
247
+ return {
248
+ ...observables,
249
+ dataFormatter$: secondGridDataFormatter$,
250
+ gridAxesTransform$,
251
+ gridAxesReverseTransform$,
252
+ gridContainerPosition$,
253
+ }
254
+ })
255
+ })
256
+ )
257
+
258
+ multiGridPluginDetail$
259
+ .pipe(
260
+ takeUntil(destroy$)
261
+ )
262
+ .subscribe(data => {
263
+ // 每次重新計算時,清除之前的訂閱
264
+ unsubscribeFnArr.forEach(fn => fn())
265
+
266
+ selection.selectAll(`g.${gridClassName}`)
267
+ .data(data)
268
+ .join('g')
269
+ .attr('class', gridClassName)
270
+ .each((d, i, g) => {
271
+ if (i > 1) {
272
+ return
273
+ }
274
+
275
+ const gridSelection = d3.select(g[i])
276
+
277
+ unsubscribeFnArr[i] = createBaseValueAxis(pluginName, {
278
+ selection: gridSelection,
279
+ computedData$: i === 0 ? d.computedStackedData$ : d.computedData$, // 第一個圖軸計算疊加value的資料
280
+ fullParams$: observer.fullParams$.pipe(
281
+ map(fullParams => i === 0 ? fullParams.firstAxis : fullParams.secondAxis)
282
+ ),
283
+ fullDataFormatter$: d.dataFormatter$,
284
+ fullChartParams$: observer.fullChartParams$,
285
+ gridAxesTransform$: d.gridAxesTransform$,
286
+ gridAxesReverseTransform$: d.gridAxesReverseTransform$,
287
+ gridAxesSize$: d.gridAxesSize$,
288
+ gridContainerPosition$: d.gridContainerPosition$,
289
+ isSeriesSeprate$: d.isSeriesSeprate$,
290
+ })
291
+ })
292
+ })
293
+
294
+ return () => {
295
+ destroy$.next(undefined)
296
+ unsubscribeFnArr.forEach(fn => fn())
297
+ }
298
+ })