@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.
- package/README.md +165 -0
- package/dist/esm/animator.d.ts +32 -0
- package/dist/esm/animator.js +102 -0
- package/dist/esm/brushes/axis.d.ts +3 -0
- package/dist/esm/brushes/axis.js +21 -0
- package/dist/esm/brushes/basic.d.ts +9 -0
- package/dist/esm/brushes/basic.js +95 -0
- package/dist/esm/brushes/boxPlot.d.ts +2 -0
- package/dist/esm/brushes/boxPlot.js +22 -0
- package/dist/esm/brushes/circleLegend.d.ts +2 -0
- package/dist/esm/brushes/circleLegend.js +26 -0
- package/dist/esm/brushes/dataLabel.d.ts +6 -0
- package/dist/esm/brushes/dataLabel.js +176 -0
- package/dist/esm/brushes/exportMenu.d.ts +2 -0
- package/dist/esm/brushes/exportMenu.js +55 -0
- package/dist/esm/brushes/gauge.d.ts +2 -0
- package/dist/esm/brushes/gauge.js +39 -0
- package/dist/esm/brushes/label.d.ts +34 -0
- package/dist/esm/brushes/label.js +165 -0
- package/dist/esm/brushes/legend.d.ts +7 -0
- package/dist/esm/brushes/legend.js +162 -0
- package/dist/esm/brushes/lineSeries.d.ts +5 -0
- package/dist/esm/brushes/lineSeries.js +41 -0
- package/dist/esm/brushes/polygon.d.ts +2 -0
- package/dist/esm/brushes/polygon.js +24 -0
- package/dist/esm/brushes/resetButton.d.ts +3 -0
- package/dist/esm/brushes/resetButton.js +112 -0
- package/dist/esm/brushes/scatterSeries.d.ts +2 -0
- package/dist/esm/brushes/scatterSeries.js +125 -0
- package/dist/esm/brushes/sector.d.ts +2 -0
- package/dist/esm/brushes/sector.js +54 -0
- package/dist/esm/brushes/spectrumLegend.d.ts +14 -0
- package/dist/esm/brushes/spectrumLegend.js +199 -0
- package/dist/esm/charts/areaChart.d.ts +254 -0
- package/dist/esm/charts/areaChart.js +358 -0
- package/dist/esm/charts/barChart.d.ts +203 -0
- package/dist/esm/charts/barChart.js +300 -0
- package/dist/esm/charts/boxPlotChart.d.ts +209 -0
- package/dist/esm/charts/boxPlotChart.js +288 -0
- package/dist/esm/charts/bubbleChart.d.ts +188 -0
- package/dist/esm/charts/bubbleChart.js +263 -0
- package/dist/esm/charts/bulletChart.d.ts +199 -0
- package/dist/esm/charts/bulletChart.js +278 -0
- package/dist/esm/charts/chart.d.ts +133 -0
- package/dist/esm/charts/chart.js +484 -0
- package/dist/esm/charts/columnChart.d.ts +205 -0
- package/dist/esm/charts/columnChart.js +299 -0
- package/dist/esm/charts/columnLineChart.d.ts +271 -0
- package/dist/esm/charts/columnLineChart.js +386 -0
- package/dist/esm/charts/gaugeChart.d.ts +191 -0
- package/dist/esm/charts/gaugeChart.js +279 -0
- package/dist/esm/charts/heatmapChart.d.ts +199 -0
- package/dist/esm/charts/heatmapChart.js +292 -0
- package/dist/esm/charts/lineAreaChart.d.ts +271 -0
- package/dist/esm/charts/lineAreaChart.js +374 -0
- package/dist/esm/charts/lineChart.d.ts +253 -0
- package/dist/esm/charts/lineChart.js +360 -0
- package/dist/esm/charts/lineScatterChart.d.ts +200 -0
- package/dist/esm/charts/lineScatterChart.js +285 -0
- package/dist/esm/charts/nestedPieChart.d.ts +192 -0
- package/dist/esm/charts/nestedPieChart.js +268 -0
- package/dist/esm/charts/pieChart.d.ts +156 -0
- package/dist/esm/charts/pieChart.js +224 -0
- package/dist/esm/charts/radarChart.d.ts +169 -0
- package/dist/esm/charts/radarChart.js +240 -0
- package/dist/esm/charts/radialBarChart.d.ts +172 -0
- package/dist/esm/charts/radialBarChart.js +251 -0
- package/dist/esm/charts/scatterChart.d.ts +184 -0
- package/dist/esm/charts/scatterChart.js +279 -0
- package/dist/esm/charts/treemapChart.d.ts +166 -0
- package/dist/esm/charts/treemapChart.js +239 -0
- package/dist/esm/component/areaSeries.d.ts +96 -0
- package/dist/esm/component/areaSeries.js +474 -0
- package/dist/esm/component/axis.d.ts +40 -0
- package/dist/esm/component/axis.js +176 -0
- package/dist/esm/component/axisTitle.d.ts +25 -0
- package/dist/esm/component/axisTitle.js +67 -0
- package/dist/esm/component/axisUsingCenterY.d.ts +32 -0
- package/dist/esm/component/axisUsingCenterY.js +175 -0
- package/dist/esm/component/backButton.d.ts +13 -0
- package/dist/esm/component/backButton.js +26 -0
- package/dist/esm/component/background.d.ts +10 -0
- package/dist/esm/component/background.js +15 -0
- package/dist/esm/component/boxPlotSeries.d.ts +126 -0
- package/dist/esm/component/boxPlotSeries.js +410 -0
- package/dist/esm/component/boxSeries.d.ts +211 -0
- package/dist/esm/component/boxSeries.js +603 -0
- package/dist/esm/component/boxStackSeries.d.ts +62 -0
- package/dist/esm/component/boxStackSeries.js +447 -0
- package/dist/esm/component/bubbleSeries.d.ts +35 -0
- package/dist/esm/component/bubbleSeries.js +174 -0
- package/dist/esm/component/bulletSeries.d.ts +89 -0
- package/dist/esm/component/bulletSeries.js +392 -0
- package/dist/esm/component/circleLegend.d.ts +10 -0
- package/dist/esm/component/circleLegend.js +37 -0
- package/dist/esm/component/component.d.ts +64 -0
- package/dist/esm/component/component.js +170 -0
- package/dist/esm/component/componentManager.d.ts +23 -0
- package/dist/esm/component/componentManager.js +45 -0
- package/dist/esm/component/dataLabels.d.ts +23 -0
- package/dist/esm/component/dataLabels.js +134 -0
- package/dist/esm/component/exportMenu.d.ts +38 -0
- package/dist/esm/component/exportMenu.js +147 -0
- package/dist/esm/component/gaugeSeries.d.ts +160 -0
- package/dist/esm/component/gaugeSeries.js +447 -0
- package/dist/esm/component/heatmapSeries.d.ts +64 -0
- package/dist/esm/component/heatmapSeries.js +152 -0
- package/dist/esm/component/hoveredSeries.d.ts +27 -0
- package/dist/esm/component/hoveredSeries.js +95 -0
- package/dist/esm/component/legend.d.ts +26 -0
- package/dist/esm/component/legend.js +149 -0
- package/dist/esm/component/lineSeries.d.ts +69 -0
- package/dist/esm/component/lineSeries.js +319 -0
- package/dist/esm/component/noDataText.d.ts +9 -0
- package/dist/esm/component/noDataText.js +31 -0
- package/dist/esm/component/pieSeries.d.ts +137 -0
- package/dist/esm/component/pieSeries.js +390 -0
- package/dist/esm/component/plot.d.ts +37 -0
- package/dist/esm/component/plot.js +163 -0
- package/dist/esm/component/radarSeries.d.ts +85 -0
- package/dist/esm/component/radarSeries.js +222 -0
- package/dist/esm/component/radialAxis.d.ts +26 -0
- package/dist/esm/component/radialAxis.js +210 -0
- package/dist/esm/component/radialBarSeries.d.ts +111 -0
- package/dist/esm/component/radialBarSeries.js +349 -0
- package/dist/esm/component/radialPlot.d.ts +55 -0
- package/dist/esm/component/radialPlot.js +188 -0
- package/dist/esm/component/rangeSelection.d.ts +61 -0
- package/dist/esm/component/rangeSelection.js +150 -0
- package/dist/esm/component/resetButton.d.ts +13 -0
- package/dist/esm/component/resetButton.js +26 -0
- package/dist/esm/component/scatterSeries.d.ts +34 -0
- package/dist/esm/component/scatterSeries.js +159 -0
- package/dist/esm/component/selectedSeries.d.ts +26 -0
- package/dist/esm/component/selectedSeries.js +109 -0
- package/dist/esm/component/spectrumLegend.d.ts +15 -0
- package/dist/esm/component/spectrumLegend.js +76 -0
- package/dist/esm/component/title.d.ts +12 -0
- package/dist/esm/component/title.js +53 -0
- package/dist/esm/component/tooltip.d.ts +41 -0
- package/dist/esm/component/tooltip.js +131 -0
- package/dist/esm/component/treemapSeries.d.ts +57 -0
- package/dist/esm/component/treemapSeries.js +191 -0
- package/dist/esm/component/zeroAxis.d.ts +9 -0
- package/dist/esm/component/zeroAxis.js +49 -0
- package/dist/esm/eventEmitter.d.ts +8 -0
- package/dist/esm/eventEmitter.js +15 -0
- package/dist/esm/helpers/arrayUtil.d.ts +10 -0
- package/dist/esm/helpers/arrayUtil.js +54 -0
- package/dist/esm/helpers/axes.d.ts +67 -0
- package/dist/esm/helpers/axes.js +345 -0
- package/dist/esm/helpers/boxSeries.d.ts +5 -0
- package/dist/esm/helpers/boxSeries.js +71 -0
- package/dist/esm/helpers/calculator.d.ts +19 -0
- package/dist/esm/helpers/calculator.js +153 -0
- package/dist/esm/helpers/color.d.ts +153 -0
- package/dist/esm/helpers/color.js +218 -0
- package/dist/esm/helpers/colorSpectrum.d.ts +5 -0
- package/dist/esm/helpers/colorSpectrum.js +17 -0
- package/dist/esm/helpers/coordinate.d.ts +9 -0
- package/dist/esm/helpers/coordinate.js +51 -0
- package/dist/esm/helpers/dataLabels.d.ts +36 -0
- package/dist/esm/helpers/dataLabels.js +405 -0
- package/dist/esm/helpers/dom.d.ts +2 -0
- package/dist/esm/helpers/dom.js +8 -0
- package/dist/esm/helpers/downloader.d.ts +7 -0
- package/dist/esm/helpers/downloader.js +287 -0
- package/dist/esm/helpers/formatDate.d.ts +16 -0
- package/dist/esm/helpers/formatDate.js +140 -0
- package/dist/esm/helpers/geometric.d.ts +3 -0
- package/dist/esm/helpers/geometric.js +35 -0
- package/dist/esm/helpers/googleAnalytics.d.ts +1 -0
- package/dist/esm/helpers/googleAnalytics.js +39 -0
- package/dist/esm/helpers/htmlSanitizer.d.ts +1 -0
- package/dist/esm/helpers/htmlSanitizer.js +86 -0
- package/dist/esm/helpers/legend.d.ts +9 -0
- package/dist/esm/helpers/legend.js +47 -0
- package/dist/esm/helpers/pieSeries.d.ts +15 -0
- package/dist/esm/helpers/pieSeries.js +72 -0
- package/dist/esm/helpers/plot.d.ts +2 -0
- package/dist/esm/helpers/plot.js +4 -0
- package/dist/esm/helpers/radarSeries.d.ts +1 -0
- package/dist/esm/helpers/radarSeries.js +7 -0
- package/dist/esm/helpers/range.d.ts +6 -0
- package/dist/esm/helpers/range.js +16 -0
- package/dist/esm/helpers/responders.d.ts +37 -0
- package/dist/esm/helpers/responders.js +197 -0
- package/dist/esm/helpers/sector.d.ts +55 -0
- package/dist/esm/helpers/sector.js +117 -0
- package/dist/esm/helpers/squarifier.d.ts +8 -0
- package/dist/esm/helpers/squarifier.js +110 -0
- package/dist/esm/helpers/style.d.ts +14 -0
- package/dist/esm/helpers/style.js +48 -0
- package/dist/esm/helpers/theme.d.ts +58 -0
- package/dist/esm/helpers/theme.js +557 -0
- package/dist/esm/helpers/tooltip.d.ts +2 -0
- package/dist/esm/helpers/tooltip.js +18 -0
- package/dist/esm/helpers/tooltipTemplate.d.ts +21 -0
- package/dist/esm/helpers/tooltipTemplate.js +147 -0
- package/dist/esm/helpers/utils.d.ts +42 -0
- package/dist/esm/helpers/utils.js +268 -0
- package/dist/esm/helpers/validation.d.ts +6 -0
- package/dist/esm/helpers/validation.js +16 -0
- package/dist/esm/index.d.ts +40 -0
- package/dist/esm/index.js +75 -0
- package/dist/esm/message.d.ts +11 -0
- package/dist/esm/message.js +11 -0
- package/dist/esm/painter.d.ts +27 -0
- package/dist/esm/painter.js +88 -0
- package/dist/esm/responderDetectors.d.ts +6 -0
- package/dist/esm/responderDetectors.js +124 -0
- package/dist/esm/scale/coordinateScaleCalculator.d.ts +24 -0
- package/dist/esm/scale/coordinateScaleCalculator.js +174 -0
- package/dist/esm/scale/datetimeScaleCalculator.d.ts +20 -0
- package/dist/esm/scale/datetimeScaleCalculator.js +59 -0
- package/dist/esm/store/axes.d.ts +30 -0
- package/dist/esm/store/axes.js +282 -0
- package/dist/esm/store/category.d.ts +4 -0
- package/dist/esm/store/category.js +73 -0
- package/dist/esm/store/colorValueScale.d.ts +3 -0
- package/dist/esm/store/colorValueScale.js +56 -0
- package/dist/esm/store/dataRange.d.ts +4 -0
- package/dist/esm/store/dataRange.js +170 -0
- package/dist/esm/store/gaugeAxes.d.ts +4 -0
- package/dist/esm/store/gaugeAxes.js +175 -0
- package/dist/esm/store/heatmapAxes.d.ts +3 -0
- package/dist/esm/store/heatmapAxes.js +98 -0
- package/dist/esm/store/heatmapSeriesData.d.ts +3 -0
- package/dist/esm/store/heatmapSeriesData.js +34 -0
- package/dist/esm/store/layout.d.ts +12 -0
- package/dist/esm/store/layout.js +487 -0
- package/dist/esm/store/legend.d.ts +3 -0
- package/dist/esm/store/legend.js +435 -0
- package/dist/esm/store/nestedPieSeriesData.d.ts +3 -0
- package/dist/esm/store/nestedPieSeriesData.js +49 -0
- package/dist/esm/store/options.d.ts +3 -0
- package/dist/esm/store/options.js +62 -0
- package/dist/esm/store/plot.d.ts +3 -0
- package/dist/esm/store/plot.js +102 -0
- package/dist/esm/store/radialAxes.d.ts +8 -0
- package/dist/esm/store/radialAxes.js +199 -0
- package/dist/esm/store/reactive.d.ts +11 -0
- package/dist/esm/store/reactive.js +196 -0
- package/dist/esm/store/root.d.ts +3 -0
- package/dist/esm/store/root.js +46 -0
- package/dist/esm/store/scale.d.ts +3 -0
- package/dist/esm/store/scale.js +102 -0
- package/dist/esm/store/seriesData.d.ts +3 -0
- package/dist/esm/store/seriesData.js +299 -0
- package/dist/esm/store/stackSeriesData.d.ts +8 -0
- package/dist/esm/store/stackSeriesData.js +192 -0
- package/dist/esm/store/store.d.ts +20 -0
- package/dist/esm/store/store.js +112 -0
- package/dist/esm/store/theme.d.ts +3 -0
- package/dist/esm/store/theme.js +139 -0
- package/dist/esm/store/treemapSeriesData.d.ts +4 -0
- package/dist/esm/store/treemapSeriesData.js +93 -0
- package/dist/td-chart.css +127 -0
- package/dist/td-chart.js +41463 -0
- package/dist/td-chart.min.css +6 -0
- package/dist/td-chart.min.js +9 -0
- package/package.json +112 -0
- package/types/brushes.d.ts +30 -0
- package/types/charts.d.ts +152 -0
- package/types/components/axis.d.ts +71 -0
- package/types/components/circleLegend.d.ts +9 -0
- package/types/components/dataLabels.d.ts +119 -0
- package/types/components/exportMenu.d.ts +14 -0
- package/types/components/legend.d.ts +27 -0
- package/types/components/plot.d.ts +8 -0
- package/types/components/radialAxis.d.ts +22 -0
- package/types/components/radialPlot.d.ts +11 -0
- package/types/components/rangeSelection.d.ts +3 -0
- package/types/components/resetButton.d.ts +13 -0
- package/types/components/series.d.ts +386 -0
- package/types/components/spectrumLegend.d.ts +25 -0
- package/types/components/tooltip.d.ts +58 -0
- package/types/components/zoom.d.ts +3 -0
- package/types/eventEmitter.d.ts +12 -0
- package/types/index.d.ts +615 -0
- package/types/options.d.ts +833 -0
- package/types/resizeObserver.d.ts +54 -0
- package/types/store/store.d.ts +564 -0
- package/types/theme.d.ts +670 -0
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { getFirstValidValue, includes, isNumber } from "../helpers/utils";
|
|
2
|
+
import { setSplineControlPoint } from "../helpers/calculator";
|
|
3
|
+
import { isSameArray } from "../helpers/arrayUtil";
|
|
4
|
+
export default class Component {
|
|
5
|
+
constructor({ store, eventBus }) {
|
|
6
|
+
this.name = 'Component';
|
|
7
|
+
this.type = 'component';
|
|
8
|
+
this.rect = {
|
|
9
|
+
x: 0,
|
|
10
|
+
y: 0,
|
|
11
|
+
height: 0,
|
|
12
|
+
width: 0,
|
|
13
|
+
};
|
|
14
|
+
this.isShow = true;
|
|
15
|
+
this.store = store;
|
|
16
|
+
this.eventBus = eventBus;
|
|
17
|
+
}
|
|
18
|
+
update(delta) {
|
|
19
|
+
if (!this.drawModels) {
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (Array.isArray(this.models)) {
|
|
23
|
+
this.updateModels(this.drawModels, this.models, delta);
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
Object.keys(this.models).forEach((type) => {
|
|
27
|
+
const currentModels = this.drawModels[type];
|
|
28
|
+
const targetModels = this.models[type];
|
|
29
|
+
this.updateModels(currentModels, targetModels, delta);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
initUpdate(delta) {
|
|
34
|
+
this.update(delta);
|
|
35
|
+
}
|
|
36
|
+
updateModels(currentModels, targetModels, delta) {
|
|
37
|
+
currentModels.forEach((current, index) => {
|
|
38
|
+
const target = targetModels[index];
|
|
39
|
+
Object.keys(current).forEach((key) => {
|
|
40
|
+
var _a;
|
|
41
|
+
if (!current || !target) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
if (key[0] !== '_') {
|
|
45
|
+
if (isNumber(current[key])) {
|
|
46
|
+
current[key] = current[key] + (target[key] - current[key]) * delta;
|
|
47
|
+
}
|
|
48
|
+
else if (key === 'points') {
|
|
49
|
+
const matchedModel = this.getCurrentModelToMatchTargetModel(current[key], current[key], target[key]);
|
|
50
|
+
const newPoints = matchedModel.map((curPoint, idx) => {
|
|
51
|
+
const next = target[key][idx];
|
|
52
|
+
if (curPoint && next) {
|
|
53
|
+
const { x, y } = curPoint;
|
|
54
|
+
const { x: nextX, y: nextY } = next;
|
|
55
|
+
return Object.assign(Object.assign({}, next), { x: x + (nextX - x) * delta, y: y + (nextY - y) * delta });
|
|
56
|
+
}
|
|
57
|
+
return next;
|
|
58
|
+
});
|
|
59
|
+
if ((_a = this.store.state.options.series) === null || _a === void 0 ? void 0 : _a.spline) {
|
|
60
|
+
setSplineControlPoint(newPoints);
|
|
61
|
+
}
|
|
62
|
+
current[key] = newPoints;
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
current[key] = target[key];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
sync() {
|
|
72
|
+
if (!this.drawModels) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (Array.isArray(this.models)) {
|
|
76
|
+
this.syncModels(this.drawModels, this.models);
|
|
77
|
+
}
|
|
78
|
+
else if (!Object.keys(this.models).length) {
|
|
79
|
+
this.drawModels = this.models;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
Object.keys(this.models).forEach((type) => {
|
|
83
|
+
const currentModels = this.drawModels[type];
|
|
84
|
+
const targetModels = this.models[type];
|
|
85
|
+
this.syncModels(currentModels, targetModels, type);
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
getCurrentModelToMatchTargetModel(models, currentModels, targetModels) {
|
|
90
|
+
var _a;
|
|
91
|
+
if (!models || !currentModels) {
|
|
92
|
+
return [...targetModels];
|
|
93
|
+
}
|
|
94
|
+
if ((_a = getFirstValidValue(targetModels)) === null || _a === void 0 ? void 0 : _a.name) {
|
|
95
|
+
const modelNames = [...new Set(models.map(({ name }) => name))];
|
|
96
|
+
const targetNames = [...new Set(targetModels.map(({ name }) => name))];
|
|
97
|
+
const same = isSameArray(modelNames, targetNames);
|
|
98
|
+
if (!same) {
|
|
99
|
+
return this.getCurrentModelWithDifferentModel(models, currentModels, targetModels, modelNames, targetNames);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const currentLength = currentModels.length;
|
|
103
|
+
const targetLength = targetModels.length;
|
|
104
|
+
if (currentLength < targetLength) {
|
|
105
|
+
return [...currentModels, ...targetModels.slice(currentLength, targetLength)];
|
|
106
|
+
}
|
|
107
|
+
if (currentLength > targetLength) {
|
|
108
|
+
return currentModels.slice(0, targetLength);
|
|
109
|
+
}
|
|
110
|
+
return models;
|
|
111
|
+
}
|
|
112
|
+
getCurrentModelWithDifferentModel(models, currentModels, targetModels, modelNames, targetNames) {
|
|
113
|
+
const currentLength = currentModels.length;
|
|
114
|
+
const targetLength = targetModels.length;
|
|
115
|
+
if (currentLength > targetLength) {
|
|
116
|
+
const newModels = models.filter(({ name }) => includes(targetNames, name));
|
|
117
|
+
return newModels.length !== targetModels.length ? targetModels : newModels;
|
|
118
|
+
}
|
|
119
|
+
if (currentLength < targetLength) {
|
|
120
|
+
const notIncludedModels = targetModels.reduce((acc, cur, idx) => {
|
|
121
|
+
const notIncluded = !includes(modelNames, cur.name);
|
|
122
|
+
return notIncluded
|
|
123
|
+
? {
|
|
124
|
+
models: [...acc.models, cur],
|
|
125
|
+
modelIdx: [...acc.modelIdx, idx],
|
|
126
|
+
}
|
|
127
|
+
: acc;
|
|
128
|
+
}, { models: [], modelIdx: [] });
|
|
129
|
+
if (models.length + notIncludedModels.models.length === targetLength) {
|
|
130
|
+
const newModels = [...models];
|
|
131
|
+
notIncludedModels.models.forEach((model, idx) => {
|
|
132
|
+
newModels.splice(notIncludedModels.modelIdx[idx], 0, model);
|
|
133
|
+
});
|
|
134
|
+
return newModels;
|
|
135
|
+
}
|
|
136
|
+
return targetModels;
|
|
137
|
+
}
|
|
138
|
+
return models;
|
|
139
|
+
}
|
|
140
|
+
syncModels(currentModels, targetModels, type) {
|
|
141
|
+
const drawModels = type ? this.drawModels[type] : this.drawModels;
|
|
142
|
+
const model = this.getCurrentModelToMatchTargetModel(drawModels, currentModels, targetModels);
|
|
143
|
+
if (type) {
|
|
144
|
+
this.drawModels[type] = model;
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
this.drawModels = model;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
getSelectableOption(options) {
|
|
151
|
+
var _a, _b, _c;
|
|
152
|
+
return _c = (_b = (_a = options) === null || _a === void 0 ? void 0 : _a.series) === null || _b === void 0 ? void 0 : _b.selectable, (_c !== null && _c !== void 0 ? _c : false);
|
|
153
|
+
}
|
|
154
|
+
renderDataLabels(data, name) {
|
|
155
|
+
setTimeout(() => {
|
|
156
|
+
this.eventBus.emit('renderDataLabels', { data, name: (name !== null && name !== void 0 ? name : this.name) });
|
|
157
|
+
}, 0);
|
|
158
|
+
}
|
|
159
|
+
draw(painter) {
|
|
160
|
+
const models = this.drawModels ? this.drawModels : this.models;
|
|
161
|
+
if (Array.isArray(models)) {
|
|
162
|
+
painter.paintForEach(models);
|
|
163
|
+
}
|
|
164
|
+
else if (models) {
|
|
165
|
+
Object.keys(models).forEach((item) => {
|
|
166
|
+
painter.paintForEach(models[item]);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { FunctionPropertyNames } from "../../types/store/store";
|
|
2
|
+
import Store from "../store/store";
|
|
3
|
+
import EventEmitter from "../eventEmitter";
|
|
4
|
+
import Component from "./component";
|
|
5
|
+
declare type ComponentConstructor<T> = new ({ store, eventBus, }: {
|
|
6
|
+
store: Store<T>;
|
|
7
|
+
eventBus: EventEmitter;
|
|
8
|
+
}) => Component;
|
|
9
|
+
export default class ComponentManager<T> {
|
|
10
|
+
components: Component[];
|
|
11
|
+
store: Store<T>;
|
|
12
|
+
eventBus: EventEmitter;
|
|
13
|
+
constructor({ store, eventBus }: {
|
|
14
|
+
store: Store<T>;
|
|
15
|
+
eventBus: EventEmitter;
|
|
16
|
+
});
|
|
17
|
+
add(ComponentCtor: ComponentConstructor<T>, initialParam?: any): void;
|
|
18
|
+
remove(ComponentCtor: ComponentConstructor<T>): void;
|
|
19
|
+
clear(): void;
|
|
20
|
+
invoke(method: FunctionPropertyNames<Component>, params: any): void;
|
|
21
|
+
forEach(iteratee: (component: Component, index: number) => void): void;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { debounce } from "../helpers/utils";
|
|
2
|
+
export default class ComponentManager {
|
|
3
|
+
constructor({ store, eventBus }) {
|
|
4
|
+
this.components = [];
|
|
5
|
+
this.store = store;
|
|
6
|
+
this.eventBus = eventBus;
|
|
7
|
+
}
|
|
8
|
+
add(ComponentCtor, initialParam) {
|
|
9
|
+
const component = new ComponentCtor({
|
|
10
|
+
store: this.store,
|
|
11
|
+
eventBus: this.eventBus,
|
|
12
|
+
});
|
|
13
|
+
if (component.initialize) {
|
|
14
|
+
component.initialize(initialParam);
|
|
15
|
+
}
|
|
16
|
+
let proc = (...args) => {
|
|
17
|
+
component.render(args[0], args[1]); // rest쓰면 에러남
|
|
18
|
+
component.sync();
|
|
19
|
+
this.eventBus.emit('needLoop');
|
|
20
|
+
};
|
|
21
|
+
this.store.observe((...args) => {
|
|
22
|
+
proc(...args);
|
|
23
|
+
});
|
|
24
|
+
proc = debounce(proc);
|
|
25
|
+
this.components.push(component);
|
|
26
|
+
}
|
|
27
|
+
remove(ComponentCtor) {
|
|
28
|
+
this.components = this.components.filter((component) => !(component instanceof ComponentCtor));
|
|
29
|
+
}
|
|
30
|
+
clear() {
|
|
31
|
+
this.components = [];
|
|
32
|
+
this.eventBus.emit('needDraw');
|
|
33
|
+
}
|
|
34
|
+
invoke(method, params) {
|
|
35
|
+
this.components.forEach((component) => {
|
|
36
|
+
const fn = component[method];
|
|
37
|
+
if (fn) {
|
|
38
|
+
fn.call(component, params);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
forEach(iteratee) {
|
|
43
|
+
this.components.forEach(iteratee);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import Component from "./component";
|
|
2
|
+
import { ChartState, Options, OptionsWithDataLabels, Series, NestedPieSeriesDataType } from "../../types/store/store";
|
|
3
|
+
import { DataLabelModels, DataLabel, DataLabelsMap, SeriesDataLabels, DataLabelSeriesType } from "../../types/components/dataLabels";
|
|
4
|
+
declare type SeriesDataLabel = {
|
|
5
|
+
data: SeriesDataLabels;
|
|
6
|
+
name: DataLabelSeriesType;
|
|
7
|
+
};
|
|
8
|
+
export default class DataLabels extends Component {
|
|
9
|
+
models: DataLabelModels;
|
|
10
|
+
drawModels: DataLabelModels;
|
|
11
|
+
options: OptionsWithDataLabels;
|
|
12
|
+
dataLabelsMap: DataLabelsMap;
|
|
13
|
+
initialize(): void;
|
|
14
|
+
initUpdate(delta: number): void;
|
|
15
|
+
render({ layout, options, series, nestedPieSeries }: ChartState<Options>): void;
|
|
16
|
+
visibleDataLabels(series: Series, nestedPieSeries?: Record<string, NestedPieSeriesDataType>): boolean;
|
|
17
|
+
renderSeriesDataLabels: (seriesDataLabel: SeriesDataLabel) => void;
|
|
18
|
+
appendDataLabels({ name, data }: SeriesDataLabel): void;
|
|
19
|
+
private getDrawModelsAppliedOpacity;
|
|
20
|
+
renderLabelModel(): DataLabelModels;
|
|
21
|
+
makeLabelModel(dataLabels: DataLabel[]): DataLabelModels;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import Component from "./component";
|
|
2
|
+
import { isUndefined } from "../helpers/utils";
|
|
3
|
+
import { isModelExistingInRect } from "../helpers/coordinate";
|
|
4
|
+
import { getDataLabelsOptions, getDefaultDataLabelsOptions, makePointLabelInfo, makeSectorLabelInfo, makePieSeriesNameLabelInfo, makeRectLabelInfo, makeLineLabelInfo, makeSectorBarLabelInfo, } from "../helpers/dataLabels";
|
|
5
|
+
import { pickStackOption } from "../store/stackSeriesData";
|
|
6
|
+
function getLabelInfo(model, labelOptions, rect, name) {
|
|
7
|
+
var _a;
|
|
8
|
+
const { type } = model;
|
|
9
|
+
const dataLabel = [];
|
|
10
|
+
if (type === 'point') {
|
|
11
|
+
dataLabel.push(makePointLabelInfo(model, labelOptions, rect));
|
|
12
|
+
}
|
|
13
|
+
else if (type === 'sector') {
|
|
14
|
+
if (name === 'radialBar') {
|
|
15
|
+
dataLabel.push(makeSectorBarLabelInfo(model, labelOptions));
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
dataLabel.push(makeSectorLabelInfo(model, labelOptions));
|
|
19
|
+
if ((_a = labelOptions.pieSeriesName) === null || _a === void 0 ? void 0 : _a.visible) {
|
|
20
|
+
const seriesNameLabel = makePieSeriesNameLabelInfo(model, labelOptions);
|
|
21
|
+
dataLabel.push(seriesNameLabel);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else if (type === 'line') {
|
|
26
|
+
dataLabel.push(makeLineLabelInfo(model, labelOptions));
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
dataLabel.push(makeRectLabelInfo(model, labelOptions));
|
|
30
|
+
}
|
|
31
|
+
return dataLabel;
|
|
32
|
+
}
|
|
33
|
+
export default class DataLabels extends Component {
|
|
34
|
+
constructor() {
|
|
35
|
+
super(...arguments);
|
|
36
|
+
this.dataLabelsMap = {};
|
|
37
|
+
this.renderSeriesDataLabels = (seriesDataLabel) => {
|
|
38
|
+
this.appendDataLabels(seriesDataLabel);
|
|
39
|
+
this.models = this.renderLabelModel();
|
|
40
|
+
if (!this.drawModels) {
|
|
41
|
+
this.drawModels = this.getDrawModelsAppliedOpacity(0);
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this.sync();
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
initialize() {
|
|
49
|
+
this.type = 'dataLabels';
|
|
50
|
+
this.name = 'dataLabels';
|
|
51
|
+
this.eventBus.on('renderDataLabels', this.renderSeriesDataLabels);
|
|
52
|
+
}
|
|
53
|
+
initUpdate(delta) {
|
|
54
|
+
if (!this.drawModels) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
this.drawModels = this.getDrawModelsAppliedOpacity(delta);
|
|
58
|
+
}
|
|
59
|
+
render({ layout, options, series, nestedPieSeries }) {
|
|
60
|
+
this.rect = layout.plot;
|
|
61
|
+
this.options = options;
|
|
62
|
+
this.isShow = this.visibleDataLabels(series, nestedPieSeries);
|
|
63
|
+
}
|
|
64
|
+
visibleDataLabels(series, nestedPieSeries) {
|
|
65
|
+
var _a, _b;
|
|
66
|
+
const visibleCommonSeriesDataLabels = !!((_b = (_a = this.options.series) === null || _a === void 0 ? void 0 : _a.dataLabels) === null || _b === void 0 ? void 0 : _b.visible);
|
|
67
|
+
const visibleComboSeriesDataLabels = Object.keys(series).some((seriesName) => { var _a, _b, _c; return !!((_c = (_b = (_a = this.options.series) === null || _a === void 0 ? void 0 : _a[seriesName]) === null || _b === void 0 ? void 0 : _b.dataLabels) === null || _c === void 0 ? void 0 : _c.visible); });
|
|
68
|
+
const visibleNestedPieSeriesDataLabels = !!(nestedPieSeries &&
|
|
69
|
+
Object.keys(nestedPieSeries).some((alias) => {
|
|
70
|
+
var _a, _b, _c;
|
|
71
|
+
return !!((_c = (_b = (_a = this.options.series) === null || _a === void 0 ? void 0 : _a[alias]) === null || _b === void 0 ? void 0 : _b.dataLabels) === null || _c === void 0 ? void 0 : _c.visible);
|
|
72
|
+
}));
|
|
73
|
+
return (visibleCommonSeriesDataLabels ||
|
|
74
|
+
visibleComboSeriesDataLabels ||
|
|
75
|
+
visibleNestedPieSeriesDataLabels);
|
|
76
|
+
}
|
|
77
|
+
appendDataLabels({ name, data }) {
|
|
78
|
+
const dataLabelOptions = getDataLabelsOptions(this.options, name);
|
|
79
|
+
const withStack = !!pickStackOption(this.options);
|
|
80
|
+
const labels = [];
|
|
81
|
+
data.forEach((model) => {
|
|
82
|
+
var _a;
|
|
83
|
+
const { type, value } = model;
|
|
84
|
+
const labelOptions = getDefaultDataLabelsOptions(dataLabelOptions, type, withStack);
|
|
85
|
+
const disableStackTotal = type === 'stackTotal' && !((_a = labelOptions.stackTotal) === null || _a === void 0 ? void 0 : _a.visible);
|
|
86
|
+
if (disableStackTotal || isUndefined(value)) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
labels.splice(labels.length, 0, ...getLabelInfo(model, labelOptions, this.rect, name));
|
|
90
|
+
});
|
|
91
|
+
this.dataLabelsMap[name] = { data: labels, options: dataLabelOptions };
|
|
92
|
+
}
|
|
93
|
+
getDrawModelsAppliedOpacity(opacity) {
|
|
94
|
+
return Object.keys(this.models).reduce((acc, key) => (Object.assign(Object.assign({}, acc), { [key]: this.models[key].map((m) => (Object.assign(Object.assign({}, m), { opacity }))) })), { series: [], total: [] });
|
|
95
|
+
}
|
|
96
|
+
renderLabelModel() {
|
|
97
|
+
return Object.keys(this.dataLabelsMap)
|
|
98
|
+
.map((seriesName) => {
|
|
99
|
+
const { data } = this.dataLabelsMap[seriesName];
|
|
100
|
+
return this.makeLabelModel(data);
|
|
101
|
+
})
|
|
102
|
+
.reduce((acc, cur) => ({
|
|
103
|
+
series: [...acc.series, ...cur.series],
|
|
104
|
+
total: [...acc.total, ...cur.total],
|
|
105
|
+
}), { series: [], total: [] });
|
|
106
|
+
}
|
|
107
|
+
makeLabelModel(dataLabels) {
|
|
108
|
+
return dataLabels.reduce((acc, dataLabel) => {
|
|
109
|
+
var _a;
|
|
110
|
+
const { type, x, y, text, textAlign, textBaseline, name, callout, theme, radian, } = dataLabel;
|
|
111
|
+
if (!isModelExistingInRect(this.rect, { x, y })) {
|
|
112
|
+
return acc;
|
|
113
|
+
}
|
|
114
|
+
const modelName = type === 'stackTotal' ? 'total' : 'series';
|
|
115
|
+
return Object.assign(Object.assign({}, acc), { [modelName]: [
|
|
116
|
+
...(_a = acc[modelName], (_a !== null && _a !== void 0 ? _a : [])),
|
|
117
|
+
{
|
|
118
|
+
type: 'dataLabel',
|
|
119
|
+
dataLabelType: type,
|
|
120
|
+
text,
|
|
121
|
+
x,
|
|
122
|
+
y,
|
|
123
|
+
textAlign,
|
|
124
|
+
textBaseline,
|
|
125
|
+
opacity: 1,
|
|
126
|
+
name,
|
|
127
|
+
callout,
|
|
128
|
+
theme,
|
|
129
|
+
radian,
|
|
130
|
+
},
|
|
131
|
+
] });
|
|
132
|
+
}, { series: [], total: [] });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import Component from "./component";
|
|
2
|
+
import { Categories, ChartState, Options, Series } from "../../types/store/store";
|
|
3
|
+
import { ExportMenuModels } from "../../types/components/exportMenu";
|
|
4
|
+
import { TitleOption } from "../../types/options";
|
|
5
|
+
import { RectResponderModel } from "../../types/components/series";
|
|
6
|
+
import { ExportMenuTheme } from "../../types/theme";
|
|
7
|
+
export declare const BUTTON_RECT_SIZE = 24;
|
|
8
|
+
export interface DataToExport {
|
|
9
|
+
series: Series;
|
|
10
|
+
categories?: Categories;
|
|
11
|
+
}
|
|
12
|
+
export default class ExportMenu extends Component {
|
|
13
|
+
responders: RectResponderModel[];
|
|
14
|
+
models: ExportMenuModels;
|
|
15
|
+
opened: boolean;
|
|
16
|
+
fileName: string;
|
|
17
|
+
data: DataToExport;
|
|
18
|
+
chartEl: HTMLDivElement;
|
|
19
|
+
exportMenuEl: HTMLDivElement;
|
|
20
|
+
theme: Required<ExportMenuTheme>;
|
|
21
|
+
chartBackgroundColor: string;
|
|
22
|
+
chartWidth: number;
|
|
23
|
+
toggleExportMenu: () => void;
|
|
24
|
+
getCanvasExportBtnRemoved: () => HTMLCanvasElement;
|
|
25
|
+
onClickExportButton: (ev: any) => void;
|
|
26
|
+
applyExportButtonPanelStyle(): void;
|
|
27
|
+
makeExportMenuButton(): HTMLDivElement;
|
|
28
|
+
initialize({ chartEl }: {
|
|
29
|
+
chartEl: any;
|
|
30
|
+
}): void;
|
|
31
|
+
onClick({ responders }: {
|
|
32
|
+
responders: RectResponderModel[];
|
|
33
|
+
}): void;
|
|
34
|
+
getFileName(title?: string | TitleOption): string;
|
|
35
|
+
render({ options, layout, chart, series, rawCategories, theme }: ChartState<Options>): void;
|
|
36
|
+
applyPanelWrapperStyle(): void;
|
|
37
|
+
makePanelStyle(type: 'header' | 'body'): string;
|
|
38
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import Component from "./component";
|
|
2
|
+
import { isExportMenuVisible, padding } from "../store/layout";
|
|
3
|
+
import { execDownload, downloadSpreadSheet } from "../helpers/downloader";
|
|
4
|
+
import { isString } from "../helpers/utils";
|
|
5
|
+
import { getFontStyleString, getTranslateString } from "../helpers/style";
|
|
6
|
+
const EXPORT_MENU_WIDTH = 140;
|
|
7
|
+
const exportExtensions = {
|
|
8
|
+
IMAGES: ['png', 'jpeg'],
|
|
9
|
+
SPREAD_SHEETS: ['xls', 'csv'],
|
|
10
|
+
};
|
|
11
|
+
export const BUTTON_RECT_SIZE = 24;
|
|
12
|
+
export default class ExportMenu extends Component {
|
|
13
|
+
constructor() {
|
|
14
|
+
super(...arguments);
|
|
15
|
+
this.models = { exportMenuButton: [] };
|
|
16
|
+
this.opened = false;
|
|
17
|
+
this.chartWidth = 0;
|
|
18
|
+
this.toggleExportMenu = () => {
|
|
19
|
+
this.opened = !this.opened;
|
|
20
|
+
this.models.exportMenuButton[0].opened = this.opened;
|
|
21
|
+
this.eventBus.emit('needDraw');
|
|
22
|
+
if (this.opened) {
|
|
23
|
+
this.applyPanelWrapperStyle();
|
|
24
|
+
this.chartEl.appendChild(this.exportMenuEl);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
this.chartEl.removeChild(this.exportMenuEl);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
this.getCanvasExportBtnRemoved = () => {
|
|
31
|
+
const canvas = this.chartEl.getElementsByTagName('canvas')[0];
|
|
32
|
+
const ctx = canvas.getContext('2d');
|
|
33
|
+
const { x, y, height: h, width: w } = this.rect;
|
|
34
|
+
ctx.clearRect(x, y, w, h);
|
|
35
|
+
ctx.fillStyle = this.chartBackgroundColor;
|
|
36
|
+
ctx.fillRect(x, y, w, h);
|
|
37
|
+
return canvas;
|
|
38
|
+
};
|
|
39
|
+
this.onClickExportButton = (ev) => {
|
|
40
|
+
const { id } = ev.target;
|
|
41
|
+
const isImageExtension = exportExtensions.IMAGES.includes(id);
|
|
42
|
+
const isSpreadSheetExtension = exportExtensions.SPREAD_SHEETS.includes(id);
|
|
43
|
+
if (isImageExtension) {
|
|
44
|
+
const canvas = this.getCanvasExportBtnRemoved();
|
|
45
|
+
execDownload(this.fileName, id, canvas.toDataURL(`image/${id}`, 1));
|
|
46
|
+
}
|
|
47
|
+
else if (isSpreadSheetExtension) {
|
|
48
|
+
downloadSpreadSheet(this.fileName, id, this.data);
|
|
49
|
+
}
|
|
50
|
+
if (isImageExtension || isSpreadSheetExtension) {
|
|
51
|
+
this.toggleExportMenu();
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
applyExportButtonPanelStyle() {
|
|
56
|
+
const exportMenuTitle = this.exportMenuEl.querySelector('.td-chart-export-menu-title');
|
|
57
|
+
const menuBtnWrapper = this.exportMenuEl.querySelector('.td-chart-export-menu-btn-wrapper');
|
|
58
|
+
exportMenuTitle.setAttribute('style', this.makePanelStyle('header'));
|
|
59
|
+
menuBtnWrapper.setAttribute('style', this.makePanelStyle('body'));
|
|
60
|
+
}
|
|
61
|
+
makeExportMenuButton() {
|
|
62
|
+
const el = document.createElement('div');
|
|
63
|
+
el.onclick = this.onClickExportButton;
|
|
64
|
+
el.innerHTML = `
|
|
65
|
+
<div class="td-chart-export-menu">
|
|
66
|
+
<p class="td-chart-export-menu-title">Export to</p>
|
|
67
|
+
<div class="td-chart-export-menu-btn-wrapper">
|
|
68
|
+
<button class="td-chart-export-menu-btn" id="xls">xls</button>
|
|
69
|
+
<button class="td-chart-export-menu-btn" id="csv">csv</button>
|
|
70
|
+
<button class="td-chart-export-menu-btn" id="png">png</button>
|
|
71
|
+
<button class="td-chart-export-menu-btn" id="jpeg">jpeg</button>
|
|
72
|
+
</div>
|
|
73
|
+
</div>
|
|
74
|
+
`;
|
|
75
|
+
return el;
|
|
76
|
+
}
|
|
77
|
+
initialize({ chartEl }) {
|
|
78
|
+
this.chartEl = chartEl;
|
|
79
|
+
this.type = 'exportMenu';
|
|
80
|
+
this.name = 'exportMenu';
|
|
81
|
+
this.exportMenuEl = this.makeExportMenuButton();
|
|
82
|
+
}
|
|
83
|
+
onClick({ responders }) {
|
|
84
|
+
if (responders.length) {
|
|
85
|
+
this.toggleExportMenu();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
getFileName(title) {
|
|
89
|
+
var _a, _b;
|
|
90
|
+
return isString(title) ? title : (_b = (_a = title) === null || _a === void 0 ? void 0 : _a.text, (_b !== null && _b !== void 0 ? _b : 'toast-ui-chart'));
|
|
91
|
+
}
|
|
92
|
+
render({ options, layout, chart, series, rawCategories, theme }) {
|
|
93
|
+
var _a, _b;
|
|
94
|
+
this.isShow = isExportMenuVisible(options);
|
|
95
|
+
this.chartWidth = chart.width;
|
|
96
|
+
if (!this.isShow) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
this.chartBackgroundColor = theme.chart.backgroundColor;
|
|
100
|
+
this.theme = theme.exportMenu;
|
|
101
|
+
this.data = { series, categories: rawCategories };
|
|
102
|
+
this.fileName = this.getFileName(((_b = (_a = options) === null || _a === void 0 ? void 0 : _a.exportMenu) === null || _b === void 0 ? void 0 : _b.filename) || chart.title);
|
|
103
|
+
this.applyExportButtonPanelStyle();
|
|
104
|
+
this.rect = layout.exportMenu;
|
|
105
|
+
this.models.exportMenuButton = [
|
|
106
|
+
{
|
|
107
|
+
type: 'exportMenuButton',
|
|
108
|
+
x: 0,
|
|
109
|
+
y: 0,
|
|
110
|
+
opened: this.opened,
|
|
111
|
+
theme: this.theme.button,
|
|
112
|
+
},
|
|
113
|
+
];
|
|
114
|
+
this.responders = [
|
|
115
|
+
{
|
|
116
|
+
type: 'rect',
|
|
117
|
+
width: BUTTON_RECT_SIZE,
|
|
118
|
+
height: BUTTON_RECT_SIZE,
|
|
119
|
+
x: 0,
|
|
120
|
+
y: 0,
|
|
121
|
+
},
|
|
122
|
+
];
|
|
123
|
+
}
|
|
124
|
+
applyPanelWrapperStyle() {
|
|
125
|
+
const exportMenu = this.exportMenuEl.querySelector('.td-chart-export-menu');
|
|
126
|
+
const x = this.chartWidth - EXPORT_MENU_WIDTH - padding.X;
|
|
127
|
+
const y = padding.Y + BUTTON_RECT_SIZE + 5;
|
|
128
|
+
const { borderRadius, borderWidth, borderColor } = this.theme.panel;
|
|
129
|
+
const style = `
|
|
130
|
+
transform: ${getTranslateString(x, y)};
|
|
131
|
+
border: ${borderWidth}px solid ${borderColor};
|
|
132
|
+
border-radius: ${borderRadius}px;`;
|
|
133
|
+
exportMenu.setAttribute('style', style);
|
|
134
|
+
}
|
|
135
|
+
makePanelStyle(type) {
|
|
136
|
+
const sectionTheme = this.theme.panel[type];
|
|
137
|
+
const direction = type === 'header' ? 'top' : 'bottom';
|
|
138
|
+
const { borderRadius, borderWidth } = this.theme.panel;
|
|
139
|
+
const borderRadiusPx = `${borderRadius - borderWidth}px`;
|
|
140
|
+
return [
|
|
141
|
+
`${getFontStyleString(sectionTheme)}`,
|
|
142
|
+
`border-${direction}-left-radius: ${borderRadiusPx};`,
|
|
143
|
+
`border-${direction}-right-radius: ${borderRadiusPx};`,
|
|
144
|
+
`background-color: ${sectionTheme.backgroundColor};`,
|
|
145
|
+
].join('');
|
|
146
|
+
}
|
|
147
|
+
}
|