blob: faa874f23e421d9e741b87684a38f409a6fb3255 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import {each, isArray, isObject, isTypedArray, defaults} from 'zrender/src/core/util';
import compatStyle from './helper/compatStyle';
import {normalizeToArray} from '../util/model';
import { Dictionary } from 'zrender/src/core/types';
import { ECUnitOption } from '../util/types';
import type { BarSeriesOption } from '../chart/bar/BarSeries';
import type { PieSeriesOption } from '../chart/pie/PieSeries';
import { deprecateLog, deprecateReplaceLog } from '../util/log';
function get(opt: Dictionary<any>, path: string): any {
const pathArr = path.split(',');
let obj = opt;
for (let i = 0; i < pathArr.length; i++) {
obj = obj && obj[pathArr[i]];
if (obj == null) {
break;
}
}
return obj;
}
function set(opt: Dictionary<any>, path: string, val: any, overwrite?: boolean) {
const pathArr = path.split(',');
let obj = opt;
let key;
let i = 0;
for (; i < pathArr.length - 1; i++) {
key = pathArr[i];
if (obj[key] == null) {
obj[key] = {};
}
obj = obj[key];
}
if (overwrite || obj[pathArr[i]] == null) {
obj[pathArr[i]] = val;
}
}
function compatLayoutProperties(option: Dictionary<any>) {
option && each(LAYOUT_PROPERTIES, function (prop) {
if (prop[0] in option && !(prop[1] in option)) {
option[prop[1]] = option[prop[0]];
}
});
}
const LAYOUT_PROPERTIES = [
['x', 'left'], ['y', 'top'], ['x2', 'right'], ['y2', 'bottom']
];
const COMPATITABLE_COMPONENTS = [
'grid', 'geo', 'parallel', 'legend', 'toolbox', 'title', 'visualMap', 'dataZoom', 'timeline'
];
const BAR_ITEM_STYLE_MAP = [
['borderRadius', 'barBorderRadius'],
['borderColor', 'barBorderColor'],
['borderWidth', 'barBorderWidth']
];
function compatBarItemStyle(option: Dictionary<any>) {
const itemStyle = option && option.itemStyle;
if (itemStyle) {
for (let i = 0; i < BAR_ITEM_STYLE_MAP.length; i++) {
const oldName = BAR_ITEM_STYLE_MAP[i][1];
const newName = BAR_ITEM_STYLE_MAP[i][0];
if (itemStyle[oldName] != null) {
itemStyle[newName] = itemStyle[oldName];
if (__DEV__) {
deprecateReplaceLog(oldName, newName);
}
}
}
}
}
function compatPieLabel(option: Dictionary<any>) {
if (!option) {
return;
}
if (option.alignTo === 'edge' && option.margin != null && option.edgeDistance == null) {
if (__DEV__) {
deprecateReplaceLog('label.margin', 'label.edgeDistance', 'pie');
}
option.edgeDistance = option.margin;
}
}
function compatSunburstState(option: Dictionary<any>) {
if (!option) {
return;
}
if (option.downplay && !option.blur) {
option.blur = option.downplay;
if (__DEV__) {
deprecateReplaceLog('downplay', 'blur', 'sunburst');
}
}
}
function compatGraphFocus(option: Dictionary<any>) {
if (!option) {
return;
}
if (option.focusNodeAdjacency != null) {
option.emphasis = option.emphasis || {};
if (option.emphasis.focus == null) {
if (__DEV__) {
deprecateReplaceLog('focusNodeAdjacency', 'emphasis: { focus: \'adjacency\'}', 'graph/sankey');
}
option.emphasis.focus = 'adjacency';
}
}
}
function traverseTree(data: any[], cb: Function) {
if (data) {
for (let i = 0; i < data.length; i++) {
cb(data[i]);
data[i] && traverseTree(data[i].children, cb);
}
}
}
export default function globalBackwardCompat(option: ECUnitOption, isTheme?: boolean) {
compatStyle(option, isTheme);
// Make sure series array for model initialization.
option.series = normalizeToArray(option.series);
each(option.series, function (seriesOpt: any) {
if (!isObject(seriesOpt)) {
return;
}
const seriesType = seriesOpt.type;
if (seriesType === 'line') {
if (seriesOpt.clipOverflow != null) {
seriesOpt.clip = seriesOpt.clipOverflow;
if (__DEV__) {
deprecateReplaceLog('clipOverflow', 'clip', 'line');
}
}
}
else if (seriesType === 'pie' || seriesType === 'gauge') {
if (seriesOpt.clockWise != null) {
seriesOpt.clockwise = seriesOpt.clockWise;
if (__DEV__) {
deprecateReplaceLog('clockWise', 'clockwise');
}
}
compatPieLabel((seriesOpt as PieSeriesOption).label);
const data = seriesOpt.data;
if (data && !isTypedArray(data)) {
for (let i = 0; i < data.length; i++) {
compatPieLabel(data[i]);
}
}
if (seriesOpt.hoverOffset != null) {
seriesOpt.emphasis = seriesOpt.emphasis || {};
if (seriesOpt.emphasis.scaleSize = null) {
if (__DEV__) {
deprecateReplaceLog('hoverOffset', 'emphasis.scaleSize');
}
seriesOpt.emphasis.scaleSize = seriesOpt.hoverOffset;
}
}
}
else if (seriesType === 'gauge') {
const pointerColor = get(seriesOpt, 'pointer.color');
pointerColor != null
&& set(seriesOpt, 'itemStyle.color', pointerColor);
}
else if (seriesType === 'bar') {
compatBarItemStyle(seriesOpt);
compatBarItemStyle((seriesOpt as BarSeriesOption).backgroundStyle);
compatBarItemStyle(seriesOpt.emphasis);
const data = seriesOpt.data;
if (data && !isTypedArray(data)) {
for (let i = 0; i < data.length; i++) {
if (typeof data[i] === 'object') {
compatBarItemStyle(data[i]);
compatBarItemStyle(data[i] && data[i].emphasis);
}
}
}
}
else if (seriesType === 'sunburst') {
const highlightPolicy = seriesOpt.highlightPolicy;
if (highlightPolicy) {
seriesOpt.emphasis = seriesOpt.emphasis || {};
if (!seriesOpt.emphasis.focus) {
seriesOpt.emphasis.focus = highlightPolicy;
if (__DEV__) {
deprecateReplaceLog('highlightPolicy', 'emphasis.focus', 'sunburst');
}
}
}
compatSunburstState(seriesOpt);
traverseTree(seriesOpt.data, compatSunburstState);
}
else if (seriesType === 'graph' || seriesType === 'sankey') {
compatGraphFocus(seriesOpt);
// TODO nodes, edges?
}
else if (seriesType === 'map') {
if (seriesOpt.mapType && !seriesOpt.map) {
if (__DEV__) {
deprecateReplaceLog('mapType', 'map', 'map');
}
seriesOpt.map = seriesOpt.mapType;
}
if (seriesOpt.mapLocation) {
if (__DEV__) {
deprecateLog('`mapLocation` is not used anymore.');
}
defaults(seriesOpt, seriesOpt.mapLocation);
}
}
if (seriesOpt.hoverAnimation != null) {
seriesOpt.emphasis = seriesOpt.emphasis || {};
if (seriesOpt.emphasis && seriesOpt.emphasis.scale == null) {
if (__DEV__) {
deprecateReplaceLog('hoverAnimation', 'emphasis.scale');
}
seriesOpt.emphasis.scale = seriesOpt.hoverAnimation;
}
}
compatLayoutProperties(seriesOpt);
});
// dataRange has changed to visualMap
if (option.dataRange) {
option.visualMap = option.dataRange;
}
each(COMPATITABLE_COMPONENTS, function (componentName) {
let options = option[componentName];
if (options) {
if (!isArray(options)) {
options = [options];
}
each(options, function (option) {
compatLayoutProperties(option);
});
}
});
}