@techie_doubts/tui.chart.2026 4.6.1

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 (284) hide show
  1. package/README.md +165 -0
  2. package/dist/esm/animator.d.ts +32 -0
  3. package/dist/esm/animator.js +102 -0
  4. package/dist/esm/brushes/axis.d.ts +3 -0
  5. package/dist/esm/brushes/axis.js +21 -0
  6. package/dist/esm/brushes/basic.d.ts +9 -0
  7. package/dist/esm/brushes/basic.js +95 -0
  8. package/dist/esm/brushes/boxPlot.d.ts +2 -0
  9. package/dist/esm/brushes/boxPlot.js +22 -0
  10. package/dist/esm/brushes/circleLegend.d.ts +2 -0
  11. package/dist/esm/brushes/circleLegend.js +26 -0
  12. package/dist/esm/brushes/dataLabel.d.ts +6 -0
  13. package/dist/esm/brushes/dataLabel.js +176 -0
  14. package/dist/esm/brushes/exportMenu.d.ts +2 -0
  15. package/dist/esm/brushes/exportMenu.js +55 -0
  16. package/dist/esm/brushes/gauge.d.ts +2 -0
  17. package/dist/esm/brushes/gauge.js +39 -0
  18. package/dist/esm/brushes/label.d.ts +34 -0
  19. package/dist/esm/brushes/label.js +165 -0
  20. package/dist/esm/brushes/legend.d.ts +7 -0
  21. package/dist/esm/brushes/legend.js +162 -0
  22. package/dist/esm/brushes/lineSeries.d.ts +5 -0
  23. package/dist/esm/brushes/lineSeries.js +41 -0
  24. package/dist/esm/brushes/polygon.d.ts +2 -0
  25. package/dist/esm/brushes/polygon.js +24 -0
  26. package/dist/esm/brushes/resetButton.d.ts +3 -0
  27. package/dist/esm/brushes/resetButton.js +112 -0
  28. package/dist/esm/brushes/scatterSeries.d.ts +2 -0
  29. package/dist/esm/brushes/scatterSeries.js +125 -0
  30. package/dist/esm/brushes/sector.d.ts +2 -0
  31. package/dist/esm/brushes/sector.js +54 -0
  32. package/dist/esm/brushes/spectrumLegend.d.ts +14 -0
  33. package/dist/esm/brushes/spectrumLegend.js +199 -0
  34. package/dist/esm/charts/areaChart.d.ts +254 -0
  35. package/dist/esm/charts/areaChart.js +358 -0
  36. package/dist/esm/charts/barChart.d.ts +203 -0
  37. package/dist/esm/charts/barChart.js +300 -0
  38. package/dist/esm/charts/boxPlotChart.d.ts +209 -0
  39. package/dist/esm/charts/boxPlotChart.js +288 -0
  40. package/dist/esm/charts/bubbleChart.d.ts +188 -0
  41. package/dist/esm/charts/bubbleChart.js +263 -0
  42. package/dist/esm/charts/bulletChart.d.ts +199 -0
  43. package/dist/esm/charts/bulletChart.js +278 -0
  44. package/dist/esm/charts/chart.d.ts +133 -0
  45. package/dist/esm/charts/chart.js +484 -0
  46. package/dist/esm/charts/columnChart.d.ts +205 -0
  47. package/dist/esm/charts/columnChart.js +299 -0
  48. package/dist/esm/charts/columnLineChart.d.ts +271 -0
  49. package/dist/esm/charts/columnLineChart.js +386 -0
  50. package/dist/esm/charts/gaugeChart.d.ts +191 -0
  51. package/dist/esm/charts/gaugeChart.js +279 -0
  52. package/dist/esm/charts/heatmapChart.d.ts +199 -0
  53. package/dist/esm/charts/heatmapChart.js +292 -0
  54. package/dist/esm/charts/lineAreaChart.d.ts +271 -0
  55. package/dist/esm/charts/lineAreaChart.js +374 -0
  56. package/dist/esm/charts/lineChart.d.ts +253 -0
  57. package/dist/esm/charts/lineChart.js +360 -0
  58. package/dist/esm/charts/lineScatterChart.d.ts +200 -0
  59. package/dist/esm/charts/lineScatterChart.js +285 -0
  60. package/dist/esm/charts/nestedPieChart.d.ts +192 -0
  61. package/dist/esm/charts/nestedPieChart.js +268 -0
  62. package/dist/esm/charts/pieChart.d.ts +156 -0
  63. package/dist/esm/charts/pieChart.js +224 -0
  64. package/dist/esm/charts/radarChart.d.ts +169 -0
  65. package/dist/esm/charts/radarChart.js +240 -0
  66. package/dist/esm/charts/radialBarChart.d.ts +172 -0
  67. package/dist/esm/charts/radialBarChart.js +251 -0
  68. package/dist/esm/charts/scatterChart.d.ts +184 -0
  69. package/dist/esm/charts/scatterChart.js +279 -0
  70. package/dist/esm/charts/treemapChart.d.ts +166 -0
  71. package/dist/esm/charts/treemapChart.js +239 -0
  72. package/dist/esm/component/areaSeries.d.ts +96 -0
  73. package/dist/esm/component/areaSeries.js +474 -0
  74. package/dist/esm/component/axis.d.ts +40 -0
  75. package/dist/esm/component/axis.js +176 -0
  76. package/dist/esm/component/axisTitle.d.ts +25 -0
  77. package/dist/esm/component/axisTitle.js +67 -0
  78. package/dist/esm/component/axisUsingCenterY.d.ts +32 -0
  79. package/dist/esm/component/axisUsingCenterY.js +175 -0
  80. package/dist/esm/component/backButton.d.ts +13 -0
  81. package/dist/esm/component/backButton.js +26 -0
  82. package/dist/esm/component/background.d.ts +10 -0
  83. package/dist/esm/component/background.js +15 -0
  84. package/dist/esm/component/boxPlotSeries.d.ts +126 -0
  85. package/dist/esm/component/boxPlotSeries.js +410 -0
  86. package/dist/esm/component/boxSeries.d.ts +211 -0
  87. package/dist/esm/component/boxSeries.js +603 -0
  88. package/dist/esm/component/boxStackSeries.d.ts +62 -0
  89. package/dist/esm/component/boxStackSeries.js +447 -0
  90. package/dist/esm/component/bubbleSeries.d.ts +35 -0
  91. package/dist/esm/component/bubbleSeries.js +174 -0
  92. package/dist/esm/component/bulletSeries.d.ts +89 -0
  93. package/dist/esm/component/bulletSeries.js +392 -0
  94. package/dist/esm/component/circleLegend.d.ts +10 -0
  95. package/dist/esm/component/circleLegend.js +37 -0
  96. package/dist/esm/component/component.d.ts +64 -0
  97. package/dist/esm/component/component.js +170 -0
  98. package/dist/esm/component/componentManager.d.ts +23 -0
  99. package/dist/esm/component/componentManager.js +45 -0
  100. package/dist/esm/component/dataLabels.d.ts +23 -0
  101. package/dist/esm/component/dataLabels.js +134 -0
  102. package/dist/esm/component/exportMenu.d.ts +38 -0
  103. package/dist/esm/component/exportMenu.js +147 -0
  104. package/dist/esm/component/gaugeSeries.d.ts +160 -0
  105. package/dist/esm/component/gaugeSeries.js +447 -0
  106. package/dist/esm/component/heatmapSeries.d.ts +64 -0
  107. package/dist/esm/component/heatmapSeries.js +152 -0
  108. package/dist/esm/component/hoveredSeries.d.ts +27 -0
  109. package/dist/esm/component/hoveredSeries.js +95 -0
  110. package/dist/esm/component/legend.d.ts +26 -0
  111. package/dist/esm/component/legend.js +149 -0
  112. package/dist/esm/component/lineSeries.d.ts +69 -0
  113. package/dist/esm/component/lineSeries.js +319 -0
  114. package/dist/esm/component/noDataText.d.ts +9 -0
  115. package/dist/esm/component/noDataText.js +31 -0
  116. package/dist/esm/component/pieSeries.d.ts +137 -0
  117. package/dist/esm/component/pieSeries.js +390 -0
  118. package/dist/esm/component/plot.d.ts +37 -0
  119. package/dist/esm/component/plot.js +163 -0
  120. package/dist/esm/component/radarSeries.d.ts +85 -0
  121. package/dist/esm/component/radarSeries.js +222 -0
  122. package/dist/esm/component/radialAxis.d.ts +26 -0
  123. package/dist/esm/component/radialAxis.js +210 -0
  124. package/dist/esm/component/radialBarSeries.d.ts +111 -0
  125. package/dist/esm/component/radialBarSeries.js +349 -0
  126. package/dist/esm/component/radialPlot.d.ts +55 -0
  127. package/dist/esm/component/radialPlot.js +188 -0
  128. package/dist/esm/component/rangeSelection.d.ts +61 -0
  129. package/dist/esm/component/rangeSelection.js +150 -0
  130. package/dist/esm/component/resetButton.d.ts +13 -0
  131. package/dist/esm/component/resetButton.js +26 -0
  132. package/dist/esm/component/scatterSeries.d.ts +34 -0
  133. package/dist/esm/component/scatterSeries.js +159 -0
  134. package/dist/esm/component/selectedSeries.d.ts +26 -0
  135. package/dist/esm/component/selectedSeries.js +109 -0
  136. package/dist/esm/component/spectrumLegend.d.ts +15 -0
  137. package/dist/esm/component/spectrumLegend.js +76 -0
  138. package/dist/esm/component/title.d.ts +12 -0
  139. package/dist/esm/component/title.js +53 -0
  140. package/dist/esm/component/tooltip.d.ts +41 -0
  141. package/dist/esm/component/tooltip.js +131 -0
  142. package/dist/esm/component/treemapSeries.d.ts +57 -0
  143. package/dist/esm/component/treemapSeries.js +191 -0
  144. package/dist/esm/component/zeroAxis.d.ts +9 -0
  145. package/dist/esm/component/zeroAxis.js +49 -0
  146. package/dist/esm/eventEmitter.d.ts +8 -0
  147. package/dist/esm/eventEmitter.js +15 -0
  148. package/dist/esm/helpers/arrayUtil.d.ts +10 -0
  149. package/dist/esm/helpers/arrayUtil.js +54 -0
  150. package/dist/esm/helpers/axes.d.ts +67 -0
  151. package/dist/esm/helpers/axes.js +345 -0
  152. package/dist/esm/helpers/boxSeries.d.ts +5 -0
  153. package/dist/esm/helpers/boxSeries.js +71 -0
  154. package/dist/esm/helpers/calculator.d.ts +19 -0
  155. package/dist/esm/helpers/calculator.js +153 -0
  156. package/dist/esm/helpers/color.d.ts +153 -0
  157. package/dist/esm/helpers/color.js +218 -0
  158. package/dist/esm/helpers/colorSpectrum.d.ts +5 -0
  159. package/dist/esm/helpers/colorSpectrum.js +17 -0
  160. package/dist/esm/helpers/coordinate.d.ts +9 -0
  161. package/dist/esm/helpers/coordinate.js +51 -0
  162. package/dist/esm/helpers/dataLabels.d.ts +36 -0
  163. package/dist/esm/helpers/dataLabels.js +405 -0
  164. package/dist/esm/helpers/dom.d.ts +2 -0
  165. package/dist/esm/helpers/dom.js +8 -0
  166. package/dist/esm/helpers/downloader.d.ts +7 -0
  167. package/dist/esm/helpers/downloader.js +287 -0
  168. package/dist/esm/helpers/formatDate.d.ts +16 -0
  169. package/dist/esm/helpers/formatDate.js +140 -0
  170. package/dist/esm/helpers/geometric.d.ts +3 -0
  171. package/dist/esm/helpers/geometric.js +35 -0
  172. package/dist/esm/helpers/googleAnalytics.d.ts +1 -0
  173. package/dist/esm/helpers/googleAnalytics.js +39 -0
  174. package/dist/esm/helpers/htmlSanitizer.d.ts +1 -0
  175. package/dist/esm/helpers/htmlSanitizer.js +86 -0
  176. package/dist/esm/helpers/legend.d.ts +9 -0
  177. package/dist/esm/helpers/legend.js +47 -0
  178. package/dist/esm/helpers/pieSeries.d.ts +15 -0
  179. package/dist/esm/helpers/pieSeries.js +72 -0
  180. package/dist/esm/helpers/plot.d.ts +2 -0
  181. package/dist/esm/helpers/plot.js +4 -0
  182. package/dist/esm/helpers/radarSeries.d.ts +1 -0
  183. package/dist/esm/helpers/radarSeries.js +7 -0
  184. package/dist/esm/helpers/range.d.ts +6 -0
  185. package/dist/esm/helpers/range.js +16 -0
  186. package/dist/esm/helpers/responders.d.ts +37 -0
  187. package/dist/esm/helpers/responders.js +197 -0
  188. package/dist/esm/helpers/sector.d.ts +55 -0
  189. package/dist/esm/helpers/sector.js +117 -0
  190. package/dist/esm/helpers/squarifier.d.ts +8 -0
  191. package/dist/esm/helpers/squarifier.js +110 -0
  192. package/dist/esm/helpers/style.d.ts +14 -0
  193. package/dist/esm/helpers/style.js +48 -0
  194. package/dist/esm/helpers/theme.d.ts +58 -0
  195. package/dist/esm/helpers/theme.js +557 -0
  196. package/dist/esm/helpers/tooltip.d.ts +2 -0
  197. package/dist/esm/helpers/tooltip.js +18 -0
  198. package/dist/esm/helpers/tooltipTemplate.d.ts +21 -0
  199. package/dist/esm/helpers/tooltipTemplate.js +147 -0
  200. package/dist/esm/helpers/utils.d.ts +42 -0
  201. package/dist/esm/helpers/utils.js +268 -0
  202. package/dist/esm/helpers/validation.d.ts +6 -0
  203. package/dist/esm/helpers/validation.js +16 -0
  204. package/dist/esm/index.d.ts +40 -0
  205. package/dist/esm/index.js +75 -0
  206. package/dist/esm/message.d.ts +11 -0
  207. package/dist/esm/message.js +11 -0
  208. package/dist/esm/painter.d.ts +27 -0
  209. package/dist/esm/painter.js +88 -0
  210. package/dist/esm/responderDetectors.d.ts +6 -0
  211. package/dist/esm/responderDetectors.js +124 -0
  212. package/dist/esm/scale/coordinateScaleCalculator.d.ts +24 -0
  213. package/dist/esm/scale/coordinateScaleCalculator.js +174 -0
  214. package/dist/esm/scale/datetimeScaleCalculator.d.ts +20 -0
  215. package/dist/esm/scale/datetimeScaleCalculator.js +59 -0
  216. package/dist/esm/store/axes.d.ts +30 -0
  217. package/dist/esm/store/axes.js +282 -0
  218. package/dist/esm/store/category.d.ts +4 -0
  219. package/dist/esm/store/category.js +73 -0
  220. package/dist/esm/store/colorValueScale.d.ts +3 -0
  221. package/dist/esm/store/colorValueScale.js +56 -0
  222. package/dist/esm/store/dataRange.d.ts +4 -0
  223. package/dist/esm/store/dataRange.js +170 -0
  224. package/dist/esm/store/gaugeAxes.d.ts +4 -0
  225. package/dist/esm/store/gaugeAxes.js +175 -0
  226. package/dist/esm/store/heatmapAxes.d.ts +3 -0
  227. package/dist/esm/store/heatmapAxes.js +98 -0
  228. package/dist/esm/store/heatmapSeriesData.d.ts +3 -0
  229. package/dist/esm/store/heatmapSeriesData.js +34 -0
  230. package/dist/esm/store/layout.d.ts +12 -0
  231. package/dist/esm/store/layout.js +487 -0
  232. package/dist/esm/store/legend.d.ts +3 -0
  233. package/dist/esm/store/legend.js +435 -0
  234. package/dist/esm/store/nestedPieSeriesData.d.ts +3 -0
  235. package/dist/esm/store/nestedPieSeriesData.js +49 -0
  236. package/dist/esm/store/options.d.ts +3 -0
  237. package/dist/esm/store/options.js +62 -0
  238. package/dist/esm/store/plot.d.ts +3 -0
  239. package/dist/esm/store/plot.js +102 -0
  240. package/dist/esm/store/radialAxes.d.ts +8 -0
  241. package/dist/esm/store/radialAxes.js +199 -0
  242. package/dist/esm/store/reactive.d.ts +11 -0
  243. package/dist/esm/store/reactive.js +196 -0
  244. package/dist/esm/store/root.d.ts +3 -0
  245. package/dist/esm/store/root.js +46 -0
  246. package/dist/esm/store/scale.d.ts +3 -0
  247. package/dist/esm/store/scale.js +102 -0
  248. package/dist/esm/store/seriesData.d.ts +3 -0
  249. package/dist/esm/store/seriesData.js +299 -0
  250. package/dist/esm/store/stackSeriesData.d.ts +8 -0
  251. package/dist/esm/store/stackSeriesData.js +192 -0
  252. package/dist/esm/store/store.d.ts +20 -0
  253. package/dist/esm/store/store.js +112 -0
  254. package/dist/esm/store/theme.d.ts +3 -0
  255. package/dist/esm/store/theme.js +139 -0
  256. package/dist/esm/store/treemapSeriesData.d.ts +4 -0
  257. package/dist/esm/store/treemapSeriesData.js +93 -0
  258. package/dist/td-chart.css +127 -0
  259. package/dist/td-chart.js +41463 -0
  260. package/dist/td-chart.min.css +6 -0
  261. package/dist/td-chart.min.js +9 -0
  262. package/package.json +112 -0
  263. package/types/brushes.d.ts +30 -0
  264. package/types/charts.d.ts +152 -0
  265. package/types/components/axis.d.ts +71 -0
  266. package/types/components/circleLegend.d.ts +9 -0
  267. package/types/components/dataLabels.d.ts +119 -0
  268. package/types/components/exportMenu.d.ts +14 -0
  269. package/types/components/legend.d.ts +27 -0
  270. package/types/components/plot.d.ts +8 -0
  271. package/types/components/radialAxis.d.ts +22 -0
  272. package/types/components/radialPlot.d.ts +11 -0
  273. package/types/components/rangeSelection.d.ts +3 -0
  274. package/types/components/resetButton.d.ts +13 -0
  275. package/types/components/series.d.ts +386 -0
  276. package/types/components/spectrumLegend.d.ts +25 -0
  277. package/types/components/tooltip.d.ts +58 -0
  278. package/types/components/zoom.d.ts +3 -0
  279. package/types/eventEmitter.d.ts +12 -0
  280. package/types/index.d.ts +615 -0
  281. package/types/options.d.ts +833 -0
  282. package/types/resizeObserver.d.ts +54 -0
  283. package/types/store/store.d.ts +564 -0
  284. package/types/theme.d.ts +670 -0
