diff --git a/src/component/visualMap/VisualMapModel.ts b/src/component/visualMap/VisualMapModel.ts index d2756a4a99..843387a465 100644 --- a/src/component/visualMap/VisualMapModel.ts +++ b/src/component/visualMap/VisualMapModel.ts @@ -33,9 +33,9 @@ import { OptionDataValue, BuiltinVisualProperty, DimensionIndex, - OptionId, ComponentOnCalendarOptionMixin, - ComponentOnMatrixOptionMixin + ComponentOnMatrixOptionMixin, + OptionId, } from '../../util/types'; import ComponentModel from '../../model/Component'; import Model from '../../model/Model'; @@ -93,6 +93,16 @@ export interface VisualMapOption */ dimension?: number + /** + * Series targets with specific dimensions + * When provided, seriesIndex, seriesId, and dimension are ignored + */ + seriesTargets?: { + seriesIndex?: number + seriesId?: OptionId + dimension: number + }[] + /** * Visual configuration for the data in selection */ @@ -247,6 +257,30 @@ class VisualMapModel extends Com * @return An array of series indices. */ protected getTargetSeriesIndices(): number[] { + const seriesTargets = this.option.seriesTargets; + if (seriesTargets) { + // When seriesTargets is provided, collect all target series indices + const indices: number[] = []; + each(seriesTargets, (target) => { + if (target.seriesIndex != null) { + indices.push(target.seriesIndex); + } + else if (target.seriesId != null) { + // Find series by ID + let seriesModel: SeriesModel; + this.ecModel.eachSeries(function (series) { + if (series.id === target.seriesId) { + seriesModel = series; + } + }); + if (seriesModel) { + indices.push(seriesModel.componentIndex); + } + } + }); + return indices; + } + const optionSeriesId = this.option.seriesId; let optionSeriesIndex = this.option.seriesIndex; if (optionSeriesIndex == null && optionSeriesId == null) { @@ -406,8 +440,23 @@ class VisualMapModel extends Com // } // } + getDimension(seriesIndex: number): number { + const seriesTargets = this.option.seriesTargets; + if (seriesTargets) { + const target = zrUtil.find(seriesTargets, target => + (target.seriesIndex != null && target.seriesIndex === seriesIndex) + || (target.seriesId != null && target.seriesId === this.ecModel.getSeriesByIndex(seriesIndex).id) + ); + if (target) { + return target.dimension; + } + } + return this.option.dimension; + } + getDataDimensionIndex(data: SeriesData): DimensionIndex { - const optDim = this.option.dimension; + const seriesIndex = (data.hostModel as any).seriesIndex; + const optDim = this.getDimension(seriesIndex); if (optDim != null) { return data.getDimensionIndex(optDim); diff --git a/src/component/visualMap/preprocessor.ts b/src/component/visualMap/preprocessor.ts index 08ba687c1d..6e86e06970 100644 --- a/src/component/visualMap/preprocessor.ts +++ b/src/component/visualMap/preprocessor.ts @@ -53,6 +53,21 @@ export default function visualMapPreprocessor(option) { } }); } + + // Validate seriesTargets + if (__DEV__) { + const seriesTargets = opt.seriesTargets; + if (seriesTargets && zrUtil.isArray(seriesTargets)) { + each(seriesTargets, function (target) { + if (!zrUtil.isObject(target) || target.dimension == null) { + console.warn('Each seriesTarget should have a dimension property'); + } + if (target.seriesIndex == null && target.seriesId == null) { + console.warn('Each seriesTarget should have either seriesIndex or seriesId'); + } + }); + } + } }); } diff --git a/test/visualmap-seriesTargets.html b/test/visualmap-seriesTargets.html new file mode 100644 index 0000000000..b2f483ee4e --- /dev/null +++ b/test/visualmap-seriesTargets.html @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + +