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

Sign up to get free protection for your applications and to get access to all the features.
Files changed (130) hide show
  1. package/dist/{src → orbcharts-plugins-basic/src}/base/BaseBarStack.d.ts +6 -4
  2. package/dist/{src → orbcharts-plugins-basic/src}/base/BaseBars.d.ts +6 -4
  3. package/dist/{src → orbcharts-plugins-basic/src}/base/BaseBarsTriangle.d.ts +7 -4
  4. package/dist/{src → orbcharts-plugins-basic/src}/base/BaseDots.d.ts +5 -3
  5. package/dist/{src → orbcharts-plugins-basic/src}/base/BaseGroupAxis.d.ts +3 -3
  6. package/dist/{src → orbcharts-plugins-basic/src}/base/BaseLegend.d.ts +1 -0
  7. package/dist/{src → orbcharts-plugins-basic/src}/base/BaseLineAreas.d.ts +6 -3
  8. package/dist/{src → orbcharts-plugins-basic/src}/base/BaseLines.d.ts +6 -3
  9. package/dist/{src → orbcharts-plugins-basic/src}/base/BaseValueAxis.d.ts +3 -3
  10. package/dist/{src → orbcharts-plugins-basic/src}/grid/gridObservables.d.ts +4 -4
  11. package/dist/orbcharts-plugins-basic/src/index.d.ts +5 -0
  12. package/dist/orbcharts-plugins-basic/src/multiGrid/multiGridObservables.d.ts +8 -0
  13. package/dist/orbcharts-plugins-basic/src/series/plugins/PieEventTexts.d.ts +3 -0
  14. package/dist/orbcharts-plugins-basic/src/series/seriesObservables.d.ts +21 -0
  15. package/dist/{src → orbcharts-plugins-basic/src}/series/seriesUtils.d.ts +3 -3
  16. package/dist/orbcharts-plugins-basic.es.js +8349 -8142
  17. package/dist/orbcharts-plugins-basic.umd.js +8 -8
  18. package/dist/src/index.d.ts +1 -5
  19. package/package.json +2 -2
  20. package/src/base/BaseBarStack.ts +105 -208
  21. package/src/base/BaseBars.ts +78 -64
  22. package/src/base/BaseBarsTriangle.ts +76 -63
  23. package/src/base/BaseDots.ts +41 -178
  24. package/src/base/BaseGroupAxis.ts +16 -16
  25. package/src/base/BaseLegend.ts +18 -13
  26. package/src/base/BaseLineAreas.ts +85 -81
  27. package/src/base/BaseLines.ts +82 -75
  28. package/src/base/BaseValueAxis.ts +17 -18
  29. package/src/grid/gridObservables.ts +22 -38
  30. package/src/grid/plugins/BarStack.ts +16 -3
  31. package/src/grid/plugins/Bars.ts +18 -4
  32. package/src/grid/plugins/BarsDiverging.ts +6 -4
  33. package/src/grid/plugins/BarsTriangle.ts +20 -4
  34. package/src/grid/plugins/Dots.ts +4 -2
  35. package/src/grid/plugins/GridLegend.ts +2 -1
  36. package/src/grid/plugins/GroupAux.ts +8 -6
  37. package/src/grid/plugins/GroupAxis.ts +15 -3
  38. package/src/grid/plugins/LineAreas.ts +5 -2
  39. package/src/grid/plugins/Lines.ts +5 -2
  40. package/src/grid/plugins/ScalingArea.ts +0 -1
  41. package/src/grid/plugins/ValueAxis.ts +15 -3
  42. package/src/grid/plugins/ValueStackAxis.ts +14 -5
  43. package/src/multiGrid/multiGridObservables.ts +14 -261
  44. package/src/multiGrid/plugins/MultiBarStack.ts +22 -8
  45. package/src/multiGrid/plugins/MultiBars.ts +21 -7
  46. package/src/multiGrid/plugins/MultiBarsTriangle.ts +22 -7
  47. package/src/multiGrid/plugins/MultiDots.ts +7 -5
  48. package/src/multiGrid/plugins/MultiGridLegend.ts +3 -2
  49. package/src/multiGrid/plugins/MultiGroupAxis.ts +19 -7
  50. package/src/multiGrid/plugins/MultiLineAreas.ts +9 -6
  51. package/src/multiGrid/plugins/MultiLines.ts +9 -6
  52. package/src/multiGrid/plugins/MultiValueAxis.ts +19 -7
  53. package/src/multiGrid/plugins/OverlappingValueAxes.ts +52 -47
  54. package/src/noneData/defaults.ts +3 -0
  55. package/src/noneData/plugins/Tooltip.ts +9 -3
  56. package/src/series/defaults.ts +13 -3
  57. package/src/series/plugins/Bubbles.ts +57 -37
  58. package/src/series/plugins/Pie.ts +300 -352
  59. package/src/series/plugins/PieEventTexts.ts +102 -38
  60. package/src/series/plugins/PieLabels.ts +95 -48
  61. package/src/series/plugins/SeriesLegend.ts +2 -1
  62. package/src/series/seriesObservables.ts +145 -0
  63. package/src/series/seriesUtils.ts +4 -4
  64. package/src/tree/plugins/TreeLegend.ts +2 -1
  65. package/src/tree/plugins/TreeMap.ts +8 -5
  66. package/tsconfig.json +3 -0
  67. package/dist/src/multiGrid/multiGridObservables.d.ts +0 -12
  68. package/dist/src/series/plugins/PieEventTexts.d.ts +0 -1
  69. /package/dist/{src → orbcharts-plugins-basic/src}/base/BaseGroupArea.d.ts +0 -0
  70. /package/dist/{src → orbcharts-plugins-basic/src}/base/types.d.ts +0 -0
  71. /package/dist/{src → orbcharts-plugins-basic/src}/grid/defaults.d.ts +0 -0
  72. /package/dist/{src → orbcharts-plugins-basic/src}/grid/index.d.ts +0 -0
  73. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/BarStack.d.ts +0 -0
  74. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/Bars.d.ts +0 -0
  75. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/BarsDiverging.d.ts +0 -0
  76. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/BarsTriangle.d.ts +0 -0
  77. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/Dots.d.ts +0 -0
  78. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/GridLegend.d.ts +0 -0
  79. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/GroupAux.d.ts +0 -0
  80. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/GroupAxis.d.ts +0 -0
  81. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/LineAreas.d.ts +0 -0
  82. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/Lines.d.ts +0 -0
  83. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/Ranking.d.ts +0 -0
  84. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/RankingAxis.d.ts +0 -0
  85. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/ScalingArea.d.ts +0 -0
  86. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/ValueAxis.d.ts +0 -0
  87. /package/dist/{src → orbcharts-plugins-basic/src}/grid/plugins/ValueStackAxis.d.ts +0 -0
  88. /package/dist/{src → orbcharts-plugins-basic/src}/grid/types.d.ts +0 -0
  89. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/defaults.d.ts +0 -0
  90. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/index.d.ts +0 -0
  91. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/plugins/MultiBarStack.d.ts +0 -0
  92. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/plugins/MultiBars.d.ts +0 -0
  93. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/plugins/MultiBarsTriangle.d.ts +0 -0
  94. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/plugins/MultiDots.d.ts +0 -0
  95. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/plugins/MultiGridLegend.d.ts +0 -0
  96. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/plugins/MultiGroupAxis.d.ts +0 -0
  97. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/plugins/MultiLineAreas.d.ts +0 -0
  98. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/plugins/MultiLines.d.ts +0 -0
  99. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/plugins/MultiValueAxis.d.ts +0 -0
  100. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/plugins/OverlappingValueAxes.d.ts +0 -0
  101. /package/dist/{src → orbcharts-plugins-basic/src}/multiGrid/types.d.ts +0 -0
  102. /package/dist/{src → orbcharts-plugins-basic/src}/multiValue/index.d.ts +0 -0
  103. /package/dist/{src → orbcharts-plugins-basic/src}/multiValue/plugins/Scatter.d.ts +0 -0
  104. /package/dist/{src → orbcharts-plugins-basic/src}/multiValue/plugins/ScatterAxes.d.ts +0 -0
  105. /package/dist/{src → orbcharts-plugins-basic/src}/noneData/defaults.d.ts +0 -0
  106. /package/dist/{src → orbcharts-plugins-basic/src}/noneData/index.d.ts +0 -0
  107. /package/dist/{src → orbcharts-plugins-basic/src}/noneData/plugins/Container.d.ts +0 -0
  108. /package/dist/{src → orbcharts-plugins-basic/src}/noneData/plugins/Tooltip.d.ts +0 -0
  109. /package/dist/{src → orbcharts-plugins-basic/src}/noneData/types.d.ts +0 -0
  110. /package/dist/{src → orbcharts-plugins-basic/src}/relationship/index.d.ts +0 -0
  111. /package/dist/{src → orbcharts-plugins-basic/src}/relationship/plugins/Relationship.d.ts +0 -0
  112. /package/dist/{src → orbcharts-plugins-basic/src}/series/defaults.d.ts +0 -0
  113. /package/dist/{src → orbcharts-plugins-basic/src}/series/index.d.ts +0 -0
  114. /package/dist/{src → orbcharts-plugins-basic/src}/series/plugins/Bubbles.d.ts +0 -0
  115. /package/dist/{src → orbcharts-plugins-basic/src}/series/plugins/Pie.d.ts +0 -0
  116. /package/dist/{src → orbcharts-plugins-basic/src}/series/plugins/PieLabels.d.ts +0 -0
  117. /package/dist/{src → orbcharts-plugins-basic/src}/series/plugins/SeriesLegend.d.ts +0 -0
  118. /package/dist/{src → orbcharts-plugins-basic/src}/series/plugins/Waffle.d.ts +0 -0
  119. /package/dist/{src → orbcharts-plugins-basic/src}/series/types.d.ts +0 -0
  120. /package/dist/{src → orbcharts-plugins-basic/src}/tree/defaults.d.ts +0 -0
  121. /package/dist/{src → orbcharts-plugins-basic/src}/tree/index.d.ts +0 -0
  122. /package/dist/{src → orbcharts-plugins-basic/src}/tree/plugins/TreeLegend.d.ts +0 -0
  123. /package/dist/{src → orbcharts-plugins-basic/src}/tree/plugins/TreeMap.d.ts +0 -0
  124. /package/dist/{src → orbcharts-plugins-basic/src}/tree/types.d.ts +0 -0
  125. /package/dist/{src → orbcharts-plugins-basic/src}/utils/commonUtils.d.ts +0 -0
  126. /package/dist/{src → orbcharts-plugins-basic/src}/utils/d3Graphics.d.ts +0 -0
  127. /package/dist/{src → orbcharts-plugins-basic/src}/utils/d3Utils.d.ts +0 -0
  128. /package/dist/{src → orbcharts-plugins-basic/src}/utils/observables.d.ts +0 -0
  129. /package/dist/{src → orbcharts-plugins-basic/src}/utils/orbchartsUtils.d.ts +0 -0
  130. /package/dist/{vite.config.d.ts → orbcharts-plugins-basic/vite.config.d.ts} +0 -0
