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

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 (81) hide show
  1. package/LICENSE +200 -200
  2. package/dist/orbcharts-plugins-basic.es.js +3461 -3468
  3. package/dist/orbcharts-plugins-basic.umd.js +17 -17
  4. package/lib/core-types.ts +7 -7
  5. package/lib/core.ts +6 -6
  6. package/package.json +43 -43
  7. package/src/base/BaseBarStack.ts +779 -779
  8. package/src/base/BaseBars.ts +764 -764
  9. package/src/base/BaseBarsTriangle.ts +672 -672
  10. package/src/base/BaseDots.ts +513 -513
  11. package/src/base/BaseGroupAxis.ts +678 -678
  12. package/src/base/BaseLegend.ts +642 -642
  13. package/src/base/BaseLineAreas.ts +627 -627
  14. package/src/base/BaseLines.ts +704 -704
  15. package/src/base/BaseValueAxis.ts +578 -578
  16. package/src/base/types.ts +2 -2
  17. package/src/const.ts +30 -30
  18. package/src/grid/defaults.ts +128 -128
  19. package/src/grid/gridObservables.ts +545 -545
  20. package/src/grid/index.ts +15 -15
  21. package/src/grid/plugins/BarStack.ts +64 -64
  22. package/src/grid/plugins/Bars.ts +69 -69
  23. package/src/grid/plugins/BarsPN.ts +66 -66
  24. package/src/grid/plugins/BarsTriangle.ts +73 -73
  25. package/src/grid/plugins/Dots.ts +68 -68
  26. package/src/grid/plugins/GridLegend.ts +96 -96
  27. package/src/grid/plugins/GroupAux.ts +1098 -1098
  28. package/src/grid/plugins/GroupAxis.ts +97 -97
  29. package/src/grid/plugins/LineAreas.ts +65 -65
  30. package/src/grid/plugins/Lines.ts +59 -59
  31. package/src/grid/plugins/ScalingArea.ts +218 -218
  32. package/src/grid/plugins/ValueAxis.ts +93 -93
  33. package/src/grid/plugins/ValueStackAxis.ts +95 -95
  34. package/src/grid/types.ts +123 -123
  35. package/src/index.ts +9 -9
  36. package/src/multiGrid/defaults.ts +158 -158
  37. package/src/multiGrid/index.ts +13 -13
  38. package/src/multiGrid/multiGridObservables.ts +49 -49
  39. package/src/multiGrid/plugins/MultiBarStack.ts +106 -106
  40. package/src/multiGrid/plugins/MultiBars.ts +108 -108
  41. package/src/multiGrid/plugins/MultiBarsTriangle.ts +114 -114
  42. package/src/multiGrid/plugins/MultiDots.ts +102 -102
  43. package/src/multiGrid/plugins/MultiGridLegend.ts +148 -148
  44. package/src/multiGrid/plugins/MultiGroupAxis.ts +137 -137
  45. package/src/multiGrid/plugins/MultiLineAreas.ts +107 -107
  46. package/src/multiGrid/plugins/MultiLines.ts +101 -101
  47. package/src/multiGrid/plugins/MultiValueAxis.ts +133 -133
  48. package/src/multiGrid/plugins/MultiValueStackAxis.ts +133 -133
  49. package/src/multiGrid/plugins/OverlappingValueAxes.ts +299 -299
  50. package/src/multiGrid/plugins/OverlappingValueStackAxes.ts +298 -298
  51. package/src/multiGrid/types.ts +72 -72
  52. package/src/noneData/defaults.ts +102 -102
  53. package/src/noneData/index.ts +3 -3
  54. package/src/noneData/plugins/Container.ts +27 -27
  55. package/src/noneData/plugins/Tooltip.ts +373 -373
  56. package/src/noneData/types.ts +26 -26
  57. package/src/series/defaults.ts +149 -149
  58. package/src/series/index.ts +9 -9
  59. package/src/series/plugins/Bubbles.ts +603 -603
  60. package/src/series/plugins/Pie.ts +623 -623
  61. package/src/series/plugins/PieEventTexts.ts +283 -283
  62. package/src/series/plugins/PieLabels.ts +640 -640
  63. package/src/series/plugins/Rose.ts +516 -516
  64. package/src/series/plugins/RoseLabels.ts +600 -600
  65. package/src/series/plugins/SeriesLegend.ts +96 -96
  66. package/src/series/seriesObservables.ts +145 -145
  67. package/src/series/seriesUtils.ts +51 -51
  68. package/src/series/types.ts +87 -87
  69. package/src/tree/defaults.ts +23 -23
  70. package/src/tree/index.ts +3 -3
  71. package/src/tree/plugins/TreeLegend.ts +96 -96
  72. package/src/tree/plugins/TreeMap.ts +333 -333
  73. package/src/tree/types.ts +23 -23
  74. package/src/utils/commonUtils.ts +21 -21
  75. package/src/utils/d3Graphics.ts +174 -174
  76. package/src/utils/d3Utils.ts +73 -73
  77. package/src/utils/observables.ts +14 -14
  78. package/src/utils/orbchartsUtils.ts +100 -100
  79. package/tsconfig.base.json +13 -13
  80. package/tsconfig.json +2 -2
  81. package/vite.config.js +22 -22
