echarts 4.5.0-rc.2 → 4.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (256) hide show
  1. package/.github/pull_request_template.md +66 -0
  2. package/.github/workflows/nodejs.yml +12 -2
  3. package/CONTRIBUTING.md +16 -160
  4. package/NOTICE +1 -1
  5. package/README.md +2 -2
  6. package/dist/echarts-en.common.js +2808 -1188
  7. package/dist/echarts-en.common.min.js +1 -1
  8. package/dist/echarts-en.js +3559 -1437
  9. package/dist/echarts-en.js.map +1 -1
  10. package/dist/echarts-en.min.js +1 -1
  11. package/dist/echarts-en.simple.js +2453 -1002
  12. package/dist/echarts-en.simple.min.js +1 -1
  13. package/dist/echarts.common.js +2782 -1188
  14. package/dist/echarts.common.min.js +1 -1
  15. package/dist/echarts.js +3533 -1437
  16. package/dist/echarts.js.map +1 -1
  17. package/dist/echarts.min.js +1 -1
  18. package/dist/echarts.simple.js +2427 -1002
  19. package/dist/echarts.simple.min.js +1 -1
  20. package/dist/extension/bmap.js +336 -2
  21. package/dist/extension/bmap.js.map +1 -1
  22. package/dist/extension/bmap.min.js +1 -1
  23. package/extension/bmap/BMapView.js +6 -2
  24. package/extension-src/bmap/BMapView.js +3 -2
  25. package/lib/chart/bar/BarSeries.js +14 -1
  26. package/lib/chart/bar/BarView.js +161 -16
  27. package/lib/chart/bar/BaseBarSeries.js +3 -1
  28. package/lib/chart/candlestick/candlestickVisual.js +1 -1
  29. package/lib/chart/effectScatter/EffectScatterSeries.js +3 -1
  30. package/lib/chart/funnel/FunnelSeries.js +13 -5
  31. package/lib/chart/gauge/GaugeSeries.js +0 -2
  32. package/lib/chart/graph/GraphSeries.js +11 -5
  33. package/lib/chart/graph/GraphView.js +30 -12
  34. package/lib/chart/heatmap/HeatmapView.js +4 -4
  35. package/lib/chart/helper/EffectLine.js +23 -1
  36. package/lib/chart/helper/EffectSymbol.js +2 -1
  37. package/lib/chart/helper/Line.js +94 -33
  38. package/lib/chart/helper/LineDraw.js +5 -1
  39. package/lib/chart/helper/Symbol.js +1 -2
  40. package/lib/chart/helper/createClipPathFromCoordSys.js +4 -1
  41. package/lib/chart/helper/createListFromArray.js +14 -8
  42. package/lib/chart/helper/createRenderPlanner.js +6 -3
  43. package/lib/chart/helper/whiskerBoxCommon.js +22 -16
  44. package/lib/chart/line/LineSeries.js +3 -1
  45. package/lib/chart/line/LineView.js +41 -2
  46. package/lib/chart/map/MapSeries.js +11 -3
  47. package/lib/chart/pie/PieSeries.js +27 -6
  48. package/lib/chart/pie/PieView.js +22 -15
  49. package/lib/chart/pie/labelLayout.js +102 -19
  50. package/lib/chart/pie/pieLayout.js +19 -7
  51. package/lib/chart/radar/RadarSeries.js +23 -3
  52. package/lib/chart/sankey/SankeySeries.js +13 -1
  53. package/lib/chart/sankey/SankeyView.js +70 -32
  54. package/lib/chart/sankey/sankeyLayout.js +22 -3
  55. package/lib/chart/scatter/ScatterSeries.js +3 -1
  56. package/lib/chart/sunburst/SunburstPiece.js +1 -0
  57. package/lib/chart/sunburst/SunburstSeries.js +12 -7
  58. package/lib/chart/sunburst/SunburstView.js +5 -1
  59. package/lib/chart/themeRiver/ThemeRiverSeries.js +3 -3
  60. package/lib/chart/tree/TreeSeries.js +20 -3
  61. package/lib/chart/tree/TreeView.js +151 -25
  62. package/lib/chart/treemap/TreemapSeries.js +15 -3
  63. package/lib/chart/treemap/TreemapView.js +80 -38
  64. package/lib/component/axis/AngleAxisView.js +64 -7
  65. package/lib/component/axis/AxisBuilder.js +62 -24
  66. package/lib/component/axis/CartesianAxisView.js +52 -85
  67. package/lib/component/axis/RadiusAxisView.js +36 -4
  68. package/lib/component/axis/SingleAxisView.js +21 -6
  69. package/lib/component/axis/axisSplitHelper.js +132 -0
  70. package/lib/component/brush/BrushView.js +11 -1
  71. package/lib/component/brush/visualEncoding.js +13 -2
  72. package/lib/component/dataZoom/SliderZoomView.js +4 -10
  73. package/lib/component/helper/BrushController.js +33 -43
  74. package/lib/component/helper/MapDraw.js +30 -4
  75. package/lib/component/legend/LegendModel.js +3 -3
  76. package/lib/component/legend/LegendView.js +17 -13
  77. package/lib/component/legend/ScrollableLegendView.js +18 -18
  78. package/lib/component/marker/MarkLineModel.js +2 -1
  79. package/lib/component/marker/markerHelper.js +7 -4
  80. package/lib/component/title.js +6 -2
  81. package/lib/component/toolbox/ToolboxView.js +5 -1
  82. package/lib/component/toolbox/feature/MagicType.js +20 -14
  83. package/lib/component/toolbox/feature/SaveAsImage.js +2 -1
  84. package/lib/component/tooltip/TooltipContent.js +60 -23
  85. package/lib/component/tooltip/TooltipView.js +7 -8
  86. package/lib/component/visualMap/PiecewiseModel.js +3 -6
  87. package/lib/coord/Axis.js +30 -2
  88. package/lib/coord/View.js +9 -0
  89. package/lib/coord/axisDefault.js +21 -2
  90. package/lib/coord/axisHelper.js +22 -16
  91. package/lib/coord/calendar/Calendar.js +8 -4
  92. package/lib/coord/geo/geoJSONLoader.js +3 -2
  93. package/lib/coord/geo/geoSourceManager.js +3 -2
  94. package/lib/coord/geo/parseGeoJson.js +3 -2
  95. package/lib/coord/radar/Radar.js +5 -5
  96. package/lib/data/DataDimensionInfo.js +157 -0
  97. package/lib/data/List.js +25 -19
  98. package/lib/data/Tree.js +9 -19
  99. package/lib/data/helper/completeDimensions.js +43 -32
  100. package/lib/data/helper/createDimensions.js +2 -0
  101. package/lib/data/helper/sourceHelper.js +214 -114
  102. package/lib/echarts.js +57 -34
  103. package/lib/langEN.js +26 -0
  104. package/lib/layout/barGrid.js +19 -13
  105. package/lib/layout/barPolar.js +0 -5
  106. package/lib/loading/default.js +43 -27
  107. package/lib/model/Series.js +4 -4
  108. package/lib/model/referHelper.js +40 -12
  109. package/lib/scale/Interval.js +87 -2
  110. package/lib/scale/Log.js +9 -2
  111. package/lib/scale/helper.js +1 -43
  112. package/lib/stream/Scheduler.js +9 -1
  113. package/lib/theme/dark.js +3 -0
  114. package/lib/util/format.js +19 -2
  115. package/lib/util/graphic.js +14 -12
  116. package/lib/visual/LegendVisualProvider.js +75 -0
  117. package/lib/visual/dataColor.js +2 -12
  118. package/lib/visual/seriesColor.js +15 -7
  119. package/lib/visual/symbol.js +12 -2
  120. package/map/js/china.js +1 -1
  121. package/map/js/province/chongqing.js +1 -1
  122. package/map/js/province/gansu.js +2 -2
  123. package/map/js/province/tianjin.js +1 -28
  124. package/map/json/china.json +1 -1
  125. package/map/json/province/chongqing.json +1 -1
  126. package/map/json/province/tianjin.json +1 -1
  127. package/package.json +11 -6
  128. package/src/chart/bar/BarSeries.js +15 -1
  129. package/src/chart/bar/BarView.js +162 -15
  130. package/src/chart/bar/BaseBarSeries.js +1 -1
  131. package/src/chart/candlestick/candlestickVisual.js +1 -1
  132. package/src/chart/effectScatter/EffectScatterSeries.js +1 -1
  133. package/src/chart/funnel/FunnelSeries.js +10 -4
  134. package/src/chart/gauge/GaugeSeries.js +0 -1
  135. package/src/chart/graph/GraphSeries.js +10 -4
  136. package/src/chart/graph/GraphView.js +28 -10
  137. package/src/chart/heatmap/HeatmapView.js +4 -4
  138. package/src/chart/helper/EffectLine.js +23 -1
  139. package/src/chart/helper/EffectSymbol.js +2 -1
  140. package/src/chart/helper/Line.js +84 -26
  141. package/src/chart/helper/LineDraw.js +5 -1
  142. package/src/chart/helper/Symbol.js +2 -2
  143. package/src/chart/helper/createClipPathFromCoordSys.js +4 -0
  144. package/src/chart/helper/createListFromArray.js +13 -8
  145. package/src/chart/helper/createRenderPlanner.js +5 -2
  146. package/src/chart/helper/whiskerBoxCommon.js +21 -16
  147. package/src/chart/line/LineSeries.js +1 -1
  148. package/src/chart/line/LineView.js +45 -1
  149. package/src/chart/map/MapSeries.js +8 -3
  150. package/src/chart/pie/PieSeries.js +26 -5
  151. package/src/chart/pie/PieView.js +20 -15
  152. package/src/chart/pie/labelLayout.js +114 -22
  153. package/src/chart/pie/pieLayout.js +20 -7
  154. package/src/chart/radar/RadarSeries.js +27 -3
  155. package/src/chart/sankey/SankeySeries.js +12 -1
  156. package/src/chart/sankey/SankeyView.js +75 -30
  157. package/src/chart/sankey/sankeyLayout.js +25 -5
  158. package/src/chart/scatter/ScatterSeries.js +1 -1
  159. package/src/chart/sunburst/SunburstPiece.js +2 -0
  160. package/src/chart/sunburst/SunburstSeries.js +12 -7
  161. package/src/chart/sunburst/SunburstView.js +2 -1
  162. package/src/chart/themeRiver/ThemeRiverSeries.js +4 -3
  163. package/src/chart/tree/TreeSeries.js +19 -6
  164. package/src/chart/tree/TreeView.js +155 -22
  165. package/src/chart/treemap/TreemapSeries.js +15 -5
  166. package/src/chart/treemap/TreemapView.js +77 -41
  167. package/src/component/axis/AngleAxisView.js +75 -7
  168. package/src/component/axis/AxisBuilder.js +77 -32
  169. package/src/component/axis/CartesianAxisView.js +47 -83
  170. package/src/component/axis/RadiusAxisView.js +37 -4
  171. package/src/component/axis/SingleAxisView.js +21 -4
  172. package/src/component/axis/axisSplitHelper.js +114 -0
  173. package/src/component/brush/BrushView.js +8 -1
  174. package/src/component/brush/visualEncoding.js +6 -3
  175. package/src/component/dataZoom/SliderZoomView.js +4 -9
  176. package/src/component/helper/BrushController.js +40 -47
  177. package/src/component/helper/MapDraw.js +27 -4
  178. package/src/component/legend/LegendModel.js +3 -3
  179. package/src/component/legend/LegendView.js +18 -12
  180. package/src/component/legend/ScrollableLegendView.js +18 -16
  181. package/src/component/marker/MarkLineModel.js +2 -1
  182. package/src/component/marker/markerHelper.js +8 -5
  183. package/src/component/title.js +3 -2
  184. package/src/component/toolbox/ToolboxView.js +5 -0
  185. package/src/component/toolbox/feature/MagicType.js +19 -13
  186. package/src/component/toolbox/feature/SaveAsImage.js +2 -1
  187. package/src/component/tooltip/TooltipContent.js +59 -22
  188. package/src/component/tooltip/TooltipView.js +10 -8
  189. package/src/component/visualMap/PiecewiseModel.js +5 -9
  190. package/src/coord/Axis.js +29 -2
  191. package/src/coord/View.js +10 -1
  192. package/src/coord/axisDefault.js +25 -1
  193. package/src/coord/axisHelper.js +26 -19
  194. package/src/coord/calendar/Calendar.js +12 -5
  195. package/src/coord/geo/geoJSONLoader.js +3 -2
  196. package/src/coord/geo/geoSourceManager.js +3 -2
  197. package/src/coord/geo/parseGeoJson.js +3 -2
  198. package/src/coord/radar/Radar.js +6 -8
  199. package/src/data/DataDimensionInfo.js +135 -0
  200. package/src/data/List.js +29 -16
  201. package/src/data/Tree.js +12 -17
  202. package/src/data/helper/completeDimensions.js +49 -30
  203. package/src/data/helper/createDimensions.js +2 -0
  204. package/src/data/helper/sourceHelper.js +216 -124
  205. package/src/echarts.js +60 -36
  206. package/src/langEN.js +26 -0
  207. package/src/layout/barGrid.js +22 -10
  208. package/src/layout/barPolar.js +0 -4
  209. package/src/loading/default.js +46 -34
  210. package/src/model/Series.js +4 -4
  211. package/src/model/referHelper.js +34 -11
  212. package/src/scale/Interval.js +84 -4
  213. package/src/scale/Log.js +9 -2
  214. package/src/scale/helper.js +1 -39
  215. package/src/stream/Scheduler.js +8 -0
  216. package/src/theme/dark.js +3 -0
  217. package/src/util/format.js +17 -1
  218. package/src/util/graphic.js +13 -11
  219. package/src/visual/LegendVisualProvider.js +55 -0
  220. package/src/visual/dataColor.js +0 -13
  221. package/src/visual/seriesColor.js +13 -7
  222. package/src/visual/symbol.js +11 -2
  223. package/theme/azul.js +163 -0
  224. package/theme/bee-inspired.js +178 -0
  225. package/theme/blue.js +178 -0
  226. package/theme/caravan.js +178 -0
  227. package/theme/carp.js +163 -0
  228. package/theme/cool.js +180 -0
  229. package/theme/dark-blue.js +168 -0
  230. package/theme/dark-bold.js +168 -0
  231. package/theme/dark-digerati.js +168 -0
  232. package/theme/dark-fresh-cut.js +168 -0
  233. package/theme/dark-mushroom.js +168 -0
  234. package/theme/dark.js +69 -62
  235. package/theme/eduardo.js +178 -0
  236. package/theme/forest.js +163 -0
  237. package/theme/fresh-cut.js +163 -0
  238. package/theme/fruit.js +178 -0
  239. package/theme/gray.js +220 -0
  240. package/theme/green.js +222 -0
  241. package/theme/helianthus.js +263 -0
  242. package/theme/infographic.js +72 -57
  243. package/theme/inspired.js +163 -0
  244. package/theme/jazz.js +163 -0
  245. package/theme/london.js +163 -0
  246. package/theme/macarons.js +80 -57
  247. package/theme/macarons2.js +251 -0
  248. package/theme/mint.js +155 -0
  249. package/theme/red-velvet.js +163 -0
  250. package/theme/red.js +225 -0
  251. package/theme/roma.js +55 -22
  252. package/theme/royal.js +163 -0
  253. package/theme/sakura.js +140 -0
  254. package/theme/shine.js +52 -45
  255. package/theme/tech-blue.js +180 -0
  256. package/theme/vintage.js +37 -23