@@ -0,0 +1,447 @@
1
+ import BoxSeries, { isLeftBottomSide, SeriesDirection } from "./boxSeries";
2
+ import { deepCopyArray, includes, isNumber, hasNegative, calculateSizeWithPercentString, } from "../helpers/utils";
3
+ import { getLimitOnAxis } from "../helpers/axes";
4
+ import { isGroupStack, isPercentStack } from "../store/stackSeriesData";
5
+ import { calibrateBoxStackDrawingValue, sumValuesBeforeIndex } from "../helpers/boxSeries";
6
+ import { getDataLabelsOptions } from "../helpers/dataLabels";
7
+ import { getRGBA } from "../helpers/color";
8
+ import { getActiveSeriesMap } from "../helpers/legend";
9
+ import { getBoxTypeSeriesPadding } from "../helpers/style";
10
+ import { getDataInRange } from "../helpers/range";
11
+ import { message } from "../message";
12
+ import { makeLabelsFromLimit } from "../helpers/calculator";
13
+ function calibrateDrawingValue(values, seriesIndex, renderOptions) {
14
+ const { stack, min, max } = renderOptions;
15
+ return isPercentStack(stack)
16
+ ? values[seriesIndex]
17
+ : calibrateBoxStackDrawingValue(values, seriesIndex, min, max);
18
+ }
19
+ function getDivisorForPercent(total, scaleType) {
20
+ const { positive, negative } = total;
21
+ let divisor = positive + Math.abs(negative);
22
+ if (includes(['dualPercentStack', 'divergingPercentStack'], scaleType)) {
23
+ divisor *= 2;
24
+ }
25
+ return divisor;
26
+ }
27
+ function getDirectionKeys(seriesDirection) {
28
+ let result = ['positive', 'negative'];
29
+ if (seriesDirection === SeriesDirection.POSITIVE) {
30
+ result = ['positive'];
31
+ }
32
+ else if (seriesDirection === SeriesDirection.NEGATIVE) {
33
+ result = ['negative'];
34
+ }
35
+ return result;
36
+ }
37
+ function getStackSeriesDataInViewRange(stackSeriesData, viewRange) {
38
+ if (!viewRange) {
39
+ return stackSeriesData;
40
+ }
41
+ const stackData = Array.isArray(stackSeriesData.stackData)
42
+ ? getDataInRange(stackSeriesData.stackData, viewRange)
43
+ : Object.assign({}, Object.keys(stackSeriesData.stackData).reduce((acc, name) => (Object.assign(Object.assign({}, acc), { [name]: getDataInRange(stackSeriesData.stackData[name], viewRange) })), {}));
44
+ const data = stackSeriesData.data.map((seriesDatum) => (Object.assign(Object.assign({}, seriesDatum), { data: getDataInRange(seriesDatum.data, viewRange) })));
45
+ return Object.assign(Object.assign({}, stackSeriesData), { data, stackData });
46
+ }
47
+ export default class BoxStackSeries extends BoxSeries {
48
+ constructor() {
49
+ super(...arguments);
50
+ this.selectSeries = ({ index, seriesIndex, state, }) => {
51
+ if (!isNumber(index) || !isNumber(seriesIndex)) {
52
+ return;
53
+ }
54
+ const { stackSeries } = state;
55
+ const stackSeriesData = stackSeries[this.name];
56
+ const { name } = stackSeriesData.data[seriesIndex];
57
+ const model = this.tooltipRectMap[index].find(({ name: seriesName }) => seriesName === name);
58
+ if (!model) {
59
+ throw new Error(message.SELECT_SERIES_API_INDEX_ERROR);
60
+ }
61
+ this.eventBus.emit('renderSelectedSeries', {
62
+ models: this.getRespondersWithTheme([model], 'select'),
63
+ name: this.name,
64
+ eventDetectType: this.eventDetectType,
65
+ });
66
+ this.eventBus.emit('needDraw');
67
+ };
68
+ }
69
+ initialize({ name, stackChart }) {
70
+ this.initializeFields(name);
71
+ if (stackChart) {
72
+ this.eventBus.on('selectSeries', this.selectSeries);
73
+ this.eventBus.on('showTooltip', this.showTooltip);
74
+ this.eventBus.on('hideTooltip', this.onMouseoutComponent);
75
+ }
76
+ }
77
+ render(chartState, computed) {
78
+ var _a, _b;
79
+ const { layout, series: seriesData, axes, stackSeries, legend, theme, scale } = chartState;
80
+ const { viewRange } = computed;
81
+ this.isShow = !!stackSeries[this.name];
82
+ if (!this.isShow) {
83
+ return;
84
+ }
85
+ const categories = (_a = chartState.categories, (_a !== null && _a !== void 0 ? _a : []));
86
+ const options = this.getOptions(chartState.options);
87
+ this.setEventDetectType(seriesData, options);
88
+ this.theme = theme.series[this.name];
89
+ this.rect = layout.plot;
90
+ this.activeSeriesMap = getActiveSeriesMap(legend);
91
+ this.selectable = this.getSelectableOption(options);
92
+ const stackSeriesData = getStackSeriesDataInViewRange(stackSeries[this.name], viewRange);
93
+ const { tickDistance } = axes[this.labelAxis];
94
+ const diverging = !!((_b = options.series) === null || _b === void 0 ? void 0 : _b.diverging);
95
+ const { limit, stepSize } = this.getScaleData(scale);
96
+ const labels = makeLabelsFromLimit(limit, stepSize);
97
+ const { min, max } = getLimitOnAxis(labels);
98
+ const { stack, scaleType } = stackSeriesData;
99
+ this.basePosition = this.getBasePosition(axes[this.valueAxis]);
100
+ let offsetSize = this.getOffsetSize();
101
+ const { centerYAxis } = axes;
102
+ if (diverging) {
103
+ const [left, right] = this.getDivergingBasePosition(centerYAxis);
104
+ this.basePosition = this.getOffsetSize() / 2;
105
+ this.leftBasePosition = left;
106
+ this.rightBasePosition = right;
107
+ offsetSize = this.getOffsetSizeWithDiverging(centerYAxis);
108
+ }
109
+ const renderOptions = {
110
+ stack,
111
+ scaleType,
112
+ tickDistance,
113
+ min,
114
+ max,
115
+ diverging,
116
+ hasNegativeValue: hasNegative(labels),
117
+ seriesDirection: this.getSeriesDirection(labels),
118
+ defaultPadding: getBoxTypeSeriesPadding(tickDistance),
119
+ offsetSize,
120
+ centerYAxis,
121
+ };
122
+ const { series, connector } = this.renderStackSeriesModel(stackSeriesData, renderOptions);
123
+ const clipRect = this.renderClipRectAreaModel();
124
+ const tooltipData = this.getTooltipData(stackSeriesData, categories);
125
+ this.models = {
126
+ clipRect: [clipRect],
127
+ series,
128
+ connector,
129
+ };
130
+ if (!this.drawModels) {
131
+ this.drawModels = {
132
+ clipRect: [this.initClipRect(clipRect)],
133
+ series: deepCopyArray(series),
134
+ connector: deepCopyArray(connector),
135
+ };
136
+ }
137
+ if (getDataLabelsOptions(options, this.name).visible) {
138
+ const dataLabelData = this.getDataLabels(series, renderOptions);
139
+ const stackTotalData = this.getTotalDataLabels(stackSeriesData, renderOptions);
140
+ this.renderDataLabels([...dataLabelData, ...stackTotalData]);
141
+ }
142
+ this.tooltipRectMap = this.makeTooltipRectMap(series, tooltipData);
143
+ this.responders = this.getBoxSeriesResponders(series, tooltipData, axes, categories);
144
+ }
145
+ renderStackSeriesModel(seriesData, renderOptions) {
146
+ const { stackData } = seriesData;
147
+ return isGroupStack(stackData)
148
+ ? this.makeStackGroupSeriesModel(seriesData, renderOptions)
149
+ : this.makeStackSeriesModel(stackData, renderOptions, seriesData.data);
150
+ }
151
+ makeStackSeriesModel(stackData, renderOptions, seriesRawData, stackGroupCount = 1, stackGroupIndex = 0) {
152
+ const seriesModels = [];
153
+ const columnWidth = this.getStackColumnWidth(renderOptions, stackGroupCount);
154
+ const { diverging } = renderOptions;
155
+ const isLBSideWithDiverging = diverging && isLeftBottomSide(stackGroupIndex);
156
+ stackData.forEach(({ values, total }, dataIndex) => {
157
+ const seriesPos = this.getSeriesPosition(renderOptions, columnWidth, dataIndex, stackGroupIndex, stackGroupCount);
158
+ const ratio = this.getStackValueRatio(total, renderOptions);
159
+ values.forEach((value, seriesIndex) => {
160
+ const { barLength, dataPosition } = this.getStackRectInfo(values, seriesIndex, ratio, renderOptions, isLBSideWithDiverging);
161
+ const { name, colorByCategories, color: rawColor } = seriesRawData[seriesIndex];
162
+ const active = this.activeSeriesMap[name];
163
+ const colorLength = rawColor.length || 1;
164
+ const hexColor = colorByCategories ? rawColor[dataIndex % colorLength] : rawColor;
165
+ const color = getRGBA(hexColor, active ? 1 : 0.2);
166
+ seriesModels.push(Object.assign(Object.assign({ type: 'rect', color,
167
+ name,
168
+ value }, this.getAdjustedRect(seriesPos, dataPosition, (barLength !== null && barLength !== void 0 ? barLength : 0), columnWidth)), { index: dataIndex }));
169
+ });
170
+ });
171
+ return {
172
+ series: seriesModels,
173
+ connector: this.makeConnectorSeriesModel(stackData, renderOptions, stackGroupCount, stackGroupIndex),
174
+ };
175
+ }
176
+ makeStackGroupSeriesModel(stackSeries, renderOptions) {
177
+ const { stack } = renderOptions;
178
+ const stackGroupData = stackSeries.stackData;
179
+ const seriesRawData = stackSeries.data;
180
+ const stackGroupIds = Object.keys(stackGroupData);
181
+ let seriesModels = [];
182
+ let connectorModels = [];
183
+ stackGroupIds.forEach((groupId, groupIndex) => {
184
+ const filtered = seriesRawData.filter(({ stackGroup }) => stackGroup === groupId);
185
+ const { series, connector } = this.makeStackSeriesModel(stackGroupData[groupId], renderOptions, filtered, stackGroupIds.length, groupIndex);
186
+ seriesModels = [...seriesModels, ...series];
187
+ if (stack.connector) {
188
+ connectorModels = [...connectorModels, ...connector];
189
+ }
190
+ });
191
+ return {
192
+ series: seriesModels,
193
+ connector: connectorModels,
194
+ };
195
+ }
196
+ makeConnectorSeriesModel(stackData, renderOptions, stackGroupCount = 1, stackGroupIndex = 0) {
197
+ const { diverging, stack: { connector }, } = renderOptions;
198
+ if (!connector) {
199
+ return [];
200
+ }
201
+ const columnWidth = this.getStackColumnWidth(renderOptions, stackGroupCount);
202
+ const isLBSideWithDiverging = diverging && isLeftBottomSide(stackGroupIndex);
203
+ const connectorPoints = [];
204
+ stackData.forEach(({ values, total }, index) => {
205
+ const seriesPos = this.getSeriesPosition(renderOptions, columnWidth, index, stackGroupIndex, stackGroupCount);
206
+ const points = [];
207
+ const ratio = this.getStackValueRatio(total, renderOptions);
208
+ values.forEach((value, seriesIndex) => {
209
+ const { barLength, dataPosition } = this.getStackRectInfo(values, seriesIndex, ratio, renderOptions, isLBSideWithDiverging);
210
+ const { x, y } = this.getAdjustedRect(seriesPos, dataPosition, barLength, columnWidth);
211
+ const xPos = !isLBSideWithDiverging && this.isBar ? x + barLength : x;
212
+ const yPos = isLBSideWithDiverging && !this.isBar ? y + barLength : y;
213
+ points.push({ x: xPos, y: yPos });
214
+ });
215
+ connectorPoints.push(points);
216
+ });
217
+ return this.makeConnectorModel(connectorPoints, connector, columnWidth);
218
+ }
219
+ getTooltipData(seriesData, categories) {
220
+ const seriesRawData = seriesData.data;
221
+ const { stackData } = seriesData;
222
+ const colors = seriesRawData.map(({ color }) => color);
223
+ return isGroupStack(stackData)
224
+ ? this.makeGroupStackTooltipData(seriesRawData, stackData, categories)
225
+ : this.makeStackTooltipData(seriesRawData, stackData, colors, categories);
226
+ }
227
+ makeGroupStackTooltipData(seriesRawData, stackData, categories) {
228
+ return Object.keys(stackData).flatMap((groupId) => {
229
+ const rawDataWithSameGroupId = seriesRawData.filter(({ stackGroup }) => stackGroup === groupId);
230
+ const colors = rawDataWithSameGroupId.map(({ color }) => color);
231
+ return this.makeStackTooltipData(rawDataWithSameGroupId, stackData[groupId], colors, categories);
232
+ });
233
+ }
234
+ makeStackTooltipData(seriesRawData, stackData, colors, categories) {
235
+ const tooltipData = [];
236
+ stackData.forEach(({ values }, dataIndex) => {
237
+ values.forEach((value, seriesIndex) => {
238
+ tooltipData.push({
239
+ label: seriesRawData[seriesIndex].name,
240
+ color: colors[seriesIndex],
241
+ value,
242
+ category: categories.length ? categories[dataIndex] : '',
243
+ });
244
+ });
245
+ });
246
+ return tooltipData;
247
+ }
248
+ makeConnectorModel(pointsForConnector, connector, columnWidth) {
249
+ if (!connector || !pointsForConnector.length) {
250
+ return [];
251
+ }
252
+ const { color, lineWidth, dashSegments } = this.theme.connector;
253
+ const connectorModels = [];
254
+ const seriesDataCount = pointsForConnector.length;
255
+ const seriesCount = pointsForConnector[0].length;
256
+ for (let seriesIndex = 0; seriesIndex < seriesCount; seriesIndex += 1) {
257
+ const points = [];
258
+ for (let dataIndex = 0; dataIndex < seriesDataCount; dataIndex += 1) {
259
+ points.push(pointsForConnector[dataIndex][seriesIndex]);
260
+ }
261
+ points.forEach((point, index) => {
262
+ const { x, y } = point;
263
+ if (index < points.length - 1) {
264
+ const { x: nextX, y: nextY } = points[index + 1];
265
+ connectorModels.push({
266
+ type: 'line',
267
+ x: this.isBar ? x : x + columnWidth,
268
+ y: this.isBar ? y + columnWidth : y,
269
+ x2: nextX,
270
+ y2: nextY,
271
+ dashSegments,
272
+ strokeStyle: color,
273
+ lineWidth,
274
+ });
275
+ }
276
+ });
277
+ }
278
+ return connectorModels;
279
+ }
280
+ getStackValueRatio(total, renderOptions) {
281
+ const { stack: { type: stackType }, scaleType, min, max, offsetSize, } = renderOptions;
282
+ if (stackType === 'percent') {
283
+ return offsetSize / getDivisorForPercent(total, scaleType);
284
+ }
285
+ return this.getValueRatio(min, max, offsetSize);
286
+ }
287
+ getStackBarLength(values, seriesIndex, ratio, renderOptions) {
288
+ const value = calibrateDrawingValue(values, seriesIndex, renderOptions);
289
+ return isNumber(value) ? this.getBarLength(value, ratio) : null;
290
+ }
291
+ getStackColumnWidth(renderOptions, stackGroupCount) {
292
+ const { tickDistance, diverging, defaultPadding } = renderOptions;
293
+ const divisor = diverging ? 1 : stackGroupCount;
294
+ const themeBarWidth = this.theme.barWidth;
295
+ return themeBarWidth
296
+ ? calculateSizeWithPercentString(tickDistance, themeBarWidth)
297
+ : (tickDistance - defaultPadding * 2) / divisor;
298
+ }
299
+ getSeriesPosition(renderOptions, columnWidth, dataIndex, stackGroupIndex, stackGroupCount) {
300
+ const { tickDistance, diverging } = renderOptions;
301
+ const groupIndex = diverging ? 0 : stackGroupIndex;
302
+ const groupCount = diverging ? 1 : stackGroupCount;
303
+ const padding = (tickDistance - columnWidth * groupCount) / 2;
304
+ return dataIndex * tickDistance + padding + columnWidth * groupIndex;
305
+ }
306
+ getStackStartPosition(values, currentIndex, ratio, renderOptions, isLBSideWithDiverging) {
307
+ const { stack, diverging, seriesDirection } = renderOptions;
308
+ let startPos;
309
+ if (diverging) {
310
+ startPos = isLBSideWithDiverging
311
+ ? this.calcStartPosOnLeftBottomSide(values, currentIndex, renderOptions, ratio)
312
+ : this.calcStartPosOnRightTopSide(values, currentIndex, renderOptions, ratio);
313
+ }
314
+ else if (isPercentStack(stack)) {
315
+ startPos = this.calcStartPositionWithPercent(values, currentIndex, ratio);
316
+ }
317
+ else if (seriesDirection === SeriesDirection.POSITIVE) {
318
+ startPos = this.calcStartPosOnRightTopSide(values, currentIndex, renderOptions, ratio);
319
+ }
320
+ else if (seriesDirection === SeriesDirection.NEGATIVE) {
321
+ startPos = this.calcStartPosOnLeftBottomSide(values, currentIndex, renderOptions, ratio);
322
+ }
323
+ else {
324
+ startPos = this.calcStartPositionWithStack(values, currentIndex, renderOptions, ratio);
325
+ }
326
+ return startPos;
327
+ }
328
+ calcStartPosOnLeftBottomSide(values, currentIndex, renderOptions, ratio) {
329
+ const { min, max, diverging } = renderOptions;
330
+ const basePosition = diverging ? this.leftBasePosition : this.basePosition;
331
+ const totalOfIndexBefore = sumValuesBeforeIndex(values, currentIndex, false);
332
+ const totalOfValues = sumValuesBeforeIndex(values, currentIndex, true);
333
+ const collideEdge = totalOfValues < min;
334
+ const usingValue = this.isBar ? totalOfValues : totalOfIndexBefore;
335
+ const result = max < 0 ? Math.min(usingValue - max, 0) : usingValue;
336
+ let pos;
337
+ if (this.isBar) {
338
+ pos = collideEdge ? 0 : basePosition - Math.abs(result) * ratio;
339
+ }
340
+ else {
341
+ pos = basePosition + Math.abs(result) * ratio;
342
+ }
343
+ return pos;
344
+ }
345
+ calcStartPosOnRightTopSide(values, currentIndex, renderOptions, ratio) {
346
+ const { min, max, diverging } = renderOptions;
347
+ const basePosition = diverging ? this.rightBasePosition : this.basePosition;
348
+ const totalOfIndexBefore = sumValuesBeforeIndex(values, currentIndex, false);
349
+ const totalOfValues = sumValuesBeforeIndex(values, currentIndex, true);
350
+ const collideEdge = totalOfValues > max;
351
+ const usingValue = this.isBar ? totalOfIndexBefore : totalOfValues;
352
+ const result = min > 0 ? Math.max(usingValue - min, 0) : usingValue;
353
+ const barLength = result * ratio;
354
+ let pos;
355
+ if (this.isBar) {
356
+ pos = basePosition + barLength;
357
+ }
358
+ else {
359
+ pos = collideEdge ? 0 : basePosition - barLength;
360
+ }
361
+ return pos;
362
+ }
363
+ calcStartPositionWithStack(values, currentIndex, renderOptions, ratio) {
364
+ return values[currentIndex] < 0
365
+ ? this.calcStartPosOnLeftBottomSide(values, currentIndex, renderOptions, ratio)
366
+ : this.calcStartPosOnRightTopSide(values, currentIndex, renderOptions, ratio);
367
+ }
368
+ calcStartPositionWithPercent(values, currentIndex, ratio) {
369
+ const basePosition = this.basePosition;
370
+ const totalPrevValues = sumValuesBeforeIndex(values, currentIndex, this.isBar ? values[currentIndex] < 0 : values[currentIndex] > 0);
371
+ return this.isBar
372
+ ? totalPrevValues * ratio + basePosition
373
+ : basePosition - totalPrevValues * ratio;
374
+ }
375
+ getStackRectInfo(values, seriesIndex, ratio, renderOptions, isLBSideWithDiverging) {
376
+ const barLength = this.getStackBarLength(values, seriesIndex, ratio, renderOptions);
377
+ const dataPosition = this.getStackStartPosition(values, seriesIndex, ratio, renderOptions, isLBSideWithDiverging);
378
+ return {
379
+ barLength,
380
+ dataPosition,
381
+ };
382
+ }
383
+ getDataLabels(seriesModels, renderOptions) {
384
+ return seriesModels.map((data) => this.makeDataLabel(data, renderOptions.centerYAxis));
385
+ }
386
+ getTotalDataLabels(seriesData, renderOptions) {
387
+ const { stackData, stack } = seriesData;
388
+ if (isPercentStack(stack)) {
389
+ return [];
390
+ }
391
+ return isGroupStack(stackData)
392
+ ? this.makeGroupTotalDataLabels(seriesData, renderOptions)
393
+ : this.makeTotalDataLabels(stackData, renderOptions);
394
+ }
395
+ makeGroupTotalDataLabels(stackSeries, renderOptions) {
396
+ let dataLabels = [];
397
+ const stackGroupData = stackSeries.stackData;
398
+ const stackGroupIds = Object.keys(stackGroupData);
399
+ stackGroupIds.forEach((groupId, groupIndex) => {
400
+ const totalDataLabels = this.makeTotalDataLabels(stackGroupData[groupId], renderOptions, stackGroupIds.length, groupIndex);
401
+ dataLabels = [...dataLabels, ...totalDataLabels];
402
+ });
403
+ return dataLabels;
404
+ }
405
+ makeTotalDataLabels(stackData, renderOptions, stackGroupCount = 1, stackGroupIndex = 0) {
406
+ const dataLabels = [];
407
+ const { min, max, seriesDirection, diverging, centerYAxis } = renderOptions;
408
+ const columnWidth = this.getStackColumnWidth(renderOptions, stackGroupCount);
409
+ stackData.forEach((data, dataIndex) => {
410
+ const { total } = data;
411
+ const seriesPos = this.getSeriesPosition(renderOptions, columnWidth, dataIndex, stackGroupIndex, stackGroupCount);
412
+ const ratio = this.getStackValueRatio(total, renderOptions);
413
+ const directionKeys = getDirectionKeys(seriesDirection);
414
+ directionKeys.forEach((key) => {
415
+ const value = total[key];
416
+ if (!value) {
417
+ return;
418
+ }
419
+ const barLength = this.makeBarLength(value, {
420
+ min,
421
+ max,
422
+ ratio,
423
+ });
424
+ const dataPosition = this.getStartPosition(barLength, value, renderOptions, diverging && isLeftBottomSide(stackGroupIndex));
425
+ const stackTotal = Object.assign({ type: 'stackTotal', value, name: `totalLabel-${key}`, theme: this.theme.dataLabels.stackTotal }, this.getAdjustedRect(seriesPos, dataPosition, barLength, columnWidth));
426
+ dataLabels.push(this.makeTotalDataLabel(stackTotal, centerYAxis));
427
+ });
428
+ });
429
+ return dataLabels;
430
+ }
431
+ makeTotalDataLabel(totalLabel, centerYAxis) {
432
+ return Object.assign(Object.assign({}, totalLabel), { direction: this.getDataLabelDirection(totalLabel, centerYAxis), plot: {
433
+ x: 0,
434
+ y: 0,
435
+ size: this.getOffsetSize(),
436
+ } });
437
+ }
438
+ onMousemoveGroupedType(responders) {
439
+ const rectModels = this.getRectModelsFromRectResponders(responders);
440
+ this.eventBus.emit('renderHoveredSeries', {
441
+ models: [...rectModels, ...this.getGroupedRect(responders, 'hover')],
442
+ name: this.name,
443
+ eventDetectType: this.eventDetectType,
444
+ });
445
+ this.activatedResponders = rectModels;
446
+ }
447
+ }
@@ -0,0 +1,35 @@
1
+ import { CircleModel, CircleResponderModel, CircleSeriesModels } from "../../types/components/series";
2
+ import { BaseOptions, BubbleChartOptions, BubbleSeriesType, Rect } from "../../types/options";
3
+ import { ChartState, Scale } from "../../types/store/store";
4
+ import { TooltipData } from "../../types/components/tooltip";
5
+ import Component from "./component";
6
+ import { BubbleChartSeriesTheme } from "../../types/theme";
7
+ import { SelectSeriesHandlerParams } from "../charts/chart";
8
+ export declare function getMaxRadius(bubbleData: BubbleSeriesType[]): number;
9
+ export default class BubbleSeries extends Component {
10
+ models: CircleSeriesModels;
11
+ drawModels: CircleSeriesModels;
12
+ responders: CircleResponderModel[];
13
+ activatedResponders: CircleResponderModel[];
14
+ theme: Required<BubbleChartSeriesTheme>;
15
+ rect: Rect;
16
+ maxRadius: number;
17
+ maxValue: number;
18
+ initialize(): void;
19
+ initUpdate(delta: number): void;
20
+ render(chartState: ChartState<BaseOptions>): void;
21
+ renderBubblePointsModel(seriesRawData: BubbleSeriesType[], scale: Scale): CircleModel[];
22
+ makeTooltipModel(circleData: BubbleSeriesType[]): TooltipData[];
23
+ private getResponderAppliedTheme;
24
+ onMouseoutComponent: () => void;
25
+ onMousemove({ responders, mousePosition }: {
26
+ responders: any;
27
+ mousePosition: any;
28
+ }): void;
29
+ onClick({ responders, mousePosition }: {
30
+ responders: any;
31
+ mousePosition: any;
32
+ }): void;
33
+ selectSeries: ({ index, seriesIndex, state }: SelectSeriesHandlerParams<BubbleChartOptions>) => void;
34
+ showTooltip: (info: SelectSeriesHandlerParams<BubbleChartOptions>) => void;
35
+ }
@@ -0,0 +1,174 @@
1
+ import { getCoordinateXValue, getCoordinateYValue } from "../helpers/coordinate";
2
+ import { getRGBA } from "../helpers/color";
3
+ import { getValueRatio } from "../helpers/calculator";
4
+ import { deepCopy, deepMergedCopy, isNull, isNumber, isString } from "../helpers/utils";
5
+ import { getActiveSeriesMap } from "../helpers/legend";
6
+ import { getNearestResponder } from "../helpers/responders";
7
+ import Component from "./component";
8
+ import { message } from "../message";
9
+ const MINIMUM_RADIUS = 0.5;
10
+ const MINIMUM_DETECTING_AREA_RADIUS = 1;
11
+ export function getMaxRadius(bubbleData) {
12
+ return bubbleData.reduce((acc, cur) => {
13
+ const NonNullData = cur.data.filter((datum) => !isNull(datum));
14
+ return Math.max(acc, ...NonNullData.map(({ r }) => r));
15
+ }, 0);
16
+ }
17
+ export default class BubbleSeries extends Component {
18
+ constructor() {
19
+ super(...arguments);
20
+ this.models = { series: [] };
21
+ this.activatedResponders = [];
22
+ this.maxRadius = -1;
23
+ this.maxValue = -1;
24
+ this.onMouseoutComponent = () => {
25
+ this.eventBus.emit('seriesPointHovered', { models: [], name: this.name });
26
+ this.eventBus.emit('renderHoveredSeries', {
27
+ models: [],
28
+ name: this.name,
29
+ });
30
+ this.eventBus.emit('needDraw');
31
+ };
32
+ this.selectSeries = ({ index, seriesIndex, state }) => {
33
+ if (!isNumber(index) || !isNumber(seriesIndex)) {
34
+ return;
35
+ }
36
+ const { name } = state.series.bubble.data[index];
37
+ const model = this.responders.filter(({ name: dataName }) => dataName === name)[seriesIndex];
38
+ if (!model) {
39
+ throw new Error(message.SELECT_SERIES_API_INDEX_ERROR);
40
+ }
41
+ const models = this.getResponderAppliedTheme([model], 'select');
42
+ this.eventBus.emit('renderSelectedSeries', { models, name: this.name });
43
+ this.eventBus.emit('needDraw');
44
+ };
45
+ this.showTooltip = (info) => {
46
+ const { index, seriesIndex, state } = info;
47
+ if (!isNumber(index) || !isNumber(seriesIndex)) {
48
+ return;
49
+ }
50
+ const { name } = state.series.bubble.data[seriesIndex];
51
+ const models = [this.responders.filter(({ name: dataName }) => dataName === name)[index]];
52
+ if (!models.length) {
53
+ return;
54
+ }
55
+ this.eventBus.emit('renderHoveredSeries', { models, name: this.name });
56
+ this.activatedResponders = models;
57
+ this.eventBus.emit('seriesPointHovered', { models: this.activatedResponders, name: this.name });
58
+ this.eventBus.emit('needDraw');
59
+ };
60
+ }
61
+ initialize() {
62
+ this.type = 'series';
63
+ this.name = 'bubble';
64
+ this.eventBus.on('selectSeries', this.selectSeries);
65
+ this.eventBus.on('showTooltip', this.showTooltip);
66
+ this.eventBus.on('hideTooltip', this.onMouseoutComponent);
67
+ }
68
+ initUpdate(delta) {
69
+ this.drawModels.series.forEach((model, index) => {
70
+ model.radius = this.models.series[index].radius * delta;
71
+ });
72
+ }
73
+ render(chartState) {
74
+ const { layout, series, scale, axes, circleLegend, legend, options, theme } = chartState;
75
+ const { plot } = layout;
76
+ if (!series.bubble) {
77
+ throw new Error(message.noDataError(this.name));
78
+ }
79
+ const { xAxis, yAxis } = axes;
80
+ const bubbleData = series.bubble.data;
81
+ this.theme = theme.series.bubble;
82
+ this.rect = plot;
83
+ this.activeSeriesMap = getActiveSeriesMap(legend);
84
+ this.selectable = this.getSelectableOption(options);
85
+ const xAxisTickSize = this.rect.width / xAxis.tickCount;
86
+ const yAxisTickSize = this.rect.height / yAxis.tickCount;
87
+ this.maxRadius = circleLegend.radius
88
+ ? circleLegend.radius
89
+ : Math.min(xAxisTickSize, yAxisTickSize);
90
+ this.maxValue = getMaxRadius(bubbleData);
91
+ const seriesModel = this.renderBubblePointsModel(bubbleData, scale);
92
+ const tooltipModel = this.makeTooltipModel(bubbleData);
93
+ this.models.series = seriesModel;
94
+ if (!this.drawModels) {
95
+ this.drawModels = deepCopy(this.models);
96
+ }
97
+ this.responders = seriesModel.map((m, index) => (Object.assign(Object.assign({}, m), { type: 'circle', detectionSize: 0, radius: m.radius + MINIMUM_DETECTING_AREA_RADIUS, color: getRGBA(m.color, 0.85), data: tooltipModel[index], index })));
98
+ }
99
+ renderBubblePointsModel(seriesRawData, scale) {
100
+ const xAxisLimit = scale.xAxis.limit;
101
+ const yAxisLimit = scale.yAxis.limit;
102
+ const { borderWidth, borderColor } = this.theme;
103
+ return seriesRawData.flatMap(({ data, name, color: seriesColor }, seriesIndex) => {
104
+ const circleModels = [];
105
+ const active = this.activeSeriesMap[name];
106
+ const color = getRGBA(seriesColor, active ? 0.8 : 0.1);
107
+ const nonNullData = data.filter((datum) => !isNull(datum));
108
+ nonNullData.forEach((datum) => {
109
+ const rawXValue = getCoordinateXValue(datum);
110
+ const xValue = isString(rawXValue) ? Number(new Date(rawXValue)) : Number(rawXValue);
111
+ const yValue = getCoordinateYValue(datum);
112
+ const xValueRatio = getValueRatio(xValue, xAxisLimit);
113
+ const yValueRatio = getValueRatio(yValue, yAxisLimit);
114
+ const x = xValueRatio * this.rect.width;
115
+ const y = (1 - yValueRatio) * this.rect.height;
116
+ const radius = Math.max(MINIMUM_RADIUS, (datum.r / this.maxValue) * this.maxRadius);
117
+ circleModels.push({
118
+ x,
119
+ y,
120
+ type: 'circle',
121
+ radius,
122
+ color,
123
+ style: ['default'],
124
+ seriesIndex,
125
+ name,
126
+ borderWidth,
127
+ borderColor,
128
+ });
129
+ });
130
+ return circleModels;
131
+ });
132
+ }
133
+ makeTooltipModel(circleData) {
134
+ return [...circleData].flatMap(({ data, name, color }) => {
135
+ const tooltipData = [];
136
+ const nonNullData = data.filter((datum) => !isNull(datum));
137
+ nonNullData.forEach((datum) => {
138
+ const { r, label } = datum;
139
+ tooltipData.push({
140
+ label: `${name}/${label}`,
141
+ color,
142
+ value: {
143
+ x: getCoordinateXValue(datum),
144
+ y: getCoordinateYValue(datum),
145
+ r,
146
+ },
147
+ });
148
+ });
149
+ return tooltipData;
150
+ });
151
+ }
152
+ getResponderAppliedTheme(responders, type) {
153
+ return responders.map((responder) => deepMergedCopy(responder, this.theme[type]));
154
+ }
155
+ onMousemove({ responders, mousePosition }) {
156
+ const closestResponder = getNearestResponder(responders, mousePosition, this.rect);
157
+ const responderWithTheme = this.getResponderAppliedTheme(closestResponder, 'hover');
158
+ this.eventBus.emit('renderHoveredSeries', { models: responderWithTheme, name: this.name });
159
+ this.activatedResponders = closestResponder;
160
+ this.eventBus.emit('seriesPointHovered', { models: this.activatedResponders, name: this.name });
161
+ this.eventBus.emit('needDraw');
162
+ }
163
+ onClick({ responders, mousePosition }) {
164
+ if (this.selectable) {
165
+ const closestResponder = getNearestResponder(responders, mousePosition, this.rect);
166
+ const responderWithTheme = this.getResponderAppliedTheme(closestResponder, 'select');
167
+ this.eventBus.emit('renderSelectedSeries', {
168
+ models: responderWithTheme,
169
+ name: this.name,
170
+ });
171
+ this.eventBus.emit('needDraw');
172
+ }
173
+ }
174
+ }