@orbcharts/plugin-basic 4.0.0-pre-alpha.0

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 (208) hide show
  1. package/LICENSE +201 -0
  2. package/dist/orbcharts-plugin-basic.es.js +25335 -0
  3. package/dist/orbcharts-plugin-basic.umd.js +341 -0
  4. package/dist/plugin-basic/src/baseLayers/BaseBars.d.ts +38 -0
  5. package/dist/plugin-basic/src/baseLayers/BaseBarsTriangle.d.ts +37 -0
  6. package/dist/plugin-basic/src/baseLayers/BaseCategoryAxis.d.ts +42 -0
  7. package/dist/plugin-basic/src/baseLayers/BaseDots.d.ts +38 -0
  8. package/dist/plugin-basic/src/baseLayers/BaseLegend.d.ts +31 -0
  9. package/dist/plugin-basic/src/baseLayers/BaseLineAreas.d.ts +36 -0
  10. package/dist/plugin-basic/src/baseLayers/BaseLines.d.ts +36 -0
  11. package/dist/plugin-basic/src/baseLayers/BaseStackedBars.d.ts +41 -0
  12. package/dist/plugin-basic/src/baseLayers/BaseTooltip.d.ts +47 -0
  13. package/dist/plugin-basic/src/baseLayers/BaseValueAxis.d.ts +38 -0
  14. package/dist/plugin-basic/src/baseLayers/BaseXAxis.d.ts +25 -0
  15. package/dist/plugin-basic/src/baseLayers/BaseXZoom.d.ts +22 -0
  16. package/dist/plugin-basic/src/baseLayers/BaseYAxis.d.ts +23 -0
  17. package/dist/plugin-basic/src/baseLayers/types.d.ts +171 -0
  18. package/dist/plugin-basic/src/const/layerIndex.d.ts +10 -0
  19. package/dist/plugin-basic/src/const/sharedPluginParams.d.ts +6 -0
  20. package/dist/plugin-basic/src/index.d.ts +2 -0
  21. package/dist/plugin-basic/src/plugins/CompositionPlot/CompositionPlot.d.ts +22 -0
  22. package/dist/plugin-basic/src/plugins/CompositionPlot/contextObservables.d.ts +40 -0
  23. package/dist/plugin-basic/src/plugins/CompositionPlot/defaults.d.ts +10 -0
  24. package/dist/plugin-basic/src/plugins/CompositionPlot/index.d.ts +3 -0
  25. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Bubbles.d.ts +16 -0
  26. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Indicator.d.ts +0 -0
  27. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Pie.d.ts +16 -0
  28. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/PieEventTexts.d.ts +16 -0
  29. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/PieLabels.d.ts +16 -0
  30. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Rose.d.ts +16 -0
  31. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/RoseLabels.d.ts +16 -0
  32. package/dist/plugin-basic/src/plugins/CompositionPlot/layers/Waffle.d.ts +0 -0
  33. package/dist/plugin-basic/src/plugins/CompositionPlot/types.d.ts +110 -0
  34. package/dist/plugin-basic/src/plugins/CompositionPlot/utils.d.ts +19 -0
  35. package/dist/plugin-basic/src/plugins/HierarchyPlot/HierarchyPlot.d.ts +22 -0
  36. package/dist/plugin-basic/src/plugins/HierarchyPlot/contextObservables.d.ts +16 -0
  37. package/dist/plugin-basic/src/plugins/HierarchyPlot/defaults.d.ts +4 -0
  38. package/dist/plugin-basic/src/plugins/HierarchyPlot/index.d.ts +3 -0
  39. package/dist/plugin-basic/src/plugins/HierarchyPlot/layers/TreeMap.d.ts +16 -0
  40. package/dist/plugin-basic/src/plugins/HierarchyPlot/types.d.ts +29 -0
  41. package/dist/plugin-basic/src/plugins/Legend/Legend.d.ts +22 -0
  42. package/dist/plugin-basic/src/plugins/Legend/contextObservables.d.ts +9 -0
  43. package/dist/plugin-basic/src/plugins/Legend/defaults.d.ts +4 -0
  44. package/dist/plugin-basic/src/plugins/Legend/index.d.ts +3 -0
  45. package/dist/plugin-basic/src/plugins/Legend/layers/Legend.d.ts +16 -0
  46. package/dist/plugin-basic/src/plugins/Legend/types.d.ts +31 -0
  47. package/dist/plugin-basic/src/plugins/Legend/utils.d.ts +19 -0
  48. package/dist/plugin-basic/src/plugins/NetworkPlot/NetworkPlot.d.ts +22 -0
  49. package/dist/plugin-basic/src/plugins/NetworkPlot/contextObservables.d.ts +19 -0
  50. package/dist/plugin-basic/src/plugins/NetworkPlot/defaults.d.ts +5 -0
  51. package/dist/plugin-basic/src/plugins/NetworkPlot/index.d.ts +3 -0
  52. package/dist/plugin-basic/src/plugins/NetworkPlot/layers/ForceDirected.d.ts +16 -0
  53. package/dist/plugin-basic/src/plugins/NetworkPlot/layers/ForceDirectedBubbles.d.ts +16 -0
  54. package/dist/plugin-basic/src/plugins/NetworkPlot/types.d.ts +117 -0
  55. package/dist/plugin-basic/src/plugins/ScatterPlot/ScatterPlot.d.ts +22 -0
  56. package/dist/plugin-basic/src/plugins/ScatterPlot/contextObservables.d.ts +140 -0
  57. package/dist/plugin-basic/src/plugins/ScatterPlot/defaults.d.ts +8 -0
  58. package/dist/plugin-basic/src/plugins/ScatterPlot/index.d.ts +3 -0
  59. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/Scatter.d.ts +16 -0
  60. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/ScatterBubbles.d.ts +16 -0
  61. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/XYAux.d.ts +16 -0
  62. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/XYAxes.d.ts +16 -0
  63. package/dist/plugin-basic/src/plugins/ScatterPlot/layers/XZoom.d.ts +16 -0
  64. package/dist/plugin-basic/src/plugins/ScatterPlot/types.d.ts +146 -0
  65. package/dist/plugin-basic/src/plugins/SeriesPlot/SeriesPlot.d.ts +22 -0
  66. package/dist/plugin-basic/src/plugins/SeriesPlot/contextObservables.d.ts +77 -0
  67. package/dist/plugin-basic/src/plugins/SeriesPlot/defaults.d.ts +15 -0
  68. package/dist/plugin-basic/src/plugins/SeriesPlot/index.d.ts +3 -0
  69. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/Bars.d.ts +16 -0
  70. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/BarsPN.d.ts +16 -0
  71. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/BarsTriangle.d.ts +16 -0
  72. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/CategoryAux.d.ts +16 -0
  73. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/CategoryAxis.d.ts +16 -0
  74. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/CategoryZoom.d.ts +16 -0
  75. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/Dots.d.ts +16 -0
  76. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/LineAreas.d.ts +16 -0
  77. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/Lines.d.ts +16 -0
  78. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/StackedBars.d.ts +16 -0
  79. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/StackedValueAxis.d.ts +16 -0
  80. package/dist/plugin-basic/src/plugins/SeriesPlot/layers/ValueAxis.d.ts +16 -0
  81. package/dist/plugin-basic/src/plugins/SeriesPlot/types.d.ts +140 -0
  82. package/dist/plugin-basic/src/plugins/Tooltip/Tooltip.d.ts +22 -0
  83. package/dist/plugin-basic/src/plugins/Tooltip/contextObservables.d.ts +9 -0
  84. package/dist/plugin-basic/src/plugins/Tooltip/defaults.d.ts +4 -0
  85. package/dist/plugin-basic/src/plugins/Tooltip/index.d.ts +3 -0
  86. package/dist/plugin-basic/src/plugins/Tooltip/layers/Tooltip.d.ts +16 -0
  87. package/dist/plugin-basic/src/plugins/Tooltip/types.d.ts +35 -0
  88. package/dist/plugin-basic/src/plugins/Tooltip/utils.d.ts +19 -0
  89. package/dist/plugin-basic/src/plugins/index.d.ts +7 -0
  90. package/dist/plugin-basic/src/types/BaseLayer.d.ts +3 -0
  91. package/dist/plugin-basic/src/types/Common.d.ts +14 -0
  92. package/dist/plugin-basic/src/types/ComputedData.d.ts +27 -0
  93. package/dist/plugin-basic/src/types/PluginParams.d.ts +66 -0
  94. package/dist/plugin-basic/src/types/index.d.ts +3 -0
  95. package/dist/plugin-basic/src/utils/commonUtils.d.ts +3 -0
  96. package/dist/plugin-basic/src/utils/d3Graphics.d.ts +24 -0
  97. package/dist/plugin-basic/src/utils/d3Scale.d.ts +28 -0
  98. package/dist/plugin-basic/src/utils/d3Utils.d.ts +14 -0
  99. package/dist/plugin-basic/src/utils/graphObservables.d.ts +0 -0
  100. package/dist/plugin-basic/src/utils/gridObservables.d.ts +51 -0
  101. package/dist/plugin-basic/src/utils/multivariateObservables.d.ts +74 -0
  102. package/dist/plugin-basic/src/utils/observables.d.ts +34 -0
  103. package/dist/plugin-basic/src/utils/orbchartsUtils.d.ts +26 -0
  104. package/dist/plugin-basic/src/utils/seriesObservables.d.ts +22 -0
  105. package/dist/plugin-basic/vite.config.d.ts +2 -0
  106. package/dist/src/index.d.ts +1 -0
  107. package/package.json +62 -0
  108. package/src/baseLayers/BaseBars.ts +783 -0
  109. package/src/baseLayers/BaseBarsTriangle.ts +692 -0
  110. package/src/baseLayers/BaseCategoryAxis.ts +708 -0
  111. package/src/baseLayers/BaseDots.ts +495 -0
  112. package/src/baseLayers/BaseLegend.ts +684 -0
  113. package/src/baseLayers/BaseLineAreas.ts +644 -0
  114. package/src/baseLayers/BaseLines.ts +721 -0
  115. package/src/baseLayers/BaseStackedBars.ts +818 -0
  116. package/src/baseLayers/BaseTooltip.ts +435 -0
  117. package/src/baseLayers/BaseValueAxis.ts +612 -0
  118. package/src/baseLayers/BaseXAxis.ts +412 -0
  119. package/src/baseLayers/BaseXZoom.ts +250 -0
  120. package/src/baseLayers/BaseYAxis.ts +371 -0
  121. package/src/baseLayers/types.ts +174 -0
  122. package/src/const/layerIndex.ts +36 -0
  123. package/src/const/sharedPluginParams.ts +29 -0
  124. package/src/index.ts +3 -0
  125. package/src/plugins/CompositionPlot/CompositionPlot.ts +308 -0
  126. package/src/plugins/CompositionPlot/contextObservables.ts +251 -0
  127. package/src/plugins/CompositionPlot/defaults.ts +162 -0
  128. package/src/plugins/CompositionPlot/index.ts +3 -0
  129. package/src/plugins/CompositionPlot/layers/Bubbles.ts +808 -0
  130. package/src/plugins/CompositionPlot/layers/Indicator.ts +0 -0
  131. package/src/plugins/CompositionPlot/layers/Pie.ts +776 -0
  132. package/src/plugins/CompositionPlot/layers/PieEventTexts.ts +326 -0
  133. package/src/plugins/CompositionPlot/layers/PieLabels.ts +651 -0
  134. package/src/plugins/CompositionPlot/layers/Rose.ts +546 -0
  135. package/src/plugins/CompositionPlot/layers/RoseLabels.ts +616 -0
  136. package/src/plugins/CompositionPlot/layers/Waffle.ts +0 -0
  137. package/src/plugins/CompositionPlot/types.ts +129 -0
  138. package/src/plugins/CompositionPlot/utils.ts +53 -0
  139. package/src/plugins/HierarchyPlot/HierarchyPlot.ts +190 -0
  140. package/src/plugins/HierarchyPlot/contextObservables.ts +136 -0
  141. package/src/plugins/HierarchyPlot/defaults.ts +31 -0
  142. package/src/plugins/HierarchyPlot/index.ts +3 -0
  143. package/src/plugins/HierarchyPlot/layers/TreeMap.ts +371 -0
  144. package/src/plugins/HierarchyPlot/types.ts +36 -0
  145. package/src/plugins/Legend/Legend.ts +151 -0
  146. package/src/plugins/Legend/contextObservables.ts +55 -0
  147. package/src/plugins/Legend/defaults.ts +37 -0
  148. package/src/plugins/Legend/index.ts +3 -0
  149. package/src/plugins/Legend/layers/Legend.ts +114 -0
  150. package/src/plugins/Legend/types.ts +45 -0
  151. package/src/plugins/Legend/utils.ts +53 -0
  152. package/src/plugins/NetworkPlot/NetworkPlot.ts +228 -0
  153. package/src/plugins/NetworkPlot/contextObservables.ts +123 -0
  154. package/src/plugins/NetworkPlot/defaults.ts +147 -0
  155. package/src/plugins/NetworkPlot/index.ts +3 -0
  156. package/src/plugins/NetworkPlot/layers/ForceDirected.ts +1048 -0
  157. package/src/plugins/NetworkPlot/layers/ForceDirectedBubbles.ts +1318 -0
  158. package/src/plugins/NetworkPlot/types.ts +146 -0
  159. package/src/plugins/ScatterPlot/ScatterPlot.ts +569 -0
  160. package/src/plugins/ScatterPlot/contextObservables.ts +901 -0
  161. package/src/plugins/ScatterPlot/defaults.ts +212 -0
  162. package/src/plugins/ScatterPlot/index.ts +3 -0
  163. package/src/plugins/ScatterPlot/layers/Scatter.ts +518 -0
  164. package/src/plugins/ScatterPlot/layers/ScatterBubbles.ts +670 -0
  165. package/src/plugins/ScatterPlot/layers/XYAux.ts +686 -0
  166. package/src/plugins/ScatterPlot/layers/XYAxes.ts +205 -0
  167. package/src/plugins/ScatterPlot/layers/XZoom.ts +48 -0
  168. package/src/plugins/ScatterPlot/types.ts +179 -0
  169. package/src/plugins/SeriesPlot/SeriesPlot.ts +494 -0
  170. package/src/plugins/SeriesPlot/contextObservables.ts +726 -0
  171. package/src/plugins/SeriesPlot/defaults.ts +142 -0
  172. package/src/plugins/SeriesPlot/index.ts +3 -0
  173. package/src/plugins/SeriesPlot/layers/Bars.ts +84 -0
  174. package/src/plugins/SeriesPlot/layers/BarsPN.ts +85 -0
  175. package/src/plugins/SeriesPlot/layers/BarsTriangle.ts +89 -0
  176. package/src/plugins/SeriesPlot/layers/CategoryAux.ts +1131 -0
  177. package/src/plugins/SeriesPlot/layers/CategoryAxis.ts +92 -0
  178. package/src/plugins/SeriesPlot/layers/CategoryZoom.ts +233 -0
  179. package/src/plugins/SeriesPlot/layers/Dots.ts +91 -0
  180. package/src/plugins/SeriesPlot/layers/LineAreas.ts +82 -0
  181. package/src/plugins/SeriesPlot/layers/Lines.ts +75 -0
  182. package/src/plugins/SeriesPlot/layers/StackedBars.ts +85 -0
  183. package/src/plugins/SeriesPlot/layers/StackedValueAxis.ts +111 -0
  184. package/src/plugins/SeriesPlot/layers/ValueAxis.ts +111 -0
  185. package/src/plugins/SeriesPlot/types.ts +201 -0
  186. package/src/plugins/Tooltip/Tooltip.ts +159 -0
  187. package/src/plugins/Tooltip/contextObservables.ts +55 -0
  188. package/src/plugins/Tooltip/defaults.ts +458 -0
  189. package/src/plugins/Tooltip/index.ts +3 -0
  190. package/src/plugins/Tooltip/layers/Tooltip.ts +90 -0
  191. package/src/plugins/Tooltip/types.ts +55 -0
  192. package/src/plugins/Tooltip/utils.ts +53 -0
  193. package/src/plugins/index.ts +8 -0
  194. package/src/types/BaseLayer.ts +3 -0
  195. package/src/types/Common.ts +20 -0
  196. package/src/types/ComputedData.ts +55 -0
  197. package/src/types/PluginParams.ts +81 -0
  198. package/src/types/index.ts +3 -0
  199. package/src/utils/commonUtils.ts +31 -0
  200. package/src/utils/d3Graphics.ts +177 -0
  201. package/src/utils/d3Scale.ts +198 -0
  202. package/src/utils/d3Utils.ts +92 -0
  203. package/src/utils/graphObservables.ts +0 -0
  204. package/src/utils/gridObservables.ts +637 -0
  205. package/src/utils/multivariateObservables.ts +790 -0
  206. package/src/utils/observables.ts +357 -0
  207. package/src/utils/orbchartsUtils.ts +335 -0
  208. package/src/utils/seriesObservables.ts +172 -0
