evui 2.1.0 → 2.1.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/dist/{adac9fa4f723f9d2cb5b6640517114a9.png → 0b8d1200e71cae8d747dce4e69c4efb6.png} +0 -0
- package/dist/1.css +4 -0
- package/dist/1.css.map +1 -0
- package/dist/1.evui.min.js +2 -0
- package/dist/1.evui.min.js.map +1 -0
- package/dist/1ba679c05036b34bf359aa2e6c450faa.ttf +0 -0
- package/dist/2.css +4 -0
- package/dist/2.css.map +1 -0
- package/dist/2.evui.min.js +2 -0
- package/dist/2.evui.min.js.map +1 -0
- package/dist/{e8c322de9658cbeb8a774b6624167c2c.woff2 → 278156e41e0ad908cf7f841b17130502.woff2} +0 -0
- package/dist/3.evui.min.js +2 -0
- package/dist/3.evui.min.js.map +1 -0
- package/dist/32be89b11725274cd3e801192ba88361.ttf +0 -0
- package/dist/{0ab54153eeeca0ce03978cc463b257f7.woff2 → 38c6d8bab26db77d8c806813e1497763.woff2} +0 -0
- package/dist/4.evui.min.js +2 -0
- package/dist/4.evui.min.js.map +1 -0
- package/dist/{faff92145777a3cbaf8e7367b4807987.woff → 425399f81e4ce7cbd967685402ba0260.woff} +0 -0
- package/dist/4730076470a665bbc7b783c56d29a72e.svg +261 -0
- package/dist/52e9a7f6ff3af5ad261e5292d07ebdca.eot +0 -0
- package/dist/{ad97afd3337e8cda302d10ff5a4026b8.ttf → 5367103510b27b78482794590e1ce3b0.ttf} +0 -0
- package/dist/{65363c4d55617bbeb57d8ce6dcd46099.svg → 57e963e3d6dd0a9cf05150b40eebf69b.svg} +0 -0
- package/dist/{c5ebe0b32dc1b5cc449a76c4204d13bb.ttf → 65a2fb6d9aaa164b41a039302093995b.ttf} +0 -0
- package/dist/{cd6c777f1945164224dee082abaea03a.woff2 → 687a4990ea22bb1a49d469a5d9319790.woff2} +0 -0
- package/dist/{7583da5c07275cd5eb364507616f998f.ttf → 6c1d906bf5ba48676f65b2d65e935e1a.ttf} +0 -0
- package/dist/6dafca5a4f1e31f2bdf11939b24ff422.ttf +0 -0
- package/dist/{701ae6abd4719e9c2ada3535a497b341.eot → 752905fa5edf21fc52a10a0c1ca9c7a4.eot} +0 -0
- package/dist/76c05d80dda67cdc5d03f345b7bd063f.ttf +0 -0
- package/dist/{b551b554a67e86a840bc80cbb8066c30.svg → 7d62eb50e7bb05eedb2a4656f7fe8f3b.svg} +0 -0
- package/dist/{8e3c7f5520f5ae906c6cf6d7f3ddcd19.eot → a01e3f2d6c83dc3aee175e2482b3f777.eot} +0 -0
- package/dist/{448f2aaa315fa9dce7b2cf6ce31caed6.svg → b30fd8419d7e6d5918856c7531d33482.svg} +0 -0
- package/dist/c57dd55fa982e8940f69ca1d69a8a999.woff +0 -0
- package/dist/{b87b9ba532ace76ae9f6edfe9f72ded2.ttf → c656b8caa454ed19b9a2ef7f4f5b8fea.ttf} +0 -0
- package/dist/{a046592bac8f2fd96e994733faf3858c.woff → cac87dc00c87a5d74711d0276713808a.woff} +0 -0
- package/dist/{13db00b7a34fee4d819ab7f9838cc428.eot → d68fa3e67dbb653a13cec44b1bcabcfe.eot} +0 -0
- package/dist/{ef60a4f6c25ef7f39f2d25a748dbecfe.woff → ddae9b1ba9b0b42f58809904b0b21349.woff} +0 -0
- package/dist/evui.min.js +6 -86054
- package/dist/evui.min.js.gz +0 -0
- package/dist/evui.min.js.map +1 -1
- package/dist/main.css +43 -5541
- package/dist/main.css.gz +0 -0
- package/dist/main.css.map +1 -1
- package/package.json +56 -76
- package/src/common/emitter.js +20 -0
- package/src/common/utils.debounce.js +223 -0
- package/src/common/utils.js +51 -17
- package/src/common/utils.throttle.js +83 -0
- package/src/common/utils.tree.js +18 -0
- package/src/components/button/button.vue +316 -241
- package/src/components/chart/chart.core.js +378 -85
- package/src/components/chart/chart.vue +133 -115
- package/src/components/chart/element/element.bar.js +219 -25
- package/src/components/chart/element/element.bar.time.js +115 -0
- package/src/components/chart/element/element.line.js +172 -21
- package/src/components/chart/element/element.pie.js +86 -0
- package/src/components/chart/element/element.scatter.js +9 -2
- package/src/components/chart/element/element.tip.js +356 -0
- package/src/components/chart/helpers/helpers.canvas.js +94 -0
- package/src/components/chart/helpers/helpers.constant.js +25 -6
- package/src/components/chart/helpers/helpers.util.js +83 -38
- package/src/components/chart/index.js +0 -1
- package/src/components/chart/model/model.series.js +43 -14
- package/src/components/chart/model/model.store.js +440 -46
- package/src/components/chart/plugins/plugins.interaction.js +324 -0
- package/src/components/chart/plugins/plugins.legend.js +233 -91
- package/src/components/chart/plugins/plugins.pie.js +179 -0
- package/src/components/chart/plugins/plugins.title.js +25 -2
- package/src/components/chart/plugins/plugins.tooltip.js +384 -0
- package/src/components/chart/scale/scale.js +91 -29
- package/src/components/chart/scale/scale.linear.js +12 -0
- package/src/components/chart/scale/scale.logarithmic.js +25 -0
- package/src/components/chart/scale/scale.step.js +89 -52
- package/src/components/chart/scale/scale.time.category.js +204 -0
- package/src/components/chart/scale/scale.time.js +19 -1
- package/src/components/checkbox/checkbox-group.vue +15 -11
- package/src/components/checkbox/checkbox.vue +210 -138
- package/src/components/codeview/code.vue +42 -29
- package/src/components/contextmenu/contextmenu.child.vue +79 -0
- package/src/components/contextmenu/contextmenu.vue +276 -0
- package/src/components/contextmenu/contextmenu.wrap.vue +189 -0
- package/src/components/contextmenu/index.js +3 -0
- package/src/components/datepicker/calendar.core.js +588 -492
- package/src/components/datepicker/calendar.vue +0 -3
- package/src/components/datepicker/datepicker.vue +43 -15
- package/src/components/datepicker/index.js +5 -1
- package/src/components/grid/grid.filter.vue +290 -0
- package/src/components/grid/grid.filter.window.vue +411 -0
- package/src/components/grid/grid.render.vue +45 -0
- package/src/components/grid/grid.vue +1338 -0
- package/src/components/icon/icon.vue +22 -7
- package/src/components/input/input.number.vue +309 -277
- package/src/components/label/label.vue +2 -2
- package/src/components/loadingmask/loadingmask.vue +6 -13
- package/src/components/loginfield/loginfield.vue +46 -37
- package/src/components/markdown/index.js +3 -0
- package/src/components/markdown/markdown.vue +1001 -0
- package/src/components/menu/index.js +1 -3
- package/src/components/menu/menu.nav.item.vue +115 -0
- package/src/components/menu/menu.nav.sub.vue +42 -0
- package/src/components/menu/menu.nav.vue +71 -98
- package/src/components/message/index.js +3 -0
- package/src/components/message/message.js +63 -0
- package/src/components/message/message.vue +191 -0
- package/src/components/message-box/index.js +3 -0
- package/src/components/message-box/message-box.js +31 -0
- package/src/components/message-box/message-box.vue +298 -0
- package/src/components/notification/index.js +3 -0
- package/src/components/notification/notification.js +75 -0
- package/src/components/notification/notification.vue +242 -0
- package/src/components/radio/radio-group.vue +6 -2
- package/src/components/radio/radio.vue +156 -76
- package/src/components/selectbox/dropdown.vue +86 -40
- package/src/components/selectbox/listbox.vue +47 -18
- package/src/components/selectbox/option.vue +1 -1
- package/src/components/selectbox/selectbox.vue +304 -316
- package/src/components/slider/slider-tooltip.vue +7 -7
- package/src/components/slider/slider.vue +20 -25
- package/src/components/splitter/splitter.vue +104 -94
- package/src/components/table/table.black.css +1 -1
- package/src/components/table/table.filter.lite.vue +7 -7
- package/src/components/table/table.filter.vue +1 -1
- package/src/components/table/table.grey.css +5 -6
- package/src/components/table/table.navy.css +1 -1
- package/src/components/table/table.vue +55 -48
- package/src/components/tabs/tab-panel.vue +19 -5
- package/src/components/tabs/tabs.vue +182 -87
- package/src/components/textfield/textfield.vue +110 -87
- package/src/components/timepicker/index.js +2 -2
- package/src/components/timepicker/spinner.vue +15 -17
- package/src/components/timepicker/timepicker.vue +98 -53
- package/src/components/toggle/toggle.vue +148 -109
- package/src/components/tree/index.js +2 -6
- package/src/components/tree/render.js +17 -0
- package/src/components/tree/tree-node.vue +214 -0
- package/src/components/tree/tree.vue +296 -0
- package/src/components/tree-table/index.js +7 -0
- package/src/components/{tree → tree-table}/tree.table.black.css +0 -0
- package/src/components/{tree → tree-table}/tree.table.grey.css +0 -0
- package/src/components/{tree → tree-table}/tree.table.vue +36 -41
- package/src/components/{tree → tree-table}/tree.util.js +0 -0
- package/src/components/window/window.vue +238 -191
- package/src/index.js +25 -12
- package/src/styles/base/base.scss +50 -0
- package/src/styles/base/index.scss +1 -0
- package/src/styles/default.scss +5 -0
- package/src/styles/{codemirror.css → lib/codemirror.css} +0 -0
- package/src/styles/{all.css → lib/fontawesome.css} +1 -1
- package/src/styles/lib/icon.css +792 -0
- package/src/styles/themes/index.scss +2 -0
- package/src/styles/themes/mixin.scss +33 -0
- package/src/styles/themes/variables.scss +206 -0
- package/src/styles/utils/colors.scss +222 -0
- package/src/styles/utils/index.scss +2 -0
- package/src/styles/utils/mixins.scss +34 -0
- package/src/styles/utils/variables.scss +27 -0
- package/src/webfonts/EVUI.eot +0 -0
- package/src/webfonts/EVUI.svg +251 -173
- package/src/webfonts/EVUI.ttf +0 -0
- package/src/webfonts/EVUI.woff +0 -0
- package/src/webfonts/Roboto-Bold.ttf +0 -0
- package/src/webfonts/Roboto-Medium.ttf +0 -0
- package/src/webfonts/Roboto-Regular.ttf +0 -0
- package/dist/3c9453211570a4ede66a4b4954a32bbb.ttf +0 -0
- package/dist/8634884f932627fc43782e6963b64ccd.svg +0 -183
- package/dist/b9e64d9b5fa6b500eb5df6fa980d3e5b.eot +0 -0
- package/dist/f0ac0c8b3c9cd3ef9002749985ae546f.woff +0 -0
- package/src/components/chart/charts/chart.bar.js +0 -334
- package/src/components/chart/charts/chart.base.js +0 -1075
- package/src/components/chart/charts/chart.line.js +0 -262
- package/src/components/chart/charts/chart.pie.js +0 -383
- package/src/components/chart/charts/chart.scatter.js +0 -349
- package/src/components/chart/charts/chart.sunburst.js +0 -193
- package/src/components/chart/core/axis/axis.js +0 -217
- package/src/components/chart/core/axis/axis.scale.auto.js +0 -69
- package/src/components/chart/core/axis/axis.scale.fixed.js +0 -65
- package/src/components/chart/core/axis/axis.scale.steps.js +0 -149
- package/src/components/chart/core/core.constant.js +0 -116
- package/src/components/chart/core/core.legend.js +0 -473
- package/src/components/chart/core/core.util.js +0 -66
- package/src/components/chart/core/data/data.js +0 -412
- package/src/components/chart/core/data/data.pie.js +0 -70
- package/src/components/chart/core/data/data.stack.js +0 -222
- package/src/components/chart/core/data/data.sunburst.js +0 -172
- package/src/components/menu/menu.context.children.vue +0 -201
- package/src/components/menu/menu.context.vue +0 -144
- package/src/components/tabs/jun/tab.vue +0 -123
- package/src/components/tabs/jun/tabs.vue +0 -484
- package/src/styles/evui.css +0 -386
- package/src/styles/icon.css +0 -557
|
@@ -1,20 +1,31 @@
|
|
|
1
|
+
import throttle from '@/common/utils.throttle';
|
|
1
2
|
import Model from './model';
|
|
2
3
|
import TimeScale from './scale/scale.time';
|
|
3
4
|
import LinearScale from './scale/scale.linear';
|
|
4
5
|
import LogarithmicScale from './scale/scale.logarithmic';
|
|
5
6
|
import StepScale from './scale/scale.step';
|
|
7
|
+
import TimeCategoryScale from './scale/scale.time.category';
|
|
6
8
|
import Title from './plugins/plugins.title';
|
|
7
9
|
import Legend from './plugins/plugins.legend';
|
|
10
|
+
import Interaction from './plugins/plugins.interaction';
|
|
11
|
+
import Tooltip from './plugins/plugins.tooltip';
|
|
12
|
+
import Pie from './plugins/plugins.pie';
|
|
13
|
+
import Tip from './element/element.tip';
|
|
8
14
|
|
|
9
15
|
class EvChart {
|
|
10
|
-
constructor(target, data, options) {
|
|
16
|
+
constructor(target, data, options, listeners) {
|
|
11
17
|
Object.keys(Model).forEach(key => Object.assign(this, Model[key]));
|
|
12
18
|
Object.assign(this, Title);
|
|
13
19
|
Object.assign(this, Legend);
|
|
20
|
+
Object.assign(this, Interaction);
|
|
21
|
+
Object.assign(this, Tooltip);
|
|
22
|
+
Object.assign(this, Pie);
|
|
23
|
+
Object.assign(this, Tip);
|
|
14
24
|
|
|
15
25
|
this.target = target;
|
|
16
26
|
this.data = data;
|
|
17
27
|
this.options = options;
|
|
28
|
+
this.listeners = listeners;
|
|
18
29
|
|
|
19
30
|
this.wrapperDOM = document.createElement('div');
|
|
20
31
|
this.wrapperDOM.className = 'ev-chart-wrapper';
|
|
@@ -45,25 +56,25 @@ class EvChart {
|
|
|
45
56
|
|
|
46
57
|
this.isInitLegend = false;
|
|
47
58
|
this.isInitTitle = false;
|
|
48
|
-
|
|
59
|
+
this.isInit = false;
|
|
49
60
|
this.seriesList = {};
|
|
50
|
-
this.
|
|
51
|
-
this.
|
|
61
|
+
this.lastTip = { pos: null, value: null };
|
|
62
|
+
this.seriesInfo = {
|
|
63
|
+
charts: { pie: [], bar: [], line: [], scatter: [] },
|
|
52
64
|
count: 0,
|
|
53
|
-
barSeriesIds: [],
|
|
54
65
|
};
|
|
55
|
-
this.integratedLabels = this.data.labels.slice();
|
|
56
66
|
}
|
|
57
67
|
|
|
68
|
+
/**
|
|
69
|
+
* Initialize chart object
|
|
70
|
+
*
|
|
71
|
+
* @returns {undefined}
|
|
72
|
+
*/
|
|
58
73
|
init() {
|
|
59
|
-
const series = this.data
|
|
60
|
-
const
|
|
61
|
-
const labels = this.data.labels;
|
|
62
|
-
const groups = this.data.groups;
|
|
63
|
-
|
|
64
|
-
const options = this.options;
|
|
74
|
+
const { series, data, labels, groups } = this.data;
|
|
75
|
+
const { type, axesX, axesY, tooltip, horizontal } = this.options;
|
|
65
76
|
|
|
66
|
-
this.createSeriesSet(series,
|
|
77
|
+
this.createSeriesSet(series, type, horizontal);
|
|
67
78
|
if (groups.length) {
|
|
68
79
|
this.addGroupInfo(groups);
|
|
69
80
|
}
|
|
@@ -71,98 +82,170 @@ class EvChart {
|
|
|
71
82
|
this.createDataSet(data, labels);
|
|
72
83
|
this.minMax = this.getStoreMinMax();
|
|
73
84
|
|
|
74
|
-
this.
|
|
75
|
-
|
|
85
|
+
this.initRect();
|
|
86
|
+
|
|
87
|
+
this.axesX = this.createAxes('x', axesX);
|
|
88
|
+
this.axesY = this.createAxes('y', axesY);
|
|
89
|
+
|
|
76
90
|
this.axesRange = this.getAxesRange();
|
|
77
91
|
this.labelOffset = this.getLabelOffset();
|
|
78
92
|
|
|
79
|
-
this.
|
|
93
|
+
this.initScale();
|
|
80
94
|
this.drawChart();
|
|
95
|
+
|
|
96
|
+
if (tooltip.use) {
|
|
97
|
+
this.createTooltipDOM();
|
|
98
|
+
|
|
99
|
+
if (tooltip.throttledMove) {
|
|
100
|
+
this.onMouseMove = throttle(this.onMouseMove, 30);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
this.createEventFunctions();
|
|
105
|
+
this.isInit = true;
|
|
81
106
|
}
|
|
82
107
|
|
|
108
|
+
/**
|
|
109
|
+
* Initialize chart rectangle
|
|
110
|
+
*
|
|
111
|
+
* @returns {undefined}
|
|
112
|
+
*/
|
|
83
113
|
initRect() {
|
|
84
114
|
const opt = this.options;
|
|
85
115
|
if (opt.title.show) {
|
|
86
|
-
this.createTitle();
|
|
87
116
|
this.initTitle();
|
|
88
117
|
this.showTitle();
|
|
89
118
|
}
|
|
90
119
|
|
|
91
120
|
if (opt.legend.show) {
|
|
92
|
-
this.createLegend();
|
|
93
121
|
this.initLegend();
|
|
94
122
|
this.setLegendPosition();
|
|
95
123
|
}
|
|
96
124
|
this.chartRect = this.getChartRect();
|
|
97
125
|
}
|
|
98
126
|
|
|
99
|
-
|
|
127
|
+
/**
|
|
128
|
+
* To draw canvas chart, it processes several sequential jobs
|
|
129
|
+
* @param {any} [hitInfo=undefined] from mousemove callback (object or undefined)
|
|
130
|
+
*
|
|
131
|
+
* @returns {undefined}
|
|
132
|
+
*/
|
|
133
|
+
drawChart(hitInfo) {
|
|
100
134
|
this.labelRange = this.getAxesLabelRange();
|
|
101
135
|
this.axesSteps = this.calculateSteps();
|
|
102
136
|
this.drawAxis();
|
|
103
137
|
this.drawSeries();
|
|
104
|
-
|
|
138
|
+
this.drawTip(hitInfo);
|
|
105
139
|
this.displayCtx.drawImage(this.bufferCanvas, 0, 0);
|
|
106
140
|
}
|
|
107
141
|
|
|
142
|
+
/**
|
|
143
|
+
* Draw each series
|
|
144
|
+
*
|
|
145
|
+
* @returns {undefined}
|
|
146
|
+
*/
|
|
108
147
|
drawSeries() {
|
|
148
|
+
const thickness = this.options.thickness;
|
|
149
|
+
const maxTip = this.options.maxTip;
|
|
150
|
+
|
|
151
|
+
const opt = {
|
|
152
|
+
ctx: this.bufferCtx,
|
|
153
|
+
chartRect: this.chartRect,
|
|
154
|
+
labelOffset: this.labelOffset,
|
|
155
|
+
axesSteps: this.axesSteps,
|
|
156
|
+
maxTipOpt: { background: maxTip.background, color: maxTip.color },
|
|
157
|
+
};
|
|
158
|
+
|
|
109
159
|
let showIndex = 0;
|
|
110
160
|
let showSeriesCount = 0;
|
|
111
|
-
|
|
161
|
+
|
|
162
|
+
this.seriesInfo.charts.bar.forEach((series) => {
|
|
112
163
|
if (this.seriesList[series].show) {
|
|
113
164
|
showSeriesCount++;
|
|
114
165
|
}
|
|
115
166
|
});
|
|
116
167
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
168
|
+
const chartKeys = Object.keys(this.seriesInfo.charts);
|
|
169
|
+
for (let ix = 0; ix < chartKeys.length; ix++) {
|
|
170
|
+
const chartType = chartKeys[ix];
|
|
171
|
+
const chartTypeSet = this.seriesInfo.charts[chartType];
|
|
172
|
+
|
|
173
|
+
for (let jx = 0; jx < chartTypeSet.length; jx++) {
|
|
174
|
+
const series = this.seriesList[chartTypeSet[jx]];
|
|
175
|
+
|
|
176
|
+
if (chartType === 'line' || chartType === 'scatter') {
|
|
177
|
+
series.draw(opt);
|
|
178
|
+
} else if (chartType === 'bar') {
|
|
179
|
+
series.draw({ thickness, showSeriesCount, showIndex, ...opt });
|
|
180
|
+
|
|
181
|
+
if (series.show) {
|
|
182
|
+
showIndex++;
|
|
183
|
+
}
|
|
184
|
+
} else {
|
|
185
|
+
if (this.options.sunburst) {
|
|
186
|
+
this.drawSunburst();
|
|
187
|
+
} else {
|
|
188
|
+
this.drawPie();
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (this.options.doughnutHoleSize > 0) {
|
|
192
|
+
this.drawDoughnutHole();
|
|
193
|
+
}
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
133
196
|
}
|
|
134
|
-
}
|
|
197
|
+
}
|
|
135
198
|
}
|
|
136
199
|
|
|
137
|
-
|
|
200
|
+
/**
|
|
201
|
+
* Create axes
|
|
202
|
+
* @param {string} dir axis direction
|
|
203
|
+
* @param {array} axes axes array
|
|
204
|
+
*
|
|
205
|
+
* @returns {array} axes objects in array
|
|
206
|
+
*/
|
|
207
|
+
createAxes(dir, axes = []) {
|
|
138
208
|
const ctx = this.bufferCtx;
|
|
139
|
-
const
|
|
209
|
+
const labels = this.data.labels;
|
|
140
210
|
|
|
141
211
|
return axes.map((axis) => {
|
|
142
212
|
switch (axis.type) {
|
|
143
213
|
case 'linear':
|
|
144
214
|
return new LinearScale(dir, axis, ctx);
|
|
145
215
|
case 'time':
|
|
216
|
+
if (axis.categoryMode) {
|
|
217
|
+
return new TimeCategoryScale(dir, axis, ctx, labels);
|
|
218
|
+
}
|
|
146
219
|
return new TimeScale(dir, axis, ctx);
|
|
147
220
|
case 'log':
|
|
148
221
|
return new LogarithmicScale(dir, axis, ctx);
|
|
149
222
|
case 'step':
|
|
150
|
-
return new StepScale(dir, axis, ctx,
|
|
223
|
+
return new StepScale(dir, axis, ctx, labels);
|
|
151
224
|
default:
|
|
152
225
|
return false;
|
|
153
226
|
}
|
|
154
227
|
});
|
|
155
228
|
}
|
|
156
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Calculate min/max value, label and size information for each axis
|
|
232
|
+
*
|
|
233
|
+
* @returns {object} axes min/max information
|
|
234
|
+
*/
|
|
157
235
|
getAxesRange() {
|
|
158
236
|
/* eslint-disable max-len */
|
|
159
|
-
const axesXMinMax = this.axesX.map((axis, index) => axis.calculateScaleRange(this.minMax.x[index]));
|
|
160
|
-
const axesYMinMax = this.axesY.map((axis, index) => axis.calculateScaleRange(this.minMax.y[index]));
|
|
237
|
+
const axesXMinMax = this.axesX.map((axis, index) => axis.calculateScaleRange(this.minMax.x[index], this.chartRect));
|
|
238
|
+
const axesYMinMax = this.axesY.map((axis, index) => axis.calculateScaleRange(this.minMax.y[index], this.chartRect));
|
|
161
239
|
/* eslint-enable max-len */
|
|
162
240
|
|
|
163
241
|
return { x: axesXMinMax, y: axesYMinMax };
|
|
164
242
|
}
|
|
165
243
|
|
|
244
|
+
/**
|
|
245
|
+
* Draw each axis
|
|
246
|
+
*
|
|
247
|
+
* @returns {undefined}
|
|
248
|
+
*/
|
|
166
249
|
drawAxis() {
|
|
167
250
|
this.axesX.forEach((axis, index) => {
|
|
168
251
|
axis.draw(this.chartRect, this.labelOffset, this.axesSteps.x[index]);
|
|
@@ -173,6 +256,11 @@ class EvChart {
|
|
|
173
256
|
});
|
|
174
257
|
}
|
|
175
258
|
|
|
259
|
+
/**
|
|
260
|
+
* With each axis's min/max value and label information, calculate how many labels in each axis
|
|
261
|
+
*
|
|
262
|
+
* @returns {object} each axis's label steps in axes array
|
|
263
|
+
*/
|
|
176
264
|
calculateSteps() {
|
|
177
265
|
const axesXMinMax = this.axesX.map((axis, index) => {
|
|
178
266
|
const range = {
|
|
@@ -198,6 +286,11 @@ class EvChart {
|
|
|
198
286
|
return { x: axesXMinMax, y: axesYMinMax };
|
|
199
287
|
}
|
|
200
288
|
|
|
289
|
+
/**
|
|
290
|
+
* Calculate axis's min/max label steps
|
|
291
|
+
*
|
|
292
|
+
* @returns {object} axes's label range
|
|
293
|
+
*/
|
|
201
294
|
getAxesLabelRange() {
|
|
202
295
|
const axesXSteps = this.axesX.map((axis, index) => {
|
|
203
296
|
const size = this.axesRange.x[index].size;
|
|
@@ -212,20 +305,62 @@ class EvChart {
|
|
|
212
305
|
return { x: axesXSteps, y: axesYSteps };
|
|
213
306
|
}
|
|
214
307
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
308
|
+
/**
|
|
309
|
+
* Reset devicePixelRatio for high DPI
|
|
310
|
+
*
|
|
311
|
+
* @returns {undefined}
|
|
312
|
+
*/
|
|
313
|
+
initScale() {
|
|
314
|
+
const devicePixelRatio = window.devicePixelRatio || 1;
|
|
315
|
+
const backingStoreRatio = this.displayCtx.webkitBackingStorePixelRatio
|
|
316
|
+
|| this.displayCtx.mozBackingStorePixelRatio
|
|
317
|
+
|| this.displayCtx.msBackingStorePixelRatio
|
|
318
|
+
|| this.displayCtx.oBackingStorePixelRatio
|
|
319
|
+
|| this.displayCtx.backingStorePixelRatio
|
|
320
|
+
|| 1;
|
|
321
|
+
|
|
322
|
+
this.pixelRatio = devicePixelRatio / backingStoreRatio;
|
|
323
|
+
|
|
324
|
+
if (this.oldPixelRatio !== this.pixelRatio) {
|
|
325
|
+
this.oldPixelRatio = this.pixelRatio;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
this.bufferCtx.scale(this.pixelRatio, this.pixelRatio);
|
|
329
|
+
this.overlayCtx.scale(this.pixelRatio, this.pixelRatio);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Get chart DOM size and set canvas size
|
|
334
|
+
*
|
|
335
|
+
* @returns {object} chart size information
|
|
336
|
+
*/
|
|
337
|
+
getChartDOMRect() {
|
|
338
|
+
const rect = this.chartDOM.getBoundingClientRect();
|
|
339
|
+
const width = rect.width || 10;
|
|
340
|
+
const height = rect.height || 10;
|
|
218
341
|
|
|
219
342
|
this.setWidth(width);
|
|
220
343
|
this.setHeight(height);
|
|
221
344
|
|
|
222
|
-
|
|
223
|
-
|
|
345
|
+
return { width, height };
|
|
346
|
+
}
|
|
224
347
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
348
|
+
/**
|
|
349
|
+
* Calculate chart size
|
|
350
|
+
*
|
|
351
|
+
* @returns {object} chart size information
|
|
352
|
+
*/
|
|
353
|
+
getChartRect() {
|
|
354
|
+
const { width, height } = this.getChartDOMRect();
|
|
355
|
+
|
|
356
|
+
const padding = { top: 20, right: 2, left: 2, bottom: 4 };
|
|
357
|
+
const chartWidth = width - padding.left - padding.right;
|
|
358
|
+
const chartHeight = height - padding.top - padding.bottom;
|
|
359
|
+
|
|
360
|
+
const x1 = padding.left;
|
|
361
|
+
const x2 = Math.max(width - padding.right, x1 + 2);
|
|
362
|
+
const y1 = padding.top;
|
|
363
|
+
const y2 = Math.max(height - padding.bottom, y1 + 2);
|
|
229
364
|
|
|
230
365
|
return {
|
|
231
366
|
x1,
|
|
@@ -239,6 +374,12 @@ class EvChart {
|
|
|
239
374
|
};
|
|
240
375
|
}
|
|
241
376
|
|
|
377
|
+
/**
|
|
378
|
+
* Set canvas width
|
|
379
|
+
* @param {number} width canvas width from chartDOM.width
|
|
380
|
+
*
|
|
381
|
+
* @returns {undefined}
|
|
382
|
+
*/
|
|
242
383
|
setWidth(width) {
|
|
243
384
|
if (!this.displayCanvas) {
|
|
244
385
|
return;
|
|
@@ -252,6 +393,12 @@ class EvChart {
|
|
|
252
393
|
this.overlayCanvas.style.width = `${width}px`;
|
|
253
394
|
}
|
|
254
395
|
|
|
396
|
+
/**
|
|
397
|
+
* Set canvas height
|
|
398
|
+
* @param {number} height canvas width from chartDOM.height
|
|
399
|
+
*
|
|
400
|
+
* @returns {undefined}
|
|
401
|
+
*/
|
|
255
402
|
setHeight(height) {
|
|
256
403
|
if (!this.displayCanvas) {
|
|
257
404
|
return;
|
|
@@ -265,15 +412,29 @@ class EvChart {
|
|
|
265
412
|
this.overlayCanvas.style.height = `${height}px`;
|
|
266
413
|
}
|
|
267
414
|
|
|
415
|
+
/**
|
|
416
|
+
* Calculate labels offset from chart rect (Axis 영역을 벗어나는 label 크기 계산)
|
|
417
|
+
*
|
|
418
|
+
* ex)
|
|
419
|
+
* Y축 label의 넓이와 (X축 최소값 label 넓이 / 2) 중 넓은 값이 left label offset으로 처리됨
|
|
420
|
+
*
|
|
421
|
+
* 0 |
|
|
422
|
+
* |
|
|
423
|
+
* |
|
|
424
|
+
* 0 ----------------------
|
|
425
|
+
* hh:mm hh:mm
|
|
426
|
+
*
|
|
427
|
+
* @returns {object} label offset for edge
|
|
428
|
+
*/
|
|
268
429
|
getLabelOffset() {
|
|
269
430
|
const axesX = this.axesX;
|
|
270
431
|
const axesY = this.axesY;
|
|
271
432
|
const range = this.axesRange;
|
|
272
433
|
const labelOffset = { top: 2, left: 2, right: 2, bottom: 2 };
|
|
273
|
-
const labelBuffer = { width:
|
|
434
|
+
const labelBuffer = { width: 14, height: 4 };
|
|
274
435
|
|
|
275
|
-
let lw;
|
|
276
|
-
let lh;
|
|
436
|
+
let lw = 0;
|
|
437
|
+
let lh = 0;
|
|
277
438
|
|
|
278
439
|
axesX.forEach((axis, index) => {
|
|
279
440
|
lw = range.x[index].size.width + labelBuffer.width;
|
|
@@ -294,7 +455,7 @@ class EvChart {
|
|
|
294
455
|
});
|
|
295
456
|
|
|
296
457
|
axesY.forEach((axis, index) => {
|
|
297
|
-
lw = range.y[index].size.width + labelBuffer.width;
|
|
458
|
+
lw = Math.max(range.y[index].size.width + labelBuffer.width, 42 + labelBuffer.width);
|
|
298
459
|
|
|
299
460
|
if (axis.position === 'left') {
|
|
300
461
|
if (lw > labelOffset.left) {
|
|
@@ -312,30 +473,65 @@ class EvChart {
|
|
|
312
473
|
|
|
313
474
|
return labelOffset;
|
|
314
475
|
}
|
|
315
|
-
|
|
476
|
+
|
|
477
|
+
/**
|
|
478
|
+
* To re-render chart, reset properties, canvas and then render chart.
|
|
479
|
+
* @param {object} updateInfo information for each components are needed to update
|
|
480
|
+
*
|
|
481
|
+
* @returns {undefined}
|
|
482
|
+
*/
|
|
483
|
+
update(updateInfo) {
|
|
316
484
|
const options = this.options;
|
|
317
485
|
const data = this.data.data;
|
|
318
486
|
const labels = this.data.labels;
|
|
319
487
|
const groups = this.data.groups;
|
|
320
488
|
const series = this.data.series;
|
|
321
489
|
|
|
322
|
-
|
|
323
|
-
|
|
490
|
+
const { updateSeries, updateSelTip } = updateInfo;
|
|
491
|
+
|
|
492
|
+
if (!this.isInit) {
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
this.resetProps();
|
|
497
|
+
|
|
324
498
|
if (updateSeries) {
|
|
499
|
+
this.seriesInfo = null;
|
|
500
|
+
this.seriesList = null;
|
|
501
|
+
this.lastTip = null;
|
|
502
|
+
|
|
503
|
+
this.seriesInfo = {
|
|
504
|
+
charts: {
|
|
505
|
+
pie: [],
|
|
506
|
+
bar: [],
|
|
507
|
+
line: [],
|
|
508
|
+
scatter: [],
|
|
509
|
+
},
|
|
510
|
+
count: 0,
|
|
511
|
+
};
|
|
325
512
|
this.seriesList = {};
|
|
513
|
+
this.lastTip = { pos: null, value: null };
|
|
514
|
+
|
|
326
515
|
this.createSeriesSet(series, options.type);
|
|
516
|
+
|
|
517
|
+
if (this.legendDOM) {
|
|
518
|
+
this.resetLegend();
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
if (updateSelTip.update) {
|
|
523
|
+
this.lastTip.value = null;
|
|
524
|
+
|
|
525
|
+
if (!updateSelTip.keepDomain) {
|
|
526
|
+
this.lastTip.pos = null;
|
|
527
|
+
}
|
|
327
528
|
}
|
|
328
529
|
|
|
329
530
|
if (groups.length) {
|
|
330
531
|
this.addGroupInfo(groups);
|
|
331
532
|
}
|
|
332
|
-
this.createDataSet(data, labels);
|
|
333
533
|
|
|
334
|
-
this.
|
|
335
|
-
this.axesX = this.createAxes('x', options.axesX);
|
|
336
|
-
this.axesY = this.createAxes('y', options.axesY);
|
|
337
|
-
this.axesRange = this.getAxesRange();
|
|
338
|
-
this.labelOffset = this.getLabelOffset();
|
|
534
|
+
this.createDataSet(data, labels);
|
|
339
535
|
|
|
340
536
|
// title update
|
|
341
537
|
if (options.title.show) {
|
|
@@ -361,36 +557,51 @@ class EvChart {
|
|
|
361
557
|
} else if (this.isInitLegend) {
|
|
362
558
|
this.hideLegend();
|
|
363
559
|
}
|
|
560
|
+
this.chartRect = this.getChartRect();
|
|
561
|
+
|
|
562
|
+
this.minMax = this.getStoreMinMax();
|
|
563
|
+
this.axesX = this.createAxes('x', options.axesX);
|
|
564
|
+
this.axesY = this.createAxes('y', options.axesY);
|
|
565
|
+
this.axesRange = this.getAxesRange();
|
|
566
|
+
this.labelOffset = this.getLabelOffset();
|
|
364
567
|
|
|
365
568
|
this.render();
|
|
366
569
|
}
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
this.seriesList = {};
|
|
377
|
-
this.minMax = null;
|
|
570
|
+
|
|
571
|
+
/**
|
|
572
|
+
* To re-render chart, reset properties
|
|
573
|
+
*
|
|
574
|
+
* @returns {undefined}
|
|
575
|
+
*/
|
|
576
|
+
resetProps() {
|
|
577
|
+
this.axesX[0] = null;
|
|
578
|
+
this.axesY[0] = null;
|
|
378
579
|
this.axesX = null;
|
|
379
580
|
this.axesY = null;
|
|
581
|
+
this.minMax = null;
|
|
380
582
|
this.axesRange = null;
|
|
381
583
|
this.labelOffset = null;
|
|
382
584
|
this.chartRect = null;
|
|
383
|
-
|
|
384
|
-
this.titleDOM.remove();
|
|
385
|
-
this.legendDOM.remove();
|
|
386
|
-
this.resizeDOM.remove();
|
|
387
|
-
this.ghostDOM.remove();
|
|
585
|
+
this.pieDataSet = [];
|
|
388
586
|
}
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
587
|
+
|
|
588
|
+
/**
|
|
589
|
+
* Clear overlay canvas
|
|
590
|
+
*
|
|
591
|
+
* @returns {undefined}
|
|
592
|
+
*/
|
|
593
|
+
overlayClear() {
|
|
594
|
+
this.clearRectRatio = (this.pixelRatio < 1) ? this.pixelRatio : 1;
|
|
595
|
+
|
|
596
|
+
this.overlayCtx.clearRect(0, 0, this.overlayCanvas.width / this.clearRectRatio,
|
|
597
|
+
this.overlayCanvas.height / this.clearRectRatio);
|
|
393
598
|
}
|
|
599
|
+
|
|
600
|
+
/**
|
|
601
|
+
* Clear display and buffer canvas
|
|
602
|
+
*
|
|
603
|
+
* @returns {undefined}
|
|
604
|
+
*/
|
|
394
605
|
clear() {
|
|
395
606
|
this.clearRectRatio = (this.pixelRatio < 1) ? this.pixelRatio : 1;
|
|
396
607
|
|
|
@@ -401,6 +612,88 @@ class EvChart {
|
|
|
401
612
|
this.overlayCtx.clearRect(0, 0, this.overlayCanvas.width / this.clearRectRatio,
|
|
402
613
|
this.overlayCanvas.height / this.clearRectRatio);
|
|
403
614
|
}
|
|
615
|
+
|
|
616
|
+
/**
|
|
617
|
+
* Resize chart
|
|
618
|
+
*
|
|
619
|
+
* @returns {undefined}
|
|
620
|
+
*/
|
|
621
|
+
resize() {
|
|
622
|
+
this.clear();
|
|
623
|
+
this.bufferCtx.restore();
|
|
624
|
+
this.bufferCtx.save();
|
|
625
|
+
|
|
626
|
+
this.getChartDOMRect();
|
|
627
|
+
this.initScale();
|
|
628
|
+
this.drawChart();
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
/**
|
|
632
|
+
* Render chart
|
|
633
|
+
* @param {any} [hitInfo=undefined] hit item from mouse click/dblclick
|
|
634
|
+
*
|
|
635
|
+
* @returns {undefined}
|
|
636
|
+
*/
|
|
637
|
+
render(hitInfo) {
|
|
638
|
+
this.clear();
|
|
639
|
+
this.chartRect = this.getChartRect();
|
|
640
|
+
this.initScale();
|
|
641
|
+
this.drawChart(hitInfo);
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
/**
|
|
645
|
+
* destroy chart component
|
|
646
|
+
*
|
|
647
|
+
* @returns {undefined}
|
|
648
|
+
*/
|
|
649
|
+
destroy() {
|
|
650
|
+
if (!this.isInit) {
|
|
651
|
+
return;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
const target = this.target;
|
|
655
|
+
|
|
656
|
+
if (this.options.legend.show) {
|
|
657
|
+
if (this.legendBoxDOM) {
|
|
658
|
+
this.legendBoxDOM.removeEventListener('click', this.onLegendBoxClick);
|
|
659
|
+
this.legendBoxDOM.removeEventListener('mouseover', this.onLegendBoxOver);
|
|
660
|
+
this.legendBoxDOM.removeEventListener('mouseleave', this.onLegendBoxLeave);
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
if (this.resizeDOM) {
|
|
664
|
+
this.resizeDOM.removeEventListener('mousedown', this.onResizeMouseDown);
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
if (this.overlayCanvas) {
|
|
669
|
+
this.overlayCanvas.removeEventListener('mousemove', this.onMouseMove);
|
|
670
|
+
this.overlayCanvas.removeEventListener('mouseleave', this.onMouseLeave);
|
|
671
|
+
this.overlayCanvas.removeEventListener('dblclick', this.onDblClick);
|
|
672
|
+
this.overlayCanvas.removeEventListener('click', this.onClick);
|
|
673
|
+
}
|
|
674
|
+
|
|
675
|
+
if (this.options.tooltip.use) {
|
|
676
|
+
this.tooltipCanvas.remove();
|
|
677
|
+
this.tooltipCanvas = null;
|
|
678
|
+
this.tooltipDOM.remove();
|
|
679
|
+
this.tooltipDOM = null;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
this.wrapperDOM = null;
|
|
683
|
+
this.chartDOM = null;
|
|
684
|
+
this.legendDOM = null;
|
|
685
|
+
this.legendBoxDOM = null;
|
|
686
|
+
this.resizeDOM = null;
|
|
687
|
+
this.ghostDOM = null;
|
|
688
|
+
this.titleDOM = null;
|
|
689
|
+
this.displayCanvas = null;
|
|
690
|
+
this.bufferCanvas = null;
|
|
691
|
+
this.overlayCanvas = null;
|
|
692
|
+
|
|
693
|
+
while (target.hasChildNodes()) {
|
|
694
|
+
target.removeChild(target.firstChild);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
404
697
|
}
|
|
405
698
|
|
|
406
699
|
export default EvChart;
|