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.
Files changed (189) hide show
  1. package/dist/{adac9fa4f723f9d2cb5b6640517114a9.png → 0b8d1200e71cae8d747dce4e69c4efb6.png} +0 -0
  2. package/dist/1.css +4 -0
  3. package/dist/1.css.map +1 -0
  4. package/dist/1.evui.min.js +2 -0
  5. package/dist/1.evui.min.js.map +1 -0
  6. package/dist/1ba679c05036b34bf359aa2e6c450faa.ttf +0 -0
  7. package/dist/2.css +4 -0
  8. package/dist/2.css.map +1 -0
  9. package/dist/2.evui.min.js +2 -0
  10. package/dist/2.evui.min.js.map +1 -0
  11. package/dist/{e8c322de9658cbeb8a774b6624167c2c.woff2 → 278156e41e0ad908cf7f841b17130502.woff2} +0 -0
  12. package/dist/3.evui.min.js +2 -0
  13. package/dist/3.evui.min.js.map +1 -0
  14. package/dist/32be89b11725274cd3e801192ba88361.ttf +0 -0
  15. package/dist/{0ab54153eeeca0ce03978cc463b257f7.woff2 → 38c6d8bab26db77d8c806813e1497763.woff2} +0 -0
  16. package/dist/4.evui.min.js +2 -0
  17. package/dist/4.evui.min.js.map +1 -0
  18. package/dist/{faff92145777a3cbaf8e7367b4807987.woff → 425399f81e4ce7cbd967685402ba0260.woff} +0 -0
  19. package/dist/4730076470a665bbc7b783c56d29a72e.svg +261 -0
  20. package/dist/52e9a7f6ff3af5ad261e5292d07ebdca.eot +0 -0
  21. package/dist/{ad97afd3337e8cda302d10ff5a4026b8.ttf → 5367103510b27b78482794590e1ce3b0.ttf} +0 -0
  22. package/dist/{65363c4d55617bbeb57d8ce6dcd46099.svg → 57e963e3d6dd0a9cf05150b40eebf69b.svg} +0 -0
  23. package/dist/{c5ebe0b32dc1b5cc449a76c4204d13bb.ttf → 65a2fb6d9aaa164b41a039302093995b.ttf} +0 -0
  24. package/dist/{cd6c777f1945164224dee082abaea03a.woff2 → 687a4990ea22bb1a49d469a5d9319790.woff2} +0 -0
  25. package/dist/{7583da5c07275cd5eb364507616f998f.ttf → 6c1d906bf5ba48676f65b2d65e935e1a.ttf} +0 -0
  26. package/dist/6dafca5a4f1e31f2bdf11939b24ff422.ttf +0 -0
  27. package/dist/{701ae6abd4719e9c2ada3535a497b341.eot → 752905fa5edf21fc52a10a0c1ca9c7a4.eot} +0 -0
  28. package/dist/76c05d80dda67cdc5d03f345b7bd063f.ttf +0 -0
  29. package/dist/{b551b554a67e86a840bc80cbb8066c30.svg → 7d62eb50e7bb05eedb2a4656f7fe8f3b.svg} +0 -0
  30. package/dist/{8e3c7f5520f5ae906c6cf6d7f3ddcd19.eot → a01e3f2d6c83dc3aee175e2482b3f777.eot} +0 -0
  31. package/dist/{448f2aaa315fa9dce7b2cf6ce31caed6.svg → b30fd8419d7e6d5918856c7531d33482.svg} +0 -0
  32. package/dist/c57dd55fa982e8940f69ca1d69a8a999.woff +0 -0
  33. package/dist/{b87b9ba532ace76ae9f6edfe9f72ded2.ttf → c656b8caa454ed19b9a2ef7f4f5b8fea.ttf} +0 -0
  34. package/dist/{a046592bac8f2fd96e994733faf3858c.woff → cac87dc00c87a5d74711d0276713808a.woff} +0 -0
  35. package/dist/{13db00b7a34fee4d819ab7f9838cc428.eot → d68fa3e67dbb653a13cec44b1bcabcfe.eot} +0 -0
  36. package/dist/{ef60a4f6c25ef7f39f2d25a748dbecfe.woff → ddae9b1ba9b0b42f58809904b0b21349.woff} +0 -0
  37. package/dist/evui.min.js +6 -86054
  38. package/dist/evui.min.js.gz +0 -0
  39. package/dist/evui.min.js.map +1 -1
  40. package/dist/main.css +43 -5541
  41. package/dist/main.css.gz +0 -0
  42. package/dist/main.css.map +1 -1
  43. package/package.json +56 -76
  44. package/src/common/emitter.js +20 -0
  45. package/src/common/utils.debounce.js +223 -0
  46. package/src/common/utils.js +51 -17
  47. package/src/common/utils.throttle.js +83 -0
  48. package/src/common/utils.tree.js +18 -0
  49. package/src/components/button/button.vue +316 -241
  50. package/src/components/chart/chart.core.js +378 -85
  51. package/src/components/chart/chart.vue +133 -115
  52. package/src/components/chart/element/element.bar.js +219 -25
  53. package/src/components/chart/element/element.bar.time.js +115 -0
  54. package/src/components/chart/element/element.line.js +172 -21
  55. package/src/components/chart/element/element.pie.js +86 -0
  56. package/src/components/chart/element/element.scatter.js +9 -2
  57. package/src/components/chart/element/element.tip.js +356 -0
  58. package/src/components/chart/helpers/helpers.canvas.js +94 -0
  59. package/src/components/chart/helpers/helpers.constant.js +25 -6
  60. package/src/components/chart/helpers/helpers.util.js +83 -38
  61. package/src/components/chart/index.js +0 -1
  62. package/src/components/chart/model/model.series.js +43 -14
  63. package/src/components/chart/model/model.store.js +440 -46
  64. package/src/components/chart/plugins/plugins.interaction.js +324 -0
  65. package/src/components/chart/plugins/plugins.legend.js +233 -91
  66. package/src/components/chart/plugins/plugins.pie.js +179 -0
  67. package/src/components/chart/plugins/plugins.title.js +25 -2
  68. package/src/components/chart/plugins/plugins.tooltip.js +384 -0
  69. package/src/components/chart/scale/scale.js +91 -29
  70. package/src/components/chart/scale/scale.linear.js +12 -0
  71. package/src/components/chart/scale/scale.logarithmic.js +25 -0
  72. package/src/components/chart/scale/scale.step.js +89 -52
  73. package/src/components/chart/scale/scale.time.category.js +204 -0
  74. package/src/components/chart/scale/scale.time.js +19 -1
  75. package/src/components/checkbox/checkbox-group.vue +15 -11
  76. package/src/components/checkbox/checkbox.vue +210 -138
  77. package/src/components/codeview/code.vue +42 -29
  78. package/src/components/contextmenu/contextmenu.child.vue +79 -0
  79. package/src/components/contextmenu/contextmenu.vue +276 -0
  80. package/src/components/contextmenu/contextmenu.wrap.vue +189 -0
  81. package/src/components/contextmenu/index.js +3 -0
  82. package/src/components/datepicker/calendar.core.js +588 -492
  83. package/src/components/datepicker/calendar.vue +0 -3
  84. package/src/components/datepicker/datepicker.vue +43 -15
  85. package/src/components/datepicker/index.js +5 -1
  86. package/src/components/grid/grid.filter.vue +290 -0
  87. package/src/components/grid/grid.filter.window.vue +411 -0
  88. package/src/components/grid/grid.render.vue +45 -0
  89. package/src/components/grid/grid.vue +1338 -0
  90. package/src/components/icon/icon.vue +22 -7
  91. package/src/components/input/input.number.vue +309 -277
  92. package/src/components/label/label.vue +2 -2
  93. package/src/components/loadingmask/loadingmask.vue +6 -13
  94. package/src/components/loginfield/loginfield.vue +46 -37
  95. package/src/components/markdown/index.js +3 -0
  96. package/src/components/markdown/markdown.vue +1001 -0
  97. package/src/components/menu/index.js +1 -3
  98. package/src/components/menu/menu.nav.item.vue +115 -0
  99. package/src/components/menu/menu.nav.sub.vue +42 -0
  100. package/src/components/menu/menu.nav.vue +71 -98
  101. package/src/components/message/index.js +3 -0
  102. package/src/components/message/message.js +63 -0
  103. package/src/components/message/message.vue +191 -0
  104. package/src/components/message-box/index.js +3 -0
  105. package/src/components/message-box/message-box.js +31 -0
  106. package/src/components/message-box/message-box.vue +298 -0
  107. package/src/components/notification/index.js +3 -0
  108. package/src/components/notification/notification.js +75 -0
  109. package/src/components/notification/notification.vue +242 -0
  110. package/src/components/radio/radio-group.vue +6 -2
  111. package/src/components/radio/radio.vue +156 -76
  112. package/src/components/selectbox/dropdown.vue +86 -40
  113. package/src/components/selectbox/listbox.vue +47 -18
  114. package/src/components/selectbox/option.vue +1 -1
  115. package/src/components/selectbox/selectbox.vue +304 -316
  116. package/src/components/slider/slider-tooltip.vue +7 -7
  117. package/src/components/slider/slider.vue +20 -25
  118. package/src/components/splitter/splitter.vue +104 -94
  119. package/src/components/table/table.black.css +1 -1
  120. package/src/components/table/table.filter.lite.vue +7 -7
  121. package/src/components/table/table.filter.vue +1 -1
  122. package/src/components/table/table.grey.css +5 -6
  123. package/src/components/table/table.navy.css +1 -1
  124. package/src/components/table/table.vue +55 -48
  125. package/src/components/tabs/tab-panel.vue +19 -5
  126. package/src/components/tabs/tabs.vue +182 -87
  127. package/src/components/textfield/textfield.vue +110 -87
  128. package/src/components/timepicker/index.js +2 -2
  129. package/src/components/timepicker/spinner.vue +15 -17
  130. package/src/components/timepicker/timepicker.vue +98 -53
  131. package/src/components/toggle/toggle.vue +148 -109
  132. package/src/components/tree/index.js +2 -6
  133. package/src/components/tree/render.js +17 -0
  134. package/src/components/tree/tree-node.vue +214 -0
  135. package/src/components/tree/tree.vue +296 -0
  136. package/src/components/tree-table/index.js +7 -0
  137. package/src/components/{tree → tree-table}/tree.table.black.css +0 -0
  138. package/src/components/{tree → tree-table}/tree.table.grey.css +0 -0
  139. package/src/components/{tree → tree-table}/tree.table.vue +36 -41
  140. package/src/components/{tree → tree-table}/tree.util.js +0 -0
  141. package/src/components/window/window.vue +238 -191
  142. package/src/index.js +25 -12
  143. package/src/styles/base/base.scss +50 -0
  144. package/src/styles/base/index.scss +1 -0
  145. package/src/styles/default.scss +5 -0
  146. package/src/styles/{codemirror.css → lib/codemirror.css} +0 -0
  147. package/src/styles/{all.css → lib/fontawesome.css} +1 -1
  148. package/src/styles/lib/icon.css +792 -0
  149. package/src/styles/themes/index.scss +2 -0
  150. package/src/styles/themes/mixin.scss +33 -0
  151. package/src/styles/themes/variables.scss +206 -0
  152. package/src/styles/utils/colors.scss +222 -0
  153. package/src/styles/utils/index.scss +2 -0
  154. package/src/styles/utils/mixins.scss +34 -0
  155. package/src/styles/utils/variables.scss +27 -0
  156. package/src/webfonts/EVUI.eot +0 -0
  157. package/src/webfonts/EVUI.svg +251 -173
  158. package/src/webfonts/EVUI.ttf +0 -0
  159. package/src/webfonts/EVUI.woff +0 -0
  160. package/src/webfonts/Roboto-Bold.ttf +0 -0
  161. package/src/webfonts/Roboto-Medium.ttf +0 -0
  162. package/src/webfonts/Roboto-Regular.ttf +0 -0
  163. package/dist/3c9453211570a4ede66a4b4954a32bbb.ttf +0 -0
  164. package/dist/8634884f932627fc43782e6963b64ccd.svg +0 -183
  165. package/dist/b9e64d9b5fa6b500eb5df6fa980d3e5b.eot +0 -0
  166. package/dist/f0ac0c8b3c9cd3ef9002749985ae546f.woff +0 -0
  167. package/src/components/chart/charts/chart.bar.js +0 -334
  168. package/src/components/chart/charts/chart.base.js +0 -1075
  169. package/src/components/chart/charts/chart.line.js +0 -262
  170. package/src/components/chart/charts/chart.pie.js +0 -383
  171. package/src/components/chart/charts/chart.scatter.js +0 -349
  172. package/src/components/chart/charts/chart.sunburst.js +0 -193
  173. package/src/components/chart/core/axis/axis.js +0 -217
  174. package/src/components/chart/core/axis/axis.scale.auto.js +0 -69
  175. package/src/components/chart/core/axis/axis.scale.fixed.js +0 -65
  176. package/src/components/chart/core/axis/axis.scale.steps.js +0 -149
  177. package/src/components/chart/core/core.constant.js +0 -116
  178. package/src/components/chart/core/core.legend.js +0 -473
  179. package/src/components/chart/core/core.util.js +0 -66
  180. package/src/components/chart/core/data/data.js +0 -412
  181. package/src/components/chart/core/data/data.pie.js +0 -70
  182. package/src/components/chart/core/data/data.stack.js +0 -222
  183. package/src/components/chart/core/data/data.sunburst.js +0 -172
  184. package/src/components/menu/menu.context.children.vue +0 -201
  185. package/src/components/menu/menu.context.vue +0 -144
  186. package/src/components/tabs/jun/tab.vue +0 -123
  187. package/src/components/tabs/jun/tabs.vue +0 -484
  188. package/src/styles/evui.css +0 -386
  189. 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.chartRect = {};