@@ -0,0 +1,308 @@
1
+ import * as d3 from 'd3'
2
+ import {
3
+ shareReplay,
4
+ map,
5
+ combineLatest,
6
+ debounceTime} from 'rxjs'
7
+
8
+ import type { CompositionPlotExtendContext, CompositionPlotPluginParams, CompositionPlotAllLayerParams } from './types'
9
+ import { defineSVGPlugin } from '@orbcharts/core'
10
+ import { validateObject } from '@orbcharts/core'
11
+ import { DEFAULT_COMPOSITION_PLOT_PARAMS } from './defaults'
12
+ import {
13
+ categoryDataMapObservable,
14
+ containerSizeObservable,
15
+ layoutObservable,
16
+ fontSizePxObservable,
17
+ highlightObservable,
18
+ seriesDataMapObservable
19
+ } from '../../utils/observables'
20
+ import {
21
+ datumContainerPositionMapObservable,
22
+ datumLabelsObservable,
23
+ separateNameObservable,
24
+ separateSeriesObservable,
25
+ seriesComputedDataObservable,
26
+ seriesComputedSortedDataObservable,
27
+ seriesContainerPositionObservable,
28
+ seriesLabelsObservable,
29
+ seriesVisibleComputedDataObservable
30
+ } from './contextObservables'
31
+ import { Bubbles } from './layers/Bubbles'
32
+ import { Pie } from './layers/Pie'
33
+ import { PieEventTexts } from './layers/PieEventTexts'
34
+ import { PieLabels } from './layers/PieLabels'
35
+ import { Rose } from './layers/Rose'
36
+ import { RoseLabels } from './layers/RoseLabels'
37
+
38
+ const bubbles = new Bubbles()
39
+ const pie = new Pie()
40
+ const pieEventTexts = new PieEventTexts()
41
+ const pieLabels = new PieLabels()
42
+ const rose = new Rose()
43
+ const roseLabels = new RoseLabels()
44
+
45
+ export const CompositionPlot = defineSVGPlugin<
46
+ CompositionPlotExtendContext,
47
+ CompositionPlotPluginParams,
48
+ CompositionPlotAllLayerParams
49
+ >({
50
+ name: 'CompositionPlot',
51
+ defaultParams: DEFAULT_COMPOSITION_PLOT_PARAMS,
52
+ layers: [bubbles, pie, pieEventTexts, pieLabels, rose, roseLabels],
53
+ setup: (props) => {
54
+ // props.context.seriesData$.subscribe(seriesData => {
55
+ // console.log('CompositionPlot seriesData', seriesData)
56
+ // })
57
+ const selectedSeriesData$ = combineLatest({
58
+ seriesData: props.context.seriesData$,
59
+ datasetIndex: props.pluginParams$.pipe(
60
+ map(pluginParams => pluginParams.datasetIndex)
61
+ )
62
+ }).pipe(
63
+ debounceTime(0),
64
+ map(({ seriesData, datasetIndex }) => seriesData[datasetIndex]),
65
+ shareReplay(1)
66
+ )
67
+
68
+ const layout$ = layoutObservable({
69
+ size$: props.context.size$,
70
+ padding$: props.pluginParams$.pipe(
71
+ map(pluginParams => pluginParams.styles.padding)
72
+ )
73
+ }).pipe(
74
+ shareReplay(1)
75
+ )
76
+
77
+ // combineLatest({
78
+ // layout: layout$,
79
+ // plugins: props.context.plugins$
80
+ // }).pipe(
81
+ // debounceTime(0)
82
+ // ).subscribe(data => {
83
+ // d3
84
+ // .select(props.context.svg)
85
+ // .selectAll(':scope > g') // 所有 layer
86
+ // .attr('transform', `translate(${data.layout.left}, ${data.layout.top})`)
87
+ // })
88
+
89
+ // const layoutSubscription = layout$.subscribe(layout => {
90
+ // props.svg.setAttribute('transform', `translate(${layout.left}, ${layout.top})`)
91
+ // })
92
+
93
+ const computedData$ = seriesComputedDataObservable({
94
+ selectedSeriesData$,
95
+ pluginParams$: props.pluginParams$
96
+ }).pipe(
97
+ shareReplay(1)
98
+ )
99
+
100
+ const fontSizePx$ = fontSizePxObservable(props.context.theme$).pipe(
101
+ shareReplay(1)
102
+ )
103
+
104
+ const datumLabels$ = datumLabelsObservable({
105
+ selectedSeriesData$
106
+ }).pipe(
107
+ shareReplay(1)
108
+ )
109
+
110
+ const separateSeries$ = separateSeriesObservable({
111
+ pluginParams$: props.pluginParams$
112
+ }).pipe(
113
+ shareReplay(1)
114
+ )
115
+
116
+ const separateName$ = separateNameObservable({
117
+ pluginParams$: props.pluginParams$
118
+ }).pipe(
119
+ shareReplay(1)
120
+ )
121
+
122
+ // const sumSeries$ = sumSeriesObservable({
123
+ // fullDataFormatter$: observer.fullDataFormatter$
124
+ // }).pipe(
125
+ // shareReplay(1)
126
+ // )
127
+
128
+ const computedSortedData$ = seriesComputedSortedDataObservable({
129
+ seriesComputedData$: computedData$,
130
+ separateSeries$: separateSeries$,
131
+ separateName$: separateName$,
132
+ // sumSeries$: sumSeries$,
133
+ datumLabels$: datumLabels$,
134
+ }).pipe(
135
+ shareReplay(1)
136
+ )
137
+
138
+ const visibleComputedSortedData$ = seriesVisibleComputedDataObservable({
139
+ seriesComputedData$: computedSortedData$,
140
+ }).pipe(
141
+ shareReplay(1)
142
+ )
143
+
144
+ const datumList$ = computedData$.pipe(
145
+ map(d => d.flat())
146
+ ).pipe(
147
+ shareReplay(1)
148
+ )
149
+
150
+ const seriesHighlight$ = highlightObservable({
151
+ datumList$,
152
+ styles$: props.pluginParams$.pipe(
153
+ map(pluginParams => pluginParams.styles)
154
+ ),
155
+ event$: props.context.event$
156
+ }).pipe(
157
+ shareReplay(1)
158
+ )
159
+
160
+ const seriesLabels$ = seriesLabelsObservable({
161
+ selectedSeriesData$,
162
+ }).pipe(
163
+ shareReplay(1)
164
+ )
165
+
166
+ const SeriesDataMap$ = seriesDataMapObservable({
167
+ datumList$
168
+ }).pipe(
169
+ shareReplay(1)
170
+ )
171
+
172
+ const seriesContainerPosition$ = seriesContainerPositionObservable({
173
+ computedSortedData$: computedSortedData$,
174
+ pluginParams$: props.pluginParams$,
175
+ layout$: layout$,
176
+ }).pipe(
177
+ shareReplay(1)
178
+ )
179
+
180
+ const DatumContainerPositionMap$ = datumContainerPositionMapObservable({
181
+ seriesContainerPosition$: seriesContainerPosition$,
182
+ computedSortedData$: computedSortedData$,
183
+ }).pipe(
184
+ shareReplay(1)
185
+ )
186
+
187
+ const extendsContext: CompositionPlotExtendContext = {
188
+ layout$,
189
+ computedData$,
190
+ fontSizePx$,
191
+ datumLabels$,
192
+ separateSeries$,
193
+ separateName$,
194
+ computedSortedData$,
195
+ visibleComputedSortedData$,
196
+ datumList$,
197
+ seriesHighlight$,
198
+ seriesLabels$,
199
+ SeriesDataMap$,
200
+ seriesContainerPosition$,
201
+ DatumContainerPositionMap$,
202
+ }
203
+
204
+ props.context = {
205
+ ...props.context,
206
+ ...extendsContext,
207
+ }
208
+
209
+ return () => {
210
+ // layoutSubscription.unsubscribe()
211
+ }
212
+ },
213
+ validator: (params: CompositionPlotPluginParams) => {
214
+ const result = validateObject(params, {
215
+ styles: {
216
+ toBeTypes: ['object'],
217
+ },
218
+ visibleFilter: {
219
+ toBeTypes: ['Function', 'null']
220
+ },
221
+ sort: {
222
+ toBeTypes: ['Function', 'null']
223
+ },
224
+ container: {
225
+ toBeTypes: ['object']
226
+ },
227
+ separateSeries: {
228
+ toBeTypes: ['boolean']
229
+ },
230
+ separateName: {
231
+ toBeTypes: ['boolean']
232
+ },
233
+ datasetIndex: {
234
+ toBeTypes: ['number']
235
+ }
236
+ })
237
+ if (result.status === 'error') {
238
+ return result
239
+ }
240
+ if (params.styles) {
241
+ const stylesResult = validateObject(params.styles, {
242
+ padding: {
243
+ toBeTypes: ['object']
244
+ },
245
+ highlightTarget: {
246
+ toBeTypes: ['string']
247
+ },
248
+ highlightDefault: {
249
+ toBeTypes: ['string', 'null']
250
+ },
251
+ unhighlightedOpacity: {
252
+ toBeTypes: ['number']
253
+ },
254
+ transitionDuration: {
255
+ toBeTypes: ['number']
256
+ },
257
+ transitionEase: {
258
+ toBeTypes: ['string']
259
+ }
260
+ })
261
+ if (stylesResult.status === 'error') {
262
+ return stylesResult
263
+ }
264
+ if (params.styles.padding) {
265
+ const paddingResult = validateObject(params.styles.padding, {
266
+ top: {
267
+ toBeTypes: ['number']
268
+ },
269
+ right: {
270
+ toBeTypes: ['number']
271
+ },
272
+ bottom: {
273
+ toBeTypes: ['number']
274
+ },
275
+ left: {
276
+ toBeTypes: ['number']
277
+ }
278
+ })
279
+ if (paddingResult.status === 'error') {
280
+ return paddingResult
281
+ }
282
+ }
283
+ }
284
+ if (params.container) {
285
+ const containerResult = validateObject(params.container, {
286
+ columnAmount: {
287
+ toBeTypes: ['number']
288
+ },
289
+ rowAmount: {
290
+ toBeTypes: ['number']
291
+ },
292
+ columnGap: {
293
+ toBe: 'number | "auto"',
294
+ test: (value: any) => typeof value === 'number' || value === 'auto'
295
+ },
296
+ rowGap: {
297
+ toBe: 'number | "auto"',
298
+ test: (value: any) => typeof value === 'number' || value === 'auto'
299
+ }
300
+ })
301
+ if (containerResult.status === 'error') {
302
+ return containerResult
303
+ }
304
+ }
305
+
306
+ return result
307
+ },
308
+ })
@@ -0,0 +1,251 @@
1
+ import {
2
+ combineLatest,
3
+ distinctUntilChanged,
4
+ debounceTime,
5
+ filter,
6
+ map,
7
+ merge,
8
+ takeUntil,
9
+ shareReplay,
10
+ switchMap,
11
+ Subject,
12
+ Observable
13
+ } from 'rxjs'
14
+ import type {
15
+ ModelDatumSeries,
16
+ ModelDataSeries,
17
+ // DataFormatterTypeMap,
18
+ // ContainerPosition,
19
+ // Layout
20
+ } from '@orbcharts/core'
21
+ import type { CompositionPlotPluginParams } from './types'
22
+ import type { Layout, ContainerPosition } from '../../types/PluginParams'
23
+ import type { ComputedDatumSeries } from '../../types/ComputedData'
24
+ import { calcContainerPosition } from '../../utils/orbchartsUtils'
25
+
26
+ export const seriesComputedDataObservable = ({ selectedSeriesData$, pluginParams$ }: {
27
+ selectedSeriesData$: Observable<ModelDataSeries>
28
+ pluginParams$: Observable<CompositionPlotPluginParams>
29
+ }): Observable<ComputedDatumSeries[][]> => {
30
+ return combineLatest({
31
+ selectedSeriesData: selectedSeriesData$,
32
+ pluginParams: pluginParams$
33
+ }).pipe(
34
+ debounceTime(0),
35
+ map(({ selectedSeriesData, pluginParams }) => {
36
+ return selectedSeriesData
37
+ // 攤為一維陣列
38
+ .flat()
39
+ // 排序後給 seq
40
+ .sort(pluginParams.sort ?? undefined)
41
+ .map((datum, index) => {
42
+ const visibleFilter = pluginParams.visibleFilter
43
+ return {
44
+ ...datum,
45
+ visible: visibleFilter ? visibleFilter(datum) : true,
46
+ seq: index
47
+ }
48
+ })
49
+ // 恢復原排序
50
+ .sort((a, b) => a.index - b.index)
51
+ // 依seriesIndex分組(二維陣列)
52
+ .reduce((acc, datum) => {
53
+ if (!acc[datum.seriesIndex]) {
54
+ acc[datum.seriesIndex] = []
55
+ }
56
+ acc[datum.seriesIndex].push(datum)
57
+ return acc
58
+ }, [])
59
+ })
60
+ )
61
+ }
62
+
63
+ export const datumLabelsObservable = ({ selectedSeriesData$ }: { selectedSeriesData$: Observable<ModelDataSeries> }) => {
64
+ const DatumLabels = new Set<string>()
65
+ return selectedSeriesData$.pipe(
66
+ map(selectedSeriesData => {
67
+ selectedSeriesData.forEach(series => {
68
+ series.forEach(datum => {
69
+ DatumLabels.add(datum.name)
70
+ })
71
+ })
72
+ return Array.from(DatumLabels)
73
+ }),
74
+ )
75
+ }
76
+
77
+ export const separateSeriesObservable = ({ pluginParams$ }: { pluginParams$: Observable<CompositionPlotPluginParams> }) => {
78
+ return pluginParams$.pipe(
79
+ map(data => data.separateSeries),
80
+ distinctUntilChanged(),
81
+ )
82
+ }
83
+
84
+ export const separateNameObservable = ({ pluginParams$ }: { pluginParams$: Observable<CompositionPlotPluginParams> }) => {
85
+ return pluginParams$.pipe(
86
+ map(data => data.separateName),
87
+ distinctUntilChanged(),
88
+ )
89
+ }
90
+
91
+ // export const sumSeriesObservable = ({ pluginParams$ }: { pluginParams$: Observable<CompositionPlotPluginParams> }) => {
92
+ // return pluginParams$.pipe(
93
+ // map(data => data.sumSeries),
94
+ // distinctUntilChanged(),
95
+ // )
96
+ // }
97
+
98
+ export const seriesLabelsObservable = ({ selectedSeriesData$ }: { selectedSeriesData$: Observable<ModelDataSeries> }) => {
99
+ return selectedSeriesData$.pipe(
100
+ map(data => {
101
+ const seriesLabels = data
102
+ .filter(series => series.length)
103
+ .map(series => {
104
+ return series[0].series
105
+ })
106
+ return Array.from(new Set(seriesLabels))
107
+ }),
108
+ distinctUntilChanged((a, b) => {
109
+ return JSON.stringify(a) === JSON.stringify(b)
110
+ }),
111
+ )
112
+ }
113
+
114
+ export const seriesVisibleComputedDataObservable = ({ seriesComputedData$ }: { seriesComputedData$: Observable<ComputedDatumSeries[][]> }) => {
115
+ return seriesComputedData$.pipe(
116
+ map(data => {
117
+ return data.map(series => {
118
+ return series.filter(datum => datum.visible != false)
119
+ })
120
+ })
121
+ )
122
+ }
123
+
124
+ export const seriesComputedSortedDataObservable = ({ seriesComputedData$, separateSeries$, separateName$, datumLabels$ }: {
125
+ seriesComputedData$: Observable<ComputedDatumSeries[][]>,
126
+ separateSeries$: Observable<boolean>,
127
+ separateName$: Observable<boolean>,
128
+ // sumSeries$: Observable<boolean>,
129
+ datumLabels$: Observable<string[]>
130
+ }) => {
131
+ return combineLatest({
132
+ seriesComputedData: seriesComputedData$,
133
+ separateSeries: separateSeries$,
134
+ separateName: separateName$,
135
+ // sumSeries: sumSeries$,
136
+ datumLabels: datumLabels$,
137
+ }).pipe(
138
+ switchMap(async (d) => d),
139
+ map(data => {
140
+ // // sum series
141
+ // const sumData: ComputedDatumSeries[][] = data.sumSeries == true
142
+ // ? data.seriesComputedData.map(d => {
143
+ // return [
144
+ // // 加總為一筆資料
145
+ // d.reduce((acc, current) => {
146
+ // if (acc == null) {
147
+ // // * 取得第一筆資料
148
+ // return current
149
+ // }
150
+ // // 加總 value
151
+ // acc.value = acc.value + current.value
152
+ // return acc
153
+ // }, null)
154
+ // ]
155
+ // })
156
+ // : data.seriesComputedData
157
+
158
+ // separate series
159
+ const separateSeriesData: ComputedDatumSeries[][] = data.separateSeries == true
160
+ // 有拆分的話每個series為一組
161
+ ? data.seriesComputedData
162
+ // 無拆分的話所有資料為一組
163
+ : [data.seriesComputedData.flat()]
164
+
165
+ // separate label
166
+ const separateNameData: ComputedDatumSeries[][] = data.separateName == true
167
+ // 有拆分的話每個label為一組
168
+ ? (() => {
169
+ // datumLabel 的 index 對應
170
+ const datumLabelIndexMap = data.datumLabels.reduce((acc, datumLabel, index) => {
171
+ acc[datumLabel] = index
172
+ return acc
173
+ }, {} as { [key: string]: number })
174
+
175
+ return separateSeriesData
176
+ .map(series => {
177
+ return series.reduce((acc, current) => {
178
+ const index = datumLabelIndexMap[current.name]
179
+ if (acc[index] == null) {
180
+ acc[index] = []
181
+ }
182
+ acc[index].push(current)
183
+ return acc
184
+ }, [] as ComputedDatumSeries[][])
185
+ })
186
+ .flat()
187
+ })()
188
+ // 無拆分
189
+ : separateSeriesData
190
+
191
+ return data.separateSeries == true && data.separateName == true
192
+ // 全部拆分時全部一起排序
193
+ ? separateNameData
194
+ .sort((a, b) => a[0].seq - b[0].seq)
195
+ // 依各個 container 排序
196
+ : separateNameData
197
+ .map(series => {
198
+ return series.sort((a, b) => a.seq - b.seq)
199
+ })
200
+ })
201
+ )
202
+ }
203
+
204
+
205
+ // 所有container位置(對應series)
206
+ export const seriesContainerPositionObservable = ({ computedSortedData$, pluginParams$, layout$ }: {
207
+ computedSortedData$: Observable<ComputedDatumSeries[][]>
208
+ pluginParams$: Observable<CompositionPlotPluginParams>
209
+ layout$: Observable<Layout>
210
+ }): Observable<ContainerPosition[]> => {
211
+
212
+ const gridContainerPosition$ = combineLatest({
213
+ computedSortedData: computedSortedData$,
214
+ pluginParams: pluginParams$,
215
+ layout: layout$,
216
+ }).pipe(
217
+ switchMap(async (d) => d),
218
+ map(data => {
219
+ // 已分類資料的分類數量
220
+ const amount = data.computedSortedData.length
221
+
222
+ return calcContainerPosition(data.layout, data.pluginParams.container, amount)
223
+ })
224
+ )
225
+
226
+ return gridContainerPosition$
227
+ }
228
+
229
+ export const datumContainerPositionMapObservable = ({ seriesContainerPosition$, computedSortedData$ }: {
230
+ seriesContainerPosition$: Observable<ContainerPosition[]>
231
+ computedSortedData$: Observable<ComputedDatumSeries[][]>
232
+ }) => {
233
+ return combineLatest({
234
+ seriesContainerPosition: seriesContainerPosition$,
235
+ computedSortedData: computedSortedData$,
236
+ }).pipe(
237
+ switchMap(async (d) => d),
238
+ map(data => {
239
+ return new Map<string, ContainerPosition>(
240
+ data.computedSortedData
241
+ .map((series, seriesIndex) => {
242
+ return series.map(datum => {
243
+ const m: [string, ContainerPosition] = [datum.id, data.seriesContainerPosition[seriesIndex]]
244
+ return m
245
+ })
246
+ })
247
+ .flat()
248
+ )
249
+ })
250
+ )
251
+ }
@@ -0,0 +1,162 @@
1
+ import type { IndicatorParams, PieEventTextsParams, PieLabelsParams, RoseLabelsParams, RoseParams, CompositionPlotPluginParams, } from './types'
2
+ import type { EventData, ModelDatumSeries } from '@orbcharts/core'
3
+ import type { BubblesParams, PieParams } from './types'
4
+ import { DEFAULT_CONTAINER } from '../../const/sharedPluginParams'
5
+
6
+ export const DEFAULT_COMPOSITION_PLOT_PARAMS: CompositionPlotPluginParams = {
7
+ styles: {
8
+ padding: {
9
+ top: 20,
10
+ right: 20,
11
+ bottom: 60,
12
+ left: 20
13
+ },
14
+ highlightTarget: 'datum',
15
+ highlightDefault: null,
16
+ unhighlightedOpacity: 0.3,
17
+ transitionDuration: 800,
18
+ transitionEase: 'easeCubic'
19
+ },
20
+ visibleFilter: (datum: ModelDatumSeries) => true,
21
+ sort: null,
22
+ // seriesLabels: [],
23
+ container: {
24
+ ...DEFAULT_CONTAINER
25
+ },
26
+ separateSeries: false,
27
+ separateName: false,
28
+ // sumSeries: false,
29
+ datasetIndex: 0
30
+ }
31
+ DEFAULT_COMPOSITION_PLOT_PARAMS.visibleFilter.toString = () => '(datum) => true'
32
+
33
+ export const DEFAULT_BUBBLES_PARAMS: BubblesParams = {
34
+ force: {
35
+ strength: 0.08, // 泡泡引力
36
+ velocityDecay: 0.3, // 衰減數
37
+ collisionSpacing: 2 // 泡泡間距
38
+ },
39
+ bubbleLabel: {
40
+ labelFn: d => String(d.name),
41
+ colorType: 'dataContrast',
42
+ fillRate: 0.6,
43
+ lineHeight: 1,
44
+ maxLineLength: 6,
45
+ wordBreakAll: true,
46
+ },
47
+ // highlightRIncrease: 0,
48
+ arcScaleType: 'area'
49
+ }
50
+ DEFAULT_BUBBLES_PARAMS.bubbleLabel.labelFn.toString = () => `d => String(d.name)`
51
+
52
+ export const DEFAULT_PIE_PARAMS: PieParams = {
53
+ outerRadius: 0.85,
54
+ innerRadius: 0,
55
+ outerRadiusWhileHighlight: 0.9,
56
+ startAngle: 0,
57
+ endAngle: Math.PI * 2,
58
+ padAngle: 0,
59
+ strokeColorType: 'background',
60
+ strokeWidth: 1,
61
+ // padRadius: 100,
62
+ cornerRadius: 0,
63
+ }
64
+
65
+
66
+ export const DEFAULT_PIE_EVENT_TEXTS_PARAMS: PieEventTextsParams = {
67
+ renderFn: (eventData: EventData) => {
68
+ if (eventData.eventName === 'mouseover' || eventData.eventName === 'mousemove') {
69
+ return [String(eventData.target!.value)]
70
+ }
71
+ return [
72
+ // String(
73
+ // Math.round(
74
+ // eventData.data.reduce((acc, seriesData) => {
75
+ // return acc + seriesData.reduce((_acc, data) => {
76
+ // return _acc + (data.value ?? 0)
77
+ // }, 0)
78
+ // }, 0) * (eventData.tween ?? 1)
79
+ // )
80
+ // )
81
+ ]
82
+ },
83
+ textAttrs: [
84
+ {
85
+ "transform": "translate(0, 0)"
86
+ }
87
+ ],
88
+ textStyles: [
89
+ {
90
+ "font-weight": "bold",
91
+ "text-anchor": "middle",
92
+ "pointer-events": "none",
93
+ "dominant-baseline": "middle",
94
+ "font-size": 64,
95
+ "fill": "#000"
96
+ }
97
+ ]
98
+ }
99
+ DEFAULT_PIE_EVENT_TEXTS_PARAMS.renderFn.toString = () => `(eventData) => {
100
+ if (eventData.eventName === 'mouseover' || eventData.eventName === 'mousemove') {
101
+ return [String(eventData.target.value)]
102
+ }
103
+ return [
104
+ String(
105
+ Math.round(
106
+ eventData.data.reduce((acc, seriesData) => {
107
+ return acc + seriesData.reduce((_acc, data) => {
108
+ return _acc + (data.value ?? 0)
109
+ }, 0)
110
+ }, 0) * (eventData.tween ?? 1)
111
+ )
112
+ )
113
+ ]
114
+ }`
115
+
116
+ export const DEFAULT_PIE_LABELS_PARAMS: PieLabelsParams = {
117
+ // solidColor: undefined,
118
+ // colors: DEFAULT_COLORS,
119
+ outerRadius: 0.85,
120
+ outerRadiusWhileHighlight: 0.9,
121
+ // innerRadius: 0,
122
+ // enterDuration: 800,
123
+ startAngle: 0,
124
+ endAngle: Math.PI * 2,
125
+ labelCentroid: 2.1,
126
+ // fontSize: 12,
127
+ labelColorType: 'primary',
128
+ labelFn: d => String(d.name),
129
+ }
130
+ DEFAULT_PIE_LABELS_PARAMS.labelFn.toString = () => `d => String(d.name)`
131
+
132
+ export const DEFAULT_ROSE_PARAMS: RoseParams = {
133
+ outerRadius: 0.95,
134
+ padAngle: 0,
135
+ strokeColorType: 'background',
136
+ strokeWidth: 0.5,
137
+ cornerRadius: 0,
138
+ arcScaleType: 'area',
139
+ angleIncreaseWhileHighlight: 0.05
140
+ }
141
+
142
+ export const DEFAULT_ROSE_LABELS_PARAMS: RoseLabelsParams = {
143
+ outerRadius: 0.95,
144
+ labelCentroid: 2.1,
145
+ labelFn: d => String(d.name),
146
+ labelColorType: 'primary',
147
+ arcScaleType: 'area'
148
+ }
149
+ DEFAULT_ROSE_LABELS_PARAMS.labelFn.toString = () => `d => String(d.name)`
150
+
151
+ export const DEFAULT_INDICATOR_PARAMS: IndicatorParams = {
152
+ // startAngle: 0,
153
+ // endAngle: Math.PI * 2,
154
+ startAngle: - Math.PI / 2,
155
+ endAngle: Math.PI / 2,
156
+ radius: 0.6,
157
+ indicatorType: 'needle',
158
+ size: 10,
159
+ colorType: 'data',
160
+ // autoHighlight: false,
161
+ value: 0,
162
+ }