@@ -1,96 +1,96 @@
1
- import * as d3 from 'd3'
2
- import {
3
- combineLatest,
4
- map,
5
- switchMap,
6
- takeUntil,
7
- Observable,
8
- Subject } from 'rxjs'
9
- import type { DefinePluginConfig } from '../../../lib/core-types'
10
- import {
11
- defineSeriesPlugin } from '../../../lib/core'
12
- import { DEFAULT_SERIES_LEGEND_PARAMS } from '../defaults'
13
- import { createBaseLegend } from '../../base/BaseLegend'
14
- import { LAYER_INDEX_OF_INFO } from '../../const'
15
-
16
- const pluginName = 'SeriesLegend'
17
-
18
- const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_SERIES_LEGEND_PARAMS> = {
19
- name: pluginName,
20
- defaultParams: DEFAULT_SERIES_LEGEND_PARAMS,
21
- layerIndex: LAYER_INDEX_OF_INFO,
22
- validator: (params, { validateColumns }) => {
23
- const result = validateColumns(params, {
24
- padding: {
25
- toBeTypes: ['number']
26
- },
27
- backgroundFill: {
28
- toBeOption: 'ColorType',
29
- },
30
- backgroundStroke: {
31
- toBeOption: 'ColorType',
32
- },
33
- gap: {
34
- toBeTypes: ['number']
35
- },
36
- listRectWidth: {
37
- toBeTypes: ['number']
38
- },
39
- listRectHeight: {
40
- toBeTypes: ['number']
41
- },
42
- listRectRadius: {
43
- toBeTypes: ['number']
44
- },
45
- textColorType: {
46
- toBeOption: 'ColorType',
47
- }
48
- })
49
- return result
50
- }
51
- }
52
-
53
- export const SeriesLegend = defineSeriesPlugin(pluginConfig)(({ selection, rootSelection, observer, subject }) => {
54
-
55
- const destroy$ = new Subject()
56
-
57
- const seriesLabels$: Observable<string[]> = observer.SeriesDataMap$.pipe(
58
- takeUntil(destroy$),
59
- map(data => {
60
- return Array.from(data.keys())
61
- })
62
- )
63
-
64
- // 全部列點矩型使用相同樣式參數
65
- const fullParams$ = observer.fullParams$.pipe(
66
- takeUntil(destroy$),
67
- map(d => {
68
- const seriesList = [
69
- {
70
- listRectWidth: d.listRectWidth,
71
- listRectHeight: d.listRectHeight,
72
- listRectRadius: d.listRectRadius,
73
- }
74
- ]
75
- return {
76
- ...d,
77
- seriesList
78
- }
79
- })
80
- )
81
-
82
- const unsubscribeBaseLegend = createBaseLegend(pluginName, {
83
- rootSelection,
84
- seriesLabels$,
85
- fullParams$,
86
- layout$: observer.layout$,
87
- fullChartParams$: observer.fullChartParams$,
88
- textSizePx$: observer.textSizePx$
89
- })
90
-
91
- return () => {
92
- destroy$.next(undefined)
93
- unsubscribeBaseLegend()
94
- }
95
- })
96
-
1
+ import * as d3 from 'd3'
2
+ import {
3
+ combineLatest,
4
+ map,
5
+ switchMap,
6
+ takeUntil,
7
+ Observable,
8
+ Subject } from 'rxjs'
9
+ import type { DefinePluginConfig } from '../../../lib/core-types'
10
+ import {
11
+ defineSeriesPlugin } from '../../../lib/core'
12
+ import { DEFAULT_SERIES_LEGEND_PARAMS } from '../defaults'
13
+ import { createBaseLegend } from '../../base/BaseLegend'
14
+ import { LAYER_INDEX_OF_INFO } from '../../const'
15
+
16
+ const pluginName = 'SeriesLegend'
17
+
18
+ const pluginConfig: DefinePluginConfig<typeof pluginName, typeof DEFAULT_SERIES_LEGEND_PARAMS> = {
19
+ name: pluginName,
20
+ defaultParams: DEFAULT_SERIES_LEGEND_PARAMS,
21
+ layerIndex: LAYER_INDEX_OF_INFO,
22
+ validator: (params, { validateColumns }) => {
23
+ const result = validateColumns(params, {
24
+ padding: {
25
+ toBeTypes: ['number']
26
+ },
27
+ backgroundFill: {
28
+ toBeOption: 'ColorType',
29
+ },
30
+ backgroundStroke: {
31
+ toBeOption: 'ColorType',
32
+ },
33
+ gap: {
34
+ toBeTypes: ['number']
35
+ },
36
+ listRectWidth: {
37
+ toBeTypes: ['number']
38
+ },
39
+ listRectHeight: {
40
+ toBeTypes: ['number']
41
+ },
42
+ listRectRadius: {
43
+ toBeTypes: ['number']
44
+ },
45
+ textColorType: {
46
+ toBeOption: 'ColorType',
47
+ }
48
+ })
49
+ return result
50
+ }
51
+ }
52
+
53
+ export const SeriesLegend = defineSeriesPlugin(pluginConfig)(({ selection, rootSelection, observer, subject }) => {
54
+
55
+ const destroy$ = new Subject()
56
+
57
+ const seriesLabels$: Observable<string[]> = observer.SeriesDataMap$.pipe(
58
+ takeUntil(destroy$),
59
+ map(data => {
60
+ return Array.from(data.keys())
61
+ })
62
+ )
63
+
64
+ // 全部列點矩型使用相同樣式參數
65
+ const fullParams$ = observer.fullParams$.pipe(
66
+ takeUntil(destroy$),
67
+ map(d => {
68
+ const seriesList = [
69
+ {
70
+ listRectWidth: d.listRectWidth,
71
+ listRectHeight: d.listRectHeight,
72
+ listRectRadius: d.listRectRadius,
73
+ }
74
+ ]
75
+ return {
76
+ ...d,
77
+ seriesList
78
+ }
79
+ })
80
+ )
81
+
82
+ const unsubscribeBaseLegend = createBaseLegend(pluginName, {
83
+ rootSelection,
84
+ seriesLabels$,
85
+ fullParams$,
86
+ layout$: observer.layout$,
87
+ fullChartParams$: observer.fullChartParams$,
88
+ textSizePx$: observer.textSizePx$
89
+ })
90
+
91
+ return () => {
92
+ destroy$.next(undefined)
93
+ unsubscribeBaseLegend()
94
+ }
95
+ })
96
+
@@ -1,145 +1,145 @@
1
- import * as d3 from 'd3'
2
- import {
3
- Observable,
4
- Subject,
5
- of,
6
- takeUntil,
7
- filter,
8
- first,
9
- map,
10
- switchMap,
11
- combineLatest,
12
- merge,
13
- shareReplay,
14
- distinctUntilChanged
15
- } from 'rxjs'
16
- import type {
17
- SeriesContainerPosition } from '../../lib/core-types'
18
- import { getClassName, getUniID } from '../utils/orbchartsUtils'
19
-
20
- function createSeriesSelection ({ selection, pluginName, separateSeries$, seriesLabels$ }: {
21
- selection: d3.Selection<any, unknown, any, unknown>
22
- pluginName: string
23
- separateSeries$: Observable<boolean>
24
- seriesLabels$: Observable<string[]>
25
- }) {
26
- const seriesClassName = getClassName(pluginName, 'series')
27
-
28
- return combineLatest({
29
- seriesLabels: seriesLabels$,
30
- separateSeries: separateSeries$
31
- }).pipe(
32
- switchMap(async d => d),
33
- map((data, i) => {
34
- const selectionData = data.separateSeries ? data.seriesLabels : [data.seriesLabels.join('')]
35
- return selection
36
- .selectAll<SVGGElement, string>(`g.${seriesClassName}`)
37
- .data(selectionData, d => d)
38
- .join(
39
- enter => {
40
- return enter
41
- .append('g')
42
- .classed(seriesClassName, true)
43
- },
44
- update => update,
45
- exit => exit.remove()
46
- )
47
- }),
48
- shareReplay(1)
49
- )
50
- }
51
-
52
- // series選取器,以起始座標位置為基準
53
- export const seriesStartSelectionObservable = ({ selection, pluginName, separateSeries$, seriesLabels$, seriesContainerPosition$ }: {
54
- selection: d3.Selection<any, unknown, any, unknown>
55
- pluginName: string
56
- separateSeries$: Observable<boolean>
57
- seriesLabels$: Observable<string[]>
58
- seriesContainerPosition$: Observable<SeriesContainerPosition[]>
59
- }) => {
60
-
61
- const seriesStartSelection$ = createSeriesSelection({ selection, pluginName, separateSeries$, seriesLabels$ })
62
-
63
- combineLatest({
64
- seriesStartSelection: seriesStartSelection$,
65
- seriesContainerPosition: seriesContainerPosition$
66
- }).pipe(
67
- switchMap(async d => d),
68
- // selection數量相同的時候才執行
69
- distinctUntilChanged((a, b) => a.seriesContainerPosition.length === b.seriesContainerPosition.length)
70
- ).subscribe(data => {
71
- // 無transition動畫
72
- data.seriesStartSelection
73
- .attr('transform', (d, i) => {
74
- const seriesContainerPosition = data.seriesContainerPosition[i] ?? data.seriesContainerPosition[0]
75
- return `translate(${seriesContainerPosition.startX}, ${seriesContainerPosition.startY})`
76
- })
77
- })
78
-
79
- combineLatest({
80
- seriesStartSelection: seriesStartSelection$,
81
- seriesContainerPosition: seriesContainerPosition$
82
- }).pipe(
83
- switchMap(async d => d),
84
- ).subscribe(data => {
85
- // 有transition動畫
86
- data.seriesStartSelection
87
- .transition()
88
- .attr('transform', (d, i) => {
89
- const seriesContainerPosition = data.seriesContainerPosition[i] ?? data.seriesContainerPosition[0]
90
- return `translate(${seriesContainerPosition.startX}, ${seriesContainerPosition.startY})`
91
- })
92
- })
93
-
94
- return {
95
- seriesStartSelection$
96
- }
97
- }
98
-
99
- // series選取器,以中心座標位置為基準
100
- export const seriesCenterSelectionObservable = ({ selection, pluginName, separateSeries$, seriesLabels$, seriesContainerPosition$ }: {
101
- selection: d3.Selection<any, unknown, any, unknown>
102
- pluginName: string
103
- separateSeries$: Observable<boolean>
104
- seriesLabels$: Observable<string[]>
105
- seriesContainerPosition$: Observable<SeriesContainerPosition[]>
106
- }) => {
107
-
108
- const seriesCenterSelection$ = createSeriesSelection({ selection, pluginName, separateSeries$, seriesLabels$ })
109
-
110
- combineLatest({
111
- seriesCenterSelection: seriesCenterSelection$,
112
- seriesContainerPosition: seriesContainerPosition$
113
- }).pipe(
114
- switchMap(async d => d),
115
- // selection數量相同的時候才執行
116
- distinctUntilChanged((a, b) => a.seriesContainerPosition.length === b.seriesContainerPosition.length)
117
- ).subscribe(data => {
118
- // 無transition動畫
119
- data.seriesCenterSelection
120
- .attr('transform', (d, i) => {
121
- const seriesContainerPosition = data.seriesContainerPosition[i] ?? data.seriesContainerPosition[0]
122
- return `translate(${seriesContainerPosition.centerX}, ${seriesContainerPosition.centerY})`
123
- })
124
- })
125
-
126
- combineLatest({
127
- seriesCenterSelection: seriesCenterSelection$,
128
- seriesContainerPosition: seriesContainerPosition$
129
- }).pipe(
130
- switchMap(async d => d),
131
- ).subscribe(data => {
132
- // 有transition動畫
133
- data.seriesCenterSelection
134
- .transition()
135
- .attr('transform', (d, i) => {
136
- const seriesContainerPosition = data.seriesContainerPosition[i] ?? data.seriesContainerPosition[0]
137
- return `translate(${seriesContainerPosition.centerX}, ${seriesContainerPosition.centerY})`
138
- })
139
- })
140
-
141
- return {
142
- seriesCenterSelection$,
143
- }
144
- }
145
-
1
+ import * as d3 from 'd3'
2
+ import {
3
+ Observable,
4
+ Subject,
5
+ of,
6
+ takeUntil,
7
+ filter,
8
+ first,
9
+ map,
10
+ switchMap,
11
+ combineLatest,
12
+ merge,
13
+ shareReplay,
14
+ distinctUntilChanged
15
+ } from 'rxjs'
16
+ import type {
17
+ SeriesContainerPosition } from '../../lib/core-types'
18
+ import { getClassName, getUniID } from '../utils/orbchartsUtils'
19
+
20
+ function createSeriesSelection ({ selection, pluginName, separateSeries$, seriesLabels$ }: {
21
+ selection: d3.Selection<any, unknown, any, unknown>
22
+ pluginName: string
23
+ separateSeries$: Observable<boolean>
24
+ seriesLabels$: Observable<string[]>
25
+ }) {
26
+ const seriesClassName = getClassName(pluginName, 'series')
27
+
28
+ return combineLatest({
29
+ seriesLabels: seriesLabels$,
30
+ separateSeries: separateSeries$
31
+ }).pipe(
32
+ switchMap(async d => d),
33
+ map((data, i) => {
34
+ const selectionData = data.separateSeries ? data.seriesLabels : [data.seriesLabels.join('')]
35
+ return selection
36
+ .selectAll<SVGGElement, string>(`g.${seriesClassName}`)
37
+ .data(selectionData, d => d)
38
+ .join(
39
+ enter => {
40
+ return enter
41
+ .append('g')
42
+ .classed(seriesClassName, true)
43
+ },
44
+ update => update,
45
+ exit => exit.remove()
46
+ )
47
+ }),
48
+ shareReplay(1)
49
+ )
50
+ }
51
+
52
+ // series選取器,以起始座標位置為基準
53
+ export const seriesStartSelectionObservable = ({ selection, pluginName, separateSeries$, seriesLabels$, seriesContainerPosition$ }: {
54
+ selection: d3.Selection<any, unknown, any, unknown>
55
+ pluginName: string
56
+ separateSeries$: Observable<boolean>
57
+ seriesLabels$: Observable<string[]>
58
+ seriesContainerPosition$: Observable<SeriesContainerPosition[]>
59
+ }) => {
60
+
61
+ const seriesStartSelection$ = createSeriesSelection({ selection, pluginName, separateSeries$, seriesLabels$ })
62
+
63
+ combineLatest({
64
+ seriesStartSelection: seriesStartSelection$,
65
+ seriesContainerPosition: seriesContainerPosition$
66
+ }).pipe(
67
+ switchMap(async d => d),
68
+ // selection數量相同的時候才執行
69
+ distinctUntilChanged((a, b) => a.seriesContainerPosition.length === b.seriesContainerPosition.length)
70
+ ).subscribe(data => {
71
+ // 無transition動畫
72
+ data.seriesStartSelection
73
+ .attr('transform', (d, i) => {
74
+ const seriesContainerPosition = data.seriesContainerPosition[i] ?? data.seriesContainerPosition[0]
75
+ return `translate(${seriesContainerPosition.startX}, ${seriesContainerPosition.startY})`
76
+ })
77
+ })
78
+
79
+ combineLatest({
80
+ seriesStartSelection: seriesStartSelection$,
81
+ seriesContainerPosition: seriesContainerPosition$
82
+ }).pipe(
83
+ switchMap(async d => d),
84
+ ).subscribe(data => {
85
+ // 有transition動畫
86
+ data.seriesStartSelection
87
+ .transition()
88
+ .attr('transform', (d, i) => {
89
+ const seriesContainerPosition = data.seriesContainerPosition[i] ?? data.seriesContainerPosition[0]
90
+ return `translate(${seriesContainerPosition.startX}, ${seriesContainerPosition.startY})`
91
+ })
92
+ })
93
+
94
+ return {
95
+ seriesStartSelection$
96
+ }
97
+ }
98
+
99
+ // series選取器,以中心座標位置為基準
100
+ export const seriesCenterSelectionObservable = ({ selection, pluginName, separateSeries$, seriesLabels$, seriesContainerPosition$ }: {
101
+ selection: d3.Selection<any, unknown, any, unknown>
102
+ pluginName: string
103
+ separateSeries$: Observable<boolean>
104
+ seriesLabels$: Observable<string[]>
105
+ seriesContainerPosition$: Observable<SeriesContainerPosition[]>
106
+ }) => {
107
+
108
+ const seriesCenterSelection$ = createSeriesSelection({ selection, pluginName, separateSeries$, seriesLabels$ })
109
+
110
+ combineLatest({
111
+ seriesCenterSelection: seriesCenterSelection$,
112
+ seriesContainerPosition: seriesContainerPosition$
113
+ }).pipe(
114
+ switchMap(async d => d),
115
+ // selection數量相同的時候才執行
116
+ distinctUntilChanged((a, b) => a.seriesContainerPosition.length === b.seriesContainerPosition.length)
117
+ ).subscribe(data => {
118
+ // 無transition動畫
119
+ data.seriesCenterSelection
120
+ .attr('transform', (d, i) => {
121
+ const seriesContainerPosition = data.seriesContainerPosition[i] ?? data.seriesContainerPosition[0]
122
+ return `translate(${seriesContainerPosition.centerX}, ${seriesContainerPosition.centerY})`
123
+ })
124
+ })
125
+
126
+ combineLatest({
127
+ seriesCenterSelection: seriesCenterSelection$,
128
+ seriesContainerPosition: seriesContainerPosition$
129
+ }).pipe(
130
+ switchMap(async d => d),
131
+ ).subscribe(data => {
132
+ // 有transition動畫
133
+ data.seriesCenterSelection
134
+ .transition()
135
+ .attr('transform', (d, i) => {
136
+ const seriesContainerPosition = data.seriesContainerPosition[i] ?? data.seriesContainerPosition[0]
137
+ return `translate(${seriesContainerPosition.centerX}, ${seriesContainerPosition.centerY})`
138
+ })
139
+ })
140
+
141
+ return {
142
+ seriesCenterSelection$,
143
+ }
144
+ }
145
+
@@ -1,52 +1,52 @@
1
- import * as d3 from 'd3'
2
- import type { ComputedDataSeries, ComputedDatumSeries, EventName, EventSeries, HighlightTarget } from '../../lib/core-types'
3
- // import type { D3PieDatum, PieDatum } from '../types'
4
-
5
- // 由d3.pie()建出來的資料格式
6
- export interface D3PieDatum {
7
- data: any
8
- index: number,
9
- value: number,
10
- startAngle: number,
11
- endAngle: number,
12
- padAngle: number,
13
- }
14
-
15
- export interface PieDatum extends D3PieDatum {
16
- data: ComputedDatumSeries
17
- id: string
18
- }
19
-
20
- export function makePieData ({ data, startAngle, endAngle }: {
21
- data: ComputedDatumSeries[]
22
- startAngle: number
23
- endAngle: number
24
- // itemLabels: string[]
25
- // arcLabels: string[]
26
- }): PieDatum[] {
27
- let pie = d3.pie<any, any>()
28
- .startAngle(startAngle)
29
- // .endAngle(startAngle + (endAngle - startAngle) * t)
30
- .endAngle(endAngle)
31
- .value(d => d.value)
32
- // .value((d) => d.visible == false ? 0 : d.value)
33
- // .sort(null) // 不要排序
34
- .sort((a, b) => a.seq - b.seq)
35
- // .sort((a: any, b: any) => {
36
- // return b.value - a.value
37
- // })
38
- // .sort(d3.ascending)
39
- const pieData = pie(data)
40
- return pieData.map((d: D3PieDatum, i: number) => {
41
- // const itemLabel = d.data.itemLabel
42
- let _d: any = d
43
- _d.id = d.data.id
44
- return _d
45
- // return {
46
- // ...d,
47
- // itemIndex: itemLabels.indexOf(itemLabel),
48
- // itemLabel,
49
- // id: d.data.id,
50
- // }
51
- })
1
+ import * as d3 from 'd3'
2
+ import type { ComputedDataSeries, ComputedDatumSeries, EventName, EventSeries, HighlightTarget } from '../../lib/core-types'
3
+ // import type { D3PieDatum, PieDatum } from '../types'
4
+
5
+ // 由d3.pie()建出來的資料格式
6
+ export interface D3PieDatum {
7
+ data: any
8
+ index: number,
9
+ value: number,
10
+ startAngle: number,
11
+ endAngle: number,
12
+ padAngle: number,
13
+ }
14
+
15
+ export interface PieDatum extends D3PieDatum {
16
+ data: ComputedDatumSeries
17
+ id: string
18
+ }
19
+
20
+ export function makePieData ({ data, startAngle, endAngle }: {
21
+ data: ComputedDatumSeries[]
22
+ startAngle: number
23
+ endAngle: number
24
+ // itemLabels: string[]
25
+ // arcLabels: string[]
26
+ }): PieDatum[] {
27
+ let pie = d3.pie<any, any>()
28
+ .startAngle(startAngle)
29
+ // .endAngle(startAngle + (endAngle - startAngle) * t)
30
+ .endAngle(endAngle)
31
+ .value(d => d.value)
32
+ // .value((d) => d.visible == false ? 0 : d.value)
33
+ // .sort(null) // 不要排序
34
+ .sort((a, b) => a.seq - b.seq)
35
+ // .sort((a: any, b: any) => {
36
+ // return b.value - a.value
37
+ // })
38
+ // .sort(d3.ascending)
39
+ const pieData = pie(data)
40
+ return pieData.map((d: D3PieDatum, i: number) => {
41
+ // const itemLabel = d.data.itemLabel
42
+ let _d: any = d
43
+ _d.id = d.data.id
44
+ return _d
45
+ // return {
46
+ // ...d,
47
+ // itemIndex: itemLabels.indexOf(itemLabel),
48
+ // itemLabel,
49
+ // id: d.data.id,
50
+ // }
51
+ })
52
52
  }