@orbcharts/core 3.0.0-alpha.42 → 3.0.0-alpha.44
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 +1905 -1896
- package/dist/orbcharts-core.umd.js +2 -2
- package/dist/src/defaults.d.ts +4 -3
- package/dist/src/grid/computeGridData.d.ts +4 -11
- package/dist/src/grid/gridObservables.d.ts +15 -18
- package/dist/src/multiGrid/multiGridObservables.d.ts +4 -11
- package/dist/src/series/seriesObservables.d.ts +26 -1
- package/dist/src/types/ComputedData.d.ts +1 -0
- package/dist/src/types/ComputedDataGrid.d.ts +0 -3
- package/dist/src/types/ComputedDataSeries.d.ts +1 -2
- package/dist/src/types/ContextObserverGrid.d.ts +11 -4
- package/dist/src/types/ContextObserverMultiGrid.d.ts +8 -3
- package/dist/src/types/ContextObserverSeries.d.ts +18 -0
- package/dist/src/types/DataFormatter.d.ts +8 -5
- package/dist/src/types/DataFormatterGrid.d.ts +13 -16
- package/dist/src/types/DataFormatterMultiGrid.d.ts +6 -3
- package/dist/src/types/DataFormatterMultiValue.d.ts +3 -0
- package/dist/src/types/DataFormatterRelationship.d.ts +3 -0
- package/dist/src/types/DataFormatterSeries.d.ts +11 -4
- package/dist/src/utils/orbchartsUtils.d.ts +14 -13
- package/package.json +1 -1
- package/src/base/createBaseChart.ts +10 -10
- package/src/defaults.ts +36 -64
- package/src/grid/computeGridData.ts +15 -86
- package/src/grid/createGridContextObserver.ts +33 -16
- package/src/grid/gridObservables.ts +157 -70
- package/src/multiGrid/computeMultiGridData.ts +77 -120
- package/src/multiGrid/createMultiGridContextObserver.ts +8 -8
- package/src/multiGrid/multiGridObservables.ts +236 -171
- package/src/multiValue/computeMultiValueData.ts +22 -15
- package/src/relationship/computeRelationshipData.ts +16 -4
- package/src/series/computeSeriesData.ts +51 -114
- package/src/series/createSeriesContextObserver.ts +59 -4
- package/src/series/seriesObservables.ts +162 -10
- package/src/tree/computeTreeData.ts +6 -3
- package/src/types/ComputedData.ts +1 -0
- package/src/types/ComputedDataGrid.ts +3 -3
- package/src/types/ComputedDataSeries.ts +2 -2
- package/src/types/ContextObserverGrid.ts +18 -10
- package/src/types/ContextObserverMultiGrid.ts +6 -18
- package/src/types/ContextObserverSeries.ts +21 -1
- package/src/types/DataFormatter.ts +11 -32
- package/src/types/DataFormatterGrid.ts +32 -20
- package/src/types/DataFormatterMultiGrid.ts +6 -4
- package/src/types/DataFormatterMultiValue.ts +3 -0
- package/src/types/DataFormatterRelationship.ts +3 -0
- package/src/types/DataFormatterSeries.ts +11 -21
- package/src/utils/d3Utils.ts +7 -7
- package/src/utils/orbchartsUtils.ts +128 -32
|
@@ -17,20 +17,93 @@ import type {
|
|
|
17
17
|
ComputedDatumTypeMap,
|
|
18
18
|
ContextObserverFn,
|
|
19
19
|
DataTypeMap,
|
|
20
|
+
DataGridDatum,
|
|
21
|
+
ComputedDatumGrid,
|
|
20
22
|
DataFormatterTypeMap,
|
|
21
23
|
DataFormatterGrid,
|
|
22
|
-
DataFormatterGridContainer,
|
|
23
24
|
DataFormatterValueAxis,
|
|
24
25
|
DataFormatterGroupAxis,
|
|
25
|
-
|
|
26
|
+
ComputedLayoutDatumGrid,
|
|
27
|
+
ComputedLayoutDataGrid,
|
|
28
|
+
GridContainerPosition,
|
|
26
29
|
HighlightTarget,
|
|
27
30
|
Layout,
|
|
28
31
|
TransformData } from '../types'
|
|
29
32
|
import { getMinAndMaxGrid } from '../utils/orbchartsUtils'
|
|
30
33
|
import { createAxisLinearScale, createAxisPointScale, createAxisQuantizeScale } from '../utils/d3Utils'
|
|
31
34
|
import { highlightObservable } from '../utils/observables'
|
|
32
|
-
import {
|
|
35
|
+
import { calcGridContainerLayout } from '../utils/orbchartsUtils'
|
|
33
36
|
import { DATA_FORMATTER_GRID_GRID_DEFAULT } from '../defaults'
|
|
37
|
+
import { getMinAndMaxValue, transposeData, createGridSeriesLabels, createGridGroupLabels, seriesColorPredicate } from '../utils/orbchartsUtils'
|
|
38
|
+
|
|
39
|
+
export const gridComputedLayoutDataObservable = ({ computedData$, fullDataFormatter$, layout$ }: {
|
|
40
|
+
computedData$: Observable<ComputedDataTypeMap<'grid'>>
|
|
41
|
+
fullDataFormatter$: Observable<DataFormatterTypeMap<'grid'>>
|
|
42
|
+
layout$: Observable<Layout>
|
|
43
|
+
}): Observable<ComputedLayoutDatumGrid[][]> => {
|
|
44
|
+
|
|
45
|
+
// 未篩選group範圍前的group scale
|
|
46
|
+
function createOriginGroupScale (computedData: ComputedDatumGrid[][], dataFormatter: DataFormatterGrid, layout: Layout) {
|
|
47
|
+
const groupAxisWidth = (dataFormatter.grid.groupAxis.position === 'top' || dataFormatter.grid.groupAxis.position === 'bottom')
|
|
48
|
+
? layout.width
|
|
49
|
+
: layout.height
|
|
50
|
+
const groupEndIndex = computedData[0] ? computedData[0].length - 1 : 0
|
|
51
|
+
const groupScale: d3.ScaleLinear<number, number> = createAxisLinearScale({
|
|
52
|
+
maxValue: groupEndIndex,
|
|
53
|
+
minValue: 0,
|
|
54
|
+
axisWidth: groupAxisWidth,
|
|
55
|
+
scaleDomain: [0, groupEndIndex], // 不使用dataFormatter設定
|
|
56
|
+
scaleRange: [0, 1] // 不使用dataFormatter設定
|
|
57
|
+
})
|
|
58
|
+
return groupScale
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// 未篩選group範圍及visible前的value scale
|
|
62
|
+
function createOriginValueScale (computedData: ComputedDatumGrid[][], dataFormatter: DataFormatterGrid, layout: Layout) {
|
|
63
|
+
const valueAxisWidth = (dataFormatter.grid.valueAxis.position === 'left' || dataFormatter.grid.valueAxis.position === 'right')
|
|
64
|
+
? layout.height
|
|
65
|
+
: layout.width
|
|
66
|
+
|
|
67
|
+
const listData = computedData.flat()
|
|
68
|
+
const [minValue, maxValue] = getMinAndMaxValue(listData)
|
|
69
|
+
|
|
70
|
+
const valueScale: d3.ScaleLinear<number, number> = createAxisLinearScale({
|
|
71
|
+
maxValue,
|
|
72
|
+
minValue,
|
|
73
|
+
axisWidth: valueAxisWidth,
|
|
74
|
+
scaleDomain: [minValue, maxValue], // 不使用dataFormatter設定
|
|
75
|
+
scaleRange: [0, 1] // 不使用dataFormatter設定
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
return valueScale
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
return combineLatest({
|
|
82
|
+
computedData: computedData$,
|
|
83
|
+
fullDataFormatter: fullDataFormatter$,
|
|
84
|
+
layout: layout$
|
|
85
|
+
}).pipe(
|
|
86
|
+
switchMap(async d => d),
|
|
87
|
+
map(data => {
|
|
88
|
+
const groupScale = createOriginGroupScale(data.computedData, data.fullDataFormatter, data.layout)
|
|
89
|
+
const valueScale = createOriginValueScale(data.computedData, data.fullDataFormatter, data.layout)
|
|
90
|
+
const zeroY = valueScale(0)
|
|
91
|
+
|
|
92
|
+
return data.computedData.map((seriesData, seriesIndex) => {
|
|
93
|
+
return seriesData.map((groupDatum, groupIndex) => {
|
|
94
|
+
const axisX = groupScale(groupIndex)
|
|
95
|
+
const axisY = valueScale(groupDatum.value ?? 0)
|
|
96
|
+
return {
|
|
97
|
+
...groupDatum,
|
|
98
|
+
axisX,
|
|
99
|
+
axisY,
|
|
100
|
+
axisYFromZero: axisY - zeroY
|
|
101
|
+
}
|
|
102
|
+
})
|
|
103
|
+
})
|
|
104
|
+
})
|
|
105
|
+
)
|
|
106
|
+
}
|
|
34
107
|
|
|
35
108
|
export const gridAxesTransformObservable = ({ fullDataFormatter$, layout$ }: {
|
|
36
109
|
fullDataFormatter$: Observable<DataFormatterTypeMap<'grid'>>
|
|
@@ -218,10 +291,16 @@ export const gridGraphicTransformObservable = ({ computedData$, fullDataFormatte
|
|
|
218
291
|
// -- translateX, scaleX --
|
|
219
292
|
const rangeMinX = groupScale(groupMin)
|
|
220
293
|
const rangeMaxX = groupScale(groupMax)
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
294
|
+
if (groupMin == groupMax) {
|
|
295
|
+
// 當group只有一個
|
|
296
|
+
translateX = 0
|
|
297
|
+
scaleX = 1
|
|
298
|
+
} else {
|
|
299
|
+
translateX = rangeMinX
|
|
300
|
+
const gWidth = rangeMaxX - rangeMinX
|
|
301
|
+
scaleX = gWidth / groupAxisWidth
|
|
302
|
+
}
|
|
303
|
+
|
|
225
304
|
// -- valueScale --
|
|
226
305
|
const filteredData = data.map((d, i) => {
|
|
227
306
|
return d.filter((_d, _i) => {
|
|
@@ -287,31 +366,31 @@ export const gridGraphicTransformObservable = ({ computedData$, fullDataFormatte
|
|
|
287
366
|
})
|
|
288
367
|
}
|
|
289
368
|
|
|
290
|
-
export const gridGraphicReverseScaleObservable = ({
|
|
291
|
-
|
|
369
|
+
export const gridGraphicReverseScaleObservable = ({ gridContainerPosition$, gridAxesTransform$, gridGraphicTransform$ }: {
|
|
370
|
+
gridContainerPosition$: Observable<GridContainerPosition[]>
|
|
292
371
|
gridAxesTransform$: Observable<TransformData>
|
|
293
372
|
gridGraphicTransform$: Observable<TransformData>
|
|
294
373
|
}): Observable<[number, number][]> => {
|
|
295
374
|
return combineLatest({
|
|
296
|
-
|
|
375
|
+
gridContainerPosition: gridContainerPosition$,
|
|
297
376
|
gridAxesTransform: gridAxesTransform$,
|
|
298
377
|
gridGraphicTransform: gridGraphicTransform$,
|
|
299
378
|
}).pipe(
|
|
300
379
|
switchMap(async (d) => d),
|
|
301
380
|
map(data => {
|
|
302
381
|
if (data.gridAxesTransform.rotate == 0 || data.gridAxesTransform.rotate == 180) {
|
|
303
|
-
return data.
|
|
382
|
+
return data.gridContainerPosition.map((series, seriesIndex) => {
|
|
304
383
|
return [
|
|
305
|
-
1 / data.gridGraphicTransform.scale[0] / data.
|
|
306
|
-
1 / data.gridGraphicTransform.scale[1] / data.
|
|
384
|
+
1 / data.gridGraphicTransform.scale[0] / data.gridContainerPosition[seriesIndex].scale[0],
|
|
385
|
+
1 / data.gridGraphicTransform.scale[1] / data.gridContainerPosition[seriesIndex].scale[1],
|
|
307
386
|
]
|
|
308
387
|
})
|
|
309
388
|
} else {
|
|
310
|
-
return data.
|
|
389
|
+
return data.gridContainerPosition.map((series, seriesIndex) => {
|
|
311
390
|
// 由於有垂直的旋轉,所以外層 (container) x和y的scale要互換
|
|
312
391
|
return [
|
|
313
|
-
1 / data.gridGraphicTransform.scale[0] / data.
|
|
314
|
-
1 / data.gridGraphicTransform.scale[1] / data.
|
|
392
|
+
1 / data.gridGraphicTransform.scale[0] / data.gridContainerPosition[seriesIndex].scale[1],
|
|
393
|
+
1 / data.gridGraphicTransform.scale[1] / data.gridContainerPosition[seriesIndex].scale[0],
|
|
315
394
|
]
|
|
316
395
|
})
|
|
317
396
|
}
|
|
@@ -380,7 +459,7 @@ export const gridAxesSizeObservable = ({ fullDataFormatter$, layout$ }: {
|
|
|
380
459
|
// return highlightObservable ({ datumList$, fullChartParams$, event$ })
|
|
381
460
|
// }
|
|
382
461
|
|
|
383
|
-
export const
|
|
462
|
+
export const seriesLabelsObservable = ({ computedData$ }: { computedData$: Observable<ComputedDataTypeMap<'grid'>> }) => {
|
|
384
463
|
return computedData$.pipe(
|
|
385
464
|
map(data => {
|
|
386
465
|
return data
|
|
@@ -410,78 +489,86 @@ export const gridVisibleComputedDataObservable = ({ computedData$ }: { computedD
|
|
|
410
489
|
)
|
|
411
490
|
}
|
|
412
491
|
|
|
413
|
-
export const
|
|
414
|
-
|
|
415
|
-
fullDataFormatter$: Observable<DataFormatterTypeMap<'grid'>>
|
|
416
|
-
}) => {
|
|
417
|
-
return combineLatest({
|
|
418
|
-
computedData: computedData$,
|
|
419
|
-
fullDataFormatter: fullDataFormatter$
|
|
420
|
-
}).pipe(
|
|
492
|
+
export const gridVisibleComputedLayoutDataObservable = ({ computedLayoutData$ }: { computedLayoutData$: Observable<ComputedLayoutDataGrid> }) => {
|
|
493
|
+
return computedLayoutData$.pipe(
|
|
421
494
|
map(data => {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
495
|
+
const visibleComputedData = data
|
|
496
|
+
.map(d => {
|
|
497
|
+
return d.filter(_d => {
|
|
498
|
+
return _d.visible == true
|
|
499
|
+
})
|
|
500
|
+
})
|
|
501
|
+
.filter(d => d.length)
|
|
502
|
+
return visibleComputedData
|
|
503
|
+
})
|
|
427
504
|
)
|
|
428
505
|
}
|
|
429
506
|
|
|
507
|
+
// export const isSeriesSeprateObservable = ({ computedData$, fullDataFormatter$ }: {
|
|
508
|
+
// computedData$: Observable<ComputedDataTypeMap<'grid'>>
|
|
509
|
+
// fullDataFormatter$: Observable<DataFormatterTypeMap<'grid'>>
|
|
510
|
+
// }) => {
|
|
511
|
+
// return combineLatest({
|
|
512
|
+
// computedData: computedData$,
|
|
513
|
+
// fullDataFormatter: fullDataFormatter$
|
|
514
|
+
// }).pipe(
|
|
515
|
+
// map(data => {
|
|
516
|
+
// return data.fullDataFormatter.grid.seriesSlotIndexes && data.fullDataFormatter.grid.seriesSlotIndexes.length === data.computedData.length
|
|
517
|
+
// ? true
|
|
518
|
+
// : false
|
|
519
|
+
// }),
|
|
520
|
+
// distinctUntilChanged()
|
|
521
|
+
// )
|
|
522
|
+
// }
|
|
523
|
+
|
|
430
524
|
// 所有container位置(對應series)
|
|
431
|
-
export const
|
|
525
|
+
export const gridContainerPositionObservable = ({ computedData$, fullDataFormatter$, layout$ }: {
|
|
432
526
|
computedData$: Observable<ComputedDataTypeMap<'grid'>>
|
|
433
527
|
fullDataFormatter$: Observable<DataFormatterTypeMap<'grid'>>
|
|
434
|
-
fullChartParams$: Observable<ChartParams>
|
|
435
528
|
layout$: Observable<Layout>
|
|
436
|
-
}) => {
|
|
529
|
+
}): Observable<GridContainerPosition[]> => {
|
|
437
530
|
|
|
438
|
-
const
|
|
531
|
+
const gridContainerPosition$ = combineLatest({
|
|
439
532
|
computedData: computedData$,
|
|
440
533
|
fullDataFormatter: fullDataFormatter$,
|
|
441
|
-
fullChartParams: fullChartParams$,
|
|
442
534
|
layout: layout$,
|
|
443
535
|
}).pipe(
|
|
444
536
|
switchMap(async (d) => d),
|
|
445
537
|
map(data => {
|
|
446
|
-
|
|
447
|
-
const grid = data.fullDataFormatter.grid
|
|
448
538
|
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
//
|
|
456
|
-
return
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
translate,
|
|
465
|
-
scale,
|
|
466
|
-
}
|
|
467
|
-
})
|
|
539
|
+
if (data.fullDataFormatter.grid.separateSeries) {
|
|
540
|
+
// -- 依slotIndexes計算 --
|
|
541
|
+
return calcGridContainerLayout(data.layout, data.fullDataFormatter.container, data.computedData.length)
|
|
542
|
+
// return data.computedData.map((seriesData, seriesIndex) => {
|
|
543
|
+
// const columnIndex = seriesIndex % data.fullDataFormatter.container.columnAmount
|
|
544
|
+
// const rowIndex = Math.floor(seriesIndex / data.fullDataFormatter.container.columnAmount)
|
|
545
|
+
// const { translate, scale } = calcGridContainerPosition(data.layout, data.fullDataFormatter.container, rowIndex, columnIndex)
|
|
546
|
+
// return {
|
|
547
|
+
// slotIndex: seriesIndex,
|
|
548
|
+
// rowIndex,
|
|
549
|
+
// columnIndex,
|
|
550
|
+
// translate,
|
|
551
|
+
// scale,
|
|
552
|
+
// }
|
|
553
|
+
// })
|
|
468
554
|
} else {
|
|
469
|
-
// --
|
|
470
|
-
|
|
471
|
-
const
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
}
|
|
555
|
+
// -- 無拆分 --
|
|
556
|
+
return calcGridContainerLayout(data.layout, data.fullDataFormatter.container, 1)
|
|
557
|
+
// const columnIndex = 0
|
|
558
|
+
// const rowIndex = 0
|
|
559
|
+
// return data.computedData.map((seriesData, seriesIndex) => {
|
|
560
|
+
// const { translate, scale } = calcGridContainerPosition(data.layout, data.fullDataFormatter.container, rowIndex, columnIndex)
|
|
561
|
+
// return {
|
|
562
|
+
// slotIndex: 0,
|
|
563
|
+
// rowIndex,
|
|
564
|
+
// columnIndex,
|
|
565
|
+
// translate,
|
|
566
|
+
// scale,
|
|
567
|
+
// }
|
|
568
|
+
// })
|
|
482
569
|
}
|
|
483
570
|
})
|
|
484
571
|
)
|
|
485
572
|
|
|
486
|
-
return
|
|
573
|
+
return gridContainerPosition$
|
|
487
574
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import type { DataGrid } from '../types/DataGrid'
|
|
1
|
+
import type { DataGrid, DataGridDatum } from '../types/DataGrid'
|
|
2
2
|
import type { ComputedDataFn } from '../types/ComputedData'
|
|
3
3
|
import type { ComputedDatumGrid } from '../types/ComputedDataGrid'
|
|
4
4
|
import type { DataFormatterContext } from '../types/DataFormatter'
|
|
5
|
-
import type {
|
|
5
|
+
import type { DataFormatterGridGrid } from '../types/DataFormatterGrid'
|
|
6
6
|
import type { ComputedDataMultiGrid } from '../types/ComputedDataMultiGrid'
|
|
7
7
|
// import { computeBaseGridData } from '../grid/computeGridData'
|
|
8
8
|
import { DATA_FORMATTER_MULTI_GRID_GRID_DEFAULT } from '../defaults'
|
|
@@ -13,76 +13,11 @@ import {
|
|
|
13
13
|
createMultiGridSeriesLabels,
|
|
14
14
|
createMultiGridGroupLabels
|
|
15
15
|
} from '../utils/orbchartsUtils'
|
|
16
|
-
import type { DataGridDatumTemp } from '../grid/computeGridData'
|
|
17
|
-
import { createTransposedDataGrid
|
|
16
|
+
// import type { DataGridDatumTemp } from '../grid/computeGridData'
|
|
17
|
+
import { createTransposedDataGrid } from '../grid/computeGridData'
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
context
|
|
21
|
-
gridIndex: number
|
|
22
|
-
transposedDataGrid: DataGridDatumTemp[][]
|
|
23
|
-
gridSeriesLabels: string[]
|
|
24
|
-
SeriesLabelColorMap: Map<string, string>
|
|
25
|
-
}) {
|
|
26
|
-
const { data = [], dataFormatter, chartParams, layout } = context
|
|
27
|
-
if (!data.length) {
|
|
28
|
-
return []
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const groupScale = createGroupScale(transposedDataGrid, dataFormatter, layout)
|
|
32
|
-
|
|
33
|
-
// const seriesLabels = createGridSeriesLabels({ transposedDataGrid, dataFormatter, chartType: 'multiGrid', gridIndex })
|
|
34
|
-
|
|
35
|
-
const groupLabels = createMultiGridGroupLabels({ transposedDataGrid, dataFormatter, chartType: 'multiGrid', gridIndex })
|
|
36
|
-
|
|
37
|
-
// 每一個series的valueScale
|
|
38
|
-
const seriesValueScaleArr = createSeriesValueScaleArr(transposedDataGrid, dataFormatter, layout)
|
|
39
|
-
|
|
40
|
-
const zeroYArr = transposedDataGrid.map((series, seriesIndex) => {
|
|
41
|
-
return seriesValueScaleArr[seriesIndex]!(0)
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
let _index = 0
|
|
45
|
-
let computedDataGrid: ComputedDatumGrid[][] = transposedDataGrid.map((seriesData, seriesIndex) => {
|
|
46
|
-
return seriesData.map((groupDatum, groupIndex) => {
|
|
47
|
-
|
|
48
|
-
const defaultId = createDefaultDatumId('multiGrid', gridIndex, seriesIndex, groupIndex)
|
|
49
|
-
const groupLabel = groupLabels[groupIndex]
|
|
50
|
-
const seriesLabel = gridSeriesLabels[seriesIndex]
|
|
51
|
-
const valueScale = seriesValueScaleArr[seriesIndex]
|
|
52
|
-
const axisY = valueScale(groupDatum.value ?? 0)
|
|
53
|
-
const zeroY = zeroYArr[seriesIndex]
|
|
54
|
-
|
|
55
|
-
const computedDatum: ComputedDatumGrid = {
|
|
56
|
-
id: groupDatum.id ? groupDatum.id : defaultId,
|
|
57
|
-
index: _index,
|
|
58
|
-
label: groupDatum.label ? groupDatum.label : defaultId,
|
|
59
|
-
description: groupDatum.description ?? '',
|
|
60
|
-
data: groupDatum.data,
|
|
61
|
-
value: groupDatum.value,
|
|
62
|
-
gridIndex,
|
|
63
|
-
// accSeriesIndex: seriesIndex, // 預設為seriesIndex
|
|
64
|
-
seriesIndex,
|
|
65
|
-
seriesLabel,
|
|
66
|
-
groupIndex,
|
|
67
|
-
groupLabel,
|
|
68
|
-
// color: seriesColorPredicate(seriesIndex, chartParams),
|
|
69
|
-
color: SeriesLabelColorMap.get(seriesLabel),
|
|
70
|
-
axisX: groupScale(groupIndex),
|
|
71
|
-
axisY,
|
|
72
|
-
axisYFromZero: axisY - zeroY,
|
|
73
|
-
visible: groupDatum._visible
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
_index ++
|
|
77
|
-
|
|
78
|
-
return computedDatum
|
|
79
|
-
})
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
return computedDataGrid
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
export const computeMultiGridData: ComputedDataFn<'multiGrid'> = ({ data = [], dataFormatter, chartParams, layout }) => {
|
|
19
|
+
export const computeMultiGridData: ComputedDataFn<'multiGrid'> = (context) => {
|
|
20
|
+
const { data = [], dataFormatter, chartParams } = context
|
|
86
21
|
if (!data.length) {
|
|
87
22
|
return []
|
|
88
23
|
}
|
|
@@ -93,54 +28,41 @@ export const computeMultiGridData: ComputedDataFn<'multiGrid'> = ({ data = [], d
|
|
|
93
28
|
const defaultGrid = dataFormatter.gridList[0] || DATA_FORMATTER_MULTI_GRID_GRID_DEFAULT
|
|
94
29
|
|
|
95
30
|
// 計算每個grid的dataFormatter
|
|
96
|
-
const gridDataFormatterList:
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
return {
|
|
100
|
-
type: 'grid',
|
|
101
|
-
grid: {
|
|
102
|
-
...currentDataFormatterGrid
|
|
103
|
-
},
|
|
104
|
-
container: {
|
|
105
|
-
...dataFormatter.container
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
})
|
|
109
|
-
|
|
110
|
-
const gridContextList = data.map((gridData, gridIndex) => {
|
|
111
|
-
// grid context
|
|
112
|
-
return {
|
|
113
|
-
data: gridData,
|
|
114
|
-
dataFormatter: gridDataFormatterList[gridIndex],
|
|
115
|
-
chartParams,
|
|
116
|
-
layout
|
|
117
|
-
}
|
|
31
|
+
const gridDataFormatterList: DataFormatterGridGrid[] = data.map((gridData, gridIndex) => {
|
|
32
|
+
return dataFormatter.gridList[gridIndex] || defaultGrid
|
|
118
33
|
})
|
|
119
34
|
|
|
120
35
|
const transposedDataGridList = data.map((gridData, gridIndex) => {
|
|
121
36
|
// 依seriesDirection轉置資料矩陣
|
|
122
|
-
return createTransposedDataGrid(
|
|
37
|
+
return createTransposedDataGrid(gridData, gridDataFormatterList[gridIndex])
|
|
123
38
|
})
|
|
124
39
|
|
|
125
|
-
const
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
40
|
+
// const isOverlappingMultiGrid = (() => {
|
|
41
|
+
// const SlotIndexSet = new Set(gridDataFormatterList.map(d => d.slotIndex))
|
|
42
|
+
// // 判斷是否有重疊的grid
|
|
43
|
+
// return SlotIndexSet.size !== gridDataFormatterList.length
|
|
44
|
+
// })()
|
|
45
|
+
|
|
46
|
+
const multiGridSeriesLabels = dataFormatter.separateGrid
|
|
47
|
+
// grid分開的時候,預設每組的seriesLabels相同
|
|
48
|
+
? transposedDataGridList
|
|
49
|
+
.map((gridData, gridIndex) => {
|
|
50
|
+
return createGridSeriesLabels({
|
|
51
|
+
transposedDataGrid: gridData,
|
|
52
|
+
dataFormatterGrid: gridDataFormatterList[gridIndex],
|
|
53
|
+
chartType: 'multiGrid',
|
|
54
|
+
})
|
|
55
|
+
})
|
|
56
|
+
// grid不分開的時候,預設每個grid相同seriesIndex的seriesLabel相同
|
|
57
|
+
: transposedDataGridList
|
|
58
|
+
.map((gridData, gridIndex) => {
|
|
59
|
+
return createMultiGridSeriesLabels({
|
|
60
|
+
transposedDataGrid: gridData,
|
|
61
|
+
dataFormatterGrid: gridDataFormatterList[gridIndex],
|
|
62
|
+
chartType: 'multiGrid',
|
|
63
|
+
gridIndex
|
|
64
|
+
})
|
|
65
|
+
})
|
|
144
66
|
|
|
145
67
|
const SeriesLabelColorMap: Map<string, string> = new Map()
|
|
146
68
|
let accIndex = 0
|
|
@@ -153,14 +75,49 @@ export const computeMultiGridData: ComputedDataFn<'multiGrid'> = ({ data = [], d
|
|
|
153
75
|
})
|
|
154
76
|
|
|
155
77
|
// 計算每個grid的資料
|
|
156
|
-
multiGridData =
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
78
|
+
multiGridData = transposedDataGridList.map((gridData, gridIndex) => {
|
|
79
|
+
const gridSeriesLabels = multiGridSeriesLabels[gridIndex]
|
|
80
|
+
const groupLabels = createMultiGridGroupLabels({
|
|
81
|
+
transposedDataGrid: gridData,
|
|
82
|
+
dataFormatterGrid: gridDataFormatterList[gridIndex],
|
|
83
|
+
chartType: 'multiGrid',
|
|
84
|
+
gridIndex
|
|
163
85
|
})
|
|
86
|
+
|
|
87
|
+
let _index = 0
|
|
88
|
+
let computedDataGrid: ComputedDatumGrid[][] = gridData.map((seriesData, seriesIndex) => {
|
|
89
|
+
return seriesData.map((groupDatum, groupIndex) => {
|
|
90
|
+
|
|
91
|
+
const defaultId = createDefaultDatumId('multiGrid', gridIndex, seriesIndex, groupIndex)
|
|
92
|
+
const groupLabel = groupLabels[groupIndex]
|
|
93
|
+
const seriesLabel = gridSeriesLabels[seriesIndex]
|
|
94
|
+
|
|
95
|
+
const computedDatum: ComputedDatumGrid = {
|
|
96
|
+
id: groupDatum.id ? groupDatum.id : defaultId,
|
|
97
|
+
index: _index,
|
|
98
|
+
label: groupDatum.label ? groupDatum.label : defaultId,
|
|
99
|
+
description: groupDatum.description ?? '',
|
|
100
|
+
data: groupDatum.data,
|
|
101
|
+
value: groupDatum.value,
|
|
102
|
+
gridIndex,
|
|
103
|
+
// accSeriesIndex: seriesIndex, // 預設為seriesIndex
|
|
104
|
+
seriesIndex,
|
|
105
|
+
seriesLabel,
|
|
106
|
+
groupIndex,
|
|
107
|
+
groupLabel,
|
|
108
|
+
color: SeriesLabelColorMap.get(seriesLabel),
|
|
109
|
+
visible: true // 先給一個預設值
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
computedDatum.visible = dataFormatter.visibleFilter(computedDatum, context)
|
|
113
|
+
|
|
114
|
+
_index ++
|
|
115
|
+
|
|
116
|
+
return computedDatum
|
|
117
|
+
})
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
return computedDataGrid
|
|
164
121
|
})
|
|
165
122
|
|
|
166
123
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
shareReplay } from 'rxjs'
|
|
3
3
|
import type { ContextObserverFn } from '../types'
|
|
4
|
-
import { multiGridEachDetailObservable
|
|
4
|
+
import { multiGridEachDetailObservable } from './multiGridObservables'
|
|
5
5
|
import { textSizePxObservable } from '../utils/observables'
|
|
6
6
|
|
|
7
7
|
export const createMultiGridContextObserver: ContextObserverFn<'multiGrid'> = ({ subject, observer }) => {
|
|
@@ -20,12 +20,12 @@ export const createMultiGridContextObserver: ContextObserverFn<'multiGrid'> = ({
|
|
|
20
20
|
shareReplay(1)
|
|
21
21
|
)
|
|
22
22
|
|
|
23
|
-
const multiGridContainer$ = multiGridContainerObservable({
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
})
|
|
23
|
+
// const multiGridContainer$ = multiGridContainerObservable({
|
|
24
|
+
// computedData$: observer.computedData$,
|
|
25
|
+
// fullDataFormatter$: observer.fullDataFormatter$,
|
|
26
|
+
// fullChartParams$: observer.fullChartParams$,
|
|
27
|
+
// layout$: observer.layout$,
|
|
28
|
+
// })
|
|
29
29
|
|
|
30
30
|
return {
|
|
31
31
|
fullParams$: observer.fullParams$,
|
|
@@ -35,6 +35,6 @@ export const createMultiGridContextObserver: ContextObserverFn<'multiGrid'> = ({
|
|
|
35
35
|
layout$: observer.layout$,
|
|
36
36
|
textSizePx$,
|
|
37
37
|
multiGridEachDetail$,
|
|
38
|
-
multiGridContainer$
|
|
38
|
+
// multiGridContainer$
|
|
39
39
|
}
|
|
40
40
|
}
|