@@ -12,13 +12,14 @@ import type { BasePluginFn } from './types'
12
12
  import type {
13
13
  ComputedDatumGrid,
14
14
  ComputedDataGrid,
15
+ ComputedLayoutDatumGrid,
16
+ ComputedLayoutDataGrid,
15
17
  DataFormatterGrid,
16
18
  EventGrid,
17
- ContainerPosition,
19
+ GridContainerPosition,
18
20
  ChartParams,
19
21
  Layout,
20
22
  TransformData } from '@orbcharts/core'
21
- import { DATA_FORMATTER_VALUE_AXIS } from '@orbcharts/core/src/defaults'
22
23
  import { createAxisLinearScale } from '@orbcharts/core'
23
24
  import { getD3TransitionEase } from '../utils/d3Utils'
24
25
  import { getClassName, getUniID, getMinAndMaxValue } from '../utils/orbchartsUtils'
@@ -34,7 +35,10 @@ export interface BaseLineAreasParams {
34
35
  interface BaseLineAreasContext {
35
36
  selection: d3.Selection<any, unknown, any, unknown>
36
37
  computedData$: Observable<ComputedDataGrid>
37
- existSeriesLabels$: Observable<string[]>
38
+ computedLayoutData$: Observable<ComputedLayoutDataGrid>
39
+ visibleComputedData$: Observable<ComputedDatumGrid[][]>
40
+ visibleComputedLayoutData$: Observable<ComputedLayoutDataGrid>
41
+ seriesLabels$: Observable<string[]>
38
42
  SeriesDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
39
43
  GroupDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
40
44
  fullDataFormatter$: Observable<DataFormatterGrid>
@@ -47,7 +51,7 @@ interface BaseLineAreasContext {
47
51
  height: number;
48
52
  }>
49
53
  gridHighlight$: Observable<ComputedDatumGrid[]>
50
- gridContainer$: Observable<ContainerPosition[]>
54
+ gridContainerPosition$: Observable<GridContainerPosition[]>
51
55
  layout$: Observable<Layout>
52
56
  event$: Subject<EventGrid>
53
57
  }
@@ -64,8 +68,8 @@ type ClipPathDatum = {
64
68
  // const pathClassName = getClassName(pluginName, 'path')
65
69
 
66
70
 
67
- function createAreaPath (lineCurve: string = 'curveLinear', valueAxisStart: number): d3.Line<ComputedDatumGrid> {
68
- return d3.area<ComputedDatumGrid>()
71
+ function createAreaPath (lineCurve: string = 'curveLinear', valueAxisStart: number): d3.Line<ComputedLayoutDatumGrid> {
72
+ return d3.area<ComputedLayoutDatumGrid>()
69
73
  .x((d) => d.axisX)
70
74
  .y0(d => valueAxisStart)
71
75
  .y1((d) => d.axisY)
@@ -74,8 +78,8 @@ function createAreaPath (lineCurve: string = 'curveLinear', valueAxisStart: numb
74
78
  }
75
79
 
76
80
  // 依無值的資料分段
77
- function makeSegmentData (data: ComputedDatumGrid[]): ComputedDatumGrid[][] {
78
- let segmentData: ComputedDatumGrid[][] = [[]]
81
+ function makeSegmentData (data: ComputedLayoutDatumGrid[]): ComputedLayoutDatumGrid[][] {
82
+ let segmentData: ComputedLayoutDatumGrid[][] = [[]]
79
83
 
80
84
  let currentIndex = 0
81
85
  for (let i in data) {
@@ -97,17 +101,17 @@ function makeSegmentData (data: ComputedDatumGrid[]): ComputedDatumGrid[][] {
97
101
  function renderLineAreas ({ selection, pathClassName, segmentData, areaPath, linearGradientIds, params }: {
98
102
  selection: d3.Selection<SVGGElement, unknown, any, unknown>
99
103
  pathClassName: string
100
- segmentData: ComputedDatumGrid[][]
101
- areaPath: d3.Line<ComputedDatumGrid>
104
+ segmentData: ComputedLayoutDatumGrid[][]
105
+ areaPath: d3.Line<ComputedLayoutDatumGrid>
102
106
  linearGradientIds: string[]
103
107
  params: BaseLineAreasParams
104
- }): d3.Selection<SVGPathElement, ComputedDatumGrid[], any, any> {
108
+ }): d3.Selection<SVGPathElement, ComputedLayoutDatumGrid[], any, any> {
105
109
  // if (!data[0]) {
106
110
  // return undefined
107
111
  // }
108
112
 
109
113
  const lineAreas = selection
110
- .selectAll<SVGPathElement, ComputedDatumGrid[]>('path')
114
+ .selectAll<SVGPathElement, ComputedLayoutDatumGrid[]>('path')
111
115
  .data(segmentData, (d, i) => d.length ? `${d[0].id}_${d[d.length - 1].id}` : i) // 以線段起迄id結合為線段id
112
116
  .join(
113
117
  enter => {
@@ -256,7 +260,10 @@ function renderClipPath ({ defsSelection, clipPathData, transitionDuration, tran
256
260
  export const createBaseLineAreas: BasePluginFn<BaseLineAreasContext> = (pluginName: string, {
257
261
  selection,
258
262
  computedData$,
259
- existSeriesLabels$,
263
+ computedLayoutData$,
264
+ visibleComputedData$,
265
+ visibleComputedLayoutData$,
266
+ seriesLabels$,
260
267
  SeriesDataMap$,
261
268
  GroupDataMap$,
262
269
  fullParams$,
@@ -266,7 +273,7 @@ export const createBaseLineAreas: BasePluginFn<BaseLineAreasContext> = (pluginNa
266
273
  gridGraphicTransform$,
267
274
  gridAxesSize$,
268
275
  gridHighlight$,
269
- gridContainer$,
276
+ gridContainerPosition$,
270
277
  layout$,
271
278
  event$
272
279
  }) => {
@@ -285,8 +292,8 @@ export const createBaseLineAreas: BasePluginFn<BaseLineAreasContext> = (pluginNa
285
292
  selection,
286
293
  pluginName,
287
294
  clipPathID,
288
- existSeriesLabels$,
289
- gridContainer$,
295
+ seriesLabels$,
296
+ gridContainerPosition$,
290
297
  gridAxesTransform$,
291
298
  gridGraphicTransform$
292
299
  })
@@ -300,7 +307,7 @@ export const createBaseLineAreas: BasePluginFn<BaseLineAreasContext> = (pluginNa
300
307
  })
301
308
  )
302
309
 
303
- const areaPath$: Observable<d3.Line<ComputedDatumGrid>> = new Observable(subscriber => {
310
+ const areaPath$: Observable<d3.Line<ComputedLayoutDatumGrid>> = new Observable(subscriber => {
304
311
  const paramsSubscription = combineLatest({
305
312
  fullParams: fullParams$,
306
313
  valueAxisStart: valueAxisStart$
@@ -316,19 +323,18 @@ export const createBaseLineAreas: BasePluginFn<BaseLineAreasContext> = (pluginNa
316
323
  }
317
324
  })
318
325
 
319
- // 顯示範圍內的series labels
320
- const seriesLabels$: Observable<string[]> = new Observable(subscriber => {
321
- computedData$.pipe(
322
- takeUntil(destroy$),
323
- // 轉換後會退訂前一個未完成的訂閱事件,因此可以取到「同時間」最後一次的訂閱事件
324
- switchMap(async (d) => d),
325
- ).subscribe(data => {
326
- const labels = data[0] && data[0][0]
327
- ? data.map(d => d[0].seriesLabel)
328
- : []
329
- subscriber.next(labels)
330
- })
331
- })
326
+ // // 顯示範圍內的series labels
327
+ // const seriesLabels$: Observable<string[]> = new Observable(subscriber => {
328
+ // computedData$.pipe(
329
+ // takeUntil(destroy$),
330
+ // switchMap(async (d) => d),
331
+ // ).subscribe(data => {
332
+ // const labels = data[0] && data[0][0]
333
+ // ? data.map(d => d[0].seriesLabel)
334
+ // : []
335
+ // subscriber.next(labels)
336
+ // })
337
+ // })
332
338
 
333
339
  // const axisSize$ = gridAxisSizeObservable({
334
340
  // fullDataFormatter$,
@@ -355,7 +361,6 @@ export const createBaseLineAreas: BasePluginFn<BaseLineAreasContext> = (pluginNa
355
361
  transitionEase: transitionEase$
356
362
  }).pipe(
357
363
  takeUntil(destroy$),
358
- // 轉換後會退訂前一個未完成的訂閱事件,因此可以取到「同時間」最後一次的訂閱事件
359
364
  switchMap(async (d) => d),
360
365
  ).subscribe(data => {
361
366
  // 外層的遮罩
@@ -419,54 +424,65 @@ export const createBaseLineAreas: BasePluginFn<BaseLineAreasContext> = (pluginNa
419
424
  }))
420
425
  )
421
426
 
422
- const graphSubscription = combineLatest({
427
+ const pathSelectionArr$ = combineLatest({
423
428
  graphicGSelection: graphicGSelection$,
424
429
  defsSelection: defsSelection$,
425
- seriesLabels: seriesLabels$,
426
- computedData: computedData$,
430
+ visibleComputedLayoutData: visibleComputedLayoutData$,
427
431
  linearGradientIds: linearGradientIds$,
428
- SeriesDataMap: SeriesDataMap$,
429
- GroupDataMap: GroupDataMap$,
430
432
  areaPath: areaPath$,
431
433
  params: fullParams$,
434
+ }).pipe(
435
+ takeUntil(destroy$),
436
+ switchMap(async (d) => d),
437
+ map(data => {
438
+ // const updateGraphic = data.graphicGSelection
439
+ // .selectAll<SVGGElement, number>('g')
440
+ // .data(data.seriesLabels, (d, i) => d)
441
+ // const enterGraphic = updateGraphic.enter()
442
+ // .append('g')
443
+ // .classed(graphicClassName, true)
444
+ // updateGraphic.exit().remove()
445
+ // const graphicSelection = updateGraphic.merge(enterGraphic)
446
+ // .attr('clip-path', (d, i) => `url(#orbcharts__clipPath_${d})`)
447
+ let pathSelectionArr: d3.Selection<SVGPathElement, ComputedLayoutDatumGrid[], any, any>[] = []
448
+
449
+ // 繪圖
450
+ data.graphicGSelection.each((d, i, all) => {
451
+ // 將資料分段
452
+ const segmentData = makeSegmentData(data.visibleComputedLayoutData[i] ?? [])
453
+
454
+ pathSelectionArr[i] = renderLineAreas({
455
+ selection: d3.select(all[i]),
456
+ pathClassName,
457
+ areaPath: data.areaPath,
458
+ segmentData: segmentData,
459
+ linearGradientIds: data.linearGradientIds,
460
+ params: data.params
461
+ })
462
+ renderLinearGradient({
463
+ defsSelection: data.defsSelection,
464
+ computedData: data.visibleComputedLayoutData,
465
+ linearGradientIds: data.linearGradientIds,
466
+ params: data.params
467
+ })
468
+ })
469
+
470
+ return pathSelectionArr
471
+ })
472
+ )
473
+
474
+ combineLatest({
475
+ pathSelectionArr: pathSelectionArr$,
476
+ computedData: computedData$,
477
+ SeriesDataMap: SeriesDataMap$,
478
+ GroupDataMap: GroupDataMap$,
432
479
  highlightTarget: highlightTarget$,
433
480
  gridGroupPositionFn: gridGroupPositionFn$,
434
481
  }).pipe(
435
482
  takeUntil(destroy$),
436
- // 轉換後會退訂前一個未完成的訂閱事件,因此可以取到「同時間」最後一次的訂閱事件
437
483
  switchMap(async (d) => d),
438
484
  ).subscribe(data => {
439
-
440
- // const updateGraphic = data.graphicGSelection
441
- // .selectAll<SVGGElement, number>('g')
442
- // .data(data.seriesLabels, (d, i) => d)
443
- // const enterGraphic = updateGraphic.enter()
444
- // .append('g')
445
- // .classed(graphicClassName, true)
446
- // updateGraphic.exit().remove()
447
- // const graphicSelection = updateGraphic.merge(enterGraphic)
448
- // .attr('clip-path', (d, i) => `url(#orbcharts__clipPath_${d})`)
449
-
450
- // 繪圖
451
- data.graphicGSelection.each((d, i, all) => {
452
- // 將資料分段
453
- const segmentData = makeSegmentData(data.computedData[i] ?? [])
454
-
455
- const pathSelection = renderLineAreas({
456
- selection: d3.select(all[i]),
457
- pathClassName,
458
- areaPath: data.areaPath,
459
- segmentData: segmentData,
460
- linearGradientIds: data.linearGradientIds,
461
- params: data.params
462
- })
463
- renderLinearGradient({
464
- defsSelection: data.defsSelection,
465
- computedData: data.computedData,
466
- linearGradientIds: data.linearGradientIds,
467
- params: data.params
468
- })
469
-
485
+ data.pathSelectionArr.forEach(pathSelection => {
470
486
  pathSelection
471
487
  .on('mouseover', (event, datum) => {
472
488
  event.stopPropagation()
@@ -570,21 +586,9 @@ export const createBaseLineAreas: BasePluginFn<BaseLineAreasContext> = (pluginNa
570
586
  groupLabel: _datum.groupLabel,
571
587
  event,
572
588
  data: data.computedData
573
- })
574
589
  })
575
-
590
+ })
576
591
  })
577
-
578
-
579
-
580
- // graphicSelection$.next(graphicSelection)
581
-
582
-
583
- // pathSelection = renderLineAreas({
584
- // selection: graphicSelection,
585
- // areaPath: d.areaPath,
586
- // data: d.computedData
587
- // })
588
592
  })
589
593
 
590
594
  // const datumList$ = computedData$.pipe(
@@ -12,9 +12,11 @@ import type { BasePluginFn } from './types'
12
12
  import type {
13
13
  ComputedDatumGrid,
14
14
  ComputedDataGrid,
15
+ ComputedLayoutDatumGrid,
16
+ ComputedLayoutDataGrid,
15
17
  DataFormatterGrid,
16
18
  EventGrid,
17
- ContainerPosition,
19
+ GridContainerPosition,
18
20
  ChartParams,
19
21
  Layout,
20
22
  TransformData } from '@orbcharts/core'
@@ -38,7 +40,10 @@ export interface BaseLinesParams {
38
40
  interface BaseLinesContext {
39
41
  selection: d3.Selection<any, unknown, any, unknown>
40
42
  computedData$: Observable<ComputedDataGrid>
41
- existSeriesLabels$: Observable<string[]>
43
+ computedLayoutData$: Observable<ComputedLayoutDataGrid>
44
+ visibleComputedData$: Observable<ComputedDatumGrid[][]>
45
+ visibleComputedLayoutData$: Observable<ComputedLayoutDataGrid>
46
+ seriesLabels$: Observable<string[]>
42
47
  SeriesDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
43
48
  GroupDataMap$: Observable<Map<string, ComputedDatumGrid[]>>
44
49
  fullDataFormatter$: Observable<DataFormatterGrid>
@@ -51,7 +56,7 @@ interface BaseLinesContext {
51
56
  height: number;
52
57
  }>
53
58
  gridHighlight$: Observable<ComputedDatumGrid[]>
54
- gridContainer$: Observable<ContainerPosition[]>
59
+ gridContainerPosition$: Observable<GridContainerPosition[]>
55
60
  event$: Subject<EventGrid>
56
61
  }
57
62
 
@@ -68,16 +73,16 @@ type ClipPathDatum = {
68
73
  // const pathClassName = getClassName(pluginName, 'path')
69
74
 
70
75
 
71
- function createLinePath (lineCurve: string = 'curveLinear'): d3.Line<ComputedDatumGrid> {
72
- return d3.line<ComputedDatumGrid>()
76
+ function createLinePath (lineCurve: string = 'curveLinear'): d3.Line<ComputedLayoutDatumGrid> {
77
+ return d3.line<ComputedLayoutDatumGrid>()
73
78
  .x((d) => d.axisX)
74
79
  .y((d) => d.axisY)
75
80
  .curve((d3 as any)[lineCurve])
76
81
  }
77
82
 
78
83
  // 依無值的資料分段
79
- function makeSegmentData (data: ComputedDatumGrid[]): ComputedDatumGrid[][] {
80
- let segmentData: ComputedDatumGrid[][] = [[]]
84
+ function makeSegmentData (data: ComputedLayoutDatumGrid[]): ComputedLayoutDatumGrid[][] {
85
+ let segmentData: ComputedLayoutDatumGrid[][] = [[]]
81
86
 
82
87
  let currentIndex = 0
83
88
  for (let i in data) {
@@ -99,16 +104,16 @@ function makeSegmentData (data: ComputedDatumGrid[]): ComputedDatumGrid[][] {
99
104
  function renderLines ({ selection, pathClassName, segmentData, linePath, params }: {
100
105
  selection: d3.Selection<SVGGElement, unknown, any, unknown>
101
106
  pathClassName: string
102
- segmentData: ComputedDatumGrid[][]
103
- linePath: d3.Line<ComputedDatumGrid>
107
+ segmentData: ComputedLayoutDatumGrid[][]
108
+ linePath: d3.Line<ComputedLayoutDatumGrid>
104
109
  params: BaseLinesParams
105
- }): d3.Selection<SVGPathElement, ComputedDatumGrid[], any, any> {
110
+ }): d3.Selection<SVGPathElement, ComputedLayoutDatumGrid[], any, any> {
106
111
  // if (!data[0]) {
107
112
  // return undefined
108
113
  // }
109
114
 
110
115
  const lines = selection
111
- .selectAll<SVGPathElement, ComputedDatumGrid[]>('path')
116
+ .selectAll<SVGPathElement, ComputedLayoutDatumGrid[]>('path')
112
117
  .data(segmentData, (d, i) => d.length ? `${d[0].id}_${d[d.length - 1].id}` : i) // 以線段起迄id結合為線段id
113
118
  .join(
114
119
  enter => {
@@ -221,7 +226,10 @@ function renderClipPath ({ defsSelection, clipPathData, transitionDuration, tran
221
226
  export const createBaseLines: BasePluginFn<BaseLinesContext> = (pluginName: string, {
222
227
  selection,
223
228
  computedData$,
224
- existSeriesLabels$,
229
+ computedLayoutData$,
230
+ visibleComputedData$,
231
+ visibleComputedLayoutData$,
232
+ seriesLabels$,
225
233
  SeriesDataMap$,
226
234
  GroupDataMap$,
227
235
  fullParams$,
@@ -231,7 +239,7 @@ export const createBaseLines: BasePluginFn<BaseLinesContext> = (pluginName: stri
231
239
  gridGraphicTransform$,
232
240
  gridAxesSize$,
233
241
  gridHighlight$,
234
- gridContainer$,
242
+ gridContainerPosition$,
235
243
  event$
236
244
  }) => {
237
245
 
@@ -322,7 +330,7 @@ export const createBaseLines: BasePluginFn<BaseLinesContext> = (pluginName: stri
322
330
 
323
331
  // combineLatest({
324
332
  // seriesSelection: seriesSelection$,
325
- // gridContainer: gridContainer$
333
+ // gridContainerPosition: gridContainerPosition$
326
334
  // }).pipe(
327
335
  // takeUntil(destroy$),
328
336
  // switchMap(async d => d)
@@ -330,8 +338,8 @@ export const createBaseLines: BasePluginFn<BaseLinesContext> = (pluginName: stri
330
338
  // data.seriesSelection
331
339
  // .transition()
332
340
  // .attr('transform', (d, i) => {
333
- // const translate = data.gridContainer[i].translate
334
- // const scale = data.gridContainer[i].scale
341
+ // const translate = data.gridContainerPosition[i].translate
342
+ // const scale = data.gridContainerPosition[i].scale
335
343
  // return `translate(${translate[0]}, ${translate[1]}) scale(${scale[0]}, ${scale[1]})`
336
344
  // })
337
345
  // })
@@ -382,13 +390,13 @@ export const createBaseLines: BasePluginFn<BaseLinesContext> = (pluginName: stri
382
390
  selection,
383
391
  pluginName,
384
392
  clipPathID,
385
- existSeriesLabels$,
386
- gridContainer$,
393
+ seriesLabels$,
394
+ gridContainerPosition$,
387
395
  gridAxesTransform$,
388
396
  gridGraphicTransform$
389
397
  })
390
398
 
391
- const linePath$: Observable<d3.Line<ComputedDatumGrid>> = new Observable(subscriber => {
399
+ const linePath$: Observable<d3.Line<ComputedLayoutDatumGrid>> = new Observable(subscriber => {
392
400
  const paramsSubscription = fullParams$
393
401
  .pipe(
394
402
  takeUntil(destroy$)
@@ -403,19 +411,18 @@ export const createBaseLines: BasePluginFn<BaseLinesContext> = (pluginName: stri
403
411
  }
404
412
  })
405
413
 
406
- // 顯示範圍內的series labels
407
- const seriesLabels$: Observable<string[]> = new Observable(subscriber => {
408
- computedData$.pipe(
409
- takeUntil(destroy$),
410
- // 轉換後會退訂前一個未完成的訂閱事件,因此可以取到「同時間」最後一次的訂閱事件
411
- switchMap(async (d) => d),
412
- ).subscribe(data => {
413
- const labels = data[0] && data[0][0]
414
- ? data.map(d => d[0].seriesLabel)
415
- : []
416
- subscriber.next(labels)
417
- })
418
- })
414
+ // // 顯示範圍內的series labels
415
+ // const seriesLabels$: Observable<string[]> = new Observable(subscriber => {
416
+ // computedData$.pipe(
417
+ // takeUntil(destroy$),
418
+ // switchMap(async (d) => d),
419
+ // ).subscribe(data => {
420
+ // const labels = data[0] && data[0][0]
421
+ // ? data.map(d => d[0].seriesLabel)
422
+ // : []
423
+ // subscriber.next(labels)
424
+ // })
425
+ // })
419
426
 
420
427
  // const axisSize$ = gridAxisSizeObservable({
421
428
  // fullDataFormatter$,
@@ -442,7 +449,6 @@ export const createBaseLines: BasePluginFn<BaseLinesContext> = (pluginName: stri
442
449
  transitionEase: transitionEase$
443
450
  }).pipe(
444
451
  takeUntil(destroy$),
445
- // 轉換後會退訂前一個未完成的訂閱事件,因此可以取到「同時間」最後一次的訂閱事件
446
452
  switchMap(async (d) => d),
447
453
  ).subscribe(data => {
448
454
  // 外層的遮罩
@@ -499,45 +505,58 @@ export const createBaseLines: BasePluginFn<BaseLinesContext> = (pluginName: stri
499
505
  distinctUntilChanged()
500
506
  )
501
507
 
502
- const graphSubscription = combineLatest({
508
+ const pathSelectionArr$ = combineLatest({
503
509
  graphicGSelection: graphicGSelection$,
504
- seriesLabels: seriesLabels$,
510
+ visibleComputedLayoutData: visibleComputedLayoutData$,
511
+ linePath: linePath$,
512
+ params: fullParams$,
513
+ }).pipe(
514
+ takeUntil(destroy$),
515
+ switchMap(async (d) => d),
516
+ map(data => {
517
+ // const updateGraphic = data.graphicGSelection
518
+ // .selectAll<SVGGElement, number>('g')
519
+ // .data(data.seriesLabels, (d, i) => d)
520
+ // const enterGraphic = updateGraphic.enter()
521
+ // .append('g')
522
+ // .classed(graphicClassName, true)
523
+ // updateGraphic.exit().remove()
524
+ // const graphicSelection = updateGraphic.merge(enterGraphic)
525
+ // .attr('clip-path', (d, i) => `url(#orbcharts__clipPath_${d})`)
526
+ let pathSelectionArr: d3.Selection<SVGPathElement, ComputedLayoutDatumGrid[], any, any>[] = []
527
+
528
+ // 繪圖
529
+ data.graphicGSelection.each((d, i, all) => {
530
+ // 將資料分段
531
+ const segmentData = makeSegmentData(data.visibleComputedLayoutData[i] ?? [])
532
+
533
+ pathSelectionArr[i] = renderLines({
534
+ selection: d3.select(all[i]),
535
+ pathClassName,
536
+ linePath: data.linePath,
537
+ segmentData: segmentData,
538
+ params: data.params
539
+ })
540
+ })
541
+
542
+ return pathSelectionArr
543
+ })
544
+
545
+
546
+ )
547
+
548
+ combineLatest({
549
+ pathSelectionArr: pathSelectionArr$,
505
550
  computedData: computedData$,
506
551
  SeriesDataMap: SeriesDataMap$,
507
552
  GroupDataMap: GroupDataMap$,
508
- linePath: linePath$,
509
- params: fullParams$,
510
553
  highlightTarget: highlightTarget$,
511
554
  gridGroupPositionFn: gridGroupPositionFn$,
512
555
  }).pipe(
513
556
  takeUntil(destroy$),
514
- // 轉換後會退訂前一個未完成的訂閱事件,因此可以取到「同時間」最後一次的訂閱事件
515
- switchMap(async (d) => d),
557
+ switchMap(async (d) => d)
516
558
  ).subscribe(data => {
517
-
518
- // const updateGraphic = data.graphicGSelection
519
- // .selectAll<SVGGElement, number>('g')
520
- // .data(data.seriesLabels, (d, i) => d)
521
- // const enterGraphic = updateGraphic.enter()
522
- // .append('g')
523
- // .classed(graphicClassName, true)
524
- // updateGraphic.exit().remove()
525
- // const graphicSelection = updateGraphic.merge(enterGraphic)
526
- // .attr('clip-path', (d, i) => `url(#orbcharts__clipPath_${d})`)
527
-
528
- // 繪圖
529
- data.graphicGSelection.each((d, i, all) => {
530
- // 將資料分段
531
- const segmentData = makeSegmentData(data.computedData[i] ?? [])
532
-
533
- const pathSelection = renderLines({
534
- selection: d3.select(all[i]),
535
- pathClassName,
536
- linePath: data.linePath,
537
- segmentData: segmentData,
538
- params: data.params
539
- })
540
-
559
+ data.pathSelectionArr.forEach(pathSelection => {
541
560
  pathSelection
542
561
  .on('mouseover', (event, datum) => {
543
562
  event.stopPropagation()
@@ -643,19 +662,7 @@ export const createBaseLines: BasePluginFn<BaseLinesContext> = (pluginName: stri
643
662
  data: data.computedData
644
663
  })
645
664
  })
646
-
647
665
  })
648
-
649
-
650
-
651
- // graphicSelection$.next(graphicSelection)
652
-
653
-
654
- // pathSelection = renderLines({
655
- // selection: graphicSelection,
656
- // linePath: d.linePath,
657
- // data: d.computedData
658
- // })
659
666
  })
660
667
 
661
668
  // const datumList$ = computedData$.pipe(
@@ -15,7 +15,7 @@ import type {
15
15
  DataFormatterGrid,
16
16
  ChartParams,
17
17
  ComputedDatumGrid,
18
- ContainerPosition,
18
+ GridContainerPosition,
19
19
  TransformData,
20
20
  EventGrid,
21
21
  ColorType } from '@orbcharts/core'
@@ -50,8 +50,8 @@ interface BaseLinesContext {
50
50
  width: number;
51
51
  height: number;
52
52
  }>
53
- gridContainer$: Observable<ContainerPosition[]>
54
- isSeriesPositionSeprate$: Observable<boolean>
53
+ gridContainerPosition$: Observable<GridContainerPosition[]>
54
+ isSeriesSeprate$: Observable<boolean>
55
55
  }
56
56
 
57
57
  interface TextAlign {
@@ -107,7 +107,7 @@ function renderLinearAxis ({ selection, yAxisClassName, textClassName, fullParam
107
107
  )
108
108
  .attr('text-anchor', axisLabelAlign.textAnchor)
109
109
  .attr('dominant-baseline', axisLabelAlign.dominantBaseline)
110
- .style('font-size', `${fullChartParams.styles.textSize}px`)
110
+ .attr('font-size', fullChartParams.styles.textSize)
111
111
  .style('fill', getColor(fullParams.labelColorType, fullChartParams))
112
112
  .style('transform', textTransform)
113
113
  .text(d => fullDataFormatter.grid.valueAxis.label)
@@ -153,8 +153,8 @@ function renderLinearAxis ({ selection, yAxisClassName, textClassName, fullParam
153
153
 
154
154
  // const yText = yAxisEl.selectAll('text')
155
155
  const yText = yAxisSelection.selectAll('text')
156
- .style('font-family', 'sans-serif')
157
- .style('font-size', `${fullChartParams.styles.textSize}px`)
156
+ // .style('font-family', 'sans-serif')
157
+ .attr('font-size', fullChartParams.styles.textSize)
158
158
  .style('color', getColor(fullParams.tickTextColorType, fullChartParams))
159
159
  .attr('text-anchor', tickTextAlign.textAnchor)
160
160
  .attr('dominant-baseline', tickTextAlign.dominantBaseline)
@@ -175,8 +175,8 @@ export const createBaseValueAxis: BasePluginFn<BaseLinesContext> = (pluginName:
175
175
  gridAxesTransform$,
176
176
  gridAxesReverseTransform$,
177
177
  gridAxesSize$,
178
- gridContainer$,
179
- isSeriesPositionSeprate$,
178
+ gridContainerPosition$,
179
+ isSeriesSeprate$,
180
180
  }) => {
181
181
 
182
182
  const destroy$ = new Subject()
@@ -193,12 +193,12 @@ export const createBaseValueAxis: BasePluginFn<BaseLinesContext> = (pluginName:
193
193
  return a.length === b.length
194
194
  }),
195
195
  ),
196
- isSeriesPositionSeprate: isSeriesPositionSeprate$
196
+ isSeriesSeprate: isSeriesSeprate$
197
197
  }).pipe(
198
198
  takeUntil(destroy$),
199
199
  switchMap(async (d) => d),
200
200
  map(data => {
201
- return data.isSeriesPositionSeprate
201
+ return data.isSeriesSeprate
202
202
  // series分開的時候顯示各別axis
203
203
  ? data.computedData
204
204
  // series合併的時候只顯示第一個axis
@@ -226,16 +226,16 @@ export const createBaseValueAxis: BasePluginFn<BaseLinesContext> = (pluginName:
226
226
 
227
227
  combineLatest({
228
228
  containerSelection: containerSelection$,
229
- gridContainer: gridContainer$
229
+ gridContainerPosition: gridContainerPosition$
230
230
  }).pipe(
231
231
  takeUntil(destroy$),
232
232
  switchMap(async d => d)
233
233
  ).subscribe(data => {
234
234
  data.containerSelection
235
235
  .attr('transform', (d, i) => {
236
- const gridContainer = data.gridContainer[i] ?? data.gridContainer[0]
237
- const translate = gridContainer.translate
238
- const scale = gridContainer.scale
236
+ const gridContainerPosition = data.gridContainerPosition[i] ?? data.gridContainerPosition[0]
237
+ const translate = gridContainerPosition.translate
238
+ const scale = gridContainerPosition.scale
239
239
  return `translate(${translate[0]}, ${translate[1]}) scale(${scale[0]}, ${scale[1]})`
240
240
  })
241
241
  // .attr('opacity', 0)
@@ -308,14 +308,14 @@ export const createBaseValueAxis: BasePluginFn<BaseLinesContext> = (pluginName:
308
308
  fullParams: fullParams$,
309
309
  fullDataFormatter: fullDataFormatter$,
310
310
  gridAxesReverseTransform: gridAxesReverseTransform$,
311
- gridContainer: gridContainer$
311
+ gridContainerPosition: gridContainerPosition$
312
312
  }).pipe(
313
313
  takeUntil(destroy$),
314
314
  switchMap(async (d) => d),
315
315
  map(data => {
316
316
  const axisReverseTranslateValue = `translate(${data.gridAxesReverseTransform.translate[0]}px, ${data.gridAxesReverseTransform.translate[1]}px)`
317
317
  const axisReverseRotateValue = `rotate(${data.gridAxesReverseTransform.rotate}deg) rotateX(${data.gridAxesReverseTransform.rotateX}deg) rotateY(${data.gridAxesReverseTransform.rotateY}deg)`
318
- const containerScaleReverseScaleValue = `scale(${1 / data.gridContainer[0].scale[0]}, ${1 / data.gridContainer[0].scale[1]})`
318
+ const containerScaleReverseScaleValue = `scale(${1 / data.gridContainerPosition[0].scale[0]}, ${1 / data.gridContainerPosition[0].scale[1]})`
319
319
  const tickTextRotateDeg = (data.fullDataFormatter.grid.groupAxis.position === 'left' && data.fullDataFormatter.grid.valueAxis.position === 'top')
320
320
  || (data.fullDataFormatter.grid.groupAxis.position === 'right' && data.fullDataFormatter.grid.valueAxis.position === 'bottom')
321
321
  ? data.fullParams.tickTextRotate + 180 // 修正文字倒轉
@@ -354,7 +354,7 @@ export const createBaseValueAxis: BasePluginFn<BaseLinesContext> = (pluginName:
354
354
  })
355
355
 
356
356
  const filteredMinAndMax = getMinAndMaxValue(filteredData.flat())
357
-
357
+
358
358
  subscriber.next(filteredMinAndMax)
359
359
  })
360
360
  })
@@ -366,7 +366,6 @@ export const createBaseValueAxis: BasePluginFn<BaseLinesContext> = (pluginName:
366
366
  minAndMax: minAndMax$
367
367
  }).pipe(
368
368
  takeUntil(destroy$),
369
- // 轉換後會退訂前一個未完成的訂閱事件,因此可以取到「同時間」最後一次的訂閱事件
370
369
  switchMap(async (d) => d),
371
370
  ).subscribe(data => {
372
371