@@ -186,7 +186,7 @@ Radar.prototype.update = function (ecModel, api) {
186
186
  }
187
187
  // Force all the axis fixing the maxSplitNumber.
188
188
  zrUtil.each(indicatorAxes, function (indicatorAxis, idx) {
189
- var rawExtent = getScaleExtent(indicatorAxis.scale, indicatorAxis.model);
189
+ var rawExtent = getScaleExtent(indicatorAxis.scale, indicatorAxis.model).extent;
190
190
  niceScaleExtent(indicatorAxis.scale, indicatorAxis.model);
191
191
 
192
192
  var axisModel = indicatorAxis.model;
@@ -195,6 +195,7 @@ Radar.prototype.update = function (ecModel, api) {
195
195
  var fixedMax = axisModel.getMax();
196
196
  var interval = scale.getInterval();
197
197
 
198
+
198
199
  if (fixedMin != null && fixedMax != null) {
199
200
  // User set min, max, divide to get new interval
200
201
  scale.setExtent(+fixedMin, +fixedMax);
@@ -230,13 +231,10 @@ Radar.prototype.update = function (ecModel, api) {
230
231
  if (nicedSplitNumber > splitNumber) {
231
232
  interval = increaseInterval(interval);
232
233
  }
233
- // PENDING
234
- var center = Math.round((rawExtent[0] + rawExtent[1]) / 2 / interval) * interval;
235
- var halfSplitNumber = Math.round(splitNumber / 2);
236
- scale.setExtent(
237
- numberUtil.round(center - halfSplitNumber * interval),
238
- numberUtil.round(center + (splitNumber - halfSplitNumber) * interval)
239
- );
234
+ // TODO
235
+ var max = Math.ceil(rawExtent[1] / interval) * interval;
236
+ var min = numberUtil.round(max - interval * splitNumber);
237
+ scale.setExtent(min, max);
240
238
  scale.setInterval(interval);
241
239
  }
242
240
  });
@@ -0,0 +1,135 @@
1
+ /*
2
+ * Licensed to the Apache Software Foundation (ASF) under one
3
+ * or more contributor license agreements. See the NOTICE file
4
+ * distributed with this work for additional information
5
+ * regarding copyright ownership. The ASF licenses this file
6
+ * to you under the Apache License, Version 2.0 (the
7
+ * "License"); you may not use this file except in compliance
8
+ * with the License. You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing,
13
+ * software distributed under the License is distributed on an
14
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
+ * KIND, either express or implied. See the License for the
16
+ * specific language governing permissions and limitations
17
+ * under the License.
18
+ */
19
+
20
+ import * as zrUtil from 'zrender/src/core/util';
21
+
22
+ /**
23
+ * @class
24
+ * @param {Object|DataDimensionInfo} [opt] All of the fields will be shallow copied.
25
+ */
26
+ function DataDimensionInfo(opt) {
27
+ if (opt != null) {
28
+ zrUtil.extend(this, opt);
29
+ }
30
+
31
+ /**
32
+ * Dimension name.
33
+ * Mandatory.
34
+ * @type {string}
35
+ */
36
+ // this.name;
37
+
38
+ /**
39
+ * The origin name in dimsDef, see source helper.
40
+ * If displayName given, the tooltip will displayed vertically.
41
+ * Optional.
42
+ * @type {string}
43
+ */
44
+ // this.displayName;
45
+
46
+ /**
47
+ * Which coordSys dimension this dimension mapped to.
48
+ * A `coordDim` can be a "coordSysDim" that the coordSys required
49
+ * (for example, an item in `coordSysDims` of `model/referHelper#CoordSysInfo`),
50
+ * or an generated "extra coord name" if does not mapped to any "coordSysDim"
51
+ * (That is determined by whether `isExtraCoord` is `true`).
52
+ * Mandatory.
53
+ * @type {string}
54
+ */
55
+ // this.coordDim;
56
+
57
+ /**
58
+ * The index of this dimension in `series.encode[coordDim]`.
59
+ * Mandatory.
60
+ * @type {number}
61
+ */
62
+ // this.coordDimIndex;
63
+
64
+ /**
65
+ * Dimension type. The enumerable values are the key of
66
+ * `dataCtors` of `data/List`.
67
+ * Optional.
68
+ * @type {string}
69
+ */
70
+ // this.type;
71
+
72
+ /**
73
+ * This index of this dimension info in `data/List#_dimensionInfos`.
74
+ * Mandatory after added to `data/List`.
75
+ * @type {number}
76
+ */
77
+ // this.index;
78
+
79
+ /**
80
+ * The format of `otherDims` is:
81
+ * ```js
82
+ * {
83
+ * tooltip: number optional,
84
+ * label: number optional,
85
+ * itemName: number optional,
86
+ * seriesName: number optional,
87
+ * }
88
+ * ```
89
+ *
90
+ * A `series.encode` can specified these fields:
91
+ * ```js
92
+ * encode: {
93
+ * // "3, 1, 5" is the index of data dimension.
94
+ * tooltip: [3, 1, 5],
95
+ * label: [0, 3],
96
+ * ...
97
+ * }
98
+ * ```
99
+ * `otherDims` is the parse result of the `series.encode` above, like:
100
+ * ```js
101
+ * // Suppose the index of this data dimension is `3`.
102
+ * this.otherDims = {
103
+ * // `3` is at the index `0` of the `encode.tooltip`
104
+ * tooltip: 0,
105
+ * // `3` is at the index `1` of the `encode.tooltip`
106
+ * label: 1
107
+ * };
108
+ * ```
109
+ *
110
+ * This prop should never be `null`/`undefined` after initialized.
111
+ * @type {Object}
112
+ */
113
+ this.otherDims = {};
114
+
115
+ /**
116
+ * Be `true` if this dimension is not mapped to any "coordSysDim" that the
117
+ * "coordSys" required.
118
+ * Mandatory.
119
+ * @type {boolean}
120
+ */
121
+ // this.isExtraCoord;
122
+
123
+ /**
124
+ * @type {module:data/OrdinalMeta}
125
+ */
126
+ // this.ordinalMeta;
127
+
128
+ /**
129
+ * Whether to create inverted indices.
130
+ * @type {boolean}
131
+ */
132
+ // this.createInvertedIndices;
133
+ };
134
+
135
+ export default DataDimensionInfo;
package/src/data/List.js CHANGED
@@ -31,6 +31,7 @@ import DataDiffer from './DataDiffer';
31
31
  import Source from './Source';
32
32
  import {defaultDimValueGetters, DefaultDataProvider} from './helper/dataProvider';
33
33
  import {summarizeDimensions} from './helper/dimensionHelper';
34
+ import DataDimensionInfo from './DataDimensionInfo';
34
35
 
35
36
  var isObject = zrUtil.isObject;
36
37
 
@@ -102,13 +103,9 @@ function transferProperties(target, source) {
102
103
  * @constructor
103
104
  * @alias module:echarts/data/List
104
105
  *
105
- * @param {Array.<string|Object>} dimensions
106
+ * @param {Array.<string|Object|module:data/DataDimensionInfo>} dimensions
106
107
  * For example, ['someDimName', {name: 'someDimName', type: 'someDimType'}, ...].
107
108
  * Dimensions should be concrete names like x, y, z, lng, lat, angle, radius
108
- * Spetial fields: {
109
- * ordinalMeta: <module:echarts/data/OrdinalMeta>
110
- * createInvertedIndices: <boolean>
111
- * }
112
109
  * @param {module:echarts/model/Model} hostModel
113
110
  */
114
111
  var List = function (dimensions, hostModel) {
@@ -124,7 +121,10 @@ var List = function (dimensions, hostModel) {
124
121
  var dimensionInfo = dimensions[i];
125
122
 
126
123
  if (zrUtil.isString(dimensionInfo)) {
127
- dimensionInfo = {name: dimensionInfo};
124
+ dimensionInfo = new DataDimensionInfo({name: dimensionInfo});
125
+ }
126
+ else if (!(dimensionInfo instanceof DataDimensionInfo)) {
127
+ dimensionInfo = new DataDimensionInfo(dimensionInfo);
128
128
  }
129
129
 
130
130
  var dimensionName = dimensionInfo.name;
@@ -1144,7 +1144,8 @@ listProto.indexOfRawIndex = function (rawIndex) {
1144
1144
  * @param {string} dim
1145
1145
  * @param {number} value
1146
1146
  * @param {number} [maxDistance=Infinity]
1147
- * @return {Array.<number>} Considere multiple points has the same value.
1147
+ * @return {Array.<number>} If and only if multiple indices has
1148
+ * the same value, they are put to the result.
1148
1149
  */
1149
1150
  listProto.indicesOfNearest = function (dim, value, maxDistance) {
1150
1151
  var storage = this._storage;
@@ -1159,23 +1160,35 @@ listProto.indicesOfNearest = function (dim, value, maxDistance) {
1159
1160
  maxDistance = Infinity;
1160
1161
  }
1161
1162
 
1162
- var minDist = Number.MAX_VALUE;
1163
+ var minDist = Infinity;
1163
1164
  var minDiff = -1;
1165
+ var nearestIndicesLen = 0;
1166
+
1167
+ // Check the test case of `test/ut/spec/data/List.js`.
1164
1168
  for (var i = 0, len = this.count(); i < len; i++) {
1165
- var diff = value - this.get(dim, i /*, stack */);
1169
+ var diff = value - this.get(dim, i);
1166
1170
  var dist = Math.abs(diff);
1167
- if (diff <= maxDistance && dist <= minDist) {
1168
- // For the case of two data are same on xAxis, which has sequence data.
1169
- // Show the nearest index
1170
- // https://github.com/ecomfe/echarts/issues/2869
1171
- if (dist < minDist || (diff >= 0 && minDiff < 0)) {
1171
+ if (dist <= maxDistance) {
1172
+ // When the `value` is at the middle of `this.get(dim, i)` and `this.get(dim, i+1)`,
1173
+ // we'd better not push both of them to `nearestIndices`, otherwise it is easy to
1174
+ // get more than one item in `nearestIndices` (more specifically, in `tooltip`).
1175
+ // So we chose the one that `diff >= 0` in this csae.
1176
+ // But if `this.get(dim, i)` and `this.get(dim, j)` get the same value, both of them
1177
+ // should be push to `nearestIndices`.
1178
+ if (dist < minDist
1179
+ || (dist === minDist && diff >= 0 && minDiff < 0)
1180
+ ) {
1172
1181
  minDist = dist;
1173
1182
  minDiff = diff;
1174
- nearestIndices.length = 0;
1183
+ nearestIndicesLen = 0;
1184
+ }
1185
+ if (diff === minDiff) {
1186
+ nearestIndices[nearestIndicesLen++] = i;
1175
1187
  }
1176
- nearestIndices.push(i);
1177
1188
  }
1178
1189
  }
1190
+ nearestIndices.length = nearestIndicesLen;
1191
+
1179
1192
  return nearestIndices;
1180
1193
  };
1181
1194
 
package/src/data/Tree.js CHANGED
@@ -248,11 +248,14 @@ TreeNode.prototype = {
248
248
  var hostTree = this.hostTree;
249
249
  var itemModel = hostTree.data.getItemModel(this.dataIndex);
250
250
  var levelModel = this.getLevelModel();
251
- var leavesModel;
252
- if (!levelModel && (this.children.length === 0 || (this.children.length !== 0 && this.isExpand === false))) {
253
- leavesModel = this.getLeavesModel();
251
+
252
+ // FIXME: refactor levelModel to "beforeLink", and remove levelModel here.
253
+ if (levelModel) {
254
+ return itemModel.getModel(path, levelModel.getModel(path));
255
+ }
256
+ else {
257
+ return itemModel.getModel(path);
254
258
  }
255
- return itemModel.getModel(path, (levelModel || leavesModel || hostTree.hostModel).getModel(path));
256
259
  },
257
260
 
258
261
  /**
@@ -262,13 +265,6 @@ TreeNode.prototype = {
262
265
  return (this.hostTree.levelModels || [])[this.depth];
263
266
  },
264
267
 
265
- /**
266
- * @return {module:echarts/model/Model}
267
- */
268
- getLeavesModel: function () {
269
- return this.hostTree.leavesModel;
270
- },
271
-
272
268
  /**
273
269
  * @example
274
270
  * setItemVisual('color', color);
@@ -339,9 +335,8 @@ TreeNode.prototype = {
339
335
  * @alias module:echarts/data/Tree
340
336
  * @param {module:echarts/model/Model} hostModel
341
337
  * @param {Array.<Object>} levelOptions
342
- * @param {Object} leavesOption
343
338
  */
344
- function Tree(hostModel, levelOptions, leavesOption) {
339
+ function Tree(hostModel, levelOptions) {
345
340
  /**
346
341
  * @type {module:echarts/data/Tree~TreeNode}
347
342
  * @readOnly
@@ -377,7 +372,6 @@ function Tree(hostModel, levelOptions, leavesOption) {
377
372
  return new Model(levelDefine, hostModel, hostModel.ecModel);
378
373
  });
379
374
 
380
- this.leavesModel = new Model(leavesOption || {}, hostModel, hostModel.ecModel);
381
375
  }
382
376
 
383
377
  Tree.prototype = {
@@ -469,12 +463,11 @@ Tree.prototype = {
469
463
  * @param {module:echarts/model/Model} hostModel
470
464
  * @param {Object} treeOptions
471
465
  * @param {Array.<Object>} treeOptions.levels
472
- * @param {Array.<Object>} treeOptions.leaves
473
466
  * @return module:echarts/data/Tree
474
467
  */
475
- Tree.createTree = function (dataRoot, hostModel, treeOptions) {
468
+ Tree.createTree = function (dataRoot, hostModel, treeOptions, beforeLink) {
476
469
 
477
- var tree = new Tree(hostModel, treeOptions.levels, treeOptions.leaves);
470
+ var tree = new Tree(hostModel, treeOptions && treeOptions.levels);
478
471
  var listData = [];
479
472
  var dimMax = 1;
480
473
 
@@ -511,6 +504,8 @@ Tree.createTree = function (dataRoot, hostModel, treeOptions) {
511
504
  var list = new List(dimensionsInfo, hostModel);
512
505
  list.initData(listData);
513
506
 
507
+ beforeLink && beforeLink(list);
508
+
514
509
  linkList({
515
510
  mainData: list,
516
511
  struct: tree,
@@ -24,15 +24,20 @@
24
24
 
25
25
  import {createHashMap, each, isString, defaults, extend, isObject, clone} from 'zrender/src/core/util';
26
26
  import {normalizeToArray} from '../../util/model';
27
- import {guessOrdinal} from './sourceHelper';
27
+ import {guessOrdinal, BE_ORDINAL} from './sourceHelper';
28
28
  import Source from '../Source';
29
29
  import {OTHER_DIMENSIONS} from './dimensionHelper';
30
+ import DataDimensionInfo from '../DataDimensionInfo';
30
31
 
31
32
  /**
32
33
  * @see {module:echarts/test/ut/spec/data/completeDimensions}
33
34
  *
34
- * Complete the dimensions array, by user defined `dimension` and `encode`,
35
- * and guessing from the data structure.
35
+ * This method builds the relationship between:
36
+ * + "what the coord sys or series requires (see `sysDims`)",
37
+ * + "what the user defines (in `encode` and `dimensions`, see `opt.dimsDef` and `opt.encodeDef`)"
38
+ * + "what the data source provids (see `source`)".
39
+ *
40
+ * Some guess strategy will be adapted if user does not define something.
36
41
  * If no 'value' dimension specified, the first no-named dimension will be
37
42
  * named as 'value'.
38
43
  *
@@ -48,32 +53,20 @@ import {OTHER_DIMENSIONS} from './dimensionHelper';
48
53
  * @param {Array.<Object|string>} [opt.dimsDef] option.series.dimensions User defined dimensions
49
54
  * For example: ['asdf', {name, type}, ...].
50
55
  * @param {Object|HashMap} [opt.encodeDef] option.series.encode {x: 2, y: [3, 1], tooltip: [1, 2], label: 3}
56
+ * @param {Function} [opt.encodeDefaulter] Called if no `opt.encodeDef` exists.
57
+ * If not specified, auto find the next available data dim.
58
+ * param source {module:data/Source}
59
+ * param dimCount {number}
60
+ * return {Object} encode Never be `null/undefined`.
51
61
  * @param {string} [opt.generateCoord] Generate coord dim with the given name.
52
- * If not specified, extra dim names will be:
53
- * 'value', 'value0', 'value1', ...
62
+ * If not specified, extra dim names will be:
63
+ * 'value', 'value0', 'value1', ...
54
64
  * @param {number} [opt.generateCoordCount] By default, the generated dim name is `generateCoord`.
55
- * If `generateCoordCount` specified, the generated dim names will be:
56
- * `generateCoord` + 0, `generateCoord` + 1, ...
57
- * can be Infinity, indicate that use all of the remain columns.
65
+ * If `generateCoordCount` specified, the generated dim names will be:
66
+ * `generateCoord` + 0, `generateCoord` + 1, ...
67
+ * can be Infinity, indicate that use all of the remain columns.
58
68
  * @param {number} [opt.dimCount] If not specified, guess by the first data item.
59
- * @param {number} [opt.encodeDefaulter] If not specified, auto find the next available data dim.
60
- * @return {Array.<Object>} [{
61
- * name: string mandatory,
62
- * displayName: string, the origin name in dimsDef, see source helper.
63
- * If displayName given, the tooltip will displayed vertically.
64
- * coordDim: string mandatory,
65
- * coordDimIndex: number mandatory,
66
- * type: string optional,
67
- * otherDims: { never null/undefined
68
- * tooltip: number optional,
69
- * label: number optional,
70
- * itemName: number optional,
71
- * seriesName: number optional,
72
- * },
73
- * isExtraCoord: boolean true if coord is generated
74
- * (not specified in encode and not series specified)
75
- * other props ...
76
- * }]
69
+ * @return {Array.<module:data/DataDimensionInfo>}
77
70
  */
78
71
  function completeDimensions(sysDims, source, opt) {
79
72
  if (!Source.isInstance(source)) {
@@ -83,7 +76,6 @@ function completeDimensions(sysDims, source, opt) {
83
76
  opt = opt || {};
84
77
  sysDims = (sysDims || []).slice();
85
78
  var dimsDef = (opt.dimsDef || []).slice();
86
- var encodeDef = createHashMap(opt.encodeDef);
87
79
  var dataDimNameMap = createHashMap();
88
80
  var coordDimNameMap = createHashMap();
89
81
  // var valueCandidate;
@@ -97,7 +89,7 @@ function completeDimensions(sysDims, source, opt) {
97
89
  {}, isObject(dimsDef[i]) ? dimsDef[i] : {name: dimsDef[i]}
98
90
  );
99
91
  var userDimName = dimDefItem.name;
100
- var resultItem = result[i] = {otherDims: {}};
92
+ var resultItem = result[i] = new DataDimensionInfo();
101
93
  // Name will be applied later for avoiding duplication.
102
94
  if (userDimName != null && dataDimNameMap.get(userDimName) == null) {
103
95
  // Only if `series.dimensions` is defined in option
@@ -110,6 +102,12 @@ function completeDimensions(sysDims, source, opt) {
110
102
  dimDefItem.displayName != null && (resultItem.displayName = dimDefItem.displayName);
111
103
  }
112
104
 
105
+ var encodeDef = opt.encodeDef;
106
+ if (!encodeDef && opt.encodeDefaulter) {
107
+ encodeDef = opt.encodeDefaulter(source, dimCount);
108
+ }
109
+ encodeDef = createHashMap(encodeDef);
110
+
113
111
  // Set `coordDim` and `coordDimIndex` by `encodeDef` and normalize `encodeDef`.
114
112
  encodeDef.each(function (dataDims, coordDim) {
115
113
  dataDims = normalizeToArray(dataDims).slice();
@@ -211,7 +209,7 @@ function completeDimensions(sysDims, source, opt) {
211
209
 
212
210
  // Set dim `name` and other `coordDim` and other props.
213
211
  for (var resultDimIdx = 0; resultDimIdx < dimCount; resultDimIdx++) {
214
- var resultItem = result[resultDimIdx] = result[resultDimIdx] || {};
212
+ var resultItem = result[resultDimIdx] = result[resultDimIdx] || new DataDimensionInfo();
215
213
  var coordDim = resultItem.coordDim;
216
214
 
217
215
  if (coordDim == null) {
@@ -230,7 +228,28 @@ function completeDimensions(sysDims, source, opt) {
230
228
  dataDimNameMap
231
229
  ));
232
230
 
233
- if (resultItem.type == null && guessOrdinal(source, resultDimIdx, resultItem.name)) {
231
+ if (resultItem.type == null
232
+ && (
233
+ guessOrdinal(source, resultDimIdx, resultItem.name) === BE_ORDINAL.Must
234
+ // Consider the case:
235
+ // {
236
+ // dataset: {source: [
237
+ // ['2001', 123],
238
+ // ['2002', 456],
239
+ // ...
240
+ // ['The others', 987],
241
+ // ]},
242
+ // series: {type: 'pie'}
243
+ // }
244
+ // The first colum should better be treated as a "ordinal" although it
245
+ // might not able to be detected as an "ordinal" by `guessOrdinal`.
246
+ || (resultItem.isExtraCoord
247
+ && (resultItem.otherDims.itemName != null
248
+ || resultItem.otherDims.seriesName != null
249
+ )
250
+ )
251
+ )
252
+ ) {
234
253
  resultItem.type = 'ordinal';
235
254
  }
236
255
  }
@@ -32,6 +32,7 @@ import completeDimensions from './completeDimensions';
32
32
  * @param {string} [opt.generateCoordCount]
33
33
  * @param {Array.<string|Object>} [opt.dimensionsDefine=source.dimensionsDefine] Overwrite source define.
34
34
  * @param {Object|HashMap} [opt.encodeDefine=source.encodeDefine] Overwrite source define.
35
+ * @param {Function} [opt.encodeDefaulter] Make default encode if user not specified.
35
36
  * @return {Array.<Object>} dimensionsInfo
36
37
  */
37
38
  export default function (source, opt) {
@@ -40,6 +41,7 @@ export default function (source, opt) {
40
41
  dimsDef: opt.dimensionsDefine || source.dimensionsDefine,
41
42
  encodeDef: opt.encodeDefine || source.encodeDefine,
42
43
  dimCount: opt.dimensionsCount,
44
+ encodeDefaulter: opt.encodeDefaulter,
43
45
  generateCoord: opt.generateCoord,
44
46
  generateCoordCount: opt.generateCoordCount
45
47
  });