echarts 4.4.0 → 4.6.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 (211) hide show
  1. package/.github/ISSUE_TEMPLATE.md +1 -1
  2. package/.github/workflows/nodejs.yml +31 -0
  3. package/CONTRIBUTING.md +2 -2
  4. package/README.md +6 -12
  5. package/dist/echarts-en.common.js +2354 -1029
  6. package/dist/echarts-en.common.min.js +1 -1
  7. package/dist/echarts-en.js +2727 -1138
  8. package/dist/echarts-en.js.map +1 -1
  9. package/dist/echarts-en.min.js +1 -1
  10. package/dist/echarts-en.simple.js +2028 -759
  11. package/dist/echarts-en.simple.min.js +1 -1
  12. package/dist/echarts.common.js +2354 -1029
  13. package/dist/echarts.common.min.js +1 -1
  14. package/dist/echarts.js +2727 -1138
  15. package/dist/echarts.js.map +1 -1
  16. package/dist/echarts.min.js +1 -1
  17. package/dist/echarts.simple.js +2028 -759
  18. package/dist/echarts.simple.min.js +1 -1
  19. package/dist/extension/dataTool.js +9 -0
  20. package/dist/extension/dataTool.js.map +1 -1
  21. package/echarts.all.js +1 -1
  22. package/lib/chart/bar/BarSeries.js +4 -1
  23. package/lib/chart/bar/BarView.js +20 -6
  24. package/lib/chart/bar/BaseBarSeries.js +5 -1
  25. package/lib/chart/candlestick/CandlestickSeries.js +1 -0
  26. package/lib/chart/candlestick/CandlestickView.js +42 -1
  27. package/lib/chart/custom.js +1 -0
  28. package/lib/chart/effectScatter/EffectScatterSeries.js +3 -1
  29. package/lib/chart/funnel/FunnelSeries.js +15 -5
  30. package/lib/chart/gauge/GaugeSeries.js +0 -9
  31. package/lib/chart/graph/GraphSeries.js +11 -4
  32. package/lib/chart/graph/GraphView.js +28 -8
  33. package/lib/chart/graph/forceHelper.js +8 -2
  34. package/lib/chart/graph/forceLayout.js +5 -2
  35. package/lib/chart/heatmap/HeatmapView.js +4 -4
  36. package/lib/chart/helper/Symbol.js +8 -0
  37. package/lib/chart/helper/createListFromArray.js +14 -8
  38. package/lib/chart/helper/whiskerBoxCommon.js +22 -16
  39. package/lib/chart/line/LineSeries.js +3 -1
  40. package/lib/chart/line/LineView.js +8 -2
  41. package/lib/chart/map/MapSeries.js +8 -1
  42. package/lib/chart/pie/PieSeries.js +27 -6
  43. package/lib/chart/pie/PieView.js +1 -1
  44. package/lib/chart/pie/labelLayout.js +102 -19
  45. package/lib/chart/pie/pieLayout.js +19 -7
  46. package/lib/chart/radar/RadarSeries.js +3 -3
  47. package/lib/chart/sankey/SankeyView.js +28 -9
  48. package/lib/chart/scatter/ScatterSeries.js +3 -1
  49. package/lib/chart/themeRiver/ThemeRiverSeries.js +3 -3
  50. package/lib/chart/tree/TreeSeries.js +15 -1
  51. package/lib/chart/tree/TreeView.js +4 -2
  52. package/lib/component/axis/AngleAxisView.js +97 -20
  53. package/lib/component/axis/AxisBuilder.js +63 -24
  54. package/lib/component/axis/CartesianAxisView.js +55 -11
  55. package/lib/component/axis/RadiusAxisView.js +36 -4
  56. package/lib/component/brush/BrushView.js +6 -0
  57. package/lib/component/brush/brushAction.js +5 -0
  58. package/lib/component/dataZoom/DataZoomModel.js +15 -1
  59. package/lib/component/dataZoom/SliderZoomView.js +4 -10
  60. package/lib/component/helper/BrushController.js +43 -25
  61. package/lib/component/legend/LegendModel.js +3 -3
  62. package/lib/component/legend/LegendView.js +17 -13
  63. package/lib/component/toolbox/ToolboxView.js +16 -7
  64. package/lib/component/toolbox/feature/MagicType.js +19 -14
  65. package/lib/coord/Axis.js +44 -12
  66. package/lib/coord/axisDefault.js +21 -2
  67. package/lib/coord/axisTickLabelBuilder.js +9 -1
  68. package/lib/coord/cartesian/Cartesian2D.js +0 -15
  69. package/lib/coord/geo/geoJSONLoader.js +1 -1
  70. package/lib/coord/polar/polarCreator.js +11 -2
  71. package/lib/coord/radar/Radar.js +3 -1
  72. package/lib/coord/radar/RadarModel.js +4 -1
  73. package/lib/data/DataDiffer.js +2 -4
  74. package/lib/data/DataDimensionInfo.js +157 -0
  75. package/lib/data/List.js +29 -23
  76. package/lib/data/Tree.js +2 -1
  77. package/lib/data/helper/completeDimensions.js +43 -32
  78. package/lib/data/helper/createDimensions.js +2 -0
  79. package/lib/data/helper/sourceHelper.js +214 -114
  80. package/lib/echarts.js +2 -2
  81. package/lib/layout/barGrid.js +136 -11
  82. package/lib/layout/barPolar.js +2 -2
  83. package/lib/model/Global.js +1 -1
  84. package/lib/model/Series.js +3 -3
  85. package/lib/model/referHelper.js +40 -12
  86. package/lib/scale/Interval.js +87 -2
  87. package/lib/scale/Log.js +9 -2
  88. package/lib/scale/helper.js +1 -43
  89. package/lib/theme/dark.js +3 -0
  90. package/lib/util/graphic.js +1 -2
  91. package/lib/util/number.js +25 -1
  92. package/lib/util/shape/sausage.js +93 -0
  93. package/lib/visual/LegendVisualProvider.js +75 -0
  94. package/lib/visual/dataColor.js +2 -12
  95. package/lib/visual/seriesColor.js +15 -7
  96. package/map/js/china.js +2 -2
  97. package/map/json/china.json +1 -1
  98. package/map/json/province/tianjin.json +1 -1
  99. package/package.json +3 -2
  100. package/src/chart/bar/BarSeries.js +5 -1
  101. package/src/chart/bar/BarView.js +24 -8
  102. package/src/chart/bar/BaseBarSeries.js +5 -1
  103. package/src/chart/candlestick/CandlestickSeries.js +2 -0
  104. package/src/chart/candlestick/CandlestickView.js +44 -1
  105. package/src/chart/custom.js +1 -0
  106. package/src/chart/effectScatter/EffectScatterSeries.js +1 -1
  107. package/src/chart/funnel/FunnelSeries.js +11 -4
  108. package/src/chart/gauge/GaugeSeries.js +0 -6
  109. package/src/chart/graph/GraphSeries.js +10 -3
  110. package/src/chart/graph/GraphView.js +26 -8
  111. package/src/chart/graph/forceHelper.js +7 -3
  112. package/src/chart/graph/forceLayout.js +6 -3
  113. package/src/chart/heatmap/HeatmapView.js +4 -4
  114. package/src/chart/helper/Symbol.js +9 -0
  115. package/src/chart/helper/createClipPathFromCoordSys.js +5 -1
  116. package/src/chart/helper/createGraphFromNodeEdge.js +1 -1
  117. package/src/chart/helper/createListFromArray.js +13 -8
  118. package/src/chart/helper/whiskerBoxCommon.js +21 -16
  119. package/src/chart/line/LineSeries.js +1 -1
  120. package/src/chart/line/LineView.js +6 -1
  121. package/src/chart/map/MapSeries.js +5 -1
  122. package/src/chart/pie/PieSeries.js +26 -5
  123. package/src/chart/pie/PieView.js +1 -1
  124. package/src/chart/pie/labelLayout.js +114 -22
  125. package/src/chart/pie/pieLayout.js +20 -7
  126. package/src/chart/radar/RadarSeries.js +5 -3
  127. package/src/chart/sankey/SankeyView.js +26 -9
  128. package/src/chart/scatter/ScatterSeries.js +1 -1
  129. package/src/chart/themeRiver/ThemeRiverSeries.js +4 -3
  130. package/src/chart/tree/TreeSeries.js +12 -1
  131. package/src/chart/tree/TreeView.js +5 -2
  132. package/src/component/axis/AngleAxisView.js +106 -19
  133. package/src/component/axis/AxisBuilder.js +78 -33
  134. package/src/component/axis/CartesianAxisView.js +58 -11
  135. package/src/component/axis/RadiusAxisView.js +37 -4
  136. package/src/component/brush/BrushView.js +6 -0
  137. package/src/component/brush/brushAction.js +6 -1
  138. package/src/component/dataZoom/DataZoomModel.js +15 -1
  139. package/src/component/dataZoom/SliderZoomView.js +4 -9
  140. package/src/component/helper/BrushController.js +50 -28
  141. package/src/component/legend/LegendModel.js +3 -3
  142. package/src/component/legend/LegendView.js +18 -12
  143. package/src/component/toolbox/ToolboxView.js +18 -5
  144. package/src/component/toolbox/feature/MagicType.js +18 -13
  145. package/src/coord/Axis.js +48 -13
  146. package/src/coord/axisDefault.js +25 -1
  147. package/src/coord/axisTickLabelBuilder.js +10 -0
  148. package/src/coord/cartesian/Cartesian2D.js +0 -13
  149. package/src/coord/geo/geoJSONLoader.js +2 -2
  150. package/src/coord/polar/polarCreator.js +16 -3
  151. package/src/coord/radar/Radar.js +3 -1
  152. package/src/coord/radar/RadarModel.js +5 -2
  153. package/src/data/DataDiffer.js +1 -4
  154. package/src/data/DataDimensionInfo.js +135 -0
  155. package/src/data/Graph.js +1 -1
  156. package/src/data/List.js +33 -20
  157. package/src/data/Tree.js +3 -1
  158. package/src/data/helper/completeDimensions.js +49 -30
  159. package/src/data/helper/createDimensions.js +2 -0
  160. package/src/data/helper/sourceHelper.js +216 -124
  161. package/src/echarts.js +2 -2
  162. package/src/layout/barGrid.js +136 -13
  163. package/src/layout/barPolar.js +3 -2
  164. package/src/model/Global.js +1 -1
  165. package/src/model/Series.js +3 -3
  166. package/src/model/referHelper.js +34 -11
  167. package/src/scale/Interval.js +84 -4
  168. package/src/scale/Log.js +9 -2
  169. package/src/scale/helper.js +1 -39
  170. package/src/theme/dark.js +3 -0
  171. package/src/util/graphic.js +1 -2
  172. package/src/util/number.js +22 -2
  173. package/src/util/shape/sausage.js +93 -0
  174. package/src/visual/LegendVisualProvider.js +55 -0
  175. package/src/visual/dataColor.js +0 -13
  176. package/src/visual/seriesColor.js +13 -7
  177. package/theme/azul.js +163 -0
  178. package/theme/bee-inspired.js +178 -0
  179. package/theme/blue.js +178 -0
  180. package/theme/caravan.js +178 -0
  181. package/theme/carp.js +163 -0
  182. package/theme/cool.js +180 -0
  183. package/theme/dark-blue.js +168 -0
  184. package/theme/dark-bold.js +168 -0
  185. package/theme/dark-digerati.js +168 -0
  186. package/theme/dark-fresh-cut.js +168 -0
  187. package/theme/dark-mushroom.js +168 -0
  188. package/theme/dark.js +69 -62
  189. package/theme/eduardo.js +178 -0
  190. package/theme/forest.js +163 -0
  191. package/theme/fresh-cut.js +163 -0
  192. package/theme/fruit.js +178 -0
  193. package/theme/gray.js +220 -0
  194. package/theme/green.js +222 -0
  195. package/theme/helianthus.js +263 -0
  196. package/theme/infographic.js +72 -57
  197. package/theme/inspired.js +163 -0
  198. package/theme/jazz.js +163 -0
  199. package/theme/london.js +163 -0
  200. package/theme/macarons.js +80 -57
  201. package/theme/macarons2.js +251 -0
  202. package/theme/mint.js +155 -0
  203. package/theme/red-velvet.js +163 -0
  204. package/theme/red.js +225 -0
  205. package/theme/roma.js +55 -22
  206. package/theme/royal.js +163 -0
  207. package/theme/sakura.js +140 -0
  208. package/theme/shine.js +52 -45
  209. package/theme/tech-blue.js +180 -0
  210. package/theme/vintage.js +37 -23
  211. package/.travis.yml +0 -16