51
- this.showSeriesInfo = {
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.series;
60
- const data = this.data.data;
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, options.type);
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.axesX = this.createAxes('x', options.axesX);
75
- this.axesY = this.createAxes('y', options.axesY);
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.initRect();
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
- drawChart() {
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
- this.showSeriesInfo.barSeriesIds.forEach((series) => {
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
- Object.values(this.seriesList).forEach((series) => {
119
- series.draw({
120
- ctx: this.bufferCtx,
121
- chartRect: this.chartRect,
122
- labelOffset: this.labelOffset,
123
- axesSteps: this.axesSteps,
124
- isHorizontal: this.options.horizontal,
125
- integLabels: this.integratedLabels,
126
- thickness: this.options.thickness,
127
- showSeriesCount,
128
- showIndex,
129
- });
130
-
131
- if (series.show) {
132
- showIndex++;
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
- createAxes(dir, axes) {
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 integLabels = this.integratedLabels;
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, integLabels);
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
- getChartRect() {
216
- const width = this.chartDOM.getBoundingClientRect().width || 10;
217
- const height = this.chartDOM.getBoundingClientRect().height || 10;
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
- const chartWidth = width - 8;
223
- const chartHeight = height - 8;
345
+ return { width, height };
346
+ }
224
347
 
225
- const x1 = 4;
226
- const x2 = Math.max(width - 4, x1 + 2);
227
- const y1 = 4;
228
- const y2 = Math.max(height - 4, y1 + 2);
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: 20, height: 4 };
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
- update(updateSeries) {
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
- this.clearObject();
323
- this.integratedLabels = labels.slice();
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.minMax = this.getStoreMinMax();
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
- clearObject() {
368
- delete this.minMax;
369
- delete this.axesX;
370
- delete this.axesY;
371
- delete this.axesRange;
372
- delete this.labelOffset;
373
- }
374
- destroy() {}
375
- reset() {
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
- render() {
390
- this.clear();
391
- this.chartRect = this.getChartRect();
392
- this.drawChart();
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;