@orbcharts/core 3.0.0-alpha.32 → 3.0.0-alpha.34
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.
- package/dist/orbcharts-core.es.js +1673 -1512
- package/dist/orbcharts-core.umd.js +2 -2
- package/dist/src/defaults.d.ts +4 -3
- package/dist/src/grid/gridObservables.d.ts +27 -3
- package/dist/src/multiGrid/multiGridObservables.d.ts +3 -15
- package/dist/src/types/ContextObserverGrid.d.ts +15 -2
- package/dist/src/types/ContextObserverMultiGrid.d.ts +3 -24
- package/dist/src/types/DataFormatterGrid.d.ts +24 -6
- package/dist/src/types/DataFormatterMultiGrid.d.ts +9 -9
- package/dist/src/utils/commonUtils.d.ts +1 -1
- package/dist/src/utils/orbchartsUtils.d.ts +7 -2
- package/package.json +1 -1
- package/src/base/createBaseChart.ts +24 -9
- package/src/defaults.ts +31 -19
- package/src/grid/computeGridData.ts +87 -30
- package/src/grid/createGridContextObserver.ts +42 -9
- package/src/grid/gridObservables.ts +155 -28
- package/src/multiGrid/computeMultiGridData.ts +16 -12
- package/src/multiGrid/multiGridObservables.ts +188 -114
- package/src/multiValue/computeMultiValueData.ts +1 -0
- package/src/tree/computeTreeData.ts +2 -2
- package/src/types/ContextObserverGrid.ts +20 -2
- package/src/types/ContextObserverMultiGrid.ts +18 -19
- package/src/types/DataFormatterGrid.ts +28 -13
- package/src/types/DataFormatterMultiGrid.ts +14 -12
- package/src/utils/commonUtils.ts +6 -6
- package/src/utils/orbchartsUtils.ts +31 -15
|
@@ -16,21 +16,16 @@ import type {
|
|
|
16
16
|
ChartType,
|
|
17
17
|
ChartParams,
|
|
18
18
|
ComputedDataTypeMap,
|
|
19
|
-
|
|
20
|
-
ContextObserverFn,
|
|
19
|
+
ComputedDataGrid,
|
|
21
20
|
DataTypeMap,
|
|
22
21
|
DataFormatterTypeMap,
|
|
23
22
|
DataFormatterGrid,
|
|
24
|
-
DataFormatterContext,
|
|
25
|
-
DataFormatterValueAxis,
|
|
26
|
-
DataFormatterGroupAxis,
|
|
27
23
|
DataFormatterMultiGridContainer,
|
|
28
24
|
EventMultiGrid,
|
|
29
25
|
HighlightTarget,
|
|
30
26
|
Layout,
|
|
31
27
|
TransformData } from '../types'
|
|
32
|
-
import {
|
|
33
|
-
import { createAxisLinearScale, createAxisPointScale, createAxisQuantizeScale } from '../utils/d3Utils'
|
|
28
|
+
import type { ContextObserverGridDetail } from '../types'
|
|
34
29
|
import {
|
|
35
30
|
highlightObservable,
|
|
36
31
|
seriesDataMapObservable,
|
|
@@ -38,11 +33,17 @@ import {
|
|
|
38
33
|
import {
|
|
39
34
|
gridAxesTransformObservable,
|
|
40
35
|
gridGraphicTransformObservable,
|
|
41
|
-
|
|
36
|
+
gridGraphicReverseScaleObservable,
|
|
37
|
+
gridAxesReverseTransformObservable,
|
|
42
38
|
gridAxesSizeObservable,
|
|
43
|
-
|
|
44
|
-
|
|
39
|
+
existedSeriesLabelsObservable,
|
|
40
|
+
gridVisibleComputedDataObservable,
|
|
41
|
+
isSeriesPositionSeprateObservable,
|
|
42
|
+
gridContainerObservable } from '../grid/gridObservables'
|
|
43
|
+
import { DATA_FORMATTER_MULTI_GRID_GRID_DEFAULT } from '../defaults'
|
|
44
|
+
import { calcGridContainerPosition } from '../utils/orbchartsUtils'
|
|
45
45
|
|
|
46
|
+
// 每一個grid計算出來的所有Observable
|
|
46
47
|
export const multiGridEachDetailObservable = ({ fullDataFormatter$, computedData$, layout$, fullChartParams$, event$ }: {
|
|
47
48
|
fullDataFormatter$: Observable<DataFormatterTypeMap<'multiGrid'>>
|
|
48
49
|
computedData$: Observable<ComputedDataTypeMap<'multiGrid'>>
|
|
@@ -50,6 +51,122 @@ export const multiGridEachDetailObservable = ({ fullDataFormatter$, computedData
|
|
|
50
51
|
fullChartParams$: Observable<ChartParams>
|
|
51
52
|
event$: Subject<EventMultiGrid>
|
|
52
53
|
}) => {
|
|
54
|
+
|
|
55
|
+
// 建立Observables
|
|
56
|
+
function detailObservables ({ gridDataFormatter$, gridComputedData$, layout$, fullChartParams$, event$ }: {
|
|
57
|
+
// fullDataFormatter$: Observable<DataFormatterTypeMap<'multiGrid'>>
|
|
58
|
+
// computedData$: Observable<ComputedDataTypeMap<'multiGrid'>>
|
|
59
|
+
gridDataFormatter$: Observable<DataFormatterGrid>
|
|
60
|
+
gridComputedData$: Observable<ComputedDataGrid>
|
|
61
|
+
layout$: Observable<Layout>
|
|
62
|
+
fullChartParams$: Observable<ChartParams>
|
|
63
|
+
event$: Subject<EventMultiGrid>
|
|
64
|
+
}): ContextObserverGridDetail {
|
|
65
|
+
|
|
66
|
+
const isSeriesPositionSeprate$ = isSeriesPositionSeprateObservable({
|
|
67
|
+
computedData$: gridComputedData$,
|
|
68
|
+
fullDataFormatter$: gridDataFormatter$,
|
|
69
|
+
}).pipe(
|
|
70
|
+
shareReplay(1)
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
const gridContainer$ = gridContainerObservable({
|
|
74
|
+
computedData$: gridComputedData$,
|
|
75
|
+
fullDataFormatter$: gridDataFormatter$,
|
|
76
|
+
fullChartParams$,
|
|
77
|
+
layout$
|
|
78
|
+
}).pipe(
|
|
79
|
+
shareReplay(1)
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
const gridAxesTransform$ = gridAxesTransformObservable({
|
|
83
|
+
fullDataFormatter$: gridDataFormatter$,
|
|
84
|
+
layout$: layout$
|
|
85
|
+
}).pipe(
|
|
86
|
+
shareReplay(1)
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
const gridAxesReverseTransform$ = gridAxesReverseTransformObservable({
|
|
91
|
+
gridAxesTransform$
|
|
92
|
+
}).pipe(
|
|
93
|
+
shareReplay(1)
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
const gridGraphicTransform$ = gridGraphicTransformObservable({
|
|
97
|
+
computedData$: gridComputedData$,
|
|
98
|
+
fullDataFormatter$: gridDataFormatter$,
|
|
99
|
+
layout$: layout$
|
|
100
|
+
}).pipe(
|
|
101
|
+
shareReplay(1)
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
const gridGraphicReverseScale$ = gridGraphicReverseScaleObservable({
|
|
105
|
+
gridContainer$: gridContainer$,
|
|
106
|
+
gridAxesTransform$: gridAxesTransform$,
|
|
107
|
+
gridGraphicTransform$: gridGraphicTransform$,
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
const gridAxesSize$ = gridAxesSizeObservable({
|
|
111
|
+
fullDataFormatter$: gridDataFormatter$,
|
|
112
|
+
layout$: layout$
|
|
113
|
+
}).pipe(
|
|
114
|
+
shareReplay(1)
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
const datumList$ = gridComputedData$.pipe(
|
|
118
|
+
map(d => d.flat())
|
|
119
|
+
).pipe(
|
|
120
|
+
shareReplay(1)
|
|
121
|
+
)
|
|
122
|
+
|
|
123
|
+
const gridHighlight$ = highlightObservable({
|
|
124
|
+
datumList$,
|
|
125
|
+
fullChartParams$: fullChartParams$,
|
|
126
|
+
event$: event$
|
|
127
|
+
}).pipe(
|
|
128
|
+
shareReplay(1)
|
|
129
|
+
)
|
|
130
|
+
|
|
131
|
+
const existedSeriesLabels$ = existedSeriesLabelsObservable({
|
|
132
|
+
computedData$: gridComputedData$,
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
const SeriesDataMap$ = seriesDataMapObservable({
|
|
136
|
+
datumList$: datumList$
|
|
137
|
+
}).pipe(
|
|
138
|
+
shareReplay(1)
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
const GroupDataMap$ = groupDataMapObservable({
|
|
142
|
+
datumList$: datumList$
|
|
143
|
+
}).pipe(
|
|
144
|
+
shareReplay(1)
|
|
145
|
+
)
|
|
146
|
+
|
|
147
|
+
const visibleComputedData$ = gridVisibleComputedDataObservable({
|
|
148
|
+
computedData$: gridComputedData$,
|
|
149
|
+
}).pipe(
|
|
150
|
+
shareReplay(1)
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
isSeriesPositionSeprate$,
|
|
156
|
+
gridContainer$,
|
|
157
|
+
gridAxesTransform$,
|
|
158
|
+
gridAxesReverseTransform$,
|
|
159
|
+
gridGraphicTransform$,
|
|
160
|
+
gridGraphicReverseScale$,
|
|
161
|
+
gridAxesSize$,
|
|
162
|
+
gridHighlight$,
|
|
163
|
+
existedSeriesLabels$,
|
|
164
|
+
SeriesDataMap$,
|
|
165
|
+
GroupDataMap$,
|
|
166
|
+
visibleComputedData$,
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
53
170
|
const destroy$ = new Subject()
|
|
54
171
|
|
|
55
172
|
return combineLatest({
|
|
@@ -57,19 +174,29 @@ export const multiGridEachDetailObservable = ({ fullDataFormatter$, computedData
|
|
|
57
174
|
computedData: computedData$,
|
|
58
175
|
}).pipe(
|
|
59
176
|
switchMap(async (d) => d),
|
|
60
|
-
distinctUntilChanged((a, b) => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}),
|
|
177
|
+
// distinctUntilChanged((a, b) => {
|
|
178
|
+
// // 只有當computedData的長度改變時,才重新計算
|
|
179
|
+
// return a.computedData.length === b.computedData.length
|
|
180
|
+
// }),
|
|
64
181
|
map(data => {
|
|
65
182
|
// 每次重新計算時,清除之前的訂閱
|
|
66
183
|
destroy$.next(undefined)
|
|
67
184
|
|
|
185
|
+
const defaultGrid = data.fullDataFormatter.gridList[0] ?? DATA_FORMATTER_MULTI_GRID_GRID_DEFAULT
|
|
186
|
+
|
|
68
187
|
return data.computedData.map((gridComputedData, gridIndex) => {
|
|
69
188
|
|
|
70
189
|
// -- 取得該grid的data和dataFormatter
|
|
71
|
-
const
|
|
72
|
-
|
|
190
|
+
const grid = data.fullDataFormatter.gridList[gridIndex] ?? defaultGrid
|
|
191
|
+
const gridDataFormatter: DataFormatterGrid = {
|
|
192
|
+
type: 'grid',
|
|
193
|
+
grid: {
|
|
194
|
+
...grid
|
|
195
|
+
},
|
|
196
|
+
container: {
|
|
197
|
+
...data.fullDataFormatter.container
|
|
198
|
+
}
|
|
199
|
+
}
|
|
73
200
|
const gridDataFormatter$ = of(gridDataFormatter).pipe(
|
|
74
201
|
takeUntil(destroy$),
|
|
75
202
|
shareReplay(1)
|
|
@@ -80,104 +207,26 @@ export const multiGridEachDetailObservable = ({ fullDataFormatter$, computedData
|
|
|
80
207
|
)
|
|
81
208
|
|
|
82
209
|
// -- 建立Observables --
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
const gridGraphicTransform$ = gridGraphicTransformObservable({
|
|
91
|
-
computedData$: gridComputedData$,
|
|
92
|
-
fullDataFormatter$: gridDataFormatter$,
|
|
93
|
-
layout$: layout$
|
|
94
|
-
}).pipe(
|
|
95
|
-
shareReplay(1)
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
const gridAxesOppositeTransform$ = gridAxesOppositeTransformObservable({
|
|
99
|
-
gridAxesTransform$
|
|
100
|
-
}).pipe(
|
|
101
|
-
shareReplay(1)
|
|
102
|
-
)
|
|
103
|
-
|
|
104
|
-
const gridAxesSize$ = gridAxesSizeObservable({
|
|
105
|
-
fullDataFormatter$: gridDataFormatter$,
|
|
106
|
-
layout$: layout$
|
|
107
|
-
}).pipe(
|
|
108
|
-
shareReplay(1)
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
const datumList$ = gridComputedData$.pipe(
|
|
112
|
-
map(d => d.flat())
|
|
113
|
-
).pipe(
|
|
114
|
-
shareReplay(1)
|
|
115
|
-
)
|
|
116
|
-
|
|
117
|
-
const gridHighlight$ = highlightObservable({
|
|
118
|
-
datumList$,
|
|
119
|
-
fullChartParams$: fullChartParams$,
|
|
120
|
-
event$: event$
|
|
121
|
-
}).pipe(
|
|
122
|
-
shareReplay(1)
|
|
123
|
-
)
|
|
124
|
-
|
|
125
|
-
const SeriesDataMap$ = seriesDataMapObservable({
|
|
126
|
-
datumList$: datumList$
|
|
127
|
-
}).pipe(
|
|
128
|
-
shareReplay(1)
|
|
129
|
-
)
|
|
130
|
-
|
|
131
|
-
const GroupDataMap$ = groupDataMapObservable({
|
|
132
|
-
datumList$: datumList$
|
|
133
|
-
}).pipe(
|
|
134
|
-
shareReplay(1)
|
|
135
|
-
)
|
|
136
|
-
|
|
137
|
-
const visibleComputedData$ = gridVisibleComputedDataObservable({
|
|
138
|
-
computedData$: gridComputedData$,
|
|
139
|
-
}).pipe(
|
|
140
|
-
shareReplay(1)
|
|
141
|
-
)
|
|
142
|
-
|
|
143
|
-
return {
|
|
144
|
-
gridAxesTransform$,
|
|
145
|
-
gridGraphicTransform$,
|
|
146
|
-
gridAxesOppositeTransform$,
|
|
147
|
-
gridAxesSize$,
|
|
148
|
-
gridHighlight$,
|
|
149
|
-
SeriesDataMap$,
|
|
150
|
-
GroupDataMap$,
|
|
151
|
-
visibleComputedData$
|
|
152
|
-
}
|
|
210
|
+
return detailObservables ({
|
|
211
|
+
gridDataFormatter$,
|
|
212
|
+
gridComputedData$,
|
|
213
|
+
layout$,
|
|
214
|
+
fullChartParams$,
|
|
215
|
+
event$
|
|
216
|
+
})
|
|
153
217
|
})
|
|
154
218
|
})
|
|
155
219
|
)
|
|
156
220
|
}
|
|
157
221
|
|
|
158
222
|
|
|
159
|
-
|
|
160
|
-
// 每一個grid的container位置
|
|
223
|
+
// 所有container位置(對應series)
|
|
161
224
|
export const multiGridContainerObservable = ({ computedData$, fullDataFormatter$, fullChartParams$, layout$ }: {
|
|
162
225
|
computedData$: Observable<ComputedDataTypeMap<'multiGrid'>>
|
|
163
226
|
fullDataFormatter$: Observable<DataFormatterTypeMap<'multiGrid'>>
|
|
164
227
|
fullChartParams$: Observable<ChartParams>
|
|
165
228
|
layout$: Observable<Layout>
|
|
166
229
|
}) => {
|
|
167
|
-
function calcBox (layout: Layout, container: DataFormatterMultiGridContainer, rowIndex: number, columnIndex: number) {
|
|
168
|
-
const { gap, rowAmount, columnAmount } = container
|
|
169
|
-
const width = (layout.width - (gap * (columnAmount - 1))) / columnAmount
|
|
170
|
-
const height = (layout.height - (gap * (rowAmount - 1))) / rowAmount
|
|
171
|
-
const x = columnIndex * width + (columnIndex * gap)
|
|
172
|
-
const y = rowIndex * height + (rowIndex * gap)
|
|
173
|
-
const translate: [number, number] = [x, y]
|
|
174
|
-
const scale: [number, number] = [width / layout.width, height / layout.height]
|
|
175
|
-
|
|
176
|
-
return {
|
|
177
|
-
translate,
|
|
178
|
-
scale
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
230
|
|
|
182
231
|
const multiGridContainer$ = combineLatest({
|
|
183
232
|
computedData: computedData$,
|
|
@@ -188,21 +237,46 @@ export const multiGridContainerObservable = ({ computedData$, fullDataFormatter$
|
|
|
188
237
|
switchMap(async (d) => d),
|
|
189
238
|
map(data => {
|
|
190
239
|
|
|
191
|
-
const defaultGrid = data.fullDataFormatter.
|
|
240
|
+
const defaultGrid = data.fullDataFormatter.gridList[0] ?? DATA_FORMATTER_MULTI_GRID_GRID_DEFAULT
|
|
192
241
|
|
|
193
242
|
const boxArr = data.computedData.map((gridData, gridIndex) => {
|
|
194
|
-
const grid = data.fullDataFormatter.
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
243
|
+
const grid = data.fullDataFormatter.gridList[gridIndex] ?? defaultGrid
|
|
244
|
+
|
|
245
|
+
// 有設定series定位
|
|
246
|
+
const hasSeriesPosition = grid.seriesSlotIndexes && grid.seriesSlotIndexes.length === gridData.length
|
|
247
|
+
? true
|
|
248
|
+
: false
|
|
249
|
+
|
|
250
|
+
if (hasSeriesPosition) {
|
|
251
|
+
// -- 依seriesSlotIndexes計算 --
|
|
252
|
+
return gridData.map((seriesData, seriesIndex) => {
|
|
253
|
+
const columnIndex = grid.seriesSlotIndexes[seriesIndex] % data.fullDataFormatter.container.columnAmount
|
|
254
|
+
const rowIndex = Math.floor(grid.seriesSlotIndexes[seriesIndex] / data.fullDataFormatter.container.columnAmount)
|
|
255
|
+
const { translate, scale } = calcGridContainerPosition(data.layout, data.fullDataFormatter.container, rowIndex, columnIndex)
|
|
256
|
+
return {
|
|
257
|
+
slotIndex: grid.seriesSlotIndexes[seriesIndex],
|
|
258
|
+
rowIndex,
|
|
259
|
+
columnIndex,
|
|
260
|
+
translate,
|
|
261
|
+
scale,
|
|
262
|
+
}
|
|
263
|
+
})
|
|
264
|
+
} else {
|
|
265
|
+
// -- 依grid的slotIndex計算 --
|
|
266
|
+
const columnIndex = grid.slotIndex % data.fullDataFormatter.container.columnAmount
|
|
267
|
+
const rowIndex = Math.floor(grid.slotIndex / data.fullDataFormatter.container.columnAmount)
|
|
268
|
+
return gridData.map((seriesData, seriesIndex) => {
|
|
269
|
+
const { translate, scale } = calcGridContainerPosition(data.layout, data.fullDataFormatter.container, rowIndex, columnIndex)
|
|
270
|
+
return {
|
|
271
|
+
slotIndex: grid.slotIndex,
|
|
272
|
+
rowIndex,
|
|
273
|
+
columnIndex,
|
|
274
|
+
translate,
|
|
275
|
+
scale,
|
|
276
|
+
}
|
|
277
|
+
})
|
|
205
278
|
}
|
|
279
|
+
|
|
206
280
|
})
|
|
207
281
|
return boxArr
|
|
208
282
|
}),
|
|
@@ -82,6 +82,7 @@ export const computeMultiValueData: ComputedDataFn<'multiValue'> = (context) =>
|
|
|
82
82
|
dataFormatter.yAxis.scaleDomain[0] === 'auto' ? yMinValue : dataFormatter.yAxis.scaleDomain[0],
|
|
83
83
|
dataFormatter.yAxis.scaleDomain[1] === 'auto' ? yMaxValue : dataFormatter.yAxis.scaleDomain[1]
|
|
84
84
|
]
|
|
85
|
+
debugger
|
|
85
86
|
// 篩選顯示狀態
|
|
86
87
|
const visibleFilter = (datum: DataMultiValueDatum, rowIndex: number, columnIndex: number, context: DataFormatterContext<"multiValue">) => {
|
|
87
88
|
// 如果不在scale的範圍內則為false,不再做visibleFilter的判斷
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { DataTree, DataTreeObj, DataTreeDatum } from '../types/DataTree'
|
|
2
2
|
import type { ComputedDataFn } from '../types/ComputedData'
|
|
3
3
|
import type { ComputedDataTree } from '../types/ComputedDataTree'
|
|
4
|
-
import {
|
|
4
|
+
import { isPlainObject } from '../utils/commonUtils'
|
|
5
5
|
|
|
6
6
|
export const computeTreeData: ComputedDataFn<'tree'> = (context) => {
|
|
7
7
|
const { data = [], dataFormatter, chartParams } = context
|
|
@@ -23,7 +23,7 @@ export const computeTreeData: ComputedDataFn<'tree'> = (context) => {
|
|
|
23
23
|
try {
|
|
24
24
|
// 建立樹狀結構資料
|
|
25
25
|
const dataTreeObj: DataTreeObj = (function () {
|
|
26
|
-
if (
|
|
26
|
+
if (isPlainObject(data) === true) {
|
|
27
27
|
// 原本就是樹狀結構則直接複製
|
|
28
28
|
return structuredClone(data) as DataTreeObj
|
|
29
29
|
} else if (Array.isArray(data) === false) {
|
|
@@ -3,14 +3,32 @@ import type { ContextObserverBase } from './ContextObserver'
|
|
|
3
3
|
import type { ComputedDataGrid, ComputedDatumGrid } from './ComputedDataGrid'
|
|
4
4
|
import type { TransformData } from './TransformData'
|
|
5
5
|
|
|
6
|
-
export interface ContextObserverGrid<PluginParams>
|
|
6
|
+
export interface ContextObserverGrid<PluginParams>
|
|
7
|
+
extends
|
|
8
|
+
ContextObserverBase<'grid', PluginParams>,
|
|
9
|
+
ContextObserverGridDetail {
|
|
10
|
+
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ContextObserverGridDetail {
|
|
14
|
+
gridContainer$: Observable<ContainerPosition[]>
|
|
7
15
|
gridAxesTransform$: Observable<TransformData>
|
|
16
|
+
gridAxesReverseTransform$: Observable<TransformData>
|
|
8
17
|
gridGraphicTransform$: Observable<TransformData>
|
|
9
|
-
|
|
18
|
+
gridGraphicReverseScale$: Observable<[number, number][]>
|
|
10
19
|
gridAxesSize$: Observable<{ width: number; height: number; }>
|
|
11
20
|
gridHighlight$: Observable<string[]>
|
|
21
|
+
existedSeriesLabels$: Observable<string[]>
|
|
12
22
|
SeriesDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
|
|
13
23
|
GroupDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
|
|
14
24
|
visibleComputedData$: Observable<ComputedDataGrid>
|
|
25
|
+
isSeriesPositionSeprate$: Observable<boolean>
|
|
15
26
|
}
|
|
16
27
|
|
|
28
|
+
export interface ContainerPosition {
|
|
29
|
+
slotIndex: number
|
|
30
|
+
rowIndex: number
|
|
31
|
+
columnIndex: number
|
|
32
|
+
translate: [number, number]
|
|
33
|
+
scale: [number, number]
|
|
34
|
+
}
|
|
@@ -1,28 +1,27 @@
|
|
|
1
1
|
import { Observable } from 'rxjs'
|
|
2
2
|
import type { ContextObserverBase } from './ContextObserver'
|
|
3
3
|
import type { ComputedDataGrid, ComputedDatumGrid } from './ComputedDataGrid'
|
|
4
|
+
import type { ContainerPosition } from './ContextObserverGrid'
|
|
4
5
|
import type { TransformData } from './TransformData'
|
|
6
|
+
import type { ContextObserverGridDetail } from './ContextObserverGrid'
|
|
5
7
|
|
|
6
8
|
export interface ContextObserverMultiGrid<PluginParams> extends ContextObserverBase<'multiGrid', PluginParams> {
|
|
7
|
-
multiGridEachDetail$: Observable<
|
|
8
|
-
multiGridContainer$: Observable<
|
|
9
|
+
multiGridEachDetail$: Observable<ContextObserverGridDetail[]>
|
|
10
|
+
multiGridContainer$: Observable<ContainerPosition[][]>
|
|
9
11
|
}
|
|
10
12
|
|
|
11
|
-
export interface MultiGridObservableAll {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
13
|
+
// export interface MultiGridObservableAll {
|
|
14
|
+
// isSeriesPositionSeprate$: Observable<boolean>
|
|
15
|
+
// gridContainer$: Observable<ContainerPosition[]>
|
|
16
|
+
// gridAxesTransform$: Observable<TransformData>
|
|
17
|
+
// gridAxesReverseTransform$: Observable<TransformData>
|
|
18
|
+
// gridGraphicTransform$: Observable<TransformData>
|
|
19
|
+
// gridGraphicReverseScale$: Observable<[number, number][]>
|
|
20
|
+
// gridAxesSize$: Observable<{ width: number; height: number; }>
|
|
21
|
+
// gridHighlight$: Observable<string[]>
|
|
22
|
+
// existedSeriesLabels$: Observable<string[]>
|
|
23
|
+
// SeriesDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
|
|
24
|
+
// GroupDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
|
|
25
|
+
// visibleComputedData$: Observable<ComputedDataGrid>
|
|
26
|
+
// }
|
|
21
27
|
|
|
22
|
-
export interface GridContainerBox {
|
|
23
|
-
slotIndex: number
|
|
24
|
-
rowIndex: number
|
|
25
|
-
columnIndex: number
|
|
26
|
-
translate: [number, number]
|
|
27
|
-
scale: [number, number]
|
|
28
|
-
}
|
|
@@ -2,34 +2,49 @@ import type { DataGridDatum, DataGridValue } from './DataGrid'
|
|
|
2
2
|
import type { DataFormatterBase, DataFormatterBasePartial, DataFormatterValueAxis, DataFormatterGroupAxis, VisibleFilter } from './DataFormatter'
|
|
3
3
|
// import type { AxisPosition } from './Axis'
|
|
4
4
|
|
|
5
|
-
export type
|
|
5
|
+
export type SeriesDirection = 'row' | 'column' // default: 'row'
|
|
6
6
|
|
|
7
7
|
export interface DataFormatterGrid extends DataFormatterBase<'grid'> {
|
|
8
|
-
visibleFilter: VisibleFilter<'grid'>
|
|
9
8
|
grid: DataFormatterGridGrid
|
|
10
|
-
|
|
11
|
-
groupAxis: DataFormatterGroupAxis
|
|
9
|
+
container: DataFormatterGridContainer
|
|
12
10
|
// visibleGroupRange: [number, number] | null
|
|
13
11
|
// colorsPredicate: (datum: DataGridDatum | DataGridValue, rowIndex: number, columnIndex: number, context: DataFormatterContext<'grid'>) => string
|
|
14
12
|
}
|
|
15
13
|
|
|
16
14
|
export interface DataFormatterGridPartial extends DataFormatterBasePartial<'grid'> {
|
|
17
|
-
grid?:
|
|
15
|
+
grid?: DataFormatterGridGridPartial
|
|
16
|
+
container?: Partial<DataFormatterGridContainer>
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface DataFormatterGridGrid {
|
|
20
|
+
visibleFilter: VisibleFilter<'grid'>
|
|
21
|
+
gridData: DataFormatterGridGridData
|
|
22
|
+
valueAxis: DataFormatterValueAxis
|
|
23
|
+
groupAxis: DataFormatterGroupAxis
|
|
24
|
+
slotIndex: number | null
|
|
25
|
+
seriesSlotIndexes: number[] | null
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export interface DataFormatterGridGridPartial {
|
|
29
|
+
visibleFilter?: VisibleFilter<'grid'>
|
|
30
|
+
gridData?: Partial<DataFormatterGridGridData>
|
|
18
31
|
valueAxis?: Partial<DataFormatterValueAxis>
|
|
19
32
|
groupAxis?: Partial<DataFormatterGroupAxis>
|
|
20
|
-
|
|
33
|
+
slotIndex?: number | null
|
|
34
|
+
seriesSlotIndexes?: number[] | null
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface DataFormatterGridContainer {
|
|
38
|
+
gap: number
|
|
39
|
+
rowAmount: number
|
|
40
|
+
columnAmount: number
|
|
21
41
|
}
|
|
22
42
|
|
|
23
43
|
// grid欄位
|
|
24
|
-
export interface
|
|
25
|
-
|
|
26
|
-
// rowUnitLabel: string
|
|
44
|
+
export interface DataFormatterGridGridData {
|
|
45
|
+
seriesDirection: SeriesDirection
|
|
27
46
|
rowLabels: string[]
|
|
28
|
-
// rowLabelFormat: string | ((text: any) => string)
|
|
29
|
-
// columnUnitLabel: string
|
|
30
47
|
columnLabels: string[]
|
|
31
|
-
// columnLabelFormat: string | ((text: any) => string)
|
|
32
|
-
seriesType: SeriesType
|
|
33
48
|
}
|
|
34
49
|
|
|
35
50
|
// const test: DataFormatterGridPartial = {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { VisibleFilter } from './DataFormatter'
|
|
2
|
-
import type {
|
|
2
|
+
import type { DataFormatterGridGrid, DataFormatterGridGridPartial, DataFormatterGridContainer } from './DataFormatterGrid'
|
|
3
3
|
import type {
|
|
4
4
|
DataFormatterBase,
|
|
5
5
|
DataFormatterBasePartial,
|
|
@@ -10,30 +10,32 @@ import type { AxisPosition } from './Axis'
|
|
|
10
10
|
|
|
11
11
|
export interface DataFormatterMultiGrid extends DataFormatterBase<'multiGrid'> {
|
|
12
12
|
visibleFilter: VisibleFilter<'multiGrid'>
|
|
13
|
-
|
|
14
|
-
// visibleGroupRange: [number, number] | null
|
|
13
|
+
gridList: Array<DataFormatterGridGrid>
|
|
15
14
|
container: DataFormatterMultiGridContainer
|
|
16
15
|
}
|
|
17
16
|
|
|
18
17
|
export interface DataFormatterMultiGridPartial extends DataFormatterBasePartial<'multiGrid'> {
|
|
19
|
-
|
|
18
|
+
visibleFilter?: VisibleFilter<'multiGrid'>
|
|
19
|
+
gridList?: Array<DataFormatterGridGridPartial>
|
|
20
|
+
container?: Partial<DataFormatterMultiGridContainer>
|
|
20
21
|
}
|
|
21
22
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
23
|
+
export interface DataFormatterMultiGridGrid extends DataFormatterGridGrid {
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface DataFormatterMultiGridGridPartial extends DataFormatterGridGridPartial {
|
|
28
|
+
|
|
25
29
|
}
|
|
26
30
|
|
|
27
31
|
// container
|
|
28
|
-
export interface DataFormatterMultiGridContainer {
|
|
29
|
-
|
|
30
|
-
rowAmount: number
|
|
31
|
-
columnAmount: number
|
|
32
|
+
export interface DataFormatterMultiGridContainer extends DataFormatterGridContainer {
|
|
33
|
+
|
|
32
34
|
}
|
|
33
35
|
|
|
34
36
|
// multiGrid欄位
|
|
35
37
|
// export interface DataFormatterMultiGridMultiGrid {
|
|
36
|
-
// grid:
|
|
38
|
+
// grid: DataFormatterGridGridData
|
|
37
39
|
// valueAxis: DataFormatterValueAxis // default: 'left'
|
|
38
40
|
// groupAxis: DataFormatterGroupAxis // default: 'bottom'
|
|
39
41
|
// colorsPredicate: (datum: DataGridDatum | DataGridValue, rowIndex: number, columnIndex: number, context: DataFormatterContext<'grid'>) => string
|
package/src/utils/commonUtils.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// import * as d3 from 'd3'
|
|
2
2
|
|
|
3
|
-
//
|
|
4
|
-
export function
|
|
3
|
+
// 是否為原始物件
|
|
4
|
+
export function isPlainObject(variable: any) {
|
|
5
5
|
return Object.prototype.toString.call(variable) === "[object Object]";
|
|
6
6
|
}
|
|
7
7
|
|
|
@@ -12,7 +12,7 @@ export function isFunction(fn: any) {
|
|
|
12
12
|
|
|
13
13
|
// 將可選的參數和預設值合併
|
|
14
14
|
export function mergeOptionsWithDefault<Options extends { [key: string]: any; }> (options: {[key: string]: any}, defaultOptions: Options): Options {
|
|
15
|
-
if (
|
|
15
|
+
if (isPlainObject(options) === false || isPlainObject(defaultOptions) === false) {
|
|
16
16
|
return Object.assign({}, defaultOptions)
|
|
17
17
|
}
|
|
18
18
|
const mergeObjColumns = (_options: {[key: string]: any}, _defaultOptions: {[key: string]: any}) => {
|
|
@@ -22,12 +22,12 @@ export function mergeOptionsWithDefault<Options extends { [key: string]: any; }>
|
|
|
22
22
|
continue
|
|
23
23
|
}
|
|
24
24
|
let objValue: any = undefined
|
|
25
|
-
// 下一層的object
|
|
26
|
-
if (
|
|
25
|
+
// 下一層的plain object
|
|
26
|
+
if (isPlainObject(_options[key]) && isPlainObject(_defaultOptions[key])) {
|
|
27
27
|
objValue = mergeObjColumns(_options[key], _defaultOptions[key])
|
|
28
28
|
obj[key as keyof Options] = objValue
|
|
29
29
|
}
|
|
30
|
-
// 不是object直接賦值
|
|
30
|
+
// 不是plain object直接賦值
|
|
31
31
|
else {
|
|
32
32
|
obj[key as keyof Options] = _options[key]
|
|
33
33
|
}
|