@@ -19,7 +19,6 @@
19
19
 
20
20
  import {__DEV__} from '../../config';
21
21
  import {makeInner, getDataItemValue} from '../../util/model';
22
- import {getCoordSysDefineBySeries} from '../../model/referHelper';
23
22
  import {
24
23
  createHashMap,
25
24
  each,
@@ -44,6 +43,12 @@ import {
44
43
  SERIES_LAYOUT_BY_ROW
45
44
  } from './sourceType';
46
45
 
46
+ // The result of `guessOrdinal`.
47
+ export var BE_ORDINAL = {
48
+ Must: 1, // Encounter string but not '-' and not number-like.
49
+ Might: 2, // Encounter string but number-like.
50
+ Not: 3 // Other cases
51
+ };
47
52
 
48
53
  var inner = makeInner();
49
54
 
@@ -178,14 +183,6 @@ export function prepareSource(seriesModel) {
178
183
  data, sourceFormat, seriesLayoutBy, sourceHeader, dimensionsDefine
179
184
  );
180
185
 
181
- // Note: dataset option does not have `encode`.
182
- var encodeDefine = seriesOption.encode;
183
- if (!encodeDefine && datasetModel) {
184
- encodeDefine = makeDefaultEncode(
185
- seriesModel, datasetModel, data, sourceFormat, seriesLayoutBy, completeResult
186
- );
187
- }
188
-
189
186
  inner(seriesModel).source = new Source({
190
187
  data: data,
191
188
  fromDataset: fromDataset,
@@ -194,7 +191,8 @@ export function prepareSource(seriesModel) {
194
191
  dimensionsDefine: completeResult.dimensionsDefine,
195
192
  startIndex: completeResult.startIndex,
196
193
  dimensionsDetectCount: completeResult.dimensionsDetectCount,
197
- encodeDefine: encodeDefine
194
+ // Note: dataset option does not have `encode`.
195
+ encodeDefine: seriesOption.encode
198
196
  });
199
197
  }
200
198
 
@@ -206,7 +204,6 @@ function completeBySourceData(data, sourceFormat, seriesLayoutBy, sourceHeader,
206
204
 
207
205
  var dimensionsDetectCount;
208
206
  var startIndex;
209
- var findPotentialName;
210
207
 
211
208
  if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {
212
209
  // Rule: Most of the first line are string: it is header.
@@ -249,13 +246,11 @@ function completeBySourceData(data, sourceFormat, seriesLayoutBy, sourceHeader,
249
246
  else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {
250
247
  if (!dimensionsDefine) {
251
248
  dimensionsDefine = objectRowsCollectDimensions(data);
252
- findPotentialName = true;
253
249
  }
254
250
  }
255
251
  else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {
256
252
  if (!dimensionsDefine) {
257
253
  dimensionsDefine = [];
258
- findPotentialName = true;
259
254
  each(data, function (colArr, key) {
260
255
  dimensionsDefine.push(key);
261
256
  });
@@ -271,21 +266,10 @@ function completeBySourceData(data, sourceFormat, seriesLayoutBy, sourceHeader,
271
266
  }
272
267
  }
273
268
 
274
- var potentialNameDimIndex;
275
- if (findPotentialName) {
276
- each(dimensionsDefine, function (dim, idx) {
277
- if ((isObject(dim) ? dim.name : dim) === 'name') {
278
- potentialNameDimIndex = idx;
279
- }
280
- });
281
- }
282
-
283
269
  return {
284
270
  startIndex: startIndex,
285
271
  dimensionsDefine: normalizeDimensionsDefine(dimensionsDefine),
286
- dimensionsDetectCount: dimensionsDetectCount,
287
- potentialNameDimIndex: potentialNameDimIndex
288
- // TODO: potentialIdDimIdx
272
+ dimensionsDetectCount: dimensionsDetectCount
289
273
  };
290
274
  }
291
275
 
@@ -359,103 +343,198 @@ function objectRowsCollectDimensions(data) {
359
343
  }
360
344
  }
361
345
 
362
- // ??? TODO merge to completedimensions, where also has
363
- // default encode making logic. And the default rule
364
- // should depends on series? consider 'map'.
365
- function makeDefaultEncode(
366
- seriesModel, datasetModel, data, sourceFormat, seriesLayoutBy, completeResult
367
- ) {
368
- var coordSysDefine = getCoordSysDefineBySeries(seriesModel);
346
+ /**
347
+ * [The strategy of the arrengment of data dimensions for dataset]:
348
+ * "value way": all axes are non-category axes. So series one by one take
349
+ * several (the number is coordSysDims.length) dimensions from dataset.
350
+ * The result of data arrengment of data dimensions like:
351
+ * | ser0_x | ser0_y | ser1_x | ser1_y | ser2_x | ser2_y |
352
+ * "category way": at least one axis is category axis. So the the first data
353
+ * dimension is always mapped to the first category axis and shared by
354
+ * all of the series. The other data dimensions are taken by series like
355
+ * "value way" does.
356
+ * The result of data arrengment of data dimensions like:
357
+ * | ser_shared_x | ser0_y | ser1_y | ser2_y |
358
+ *
359
+ * @param {Array.<Object|string>} coordDimensions [{name: <string>, type: <string>, dimsDef: <Array>}, ...]
360
+ * @param {module:model/Series} seriesModel
361
+ * @param {module:data/Source} source
362
+ * @return {Object} encode Never be `null/undefined`.
363
+ */
364
+ export function makeSeriesEncodeForAxisCoordSys(coordDimensions, seriesModel, source) {
369
365
  var encode = {};
370
- // var encodeTooltip = [];
371
- // var encodeLabel = [];
366
+
367
+ var datasetModel = getDatasetModel(seriesModel);
368
+ // Currently only make default when using dataset, util more reqirements occur.
369
+ if (!datasetModel || !coordDimensions) {
370
+ return encode;
371
+ }
372
+
372
373
  var encodeItemName = [];
373
374
  var encodeSeriesName = [];
374
- var seriesType = seriesModel.subType;
375
-
376
- // ??? TODO refactor: provide by series itself.
377
- // Consider the case: 'map' series is based on geo coordSys,
378
- // 'graph', 'heatmap' can be based on cartesian. But can not
379
- // give default rule simply here.
380
- var nSeriesMap = createHashMap(['pie', 'map', 'funnel']);
381
- var cSeriesMap = createHashMap([
382
- 'line', 'bar', 'pictorialBar', 'scatter', 'effectScatter', 'candlestick', 'boxplot'
383
- ]);
384
-
385
- // Usually in this case series will use the first data
386
- // dimension as the "value" dimension, or other default
387
- // processes respectively.
388
- if (coordSysDefine && cSeriesMap.get(seriesType) != null) {
389
- var ecModel = seriesModel.ecModel;
390
- var datasetMap = inner(ecModel).datasetMap;
391
- var key = datasetModel.uid + '_' + seriesLayoutBy;
392
- var datasetRecord = datasetMap.get(key)
393
- || datasetMap.set(key, {categoryWayDim: 1, valueWayDim: 0});
394
-
395
- // TODO
396
- // Auto detect first time axis and do arrangement.
397
- each(coordSysDefine.coordSysDims, function (coordDim) {
398
- // In value way.
399
- if (coordSysDefine.firstCategoryDimIndex == null) {
400
- var dataDim = datasetRecord.valueWayDim++;
401
- encode[coordDim] = dataDim;
402
-
403
- // ??? TODO give a better default series name rule?
404
- // especially when encode x y specified.
405
- // consider: when mutiple series share one dimension
406
- // category axis, series name should better use
407
- // the other dimsion name. On the other hand, use
408
- // both dimensions name.
409
-
410
- encodeSeriesName.push(dataDim);
411
- // encodeTooltip.push(dataDim);
412
- // encodeLabel.push(dataDim);
413
- }
414
- // In category way, category axis.
415
- else if (coordSysDefine.categoryAxisMap.get(coordDim)) {
416
- encode[coordDim] = 0;
417
- encodeItemName.push(0);
418
- }
419
- // In category way, non-category axis.
420
- else {
421
- var dataDim = datasetRecord.categoryWayDim++;
422
- encode[coordDim] = dataDim;
423
- // encodeTooltip.push(dataDim);
424
- // encodeLabel.push(dataDim);
425
- encodeSeriesName.push(dataDim);
375
+
376
+ var ecModel = seriesModel.ecModel;
377
+ var datasetMap = inner(ecModel).datasetMap;
378
+ var key = datasetModel.uid + '_' + source.seriesLayoutBy;
379
+
380
+ var baseCategoryDimIndex;
381
+ var categoryWayValueDimStart;
382
+ coordDimensions = coordDimensions.slice();
383
+ each(coordDimensions, function (coordDimInfo, coordDimIdx) {
384
+ !isObject(coordDimInfo) && (coordDimensions[coordDimIdx] = {name: coordDimInfo});
385
+ if (coordDimInfo.type === 'ordinal' && baseCategoryDimIndex == null) {
386
+ baseCategoryDimIndex = coordDimIdx;
387
+ categoryWayValueDimStart = getDataDimCountOnCoordDim(coordDimensions[coordDimIdx]);
388
+ }
389
+ encode[coordDimInfo.name] = [];
390
+ });
391
+
392
+ var datasetRecord = datasetMap.get(key)
393
+ || datasetMap.set(key, {categoryWayDim: categoryWayValueDimStart, valueWayDim: 0});
394
+
395
+ // TODO
396
+ // Auto detect first time axis and do arrangement.
397
+ each(coordDimensions, function (coordDimInfo, coordDimIdx) {
398
+ var coordDimName = coordDimInfo.name;
399
+ var count = getDataDimCountOnCoordDim(coordDimInfo);
400
+
401
+ // In value way.
402
+ if (baseCategoryDimIndex == null) {
403
+ var start = datasetRecord.valueWayDim;
404
+ pushDim(encode[coordDimName], start, count);
405
+ pushDim(encodeSeriesName, start, count);
406
+ datasetRecord.valueWayDim += count;
407
+
408
+ // ??? TODO give a better default series name rule?
409
+ // especially when encode x y specified.
410
+ // consider: when mutiple series share one dimension
411
+ // category axis, series name should better use
412
+ // the other dimsion name. On the other hand, use
413
+ // both dimensions name.
414
+ }
415
+ // In category way, the first category axis.
416
+ else if (baseCategoryDimIndex === coordDimIdx) {
417
+ pushDim(encode[coordDimName], 0, count);
418
+ pushDim(encodeItemName, 0, count);
419
+ }
420
+ // In category way, the other axis.
421
+ else {
422
+ var start = datasetRecord.categoryWayDim;
423
+ pushDim(encode[coordDimName], start, count);
424
+ pushDim(encodeSeriesName, start, count);
425
+ datasetRecord.categoryWayDim += count;
426
+ }
427
+ });
428
+
429
+ function pushDim(dimIdxArr, idxFrom, idxCount) {
430
+ for (var i = 0; i < idxCount; i++) {
431
+ dimIdxArr.push(idxFrom + i);
432
+ }
433
+ }
434
+
435
+ function getDataDimCountOnCoordDim(coordDimInfo) {
436
+ var dimsDef = coordDimInfo.dimsDef;
437
+ return dimsDef ? dimsDef.length : 1;
438
+ }
439
+
440
+ encodeItemName.length && (encode.itemName = encodeItemName);
441
+ encodeSeriesName.length && (encode.seriesName = encodeSeriesName);
442
+
443
+ return encode;
444
+ }
445
+
446
+ /**
447
+ * Work for data like [{name: ..., value: ...}, ...].
448
+ *
449
+ * @param {module:model/Series} seriesModel
450
+ * @param {module:data/Source} source
451
+ * @return {Object} encode Never be `null/undefined`.
452
+ */
453
+ export function makeSeriesEncodeForNameBased(seriesModel, source, dimCount) {
454
+ var encode = {};
455
+
456
+ var datasetModel = getDatasetModel(seriesModel);
457
+ // Currently only make default when using dataset, util more reqirements occur.
458
+ if (!datasetModel) {
459
+ return encode;
460
+ }
461
+
462
+ var sourceFormat = source.sourceFormat;
463
+ var dimensionsDefine = source.dimensionsDefine;
464
+
465
+ var potentialNameDimIndex;
466
+ if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS || sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {
467
+ each(dimensionsDefine, function (dim, idx) {
468
+ if ((isObject(dim) ? dim.name : dim) === 'name') {
469
+ potentialNameDimIndex = idx;
426
470
  }
427
471
  });
428
472
  }
429
- // Do not make a complex rule! Hard to code maintain and not necessary.
430
- // ??? TODO refactor: provide by series itself.
431
- // [{name: ..., value: ...}, ...] like:
432
- else if (nSeriesMap.get(seriesType) != null) {
433
- // Find the first not ordinal. (5 is an experience value)
434
- var firstNotOrdinal;
435
- for (var i = 0; i < 5 && firstNotOrdinal == null; i++) {
436
- if (!doGuessOrdinal(
437
- data, sourceFormat, seriesLayoutBy,
438
- completeResult.dimensionsDefine, completeResult.startIndex, i
439
- )) {
440
- firstNotOrdinal = i;
473
+
474
+ // idxResult: {v, n}.
475
+ var idxResult = (function () {
476
+
477
+ var idxRes0 = {};
478
+ var idxRes1 = {};
479
+ var guessRecords = [];
480
+
481
+ // 5 is an experience value.
482
+ for (var i = 0, len = Math.min(5, dimCount); i < len; i++) {
483
+ var guessResult = doGuessOrdinal(
484
+ source.data, sourceFormat, source.seriesLayoutBy,
485
+ dimensionsDefine, source.startIndex, i
486
+ );
487
+ guessRecords.push(guessResult);
488
+ var isPureNumber = guessResult === BE_ORDINAL.Not;
489
+
490
+ // [Strategy of idxRes0]: find the first BE_ORDINAL.Not as the value dim,
491
+ // and then find a name dim with the priority:
492
+ // "BE_ORDINAL.Might|BE_ORDINAL.Must" > "other dim" > "the value dim itself".
493
+ if (isPureNumber && idxRes0.v == null && i !== potentialNameDimIndex) {
494
+ idxRes0.v = i;
495
+ }
496
+ if (idxRes0.n == null
497
+ || (idxRes0.n === idxRes0.v)
498
+ || (!isPureNumber && guessRecords[idxRes0.n] === BE_ORDINAL.Not)
499
+ ) {
500
+ idxRes0.n = i;
501
+ }
502
+ if (fulfilled(idxRes0) && guessRecords[idxRes0.n] !== BE_ORDINAL.Not) {
503
+ return idxRes0;
504
+ }
505
+
506
+ // [Strategy of idxRes1]: if idxRes0 not satisfied (that is, no BE_ORDINAL.Not),
507
+ // find the first BE_ORDINAL.Might as the value dim,
508
+ // and then find a name dim with the priority:
509
+ // "other dim" > "the value dim itself".
510
+ // That is for backward compat: number-like (e.g., `'3'`, `'55'`) can be
511
+ // treated as number.
512
+ if (!isPureNumber) {
513
+ if (guessResult === BE_ORDINAL.Might && idxRes1.v == null && i !== potentialNameDimIndex) {
514
+ idxRes1.v = i;
515
+ }
516
+ if (idxRes1.n == null || (idxRes1.n === idxRes1.v)) {
517
+ idxRes1.n = i;
518
+ }
441
519
  }
442
520
  }
443
- if (firstNotOrdinal != null) {
444
- encode.value = firstNotOrdinal;
445
- var nameDimIndex = completeResult.potentialNameDimIndex
446
- || Math.max(firstNotOrdinal - 1, 0);
447
- // By default, label use itemName in charts.
448
- // So we dont set encodeLabel here.
449
- encodeSeriesName.push(nameDimIndex);
450
- encodeItemName.push(nameDimIndex);
451
- // encodeTooltip.push(firstNotOrdinal);
521
+
522
+ function fulfilled(idxResult) {
523
+ return idxResult.v != null && idxResult.n != null;
452
524
  }
453
- }
454
525
 
455
- // encodeTooltip.length && (encode.tooltip = encodeTooltip);
456
- // encodeLabel.length && (encode.label = encodeLabel);
457
- encodeItemName.length && (encode.itemName = encodeItemName);
458
- encodeSeriesName.length && (encode.seriesName = encodeSeriesName);
526
+ return fulfilled(idxRes0) ? idxRes0 : fulfilled(idxRes1) ? idxRes1 : null;
527
+ })();
528
+
529
+ if (idxResult) {
530
+ encode.value = idxResult.v;
531
+ // `potentialNameDimIndex` has highest priority.
532
+ var nameDimIndex = potentialNameDimIndex != null ? potentialNameDimIndex : idxResult.n;
533
+ // By default, label use itemName in charts.
534
+ // So we dont set encodeLabel here.
535
+ encode.itemName = [nameDimIndex];
536
+ encode.seriesName = [nameDimIndex];
537
+ }
459
538
 
460
539
  return encode;
461
540
  }
@@ -483,7 +562,7 @@ function getDatasetModel(seriesModel) {
483
562
  *
484
563
  * @param {module:echars/data/Source} source
485
564
  * @param {number} dimIndex
486
- * @return {boolean} Whether ordinal.
565
+ * @return {BE_ORDINAL} guess result.
487
566
  */
488
567
  export function guessOrdinal(source, dimIndex) {
489
568
  return doGuessOrdinal(
@@ -497,6 +576,7 @@ export function guessOrdinal(source, dimIndex) {
497
576
  }
498
577
 
499
578
  // dimIndex may be overflow source data.
579
+ // return {BE_ORDINAL}
500
580
  function doGuessOrdinal(
501
581
  data, sourceFormat, seriesLayoutBy, dimensionsDefine, startIndex, dimIndex
502
582
  ) {
@@ -505,15 +585,26 @@ function doGuessOrdinal(
505
585
  var maxLoop = 5;
506
586
 
507
587
  if (isTypedArray(data)) {
508
- return false;
588
+ return BE_ORDINAL.Not;
509
589
  }
510
590
 
511
591
  // When sourceType is 'objectRows' or 'keyedColumns', dimensionsDefine
512
592
  // always exists in source.
513
593
  var dimName;
594
+ var dimType;
514
595
  if (dimensionsDefine) {
515
- dimName = dimensionsDefine[dimIndex];
516
- dimName = isObject(dimName) ? dimName.name : dimName;
596
+ var dimDefItem = dimensionsDefine[dimIndex];
597
+ if (isObject(dimDefItem)) {
598
+ dimName = dimDefItem.name;
599
+ dimType = dimDefItem.type;
600
+ }
601
+ else if (isString(dimDefItem)) {
602
+ dimName = dimDefItem;
603
+ }
604
+ }
605
+
606
+ if (dimType != null) {
607
+ return dimType === 'ordinal' ? BE_ORDINAL.Must : BE_ORDINAL.Not;
517
608
  }
518
609
 
519
610
  if (sourceFormat === SOURCE_FORMAT_ARRAY_ROWS) {
@@ -536,7 +627,7 @@ function doGuessOrdinal(
536
627
  }
537
628
  else if (sourceFormat === SOURCE_FORMAT_OBJECT_ROWS) {
538
629
  if (!dimName) {
539
- return;
630
+ return BE_ORDINAL.Not;
540
631
  }
541
632
  for (var i = 0; i < data.length && i < maxLoop; i++) {
542
633
  var item = data[i];
@@ -547,11 +638,11 @@ function doGuessOrdinal(
547
638
  }
548
639
  else if (sourceFormat === SOURCE_FORMAT_KEYED_COLUMNS) {
549
640
  if (!dimName) {
550
- return;
641
+ return BE_ORDINAL.Not;
551
642
  }
552
643
  var sample = data[dimName];
553
644
  if (!sample || isTypedArray(sample)) {
554
- return false;
645
+ return BE_ORDINAL.Not;
555
646
  }
556
647
  for (var i = 0; i < sample.length && i < maxLoop; i++) {
557
648
  if ((result = detectValue(sample[i])) != null) {
@@ -564,7 +655,7 @@ function doGuessOrdinal(
564
655
  var item = data[i];
565
656
  var val = getDataItemValue(item);
566
657
  if (!isArray(val)) {
567
- return false;
658
+ return BE_ORDINAL.Not;
568
659
  }
569
660
  if ((result = detectValue(val[dimIndex])) != null) {
570
661
  return result;
@@ -573,15 +664,16 @@ function doGuessOrdinal(
573
664
  }
574
665
 
575
666
  function detectValue(val) {
667
+ var beStr = isString(val);
576
668
  // Consider usage convenience, '1', '2' will be treated as "number".
577
669
  // `isFinit('')` get `true`.
578
670
  if (val != null && isFinite(val) && val !== '') {
579
- return false;
671
+ return beStr ? BE_ORDINAL.Might : BE_ORDINAL.Not;
580
672
  }
581
- else if (isString(val) && val !== '-') {
582
- return true;
673
+ else if (beStr && val !== '-') {
674
+ return BE_ORDINAL.Must;
583
675
  }
584
676
  }
585
677
 
586
- return false;
678
+ return BE_ORDINAL.Not;
587
679
  }
package/src/echarts.js CHANGED
@@ -51,10 +51,10 @@ var isFunction = zrUtil.isFunction;
51
51
  var isObject = zrUtil.isObject;
52
52
  var parseClassType = ComponentModel.parseClassType;
53
53
 
54
- export var version = '4.4.0';
54
+ export var version = '4.6.0';
55
55
 
56
56
  export var dependencies = {
57
- zrender: '4.1.1'
57
+ zrender: '4.2.0'
58
58
  };
59
59
 
60
60
  var TEST_FRAME_REMAIN_TIME = 1;