From 6fb4079a256dc5d3ff8f8b8f7c70fb8bcfdca6fc Mon Sep 17 00:00:00 2001 From: sushuang Date: Tue, 9 Jan 2018 01:13:21 +0800 Subject: [PATCH] Support auto label and some refactor about label. --- src/chart/bar/helper.js | 3 +- src/chart/custom.js | 8 ++-- src/chart/helper/Symbol.js | 7 ++- src/chart/helper/createListFromArray.js | 5 +- src/chart/helper/labelHelper.js | 43 +++++++++-------- src/data/List.js | 8 ++++ src/data/helper/completeDimensions.js | 7 +-- src/data/helper/dimensionHelper.js | 63 +++++++++++++++++++++++++ src/data/helper/sourceHelper.js | 8 ---- src/model/Series.js | 5 +- src/util/model.js | 20 -------- 11 files changed, 108 insertions(+), 69 deletions(-) create mode 100644 src/data/helper/dimensionHelper.js diff --git a/src/chart/bar/helper.js b/src/chart/bar/helper.js index 1be1290ad..e4ebed56a 100644 --- a/src/chart/bar/helper.js +++ b/src/chart/bar/helper.js @@ -1,4 +1,5 @@ import * as graphic from '../../util/graphic'; +import {getDefaultLabel} from '../helper/labelHelper'; export function setLabel( normalStyle, hoverStyle, itemModel, color, seriesModel, dataIndex, labelPositionOutside @@ -11,7 +12,7 @@ export function setLabel( { labelFetcher: seriesModel, labelDataIndex: dataIndex, - defaultText: seriesModel.getRawValue(dataIndex), + defaultText: getDefaultLabel(seriesModel.getData(), dataIndex), isRectText: true, autoColor: color } diff --git a/src/chart/custom.js b/src/chart/custom.js index 92807ee3e..b6547fe42 100644 --- a/src/chart/custom.js +++ b/src/chart/custom.js @@ -2,7 +2,7 @@ import {__DEV__} from '../config'; import * as echarts from '../echarts'; import * as zrUtil from 'zrender/src/core/util'; import * as graphicUtil from '../util/graphic'; -import {findLabelValueDim} from './helper/labelHelper'; +import {getDefaultLabel} from './helper/labelHelper'; import createListFromArray from './helper/createListFromArray'; import { getLayoutOnAxis } from '../layout/barGrid'; import DataDiffer from '../data/DataDiffer'; @@ -309,7 +309,6 @@ function makeRenderItem(customSeries, data, ecModel, api) { var currItemModel; var currLabelNormalModel; var currLabelEmphasisModel; - var currLabelValueDim; var currVisualColor; return function (dataIndexInside) { @@ -331,7 +330,6 @@ function makeRenderItem(customSeries, data, ecModel, api) { currItemModel = data.getItemModel(dataIndexInside); currLabelNormalModel = currItemModel.getModel(LABEL_NORMAL); currLabelEmphasisModel = currItemModel.getModel(LABEL_EMPHASIS); - currLabelValueDim = findLabelValueDim(data); currVisualColor = data.getItemVisual(dataIndexInside, 'color'); currDirty = false; @@ -368,7 +366,7 @@ function makeRenderItem(customSeries, data, ecModel, api) { var opacity = data.getItemVisual(dataIndexInside, 'opacity'); opacity != null && (itemStyle.opacity = opacity); - if (currLabelValueDim != null) { + if (!data.dimensionsSummary.noDefaultLabel) { graphicUtil.setTextStyle(itemStyle, currLabelNormalModel, null, { autoColor: currVisualColor, isRectText: true @@ -377,7 +375,7 @@ function makeRenderItem(customSeries, data, ecModel, api) { itemStyle.text = currLabelNormalModel.getShallow('show') ? zrUtil.retrieve2( customSeries.getFormattedLabel(dataIndexInside, 'normal'), - data.get(currLabelValueDim, dataIndexInside) + getDefaultLabel(data, dataIndexInside) ) : null; } diff --git a/src/chart/helper/Symbol.js b/src/chart/helper/Symbol.js index 8238b4622..6ce50226a 100644 --- a/src/chart/helper/Symbol.js +++ b/src/chart/helper/Symbol.js @@ -6,7 +6,7 @@ import * as zrUtil from 'zrender/src/core/util'; import {createSymbol} from '../../util/symbol'; import * as graphic from '../../util/graphic'; import {parsePercent} from '../../util/number'; -import {findLabelValueDim} from './labelHelper'; +import {getDefaultLabel} from './labelHelper'; function getSymbolSize(data, idx) { @@ -259,15 +259,14 @@ symbolProto._updateCommon = function (data, idx, symbolSize, seriesScope) { } var useNameLabel = seriesScope && seriesScope.useNameLabel; - var valueDim = !useNameLabel && findLabelValueDim(data); - if (useNameLabel || valueDim != null) { + if (useNameLabel || !data.dimensionsSummary.noDefaultLabel) { graphic.setLabelStyle( elStyle, hoverItemStyle, labelModel, hoverLabelModel, { labelFetcher: seriesModel, labelDataIndex: idx, - defaultText: useNameLabel ? data.getName(idx) : data.get(valueDim, idx), + defaultText: useNameLabel ? data.getName(idx) : getDefaultLabel(data, idx), isRectText: true, autoColor: color } diff --git a/src/chart/helper/createListFromArray.js b/src/chart/helper/createListFromArray.js index 833f26216..cb3f21e77 100644 --- a/src/chart/helper/createListFromArray.js +++ b/src/chart/helper/createListFromArray.js @@ -1,7 +1,8 @@ import * as zrUtil from 'zrender/src/core/util'; import List from '../../data/List'; import createDimensions from '../../data/helper/createDimensions'; -import {getDimTypeByAxis, SOURCE_FORMAT_ORIGINAL} from '../../data/helper/sourceHelper'; +import {SOURCE_FORMAT_ORIGINAL} from '../../data/helper/sourceHelper'; +import {getValueTypeByAxis} from '../../data/helper/dimensionHelper'; import {getDataItemValue} from '../../util/model'; import CoordinateSystem from '../../CoordinateSystem'; import {getCoordSysDefineBySeries} from '../../model/referHelper'; @@ -24,7 +25,7 @@ function createListFromArray(source, seriesModel) { var axisModel = coordSysDefine.axisMap.get(dim); if (axisModel) { var axisType = axisModel.get('type'); - dimInfo.type = getDimTypeByAxis(axisType); + dimInfo.type = getValueTypeByAxis(axisType); dimInfo.stackable = isStackable(axisType); } return dimInfo; diff --git a/src/chart/helper/labelHelper.js b/src/chart/helper/labelHelper.js index 0bb21c25c..7a92d4a66 100644 --- a/src/chart/helper/labelHelper.js +++ b/src/chart/helper/labelHelper.js @@ -1,26 +1,25 @@ -/** - * @module echarts/chart/helper/Symbol - */ - -import {otherDimToDataDim} from '../../util/model'; +import {SOURCE_FORMAT_ORIGINAL} from '../../data/helper/sourceHelper'; -export function findLabelValueDim(data) { - var valueDim; - var labelDims = otherDimToDataDim(data, 'label'); +// Get concrete dim. +function getLabelValueDim(data) { + var dimensionsSummary = data.dimensionsSummary; + var labelDims = dimensionsSummary.label; - if (labelDims.length) { - valueDim = labelDims[0]; - } - else { - // Get last value dim - var dimensions = data.dimensions.slice(); - var dataType; - while (dimensions.length && ( - valueDim = dimensions.pop(), - dataType = data.getDimensionInfo(valueDim).type, - dataType === 'ordinal' || dataType === 'time' - )) {} // jshint ignore:line - } + return labelDims[0] + ? labelDims[0] + // Only if the source is own to a series, we can use the last. + // If the source is from dataset, it probably be shared by + // different series. + : data.getProvider().getSource().sourceFormat === SOURCE_FORMAT_ORIGINAL + ? dimensionsSummary.lastValueDimension + : null; +} - return valueDim; +/** + * @param {module:echarts/data/List} data + * @param {number} dataIndex + */ +export function getDefaultLabel(data, dataIndex) { + var val = data.get(getLabelValueDim(data), dataIndex); + return (val == null || isNaN(val)) ? '' : val; } diff --git a/src/data/List.js b/src/data/List.js index 96187de6a..2223e9564 100644 --- a/src/data/List.js +++ b/src/data/List.js @@ -9,6 +9,7 @@ import Model from '../model/Model'; import DataDiffer from './DataDiffer'; import Source from './Source'; import {defaultDimValueGetters, DefaultDataProvider} from './helper/dataProvider'; +import {summarizeDimensions} from './helper/dimensionHelper'; var isObject = zrUtil.isObject; @@ -250,6 +251,13 @@ var List = function (dimensions, hostModel) { * @private */ this._approximateExtent = {}; + + /** + * Cache summary info for fast visit. See "dimensionHelper". + * @readOnly + * @type {Object} + */ + this.dimensionsSummary = summarizeDimensions(this); }; var listProto = List.prototype; diff --git a/src/data/helper/completeDimensions.js b/src/data/helper/completeDimensions.js index 305018a90..1fbd9bf6d 100644 --- a/src/data/helper/completeDimensions.js +++ b/src/data/helper/completeDimensions.js @@ -8,15 +8,12 @@ import * as zrUtil from 'zrender/src/core/util'; import {normalizeToArray} from '../../util/model'; import {guessOrdinal} from './sourceHelper'; import Source from '../Source'; +import {SPECIAL_DIMENSIONS} from './dimensionHelper'; var each = zrUtil.each; var isString = zrUtil.isString; var defaults = zrUtil.defaults; -var OTHER_DIMS = zrUtil.createHashMap({ - tooltip: 1, label: 1, itemName: 1, seriesName: 1 -}); - /** * @see {module:echarts/test/ut/spec/data/completeDimensions} * @@ -146,7 +143,7 @@ function completeDimensions(sysDims, source, opt) { }); function applyDim(resultItem, coordDim, coordDimIndex) { - if (OTHER_DIMS.get(coordDim)) { + if (SPECIAL_DIMENSIONS.get(coordDim) != null) { resultItem.otherDims[coordDim] = coordDimIndex; } else { diff --git a/src/data/helper/dimensionHelper.js b/src/data/helper/dimensionHelper.js new file mode 100644 index 000000000..f9bc6c05e --- /dev/null +++ b/src/data/helper/dimensionHelper.js @@ -0,0 +1,63 @@ +import {each, createHashMap} from 'zrender/src/core/util'; + +export var SPECIAL_DIMENSIONS = createHashMap([ + 'tooltip', 'label', 'itemName', 'seriesName' +]); + +/** + * Summarize and cache for avoiding repeat calculation while travel data. + * @return {Object} + * { + * each of SPECIAL_DIMENSIONS in concrete dim. Array not null/undefined. + * lastValueDimension: a set of DIMENSION_TYPES in concrete dim. Array not null/undefined. + * } + */ +export function summarizeDimensions(data) { + var summary = {}; + SPECIAL_DIMENSIONS.each(function (v, dimType) { + summary[dimType] = otherDimToDataDim(data, dimType); + }); + summary.lastValueDimension = findTheLastValueDimensions(data); + summary.noDefaultLabel = !(summary.label[0] || summary.lastValueDimension); + return summary; +} + +/** + * @see {module:echarts/data/helper/createDimensions} + * @param {module:echarts/data/List} data + * @param {string} otherDim See OTHER_DIMS + * @return {Array.} data dimensions on the otherDim. + */ +export function otherDimToDataDim(data, otherDim) { + var dataDim = []; + each(data.dimensions, function (dimName) { + var dimItem = data.getDimensionInfo(dimName); + var otherDims = dimItem.otherDims; + var dimIndex = otherDims[otherDim]; + if (dimIndex != null && dimIndex !== false) { + dataDim[dimIndex] = dimItem.name; + } + }); + return dataDim; +} + +export function getValueTypeByAxis(axisType) { + return axisType === 'category' + ? 'ordinal' + : axisType === 'time' + ? 'time' + : 'float'; +} + +function findTheLastValueDimensions(data) { + // Get last value dim + var dimensions = data.dimensions.slice(); + var valueType; + var valueDim; + while (dimensions.length && ( + valueDim = dimensions.pop(), + valueType = data.getDimensionInfo(valueDim).type, + valueType === 'ordinal' || valueType === 'time' + )) {} // jshint ignore:line + return valueDim; +} diff --git a/src/data/helper/sourceHelper.js b/src/data/helper/sourceHelper.js index 2adb90975..d29e53bd3 100644 --- a/src/data/helper/sourceHelper.js +++ b/src/data/helper/sourceHelper.js @@ -416,11 +416,3 @@ export function guessOrdinal(source, dimIndex, dimName) { return false; } - -export function getDimTypeByAxis(axisType) { - return axisType === 'category' - ? 'ordinal' - : axisType === 'time' - ? 'time' - : 'float'; -} diff --git a/src/model/Series.js b/src/model/Series.js index 1e5c096ea..9b2dc1771 100644 --- a/src/model/Series.js +++ b/src/model/Series.js @@ -19,6 +19,7 @@ import { prepareSource, getSource } from '../data/helper/sourceHelper'; +import {otherDimToDataDim} from '../data/helper/dimensionHelper'; var inner = modelUtil.makeInner(); @@ -280,7 +281,7 @@ var SeriesModel = ComponentModel.extend({ }, 0); var result = []; - var tooltipDims = modelUtil.otherDimToDataDim(data, 'tooltip'); + var tooltipDims = otherDimToDataDim(data, 'tooltip'); tooltipDims.length ? zrUtil.each(tooltipDims, function (dimIdx) { @@ -431,7 +432,7 @@ function autoSeriesName(seriesModel) { function getSeriesAutoName(seriesModel) { var data = seriesModel.getRawData(); - var dataDims = modelUtil.otherDimToDataDim(data, 'seriesName'); + var dataDims = otherDimToDataDim(data, 'seriesName'); var nameArr = []; zrUtil.each(dataDims, function (dataDim) { var dimInfo = data.getDimensionInfo(dataDim); diff --git a/src/util/model.js b/src/util/model.js index e0fb90e92..5d23596d4 100644 --- a/src/util/model.js +++ b/src/util/model.js @@ -636,26 +636,6 @@ export function coordDimToDataDim(data, coordDim) { return dataDim; } -/** - * @see {module:echarts/data/helper/createDimensions} - * @param {module:echarts/data/List} data - * @param {string} otherDim Can be `otherDims` - * like 'label' or 'tooltip'. - * @return {Array.} data dimensions on the otherDim. - */ -export function otherDimToDataDim(data, otherDim) { - var dataDim = []; - each(data.dimensions, function (dimName) { - var dimItem = data.getDimensionInfo(dimName); - var otherDims = dimItem.otherDims; - var dimIndex = otherDims[otherDim]; - if (dimIndex != null && dimIndex !== false) { - dataDim[dimIndex] = dimItem.name; - } - }); - return dataDim; -} - function has(obj, prop) { return obj && obj.hasOwnProperty(prop); } -- GitLab