/* * 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, 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, 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) { 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) { 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) { 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) { if (!option) { return; } if (option.downplay && !option.blur) { option.blur = option.downplay; if (__DEV__) { deprecateReplaceLog('downplay', 'blur', 'sunburst'); } } } function compatGraphFocus(option: Dictionary) { 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); }); } }); }